Repository: NeoGeographyToolkit/StereoPipeline Branch: master Commit: a3d1ace4c673 Files: 877 Total size: 19.0 MB Directory structure: gitextract_o1uagew5/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bibliography-addition---.md │ │ ├── bug-report---.md │ │ └── feature-request---.md │ ├── pull_request_template.md │ └── workflows/ │ ├── build_helper.sh │ ├── build_helper_linux.yml │ ├── build_test.sh │ ├── build_test_mac_arm64.yml │ ├── build_test_mac_x64.yml │ ├── save_linux_deps.sh │ ├── save_mac_deps.sh │ ├── ssh_linux_arm.yml │ ├── ssh_mac_arm.yml │ ├── ssh_mac_x64.yml │ └── update_mac_tests.sh ├── .gitignore ├── .readthedocs.yml ├── AUTHORS.rst ├── CMakeLists.txt ├── CODE_OF_CONDUCT.rst ├── CONTRIBUTING.rst ├── ChangeLog ├── INSTALLGUIDE.rst ├── LICENSE ├── NEWS.rst ├── README.rst ├── RELEASEGUIDE ├── THIRDPARTYLICENSES.rst ├── cmake/ │ ├── FindCairo.cmake │ ├── FindCairomm.cmake │ ├── FindFreeType.cmake │ ├── FindSigC++.cmake │ ├── LibFindMacros.cmake │ ├── Utilities.cmake │ └── linux_cross_toolchain.cmake ├── conda/ │ ├── asp_2.7.0_linux_env.yaml │ ├── asp_2.7.0_osx_env.yaml │ ├── asp_3.0.0_linux_env.yaml │ ├── asp_3.0.0_osx_env.yaml │ ├── asp_3.1.0_linux_env.yaml │ ├── asp_3.1.0_osx_env.yaml │ ├── asp_3.2.0_linux_env.yaml │ ├── asp_3.2.0_osx_env.yaml │ ├── asp_3.3.0_linux_env.yaml │ ├── asp_3.3.0_osx_env.yaml │ ├── asp_3.5.0_linux_env.yaml │ ├── asp_3.5.0_osx_x64_env.yaml │ ├── asp_deps_2.7.0_linux_env.yaml │ ├── asp_deps_2.7.0_osx_env.yaml │ ├── asp_deps_3.0.0_linux_env.yaml │ ├── asp_deps_3.0.0_osx_env.yaml │ ├── asp_deps_3.1.0_linux_env.yaml │ ├── asp_deps_3.1.0_osx_env.yaml │ ├── asp_deps_3.2.0_linux_env.yaml │ ├── asp_deps_3.2.0_osx_env.yaml │ ├── asp_deps_3.3.0_linux_env.yaml │ ├── asp_deps_3.3.0_osx_env.yaml │ ├── asp_deps_3.4.0_alpha_linux_env.yaml │ ├── asp_deps_3.4.0_alpha_osx_env.yaml │ ├── environment.yml │ └── update_versions.py ├── docs/ │ ├── Makefile │ ├── acknowledgements.rst │ ├── bathy_water_masking.rst │ ├── bibliography.bib │ ├── building_asp.rst │ ├── bundle_adjustment.rst │ ├── conf.py │ ├── contributing.rst │ ├── correlation.rst │ ├── environment.yml │ ├── error_propagation.rst │ ├── examples/ │ │ ├── apollo15.rst │ │ ├── aster.rst │ │ ├── bathy.rst │ │ ├── cassini.rst │ │ ├── chandrayaan2.rst │ │ ├── change3.rst │ │ ├── csm.rst │ │ ├── ctx.rst │ │ ├── dawn.rst │ │ ├── dg.rst │ │ ├── hirise.rst │ │ ├── historical.rst │ │ ├── hrsc.rst │ │ ├── isis_minirf.rst │ │ ├── junocam.rst │ │ ├── k10.rst │ │ ├── kaguya.rst │ │ ├── lronac.rst │ │ ├── mer.rst │ │ ├── moc.rst │ │ ├── msl.rst │ │ ├── orbital_rig.rst │ │ ├── pbs_slurm.rst │ │ ├── perusat1.rst │ │ ├── pleiades.rst │ │ ├── rig.rst │ │ ├── rpc.rst │ │ ├── sfm_iss.rst │ │ ├── sfs_ctx.rst │ │ ├── sfs_earth.rst │ │ ├── skysat.rst │ │ ├── spot5.rst │ │ ├── spot67.rst │ │ ├── stereo_pairs.rst │ │ └── umbra_sar.rst │ ├── examples.rst │ ├── experimental.rst │ ├── glossary.rst │ ├── index.rst │ ├── installation.rst │ ├── introduction.rst │ ├── news.rst │ ├── next_steps.rst │ ├── outputfiles.rst │ ├── papersusingasp.bib │ ├── papersusingasp.rst │ ├── pinholemodels.rst │ ├── requirements.txt │ ├── sfm.rst │ ├── sfs_usage.rst │ ├── stereo_algorithms.rst │ ├── stereodefault.rst │ ├── thirdparty.rst │ ├── tips_tricks.rst │ ├── tools/ │ │ ├── add_spot_rpc.rst │ │ ├── aster2asp.rst │ │ ├── bathy_plane_calc.rst │ │ ├── bathy_threshold_calc.rst │ │ ├── bundle_adjust.rst │ │ ├── cam2map4stereo.rst │ │ ├── cam2rpc.rst │ │ ├── cam_gen.rst │ │ ├── cam_test.rst │ │ ├── camera_calibrate.rst │ │ ├── camera_footprint.rst │ │ ├── camera_solve.rst │ │ ├── cgal_tools.rst │ │ ├── colormap.rst │ │ ├── convert_pinhole_model.rst │ │ ├── corr_eval.rst │ │ ├── correlator.rst │ │ ├── dem2gcp.rst │ │ ├── dem_geoid.rst │ │ ├── dem_mosaic.rst │ │ ├── dg_mosaic.rst │ │ ├── disp2ip.rst │ │ ├── disparitydebug.rst │ │ ├── gcp_gen.rst │ │ ├── gdal.rst │ │ ├── geodiff.rst │ │ ├── hiedr2mosaic.rst │ │ ├── hillshade.rst │ │ ├── historical_helper.rst │ │ ├── icebridge_kmz_to_csv.rst │ │ ├── image2qtree.rst │ │ ├── image_align.rst │ │ ├── image_calc.rst │ │ ├── image_mosaic.rst │ │ ├── image_subset.rst │ │ ├── ipfind.rst │ │ ├── ipmatch.rst │ │ ├── jitter_solve.rst │ │ ├── lronac2mosaic.rst │ │ ├── lvis2kml.rst │ │ ├── mapproject.rst │ │ ├── multi_stereo.rst │ │ ├── n_align.rst │ │ ├── orbit_plot.rst │ │ ├── orbitviz.rst │ │ ├── ortho2pinhole.rst │ │ ├── otsu_threshold.rst │ │ ├── pansharp.rst │ │ ├── parallel_bundle_adjust.rst │ │ ├── parallel_sfs.rst │ │ ├── parallel_stereo.rst │ │ ├── parse_match_file.rst │ │ ├── pc_align.rst │ │ ├── pc_filter.rst │ │ ├── pc_merge.rst │ │ ├── point2dem.rst │ │ ├── point2las.rst │ │ ├── point2mesh.rst │ │ ├── refr_index.rst │ │ ├── rig_calibrator.rst │ │ ├── ros.rst │ │ ├── sat_sim.rst │ │ ├── sfm_merge.rst │ │ ├── sfm_proc.rst │ │ ├── sfm_submap.rst │ │ ├── sfm_view.rst │ │ ├── sfs.rst │ │ ├── sfs_blend.rst │ │ ├── stereo.rst │ │ ├── stereo_dist.rst │ │ ├── stereo_gui.rst │ │ ├── stereo_sweep.rst │ │ ├── stereo_tile.rst │ │ ├── texrecon.rst │ │ ├── theia_sfm.rst │ │ ├── undistort_image.rst │ │ ├── view_reconstruction.rst │ │ ├── voxblox_mesh.rst │ │ └── wv_correct.rst │ ├── tools.rst │ ├── tutorial.rst │ └── zzreferences.rst ├── examples/ │ ├── CTX/ │ │ ├── Makefile │ │ ├── control.net │ │ └── stereo.nonmap │ ├── HiRISE/ │ │ ├── Makefile │ │ ├── downloader.sh │ │ └── stereo.nonmap │ ├── K10/ │ │ ├── Makefile │ │ ├── black_left.tsai │ │ ├── black_right.tsai │ │ └── stereo.default │ ├── MER/ │ │ ├── Makefile │ │ ├── stereo.default │ │ └── stereo.default.navcam │ ├── MOC/ │ │ ├── E0201461.imq │ │ ├── M0100115.imq │ │ ├── Makefile │ │ ├── control.net │ │ └── stereo.nonmap │ ├── TriangulationError.lut │ └── surf_match.patch ├── plugins/ │ └── stereo/ │ └── plugin_list.txt ├── src/ │ ├── CMakeLists.txt │ ├── asp/ │ │ ├── CMakeLists.txt │ │ ├── Camera/ │ │ │ ├── ASTER_XML.cc │ │ │ ├── ASTER_XML.h │ │ │ ├── BaParams.cc │ │ │ ├── BaParams.h │ │ │ ├── BaseCostFuns.cc │ │ │ ├── BaseCostFuns.h │ │ │ ├── BundleAdjustCamera.cc │ │ │ ├── BundleAdjustCamera.h │ │ │ ├── BundleAdjustCamera2.cc │ │ │ ├── BundleAdjustCostFuns.cc │ │ │ ├── BundleAdjustCostFuns.h │ │ │ ├── BundleAdjustEigen.cc │ │ │ ├── BundleAdjustEigen.h │ │ │ ├── BundleAdjustIO.cc │ │ │ ├── BundleAdjustIsis.cc │ │ │ ├── BundleAdjustIsis.h │ │ │ ├── BundleAdjustOptions.cc │ │ │ ├── BundleAdjustOptions.h │ │ │ ├── BundleAdjustOutliers.cc │ │ │ ├── BundleAdjustOutliers.h │ │ │ ├── BundleAdjustResiduals.cc │ │ │ ├── BundleAdjustResiduals.h │ │ │ ├── CMakeLists.txt │ │ │ ├── CameraErrorPropagation.cc │ │ │ ├── CameraErrorPropagation.h │ │ │ ├── CameraResectioning.cc │ │ │ ├── CameraResectioning.h │ │ │ ├── Covariance.cc │ │ │ ├── Covariance.h │ │ │ ├── CsmModel.cc │ │ │ ├── CsmModel.h │ │ │ ├── CsmModelFit.cc │ │ │ ├── CsmModelFit.h │ │ │ ├── CsmUtils.cc │ │ │ ├── CsmUtils.h │ │ │ ├── JitterSolveCostFuns.cc │ │ │ ├── JitterSolveCostFuns.h │ │ │ ├── JitterSolveRigCostFuns.cc │ │ │ ├── JitterSolveRigCostFuns.h │ │ │ ├── JitterSolveRigUtils.cc │ │ │ ├── JitterSolveRigUtils.h │ │ │ ├── JitterSolveUtils.cc │ │ │ ├── JitterSolveUtils.h │ │ │ ├── LinescanASTERModel.cc │ │ │ ├── LinescanASTERModel.h │ │ │ ├── LinescanDGModel.cc │ │ │ ├── LinescanDGModel.h │ │ │ ├── LinescanPeruSatModel.cc │ │ │ ├── LinescanPeruSatModel.h │ │ │ ├── LinescanPleiadesModel.cc │ │ │ ├── LinescanPleiadesModel.h │ │ │ ├── LinescanSpotModel.cc │ │ │ ├── LinescanSpotModel.h │ │ │ ├── LinescanUtils.cc │ │ │ ├── LinescanUtils.h │ │ │ ├── MapprojectImage.cc │ │ │ ├── MapprojectImage.h │ │ │ ├── PRISM_XML.cc │ │ │ ├── PRISM_XML.h │ │ │ ├── PeruSatXML.cc │ │ │ ├── PeruSatXML.h │ │ │ ├── PleiadesXML.cc │ │ │ ├── PleiadesXML.h │ │ │ ├── RPCModel.cc │ │ │ ├── RPCModel.h │ │ │ ├── RPCModelGen.cc │ │ │ ├── RPCModelGen.h │ │ │ ├── RPCStereoModel.cc │ │ │ ├── RPCStereoModel.h │ │ │ ├── RPC_XML.cc │ │ │ ├── RPC_XML.h │ │ │ ├── RpcUtils.cc │ │ │ ├── RpcUtils.h │ │ │ ├── SPOT_XML.cc │ │ │ ├── SPOT_XML.h │ │ │ ├── SatSim.cc │ │ │ ├── SatSim.h │ │ │ ├── SyntheticLinescan.cc │ │ │ ├── SyntheticLinescan.h │ │ │ ├── TimeProcessing.cc │ │ │ ├── TimeProcessing.h │ │ │ ├── XMLBase.cc │ │ │ ├── XMLBase.h │ │ │ └── tests/ │ │ │ ├── TestCsmCameraModel.cxx │ │ │ ├── TestDGCameraModel.cxx │ │ │ ├── TestRPCStereoModel.cxx │ │ │ ├── TestSpotCameraModel.cxx │ │ │ ├── ctx.json │ │ │ ├── dg_example1.xml │ │ │ ├── dg_example2.xml │ │ │ ├── dg_example3.xml │ │ │ ├── dg_example4.xml │ │ │ ├── sample.RPB │ │ │ ├── spot_example1.xml │ │ │ ├── spot_style.xsl │ │ │ ├── wv_mvp_1.xml │ │ │ ├── wv_mvp_2.xml │ │ │ ├── wv_test1.xml │ │ │ └── wv_test2.xml │ │ ├── Core/ │ │ │ ├── AffineEpipolar.cc │ │ │ ├── AffineEpipolar.h │ │ │ ├── AlignmentUtils.cc │ │ │ ├── AlignmentUtils.h │ │ │ ├── AspLog.cc │ │ │ ├── AspLog.h │ │ │ ├── AspProgramOptions.cc │ │ │ ├── AspProgramOptions.h │ │ │ ├── AspStringUtils.cc │ │ │ ├── AspStringUtils.h │ │ │ ├── AsterProc.cc │ │ │ ├── AsterProc.h │ │ │ ├── BaBaseOptions.h │ │ │ ├── BaseCameraUtils.cc │ │ │ ├── BaseCameraUtils.h │ │ │ ├── BathyPlaneCalc.cc │ │ │ ├── BathyPlaneCalc.h │ │ │ ├── Bathymetry.cc │ │ │ ├── Bathymetry.h │ │ │ ├── BitChecker.cc │ │ │ ├── BitChecker.h │ │ │ ├── BundleAdjustUtils.cc │ │ │ ├── BundleAdjustUtils.h │ │ │ ├── CMakeLists.txt │ │ │ ├── CamPoseUtils.cc │ │ │ ├── CamPoseUtils.h │ │ │ ├── CameraTransforms.cc │ │ │ ├── CameraTransforms.h │ │ │ ├── CartographyUtils.cc │ │ │ ├── CartographyUtils.h │ │ │ ├── DataLoader.cc │ │ │ ├── DataLoader.h │ │ │ ├── DemDisparity.cc │ │ │ ├── DemDisparity.h │ │ │ ├── DemMosaic.cc │ │ │ ├── DemMosaic.h │ │ │ ├── DemMosaicOptions.h │ │ │ ├── DemMosaicParse.cc │ │ │ ├── DemMosaicParse.h │ │ │ ├── DemUtils.cc │ │ │ ├── DemUtils.h │ │ │ ├── DisparityProcessing.cc │ │ │ ├── DisparityProcessing.h │ │ │ ├── EigenTransformUtils.cc │ │ │ ├── EigenTransformUtils.h │ │ │ ├── EigenUtils.cc │ │ │ ├── EigenUtils.h │ │ │ ├── EnvUtils.cc │ │ │ ├── EnvUtils.h │ │ │ ├── FileUtils.cc │ │ │ ├── FileUtils.h │ │ │ ├── GCP.cc │ │ │ ├── GCP.h │ │ │ ├── GdalUtils.cc │ │ │ ├── GdalUtils.h │ │ │ ├── ImageNormalization.cc │ │ │ ├── ImageNormalization.h │ │ │ ├── ImageUtils.cc │ │ │ ├── ImageUtils.h │ │ │ ├── InterestPointMatching.cc │ │ │ ├── InterestPointMatching.h │ │ │ ├── InterestPointMatching2.cc │ │ │ ├── IpMatchingAlgs.cc │ │ │ ├── IpMatchingAlgs.h │ │ │ ├── LocalAlignment.cc │ │ │ ├── LocalAlignment.h │ │ │ ├── Macros.h │ │ │ ├── MatchList.cc │ │ │ ├── MatchList.h │ │ │ ├── Nvm.cc │ │ │ ├── Nvm.h │ │ │ ├── OpenCVUtils.cc │ │ │ ├── OpenCVUtils.h │ │ │ ├── OrthoRasterizer.cc │ │ │ ├── OrthoRasterizer.h │ │ │ ├── OutlierProcessing.cc │ │ │ ├── OutlierProcessing.h │ │ │ ├── PdalUtils.cc │ │ │ ├── PdalUtils.h │ │ │ ├── PhotometricOutlier.cc │ │ │ ├── PhotometricOutlier.h │ │ │ ├── Point2Grid.cc │ │ │ ├── Point2Grid.h │ │ │ ├── PointCloudAlignment.cc │ │ │ ├── PointCloudAlignment.h │ │ │ ├── PointCloudProcessing.cc │ │ │ ├── PointCloudProcessing.h │ │ │ ├── PointCloudRead.cc │ │ │ ├── PointCloudRead.h │ │ │ ├── PointToDem.cc │ │ │ ├── PointToDem.h │ │ │ ├── PointToDem2.cc │ │ │ ├── PointUtils.cc │ │ │ ├── PointUtils.h │ │ │ ├── ProjectiveCamApprox.cc │ │ │ ├── ProjectiveCamApprox.h │ │ │ ├── ReportUtils.cc │ │ │ ├── ReportUtils.h │ │ │ ├── StereoSettings.cc │ │ │ ├── StereoSettings.h │ │ │ ├── StereoSettingsDesc.h │ │ │ ├── StereoSettingsParse.cc │ │ │ ├── StereoSettingsParse.h │ │ │ ├── StereoTiling.cc │ │ │ ├── StereoTiling.h │ │ │ ├── ThreadedEdgeMask.h │ │ │ └── tests/ │ │ │ ├── TestAspProgramOptions.cxx │ │ │ ├── TestIntegralAutoGainDetector.cxx │ │ │ ├── TestInterestPointMatching.cxx │ │ │ ├── TestPointUtils.cxx │ │ │ ├── TestThreadedEdgeMask.cxx │ │ │ ├── ThreadTest1.tif │ │ │ ├── ThreadTest2.tif │ │ │ ├── ThreadTest3.tif │ │ │ └── sample_ascii.pcd │ │ ├── GUI/ │ │ │ ├── AppData.cc │ │ │ ├── AppData.h │ │ │ ├── CMakeLists.txt │ │ │ ├── ChooseFilesDlg.cc │ │ │ ├── ChooseFilesDlg.h │ │ │ ├── DiskImagePyramidMultiChannel.cc │ │ │ ├── DiskImagePyramidMultiChannel.h │ │ │ ├── EventWidget.cc │ │ │ ├── GuiArgs.cc │ │ │ ├── GuiArgs.h │ │ │ ├── GuiBase.cc │ │ │ ├── GuiBase.h │ │ │ ├── GuiConstants.h │ │ │ ├── GuiGeom.cc │ │ │ ├── GuiGeom.h │ │ │ ├── GuiUtilities.cc │ │ │ ├── GuiUtilities.h │ │ │ ├── ImageData.cc │ │ │ ├── ImageData.h │ │ │ ├── MainWidget.cc │ │ │ ├── MainWidget.h │ │ │ ├── MainWindow.cc │ │ │ ├── MainWindow.h │ │ │ ├── MatchPointMgr.cc │ │ │ ├── MatchPointMgr.h │ │ │ ├── PolyWidget.cc │ │ │ ├── ProfileWidget.cc │ │ │ ├── WidgetBase.cc │ │ │ ├── WidgetBase.h │ │ │ ├── WidgetMenuMgr.cc │ │ │ ├── WidgetMenuMgr.h │ │ │ ├── WindowMenuMgr.cc │ │ │ └── WindowMenuMgr.h │ │ ├── GenerateConfig.cmake │ │ ├── Gotcha/ │ │ │ ├── ALSC.cc │ │ │ ├── ALSC.h │ │ │ ├── CALSCParam.h │ │ │ ├── CASP-GO_params.xml │ │ │ ├── CBatchProc.cc │ │ │ ├── CBatchProc.h │ │ │ ├── CDensify.cc │ │ │ ├── CDensify.h │ │ │ ├── CDensifyParam.h │ │ │ ├── CGOTCHAParam.h │ │ │ ├── CMakeLists.txt │ │ │ ├── CProcBlock.cc │ │ │ ├── CProcBlock.h │ │ │ ├── CTiePt.h │ │ │ └── README.txt │ │ ├── IceBridge/ │ │ │ ├── CMakeLists.txt │ │ │ ├── README.txt │ │ │ ├── archive_functions.py │ │ │ ├── blend_dems.py │ │ │ ├── camera_lookup.txt │ │ │ ├── camera_models_from_nav.py │ │ │ ├── correct_icebridge_l3_dem.cc │ │ │ ├── extract_icebridge_ATM_points.py │ │ │ ├── fetch_icebridge_data.py │ │ │ ├── fetcher_script.py │ │ │ ├── full_processing_script.py │ │ │ ├── gen_ortho.py │ │ │ ├── generate_fake_camera_models.py │ │ │ ├── generate_flight_summary.py │ │ │ ├── get_date_list.py │ │ │ ├── icebridge_common.py │ │ │ ├── icebridge_kmz_to_csv.py │ │ │ ├── input_conversions.py │ │ │ ├── label_images.py │ │ │ ├── lvis2kml.py │ │ │ ├── merge_orbitviz.py │ │ │ ├── multi_flight_label_runner.py │ │ │ ├── multi_process_command_runner.py │ │ │ ├── nav2cam.cc │ │ │ ├── orbitviz_pinhole.cc │ │ │ ├── ortho2pinhole.cc │ │ │ ├── pbs_functions.py │ │ │ ├── pleiades_job_runner.sh │ │ │ ├── pleiades_manager.py │ │ │ ├── process_calibration_file.py │ │ │ ├── process_icebridge_batch.py │ │ │ ├── process_icebridge_run.py │ │ │ ├── push_to_nsidc.py │ │ │ ├── qi2txt.cc │ │ │ ├── regenerate_summary_images.py │ │ │ ├── run_helper.py │ │ │ ├── run_multiple_flights.py │ │ │ ├── sbet2txt.pl │ │ │ └── special_cases.txt │ │ ├── IsisIO/ │ │ │ ├── BaseEquation.h │ │ │ ├── CMakeLists.txt │ │ │ ├── DiskImageResourceIsis.cc │ │ │ ├── DiskImageResourceIsis.h │ │ │ ├── Equation.cc │ │ │ ├── Equation.h │ │ │ ├── IsisCameraModel.h │ │ │ ├── IsisInterface.cc │ │ │ ├── IsisInterface.h │ │ │ ├── IsisInterfaceFrame.cc │ │ │ ├── IsisInterfaceFrame.h │ │ │ ├── IsisInterfaceLineScan.cc │ │ │ ├── IsisInterfaceLineScan.h │ │ │ ├── IsisInterfaceMapFrame.cc │ │ │ ├── IsisInterfaceMapFrame.h │ │ │ ├── IsisInterfaceMapLineScan.cc │ │ │ ├── IsisInterfaceMapLineScan.h │ │ │ ├── IsisInterfaceSAR.cc │ │ │ ├── IsisInterfaceSAR.h │ │ │ ├── IsisSpecialPixels.cc │ │ │ ├── IsisSpecialPixels.h │ │ │ ├── PolyEquation.cc │ │ │ ├── PolyEquation.h │ │ │ ├── RPNEquation.cc │ │ │ ├── RPNEquation.h │ │ │ └── tests/ │ │ │ ├── 5165r.cub │ │ │ ├── 5165r.map.cub │ │ │ ├── E0201461.tiny.cub │ │ │ ├── E1701676.reduce.cub │ │ │ ├── TestEphemerisEquations.cxx │ │ │ └── TestIsisCameraModel.cxx │ │ ├── OpenMVG/ │ │ │ ├── CMakeLists.txt │ │ │ ├── README.md │ │ │ ├── flat_pair_map.hpp │ │ │ ├── indMatch.hpp │ │ │ ├── numeric.cpp │ │ │ ├── numeric.h │ │ │ ├── projection.cpp │ │ │ ├── projection.hpp │ │ │ ├── tracks.hpp │ │ │ ├── triangulation.cpp │ │ │ ├── triangulation.hpp │ │ │ ├── triangulation_nview.cpp │ │ │ ├── triangulation_nview.hpp │ │ │ ├── types.hpp │ │ │ └── union_find.hpp │ │ ├── PcAlign/ │ │ │ ├── CMakeLists.txt │ │ │ ├── MaskedImageAlgs.cc │ │ │ ├── MaskedImageAlgs.h │ │ │ ├── NuthAlignment.cc │ │ │ ├── NuthAlignment.h │ │ │ ├── NuthAlignmentParse.cc │ │ │ ├── NuthAlignmentParse.h │ │ │ ├── NuthFit.cc │ │ │ ├── NuthFit.h │ │ │ ├── SlopeAspect.cc │ │ │ ├── SlopeAspect.h │ │ │ ├── pc_align_ceres.cc │ │ │ ├── pc_align_ceres.h │ │ │ ├── pc_align_fgr.cc │ │ │ ├── pc_align_fgr.h │ │ │ ├── pc_align_utils.cc │ │ │ └── pc_align_utils.h │ │ ├── PclIO/ │ │ │ ├── CMakeLists.txt │ │ │ ├── PclIO.cc │ │ │ └── PclIO.h │ │ ├── Python/ │ │ │ ├── CMakeLists.txt │ │ │ ├── asp_alg_utils.py │ │ │ ├── asp_cmd_utils.py │ │ │ ├── asp_dist_utils.py │ │ │ ├── asp_file_utils.py │ │ │ ├── asp_geo_utils.py │ │ │ ├── asp_image_utils.py │ │ │ ├── asp_rig_utils.py │ │ │ ├── asp_stereo_utils.py │ │ │ ├── asp_string_utils.py │ │ │ ├── asp_system_utils.py │ │ │ └── scale_linescan.py │ │ ├── Rig/ │ │ │ ├── BasicAlgs.cc │ │ │ ├── BasicAlgs.h │ │ │ ├── CMakeLists.txt │ │ │ ├── CameraImage.h │ │ │ ├── Detector.cc │ │ │ ├── Detector.h │ │ │ ├── ImageLookup.cc │ │ │ ├── ImageLookup.h │ │ │ ├── InterestPoint.cc │ │ │ ├── InterestPoint.h │ │ │ ├── InterpolationUtils.cc │ │ │ ├── InterpolationUtils.h │ │ │ ├── MergeMaps.cc │ │ │ ├── MergeMaps.h │ │ │ ├── NvmUtils.cc │ │ │ ├── NvmUtils.h │ │ │ ├── Ransac.cc │ │ │ ├── Ransac.h │ │ │ ├── RigCameraParams.cc │ │ │ ├── RigCameraParams.h │ │ │ ├── RigCameraUtils.cc │ │ │ ├── RigCameraUtils.h │ │ │ ├── RigConfig.cc │ │ │ ├── RigConfig.h │ │ │ ├── RigCostFunction.cc │ │ │ ├── RigCostFunction.h │ │ │ ├── RigData.cc │ │ │ ├── RigData.h │ │ │ ├── RigDem.cc │ │ │ ├── RigDem.h │ │ │ ├── RigImageIO.cc │ │ │ ├── RigImageIO.h │ │ │ ├── RigIo.cc │ │ │ ├── RigIo.h │ │ │ ├── RigMath.cc │ │ │ ├── RigMath.h │ │ │ ├── RigOptimizer.cc │ │ │ ├── RigOptimizer.h │ │ │ ├── RigOptions.h │ │ │ ├── RigOutlier.cc │ │ │ ├── RigOutlier.h │ │ │ ├── RigParseOptions.cc │ │ │ ├── RigParseOptions.h │ │ │ ├── RigParseUtils.cc │ │ │ ├── RigParseUtils.h │ │ │ ├── RigRpcDistortion.cc │ │ │ ├── RigRpcDistortion.h │ │ │ ├── RigThread.cc │ │ │ ├── RigThread.h │ │ │ ├── RigTypeDefs.h │ │ │ ├── RigUtils.cc │ │ │ ├── RigUtils.h │ │ │ ├── SystemUtils.cc │ │ │ ├── SystemUtils.h │ │ │ ├── TextureProcessing.cc │ │ │ ├── TextureProcessing.h │ │ │ ├── Tracks.cc │ │ │ ├── Tracks.h │ │ │ ├── TransformUtils.cc │ │ │ ├── TransformUtils.h │ │ │ ├── Triangulation.cc │ │ │ ├── Triangulation.h │ │ │ ├── happly.h │ │ │ └── theia_flags.txt │ │ ├── Sessions/ │ │ │ ├── BundleAdjustParse.cc │ │ │ ├── BundleAdjustParse.h │ │ │ ├── BundleAdjustSession.cc │ │ │ ├── BundleAdjustSession.h │ │ │ ├── CMakeLists.txt │ │ │ ├── CameraModelLoader.cc │ │ │ ├── CameraModelLoader.h │ │ │ ├── CameraUtils.cc │ │ │ ├── CameraUtils.h │ │ │ ├── StereoSession.cc │ │ │ ├── StereoSession.h │ │ │ ├── StereoSessionASTER.cc │ │ │ ├── StereoSessionASTER.h │ │ │ ├── StereoSessionBathy.cc │ │ │ ├── StereoSessionFactory.cc │ │ │ ├── StereoSessionFactory.h │ │ │ ├── StereoSessionGdal.cc │ │ │ ├── StereoSessionGdal.h │ │ │ ├── StereoSessionIo.cc │ │ │ ├── StereoSessionIp.cc │ │ │ ├── StereoSessionIsis.cc │ │ │ ├── StereoSessionIsis.h │ │ │ ├── StereoSessionMapProj.h │ │ │ ├── StereoSessionNadirPinhole.cc │ │ │ ├── StereoSessionNadirPinhole.h │ │ │ ├── StereoSessionPinhole.cc │ │ │ ├── StereoSessionPinhole.h │ │ │ ├── StereoSessionRPC.h │ │ │ └── tests/ │ │ │ ├── TestInstantiation.cxx │ │ │ ├── TestStereoSessionASTER.cxx │ │ │ ├── TestStereoSessionDG.cxx │ │ │ ├── TestStereoSessionDGMapRPC.cxx │ │ │ ├── TestStereoSessionRPC.cxx │ │ │ ├── TestStereoSessionSpot.cxx │ │ │ ├── dg_example1.xml │ │ │ ├── dg_example2.xml │ │ │ ├── dg_example3.xml │ │ │ └── dg_example4.xml │ │ ├── SfS/ │ │ │ ├── CMakeLists.txt │ │ │ ├── SfsArgs.cc │ │ │ ├── SfsArgs.h │ │ │ ├── SfsCamera.cc │ │ │ ├── SfsCamera.h │ │ │ ├── SfsCostFun.cc │ │ │ ├── SfsCostFun.h │ │ │ ├── SfsErrorEstim.cc │ │ │ ├── SfsErrorEstim.h │ │ │ ├── SfsImageProc.cc │ │ │ ├── SfsImageProc.h │ │ │ ├── SfsModel.cc │ │ │ ├── SfsModel.h │ │ │ ├── SfsOptions.cc │ │ │ ├── SfsOptions.h │ │ │ ├── SfsUtils.cc │ │ │ └── SfsUtils.h │ │ ├── SfmView/ │ │ │ ├── CMakeLists.txt │ │ │ ├── GlCommon.h │ │ │ ├── GlContext.cc │ │ │ ├── GlContext.h │ │ │ ├── GlWidget.cc │ │ │ ├── GlWidget.h │ │ │ ├── MeshRenderer.cc │ │ │ ├── MeshRenderer.h │ │ │ ├── SceneManager.cc │ │ │ ├── SceneManager.h │ │ │ ├── SceneOverview.cc │ │ │ ├── SceneOverview.h │ │ │ ├── SceneRenderer.cc │ │ │ ├── SceneRenderer.h │ │ │ ├── SfmMainWindow.cc │ │ │ ├── SfmMainWindow.h │ │ │ ├── SfmMath.h │ │ │ ├── SfmUtils.cc │ │ │ └── SfmUtils.h │ │ ├── Tools/ │ │ │ ├── CMakeLists.txt │ │ │ ├── add_spot_rpc.cc │ │ │ ├── aster2asp.cc │ │ │ ├── bathy_plane_calc.cc │ │ │ ├── bathy_threshold_calc.py │ │ │ ├── bias_dg_cam.py │ │ │ ├── bundle_adjust.cc │ │ │ ├── cam2map4stereo.py │ │ │ ├── cam2rpc.cc │ │ │ ├── cam_gen.cc │ │ │ ├── cam_test.cc │ │ │ ├── camera_calibrate │ │ │ ├── camera_footprint.cc │ │ │ ├── camera_solve │ │ │ ├── corr_eval.cc │ │ │ ├── coverage_fraction.cc │ │ │ ├── dem2gcp.cc │ │ │ ├── dem_geoid.cc │ │ │ ├── dem_mosaic.cc │ │ │ ├── dg_mosaic │ │ │ ├── disp2ip.cc │ │ │ ├── disparitydebug.cc │ │ │ ├── extract_bag │ │ │ ├── fit_rpc.cc │ │ │ ├── gcp_gen.cc │ │ │ ├── geodiff.cc │ │ │ ├── hiedr2mosaic.py │ │ │ ├── historical_helper.py │ │ │ ├── image_align.cc │ │ │ ├── image_calc.cc │ │ │ ├── image_mosaic.cc │ │ │ ├── image_subset.cc │ │ │ ├── jitter_solve.cc │ │ │ ├── list_timestamps │ │ │ ├── lronac2mosaic.py │ │ │ ├── lronacjitreg.cc │ │ │ ├── mapproject │ │ │ ├── mapproject_single.cc │ │ │ ├── mer2camera.cc │ │ │ ├── multi_stereo │ │ │ ├── n_align.cc │ │ │ ├── nonlin_trans_corr.cc │ │ │ ├── opencv_calibrate.cc │ │ │ ├── opencv_imagelist_creator.cc │ │ │ ├── orbit_plot.py │ │ │ ├── orbitviz.cc │ │ │ ├── otsu_threshold.cc │ │ │ ├── pansharp.cc │ │ │ ├── parallel_bundle_adjust │ │ │ ├── parallel_sfs │ │ │ ├── parallel_stereo │ │ │ ├── parse_match_file.py │ │ │ ├── pc_align.cc │ │ │ ├── pc_filter.cc │ │ │ ├── pc_merge.cc │ │ │ ├── point2dem.cc │ │ │ ├── point2las.cc │ │ │ ├── point2mesh.cc │ │ │ ├── prism2asp.cc │ │ │ ├── refr_index │ │ │ ├── rig_bracket │ │ │ ├── rig_calibrator.cc │ │ │ ├── rpc_gen.cc │ │ │ ├── runWithLog.py │ │ │ ├── sat_sim.cc │ │ │ ├── scale_bathy_mask.py │ │ │ ├── sfm_merge.cc │ │ │ ├── sfm_proc │ │ │ ├── sfm_submap.cc │ │ │ ├── sfm_view.cc │ │ │ ├── sfs.cc │ │ │ ├── sfs_blend.cc │ │ │ ├── skysat_helper.py │ │ │ ├── sparse_disp │ │ │ ├── stereo │ │ │ ├── stereo.cc │ │ │ ├── stereo.h │ │ │ ├── stereo_blend.cc │ │ │ ├── stereo_corr.cc │ │ │ ├── stereo_dist │ │ │ ├── stereo_fltr.cc │ │ │ ├── stereo_gui.cc │ │ │ ├── stereo_parse.cc │ │ │ ├── stereo_pprc.cc │ │ │ ├── stereo_rfne.cc │ │ │ ├── stereo_sweep │ │ │ ├── stereo_tile │ │ │ ├── stereo_tri.cc │ │ │ ├── texrecon │ │ │ ├── theia_sfm │ │ │ ├── tif_mosaic.cc │ │ │ ├── time_trials │ │ │ ├── undistort_image_texrecon.cc │ │ │ ├── wv_correct.cc │ │ │ └── xyzi2csv.cc │ │ ├── WVCorrect/ │ │ │ ├── CMakeLists.txt │ │ │ ├── README_MULTISPECTRAL │ │ │ ├── README_PAN │ │ │ ├── WV02_BAND3_CCD_CORR.tif │ │ │ ├── ccd_process.py │ │ │ ├── disp_avg.cc │ │ │ ├── find_ccds.m │ │ │ ├── find_ccds_aux.m │ │ │ ├── find_moving_avg.m │ │ │ ├── fix_ccd.m │ │ │ ├── form_corrections_image.py │ │ │ ├── gen_scandir.pl │ │ │ ├── ms_ccd_solve.sh │ │ │ ├── ms_ccd_verify.sh │ │ │ ├── ms_correction_lookup.txt │ │ │ ├── plot_ccds.m │ │ │ ├── run_lr.sh │ │ │ └── run_lr_wrap.sh │ │ ├── asp_config.h.in │ │ └── asp_date_config.h.in │ └── test/ │ ├── Helpers.h │ └── test_main.cc ├── stereo.default.example └── thirdparty/ ├── autotroll.mak ├── gtest/ │ ├── CHANGES │ ├── CONTRIBUTORS │ ├── COPYING │ ├── README │ ├── include/ │ │ └── gtest/ │ │ └── gtest_ASP.h │ └── src/ │ ├── gtest-all.cc │ └── gtest_main.cc ├── m4/ │ └── autotroll.m4 └── protobuf.mak ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bibliography-addition---.md ================================================ --- name: "Bibliography Addition \U0001F5C3" about: Add a paper, abstract, or other reference that used ASP! title: '' labels: '' assignees: '' --- **DOI** If the work has a DOI, that's really all we need. Please enter it. **Citation** Otherwise, please provide as complete a citation as possible. If you have a citation in BibTeX format, please paste that in (but it isn't required). ================================================ FILE: .github/ISSUE_TEMPLATE/bug-report---.md ================================================ --- name: "Bug Report \U0001F41B" about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Error Logs, Terminal Captures, Screenshots** If applicable, please give us as much information as you can to help explain your problem. **Your Environment (please complete the following information):** - OS: [e.g. macOS, Linux, and their version number] - ASP Version: [e.g. 2.6.2, can find via `stereo --version`] - Any other environment information that might be helpful? **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/feature-request---.md ================================================ --- name: "Feature Request \U0001F680" about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/pull_request_template.md ================================================ ## Description ## Related Issue ## Motivation and Context ## How Has This Been Tested? ## Types of changes - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (fix or feature that would cause existing functionality to change) ## Checklist: - My change requires a change to the documentation. - I have updated the documentation accordingly. - I have added tests to cover my changes. - All new and existing tests passed. ## Licensing: This project is released under the [LICENSE](https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/LICENSE). - 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. - 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. ================================================ FILE: .github/workflows/build_helper.sh ================================================ #!/bin/bash # This is a debugging script that builds ASP and its dependencies. It also shows # how the result of building can be uploaded as an artifact, and later moved to # a permanent location. Some parts are more focused towards the Mac build in the # cloud, while others apply to the local Linux build as well. # This script is not meant to be run directly. Each block of code must be # inspected, edited, and run separately. This is a scratchpad. The production # logic is in build_test.sh, save_mac_deps.sh, and the # https://github.com/NeoGeographyToolkit/stereopipeline-feedstock repo. # This helps do a dress rehearsal for the build process, before using # conda-build which is very slow and error-prone. # After the dependencies are updated with this script, they can be saved for the # future with the script save_mac_deps.sh. See that script for more info. # Move from the source dir to the home dir cd # Set up the compiler. Using a known compiler that is in the environment ensures # there are no surprises when later conda-build is employed with the same # compiler. if [ "$(uname)" = "Darwin" ]; then cc_comp=clang cxx_comp=clang++ else cc_comp=x86_64-conda-linux-gnu-gcc cxx_comp=x86_64-conda-linux-gnu-g++ fi # Fetch the ASP dependencies. Must keep $tag in sync with build_test.sh. See # save_mac_deps.sh for how to save and update a tarball with the dependencies. # New dependencies can be created from scratch with the environment in # stereopipeline-feedstock. tag=asp_deps_mac_x64_v3 # Mac Intel. Sync up tag with build_test.sh. # tag=asp_deps_mac_arm64_v3 # Mac Arm. Sync up tag with build_test.sh. # tag=asp_deps_linux_v2 # Linux. cd $HOME wget https://github.com/NeoGeographyToolkit/BinaryBuilder/releases/download/${tag}/asp_deps.tar.gz > /dev/null 2>&1 # this is verbose /usr/bin/time tar xzf asp_deps.tar.gz > /dev/null 2>&1 # this is verbose # Set up conda conda init bash source ~/.bash_profile conda activate asp_deps # Install anaconda client. Will save the anaconda_env client on exit. conda create -n anaconda -c conda-forge -c defaults -y anaconda-client # Activate anaconda env source ~/.bash_profile conda activate anaconda # Install conda-build in a separate environment. Do not save it on exit as it # can have huge partial builds. conda create -n build -c conda-forge -c defaults -y conda-build source ~/.bash_profile conda activate build # Build ale. It is assumed the compiler is set up as above. May need to save the # current ~/.ssh/id_rsa.pub key to Github in the user settings for recursive # cloning of the submodules to work. cd git clone https://github.com/DOI-USGS/ale.git --recursive cd ale git submodule update --recursive # if refreshing the repo later #git rebase origin/main #git reset --hard 0ba7b24 export PREFIX=$HOME/miniconda3/envs/asp_deps export PATH=$PREFIX/bin:$PATH mkdir -p build && cd build cmake .. \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp \ -DALE_USE_EXTERNAL_EIGEN=ON \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \ -DALE_USE_EXTERNAL_JSON=ON \ -DALE_BUILD_DOCS=OFF \ -DALE_BUILD_TESTS=OFF \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DCMAKE_INSTALL_PREFIX=${PREFIX} make -j${CPU_COUNT} install # Build usgscsm. It is assumed the compiler is set up as above. cd git clone https://github.com/DOI-USGS/usgscsm.git --recursive cd usgscsm git submodule update --recursive # if refreshing the repo later #git rebase origin/main mkdir -p build && cd build export PREFIX=$HOME/miniconda3/envs/asp_deps export PATH=$PREFIX/bin:$PATH # -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ # -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp \ cmake .. \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \ -DUSGSCSM_EXTERNAL_DEPS=ON \ -DUSGSCSM_BUILD_DOCS=OFF \ -DUSGSCSM_BUILD_TESTS=OFF \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DCMAKE_INSTALL_PREFIX=${PREFIX} make -j${CPU_COUNT} install # Build ISIS3 cd conda install -c conda-forge cmake doxygen \ c-compiler=1.7.0 cxx-compiler=1.7.0 \ fortran-compiler=1.7.0 git clone https://github.com/DOI-USGS/ISIS3.git cd ISIS3 mkdir -p build cd build export ISISROOT=$PWD #export PREFIX=$HOME/miniconda3/envs/asp_deps export PREFIX=$CONDA_PREFIX export PATH=$PREFIX/bin:$PATH export ISISTESTDATA=$HOME/isis_test_data conda env config vars set ISISTESTDATA=$ISISTESTDATA ext=.so if [ "$(uname)" = "Darwin" ]; then ext=.dylib fi cmake \ -GNinja \ -DJP2KFLAG=OFF \ -Dpybindings=OFF \ -DbuildTests=ON \ -DCMAKE_BUILD_TYPE=Release \ -DBULLET_DEFINITIONS="-DBT_USE_DOUBLE_PRECISION" \ -DOPENCV_INCLUDE_DIR=$PREFIX/include/opencv4 \ -DPCL_INCLUDE_DIR=${PREFIX}/include/pcl-1.15 \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ ../isis #export NINJAJOBS=4; /usr/bin/time ninja install -j $NINJAJOBS # osx /usr/bin/time ninja install # Create a tarball with the updated packages. It will be uploaded as an # artifact. The destination directory is set in the .yml file. # # See build_test.sh for how to use this artifact to save the updated packages to # a permanent location. mkdir -p ~/work/StereoPipeline/packages /usr/bin/time tar cfz ~/work/StereoPipeline/packages/asp_deps.tar.gz \ /Users/runner/miniconda3/envs # See the top of the document for how to save / fetch a tarball with dependencies. # Done for now. Other packages have been built before. exit 0 # Must create an ssh key to be able to clone the repos # ssh-keygen -t rsa # Add the key /Users/runner/.ssh/id_rsa.pub to github in Settings -> SSH and GPG keys # Turn on the steps below only if starting from scratch if [ 1 -eq 0 ]; then echo Wiping old env /bin/rm -rf /Users/runner/miniconda3/envs/asp_deps # Fetch the isis env from the /bin/rm -f environment.yml wget https://raw.githubusercontent.com/DOI-USGS/ISIS3/refs/heads/dev/environment.yml # Create the asp_deps env echo Creating a new asp_deps env conda env create -n asp_deps -f environment.yml conda activate asp_deps fi # Install some needed tools cd conda install -c conda-forge -y parallel pbzip2 # Build the needed packages # geoid cd wget https://github.com/NeoGeographyToolkit/StereoPipeline/releases/download/geoid1.0/geoids.tgz tar xzf geoids.tgz cd geoids if [ "$(uname)" = "Darwin" ]; then LIB_FLAG='-dynamiclib' EXT='.dylib' else LIB_FLAG='-shared' EXT='.so' fi # Build ${FC} ${FFLAGS} -fPIC -O3 -c interp_2p5min.f ${FC} ${LDFLAGS} ${LIB_FLAG} -o libegm2008${EXT} interp_2p5min.o # Install mkdir -p ${PREFIX}/lib cp -fv libegm2008.* ${PREFIX}/lib GEOID_DIR=${PREFIX}/share/geoids mkdir -p ${GEOID_DIR} cp -fv *tif *jp2 ${GEOID_DIR} # libnabo cd export PREFIX=/Users/runner/miniconda3/envs/asp_deps git clone https://github.com/NeoGeographyToolkit/libnabo.git cd libnabo mkdir -p build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS='-O3 -std=c++11' \ -DCMAKE_C_FLAGS='-O3' \ -DCMAKE_INSTALL_PREFIX=${PREFIX} \ -DEIGEN_INCLUDE_DIR=${PREFIX}/include/eigen3 \ -DCMAKE_PREFIX_PATH=${PREFIX} \ -DBoost_DIR=${PREFIX}/lib \ -DBoost_INCLUDE_DIR=${PREFIX}/include \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_VERBOSE_MAKEFILE=ON \ .. make -j${CPU_COUNT} install # libpointmatcher cd export PREFIX=$HOME/miniconda3/envs/asp_deps git clone https://github.com/NeoGeographyToolkit/libpointmatcher.git cd libpointmatcher mkdir -p build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-O3 -std=c++17" \ -DCMAKE_C_FLAGS='-O3' \ -DCMAKE_INSTALL_PREFIX=${PREFIX} \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_PREFIX_PATH=${PREFIX} \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DBUILD_SHARED_LIBS=ON \ -DEIGEN_INCLUDE_DIR=${PREFIX}/include/eigen3 \ -DBoost_DIR=${PREFIX}/lib \ -DBoost_INCLUDE_DIR=${PREFIX}/include \ -DBoost_NO_BOOST_CMAKE=OFF \ -DBoost_DEBUG=ON \ -DBoost_DETAILED_FAILURE_MSG=ON \ -DBoost_NO_SYSTEM_PATHS=ON \ .. make -j${CPU_COUNT} install # fgr cd $SRC_DIR git clone https://github.com/NeoGeographyToolkit/FastGlobalRegistration.git cd FastGlobalRegistration FGR_SOURCE_DIR=$(pwd)/source mkdir -p build && cd build INC_FLAGS="-I${PREFIX}/include/eigen3 -I${PREFIX}/include -O3 -L${PREFIX}/lib -lflann_cpp -llz4 -O3 -std=c++11" cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="${INC_FLAGS}" \ -DCMAKE_INSTALL_PREFIX=${PREFIX} \ -DCMAKE_PREFIX_PATH=${PREFIX} \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DFastGlobalRegistration_LINK_MODE=SHARED \ ${FGR_SOURCE_DIR} make -j${CPU_COUNT} # Install FGR_INC_DIR=${PREFIX}/include/FastGlobalRegistration mkdir -p ${FGR_INC_DIR} /bin/cp -fv ${FGR_SOURCE_DIR}/FastGlobalRegistration/app.h ${FGR_INC_DIR} FGR_LIB_DIR=${PREFIX}/lib mkdir -p ${FGR_LIB_DIR} /bin/cp -fv FastGlobalRegistration/libFastGlobalRegistrationLib* ${FGR_LIB_DIR} #s2p cd export PREFIX=/Users/runner/miniconda3/envs/asp_deps conda activate asp_deps conda install -c conda-forge -y fftw=3.3.10 git clone https://github.com/NeoGeographyToolkit/s2p.git --recursive cd s2p # update recursive submodules git submodule update --init --recursive export CFLAGS="-I$PREFIX/include -O3 -DNDEBUG -march=native" export LDFLAGS="-L$PREFIX/lib" # Fix for missing liblzma #perl -pi -e "s#(/[^\s]*?lib)/lib([^\s]+).la#-L\$1 -l\$2#g" ${PREFIX}/lib/*.la baseDir=$(pwd) # Extension if [ "$(uname)" = "Darwin" ]; then EXT='.dylib' else EXT='.so' fi # Build the desired programs cd 3rdparty/mgm perl -pi -e "s#CFLAGS=#CFLAGS=$CFLAGS #g" Makefile perl -pi -e "s#LDFLAGS=#LDFLAGS=$LDFLAGS #g" Makefile make -j${CPU_COUNT} cd $baseDir # msmw cd 3rdparty/msmw mkdir -p build cd build cmake .. \ -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CFLAGS" \ -DPNG_LIBRARY_RELEASE="${PREFIX}/lib/libpng${EXT}" \ -DTIFF_LIBRARY_RELEASE="${PREFIX}/lib/libtiff${EXT}" \ -DZLIB_LIBRARY_RELEASE="${PREFIX}/lib/libz${EXT}" \ -DJPEG_LIBRARY="${PREFIX}/lib/libjpeg${EXT}" make -j${CPU_COUNT} cd $baseDir # msmw2 cd 3rdparty/msmw2 mkdir -p build cd build cmake .. \ -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CFLAGS" \ -DPNG_LIBRARY_RELEASE="${PREFIX}/lib/libpng${EXT}" \ -DTIFF_LIBRARY_RELEASE="${PREFIX}/lib/libtiff${EXT}" \ -DZLIB_LIBRARY_RELEASE="${PREFIX}/lib/libz${EXT}" \ -DJPEG_LIBRARY="${PREFIX}/lib/libjpeg${EXT}" make -j${CPU_COUNT} cd $baseDir # Install the desired programs BIN_DIR=${PREFIX}/plugins/stereo/mgm/bin mkdir -p ${BIN_DIR} /bin/cp -fv 3rdparty/mgm/mgm ${BIN_DIR} BIN_DIR=${PREFIX}/plugins/stereo/msmw/bin mkdir -p ${BIN_DIR} /bin/cp -fv \ 3rdparty/msmw/build/libstereo/iip_stereo_correlation_multi_win2 \ ${BIN_DIR}/msmw BIN_DIR=${PREFIX}/plugins/stereo/msmw2/bin mkdir -p ${BIN_DIR} /bin/cp -fv \ 3rdparty/msmw2/build/libstereo_newversion/iip_stereo_correlation_multi_win2_newversion \ ${BIN_DIR}/msmw2 # libelas (does not work on Mac Arm) cd env=isis_dev # can also be asp_deps export PREFIX=$(ls -d ~/*conda3/envs/$env) export PATH=$PREFIX/bin:$PATH conda activate $env git clone https://github.com/NeoGeographyToolkit/libelas.git cd libelas # Set the env export CFLAGS="-I$PREFIX/include -O3 -DNDEBUG -ffast-math -march=native" export LDFLAGS="-L$PREFIX/lib" if [ "$(uname)" = "Darwin" ]; then EXT='.dylib' else EXT='.so' fi # build mkdir -p build cd build cmake .. \ -DTIFF_LIBRARY_RELEASE="${PREFIX}/lib/libtiff${EXT}" \ -DTIFF_INCLUDE_DIR="${PREFIX}/include" \ -DCMAKE_CXX_FLAGS="-I${PREFIX}/include" make -j${CPU_COUNT} # Copy the 'elas' tool to the plugins subdir meant for it BIN_DIR=${PREFIX}/plugins/stereo/elas/bin mkdir -p ${BIN_DIR} /bin/cp -fv elas ${BIN_DIR}/elas # Multiview cd conda activate asp_deps export PREFIX=$HOME/miniconda3/envs/asp_deps conda install -c conda-forge \ rocksdb rapidjson git clone https://github.com/NeoGeographyToolkit/MultiView.git --recursive cd MultiView # Must have ssh authentication set up for github git submodule update --init --recursive mkdir -p build && cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp \ -DMULTIVIEW_DEPS_DIR=${PREFIX} \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_MODULE_PATH=$PREFIX/share/pcl-1.13/Modules \ -DCMAKE_CXX_FLAGS="-O3 -std=c++11 -Wno-error -I${PREFIX}/include" \ -DCMAKE_C_FLAGS='-O3 -Wno-error' \ -DCMAKE_INSTALL_PREFIX=${PREFIX} make -j${CPU_COUNT} install # PDAL git clone https://github.com/PDAL/PDAL.git cd PDAL git checkout 2.9.3 mkdir -p build cd build export PREFIX=$HOME/miniconda3/envs/asp_deps ldflags="-Wl,-rpath,${PREFIX}/lib -L${PREFIX}/lib -lgeotiff -lcurl -lssl -lxml2 -lcrypto -lzstd -lz" if [ "$(uname)" = "Darwin" ]; then EXT='.dylib' else EXT='.so' # add unwind to ldflags on Linux ldflags="$ldflags -lunwind" fi # Compilers should be auto-detected if the env is activated # and has both them and cmake installed. cmake ${CMAKE_ARGS} \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DCMAKE_PREFIX_PATH=$PREFIX \ -DBUILD_PLUGIN_I3S=OFF \ -DBUILD_PLUGIN_TRAJECTORY=OFF \ -DBUILD_PLUGIN_E57=OFF \ -DBUILD_PLUGIN_PGPOINTCLOUD=OFF \ -DBUILD_PLUGIN_ICEBRIDGE=OFF \ -DBUILD_PLUGIN_NITF=OFF \ -DBUILD_PLUGIN_TILEDB=OFF \ -DBUILD_PLUGIN_HDF=OFF \ -DBUILD_PLUGIN_DRACO=OFF \ -DENABLE_CTEST=OFF \ -DWITH_TESTS=OFF \ -DWITH_ZLIB=ON \ -DWITH_ZSTD=ON \ -DWITH_LASZIP=ON \ -DWITH_LAZPERF=ON \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_CXX17_STANDARD_COMPILE_OPTION="-std=c++17" \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DWITH_TESTS=OFF \ -DCMAKE_EXE_LINKER_FLAGS="$ldflags" \ -DDIMBUILDER_EXECUTABLE=dimbuilder \ -DBUILD_PLUGIN_DRACO:BOOL=OFF \ -DOPENSSL_ROOT_DIR=${PREFIX} \ -DLIBXML2_INCLUDE_DIR=${PREFIX}/include/libxml2 \ -DLIBXML2_LIBRARIES=${PREFIX}/lib/libxml2${EXT} \ -DLIBXML2_XMLLINT_EXECUTABLE=${PREFIX}/bin/xmllint \ -DGDAL_LIBRARY=${PREFIX}/lib/libgdal${EXT} \ -DGDAL_CONFIG=${PREFIX}/bin/gdal-config \ -DZLIB_INCLUDE_DIR=${PREFIX}/include \ -DZLIB_LIBRARY:FILEPATH=${PREFIX}/lib/libz${EXT} \ -DCURL_INCLUDE_DIR=${PREFIX}/include \ -DPostgreSQL_LIBRARY_RELEASE=${PREFIX}/lib/libpq${EXT} \ -DCURL_LIBRARY_RELEASE=${PREFIX}/lib/libcurl${EXT} \ -DPROJ_INCLUDE_DIR=${PREFIX}/include \ -DPROJ_LIBRARY:FILEPATH=${PREFIX}/lib/libproj${EXT} \ .. make -j${CPU_COUNT} install # OpenEXR # This will be removed from ASP # Build from source, to ensure the proper version of ilmbase is used wget https://github.com/AcademySoftwareFoundation/openexr/archive/v2.5.5.tar.gz tar xzfv v2.5.5.tar.gz cd openexr-2.5.5 mkdir -p build && cd build conda activate isis_dev export PREFIX=$(ls -d ~/*conda3/envs/{asp_deps,isis_dev}) if [ ! -d "$PREFIX" ]; then echo "Error: $PREFIX does not exist. Exiting." #exit 1 fi $PREFIX/bin/cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp \ -DCMAKE_PREFIX_PATH=$PREFIX \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_CXX_FLAGS='-O3 -std=c++11 -w' \ -DCMAKE_C_FLAGS='-O3 -w' \ -DCMAKE_INSTALL_PREFIX=${PREFIX} \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 make -j${CPU_COUNT} install # Build theia cd ~/work/StereoPipeline conda install -c conda-forge vlfeat conda install -c conda-forge rapidjson=1.1.0 conda install -c conda-forge rocksdb=8.5.3 gflags glog ceres-solver mesalib # On linux, install mesa-libgl-cos6-x86_64 git clone git@github.com:NeoGeographyToolkit/TheiaSfM.git cd TheiaSfM mkdir -p build && cd build export PREFIX=$HOME/miniconda3/envs/asp_deps if [ ! -d "$PREFIX" ]; then echo "Error: $PREFIX does not exist. Exiting." #exit 1 fi $PREFIX/bin/cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DMULTIVIEW_DEPS_DIR=${PREFIX} \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_CXX_FLAGS='-O3 -std=c++11 -Wno-error' \ -DCMAKE_C_FLAGS='-O3 -Wno-error' \ -DCMAKE_MODULE_PATH=$PREFIX/share/pcl-1.13/Modules \ -DCMAKE_INSTALL_PREFIX=${PREFIX} # Build Multiview # Dependencies. Use precisely same compiler that will be used in the conda recipe git submodule update --init --recursive conda install -c conda-forge vlfeat \ gflags=2.2.2 glog=0.7.1 \ ceres-solver=2.2.0 \ vlfeat \ 'clang >=16,<17' 'clangxx >=16,<17' conda install -c conda-forge \ rapidjson=1.1.0 \ rocksdb=8.5.3 git clone git@github.com:NeoGeographyToolkit/MultiView.git mkdir -p build && cd build # For OSX use a custom location for TBB. This is a fix for a conflict with embree. # When that package gets updated to version 3 or 4 this may become unnecessary. opt="" if [[ $target_platform =~ osx.* ]]; then opt="-DTBB_LIBRARY=${PREFIX}/lib/libtbb.12.dylib -DTBB_MALLOC_LIBRARY=${PREFIX}/lib/libtbbmalloc.2.dylib" fi # Set up the cc_comp compiler as above # Enforce a compiler we know to work cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp \ -DMULTIVIEW_DEPS_DIR=${PREFIX} \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_CXX_FLAGS='-O3 -std=c++11' \ -DCMAKE_C_FLAGS='-O3' \ -DCMAKE_MODULE_PATH=$PREFIX/share/pcl-1.13/Modules \ -DCMAKE_INSTALL_PREFIX=${PREFIX} \ $opt # Build make -j${CPU_COUNT} install # Make the python env echo Creating a new python_isis8 env /bin/rm -rf /usr/local/miniconda/envs/python_isis8 conda create -n python_isis8 python=3.12.0 numpy=1.26.2 -y # Build visionworkbench cd conda activate asp_deps # Set up the cc_comp compiler as above # conda install -c conda-forge openblas cd ~/work/StereoPipeline export PREFIX=/Users/runner/miniconda3/envs/asp_deps git clone https://github.com/visionworkbench/visionworkbench.git cd visionworkbench mkdir -p build cd build cmake .. \ -DASP_DEPS_DIR=$PREFIX \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp echo Building VisionWorkbench make -j${CPU_COUNT} install # Build StereoPipeline cd conda activate asp_deps # Set up the cc_comp compiler as above export PREFIX=$HOME/miniconda3/envs/asp_deps cd ~/work mkdir copy_for_build cd copy_for_build git clone https://github.com/NeoGeographyToolkit/StereoPipeline.git cd StereoPipeline mkdir -p build cd build cmake .. \ -DASP_DEPS_DIR=$PREFIX \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DVISIONWORKBENCH_INSTALL_DIR=$PREFIX \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp echo Building StereoPipeline make -j${CPU_COUNT} install > /dev/null 2>&1 # this is too verbose # Search for packages conda search -c nasa-ames-stereo-pipeline --override-channels --platform osx-64 # Save current dependencies cd ~/work/StereoPipeline conda activate asp_deps; conda env export > asp_deps.yaml # conda env export > ~/miniconda3/envs/asp_deps/asp_deps.yaml.bk # To create an env, it appears important to use the flexible channel priority. # Below creating the final asp_deps env, after ensuring all dependencies are good. conda config --set channel_priority flexible conda env create -n asp_deps -f asp_deps.yaml # See the top of document for how to save / fetch a tarball with dependencies # See also for how to install conda-build and anaconda client. # geoid cd ~/work/StereoPipeline git clone https://github.com/NeoGeographyToolkit/geoid-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml geoid-feedstock conda activate build conda build -c nasa-ames-stereo-pipeline -c conda-forge geoid-feedstock anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/geoid-1.0_asp3.5.0-2.conda /Users/runner/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps geoid=1.0_asp3.5.0 # ilmbase git clone https://github.com/NeoGeographyToolkit/ilmbase-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml ilmbase-feedstock conda build -c conda-forge -c nasa-ames-stereo-pipeline ilmbase-feedstock ~/miniconda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/ilmbase-2.5.5-h01edc0c_1.conda #conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps ilmbase=2.5.5 /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 /Users/runner/miniconda3/envs/anaconda/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/ilmbase-2.5.5-h01edc0c_0.conda /Users/runner/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps ilmbase=2.5.5 # openexr cd ~/work/StereoPipeline https://github.com/NeoGeographyToolkit/openexr-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml openexr-feedstock ~/miniconda3/bin/anaconda upload upload /Users/runner/miniconda3/conda-bld/osx-64/openexr-2.5.5-ha5a8b8e_0.conda /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 # libnabo cd ~/work/StereoPipeline conda activate asp_deps; conda env export > asp_deps.yaml git clone https://github.com/NeoGeographyToolkit/libnabo-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml libnabo-feedstock conda activate build conda build -c nasa-ames-stereo-pipeline -c conda-forge libnabo-feedstock ~/miniconda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/libnabo-asp3.5.0-h01edc0c_1.conda ~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps libnabo # fgr cd ~/work/StereoPipeline git clone https://github.com/NeoGeographyToolkit/fgr-feedstock.git conda activate asp_deps; conda env export > asp_deps.yaml python StereoPipeline/conda/update_versions.py asp_deps.yaml fgr-feedstock conda activate build conda build -c nasa-ames-stereo-pipeline -c conda-forge fgr-feedstock anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/fgr-asp3.5.0-h01edc0c_0.conda ~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps fgr # libpointmatcher cd ~/work/StereoPipeline conda activate asp_deps; conda env export > asp_deps.yaml git clone https://github.com/NeoGeographyToolkit/libpointmatcher-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml libpointmatcher-feedstock conda activate build conda build -c nasa-ames-stereo-pipeline -c conda-forge libpointmatcher-feedstock anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/libpointmatcher-asp3.5.0-ha5a8b8e_0.conda ~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps libpointmatcher # pdal cd ~/work/StereoPipeline conda activate asp_deps; conda env export > asp_deps.yaml git clone https://github.com/NeoGeographyToolkit/pdal-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml pdal-feedstock # Do not use ASP GDAL so exclude the ASP channel conda activate build conda build -c conda-forge pdal-feedstock |tee output_debug_pdal.txt # s2p cd ~/work/StereoPipeline conda activate asp_deps; conda env export > asp_deps.yaml git clone https://github.com/NeoGeographyToolkit/s2p-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml s2p-feedstock conda build -c nasa-ames-stereo-pipeline -c conda-forge s2p-feedstock anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/s2p-subset-asp3.5.0-h01edc0c_0.conda # libelas cd ~/work/StereoPipeline conda activate asp_deps; conda env export > asp_deps.yaml git clone https://github.com/NeoGeographyToolkit/libelas-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml libelas-feedstock conda build -c nasa-ames-stereo-pipeline -c conda-forge libelas-feedstock ~/miniconda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/libelas-asp3.5.0-h01edc0c_0.conda ~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps libelas # Build Multiview with conda. Ensure that the same compile tools # are used as above. cd ~/work/StereoPipeline conda activate asp_deps; conda env export > asp_deps.yaml git clone https://github.com/NeoGeographyToolkit/multiview-feedstock.git python StereoPipeline/conda/update_versions.py asp_deps.yaml multiview-feedstock conda activate build conda build -c nasa-ames-stereo-pipeline -c conda-forge multiview-feedstock ~/*conda3/bin/anaconda upload /Users/runner/miniconda3/conda-bld/osx-64/multiview-asp_3.5.0-py310_0.conda ~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps multiview # visionworkbench cd ~/work/StereoPipeline git clone https://github.com/NeoGeographyToolkit/visionworkbench-feedstock.git conda activate asp_deps; conda env export > asp_deps.yaml python StereoPipeline/conda/update_versions.py asp_deps.yaml visionworkbench-feedstock conda activate build conda build -c conda-forge -c nasa-ames-stereo-pipeline visionworkbench-feedstock 2>&1 |tee output_debug.txt ~/miniconda3/bin/anaconda upload upload /Users/runner/miniconda3/conda-bld/osx-64/visionworkbench-asp3.5.0-0.conda ~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps visionworkbench # StereoPipeline conda config --set channel_priority flexible cd ~/work/StereoPipeline git clone https://github.com/NeoGeographyToolkit/stereopipeline-feedstock.git conda activate asp_deps; conda env export > asp_deps.yaml python StereoPipeline/conda/update_versions.py asp_deps.yaml stereopipeline-feedstock conda activate build conda build -c nasa-ames-stereo-pipeline -c usgs-astrogeology \ -c conda-forge stereopipeline-feedstock 2>&1 |tee output_debug.txt ~/miniconda3/bin/anaconda upload ~/miniconda3/bin/conda install -c nasa-ames-stereo-pipeline -c conda-forge -n asp_deps # Prepare for packaging the tarball conda install -c conda-forge pbzip2 chrpath cmake parallel conda create -c conda-forge -n python_isis8 python=3.10.13 numpy=1.26.4 # Package with BinaryBuilder. The Mac Arm and Mac x84 use # different paths to the python environment. cd ~/work/StereoPipeline git clone https://github.com/NeoGeographyToolkit/BinaryBuilder cd BinaryBuilder export PREFIX=$HOME/miniconda3/envs/asp_deps export ISISROOT=$PREFIX installDir=$PREFIX envPath=$PREFIX pythonPath=$(ls -d $HOME/miniconda3/envs/*python* | head -n 1) echo installDir=$installDir echo envPath=$envPath echo pythonPath=$pythonPath ./make-dist.py $installDir \ --asp-deps-dir $envPath \ --python-env $(ls -d $HOME/*conda3/envs/python*) ================================================ FILE: .github/workflows/build_helper_linux.yml ================================================ name: build_helper_linux on: workflow_dispatch: jobs: build: runs-on: ubuntu-22.04 steps: - uses: conda-incubator/setup-miniconda@v3 with: auto-activate-base: true activate-environment: "" - uses: actions/checkout@v3 - name: Build deps on top of asp_deps run: | set -ex # Fetch the asp_deps tarball (cross-compiled on Mac, has all deps # except ISIS, Geoid, and Python env) tag=asp_deps_linux_v2 cd $HOME wget https://github.com/NeoGeographyToolkit/BinaryBuilder/releases/download/${tag}/asp_deps.tar.gz /usr/bin/time tar xzf asp_deps.tar.gz -C $HOME # Find the env envPath=$(ls -d $HOME/*conda3/envs/asp_deps) if [ ! -d "$envPath" ]; then echo "Error: $envPath does not exist" exit 1 fi export PATH=$envPath/bin:$PATH conda init bash source ~/.bash_profile conda activate asp_deps # The tarball was stripped to fit GitHub releases (2GB limit). # Removed: lib/python3.13/, static .a files, LLVM/clang, OpenVINO, # openblas (MKL used), conda-meta, rclone, mysqld, locale-archive, # opt/bullet, include/{bullet,qt6,vtk-9.5}. # BLAS/LAPACK symlinks redirect to MKL (libmkl_rt.so). # Reinstall stripped packages needed for ISIS build. # Pin versions to match environment_asp_deps_linux.yml. conda install -c conda-forge -y \ "bullet>=3.25" "qt6-main>=6,<7" "openblas" 2>/dev/null || true # Create the Python env (needed for ASP packaging later). # Must match the Python version in asp_deps. conda create -n python_isis9 -c conda-forge -y python=3.13 numpy # Set up compiler cc_comp=x86_64-conda-linux-gnu-gcc cxx_comp=x86_64-conda-linux-gnu-g++ PREFIX=$envPath # Build Geoid (Fortran, can't cross-compile on Mac) cd $HOME wget https://github.com/NeoGeographyToolkit/StereoPipeline/releases/download/geoid1.0/geoids.tgz tar xzf geoids.tgz cd geoids ${PREFIX}/bin/x86_64-conda-linux-gnu-gfortran -fPIC -O3 -c interp_2p5min.f ${PREFIX}/bin/x86_64-conda-linux-gnu-gfortran -shared -o libegm2008.so interp_2p5min.o cp -fv libegm2008.so ${PREFIX}/lib/ mkdir -p ${PREFIX}/share/geoids cp -fv *.tif *.jp2 ${PREFIX}/share/geoids/ # Build ALE (already cross-compiled in tarball, skip for now) if [ 1 -eq 0 ]; then cd $HOME git clone https://github.com/DOI-USGS/ale.git --recursive cd ale mkdir -p build && cd build cmake .. \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp \ -DALE_USE_EXTERNAL_EIGEN=ON \ -DALE_USE_EXTERNAL_JSON=ON \ -DALE_BUILD_LOAD=ON \ -DALE_BUILD_DOCS=OFF \ -DALE_BUILD_TESTS=OFF \ -DCMAKE_INSTALL_PREFIX=${PREFIX} make -j$(nproc) install fi # Build USGSCSM (already cross-compiled in tarball, skip for now) if [ 1 -eq 0 ]; then cd $HOME git clone https://github.com/DOI-USGS/usgscsm.git --recursive cd usgscsm mkdir -p build && cd build cmake .. \ -DCMAKE_C_COMPILER=${PREFIX}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${PREFIX}/bin/$cxx_comp \ -DUSGSCSM_EXTERNAL_DEPS=ON \ -DUSGSCSM_BUILD_DOCS=OFF \ -DUSGSCSM_BUILD_TESTS=OFF \ -DCMAKE_INSTALL_PREFIX=${PREFIX} make -j$(nproc) install fi # Build ISIS (needs Qt6, Fortran deps - can't cross-compile on Mac) cd $HOME git clone https://github.com/DOI-USGS/ISIS3.git cd ISIS3 git submodule update --init --recursive mkdir -p build && cd build export ISISROOT=$PWD cmake .. \ -GNinja \ -DJP2KFLAG=OFF \ -Dpybindings=OFF \ -DBUILD_TESTING=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=${PREFIX} \ ../isis /usr/bin/time ninja install # Tar both envs (asp_deps + python_isis9) mkdir -p ~/work/StereoPipeline/packages cd $HOME condaDir=$(basename $(dirname $envPath)) /usr/bin/time tar czf ~/work/StereoPipeline/packages/asp_deps.tar.gz \ ${condaDir}/envs/asp_deps ${condaDir}/envs/python_isis9 - name: Upload artifacts if: always() uses: actions/upload-artifact@v4 with: name: asp-deps-linux-with-isis path: ~/work/StereoPipeline/packages retention-days: 2 continue-on-error: true ================================================ FILE: .github/workflows/build_test.sh ================================================ #!/bin/bash # This is run by GitHub Actions to build and test the Mac version of ASP. # See build_helper.sh for detailed build commands for ASP and its dependencies. # Track infrastructure failures separately from test failures. # Infrastructure failures (build, packaging) are fatal. # Test validation failures are reported but not fatal. build_failed=0 # Record the location where the script is running, which should # be the base of the StereoPipeline repo. This must happen first. aspRepoDir=$(pwd) # same as $HOME/work/StereoPipeline/StereoPipeline if [ "$(basename $aspRepoDir)" != "StereoPipeline" ]; then # Check that base dir is StereoPipeline echo "Error: Directory: $aspRepoDir is not StereoPipeline" exit 1 fi # Other variables baseDir=$(dirname $aspRepoDir) # one level up installDir=$baseDir/install # packageDir will later be uploaded, as set in the yml file packageDir=$baseDir/packages testDir=$baseDir/StereoPipelineTest # Throw an error unless on a Mac isMac=$(uname -s | grep Darwin) if [ "$isMac" = "" ]; then echo "This script is for Mac only" exit 1 fi # See if this is Arm64 or Intel x64 isArm64=$(uname -m | grep arm64) # The ASP dependencies at the location below are updated using the script # save_mac_deps.sh. See that script for more info. Sometimes the names and # versions of these change during development. if [ "$isArm64" != "" ]; then echo "Platform: Arm64 Mac" tag=asp_deps_mac_arm64_v3 envName=asp_deps else echo "Platform: Intel Mac" tag=asp_deps_mac_x64_v3 envName=asp_deps fi # Fetch and unzip the ASP dependencies bbUrl=https://github.com/NeoGeographyToolkit/BinaryBuilder/releases/download/${tag} if [ "$isArm64" != "" ]; then # ARM64: single tarball wget ${bbUrl}/asp_deps.tar.gz > /dev/null 2>&1 /usr/bin/time tar xzf asp_deps.tar.gz -C $HOME > /dev/null 2>&1 else # Intel x64: split into two tarballs (env exceeds 2 GB GitHub limit) wget ${bbUrl}/asp_deps_p1.tar.gz > /dev/null 2>&1 wget ${bbUrl}/asp_deps_p2.tar.gz > /dev/null 2>&1 /usr/bin/time tar xzf asp_deps_p1.tar.gz -C $HOME > /dev/null 2>&1 /usr/bin/time tar xzf asp_deps_p2.tar.gz -C $HOME > /dev/null 2>&1 fi # The env can be in miniconda3 or anaconda3 envPath=$(ls -d $HOME/*conda3/envs/${envName}) if [ ! -d "$envPath" ]; then echo "Error: Directory: $envPath does not exist" exit 1 fi export PATH=$envPath/bin:$PATH # These are of help in interactive mode but are not strictly needed in batch mode conda init source ~/.bash_profile conda activate $envName # Must use the linker from the conda environment to avoid issues with recent Intel Mac. # The linker can be installed with conda as package ld64_osx-64 on conda forge. # Put it in the asp_deps env. cmake_opts="" if [ "$isArm64" = "" ]; then CONDA_LINKER="$(ls $envPath/bin/x86_64-apple-darwin*ld | head -n 1)" if [ ! -f "$CONDA_LINKER" ]; then echo "Error: File: $CONDA_LINKER does not exist" exit 1 fi ln -sf "$CONDA_LINKER" "$envPath/bin/ld" # Force the use of conda linker cmake_opts="-DCMAKE_LINKER=$envPath/bin/ld" fi # Set up the compiler if [ "$(uname)" = "Darwin" ]; then cc_comp=clang cxx_comp=clang++ else cc_comp=x86_64-conda-linux-gnu-gcc cxx_comp=x86_64-conda-linux-gnu-g++ fi echo cc_comp=$cc_comp echo cxx_comp=$cxx_comp # Build visionworkbench mkdir -p $baseDir cd $baseDir git clone https://github.com/visionworkbench/visionworkbench.git cd visionworkbench mkdir -p build cd build $envPath/bin/cmake .. \ -DASP_DEPS_DIR=$envPath \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \ -DCMAKE_INSTALL_PREFIX=$installDir \ -DCMAKE_C_COMPILER=${envPath}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${envPath}/bin/$cxx_comp \ $cmake_opts echo Building VisionWorkbench make -j10 install > /dev/null 2>&1 # this is too verbose # Log of the build, for inspection, in case it fails. # This will resume from earlier. out_build_vw=$(pwd)/output_build_vw.txt make install > $out_build_vw 2>&1 tail -n 500 $out_build_vw echo Log of VW build will be saved with the artifacts in $(basename $out_build_vw) # Build StereoPipeline cd $aspRepoDir mkdir -p build cd build $envPath/bin/cmake .. \ -DASP_DEPS_DIR=$envPath \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \ -DCMAKE_INSTALL_PREFIX=$installDir \ -DVISIONWORKBENCH_INSTALL_DIR=$installDir \ -DCMAKE_C_COMPILER=${envPath}/bin/$cc_comp \ -DCMAKE_CXX_COMPILER=${envPath}/bin/$cxx_comp \ $cmake_opts echo Building StereoPipeline make -j10 install > /dev/null 2>&1 # this is too verbose ans=$? if [ "$ans" -ne 0 ]; then echo "Error: StereoPipeline build failed" # Do not exit so we can save the build log fi # Log of the build, for inspection in case it fails out_build_asp=$(pwd)/output_build_asp.txt make install > $out_build_asp 2>&1 tail -n 500 $out_build_asp echo Log of ASP build will be saved with the artifacts in $(basename $out_build_asp) # Bugfix for duplicate LC_PATH failure. Wipe all values of LC_PATH. for lib in $installDir/lib/*dylib; do for f in $(otool -l $lib | grep -A 3 LC_RPATH | grep path | awk '{print $2}'); do install_name_tool -delete_rpath $f $lib done done export DYLD_LIBRARY_PATH=$installDir/lib:$DYLD_LIBRARY_PATH # Package with BinaryBuilder. The Mac Arm and Mac x64 use # different paths to the python environment. echo Packaging the build cd $baseDir # Clone BinaryBuilder BEFORE setting DYLD_LIBRARY_PATH to include conda # libs, as conda's libiconv conflicts with system git. /usr/bin/git clone https://github.com/NeoGeographyToolkit/BinaryBuilder cd BinaryBuilder num=$(ls -d $HOME/*conda3/envs/python* | wc -l) # Must have exactly one python env if [ "$num" -ne 1 ]; then echo "Error: Expected exactly one python env, found $num" exit 1 fi export ISISROOT=$envPath # needed for Mac Arm # Do not add $envPath/lib to DYLD_LIBRARY_PATH. Conda's libiconv and ICU libs # shadow system frameworks and crash CoreFoundation (Qt6 static init dies with # "unrecognized selector" in CFStringGetFileSystemRepresentation on Sequoia). # Use DYLD_FALLBACK_LIBRARY_PATH instead - it only kicks in when rpath/install_name # lookup fails, so system libs are never shadowed. export DYLD_FALLBACK_LIBRARY_PATH=$envPath/lib # Qt6 crashes on macOS 15 during os version check in its static initializer. # SYSTEM_VERSION_COMPAT=1 tells macOS to report version in a compatible way. export SYSTEM_VERSION_COMPAT=1 ./make-dist.py $installDir \ --asp-deps-dir $envPath \ --python-env $(ls -d $HOME/*conda3/envs/python*) if [ $? -ne 0 ]; then echo "Error: make-dist.py failed" build_failed=1 fi # Prepare the package for upload mkdir -p $packageDir mv -fv Stereo* $packageDir # Extract the tarball so we can test it cd $packageDir tarBall=$(ls StereoPipeline-*.tar.bz2 | head -n 1) if [ "$tarBall" == "" ]; then echo Cannot find the packaged ASP tarball build_failed=1 fi /usr/bin/time tar xjf $tarBall > /dev/null 2>&1 # this is verbose # Path to executables binDir=$packageDir/$tarBall binDir=${binDir/.tar.bz2/} binDir=$binDir/bin export PATH=$binDir:$PATH echo "Binaries are in $binDir" if [ ! -d "$binDir" ]; then echo "Error: Directory: $binDir does not exist. Build failed." build_failed=1 fi # TODO(oalexan1): Run the tests as a different step in the .yml file. # Extract the tests. This tarball has both the scripts, test data, # and the expected results. # TODO(oalexan1): Must fetch the StereoPipelineTest repo and update # the scripts extracted from the tarball. cd $baseDir echo Testing the build. wget https://github.com/NeoGeographyToolkit/StereoPipelineTest/releases/download/0.0.1/StereoPipelineTest.tar > /dev/null 2>&1 # this is verbose # Check if we got the tarball if [ ! -f "StereoPipelineTest.tar" ]; then echo "Error: File: StereoPipelineTest.tar does not exist. Test failed." build_failed=1 fi tar xfv StereoPipelineTest.tar > /dev/null 2>&1 # this is verbose # Note: If the test results change, a new tarball with latest scripts and test # results must be uploaded. That is done by running the script: # StereoPipeline/.github/workflows/update_mac_tests.sh in the local directory. # The nightly build script fetches the testa data with the latest and reference # results in tarball StereoPipelineTest.tar. That artifact will be uploaded # further down. # Go to the test dir if [ ! -d "$testDir" ]; then echo "Error: Directory: $testDir does not exist" build_failed=1 fi cd $testDir # Run the tests. Failed to install pytest, despite trying hard. # Just run them manually. reportFile=$(pwd)/output_test.txt rm -f $reportFile ans=0 for d in ss*; do # Skip unless a directory if [ ! -d "$d" ]; then continue; fi cd $d echo Running test in $(pwd) ./run.sh > output.txt 2>&1 ./validate.sh >> output.txt 2>&1 ans0=$? tail -n 20 output.txt # this can be verbose echo "Test $d returned $ans0" echo "Test $d returned $ans0" >> $reportFile if [ "$ans0" -ne 0 ]; then ans=1; fi # keep record of failures cd .. done echo ans is $ans # Set the test status. This is parsed after the build is downloaded. echo test_status $ans >> $reportFile if [ "$ans" -eq 0 ]; then echo "All tests passed" else # Do not quit, as we want to save the test results echo "Some tests failed" fi # Create the artifacts dir that will be saved mkdir -p $packageDir # Save the resulting test results as part of the artifacts. See above for how # to use this to update the test results in the cloud. echo Copying the build (cd $testDir/..; tar cf $packageDir/$(basename $testDir).tar $(basename $testDir)) # Save these logs as part of the artifacts echo Copying the logs cp -rfv $out_build_vw $out_build_asp $reportFile $packageDir # Wipe the extracted tarball so we do not upload it # TODO(oalexan1): Consider extracting it to a different location to start with rm -rfv $(dirname $binDir) > /dev/null 2>&1 # Exit with failure if build/packaging broke (infrastructure failure) if [ "$build_failed" -ne 0 ]; then echo "Build or packaging failed (see errors above)" exit 1 fi # Exit with test status so CI reports failure when tests fail exit $ans ================================================ FILE: .github/workflows/build_test_mac_arm64.yml ================================================ name: build_test_mac_arm64 on: workflow_dispatch: jobs: build: runs-on: macos-latest steps: - uses: actions/checkout@v3 # No caching of dependencies, as the cache does not change when it is # modified, and it can expire. See build_test.sh how to fetch an # offline tarball with dependencies, and how to update that one if need # be. # - name: Cache conda # id: cache-conda # uses: actions/cache@v3 # env: # cache-name: cache-conda # with: # path: | # /usr/local/miniconda/envs # key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/miniconda.json') }} # restore-keys: | # ${{ runner.os }}-build-${{ env.cache-name }}- # ${{ runner.os }}-build- # ${{ runner.os }}- - name: build_test # Build and test ASP run: ./.github/workflows/build_test.sh - name: Upload artifacts if: always() uses: actions/upload-artifact@v4 with: # This must be in sync with BinaryBuilder/auto_build name: StereoPipeline-Artifact-build_test_mac_arm64 path: ~/work/StereoPipeline/packages retention-days: 2 continue-on-error: true ================================================ FILE: .github/workflows/build_test_mac_x64.yml ================================================ name: build_test_mac_x64 on: workflow_dispatch: jobs: build: runs-on: macos-15-intel steps: - uses: actions/checkout@v3 - name: build_test # Build and test ASP run: ./.github/workflows/build_test.sh - name: Upload artifacts if: always() uses: actions/upload-artifact@v4 with: # This must be in sync with BinaryBuilder/auto_build name: StereoPipeline-Artifact-build_test_mac_x64 path: ~/work/StereoPipeline/packages retention-days: 2 continue-on-error: true ================================================ FILE: .github/workflows/save_linux_deps.sh ================================================ #!/bin/bash # Run this on a local machine to save the current dependencies as a release. # This will wipe the old version with the same tag. See save_mac_deps.sh for # more info. # Check usage if [ "$#" -lt 1 ]; then echo "Usage: $0 tag" exit 1 fi tag=$1; shift # Create the tarball of dependencies. This likely includes a pre-built ASP # itself, but that is not a problem. # Note: Must updated below the names of both envs if they change. tarball=asp_deps.tar.gz cd $HOME echo Creating: $tarball /usr/bin/time tar cfz $tarball \ miniconda3/envs/asp_deps \ miniconda3/envs/python_isis9 # Set up GitHub CLI gh=$HOME/miniconda3/envs/gh/bin/gh repo=git@github.com:NeoGeographyToolkit/BinaryBuilder.git # Run $gh auth to authenticate # Wipe old version $gh release -R $repo delete $tag # Save the tarball as a release notes="Full tarball of latest ASP dev build dependencies" /usr/bin/time $gh release -R $repo create $tag $tarball --title $tag --notes "$notes" ================================================ FILE: .github/workflows/save_mac_deps.sh ================================================ #!/bin/bash # To update the Mac dependencies or create new ones, in manual (interactive) # mode, run the ssh_mac_x64.yml / ssh_mac_arm.yml action to get ssh access to a # Mac cloud instance. # Then, fetch/build/update the dependencies. See # https://stereopipeline.readthedocs.io/en/latest/building_asp.html # for a high-level overview. # Ideally all dependencies are built and then installed as conda packages. # The script build_helper.sh has the commands for how build dependencies # manually, if needed to understand failures when using conda. # The updated dependencies should be installed in /Users/runner/miniconda3/envs. # When done, and before exiting, save the dependencies, such as: # mkdir -p ~/work/StereoPipeline/packages # cd $HOME # /usr/bin/time tar cfz ~/work/StereoPipeline/packages/asp_deps.tar.gz *conda3/envs # After quitting the action (exiting the shell), the tarball will be saved as an # artifact. Upload progress can be monitored in GitHub Actions. # Then, from a local machine, which need not be a Mac, run this script. # It will fetch the tarball from the cloud and then push it as a release # to permanent location, with given tag. # This tarball will be used to build VisionWorkplace and ASP. See the script # build_test.sh. # The tag set here must match the tag in build_test.sh and build_helper.sh. If # changing here, must later change in the other places. # This script will overwrite the dependencies. If in doubt, use it with a new # tag, as the dependencies are very hard to recreate. # TODO(oalexan1): For Intel Mac, the env exceeds the 2 GB GitHub release limit # and must be split into two tarballs (asp_deps_p1.tar.gz and asp_deps_p2.tar.gz). # This script does not yet handle the split. The build_test.sh script already # expects two parts for Intel Mac. # If the tarball with dependencies already exists locally, rather than being # fetched as an artifact first, the commands from the latter part of # this script can be run manually to upload the tarball as a release. # How to run this script: # For Mac x64: # tag=asp_deps_mac_x64_xxx # sync up here with build_test.sh # workflow="ssh_mac_x64.yml" # $HOME/projects/StereoPipeline/.github/workflows/save_mac_deps.sh $workflow $tag # For Mac Arm64: # tag=asp_deps_mac_arm64_xxx # sync up here with build_test.sh # workflow="ssh_mac_arm.yml" # $HOME/projects/StereoPipeline/.github/workflows/save_mac_deps.sh $workflow $tag # For Linux, the dependencies from the local machine can be saved as follows. # tag=asp_deps_linux_xxx # change here # $HOME/projects/StereoPipeline/.github/workflows/save_linux_deps.sh $tag # Check usage if [ "$#" -lt 2 ]; then echo "Usage: $0 workflow tag" exit 1 fi # The workflow that saved the dependencies as artifact. Options: # ssh_mac_x64.yml, ssh_mac_arm.yml workflow=$1; shift # The tag to use to save the dependencies. Must then use this tag # to fetch the dependencies in build_test.sh and build_helper.sh. tag=$1; shift # The GitHub CLI tool. Can be installed in a new conda environment # named 'gh' as follows: # conda create -n gh -c conda-forge gh gh=$(ls -d $HOME/*conda3/envs/gh/bin/gh) repo=git@github.com:NeoGeographyToolkit/StereoPipeline.git # Query the ${workflow}. Must check that that the top-most run is successful $gh run list -R $repo --workflow=${workflow} # Find the latest id, then fetch the artifacts for it ans=$($gh run list -R $repo --workflow=${workflow} | grep -v STATUS | head -n 1) completed=$(echo $ans | awk '{print $1}') success=$(echo $ans | awk '{print $2}') id=$(echo $ans | awk '{print $7}') echo Stage: $completed echo Status: $success echo Id: $id if [ "$success" != "success" ]; then echo "Error: The ${workflow} workflow did not succeed" exit 1 fi echo Fetching the build with id $id from the cloud echo $gh run download -R $repo $id /bin/rm -rf ASP-dependencies-macOS # Must wipe this first, or else the download can fail $gh run download -R $repo $id # Must be careful with the line below. This is set in the ${workflow} file. binaries=ASP-dependencies-macOS/asp_deps.tar.gz if [ ! -f "$binaries" ]; then echo "Error: File: $binaries does not exist" exit 1 fi # Add the tarball of dependencies as a release # Can use a new tag here, or overwrite the existing tarball # If making a new one, must make sure to update the tag in build_test.sh and build_helper.sh repo=git@github.com:NeoGeographyToolkit/BinaryBuilder.git # Wipe any old version echo If present, deleting the old release for tag: $tag $gh release -R $repo delete $tag -y 2>/dev/null # hide any error message for missing release # Upload the new version notes="Full tarball of latest ASP dev build dependencies" echo Uploading a new version for tag: $tag /usr/bin/time $gh release -R $repo create $tag $binaries --title $tag --notes "$notes" ================================================ FILE: .github/workflows/ssh_linux_arm.yml ================================================ name: ssh_linux_arm on: workflow_dispatch: jobs: build: runs-on: ubuntu-22.04-arm steps: # Fetch miniconda - uses: conda-incubator/setup-miniconda@v3 with: auto-activate-base: true activate-environment: "" # Fetch the code - uses: actions/checkout@v3 # No caching of dependencies, as the cache does not change when it is # modified, and it can expire. See build_test.sh how to fetch an offline # tarball with dependencies, and how to update that one if need be. # Set up ssh for interactive use - name: Setup tmate session uses: mxschmitt/action-tmate@v3 # disconnects after about 40 minutes timeout-minutes: 600 with: limit-access-to-actor: true # Upload the artifacts that were saved in the directory below before exiting # the ssh session. Useful for saving any results produced in this session. # Can be later downloaded manually and saved to a permanent location. - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ASP-dependencies-${{ runner.os }} path: ~/work/StereoPipeline/packages retention-days: 2 continue-on-error: true ================================================ FILE: .github/workflows/ssh_mac_arm.yml ================================================ name: ssh_mac_arm on: workflow_dispatch: jobs: build: runs-on: macos-latest steps: # Fetch miniconda - uses: conda-incubator/setup-miniconda@v3 with: auto-activate-base: true activate-environment: "" # Fetch the code - uses: actions/checkout@v3 # No caching of dependencies, as the cache does not change when it is # modified, and it can expire. See build_test.sh how to fetch an offline # tarball with dependencies, and how to update that one if need be. # Set up ssh for interactive use - name: Setup tmate session uses: mxschmitt/action-tmate@v3 # disconnects after about 40 minutes timeout-minutes: 600 with: limit-access-to-actor: true # Upload the artifacts that were saved in the directory below before exiting # the ssh session. Useful for saving any results produced in this session. # Can be later downloaded manually and saved to a permanent location. - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ASP-dependencies-${{ runner.os }} path: ~/work/StereoPipeline/packages retention-days: 2 continue-on-error: true ================================================ FILE: .github/workflows/ssh_mac_x64.yml ================================================ name: ssh_mac_x64 on: workflow_dispatch: jobs: build: runs-on: macos-15-intel steps: # Fetch miniconda - uses: conda-incubator/setup-miniconda@v3 with: auto-activate-base: true activate-environment: "" # Fetch the code - uses: actions/checkout@v3 # Set up ssh for interactive use - name: Setup tmate session uses: mxschmitt/action-tmate@v3 # disconnects after about 40 minutes timeout-minutes: 600 with: limit-access-to-actor: true # Upload the artifacts that were saved in the directory below before exiting # the ssh session. Useful for saving any results produced in this session. # Can be later downloaded manually and saved to a permanent location. # See save_mac_deps.sh for how to prepare the dependencies for upload. - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ASP-dependencies-${{ runner.os }} path: ~/work/StereoPipeline/packages retention-days: 2 continue-on-error: true ================================================ FILE: .github/workflows/update_mac_tests.sh ================================================ #!/bin/bash # Given the latest test results for Mac, as fetched (automatically) from the # cloud as an artifact, update the reference results and push the updated tests # back to the cloud. See build_test.sh for how this gets prepared and downloaded # to the machine that launches the build and regressions. # The tarball having the tests. data=StereoPipelineTest.tar # Check if it exists if [ ! -f "$data" ]; then # Maybe it is in a subdir. That happens when fetching the artifact. ans=$(ls */$data | head -n 1) if [ "$ans" != "" ]; then cd $(dirname $ans) fi fi # Check again if [ ! -f "$data" ]; then echo "Error: File: $data does not exist" exit 1 fi # Extract echo "Extracting $data" tar xfv $data > /dev/null 2>&1 # this is verbose if [ ! -d "StereoPipelineTest" ]; then echo "Error: Directory: StereoPipelineTest does not exist" exit 1 fi # Here may need to do some manual inspections # Update the failed tests (each 'gold' is overwritten with 'run'). # This assumes that the "run" directories are trusted to be correct. echo "Updating the tests" for f in StereoPipelineTest/ss*/run; do g=${f/run/gold} /bin/rm -rfv $g /bin/mv -fv $f $g done # If the scripts need to be updated, do it here, manually # Must make all scripts in bin and individual tests executable chmod a+x StereoPipelineTest/bin/* StereoPipelineTest/*/*sh echo "Creating a new tarball" tar cfv $data StereoPipelineTest # Make sure the gh tool is executable gh=$(ls -d $HOME/*conda3/envs/gh/bin/gh) if [ ! -x "$gh" ]; then echo "Error: Cannot find gh" exit 1 fi echo "Pushing the updated tarball to the cloud" repo=git@github.com:NeoGeographyToolkit/StereoPipelineTest.git tag=0.0.1 echo Wipe the old tests and upload the new ones $gh release -R $repo delete $tag -y # wipe old tarball notes="Update test results" $gh release -R $repo create $tag $data --title $tag --notes "$notes" # upload new ================================================ FILE: .gitignore ================================================ # Generally ignorable files. *~ /build /build_linux /install /install_linux docs/_build GitHubReleases.txt .vscode *.code-workspace ================================================ FILE: .readthedocs.yml ================================================ # .readthedocs.yml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the OS, Python version and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py # Build documentation with MkDocs #mkdocs: # configuration: mkdocs.yml # Optionally build your docs in additional formats such as PDF and ePub formats: - htmlzip # Optionally set the version of Python and requirements required to build your docs python: install: - requirements: docs/requirements.txt ================================================ FILE: AUTHORS.rst ================================================ The Ames Stereo Pipeline (ASP) was originally developed by the Intelligent Robotics Group (IRG), in the Intelligent Systems Division at the NASA Ames Research Center in Moffett Field, CA. **Project Lead** - Dr. `Ross Beyer `_ (NASA/SETI Institute) **Core Development Team** - Oleg Alexandrov (KBR, Inc., at NASA Ames) - Scott McMichael (KBR, Inc., at NASA Ames) **Contributors and Developers** - Zachary Moratto (NASA/Stinger-Ghaffarian Technologies, former ASP Lead Architect) - Michael J. Broxton (NASA/Carnegie Mellon University, former ASP Lead Architect and Project Lead, co-developer of the Vision Workbench) - Matthew Hancher (NASA, co-developer of the Vision Workbench) - Dr. Ara Nefian (NASA/Carnegie Mellon University, wrote the Bayes EM subpixel mode and the early version of Shape-from-Shading) - Mike Lundy (NASA/Stinger-Ghaffarian Technologies) - Dr. Laurence Edwards (NASA, former IRG Terrain Reconstruction Lead) - Monica Palaseanu-Lovejoy (USGS, lead the research on the bathymetry module, :numref:`bathy_intro`) - Dr. Randolph Kirk (USGS, contributed many insights to the shape-from-shading functionality, :numref:`sfs_usage`) - Yu Tao and Jan-Peter Muller (University College London, contributed the CASP-GO stereo processing system, :numref:`casp_go`) - Vinh To (NASA/Stinger-Ghaffarian Technologies) - Kyle Husmann (California Polytechnic State University) - Sasha Aravkin (Washington State University) - Aleksandr Segal (Stanford) - Patrick Mihelich (Stanford University) - Melissa Bunte (Arizona State University) - Matthew Faulkner (Massachusetts Institute of Technology) - Todd Templeton (UC Berkeley) - Morgon Kanter (Bard College) - Kerri Cahoy (Stanford University) - Ian Saxton (UC San Diego) - Trey Smith (NASA, lead the Astrobee and ISAAC projects, that resulted in the rig calibrator, :numref:`rig_calibrator`) - `mstyer `_ - `harguess `_ - David Shean (University of Washington) - Ben Smith (University of Washington) - Andrew Annex (Johns Hopkins University) - Joachim Meyer (University of Washington) - Jay Laura (USGS) - Shashank Bhushan (University of Washington) Acknowledgments --------------- The open source Stereo Pipeline leverages stereo image processing work, led by Michael J. Broxton (NASA/CMU), Dr. Laurence Edwards (NASA), Eric Zbinden (formerly NASA/QSS Inc.), Dr. Michael Sims (NASA), and others in the Intelligent Systems Division at NASA Ames Research Center. It has benefited substantially from the contributions of Dr. Keith Nishihara (formerly NASA/Stanford), Randy Sargent (NASA/Carnegie Mellon University), Dr. Judd Bowman (formerly NASA/QSS Inc.), Clay Kunz (formerly NASA/QSS Inc.), and Dr. Matthew Deans (NASA). The initial adaptation of Ames's stereo surface reconstruction tools to orbital imagers was a result of a NASA funded, industry led project to develop automated DEM generation techniques for the MGS mission. Our work with that project's Principal Investigator, Dr. Michael Malin of Malin Space Science Systems (MSSS), and Co-Investigator, Dr. Laurence Edwards of NASA Ames, inspired the idea of making stereo surface reconstruction technology available and accessible to a broader community. We thank Dr. Malin and Dr. Edwards for providing the initial impetus that in no small way made this open source stereo pipeline possible, and we thank Dr. Michael Caplinger, Joe Fahle and others at MSSS for their help and technical assistance. The tools for rig calibration (:numref:`rig_calibrator`), fusion of points clouds into meshes (:numref:`multi_stereo`), and texturing of meshes (:numref:`texrecon`), were originally developed as part of the NASA ISAAC project, with Trey Smith as project manager, and rely heavily on third-party packages, including Theia SfM, Ceres Solver, VoxBlox, and MVS Texturing. We'd also like to thank our friends and collaborators Dr. Randolph Kirk, Dr. Brent Archinal, Trent Hare, Mark Rosiek, and David Mayer of the United States Geological Survey's (USGS's) Astrogeology Science Center in Flagstaff, AZ, for their encouragement and willingness to share their experience and expertise by answering many of our technical questions. We also thank them for their ongoing support and efforts to help us evaluate our work. Thanks also to the USGS ISIS team, especially Jeff Anderson, Kris Becker, Jay Laura, and Jesse Mapel, for their help in integrating stereo pipeline with the USGS ISIS software package. Thanks go also to Dr. Mark Robinson, Jacob Danton, Ernest Bowman-Cisneros, Dr. Sam Laurence, and Melissa Bunte at Arizona State University for their help in adapting the Ames Stereo Pipeline to lunar data sets including the Apollo Metric Camera. We'd also like to thank Dr. David Shean, Dr. Ben Smith, and Dr. Ian Joughin of the Applied Physics Laboratory at the University of Washington for providing design direction for adapting Ames Stereo Pipeline to Earth sciences. Finally, we thank Dr. Ara Nefian, and Dr. Laurence Edwards for their contributions to this software, and Dr. Terry Fong (IRG Group Lead during the first decade or so of ASP's existence) for his management and support of the open source and public software release process. Portions of this software were developed with support from the following sources from NASA Science Mission Directorate (SMD) and Exploration Systems Mission Directorate (ESMD) funding sources: - Mars Technology Program - Mars Critical Data Products Initiative - Mars Reconnaissance Orbiter mission - Applied Information Systems Research program grant #06-AISRP06-0142 - Lunar Advanced Science and Exploration Research (LASER) program grants #07-LASER07-0148 and #11-LASER11-0112 - ESMD Lunar Mapping and Modeling Program (LMMP) - SMD Cryosphere Program - The Resource Prospector site selection activity - The VIPER mission site selection activity - NASA-USGS Interagency Agreement #NNH16AC13I to support the Community Sensor Model (CSM) work (2019-2021). - Planetary Data Archiving and Tools program (PDART) grant #19-PDART19_2-0094 under Dr. Ross Beyer (2020-2022). - NASA-USGS Interagency Agreement #30499, SAA2-403489 to support the satellite-derived bathymetry work (2020-2021) - NASA-USGS Interagency Agreement #NNH22OB02A to support interoperability between ISIS and ASP (2022-) - Decadal Survey Incubation for global Surface Topography and Vegetation (STV) grant #21-DSI-21-0008 under Dr. David Shean (2022-2025) - Support for Open Source Tools, Frameworks, and Libraries (OSTFL) grant #20-OSTFL20-0050 under Dr. Ross Beyer (2023-2024) Any opinions, findings, and conclusions or recommendations expressed in this documentation are those of the authors and do not necessarily reflect the views of the National Aeronautics and Space Administration. ================================================ FILE: CMakeLists.txt ================================================ cmake_minimum_required (VERSION 3.15.5) project(StereoPipeline) if(APPLE) cmake_policy(SET CMP0025 NEW) set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15) endif(APPLE) # Make it possible to append to these from the command line set(CMAKE_CXX_FLAGS "" CACHE STRING "") set(CMAKE_C_FLAGS "" CACHE STRING "") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -std=c++17 -DNDEBUG") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread -lpthread") # VisionWorkbench cannot be built with latest OpenEXR due to API changes. # The few places where this library was used were changed to use text files # instead of .exr files. So we disable OpenEXR support by default. set(USE_OPENEXR OFF CACHE BOOL "Use EXR (default OFF)") set(USE_ISIS ON CACHE BOOL "Use ISIS (default ON)") set(CORE_ASP_ONLY OFF CACHE BOOL "Build only core ASP (default OFF)") if (APPLE) # A workaround for the clang included with conda build set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlinker-version=305") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlinker-version=305") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mlinker-version=305") # Prevent a pedantic error in recent clang set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-enum-constexpr-conversion") # This a bugfix for spdlog issues set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFMT_USE_CHAR8_T=0") else() # On Linux need to link to additional libraries set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lm -lrt -lgcc_s") endif() # Tell cmake to look in the /cmake folder. list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") # Make sure we do a release type set(CMAKE_BUILD_TYPE "Release") message("Setting CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") add_subdirectory(src) install(FILES "AUTHORS.rst" DESTINATION ${CMAKE_INSTALL_PREFIX}) install(FILES "INSTALLGUIDE.rst" DESTINATION ${CMAKE_INSTALL_PREFIX}) install(FILES "LICENSE" DESTINATION ${CMAKE_INSTALL_PREFIX}) install(FILES "NEWS.rst" DESTINATION ${CMAKE_INSTALL_PREFIX}) install(FILES "README.rst" DESTINATION ${CMAKE_INSTALL_PREFIX}) install(FILES "stereo.default.example" DESTINATION ${CMAKE_INSTALL_PREFIX}) install(FILES "THIRDPARTYLICENSES.rst" DESTINATION ${CMAKE_INSTALL_PREFIX}) install(DIRECTORY "examples" DESTINATION ${CMAKE_INSTALL_PREFIX}) # Install only the .rst files as images take too much space install(DIRECTORY "docs" DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.rst") # Install the plugins directory and the files in it install(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/plugins/stereo) install(FILES "plugins/stereo/plugin_list.txt" DESTINATION ${CMAKE_INSTALL_PREFIX}/plugins/stereo) # Make a directory for wv_correct data and copy that data to it install(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/share/wv_correct) install(FILES "src/asp/WVCorrect/ms_correction_lookup.txt" DESTINATION ${CMAKE_INSTALL_PREFIX}/share/wv_correct) install(FILES "src/asp/WVCorrect/WV02_BAND3_CCD_CORR.tif" DESTINATION ${CMAKE_INSTALL_PREFIX}/share/wv_correct) install(FILES "src/asp/Camera/tests/ctx.json" DESTINATION ${CMAKE_INSTALL_PREFIX}/share/tests) # Install the default CASP-GO params install(FILES "src/asp/Gotcha/CASP-GO_params.xml" DESTINATION ${CMAKE_INSTALL_PREFIX}/share) ================================================ FILE: CODE_OF_CONDUCT.rst ================================================ ==================================== Contributor Covenant Code of Conduct ==================================== Our Pledge ---------- We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards ------------- Examples of behavior that contributes to a positive environment for our community include: - Demonstrating empathy and kindness toward other people - Being respectful of differing opinions, viewpoints, and experiences - Giving and gracefully accepting constructive feedback - Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience - Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: - The use of sexualized language or imagery, and sexual attention or advances of any kind - Trolling, insulting or derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or email address, without their explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities ---------------------------- Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope ----- This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement ----------- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement listed as the Project Lead or members of the Core Development Team in the AUTHORS.rst file. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines ---------------------- Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction ~~~~~~~~~~~~~ **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning ~~~~~~~~~~ **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban ~~~~~~~~~~~~~~~~ **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban ~~~~~~~~~~~~~~~~ **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. Attribution ----------- This Code of Conduct is adapted from the `Contributor Covenant `_ version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. Community Impact Guidelines were inspired by `Mozilla's code of conduct enforcement ladder `_. For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. ================================================ FILE: CONTRIBUTING.rst ================================================ ============ Contributing ============ Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. You can contribute to ASP in many ways: Types of Contributions ---------------------- Report Bugs or Ask for Features via Issues ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We want to hear from you! You can report bugs, ask for new features, or just raise issues or concerns via logging an `Issue via our GitHub repo `_. Fix Bugs or Implement Features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Look through the GitHub Issues for bugs to fix or features to implement. If anything looks tractable to you, work on it. Most (if not all) pull requests should be based on an Issue, so if you're thinking about doing some coding on a topic that isn't covered in an Issue, please author one so you can get some feedback while you work on your pull request. Write Documentation ~~~~~~~~~~~~~~~~~~~ ASP could always use more documentation, whether as part of the official docs, on the web in blog posts, articles, and such. Submit Feedback ~~~~~~~~~~~~~~~ The best way to send feedback is to file an `Issue `_. Get Started! ------------ Ready to contribute? You'll need to follow the instructions for building ASP from source, which can be found in the INSTALLGUIDE.rst file or the Installation chapter of the documentation. 1. Fork the `StereoPipeline` repo on GitHub. 2. Clone your fork locally:: $ git clone git@github.com:your_name_here/StereoPipeline.git 3. Create a branch for local development:: $ git checkout -b name-of-your-bugfix-or-feature Now you can make your changes locally. 4. When you're done making changes, check that your changes pass a run of `make gtest_all` (though note that the unit tests have been broken recently so this won't work). 5. Commit your changes and push your branch to GitHub:: $ git add . $ git commit -m "Your detailed description of your changes." $ git push origin name-of-your-bugfix-or-feature 6. Submit a `pull request `_. Pull Request Guidelines ----------------------- Before you submit a pull request, check that it meets these guidelines: 1. The pull request should include tests. 2. If the pull request adds functionality, the docs should be updated. Add the feature to the list in NEWS.rst and potentially update the README.rst or other documentation files. What to expect -------------- Our development of ASP is neither continuous, nor as well-funded as we might like, and it is entirely possible that when you submit a PR (pull request), none of us will have the time to evaluate or integrate your PR. If we don't, we'll try and communicate that with you via the PR. For large contributions, it is likely that you, or your employer, will be retaining your copyrights, but releasing the contributions via an open-source license. It must be compatible with the Apache-2 license that ASP is distributed with, so that we can redistribute that contribution with ASP, give you credit, and make ASP even better! Please contact us if you have a contribution of that nature, so we can be sure to get all of the details right. For smaller contributions, where you (or your employer) are not concerned about retaining copyright (but we will give you credit!), you will need to fill out a Contributor License Agreement (CLA) if we plan to accept your PR. The CLA assigns your copyright in your contribution to NASA, so that our NASA copyright statement remains true: Copyright (c) YEAR, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved. There is an `Individual CLA `_ and a `Corporate CLA `_. ASP People ---------- - An ASP **Contributor** is any individual creating or commenting on an issue or pull request. Anyone who has authored a PR that was merged should be listed in the AUTHORS.rst file. - An ASP **Committer** is a subset of contributors, typically NASA employees or contractors, who have been given write access to the repository. ================================================ FILE: ChangeLog ================================================ ================================================ FILE: INSTALLGUIDE.rst ================================================ Installation ============ Precompiled binaries are available for the stable releases and the current development build. Conda packages exist for the stable versions (:numref:`conda_intro`). .. _release: Precompiled binaries -------------------- Linux ~~~~~ Choose either the latest build (recommended) or a stable release from: - ``_ No installation steps or administrative rights are necessary. Extract the archive, and run the executables in the ``bin`` subdirectory as:: tar xvf StereoPipeline-3.6.0-2025-12-26-x86_64-Linux.tar.bz2 ./StereoPipeline-3.6.0-2025-12-26-x86_64-Linux/bin/stereo --help The result of the last command should be a help message. To permanently add the ASP executable subdirectory to your PATH, add to your shell configuration (e.g., ``~/.bashrc``), a line similar to:: export PATH="${PATH}":"/path/to/StereoPipeline/bin" Then, run ``source ~/.bashrc`` (or open a new terminal) for the changes to take effect. The latest additions are documented in :numref:`news`. MacOS ~~~~~ ASP is available for the Mac Intel and Mac Arm architectures. The latter is somewhat experimental but was shown to work well in testing. The Mac Arm package has all ASP logic except the minor ``libelas`` stereo algorithm (:numref:`libelas`). The installation steps are the same as for Linux. It is important to note that: - An error may be shown about not being able to verify the developers. That can be overridden in the Privacy & Security settings of the system. Consider using instead the conda-based installation (:numref:`conda_intro`), which should not have this issue. - Running the Intel build the first time will be slow, as Rosetta will translate the instructions to the native architecture. Subsequent runs will be faster. Windows ~~~~~~~ ASP does not offer Windows binaries. However, the Linux build can be run on Windows using the `Windows Subsystem for Linux `_ (WSL). Once a recent Linux distribution is installed and verified to work, the installation steps are the same as for Linux. .. _conda_intro: Conda-based installation ------------------------ The ASP 3.6.0 release (December 26, 2025) can be installed via conda, together with ISIS 9.0.0 (:numref:`planetary_images`) for Linux, Mac Intel, and Mac Arm. The Mac Arm release is experimental but was tested rather thoroughly. Since USGS did not release an ISIS version for Mac Arm (as of 12/2025), this is shipped with an unofficial ISIS Arm conda package, hosted on the ``nasa-ames-stereo-pipeline`` channel. This one lacks the Kakadu JPEG2000 library support. Consider using the Intel release under Rosetta 2 for mission-critical work. To install ``conda``, see: https://docs.conda.io/en/latest/miniconda.html Make the fetched installation file executable and run it, such as:: chmod u+x ./Miniconda3-latest-Linux-x86_64.sh ./Miniconda3-latest-Linux-x86_64.sh on Linux, and analogously on OSX. Use the suggested:: $HOME/miniconda3 directory for installation. Configure the conda channels:: conda config --env --add channels conda-forge conda config --env --add channels usgs-astrogeology conda config --env --add channels nasa-ames-stereo-pipeline Do not skip doing each of these three, even if you think you already have some of these channels. Run:: conda config --show channels to ensure that the order of channels is:: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge *Not having the channels in this order is likely to result in failure to install ASP.* Do not use the ``defaults`` channel. Install ASP with the commands:: conda config --set channel_priority flexible conda create -n asp \ -c nasa-ames-stereo-pipeline \ -c usgs-astrogeology \ -c conda-forge \ -c defaults \ stereo-pipeline=3.6.0 This will create a new environment named ``asp`` and install ASP 3.6.0 together with ISIS 9.0.0 and all other dependencies. The priority setting is set to ``flexible``, as otherwise conda can get confused if the same package (even with old versions) exists in more than one channel. Note that the *latest build* (:numref:`release`) may have more features and fixes than this official release. Environment setup ~~~~~~~~~~~~~~~~~ Run:: conda activate asp and set:: export ISISROOT=$CONDA_PREFIX in any new shell. These should put the ASP binaries in the path, and will also initialize various environmental variables, including ``ISISROOT`` and ``PROJ_DATA``. Check if the ``stereo`` command is found by running:: which stereo When working with planetary images with ISIS, the ``ISISDATA`` environmental variable also needs to be set (:numref:`planetary_images`). For more information see the `ISIS installation instructions `_. Alternative approaches ~~~~~~~~~~~~~~~~~~~~~~ Consider using ``mamba`` instead of ``conda`` for the installation, as it is much faster. (Note that recent ``conda`` distributions default to using the ``mamba`` solver.) ASP can be installed with Docker (`instructions `_). ASP can be built from source (:numref:`building_asp`). Post-installation ----------------- The next steps depend on whether it is desired to process planetary (non-Earth), Earth, or aerial images. .. _planetary_images: Planetary images ~~~~~~~~~~~~~~~~ To process images from NASA's spacecraft that are exploring other planets, install ISIS and its data. Summary of the steps: #. Fetch ISIS binaries and install, following https://github.com/DOI-USGS/ISIS3#installation #. Fetch ISIS data, as detailed at https://github.com/DOI-USGS/ISIS3#the-isis-data-area #. Add the ISIS executables to your path: - bash: ``export PATH="/path/to/isis/bin:${PATH}"`` - csh: ``setenv PATH "/path/to/isis/bin:${PATH}"`` #. Set the ``ISISDATA`` environmental variable to point to where your ISIS data was downloaded, per the installation link above. For example, in the ``bash`` shell, this is done as follows:: export ISISDATA="/path/to/isisdata" Check that you have the directory ``$ISISDATA/base``. #. Install Stereo Pipeline and set the ``PATH`` variable as above. #. Try it out. See :numref:`lronac_csm` for a quick Lunar example which does not require installing ISIS or it supporting data as above, :numref:`moc_tutorial` for an example using Mars images and ISIS data, and many other examples in :numref:`examples`. Earth images ~~~~~~~~~~~~ Processing Earth images is described in the data processing tutorial in :numref:`dg_tutorial`. See also examples for ASTER (:numref:`aster`), Pleiades (:numref:`pleiades`), SkySat (:numref:`skysat`), and many more in :numref:`examples`. Aerial and historical images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fetch the software as above. Processing images without accurate camera pose information is described in :numref:`sfm`. See also examples for declassified satellite images in :numref:`kh4`. .. _system_rec: System requirements ------------------- To run ASP, a computer cluster sharing storage and connected via ssh is needed (:numref:`pbs_slurm`). As a rule of thumb, for images on the order of 20,000 x 20,000 pixels, a machine with 40 GB of RAM 16 cores could likely produce a terrain model in 4 - 20 hours. There is a lot of uncertainty here, and much depends on the choice of the stereo algorithm (:numref:`stereo_alg_overview`), and if mapprojection is employed (:numref:`mapproj-example`). 1 TB of storage or more is suggested. Common errors ------------- Here are some errors you might see, and what it could mean. Treat these as templates for problems. In practice, the error messages might be slightly different. :: Error: **ERROR** Unable to initialize camera model in Camera Factory. **PROGRAMMER ERROR** Unable to create a shape model from given target and pvl. **I/O ERROR** Unable to open [$ISISDATA/]. Stereo step 0: Preprocessing failed You need to set up your ISIS environment or manually set the correct location for ``ISISDATA`` (:numref:`planetary_images`). :: bash: stereo: command not found You need to add the ``bin`` directory of your deployed Stereo Pipeline installation to the environmental variable ``PATH`` (:numref:`planetary_images`). :: /bin/sh: camrange: command not found You need to to add the ``bin`` directory of your ISIS installation to your path (:numref:`planetary_images`). :: Cache size (500 MB) is larger than the requested maximum cache size Consider increasing ``--cache-size-mb`` for your program. This also may be a sign of large input TIF images being stored in blocks as tall or as wide as the image. The storage scheme of an image can be examined with the ``gdalinfo -stats`` command, and an image can be rewritten with square blocks using the command:: gdal_translate -co compress=lzw -co TILED=yes -co INTERLEAVE=BAND \ -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 input.tif output.tif If the new images are used instead, that warning should go away and the processing time should go down. Both ``gdalinfo`` and ``gdal_translate`` are included with ASP. ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: NEWS.rst ================================================ Changes since last release -------------------------- Added a new program for distributed stereo processing across computing nodes (:numref:`stereo_dist`). Added a new program to study parameter sensitivity by running stereo on small patches with different parameter combinations (:numref:`stereo_sweep`). Added the ``asp_plot`` package for generating diagnostic plots and PDF reports from ASP outputs (:numref:`asp_plot`). Added cloud-optimized GeoTIFF (COG) support via the ``--cog`` option to ``point2dem``, ``mapproject``, etc. (:numref:`cog_output`). Added support for plain-text match files (:numref:`txt_match`). Added support for SPOT 6 and 7 exact linescan camera models (:numref:`spot67`). Migrated SPOT 5 to a CSM linescan camera model (:numref:`spot5`). This enables use of ``jitter_solve`` (:numref:`jitter_pleiades`). Migrated PeruSat-1 to a CSM linescan camera model (:numref:`perusat1`). This enables use of ``jitter_solve`` (:numref:`jitter_pleiades`). For the ASTER camera (:numref:`aster`), removed the ``--aster-use-csm`` option as that is the default. Removed the use of the helper RPC model for interest point matching. sfm_view (:numref:`sfm_view`): * Brought the source code into the ASP repository from the external MultiView dependency. * Input images are no longer required. Only camera files are needed. aster2asp (:numref:`aster2asp`): * Added support for ASTER Level 1A V004 HDF format. bathymetry (:numref:`bathy_intro`): * Added a program for computing the effective refraction index of water for a satellite band (:numref:`refr_index`). * Added documentation on alternative spectral indices for water masking (:numref:`bathy_water_masking`). bathy_plane_calc (:numref:`bathy_plane_calc`): * Refined the algorithm by taking into account that given a mask of land pixels, the true water interface is somewhere half way between those and the water pixels. * Added the option ``--ortho-mask`` to use a georeferenced orthoimage mask and a DEM to estimate the water plane (:numref:`bathy_plane_ortho_mask`). * Added the option ``--lon-lat-measurements`` to use a CSV file with longitude and latitude measurements and lookup heights in a DEM (:numref:`bathy_plane_lonlat`). * Removed the option ``--use-ecef-water-surface``. It is now always assumed that the bathy plane is computed in local projected coordinates. cam_test (:numref:`cam_test`): * Added the options ``--bathy-plane`` and ``--refraction-index`` to model bathymetry correction with ray bending according to Snell's law. bundle_adjust (:numref:`bundle_adjust`): * Replaced ``--save-cnet-as-csv`` with ``--save-cnet-as-gcp``. The control network is now saved after optimization and outlier filtering, with optimized triangulated point positions, including any input GCP. * Added bathymetry support (:numref:`ba_bathy`). jitter_solve (:numref:`jitter_solve`): * Added ``--save-cnet-as-gcp`` to save the optimized control network in GCP format, after outlier filtering (:numref:`bagcp`). ipfind (:numref:`ipfind`): * Added the option ``--binary-to-txt`` to convert .vwip files to text. ipmatch (:numref:`ipmatch`): * Added options for converting match files between binary and text formats (:numref:`ipmatch_convert`). * Added an option for merging match files (:numref:`ipmatch_merge`). image_calc (:numref:`image_calc`): * Added the option ``--stretch`` to stretch an image and save it with 8-bit pixels, for visualization purposes (:numref:`image_calc_stretch`). * For a single input image, the option ``-c`` (calculation operation) defaults to ``var_0`` (identity operation). * The default output data type is now ``float32`` (previously ``float64``). disparitydebug (:numref:`disparitydebug`): * Added the option ``--raw`` to extract the horizontal and vertical disparities without normalization (:numref:`raw_disp`). pc_align (:numref:`pc_align`): * Print to the terminal and the log file the following initial and final error stats: Mean, StdDev, RMSE, Median, NMAD. * Changed the default for ``--diff-rotation-error`` from 1e-8 to 1e-5 degrees, to avoid slow convergence in some cases due to numerical precision issues. parallel_stereo (:numref:`parallel_stereo`): * Added the option ``--proj-win`` to limit stereo to a projection window for mapprojected images (:numref:`stereodefault`). * The logic for consolidating the output directory has been given its own stage (:numref:`entrypoints`). * The DEM for mapprojected images can be set with ``--dem`` instead of as the last positional argument (:numref:`mapproj-example`). sfs (:numref:`sfs`): * Recommend the variance-based uncertainty estimation (:numref:`sfs_unc`). * Added the option ``--save-covariances`` (:numref:`sfs_opt`). rig_calibrator (:numref:`rig_calibrator`): * Replaced ``--camera-position-weight`` with ``--camera-position-uncertainty``. * Added the option ``--heights-from-dem`` to constrain triangulated points relative to a DEM. * Added an example of an orbital rig with a DEM constraint (:numref:`orbital_rig`). * All command-line options now use dashes instead of underscores. For example, ``--out_dir`` is now ``--out-dir``. theia_sfm (:numref:`theia_sfm`): * Made the SfM reconstruction deterministic by passing a fixed random seed to TheiaSfM. Previously, results could vary between runs due to time-based random seeding in RANSAC. * All command-line options now use dashes instead of underscores. For example, ``--rig_config`` is now ``--rig-config``. camera_solve (:numref:`camera_solve`): * Made the SfM reconstruction deterministic by passing a fixed random seed to TheiaSfM. Previously, results could vary between runs due to time-based random seeding in RANSAC. parse_match_file.py (:numref:`parse_match_file`): * When converting from binary to text, descriptors are no longer saved by default. Use the ``--save-descriptors`` option to include them. stereo_gui (:numref:`stereo_gui`): * The ``--colorize`` and ``--colorbar`` options now work with overlaid and georeferenced images. Added ``--no-colorize`` (:numref:`colorize`). mapproject (:numref:`mapproject`): * Documented compatibility with the upcoming ISIS ``cam2map asp_map=true`` option, which uses the same per-pixel projection algorithm (:numref:`mapproj_isis`). * Consistently handle ISIS special pixels in ``.cub`` input images. Misc: * Greatly improved the speed of parsing WorldView and SPOT5 XML camera files. * Removed the unused and undocumented option ``--use-least-squares`` for ray triangulation in stereo and bundle adjustment. * Added the option ``--bathy-plane-list`` to supplement ``--bathy-plane`` to various programs. * Removed the old qi2txt program for reading IceBridge QFIT binary data. * Removed unused quad-tree tile generators and visualization formats (TOAST, Celestia, Gigapan, GMap, TMS, Uniview) from VisionWorkbench. Only KML is kept for ``image2qtree``. * Do not use more than 128 threads in ``parallel_stereo``, as OpenBlas fails then. * Removed the undocumented ``dem_mosaic`` options ``--first-dem-as-reference`` and ``--this-dem-as-reference``. * The ``--t_projwin`` option in ``mapproject`` no longer subtracts one grid size from the maximum, so the requested extent is fully covered. * Much removal of templates and breaking up of functions and files into smaller and better-organized components. * Removed the unused HDR module, Python SWIG bindings, and legacy tools (contourgen, blend, bayer, learnpca, doc-generate) from VisionWorkbench. * Removed the ``grassfirealpha`` tool from VisionWorkbench. Simplified ``image2qtree`` to produce uint8 RGBA output, removing the ``--channel-type`` and ``--terrain`` options. * Removed the unused ``georef`` tool from VisionWorkbench. * Removed the ``--preserve-pixel-type`` option from ``undistort_image``. * Removed the ``slopemap`` tool from VisionWorkbench. Use ``gdaldem slope`` and ``gdaldem aspect`` instead. * Removed the ``hsv_merge`` tool. Use ``gdaldem color-relief`` with ``gdaldem hillshade`` for similar results. * Removed the unused ``PixelHSV`` and ``PixelLuv`` pixel types from VisionWorkbench. * Updated from Qt5 to Qt6. RELEASE 3.6.0, December 26, 2025 -------------------------------- DOI: https://zenodo.org/records/18064111 Stable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html - Available for Linux, Mac Intel, and Mac Arm (the latter is experimental). - Includes ISIS 9.0.0 (experimental for Mac Arm), GDAL 3.8.1 and PDAL 2.9.3. camera_solve (:numref:`camera_solve`): * Works on Mac Arm. * Removed dependency on OpenImageIO. parallel_stereo (:numref:`parallel_stereo`): * Added an example for JunoCam images (:numref:`junocam`). * Added examples for the Chandrayaan-2 lunar orbiter (:numref:`chandrayaan2`). * Rewrote the KH-9 example to take into account the improved modeling of optical bar cameras and a new strategy for fixing local warping (:numref:`kh9`). * Added a status file that shows the progress in processing tiles (:numref:`stereo_diag`). * Added an output shapefile that shows the tiles being processed (:numref:`stereo_diag`). * Left and right alignment matrices are now saved in plain text format. Older .exr files can no longer be read (:numref:`outputfiles`). * Erode less at at image boundary during filtering when ``--subpixel-mode`` is not between 1 and 6 (option ``--edge-buffer-size``, :numref:`filter_options`). * Determination of interest point matches is optional when either ``--corr-search`` or ``--seed-mode 2`` are set (:numref:`stereodefault`). parallel_sfs (:numref:`parallel_sfs`): * When albedo and / or haze is modeled, initial estimates for these are produced for the full site (:numref:`parallel_sfs_usage`). sfs (:numref:`sfs`): * Added the option ``--save-variances``, that saves the DEM variance (and albedo variance, if albedo is floated). * Added a method for removing seams in the SfS terrain (:numref:`sfs_seams`). * Improved the documentation for how to measure and repair the misalignment between the input DEM and output SfS DEM (:numref:`sfs_align_refine`). * Added a documentation section for how to do registration based on an SfS terrain to refine the alignment of this SfS DEM and the images (:numref:`sfs_sim`). * Options ``--albedo-constraint-weight`` and ``--albedo-robust-threshold`` are respected when low-resolution initial albedo is estimated (with option ``--estimate-exposure-haze-albedo``). * Replaced ``--save-computed-intensity-only`` with ``--save-sim-intensity-only`` and ``--save-meas-intensity-only``. * Renamed ``comp-albedo-final.tif`` to ``albedo-final.tif``, for consistency with other output files. * Unused option ``--estimate-slope-errors`` got removed. parallel_bundle_adjust (:numref:`parallel_bundle_adjust`): * Bugfix for a crash when there are no interest point matches. bundle_adjust (:numref:`bundle_adjust`): * Added the option ``--max-gcp-reproj-err`` to remove GCPs with large reprojection error. * Changed the implementation of the camera position constraint (:numref:`ba_cam_constraints`). * Added the option ``--fixed-distortion-indices`` to control which lens distortion parameters are kept fixed. * The option ``--auto-overlap-params`` accepts an optional third argument (all in quotes) that has the number of subsequent images that overlap to use in matching. Also works with option ``--match-first-to-last``. * For the option ``--mapprojected-data``, the DEM specified at the end is optional, if it can be looked up from the geoheader of the mapprojected images. point2dem (:numref:`point2dem`): * Added support for LAS COPC files (:numref:`point2dem_las`). * Added the option ``--gdal-tap``. * Removed unused options: ``--phi-rotation``, ``--omega-rotation``, ``--kappa-rotation``. A rotation matrix can be applied with ``pc_align`` instead. pc_align (:numref:`pc_align`): * Added support for LAS COPC files (:numref:`pc_align_las`). * The hillshade-based alignment uses by default ``gdaldem hillshade`` (:numref:`pc_hillshade`). cam_gen (:numref:`cam_gen`): * Can fit a CSM linescan camera to an OpticalBar camera (:numref:`opticalbar2csm`). * Can fit a CSM frame camera model with radial distortion. * Support pixel pitch that is not just 1 in CSM cameras. * If the input is an ISIS cube and the output is a CSM camera, save the ephemeris time, sun position, serial number, and target (planet) name. * Added the option ``--camera-center-llh``. mapproject (:numref:`mapproject`): * Added the option ``--gdal-tap``. * Bugfix for erosion during mapprojection at DEM boundary when the DEM and output image have the same grid size. dem2gcp (:numref:`dem2gcp`): * Added the options ``--max-num-gcp``, ``--max-disp``, ``--gcp-sigma-image``. * Added the options ``--image-list``, ``--camera-list``, ``--match-files-prefix``, and ``--clean-match-files-prefix`` to work with multiple input images and matches. * Added the option ``--max-pairwise-matches`` to control the maximum number of matches loaded from any given match file. jitter_solve (:numref:`jitter_solve`): * Added documentation on limitations (:numref:`jitter_limitations`). * Changed the implementation of the camera position constraint (:numref:`jitter_camera`). * Added the options ``--fix-gcp-xyz``, ``--use-lon-lat-height-gcp-error``. * Changed the lens distortion model for ASTER cameras to be radial-tangential. This produces better results after solving for jitter. point2las (:numref:`point2las`): * Added the option ``--dem`` to convert a DEM to LAS. dem_mosaic (:numref:`dem_mosaic`): * Added the option ``--gdal-tap``. camera_footprint (:numref:`camera_footprint`): * Added the option ``--output-shp`` to save the convex hull of the camera footprint as a shapefile. stereo_gui (:numref:`stereo_gui`): * Added the option ``--zoom-all-to-same-region``. image_align (:numref:`image_align`): * Added the option ``--nodata-value``. * Supports the same controls for interest point detection as ``bundle_adjust`` (:numref:`image_align_opts`). * The value of option ``--output-prefix`` is now required to be non-empty. It is set by default to ``out_image_align/run``. image_subset (:numref:`image_subset`): * This program is now multi-threaded. Each image is read fully in memory for speed. misc: * Added minimum system requirements for running ASP (:numref:`system_rec`). * Made the OpticalBar model 3x faster by switching from minimization in 3D to root-finding in 2D with the Newton-Raphson method. * Turned off experimental ``--subpixel-mode 6`` as it is failing to run (:numref:`subpixel_options`). * Unused ``pca`` mode in ``ipfind`` got removed. * Bugfix for modifying the creation time of ISIS cubes when it was meant to only read them. * Bugfix for when ``parallel_stereo`` has the same value for the output prefix and bundle adjustment prefix. * Bugfix for stereo triangulation when the point cloud is huge and has data only in corners. RELEASE 3.5.0, April 28, 2025 ----------------------------- DOI: `10.5281/zenodo.15298734 `_ Stable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html *New platform*: An experimental native Mac M1/M2 Arm64 build is available (:numref:`release`). bundle_adjust (:numref:`bundle_adjust`): * Replaced the algorithm for creating control networks when there are more than two images. Notably more features in more than two images now can be found. * Added the option ``--save-adjusted-rpc`` to save RPC cameras with adjustments applied to them (:numref:`rpc_and_ba`). * Added the option ``--min-distortion`` to ensure small distortion parameters get optimized. * Added the option ``--max-triangulation-angle``. * Compensate for the images in the input nvm being potentially in different order than the images specified on the command line. * The report file measuring statistics of registration errors on the ground got broken up into errors per image and per image pair (:numref:`ba_mapproj_dem`). parallel_bundle_adjust (:numref:`parallel_bundle_adjust`): * The default number of processes per node is 1/4 of the number of cores on the head node, and the default number of threads per process is the number of cores on the head node over the number of processes. * The number of launched jobs is number of nodes times number of processes per node. This appears best for load balancing. * Create interest points (before matching) once per image, not each time per image pair. This speeds up the processing. mapproject (:numref:`mapproject`): * If the input DEM is in the ``longlat`` projection, a projection in meters is auto-determined (:numref:`mapproj_auto_proj`). * Added the option ``--ref-map`` to borrow the grid size and projection from an existing mapprojected image (:numref:`mapproj_refmap`). * Add the option ``--query-pixel``. jitter_solve (:numref:`jitter_solve`): * Do two passes by default. This improves the results. * Can model rig constraints between sensors (:numref:`jitter_rig`). * Added an example for the Kaguya Terrain Camera (:numref:`jitter_kaguya`). * Added the option ``--camera-position-uncertainty`` (:numref:`jitter_camera`). * Can constrain against a sparse point cloud (:numref:`jitter_ref_terrain`). * Added the option ``--smoothness-weight`` to control high-frequency changes in the camera orientations in linescan cameras. * Can use GCP files. * Can read a control network from an nvm file. * Write the stereo convergence angles. Can write registration errors on the ground (:numref:`other_jitter_out`). stereo_gui (:numref:`stereo_gui`): * Changing the image threshold updates the display correctly. * When creating GCP, ask before quitting without saving them. Save the IP as well when GCP are saved. * Added the option ``--gcp-sigma`` for creating GCP. * Big speedup when rendering a stack of georeferenced images. image_calc (:numref:`image_calc`): * Added an example for how to extract the horizontal and vertical disparity bands while setting invalid disparities to a no-data value (:numref:`mask_disparity`). sat_sim (:numref:`sat_sim`): * Added the option ``--rig-sensor-rotation-angles``, to be able to produce a rig to desired specifications (:numref:`sat_sim_rig_adjust`). * Can apply a periodic or random perturbation to given cameras (:numref:`sat_sim_perturb`). * Added the option ``--blur-sigma``, to blur the simulated images. This can help simulate the effect of degraded images due to fog, motion, etc. parallel_stereo (:numref:`parallel_stereo`): * Added an example of processing Umbra SAR images (:numref:`umbra_sar`). * Added an example of refining intrinsics and stereo with Chang'e 3 images (:numref:`change3`). * The initial low-resolution disparity from a DEM works with mapprojected images (:numref:`d_sub_dem`). * Added a discussion of various ways ASP can make use of existing terrain data (:numref:`existing_terrain`). * If the number of matches from disparity is much less than requested, try to find more matches. This usually brings their number in the ballpark. * The option ``--num-matches-from-disparity`` was made equivalent to ``--num-matches-from-disp-triplets``, and the triplet logic now works with mapprojected images (:numref:`dense_ip`). * It is possible to mapproject either with ``dg`` or ``rpc`` cameras when using mapprojected images in stereo with DigitalGlobe / Maxar cameras (:numref:`dg-mapproj`). * Enable stereo with vendor-supplied images that have been mapprojected onto surfaces of constant height above a datum (:numref:`mapproj_ortho`). * Added the option ``--band`` to process a given band (channel) from multispectral images (:numref:`stereodefault`). * With alignment methods ``none`` and ``epipolar``, the option ``--corr-search`` will work even when interest point matching fails (:numref:`corr_section`). * Skip tiles for which there is no valid low-resolution disparity. * Throw an error if the left and right mapprojected images have different resolutions, as this can lead to incorrect results. * Print a warning in ``stereo_pprc`` and ``stereo_tri`` if the stereo convergence angle is too small. * Added the options ``--enable-atmospheric-refraction-correction`` and ``--enable-velocity-aberration-correction`` for Pleiades linescan cameras (these are enabled by default for WorldView cameras only). It is not clear if these corrections improve or not Pleiades accuracy. sfm (:numref:`sfm`): * Added an example for processing data acquired with an UAS, with known metadata (:numref:`sfm_uas`). sfs (:numref:`sfs`): * Added an SfS example for Earth (:numref:`sfs_earth`). * Added a CTX Mars example (:numref:`sfs_ctx`). * Added the program ``image_subset`` for selecting a subset of images that have almost the same coverage as the full input set (:numref:`image_subset`). * Added the option ``--sun-angles`` to specify the Sun azimuth and elevation angles. * Bugfix in modeling atmospheric haze. * Removed the ability to work on multiple clips at once, as it was not used. * Can ingest a provided albedo map (of same size as the input DEM). Option: ``--input-albedo``. * Removed the RPC approximation logic. Use instead the option ``--use-approx-camera-models`` with ISIS cameras. * Removed the option ``--float-cameras``. It is more reliable to optimize the cameras beforehand, in bundle adjustment. * Removed obsolete options ``--float-dem-at-boundary``, ``--float-sun-position``, ``--coarse-levels``. * Have option ``--crop-input-images`` be always on. pc_align (:numref:`pc_align`): * Added the Nuth and Kaab algorithm (:numref:`nuth`). * Added an example of how to use dense image correlation for alignment (:numref:`pc_corr`). * Speed up the computation of shared bounding box and loading of source points. cam2rpc (:numref:`cam2rpc`): * When a DEM is passed in, sample not just the DEM surface but its bounding box, to create a more robust RPC model. * The produced RPC file has been streamlined to a minimum of metadata. point2las (:numref:`point2las`): * Replaced the option ``--triangulation-error-factor`` for saving the triangulation error as a scaled int with the option ``--save-triangulation-error``, that saves it in double precision without scaling. * Added the options ``--save-intensity-from-image`` and ``--save-stddev``. point2dem (:numref:`point2dem`): * The default projection for WGS84 is now UTM / polar stereographic. For other datums it is local stereographic (:numref:`point2dem_proj`). * Adjust the region passed in via the option ``--t_projwin`` so that, as usual, the DEM grid coordinates are integer multiples of the grid size. * Handle robustly invalid input points. * Remove old options ``--use-surface-sampling`` and ``--fsaa``. * Bugfix for slow performance with dynamic CRS. * Changed the default output nodata-value to -1e+6, as the smallest float may not be displayed accurately by some software. gcp_gen (:numref:`gcp_gen`): * Make the interest point matching work better by invoking the full machinery and options from ``bundle_adjust``. image_align (:numref:`image_align`): * Let the default alignment method be ``rigid`` rather than ``translation``. cam_gen (:numref:`cam_gen`): * Added the option ``--camera-center``. * Can export an RPC camera model to .xml format (:numref:`cam_gen_rpc`). dem_mosaic (:numref:`dem_mosaic`): * Added the option ``--weight-list`` for blending DEMs given external weights (:numref:`dem_mosaic_external_weights`). * Renamed the option ``--dem-list-file`` to ``--dem-list``. The old option is kept for backward compatibility. * Can handle DEMs with NaN values. dem_geoid (:numref:`dem_geoid`): * Accept a custom geoid correction via ``--geoid-path``. Added support for a Moon geoid. orbit_plot (:numref:`orbit_plot`): * Added the options ``--use-rmse``, ``--output-file``. isis (:numref:`planetary_images`): * Upgraded to ISIS 8.3.0. misc: * The logic for triangulation with RPC cameras changed (:numref:`rpc_tri`). * In ``bundle_adjust`` and ``jitter_solve``, save the lists of images and optimized camera file names (or adjustments). Can be passed in back to any of these tools (:numref:`ba_out_cams`). * The option ``--flann-method`` in ``bundle_adjust`` and ``stereo`` defaults to using the slower but deterministic ``kmeans`` method for a smaller set of interest points, and to ``kdtree`` otherwise (:numref:`stereodefault-pprc`). * When creating dense interest point matches from disparity and mapprojected images, the match file reflects the name of the original unprojected images (:numref:`dense_ip`). * Bugfix for a crash with the ``asp_sgm`` and ``asp_mgm`` algorithms when the disparity search range is large. * Print the stereo convergence angle in ``stereo_pprc`` with mapprojected images and with epipolar alignment. These are the remaining cases that were not handled before. * The ``mapproject`` and ``parallel_sfs`` programs will not fail if the work directory has spaces (this fix is a workaround, the bug is in GNU Parallel). * Renamed ``--csv-proj4`` to ``--csv-srs``. This accepts any GDAL WKT, GeoJSON, or PROJ string. The previous option is still accepted for backward compatibility. * Support images with up to 12 bands (channels), up from 6. * Support files with the .nitf extension. * Can handle no-data values larger than valid pixel values. * Wiped extremely old and unused SPICE logic. * Wiped the unused old option ``--mask-flatfield``. Can use with stereo the option ``--nodata-value`` to mask values no more than this value. * The ``geodiff`` program output image is with float pixels, rather than in double precision. * Have the OpenCV interest point detectors respect the ``--threads`` option. * Have ``bundle_adjust`` and ``parallel_stereo`` use same ``--ip-inlier-factor`` value by default. * Bugfix for loading camera adjustments when mapprojected images are passed in, rather than the raw ones. * Can read Airbus Pleiades RPC XML files that have both a "global" and a "partial" camera model. The global one will be used. * Dependence on package ``htdp`` removed. This was needed for ``datum_convert``. RELEASE 3.4.0, June 19, 2024 ---------------------------- *This release is is available only as binaries, and not as a conda package* (:numref:`conda_intro`). DOI: `10.5281/zenodo.12176190 `_ Stable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html New tools: * Added ``orbit_plot.py`` (:numref:`orbit_plot`), a tool for plotting camera orientations along an orbit (contributed by Shashank Bhushan). * Added ``gcp_gen`` (:numref:`gcp_gen`), a program for generating ground control points (GCP) based on ortho images. Helps create camera models from scratch. * Added ``dem2gcp`` (:numref:`dem2gcp`), a tool that can greatly help solve for lens distortion that manifests itself as large horizontal warping in the DEM. New camera support: * Added the ability to use the CSM camera model with ASTER images (:numref:`aster_csm`). New external library support: * Migrated to PDAL 2.6.0 from libLAS for LAS input/output (in ``pointlas``, ``point2dem``, and ``pc_align``), as libLAS is no longer developed. WorldView (DigitalGlobe) cameras (:numref:`dg_tutorial`): * The WorldView linescan model got moved to a CSM implementation. The transitional option ``--dg-use-csm`` was removed. The new implementation is about 5x faster for ground-to-image projections. * Re-enabled correcting velocity aberration and atmospheric refraction. These corrections are now implemented in the CSM camera model, and, unlike before, play nicely with bundle adjustment (:numref:`dg_csm`). * The options ``--enable-correct-velocity-aberration`` and ``--enable-correct-atmospheric-refraction`` got removed. * Non-DG cameras do not use these corrections, as a case for that has not been made. jitter_solve (:numref:`jitter_solve`): * Added an example for ASTER cameras (:numref:`jitter_aster`). * Added an example with 27 CTX images (:numref:`jitter_multiple_images`). * Added the option ``--weight-image``, to weigh observations based on geographic location of triangulated points (:numref:`limit_ip`). * Can handle several sensors with very similar positions and orientations (:numref:`jitter_rig`). * Support reading the ISIS ``jigsaw`` binary control network format (:numref:`jitter_ip`). * Can read and write CSM model state embedded in ISIS .cub files (:numref:`embedded_csm`). * Replaced the option ``--translation-weight`` with ``--camera-position-weight``, which is off by default, as it may affect the convergence. The new option adapts appropriately to the number of interest points and the ground sample distance (:numref:`jitter_camera`). * The ``--tri-weight`` constraint is now the default, with a positive value of 0.1. This is adjusted for GSD (:numref:`jitter_tri_constraint`). * Added report files having the change in camera positions (:numref:`jitter_cam_offsets`), triangulated points (:numref:`jitter_tri_offsets`), and stats of pixel reprojection errors per camera (:numref:`jitter_errors_per_camera`). * Replaced the option ``--heights-from-dem-weight`` with ``--heights-from-dem-uncertainty`` (1 sigma, in meters). This is more physically meaningful (as a rule of thumb, use the inverse of what was previously the weight value). * Integrated the logic behind ``--reference-dem`` into ``--heights-from-dem``, with an approach that combines the strength of both. Removed ``--reference-dem``. * Can use anchor points with frame cameras. * Added ``--num-anchor-points-per-tile``. This helps when different images have different sizes but want to ensure the same point density. * Added the option ``--anchor-weight-image`` that is used to limit where anchor points are placed. * The roll and yaw constraints no longer assume linescan camera positions and orientations are one-to-one. * Order of images in each interest point match file need not be the same as for input images. bundle_adjust (:numref:`bundle_adjust`): * Added the ability to refine the camera intrinsics for several groups of cameras, with each group sharing intrinsics (:numref:`kaguya_ba`). * Can mix frame and linescan cameras, while controlling for each group of cameras which intrinsics should be optimized (:numref:`ba_frame_linescan`). * Support reading and writing the ISIS ``jigsaw`` binary control network format (:numref:`jigsaw_cnet`). * Can read and write CSM model state embedded in ISIS .cub files (:numref:`embedded_csm`). * Support reading and writing the NVM format for control networks (:numref:`ba_nvm`). * Added the option ``--camera-position-weight``, with a default value of 0.0. This is an internally adjustable constraint to keep the cameras from moving too much. It may prevent the reduction in reprojection error (:numref:`ba_cam_constraints`). * Remove the option ``--translation-weight``. The translation is now automatically controlled by default by the camera position weight. * Added the option ``--camera-position-uncertainty`` to set hard constraints on the horizontal and vertical uncertainty for each camera (:numref:`ba_cam_constraints`). * Added report files having the change in camera positions (:numref:`ba_camera_offsets`) and triangulated points (:numref:`ba_tri_offsets`). * The option ``--tri-weight`` is now set by default to 0.1, and adjusted for GSD. The option ``--camera-weight`` is by default 0.0. This work better than before at preventing the cameras from moving when optimizing them. * Replaced the option ``--heights-from-dem-weight`` with ``--heights-from-dem-uncertainty`` (1 sigma, in meters). This is more physically meaningful (as a rule of thumb, use the inverse of what was previously the weight value). * Integrated the logic behind ``--reference-dem`` into ``--heights-from-dem``, with an approach that combines the strength of both. Removed ``--reference-dem``. * Added the option ``--propagate-errors`` to propagate the uncertainties from input cameras to triangulated points (:numref:`ba_error_propagation`). * Added the option ``--weight-image``, to weigh observations based on geographic location of triangulated points. (:numref:`limit_ip`). * For ASTER cameras, use the RPC model to find interest points. This does not affect the final results but is much faster. * When optimizing intrinsics, cameras that do not share distortion can have different distortion types and sizes. (:numref:`limit_ip`). * Each image passed to ``--mapprojected-data`` reads from its geoheader the camera and adjustment prefix for undoing the mapprojection. * Fixed a bug when both ``--initial-transform`` and ``--input-adjustments-prefix`` are used. * Can use the image names in ``--camera-list`` when images contain the camera models. * The pixel reprojection errors are adjusted correctly for pixel sigma in the report files (:numref:`ba_errors_per_camera`, :numref:`ba_err_per_point`). * The default outlier removal parameters are more generous, to avoid removing valid interest point matches when the input images have distortion (option ``--remove-outliers-params``). * The combination of options ``--mapprojected-data`` and ``--auto-overlap-params`` will restrict the interest point matching to the region of overlap (expanded by the percentage in the latter option). This can result in great efficiency gains for large images. * Made the Tsai lens distortion agree precisely with OpenCV's implementation (:numref:`pinholemodels`). There was a small numerical problem and the K3 coefficient was not part of the distortion model. * Replaced the Tsai lens undistortion implementation, for a 10x speedup. * Added the OpenCV fisheye lens distortion model and also the FOV model (:numref:`pinholemodels`). These are for wide-angle lenses. * Bugfix: points for which initial triangulation failed are flagged as outliers right away. See ``--forced-triangulation-distance`` for fine-grained control. * Order of images in each previously created interest point match file need not be the same as for input images. * RPC lens distortion is now applied to pixels that are normalized by focal length, in addition to being offset by the principal point. This is consistent with the radial-tangential and fisheye models, and produces a more accurate fit to other models. *Previously created models are now invalid*. * RPC undistortion is now done with a solver rather than using separate undistortion coefficients. This much more accurate but slower (:numref:`pinholemodels`). * Added an example of using RPC distortion for KH-7 cameras, for which an exact model is not available (:numref:`kh7_fig`). * Ensure that outlier filtering with ``--min-triangulation-angle`` is done after each pass with refined cameras and for all ways of reading a control network. * Load and save the camera models in parallel, for speed (except for ISIS). * Bugfix: if some intrinsics are shared, sync them up before optimization. parallel_stereo (:numref:`parallel_stereo`): * Added Kaguya processing example (:numref:`kaguya_tc`). * When a run finished successfully, combine the data from subdirectories and delete these. See ``--keep-only`` for more options. * Made the tiles for the ``asp_mgm`` / ``asp_sgm`` algorithms bigger, with smaller padding, which should be about 2x faster (:numref:`ps_tiling`). * Added an illustration of several stereo algorithms (:numref:`stereo_alg_fig`). * Fixed a failure when processing images that have very large blocks (on the order of several tens of thousands of pixels along some dimension, as shown by ``gdalinfo``). A warning, progress bar, and timing info is displayed. * For the ``asp_sgm`` and ``asp_mgm`` algorithms allow ``cost-mode`` to have the value 3 or 4 only, as other values produce bad results. * Fix a failure when the working directory has a space in its name. * Bugfix for memory usage with very large images. point2dem (:numref:`point2dem`): * Added the option ``--auto-proj-center``, to automatically compute the projection center for stereographic and other projections (:numref:`point2dem_proj`). * When the lon-lat projection is used, the output DEM longitude range is always in [-180, 180], unless using [0, 360] results in a smaller range (such as when crossing the 180 degree meridian). * Added the option ``--scalar-error`` to find the norm of the triangulated error vector (if applicable). * Can read a ground-level point cloud stored as a tif file with 3 bands, representing the x, y, and z coordinates of the points, with z being vertical (option ``--input-is-projected``). * Bugfix for when all heights are equal. A valid DEM is produced. * Do not assume the datum is WGS84 by default, as this can result in incorrect DEMs. The datum, projection, or semi-axes must be set (or read from the input PC/LAS file). gdal (:numref:`gdal_tools`): * Full support for WKT and GeoJSON for the projection string (option ``--t_srs``) in ``point2dem``, ``point2las``, ``mapproject``, ``dem_mosaic``, ``cam2rpc``. Can still use PROJ.4 strings. * Georeferenced images with different datums cannot be used together. Use ``gdalwarp`` to convert them to a common datum. * Upgraded to GDAL 3.8.0 and PROJ 9.3.0. csm (:numref:`csm`): * Upgraded to USGSCSM 2.0.1. * Fixed several problems in generation of CSM cameras for MSL Curiosity Nav and Mast images. Much large-scale testing was performed. Updated the example showing how to create stereo from either Nav or Mast stereo pairs (:numref:`csm_msl`). * A multi-Martian-day example for MSL added (:numref:`csm_msl_multiday`). * Added support for the radial and tangential distortion model with 3 radial distortion parameters and 2 tangential ones. Tested that it agrees with the OpenCV implementation. * Fixed a small bug in radial distortion implementation. stereo_gui (:numref:`stereo_gui`): * Can show scattered data with a colorbar and axes (:numref:`scattered_points_colorbar`). * Renamed ``--colorize-image`` to ``--colorbar``. * Right-click on a colorized image to set the range of intensities to colorize. * Can view ISIS control network files (:numref:`stereo_gui_isis_cnet`). * Auto-guess and load ``pc_align`` error files (:numref:`pc_align_error`). * When loading an .nvm file with features that are not shifted relative to the optical center, must specify ``--no-shift``. This avoids confusion as to whether a shift is present or not (:numref:`stereo_gui_nvm`). colormap (:numref:`colormap`): * Added the option ``--hillshade`` to create a hillshaded colormap. image_calc (:numref:`image_calc`): * When adding new keywords to metadata geoheader, do not erase the existing ones (if a keyword already exists, its value will be modified). * Added the ability to create a random image. pc_align (:numref:`pc_align`): * Add the option ``--skip-shared-box-estimation``. historical_helper.py (:numref:`historical_helper`): * Added the ability to set a custom path to the needed ``convert`` executable and described how that tool can be installed. sfs (:numref:`sfs`): * Added two examples for Kaguya TC, for single and multiple illumination conditions (:numref:`sfs_kaguya`). * Added the option ``--albedo-robust-threshold``. isis (:numref:`moc_tutorial`): * The ISIS libraries are compiled from source, and reflect the code after the ISIS 8.0.3 release (:numref:`conda_intro`). * Made the operation of projecting into an ISIS linescan camera 2.2-2.6 times faster by using the secant method to find the best sensor line. * Expanded the ``jigsaw`` documentation (:numref:`jigsaw`). This is the ISIS bundle adjustment tool. cam_gen (:numref:`cam_gen`): * Can fit a CSM frame camera to a given input camera, including distortion (:numref:`cam_gen_frame`). * Can export linescan cameras to CSM format (:numref:`cam_gen_linescan`). * Can create cameras given longitude, latitude, height above datum, and roll, pitch, yaw angles (:numref:`cam_gen_extrinsics`). rig_calibrator (:numref:`rig_calibrator`): * Can export the interest point matches, cameras, and the OpenCV lens distortion model for use with ``bundle_adjust`` (:numref:`rc_ba`). * Added documentation for how to register the produced cameras to the ground for a planet (:numref:`msl_registration`). * Can fix the translation and/or rotation component of a rig configuration. * Can constrain camera positions with ``--camera_position_weight``. * Added two more naming conventions, to help process existing data out-of-the-box. Also for ``theia_sfm`` and ``sfm_merge``. :numref:`rig_data_conv`. * Thoroughly validated with an orbital rig (in addition to indoor rigs). lronac2mosaic.py (:numref:`lronac2mosaic`): * Run ``spiceinit`` before calling ``lronaccal``, and re-enable all options for the latter command, which were disabled due to a bug in ISIS that was fixed in version 7.2. * Invoke ``spiceinit`` with ``spksmithed=true``. * Add the option ``--spiceinit-options``. camera_solve (:numref:`camera_solve`): * Switched to cascade matching from brute force matching, which is much faster. * Always reuse the Theia SfM matches. dem_mosaic (:numref:`dem_mosaic`): * Bugfix for option ``--use-centerline-weights``. misc: * Made all tools that spawn processes in parallel use the option ``--parallel-options``, with default ``--sshdelay 0.2``, to avoid failure on certain architectures. * For ASTER (:numref:`aster`), the model loaded by default is now linescan rather than RPC. * Fixed a bug in outlier filtering when the interest points are very noisy. * Fixed a couple of runtime errors when using conda packages on OSX. * Eliminated a procedure for cleaning the name of an input path that was replacing two slashes with one slash, resulting in inconsistencies. * Robustly handle 360 degree longitude offsets without classifying georeferenced images into [-180, 180] or [0, 360] types. * Fix an error in conversion between projections for non-Earth images. * The North-East-Down coordinate system assumes an ellipsoid, not a sphere, and takes into account the point elevation. This fixes some small inaccuracies in error propagation and reporting in ``pc_align``. * The OSX build now gets created and tested via GitHub Actions. * Very old jitter adjustment logic was removed. The ``jitter_solve`` tool must be used instead. * For stereo, increased ``--ip-num-ransac-iterations`` from 100 to 1000, as for ``bundle_adjust``. This can make a difference for noisy data. * Do not keep auxiliary files with temporary names in the work directory for ``parallel_stereo`` and ``parallel_bundle_adjust``. Use run's output directory and proper names. * Ensure any sequence of quaternions in a CSM linescan model is normalized and there is no sign flip along the sequence. Such a flip was resulting in incorrectly interpolated camera orientations. * Auto-guess the planet for Pinhole cameras (For Earth, Moon, Mars). * Documented the program ``view_reconstruction`` (:numref:`view_reconstruction`), with a figure. * Switched by default to a slower but deterministic method for matching interest points in ``bundle_adjust`` and ``parallel_stereo``. Normally this is not a bottleneck. See ``--flann-method`` in :numref:`stereodefault-pprc`. * Made RANSAC multi-threaded. This speeds up interest point matching. * Added a sanity check: If the user sets ``--t_srs`` to any tool, it must not be empty. * Added sanity checks to ensure no mix-up of datums from different planets in different inputs for the stereo tools, ``bundle_adjust``, ``jitter_solve``, ``mapproject``, ``cam_test``, and ``cam_gen``. * Upgraded to Boost 1.82.0. RELEASE 3.3.0, August 16, 2023 ------------------------------ DOI: `10.5281/zenodo.8270270 `_ Stable release doc: https://stereopipeline.readthedocs.io/en/stable/index.html New tools: * Added ``sfm_merge`` (:numref:`sfm_merge`), a tool to merge several SfM reconstructions that may or may not have shared images. * Added ``sfm_submap`` (:numref:`sfm_submap`), a tool to extract a submap from a Structure-from-Motion map in .nvm format, as produced by ``theia_sfm`` (:numref:`theia_sfm`) or refined with ``rig_calibrator`` (:numref:`rig_calibrator`). * Added a couple of small Python scripts for handling ROS bags (:numref:`ros_tools`). No ROS binaries are shipped. * Added support for the Pleiades NEO exact linescan model (:numref:`pleiades_neo`). * Added ``sat_sim`` (:numref:`sat_sim`), a tool to create simulated satellite images camera models for pinhole or linescan sensors. * Added ``sfm_view`` (:numref:`sfm_view`), a tool for viewing orbital Pinhole camera models. It is a modification of the ``umve`` program. csm (:numref:`csm`): * Added initial support for using CSM camera models with MSL Curiosity (:numref:`csm_msl`). parallel_stereo (:numref:`parallel_stereo`): * Can propagate horizontal ground plane standard deviations (stddev) specified for each camera through triangulation, obtaining the horizontal and vertical stddev for each triangulated point. For DigitalGlobe RPC and Pleiades linescan cameras the input horizontal stddev can be read from camera files. A formula to go from known CE90 to input horizontal stddev is provided (:numref:`error_propagation`). * Can propagate the covariances of satellite positions and quaternions to the triangulated point cloud for Maxar (DigitalGlobe) linescan cameras (:numref:`error_propagation`). * Documented the pre-processing options ``--stddev-mask-kernel`` and ``--stddev-mask-thresh`` (:numref:`stereodefault-pprc`). Fixed a bug in writing out debug images for this option. * The cameras files used in mapprojection can be switched to other ones for the purpose of doing stereo or reusing a stereo run (:numref:`mapproj_reuse`). * Added the option ``--matches-per-tile``, to attempt to guarantee that each 1024 x 1024 tile has about this many number of matches. * Bugfix for stereo with mapprojected Pleiades images. If the mapprojection is done with the exact (non-RPC) cameras, stereo must load the exact cameras when undoing the mapprojection. bundle_adjust (:numref:`bundle_adjust`): * Validated that given about a thousand input images acquired with three views and much overlap, one can have very tight control of the cameras in bundle adjustment, while improving the self-consistency of the camera configuration (:numref:`skysat_stereo`). * Validated the option ``--reference-dem`` for bundle adjustment. This works even when rays obtained during triangulation are parallel. * Added the option ``--matches-per-tile``, to attempt to guarantee that each 1024 x 1024 tile has about this many number of matches (example in :numref:`ba_examples`). * Bugfix for slow performance and memory usage for a large number of images. jitter_solve (:numref:`jitter_solve`): * Added the options ``--roll-weight`` and ``--yaw-weight`` to control the amount of change in these angles relative to the along-track direction. To be used with synthetic cameras created with ``sat_sim`` (:numref:`sat_sim`). * Added a section discussing solving for jitter with synthetic camera models (:numref:`jitter_sat_sim`). * The solver can mix and match linescan and pinhole (frame) camera images if the inputs are all in the CSM format (:numref:`jitter_linescan_frame_cam`). * Added a section on how to prepare interest point matches (:numref:`jitter_ip`). * Validated the option ``--reference-dem`` for bundle adjustment. This works even when rays obtained during triangulation are parallel. * Bugfix for reverse scan direction. * Added an example for Pleiades cameras (:numref:`jitter_pleiades`), comparing two ways of setting ground constraints. sfs (:numref:`sfs`): * Created an SfS DEM of size 14336 x 11008 pixels, at 1 m pixel with 420 LRO NAC images with various illuminations and orientations. Reliably bundle-adjusted 814 LRO NAC images in which the shadows were observed to make a full 360 degree loop, with a total of 614k triangulated points. Updated the documentation reflecting latest best practices (:numref:`sfs-lola`). * Create more detail in the reconstructed DEM in borderline lit regions. Option: ``--allow-borderline-data`` (:numref:`sfs_borderline`). * Added the options ``--image-list`` and ``--camera-list`` for when the number of images becomes too large to set on the command line. rig_calibrator (:numref:`rig_calibrator`): * Added a detailed tutorial describing how this tool was used to create a full 360-degree textured mesh of the JEM ISS module (:numref:`sfm_iss`) using data acquired with two rigs (6 sensors). * Added an example for the MSL Curiosity rover (:numref:`rig_msl`). * Allow multiple rigs to be jointly optimized (the rig constraint applies within individual rigs and not between them). * Added the option ``--extra_list`` to insert additional images close in time to some of the images already on the rig (for the same or different rig sensor). Helps easily grow a map and complete a rig. * Added the option of keeping a subset of the camera poses fixed (for when those have been validated in a smaller map). * Images for any of the rig sensors (not just the reference one) can be used in registration (but all must be for same sensor). * Added the ``--save_pinhole_cameras`` option to save the optimized cameras in ASP's Pinhole format (with no distortion for now). * Absorb ``--rig_transforms_to_float`` into ``--camera_poses_to_float``. * Save alongside an .nvm file a separate file having the values of optical center point that are subtracted from each interest point (for plotting in ``stereo_gui``). * Merge the interest point tracks created as part of rig calibration with the matches read from disk beforehand. * Fix for too many valid interest point matches being filtered out. voxblox_mesh (:numref:`voxblox_mesh`): * Added median filtering of input point clouds (option ``--median_filter``). * Added weighing of depth points given their distance from the sensor (option ``--distance_weight``). multi_stereo (:numref:`multi_stereo`): * Left and right images can be acquired with different sensors. * Use ``--left`` and ``--right`` to specify which stereo pairs to run. texrecon (:numref:`texrecon`): * Can create a texture with images from multiple sensors. point2dem (:numref:`point2dem`): * Added the option ``--propagate-errors`` to grid the stddev values computed during stereo triangulation. * Added the option ``--input-is-projected`` to specify that the input coordinates are already in the projected coordinate system. stereo_gui (:numref:`stereo_gui`): * Can read, write, edit, and overlay on top of images polygons in plain text format in addition to the .shp format. Per-polygon colors are supported. * Can read nvm files whose features are shifted relative to the optical center, if an ``.nvm`` file is accompanied by an ``_offsets.txt`` file. * Added the option ``--preview`` to load one image at a time, and quickly cycle through them with the 'n' and 'p' keys. * Added the option ``--view-several-side-by-side`` to view several images side-by-side with a dialog to choose which images to show (also accessible from the View menu). * Added the option ``--font-size``, with the default of 9. * Added the option ``--lowest-resolution-subimage-num-pixels`` to control the behavior of the pyramid of subimages. * Noticeable speedup in loading images. * Bug fix in loading .nvm files (an SfM format). image_align (:numref:`image_align`): * Can find the 3D alignment around planet center that transforms the second georeferenced image to the first one. This transform can be used to apply the alignment to cameras and point clouds (:numref:`image_align_ecef_trans`). dem_mosaic (:numref:`dem_mosaic`): * Added the option ``--fill-search-radius`` to fill nodata pixels in a DEM with nearby valid values. This is different from ``--hole-fill-length``. See an example in :numref:`dem_mosaic_examples`. wv_correct (:numref:`wv_correct`): * Maxar (DigitalGlobe) WorldView-2 images with a processing (generation) date (not acquisition date), of May 26, 2022 or newer have much-reduced CCD artifacts, and for those this tool will in fact make the solution worse, not better. This does not apply to WorldView-1, 3, or GeoEye-1. * ASP builds after 2023-06-21 (so, version later than 3.2.0), will detect the above-mentioned scenario, and will not apply any correction in that case (a copy of the original image will be written instead and a warning will be printed). This applies to both PAN and multi-spectral images. corr_eval (:numref:`corr_eval`): * Remove an excessive check. The refined/filtered disparity can be such that left image pixel plus disparity may be outside the right image. Don't fail in that case, but just skip the pixel, resulting in empty correlation for that pixel. cam_test (:numref:`cam_test`): * Added the option ``--datum``. Useful for Pinhole cameras as those don't know their datum. * Added a warning if the camera center is below the datum. misc: * Upgraded to ISIS 8.0.0 and USGSCSM 1.7. * Throw an error for WorldView products that are not Stereo1B or Basic1B. That because ASP does not support orthorectified Maxar products. * Changed the "pretend" height of the RPC cameras from 10 km above ground to around 100 km. RPC camera models do not store this number and it does not make a difference normally, as only ray directions to the ground matter. Yet, .adjust files created with an earlier version of ASP for RPC cameras should be re-created as those use the camera center. * The latest version of the Xerces-C XML parser became 10 times slower than before, which may affect the speed of processing for XML-based camera models. * Added back the tool ``view_reconstruction``, for examining Theia's SfM solution (:numref:`sfm`). * The ``theia_sfm`` tool can write the optical offsets for a given nvm file which can be used in plotting such files in ``stereo_gui``. * Added to ``hiedr2mosaic.py`` (:numref:`hiedr2mosaic`) the option ``--web`` to invoke ``spiceinit`` with ``web=True``. Contributed by Giacomo Nodjoumi. * Bugfix for reading .jp2 files. Needed to ship the JPEG2000 driver and set GDAL_DRIVER_PATH. * Fixed a failure in ``mapproject`` with a small DEM. * Bugfix for exporting the TheiaSfM matches in ``camera_solve``. * The documentation of the examples chapter was broken up into individual pages (:numref:`examples`). RELEASE 3.2.0, December 30, 2022 -------------------------------- DOI: `10.5281/zenodo.7497499 `_ Added functionality for creation of large-scale meshes and fused textures for small planetary bodies and indoor environments. Added logic for rig calibration. See individual tools below. New tools: * ``rig_calibrator``: Calibrates a rig of N image and/or depth+image cameras. Can also co-register and refine intrinsics of camera images acquired with N sensors with no rig constraint (:numref:`rig_calibrator`). * ``multi_stereo``: Runs multiple stereo pairs and produces a fused mesh. Uses ``parallel_stereo``, ``pc_filter``, and ``voxblox_mesh`` (:numref:`multi_stereo`). * ``voxblox_mesh``: Fuses point clouds into a seamless oriented mesh, with each input point given a weight according to its reliability. Based on the third-party VoxBlox software (:numref:`voxblox_mesh`). * ``texrecon``: Creates seamless textured meshes. Based on the third-party MVS-Texturing project (:numref:`texrecon`). * ``pc_filter``: Filters outliers in point clouds created with pinhole cameras and weighs inliers based on many criteria (:numref:`pc_filter`). * Added CGAL-based tools for mesh smoothing, hole-filling, remeshing, and removal of small connected components (:numref:`cgal_tools`). * ``jitter_solve``: A tool for solving for jitter in CSM camera models (:numref:`jitter_solve`). It gives promising results for CTX, Pleiades, and DigitalGlobe data. Examples are provided. Removed tools: * ``datum_convert``: This was an attempt at having a tool applying a transform between datums. It is suggested to use GDAL/PROJ instead. Note that a datum transform may require fetching transformation grids, and without them PROJ will quietly return incorrect results. New sensors: * Support the Pleiades exact sensor (for 1A/1B). See :numref:`pleiades`. Implemented as a wrapper around the CSM linescan camera model. parallel_stereo (:numref:`parallel_stereo`): * Added the options ``--match-files-prefix`` and ``--clean-match-files-prefix`` for reusing interest point matches from a previous ``bundle_adjust`` or ``parallel_stereo`` run. The "clean" interest point matches created by ``bundle_adjust`` may have fewer outliers than what stereo can create. * Added the option ``--keep-only`` to convert all VRT files to TIF (e.g., D.tif), then wipe all files and subdirectories except those specified by given suffixes. * Added the triangulation option ``--max-valid-triangulation-error``. * The option ``--prev-run-prefix`` can be used to start a run with bathymetry modeling at the triangulation stage while reusing the previous stages of a run without such modeling (the needed aligned bathy masks are created, if needed, at the triangulation stage, if not done, as usual, at the preprocessing stage). * For SGM and MGM use by default 8 threads and number of processes equal to number of cores divided by number of threads. Less likely to run out of memory that way. * Added examples of using PBS and SLURM with ASP (:numref:`pbs_slurm`). * Added an example of processing SkySat Stereo data (:numref:`skysat_stereo`). * Documented better the option ``--num-matches-from-disp-triplets`` for creating dense and uniformly distributed interest point matches. Useful for modeling lens distortion. parallel_bundle_adjust (:numref:`parallel_bundle_adjust`): * Do not create subdirectories or symlinks, as that results in a massive number of small files. (Unless ``--save-vwip`` is used, see below.) * Do not save by default .vwip files as those take space and are only needed to find .match files. Use the new option ``--save-vwip`` to save them. Note that these depend on individual image pairs, so ``parallel_bundle_adjust`` saves them in subdirectories. bundle_adjust (:numref:`bundle_adjust`): * Save the convergence angle percentiles for each pair of images having matches. Useful for understating the configuration of cameras. * Added the option ``--tri-weight`` (default is 0) to keep triangulated points close to their initial values. This looks more promising than other weighing used so far at preventing the cameras from moving when optimizing them. This assumes input cameras are not grossly inaccurate. This adds a robust cost function with the threshold given by ``--tri-robust-threshold``. * Added the options ``--image-list``, ``--camera-list``, ``--mapprojected-data-list``, for when the inputs are too many to specify on the command line. * Added the option ``--fixed-image-list`` to specify a file having a list of image names whose cameras should be fixed during optimization. * Pinhole cameras are no longer automatically reinitialized or transformed based on GCP, but only refined given GCP. So, option ``--disable-pinhole-gcp-init`` is the default. Use one of the options ``--init-camera-using-gcp`` (:numref:`camera_solve_gcp`), ``--transform-cameras-with-shared-gcp``, ``--transform-cameras-using-gcp`` (:numref:`sfm_world_coords`) for manipulating cameras using GCP. * Bugfix in initializing pinhole cameras based on GCP for off-nadir cameras. * When doing multiple passes (which is the default) at each pass resume not only with clean matches but also with the cameras optimized so far, rather than going to the originals. * Can do multiple passes with ``--heights-from-dem``. One should be generous with outlier removal thresholds if not sure of the input DEM accuracy (option ``--remove-outliers-params``). * Remove outliers based on spatial distribution of triangulated points. * Bugfix when the number of interest points is 4 million or more. The algorithm would just stall. It is now replaced by an OpenMVG algorithm. * Fold ``--remove-outliers-by-disparity-params`` into ``--remove-outliers-params``. * Bugfix in ``residuals_stats.txt``; the mean was correct but the median was wrong. * Let the default ``--heights-from-dem-weight`` be 1.0, and the default ``--heights-from-dem-robust-threshold`` be 0.5. These normally need tuning. * Added the option ``--mapproj-dem``. If specified, evaluate the disagreement of interest point matches after mapprojecting onto this DEM, per interest point match pair, per matching image pair, and per image. Useful at evaluating registration without mapprojecting the images (:numref:`ba_out_files`). * Added report files having the camera positions and orientations before and after optimization (for Pinhole cameras only, :numref:`ba_cam_pose`). * Added options ``--proj-win`` and ``--proj-str`` for restricting interest points to given area (useful when having many images with footprints beyond area of interest). * With ``--match-first-to-last``, write match files from earlier to later images, rather than vice-versa. This was a bug, as the matches were not being picked up correctly later. * For pinhole cameras, can read .adjust files via ``--input-adjustments-prefix``, then apply them to existing .tsai files via ``--inline-adjustments``. Until now one could do either one or the other. Also works with ``--initial-transform``. * Added a section describing how bundle adjustment is implemented (:numref:`how_ba_works`). point2dem (:numref:`point2dem`): * Added the Tukey outlier removal method option applied to triangulation errors (error_thresh = 75th_pct + 1.5 * (75th_pct - 25th_pct)). Also print out these percentages even for the regular outlier removal. bathymetry (:numref:`bathy_intro`): * Added ``scale_bathy_mask.py``, for creating a PAN-sized image or mask from an multispectral-sized image or mask, both for WorldView data. mapproject (:numref:`mapproject`): * Exposed and documented the ``--query-projection`` option. stereo_gui (:numref:`stereo_gui`): * Can plot, overlay on top of images, and colorize scattered points stored in a CSV file (:numref:`plot_csv`). Many colormap styles are supported. See :numref:`colormap` for the list. * Can show side-by-side colorized images with colorbars and coordinate axes (:numref:`colorize`). * Given a ``bundle_adjust`` output prefix, can select via checkboxes any two images to show side-by-side, and automatically load their match file or clean match file (options: ``--pairwise-matches`` and ``--pairwise-clean-matches``, also accessible from the top menu). * Visualize pairwise matches read from an nvm file, as created by ``rig_calibrator --save_nvm_no_shift``. * Zoom to given proj win from the View menu. Useful for reproducibility. Also accessible with the command-line option ``--zoom-proj-win``. * Bug fix for slow overlaying of images with different datums. * When all images have a georeference, start in georeference mode. corr_eval (:numref:`corr_eval`): * Bugfix for excessive memory usage with positive ``--prefilter-mode``. * Added a note saying that the user should ensure that this tool uses the same ``--corr-kernel`` and ``--prefilter-mode`` as ``parallel_stereo``. * Added the option ``--sample-rate``. cam_gen (:numref:`cam_gen`): * Can read Planet's pinhole.json files. Then no further changes are made to the produced pinhole camera. * Fix a bug in output camera center determination, when an input camera is provided. * Bugfix in initializing pinhole cameras based on GCP for off-nadir cameras given image corners and no prior camera. * Added the options ``--cam-height`` and ``--cam-weight`` to try to keep the camera at a given height above ground. * Added the option ``--cam-ctr-weight``, to help fix the camera center during refinement. * If ``--optical-center`` is not set for pinhole cameras, use the image center (half of image dimensions) times the pixel pitch. The optical bar camera always uses the image center. pc_align (:numref:`pc_align`): * Fix a bug with loading very large DEMs; it was failing because of a 32-bit integer overflow. colormap (:numref:`colormap`): * Added six colormaps: ``black-body``, ``viridis``, ``plasma``, ``kindlmann``, ``rainbow``, ``turbo``. Sources: http://www.kennethmoreland.com/color-advice/ and matplotlib. misc: * Upgrade to C++-14, Python 3.9, latest libLAS, OpenCV 4, PCL 1.11, Boost 1.72, ISIS 7.1.0, GDAL 3.5, and PROJ 9.1.0. The latter has a whole new API, intended to handle properly transformations among datums. * The ``lronaccal`` tool in ISIS 7.1.0 appears buggy. Try using an earlier ISIS version if this is needed. * Replaced in some locations ASP's homegrown coordinate transformation logic with what is in PROJ. * Added the option of using the CSM camera with DigitalGlobe WorldView images in bundle adjustment, stereo, and mapprojection (use with ``--t dg``). Option name is ``--dg-use-csm`` and must be set consistently for all tools. This speeds up ground-to-image computation by a factor of about 20 (which helps with mapprojection and bundle adjustment). The result of projecting into the camera changes by less than 0.015 pixels from before if using this option. That is due to the fact that different methods are used for position and orientation interpolation. The ``cam_test`` option ``--dg-vs-csm`` can be used for evaluating this discrepancy. Each of these methods is consistent with itself to within 2e-8 when it comes to projecting from camera to ground and back. * Increased the cache size to 1 GB per process for each ASP tool. Added the option ``--cache-size-mb``, to set this. Made the warning message refer to this option when the limit is hit. Documented this for all tools. * Using ``-t pinhole`` now invokes the same logic as ``-t nadirpinhole --no-datum``, which is same code path used by other sessions. This wipes an old alternative approach. Eliminated much other duplicated and mutated code for various sessions at the preprocessing stage. * Bugfix for D.tif VRTs as created by ``parallel_stereo``. * Allow whitespaces in stereo.default before option names. * Fix a crash in ISIS for international users by setting for all ASP programs the environmental variables LC_ALL and LANG to en_US.UTF-8. * parallel_stereo will accept (but ignore) Unicode in stereo.default. * Eliminate internal fudging of ``--ip-uniqueness-threshold``, and make it equal to 0.8 for both ``stereo`` and ``bundle_adjust``. This was shown to increase the number of interest points in situations when not enough were found. * The ``historical_helper.py`` program expects a local installation of ImageMagick and the ``convert`` tool (available on most systems normally). RELEASE 3.1.0, May 18, 2022 ---------------------------- DOI: `10.5281/zenodo.6562267 `_ New camera additions: * Added support for the USGSCSM Frame, SAR, and PushFrame sensors (until now just the Linescan sensor was supported), together with documentation and examples (for Dawn, MiniRF, and WAC, respectively). * Added support for ISIS SAR cameras, together with an example in the doc. * Added support for the PeruSat-1 linescan camera model (so far just the RPC model was supported for this satellite). New tool additions: * Added the program ``corr_eval``, for evaluating the quality of produced correlation with several metrics. See also the new option ``--save-left-right-disparity-difference`` in ``parallel_stereo``. * Added the program ``otsu_threshold`` for computing an image threshold. It can be used for separating land from water (in WorldView multispectral NIR bands), and shadowed from lit areas (in Lunar images). * The program ``parallel_stereo`` can function as purely an image correlation tool, without assuming any camera information, via the option ``--correlator-mode``. * Added the program ``image_align``. Used to align two images or DEMs based on interest point matches or disparity, with given alignment transform type (translation, rigid, similarity, affine, and homography). isis: * Using ISIS 6.0.0. csm: * Save the camera state on multiple lines. On reading both the single-line and multiple-line formats are accepted. * Bundle adjustment, mapproject, and SfS with the CSM model can be 7-15 times faster than done with the corresponding ISIS mode for linescan cameras (the latter as reimplemented in ASP itself). It is strongly suggested to use CSM for large-scale processing. * Bugfix in CSM linescan implementation for some LRO NAC sensors. Also replaced the fixed-point method with the secant method in the ground-to-image logic for CSM linescan cameras, which is faster. parallel_stereo: * Many fixes for reliability of stereo with local epipolar alignment. * Added the option ``--resume-at-corr``. Start at the correlation stage and skip recomputing the valid low-res and full-res disparities for that stage. * Bugfix: Eliminate edge artifacts in stereo refinement (for subpixel modes 1, 2, and 3). * Print in stereo_pprc the estimated convergence angle for the given stereo pair (for alignment methods affineepipolar, local_epipolar, and homography). * Added the option ``--prev-run-prefix``, which makes parallel_stereo start at the triangulation stage while using previous stages from this other run. The new run can have different cameras, different session (rpc vs dg, isis vs csm), different bundle adjustment prefix, and different bathy planes (if applicable). * Added option ``--save-left-right-disparity-difference`` to save the discrepancy between left-to-right and right-to-left disparities, which may help with filtering unreliable disparities. * Interest point matching with mapprojected images now happens at full resolution, which results in a more reliable process when there are clouds or if fine features are washed out at low resolution. * Expanded the doc to address a big gotcha: if left and right mapprojected images have somewhat different resolutions, then an immense disparity search range can result. * Added the option ``--max-disp-spread`` to limit the spread of the disparity to this value (useful with clouds in images). * Added the option ``--ip-filter-using-dem`` to 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. * Added a doc section on handling of images with clouds. * Disable by default velocity aberration and atmospheric refraction corrections. These are not accurate enough and cause issues with convergence of bundle adjustment. Can be enabled with ``--enable-correct-velocity-aberration`` and ``--enable-correct-atmospheric-refraction``. These improve results however with Digital Globe cameras if not doing bundle adjustment. (Note that these are still hard-coded as enabled for optical bar camera models. This would require further study.) * Added ready-made ASTER and LRO NAC examples with sample images, cameras, commands, and outputs, all available for download. Contributions of more examples are welcome. See https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples. * Bugfix for ASTER cameras; this was fully broken. * ASP's SGM and MGM algorithms will always use the cross-check for disparity by default, to improve the quality, even if that takes more time. It can be turned off with ``--xcorr-threshold -1``. * Filter outliers in low-resolution disparity D_sub.tif. Can be turned off by setting the percentage in ``--outlier-removal-params`` to 100. * Filtering of interest points based on percentiles (using also ``--outlier-removal-params``). * Folded ``--remove-outliers-by-disparity-params`` into ``--outlier-removal-params``. * Bugfix in disparity search range handling when it is large. * For Linux, in each tile's directory write the elapsed runtime and memory usage to ``--resource-usage.txt``. * Removed the ``--local-homography`` option, as it is superseded by ``--alignment-method local_epipolar``, which blends the local results. * The stereo tool is deprecated, and can be used only with the ASP_BM classical block-matching algorithm when invoked without local epipolar alignment. Use parallel_stereo instead. * Added the experimental ``--gotcha-disparity-refinement`` option, under NASA proposal 19-PDART19_2-0094. bundle_adjust: * Added the option ``--apply-initial-transform-only`` to apply an initial transform to cameras while skipping image matching and other steps, making the process much faster. * Added the option ``--auto-overlap-params`` to automatically compute which camera images overlap, if a DEM and camera footprint expansion percentage are given. * Added the option ``--max-pairwise-matches`` to put an upper limit on the number of matches, as a large number can slow down bundle adjustment. The default is 10000, likely a large overestimate (but this includes potential outliers). If creating interest points from disparity using ``--num-matches-from-disp-triplets``, similar values should be used for both of these options. * Stop printing warnings about failed triangulation if their number goes over 100. * Rename verbose ``final_residuals_no_loss_function_pointmap_point_log.csv`` to ``final_residuals_pointmap.csv`` and ``final_residuals_no_loss_function_raw_pixels.txt`` to ``final_residuals_raw_pixels.txt``, etc. * Document the useful initial and final ``residuals_stats.txt`` files. * Added new options for reusing a previous run: ``--match-files-prefix`` and ``--clean-match-files-prefix``. sfs: * SfS was made to work with any camera model supported by ASP, including for Earth. For non-ISIS and non-CSM cameras, the option ``--sun-positions`` should be used. * Exhaustively tested with the CSM model. It is very recommended to use that one instead of ISIS .cub cameras, to get a very large speedup and multithreading. * Added a new ``--gradient-weight`` parameter, constraining the first-order derivatives. Can be used in combination with the ``--smoothness-weight`` parameter which constrains the second-order derivatives. The goal is to avoid a noisy solution without losing detail. * Much work on expanding the documentation. mapproject: * If the input image file has an embedded RPC camera model, append it to the output mapprojected file. (Which makes stereo with mapprojected images work correctly in this case.) * Always start a process for each tile. The default tile size is set to 5120 for non-ISIS cameras and to 1024 for ISIS. Use a large value of ``--tile-size`` to use fewer processes. bathymetry: * Can have different water surfaces in left and right images, so the triangulating rays bend at different heights. * ``bathy_plane_calc`` can use a mask of pixels above water to find the water-land interface, and also a set of actual ``lon, lat, height`` measurements. * Added documentation for how to find water level heights at given times and coordinates using National Ocean Service's tidal zoning map. pc_align: * Add alignment method similarity-point-to-plane. It works better than similarity-point-to-point at finding a scale between the clouds when they have a large shift. * Bugfix for alignment methods point-to-point and similarity-point-to-point. * Use RANSAC with ``--initial-transform-from-hillshading``, for increased robustness to outliers. Replaced ``--initial-transform-outlier-removal-params`` (based on percentiles) with ``--initial-transform-ransac-params``. dem_mosaic: * Add the option ``--tap``, to have the output grid be at integer multiples of the grid size (like the default behavior of ``point2dem`` and ``mapproject``, and ``gdalwarp`` when invoked with ``-tap``). If not set, the input grids determine the output grid. (The produced DEM will then extend for an additional 0.5 x grid_size beyond grid centers on its perimeter.) * Do not allow more than one of these operations in a given dem_mosaic invocation: fill holes, blur, or erode. These won't work when also having more than one input DEM, reprojection is desired, or priority blending length is used. This is done to avoid confusion about order of operations, and the fact that different input DEMs can have different grid sizes and hence the input parameters have different effects on each. * Bugfix for hole-filling and blurring. Tile artifacts got removed. stereo_gui: * Can cycle through given images from the View menu, or with the 'n' and 'p' keys, when all images are in the same window. * Can save a shapefile having points, segments, or polygons. (These are distinct classes for a shapefile; the shapefile format requires that these not be mixed in the same file.) * Noticeable speedup when changing display mode (e.g., from side-by-side to overlaid). * Bugfix when overlaying shapefiles with different georeferences. * Polygon layers can be set to desired colors from the left pane, when overlaid. * On startup, draw rectangular regions corresponding to values of ``--left-image-crop-win`` and ``--right-image-crop-win``, if these are passed in as command line arguments together with two images. * Quietly accept parallel_stereo options and pass them on if this tool is invoked from the GUI. image_calc: * Add the option ``--no-georef`` to remove any georeference information in the output image (useful with subsequent GDAL-based processing). * Added the option ``--longitude-offset`` to help to deal with the fact that ASP-produced DEMs and orthoimages may have the longitudes in [0, 360] while users may prefer [-180, 180]. * Bugfix: The ``--input-nodata`` value, if set, now overrides the value set in the metadata (the previous value then becomes valid). Misc: * Added the tool ``parse_match_file.py`` to convert a binary match file to text and vice-versa. * Add the tool ``cam_test`` to compare two different camera models for the same image. * Stereo and bundle adjustment with RPC cameras now query the RPC model for the datum. * The ``cam2rpc`` program saves its datum which is read when needed by the RPC model loader. * Add the option ``--triangulation-error-factor`` to ``point2las`` to allow point cloud triangulation errors multiplied by this factor and rounded/clamped appropriately to be stored in the 2-byte intensity field in the LAS file. * Make symlinks relative in ``parallel_bundle_adjust`` for portability. * The mapprojected image saves as metadata the adjustments it was created with. * Save the low-resolution triangulated point cloud (``PC_sub.tif``) in stereo_corr (based on filtered ``D_sub.tif``). * The ``ipmatch`` program can take as input just images, with the .vwip files looked up by extension. * Bugfix in handling projections specified via an EPSG code. * Bugfix when some environmental variables or the path to ASP itself have spaces. (It happens under Microsoft WSL.) * Bugfix for the "too many open files" error for large images. * Add the build date to the ``--version`` option in the ASP tools and to the log files. * Bugfix in the original author's MGM implementation, accepted by the author. RELEASE 3.0.0, July 27, 2021 ---------------------------- DOI: `10.5281/zenodo.5140581 `_ New functionality: * Added new stereo algorithms: MGM (original author implementation), OpenCV SGBM, LIBELAS, MSMW, MSMW2, and OpenCV BM to complement the existing ASP block matching, SGM, and MGM algorithms. See https://stereopipeline.readthedocs.io/en/latest/next_steps.html for usage. These will be further refined in subsequent releases. * Added the ability to perform piecewise local epipolar alignment for the input images, to be followed by a 1D disparity search (for non-mapprojected images), as suggested by the Satellite Stereo Pipeline (S2P) approach. This is still somewhat experimental. * Added the ability for a user to plug into ASP any desired stereo program working on image clips to which epipolar alignment has been applied (as is customary in the computer vision community) without rebuilding ASP. * Added support for shallow-water bathymetry, so creation of terrain models with correct depth determination for well-resolved areas under shallow water. To be used with dg, rpc, and nadirpinhole cameras. * Added two supporting tools for this: bathy_plane_calc and bathy_threshold_calc.py. * Added CCD artifact corrections for a few WV02 band 3 multispectral images. Apart from the systematic artifacts corrected by this logic, these images have a high-frequency unique pattern, and also jitter, which are not corrected for. Also added tools and documentation to easily tabulate more multispectral bands and TDI. isis: * Upgraded to ISIS 5.0.1. * Ship a full Python 3.6 runtime, as expected by ISIS. csm: * Upgraded to USGSCSM 1.5.2 (ASP's own build of it has an additional bugfix for LRO NAC not present in the conda-forge package). * Validated the CSM model for CTX, HiRISE, and LRO NAC cameras. * Added documentation for how to create CSM models from .cub cameras. * Export the state of a CSM camera after bundle adjustment and pc_align (only for linescan cameras supported by ISIS). parallel_stereo * Will now throw an error if ``--threads`` is passed in, whose behavior was not defined. * Bugifx for Python 3. bundle_adjust: * Added the option ``--heights-from-dem-robust-threshold``. * Added the option ``--save-intermediate-cameras`` to save the cameras at each iteration. * Added the option ``--match-first-to-last`` to match the first several images to several last images by extending the logic of ``--overlap-limit`` past the last image to the earliest ones. point2las * Remove outliers by using a percentile times a factor, in a way analogous to point2dem. convert_pinhole_model: * Improve the accuracy of the RPC approximation distortion and undistortion. sfs: * Added the option ``--shadow-threshold`` to be able to specify a single shadow threshold for all images. Also added ``--custom-shadow-threshold-list``. * Added the option ``--robust-threshold`` for situations when the measured image intensity is unreliable. * Added the option ``--estimate-height-errors`` to estimate the uncertainty in height at each computed SfS DEM pixel. It can be customized via ``--height-error-params``. * Added an auxiliary tool named sfs_blend to replace SfS pixels with ones from the original LOLA DEM in permanently shadowed regions. stereo_gui: * Added the ability to find the contour of a georeferenced image at a given threshold. (It can be later edited, saved to disk, etc.) * Bugifxes for polygon drawing logic. * Much more responsive for overlaying many images. image_calc: * Support the sign function (can help in creating masks). pc_align: * Bugifx for ``--initial-transform-from-hillshading`` with outlier removal. * Add the ``--initial-transform-outlier-removal-params`` to control outlier removal when finding matches between DEMs to align using features detected in hillshaded images or selected manually. * Added ``--initial-rotation-angle``, to 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. Misc * Moved the daily build to the release area on GitHub, at https://github.com/NeoGeographyToolkit/StereoPipeline/releases * Upgraded to GDAL 2.4 and PROJ4 5.2.0. (ISIS constrains updating to newer versions of these.) * Added the option ``--ip-per-image`` to bundle adjustment and stereo, to detect roughly how many interest points should be found per image (only a small fraction of them may eventually match across images). * The ``--min-triangulation-angle`` in stereo must be always positive if set by the user. Can be set to something very small if desired. This is a bug fix for this rarely used option (before, when set to 0 it would just reset itself to some internal non-small value). * Bugifx for the VisionWorkbench implementation of the Levenberg-Marquardt algorithm, it was giving up prematurely in challenging situations. * Bugifx for affine epipolar alignment. Use the OpenCV function for finding the alignment matrix instead of the ASP one as OpenCV can filter outliers which cause issues on rare occasions. * Bugfix: Do not allow a full run to take place in a directory where a clip was run, as that will produce incorrect results. RELEASE 2.7.0, July 27, 2020 ---------------------------- New functionality * Support for ISIS version 4.1.10. Please set ISISDATA instead of ISIS3DATA with this version of ISIS and ASP. * Support for the Community Sensor Model (https://github.com/USGS-Astrogeology/usgscsm) * Ability to install ASP with conda. See INSTALLGUIDE.rst for details. * Moved the documentation to ReStructured Text, and Sphinx-Doc. See the documentation at: https://stereopipeline.readthedocs.io * As of this release, we have transitioned to the `Semantic Versioning 2.0.0 standard `_ for ASP. bundle_adjust * Can first create interest point matches among mapprojected images (automatically or manually) and use those to create matches among the unprojected images when the latter are so dissimilar in perspective that the direct approach fails. See ``--mapprojected-data``. stereo_gui * Bug fix when zooming all images to same region when the region is such that all images are seen fully. sfs * Added a new very challenging example at the South Pole with drastic illumination changes and using a non-stereo DEM as initial guess. * Fixed a bug with craters missing under low light. * Fixed a bug with computation of exposures in terrain with many shadows. * Print the Sun azimuth angle for all images (useful for sorting them by illumination conditions). hiedr2mosaic.py * When hijitreg finds no match points between two CCDs, the program now emits a warning message to STDOUT with a suggestion to perhaps fiddle with hijitreg manually, and rather than fail with a mysterious exception warning, now gracefully falls back to assuming that there is no jitter correction between the two CCDs that had no matches. point2dem * Use outlier filtering when computing the bounding box of a DEM. The same option ``--remove-outliers-params`` controls this just as for removing outliers by triangulation error. mapproject * Fixed a bug when finding the extent of the mapprojected image when the DEM to project onto spans the whole planet. point2mesh * Only meshes in .obj format are created. This format can be opened in Meshlab, Blender, or some other mesh viewer. * The osgviewer program is no longer shipped. * Fixed a bug with invalid points not being filtered. * Fixed a bug with insufficient precision (now it can be set by the user and defaults to 17 digits). * Added the option ``--texture-step-size`` to control the sampling rate for the texture, in addition to the -s option that controls the sampling rate for the point cloud. Misc * Updated to C++ 11. * Added phase subpixel correlation accuracy parameter. RELEASE 2.6.2, June 15, 2019 ---------------------------- DOI: https://doi.org/10.5281/zenodo.3247734 New satellites * Added support for SkySat, together with a detailed example, including how to jointly align and optimize cameras in respect to a reference DEM, while optionally refining the intrinsics. This approach may be helpful for other images obtained with frame cameras and uncertain positioning information. * Added support for CORONA KH-4B, KH-7, and KH-9 declassified images and their panoramic (optical bar) camera models, as well as using and optimizing camera models with RPC distortion (only RPC is supported for KH-7 because it is a linescan camera). An example is in the documentation. New tools * Added parallel_bundle_adjust which computes image statistics and IP matching in a parallel manner similar to parallel_stereo. * Added the cam_gen tool to create a correctly oriented pinhole camera model given camera intrinsics, lon-lat coordinates of the corners (or some other pixels), and optionally a ground truth DEM. It can also parse SkySat's video/frame_index metafile to get this data. It can also take as input any camera supported by ASP via ``--input-camera`` and create a most-similar pinhole camera model with given intrinsics. * Added the coverage_fraction tool to provide a coverage estimate of the results of a stereo call. * Added the image_mosaic tool which merges together images based on interest point matches. Can be used to stitch together Corona scanned images. * Added a new tool, n_align, to jointly align n clouds (re-implemented from Matlab, works well for small clouds that are close to each other). stereo_rfne * Added the option to run a non-SGM subpixel option after running SGM/MGM. * Added the phase correlation subpixel option. This is a Fourier transform based method. pc_align * Added a new approach to finding an initial transform between clouds, when they are DEMs, that may be more robust to large scale or translation changes, or to noise. It is based on hillshading the DEMs and finding interest point matches among them, which are then used to find the transform. Can be invoked with ``--initial-transform-from-hillshading`` . Supported transforms are: 'similarity' (rotation + translation + scale), 'rigid' (rotation + translation) and 'translation'. * Added the expression of the Euler angles in the North-East-Down coordinate system around the center of gravity of the source cloud. * Bug fix: intersection of bounding boxes of the clouds takes into account the initial transform applied to the source points. * Added a new alignment algorithm, based on https://github.com/IntelVCL/FastGlobalRegistration It can be invoked with ``--alignment-method fgr``. It can perform better than ICP when the clouds are close enough to each other but there is a large number of outliers, when it can function with very large ``--max-displacement``. It does worse if the clouds need a big shift to align. bundle_adjust * Two passes of bundle adjustment (with outlier filtering after * first pass) is now the default. * The flag ``--skip-rough-homography`` is on by default as it usually gives more reliable results. Use ``--enable-rough-homography`` to turn this option back on (useful when the footprint on the ground and difference in perspective are large). * The flag ``--disable-tri-ip-filter`` is also the default as input cameras may not be reliable enough for this filter. Can be enabled back with ``--enable-tri-ip-filter``. * Added the ``--intrinsics-limits`` option to manually specify intrinsic parameter limits. * Added the ``--num-random-passes`` option to allow repeat solving attempts with randomly distorted initial parameters. * Added option to automatically guess overlapping images from Worldview style XML camera files. * Removed the non-Ceres bundle adjustment options. * Added the option to share or not share selected intrinsic parameters between pinhole cameras when optimizing intrinsics. * Improvements in solving simultaneously for both intrinsics and extrinsics of n camera images if underlying ground truth terrain in the form of a DEM or LIDAR point cloud is present. After this bundle adjustment, pairwise stereo and DEM creation, the DEMs are well-aligned to the ground truth. * Added the flag ``--reference-terrain-weight`` which, when increased, helps align better camera images to a given reference terrain. * Added the option ``--heights-from-dem``. It is very helpful in determining an unknown focal length and distortion parameters for pinhole cameras. It can be used together with ``---heights-from-dem-weight``. * Bug fix in outlier filtering for n images. * Updated Ceres version from 1.11 to 1.14. When optimizing with multiple threads, results now vary slightly from run to run. Results from single threaded runs are deterministic. * Added a new ``--parameter-tolerance`` option. Stop when the relative error in the variables being optimized is less than this. * Documented the ability to create a roughly positioned pinhole camera model from an image if its intrinsics and the longitude and latitude (and optionally height) of its corners (or some other pixels) are known. * When multiple passes happen with outliers removed, match files are not over-written, but a new clean copy of them gets saved. * Renamed ``--create-pinhole-cameras`` to ``--inline-adjustments``, and distortion_params to other_intrinsics. This is needed since for the panoramic model there will be other intrinsic parameters as well. * Added the option ``--forced-triangulation-distance`` for when one really needs to triangulate with poor cameras. Can be used with a very small but positive value of ``--min-triangulation-angle``. * Added the option ``--transform-cameras-using-gcp``. If there are at least two images with each having at least 3 GCP (each GCP need not show in more than one image), use this to convert cameras from an abstract coordinate system to world coordinates. * Increased the default ``--num-ransac-iterations`` to 1000 from 100 so that the solver tries harder to find a fit. Increased default ``--ip-inlier-factor`` from 1/15 to 0.2 to help with getting more interest points for steep terrain. * Increased the default ``--ip-uniqueness-threshold`` from 0.7 to 0.8 to allow for more interest points. * Option to filter interest points by elevation limit and lon-lat limit after each pass of bundle adjustment except the last. dem_mosaic * Added normalized median absolute deviation (NMAD) output option. * Added the option ``--force-projwin`` to create a mosaic filling precisely the desired box specified via ``--t_projwin``. stereo_gui * Added the ability to manually reposition interest points. * Can now show non-synchronous .match files (that is, each IP need not be present in all images). * Added basic functionality for drawing/editing/merging polygons on * top of georeferenced images or DEMs. The polygons can be saved as shape files, and then used to cut out portions of images with GDAL. * Added the option ``--nodata-value``. Pixels with value less than or equal to this are shown as transparent. * Added the ability to view .vwip files (specify one per image). * Can view (but not edit) GCP files, via ``--gcp-file`` (creating GCP is supported in a separate mode, per the doc). * The option ``--dem-file`` specifies a DEM to use when creating manually picked GCP and ``--gcp-file`` specifies the name of the GCP file to use upon saving such GCP. mapproject * Added the ``--nearest-neighbor`` option to use that interpolation method instead of bicubic. This is better for labeled images which should not be interpolated. convert_pinhole_model * Can create RPC distortion models of any degree, which can be further optimized in bundle_adjust. Old RPC distortion files are still supported throughout ASP, but not functionality which optimizes them. They can be approximately converted to new type RPC distortion files with this tool if optimization is desired. Misc * Compiled against USGS ISIS version 3.6.0. * Expanded the documentation explaining how to align cameras to a DEM manually (or initialize such cameras) by selecting matching points between the images and the DEM. * The stereo tools and bundle_adjust will now cache image statistics and interest points to files on disk. * In stereo and bundle_adjust, when images or cameras are newer than the match files, the latter get recomputed unless the tools are invoked with ``--force-reuse-match-files``. * Added a fix to make stereo work with the ZY3 satellite. * For stereo and bundle_adjust, added the ``--no-datum`` option to find interest points without assuming a reliable datum exists, such as for irregularly shaped bodies. Added the related option ``--skip-rough-homography`` to not use the datum in rough homography computation. Added the option ``--ip-num-ransac-iterations`` for finer control of interest point matching. Added ``--ip-triangulation-max-error`` to control the triangulation error. * The cam2rpc tool accepts ``--t_srs`` and ``--semi-major-axis`` as alternatives to ``--datum`` and ``--dem-file``. * Add option ``--theia-overrides`` to camera_solve to make it easier to customize its behavior via flags. * Added an explanation for how the pinhole model works. RELEASE 2.6.1, August 13, 2018 ------------------------------ New satellites * Support Cartosat-1 and Perusat-1 RPC cameras. New tools * Added convert_pinhole_model, to convert between various existing such models. * Added camera_footprint as a helpful utility to show where images will project on to the ground. * Documented and improved the ipfind and ipmatch tools. ipfind is used to detect interest points in input images, either to generate .vwip files for other tools or to experiment with different IP finding settings. ipmatch matches the IPs contained in .vwip files to create .match files. New camera models * Added simple atmospheric refraction correction to the DG and SPOT5 camera models. This can be enabled using the "--enable-correct-atmospheric-refraction" option. * Added support for pinhole camera models where the lens distortion is given by an RPC model (rational polynomial coefficients), of degrees 4, 5, and 6. Such a model may be more expressive than existing ones, and its coefficients can now be optimized using bundle adjustment. An initial model can be created with convert_pinhole_model. stereo_corr * Added new options for post-SGM subpixel stereo. Previously only a parabola method was used. * Added option to perform cross-correlation checks on multiple resolution levels while using SGM/MGM. * Added option ``--corr-search-limit`` to constrain the automatically computed correlation search range. * Added ``--corr-memory-limit-mb`` option to limit the memory usage of the SGM/MGM algorithms. * Improved search range estimation in nadir epipolar alignment cases. Added ``--elevation-limit`` option to help constrain this search range. * Added hybrid SGM/MGM stereo option. * Improvements to SGM search range estimation. * Added ``--min-num-ip`` option. bundle_adjust * Added the ability to optimize pinhole camera intrinsic parameters, with and without having a LIDAR or DEM ground truth to be used as reference (the latter is recommended though). * The tool is a lot more sensitive now to ``--camera-weight``, existing results may change a lot. * Added the parameters ``--rotation-weight`` and ``--translation-weight`` to penalize large rotation and translation changes. * Added the option ``--fixed-camera-indices`` to keep some cameras fixed while optimizing others. * Can read the adjustments from a previous invocation of this program via ``--input-adjustments-prefix``. * Can read each of pc_align's output transforms and apply it to the input cameras via ``--initial-transform``, to be able to bring the cameras in the same coordinate system as the aligned terrain (the initial transform can have a rotation, translation, and scale). If ``--input-adjustments-prefix`` is specified as well, the input adjustments are read first, and the pc_align transform is applied on top. * Renamed ``--local-pinhole`` to ``--create-pinhole-cameras``. * Added the parameter ``--nodata-value`` to ignore pixels at and below a threshold. * Added the ability to transfer interest points manually picked in mapprojected images to the the original unprojected images via ``--mapprojected-data``. * Added the flag ``--use-lon-lat-height-gcp-error``. Then, if using GCP, the three standard deviations are interpreted as applying not to x, y, z but to latitude, longitude, and height above datum (in this order). Hence, if the latitude and longitude are known accurately, while the height less so, the third standard deviation can be set to something much larger. * Added the ability to do multiple passes of bundle adjustment, removing outliers at each pass based on reprojection error and disparity (difference of pixel value between images). This works for any number of cameras. Match files are updated with outliers removed. Controlled via ``--num-passes``, ``--remove-outliers-params`` and ``--remove-outliers-by-disparity-params``. * Added the option ``--save-cnet-as-csv``, to save the control network containing all interest points in the format used by ground control points, so it can be inspected. * If ``--datum`` is specified, bundle_adjust will save to disk the reprojection errors before and after optimization. stereo_gui * Can view SPOT5 .BIL files. pc_align * Add the ability to help the tool with an initial translation specified as a North-East-Down vector, to be used to correct known gross offsets before proceeding with alignment. The option is ``--initial-ned-translation``. * When pc_align is initialized via ``--initial-transform`` or ``--initial-ned-translation``, the translation vector is now computed starting from the source points before any of these initial transforms are applied, rather than after. The end point of this vector is still the source points after alignment to the reference. This is consistent with the alignment transform output by the tool, which also is from the source points before any initial alignment and to the reference points. * The translation vector was expressed incorrectly in the North-East-Down coordinate system, that is now fixed. dem_mosaic * If the -o option value is specified as filename.tif, all mosaic will be written to this exact file, rather than creating tiles. point2dem * Added the ability to apply a filter to the cloud points in each circular neighborhood before gridding. In addition to the current weighted average option, it supports min, max, mean, median, stddev, count, nmad, and percentile filters. The ``--search-radius-factor`` parameter can control the neighborhood size. * Sped up hole-filling in ortho image generation. If this creates more holes than before, it is suggested to relax all outlier filtering, including via ``--remove-outliers-params``, median filtering, and erosion. * Added the option ``--orthoimage-hole-fill-extra-len`` to make hole-filling more aggressive by first extrapolating the cloud. datum_convert * Rewrote the tool to depend on the Proj.4 HTDPGrids grid shift system. This fixed some situations where the tool was not working such as WGS84/NAD83 conversions and also added support for datum realizations (versions). * Vertical datum conversion is only supported in simple cases like D_MARS to MOLA. * Even with HTDPGrids, datum support with the Proj.4 library is poor and will hopefully be improved with future releases. Until then try to get external verification of results obtained with the datum_convert tool. wv_correct * Supports WV2 TDI = 32 in reverse scan direction. Misc * We now compile against USGS ISIS version 3.5.2. * The tools mapproject, dem_mosaic, dg_mosaic, and wv_correct support the ``--ot`` option, to round the output pixels to several types of integer, reducing storage, but perhaps decreasing accuracy. * The tools mapproject and image_calc support the ``--mo`` option to add metadata to the geoheader in the format 'VAR1=VAL1 VAR2=VAL2', etc. * Handle properly in bundle_adjust, orbitviz, and stereo with mapprojected images the case when, for RPC cameras, these coefficients are stored in _RPC.TXT files. * Support for web-based PROJ.4 strings, e.g., point2dem ``--t_srs`` http://spatialreference.org/ref/iau2000/49900/ * Added ``--max-output-size`` option to point2dem to prevent against creation of too large DEMs. * Added image download option in hiedr2mosaic.py. * Bug fix in cam2map4stereo.py when the longitude crosses 180 degrees. * Added support for running sparse_disp with your own Python installation. * Bug fix for image cropping with epipolar aligned images. * The sfs tool supports the integrability constraint weight from Horn 1990. * The software works with both Python versions >= 2.6 and 3. RELEASE 2.6.0, May 15, 2017 --------------------------- New stereo algorithms * ASP now supports the Semi Global Matching (SGM) and More Global Matching (MGM) stereo algorithms. They do particularly well for Earth imagery, better than the present approaches. They can be invoked with ``--stereo-algorithm`` 1 and 2 respectively. New tools * Added cam2rpc, a tool to create an RPC model from any ASP-supported camera. Such cameras can be used with ASP for Earth and planetary data (stereo's ``--datum`` option must be set), or passed to third-party stereo tools S2P and SETSM. * Added correct_icebridge_l3_dem for IceBridge. * Added fetch_icebridge_data for IceBridge. parallel_stereo * By default, use as many processes as there are cores, and one thread per processes. stereo_pprc * Large speedup in epipolar alignment. * Improved epipolar alignment quality with standard pinhole cameras. * Added the options ``--ip-inlier-threshold`` and ``--ip-uniqueness-threshold`` for finer-grained control over interest point generation. * Fix a bug with interest point matching the camera model is RPC and the RPC approximation domain does not intersect the datum. stereo_corr * Added new option ``--stereo-algorithm``. Choices 1 and 2 replaces the standard integer correlator with a new semi-global matching (SGM) correlator or an MGM correlator respectively. SGM/MGM is slow and memory intensive but it can produce better results for some challenging input images, especially for IceBridge. See the manual for more details. stereo_tri * Added the option ``--min-triangulation-angle`` to not triangulate when rays have an angle less than this. stereo_gui * Zooming in one image can trigger all other side-by-side images to zoom to same region. * Clicking on a pixel prints image pixel indices, value, and image name. Selecting a region with Control+Mouse prints its bounds in pixels, and, if georeferenced, in projected and degree units. * Added a 1D profile tool for DEMs. * Can visualize the pixel locations for a GCP file (by interpreting them as interest points). * Can save a screenshot of the current view. * If all images are in the same window, can show a given image above or below all others. Also can zoom to bring any image in full view (from the list of images on the left). * Options to set the azimuth and elevation when showing hillshaded images. dem_mosaic * Added the option ``--dem-blur-sigma`` to blur the output DEM. * Use by default ``--weights-exponent 2`` to improve the blending, and increase this to 3 if ``--priority-blending-length`` is specified. * Added the options ``--tile-list``, ``--block-max``, and ``--nodata-threshold``. * Display the number of valid pixels written. * Do not write empty tiles. geodiff * One of the two input files can be in CSV format. dg_mosaic * Save on output the mean values for MEANSUNEL, MEANSUNAZ, and a few more. point2dem * Added the parameter ``--gaussian-sigma-factor`` to control the Gaussian kernel width when creating a DEM (to be used together with ``--search-radius-factor``). sfs * Improvements, speedups, bug fixes, more documentation, usage recipes, much decreased memory usage, together with a lot of testing and validation for the Moon. * Can run on multiple input DEM clips (which can be chosen as representative for the desired large input DEM region and images) to solve for adjusted camera positions throughout this region. * Added parallel_sfs, to run sfs as multiple processes over multiple machines. bundle_adjust * Can optimize the intrinsic parameters for pinhole cameras. The focal length, optical center, and distortion parameters can be fixed or varied independently of each other. To be used with ``--local-pinhole``, ``--solve-intrinsics``, ``--intrinsics-to-float``. * Added the option ``--overlap-list``. It can be used to specify which image pairs are expected to overlap and hence to be used to compute matches. * Added the option ``--initial-transform`` to initialize the adjustments based on a 4x4 rotation + translation transform, such as coming from pc_align. * Added the options ``--ip-inlier-threshold`` and ``--ip-uniqueness-threshold`` for finer-grained control over interest point generation. pc_align * Can solve for a rotation + translation or for rotation + translation + scale using least squares instead of ICP, if the first cloud is a DEM. It is suggested that the input clouds be very close or otherwise the ``--initial-transform`` option be used, for the method to converge. The option is: ``--alignment-method`` [ least-squares | similarity-least-squares ] Misc * Built with ISIS 3.5.0. * Minimum supported OS versions are OSX 10.11, RHEL 6, SUSE 12, and Ubuntu 14. * Ship with GDAL's gdalwarp and gdaldem. * Added integration with Zenodo so that this and all future ASP releases will have a DOI. More info in the asp_book.pdf RELEASE 2.5.3, August 24, 2016 ------------------------------ Highlights: - Added the ability to process ASTER L1A VNIR images via the tool aster2asp that creates image files and both RPC and rigorous linescan camera models that can then be passed to stereo. The RPC model seems to work just as well as the rigorous one and is much faster. - Added the ability to process SPOT5 images with stereo, bundle_adjust, and mapproject using a rigorous linescan camera model. - Added the add_spot_rpc tool to create RPC models for SPOT5 which allows them to be mapprojected with the RPC model. pc_align * Can solve for a scale change in addition to a rotation and translation to best align two clouds, hence for a similarity transform, using option: ``--alignment-method similarity-point-to-point``. mapproject * Added ability to mapproject color images. * Added option to mapproject on to a flat datum. camera_solve * Added option to accept multiple input camera models. Other: dem_mosaic * Fix a bug with mosaicking of DEMs over very large extent. * Fix a bug with 360 degree longitude offset. * Added the option ``--use-centerline-weights``. It will compute blending weights based on a DEM centerline algorithm. Produces smoother weights if the input DEMs don't have holes or complicated boundary. colormap * Added a new colormap scheme, 'cubehelix', that works better for most color-blind people. stereo_gui * Use transparent pixels for displaying no-data values instead of black. * Can delete or hillshade individual images when overlaid. * Add control to hide/show all images when in overlay mode. Misc * Make ASP handle gracefully georeferenced images with some pixels having projected coordinates outside of the range expected by PROJ.4. * Removed the deprecated orthoproject tool. Now mapproject should be used. * Fixed a bug in ``pc_align`` which caused the ``--max-displacement`` argument to be misread in some situations. * Removed some extraneous code slowing down the datum_convert tool. * Fixed a bug in point2dem handling the Albers Conic Equal Area projection. * Added standard thread/bigtiff/LZW options to image_calc. RELEASE 2.5.2, Feb 29, 2016 --------------------------- Highlights: Added a constellation of features and tools to support solving for the positions of input images lacking position information. Can be used for aerial imagery with inaccurate or incomplete pose information, images from low cost drones, historical images lacking metadata, and images taken with handheld cameras. camera_solve * New tool which adds support for aerial imagery etc as described above. * Uses the THEIA library (http://www.theia-sfm.org/index.html) to compute camera positions and orientations where no metadata is available. * Ground control points and estimated camera positions can be used to find absolute camera positions. * Added section to documentation describing ways to use ASP to process imagery from NASA's IceBridge program. camera_calibrate * A convenience camera calibration tool that is a wrapper around the OpenCV checkerboard calibration program with outputs in formats for camera_solve and ASP. bundle_adjust * Added several options to support solving for pinhole camera models in local coordinates using GCPs or estimated camera positions. * Improved filtering options for which images are IP-matched. orbitviz * Significantly improved the accuracy of the plotted camera locations. * Added option to load results from camera_solve. wv_correct * Now corrects TDI 8 (Reverse) of WV01 and TDI 8 (Forward and Reverse) and TDI 32 (Forward) of WV02. Other correction behavior is unchanged. stereo_corr * Added the ability to filter large disparities from D_sub that can greatly slow down a run. The options are ``--rm-quantile-percentile`` and ``--rm-quantile-multiple``. undistort_image * A new tool to test out pinhole model lens distortion parameters. Lens distortion models: * Switched from binary .pinhole file format to updated version of the old plain text .tsai file format. * Added support for Photometrix camera calibration parameters. * New appendix to the documentation describing the .tsai file format and supported lens distortion models. Other: Tools * Suppressed pesky aux.xml warning sometimes printed by GDAL. * Removed the long-deprecated orthoproject tool. * Added icebridge_kmz_to_csv and lvis2kml utilities. point2las * Write correct bounding box in the header. * Respect projections that are not lon-lat. point2dem * Increased speed of erode option. docs * Mention DERT, a tool for exploring large DEMs. * Added new section describing camera_solve tool in detail. RELEASE 2.5.1, November 13, 2015 -------------------------------- Highlights: stereo * Added jitter correction for Digital Globe linescan imagery. * Bug fix for stereo with map-projected images using the RPC session (e.g, for map-projected Pleiades imagery). * Added OpenCV-based SIFT and ORB interest point finding options. bundle_adjust * Much improved convergence for Digital Globe cameras. * Added OpenCV-based SIFT and ORB interest point finding options. point2dem, point2las, and pc_align * The datum (``-r `` or ``--semi-major-axis``) is optional now. The planet will be inferred automatically (together with the projection) from the input images if present. This can be useful for bodies that are not Moon, Mars, or Earth. The datum and projection can still be overridden with ``--reference-spheroid`` (or ``--datum``) and ``--t_srs``. dem_mosaic * Introduce ``--priority-blending-length``, measured in input pixels. If positive, keep unmodified values from the earliest available DEM at the current location except a band this wide near its boundary where blending will happen. Meant to be used with smaller high-resolution "foreground" DEMs and larger lower-resolution "background" DEMs that should be specified later in the list. Changing ``--weights-exponent`` can improve transition. pc_align * Added the ability to compute a manual rotation + translation + scale transform based on user-selected point correspondences from reference to source cloud in stereo_gui. stereo_gui * Added the ability to generate ground control point (GCP) files for bundle_adjust by picking features. In addition to the images to be bundle-adjusted, one should provide a georeferenced image to find the GCP lon-lat, and a reference DEM to find the GCP heights. Other: stereo * If the input images are map-projected (georeferenced) and alignment method is none, all image outputs of stereo are georeferenced as well, such as GoodPixelMap, D_sub, disparity, etc. As such, all these data can be overlaid in stereo_gui. * The output point cloud saves datum info from input images (even when the inputs are not georeferenced). * Increased reliability of interest point detection. * Decreased the default timeout to 900 seconds. This still needs tuning and a permanent solution is necessary. point2dem, point2las, and pc_align * Accept ``--datum`` (``-r``) ``MOLA``, as a shortcut for the sphere with radius 3,396,000 meters. dem_mosaic * Fix an issue with minor jumps across tiles. * Introduce ``--save-dem-weight`` . Saves the weight image that tracks how much the input DEM with given index contributed to the output mosaic at each pixel (smallest index is 0). * Introduce ``--save-index-map``. For each output pixel, save the index of the input DEM it came from (applicable only for ``--first``, ``--last``, ``--min``, and ``--max``). A text file with the index assigned to each input DEM is saved as well. * Rename ``--blending-length`` to ``--extra-crop-length``, for clarity. dg_mosaic * Added the switch ``--fix-seams`` to use interest point matching to fix seams in the output mosaic due to inconsistencies between image and camera data. Such artifacts may show up in older (2009 or earlier) Digital Globe images. stereo_gui * Added the option ``--match-file`` to view interest point matches. * Added the options ``--delete-temporary-files-on-exit`` and ``--create-image-pyramids-only``. * Can read the georeference of map-projected ISIS cubes. point2dem * Respect ``--t_projwin`` to the letter. * Can create simultaneously DEMs at multiple resolutions (by passing multiple values in quotes to ``--dem-spacing``). * Fix minor discrepancies in the minor semi-axis for the WGS84, NAD83 and WGS72 datums. Now using GDAL/OGR for that. point2las * Save the LAS file with a datum if the input PC had one. image_calc * Fix calculation bug when no-data is present. pc_align * Upgraded to the latest libpointmatcher. This may result in minor alignment changes as the core algorithm got modified. * Save all PC clouds with datum and projection info, if present. Add comment lines with the datum and projection to CSV files. geodiff * Bug fix when the two DEMs have longitudes offset by 360 degrees. colormap * Default style is binary-red-blue. Works better than jet when data goes out of range. pc_merge * Can merge clouds with 1 band. That is, can merge not only PC.tif files but also L.tif files, with the goal of using these two merged datasets to create a merged orthoimage with point2dem. point2mesh * Can create a mesh from a DEM and an orthoimage (DRG file). RELEASE 2.5.0, August 31, 2015 ------------------------------ Improved speed, coverage, and accuracy for areas with steep slopes for ISIS, RPC and Pinhole cameras by implementing stereo using images map-projected onto an existing DEM. This mapprojection is multi-process and hence much faster than cam2map. This functionality was previously available only for Digital Globe images. New tools: * Added stereo_gui, an image viewer and GUI front-end. Features: - View extremely large images using a pyramid approach. - If invoked with the same interface as stereo, can run stereo on selected clips. - Load images with int, float, and RGB pixels, including ISIS cubes, DEMs, NTF, TIF, and other formats. - Can overlay georeferenced images and can toggle individual images on and off (like Google Earth). - Show images side-by-side, as tiles on grid, or on top of each other. - Create and view hillshaded DEMs. - View/add/delete interest points. - Create shadow thresholds by clicking on shadow pixels (needed for sfs). - Based on Michael Broxton's vwv tool. * Added sfs, a tool to refine DEMs using shape-from-shading. Can optimize the DEM, albedo per pixel, image exposures and camera positions and orientations using a multi-resolution pyramid approach. Can handle shadows. Tested with LRO NAC lunar images at low latitudes and toward poles. It works only with ISIS images. * Added image_calc, a tool for performing simple per-pixel arithmetic operations on one or more images. * Added pc_merge, a tool for concatenating ASP-produced point clouds. * Added pansharp, a tool to apply a pansharp algorithm to a matched grayscale image and a low resolution color image. * Added datum_convert, a tool to transform a DEM to a different datum (e.g., NAD27 to WGS84). * Added geodiff, a tool for taking the (absolute) difference of two DEMs. * Documented the colormap tool. Added a new colormap option based on the paper "Diverging Color Maps for Scientific Visualization" (http://www.sandia.gov/~kmorel/documents/ColorMaps/). * Added gdalinfo, gdal_translate, and gdalbuildvrt to the bin directory. These executables are compiled with JPEG2000 and BigTIFF support, and can handle NTF images. docs * Added a documentation section on 'tips and tricks', summarizing in one place practices for getting the most out of ASP. stereo * Increase the default correlation timeout to 1800 seconds. * Fix failure in interest point matching in certain circumstances. * Use bundle-adjusted models (if provided) at all stages of stereo, not just at triangulation. * Added ``--right-image-crop-win`` in addition to ``--left-image-crop-win``. If both are specified, stereo crops both images to desired regions before running stereo (this is different from when only ``--left-image-crop-win`` is specified, as then no actual cropping happens, the domain of computation is just restricted to the desired area). * Bug fix, remove outliers during search range determination. * Added the option ``--ip-per-tile``, to search for more interest points if the default is insufficient. * If the input images are georeferenced, the good pixel map will be written with a georeference. point2dem * Fixed a slight discrepancy in the value of the semi-minor axis in the WGS84 and NAD83 datum implementations. * Added the option ``--median-filter-params`` to remove spikes using a median filter. * Added the option ``--erode-length`` to erode pixels from point cloud boundary (after outliers are removed, but before filling in holes). * Improved hole-filling, and removed the ``--hole-fill-mode`` and ``--hole-fill-num-smooth-iter``, as there's only one algorithm now. * Improved performance when large holes are to be filled. * Can create a DEM from point clouds stored in CSV files containing easting, northing, and height above datum (the PROJ.4 string needed to interpret these numbers should be set with ``--csv-proj4``). * Fixed a bug in creating DEMs from CSV files when different projections are used on input and output. * Expose to user gnomonic and oblique stereographic projections, as well as false easting and false northing (where applicable). This is a shortcut from using explicitly ``--t_srs`` for the PROJ.4 string. * The default no-data value is set to the smallest float. pc_align * Can ingest CSV files containing easting, northing, and height above datum (the PROJ.4 string needed to interpret these numbers should be set with ``--csv-proj4``). * If the reference point cloud is a DEM, the initial and final errors in the statistics, as well as gross outlier removal, are done using a new distance function. Instead of finding the distance from a 3D point to the closest point in the cloud, the 3D point is projected onto DEM's datum, its longitude and latitude are found, the height in the DEM is interpolated, and and the obtained point on the DEM is declared to be the closest point. This is more accurate than the original implementation for coarse DEMs. The old approach is available using the ``--no-dem-distances`` flag. * Fix a bug with a 360 degree longitude offset. point2las * Added the ability to specify a custom projection (PROJ.4 string) for output LAS files. dem_mosaic * Write GeoTIFF files with blocks of size 256 x 256 as those may be faster to process with GDAL tools. * Bug fix when the tool is used to re-project. * Added the option ``--weights-blur-sigma`` to allow the blending weights to be blurred by a Gaussian to increase their smoothness. * Added the option ``--weight-exponent`` , to allow weights to increase faster than linearly. * Added ``--stddev`` option to compute standard deviation. * Added the ability to fill holes in the output mosaic. bundle_adjust * Added new parameters, ``--ip-per-tile`` and ``--min-triangulation-angle``. * Bug fix in handling situations when a point cannot get projected into the camera. * Bug fix in the camera adjustment logic. Any .adjust files may need to be regenerated. image2qtree * Bug fixes. cam2map4stereo.py * Create temporary files in current directory, to avoid access issues to system directories. mapproject * Can run on multiple machines. * Use multiple processes for ISIS images, for a huge speedup. * Bug fix, the mapprojected image should not go much beyond the DEM it is mapprojected onto (where it would have no valid pixels). dg_mosaic * Default penalty weight produces a more accurate fit when creating an RPC model from a DG model. * Handle the situation when two images to be mosaicked start at the same output row number. * Added ``--target-resolution`` option to specify the output resolution in meters. Misc. * Upgraded to ISIS 3.4.10. * Oldest supported OSX version is 10.8. * Added documentation for image2qtree and hillshade. RELEASE 2.4.2, October 6, 2014 ------------------------------ ASP can perform multi-view triangulation (using both the stereo and parallel_stereo tools). The first image is set as reference, disparities are computed from it to the other ones, and joint triangulation is performed. Added a new tool, dem_mosaic, for mosaicking a large number of DEMs, with erosion at boundary, smooth blending, and tiled output. Instead of blending, the tool can do the first, last, min, max, mean, median, or count of encountered DEM values. dg_mosaic * Support for multi-band (multi-spectral) images. Use ``--band`` to pick a band to mosaic. stereo * Bug fix in interest point matching in certain circumstances. * Set the correlation timeout to 600 seconds. This is generous and ensures runs don't stall. point2dem * Take as input n clouds and optionally n texture files, create a single DEM/orthoimage. * Take as input LAS and CSV files in addition to ASP's PC format. * Fix a bug in the interplay of hole-filling and outlier removal for orthoimage creation. * Ensure that the DEM grid is always at integer multiples of the grid size. This way, two DEMs with overlapping grids of the same size will be exactly on top of each other, minimizing interpolation error in subsequent mosaicking. * Outlier removal is on by default. Can be disabled by setting the percentage in ``--remove-outliers-params`` to 100. bundle_adjust * Use multiple-threads for non-ISIS sessions. * Added the parameter ``--overlap-limit`` to limit the number of subsequent images to search for matches to the current image. * Added the parameter ``--camera-weight`` , to set the weight to give to the constraint that the camera positions/orientations stay close to the original values (only for the Ceres solver). dem_geoid * Support the EGM2008 geoid. The geoid surface across all Earth is computed with an error of less than 1.5 cm compared to the values generated by harmonic synthesis. A 2.5 x 2.5 minute grid is used. * Converted the EGM geoids shipped with ASP to INT16 and JPEG2000, resulting in size reduction of more than 10x. wv_correct * Corrects TDI of 16, 48, 56, and 64 (forward and reverse scan directions) for WV01, TDI of 8 (forward only) for WV01, and TDI of 16, 48, 64 (forward and reverse scan directions) for WV02. Returns uncorrected images in other cases. pc_align * Fix a crash for very large clouds. * Use a progress bar when loading data. * Support LAS files on input and output. point2las * Bug fix when saving LAS files in respect to a datum. Documentation * Move the non-ISIS-specific tutorial sections onto its own chapter, to be read by both ISIS and Earth users. Updates and cleanup. RELEASE 2.4.1, 12 July, 2014 ---------------------------- Added a new tool, bundle_adjust, which uses Google's ceres-solver to solve for adjusted camera positions and orientations. Works for n images and cameras, for all camera types supported by ASP. wv_correct * Improved corrections for WV01 images of TDI 16. stereo_rfne * Performance bugfix when the integer disparity is noisy. stereo_fltr * Fix for large memory usage when removing small islands from disparity with ``--erode-max-size``. stereo_tri * Bug fixes for MER cameras. stereo_tri and mapproject * Added the option ``--bundle-adjust-prefix`` to read adjusted camera models obtained by previously running bundle_adjust with this output prefix. point2las * LAS files can be saved in geo-referenced format in respect to a specified datum (option ``--reference-spheroid``). point2dem * Bug fix, longitude could be off by 360 degrees. * Robustness to large jumps in point cloud values. pc_align * Ability to read and write CSV files having UTM data (easting, northing, height above datum). * Read DEMs in the ISIS cube format. RELEASE 2.4.0, 28 April, 2014 ----------------------------- Added wv_correct, a tool for correcting artifacts in Digital Globe WorldView-1 and WorldView-2 images with TDI of 16. Added logging to a file for stereo, pc_align, point2dem, point2mesh, point2las, and dem_geoid. Added a tutorial for processing Digital Globe Earth imagery and expanded the MOC tutorial. Bug fixes in mosaicking of Digital Globe images. parallel_stereo * Use dynamic load balancing for improved performance. * Automatically determine the optimal number of processes and threads for each stage of stereo. stereo_pprc * Added the ``--skip-image-normalization`` option (for non-ISIS images and alignment-method none), it can help with reducing the size of data on disk and performance. stereo_rfne * Added new affine subpixel refinement mode, ``--subpixel-mode 3``. This mode sacrifices the error resistance of Bayes EM mode in exchange for reduced computation time. For some data sets this can perform as well as Bayes EM in about one fifth the time. stereo_fltr: * Hole-filling is disabled by default in stereo_fltr. It is suggested to use instead point2dem's analogous functionality. It can be re-enabled using ``--enable-fill-holes``. * Added the option ``--erode-max-size`` to remove isolated blobs. * Relaxed filtering of disparities, retaining more valid disparities. Can be adjusted with ``--filter-mode`` and related parameters. stereo_tri: * Added ability to save triangulation error for a DEM as a 3D North-East-Down vector rather than just its magnitude. * When acting on map-projected images, handle the case when the DEM used for map-projection does not completely encompass the images. pc_align: * Read and write CSV files in a wide variety of formats, using the ``--csv-format`` option. * Display the translation component of the rigid alignment transform in the local North-East-Down coordinate system, as well as the centroid of source points used in alignment. * Save to disk the convergence history (iteration information). * Added the ability to explicitly specify the datum semi-axes. * Bug fix for saving transformed clouds for Moon and Mars. * More efficient processing of reference and source points by loading only points in each cloud within a neighborhood of the long/lat bounding box of the other cloud. * Make it possible to generate ortho and error images using point2dem with the transformed clouds output by pc_align. point2dem: * Replaced the core algorithm. Instead of sampling the point cloud surface, which is prone to aliasing, the DEM height at a given grid point is obtained as a weighted average of heights of all points in the cloud within search radius of the grid point, with the weights given by a Gaussian. The cutoff of the Gaussian can be controlled using the ``--search-radius-factor`` option. The old algorithm is still available (but obsoleted) using the ``--use-surface-sampling`` option. The new algorithm makes the ``--fsaa`` option redundant. * Added the ability to remove outliers by triangulation error, either automatically (--remove-outliers) or manually, with given error threshold (--max-valid-triangulation-error). * Added two algorithms to fill holes in the output DEM and orthoimage (--hole-fill-mode). * The way the default DEM spacing is computed was modified, to make dependent only on the local distribution of points in the cloud and robust to outliers. * Can handle highly noisy input point clouds without spikes in memory usage and processing time. * Improved memory usage and performance for large point clouds. * Bug fix, the DEM was shifted by 1 pixel from true location. RELEASE 2.3.0, 19 November, 2013 -------------------------------- TOOLS: - Added pc_align, a tool for aligning point clouds, using the libpointmatcher library (https://github.com/ethz-asl/libpointmatcher). Sparse and dense point clouds are supported, as well as DEMs. Two ICP methods are supported, point-to-plane and point-to-point. Memory and processing usage are proportional to the desired number of input points to use rather than to the overall input data sizes. - Added lronac2mosaic.py, a tool for merging the LE and RE images from the LRONAC camera into a single map-projected image. The output images can be fed into the stereo tool to generate DEMs. - rpc_maprpoject and orthoproject are combined into a single tool for projecting a camera image onto a DEM for any camera model supported by Stereo Pipeline. The old orthoproject is kept for backward compatibility for a while. GENERAL: - Stereo Pipeline (almost) daily and fully verified builds for all platforms are available for the adventurous user (http://byss.arc.nasa.gov/stereopipeline/daily_build/, which was later moved to https://github.com/NeoGeographyToolkit/StereoPipeline/releases). When requesting support, please provide the output of ``stereo --version``. - The size of Stereo Pipeline output data has been reduced, by up to 40%, particularly point clouds and DEMs are between 30% to 70% smaller. Better encoding is used, output data is rounded (up to 1 mm), and point clouds are offset and saved as float instead of double. - Timeout option added for stereo correlation, preventing unreasonably long correlation times for certain image tiles. - Subpixel mosaicking in dg_mosaic uses bilinear interpolation instead of nearest neighbor avoiding artifacts in certain situations. - dg_mosaic can generate a combined RPC model in addition to the combined DG model. It accepts flags for specifying input and output nodata values. - point2dem with the ``--fsaa`` option for reducing aliasing at low-resolution DEM generation has been improved as to remove the erosion of of valid data close to no-data values. - Bug fixes for parallel_stereo, point2dem, etc. RELEASE 2.2.2, 17 MAY 2013 -------------------------- (incremented from 2.2.1 after one more bugfix) TOOLS: - stereo_mpi renamed to parallel_stereo and made to work on any machines with shared storage, rather than just on supercomputers using Intel's MPI library. Bug fixes for homography and affine epipolar alignment modes, etc. - Bug fix for dem_geoid path to geoids, more robust datum identification. RELEASE 2.2.0, 6 MAY 2013 ------------------------- GENERAL: - ISIS headers removed from IsisIO's headers. - Removed unneeded mutex inside inpaint algorithm. - Interest point matching and description are parallel now. - Stereo pprc uses separable convolution for anti-aliasing. - IsisIO made compliant with ISIS 3.4.3's API. - Blob consolidation (for inpainting) is now parallel. - Yamaha RMAX code dropped. SESSIONS: - RPC mode can now read Astrium data. - DG added additional safety checks for XML values. - DG, ISIS, and RPC now have affineepipolar alignment option. - All sessions had their API changed. We now use Transform objects instead of LUTs to reverse mapprojections and alignments. TOOLS: - Added dem_geoid, dg_mosaic, and stereo_mpi. - Added new interest point matching method to stereo. - Added new DEM seed mode for stereo. - Point2dem sped up by reducing over rasterization of triangles. - Added the ``--use-local-homography`` option to stereo_corr. Homography transform is applied per tile. - Fix point2dem where for certain projections we were setting K=0. - Stereo can now operate using command-line arguments only, without stereo.default. RELEASE 2.1.0, 8 JANUARY 2013 ----------------------------- GENERAL: - Added documentation for processing GeoEye, Digital Globe, and Dawn FC data. - Fixed implementation of internal RANSAC function. - DEMError has been renamed IntersectionErr. 3D IntersectionErr is now recordable in local North East Down format. SESSIONS: - Added RPC processing session. - DG sessions now use bicubic interpolation for mapprojection arithmetic. - Fixed bug in case where DG XML file had single TLC entry. - DG sessions now applies velocity aberration corrections. TOOLS: - Have point2dem use correct nodata value when writing DRGs. - Fix segfault issue in point2dem due to triangle clipping. - Hiedr2mosaic python script now supports missing CCD files and start/stop resume on noproj step for bundle adjustment. - Max pyramid level used for stereo correlation is configurable with corr-max-levels option. - Stereo accepts left-image-crop-win option for processing of specific image coordinates. - Stereo_pprc accepts nodata-threshold and nodata-percentage options for masking (possibly shadows). - Stereo command should now correctly call secondary executables so that their dependencies are loaded. RELEASE 2.0.0, 20 JUNE 2012 --------------------------- GENERAL: - Modified ASP according to API changes in ISIS 3.4.0. - Added new interest point matching code. Provides better initial guess for search range. - Complete changed stereo.default format. See stereo.default.example for an example. - Complete rewrote integer correlator for improved speed and less memory use. - Relicense code to be Apache 2 licensed instead of NOSA. SESSIONS: - Add normalization options to PINHOLE session. - Added Digital Globe (DG) session. This supports the linearized linescan camera model that is described in the supporting XML file. - Deleted KEYPOINT session. PINHOLE essentially does all of that. EXAMPLES: - Added DEMError output example for MOC. - Added jigsaw example for MOC. - Added HiRISE example dataset. TOOLS: - Dropped release of isis_adjust and bundlevis. - Fix int32 overflow in arithmetic for subsampling in preprocessing. - Remove Python 2.4 incompatible call in cam2map4stereo.py. - Speed up point2dem texture access by remove unnecessary mutex. - Add earth mode and fix non spherical support in point2dem. - Added lronac4staged.py. - Implemented D_sub or seeded integer correlation in stereo_corr. - Fourth channel of output PC file is now triangulation error. - Added ``--t_srs`` option to point2dem. - Added rpc_mapproject tool. This provides an optional mapprojection step that can be used for DG session. - Allow IAU2000:* projection options to be used by point2dem. - No-Data is now colored black in GoodPixelMap. - Make noproj step in hiedr2mosaic parallel. RELEASE 1.0.5, 27 OCT 2011 -------------------------- Fixed ASP to work with ISIS 3.3.0's new API changes and library dependencies. Enabled parallel writing in Pinhole Session. TOOLS: - Fix possible infinite loop in stereo_corr's search range. - Shutoff rotation invariance in automatic search range for better quality results. This is possible because the input images are already aligned. - Sub image produced by stereo_pprc are now limited to around 8MB. - Fix disparity_debug to work with integer disparities as well. - All ASP tools should now have a '--version' option. - Bug fix point2dem where rasterizer was accessing outside of allocated memory. - Speed up mask generation in stereo_pprc by avoiding mutex. - Speed up hole filling in stereo_fltr by avoiding mutex. RELEASE 1.0.4, 23 MAY 2011 -------------------------- Added support for CAHVORE in pinhole sessions. TOOLS: - Hide GDAL warnings caused by our file integrity checks. - Mostly added standardized options for settings threads and BigTIFF. - Have orthoproject return same type as input plus alpha channel. - Improved edge_masking, speeds up stereo_fltr and stereo_pprc. - Have cam2map4stereo.py explicitly use ISIS's getkey command. - Fix and optimized point2dem. Remove caching and improved rendering times. This should fix BigTIFF problems that have been reported. - Improve triangulation times slightly when using mapprojected linescan cameras. EXAMPLES: - Added orthoproject, image2qtree, colormap, hillshade examples to MOC. - Added K10 example dataset. - Added MER example dataset. - Added a non-mapprojected MOC example. - Added CTX example dataset. DOCS: - Append notes from Michael about run times. VISION WORKBENCH benefits: - Added threaded writing to colormap and hillshade. - Fix hillshade problems with int16 DEMs. RELEASE 1.0.3.1, 16 MARCH 2011 ------------------------------ Updated documentation and support text files to insure compatibility with our third party software. RELEASE 1.0.3, 11 MARCH 2011 ---------------------------- ISISIO: Make quaternion interaction compliant with VW changes. SESSIONS: Correct reading of TSAI camera format. TOOLS: - Reduce memory footprint of ISIS_Adjust. - MOC Example rewritten. - Improve dash script that loads libraries on startup of application. VISION WORKBENCH benefits: - KD-Tree search replace with FLANN, a fast approximate nearest neighbors. This improves speed of ipmatch, and ip alignment option in stereo. - Removed exception catch in Bayesian affine sub-pixel. - Fixed type deduction problem on 32 bit systems. - Pyramid Correlator code cleaned up. Minimal speed improvement. - Fixed Camera Relation Network's memory leak. - Fix image2qtree normalization and manual geo-positioning. - Correct random seed call with faster solution. - Default raster tile size changed to 256. - Fix deadlocking in loading of ".vwrc", Vision Workbench's settings file. KNOWN ISSUES OSX seems to do excessive locking during multi-threaded rendering. This problem is non-existent in RHEL5 and is still a mystery. RELEASE 1.0.2, 9 DECEMBER 2010 ------------------------------ ISISIO: - IsisCameraModel support operator<< style printing. - Correct camera pose return to be consistent with VW. - Change IsisCameraModel to use shared_ptr to block memory leak. TOOLS: - Executables should catch VW and Standard errors and print human readable responses. - Stereo is now a python script that call multiple executables. - Change correlation progress bar to track total completion. - Bundle_Adjust and ISIS_Adjust switch from Euler's to quaternions. - Bundlevis dropped CAHVOR support. Added progress bar. Converted statistics with CDFAccumulator. - Point2dem remove excessive rotation call - Enforce tile rasterization size to 1024 during integer correlation. - Select tools should now write their nodata value in the TIFF metadata. PHOTOMETRYTK Still unreleased, and still under development. RELEASE 1.0.1, 24 MAY 2010 -------------------------- CORE: - Control Network Loader removed and sent to VW's Bundle Adjustment Module. - Build system can now use Google PerfTools. - Kakadu was made optional in build system (ISIS 3.2.x uses this). ISISIO: - Optimized IsisCameraModel to use IsisInterface. Custom code can be loaded up for individual camera types so we don't have to run through ISIS's entire camera model. This allows us not to call GroundMap when the camera is not mapprojected. - Added a series of tests for the IsisCameraModel that perform unit tests with MOC and Galileo. - Added custom project code for Linescan cameras so not to rely on ISIS's LineScanCameraGroundMap. This code is a bit more precise. MPI Added new optional module called MPI that builds on top of Boost MPI. This is experimental development code and is not used for anything in binary release yet. PHOTOMETRYTK Added new optional module call the Photometry Toolkit. This is experimental development code and is not use for anything released in the binary yet. This code focuses on future research of massive mosaics (+100GB) and the ability to perform basic photometric corrections. SESSIONS Pinhole session modified to read CMOD files as well. TOOLS: - Made orthoproject more robust against odd input georeferences. - orthoproject's auto scale and crop works again. - Point2mesh's texture is written to a different file. - Added aligndem and geodiff, experimental DEM alignment utilities. - Added a quick experimental DEM profile utility called dem_profile. - stereo now detects correlation settings automatically using OBALoG and SGrad1 interest point functions. - Added cam2map4stereo.py - Remove excessive serial number calculations in isis_adjust. - Update isis_adjust to VW's new Bundle Adjustment module for a 2x improvement. - Stereo should now use LZW compression by default. - Point2dem and Stereo have added option to use directory other than /tmp for intermediate files. - Point2dem now uses MOLA datum instead of its previous truncated value. - Added safety check to stereo to make sure user is not supplying the same camera. - Added point2las, a utility for converting a point cloud to the LAS format. TESTS Switched from CXXTests to GTest framework. RELEASE 1.0.0, 23 OCTOBER, 2009 ------------------------------- CORE: - OrthoRasterizer.h is subject to change for further VW integration - MedianFilter.h is untested/unused - BundleAdjustUtils.* is subject to deletion for integration with ControlNetworkLoader.* SESSIONS: - ISIS Session is the only fully supported session at this time - Pinhole Session works but has not been tested for this release - Keypoint/RMAX Session status are unknown SPICEIO Subject to deletion in 1.0.1 TOOLS: - Point2dem can crash rarely. Still investigating. - rmax* utilities are not working ================================================ FILE: README.rst ================================================ ========================== Ames Stereo Pipeline (ASP) ========================== .. image:: https://zenodo.org/badge/DOI/latest.svg :target: https://zenodo.org/badge/latestdoi/714891 .. image:: https://zenodo.org/badge/DOI/Version%203.6.0.svg :target: https://zenodo.org/records/18064111 .. image:: https://readthedocs.org/projects/stereopipeline/badge/?version=latest :target: https://stereopipeline.readthedocs.io/en/latest/?badge=latest :alt: Documentation for latest version The NASA Ames Stereo Pipeline (ASP) is a suite of free and open source automated geodesy and stereogrammetry tools designed for processing stereo images captured from satellites (around Earth and other planets), robotic rovers, aerial cameras, and historical images, with and without accurate camera pose information. ASP produces cartographic products, including digital terrain models (DTMs, synonymous with digital elevation models, DEMs), ortho-projected images, 3D models, and bundle-adjusted networks of cameras. These data products are suitable for science analysis, mission planning, and public outreach. * ASP is free software released under the Apache Software License 2.0. * Documentation: https://stereopipeline.readthedocs.io Installation ============ Precompiled binaries (for Linux and macOS) are available for the stable releases and the current development build. Simply download the appropriate distribution for your operating system, extract, and run the executables in the ``bin`` subdirectory. - `Stable releases, daily builds, and conda packages `_ See the `NEWS `_ for the most recent additions. To permanently add the ASP executable subdirectory to your PATH, you can add the following line to your shell configuration (e.g., ``~/.bashrc``), replacing ``/path/to/StereoPipeline/bin`` with the location on your filesystem: ``export PATH=${PATH}:/path/to/StereoPipeline/bin`` *ISIS users*: Please install the latest `USGS ISIS `_ if you would like to process NASA non-terrestrial images. Users wishing to process Earth images, such as Digital Globe, satellites with RPC cameras, or various frame/pinhole cameras do not need to download anything else. If ASP is installed with conda, it will install ISIS in the same environment as well, though it may not be the latest version. Documentation ============= The documentation, in HTML format, is at https://stereopipeline.readthedocs.io. The documentation includes a gentle introduction to using the Stereo Pipeline, an entry for each tool, and example processing workflows for many supported sensors. The ReStructured Text source files for the documentation are in the `docs` subdirectory of the ASP distribution. Support and user community ========================== All bugs, feature requests, user questions, and general discussion can be posted on the `ASP support forum `_. We also encourage the posting of issues on the `GitHub repo `_ (most such items posted on the forum will typically be converted to an issue there for the developers to work on), as well as pull requests. Credits ======= ASP was developed within the Autonomous Systems and Robotics area of the Intelligent Systems Division at NASA's Ames Research Center. It leverages the Intelligent Robotics Group's (IRG) extensive experience developing surface reconstruction and tools for planetary exploration (e.g., the Mars Pathfinder and Mars Exploration Rover missions, and rover autonomy). It has also been developed in collaboration with the Adaptive Control and Evolvable Systems (ACES) group, and draws on their experience developing computer vision techniques for autonomous vehicle control systems. See the `list of contributors `_. Citation -------- In general, please use this reference for the Ames Stereo Pipeline: Beyer, Ross A., Oleg Alexandrov, and Scott McMichael. 2018. The Ames Stereo Pipeline: NASA's open source software for deriving and processing terrain data, Earth and Space Science, 5. https://doi.org/10.1029/2018EA000409. If you are using ASP for application to Earth Images, or need a reference which details the quality of the output, then we suggest also referencing: Shean, D. E., O. Alexandrov, Z. Moratto, B. E. Smith, I. R. Joughin, C. C. Porter, Morin, P. J. 2016. An automated, open-source pipeline for mass production of digital elevation models (DEMs) from very high-resolution commercial stereo satellite imagery. ISPRS Journal of Photogrammetry and Remote Sensing, 116. https://doi.org/10.1016/j.isprsjprs.2016.03.012. In addition to the recommended citation, we ask that you also cite the DOI for the specific version of ASP that you used for processing. Every new release (and daily build) of ASP will have its own unique DOI, which can be found `here `_. Additional details for how to cite ASP in your published work can be found in the ASP documentation. License ======= See LICENSE file for the full text of the license that applies to ASP. Copyright (c) 2009-2025, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved. ASP is licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Third-party libraries ===================== This distribution may include some bundled third-party software as a convenience to the user. This software, located in the ``thirdparty/`` directory of the source code release, is not covered by the above-mentioned distribution agreement or copyright. Binary releases distribute third party software in both the ``bin`` and ``lib`` directories. See the included documentation for detailed copyright and license information for any third-party software or check the `THIRDPARTYLICENSES `_ file. In addition, various pieces of ASP depend on additional third-party libraries that the user is expected to have installed. ================================================ FILE: RELEASEGUIDE ================================================ See https://stereopipeline.readthedocs.io/en/latest/building_asp.html. ================================================ FILE: THIRDPARTYLICENSES.rst ================================================ The NASA Ames Stereo Pipeline (ASP) would not be possible with out the use of third party software that is also open source. Our binary release may include the following software: ======================== ============== ===== Title License URL ======================== ============== ===== armadillo Apache-2.0 https://gitlab.com/conradsnicta/armadillo-code/-/blob/9.900.x/LICENSE.txt Boost MIT (modified) https://github.com/boostorg/boost/blob/master/LICENSE_1_0.txt Bullet Zlib https://github.com/bulletphysics/bullet3/blob/master/LICENSE.txt CERES Solver BSD-3-clause https://github.com/ceres-solver/ceres-solver/blob/master/LICENSE CURL MIT (modified) https://curl.se/docs/copyright.html Embree Apache-2.0 https://github.com/embree/embree/blob/master/LICENSE.txt Eigen MPL-2.0 http://eigen.tuxfamily.org/index.php?title=Main_Page#License Fast Global Registration MIT https://github.com/intel-isl/FastGlobalRegistration/blob/master/LICENSE FLANN BSD-3-clause http://people.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN GDAL MIT https://gdal.org/license.html GEOS LGPL-2.1 https://trac.osgeo.org/geos/ GFlags BSD-3-clause https://github.com/gflags/gflags/blob/master/COPYING.txt GLog BSD-3-clause https://github.com/google/glog/blob/master/COPYING Gmm++ LGPL-2.1 http://getfem.org/gmm.html GNU Parallel GPL-3.0 https://www.gnu.org/software/parallel/ HDF5 BSD-3-clause https://support.hdfgroup.org/ftp/HDF5/releases/COPYING HTDP custom https://geodesy.noaa.gov/TOOLS/Htdp/Htdp.shtml IlmBase BSD-3-clause https://github.com/AcademySoftwareFoundation/openexr/tree/v2.5.5/IlmBase ImageMagick custom https://github.com/ImageMagick/ImageMagick/blob/master/LICENSE ISIS public domain https://github.com/USGS-Astrogeology/ISIS3/blob/dev/LICENSE.md JAMA public domain https://math.nist.gov/tnt/download.html JHEAD public domain http://www.sentex.net/~mwandel/jhead/ LAPACK BSD-3-clause https://github.com/Reference-LAPACK/lapack/blob/master/LICENSE PDAL BSD-3-clause https://github.com/PDAL/PDAL/blob/master/LICENSE.txt LibGeoTIFF combination https://github.com/OSGeo/libgeotiff/blob/master/libgeotiff/LICENSE LibPNG custom http://www.libpng.org/pub/png/src/libpng-LICENSE.txt libnabo BSD-3-clause https://github.com/ethz-asl/libnabo/blob/master/README.md libpointmatcher BSD-3-clause https://github.com/ethz-asl/libpointmatcher/blob/master/README.md nanoflann BSD-2-clause https://github.com/jlblancoc/nanoflann/blob/master/COPYING OBALoG BSD-3-clause http://krex.k-state.edu/dspace/handle/2097/3651 OpenCV Apache-2.0 https://github.com/opencv/opencv/blob/master/LICENSE OpenEXR BSD-3-clause https://github.com/AcademySoftwareFoundation/openexr/blob/master/LICENSE.md OpenJPEG BSD-2-clause https://github.com/uclouvain/openjpeg/blob/master/LICENSE OpenSSL Apache-2.0 https://github.com/openssl/openssl/blob/master/LICENSE.txt PCL BSD-3-clause https://github.com/PointCloudLibrary/pcl/blob/master/LICENSE.txt PROJ MIT https://proj.org/about.html#license Protocol Buffers BSD-3-clause https://github.com/protocolbuffers/protobuf/blob/master/LICENSE Qt LGPL-3.0 https://www.qt.io/licensing/ Qwt LGPL-2.1 https://qwt.sourceforge.io/qwtlicense.html SPICE custom https://naif.jpl.nasa.gov/naif/rules.html SuiteSparse GPL-2.0 https://github.com/DrTimothyAldenDavis/SuiteSparse/blob/master/LICENSE.txt SuperLU BSD-3-clause https://github.com/xiaoyeli/superlu/blob/master/License.txt Theia BSD-3-clause https://github.com/sweeneychris/TheiaSfM/blob/master/license.txt TNT public domain https://math.nist.gov/tnt/download.html Xerces C Apache-2.0 https://github.com/apache/xerces-c/blob/master/LICENSE yaml-cpp MIT https://github.com/jbeder/yaml-cpp/blob/master/LICENSE ======================== ============== ===== ================================================ FILE: cmake/FindCairo.cmake ================================================ # TODO: This was copied from here: https://github.com/alacarte-maps/alacarte/tree/master/cmake # Which uses the Affero General Public License. # If we end up using this make sure that is ok! # - Try to find the CAIRO library # Once done this will define # # CAIRO_ROOT_DIR - Set this variable to the root installation of CAIRO # # Read-Only variables: # CAIRO_FOUND - system has the CAIRO library # CAIRO_INCLUDE_DIR - the CAIRO include directory # CAIRO_LIBRARIES - The libraries needed to use CAIRO # CAIRO_VERSION - This is set to $major.$minor.$revision (eg. 0.9.8) # # Copyright (c) 2008 Joshua L. Blocher # Copyright (c) 2012 Dmitry Baryshnikov # Copyright (c) 2013 Michael Pavlyshko # # Distributed under the OSI-approved BSD License # if (NOT WIN32) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(_CAIRO cairo) SET(CAIRO_VERSION ${_CAIRO_VERSION}) STRING (REGEX REPLACE "([0-9]+).([0-9]+).([0-9]+)" "\\1" num "${CAIRO_VERSION}") MATH (EXPR CAIRO_VERSION_V "${num}") STRING (REGEX REPLACE "([0-9]+).([0-9]+).([0-9]+)" "\\2" num "${CAIRO_VERSION}") MATH (EXPR CAIRO_VERSION_MAJOR "${num}") STRING (REGEX REPLACE "([0-9]+).([0-9]+).([0-9]+)" "\\3" num "${CAIRO_VERSION}") MATH (EXPR CAIRO_VERSION_MINOR "${num}") endif (PKG_CONFIG_FOUND) endif (NOT WIN32) SET(_CAIRO_ROOT_HINTS $ENV{CAIRO} ${CMAKE_FIND_ROOT_PATH} ${CAIRO_ROOT_DIR} ) SET(_CAIRO_ROOT_PATHS ${CMAKE_FIND_ROOT_PATH} $ENV{CAIRO}/src /usr /usr/local ) SET(_CAIRO_ROOT_HINTS_AND_PATHS HINTS ${_CAIRO_ROOT_HINTS} PATHS ${_CAIRO_ROOT_PATHS} ) FIND_PATH(CAIRO_INCLUDE_DIR NAMES cairo.h HINTS ${_CAIRO_INCLUDEDIR} ${_CAIRO_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES include "include/cairo" ) FIND_LIBRARY(CAIRO_LIBRARY NAMES cairo HINTS ${_CAIRO_LIBDIR} ${_CAIRO_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "local/lib" ) MARK_AS_ADVANCED(CAIRO_LIBRARY) SET(CAIRO_LIBRARIES ${CAIRO_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CAIRO "Could NOT find CAIRO, try to set the path to CAIRO root folder in the system variable CAIRO" CAIRO_LIBRARIES CAIRO_INCLUDE_DIR ) MARK_AS_ADVANCED(CAIRO_INCLUDE_DIR CAIRO_LIBRARIES) ================================================ FILE: cmake/FindCairomm.cmake ================================================ # TODO: This was copied from here: https://github.com/alacarte-maps/alacarte/tree/master/cmake # Which uses the Affero General Public License. # If we end up using this make sure that is ok! # - Try to find CAIROMM # Once done this will define # # CAIROMM_ROOT_DIR - Set this variable to the root installation of CAIROMM # CAIROMM_FOUND - system has CAIROMM # CAIROMM_INCLUDE_DIR - the CAIROMM include directory # CAIROMM_LIBRARIES - Link these to use CAIROMM # # Copyright (c) 2008 Joshua L. Blocher # Copyright (c) 2012 Dmitry Baryshnikov # Copyright (c) 2013 Michael Pavlyshko # # Distributed under the OSI-approved BSD License # if (NOT WIN32) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(_CAIROMM cairomm-1.0) endif (PKG_CONFIG_FOUND) endif (NOT WIN32) SET(_CAIROMM_ROOT_HINTS $ENV{CAIROMM} ${CMAKE_FIND_ROOT_PATH} ${CAIROMM_ROOT_DIR} ) SET(_CAIROMM_ROOT_PATHS ${CMAKE_FIND_ROOT_PATH} $ENV{CAIROMM}/src /usr /usr/local ) SET(_CAIROMM_ROOT_HINTS_AND_PATHS HINTS ${_CAIROMM_ROOT_HINTS} PATHS ${_CAIROMM_ROOT_PATHS} ) FIND_PATH(CAIROMM_INCLUDE_DIR NAMES cairomm/cairomm.h HINTS ${_CAIROMM_INCLUDEDIR} ${_CAIROMM_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES include "include/cairomm-1.0" ) FIND_LIBRARY(CAIROMM_LIBRARY NAMES cairomm cairomm-1.0 ${_CAIROMM_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "local/lib" ) SET(CAIROMM_LIBRARIES ${CAIROMM_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CAIROMM "Could NOT find CAIROMM, try to set the path to CAIROMM root folder in the system variable CAIROMM" CAIROMM_LIBRARIES CAIROMM_INCLUDE_DIR ) MARK_AS_ADVANCED(CAIROMM_INCLUDE_DIR CAIROMM_LIBRARY) ================================================ FILE: cmake/FindFreeType.cmake ================================================ # - Locate FreeType library # This module defines # FREETYPE_LIBRARIES, the library to link against # FREETYPE_FOUND, if false, do not try to link to FREETYPE # FREETYPE_INCLUDE_DIRS, where to find headers. # This is the concatenation of the paths: # FREETYPE_INCLUDE_DIR_ft2build # FREETYPE_INCLUDE_DIR_freetype2 # # $FREETYPE_DIR is an environment variable that would # correspond to the ./configure --prefix=$FREETYPE_DIR # used in building FREETYPE. #============================================================================= # Copyright 2007-2009 Kitware, Inc. # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distributed this file outside of CMake, substitute the full # License text for the above reference.) # Created by Eric Wing. # Modifications by Alexander Neundorf. # Ugh, FreeType seems to use some #include trickery which # makes this harder than it should be. It looks like they # put ft2build.h in a common/easier-to-find location which # then contains a #include to a more specific header in a # more specific location (#include ). # Then from there, they need to set a bunch of #define's # so you can do something like: # #include FT_FREETYPE_H # Unfortunately, using CMake's mechanisms like INCLUDE_DIRECTORIES() # wants explicit full paths and this trickery doesn't work too well. # I'm going to attempt to cut out the middleman and hope # everything still works. FIND_PATH(FREETYPE_INCLUDE_DIR_ft2build ft2build.h HINTS $ENV{FREETYPE_DIR} PATH_SUFFIXES include PATHS /usr/local/X11R6/include /usr/local/X11/include /usr/X11/include /sw/include /opt/local/include /usr/freeware/include "C:/libs/freetype/include" ) FIND_PATH(FREETYPE_INCLUDE_DIR_freetype2 freetype/config/ftheader.h HINTS $ENV{FREETYPE_DIR}/include/freetype2 PATHS /usr/local/X11R6/include /usr/local/X11/include /usr/X11/include /sw/include /opt/local/include /usr/freeware/include "C:/libs/freetype/include" PATH_SUFFIXES freetype2 ) FIND_LIBRARY(FREETYPE_LIBRARY NAMES freetype libfreetype freetype219 HINTS $ENV{FREETYPE_DIR} PATH_SUFFIXES lib64 lib PATHS /usr/local/X11R6 /usr/local/X11 /usr/X11 /sw /usr/freeware "C:/libs/freetype/lib" ) GET_FILENAME_COMPONENT( FREETYPE_LIBRARY_DIR ${FREETYPE_LIBRARY} PATH ) if (WIN32) list(APPEND FREETYPE_LIBRARY_DIR "${FREETYPE_LIBRARY_DIR}/../bin" ) endif(WIN32) # set the user variables IF(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2) SET(FREETYPE_INCLUDE_DIRS "${FREETYPE_INCLUDE_DIR_ft2build};${FREETYPE_INCLUDE_DIR_freetype2}") ENDIF(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2) SET(FREETYPE_LIBRARIES "${FREETYPE_LIBRARY}") # handle the QUIETLY and REQUIRED arguments and set FREETYPE_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Freetype DEFAULT_MSG FREETYPE_LIBRARY FREETYPE_INCLUDE_DIRS) MARK_AS_ADVANCED(FREETYPE_LIBRARY FREETYPE_INCLUDE_DIR_freetype2 FREETYPE_INCLUDE_DIR_ft2build) ================================================ FILE: cmake/FindSigC++.cmake ================================================ # Copied from list post here: https://mail.gnome.org/archives/libsigc-list/2012-February/msg00005.html # Had to add search path "lib64/sigc++-2.0/include" # - Try to find SigC++-2.0 # Once done, this will define # # SigC++_FOUND - system has SigC++ # SigC++_INCLUDE_DIRS - the SigC++ include directories # SigC++_LIBRARIES - link these to use SigC++ include(LibFindMacros) # Use pkg-config to get hints about paths libfind_pkg_check_modules(SigC++_PKGCONF sigc++-2.0) # Main include dir find_path(SigC++_INCLUDE_DIR NAMES sigc++/sigc++.h PATHS ${SigC++_PKGCONF_INCLUDE_DIRS} PATH_SUFFIXES sigc++-2.0 ) # Glib-related libraries also use a separate config header, which is in lib dir find_path(SigC++Config_INCLUDE_DIR NAMES sigc++config.h PATHS ${SigC++_PKGCONF_INCLUDE_DIRS} /usr PATH_SUFFIXES lib/sigc++-2.0/include lib64/sigc++-2.0/include ) message("inc dir = ${SigC++Config_INCLUDE_DIR}") libfind_library(SigC++ sigc 2.0) # Set the include dir variables and the libraries and let libfind_process do the rest. # NOTE: Singular variables for this library, plural for libraries this this lib depends on. set(SigC++_PROCESS_INCLUDES SigC++_INCLUDE_DIR SigC++Config_INCLUDE_DIR) set(SigC++_PROCESS_LIBS SigC++_LIBRARY) libfind_process(SigC++) ================================================ FILE: cmake/LibFindMacros.cmake ================================================ # Version 1.0 (2013-04-12) # Public Domain, originally written by Lasse Kärkkäinen # Published at http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries # If you improve the script, please modify the forementioned wiki page because # I no longer maintain my scripts (hosted as static files at zi.fi). Feel free # to remove this entire header if you use real version control instead. # Changelog: # 2013-04-12 Added version number (1.0) and this header, no other changes # 2009-10-08 Originally published # Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments # used for the current package. For this to work, the first parameter must be the # prefix of the current package, then the prefix of the new package etc, which are # passed to find_package. macro (libfind_package PREFIX) set (LIBFIND_PACKAGE_ARGS ${ARGN}) if (${PREFIX}_FIND_QUIETLY) set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET) endif (${PREFIX}_FIND_QUIETLY) if (${PREFIX}_FIND_REQUIRED) set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED) endif (${PREFIX}_FIND_REQUIRED) find_package(${LIBFIND_PACKAGE_ARGS}) endmacro (libfind_package) # CMake developers made the UsePkgConfig system deprecated in the same release (2.6) # where they added pkg_check_modules. Consequently I need to support both in my scripts # to avoid those deprecated warnings. Here's a helper that does just that. # Works identically to pkg_check_modules, except that no checks are needed prior to use. macro (libfind_pkg_check_modules PREFIX PKGNAME) if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) include(UsePkgConfig) pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS) else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(${PREFIX} ${PKGNAME}) endif (PKG_CONFIG_FOUND) endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) endmacro (libfind_pkg_check_modules) # Do the final processing once the paths have been detected. # If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain # all the variables, each of which contain one include directory. # Ditto for ${PREFIX}_PROCESS_LIBS and library files. # Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. # Also handles errors in case library detection was required, etc. macro (libfind_process PREFIX) # Skip processing if already processed during this run if (NOT ${PREFIX}_FOUND) # Start with the assumption that the library was found set (${PREFIX}_FOUND TRUE) # Process all includes and set _FOUND to false if any are missing foreach (i ${${PREFIX}_PROCESS_INCLUDES}) if (${i}) set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}}) mark_as_advanced(${i}) else (${i}) set (${PREFIX}_FOUND FALSE) endif (${i}) endforeach (i) # Process all libraries and set _FOUND to false if any are missing foreach (i ${${PREFIX}_PROCESS_LIBS}) if (${i}) set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}}) mark_as_advanced(${i}) else (${i}) set (${PREFIX}_FOUND FALSE) endif (${i}) endforeach (i) # Print message and/or exit on fatal error if (${PREFIX}_FOUND) if (NOT ${PREFIX}_FIND_QUIETLY) message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") endif (NOT ${PREFIX}_FIND_QUIETLY) else (${PREFIX}_FOUND) if (${PREFIX}_FIND_REQUIRED) foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS}) message("${i}=${${i}}") endforeach (i) 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.") endif (${PREFIX}_FIND_REQUIRED) endif (${PREFIX}_FOUND) endif (NOT ${PREFIX}_FOUND) endmacro (libfind_process) macro(libfind_library PREFIX basename) set(TMP "") if(MSVC80) set(TMP -vc80) endif(MSVC80) if(MSVC90) set(TMP -vc90) endif(MSVC90) set(${PREFIX}_LIBNAMES ${basename}${TMP}) if(${ARGC} GREATER 2) set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2}) string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES}) set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP}) endif(${ARGC} GREATER 2) find_library(${PREFIX}_LIBRARY NAMES ${${PREFIX}_LIBNAMES} PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS} ) endmacro(libfind_library) ================================================ FILE: cmake/Utilities.cmake ================================================ # This file contains functions used in other parts of the project. # Obtains a file list with all the files in a directory properly formatted function(get_all_source_files relativePath outputFileList) # Load all matching files into TEMP file(GLOB TEMP "${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.cc" "${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.cxx" "${CMAKE_CURRENT_SOURCE_DIR}/${relativePath}/*.tcc" ) set(fileList) # Empty list foreach(f ${TEMP}) # Iterate through TEMP get_filename_component(FILENAME ${f} NAME) # Extract just the file name set(fileList ${fileList} ${FILENAME}) # Append to the list endforeach(f) set(${outputFileList} ${fileList} PARENT_SCOPE) endfunction(get_all_source_files) # Look for a library dependency, starting with the given search # folder. If the header files are in a subfolder of "include", # specify that one in "inc_subfolder". The value of # LIB_SUBDIR is used for CSM to find the library. function(find_external_library name search_folder inc_subfolder libNameList required) # Define the variable names we will create set(FOUND_NAME "${name}_FOUND") set(LIB_NAME "${name}_LIBRARIES") set(INC_NAME "${name}_INCLUDE_DIR") set(ASP_NAME "ASP_HAVE_PKG_${name}") # TODO: Remove VW/ASP name! if(search_folder) set(${FOUND_NAME} 1) set(ext ".so") if (APPLE) set(ext ".dylib") endif() # Add each lib file that was provided. set(${${LIB_NAME}} "") foreach(lib ${libNameList}) set(FULL_NAME "lib${lib}${ext}") set(FULL_PATH "${search_folder}/lib/${LIB_SUBDIR}${FULL_NAME}") if (NOT EXISTS ${FULL_PATH}) # Try to see if maybe the lib is with an extension file(GLOB LIB_FILES ${FULL_PATH}*) list(GET LIB_FILES 0 FULL_PATH2) # get zero-th element if (EXISTS ${FULL_PATH2}) set(FULL_PATH ${FULL_PATH2}) else() message(STATUS "Missing library file: ${FULL_PATH}") set(${FOUND_NAME} 0) continue() endif() endif() set(${LIB_NAME} ${${LIB_NAME}} ${FULL_PATH}) endforeach() set(${INC_NAME} ${search_folder}/include/${inc_subfolder}) string(REGEX REPLACE "/$" "" ${INC_NAME} ${${INC_NAME}}) # rm trailing / else() # TODO: Provide effective findX.cmake files to handle these. find_package(${name} REQUIRED) endif() # Check and display our results if(${FOUND_NAME}) set(${ASP_NAME} 1) message(STATUS "Found include files for ${name} at ${${INC_NAME}}") include_directories("${${INC_NAME}}") else() if (${required}) message( FATAL_ERROR "Failed to find REQUIRED library ${name}." ) else() message(STATUS "Failed to find ${name}") endif() endif() # Pass the results back up to the parent function set(${FOUND_NAME} ${${FOUND_NAME}} PARENT_SCOPE) set(${LIB_NAME} ${${LIB_NAME}} PARENT_SCOPE) set(${INC_NAME} ${${INC_NAME}} PARENT_SCOPE) set(${ASP_NAME} ${${ASP_NAME}} PARENT_SCOPE) message(STATUS "Found libraries for ${name} at ${${LIB_NAME}}") endfunction(find_external_library) # Define a custom make target that will run all tests with normal gtest output. # - Normally you can run 'make test' to run all tests but the output is brief. # - With this you can run 'make gtest_all' to run all tests with more output. if (NOT TARGET gtest_all) add_custom_target(gtest_all) endif() # Call this function once for each gtest target. macro(add_to_custom_test_target test_target) add_custom_target(${test_target}_runtest COMMAND ${test_target} #cmake 2.6 required DEPENDS ${test_target} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") add_dependencies(gtest_all ${test_target}_runtest) endmacro() ## Add the shared precompiled header to the current target. ## - Build it for the first target, then reuse it for all later targets. #function(add_precompiled_header_to_target target) # #set(PCH_PATH "${CMAKE_HOME_DIRECTORY}/src/vw/stdafx.h") # set(PCH_PATH "../stdafx.h") # message("PCH_PATH = ${PCH_PATH}") # message("target = ${target}") # get_property(pchFirstLibrary GLOBAL PROPERTY storedPchFirstLibrary) # if(${pchFirstLibrary} STREQUAL "NA") # # First time this is called, don't reuse the PCH compilation. # set_property(GLOBAL PROPERTY storedPchFirstLibrary ${target}) # target_precompiled_header(${target} ${PCH_PATH}) # else() # target_precompiled_header(${target} ${PCH_PATH} REUSE ${pchFirstLibrary}) # endif() #endfunction(add_precompiled_header_to_target) # Function to add a library to the project. # - This is called in each library folder directory. function(add_library_wrapper libName fileList testFileList dependencyList) # Set up the library add_library(${libName} SHARED ${fileList}) set_target_properties(${libName} PROPERTIES LINKER_LANGUAGE CXX) #message("For ${libName}, linking DEPS: ${dependencyList}") target_link_libraries(${libName} ${dependencyList}) # All libraries share the same precompiled header. #add_precompiled_header_to_target(${libName}) install(TARGETS ${libName} DESTINATION lib) # Set all the header files to be installed to the include directory foreach(f ${fileList}) get_filename_component(extension ${f} EXT) # Get file extension string( TOLOWER "${extension}" extensionLower ) if( extensionLower STREQUAL ".h" OR extensionLower STREQUAL ".hpp" OR extensionLower STREQUAL ".tcc") set(fullPath "${CMAKE_CURRENT_SOURCE_DIR}/${f}") # TODO(oalexan1): This is very fragile code because "asp" can # also match build_asp and what not. # That is why here we do the regex twice. # Need to replace with code which simply installs the "asp" # subdir. STRING(REGEX MATCH "/asp/.*/" dir1 ${fullPath}) STRING(REGEX MATCH "asp/.*/" dir ${dir1}) INSTALL(FILES ${f} DESTINATION include/${dir}) endif() endforeach(f) # Add unit test for each test file given set(TEST_MAIN_PATH "${CMAKE_SOURCE_DIR}/src/test/test_main.cc") foreach(f ${testFileList}) get_filename_component(filename ${f} NAME_WE) # Get file name without extension set(executableName "${libName}_${filename}") # Generate a name for the executable #message("Adding test target ${executableName}") # Add executable with shared main file and this file # - This executeable should not be built unless running tests. add_executable( ${executableName} EXCLUDE_FROM_ALL ${TEST_MAIN_PATH} ./tests/${f} ) # Link test executable against current library, gtest, and gtest_main #target_link_libraries(${executableName} gtest "${libName}" ${GTEST_BOTH_LIBRARIES}) #message("For ${executableName}, linking DEPS: ${dependencyList};${libName}") target_link_libraries(${executableName} gtest gtest_main ${dependencyList} ${libName}) target_compile_definitions(${executableName} PRIVATE GTEST_USE_OWN_TR1_TUPLE=1) target_compile_definitions(${executableName} PRIVATE "TEST_OBJDIR=\"${CMAKE_CURRENT_SOURCE_DIR}/tests\"") target_compile_definitions(${executableName} PRIVATE "TEST_SRCDIR=\"${CMAKE_CURRENT_SOURCE_DIR}/tests\"") # These variables need to be set for each test directory #set_property (TARGET ${executableName} APPEND PROPERTY COMPILE_DEFINITIONS "TEST_OBJDIR=\"${CMAKE_CURRENT_SOURCE_DIR}/tests\"") #set_property (TARGET ${executableName} APPEND PROPERTY COMPILE_DEFINITIONS "TEST_SRCDIR=\"${CMAKE_CURRENT_SOURCE_DIR}/tests\"") add_test(${executableName} ${executableName}) add_to_custom_test_target(${executableName}) # Add to the verbose test make target. endforeach(f) endfunction( add_library_wrapper ) ================================================ FILE: cmake/linux_cross_toolchain.cmake ================================================ # Cross-compile toolchain for building on Mac ARM64 targeting Linux x86_64. # # Both VisionWorkbench and StereoPipeline have a copy of this file. Keep them # in sync when making changes. # # Prerequisites: # - conda-forge clang 16+ with -fopenmp support (in MAC_ASP_DEPS env) # - lld (LLVM linker) in MAC_ASP_DEPS env # - Linux deps prefix with sysroot and GCC 12.4.0 libraries # # Usage (VW, from build_linux/): # cmake .. \ # -DCMAKE_TOOLCHAIN_FILE=../cmake/linux_cross_toolchain.cmake \ # -DLINUX_DEPS_PREFIX=$HOME/miniconda3/envs/asp_deps_linux \ # -DMAC_ASP_DEPS=$HOME/anaconda3/envs/asp_deps \ # -DASP_DEPS_DIR=$HOME/miniconda3/envs/asp_deps_linux \ # -DCMAKE_INSTALL_PREFIX=$HOME/projects/StereoPipeline/install_linux # # Usage (ASP, from build_linux/): # cmake .. \ # -DCMAKE_TOOLCHAIN_FILE=../cmake/linux_cross_toolchain.cmake \ # -DLINUX_DEPS_PREFIX=$HOME/miniconda3/envs/asp_deps_linux \ # -DMAC_ASP_DEPS=$HOME/anaconda3/envs/asp_deps \ # -DASP_DEPS_DIR=$HOME/miniconda3/envs/asp_deps_linux \ # -DVISIONWORKBENCH_INSTALL_DIR=$HOME/projects/StereoPipeline/install_linux \ # -DCMAKE_INSTALL_PREFIX=$HOME/projects/StereoPipeline/install_linux \ # -DOpenMP_C_FLAGS=-fopenmp \ # -DOpenMP_CXX_FLAGS=-fopenmp \ # -DOpenMP_C_LIB_NAMES=omp \ # -DOpenMP_CXX_LIB_NAMES=omp \ # -DOpenMP_omp_LIBRARY=${LINUX_DEPS_PREFIX}/lib/libomp.so # Propagate these variables to try_compile() projects. Without this, CMake's # ABI detection re-invokes this toolchain file but loses the -D variables. list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LINUX_DEPS_PREFIX MAC_ASP_DEPS) # Validate required variables. if(NOT DEFINED LINUX_DEPS_PREFIX) message(FATAL_ERROR "Set -DLINUX_DEPS_PREFIX=/path/to/asp_deps_linux") endif() if(NOT DEFINED MAC_ASP_DEPS) message(FATAL_ERROR "Set -DMAC_ASP_DEPS=/path/to/mac/asp_deps") endif() # Derived paths. set(CROSS_SYSROOT "${LINUX_DEPS_PREFIX}/x86_64-conda-linux-gnu/sysroot") # Auto-detect GCC version in the linux prefix. file(GLOB GCC_VERSION_DIRS "${LINUX_DEPS_PREFIX}/lib/gcc/x86_64-conda-linux-gnu/*") list(GET GCC_VERSION_DIRS 0 GCC_LIB) message(STATUS "Cross-compile: GCC lib dir = ${GCC_LIB}") set(GCC_INC "${GCC_LIB}/include/c++") # Target platform. set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x86_64) # Compilers (conda-forge clang from the Mac env). set(CMAKE_C_COMPILER "${MAC_ASP_DEPS}/bin/clang") set(CMAKE_CXX_COMPILER "${MAC_ASP_DEPS}/bin/clang++") # Compiler flags. Pass --sysroot directly in flags instead of using # CMAKE_SYSROOT, which strips path prefixes and corrupts other paths. set(CROSS_COMMON_FLAGS "--target=x86_64-unknown-linux-gnu \ --sysroot=${CROSS_SYSROOT} \ --gcc-toolchain=${LINUX_DEPS_PREFIX} \ -B${GCC_LIB} \ -fuse-ld=${MAC_ASP_DEPS}/bin/ld.lld \ -I${CROSS_SYSROOT}/usr/include \ -L${GCC_LIB} \ -L${LINUX_DEPS_PREFIX}/lib") set(CMAKE_C_FLAGS_INIT "${CROSS_COMMON_FLAGS}") set(CMAKE_CXX_FLAGS_INIT "${CROSS_COMMON_FLAGS} \ -isystem ${GCC_INC} \ -isystem ${GCC_INC}/x86_64-conda-linux-gnu \ -Wno-enum-constexpr-conversion") # Linker flags. set(CMAKE_EXE_LINKER_FLAGS_INIT "-L${GCC_LIB} -L${LINUX_DEPS_PREFIX}/lib") set(CMAKE_SHARED_LINKER_FLAGS_INIT "-L${GCC_LIB} -L${LINUX_DEPS_PREFIX}/lib") # Search only the cross-prefix for libraries and headers. set(CMAKE_FIND_ROOT_PATH "${LINUX_DEPS_PREFIX}") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Qt moc/rcc/uic are host tools that must run on Mac, not target Linux binaries. set(QT_HOST_PATH "${MAC_ASP_DEPS}") set(QT_MOC_EXECUTABLE "${MAC_ASP_DEPS}/bin/moc") set(QT_RCC_EXECUTABLE "${MAC_ASP_DEPS}/bin/rcc") set(QT_UIC_EXECUTABLE "${MAC_ASP_DEPS}/bin/uic") ================================================ FILE: conda/asp_2.7.0_linux_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=0_gnu - ale=0.7.2=py36h9e03d57_1 - armadillo=9.200.7=hf4e8f56_0 - arpack=3.7.0=hc6cf775_1 - blas=1.1=openblas - boost=1.68.0=py36h8619c78_1001 - boost-cpp=1.68.0=h11c811c_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h516909a_2 - ca-certificates=2020.6.20=hecda079_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=h0948850_10 - certifi=2020.6.20=py36h9f0ad1d_0 - csm=v3.0.3.1=h6bb024c_1001 - cspice=66=h516909a_1009 - curl=7.64.0=h646f8bb_0 - dbus=1.13.0=h4e0c4b3_1000 - decorator=4.4.2=py_0 - eigen=3.3.7=hc9558a2_1001 - embree=2.16.0=0 - expat=2.2.9=he1b5a44_2 - ffmpeg=3.4.1=0 - fgr=e78ce15=hf484d3e_0 - flann=1.9.1=0 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=2.001=hab24e00_0 - font-ttf-source-code-pro=2.030=hab24e00_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.12.1=4 - fonts-conda-forge=1=0 - freetype=2.7=1 - gdal=2.0.2=hf484d3e_0 - geoid=1.0=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.4.2=hb54a4aa_1 - gettext=0.19.8.1=hc5be6a0_1002 - gflags=2.2.2=he1b5a44_1002 - giflib=5.2.1=h516909a_2 - glib=2.51.4=0 - glog=0.4.0=h49b9bf7_3 - gmm=5.0=0 - gmp=6.2.0=he1b5a44_2 - gsl=2.6=h294904e_0 - gst-plugins-base=1.8.0=0 - gstreamer=1.8.0=2 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=hf484d3e_1000 - ilmbase=2.5.2=h8b12597_0 - imagemagick=6.8.6_10=hf484d3e_0 - isis=4.1.0=0 - isis-headers=4.1.0=1000 - jama=125=0 - jasper=1.900.1=4 - jpeg=9b=h024ee3a_2 - kakadu=1=0 - krb5=1.16.3=hc83ff2d_1000 - laszip=2.1.0=hf484d3e_1 - ld_impl_linux-64=2.34=h53a641e_5 - libblas=3.8.0=11_openblas - libcblas=3.8.0=11_openblas - libcurl=7.64.0=h01ee5af_0 - libedit=3.1.20191231=h46ee950_0 - libffi=3.2.1=he1b5a44_1007 - libgcc=7.2.0=h69d50b8_2 - libgcc-ng=9.2.0=h24d8f2e_2 - libgfortran=3.0.0=1 - libgfortran-ng=7.5.0 - libgomp=9.2.0=h24d8f2e_2 - libiconv=1.15=h516909a_1006 - liblapack=3.8.0=11_openblas - liblas=1.8.1=hf484d3e_1000 - libnabo=2df86e0=hf484d3e_0 - libopenblas=0.3.6=h5a2b251_2 - libpng=1.6.37=hed695b0_1 - libpointmatcher=bcf4b04=hf484d3e_0 - libpq=10.6=h13b8bad_1000 - libprotobuf=3.9.1=h8b12597_0 - libssh2=1.8.0=h1ad7b7a_1003 - libstdcxx-ng=9.2.0=hdf63c60_2 - libtiff=4.0.9=he6b73bb_1 - libuuid=2.32.1=h14c3975_1000 - libwebp=0.5.2=7 - libxcb=1.13=h14c3975_1002 - libxml2=2.9.9=h13577e0_2 - llvm-openmp=8.0.1=hc9558a2_0 - mesalib=18.3.1=h590aaf7_0 - metis=5.1.0=he1b5a44_1005 - mysql=5.7.20=hf484d3e_1001 - mysql-connector-c=6.1.11=hab6429c_1002 - nanoflann=1.3.1=0 - ncurses=6.1=hf484d3e_1002 - networkx=2.4=py_1 - nlohmann_json=3.7.3=he1b5a44_1 - nn=1.86.0=h14c3975_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.2=he513fc3_0 - openjpeg=2.1.0=6 - openmp=8.0.1=0 - openssl=1.0.2u=h516909a_0 - parallel=20200522=0 - pbzip2=1.1.13=0 - pcl=1.9.1=h482114b_1002 - pcre=8.44=he1b5a44_0 - perl=5.26.2=h516909a_1006 - pip=20.1.1=py_1 - pixman=0.34.0=h14c3975_1003 - postgresql=10.6=h66cca7a_1000 - proj4=4.9.3=h516909a_9 - protobuf=3.9.1=py36he1b5a44_0 - pthread-stubs=0.4=h14c3975_1001 - pvl=0.3.0=py_1 - python=3.6.7=hd21baee_1002 - python-dateutil=2.8.1=py_0 - python_abi=3.6=1_cp36m - pytz=2020.1=pyh9f0ad1d_0 - pyyaml=5.3.1=py36h8c4c3a4_0 - qhull=7.2.0=0 - qt=5.9.6=0 - qwt=6.1.3=0 - readline=7.0=hf8c457e_1001 - scipy=1.2.1=py36h09a28d5_1 - setuptools=47.3.1=py36h9f0ad1d_0 - six=1.15.0=pyh9f0ad1d_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h8b20d00_0 - stereo-pipeline=2.7.0=hf484d3e_20200727 - suitesparse=5.7.2=h717dc36_0 - superlu=5.2.1=hfe2efc7_1207 - tbb=2020.1=hc9558a2_0 - theia=f5d93f5=hf484d3e_1001 - tk=8.6.10=hed695b0_0 - tnt=126=0 - tzcode=2020a=h516909a_0 - usgscsm=a53f9cf=h6bb024c_0 - visionworkbench=2.7.0=hf484d3e_0 - wheel=0.34.2=py_1 - x264=20131218=0 - xerces-c=3.1.4=0 - xorg-fixesproto=5.0=h14c3975_1002 - xorg-inputproto=2.3.2=h14c3975_1002 - xorg-kbproto=1.0.7=h14c3975_1002 - xorg-libice=1.0.10=h516909a_0 - xorg-libsm=1.2.3=h84519dc_1000 - xorg-libx11=1.6.9=h516909a_0 - xorg-libxau=1.0.9=h14c3975_0 - xorg-libxdmcp=1.1.3=h516909a_0 - xorg-libxext=1.3.4=h516909a_0 - xorg-libxfixes=5.0.3=h516909a_1004 - xorg-libxi=1.7.10=h516909a_0 - xorg-libxrender=0.9.10=h516909a_1002 - xorg-renderproto=0.11.1=h14c3975_1002 - xorg-xextproto=7.3.0=h14c3975_1002 - xorg-xproto=7.0.31=h14c3975_1007 - xz=5.2.5=h516909a_0 - yaml=0.2.5=h516909a_0 - zlib=1.2.11=h516909a_1006 ================================================ FILE: conda/asp_2.7.0_osx_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.7.2=py36h855b5bd_1 - armadillo=9.200.4=hcb88e47_1205 - arpack=3.6.3=h06d5271_1005 - blas=1.1=openblas - boost=1.68.0=py36h9888f84_1001 - boost-cpp=1.68.0=h6f8c590_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0b31af3_2 - ca-certificates=2020.6.20=hecda079_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=hb9d6bad_10 - certifi=2020.6.20=py36h9f0ad1d_0 - csm=v3.0.3.1=1001 - cspice=66=h0b31af3_1007 - curl=7.64.0=heae2a1f_0 - decorator=4.4.2=py_0 - eigen=3.3.7=ha1b3eb9_1001 - embree=2.16.0=h6834224_0 - expat=2.2.9=h4a8c4bd_2 - ffmpeg=3.4.1=0 - fgr=e78ce15=h0a44026_0 - flann=1.9.1=0 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=2.001=hab24e00_0 - font-ttf-source-code-pro=2.030=hab24e00_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.12.1=4 - fonts-conda-forge=1=0 - freetype=2.7=1 - gdal=2.0.2=h0a44026_0 - geoid=1.0=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.4.2=hb54a4aa_1 - gettext=0.19.8.1=h46ab8bc_1002 - gflags=2.2.2=h4a8c4bd_1002 - giflib=5.2.1=h0b31af3_2 - glib=2.51.4=0 - glog=0.4.0=h700f914_3 - gmm=5.0=h6aef312_0 - gmp=6.2.0=h4a8c4bd_2 - gsl=2.6=ha2d443c_0 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=h0a44026_1000 - ilmbase=2.5.2=hd174df1_0 - imagemagick=6.8.6_10=h0a44026_0 - isis=4.1.0=0 - isis-headers=4.1.0=1000 - jama=125=0 - jasper=1.900.1=4 - jpeg=9b=he5867d9_2 - kakadu=1=0 - krb5=1.16.3=h24a3359_1000 - laszip=2.1.0=h0a44026_1 - libblas=3.8.0=11_openblas - libcblas=3.8.0=11_openblas - libcurl=7.64.0=h76de61e_0 - libcxx=10.0.0=1 - libedit=3.1.20191231=hed1e85f_0 - libffi=3.2.1=h4a8c4bd_1007 - libgcc=4.8.5=hdbeacc1_10 - libgfortran=3.0.1=0 - libiconv=1.15=h0b31af3_1006 - liblapack=3.8.0=11_openblas - liblas=1.8.1=h0a44026_1000 - libnabo=2df86e0=h0a44026_0 - libopenblas=0.3.6=hdc02c5d_2 - libpng=1.6.37=hbbe82c9_1 - libpointmatcher=bcf4b04=h0a44026_0 - libpq=10.6=hbe1e24e_1000 - libprotobuf=3.9.1=hfbae3c0_0 - libssh2=1.8.0=hf30b1f0_1003 - libtiff=4.0.9=he6b73bb_1 - libwebp=0.5.2=7 - libxcb=1.13=h1de35cc_1002 - libxml2=2.9.9=hd80cff7_2 - llvm-openmp=10.0.1=h28b9765_0 - mesalib=18.0.0=hb6cfc13_1 - metis=5.1.0=h4a8c4bd_1005 - mysql=5.7.20=h0a44026_1001 - mysql-connector-c=6.1.11=had4e77e_1002 - nanoflann=1.3.1=0 - ncurses=6.1=h0a44026_1002 - networkx=2.4=py_1 - nlohmann_json=3.7.3=h4a8c4bd_1 - nn=1.86.0=h1de35cc_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.2=h7475705_0 - openjpeg=2.1.0=6 - openssl=1.0.2u=h0b31af3_0 - parallel=20200522=0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.9.1=hdd77166_1002 - pcre=8.44=h4a8c4bd_0 - perl=5.26.2=haec8ef5_1006 - pip=20.1.1=py36_1 - pixman=0.34.0=h1de35cc_1003 - postgresql=10.6=ha1bbaa7_1000 - proj4=4.9.3=h01d97ff_9 - protobuf=3.9.1=py36h6de7cb9_0 - pthread-stubs=0.4=h1de35cc_1001 - pvl=0.3.0=py_1 - python=3.6.7=h4a56312_1002 - python-dateutil=2.8.1=py_0 - python_abi=3.6=1_cp36m - pytz=2020.1=pyh9f0ad1d_0 - pyyaml=5.3.1=py36h37b9a7d_0 - qhull=7.2.0=0 - qt=5.9.6=0 - qwt=6.1.3=0 - readline=7.0=hcfe32e1_1001 - scipy=1.2.1=py36hbd7caa9_1 - setuptools=47.3.1=py36_0 - six=1.15.0=pyh9f0ad1d_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h9721f7c_0 - stereo-pipeline=2.7.0=20200727 - suitesparse=5.7.2=h0e59142_0 - superlu=5.2.1=hbced767_1205 - tbb=2019.9=ha1b3eb9_1 - theia=f5d93f5=h0a44026_1001 - tk=8.6.10=hb0a8c7a_0 - tnt=126=0 - tzcode=2020a=h0b31af3_0 - usgscsm=a53f9cf=h04f5b5a_0 - visionworkbench=2.7.0=0 - wheel=0.34.2=py36_0 - x264=20131218=0 - xerces-c=3.1.4=h10f7eb2_0 - xorg-fixesproto=5.0=h1de35cc_1002 - xorg-inputproto=2.3.2=h1de35cc_1002 - xorg-kbproto=1.0.7=h1de35cc_1002 - xorg-libice=1.0.10=h01d97ff_0 - xorg-libsm=1.2.3=h01d97ff_1000 - xorg-libx11=1.6.9=h0b31af3_0 - xorg-libxau=1.0.9=h1de35cc_0 - xorg-libxdmcp=1.1.3=h01d97ff_0 - xorg-libxext=1.3.4=h01d97ff_0 - xorg-libxfixes=5.0.3=h01d97ff_1004 - xorg-libxi=1.7.10=h01d97ff_0 - xorg-xextproto=7.3.0=h1de35cc_1002 - xorg-xproto=7.0.31=h1de35cc_1007 - xz=5.2.5=h1de35cc_0 - yaml=0.2.5=h0b31af3_0 - zlib=1.2.11=h1de35cc_3 ================================================ FILE: conda/asp_3.0.0_linux_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=1_gnu - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_12 - ale=0.8.5=py36h605e78d_3 - armadillo=9.900.5=h7c03176_0 - arpack=3.7.0=hc6cf775_2 - blas=1.1=openblas - boost=1.68.0=py36h8619c78_1001 - boost-cpp=1.68.0=h11c811c_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - ca-certificates=2021.5.30=ha878542_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=h0948850_10 - certifi=2021.5.30=py36h5fab9bb_0 - chrpath=0.16=h7f98852_1002 - csm=3.0.3.3=hc9558a2_0 - cspice=66=h7f98852_1014 - curl=7.64.0=h646f8bb_0 - dbus=1.13.0=h4e0c4b3_1000 - decorator=5.0.9=pyhd8ed1ab_0 - eigen=3.3.7=hc9558a2_1001 - embree=2.16.0=0 - expat=2.4.1=h9c3ff4c_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_hfc0cae8_1114 - fgr=isis5.0.1 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - geoid=1.0=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.4.3=hb6868eb_1001 - gettext=0.19.8.1=hf34092f_1004 - gflags=2.2.2=he1b5a44_1004 - giflib=5.2.1=h36c2ea0_2 - git=2.14.2=2 - glib=2.51.4=0 - glog=0.4.0=h49b9bf7_3 - gmm=5.0=0 - gmp=6.2.1=h58526e2_0 - gsl=2.7=he838d99_0 - gst-plugins-base=1.8.0=0 - gstreamer=1.8.0=2 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=hf484d3e_1000 - ilmbase=2.5.5=h780b84a_0 - imagemagick=isis5.0.1 - inja=3.3.0=h9c3ff4c_0 - isis=5.0.1=0 - jama=125=0 - jasper=1.900.1=h07fcdf6_1006 - jpeg=9d=h36c2ea0_0 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_12 - krb5=1.16.3=hc83ff2d_1000 - laszip=2.1.0=hf484d3e_1 - ld_impl_linux-64=2.35.1=h7274673_9 - libblas=3.8.0=17_openblas - libcblas=3.8.0=17_openblas - libcurl=7.64.0=h01ee5af_0 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis5.0.1 - libffi=3.2.1=he1b5a44_1007 - libgcc=7.2.0=h69d50b8_2 - libgcc-ng=11.1.0=hc902ee8_8 - libgdal=2.4.1_isis5.0.1=h3fd9d12_0 - libgfortran=3.0.0=1 - libgfortran-ng=7.5.0=h14aa051_19 - libgfortran4=7.5.0=h14aa051_19 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libgomp=11.1.0=hc902ee8_8 - libiconv=1.15=h516909a_1006 - liblapack=3.8.0=17_openblas - liblas=isis5.0.1 - libnabo=isis5.0.1 - libopenblas=0.3.10=h5a2b251_0 - libpng=1.6.37=h21135ba_2 - libpointmatcher=isis5.0.1 - libpq=10.6=h13b8bad_1000 - libprotobuf=3.9.2=h8b12597_0 - libssh2=1.8.0=h1ad7b7a_1003 - libstdcxx-ng=11.1.0=h56837e0_8 - libtiff=4.0.10=hc3755c2_1005 - libuuid=2.32.1=h7f98852_1000 - libwebp=0.5.2=7 - libxcb=1.13=h7f98852_1003 - libxml2=2.9.9=h13577e0_2 - llvm-openmp=8.0.1=hc9558a2_0 - lz4-c=1.9.3=h9c3ff4c_1 - mesalib=18.3.1=h590aaf7_0 - metis=5.1.0=h58526e2_1006 - mpfr=4.1.0=h9202a9a_1 - mysql=5.7.20=hf484d3e_1001 - mysql-connector-c=6.1.11=hab6429c_1002 - nanoflann=1.3.2=ha770c72_0 - ncurses=6.2=he6710b0_1 - networkx=2.5=py_0 - nlohmann_json=3.10.2=h9c3ff4c_0 - nn=1.86.0=h14c3975_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=hf817b99_0 - openjpeg=2.1.0=6 - openmp=8.0.1=0 - openssl=1.0.2u=h516909a_0 - parallel=20210822=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.9.1=h482114b_1002 - pcre=8.45=h9c3ff4c_0 - perl=5.32.1=0_h7f98852_perl5 - pip=21.0.1=py36h06a4308_0 - pixman=0.34.0=h14c3975_1003 - postgresql=10.6=h66cca7a_1000 - proj4=5.2.0=he1b5a44_1006 - protobuf=3.9.2=py36he1b5a44_1 - pthread-stubs=0.4=h36c2ea0_1001 - pvl=1.2.1=pyhd8ed1ab_0 - python=3.6.7=hd21baee_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2021.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36h8f6f2f9_1 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hf8c457e_1001 - s2p-subset=isis5.0.1 - scipy=1.2.1=py36h09a28d5_1 - setuptools=52.0.0=py36h06a4308_0 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h8b20d00_0 - stereo-pipeline=3.0.0=h3fd9d12_0 - suitesparse=5.10.1=hd8046ac_0 - superlu=5.2.2=hfe2efc7_0 - sysroot_linux-64=2.17=h4a8ded7_12 - tbb=2020.2=h4bd325d_4 - theia=isis5.0.1 - tk=8.6.10=hbc83047_0 - tnt=126=0 - tzcode=2021a=h7f98852_2 - usgscsm=1.5.2 - visionworkbench=3.0.0=h3fd9d12_0 - wheel=0.37.0=pyhd3eb1b0_0 - x264=20131218=0 - xerces-c=3.1.4=0 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.0.10=h7f98852_0 - xorg-libsm=1.2.3=hd9c2040_1000 - xorg-libx11=1.7.2=h7f98852_0 - xorg-libxau=1.0.9=h7f98852_0 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h7f98852_1 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-xextproto=7.3.0=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.5=h7b6447c_0 - yaml=0.2.5=h516909a_0 - zlib=1.2.11=h7b6447c_3 - zstd=1.4.9=ha95c52a_0 ================================================ FILE: conda/asp_3.0.0_osx_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.8.5=py36hc61eee1_3 - armadillo=9.200.4=hcb88e47_1205 - arpack=3.6.3=h06d5271_1005 - blas=1.1=openblas - boost=1.68.0=py36h9888f84_1001 - boost-cpp=1.68.0=h6f8c590_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - ca-certificates=2021.5.30=h033912b_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=hb9d6bad_10 - certifi=2021.5.30=py36h79c6626_0 - cmake=3.3.1=0 - csm=3.0.3.3=0 - cspice=66=h0d85af4_1014 - curl=7.64.0=heae2a1f_0 - decorator=5.0.9=pyhd8ed1ab_0 - eigen=3.3.7=h04f5b5a_0 - embree=2.16.0=h6834224_0 - expat=2.4.1=he49afe7_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_h5c49c53_1109 - fgr=isis5.0.1 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - geoid=1.0=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.4.3=h113155d_1001 - gettext=0.19.8.1=h46ab8bc_1002 - gflags=2.2.2=hb1e8313_1004 - giflib=5.2.1=hbcb3906_2 - git=2.11.1=0 - glib=2.51.4=0 - glog=0.4.0=hb7f4fc5_3 - gmm=5.0=h6aef312_0 - gmp=6.2.1=h2e338ed_0 - gsl=2.7=h93259b0_0 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=h0a44026_1000 - ilmbase=2.5.5=hfab91a5_0 - imagemagick=isis5.0.1 - inja=3.2.0=h1c7c35f_0 - isis=5.0.1=0 - jama=125=0 - jasper=1.900.1=h636a363_1006 - jpeg=9d=hbcb3906_0 - kakadu=1=0 - krb5=1.16.3=h24a3359_1000 - laszip=2.1.0=h0a44026_1 - libblas=3.8.0=17_openblas - libcblas=3.8.0=17_openblas - libcurl=7.64.0=h76de61e_0 - libcxx=12.0.1=habf9029_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis5.0.1 - libffi=3.2.1=hb1e8313_1007 - libgcc=4.8.5=hdbeacc1_10 - libgdal=2.4.1_isis5.0.1 - libgfortran=3.0.1=0 - libiconv=1.15=h0b31af3_1006 - liblapack=3.8.0=17_openblas - liblas=isis5.0.1 - libnabo=isis5.0.1 - libopenblas=0.3.10=h0794777_0 - libpng=1.6.37=h7cec526_2 - libpointmatcher=isis5.0.1 - libpq=10.6=hbe1e24e_1000 - libprotobuf=3.9.2=hfbae3c0_0 - libssh2=1.8.0=hf30b1f0_1003 - libtiff=4.0.10=ha78913b_1005 - libwebp=0.5.2=7 - libxcb=1.13=h35c211d_1003 - libxml2=2.9.9=hd80cff7_2 - llvm-openmp=12.0.1=hda6cdc1_0 - lz4-c=1.9.3=h046ec9c_0 - mesalib=18.0.0=hb6cfc13_1 - metis=5.1.0=h2e338ed_1006 - mpfr=4.0.2=h72d8aaf_1 - mysql=5.7.20=h0a44026_1001 - mysql-connector-c=6.1.11=had4e77e_1002 - nanoflann=1.3.2=h694c41f_0 - ncurses=6.2=h2e338ed_4 - networkx=2.5=py_0 - nlohmann_json=3.9.1=he49afe7_1 - nn=1.86.0=h1de35cc_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=h7fa7ffa_0 - openjpeg=2.1.0=6 - openssl=1.0.2u=h0b31af3_0 - parallel=20210622=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.9.1=hdd77166_1002 - pcre=8.45=he49afe7_0 - perl=5.32.1=0_h0d85af4_perl5 - pip=21.1.3=pyhd8ed1ab_0 - pixman=0.34.0=h1de35cc_1003 - postgresql=10.6=ha1bbaa7_1000 - proj4=5.2.0=h6de7cb9_1006 - protobuf=3.9.2=py36h6de7cb9_1 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.2.1=pyhd8ed1ab_0 - python=3.6.7=h4a56312_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2021.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36h20b66c6_0 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hcfe32e1_1001 - s2p-subset=isis5.0.1 - scipy=1.2.1=py36hbd7caa9_1 - setuptools=49.6.0=py36h79c6626_3 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h9721f7c_0 - stereo-pipeline=3.0.0=0 - suitesparse=5.10.1=h68a9093_0 - superlu=5.2.1=hbced767_1205 - tbb=2020.2=h940c156_4 - theia=isis5.0.1 - tk=8.6.10=h0419947_1 - tnt=126=0 - tzcode=2021a=h0d85af4_2 - usgscsm=1.5.2 - visionworkbench=3.0.0=0 - wheel=0.36.2=pyhd3deb0d_0 - x264=20131218=0 - xerces-c=3.1.4=h10f7eb2_0 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.0.10=h0d85af4_0 - xorg-libsm=1.2.3=h0d85af4_1000 - xorg-libx11=1.7.2=h0d85af4_0 - xorg-libxau=1.0.9=h35c211d_0 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=h0d85af4_1 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-xextproto=7.3.0=h35c211d_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.5=haf1e3a3_1 - yaml=0.2.5=haf1e3a3_0 - zlib=1.2.11=h7795811_1010 - zstd=1.4.9=h582d3a0_0 ================================================ FILE: conda/asp_3.1.0_linux_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=1_gnu - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13 - ale=0.8.5=py36h605e78d_3 - armadillo=10.8.2=h7c03176_0 - arpack=3.7.0=hc6cf775_2 - binutils_impl_linux-64=2.36.1=h193b22a_2 - binutils_linux-64=2.36=hf3e587d_9 - blas=1.1=openblas - boost=1.68.0=py36h8619c78_1001 - boost-cpp=1.68.0=h11c811c_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - ca-certificates=2021.10.8=ha878542_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=hf302a74_15 - chrpath=0.16=h7f98852_1002 - cmake=3.15.5=hf94ab9c_0 - csm=3.0.3.3=hc9558a2_0 - cspice=66=h7f98852_1015 - curl=7.64.0=h646f8bb_0 - dbus=1.13.0=h4e0c4b3_1000 - decorator=5.1.1=pyhd8ed1ab_0 - eigen=3.4.0=h4bd325d_0 - embree=2.16.0=0 - expat=2.4.8=h27087fc_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_hfc0cae8_1114 - fgr=isis6=h3fd9d12_0 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - gcc_impl_linux-64=11.2.0=h82a94d6_16 - gcc_linux-64=11.2.0=h39a9532_9 - geoid=1.0=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.4.3=hb6868eb_1001 - gettext=0.19.8.1=hf34092f_1004 - gflags=2.2.2=he1b5a44_1004 - giflib=5.2.1=h36c2ea0_2 - glib=2.51.4=0 - glog=0.6.0=h6f12383_0 - gmm=5.0=0 - gmp=6.2.1=h58526e2_0 - gsl=2.7=he838d99_0 - gst-plugins-base=1.8.0=0 - gstreamer=1.8.0=2 - gxx_impl_linux-64=11.2.0=h82a94d6_16 - gxx_linux-64=11.2.0=hacbe6df_9 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=hf484d3e_1000 - ilmbase=2.5.5=h780b84a_0 - imagemagick=isis6=h3fd9d12_0 - imath=3.1.5=h6239696_0 - inja=3.3.0=h9c3ff4c_0 - isis=6.0.0=0 - jama=125=0 - jasper=1.900.1=h07fcdf6_1006 - jpeg=9e=h166bdaf_1 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_13 - krb5=1.16.3=hc83ff2d_1000 - laszip=2.1.0=hf484d3e_1 - ld_impl_linux-64=2.36.1=hea4e1c9_2 - libblas=3.9.0=13_linux64_openblas - libcblas=3.9.0=13_linux64_openblas - libcurl=7.64.0=h01ee5af_0 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis6=h3fd9d12_0 - libffi=3.2.1=he1b5a44_1007 - libgcc=7.2.0=h69d50b8_2 - libgcc-devel_linux-64=11.2.0=h0952999_16 - libgcc-ng=11.2.0=h1d223b6_15 - libgdal=2.4.1_isis6=h3fd9d12_0 - libgfortran=3.0.0=1 - libgfortran-ng=7.5.0=h14aa051_20 - libgfortran4=7.5.0=h14aa051_20 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libgomp=11.2.0=h1d223b6_15 - libiconv=1.15=h516909a_1006 - liblapack=3.9.0=13_linux64_openblas - liblas=isis6=h3fd9d12_1000 - libnabo=isis6=h3fd9d12_0 - libnsl=2.0.0=h7f98852_0 - libopenblas=0.3.18=hf726d26_0 - libpng=1.6.37=h21135ba_2 - libpointmatcher=isis6=h2bc3f7f_0 - libpq=10.6=h13b8bad_1000 - libprotobuf=3.9.2=h8b12597_0 - libsanitizer=11.2.0=he4da1e4_16 - libssh2=1.8.0=h1ad7b7a_1003 - libstdcxx-devel_linux-64=11.2.0=h0952999_16 - libstdcxx-ng=11.2.0=he4da1e4_15 - libtiff=4.0.10=hc3755c2_1005 - libuuid=2.32.1=h7f98852_1000 - libuv=1.43.0=h7f98852_0 - libwebp=0.5.2=7 - libxcb=1.13=h7f98852_1004 - libxml2=2.9.9=h13577e0_2 - libzlib=1.2.11=h166bdaf_1014 - llvm-openmp=8.0.1=hc9558a2_0 - lz4-c=1.9.3=h9c3ff4c_1 - mesalib=18.3.1=h590aaf7_0 - metis=5.1.0=h58526e2_1006 - mpfr=4.1.0=h9202a9a_1 - mysql=5.7.20=hf484d3e_1001 - mysql-connector-c=6.1.11=hab6429c_1002 - nanoflann=1.4.2=ha770c72_0 - ncurses=6.3=h27087fc_1 - networkx=2.5=py_0 - nlohmann_json=3.10.5=h9c3ff4c_0 - nn=1.86.0=h14c3975_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=hf817b99_0 - openjpeg=2.3.0=hf38bd82_1003 - openmp=8.0.1=0 - openssl=1.0.2u=h516909a_0 - parallel=20220222=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.9.1=h482114b_1002 - pcre=8.45=h9c3ff4c_0 - perl=5.32.1=2_h7f98852_perl5 - pip=21.3.1=pyhd8ed1ab_0 - pixman=0.34.0=h14c3975_1003 - postgresql=10.6=h66cca7a_1000 - proj4=5.2.0=he1b5a44_1006 - protobuf=3.9.2=py36he1b5a44_1 - pthread-stubs=0.4=h36c2ea0_1001 - pvl=1.3.1=pyhd8ed1ab_0 - python=3.6.7=hd21baee_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2022.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36h8f6f2f9_1 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hf8c457e_1001 - rhash=1.4.1=h7f98852_0 - s2p-subset=isis6=h3fd9d12_0 - scipy=1.2.1=py36h09a28d5_1 - setuptools=58.0.4=py36h5fab9bb_2 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h8b20d00_0 - stereo-pipeline=3.1.0=h3fd9d12_0 - suitesparse=5.10.1=h9e50725_1 - superlu=5.2.2=hfe2efc7_0 - sysroot_linux-64=2.17=h4a8ded7_13 - tbb=2021.5.0=h924138e_1 - theia=isis6=h3fd9d12_1001 - tk=8.6.12=h27826a3_0 - tnt=126=0 - tzcode=2022a=h166bdaf_0 - usgscsm=1.6.0_asp3.1.0=h2bc3f7f_0 - visionworkbench=3.1.0=h3fd9d12_0 - wheel=0.37.1=pyhd8ed1ab_0 - x264=20131218=0 - xerces-c=3.1.4=0 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.0.10=h7f98852_0 - xorg-libsm=1.2.3=hd9c2040_1000 - xorg-libx11=1.7.2=h7f98852_0 - xorg-libxau=1.0.9=h7f98852_0 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h7f98852_1 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-xextproto=7.3.0=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.5=h516909a_1 - yaml=0.2.5=h7f98852_2 - zlib=1.2.11=h166bdaf_1014 - zstd=1.4.9=ha95c52a_0 ================================================ FILE: conda/asp_3.1.0_osx_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.8.5=py36hc61eee1_3 - armadillo=9.200.4=hcb88e47_1205 - arpack=3.6.3=h06d5271_1005 - blas=1.1=openblas - boost=1.68.0=py36h9888f84_1001 - boost-cpp=1.68.0=h6f8c590_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - ca-certificates=2021.10.8=h033912b_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=h636452b_15 - certifi=2021.5.30=py36h79c6626_0 - cmake=3.15.5=h6c18c4b_0 - csm=3.0.3.3=0 - cspice=66=h0d85af4_1015 - curl=7.64.0=heae2a1f_0 - decorator=5.1.1=pyhd8ed1ab_0 - eigen=3.4.0=h940c156_0 - embree=2.16.0=h6834224_0 - expat=2.4.8=h96cf925_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_h5c49c53_1109 - fgr=isis6=h01edc0c_0 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - geoid=1.0=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.4.3=h113155d_1001 - gettext=0.19.8.1=h46ab8bc_1002 - gflags=2.2.2=hb1e8313_1004 - giflib=5.2.1=hbcb3906_2 - glib=2.51.4=0 - glog=0.6.0=h8ac2a54_0 - gmm=5.0=h6aef312_0 - gmp=6.2.1=h2e338ed_0 - gsl=2.7=h93259b0_0 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=h0a44026_1000 - ilmbase=2.5.5=hfab91a5_0 - imagemagick=isis6=h01edc0c_0 - inja=3.3.0=he49afe7_0 - isis=6.0.0=0 - jama=125=0 - jasper=1.900.1=h636a363_1006 - jpeg=9e=h5eb16cf_1 - kakadu=1=0 - krb5=1.16.3=h24a3359_1000 - laszip=2.1.0=h0a44026_1 - libblas=3.9.0=13_osx64_openblas - libcblas=3.9.0=13_osx64_openblas - libcurl=7.64.0=h76de61e_0 - libcxx=14.0.3=hc203e6f_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis6=0 - libffi=3.2.1=hb1e8313_1007 - libgcc=4.8.5=hdbeacc1_10 - libgdal=2.4.1_isis6=h01edc0c_0 - libgfortran=3.0.1=0 - libiconv=1.15=h0b31af3_1006 - liblapack=3.9.0=13_osx64_openblas - liblas=isis6=h01edc0c_1000 - libnabo=isis6=h01edc0c_0 - libopenblas=0.3.18=h9a5756b_0 - libpng=1.6.37=h7cec526_2 - libpointmatcher=isis6=ha5a8b8e_0 - libpq=10.6=hbe1e24e_1000 - libprotobuf=3.9.2=hfbae3c0_0 - libssh2=1.8.0=hf30b1f0_1003 - libtiff=4.0.10=ha78913b_1005 - libuv=1.43.0=h0d85af4_0 - libwebp=0.5.2=7 - libxcb=1.13=h0d85af4_1004 - libxml2=2.9.9=hd80cff7_2 - libzlib=1.2.11=h6c3fc93_1014 - llvm-openmp=14.0.3=ha654fa7_0 - lz4-c=1.9.3=he49afe7_1 - mesalib=21.2.5=h2df1e00_3 - metis=5.1.0=h2e338ed_1006 - mpfr=4.1.0=h0f52abe_1 - mysql=5.7.20=h0a44026_1001 - mysql-connector-c=6.1.11=had4e77e_1002 - nanoflann=1.4.2=h694c41f_0 - ncurses=6.3=h96cf925_1 - networkx=2.5=py_0 - nlohmann_json=3.10.5=he49afe7_0 - nn=1.86.0=h1de35cc_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=h7fa7ffa_0 - openjpeg=2.3.0=h3bf0609_1003 - openssl=1.0.2u=h0b31af3_0 - parallel=20220222=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.9.1=hdd77166_1002 - pcre=8.45=he49afe7_0 - perl=5.32.1=2_h0d85af4_perl5 - pip=21.3.1=pyhd8ed1ab_0 - pixman=0.34.0=h1de35cc_1003 - postgresql=10.6=ha1bbaa7_1000 - proj4=5.2.0=h6de7cb9_1006 - protobuf=3.9.2=py36h6de7cb9_1 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.3.1=pyhd8ed1ab_0 - python=3.6.7=h4a56312_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2022.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36hfa26744_1 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hcfe32e1_1001 - rhash=1.4.1=h0d85af4_0 - s2p-subset=isis6=h01edc0c_0 - scipy=1.2.1=py36hbd7caa9_1 - setuptools=58.0.4=py36h79c6626_2 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h9721f7c_0 - stereo-pipeline=3.1.0=0 - suitesparse=5.10.1=h7aff33d_1 - superlu=5.2.1=hbced767_1205 - tbb=2021.5.0=hbb4e6a2_1 - theia=isis6=h01edc0c_1001 - tk=8.6.12=h5dbffcc_0 - tnt=126=0 - tzcode=2022a=h5eb16cf_0 - usgscsm=1.6.0_asp3.1.0=ha5a8b8e_0 - visionworkbench=3.1.0=0 - wheel=0.37.1=pyhd8ed1ab_0 - x264=20131218=0 - xerces-c=3.1.4=h10f7eb2_0 - xorg-damageproto=1.2.1=h0d85af4_1002 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-glproto=1.4.17=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.0.10=h0d85af4_0 - xorg-libsm=1.2.3=h0d85af4_1000 - xorg-libx11=1.7.2=h0d85af4_0 - xorg-libxau=1.0.9=h35c211d_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=h0d85af4_1 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.10=h0d85af4_1003 - xorg-randrproto=1.5.0=h0d85af4_1001 - xorg-renderproto=0.11.1=h0d85af4_1002 - xorg-util-macros=1.19.3=h35c211d_0 - xorg-xextproto=7.3.0=h35c211d_1002 - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.5=haf1e3a3_1 - yaml=0.2.5=h0d85af4_2 - zlib=1.2.11=h6c3fc93_1014 - zstd=1.4.9=h582d3a0_0 ================================================ FILE: conda/asp_3.2.0_linux_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13 - ale=0.8.8=py39hf939315_1 - alsa-lib=1.2.6.1=h7f98852_0 - aom=3.4.0=h27087fc_1 - armadillo=11.4.2=h7209761_0 - arpack=3.7.0=hdefa2d7_2 - attr=2.5.1=h166bdaf_1 - binutils_impl_linux-64=2.39=he00db2b_1 - binutils_linux-64=2.39=h5fc0e48_11 - blas=2.116=openblas - blas-devel=3.9.0=16_linux64_openblas - boost=1.72.0=py39ha90915f_1 - boost-cpp=1.72.0=he72f1d9_7 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - c-ares=1.18.1=h7f98852_0 - ca-certificates=2022.12.7=ha878542_0 - cairo=1.16.0=ha61ee94_1014 - ceres-solver=1.14.0=hf302a74_15 - chrpath=0.16=h7f98852_1002 - cmake=3.15.5=hf94ab9c_0 - csm=3.0.3.3=hc9558a2_0 - cspice=67=h166bdaf_4 - curl=7.86.0=h7bff187_1 - cyrus-sasl=2.1.27=h230043b_5 - dbus=1.13.6=h5008d03_3 - eigen=3.4.0=h4bd325d_0 - elfutils=0.186=he364ef2_0 - embree=2.16.0=0 - expat=2.5.0=h27087fc_0 - ffmpeg=4.4.2=gpl_hfe78399_107 - fftw=3.3.10=nompi_hf0379b8_106 - fgr=isis7=h3fd9d12_0 - flann=1.9.1=he05ef13_1011 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.1=hc2a2eb6_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freeglut=3.2.2=h9c3ff4c_1 - freetype=2.12.1=hca18f0e_1 - gcc_impl_linux-64=12.2.0=hcc96c02_19 - gcc_linux-64=12.2.0=h4798a0e_11 - geoid=1.0_isis7=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.7.1=ha76d385_4 - gettext=0.21.1=h27087fc_0 - gflags=2.2.2=he1b5a44_1004 - gfortran_impl_linux-64=12.2.0=h55be85b_19 - gfortran_linux-64=12.2.0=h307d370_11 - giflib=5.2.1=h36c2ea0_2 - glib=2.74.1=h6239696_1 - glib-tools=2.74.1=h6239696_1 - glog=0.6.0=h6f12383_0 - gmp=6.2.1=h58526e2_0 - gnutls=3.7.8=hf3e180e_0 - graphite2=1.3.13=h58526e2_1001 - gsl=2.7=he838d99_0 - gst-plugins-base=1.20.3=hf6a322e_0 - gstreamer=1.20.3=hd4edc92_2 - gxx_impl_linux-64=12.2.0=hcc96c02_19 - gxx_linux-64=12.2.0=hb41e900_11 - harfbuzz=5.3.0=h418a68e_0 - hdf5=1.12.2=nompi_h2386368_100 - htdp=1.0_isis7=1 - icu=70.1=h27087fc_0 - ilmbase=2.5.5=h780b84a_0 - inja=3.3.0=h9c3ff4c_0 - isis=7.1.0=0 - jack=1.9.18=h8c3723f_1002 - jama=125=0 - jasper=2.0.33=ha77e612_0 - jemalloc=5.2.1=h9c3ff4c_6 - jpeg=9e=h166bdaf_2 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_13 - keyutils=1.6.1=h166bdaf_0 - krb5=1.19.3=h3790be6_0 - lame=3.100=h166bdaf_1003 - laszip=2.1.0_isis7=h3fd9d12_1 - ld_impl_linux-64=2.39=hcc3a1bd_1 - lerc=4.0.0=h27087fc_0 - libarchive=3.5.2=hb890918_3 - libblas=3.9.0=16_linux64_openblas - libcap=2.64=ha37c62d_0 - libcblas=3.9.0=16_linux64_openblas - libclang=14.0.6=default_h2e3cab8_0 - libclang13=14.0.6=default_h3a83d3e_0 - libcups=2.3.3=h3e49a29_2 - libcurl=7.86.0=h7bff187_1 - libcxx=14.0.6=hf52228f_0 - libcxxabi=14.0.6=ha770c72_0 - libdb=6.2.32=h9c3ff4c_0 - libdeflate=1.14=h166bdaf_0 - libdrm=2.4.114=h166bdaf_0 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis7=h3fd9d12_0 - libev=4.33=h516909a_1 - libevent=2.1.10=h9b69904_4 - libffi=3.4.2=h7f98852_5 - libflac=1.3.4=h27087fc_0 - libgcc-devel_linux-64=12.2.0=h3b97bd3_19 - libgcc-ng=12.2.0=h65d4601_19 - libgdal=3.5_isis7=h3fd9d12_0 - libgfortran-ng=12.2.0=h69a702a_19 - libgfortran5=12.2.0=h337968e_19 - libglib=2.74.1=h606061b_1 - libglu=9.0.0=he1b5a44_1001 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libgomp=12.2.0=h65d4601_19 - libhwloc=2.8.0=h32351e8_1 - libiconv=1.17=h166bdaf_0 - libidn2=2.3.4=h166bdaf_0 - libjemalloc=5.2.1=h9c3ff4c_6 - liblapack=3.9.0=16_linux64_openblas - liblapacke=3.9.0=16_linux64_openblas - liblas=1.8.2_isis7=h3fd9d12_0 - libllvm14=14.0.6=he0ac6c6_1 - libmicrohttpd=0.9.75=h2603550_1 - libnabo=isis7=h3fd9d12_0 - libnghttp2=1.47.0=hdcd2b5c_1 - libnsl=2.0.0=h7f98852_0 - libntlm=1.4=h7f98852_1002 - libogg=1.3.4=h7f98852_1 - libopenblas=0.3.21=pthreads_h78a6416_3 - libopencv=4.6.0=py39h04bf7ee_4 - libopus=1.3.1=h7f98852_1 - libpciaccess=0.17=h166bdaf_0 - libpng=1.6.39=h753d276_0 - libpointmatcher=isis7=h2bc3f7f_0 - libpq=14.5=h72a31a5_3 - libprotobuf=3.21.11=h3eb15da_0 - libsanitizer=12.2.0=h46fd767_19 - libsndfile=1.0.31=h9c3ff4c_1 - libsqlite=3.40.0=h753d276_0 - libssh2=1.10.0=haa6b8db_3 - libstdcxx-devel_linux-64=12.2.0=h3b97bd3_19 - libstdcxx-ng=12.2.0=h46fd767_19 - libtasn1=4.19.0=h166bdaf_0 - libtiff=4.4.0=h55922b4_4 - libtool=2.4.6=h9c3ff4c_1008 - libudev1=252=h166bdaf_0 - libunistring=0.9.10=h7f98852_0 - libuuid=2.32.1=h7f98852_1000 - libuv=1.44.2=h166bdaf_0 - libva=2.16.0=h166bdaf_0 - libvorbis=1.3.7=h9c3ff4c_0 - libvpx=1.11.0=h9c3ff4c_3 - libwebp=1.2.4=h522a892_0 - libwebp-base=1.2.4=h166bdaf_0 - libxcb=1.13=h7f98852_1004 - libxkbcommon=1.0.3=he3ba5ed_0 - libxml2=2.9.14=h22db469_4 - libzlib=1.2.13=h166bdaf_4 - llvm-openmp=15.0.6=he0ac6c6_0 - lz4-c=1.9.3=h9c3ff4c_1 - lzo=2.10=h516909a_1000 - mesalib=21.2.5=h0e4506f_3 - metis=5.1.0=h58526e2_1006 - mpfr=4.1.0=h9202a9a_1 - multiview=asp3.2.0=py39h3fd9d12_0 - mysql=8.0.31=h3e2b116_0 - mysql-client=8.0.31=hf89ab62_0 - mysql-common=8.0.31=haf5c9bc_0 - mysql-connector-c=6.1.11=h6eb9d5d_1007 - mysql-devel=8.0.31=haf5c9bc_0 - mysql-libs=8.0.31=h28c427c_0 - mysql-server=8.0.31=hb01f15f_0 - nanoflann=1.4.2=ha770c72_0 - ncurses=6.3=h27087fc_1 - nettle=3.8.1=hc379101_1 - networkx=2.8.8=pyhd8ed1ab_0 - nlohmann_json=3.11.2=h27087fc_0 - nn=1.86.0=h14c3975_2003 - nspr=4.35=h27087fc_0 - nss=3.82=he02c5a1_0 - numpy=1.23.5=py39h3d75532_0 - openblas=0.3.21=pthreads_h320a7e8_3 - opencv=4.6.0=py39hf3d152e_4 - openexr=2.5.5=hf817b99_0 - openh264=2.3.0=h27087fc_0 - openjpeg=2.3.0=hf38bd82_1003 - openssl=1.1.1s=h0b41bf4_1 - p11-kit=0.24.1=hc5aa10d_0 - parallel=20221122=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.11.1=h05311af_1 - pcre2=10.40=hc3806b6_0 - perl=5.32.1=2_h7f98852_perl5 - pip=22.3.1=pyhd8ed1ab_0 - pixman=0.40.0=h36c2ea0_0 - portaudio=19.6.0=h57a0ea0_5 - proj=9.1.0=h93bde94_0 - protobuf=4.21.11=py39h227be39_0 - pthread-stubs=0.4=h36c2ea0_1001 - pulseaudio=14.0=h7f54b18_8 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.6.0=py39hef51801_4 - python=3.9.15=h47a2c10_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2022.6=pyhd8ed1ab_0 - pyyaml=6.0=py39hb9d737c_5 - qhull=2020.2=h4bd325d_2 - qt=5.15.4=hf11cfaa_0 - qt-main=5.15.4=ha5833f6_2 - qt-webengine=5.15.4=hcbadb6c_3 - qwt=6.2.0=h1d9fb53_4 - rapidjson=1.1.0=he1b5a44_1002 - rclone=1.61.1=h519d9b9_0 - readline=8.1.2=h0f457ee_0 - rhash=1.4.3=h166bdaf_0 - rocksdb=6.13.3=hda8cf21_2 - s2p-subset=isis7=h3fd9d12_0 - scipy=1.9.3=py39hddc5342_2 - setuptools=65.5.1=pyhd8ed1ab_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.9=hbd366e4_2 - spiceypy=5.1.2=pyhd8ed1ab_0 - sqlite=3.40.0=h4ff8645_0 - stereo-pipeline=3.2.0=h3fd9d12_0 - suitesparse=5.10.1=h9e50725_1 - superlu=5.2.2=h00795ac_0 - svt-av1=1.2.1=h27087fc_0 - sysroot_linux-64=2.17=h4a8ded7_13 - tbb=2021.7.0=h924138e_1 - tbb-devel=2021.7.0=h924138e_1 - tk=8.6.12=h27826a3_0 - tnt=126=0 - tzdata=2022g=h191b570_0 - usgscsm=1.6.0=h924138e_1 - visionworkbench=3.2.0=h3fd9d12_0 - wheel=0.38.4=pyhd8ed1ab_0 - x264=1!164.3095=h166bdaf_2 - x265=3.5=h924138e_3 - xcb-util=0.4.0=h166bdaf_0 - xcb-util-image=0.4.0=h166bdaf_0 - xcb-util-keysyms=0.4.0=h166bdaf_0 - xcb-util-renderutil=0.3.9=h166bdaf_0 - xcb-util-wm=0.4.1=h166bdaf_0 - xerces-c=3.2.3=h55805fa_5 - xorg-damageproto=1.2.1=h7f98852_1002 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-glproto=1.4.17=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.0.10=h7f98852_0 - xorg-libsm=1.2.3=hd9c2040_1000 - xorg-libx11=1.7.2=h7f98852_0 - xorg-libxau=1.0.9=h7f98852_0 - xorg-libxdamage=1.1.5=h7f98852_1 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h7f98852_1 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrandr=1.5.2=h7f98852_1 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-randrproto=1.5.0=h7f98852_1001 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-util-macros=1.19.3=h7f98852_0 - xorg-xextproto=7.3.0=h7f98852_1002 - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - zlib=1.2.13=h166bdaf_4 - zstd=1.5.2=h6239696_4 - mesa-libgl-cos6-x86_64 - xorg-libxmu - mesalib ================================================ FILE: conda/asp_3.2.0_osx_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.8.8=py39h92daf61_1 - aom=3.4.0=hb486fe8_1 - armadillo=11.4.2=hffeb596_0 - arpack=3.7.0=hefb7bc6_2 - blas=2.116=openblas - blas-devel=3.9.0=16_osx64_openblas - boost=1.72.0=py39hb64e6f8_1 - boost-cpp=1.72.0=h179ae3a_7 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - c-ares=1.18.1=h0d85af4_0 - ca-certificates=2022.12.7=h033912b_0 - cairo=1.16.0=h904041c_1014 - cctools_osx-64=973.0.1=hcc6d90d_11 - ceres-solver=1.14.0=h636452b_15 - clang=14.0.6=h694c41f_0 - clang-14=14.0.6=default_h55ffa42_0 - clang_osx-64=14.0.6=h3113cd8_4 - clangxx=14.0.6=default_h55ffa42_0 - cmake=3.15.5=h6c18c4b_0 - compiler-rt=14.0.6=h613da45_0 - compiler-rt_osx-64=14.0.6=h8d5cb93_0 - csm=3.0.3.3=0 - cspice=67=hb7f2c08_4 - curl=7.86.0=h57eb407_1 - cyrus-sasl=2.1.27=ha724b88_5 - eigen=3.4.0=h940c156_0 - embree=2.16.0=h6834224_0 - expat=2.5.0=hf0c8a7f_0 - ffmpeg=4.4.2=gpl_h5a1d76f_107 - fftw=3.3.10=nompi_h4fa670e_106 - fgr=isis7=h01edc0c_0 - flann=1.9.1=h56de9e4_1011 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.1=h5bb23bf_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freetype=2.12.1=h3f81eb7_1 - geoid=1.0_isis7=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.7.1=he29fd1c_4 - gettext=0.21.1=h8a4c099_0 - gflags=2.2.2=hb1e8313_1004 - gfortran_impl_osx-64=11.3.0=h1f927f5_27 - gfortran_osx-64=11.3.0=h18f7dce_0 - giflib=5.2.1=hbcb3906_2 - glib=2.74.1=hbc0c0cd_1 - glib-tools=2.74.1=hbc0c0cd_1 - glog=0.6.0=h8ac2a54_0 - gmp=6.2.1=h2e338ed_0 - gnutls=3.7.8=h207c4f0_0 - graphite2=1.3.13=h2e338ed_1001 - gsl=2.7=h93259b0_0 - gst-plugins-base=1.20.3=h37e1711_2 - gstreamer=1.20.3=h1d18e73_2 - harfbuzz=5.3.0=h08f8713_0 - hdf5=1.12.2=nompi_hc782337_100 - htdp=1.0_isis7=1 - icu=70.1=h96cf925_0 - ilmbase=2.5.5=hfab91a5_0 - inja=3.3.0=he49afe7_0 - isis=7.1.0=0 - isl=0.25=hb486fe8_0 - jama=125=0 - jasper=2.0.33=h013e400_0 - jemalloc=5.2.1=he49afe7_6 - jpeg=9e=hac89ed1_2 - kakadu=1=0 - krb5=1.19.3=hb49756b_0 - lame=3.100=hb7f2c08_1003 - laszip=2.1.0_isis7=h01edc0c_1 - ld64_osx-64=609=hfd63004_11 - lerc=4.0.0=hb486fe8_0 - libblas=3.9.0=16_osx64_openblas - libcblas=3.9.0=16_osx64_openblas - libclang=14.0.6=default_h55ffa42_0 - libclang-cpp14=14.0.6=default_h55ffa42_0 - libclang13=14.0.6=default_hb5731bd_0 - libcurl=7.86.0=h57eb407_1 - libcxx=14.0.6=hccf4f1f_0 - libdeflate=1.14=hb7f2c08_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis7=h01edc0c_0 - libev=4.33=haf1e3a3_1 - libevent=2.1.10=h815e4d9_4 - libffi=3.4.2=h0d85af4_5 - libgdal=3.5_isis7=h01edc0c_0 - libgfortran=5.0.0=9_5_0_h97931a8_26 - libgfortran-devel_osx-64=11.3.0=h824d247_27 - libgfortran5=11.3.0=h082f757_26 - libglib=2.74.1=h4c723e1_1 - libiconv=1.17=hac89ed1_0 - libidn2=2.3.4=hb7f2c08_0 - libjemalloc=5.2.1=he49afe7_6 - liblapack=3.9.0=16_osx64_openblas - liblapacke=3.9.0=16_osx64_openblas - liblas=1.8.2_isis7=h01edc0c_0 - libllvm14=14.0.6=h5b596cc_1 - libnabo=isis7=h01edc0c_0 - libnghttp2=1.47.0=h7cbc4dc_1 - libntlm=1.4=h0d85af4_1002 - libogg=1.3.4=h35c211d_1 - libopenblas=0.3.21=openmp_h429af6e_3 - libopencv=4.6.0=py39h743a0d3_4 - libopus=1.3.1=hc929b4f_1 - libpng=1.6.39=ha978bb4_0 - libpointmatcher=isis7=ha5a8b8e_0 - libpq=14.5=h4aa9af9_3 - libprotobuf=3.21.11=hbc0c0cd_0 - libsqlite=3.40.0=ha978bb4_0 - libssh2=1.10.0=h7535e13_3 - libtasn1=4.19.0=hb7f2c08_0 - libtiff=4.4.0=hdb44e8a_4 - libunistring=0.9.10=h0d85af4_0 - libuv=1.44.2=hac89ed1_0 - libvorbis=1.3.7=h046ec9c_0 - libvpx=1.11.0=he49afe7_3 - libwebp=1.2.4=hfa4350a_0 - libwebp-base=1.2.4=h775f41a_0 - libxcb=1.13=h0d85af4_1004 - libxml2=2.9.14=hea49891_4 - libzlib=1.2.13=hfd90126_4 - llvm-openmp=15.0.6=h61d9ccf_0 - llvm-tools=14.0.6=h5b596cc_1 - lz4-c=1.9.3=he49afe7_1 - macports-legacy-support=1.0.7=hb7f2c08_0 - mesalib=21.2.5=h2df1e00_3 - metis=5.1.0=h2e338ed_1006 - mpc=1.2.1=hbb51d92_0 - mpfr=4.1.0=h0f52abe_1 - multiview=asp3.2.0=py39h01edc0c_0 - mysql=8.0.31=h57ddcff_0 - mysql-client=8.0.31=hbbbc359_0 - mysql-common=8.0.31=h7ebae80_0 - mysql-connector-c=6.1.11=h0f02589_1007 - mysql-devel=8.0.31=h7ebae80_0 - mysql-libs=8.0.31=hc37e033_0 - mysql-server=8.0.31=ha134c4c_0 - nanoflann=1.4.2=h694c41f_0 - ncurses=6.3=h96cf925_1 - nettle=3.8.1=h96f3785_1 - networkx=2.8.8=pyhd8ed1ab_0 - nlohmann_json=3.11.2=hbbd2c75_0 - nn=1.86.0=h1de35cc_2003 - nspr=4.35=hea0b92c_0 - nss=3.78=ha8197d3_0 - numpy=1.23.5=py39hdfa1d0c_0 - openblas=0.3.21=openmp_hbefa662_3 - opencv=4.6.0=py39h6e9494a_4 - openexr=2.5.5=h7fa7ffa_0 - openh264=2.3.0=hb486fe8_0 - openjpeg=2.3.0=h3bf0609_1003 - openssl=1.1.1s=hfd90126_1 - p11-kit=0.24.1=h65f8906_0 - parallel=20221122=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.11.1=h7984e4d_1 - pcre2=10.40=h1c4e4bc_0 - perl=5.32.1=2_h0d85af4_perl5 - pip=22.3.1=pyhd8ed1ab_0 - pixman=0.40.0=hbcb3906_0 - proj=9.1.0=hcbd9701_0 - protobuf=4.21.11=py39h7a8716b_0 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.6.0=py39h71a6800_4 - python=3.9.15=h531fd05_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2022.6=pyhd8ed1ab_0 - pyyaml=6.0=py39ha30fb19_5 - qhull=2020.2=h940c156_2 - qt=5.15.4=hb3ad848_0 - qt-main=5.15.4=h938c29d_2 - qt-webengine=5.15.4=h72ca1e5_3 - qwt=6.2.0=h4cc5820_4 - rapidjson=1.1.0=hb1e8313_1002 - readline=8.1.2=h3899abd_0 - rhash=1.4.3=hac89ed1_0 - rocksdb=6.13.3=hbb73eaa_2 - s2p-subset=isis7=h01edc0c_0 - scipy=1.9.3=py39h8a15683_2 - setuptools=65.5.1=pyhd8ed1ab_0 - sigtool=0.1.3=h57ddcff_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.9=h225ccf5_2 - spiceypy=5.1.2=pyhd8ed1ab_0 - sqlite=3.40.0=h9ae0607_0 - stereo-pipeline=3.2.0=h01edc0c_0 - suitesparse=5.10.1=h7aff33d_1 - superlu=5.2.2=h1f0f902_0 - svt-av1=1.2.1=hbbd2c75_0 - tapi=1100.0.11=h9ce4665_0 - tbb=2021.7.0=hb8565cd_1 - tbb-devel=2021.7.0=hb8565cd_1 - tk=8.6.12=h5dbffcc_0 - tnt=126=0 - tzdata=2022g=h191b570_0 - usgscsm=1.6.0=hb8565cd_1 - visionworkbench=3.2.0=h01edc0c_0 - wheel=0.38.4=pyhd8ed1ab_0 - x264=1!164.3095=h775f41a_2 - x265=3.5=hbb4e6a2_3 - xerces-c=3.2.3=hf5b2a72_5 - xorg-damageproto=1.2.1=h0d85af4_1002 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-glproto=1.4.17=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.0.10=h0d85af4_0 - xorg-libsm=1.2.3=h0d85af4_1000 - xorg-libx11=1.7.2=h0d85af4_0 - xorg-libxau=1.0.9=h35c211d_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=h0d85af4_1 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.10=h0d85af4_1003 - xorg-randrproto=1.5.0=h0d85af4_1001 - xorg-renderproto=0.11.1=h0d85af4_1002 - xorg-util-macros=1.19.3=h35c211d_0 - xorg-xextproto=7.3.0=h35c211d_1002 - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.6=h775f41a_0 - yaml=0.2.5=h0d85af4_2 - zlib=1.2.13=hfd90126_4 - zstd=1.5.2=hfa58983_4 ================================================ FILE: conda/asp_3.3.0_linux_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - _sysroot_linux-64_curr_repodata_hack=3=h69a702a_13 - ale=0.9.1=py39h7633fee_0 - alsa-lib=1.2.7.2=h166bdaf_0 - aom=3.5.0=h27087fc_0 - armadillo=12.6.1=h0a193a4_0 - arpack=3.7.0=hdefa2d7_2 - blas=2.117=openblas - blas-devel=3.9.0=17_linux64_openblas - boost=1.72.0=py39ha90915f_1 - boost-cpp=1.72.0=h359cf19_6 - brotli-python=1.1.0=py39h3d6467e_0 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - c-ares=1.19.1=hd590300_0 - ca-certificates=2023.7.22=hbcca054_0 - cairo=1.16.0=ha12eb4b_1010 - ceres-solver=1.14.0=hf302a74_15 - certifi=2023.7.22=pyhd8ed1ab_0 - charset-normalizer=3.2.0=pyhd8ed1ab_0 - chrpath=0.16=h7f98852_1002 - csm=3.0.3.3=hc9558a2_0 - cspice=67=h166bdaf_4 - curl=7.87.0=h6312ad2_0 - cyrus-sasl=2.1.27=h957375c_6 - dbus=1.13.6=h5008d03_3 - eigen=3.4.0=h00ab1b0_0 - elfutils=0.188=hbb17bd0_0 - embree=2.17.7=ha770c72_3 - expat=2.5.0=hcb278e6_1 - ffmpeg=4.4.2=gpl_hbd009f3_109 - fftw=3.3.10=nompi_hc118613_108 - fgr=isis7=h3fd9d12_0 - flann=1.9.1=hfe772e8_1010 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.2=h14ed4e7_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freeglut=3.2.2=h9c3ff4c_1 - freetype=2.12.1=hca18f0e_1 - geoid=1.0_isis7=1 - geos=3.9.1=h9c3ff4c_2 - geotiff=1.7.1=ha76d385_4 - gettext=0.21.1=h27087fc_0 - gflags=2.2.2=he1b5a44_1004 - giflib=5.2.1=h0b41bf4_3 - glib=2.76.4=hfc55251_0 - glib-tools=2.76.4=hfc55251_0 - glog=0.6.0=h6f12383_0 - gmp=6.2.1=h58526e2_0 - gnutls=3.7.8=hf3e180e_0 - graphite2=1.3.13=h58526e2_1001 - gsl=2.6=he838d99_2 - gst-plugins-base=1.20.3=h57caac4_2 - gstreamer=1.20.3=hd4edc92_2 - harfbuzz=4.2.0=h40b6f09_0 - hdf5=1.12.1=nompi_h2386368_104 - htdp=1.0_isis7=1 - icu=69.1=h9c3ff4c_0 - idna=3.4=pyhd8ed1ab_0 - ilmbase=2.5.5=h780b84a_0 - inja=3.3.0=h9c3ff4c_0 - isis=8.0.0=np125_0 - jama=125=0 - jasper=2.0.33=h0ff4b12_1 - jemalloc=5.3.0=hcb278e6_0 - jpeg=9e=h0b41bf4_3 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_13 - keyutils=1.6.1=h166bdaf_0 - krb5=1.20.1=hf9c8cef_0 - lame=3.100=h166bdaf_1003 - laszip=2.1.0_isis7=h3fd9d12_1 - ld_impl_linux-64=2.40=h41732ed_0 - lerc=4.0.0=h27087fc_0 - libarchive=3.5.2=hb890918_3 - libblas=3.9.0=17_linux64_openblas - libcblas=3.9.0=17_linux64_openblas - libclang=13.0.1=default_h7634d5b_3 - libcurl=7.87.0=h6312ad2_0 - libcxx=16.0.6=h00ab1b0_0 - libcxxabi=16.0.6=ha770c72_0 - libdeflate=1.14=h166bdaf_0 - libdrm=2.4.114=h166bdaf_0 - libdrm-cos6-x86_64=2.4.65=4 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis7=h3fd9d12_0 - libev=4.33=h516909a_1 - libevent=2.1.10=h9b69904_4 - libexpat=2.5.0=hcb278e6_1 - libffi=3.4.2=h7f98852_5 - libgcc-ng=13.1.0=he5830b7_0 - libgdal=3.5_isis8=h3fd9d12_0 - libgfortran-ng=13.1.0=h69a702a_0 - libgfortran5=13.1.0=h15d22d2_0 - libglib=2.76.4=hebfc3b9_0 - libglu=9.0.0=he1b5a44_1001 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libhwloc=2.8.0=h32351e8_1 - libiconv=1.17=h166bdaf_0 - libidn2=2.3.4=h166bdaf_0 - libjemalloc=5.3.0=hcb278e6_0 - liblapack=3.9.0=17_linux64_openblas - liblapacke=3.9.0=17_linux64_openblas - liblas=1.8.2_isis8=h3fd9d12_0 - libllvm13=13.0.1=hf817b99_2 - libmicrohttpd=0.9.77=h97afed2_0 - libnabo=isis7=h3fd9d12_0 - libnghttp2=1.51.0=hdcd2b5c_0 - libnsl=2.0.0=h7f98852_0 - libntlm=1.4=h7f98852_1002 - libogg=1.3.4=h7f98852_1 - libopenblas=0.3.23=pthreads_h80387f5_0 - libopencv=4.5.5=py39hb0e02d1_7 - libopus=1.3.1=h7f98852_1 - libpciaccess=0.17=h166bdaf_0 - libpng=1.6.39=h753d276_0 - libpointmatcher=isis7=h2bc3f7f_0 - libpq=14.5=h2baec63_5 - libprotobuf=3.19.6=h3eb15da_0 - libsqlite=3.43.0=h2797004_0 - libssh2=1.10.0=haa6b8db_3 - libstdcxx-ng=13.1.0=hfd8a6a1_0 - libtasn1=4.19.0=h166bdaf_0 - libtiff=4.4.0=h82bc61c_5 - libunistring=0.9.10=h7f98852_0 - libuuid=2.38.1=h0b41bf4_0 - libva=2.18.0=h0b41bf4_0 - libvorbis=1.3.7=h9c3ff4c_0 - libvpx=1.11.0=h9c3ff4c_3 - libwebp-base=1.3.1=hd590300_0 - libx11-common-cos6-x86_64=1.6.4=4 - libx11-cos6-x86_64=1.6.4=4 - libxcb=1.13=h7f98852_1004 - libxkbcommon=1.0.3=he3ba5ed_0 - libxml2=2.9.14=haae042b_4 - libzlib=1.2.13=hd590300_5 - llvm-openmp=16.0.6=h4dfa4b3_0 - lz4-c=1.9.3=h9c3ff4c_1 - lzo=2.10=h516909a_1000 - mesa-libgl-cos6-x86_64=11.0.7=4 - mesalib=23.0.0=h0fe20ba_0 - metis=5.1.0=h59595ed_1007 - mpfr=4.2.0=hb012696_0 - multiview=isis8=py39h3fd9d12_0 - mysql=8.0.28=h3e2b116_2 - mysql-client=8.0.28=hf89ab62_2 - mysql-common=8.0.28=haf5c9bc_2 - mysql-connector-c=6.1.11=h6eb9d5d_1007 - mysql-devel=8.0.28=haf5c9bc_2 - mysql-libs=8.0.28=h28c427c_2 - mysql-server=8.0.28=hb253900_2 - nanoflann=1.4.2=ha770c72_0 - ncurses=6.4=hcb278e6_0 - nettle=3.8.1=hc379101_1 - networkx=3.1=pyhd8ed1ab_0 - nlohmann_json=3.11.2=h27087fc_0 - nn=1.86.0=hd590300_2003 - nspr=4.35=h27087fc_0 - nss=3.92=h1d7d5a4_0 - numpy=1.25.2=py39h6183b62_0 - openblas=0.3.23=pthreads_h855a84d_0 - opencv=4.5.5=py39hf3d152e_7 - openexr=2.5.5=hf817b99_0 - openh264=2.3.1=hcb278e6_2 - openjpeg=2.3.0=hf38bd82_1003 - openssl=1.1.1v=hd590300_0 - p11-kit=0.24.1=hc5aa10d_0 - packaging=23.1=pyhd8ed1ab_0 - parallel=20230722=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.11.1=h05311af_1 - pcre2=10.40=hc3806b6_0 - perl=5.32.1=4_hd590300_perl5 - pip=23.2.1=pyhd8ed1ab_0 - pixman=0.40.0=h36c2ea0_0 - platformdirs=3.10.0=pyhd8ed1ab_0 - pooch=1.7.0=pyha770c72_3 - proj=9.1.0=h93bde94_0 - protobuf=3.19.6=py39h227be39_0 - pthread-stubs=0.4=h36c2ea0_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.5.5=py39hef51801_7 - pysocks=1.7.1=pyha2e5f31_6 - python=3.9.15=h47a2c10_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2023.3.post1=pyhd8ed1ab_0 - pyyaml=6.0.1=py39hd1e30aa_0 - qhull=2020.2=h4bd325d_2 - qt=5.12.9=h1304e3e_6 - qwt=6.2.0=hb19a904_2 - rapidjson=1.1.0=he1b5a44_1002 - rclone=1.63.1=h519d9b9_0 - readline=8.2=h8228510_1 - requests=2.31.0=pyhd8ed1ab_0 - rocksdb=6.13.3=hda8cf21_2 - s2p-subset=isis7=h3fd9d12_0 - scipy=1.11.2=py39h6183b62_0 - setuptools=68.1.2=pyhd8ed1ab_0 - six=1.16.0=pyh6c4a22f_0 - spiceypy=6.0.0=pyhd8ed1ab_0 - sqlite=3.43.0=h2c6b66d_0 - stereo-pipeline=3.3.0=h3fd9d12_0 - suitesparse=5.10.1=h9e50725_1 - superlu=5.2.2=h00795ac_0 - svt-av1=1.3.0=h27087fc_0 - sysroot_linux-64=2.17=h4a8ded7_13 - tbb=2021.7.0=h924138e_1 - tbb-devel=2021.7.0=h924138e_1 - tk=8.6.12=h27826a3_0 - tnt=126=0 - typing-extensions=4.7.1=hd8ed1ab_0 - typing_extensions=4.7.1=pyha770c72_0 - tzdata=2023c=h71feb2d_0 - urllib3=2.0.4=pyhd8ed1ab_0 - usgscsm=1.7.0=h00ab1b0_1 - visionworkbench=3.3.0=h3fd9d12_0 - wheel=0.41.2=pyhd8ed1ab_0 - x264=1!164.3095=h166bdaf_2 - x265=3.5=h924138e_3 - xerces-c=3.2.3=h8ce2273_4 - xorg-damageproto=1.2.1=h7f98852_1002 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-glproto=1.4.17=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.1.1=hd590300_0 - xorg-libsm=1.2.4=h7391055_0 - xorg-libx11=1.8.4=h0b41bf4_0 - xorg-libxau=1.0.11=hd590300_0 - xorg-libxdamage=1.1.5=h7f98852_1 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h0b41bf4_2 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrandr=1.5.2=h7f98852_1 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-randrproto=1.5.0=h7f98852_1001 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-util-macros=1.19.3=h7f98852_0 - xorg-xextproto=7.3.0=h0b41bf4_1003 - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - zlib=1.2.13=hd590300_5 - zstd=1.5.5=hfc55251_0 ================================================ FILE: conda/asp_3.3.0_osx_env.yaml ================================================ name: asp channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.9.1=py39h8ee36c8_0 - aom=3.5.0=hf0c8a7f_0 - armadillo=12.6.1=hdc495e4_0 - arpack=3.7.0=hefb7bc6_2 - blas=2.117=openblas - blas-devel=3.9.0=17_osx64_openblas - boost=1.72.0=py39hb64e6f8_1 - boost-cpp=1.72.0=hf3dc895_6 - brotli-python=1.1.0=py39h840bb9f_0 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - c-ares=1.19.1=h0dc2134_0 - ca-certificates=2023.7.22=h8857fd0_0 - cairo=1.16.0=h9e0e54b_1010 - ceres-solver=1.14.0=h636452b_15 - certifi=2023.7.22=pyhd8ed1ab_0 - charset-normalizer=3.2.0=pyhd8ed1ab_0 - csm=3.0.3.3=0 - cspice=67=hb7f2c08_4 - curl=8.2.1=h5f667d7_0 - cyrus-sasl=2.1.27=hf9bab2b_7 - eigen=3.4.0=h1c7c39f_0 - embree=2.17.7=h694c41f_3 - expat=2.5.0=hf0c8a7f_1 - ffmpeg=4.4.2=gpl_hff0bab5_109 - fftw=3.3.10=nompi_h4fa670e_108 - fgr=isis7=h01edc0c_0 - flann=1.9.1=h30321d8_1010 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.2=h5bb23bf_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freetype=2.12.1=h3f81eb7_1 - geoid=1.0_isis7=1 - geos=3.9.1=he49afe7_2 - geotiff=1.7.1=he29fd1c_4 - gettext=0.21.1=h8a4c099_0 - gflags=2.2.2=hb1e8313_1004 - giflib=5.2.1=hb7f2c08_3 - glog=0.6.0=h8ac2a54_0 - gmp=6.2.1=h2e338ed_0 - gnutls=3.7.8=h207c4f0_0 - graphite2=1.3.13=h2e338ed_1001 - gsl=2.6=h71c5fe9_2 - harfbuzz=4.2.0=h48644e2_0 - hdf5=1.12.1=nompi_h0aa1fa2_104 - htdp=1.0_isis7=1 - icu=69.1=he49afe7_0 - idna=3.4=pyhd8ed1ab_0 - ilmbase=2.5.5=hfab91a5_0 - inja=3.3.0=he49afe7_0 - isis=8.0.0=np125_0 - jama=125=0 - jasper=2.0.33=h7c6fec8_1 - jemalloc=5.3.0=hf0c8a7f_0 - jpeg=9e=hb7f2c08_3 - kakadu=1=0 - krb5=1.21.1=hb884880_0 - lame=3.100=hb7f2c08_1003 - laszip=2.1.0_isis7=h01edc0c_1 - lerc=4.0.0=hb486fe8_0 - libblas=3.9.0=17_osx64_openblas - libcblas=3.9.0=17_osx64_openblas - libclang=13.0.1=root_62804_h2961583_3 - libcurl=8.2.1=h5f667d7_0 - libcxx=16.0.6=hd57cbcb_0 - libdeflate=1.14=hb7f2c08_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis7=h01edc0c_0 - libev=4.33=haf1e3a3_1 - libevent=2.1.10=h7d65743_4 - libexpat=2.5.0=hf0c8a7f_1 - libffi=3.4.2=h0d85af4_5 - libgdal=3.5_isis8=hf8dc8b4_0 - libgfortran=5.0.0=12_3_0_h97931a8_1 - libgfortran5=12.3.0=hbd3c1fe_1 - libglib=2.76.4=hc62aa5d_0 - libiconv=1.17=hac89ed1_0 - libidn2=2.3.4=hb7f2c08_0 - libjemalloc=5.3.0=hf0c8a7f_0 - liblapack=3.9.0=17_osx64_openblas - liblapacke=3.9.0=17_osx64_openblas - liblas=1.8.2_isis8=hf8dc8b4_0 - libllvm13=13.0.1=h64f94b2_2 - libnabo=isis7=h01edc0c_0 - libnghttp2=1.52.0=he2ab024_0 - libntlm=1.4=h0d85af4_1002 - libopenblas=0.3.23=openmp_h429af6e_0 - libopencv=4.5.5=py39hc2bf5a6_7 - libpng=1.6.39=ha978bb4_0 - libpointmatcher=isis7=ha5a8b8e_0 - libpq=14.5=h3df487d_7 - libprotobuf=3.19.6=hbc0c0cd_0 - libsqlite=3.42.0=h58db7d2_0 - libssh2=1.11.0=hd019ec5_0 - libtasn1=4.19.0=hb7f2c08_0 - libtiff=4.4.0=h6268bbc_5 - libunistring=0.9.10=h0d85af4_0 - libvpx=1.11.0=he49afe7_3 - libwebp-base=1.3.1=h0dc2134_0 - libxcb=1.15=hb7f2c08_0 - libxml2=2.9.14=h1faee8b_4 - libzlib=1.2.13=h8a1eda9_5 - llvm-openmp=16.0.6=hff08bdf_0 - lz4-c=1.9.3=he49afe7_1 - macports-legacy-support=1.0.13=h0dc2134_0 - mesalib=23.1.4=hb59017c_0 - metis=5.1.0=he965462_1007 - mpfr=4.2.0=h4f9bd69_0 - multiview=isis8=py39hf8dc8b4_0 - mysql=8.0.28=h88f4db0_2 - mysql-client=8.0.28=h7ddd48c_2 - mysql-common=8.0.28=hdd8d184_2 - mysql-devel=8.0.28=hdd8d184_2 - mysql-libs=8.0.28=h353f102_2 - mysql-server=8.0.28=h6edde1b_2 - nanoflann=1.4.2=h694c41f_0 - ncurses=6.4=hf0c8a7f_0 - nettle=3.8.1=h96f3785_1 - networkx=3.1=pyhd8ed1ab_0 - nlohmann_json=3.11.2=hbbd2c75_0 - nn=1.86.0=h0dc2134_2003 - nspr=4.35=hea0b92c_0 - nss=3.92=hd6ac835_0 - numpy=1.25.2=py39h892e69a_0 - openblas=0.3.23=openmp_hbefa662_0 - opencv=4.5.5=py39h6e9494a_7 - openexr=2.5.5=h7fa7ffa_0 - openh264=2.3.1=hf0c8a7f_2 - openjpeg=2.3.0=h3bf0609_1003 - openssl=3.1.2=h8a1eda9_0 - p11-kit=0.24.1=h65f8906_0 - packaging=23.1=pyhd8ed1ab_0 - parallel=20230722=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.11.1=h7984e4d_1 - pcre2=10.40=h1c4e4bc_0 - perl=5.32.1=4_h0dc2134_perl5 - pip=23.2.1=pyhd8ed1ab_0 - pixman=0.40.0=hbcb3906_0 - platformdirs=3.10.0=pyhd8ed1ab_0 - pooch=1.7.0=pyha770c72_3 - proj=9.1.0=hcbd9701_0 - protobuf=3.19.6=py39h7a8716b_0 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.5.5=py39h71a6800_7 - pysocks=1.7.1=pyha2e5f31_6 - python=3.9.17=h07e1443_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2023.3.post1=pyhd8ed1ab_0 - pyyaml=6.0.1=py39hdc70f33_0 - qhull=2020.2=h940c156_2 - qt=5.12.9=h2a607e2_5 - qwt=6.2.0=h0f3c874_2 - rapidjson=1.1.0=hb1e8313_1002 - rclone=1.63.1=h1762f63_0 - readline=8.2=h9e318b2_1 - requests=2.31.0=pyhd8ed1ab_0 - rocksdb=6.13.3=hbb73eaa_2 - s2p-subset=isis7=h01edc0c_0 - scipy=1.11.2=py39hded996c_0 - setuptools=68.1.2=pyhd8ed1ab_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.10=h225ccf5_0 - spiceypy=6.0.0=pyhd8ed1ab_0 - sqlite=3.42.0=h2b0dec6_0 - stereo-pipeline=3.3.0=hf8dc8b4_0 - suitesparse=5.10.1=h7aff33d_1 - superlu=5.2.2=h1f0f902_0 - svt-av1=1.3.0=hf0c8a7f_0 - tbb=2021.10.0.custom_asp=h6b95b14_0 - tbb-devel=2021.10.0.custom_asp=h6b95b14_0 - tk=8.6.12=h5dbffcc_0 - tnt=126=0 - typing-extensions=4.7.1=hd8ed1ab_0 - typing_extensions=4.7.1=pyha770c72_0 - tzdata=2023c=h71feb2d_0 - urllib3=2.0.4=pyhd8ed1ab_0 - usgscsm=1.7.0=h1c7c39f_1 - visionworkbench=3.3.0=hf8dc8b4_0 - wheel=0.41.2=pyhd8ed1ab_0 - x264=1!164.3095=h775f41a_2 - x265=3.5=hbb4e6a2_3 - xerces-c=3.2.3=h6564042_4 - xorg-damageproto=1.2.1=h0d85af4_1002 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-glproto=1.4.17=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.1.1=h0dc2134_0 - xorg-libsm=1.2.4=h0dc2134_0 - xorg-libx11=1.8.6=hbd0b022_0 - xorg-libxau=1.0.11=h0dc2134_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=hb7f2c08_2 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.11=h0dc2134_0 - xorg-randrproto=1.5.0=h0d85af4_1001 - xorg-renderproto=0.11.1=h0d85af4_1002 - xorg-util-macros=1.19.3=h35c211d_0 - xorg-xextproto=7.3.0=hb7f2c08_1003 - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.6=h775f41a_0 - yaml=0.2.5=h0d85af4_2 - zlib=1.2.13=h8a1eda9_5 - zstd=1.5.5=h829000d_0 ================================================ FILE: conda/asp_3.5.0_linux_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - nodefaults - https://repo.anaconda.com/pkgs/main - https://repo.anaconda.com/pkgs/r dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=3_kmp_llvm - affine=2.4.0=pyhd8ed1ab_1 - aiohappyeyeballs=2.6.1=pyhd8ed1ab_0 - aiohttp=3.11.18=py311h2dc5d0c_0 - aiosignal=1.3.2=pyhd8ed1ab_0 - ale=0.10.0=py311hd18a35c_3 - alsa-lib=1.2.9=hd590300_0 - aom=3.7.1=h59595ed_0 - armadillo=14.0.2=h88fc5b9_0 - arpack=3.9.1=nompi_hf03ea27_102 - atk-1.0=2.38.0=hd4edc92_1 - attr=2.5.1=h166bdaf_1 - attrs=25.3.0=pyh71513ae_0 - aws-c-auth=0.7.4=h1083cbe_2 - aws-c-cal=0.6.2=h09139f6_2 - aws-c-common=0.9.3=hd590300_0 - aws-c-compression=0.2.17=h184a658_3 - aws-c-event-stream=0.3.2=h6fea174_2 - aws-c-http=0.7.13=hb59894b_2 - aws-c-io=0.13.33=h161b759_0 - aws-c-mqtt=0.9.7=h55cd26b_0 - aws-c-s3=0.3.17=hfb4bb88_4 - aws-c-sdkutils=0.1.12=h184a658_2 - aws-checksums=0.1.17=h184a658_2 - aws-crt-cpp=0.24.2=ha28989d_2 - aws-sdk-cpp=1.10.57=hec69fbc_24 - binutils=2.43=h4852527_4 - binutils_impl_linux-64=2.43=h4bf12b8_4 - binutils_linux-64=2.43=h4852527_4 - blas=2.131=openblas - blas-devel=3.9.0=31_h1ea3ea9_openblas - blosc=1.21.6=hef167b5_0 - boost=1.78.0=py311h92ebd52_5 - boost-cpp=1.78.0=h6582d0a_3 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h4bc722e_7 - c-ares=1.34.5=hb9d3cd8_0 - c-compiler=1.9.0=h2b85faf_0 - ca-certificates=2025.1.31=hbd8a1cb_1 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - cairo=1.16.0=hbbf8b49_1016 - ceres-solver=2.2.0=h30ec75d_2 - certifi=2025.1.31=pyhd8ed1ab_0 - cfitsio=4.3.0=hbdc6101_0 - chrpath=0.16=h7f98852_1002 - cmake=3.27.9=hcfe8598_0 - compilers=1.9.0=ha770c72_0 - csm=3.0.3.3=h84d6215_1 - cspice=67=hb9d3cd8_8 - curl=8.4.0=hca28451_0 - cxx-compiler=1.9.0=h1a2810e_0 - cyrus-sasl=2.1.27=h54b06d7_7 - dav1d=1.2.1=hd590300_0 - dbus=1.13.6=h5008d03_3 - double-conversion=3.3.1=h5888daf_0 - eigen=3.4.0=h00ab1b0_0 - elfutils=0.189=hde5d1a3_0 - embree=3.13.0=habf647b_1 - expat=2.5.0=hcb278e6_1 - ffmpeg=6.1.0=gpl_h402741f_101 - fftw=3.3.10=nompi_hf1063bd_110 - fgr=asp3.5.0=h3fd9d12_0 - flann=1.9.1=h941a29b_1013 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=h77eed37_3 - fontconfig=2.14.2=h14ed4e7_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - fortran-compiler=1.9.0=h36df796_0 - freeglut=3.2.2=hac7e632_2 - freetype=2.13.3=ha770c72_1 - freexl=1.0.6=h166bdaf_1 - fribidi=1.0.10=h36c2ea0_0 - frozenlist=1.5.0=py311h2dc5d0c_1 - gcc=13.3.0=h9576a4e_2 - gcc_impl_linux-64=13.3.0=h1e990d8_2 - gcc_linux-64=13.3.0=hc28eda2_10 - gdk-pixbuf=2.42.10=h6b639ba_2 - geoid=1.0_isis7=1 - geos=3.12.0=h59595ed_0 - geotiff=1.7.1=h22adcc9_11 - gettext=0.23.1=h5888daf_0 - gettext-tools=0.23.1=h5888daf_0 - gflags=2.2.2=h5888daf_1005 - gfortran=13.3.0=h9576a4e_2 - gfortran_impl_linux-64=13.3.0=h84c1745_2 - gfortran_linux-64=13.3.0=hb919d3a_10 - giflib=5.2.2=hd590300_0 - gl2ps=1.4.2=hae5d5c5_1 - glew=2.1.0=h9c3ff4c_2 - glib=2.78.1=hfc55251_0 - glib-tools=2.78.1=hfc55251_0 - glog=0.7.1=hbabe93e_0 - gmp=6.3.0=hac33072_2 - gnutls=3.7.9=hb077bed_0 - graphite2=1.3.13=h59595ed_1003 - graphviz=8.1.0=h28d9a01_0 - greenlet=3.2.0=py311hfdbb021_0 - gsl=2.6=he838d99_2 - gst-plugins-base=1.22.5=hf7dbed1_0 - gstreamer=1.22.5=h98fc4e7_0 - gtk2=2.24.33=h90689f9_2 - gts=0.7.6=h977cf35_4 - gxx=13.3.0=h9576a4e_2 - gxx_impl_linux-64=13.3.0=hae580e1_2 - gxx_linux-64=13.3.0=h6834431_10 - h5py=3.9.0=nompi_py311he78b9b8_101 - harfbuzz=7.3.0=hdb3a94d_0 - hdf4=4.2.15=h501b40f_6 - hdf5=1.14.1=nompi_h4f84152_100 - icu=72.1=hcb278e6_0 - idna=3.10=pyhd8ed1ab_1 - ilmbase=2.5.5=h3fd9d12_1 - inja=3.3.0=h9c3ff4c_0 - isis=8.3.0=0 - jama=125=0 - jasper=4.0.0=h32699f2_1 - jinja2=3.1.6=pyhd8ed1ab_0 - json-c=0.17=h1220068_1 - jsoncpp=1.9.5=h4bd325d_1 - kakadu=1=0 - kalasiris=1.11.0=pyhd8ed1ab_1 - kealib=1.5.1=h3e6883b_4 - kernel-headers_linux-64=3.10.0=he073ed8_18 - keyutils=1.6.1=h166bdaf_0 - krb5=1.21.2=h659d440_0 - lame=3.100=h166bdaf_1003 - lcms2=2.15=haa2dc70_1 - ld_impl_linux-64=2.43=h712a8e2_4 - lerc=4.0.0=h0aef613_1 - libaec=1.1.3=h59595ed_0 - libarchive=3.6.2=h039dbb9_1 - libasprintf=0.23.1=h8e693c7_0 - libasprintf-devel=0.23.1=h8e693c7_0 - libass=0.17.1=hc9aadba_0 - libblas=3.9.0=31_h59b9bed_openblas - libcap=2.71=h39aace5_0 - libcblas=3.9.0=31_he106b2a_openblas - libclang=15.0.7=default_h127d8a8_5 - libclang13=15.0.7=default_h5d6823c_5 - libcups=2.3.3=h4637d8d_4 - libcurl=8.4.0=hca28451_0 - libcxx=19.1.7=h2713693_1 - libcxxabi=19.1.7=hd85fd95_1 - libdeflate=1.18=h0b41bf4_0 - libdrm=2.4.124=hb9d3cd8_0 - libdrm-cos7-x86_64=2.4.97=ha675448_1106 - libedit=3.1.20250104=pl5321h7949ede_0 - libelas=asp3.5.0=h3fd9d12_0 - libev=4.33=hd590300_2 - libevent=2.1.12=hf998b51_1 - libexpat=2.5.0=hcb278e6_1 - libffi=3.4.6=h2dba641_1 - libflac=1.4.3=h59595ed_0 - libfreetype=2.13.3=ha770c72_1 - libfreetype6=2.13.3=h48d6fc4_1 - libgcc=14.2.0=h767d61c_2 - libgcc-devel_linux-64=13.3.0=hc03c837_102 - libgcc-ng=14.2.0=h69a702a_2 - libgcrypt-lib=1.11.0=hb9d3cd8_2 - libgd=2.3.3=hfa28ad5_6 - libgdal=3.7.1=hd2ada2b_6 - libgettextpo=0.23.1=h5888daf_0 - libgettextpo-devel=0.23.1=h5888daf_0 - libgfortran=14.2.0=h69a702a_2 - libgfortran-ng=14.2.0=h69a702a_2 - libgfortran5=14.2.0=hf1ad2bd_2 - libglib=2.78.1=hebfc3b9_0 - libglu=9.0.0=hac7e632_1003 - libglvnd=1.7.0=ha4b6fd6_2 - libglvnd-cos7-x86_64=1.0.1=ha675448_1106 - libglvnd-glx-cos7-x86_64=1.0.1=ha675448_1106 - libgomp=14.2.0=h767d61c_2 - libgpg-error=1.54=hbd13f7d_0 - libhwloc=2.9.3=default_h554bfaf_1009 - libiconv=1.18=h4ce23a2_1 - libidn2=2.3.8=ha4ef2c3_0 - libjemalloc=5.3.0=h5888daf_1 - libjpeg-turbo=2.1.5.1=hd590300_1 - libkml=1.3.0=h01aab08_1016 - liblapack=3.9.0=31_h7ac8fdf_openblas - liblapacke=3.9.0=31_he2f377e_openblas - libllvm15=15.0.7=h5cf9203_3 - libllvm17=17.0.5=h5cf9203_0 - libltdl=2.4.3a=h5888daf_0 - liblzma=5.8.1=hb9d3cd8_0 - liblzma-devel=5.8.1=hb9d3cd8_0 - libmicrohttpd=0.9.77=h97afed2_0 - libnabo=asp3.5.0=h3fd9d12_1 - libnetcdf=4.9.2=nompi_h7e745eb_109 - libnghttp2=1.58.0=h47da74e_0 - libnsl=2.0.1=hd590300_0 - libntlm=1.8=hb9d3cd8_0 - libogg=1.3.5=h4ab18f5_0 - libopenblas=0.3.29=pthreads_h94d23a6_0 - libopencv=4.7.0=py311h8aafb54_6 - libopus=1.5.2=hd0c01bc_0 - libpciaccess=0.18=hd590300_0 - libpng=1.6.47=h943b412_0 - libpointmatcher=asp3.5.0=h2bc3f7f_1 - libpq=15.4=hfc447b1_2 - libprotobuf=3.21.12=hfc55251_2 - librsvg=2.56.3=h98fae49_0 - librttopo=1.1.0=hb58d41b_14 - libsanitizer=13.3.0=he8ea267_2 - libsndfile=1.2.2=hc60ed4a_1 - libspatialite=5.0.1=h15f6e67_28 - libsqlite=3.49.1=hee588c1_2 - libssh2=1.11.0=h0841786_0 - libstdcxx=14.2.0=h8f9b012_2 - libstdcxx-devel_linux-64=13.3.0=hc03c837_102 - libstdcxx-ng=14.2.0=h4852527_2 - libsystemd0=256.9=h2774228_0 - libtasn1=4.20.0=hb9d3cd8_0 - libtheora=1.1.1=h4ab18f5_1006 - libtiff=4.5.1=h8b53f26_1 - libtool=2.5.4=h5888daf_0 - libunistring=0.9.10=h7f98852_0 - libuuid=2.38.1=h0b41bf4_0 - libuv=1.50.0=hb9d3cd8_0 - libva=2.21.0=h4ab18f5_2 - libvorbis=1.3.7=h9c3ff4c_0 - libvpx=1.13.1=h59595ed_0 - libwebp=1.3.1=hbf2b3c1_0 - libwebp-base=1.3.1=hd590300_0 - libxcb=1.15=h0b41bf4_0 - libxcrypt=4.4.36=hd590300_1 - libxkbcommon=1.6.0=h5d7e998_0 - libxml2=2.11.5=h0d562d8_0 - libzip=1.10.1=h2629f0a_3 - libzlib=1.3.1=hb9d3cd8_2 - llvm-openmp=16.0.6=h4dfa4b3_0 - loguru=0.7.2=py311h38be061_2 - lz4-c=1.9.4=hcb278e6_0 - lzo=2.10=hd590300_1001 - markupsafe=3.0.2=py311h2dc5d0c_1 - mesa-libgl-cos7-x86_64=18.3.4=ha675448_1106 - mesa-libglapi-cos7-x86_64=18.3.4=ha675448_1106 - mesalib=23.2.1=h6b56f8e_0 - metis=5.1.0=hd0bcaf9_1007 - mpfr=4.2.1=h90cbb55_3 - mpg123=1.32.9=hc50e24c_0 - msgpack-python=1.1.0=py311hd18a35c_0 - multidict=6.4.3=py311h2dc5d0c_0 - multiview=asp_3.5.0=py311_2 - mysql=8.0.33=h27aab58_2 - mysql-client=8.0.33=h545f5f4_2 - mysql-common=8.0.33=hf1915f5_2 - mysql-connector-c=6.1.11=h659d440_1008 - mysql-devel=8.0.33=hf1915f5_2 - mysql-libs=8.0.33=hca2cd23_2 - mysql-server=8.0.33=ha473b58_2 - nanoflann=1.6.1=hff21bea_0 - ncurses=6.5=h2d0b736_3 - nettle=3.9.1=h7ab15ed_0 - networkx=3.4.2=pyh267e887_2 - nlohmann_json=3.11.3=he02047a_1 - nn=1.86.0=hd590300_2003 - nspr=4.36=h5888daf_0 - nss=3.110=h159eef7_0 - numpy=1.26.4=py311h64a7726_0 - openblas=0.3.29=pthreads_h6ec200e_0 - opencv=4.7.0=py311h38be061_6 - openexr=2.5.5=h2bc3f7f_0 - openh264=2.3.1=hcb278e6_2 - openjpeg=2.5.0=hfec8fc6_2 - openssl=3.1.8=h7b32b05_0 - p11-kit=0.24.1=hc5aa10d_0 - pandas=2.2.3=py311h7db5c69_3 - pango=1.50.14=heaa33ce_1 - parallel=20250422=ha770c72_0 - pbzip2=1.1.13=h1fcc475_2 - pcl=1.13.1=hd129add_1 - pcre2=10.40=hc3806b6_0 - pdal=2.6.0_asp3.5.0=py311h3fd9d12_1 - perl=5.32.1=7_hd590300_perl5 - pip=25.0.1=pyh8b19718_0 - pixman=0.44.2=h29eaf8c_0 - plio=1.6.0=pyh12aca89_0 - poppler=23.08.0=hd18248d_0 - poppler-data=0.4.12=hd8ed1ab_0 - postgresql=15.4=h8972f4a_2 - proj=9.2.1=ha643af7_0 - propcache=0.3.1=py311h2dc5d0c_0 - protobuf=4.21.12=py311hcafe171_0 - pthread-stubs=0.4=hb9d3cd8_1002 - pugixml=1.13=h59595ed_1 - pulseaudio-client=16.1=hb77b528_5 - pvl=1.3.2=pyhd8ed1ab_1 - py-opencv=4.7.0=py311h781c19f_6 - pyproj=3.6.1=py311ha169711_0 - python=3.11.6=hab00c5b_0_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.11=7_cp311 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.2=py311h2dc5d0c_2 - qhull=2020.2=h434a139_5 - qt-main=5.15.8=h7fe3ca9_15 - qwt=6.2.0=h1a478b3_6 - rapidjson=1.1.0.post20240409=h3f2d84a_2 - rclone=1.69.1=hdac43c8_0 - readline=8.2=h8c095d6_2 - rhash=1.4.5=hb9d3cd8_0 - rocksdb=8.5.3=h699acb7_1 - s2n=1.3.54=h06160fa_0 - s2p-subset=asp3.5.0=h3fd9d12_0 - scipy=1.15.2=py311h8f841c2_0 - setuptools=79.0.0=pyhff2d567_0 - six=1.17.0=pyhd8ed1ab_0 - snappy=1.2.1=h8bd8927_1 - spiceypy=6.0.0=pyhd8ed1ab_2 - sqlalchemy=2.0.40=py311h9ecbd09_0 - sqlite=3.49.1=h9eae976_2 - stereo-pipeline=3.5.0=2 - suitesparse=5.10.1=h5a4f163_3 - superlu=5.2.2=h00795ac_0 - svt-av1=1.7.0=h59595ed_0 - sysroot_linux-64=2.17=h0157908_18 - tbb=2021.11.0=h00ab1b0_1 - tbb-devel=2021.11.0=h5ccd973_1 - tiledb=2.16.3=hf0b6e87_3 - tk=8.6.13=noxft_h4845f30_101 - tnt=126=0 - typing-extensions=4.13.2=h0e9735f_0 - typing_extensions=4.13.2=pyh29332c3_0 - tzcode=2025b=hb9d3cd8_0 - tzdata=2025b=h78e105d_0 - uriparser=0.9.8=hac33072_0 - usgscsm=2.0.2=h8e3e32c_3 - utfcpp=4.0.6=h005c6e1_0 - visionworkbench=asp3.5.0=0 - vlfeat=0.9.21=hd590300_1 - vtk=9.2.6=qt_py311h1234567_210 - vtk-base=9.2.6=qt_py311h1234567_210 - vtk-io-ffmpeg=9.2.6=qt_py311h1234567_210 - wheel=0.45.1=pyhd8ed1ab_1 - wslink=2.3.3=pyhd8ed1ab_0 - x264=1!164.3095=h166bdaf_2 - x265=3.5=h924138e_3 - xcb-util=0.4.0=hd590300_1 - xcb-util-image=0.4.0=h8ee46fc_1 - xcb-util-keysyms=0.4.0=h8ee46fc_1 - xcb-util-renderutil=0.3.9=hd590300_1 - xcb-util-wm=0.4.1=h8ee46fc_1 - xerces-c=3.2.4=h8d71039_2 - xkeyboard-config=2.42=h4ab18f5_0 - xorg-damageproto=1.2.1=hb9d3cd8_1003 - xorg-fixesproto=5.0=hb9d3cd8_1003 - xorg-glproto=1.4.17=hb9d3cd8_1003 - xorg-inputproto=2.3.2=hb9d3cd8_1003 - xorg-kbproto=1.0.7=hb9d3cd8_1003 - xorg-libice=1.1.2=hb9d3cd8_0 - xorg-libsm=1.2.6=he73a12e_0 - xorg-libx11=1.8.9=h8ee46fc_0 - xorg-libxau=1.0.12=hb9d3cd8_0 - xorg-libxdamage=1.1.5=h7f98852_1 - xorg-libxdmcp=1.1.5=hb9d3cd8_0 - xorg-libxext=1.3.4=h0b41bf4_2 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h4bc722e_1 - xorg-libxmu=1.1.3=h4ab18f5_1 - xorg-libxrandr=1.5.2=h7f98852_1 - xorg-libxrender=0.9.11=hd590300_0 - xorg-libxt=1.3.0=hd590300_1 - xorg-randrproto=1.5.0=hb9d3cd8_1002 - xorg-renderproto=0.11.1=hb9d3cd8_1003 - xorg-util-macros=1.20.2=hb9d3cd8_0 - xorg-xextproto=7.3.0=hb9d3cd8_1004 - xorg-xf86vidmodeproto=2.3.1=hb9d3cd8_1005 - xorg-xproto=7.0.31=hb9d3cd8_1008 - xz=5.8.1=hbcc6ac9_0 - xz-gpl-tools=5.8.1=hbcc6ac9_0 - xz-tools=5.8.1=hb9d3cd8_0 - yaml=0.2.5=h7f98852_2 - yarl=1.20.0=py311h2dc5d0c_0 - zlib=1.3.1=hb9d3cd8_2 - zstd=1.5.7=hb8e6e7a_2 ================================================ FILE: conda/asp_3.5.0_osx_x64_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - https://repo.anaconda.com/pkgs/main - https://repo.anaconda.com/pkgs/r dependencies: - affine=2.4.0=pyhd8ed1ab_1 - aiohappyeyeballs=2.6.1=pyhd8ed1ab_0 - aiohttp=3.11.18=py310h8e2f543_0 - aiosignal=1.3.2=pyhd8ed1ab_0 - ale=0.10.0=py310hf166250_3 - aom=3.7.1=h93d8f39_0 - armadillo=14.0.2=hae35012_0 - arpack=3.9.1=nompi_hdfe9103_102 - async-timeout=5.0.1=pyhd8ed1ab_1 - atk-1.0=2.38.0=h1d18e73_1 - attrs=25.3.0=pyh71513ae_0 - aws-c-auth=0.7.4=hbe6ead2_2 - aws-c-cal=0.6.2=hfc10710_2 - aws-c-common=0.9.3=h0dc2134_0 - aws-c-compression=0.2.17=hd41bdd4_3 - aws-c-event-stream=0.3.2=he52df9d_2 - aws-c-http=0.7.13=hb43ddd7_2 - aws-c-io=0.13.33=h2566903_0 - aws-c-mqtt=0.9.7=h6b10715_0 - aws-c-s3=0.3.17=h5800b94_4 - aws-c-sdkutils=0.1.12=hd41bdd4_2 - aws-checksums=0.1.17=hd41bdd4_2 - aws-crt-cpp=0.24.2=hf47b73b_2 - aws-sdk-cpp=1.10.57=h98cd3c2_24 - blas=2.131=openblas - blas-devel=3.9.0=31_hbf4f893_openblas - blosc=1.21.6=h7d75f6d_0 - boost=1.78.0=py310h92ebccd_5 - boost-cpp=1.78.0=hf5ba120_3 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=hfdf4475_7 - c-ares=1.34.5=hf13058a_0 - ca-certificates=2025.4.26=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - cairo=1.16.0=h09dd18c_1016 - ceres-solver=2.2.0=haa0d064_2 - certifi=2025.1.31=pyhd8ed1ab_0 - cfitsio=4.3.0=h66f91ea_0 - clang=16.0.6=default_h420b035_14 - clang-16=16.0.6=default_he1224e2_14 - clangxx=16.0.6=default_h2725d3a_14 - cmake=3.27.9=hc7ee4c4_0 - csm=3.0.3.3=h3718637_1 - cspice=67=h6e16a3a_8 - curl=8.4.0=h726d00d_0 - dav1d=1.2.1=h0dc2134_0 - double-conversion=3.3.1=h240833e_0 - eigen=3.4.0=h1c7c39f_0 - embree=3.13.0=hb7b477c_1 - expat=2.5.0=hf0c8a7f_1 - ffmpeg=6.1.0=gpl_h9a4e613_101 - fftw=3.3.10=nompi_h292e606_110 - fgr=asp3.5.0=1 - flann=1.9.1=hebd20f1_1013 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=h77eed37_3 - fontconfig=2.14.2=h5bb23bf_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freetype=2.13.3=h694c41f_1 - freexl=1.0.6=hb7f2c08_1 - fribidi=1.0.10=hbcb3906_0 - frozenlist=1.5.0=py310h8e2f543_1 - gdk-pixbuf=2.42.10=hff535ac_2 - geoid=asp3.5.0=6 - geos=3.12.0=he965462_0 - geotiff=1.7.1=h5cf5d3c_11 - gettext=0.23.1=hd385c8e_0 - gettext-tools=0.23.1=h27064b9_0 - gflags=2.2.2=hac325c4_1005 - giflib=5.2.2=h10d778d_0 - gl2ps=1.4.2=hd82a5f3_1 - glew=2.1.0=h046ec9c_2 - glib=2.78.1=hf4d7fad_0 - glib-tools=2.78.1=hf4d7fad_0 - glog=0.7.1=h2790a97_0 - gmp=6.3.0=hf036a51_2 - gnutls=3.7.9=h1951705_0 - graphite2=1.3.13=h73e2aa4_1003 - graphviz=8.1.0=hc7f41f9_0 - greenlet=3.2.1=py310h6954a95_0 - gsl=2.6=h71c5fe9_2 - gst-plugins-base=1.22.7=hd283e88_0 - gstreamer=1.22.7=h8954545_0 - gtk2=2.24.33=h7c1209e_2 - gts=0.7.6=h53e17e3_4 - h5py=3.9.0=nompi_py310h164cd36_101 - harfbuzz=7.3.0=h413ba03_0 - hdf4=4.2.15=h9804679_6 - hdf5=1.14.1=nompi_hedada53_100 - icu=72.1=h7336db1_0 - idna=3.10=pyhd8ed1ab_1 - ilmbase=2.5.5=h01edc0c_1 - inja=3.3.0=he49afe7_0 - isis=8.3.0=0 - jama=125=0 - jasper=4.0.0=h794afb9_1 - jinja2=3.1.6=pyhd8ed1ab_0 - json-c=0.17=h6253ea5_1 - jsoncpp=1.9.5=h940c156_1 - kakadu=1=0 - kalasiris=1.11.0=pyhd8ed1ab_1 - kealib=1.5.1=h7014c1b_4 - krb5=1.21.2=hb884880_0 - lame=3.100=hb7f2c08_1003 - lcms2=2.15=h2dcdeff_1 - lerc=4.0.0=hcca01a6_1 - libabseil=20230125.3=cxx17_h000cb23_0 - libaec=1.1.3=h73e2aa4_0 - libarchive=3.6.2=h0b5dc4a_1 - libasprintf=0.23.1=h27064b9_0 - libasprintf-devel=0.23.1=h27064b9_0 - libass=0.17.1=h66d2fa1_0 - libblas=3.9.0=31_h7f60823_openblas - libcblas=3.9.0=31_hff6cab4_openblas - libclang=15.0.7=default_h7151d67_5 - libclang-cpp16=16.0.6=default_he1224e2_14 - libclang13=15.0.7=default_h0edc4dd_5 - libcurl=8.4.0=h726d00d_0 - libcxx=20.1.3=hf95d169_0 - libcxx-devel=16.0.6=h8f8a49f_2 - libdeflate=1.18=hac1461d_0 - libedit=3.1.20250104=pl5321ha958ccf_0 - libelas=asp3.5.0=h01edc0c_0 - libev=4.33=h10d778d_2 - libexpat=2.5.0=hf0c8a7f_1 - libffi=3.4.6=h281671d_1 - libfreetype=2.13.3=h694c41f_1 - libfreetype6=2.13.3=h40dfd5c_1 - libgd=2.3.3=h3d994df_6 - libgdal=3.7.1=h4103fcf_6 - libgettextpo=0.23.1=h27064b9_0 - libgettextpo-devel=0.23.1=h27064b9_0 - libgfortran=14.2.0=hef36b68_105 - libgfortran5=14.2.0=h58528f3_105 - libglib=2.78.1=h6d9ecee_0 - libhwloc=2.9.3=default_h24e0189_1009 - libiconv=1.18=h4b5e92a_1 - libidn2=2.3.8=he8ff88c_0 - libintl=0.23.1=h27064b9_0 - libintl-devel=0.23.1=h27064b9_0 - libjemalloc=5.3.0=hac325c4_1 - libjpeg-turbo=2.1.5.1=h0dc2134_1 - libkml=1.3.0=hab3ca0e_1016 - liblapack=3.9.0=31_h236ab99_openblas - liblapacke=3.9.0=31_h85686d2_openblas - libllvm15=15.0.7=he4b1e75_3 - libllvm16=16.0.6=he4b1e75_2 - libltdl=2.4.3a=h240833e_0 - liblzma=5.8.1=hd471939_0 - liblzma-devel=5.8.1=hd471939_0 - libnabo=asp3.5.0=h01edc0c_1 - libnetcdf=4.9.2=nompi_hb79a6a3_109 - libnghttp2=1.58.0=h64cf6d3_0 - libogg=1.3.5=hfdf4475_0 - libopenblas=0.3.29=openmp_hbf64a52_0 - libopencv=4.7.0=py310h12e1fec_6 - libopus=1.5.2=he3325bb_0 - libpng=1.6.47=h3c4a55f_0 - libpointmatcher=asp3.5.0=ha5a8b8e_1 - libpq=15.4=h3df487d_2 - libprotobuf=4.23.3=h5feb325_1 - librsvg=2.56.3=hec3db73_0 - librttopo=1.1.0=h23f359d_14 - libspatialite=5.0.1=h8e1b34b_28 - libsqlite=3.49.1=hdb6dae5_2 - libssh2=1.11.0=hd019ec5_0 - libtasn1=4.20.0=h6e16a3a_0 - libtheora=1.1.1=hfdf4475_1006 - libtiff=4.5.1=hf955e92_1 - libtool=2.5.4=h240833e_0 - libunistring=0.9.10=h0d85af4_0 - libuv=1.50.0=h4cb831e_0 - libvorbis=1.3.7=h046ec9c_0 - libvpx=1.13.1=he965462_0 - libwebp=1.3.1=hc961f54_0 - libwebp-base=1.3.1=h0dc2134_0 - libxcb=1.15=hb7f2c08_0 - libxml2=2.11.5=hd95e348_0 - libzip=1.10.1=hc158999_3 - libzlib=1.3.1=hd23fc13_2 - llvm-openmp=20.1.3=ha54dae1_0 - loguru=0.7.2=py310h2ec42d9_2 - lz4-c=1.9.4=hf0c8a7f_0 - lzo=2.10=h10d778d_1001 - markupsafe=3.0.2=py310h8e2f543_1 - mesalib=24.0.2=hbd9e708_1 - metis=5.1.0=h3023b02_1007 - mpfr=4.2.1=haed47dc_3 - msgpack-python=1.1.0=py310hfa8da69_0 - multidict=6.4.3=py310hf0d9222_0 - multiview=asp_3.5.0=py310_0 - mysql=5.7.20=h0a44026_1001 - mysql-common=8.0.33=h1d20c9b_6 - mysql-connector-c=6.1.11=h89ed7f3_1008 - mysql-libs=8.0.33=hed35180_6 - nanoflann=1.6.1=h429ed02_0 - ncurses=6.5=h0622a9a_3 - nettle=3.9.1=h8e11ae5_0 - networkx=3.4.2=pyh267e887_2 - nlohmann_json=3.11.3=hf036a51_1 - nn=1.86.0=h0dc2134_2003 - nspr=4.36=h97d8b74_0 - nss=3.110=h32a8879_0 - numpy=1.26.4=py310h4bfa8fc_0 - openblas=0.3.29=openmp_h30af337_0 - opencv=4.7.0=py310h2ec42d9_6 - openexr=2.5.5=ha5a8b8e_0 - openh264=2.3.1=hf0c8a7f_2 - openjpeg=2.5.0=h13ac156_2 - openssl=3.1.8=hc426f3f_0 - p11-kit=0.24.1=h65f8906_0 - pandas=2.2.3=py310h96a9d13_3 - pango=1.50.14=hbce5e75_1 - parallel=20250422=h694c41f_0 - pbzip2=1.1.13=h92b232e_2 - pcl=1.13.1=h3e6cc95_1 - pcre2=10.40=h1c4e4bc_0 - pdal=2.6.0_asp3.5.0=py310hfc30dc6_0 - perl=5.32.1=7_h10d778d_perl5 - pip=25.0.1=pyh8b19718_0 - pixman=0.44.2=h1fd1274_0 - plio=1.6.0=pyh12aca89_0 - poppler=23.08.0=he041c3a_0 - poppler-data=0.4.12=hd8ed1ab_0 - postgresql=15.4=hc940a54_2 - proj=9.2.1=hc8d59c9_0 - propcache=0.3.1=py310h8e2f543_0 - protobuf=4.23.3=py310h4e8a696_0 - pthread-stubs=0.4=h00291cd_1002 - pugixml=1.13=he965462_1 - pvl=1.3.2=pyhd8ed1ab_1 - py-opencv=4.7.0=py310ha188af9_6 - pyproj=3.6.1=py310hfcc5317_0 - python=3.10.13=h00d2728_0_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.10=7_cp310 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.2=py310h8e2f543_2 - qhull=2020.2=h3c5361c_5 - qt-main=5.15.8=heb9da5c_15 - qwt=6.2.0=hed3eaa1_6 - rapidjson=1.1.0.post20240409=h92383a6_2 - rclone=1.69.1=hdbe1cec_0 - readline=8.2=h7cca4af_2 - rhash=1.4.5=ha44c9a9_0 - rocksdb=8.5.3=hcf0db61_1 - s2p-subset=asp3.5.0=h01edc0c_0 - scipy=1.15.2=py310hef62574_0 - setuptools=79.0.0=pyhff2d567_0 - six=1.17.0=pyhd8ed1ab_0 - snappy=1.2.1=haf3c120_1 - spiceypy=6.0.0=pyhd8ed1ab_2 - sqlalchemy=2.0.40=py310hbb8c376_0 - sqlite=3.49.1=h2e4c9dc_2 - stereo-pipeline=3.5.0=2 - suitesparse=5.10.1=h4bf45ed_3 - superlu=5.2.2=h1f0f902_0 - svt-av1=1.7.0=he965462_0 - tbb=2021.11.0=h7728843_1 - tbb-devel=2021.11.0=ha56d2d7_1 - tiledb=2.16.3=h9b026fb_3 - tk=8.6.13=h1abcd95_1 - tnt=126=0 - typing-extensions=4.13.2=h0e9735f_0 - typing_extensions=4.13.2=pyh29332c3_0 - tzcode=2025b=h6e16a3a_0 - tzdata=2025b=h78e105d_0 - uriparser=0.9.8=h6aefe2f_0 - usgscsm=2.0.2=h9275861_3 - utfcpp=4.0.6=h93fb1c9_0 - visionworkbench=asp3.5.0=2 - vlfeat=0.9.21=h0dc2134_1 - vtk=9.2.6=qt_py310h1234567_210 - vtk-base=9.2.6=qt_py310h1234567_210 - vtk-io-ffmpeg=9.2.6=qt_py310h1234567_210 - wheel=0.45.1=pyhd8ed1ab_1 - wslink=2.3.3=pyhd8ed1ab_0 - x264=1!164.3095=h775f41a_2 - x265=3.5=hbb4e6a2_3 - xerces-c=3.2.4=h90c7484_2 - xorg-damageproto=1.2.1=h00291cd_1003 - xorg-fixesproto=5.0=h00291cd_1003 - xorg-glproto=1.4.17=h00291cd_1003 - xorg-inputproto=2.3.2=h00291cd_1003 - xorg-kbproto=1.0.7=h00291cd_1003 - xorg-libice=1.1.2=h6e16a3a_0 - xorg-libsm=1.2.6=h6e16a3a_0 - xorg-libx11=1.8.9=hc955faf_0 - xorg-libxau=1.0.12=h6e16a3a_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.5=h00291cd_0 - xorg-libxext=1.3.4=hb7f2c08_2 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=hfdf4475_1 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.11=h0dc2134_0 - xorg-randrproto=1.5.0=h00291cd_1002 - xorg-renderproto=0.11.1=h00291cd_1003 - xorg-util-macros=1.20.2=h6e16a3a_0 - xorg-xextproto=7.3.0=h00291cd_1004 - xorg-xf86vidmodeproto=2.3.1=h00291cd_1005 - xorg-xproto=7.0.31=h00291cd_1008 - xz=5.8.1=h357f2ed_0 - xz-gpl-tools=5.8.1=h357f2ed_0 - xz-tools=5.8.1=hd471939_0 - yaml=0.2.5=h0d85af4_2 - yarl=1.20.0=py310h8e2f543_0 - zlib=1.3.1=hd23fc13_2 - zstd=1.5.7=h8210216_2 ================================================ FILE: conda/asp_deps_2.7.0_linux_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=0_gnu - _sysroot_linux-64_curr_repodata_hack=3=ha9d2b57_10 - alabaster=0.7.12=py_0 - ale=0.7.2=py36h9e03d57_1 - anaconda-client=1.7.2=py_0 - armadillo=9.200.7=hf4e8f56_0 - arpack=3.7.0=hc6cf775_1 - asn1crypto=1.4.0=pyh9f0ad1d_0 - attrs=20.2.0=pyh9f0ad1d_0 - babel=2.8.0=py_0 - beautifulsoup4=4.9.2=py_0 - binutils_impl_linux-64=2.35=h18a2f87_9 - binutils_linux-64=2.35=heab0d09_28 - blas=1.1=openblas - boost=1.68.0=py36h8619c78_1001 - boost-cpp=1.68.0=h11c811c_1000 - brotlipy=0.7.0=py36h8c4c3a4_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h516909a_2 - ca-certificates=2020.6.20=hecda079_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=h0948850_10 - certifi=2020.6.20=py36h9f0ad1d_0 - cffi=1.14.3=py36h0ff685e_0 - chardet=3.0.4=py36h9f0ad1d_1007 - chrpath=0.16=h14c3975_1001 - click=7.1.2=pyh9f0ad1d_0 - clyent=1.2.2=py_1 - cmake=3.16.0=hf94ab9c_0 - conda=4.8.3=py36h9f0ad1d_1 - conda-build=3.19.2=py36h9f0ad1d_2 - conda-package-handling=1.7.0=py36h8c4c3a4_5 - conda-verify=3.1.1=py36h9f0ad1d_1001 - cryptography=2.5=py36hb7f436b_1 - csm=v3.0.3.1=h6bb024c_1001 - cspice=66=h516909a_1009 - curl=7.64.0=h646f8bb_0 - dbus=1.13.0=h4e0c4b3_1000 - decorator=4.4.2=py_0 - docutils=0.16=py36h9f0ad1d_1 - eigen=3.3.7=hc9558a2_1001 - embree=2.16.0=0 - expat=2.2.9=he1b5a44_2 - ffmpeg=3.4.1=0 - fgr=e78ce15=hf484d3e_0 - filelock=3.0.12=pyh9f0ad1d_0 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - future=0.18.2=py36h9f0ad1d_1 - gcc_impl_linux-64=7.5.0=hdb87b24_16 - gcc_linux-64=7.5.0=hf34d7eb_28 - gdal=2.0.2=hf484d3e_0 - geoid=1.0=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.4.2=hb54a4aa_1 - gettext=0.19.8.1=hc5be6a0_1002 - gflags=2.2.2=he1b5a44_1002 - gfortran_impl_linux-64=7.5.0=h1104b78_16 - gfortran_linux-64=7.5.0=ha781d05_28 - giflib=5.2.1=h516909a_2 - git=2.20.1=pl526hc122a05_1001 - glib=2.51.4=0 - glob2=0.7=py_0 - glog=0.4.0=h49b9bf7_3 - gmm=5.0=0 - gmp=6.2.0=he1b5a44_2 - gsl=2.6=h294904e_0 - gst-plugins-base=1.8.0=0 - gstreamer=1.8.0=2 - gxx_impl_linux-64=7.5.0=h1104b78_16 - gxx_linux-64=7.5.0=ha781d05_28 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=hf484d3e_1000 - idna=2.10=pyh9f0ad1d_0 - ilmbase=2.5.2=h8b12597_0 - imagemagick=6.8.6_10=hf484d3e_0 - imagesize=1.2.0=py_0 - importlib-metadata=2.0.0=py36h9f0ad1d_0 - importlib_metadata=2.0.0=0 - ipython_genutils=0.2.0=py_1 - isis=4.1.0=0 - isis-headers=4.1.0=1000 - jama=125=0 - jasper=1.900.1=4 - jinja2=2.11.2=pyh9f0ad1d_0 - jpeg=9b=h024ee3a_2 - jsonschema=3.2.0=py36h9f0ad1d_1 - jupyter_core=4.6.3=py36h9f0ad1d_1 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h77966d4_10 - krb5=1.16.3=hc83ff2d_1000 - laszip=2.1.0=hf484d3e_1 - latexcodec=2.0.1=pyh9f0ad1d_0 - ld_impl_linux-64=2.35=h769bd43_9 - libarchive=3.3.3=ha149a29_1000 - libblas=3.8.0=11_openblas - libcblas=3.8.0=11_openblas - libcurl=7.64.0=h01ee5af_0 - libedit=3.1.20191231=h46ee950_0 - libffi=3.2.1=he1b5a44_1007 - libgcc=7.2.0=h69d50b8_2 - libgcc-devel_linux-64=7.5.0=h42c25f5_16 - libgcc-ng=9.2.0=h24d8f2e_2 - libgfortran=3.0.0=1 - libgfortran-ng=7.5.0 - libglvnd-cos7-x86_64=1.0.1=h9d98e8f_1104 - libglvnd-glx-cos7-x86_64=1.0.1=h9d98e8f_1104 - libgomp=9.2.0=h24d8f2e_2 - libiconv=1.15=h516909a_1006 - liblapack=3.8.0=11_openblas - liblas=1.8.1=hf484d3e_1000 - liblief=0.10.1=he1b5a44_1 - libnabo=2df86e0=hf484d3e_0 - libopenblas=0.3.6=h5a2b251_2 - libpng=1.6.37=hed695b0_1 - libpointmatcher=bcf4b04=hf484d3e_0 - libpq=10.6=h13b8bad_1000 - libprotobuf=3.9.1=h8b12597_0 - libssh2=1.8.0=h1ad7b7a_1003 - libstdcxx-devel_linux-64=7.5.0=h4084dd6_16 - libstdcxx-ng=9.2.0=hdf63c60_2 - libtiff=4.0.9=he6b73bb_1 - libuuid=2.32.1=h14c3975_1000 - libuv=1.40.0=h516909a_0 - libwebp=0.5.2=7 - libxcb=1.13=h14c3975_1002 - libxml2=2.9.9=h13577e0_2 - llvm-openmp=8.0.1=hc9558a2_0 - markupsafe=1.1.1=py36h8c4c3a4_1 - mesalib=18.3.1=h590aaf7_0 - metis=5.1.0=he1b5a44_1005 - mysql=5.7.20=hf484d3e_1001 - mysql-connector-c=6.1.11=hab6429c_1002 - nanoflann=1.3.1=0 - nbformat=5.0.7=py_0 - ncurses=6.1=hf484d3e_1002 - networkx=2.4=py_1 - nlohmann_json=3.7.3=he1b5a44_1 - nn=1.86.0=h14c3975_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.2=he513fc3_0 - openjpeg=2.1.0=6 - openmp=8.0.1=0 - openssl=1.0.2u=h516909a_0 - oset=0.1.3=py_1 - packaging=20.4=pyh9f0ad1d_0 - parallel=20200522=0 - patchelf=0.11=he1b5a44_0 - pbzip2=1.1.13=0 - pcl=1.9.1=h482114b_1002 - pcre=8.44=he1b5a44_0 - perl=5.26.2=h516909a_1006 - pip=20.1.1=py_1 - pixman=0.34.0=h14c3975_1003 - pkginfo=1.5.0.1=py_0 - postgresql=10.6=h66cca7a_1000 - proj4=4.9.3=h516909a_9 - protobuf=3.9.1=py36he1b5a44_0 - psutil=5.7.2=py36h8c4c3a4_0 - pthread-stubs=0.4=h14c3975_1001 - pvl=0.3.0=py_1 - py-lief=0.10.1=py36h831f99a_1 - pybtex=0.22.2=py36h9f0ad1d_1 - pybtex-docutils=0.2.2=py36h9f0ad1d_1 - pycosat=0.6.3=py36h8c4c3a4_1004 - pycparser=2.20=pyh9f0ad1d_2 - pygments=2.7.1=py_0 - pyopenssl=19.0.0=py36_0 - pyparsing=2.4.7=pyh9f0ad1d_0 - pyrsistent=0.17.3=py36h8c4c3a4_0 - pysocks=1.7.1=py36h9f0ad1d_1 - python=3.6.7=hd21baee_1002 - python-dateutil=2.8.1=py_0 - python-libarchive-c=2.9=py36h9f0ad1d_1 - python_abi=3.6=1_cp36m - pytz=2020.1=pyh9f0ad1d_0 - pyyaml=5.3.1=py36h8c4c3a4_0 - qhull=7.2.0=0 - qt=5.9.6=0 - qwt=6.1.3=0 - readline=7.0=hf8c457e_1001 - requests=2.24.0=pyh9f0ad1d_0 - rhash=1.3.6=h14c3975_1001 - ripgrep=12.1.1=h516909a_0 - ruamel_yaml=0.15.80=py36h8c4c3a4_1002 - scipy=1.2.1=py36h09a28d5_1 - setuptools=47.3.1=py36h9f0ad1d_0 - six=1.15.0=pyh9f0ad1d_0 - snowballstemmer=2.0.0=py_0 - soupsieve=2.0.1=py_1 - sphinx=3.1.1=py_0 - sphinxcontrib-applehelp=1.0.2=py_0 - sphinxcontrib-bibtex=1.0.0=py_0 - sphinxcontrib-devhelp=1.0.2=py_0 - sphinxcontrib-htmlhelp=1.0.3=py_0 - sphinxcontrib-jsmath=1.0.1=py_0 - sphinxcontrib-qthelp=1.0.3=py_0 - sphinxcontrib-serializinghtml=1.1.4=py_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h8b20d00_0 - suitesparse=5.7.2=h717dc36_0 - superlu=5.2.1=hfe2efc7_1207 - sysroot_linux-64=2.17=h77966d4_10 - tbb=2020.1=hc9558a2_0 - theia=f5d93f5=hf484d3e_1001 - tk=8.6.10=hed695b0_0 - tnt=126=0 - tqdm=4.50.0=pyh9f0ad1d_0 - traitlets=4.3.3=py36h9f0ad1d_1 - tzcode=2020a=h516909a_0 - urllib3=1.25.10=py_0 - usgscsm=a53f9cf=h6bb024c_0 - wheel=0.34.2=py_1 - x264=20131218=0 - xerces-c=3.1.4=0 - xorg-fixesproto=5.0=h14c3975_1002 - xorg-inputproto=2.3.2=h14c3975_1002 - xorg-kbproto=1.0.7=h14c3975_1002 - xorg-libice=1.0.10=h516909a_0 - xorg-libsm=1.2.3=h84519dc_1000 - xorg-libx11=1.6.9=h516909a_0 - xorg-libxau=1.0.9=h14c3975_0 - xorg-libxdmcp=1.1.3=h516909a_0 - xorg-libxext=1.3.4=h516909a_0 - xorg-libxfixes=5.0.3=h516909a_1004 - xorg-libxi=1.7.10=h516909a_0 - xorg-libxrender=0.9.10=h516909a_1002 - xorg-renderproto=0.11.1=h14c3975_1002 - xorg-xextproto=7.3.0=h14c3975_1002 - xorg-xproto=7.0.31=h14c3975_1007 - xz=5.2.5=h516909a_0 - yaml=0.2.5=h516909a_0 - zipp=3.2.0=py_0 - zlib=1.2.11=h516909a_1006 ================================================ FILE: conda/asp_deps_2.7.0_osx_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - alabaster=0.7.12=py_0 - ale=0.7.2=py36h855b5bd_1 - anaconda-client=1.7.2=py_0 - armadillo=9.200.4=hcb88e47_1205 - arpack=3.6.3=h06d5271_1005 - asn1crypto=1.3.0=py36h9f0ad1d_1 - attrs=19.3.0=py_0 - babel=2.8.0=py_0 - beautifulsoup4=4.9.1=py36h9f0ad1d_0 - blas=1.1=openblas - boost=1.68.0=py36h9888f84_1001 - boost-cpp=1.68.0=h6f8c590_1000 - brotlipy=0.7.0=py36h37b9a7d_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0b31af3_2 - ca-certificates=2020.6.20=hecda079_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=hb9d6bad_10 - certifi=2020.6.20=py36h9f0ad1d_0 - cffi=1.14.0=py36h356ff06_0 - chardet=3.0.4=py36h9f0ad1d_1006 - click=7.1.2=pyh9f0ad1d_0 - clyent=1.2.2=py_1 - cmake=3.14.5=hdd2e4aa_0 - conda=4.8.3=py36h9f0ad1d_1 - conda-build=3.19.2=py36h9f0ad1d_2 - conda-package-handling=1.6.0=py36h37b9a7d_2 - conda-verify=3.1.1=py36h9f0ad1d_1001 - cryptography=1.8.1=py36_0 - csm=v3.0.3.1=1001 - cspice=66=h0b31af3_1007 - curl=7.64.0=heae2a1f_0 - decorator=4.4.2=py_0 - docutils=0.16=py36h9f0ad1d_1 - eigen=3.3.7=ha1b3eb9_1001 - embree=2.16.0=h6834224_0 - expat=2.2.9=h4a8c4bd_2 - ffmpeg=3.4.1=0 - fgr=e78ce15=h0a44026_0 - filelock=3.0.12=pyh9f0ad1d_0 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - future=0.18.2=py36h9f0ad1d_1 - gdal=2.0.2=h0a44026_0 - geoid=1.0=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.4.2=hb54a4aa_1 - gettext=0.19.8.1=h46ab8bc_1002 - gflags=2.2.2=h4a8c4bd_1002 - giflib=5.2.1=h0b31af3_2 - git=2.11.1=0 - glib=2.51.4=0 - glob2=0.7=py_0 - glog=0.4.0=h700f914_3 - gmm=5.0=h6aef312_0 - gmp=6.2.0=h4a8c4bd_2 - gsl=2.6=ha2d443c_0 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=h0a44026_1000 - idna=2.9=py_1 - ilmbase=2.5.2=hd174df1_0 - imagemagick=6.8.6_10=h0a44026_0 - imagesize=1.2.0=py_0 - importlib-metadata=1.6.1=py36h9f0ad1d_0 - importlib_metadata=1.6.1=0 - ipython_genutils=0.2.0=py_1 - isis=4.1.0=0 - isis-headers=4.1.0=1000 - jama=125=0 - jasper=1.900.1=4 - jinja2=2.11.2=pyh9f0ad1d_0 - jpeg=9b=he5867d9_2 - jsonschema=3.2.0=py36h9f0ad1d_1 - jupyter_core=4.6.3=py36h9f0ad1d_1 - kakadu=1=0 - krb5=1.16.3=h24a3359_1000 - laszip=2.1.0=h0a44026_1 - latexcodec=2.0.1=pyh9f0ad1d_0 - libarchive=3.3.3=hb60c381_1000 - libblas=3.8.0=11_openblas - libcblas=3.8.0=11_openblas - libcurl=7.64.0=h76de61e_0 - libcxx=10.0.0=1 - libedit=3.1.20191231=hed1e85f_0 - libffi=3.2.1=h4a8c4bd_1007 - libgcc=4.8.5=hdbeacc1_10 - libgfortran=3.0.1=0 - libiconv=1.15=h0b31af3_1006 - liblapack=3.8.0=11_openblas - liblas=1.8.1=h0a44026_1000 - liblief=0.9.0=h3e78482_1 - libnabo=2df86e0=h0a44026_0 - libopenblas=0.3.6=hdc02c5d_2 - libpng=1.6.37=hbbe82c9_1 - libpointmatcher=bcf4b04=h0a44026_0 - libpq=10.6=hbe1e24e_1000 - libprotobuf=3.9.1=hfbae3c0_0 - libssh2=1.8.0=hf30b1f0_1003 - libtiff=4.0.9=he6b73bb_1 - libuv=1.38.0=h0b31af3_0 - libwebp=0.5.2=7 - libxcb=1.13=h1de35cc_1002 - libxml2=2.9.9=hd80cff7_2 - llvm-openmp=10.0.0=h28b9765_0 - markupsafe=1.1.1=py36h37b9a7d_1 - mesalib=18.0.0=hb6cfc13_1 - metis=5.1.0=h4a8c4bd_1005 - mysql=5.7.20=h0a44026_1001 - mysql-connector-c=6.1.11=had4e77e_1002 - nanoflann=1.3.1=0 - nbformat=5.0.6=py_0 - ncurses=6.1=h0a44026_1002 - networkx=2.4=py_1 - nlohmann_json=3.7.3=h4a8c4bd_1 - nn=1.86.0=h1de35cc_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.2=h7475705_0 - openjpeg=2.1.0=6 - openssl=1.0.2u=h0b31af3_0 - oset=0.1.3=py_1 - packaging=20.4=pyh9f0ad1d_0 - parallel=20200522=0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.9.1=hdd77166_1002 - pcre=8.44=h4a8c4bd_0 - perl=5.26.2=haec8ef5_1006 - pip=20.1.1=py36_1 - pixman=0.34.0=h1de35cc_1003 - pkginfo=1.5.0.1=py_0 - postgresql=10.6=ha1bbaa7_1000 - proj4=4.9.3=h01d97ff_9 - protobuf=3.9.1=py36h6de7cb9_0 - psutil=5.7.0=py36h37b9a7d_1 - pthread-stubs=0.4=h1de35cc_1001 - pvl=0.3.0=py_1 - py-lief=0.9.0=py36h0ceac7d_1 - pybtex=0.22.2=py36h9f0ad1d_1 - pybtex-docutils=0.2.2=py36h9f0ad1d_1 - pycosat=0.6.3=py36h37b9a7d_1004 - pycparser=2.20=py_0 - pygments=2.6.1=py_0 - pyopenssl=17.0.0=py36_0 - pyparsing=2.4.7=pyh9f0ad1d_0 - pyrsistent=0.16.0=py36h37b9a7d_0 - pysocks=1.7.1=py36h9f0ad1d_1 - python=3.6.7=h4a56312_1002 - python-dateutil=2.8.1=py_0 - python-libarchive-c=2.9=py36_0 - python_abi=3.6=1_cp36m - pytz=2020.1=pyh9f0ad1d_0 - pyyaml=5.3.1=py36h37b9a7d_0 - qhull=7.2.0=0 - qt=5.9.6=0 - qwt=6.1.3=0 - readline=7.0=hcfe32e1_1001 - requests=2.24.0=pyh9f0ad1d_0 - rhash=1.3.6=h1de35cc_1001 - ripgrep=12.1.1=h0b31af3_0 - ruamel_yaml=0.15.80=py36h37b9a7d_1001 - scipy=1.2.1=py36hbd7caa9_1 - setuptools=47.3.1=py36_0 - six=1.15.0=pyh9f0ad1d_0 - snowballstemmer=2.0.0=py_0 - soupsieve=2.0.1=py36h9f0ad1d_0 - sphinx=3.1.1=py_0 - sphinxcontrib-applehelp=1.0.2=py_0 - sphinxcontrib-bibtex=1.0.0=py_0 - sphinxcontrib-devhelp=1.0.2=py_0 - sphinxcontrib-htmlhelp=1.0.3=py_0 - sphinxcontrib-jsmath=1.0.1=py_0 - sphinxcontrib-qthelp=1.0.3=py_0 - sphinxcontrib-serializinghtml=1.1.4=py_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h9721f7c_0 - suitesparse=5.7.2=h0e59142_0 - superlu=5.2.1=hbced767_1205 - tbb=2019.9=ha1b3eb9_1 - theia=f5d93f5=h0a44026_1001 - tk=8.6.10=hb0a8c7a_0 - tnt=126=0 - tqdm=4.46.1=pyh9f0ad1d_0 - traitlets=4.3.3=py36h9f0ad1d_1 - tzcode=2020a=h0b31af3_0 - urllib3=1.25.9=py_0 - usgscsm=a53f9cf=h04f5b5a_0 - wget=1.18=0 - wheel=0.34.2=py36_0 - x264=20131218=0 - xerces-c=3.1.4=h10f7eb2_0 - xorg-fixesproto=5.0=h1de35cc_1002 - xorg-inputproto=2.3.2=h1de35cc_1002 - xorg-kbproto=1.0.7=h1de35cc_1002 - xorg-libice=1.0.10=h01d97ff_0 - xorg-libsm=1.2.3=h01d97ff_1000 - xorg-libx11=1.6.9=h0b31af3_0 - xorg-libxau=1.0.9=h1de35cc_0 - xorg-libxdmcp=1.1.3=h01d97ff_0 - xorg-libxext=1.3.4=h01d97ff_0 - xorg-libxfixes=5.0.3=h01d97ff_1004 - xorg-libxi=1.7.10=h01d97ff_0 - xorg-xextproto=7.3.0=h1de35cc_1002 - xorg-xproto=7.0.31=h1de35cc_1007 - xz=5.2.5=h1de35cc_0 - yaml=0.2.5=h0b31af3_0 - zipp=3.1.0=py_0 - zlib=1.2.11=h1de35cc_3 ================================================ FILE: conda/asp_deps_3.0.0_linux_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=1_gnu - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_12 - ale=0.8.5=py36h605e78d_3 - armadillo=9.900.5=h7c03176_0 - arpack=3.7.0=hc6cf775_2 - binutils_impl_linux-64=2.35.1=h27ae35d_9 - binutils_linux-64=2.35=h67ddf6f_30 - blas=1.1=openblas - boost=1.68.0=py36h8619c78_1001 - boost-cpp=1.68.0=h11c811c_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - ca-certificates=2021.5.30=ha878542_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=h0948850_10 - certifi=2021.5.30=py36h5fab9bb_0 - chrpath=0.16=h7f98852_1002 - cmake=3.16.0=hf94ab9c_0 - csm=3.0.3.3=hc9558a2_0 - cspice=66=h7f98852_1014 - curl=7.64.0=h646f8bb_0 - dbus=1.13.0=h4e0c4b3_1000 - decorator=5.0.9=pyhd8ed1ab_0 - eigen=3.3.7=hc9558a2_1001 - embree=2.16.0=0 - expat=2.4.1=h9c3ff4c_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_hfc0cae8_1114 - fgr=isis5.0.1 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - gcc_impl_linux-64=7.5.0=habd7529_19 - gcc_linux-64=7.5.0=h47867f9_30 - geoid=1.0=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.4.3=hb6868eb_1001 - gettext=0.19.8.1=hf34092f_1004 - gflags=2.2.2=he1b5a44_1004 - gfortran_impl_linux-64=7.5.0=h56cb351_19 - gfortran_linux-64=7.5.0=h78c8a43_30 - giflib=5.2.1=h36c2ea0_2 - git=2.14.2=2 - glib=2.51.4=0 - glog=0.4.0=h49b9bf7_3 - gmm=5.0=0 - gmp=6.2.1=h58526e2_0 - gsl=2.7=he838d99_0 - gst-plugins-base=1.8.0=0 - gstreamer=1.8.0=2 - gxx_impl_linux-64=7.5.0=hd0bb8aa_19 - gxx_linux-64=7.5.0=h555fc39_30 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=hf484d3e_1000 - ilmbase=2.5.5=h780b84a_0 - imagemagick=isis5.0.1 - inja=3.3.0=h9c3ff4c_0 - isis=5.0.1=0 - jama=125=0 - jasper=1.900.1=h07fcdf6_1006 - jpeg=9d=h36c2ea0_0 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_12 - krb5=1.16.3=hc83ff2d_1000 - laszip=2.1.0=hf484d3e_1 - ld_impl_linux-64=2.35.1=h7274673_9 - libblas=3.8.0=17_openblas - libcblas=3.8.0=17_openblas - libcurl=7.64.0=h01ee5af_0 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis5.0.1 - libffi=3.2.1=he1b5a44_1007 - libgcc=7.2.0=h69d50b8_2 - libgcc-devel_linux-64=7.5.0=hda03d7c_19 - libgcc-ng=11.1.0=hc902ee8_8 - libgdal=2.4.1_isis5.0.1=h3fd9d12_0 - libgfortran=3.0.0=1 - libgfortran-ng=7.5.0=h14aa051_19 - libgfortran4=7.5.0=h14aa051_19 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libgomp=11.1.0=hc902ee8_8 - libiconv=1.15=h516909a_1006 - liblapack=3.8.0=17_openblas - liblas=isis5.0.1 - libnabo=isis5.0.1 - libopenblas=0.3.10=h5a2b251_0 - libpng=1.6.37=h21135ba_2 - libpointmatcher=isis5.0.1 - libpq=10.6=h13b8bad_1000 - libprotobuf=3.9.2=h8b12597_0 - libssh2=1.8.0=h1ad7b7a_1003 - libstdcxx-devel_linux-64=7.5.0=hb016644_19 - libstdcxx-ng=11.1.0=h56837e0_8 - libtiff=4.0.10=hc3755c2_1005 - libuuid=2.32.1=h7f98852_1000 - libuv=1.42.0=h7f98852_0 - libwebp=0.5.2=7 - libxcb=1.13=h7f98852_1003 - libxml2=2.9.9=h13577e0_2 - llvm-openmp=8.0.1=hc9558a2_0 - lz4-c=1.9.3=h9c3ff4c_1 - mesalib=18.3.1=h590aaf7_0 - metis=5.1.0=h58526e2_1006 - mpfr=4.1.0=h9202a9a_1 - mysql=5.7.20=hf484d3e_1001 - mysql-connector-c=6.1.11=hab6429c_1002 - nanoflann=1.3.2=ha770c72_0 - ncurses=6.2=he6710b0_1 - networkx=2.5=py_0 - nlohmann_json=3.10.2=h9c3ff4c_0 - nn=1.86.0=h14c3975_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=hf817b99_0 - openjpeg=2.1.0=6 - openmp=8.0.1=0 - openssl=1.0.2u=h516909a_0 - parallel=20210822=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.9.1=h482114b_1002 - pcre=8.45=h9c3ff4c_0 - perl=5.32.1=0_h7f98852_perl5 - pip=21.0.1=py36h06a4308_0 - pixman=0.34.0=h14c3975_1003 - postgresql=10.6=h66cca7a_1000 - proj4=5.2.0=he1b5a44_1006 - protobuf=3.9.2=py36he1b5a44_1 - pthread-stubs=0.4=h36c2ea0_1001 - pvl=1.2.1=pyhd8ed1ab_0 - python=3.6.7=hd21baee_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2021.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36h8f6f2f9_1 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hf8c457e_1001 - rhash=1.4.1=h7f98852_0 - s2p-subset=isis5.0.1 - scipy=1.2.1=py36h09a28d5_1 - setuptools=52.0.0=py36h06a4308_0 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h8b20d00_0 - suitesparse=5.10.1=hd8046ac_0 - superlu=5.2.2=hfe2efc7_0 - sysroot_linux-64=2.17=h4a8ded7_12 - tbb=2020.2=h4bd325d_4 - theia=isis5.0.1 - tk=8.6.10=hbc83047_0 - tnt=126=0 - tzcode=2021a=h7f98852_2 - usgscsm=1.5.2 - wheel=0.37.0=pyhd3eb1b0_0 - x264=20131218=0 - xerces-c=3.1.4=0 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.0.10=h7f98852_0 - xorg-libsm=1.2.3=hd9c2040_1000 - xorg-libx11=1.7.2=h7f98852_0 - xorg-libxau=1.0.9=h7f98852_0 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h7f98852_1 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-xextproto=7.3.0=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.5=h7b6447c_0 - yaml=0.2.5=h516909a_0 - zlib=1.2.11=h7b6447c_3 - zstd=1.4.9=ha95c52a_0 ================================================ FILE: conda/asp_deps_3.0.0_osx_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.8.5=py36hc61eee1_3 - armadillo=9.200.4=hcb88e47_1205 - arpack=3.6.3=h06d5271_1005 - blas=1.1=openblas - boost=1.68.0=py36h9888f84_1001 - boost-cpp=1.68.0=h6f8c590_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - ca-certificates=2021.5.30=h033912b_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=hb9d6bad_10 - certifi=2021.5.30=py36h79c6626_0 - cmake=3.3.1=0 - csm=3.0.3.3=0 - cspice=66=h0d85af4_1014 - curl=7.64.0=heae2a1f_0 - decorator=5.0.9=pyhd8ed1ab_0 - eigen=3.3.7=h04f5b5a_0 - embree=2.16.0=h6834224_0 - expat=2.4.1=he49afe7_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_h5c49c53_1109 - fgr=isis5.0.1 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - geoid=1.0=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.4.3=h113155d_1001 - gettext=0.19.8.1=h46ab8bc_1002 - gflags=2.2.2=hb1e8313_1004 - giflib=5.2.1=hbcb3906_2 - git=2.11.1=0 - glib=2.51.4=0 - glog=0.4.0=hb7f4fc5_3 - gmm=5.0=h6aef312_0 - gmp=6.2.1=h2e338ed_0 - gsl=2.7=h93259b0_0 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=h0a44026_1000 - ilmbase=2.5.5=hfab91a5_0 - imagemagick=isis5.0.1 - inja=3.2.0=h1c7c35f_0 - isis=5.0.1=0 - jama=125=0 - jasper=1.900.1=h636a363_1006 - jpeg=9d=hbcb3906_0 - kakadu=1=0 - krb5=1.16.3=h24a3359_1000 - laszip=2.1.0=h0a44026_1 - libblas=3.8.0=17_openblas - libcblas=3.8.0=17_openblas - libcurl=7.64.0=h76de61e_0 - libcxx=12.0.1=habf9029_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis5.0.1 - libffi=3.2.1=hb1e8313_1007 - libgcc=4.8.5=hdbeacc1_10 - libgdal=2.4.1_isis5.0.1 - libgfortran=3.0.1=0 - libiconv=1.15=h0b31af3_1006 - liblapack=3.8.0=17_openblas - liblas=isis5.0.1 - libnabo=isis5.0.1 - libopenblas=0.3.10=h0794777_0 - libpng=1.6.37=h7cec526_2 - libpointmatcher=isis5.0.1 - libpq=10.6=hbe1e24e_1000 - libprotobuf=3.9.2=hfbae3c0_0 - libssh2=1.8.0=hf30b1f0_1003 - libtiff=4.0.10=ha78913b_1005 - libwebp=0.5.2=7 - libxcb=1.13=h35c211d_1003 - libxml2=2.9.9=hd80cff7_2 - llvm-openmp=12.0.1=hda6cdc1_0 - lz4-c=1.9.3=h046ec9c_0 - mesalib=18.0.0=hb6cfc13_1 - metis=5.1.0=h2e338ed_1006 - mpfr=4.0.2=h72d8aaf_1 - mysql=5.7.20=h0a44026_1001 - mysql-connector-c=6.1.11=had4e77e_1002 - nanoflann=1.3.2=h694c41f_0 - ncurses=6.2=h2e338ed_4 - networkx=2.5=py_0 - nlohmann_json=3.9.1=he49afe7_1 - nn=1.86.0=h1de35cc_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=h7fa7ffa_0 - openjpeg=2.1.0=6 - openssl=1.0.2u=h0b31af3_0 - parallel=20210622=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.9.1=hdd77166_1002 - pcre=8.45=he49afe7_0 - perl=5.32.1=0_h0d85af4_perl5 - pip=21.1.3=pyhd8ed1ab_0 - pixman=0.34.0=h1de35cc_1003 - postgresql=10.6=ha1bbaa7_1000 - proj4=5.2.0=h6de7cb9_1006 - protobuf=3.9.2=py36h6de7cb9_1 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.2.1=pyhd8ed1ab_0 - python=3.6.7=h4a56312_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2021.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36h20b66c6_0 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hcfe32e1_1001 - s2p-subset=isis5.0.1 - scipy=1.2.1=py36hbd7caa9_1 - setuptools=49.6.0=py36h79c6626_3 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h9721f7c_0 - suitesparse=5.10.1=h68a9093_0 - superlu=5.2.1=hbced767_1205 - tbb=2020.2=h940c156_4 - theia=isis5.0.1 - tk=8.6.10=h0419947_1 - tnt=126=0 - tzcode=2021a=h0d85af4_2 - usgscsm=1.5.2 - wheel=0.36.2=pyhd3deb0d_0 - x264=20131218=0 - xerces-c=3.1.4=h10f7eb2_0 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.0.10=h0d85af4_0 - xorg-libsm=1.2.3=h0d85af4_1000 - xorg-libx11=1.7.2=h0d85af4_0 - xorg-libxau=1.0.9=h35c211d_0 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=h0d85af4_1 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-xextproto=7.3.0=h35c211d_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.5=haf1e3a3_1 - yaml=0.2.5=haf1e3a3_0 - zlib=1.2.11=h7795811_1010 - zstd=1.4.9=h582d3a0_0 ================================================ FILE: conda/asp_deps_3.1.0_linux_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=1_gnu - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13 - ale=0.8.5=py36h605e78d_3 - armadillo=10.8.2=h7c03176_0 - arpack=3.7.0=hc6cf775_2 - binutils_impl_linux-64=2.36.1=h193b22a_2 - binutils_linux-64=2.36=hf3e587d_9 - blas=1.1=openblas - boost=1.68.0=py36h8619c78_1001 - boost-cpp=1.68.0=h11c811c_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - ca-certificates=2021.10.8=ha878542_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=hf302a74_15 - chrpath=0.16=h7f98852_1002 - cmake=3.15.5=hf94ab9c_0 - csm=3.0.3.3=hc9558a2_0 - cspice=66=h7f98852_1015 - curl=7.64.0=h646f8bb_0 - dbus=1.13.0=h4e0c4b3_1000 - decorator=5.1.1=pyhd8ed1ab_0 - eigen=3.4.0=h4bd325d_0 - embree=2.16.0=0 - expat=2.4.8=h27087fc_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_hfc0cae8_1114 - fgr=isis6=h3fd9d12_0 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - gcc_impl_linux-64=11.2.0=h82a94d6_16 - gcc_linux-64=11.2.0=h39a9532_9 - geoid=1.0=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.4.3=hb6868eb_1001 - gettext=0.19.8.1=hf34092f_1004 - gflags=2.2.2=he1b5a44_1004 - giflib=5.2.1=h36c2ea0_2 - glib=2.51.4=0 - glog=0.6.0=h6f12383_0 - gmm=5.0=0 - gmp=6.2.1=h58526e2_0 - gsl=2.7=he838d99_0 - gst-plugins-base=1.8.0=0 - gstreamer=1.8.0=2 - gxx_impl_linux-64=11.2.0=h82a94d6_16 - gxx_linux-64=11.2.0=hacbe6df_9 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=hf484d3e_1000 - ilmbase=2.5.5=h780b84a_0 - imagemagick=isis6=h3fd9d12_0 - imath=3.1.5=h6239696_0 - inja=3.3.0=h9c3ff4c_0 - isis=6.0.0=0 - jama=125=0 - jasper=1.900.1=h07fcdf6_1006 - jpeg=9e=h166bdaf_1 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_13 - krb5=1.16.3=hc83ff2d_1000 - laszip=2.1.0=hf484d3e_1 - ld_impl_linux-64=2.36.1=hea4e1c9_2 - libblas=3.9.0=13_linux64_openblas - libcblas=3.9.0=13_linux64_openblas - libcurl=7.64.0=h01ee5af_0 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis6=h3fd9d12_0 - libffi=3.2.1=he1b5a44_1007 - libgcc=7.2.0=h69d50b8_2 - libgcc-devel_linux-64=11.2.0=h0952999_16 - libgcc-ng=11.2.0=h1d223b6_15 - libgdal=2.4.1_isis6=h3fd9d12_0 - libgfortran=3.0.0=1 - libgfortran-ng=7.5.0=h14aa051_20 - libgfortran4=7.5.0=h14aa051_20 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libgomp=11.2.0=h1d223b6_15 - libiconv=1.15=h516909a_1006 - liblapack=3.9.0=13_linux64_openblas - liblas=isis6=h3fd9d12_1000 - libnabo=isis6=h3fd9d12_0 - libnsl=2.0.0=h7f98852_0 - libopenblas=0.3.18=hf726d26_0 - libpng=1.6.37=h21135ba_2 - libpointmatcher=isis6=h2bc3f7f_0 - libpq=10.6=h13b8bad_1000 - libprotobuf=3.9.2=h8b12597_0 - libsanitizer=11.2.0=he4da1e4_16 - libssh2=1.8.0=h1ad7b7a_1003 - libstdcxx-devel_linux-64=11.2.0=h0952999_16 - libstdcxx-ng=11.2.0=he4da1e4_15 - libtiff=4.0.10=hc3755c2_1005 - libuuid=2.32.1=h7f98852_1000 - libuv=1.43.0=h7f98852_0 - libwebp=0.5.2=7 - libxcb=1.13=h7f98852_1004 - libxml2=2.9.9=h13577e0_2 - libzlib=1.2.11=h166bdaf_1014 - llvm-openmp=8.0.1=hc9558a2_0 - lz4-c=1.9.3=h9c3ff4c_1 - mesalib=18.3.1=h590aaf7_0 - metis=5.1.0=h58526e2_1006 - mpfr=4.1.0=h9202a9a_1 - mysql=5.7.20=hf484d3e_1001 - mysql-connector-c=6.1.11=hab6429c_1002 - nanoflann=1.4.2=ha770c72_0 - ncurses=6.3=h27087fc_1 - networkx=2.5=py_0 - nlohmann_json=3.10.5=h9c3ff4c_0 - nn=1.86.0=h14c3975_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=hf817b99_0 - openjpeg=2.3.0=hf38bd82_1003 - openmp=8.0.1=0 - openssl=1.0.2u=h516909a_0 - parallel=20220222=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.9.1=h482114b_1002 - pcre=8.45=h9c3ff4c_0 - perl=5.32.1=2_h7f98852_perl5 - pip=21.3.1=pyhd8ed1ab_0 - pixman=0.34.0=h14c3975_1003 - postgresql=10.6=h66cca7a_1000 - proj4=5.2.0=he1b5a44_1006 - protobuf=3.9.2=py36he1b5a44_1 - pthread-stubs=0.4=h36c2ea0_1001 - pvl=1.3.1=pyhd8ed1ab_0 - python=3.6.7=hd21baee_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2022.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36h8f6f2f9_1 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hf8c457e_1001 - rhash=1.4.1=h7f98852_0 - s2p-subset=isis6=h3fd9d12_0 - scipy=1.2.1=py36h09a28d5_1 - setuptools=58.0.4=py36h5fab9bb_2 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h8b20d00_0 - suitesparse=5.10.1=h9e50725_1 - superlu=5.2.2=hfe2efc7_0 - sysroot_linux-64=2.17=h4a8ded7_13 - tbb=2021.5.0=h924138e_1 - theia=isis6=h3fd9d12_1001 - tk=8.6.12=h27826a3_0 - tnt=126=0 - tzcode=2022a=h166bdaf_0 - usgscsm=1.6.0_asp3.1.0=h2bc3f7f_0 - wheel=0.37.1=pyhd8ed1ab_0 - x264=20131218=0 - xerces-c=3.1.4=0 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.0.10=h7f98852_0 - xorg-libsm=1.2.3=hd9c2040_1000 - xorg-libx11=1.7.2=h7f98852_0 - xorg-libxau=1.0.9=h7f98852_0 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h7f98852_1 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-xextproto=7.3.0=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.5=h516909a_1 - yaml=0.2.5=h7f98852_2 - zlib=1.2.11=h166bdaf_1014 - zstd=1.4.9=ha95c52a_0 ================================================ FILE: conda/asp_deps_3.1.0_osx_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.8.5=py36hc61eee1_3 - armadillo=9.200.4=hcb88e47_1205 - arpack=3.6.3=h06d5271_1005 - blas=1.1=openblas - boost=1.68.0=py36h9888f84_1001 - boost-cpp=1.68.0=h6f8c590_1000 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - ca-certificates=2021.10.8=h033912b_0 - cairo=1.14.6=4 - ceres-solver=1.14.0=h636452b_15 - certifi=2021.5.30=py36h79c6626_0 - cmake=3.15.5=h6c18c4b_0 - csm=3.0.3.3=0 - cspice=66=h0d85af4_1015 - curl=7.64.0=heae2a1f_0 - decorator=5.1.1=pyhd8ed1ab_0 - eigen=3.4.0=h940c156_0 - embree=2.16.0=h6834224_0 - expat=2.4.8=h96cf925_0 - ffmpeg=3.4.1=0 - fftw=3.3.8=nompi_h5c49c53_1109 - fgr=isis6=h01edc0c_0 - flann=1.9.1=0 - fontconfig=2.12.1=4 - freetype=2.7=1 - geoid=1.0=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.4.3=h113155d_1001 - gettext=0.19.8.1=h46ab8bc_1002 - gflags=2.2.2=hb1e8313_1004 - giflib=5.2.1=hbcb3906_2 - glib=2.51.4=0 - glog=0.6.0=h8ac2a54_0 - gmm=5.0=h6aef312_0 - gmp=6.2.1=h2e338ed_0 - gsl=2.7=h93259b0_0 - harfbuzz=1.3.4=2 - hdf5=1.8.18=3 - htdp=1.0=1 - icu=58.2=h0a44026_1000 - ilmbase=2.5.5=hfab91a5_0 - imagemagick=isis6=h01edc0c_0 - inja=3.3.0=he49afe7_0 - isis=6.0.0=0 - jama=125=0 - jasper=1.900.1=h636a363_1006 - jpeg=9e=h5eb16cf_1 - kakadu=1=0 - krb5=1.16.3=h24a3359_1000 - laszip=2.1.0=h0a44026_1 - libblas=3.9.0=13_osx64_openblas - libcblas=3.9.0=13_osx64_openblas - libcurl=7.64.0=h76de61e_0 - libcxx=14.0.3=hc203e6f_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis6=0 - libffi=3.2.1=hb1e8313_1007 - libgcc=4.8.5=hdbeacc1_10 - libgdal=2.4.1_isis6=h01edc0c_0 - libgfortran=3.0.1=0 - libiconv=1.15=h0b31af3_1006 - liblapack=3.9.0=13_osx64_openblas - liblas=isis6=h01edc0c_1000 - libnabo=isis6=h01edc0c_0 - libopenblas=0.3.18=h9a5756b_0 - libpng=1.6.37=h7cec526_2 - libpointmatcher=isis6=ha5a8b8e_0 - libpq=10.6=hbe1e24e_1000 - libprotobuf=3.9.2=hfbae3c0_0 - libssh2=1.8.0=hf30b1f0_1003 - libtiff=4.0.10=ha78913b_1005 - libuv=1.43.0=h0d85af4_0 - libwebp=0.5.2=7 - libxcb=1.13=h0d85af4_1004 - libxml2=2.9.9=hd80cff7_2 - libzlib=1.2.11=h6c3fc93_1014 - llvm-openmp=14.0.3=ha654fa7_0 - lz4-c=1.9.3=he49afe7_1 - mesalib=21.2.5=h2df1e00_3 - metis=5.1.0=h2e338ed_1006 - mpfr=4.1.0=h0f52abe_1 - mysql=5.7.20=h0a44026_1001 - mysql-connector-c=6.1.11=had4e77e_1002 - nanoflann=1.4.2=h694c41f_0 - ncurses=6.3=h96cf925_1 - networkx=2.5=py_0 - nlohmann_json=3.10.5=he49afe7_0 - nn=1.86.0=h1de35cc_2003 - numpy=1.13.3=py36_blas_openblas_200 - openblas=0.2.19=2 - opencv=3.2.0=np113py36_blas_openblas_203 - openexr=2.5.5=h7fa7ffa_0 - openjpeg=2.3.0=h3bf0609_1003 - openssl=1.0.2u=h0b31af3_0 - parallel=20220222=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.9.1=hdd77166_1002 - pcre=8.45=he49afe7_0 - perl=5.32.1=2_h0d85af4_perl5 - pip=21.3.1=pyhd8ed1ab_0 - pixman=0.34.0=h1de35cc_1003 - postgresql=10.6=ha1bbaa7_1000 - proj4=5.2.0=h6de7cb9_1006 - protobuf=3.9.2=py36h6de7cb9_1 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.3.1=pyhd8ed1ab_0 - python=3.6.7=h4a56312_1002 - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.6=2_cp36m - pytz=2022.1=pyhd8ed1ab_0 - pyyaml=5.4.1=py36hfa26744_1 - qhull=7.2.0=0 - qt=5.9.6=7 - qwt=6.1.3=0 - readline=7.0=hcfe32e1_1001 - rhash=1.4.1=h0d85af4_0 - s2p-subset=isis6=h01edc0c_0 - scipy=1.2.1=py36hbd7caa9_1 - setuptools=58.0.4=py36h79c6626_2 - six=1.16.0=pyh6c4a22f_0 - spiceypy=2.3.2=py_0 - sqlite=3.28.0=h9721f7c_0 - suitesparse=5.10.1=h7aff33d_1 - superlu=5.2.1=hbced767_1205 - tbb=2021.5.0=hbb4e6a2_1 - theia=isis6=h01edc0c_1001 - tk=8.6.12=h5dbffcc_0 - tnt=126=0 - tzcode=2022a=h5eb16cf_0 - usgscsm=1.6.0_asp3.1.0=ha5a8b8e_0 - wheel=0.37.1=pyhd8ed1ab_0 - x264=20131218=0 - xerces-c=3.1.4=h10f7eb2_0 - xorg-damageproto=1.2.1=h0d85af4_1002 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-glproto=1.4.17=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.0.10=h0d85af4_0 - xorg-libsm=1.2.3=h0d85af4_1000 - xorg-libx11=1.7.2=h0d85af4_0 - xorg-libxau=1.0.9=h35c211d_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=h0d85af4_1 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.10=h0d85af4_1003 - xorg-randrproto=1.5.0=h0d85af4_1001 - xorg-renderproto=0.11.1=h0d85af4_1002 - xorg-util-macros=1.19.3=h35c211d_0 - xorg-xextproto=7.3.0=h35c211d_1002 - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.5=haf1e3a3_1 - yaml=0.2.5=h0d85af4_2 - zlib=1.2.11=h6c3fc93_1014 - zstd=1.4.9=h582d3a0_0 ================================================ FILE: conda/asp_deps_3.2.0_linux_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - _sysroot_linux-64_curr_repodata_hack=3=h5bd9786_13 - ale=0.8.8=py39hf939315_1 - alsa-lib=1.2.6.1=h7f98852_0 - aom=3.4.0=h27087fc_1 - armadillo=11.4.2=h7209761_0 - arpack=3.7.0=hdefa2d7_2 - attr=2.5.1=h166bdaf_1 - binutils_impl_linux-64=2.39=he00db2b_1 - binutils_linux-64=2.39=h5fc0e48_11 - blas=2.116=openblas - blas-devel=3.9.0=16_linux64_openblas - boost=1.72.0=py39ha90915f_1 - boost-cpp=1.72.0=he72f1d9_7 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - c-ares=1.18.1=h7f98852_0 - ca-certificates=2022.12.7=ha878542_0 - cairo=1.16.0=ha61ee94_1014 - ceres-solver=1.14.0=hf302a74_15 - chrpath=0.16=h7f98852_1002 - cmake=3.15.5=hf94ab9c_0 - csm=3.0.3.3=hc9558a2_0 - cspice=67=h166bdaf_4 - curl=7.86.0=h7bff187_1 - cyrus-sasl=2.1.27=h230043b_5 - dbus=1.13.6=h5008d03_3 - eigen=3.4.0=h4bd325d_0 - elfutils=0.186=he364ef2_0 - embree=2.16.0=0 - expat=2.5.0=h27087fc_0 - ffmpeg=4.4.2=gpl_hfe78399_107 - fftw=3.3.10=nompi_hf0379b8_106 - fgr=isis7=h3fd9d12_0 - flann=1.9.1=he05ef13_1011 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.1=hc2a2eb6_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freeglut=3.2.2=h9c3ff4c_1 - freetype=2.12.1=hca18f0e_1 - gcc_impl_linux-64=12.2.0=hcc96c02_19 - gcc_linux-64=12.2.0=h4798a0e_11 - geoid=1.0_isis7=1 - geos=3.7.3=he1b5a44_0 - geotiff=1.7.1=ha76d385_4 - gettext=0.21.1=h27087fc_0 - gflags=2.2.2=he1b5a44_1004 - gfortran_impl_linux-64=12.2.0=h55be85b_19 - gfortran_linux-64=12.2.0=h307d370_11 - giflib=5.2.1=h36c2ea0_2 - glib=2.74.1=h6239696_1 - glib-tools=2.74.1=h6239696_1 - glog=0.6.0=h6f12383_0 - gmp=6.2.1=h58526e2_0 - gnutls=3.7.8=hf3e180e_0 - graphite2=1.3.13=h58526e2_1001 - gsl=2.7=he838d99_0 - gst-plugins-base=1.20.3=hf6a322e_0 - gstreamer=1.20.3=hd4edc92_2 - gxx_impl_linux-64=12.2.0=hcc96c02_19 - gxx_linux-64=12.2.0=hb41e900_11 - harfbuzz=5.3.0=h418a68e_0 - hdf5=1.12.2=nompi_h2386368_100 - htdp=1.0_isis7=1 - icu=70.1=h27087fc_0 - ilmbase=2.5.5=h780b84a_0 - inja=3.3.0=h9c3ff4c_0 - isis=7.1.0=0 - jack=1.9.18=h8c3723f_1002 - jama=125=0 - jasper=2.0.33=ha77e612_0 - jemalloc=5.2.1=h9c3ff4c_6 - jpeg=9e=h166bdaf_2 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_13 - keyutils=1.6.1=h166bdaf_0 - krb5=1.19.3=h3790be6_0 - lame=3.100=h166bdaf_1003 - laszip=2.1.0_isis7=h3fd9d12_1 - ld_impl_linux-64=2.39=hcc3a1bd_1 - lerc=4.0.0=h27087fc_0 - libarchive=3.5.2=hb890918_3 - libblas=3.9.0=16_linux64_openblas - libcap=2.64=ha37c62d_0 - libcblas=3.9.0=16_linux64_openblas - libclang=14.0.6=default_h2e3cab8_0 - libclang13=14.0.6=default_h3a83d3e_0 - libcups=2.3.3=h3e49a29_2 - libcurl=7.86.0=h7bff187_1 - libcxx=14.0.6=hf52228f_0 - libcxxabi=14.0.6=ha770c72_0 - libdb=6.2.32=h9c3ff4c_0 - libdeflate=1.14=h166bdaf_0 - libdrm=2.4.114=h166bdaf_0 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis7=h3fd9d12_0 - libev=4.33=h516909a_1 - libevent=2.1.10=h9b69904_4 - libffi=3.4.2=h7f98852_5 - libflac=1.3.4=h27087fc_0 - libgcc-devel_linux-64=12.2.0=h3b97bd3_19 - libgcc-ng=12.2.0=h65d4601_19 - libgdal=3.5_isis7=h3fd9d12_0 - libgfortran-ng=12.2.0=h69a702a_19 - libgfortran5=12.2.0=h337968e_19 - libglib=2.74.1=h606061b_1 - libglu=9.0.0=he1b5a44_1001 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libgomp=12.2.0=h65d4601_19 - libhwloc=2.8.0=h32351e8_1 - libiconv=1.17=h166bdaf_0 - libidn2=2.3.4=h166bdaf_0 - libjemalloc=5.2.1=h9c3ff4c_6 - liblapack=3.9.0=16_linux64_openblas - liblapacke=3.9.0=16_linux64_openblas - liblas=1.8.2_isis7=h3fd9d12_0 - libllvm14=14.0.6=he0ac6c6_1 - libmicrohttpd=0.9.75=h2603550_1 - libnabo=isis7=h3fd9d12_0 - libnghttp2=1.47.0=hdcd2b5c_1 - libnsl=2.0.0=h7f98852_0 - libntlm=1.4=h7f98852_1002 - libogg=1.3.4=h7f98852_1 - libopenblas=0.3.21=pthreads_h78a6416_3 - libopencv=4.6.0=py39h04bf7ee_4 - libopus=1.3.1=h7f98852_1 - libpciaccess=0.17=h166bdaf_0 - libpng=1.6.39=h753d276_0 - libpointmatcher=isis7=h2bc3f7f_0 - libpq=14.5=h72a31a5_3 - libprotobuf=3.21.11=h3eb15da_0 - libsanitizer=12.2.0=h46fd767_19 - libsndfile=1.0.31=h9c3ff4c_1 - libsqlite=3.40.0=h753d276_0 - libssh2=1.10.0=haa6b8db_3 - libstdcxx-devel_linux-64=12.2.0=h3b97bd3_19 - libstdcxx-ng=12.2.0=h46fd767_19 - libtasn1=4.19.0=h166bdaf_0 - libtiff=4.4.0=h55922b4_4 - libtool=2.4.6=h9c3ff4c_1008 - libudev1=252=h166bdaf_0 - libunistring=0.9.10=h7f98852_0 - libuuid=2.32.1=h7f98852_1000 - libuv=1.44.2=h166bdaf_0 - libva=2.16.0=h166bdaf_0 - libvorbis=1.3.7=h9c3ff4c_0 - libvpx=1.11.0=h9c3ff4c_3 - libwebp=1.2.4=h522a892_0 - libwebp-base=1.2.4=h166bdaf_0 - libxcb=1.13=h7f98852_1004 - libxkbcommon=1.0.3=he3ba5ed_0 - libxml2=2.9.14=h22db469_4 - libzlib=1.2.13=h166bdaf_4 - llvm-openmp=15.0.6=he0ac6c6_0 - lz4-c=1.9.3=h9c3ff4c_1 - lzo=2.10=h516909a_1000 - mesalib=21.2.5=h0e4506f_3 - metis=5.1.0=h58526e2_1006 - mpfr=4.1.0=h9202a9a_1 - multiview=asp3.2.0=py39h3fd9d12_0 - mysql=8.0.31=h3e2b116_0 - mysql-client=8.0.31=hf89ab62_0 - mysql-common=8.0.31=haf5c9bc_0 - mysql-connector-c=6.1.11=h6eb9d5d_1007 - mysql-devel=8.0.31=haf5c9bc_0 - mysql-libs=8.0.31=h28c427c_0 - mysql-server=8.0.31=hb01f15f_0 - nanoflann=1.4.2=ha770c72_0 - ncurses=6.3=h27087fc_1 - nettle=3.8.1=hc379101_1 - networkx=2.8.8=pyhd8ed1ab_0 - nlohmann_json=3.11.2=h27087fc_0 - nn=1.86.0=h14c3975_2003 - nspr=4.35=h27087fc_0 - nss=3.82=he02c5a1_0 - numpy=1.23.5=py39h3d75532_0 - openblas=0.3.21=pthreads_h320a7e8_3 - opencv=4.6.0=py39hf3d152e_4 - openexr=2.5.5=hf817b99_0 - openh264=2.3.0=h27087fc_0 - openjpeg=2.3.0=hf38bd82_1003 - openssl=1.1.1s=h0b41bf4_1 - p11-kit=0.24.1=hc5aa10d_0 - parallel=20221122=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.11.1=h05311af_1 - pcre2=10.40=hc3806b6_0 - perl=5.32.1=2_h7f98852_perl5 - pip=22.3.1=pyhd8ed1ab_0 - pixman=0.40.0=h36c2ea0_0 - portaudio=19.6.0=h57a0ea0_5 - proj=9.1.0=h93bde94_0 - protobuf=4.21.11=py39h227be39_0 - pthread-stubs=0.4=h36c2ea0_1001 - pulseaudio=14.0=h7f54b18_8 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.6.0=py39hef51801_4 - python=3.9.15=h47a2c10_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2022.6=pyhd8ed1ab_0 - pyyaml=6.0=py39hb9d737c_5 - qhull=2020.2=h4bd325d_2 - qt=5.15.4=hf11cfaa_0 - qt-main=5.15.4=ha5833f6_2 - qt-webengine=5.15.4=hcbadb6c_3 - qwt=6.2.0=h1d9fb53_4 - rapidjson=1.1.0=he1b5a44_1002 - rclone=1.61.1=h519d9b9_0 - readline=8.1.2=h0f457ee_0 - rhash=1.4.3=h166bdaf_0 - rocksdb=6.13.3=hda8cf21_2 - s2p-subset=isis7=h3fd9d12_0 - scipy=1.9.3=py39hddc5342_2 - setuptools=65.5.1=pyhd8ed1ab_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.9=hbd366e4_2 - spiceypy=5.1.2=pyhd8ed1ab_0 - sqlite=3.40.0=h4ff8645_0 - suitesparse=5.10.1=h9e50725_1 - superlu=5.2.2=h00795ac_0 - svt-av1=1.2.1=h27087fc_0 - sysroot_linux-64=2.17=h4a8ded7_13 - tbb=2021.7.0=h924138e_1 - tbb-devel=2021.7.0=h924138e_1 - tk=8.6.12=h27826a3_0 - tnt=126=0 - tzdata=2022g=h191b570_0 - usgscsm=1.6.0=h924138e_1 - wheel=0.38.4=pyhd8ed1ab_0 - x264=1!164.3095=h166bdaf_2 - x265=3.5=h924138e_3 - xcb-util=0.4.0=h166bdaf_0 - xcb-util-image=0.4.0=h166bdaf_0 - xcb-util-keysyms=0.4.0=h166bdaf_0 - xcb-util-renderutil=0.3.9=h166bdaf_0 - xcb-util-wm=0.4.1=h166bdaf_0 - xerces-c=3.2.3=h55805fa_5 - xorg-damageproto=1.2.1=h7f98852_1002 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-glproto=1.4.17=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.0.10=h7f98852_0 - xorg-libsm=1.2.3=hd9c2040_1000 - xorg-libx11=1.7.2=h7f98852_0 - xorg-libxau=1.0.9=h7f98852_0 - xorg-libxdamage=1.1.5=h7f98852_1 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h7f98852_1 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrandr=1.5.2=h7f98852_1 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-randrproto=1.5.0=h7f98852_1001 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-util-macros=1.19.3=h7f98852_0 - xorg-xextproto=7.3.0=h7f98852_1002 - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - zlib=1.2.13=h166bdaf_4 - zstd=1.5.2=h6239696_4 - mesa-libgl-cos6-x86_64 - xorg-libxmu - mesalib ================================================ FILE: conda/asp_deps_3.2.0_osx_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.8.8=py39h92daf61_1 - aom=3.4.0=hb486fe8_1 - armadillo=11.4.2=hffeb596_0 - arpack=3.7.0=hefb7bc6_2 - blas=2.116=openblas - blas-devel=3.9.0=16_osx64_openblas - boost=1.72.0=py39hb64e6f8_1 - boost-cpp=1.72.0=h179ae3a_7 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - c-ares=1.18.1=h0d85af4_0 - ca-certificates=2022.12.7=h033912b_0 - cairo=1.16.0=h904041c_1014 - cctools_osx-64=973.0.1=hcc6d90d_11 - ceres-solver=1.14.0=h636452b_15 - clang=14.0.6=h694c41f_0 - clang-14=14.0.6=default_h55ffa42_0 - clang_osx-64=14.0.6=h3113cd8_4 - clangxx=14.0.6=default_h55ffa42_0 - cmake=3.15.5=h6c18c4b_0 - compiler-rt=14.0.6=h613da45_0 - compiler-rt_osx-64=14.0.6=h8d5cb93_0 - csm=3.0.3.3=0 - cspice=67=hb7f2c08_4 - curl=7.86.0=h57eb407_1 - cyrus-sasl=2.1.27=ha724b88_5 - eigen=3.4.0=h940c156_0 - embree=2.16.0=h6834224_0 - expat=2.5.0=hf0c8a7f_0 - ffmpeg=4.4.2=gpl_h5a1d76f_107 - fftw=3.3.10=nompi_h4fa670e_106 - fgr=isis7=h01edc0c_0 - flann=1.9.1=h56de9e4_1011 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.1=h5bb23bf_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freetype=2.12.1=h3f81eb7_1 - geoid=1.0_isis7=1 - geos=3.7.3=h4a8c4bd_0 - geotiff=1.7.1=he29fd1c_4 - gettext=0.21.1=h8a4c099_0 - gflags=2.2.2=hb1e8313_1004 - gfortran_impl_osx-64=11.3.0=h1f927f5_27 - gfortran_osx-64=11.3.0=h18f7dce_0 - giflib=5.2.1=hbcb3906_2 - glib=2.74.1=hbc0c0cd_1 - glib-tools=2.74.1=hbc0c0cd_1 - glog=0.6.0=h8ac2a54_0 - gmp=6.2.1=h2e338ed_0 - gnutls=3.7.8=h207c4f0_0 - graphite2=1.3.13=h2e338ed_1001 - gsl=2.7=h93259b0_0 - gst-plugins-base=1.20.3=h37e1711_2 - gstreamer=1.20.3=h1d18e73_2 - harfbuzz=5.3.0=h08f8713_0 - hdf5=1.12.2=nompi_hc782337_100 - htdp=1.0_isis7=1 - icu=70.1=h96cf925_0 - ilmbase=2.5.5=hfab91a5_0 - inja=3.3.0=he49afe7_0 - isis=7.1.0=0 - isl=0.25=hb486fe8_0 - jama=125=0 - jasper=2.0.33=h013e400_0 - jemalloc=5.2.1=he49afe7_6 - jpeg=9e=hac89ed1_2 - kakadu=1=0 - krb5=1.19.3=hb49756b_0 - lame=3.100=hb7f2c08_1003 - laszip=2.1.0_isis7=h01edc0c_1 - ld64_osx-64=609=hfd63004_11 - lerc=4.0.0=hb486fe8_0 - libblas=3.9.0=16_osx64_openblas - libcblas=3.9.0=16_osx64_openblas - libclang=14.0.6=default_h55ffa42_0 - libclang-cpp14=14.0.6=default_h55ffa42_0 - libclang13=14.0.6=default_hb5731bd_0 - libcurl=7.86.0=h57eb407_1 - libcxx=14.0.6=hccf4f1f_0 - libdeflate=1.14=hb7f2c08_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis7=h01edc0c_0 - libev=4.33=haf1e3a3_1 - libevent=2.1.10=h815e4d9_4 - libffi=3.4.2=h0d85af4_5 - libgdal=3.5_isis7=h01edc0c_0 - libgfortran=5.0.0=9_5_0_h97931a8_26 - libgfortran-devel_osx-64=11.3.0=h824d247_27 - libgfortran5=11.3.0=h082f757_26 - libglib=2.74.1=h4c723e1_1 - libiconv=1.17=hac89ed1_0 - libidn2=2.3.4=hb7f2c08_0 - libjemalloc=5.2.1=he49afe7_6 - liblapack=3.9.0=16_osx64_openblas - liblapacke=3.9.0=16_osx64_openblas - liblas=1.8.2_isis7=h01edc0c_0 - libllvm14=14.0.6=h5b596cc_1 - libnabo=isis7=h01edc0c_0 - libnghttp2=1.47.0=h7cbc4dc_1 - libntlm=1.4=h0d85af4_1002 - libogg=1.3.4=h35c211d_1 - libopenblas=0.3.21=openmp_h429af6e_3 - libopencv=4.6.0=py39h743a0d3_4 - libopus=1.3.1=hc929b4f_1 - libpng=1.6.39=ha978bb4_0 - libpointmatcher=isis7=ha5a8b8e_0 - libpq=14.5=h4aa9af9_3 - libprotobuf=3.21.11=hbc0c0cd_0 - libsqlite=3.40.0=ha978bb4_0 - libssh2=1.10.0=h7535e13_3 - libtasn1=4.19.0=hb7f2c08_0 - libtiff=4.4.0=hdb44e8a_4 - libunistring=0.9.10=h0d85af4_0 - libuv=1.44.2=hac89ed1_0 - libvorbis=1.3.7=h046ec9c_0 - libvpx=1.11.0=he49afe7_3 - libwebp=1.2.4=hfa4350a_0 - libwebp-base=1.2.4=h775f41a_0 - libxcb=1.13=h0d85af4_1004 - libxml2=2.9.14=hea49891_4 - libzlib=1.2.13=hfd90126_4 - llvm-openmp=15.0.6=h61d9ccf_0 - llvm-tools=14.0.6=h5b596cc_1 - lz4-c=1.9.3=he49afe7_1 - macports-legacy-support=1.0.7=hb7f2c08_0 - mesalib=21.2.5=h2df1e00_3 - metis=5.1.0=h2e338ed_1006 - mpc=1.2.1=hbb51d92_0 - mpfr=4.1.0=h0f52abe_1 - multiview=asp3.2.0=py39h01edc0c_0 - mysql=8.0.31=h57ddcff_0 - mysql-client=8.0.31=hbbbc359_0 - mysql-common=8.0.31=h7ebae80_0 - mysql-connector-c=6.1.11=h0f02589_1007 - mysql-devel=8.0.31=h7ebae80_0 - mysql-libs=8.0.31=hc37e033_0 - mysql-server=8.0.31=ha134c4c_0 - nanoflann=1.4.2=h694c41f_0 - ncurses=6.3=h96cf925_1 - nettle=3.8.1=h96f3785_1 - networkx=2.8.8=pyhd8ed1ab_0 - nlohmann_json=3.11.2=hbbd2c75_0 - nn=1.86.0=h1de35cc_2003 - nspr=4.35=hea0b92c_0 - nss=3.78=ha8197d3_0 - numpy=1.23.5=py39hdfa1d0c_0 - openblas=0.3.21=openmp_hbefa662_3 - opencv=4.6.0=py39h6e9494a_4 - openexr=2.5.5=h7fa7ffa_0 - openh264=2.3.0=hb486fe8_0 - openjpeg=2.3.0=h3bf0609_1003 - openssl=1.1.1s=hfd90126_1 - p11-kit=0.24.1=h65f8906_0 - parallel=20221122=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.11.1=h7984e4d_1 - pcre2=10.40=h1c4e4bc_0 - perl=5.32.1=2_h0d85af4_perl5 - pip=22.3.1=pyhd8ed1ab_0 - pixman=0.40.0=hbcb3906_0 - proj=9.1.0=hcbd9701_0 - protobuf=4.21.11=py39h7a8716b_0 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.6.0=py39h71a6800_4 - python=3.9.15=h531fd05_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2022.6=pyhd8ed1ab_0 - pyyaml=6.0=py39ha30fb19_5 - qhull=2020.2=h940c156_2 - qt=5.15.4=hb3ad848_0 - qt-main=5.15.4=h938c29d_2 - qt-webengine=5.15.4=h72ca1e5_3 - qwt=6.2.0=h4cc5820_4 - rapidjson=1.1.0=hb1e8313_1002 - readline=8.1.2=h3899abd_0 - rhash=1.4.3=hac89ed1_0 - rocksdb=6.13.3=hbb73eaa_2 - s2p-subset=isis7=h01edc0c_0 - scipy=1.9.3=py39h8a15683_2 - setuptools=65.5.1=pyhd8ed1ab_0 - sigtool=0.1.3=h57ddcff_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.9=h225ccf5_2 - spiceypy=5.1.2=pyhd8ed1ab_0 - sqlite=3.40.0=h9ae0607_0 - suitesparse=5.10.1=h7aff33d_1 - superlu=5.2.2=h1f0f902_0 - svt-av1=1.2.1=hbbd2c75_0 - tapi=1100.0.11=h9ce4665_0 - tbb=2021.7.0=hb8565cd_1 - tbb-devel=2021.7.0=hb8565cd_1 - tk=8.6.12=h5dbffcc_0 - tnt=126=0 - tzdata=2022g=h191b570_0 - usgscsm=1.6.0=hb8565cd_1 - wheel=0.38.4=pyhd8ed1ab_0 - x264=1!164.3095=h775f41a_2 - x265=3.5=hbb4e6a2_3 - xerces-c=3.2.3=hf5b2a72_5 - xorg-damageproto=1.2.1=h0d85af4_1002 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-glproto=1.4.17=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.0.10=h0d85af4_0 - xorg-libsm=1.2.3=h0d85af4_1000 - xorg-libx11=1.7.2=h0d85af4_0 - xorg-libxau=1.0.9=h35c211d_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=h0d85af4_1 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.10=h0d85af4_1003 - xorg-randrproto=1.5.0=h0d85af4_1001 - xorg-renderproto=0.11.1=h0d85af4_1002 - xorg-util-macros=1.19.3=h35c211d_0 - xorg-xextproto=7.3.0=h35c211d_1002 - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.6=h775f41a_0 - yaml=0.2.5=h0d85af4_2 - zlib=1.2.13=hfd90126_4 - zstd=1.5.2=hfa58983_4 ================================================ FILE: conda/asp_deps_3.3.0_linux_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - _sysroot_linux-64_curr_repodata_hack=3=h69a702a_13 - ale=0.9.1=py39h7633fee_0 - alsa-lib=1.2.7.2=h166bdaf_0 - aom=3.5.0=h27087fc_0 - armadillo=12.6.1=h0a193a4_0 - arpack=3.7.0=hdefa2d7_2 - blas=2.117=openblas - blas-devel=3.9.0=17_linux64_openblas - boost=1.72.0=py39ha90915f_1 - boost-cpp=1.72.0=h359cf19_6 - brotli-python=1.1.0=py39h3d6467e_0 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - c-ares=1.19.1=hd590300_0 - ca-certificates=2023.7.22=hbcca054_0 - cairo=1.16.0=ha12eb4b_1010 - ceres-solver=1.14.0=hf302a74_15 - certifi=2023.7.22=pyhd8ed1ab_0 - charset-normalizer=3.2.0=pyhd8ed1ab_0 - chrpath=0.16=h7f98852_1002 - csm=3.0.3.3=hc9558a2_0 - cspice=67=h166bdaf_4 - curl=7.87.0=h6312ad2_0 - cyrus-sasl=2.1.27=h957375c_6 - dbus=1.13.6=h5008d03_3 - eigen=3.4.0=h00ab1b0_0 - elfutils=0.188=hbb17bd0_0 - embree=2.17.7=ha770c72_3 - expat=2.5.0=hcb278e6_1 - ffmpeg=4.4.2=gpl_hbd009f3_109 - fftw=3.3.10=nompi_hc118613_108 - fgr=isis7=h3fd9d12_0 - flann=1.9.1=hfe772e8_1010 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.2=h14ed4e7_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - freeglut=3.2.2=h9c3ff4c_1 - freetype=2.12.1=hca18f0e_1 - geoid=1.0_isis7=1 - geos=3.9.1=h9c3ff4c_2 - geotiff=1.7.1=ha76d385_4 - gettext=0.21.1=h27087fc_0 - gflags=2.2.2=he1b5a44_1004 - giflib=5.2.1=h0b41bf4_3 - glib=2.76.4=hfc55251_0 - glib-tools=2.76.4=hfc55251_0 - glog=0.6.0=h6f12383_0 - gmp=6.2.1=h58526e2_0 - gnutls=3.7.8=hf3e180e_0 - graphite2=1.3.13=h58526e2_1001 - gsl=2.6=he838d99_2 - gst-plugins-base=1.20.3=h57caac4_2 - gstreamer=1.20.3=hd4edc92_2 - harfbuzz=4.2.0=h40b6f09_0 - hdf5=1.12.1=nompi_h2386368_104 - htdp=1.0_isis7=1 - icu=69.1=h9c3ff4c_0 - idna=3.4=pyhd8ed1ab_0 - ilmbase=2.5.5=h780b84a_0 - inja=3.3.0=h9c3ff4c_0 - isis=8.0.0=np125_0 - jama=125=0 - jasper=2.0.33=h0ff4b12_1 - jemalloc=5.3.0=hcb278e6_0 - jpeg=9e=h0b41bf4_3 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_13 - keyutils=1.6.1=h166bdaf_0 - krb5=1.20.1=hf9c8cef_0 - lame=3.100=h166bdaf_1003 - laszip=2.1.0_isis7=h3fd9d12_1 - ld_impl_linux-64=2.40=h41732ed_0 - lerc=4.0.0=h27087fc_0 - libarchive=3.5.2=hb890918_3 - libblas=3.9.0=17_linux64_openblas - libcblas=3.9.0=17_linux64_openblas - libclang=13.0.1=default_h7634d5b_3 - libcurl=7.87.0=h6312ad2_0 - libcxx=16.0.6=h00ab1b0_0 - libcxxabi=16.0.6=ha770c72_0 - libdeflate=1.14=h166bdaf_0 - libdrm=2.4.114=h166bdaf_0 - libdrm-cos6-x86_64=2.4.65=4 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis7=h3fd9d12_0 - libev=4.33=h516909a_1 - libevent=2.1.10=h9b69904_4 - libexpat=2.5.0=hcb278e6_1 - libffi=3.4.2=h7f98852_5 - libgcc-ng=13.1.0=he5830b7_0 - libgdal=3.5_isis8=h3fd9d12_0 - libgfortran-ng=13.1.0=h69a702a_0 - libgfortran5=13.1.0=h15d22d2_0 - libglib=2.76.4=hebfc3b9_0 - libglu=9.0.0=he1b5a44_1001 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libhwloc=2.8.0=h32351e8_1 - libiconv=1.17=h166bdaf_0 - libidn2=2.3.4=h166bdaf_0 - libjemalloc=5.3.0=hcb278e6_0 - liblapack=3.9.0=17_linux64_openblas - liblapacke=3.9.0=17_linux64_openblas - liblas=1.8.2_isis8=h3fd9d12_0 - libllvm13=13.0.1=hf817b99_2 - libmicrohttpd=0.9.77=h97afed2_0 - libnabo=isis7=h3fd9d12_0 - libnghttp2=1.51.0=hdcd2b5c_0 - libnsl=2.0.0=h7f98852_0 - libntlm=1.4=h7f98852_1002 - libogg=1.3.4=h7f98852_1 - libopenblas=0.3.23=pthreads_h80387f5_0 - libopencv=4.5.5=py39hb0e02d1_7 - libopus=1.3.1=h7f98852_1 - libpciaccess=0.17=h166bdaf_0 - libpng=1.6.39=h753d276_0 - libpointmatcher=isis7=h2bc3f7f_0 - libpq=14.5=h2baec63_5 - libprotobuf=3.19.6=h3eb15da_0 - libsqlite=3.43.0=h2797004_0 - libssh2=1.10.0=haa6b8db_3 - libstdcxx-ng=13.1.0=hfd8a6a1_0 - libtasn1=4.19.0=h166bdaf_0 - libtiff=4.4.0=h82bc61c_5 - libunistring=0.9.10=h7f98852_0 - libuuid=2.38.1=h0b41bf4_0 - libva=2.18.0=h0b41bf4_0 - libvorbis=1.3.7=h9c3ff4c_0 - libvpx=1.11.0=h9c3ff4c_3 - libwebp-base=1.3.1=hd590300_0 - libx11-common-cos6-x86_64=1.6.4=4 - libx11-cos6-x86_64=1.6.4=4 - libxcb=1.13=h7f98852_1004 - libxkbcommon=1.0.3=he3ba5ed_0 - libxml2=2.9.14=haae042b_4 - libzlib=1.2.13=hd590300_5 - llvm-openmp=16.0.6=h4dfa4b3_0 - lz4-c=1.9.3=h9c3ff4c_1 - lzo=2.10=h516909a_1000 - mesa-libgl-cos6-x86_64=11.0.7=4 - mesalib=23.0.0=h0fe20ba_0 - metis=5.1.0=h59595ed_1007 - mpfr=4.2.0=hb012696_0 - multiview=isis8=py39h3fd9d12_0 - mysql=8.0.28=h3e2b116_2 - mysql-client=8.0.28=hf89ab62_2 - mysql-common=8.0.28=haf5c9bc_2 - mysql-connector-c=6.1.11=h6eb9d5d_1007 - mysql-devel=8.0.28=haf5c9bc_2 - mysql-libs=8.0.28=h28c427c_2 - mysql-server=8.0.28=hb253900_2 - nanoflann=1.4.2=ha770c72_0 - ncurses=6.4=hcb278e6_0 - nettle=3.8.1=hc379101_1 - networkx=3.1=pyhd8ed1ab_0 - nlohmann_json=3.11.2=h27087fc_0 - nn=1.86.0=hd590300_2003 - nspr=4.35=h27087fc_0 - nss=3.92=h1d7d5a4_0 - numpy=1.25.2=py39h6183b62_0 - openblas=0.3.23=pthreads_h855a84d_0 - opencv=4.5.5=py39hf3d152e_7 - openexr=2.5.5=hf817b99_0 - openh264=2.3.1=hcb278e6_2 - openjpeg=2.3.0=hf38bd82_1003 - openssl=1.1.1v=hd590300_0 - p11-kit=0.24.1=hc5aa10d_0 - packaging=23.1=pyhd8ed1ab_0 - parallel=20230722=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.11.1=h05311af_1 - pcre2=10.40=hc3806b6_0 - perl=5.32.1=4_hd590300_perl5 - pip=23.2.1=pyhd8ed1ab_0 - pixman=0.40.0=h36c2ea0_0 - platformdirs=3.10.0=pyhd8ed1ab_0 - pooch=1.7.0=pyha770c72_3 - proj=9.1.0=h93bde94_0 - protobuf=3.19.6=py39h227be39_0 - pthread-stubs=0.4=h36c2ea0_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.5.5=py39hef51801_7 - pysocks=1.7.1=pyha2e5f31_6 - python=3.9.15=h47a2c10_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2023.3.post1=pyhd8ed1ab_0 - pyyaml=6.0.1=py39hd1e30aa_0 - qhull=2020.2=h4bd325d_2 - qt=5.12.9=h1304e3e_6 - qwt=6.2.0=hb19a904_2 - rapidjson=1.1.0=he1b5a44_1002 - rclone=1.63.1=h519d9b9_0 - readline=8.2=h8228510_1 - requests=2.31.0=pyhd8ed1ab_0 - rocksdb=6.13.3=hda8cf21_2 - s2p-subset=isis7=h3fd9d12_0 - scipy=1.11.2=py39h6183b62_0 - setuptools=68.1.2=pyhd8ed1ab_0 - six=1.16.0=pyh6c4a22f_0 - spiceypy=6.0.0=pyhd8ed1ab_0 - sqlite=3.43.0=h2c6b66d_0 - suitesparse=5.10.1=h9e50725_1 - superlu=5.2.2=h00795ac_0 - svt-av1=1.3.0=h27087fc_0 - sysroot_linux-64=2.17=h4a8ded7_13 - tbb=2021.7.0=h924138e_1 - tbb-devel=2021.7.0=h924138e_1 - tk=8.6.12=h27826a3_0 - tnt=126=0 - typing-extensions=4.7.1=hd8ed1ab_0 - typing_extensions=4.7.1=pyha770c72_0 - tzdata=2023c=h71feb2d_0 - urllib3=2.0.4=pyhd8ed1ab_0 - usgscsm=1.7.0=h00ab1b0_1 - wheel=0.41.2=pyhd8ed1ab_0 - x264=1!164.3095=h166bdaf_2 - x265=3.5=h924138e_3 - xerces-c=3.2.3=h8ce2273_4 - xorg-damageproto=1.2.1=h7f98852_1002 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-glproto=1.4.17=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.1.1=hd590300_0 - xorg-libsm=1.2.4=h7391055_0 - xorg-libx11=1.8.4=h0b41bf4_0 - xorg-libxau=1.0.11=hd590300_0 - xorg-libxdamage=1.1.5=h7f98852_1 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h0b41bf4_2 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrandr=1.5.2=h7f98852_1 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-randrproto=1.5.0=h7f98852_1001 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-util-macros=1.19.3=h7f98852_0 - xorg-xextproto=7.3.0=h0b41bf4_1003 - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - zlib=1.2.13=hd590300_5 - zstd=1.5.5=hfc55251_0 ================================================ FILE: conda/asp_deps_3.3.0_osx_env.yaml ================================================ name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge - defaults dependencies: - ale=0.9.1=py39h8ee36c8_0 - aom=3.5.0=hf0c8a7f_0 - armadillo=12.6.1=hdc495e4_0 - arpack=3.7.0=hefb7bc6_2 - blas=2.117=openblas - blas-devel=3.9.0=17_osx64_openblas - boost=1.72.0=py39hb64e6f8_1 - boost-cpp=1.72.0=hf3dc895_6 - brotli-python=1.1.0=py39h840bb9f_0 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - c-ares=1.19.1=h0dc2134_0 - c-compiler=1.5.2=hbf74d83_0 - ca-certificates=2023.7.22=h8857fd0_0 - cairo=1.16.0=h9e0e54b_1010 - cctools=973.0.1=h76f1dac_13 - cctools_osx-64=973.0.1=hcc6d90d_13 - ceres-solver=1.14.0=h636452b_15 - certifi=2023.7.22=pyhd8ed1ab_0 - charset-normalizer=3.2.0=pyhd8ed1ab_0 - clang=14.0.6=h694c41f_1 - clang-14=14.0.6=default_hdb78580_1 - clang_osx-64=14.0.6=h3113cd8_6 - clangxx=14.0.6=default_hdb78580_1 - clangxx_osx-64=14.0.6=h6f97653_6 - cmake=3.27.4=hf40c264_4 - compiler-rt=14.0.6=h613da45_0 - compiler-rt_osx-64=14.0.6=hab78ec2_0 - compilers=1.5.2=h694c41f_0 - csm=3.0.3.3=0 - cspice=67=hb7f2c08_4 - curl=8.2.1=h5f667d7_0 - cxx-compiler=1.5.2=hb8565cd_0 - cyrus-sasl=2.1.27=hf9bab2b_7 - eigen=3.4.0=h1c7c39f_0 - embree=2.17.7=h694c41f_3 - expat=2.5.0=hf0c8a7f_1 - ffmpeg=4.4.2=gpl_hff0bab5_109 - fftw=3.3.10=nompi_h4fa670e_108 - fgr=isis7=h01edc0c_0 - flann=1.9.1=h30321d8_1010 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.2=h5bb23bf_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - fortran-compiler=1.5.2=haad3a49_0 - freetype=2.12.1=h3f81eb7_1 - geoid=1.0_isis7=1 - geos=3.9.1=he49afe7_2 - geotiff=1.7.1=he29fd1c_4 - gettext=0.21.1=h8a4c099_0 - gflags=2.2.2=hb1e8313_1004 - gfortran=11.4.0=h2c809b3_1 - gfortran_impl_osx-64=11.4.0=h2a33dde_1 - gfortran_osx-64=11.4.0=h18f7dce_1 - giflib=5.2.1=hb7f2c08_3 - glog=0.6.0=h8ac2a54_0 - gmp=6.2.1=h2e338ed_0 - gnutls=3.7.8=h207c4f0_0 - graphite2=1.3.13=h2e338ed_1001 - gsl=2.6=h71c5fe9_2 - harfbuzz=4.2.0=h48644e2_0 - hdf5=1.12.1=nompi_h0aa1fa2_104 - htdp=1.0_isis7=1 - icu=69.1=he49afe7_0 - idna=3.4=pyhd8ed1ab_0 - ilmbase=2.5.5=hfab91a5_0 - inja=3.3.0=he49afe7_0 - isis=8.0.0=np125_0 - isl=0.25=hb486fe8_0 - jama=125=0 - jasper=2.0.33=h7c6fec8_1 - jemalloc=5.3.0=hf0c8a7f_0 - jpeg=9e=hb7f2c08_3 - kakadu=1=0 - krb5=1.21.1=hb884880_0 - lame=3.100=hb7f2c08_1003 - laszip=2.1.0_isis7=h01edc0c_1 - ld64=609=hc6ad406_13 - ld64_osx-64=609=hfd63004_13 - lerc=4.0.0=hb486fe8_0 - libblas=3.9.0=17_osx64_openblas - libcblas=3.9.0=17_osx64_openblas - libclang=13.0.1=root_62804_h2961583_3 - libclang-cpp14=14.0.6=default_hdb78580_1 - libcurl=8.2.1=h5f667d7_0 - libcxx=16.0.6=hd57cbcb_0 - libdeflate=1.14=hb7f2c08_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis7=h01edc0c_0 - libev=4.33=haf1e3a3_1 - libevent=2.1.10=h7d65743_4 - libexpat=2.5.0=hf0c8a7f_1 - libffi=3.4.2=h0d85af4_5 - libgdal=3.5_isis8=hf8dc8b4_0 - libgfortran=5.0.0=12_3_0_h97931a8_1 - libgfortran-devel_osx-64=11.4.0=h01aa347_1 - libgfortran5=12.3.0=hbd3c1fe_1 - libglib=2.76.4=hc62aa5d_0 - libiconv=1.17=hac89ed1_0 - libidn2=2.3.4=hb7f2c08_0 - libjemalloc=5.3.0=hf0c8a7f_0 - liblapack=3.9.0=17_osx64_openblas - liblapacke=3.9.0=17_osx64_openblas - liblas=1.8.2_isis8=hf8dc8b4_0 - libllvm13=13.0.1=h64f94b2_2 - libllvm14=14.0.6=hc8e404f_4 - libnabo=isis7=h01edc0c_0 - libnghttp2=1.52.0=he2ab024_0 - libntlm=1.4=h0d85af4_1002 - libopenblas=0.3.23=openmp_h429af6e_0 - libopencv=4.5.5=py39hc2bf5a6_7 - libpng=1.6.39=ha978bb4_0 - libpointmatcher=isis7=ha5a8b8e_0 - libpq=14.5=h3df487d_7 - libprotobuf=3.19.6=hbc0c0cd_0 - libsqlite=3.42.0=h58db7d2_0 - libssh2=1.11.0=hd019ec5_0 - libtasn1=4.19.0=hb7f2c08_0 - libtiff=4.4.0=h6268bbc_5 - libunistring=0.9.10=h0d85af4_0 - libuv=1.46.0=h0c2f820_0 - libvpx=1.11.0=he49afe7_3 - libwebp-base=1.3.1=h0dc2134_0 - libxcb=1.15=hb7f2c08_0 - libxml2=2.9.14=h1faee8b_4 - libzlib=1.2.13=h8a1eda9_5 - llvm-openmp=16.0.6=hff08bdf_0 - llvm-tools=14.0.6=hc8e404f_4 - lz4-c=1.9.3=he49afe7_1 - macports-legacy-support=1.0.13=h0dc2134_0 - mesalib=23.1.4=hb59017c_0 - metis=5.1.0=he965462_1007 - mpc=1.3.1=h81bd1dd_0 - mpfr=4.2.0=h4f9bd69_0 - multiview=isis8=py39hf8dc8b4_0 - mysql=8.0.28=h88f4db0_2 - mysql-client=8.0.28=h7ddd48c_2 - mysql-common=8.0.28=hdd8d184_2 - mysql-devel=8.0.28=hdd8d184_2 - mysql-libs=8.0.28=h353f102_2 - mysql-server=8.0.28=h6edde1b_2 - nanoflann=1.4.2=h694c41f_0 - ncurses=6.4=hf0c8a7f_0 - nettle=3.8.1=h96f3785_1 - networkx=3.1=pyhd8ed1ab_0 - nlohmann_json=3.11.2=hbbd2c75_0 - nn=1.86.0=h0dc2134_2003 - nspr=4.35=hea0b92c_0 - nss=3.92=hd6ac835_0 - numpy=1.25.2=py39h892e69a_0 - openblas=0.3.23=openmp_hbefa662_0 - opencv=4.5.5=py39h6e9494a_7 - openexr=2.5.5=h7fa7ffa_0 - openh264=2.3.1=hf0c8a7f_2 - openjpeg=2.3.0=h3bf0609_1003 - openssl=3.1.2=h8a1eda9_0 - p11-kit=0.24.1=h65f8906_0 - packaging=23.1=pyhd8ed1ab_0 - parallel=20230722=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.11.1=h7984e4d_1 - pcre2=10.40=h1c4e4bc_0 - perl=5.32.1=4_h0dc2134_perl5 - pip=23.2.1=pyhd8ed1ab_0 - pixman=0.40.0=hbcb3906_0 - platformdirs=3.10.0=pyhd8ed1ab_0 - pooch=1.7.0=pyha770c72_3 - proj=9.1.0=hcbd9701_0 - protobuf=3.19.6=py39h7a8716b_0 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.5.5=py39h71a6800_7 - pysocks=1.7.1=pyha2e5f31_6 - python=3.9.17=h07e1443_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2023.3.post1=pyhd8ed1ab_0 - pyyaml=6.0.1=py39hdc70f33_0 - qhull=2020.2=h940c156_2 - qt=5.12.9=h2a607e2_5 - qwt=6.2.0=h0f3c874_2 - rapidjson=1.1.0=hb1e8313_1002 - rclone=1.63.1=h1762f63_0 - readline=8.2=h9e318b2_1 - requests=2.31.0=pyhd8ed1ab_0 - rhash=1.4.4=h0dc2134_0 - rocksdb=6.13.3=hbb73eaa_2 - s2p-subset=isis7=h01edc0c_0 - scipy=1.11.2=py39hded996c_0 - setuptools=68.1.2=pyhd8ed1ab_0 - sigtool=0.1.3=h88f4db0_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.10=h225ccf5_0 - spiceypy=6.0.0=pyhd8ed1ab_0 - sqlite=3.42.0=h2b0dec6_0 - suitesparse=5.10.1=h7aff33d_1 - superlu=5.2.2=h1f0f902_0 - svt-av1=1.3.0=hf0c8a7f_0 - tapi=1100.0.11=h9ce4665_0 - tbb=2021.10.0.custom_asp=h6b95b14_0 - tbb-devel=2021.10.0.custom_asp=h6b95b14_0 - tk=8.6.12=h5dbffcc_0 - tnt=126=0 - typing-extensions=4.7.1=hd8ed1ab_0 - typing_extensions=4.7.1=pyha770c72_0 - tzdata=2023c=h71feb2d_0 - urllib3=2.0.4=pyhd8ed1ab_0 - usgscsm=1.7.0=h1c7c39f_1 - wheel=0.41.2=pyhd8ed1ab_0 - x264=1!164.3095=h775f41a_2 - x265=3.5=hbb4e6a2_3 - xerces-c=3.2.3=h6564042_4 - xorg-damageproto=1.2.1=h0d85af4_1002 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-glproto=1.4.17=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.1.1=h0dc2134_0 - xorg-libsm=1.2.4=h0dc2134_0 - xorg-libx11=1.8.6=hbd0b022_0 - xorg-libxau=1.0.11=h0dc2134_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=hb7f2c08_2 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.11=h0dc2134_0 - xorg-randrproto=1.5.0=h0d85af4_1001 - xorg-renderproto=0.11.1=h0d85af4_1002 - xorg-util-macros=1.19.3=h35c211d_0 - xorg-xextproto=7.3.0=hb7f2c08_1003 - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.6=h775f41a_0 - yaml=0.2.5=h0d85af4_2 - zlib=1.2.13=h8a1eda9_5 - zstd=1.5.5=h829000d_0 ================================================ FILE: conda/asp_deps_3.4.0_alpha_linux_env.yaml ================================================ name: asp_deps_3.4.0_alpha channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - _sysroot_linux-64_curr_repodata_hack=3=h69a702a_13 - ale=0.9.1=py39h7633fee_1 - alsa-lib=1.2.7.2=h166bdaf_0 - aom=3.5.0=h27087fc_0 - armadillo=12.6.1=h0a193a4_0 - arpack=3.7.0=hdefa2d7_2 - binutils=2.40=hdd6e379_0 - binutils_impl_linux-64=2.40=hf600244_0 - binutils_linux-64=2.40=hbdbef99_1 - blas=2.117=openblas - blas-devel=3.9.0=17_linux64_openblas - boost=1.72.0=py39ha90915f_1 - boost-cpp=1.72.0=h359cf19_6 - brotli-python=1.1.0=py39h3d6467e_0 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h7f98852_4 - c-ares=1.19.1=hd590300_0 - c-compiler=1.6.0=hd590300_0 - ca-certificates=2023.7.22=hbcca054_0 - cairo=1.16.0=ha12eb4b_1010 - ceres-solver=1.14.0=hf302a74_15 - certifi=2023.7.22=pyhd8ed1ab_0 - charset-normalizer=3.2.0=pyhd8ed1ab_0 - chrpath=0.16=h7f98852_1002 - cmake=3.25.2=h077f3f9_0 - compilers=1.6.0=ha770c72_0 - csm=3.0.3.3=hc9558a2_0 - cspice=67=h166bdaf_4 - curl=7.87.0=h6312ad2_0 - cxx-compiler=1.6.0=h00ab1b0_0 - cyrus-sasl=2.1.27=h957375c_6 - dbus=1.13.6=h5008d03_3 - eigen=3.4.0=h00ab1b0_0 - elfutils=0.188=hbb17bd0_0 - embree=2.17.7=ha770c72_3 - expat=2.5.0=hcb278e6_1 - ffmpeg=4.4.2=gpl_hbd009f3_109 - fftw=3.3.10=nompi_hc118613_108 - fgr=isis7=h3fd9d12_0 - flann=1.9.1=hfe772e8_1010 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.2=h14ed4e7_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - fortran-compiler=1.6.0=heb67821_0 - freeglut=3.2.2=h9c3ff4c_1 - freetype=2.12.1=hca18f0e_1 - gcc=12.3.0=h8d2909c_1 - gcc_impl_linux-64=12.3.0=he2b93b0_0 - gcc_linux-64=12.3.0=h76fc315_1 - geoid=1.0_isis7=1 - geos=3.9.1=h9c3ff4c_2 - geotiff=1.7.1=ha76d385_4 - gettext=0.21.1=h27087fc_0 - gflags=2.2.2=he1b5a44_1004 - gfortran=12.3.0=h499e0f7_1 - gfortran_impl_linux-64=12.3.0=hfcedea8_0 - gfortran_linux-64=12.3.0=h7fe76b4_1 - giflib=5.2.1=h0b41bf4_3 - glib=2.76.4=hfc55251_0 - glib-tools=2.76.4=hfc55251_0 - glog=0.6.0=h6f12383_0 - gmp=6.2.1=h58526e2_0 - gnutls=3.7.8=hf3e180e_0 - graphite2=1.3.13=h58526e2_1001 - gsl=2.6=he838d99_2 - gst-plugins-base=1.20.3=h57caac4_2 - gstreamer=1.20.3=hd4edc92_2 - gxx=12.3.0=h8d2909c_1 - gxx_impl_linux-64=12.3.0=he2b93b0_0 - gxx_linux-64=12.3.0=h8a814eb_1 - harfbuzz=4.2.0=h40b6f09_0 - hdf5=1.12.1=nompi_h2386368_104 - htdp=1.0_isis7=1 - icu=69.1=h9c3ff4c_0 - idna=3.4=pyhd8ed1ab_0 - ilmbase=2.5.5=h780b84a_0 - inja=3.3.0=h9c3ff4c_0 - isis=8.0.0=np125_0 - jama=125=0 - jasper=2.0.33=h0ff4b12_1 - jemalloc=5.3.0=hcb278e6_0 - jpeg=9e=h0b41bf4_3 - kakadu=1=0 - kernel-headers_linux-64=3.10.0=h4a8ded7_13 - keyutils=1.6.1=h166bdaf_0 - krb5=1.20.1=hf9c8cef_0 - lame=3.100=h166bdaf_1003 - ld_impl_linux-64=2.40=h41732ed_0 - lerc=4.0.0=h27087fc_0 - libarchive=3.5.2=hb890918_3 - libblas=3.9.0=17_linux64_openblas - libcblas=3.9.0=17_linux64_openblas - libclang=13.0.1=default_h7634d5b_3 - libcurl=7.87.0=h6312ad2_0 - libcxx=16.0.6=h00ab1b0_0 - libcxxabi=16.0.6=ha770c72_0 - libdeflate=1.14=h166bdaf_0 - libdrm=2.4.114=h166bdaf_0 - libdrm-cos6-x86_64=2.4.65=4 - libedit=3.1.20191231=he28a2e2_2 - libelas=isis7=h3fd9d12_0 - libev=4.33=h516909a_1 - libevent=2.1.10=h9b69904_4 - libexpat=2.5.0=hcb278e6_1 - libffi=3.4.2=h7f98852_5 - libgcc-devel_linux-64=12.3.0=h8bca6fd_0 - libgcc-ng=13.2.0=h807b86a_2 - libgdal=3.5_isis8=h3fd9d12_0 - libgfortran-ng=13.1.0=h69a702a_0 - libgfortran5=13.1.0=h15d22d2_0 - libglib=2.76.4=hebfc3b9_0 - libglu=9.0.0=he1b5a44_1001 - libglvnd-cos7-x86_64=1.0.1=h9b0a68f_1105 - libgomp=13.2.0=h807b86a_2 - libhwloc=2.8.0=h32351e8_1 - libiconv=1.17=h166bdaf_0 - libidn2=2.3.4=h166bdaf_0 - libjemalloc=5.3.0=hcb278e6_0 - liblapack=3.9.0=17_linux64_openblas - liblapacke=3.9.0=17_linux64_openblas - libllvm13=13.0.1=hf817b99_2 - libmicrohttpd=0.9.77=h97afed2_0 - libnabo=isis7=h3fd9d12_0 - libnghttp2=1.51.0=hdcd2b5c_0 - libnsl=2.0.0=h7f98852_0 - libntlm=1.4=h7f98852_1002 - libogg=1.3.4=h7f98852_1 - libopenblas=0.3.23=pthreads_h80387f5_0 - libopencv=4.5.5=py39hb0e02d1_7 - libopus=1.3.1=h7f98852_1 - libpciaccess=0.17=h166bdaf_0 - libpng=1.6.39=h753d276_0 - libpointmatcher=isis7=h2bc3f7f_0 - libpq=14.5=h2baec63_5 - libprotobuf=3.19.6=h3eb15da_0 - libsanitizer=12.3.0=h0f45ef3_0 - libsqlite=3.43.0=h2797004_0 - libssh2=1.10.0=haa6b8db_3 - libstdcxx-devel_linux-64=12.3.0=h8bca6fd_0 - libstdcxx-ng=13.2.0=h7e041cc_2 - libtasn1=4.19.0=h166bdaf_0 - libtiff=4.4.0=h82bc61c_5 - libunistring=0.9.10=h7f98852_0 - libuuid=2.38.1=h0b41bf4_0 - libuv=1.46.0=hd590300_0 - libva=2.18.0=h0b41bf4_0 - libvorbis=1.3.7=h9c3ff4c_0 - libvpx=1.11.0=h9c3ff4c_3 - libwebp-base=1.3.1=hd590300_0 - libx11-common-cos6-x86_64=1.6.4=4 - libx11-cos6-x86_64=1.6.4=4 - libxcb=1.13=h7f98852_1004 - libxkbcommon=1.0.3=he3ba5ed_0 - libxml2=2.9.14=haae042b_4 - libzlib=1.2.13=hd590300_5 - llvm-openmp=16.0.6=h4dfa4b3_0 - lz4-c=1.9.3=h9c3ff4c_1 - lzo=2.10=h516909a_1000 - mesa-libgl-cos6-x86_64=11.0.7=4 - mesalib=23.0.0=h0fe20ba_0 - metis=5.1.0=h59595ed_1007 - mpfr=4.2.0=hb012696_0 - multiview=isis8=py39h3fd9d12_0 - mysql=8.0.28=h3e2b116_2 - mysql-client=8.0.28=hf89ab62_2 - mysql-common=8.0.28=haf5c9bc_2 - mysql-connector-c=6.1.11=h6eb9d5d_1007 - mysql-devel=8.0.28=haf5c9bc_2 - mysql-libs=8.0.28=h28c427c_2 - mysql-server=8.0.28=hb253900_2 - nanoflann=1.4.2=ha770c72_0 - ncurses=6.4=hcb278e6_0 - nettle=3.8.1=hc379101_1 - networkx=3.1=pyhd8ed1ab_0 - nlohmann_json=3.11.2=h27087fc_0 - nn=1.86.0=hd590300_2003 - nspr=4.35=h27087fc_0 - nss=3.92=h1d7d5a4_0 - numpy=1.25.2=py39h6183b62_0 - openblas=0.3.23=pthreads_h855a84d_0 - opencv=4.5.5=py39hf3d152e_7 - openexr=2.5.5=hf817b99_0 - openh264=2.3.1=hcb278e6_2 - openjpeg=2.3.0=hf38bd82_1003 - openssl=1.1.1v=hd590300_0 - p11-kit=0.24.1=hc5aa10d_0 - packaging=23.1=pyhd8ed1ab_0 - parallel=20230722=ha770c72_0 - pbzip2=1.1.13=0 - pcl=1.11.1=h05311af_1 - pcre2=10.40=hc3806b6_0 - pdal=2.4.2_asp3.3.0=py39h3fd9d12_0 - perl=5.32.1=4_hd590300_perl5 - pip=23.2.1=pyhd8ed1ab_0 - pixman=0.40.0=h36c2ea0_0 - platformdirs=3.10.0=pyhd8ed1ab_0 - pooch=1.7.0=pyha770c72_3 - proj=9.1.0=h93bde94_0 - protobuf=3.19.6=py39h227be39_0 - pthread-stubs=0.4=h36c2ea0_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.5.5=py39hef51801_7 - pysocks=1.7.1=pyha2e5f31_6 - python=3.9.15=h47a2c10_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2023.3.post1=pyhd8ed1ab_0 - pyyaml=6.0.1=py39hd1e30aa_0 - qhull=2020.2=h4bd325d_2 - qt=5.12.9=h1304e3e_6 - qwt=6.2.0=hb19a904_2 - rapidjson=1.1.0=he1b5a44_1002 - rclone=1.63.1=h519d9b9_0 - readline=8.2=h8228510_1 - requests=2.31.0=pyhd8ed1ab_0 - rhash=1.4.3=hd590300_2 - rocksdb=6.13.3=hda8cf21_2 - s2p-subset=isis7=h3fd9d12_0 - scipy=1.11.2=py39h6183b62_0 - setuptools=68.1.2=pyhd8ed1ab_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.10=h9fff704_0 - spiceypy=6.0.0=pyhd8ed1ab_0 - sqlite=3.43.0=h2c6b66d_0 - suitesparse=5.10.1=h9e50725_1 - superlu=5.2.2=h00795ac_0 - svt-av1=1.3.0=h27087fc_0 - sysroot_linux-64=2.17=h4a8ded7_13 - tbb=2021.7.0=h924138e_1 - tbb-devel=2021.7.0=h924138e_1 - tiledb=2.9.5=h1e4a385_0 - tk=8.6.12=h27826a3_0 - tnt=126=0 - typing-extensions=4.7.1=hd8ed1ab_0 - typing_extensions=4.7.1=pyha770c72_0 - tzdata=2023c=h71feb2d_0 - urllib3=2.0.4=pyhd8ed1ab_0 - usgscsm=1.7.0=h00ab1b0_1 - wheel=0.41.2=pyhd8ed1ab_0 - x264=1!164.3095=h166bdaf_2 - x265=3.5=h924138e_3 - xerces-c=3.2.3=h8ce2273_4 - xorg-damageproto=1.2.1=h7f98852_1002 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-glproto=1.4.17=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.1.1=hd590300_0 - xorg-libsm=1.2.4=h7391055_0 - xorg-libx11=1.8.4=h0b41bf4_0 - xorg-libxau=1.0.11=hd590300_0 - xorg-libxdamage=1.1.5=h7f98852_1 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h0b41bf4_2 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrandr=1.5.2=h7f98852_1 - xorg-libxrender=0.9.10=h7f98852_1003 - xorg-randrproto=1.5.0=h7f98852_1001 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-util-macros=1.19.3=h7f98852_0 - xorg-xextproto=7.3.0=h0b41bf4_1003 - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - zlib=1.2.13=hd590300_5 - zstd=1.5.5=hfc55251_0 ================================================ FILE: conda/asp_deps_3.4.0_alpha_osx_env.yaml ================================================ name: asp_deps_3.4.0_alpha channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge dependencies: - ale=0.9.1=py39h8ee36c8_0 - aom=3.5.0=hf0c8a7f_0 - armadillo=12.6.1=hdc495e4_0 - arpack=3.7.0=hefb7bc6_2 - blas=2.117=openblas - blas-devel=3.9.0=17_osx64_openblas - boost=1.72.0=py39hb64e6f8_1 - boost-cpp=1.72.0=hf3dc895_6 - brotli-python=1.1.0=py39h840bb9f_0 - bullet=2.86.1=0 - bz2file=0.98=py_0 - bzip2=1.0.8=h0d85af4_4 - c-ares=1.19.1=h0dc2134_0 - c-compiler=1.5.2=hbf74d83_0 - ca-certificates=2023.7.22=h8857fd0_0 - cairo=1.16.0=h9e0e54b_1010 - cctools=973.0.1=h76f1dac_13 - cctools_osx-64=973.0.1=hcc6d90d_13 - ceres-solver=1.14.0=h636452b_15 - certifi=2023.7.22=pyhd8ed1ab_0 - charset-normalizer=3.2.0=pyhd8ed1ab_0 - clang=14.0.6=h694c41f_1 - clang-14=14.0.6=default_hdb78580_1 - clang_osx-64=14.0.6=h3113cd8_6 - clangxx=14.0.6=default_hdb78580_1 - clangxx_osx-64=14.0.6=h6f97653_6 - cmake=3.27.4=hf40c264_4 - compiler-rt=14.0.6=h613da45_0 - compiler-rt_osx-64=14.0.6=hab78ec2_0 - compilers=1.5.2=h694c41f_0 - csm=3.0.3.3=0 - cspice=67=hb7f2c08_4 - curl=8.2.1=h5f667d7_0 - cxx-compiler=1.5.2=hb8565cd_0 - cyrus-sasl=2.1.27=hf9bab2b_7 - eigen=3.4.0=h1c7c39f_0 - embree=2.17.7=h694c41f_3 - expat=2.5.0=hf0c8a7f_1 - ffmpeg=4.4.2=gpl_hff0bab5_109 - fftw=3.3.10=nompi_h4fa670e_108 - fgr=isis7=h01edc0c_0 - flann=1.9.1=h30321d8_1010 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=hab24e00_0 - fontconfig=2.14.2=h5bb23bf_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - fortran-compiler=1.5.2=haad3a49_0 - freetype=2.12.1=h3f81eb7_1 - geoid=1.0_isis7=1 - geos=3.9.1=he49afe7_2 - geotiff=1.7.1=he29fd1c_4 - gettext=0.21.1=h8a4c099_0 - gflags=2.2.2=hb1e8313_1004 - gfortran=11.4.0=h2c809b3_1 - gfortran_impl_osx-64=11.4.0=h2a33dde_1 - gfortran_osx-64=11.4.0=h18f7dce_1 - giflib=5.2.1=hb7f2c08_3 - glog=0.6.0=h8ac2a54_0 - gmp=6.2.1=h2e338ed_0 - gnutls=3.7.8=h207c4f0_0 - graphite2=1.3.13=h2e338ed_1001 - gsl=2.6=h71c5fe9_2 - harfbuzz=4.2.0=h48644e2_0 - hdf5=1.12.1=nompi_h0aa1fa2_104 - htdp=1.0_isis7=1 - icu=69.1=he49afe7_0 - idna=3.4=pyhd8ed1ab_0 - ilmbase=2.5.5=hfab91a5_0 - inja=3.3.0=he49afe7_0 - isis=8.0.0=np125_0 - isl=0.25=hb486fe8_0 - jama=125=0 - jasper=2.0.33=h7c6fec8_1 - jemalloc=5.3.0=hf0c8a7f_0 - jpeg=9e=hb7f2c08_3 - kakadu=1=0 - krb5=1.21.1=hb884880_0 - lame=3.100=hb7f2c08_1003 - ld64=609=hc6ad406_13 - ld64_osx-64=609=hfd63004_13 - lerc=4.0.0=hb486fe8_0 - libblas=3.9.0=17_osx64_openblas - libcblas=3.9.0=17_osx64_openblas - libclang=13.0.1=root_62804_h2961583_3 - libclang-cpp14=14.0.6=default_hdb78580_1 - libcurl=8.2.1=h5f667d7_0 - libcxx=16.0.6=hd57cbcb_0 - libdeflate=1.14=hb7f2c08_0 - libedit=3.1.20191231=h0678c8f_2 - libelas=isis7=h01edc0c_0 - libev=4.33=haf1e3a3_1 - libevent=2.1.10=h7d65743_4 - libexpat=2.5.0=hf0c8a7f_1 - libffi=3.4.2=h0d85af4_5 - libgdal=3.5_isis8=hf8dc8b4_0 - libgfortran=5.0.0=12_3_0_h97931a8_1 - libgfortran-devel_osx-64=11.4.0=h01aa347_1 - libgfortran5=12.3.0=hbd3c1fe_1 - libglib=2.76.4=hc62aa5d_0 - libiconv=1.17=hac89ed1_0 - libidn2=2.3.4=hb7f2c08_0 - libjemalloc=5.3.0=hf0c8a7f_0 - liblapack=3.9.0=17_osx64_openblas - liblapacke=3.9.0=17_osx64_openblas - libllvm13=13.0.1=h64f94b2_2 - libllvm14=14.0.6=hc8e404f_4 - libnabo=isis7=h01edc0c_0 - libnghttp2=1.52.0=he2ab024_0 - libntlm=1.4=h0d85af4_1002 - libopenblas=0.3.23=openmp_h429af6e_0 - libopencv=4.5.5=py39hc2bf5a6_7 - libpng=1.6.39=ha978bb4_0 - libpointmatcher=isis7=ha5a8b8e_0 - libpq=14.5=h3df487d_7 - libprotobuf=3.19.6=hbc0c0cd_0 - libsqlite=3.42.0=h58db7d2_0 - libssh2=1.11.0=hd019ec5_0 - libtasn1=4.19.0=hb7f2c08_0 - libtiff=4.4.0=h6268bbc_5 - libunistring=0.9.10=h0d85af4_0 - libuv=1.46.0=h0c2f820_0 - libvpx=1.11.0=he49afe7_3 - libwebp-base=1.3.1=h0dc2134_0 - libxcb=1.15=hb7f2c08_0 - libxml2=2.9.14=h1faee8b_4 - libzlib=1.2.13=h8a1eda9_5 - llvm-openmp=16.0.6=hff08bdf_0 - llvm-tools=14.0.6=hc8e404f_4 - lz4-c=1.9.3=he49afe7_1 - macports-legacy-support=1.0.13=h0dc2134_0 - mesalib=23.1.4=hb59017c_0 - metis=5.1.0=he965462_1007 - mpc=1.3.1=h81bd1dd_0 - mpfr=4.2.0=h4f9bd69_0 - multiview=isis8=py39hf8dc8b4_0 - mysql=8.0.28=h88f4db0_2 - mysql-client=8.0.28=h7ddd48c_2 - mysql-common=8.0.28=hdd8d184_2 - mysql-devel=8.0.28=hdd8d184_2 - mysql-libs=8.0.28=h353f102_2 - mysql-server=8.0.28=h6edde1b_2 - nanoflann=1.4.2=h694c41f_0 - ncurses=6.4=hf0c8a7f_0 - nettle=3.8.1=h96f3785_1 - networkx=3.1=pyhd8ed1ab_0 - nlohmann_json=3.11.2=hbbd2c75_0 - nn=1.86.0=h0dc2134_2003 - nspr=4.35=hea0b92c_0 - nss=3.92=hd6ac835_0 - numpy=1.25.2=py39h892e69a_0 - openblas=0.3.23=openmp_hbefa662_0 - opencv=4.5.5=py39h6e9494a_7 - openexr=2.5.5=h7fa7ffa_0 - openh264=2.3.1=hf0c8a7f_2 - openjpeg=2.3.0=h3bf0609_1003 - openssl=3.1.2=h8a1eda9_0 - p11-kit=0.24.1=h65f8906_0 - packaging=23.1=pyhd8ed1ab_0 - parallel=20230722=h694c41f_0 - pbzip2=1.1.13=h9d27c22_1 - pcl=1.11.1=h7984e4d_1 - pcre2=10.40=h1c4e4bc_0 - pdal=2.4.2_asp3.3.0=py39hf8dc8b4_0 - perl=5.32.1=4_h0dc2134_perl5 - pip=23.2.1=pyhd8ed1ab_0 - pixman=0.40.0=hbcb3906_0 - platformdirs=3.10.0=pyhd8ed1ab_0 - pooch=1.7.0=pyha770c72_3 - proj=9.1.0=hcbd9701_0 - protobuf=3.19.6=py39h7a8716b_0 - pthread-stubs=0.4=hc929b4f_1001 - pvl=1.3.2=pyhd8ed1ab_0 - py-opencv=4.5.5=py39h71a6800_7 - pysocks=1.7.1=pyha2e5f31_6 - python=3.9.17=h07e1443_0_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python_abi=3.9=3_cp39 - pytz=2023.3.post1=pyhd8ed1ab_0 - pyyaml=6.0.1=py39hdc70f33_0 - qhull=2020.2=h940c156_2 - qt=5.12.9=h2a607e2_5 - qwt=6.2.0=h0f3c874_2 - rapidjson=1.1.0=hb1e8313_1002 - rclone=1.63.1=h1762f63_0 - readline=8.2=h9e318b2_1 - requests=2.31.0=pyhd8ed1ab_0 - rhash=1.4.4=h0dc2134_0 - rocksdb=6.13.3=hbb73eaa_2 - s2p-subset=isis7=h01edc0c_0 - scipy=1.11.2=py39hded996c_0 - setuptools=68.1.2=pyhd8ed1ab_0 - sigtool=0.1.3=h88f4db0_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.10=h225ccf5_0 - spiceypy=6.0.0=pyhd8ed1ab_0 - sqlite=3.42.0=h2b0dec6_0 - suitesparse=5.10.1=h7aff33d_1 - superlu=5.2.2=h1f0f902_0 - svt-av1=1.3.0=hf0c8a7f_0 - tapi=1100.0.11=h9ce4665_0 - tbb=2021.10.0.custom_asp=h6b95b14_0 - tbb-devel=2021.10.0.custom_asp=h6b95b14_0 - tiledb=2.9.5=h86bd37b_0 - tk=8.6.12=h5dbffcc_0 - tnt=126=0 - typing-extensions=4.7.1=hd8ed1ab_0 - typing_extensions=4.7.1=pyha770c72_0 - tzdata=2023c=h71feb2d_0 - urllib3=2.0.4=pyhd8ed1ab_0 - usgscsm=1.7.0=h1c7c39f_1 - wheel=0.41.2=pyhd8ed1ab_0 - x264=1!164.3095=h775f41a_2 - x265=3.5=hbb4e6a2_3 - xerces-c=3.2.3=h6564042_4 - xorg-damageproto=1.2.1=h0d85af4_1002 - xorg-fixesproto=5.0=h0d85af4_1002 - xorg-glproto=1.4.17=h0d85af4_1002 - xorg-inputproto=2.3.2=h35c211d_1002 - xorg-kbproto=1.0.7=h35c211d_1002 - xorg-libice=1.1.1=h0dc2134_0 - xorg-libsm=1.2.4=h0dc2134_0 - xorg-libx11=1.8.6=hbd0b022_0 - xorg-libxau=1.0.11=h0dc2134_0 - xorg-libxdamage=1.1.5=h0d85af4_1 - xorg-libxdmcp=1.1.3=h35c211d_0 - xorg-libxext=1.3.4=hb7f2c08_2 - xorg-libxfixes=5.0.3=h0d85af4_1004 - xorg-libxi=1.7.10=h0d85af4_0 - xorg-libxrandr=1.5.2=h0d85af4_1 - xorg-libxrender=0.9.11=h0dc2134_0 - xorg-randrproto=1.5.0=h0d85af4_1001 - xorg-renderproto=0.11.1=h0d85af4_1002 - xorg-util-macros=1.19.3=h35c211d_0 - xorg-xextproto=7.3.0=hb7f2c08_1003 - xorg-xf86vidmodeproto=2.3.1=h0d85af4_1002 - xorg-xproto=7.0.31=h35c211d_1007 - xz=5.2.6=h775f41a_0 - yaml=0.2.5=h0d85af4_2 - zlib=1.2.13=h8a1eda9_5 - zstd=1.5.5=h829000d_0 ================================================ FILE: conda/environment.yml ================================================ # Placeholder minimal asp deps conda environement. Not yet fully fleshed out. # Use instead the ones at: conda/asp_deps_3.4.0*.yaml name: asp_deps channels: - nasa-ames-stereo-pipeline - usgs-astrogeology - conda-forge dependencies: - pdal 2.6.0 - opencv 4.8.1 - cmake>=3.15 - csm - eigen - nlohmann_json - proj - sqlite>=3.11 ================================================ FILE: conda/update_versions.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' Use dependency versions from a conda environment .yaml file to update a recipe/meta.yaml file of a given package. Such an input file can be created from the given environment with: conda env export > myEnv.yaml ''' import sys, os, re if len(sys.argv) < 3: print("Usage: " + os.path.basename(sys.argv[0]) + " input.yaml myPackage-feedstock") sys.exit(1) inFile = sys.argv[1] outDir = sys.argv[2] outFile = outDir + "/recipe/meta.yaml" if not os.path.exists(outFile): print("Cannot open file: " + outFile) # Recent versions of conda-build use recipe/recipe.yaml outFile = outDir + "/recipe/recipe.yaml" if not os.path.exists(outFile): print("Cannot open file: " + outFile) sys.exit(1) else: print("Found file: " + outFile) # parse the versions from the conda env conda_env = {} print("Reading: " + inFile) inHandle = open(inFile, 'r') lines = inHandle.readlines() for line in lines: # Wipe comments m = re.match(r'^(.*?)\#', line) if m: line = m.group(1) # Match the package m = re.match(r'^\s*-\s*(.*?)\s*=+\s*(.*?)(=|\s|$)', line) if not m: continue package = m.group(1) version = m.group(2) if re.match(r'^\s*$', package): continue # ignore empty lines conda_env[package] = version #print("got ", package, version) # Update the lines in the output ile outHandle = open(outFile, 'r') lines = outHandle.readlines() inDepSection = False for it in range(len(lines)): line = lines[it] if 'requirements:' in line: # We are at the beginning of the dependencies inDepSection = True continue if not inDepSection: # We are not in the dependencies section continue if 'test:' in line or 'tests:' in line or 'about:' in line: # We are at the end of the dependencies break # Ignore comments m = re.match(r'^\#', line) if m: continue # Match the package m = re.match(r'^(\s+-\s*)(.*?)([\s=]+)(.*?)$', line) if not m: continue pre = m.group(1) package = m.group(2) separator = m.group(3).rstrip("\n") old_version = m.group(4).rstrip("\n") if separator == "": # Ensure there's at least one space separator = " " if old_version == "": # If there was no version before, print a warning, as sometimes the # version chosen later won't be the expected one. print("Warning: For package " + package + ", no version was specified, " "this may lead to unexpected results.") continue if not package in conda_env: continue version = conda_env[package] if old_version != version: if ('[linux]' in old_version) or ('[osx]' in old_version): # In this case the user better take a closer look print("For package " + package + ", not replacing " + old_version + " with " + version + ", a closer look is suggested.") else: print("For package " + package + ", replacing version " + old_version + " with " + version) lines[it] = pre + package + separator + version + "\n" # Save the updated lines to disk print("Updating: " + outFile) outHandle = open(outFile, "w") outHandle.writelines(lines) outHandle.close() ================================================ FILE: docs/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SPHINXPROJ = AmesStereoPipeline SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docs/acknowledgements.rst ================================================ Credits ======= .. include:: ../AUTHORS.rst ================================================ FILE: docs/bathy_water_masking.rst ================================================ .. _bathy_water_masking: Bathy water masking =================== For shallow water bathymetry (:numref:`bathy_intro`) it is important to distinguish land pixels from water pixels. This allows the algorithm to focus on underwater terrain while avoiding false depth estimates from land features. A simple and commonly used approach is to threshold the near-infrared (NIR) band 7, where water typically appears darker than land. This method is described in :numref:`bathy_thresh`. In complex coastal environments with vegetation, shadows, turbid water, or shallow clear water, the NIR band alone may not provide sufficient separation. This section describes alternative spectral indices that combine multiple bands that may improve land-water discrimination. Multispectral image bands ------------------------- WorldView satellites capture multispectral imagery with eight bands. .. list-table:: WorldView-3 multispectral bands :widths: 10 30 :header-rows: 1 * - Band - Name * - 1 - Coastal * - 2 - Blue * - 3 - Green * - 4 - Yellow * - 5 - Red * - 6 - Red Edge * - 7 - NIR1 (Near-infrared 1) * - 8 - NIR2 (Near-infrared 2) Other vendors provide similar products. Individual bands can be extracted from a multispectral image with ``gdal_translate`` (:numref:`gdal_tools`). For example, run this for the green band (band 3):: b=3 gdal_translate -b ${b} -co compress=lzw -co TILED=yes \ -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \ input.TIF input_b${b}.tif The compression and tiling options help with the performance of ASP processing later. Water indices for land-water masking ------------------------------------ The following indices provide alternatives to band 7 (NIR1), as described in :numref:`bathy_thresh`. NDWI (Normalized Difference Water Index) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NDWI is computed as: .. math:: \text{NDWI} = \frac{\text{Green} - \text{NIR}}{\text{Green} + \text{NIR}} This index enhances the contrast between water and land. Water typically has positive values, while land and vegetation have negative values. It is effective for general water delineation and separates water from soil and terrestrial vegetation well. To compute NDWI using ``image_calc`` (:numref:`image_calc`), do:: image_calc -c "(var_0 - var_1) / (var_0 + var_1)" \ input_b3.tif input_b7.tif -o ndwi.tif where ``input_b3.tif`` is the green band and ``input_b7.tif`` is the NIR band. RNDVI (Reversed Normalized Difference Vegetation Index) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RNDVI is computed as: .. math:: \text{RNDVI} = \frac{\text{Red} - \text{NIR}}{\text{Red} + \text{NIR}} This is the inverse of the standard NDVI (which is high for vegetation). In RNDVI, water appears bright (high values) while vegetation appears very dark (low or negative values). This index is particularly effective in areas with heavy vegetation along the shoreline, such as mangroves or dense forests, where standard NIR masking may be ambiguous. To compute RNDVI using ``image_calc`` run:: image_calc -c "(var_0 - var_1) / (var_0 + var_1)" \ input_b5.tif input_b7.tif -o rndvi.tif where ``input_b5.tif`` is the red band and ``input_b7.tif`` is the NIR band. OSI (Ocean/Sea Index) ~~~~~~~~~~~~~~~~~~~~~ OSI is computed as: .. math:: \text{OSI} = \frac{\text{Green} + \text{Red}}{\text{Blue}} This index uses the ratio of longer visible wavelengths to blue. It can be useful for specific water conditions, though it is often less robust in clear shallow water than NDWI or RNDVI. The ``image_calc`` command is:: image_calc -c "(var_0 + var_1) / var_2" \ input_b3.tif input_b5.tif input_b2.tif -o osi.tif where ``input_b3.tif`` is the green band, ``input_b5.tif`` is the red band, and ``input_b2.tif`` is the blue band. Thresholding ------------ The resulting index images (``ndwi.tif``, ``rndvi.tif``, ``osi.tif``) can be converted to binary water masks. This requires computing an appropriate threshold. Here's an example that invokes ``otsu_threshold`` (:numref:`otsu_threshold`) for that purpose, with ``ndwi.tif``: :: otsu_threshold ndwi.tif This will print the computed threshold to standard output. This value should then be used in the masking command below. Mask creation ------------- When creating binary masks from these indices it is important to note the following. **Polarity reversal:** Unlike the raw NIR band (band 7) in :numref:`bathy_thresh`, where water is darker than land, the spectral indices NDWI and RNDVI make water appear brighter. This affects how binary masks are created from thresholds. The mask convention is that **land pixels have value 1** (or positive values) and **water pixels have value 0** (or nodata). For the NIR band, water pixels are *at or below* the threshold and land pixels are *strictly above*, so the masking command is:: threshold=225 image_calc -c "gt(var_0, $threshold, 1, 0)" \ input_b7.tif -o land_mask.tif For NDWI and RNDVI, water pixels are *at or above* the threshold and land pixels are *strictly below*:: threshold=0.38 image_calc -c "lt(var_0, $threshold, 1, 0)" \ ndwi.tif -o land_mask.tif Note the reversed comparison operator (``gt`` vs ``lt``) to maintain the convention that land=1 and water=0. **Site-specific performance:** The effectiveness of these indices varies depending on local water conditions, bottom composition, turbidity, and shoreline vegetation. In testing, NDWI and NIR band 7 showed the most consistent thresholds across images. RNDVI might be effective for vegetated shorelines but could require site-specific threshold adjustment. The results with OSI were not as promising in our experiments (for Key West, FL). It is recommended to compute all indices and visually inspect the produced masks in ``stereo_gui`` (:numref:`stereo_gui`) before selecting the most appropriate one for your specific site. ================================================ FILE: docs/bibliography.bib ================================================ %% This BibTeX bibliography file was created using BibDesk. %% http://bibdesk.sourceforge.net/ %% Created for Ross Beyer at 2009-03-18 17:10:33 -0700 %% Saved with string encoding Unicode (UTF-8) @article{2001JGR.10623429M, Adsnote = {Provided by the NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623429M&db_key=AST}, Author = {{Malin}, M.~C. and {Edgett}, K.~S.}, Date-Added = {2009-03-18 17:07:55 -0700}, Date-Modified = {2009-03-18 17:07:55 -0700}, Journal = {Journal of Geophysical Research}, Keywords = {spacecraft; MOC;}, Month = oct, Number = {E10}, Pages = {23429-23570}, Title = {{{Mars Global Surveyor} {Mars Orbiter Camera}: Interplanetary cruise through primary mission}}, Volume = 106, Year = 2001, Bdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623429M&db_key=AST}} @article{1992JGR.97.7699M, Adsnote = {Provided by the NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7699M&db_key=AST}, Author = {{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.}, Date-Added = {2009-03-18 17:07:19 -0700}, Date-Modified = {2009-03-18 17:07:19 -0700}, Hardcopy = {Yes}, Journal = {Journal of Geophysical Research}, Keywords = {spacecraft; MOC;}, Month = may, Number = {E5}, Pages = {7699-7718}, Title = {{Mars Observer Camera}}, Volume = 97, Year = 1992, Bdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7699M&db_key=AST}} @article{2007SSRv..129..391C, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2007SSRv..129..391C}, Author = {{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.}, Date-Added = {2009-03-13 21:46:40 -0700}, Date-Modified = {2009-03-13 21:46:40 -0700}, Journal = {Space Science Reviews}, Keywords = {Moon, Lunar, Vision for Space Exploration, NASA, Spacecraft, Space instrumentation, Remote observation}, Month = apr, Pages = {391-419}, Title = {{Lunar Reconnaissance Orbiter Overview: The Instrument Suite and Mission}}, Volume = 129, Year = 2007, Bdsk-Url-1 = {http://dx.doi.org/10.1007/s11214-007-9153-y}, Bdsk-Url-2 = {http://adsabs.harvard.edu/abs/2007SSRv..129..391C}} @article{2008AGUFM.P31B1419N, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2008AGUFM.P31B1419N}, Author = {{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.}, Date-Added = {2009-03-13 21:46:07 -0700}, Date-Modified = {2009-03-13 21:46:07 -0700}, Journal = {AGU Fall Meeting Abstracts}, Keywords = {1221 Lunar and planetary geodesy and gravity (5417, 5450, 5714, 5744, 6019, 6250)}, Month = dec, Pages = {B1419+}, Title = {{Status of Lunar Reconnaissance Orbiter Laser Ranging and Laser Altimeter Experiments}}, Year = 2008, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2008AGUFM.P31B1419N}} @article{1992JGR....97.7781Z, Adsnote = {Provided by the NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7781Z&db_key=AST}, Author = {{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.}, Date-Added = {2009-03-13 21:38:33 -0700}, Date-Modified = {2009-03-13 21:38:33 -0700}, Journal = {Journal of Geophysical Research}, Keywords = {spacecraft; MOLA;}, Month = may, Number = {E5}, Pages = {7781-7797}, Title = {{The {Mars Observer} laser altimeter investigation}}, Volume = 97, Year = 1992, Bdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1992JGR....97.7781Z&db_key=AST}} @article{2001JGR...10623689S, Adsnote = {Provided by the NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623689S&db_key=AST}, Author = {{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.}}, Date-Added = {2009-03-13 21:37:55 -0700}, Date-Modified = {2009-03-13 21:37:55 -0700}, Journal = {Journal of Geophysical Research}, Keywords = {spacecraft; MOLA;}, Month = oct, Number = {E10}, Pages = {23689-23722}, Title = {{{Mars Orbiter Laser Altimeter}: Experiment summary after the first year of global mapping of Mars}}, Volume = 106, Year = 2001, Bdsk-Url-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2001JGR...10623689S&db_key=AST}} @inproceedings{surf08, Author = {Herbert Bay and Andreas Ess and Tinne Tuytelaars and Luc Van Gool}, Booktitle = {Computer Vision and Image Understanding (CVIU)}, Date-Added = {2009-03-13 17:08:04 -0700}, Date-Modified = {2009-03-13 17:10:41 -0700}, Number = {3}, Pages = {346-359}, Title = {{SURF}: Speeded Up Robust Features}, Url = {http://www.vision.ee.ethz.ch/~surf/}, Volume = {110}, Year = {2008}, Bdsk-Url-1 = {http://www.vision.ee.ethz.ch/~surf/}} @article{triggs00, Abstract = { 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.

Keywords: Bundle Adjustment, Scene Reconstruction, Gauge Freedom, Sparse Matrices, Optimization.}, Author = {Triggs, Bill and Mclauchlan, Philip F. and Hartley, Richard I. and Fitzgibbon, Andrew W. }, Citeulike-Article-Id = {239461}, Date-Added = {2009-03-13 17:02:18 -0700}, Date-Modified = {2009-03-13 17:03:02 -0700}, Journal = {Lecture Notes in Computer Science}, Keywords = {3d, from, motion, reconstruction, structure}, Month = {January}, Pages = {298+}, Posted-At = {2008-06-11 14:50:00}, Priority = {2}, Title = {Bundle Adjustment -- A Modern Synthesis}, Volume = {1883}, Year = {2000}, Bdsk-Url-1 = {http://www.metapress.com/link.asp?id=PLVCRQ5BX753A2TN}} @article{Pomerleau12comp, author = {Pomerleau, Fran{\c c}ois and Colas, Francis and Siegwart, Roland and Magnenat, St{\'e}phane}, title = {{Comparing ICP Variants on Real-World Data Sets}}, journal = {Autonomous Robots}, year = {2013}, volume = {34}, number = {3}, pages = {133--148}, month = feb } @book{hartley04, Author = {Hartley, R.~I. and Zisserman, A.}, Date-Added = {2009-03-13 16:53:28 -0700}, Date-Modified = {2009-03-13 16:53:28 -0700}, Edition = {Second}, Publisher = {Cambridge University Press, ISBN: 0521540518}, Title = {Multiple View Geometry in Computer Vision}, Year = {2004}} @inproceedings{moore09, Author = {Moore, Zach and Wright, Dan and Lewis, Chris and Schinstock, Dale}, Booktitle = {ASPRS Annual Conf., Baltimore, Maryland}, Date-Added = {2009-03-13 16:40:51 -0700}, Date-Modified = {2009-03-13 17:00:03 -0700}, Title = {Comparison of Bundle Adjustment Formulations}, Year = {2009}} #MRO @INPROCEEDINGS{ johnston03, author = {Johnston, M. D. and Graf, J. E. and Zurek, R. W. and Eisen, H. J. and Jai, B.}, title = {{The Mars Reconnaissance Orbiter Mission}}, booktitle = {2003 IEEE Aerospace Conference}, pages = {447-464}, year = 2003 } # LRO stuff @INPROCEEDINGS{2005LPI....36.1576R, author = {{Robinson}, M.~S. and {Eliason}, E.~M. and {Hiesinger}, H. and {Jolliff}, B.~L. and {McEwen}, A.~S. and {Malin}, M.~C. and {Ravine}, M.~A. and {Roberts}, D. and {Thomas}, P.~C. and {Turtle}, E.~P. }, title = "{LROC -- Lunar Reconnaissance Orbiter Camera}", booktitle = {Lunar and Planetary Science XXXVI}, year = 2005, editor = {{Mackwell}, S. and {Stansbery}, E.}, month = mar, number = {\#1576}, organization = {Lunar and Planetary Institute, Houston (CD-ROM)}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2005LPI....36.1576R&db_key=AST}, adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System} } @INPROCEEDINGS{2006LPI....37.1949C, author = {{Chin}, G. and {Bartels}, A. and {Brylow}, S. and {Foote}, M. and {Garvin}, J. and {Kaspar}, J. and {Keller}, J. and {Mitrofanov}, I. and {Raney}, K. and {Robinson}, M. and {Smith}, D. and {Spence}, H. and {Spudis}, P. and {Stern}, S.~A. and {Zuber}, M.}, title = "{Lunar Reconnaissance Orbiter Overview: The Instrument Suite and Mission}", booktitle = {Lunar and Planetary Science XXXVII}, year = 2006, editor = {{Mackwell}, S. and {Stansbery}, E.}, month = mar, pages = {\#1949}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2006LPI....37.1949C&db_key=AST}, adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System} } % SOCET SET ? @INPROCEEDINGS{2006LPI....37.2050K, author = {{Kirk}, R.~L. and {Howington-Kraus}, E. and {Galuszka}, D. and {Redding}, B. and {Hare}, T.~M. and {Heipke}, C. and {Oberst}, J. and {Neukum}, G. and {HRSC Co-Investigator Team}}, title = "{Mapping Mars with HRSC, ISIS, and SOCET SET}", booktitle = {Lunar and Planetary Science XXXVII}, year = 2006, editor = {{Mackwell}, S. and {Stansbery}, E.}, month = mar, pages = {\#2050}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2006LPI....37.2050K&db_key=AST}, adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System} } % ISIS references: @INPROCEEDINGS{2004LPI.35.2039A, author = {{Anderson}, J.~A. and {Sides}, S.~C. and {Soltesz}, D.~L. and {Sucharski}, T.~L. and {Becker}, K.~J.}, title = "{Modernization of the Integrated Software for Imagers and Spectrometers}", booktitle = {Lunar and Planetary Science XXXV}, year = 2004, editor = {{Mackwell}, S. and {Stansbery}, E.}, month = mar, number = {\#2039}, organization = {Lunar and Planetary Institute, Houston (CD-ROM)}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2004LPI....35.2039A&db_key=AST}, adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System} } @INPROCEEDINGS{1997LPI.28.387G, author = {{Gaddis}, L. and {Anderson}, J. and {Becker}, K. and {Becker}, T. and {Cook}, D. and {Edwards}, K. and {Eliason}, E. and {Hare}, T. and {Kieffer}, H. and {Lee}, E.~M. and {Mathews}, J. and {Soderblom}, L. and {Sucharski}, T. and {Torson}, J. and {McEwen}, A. and {Robinson}, M.}, title = "{An Overview of the Integrated Software for Imaging Spectrometers (ISIS)}", booktitle = {Lunar and Planetary Science Conference}, year = 1997, month = mar, volume = 28, pages = {387}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1997LPI....28..387G&db_key=AST}, adsnote = {Provided by the NASA Astrophysics Data System} } @unpublished{ ISIS_website, author = {U.S. Geological Survey, Flagstaff, AZ}, title = {Integrated Software for Imagers and Spectrometers ({ISIS})}, url = {http://isis.astrogeology.usgs.gov/}, year= {2009}, note = "" } @unpublished{ HiRISE_website, author = {University of Arizona, Tuscon}, title = {The High Resolution Imaging Science Experiment}, url = {http://hirise.lpl.arizona.edu/}, year= {2009}, note ="" } % SPICE stuff @INPROCEEDINGS{1999LPI....30.1233A, author = {{Acton}, C.~H.}, title = "{SPICE Products Available to the Planetary Science Community}", booktitle = {Lunar and Planetary Science XXX}, year = 1999, month = mar, number = {\#1233}, organization = {Lunar and Planetary Institute, Houston (CD-ROM)}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1999LPI... .30.1233A&db_key=AST}, adsnote = {Provided by the NASA Astrophysics Data System} } @INPROCEEDINGS{1999ficm.conf.6042A, author = {{Acton}, C.~H. and {Bachman}, N.~J. and {Bytof}, J.~A. and {Semenov}, B.~V. and {Taber}, W. and {Turner}, F.~S. and {Wright}, E.~D.}, title = "{Examining {Mars} with SPICE}", booktitle = {Fifth International Conference on Mars}, year = 1999, month = jul, number = {\#6042}, organization = {Lunar and Planetary Institute, Houston (CD-ROM)}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1999ficm.conf.6042A&db_key=AST}, adsnote = {Provided by the NASA Astrophysics Data System} } @ARTICLE{1996P&SS...44...65A, author = {{Acton}, C.~H.}, title = "{Ancillary data services of NASA's Navigation and Ancillary Information Facility}", journal = {Planetary and Space Science}, year = 1996, month = jan, volume = 44, pages = {65-70}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1996P\%26SS...44...65A&db_key=AST}, adsnote = {Provided by the NASA Astrophysics Data System} } % HRSC Stuff: @INCOLLECTION{2004mesp.book...17N, author = {{Neukum}, G. and {Jaumann}, R.}, title = "{HRSC: the High Resolution Stereo Camera of Mars Express}", booktitle = "Mars Express: the scientific payload", editor = {{Wilson}, Andrew and {Chicarro}, Agustin}, publisher = "ESA Publications Division, Noordwijk, Netherlands", number = {ESA SP-1240}, year = 2004, month = aug, pages = {17-35}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2004mesp.bo ok...17N&db_key=AST}, adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System} } @INPROCEEDINGS{ ebner04, author = {Ebner H. and Spiegel M. and Albert B. and Bernd G. and Neukum G. et. al.}, title = {{Improving The Exterior Orientation of Mars Express Hrsc Imagery}}, booktitle = {XXth ISPRS Congress, Commission IV}, year = 2004 } % SLOG Stereo matching @ARTICLE{nishihara05, author = {{Nishihara}, H.K.}, title = {{Practical real-time imaging stereo matcher}}, journal = {Optical Engineering}, volume = 23, number = 5, year = 1984, pages = {{536-545}} } % Current ASP @INPROCEEDINGS{edwards06, author = {{Edwards}, L. and {Broxton}, M.}, title = {{Automated 3D Surface Reconstruction from Orbital Imagery}}, booktitle = {Proceedings of AIAA Space 2006}, location = {San Jose, California}, month = {September}, year = 2006 } % Stereo pipeline work for MER @INPROCEEDINGS{edwards05, author = {{Edwards}, L. and {Bowman}, J. and {Kunz}, C. and {Lees}, D. and {Sims}, M.}, title = {{Photo-realistic Terrain Modeling and Visualization for Mars Exploration Rover Science Operations}}, booktitle = {Proceedings of IEEE SMC 2005}, location = {Hawaii, USA}, month = {October}, year = 2005 } % Viz @ARTICLE{nguyen01, author = {Nguyen, L., et al.}, title = {{Virtual reality interfaces for visualization and control of remote vehicles}}, journal = {Autonomous Robots}, volume = 11, number = 1, year = 2001 } % Original Stereo Pipeline @ARTICLE{stoker99, author = {Stoker, C. et al.}, title = {{Analyzing Pathfinder data using virtual reality and superresolved imaging}}, journal = {Journal of Geophysical Research}, volume = 104, number = {E4}, pages = {8889-8906}, month = {April}, year = 1999 } @ARTICLE{gupta97, author = {Gupta, Rajiv and Hartley, Richard I.}, title = {{Linear Pushbroom Cameras}}, journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence}, volume = 19, number = 9, month = {September}, year = 1997 } % HRSC DTM Comparison @INPROCEEDINGS{heipke06, author = {C. Heipke and J. Oberst et. al}, title = {{The HRSC DTM Test}}, booktitle = {Symposium of ISPRS Commission IV - Geo Spatial Databases for Sustainable Development}, year = 2006 } % USGS analysis of MOC DTMs (some washboarding/DTM registration references) @ARTICLE{kirk02, author = {Kirk, R.L. and Soderblom, Laurence A. and Howington-Kraus, Elipitha and Archinal, Brent}, title = {{USGS High-Resolution Topomapping of Mars with Mars Orbiter Camera Narrow-Angle Images}}, journal = {IAPRS: GeoSpatial Theory, Processing and Applications}, volume = 34, part = 4, year = 2002 } @INPROCEEDINGS{2002LPI....33.1845I, author = {{Ivanov}, A.~B. and {Lorre}, J.~J.}, title = "{Analysis of Mars Orbiter Camera Stereo Pairs}", booktitle = {Lunar and Planetary Institute Conference Abstracts}, year = 2002, month = mar, pages = {1845-+}, adsurl = {http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2002LPI....33.1845I&db_key=AST}, adsnote = {Provided by the Smithsonian/NASA Astrophysics Data System} } % SIFT @ARTICLE{lowe04, author = {Lowe, David G.}, title = {{Distinctive Image Features from Scale-Invariant Keypoints}}, journal = { International Journal of Computer Vision }, year = 2004 } % RANSAC @ARTICLE{ fischler81, author = {Fischler, Martin A. and Bolles, Robert C.}, title = {{Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography}}, journal = {Graphics and Image Processing}, volume = 24, number = 6, month = {June}, year = 1981 } % Vision Workbench @unpublished{ visionworkbench, author = {NASA ARC Intelligent Systems Division}, title = {{NASA Vision Workbench}}, note = "NASA Ames Research Center, Moffett Field, CA. {\em http://ti.arc.nasa.gov/visionworkbench/}", url = {http://ti.arc.nasa.gov/visionworkbench/} } @unpublished{ brady06, author = {Brady, Tye}, title = {{ALHAT Requirements}}, note = "presentation at the Lunar Coordinate Systems Review Data Product Recommendation Meeting, NASA Ames Research Center, October 11.", } @string{ICCV = "International Conference on Computer Vision"} @string{CVPR = "IEEE Computer Vision and Pattern Recognition or CVPR."} @inproceedings{Stein06:attenuating, author = "Andrew Stein and Andres Huertas and Larry Matthies", title = "Attenuating Stereo Pixel-Locking via Affine Window Adaptation", booktitle = "IEEE International Conference on Robotics and Automation", pages = "914 - 921", month = "May", year = "2006" } @ARTICLE{Sun02rectangular, author="Sun, Changming", title="Fast Stereo Matching Using Rectangular Subregioning and 3D Maximum-Surface Techniques", journal="International Journal of Computer Vision", year="2002", month="Apr", day="01", volume="47", number="1", pages="99--117", issn="1573-1405", url="https://doi.org/10.1023/A:1014585622703" } @ARTICLE{Nishihara84practical, author = {H.K. Nishihara}, title = {{PRISM: A Practical real-time imaging stereo matcher}}, journal = {{Optical Engineering}}, volume = {23}, number = {5}, year = {1984}, pages = {536-545} } @ARTICLE{Szeliski03sampling, author = "Richard Szeliski and Daniel Scharstein", title = {{Sampling the Disparity Space Image}}, journal = {{IEEE Transactions on Pattern Analysis and Machine Intelligence (PAMI)}}, year = "2003", volume = "26", pages = "419 - 425" } @inproceedings{robinson05:lroc, author = "M.S. Robinson and E.M. Eliason and H. Hiesinger and B.L. Jolliff and A.S. McEwen and M.C. Malin and M.A. Ravine and D. Roberts and P.C. Thomas and E.P. Turtle", title = {{LROC - Lunar Reconaissance Orbiter Camera}}, booktitle = "Proc of the Lunar and Planetary Science Conference (LPSC) XXXVI", pages = "1576", month = "March", year = "2005" } @inproceedings{anderson08:isis, author = "J.A. Anderson", title = {{ISIS Camera Model Design}}, booktitle = "Proc of the Lunar and Planetary Science Conference (LPSC) XXXIX", pages = "2159", month = "March", year = "2008" } @inproceedings{lawrence08:apollo, author = "S. J. Lawrence and M. S. Robinson and M. Broxton and J. D. Stopar and W. Close and J. Grunsfeld and R. Ingram and L. Jefferson and S. Locke and R. Mitchell and T. Scarsella and M. White and M. A. Hager and T. R. Watters ad E. Bowman-Cisneros and J. Danton and J. Garvin", title = {{The Apollo Digital Image Archive: New Research and Data Products}}, booktitle = "Proc of the NLSI Lunar Science Conference", pages = "2066", year = "2008" } @ARTICLE{Baker04:lucas-kanade, author="Baker, Simon and Matthews, Iain", title="Lucas-Kanade 20 Years On: A Unifying Framework", journal="International Journal of Computer Vision", year="2004", month="Feb", day="01", volume="56", number="3", pages="221--255", issn="1573-1405", url="https://doi.org/10.1023/B:VISI.0000011205.11775.fd" } @phdthesis{Menard97:robust, author = {Christian Menard}, title = {{Robust Stereo and Adaptive Matching in Correlation Scale-Space}}, school = {Institute of Automation, Vienna Institute of Technology (PRIP-TR-45)}, year = "1997", month = "January" } @article{Nehab05:improved, author = {Diego Nehab and Szymon Rusinkiewicz and James Davis}, title = {Improved Sub-pixel Stereo Correspondences through Symmetric Refinement}, journal ={Computer Vision, IEEE International Conference on}, volume = {1}, year = {2005}, issn = {1550-5499}, pages = {557-563}, publisher = {IEEE Computer Society}, address = {Los Alamitos, CA, USA}, } @ARTICLE{cheng04:bayesian, title={Bayesian Stereo Matching}, author={ Li Cheng and Caelli, T.}, journal={Computer Vision and Pattern Recognition Workshop, 2004. CVPRW '04. Conference on}, year={2004}, month={June}, volume={}, number={}, pages={ 192-192}, ISSN={}, } @inproceedings{nefian:bayes_em, title={{A Bayesian Formulation for Subpixel Refinement in Stereo Orbital Imagery}}, author={ Ara V. Nefian and Kyle Husmann and Michael Broxton and Mattew D. Hancher and Michael Lundy}, booktitle = "to appear in the Proceedings of the 2009 IEEE International Conference on Image Processing", year = "2009" } @inproceedings{broxton:isvc09, title={{ 3D Lunar Terrain Reconstruction from Apollo Images }}, author={ Michael Broxton and Ara V. Nefian and Zachary Moratto and Taemin Kim and Michael Lundy and Aleksandr V. Segal }, booktitle = {{to appear in the Proceedings of the 5th International Symposium on Visual Computing}}, year = "2009" } @inproceedings{konolige:sparsesparse, title = {Sparse Sparse Bundle Adjustment}, booktitle = {British Machine Vision Conference}, year = {2010}, month = {08/2010}, address = {Aberystwyth, Wales}, keywords = {computer vision, perception}, attachments = {http://www.willowgarage.com/sites/default/files/ssba.pdf}, author = {Kurt Konolige} } @article{cholmod, author = {Chen, Yanqing and Davis, Timothy A. and Hager, William W. and Rajamanickam, Sivasankaran}, title = {Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate}, journal = {ACM Trans. Math. Softw.}, issue_date = {October 2008}, volume = {35}, number = {3}, month = oct, year = {2008}, issn = {0098-3500}, pages = {22:1--22:14}, articleno = {22}, numpages = {14}, url = {http://doi.acm.org/10.1145/1391989.1391995}, acmid = {1391995}, publisher = {ACM}, address = {New York, NY, USA}, keywords = {Cholesky factorization, linear equations, sparse matrices}, } @misc{lunokhod:controlnetwork, author = {Moratto, Zachary}, title = {Creating Control Networks and Bundle Adjusting with ISIS3}, journal = {Lunokhod}, type = {Blog}, number = {March 5}, year = {2012}, howpublished = {\url{http://lunokhod.org/?p=468}} } @misc{lunokhod:gcp, author = {Moratto, Zachary}, title = {Making well registered DEMs with ISIS and Ames Stereo Pipeline}, journal = {Lunokhod}, type = {Blog}, number = {April 14}, year = {2012}, howpublished = {\url{http://lunokhod.org/?p=559}} } @unpublished{isis:documentation, author = {USGS Astrogeology Science Center}, title = {{USGS ISIS Documentation}}, note = "Isis 3 Application Documentation {\em http://isis.astrogeology.usgs.gov/Application/index.html}", url = {http://isis.astrogeology.usgs.gov/Application/index.html} } @misc{cgiar:srtm90m, author = {The CGIAR Consortium for Spatial Information}, title = {{CGIAR-CSI SRTM 90m DEM Digital Elevation Database}}, url = {http://srtm.csi.cgiar.org} } @unpublished{digital-globe:samples, author = {Digital Globe}, title = {{Satellite Imagery and Geospatial Information Products}}, note = "Digital Globe sample imagery {\em https://www.digitalglobe.com/samples}", url = {https://www.digitalglobe.com/samples} } @unpublished{digital-globe:camera, author = {Digital Globe}, title = {{Radiometric Use of WorldView 2 Imagery}}, note = "Description of the WV02 camera", url = {https://dg-cms-uploads-production.s3.amazonaws.com/uploads/document/file/104/Radiometric_Use_of_WorldView-2_Imagery.pdf} } @misc{planetaryblog:vesta, author = {Machacek, Daniel}, title = {{Images from the long-awaited Dawn Vesta data set}}, journal = {The Planetary Society}, type = {Guest Blog}, number = {November 29}, year = {2012}, howpublished = {\url{http://www.planetary.org/blogs/guest-blogs/20121129-machacek-dawn-vesta.html}} } % Multi-view triangulation @unpublished{slabaugh2001optimal, title={Optimal ray intersection for computing 3d points from n-view correspondences}, author={Slabaugh, Greg and Schafer, Ron and Livingston, Mark}, year={2001}, note={}, url={http://www.gregslabaugh.net/publications/opray.pdf} } % Lunar lambertian @article{mcewen1991photometric, title={Photometric functions for photoclinometry and other applications}, author={McEwen, Alfred S}, journal={Icarus}, volume={92}, number={2}, pages={298--311}, year={1991}, publisher={Elsevier} } @article{lohse2006derivation, title={Derivation of planetary topography using multi-image shape-from-shading}, author={Lohse, Volker and Heipke, Christian and Kirk, Randolph L}, journal={Planetary and space science}, volume={54}, number={7}, pages={661--674}, year={2006}, publisher={Elsevier} } @article{abrams2002aster, title={ASTER User Handbook, version 2}, author={Abrams, Michael and Hook, Simon and Ramachandran, Bhaskar}, journal={Jet Propulsion Laboratory}, volume={4800}, pages={135}, year={2002} } @article{girod2015improvement, title={Improvement of DEM generation from ASTER images using satellite jitter estimation and open source implementation}, author={Girod, L and Nuth, C and K{\"a}{\"a}b, A}, journal={The International Archives of Photogrammetry, Remote Sensing and Spatial Information Sciences}, volume={40}, number={1}, pages={249}, year={2015}, publisher={Copernicus GmbH} } %% This BibTeX bibliography file was created using BibDesk. %% http://bibdesk.sourceforge.net/ %% Created for Ross Beyer at 2014-03-24 17:05:49 -0700 %% Saved with string encoding Unicode (UTF-8) @article{2012P&SS...71...64D, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2012P%26SS...71...64D}, Author = {{Debei}, S. and {Aboudan}, A. and {Colombatti}, G. and {Pertile}, M.}, Date-Added = {2014-03-25 00:05:00 +0000}, Date-Modified = {2014-03-25 00:05:10 +0000}, Journal = {Planetary and Space Science}, Month = oct, Pages = {64-72}, Title = {{Lutetia surface reconstruction and uncertainty analysis}}, Volume = 71, Year = 2012, Bdsk-Url-1 = {http://dx.doi.org/10.1016/j.pss.2012.07.013} } @inproceedings{Kunz:2010zr, Annote = {References Broxton et al., but doesn't really use ASP.}, Author = {Kunz, C. and Singh, H.}, Booktitle = {Autonomous Underwater Vehicles (AUV), 2010 IEEE/OES}, Date-Added = {2013-04-26 19:59:28 +0000}, Date-Modified = {2013-04-26 19:59:32 +0000}, Issn = {1522-3167}, Keywords = {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}, Pages = {1-7}, Title = {Stereo self-calibration for seafloor mapping using AUVs}, Year = {2010}, Bdsk-Url-1 = {http://dx.doi.org/10.1109/AUV.2010.5779655}} @article{Kim20092095, Annote = {Mentions, but does not use ASP.}, Author = {J.R. Kim and J.-P. Muller}, Date-Added = {2013-04-26 19:03:21 +0000}, Date-Modified = {2013-04-26 19:03:26 +0000}, Issn = {0032-0633}, Journal = {Planetary and Space Science}, Keywords = {Slope}, Number = {14--15}, Pages = {2095 - 2112}, Title = {Multi-resolution topographic data extraction from Martian stereo imagery}, Url = {http://www.sciencedirect.com/science/article/pii/S0032063309002888}, Volume = {57}, Year = {2009}, Bdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0032063309002888}, Bdsk-Url-2 = {http://dx.doi.org/10.1016/j.pss.2009.09.024}} @inproceedings{Schwendner:vn, Annote = {Doesn't actually use ASP, just mentions it as an example.}, Author = {Schwendner, Jakob and Hidalgo, Javier}, Booktitle = {International Symposium on Artificial Intelligence, Robotics and Automation in Space (i-SAIRAS)}, Date-Added = {2013-04-26 18:58:34 +0000}, Date-Modified = {2013-04-26 19:01:09 +0000}, Month = {September}, Title = {Terrain Aided navgiation for Plaentary Exploration Missions}, Year = {2012}} @article{Debei201264, Annote = {ASP is mentioned as an example, but I don't think this text is 'using' ASP for their results.}, Author = {Stefano Debei and Alessio Aboudan and Giacomo Colombatti and Marco Pertile}, Date-Added = {2013-04-26 18:54:17 +0000}, Date-Modified = {2013-04-26 18:54:26 +0000}, Issn = {0032-0633}, Journal = {Planetary and Space Science}, Keywords = {Uncertainty}, Number = {1}, Pages = {64 - 72}, Title = {Lutetia surface reconstruction and uncertainty analysis}, Url = {http://www.sciencedirect.com/science/article/pii/S0032063312002073}, Volume = {71}, Year = {2012}, Bdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0032063312002073}, Bdsk-Url-2 = {http://dx.doi.org/10.1016/j.pss.2012.07.013}} @article{Li:2011fk, Annote = {Doesn't really "use" ASP, just obliquely talks about it.}, Author = {Rongxing Li and Juwon Hwangbo and Yunhang Chen and Kaichang Di}, Date-Added = {2013-04-26 18:23:29 +0000}, Date-Modified = {2013-04-26 18:24:06 +0000}, Issn = {0196-2892}, Journal = {Geoscience and Remote Sensing, IEEE Transactions on}, Number = {7}, Pages = {2558-2572}, Title = {Rigorous Photogrammetric Processing of HiRISE Stereo Imagery for Mars Topographic Mapping}, Volume = {49}, Year = {2011}, Bdsk-Url-1 = {http://dx.doi.org/10.1109/TGRS.2011.2107522} } @article{hirschmuller_sgm_original, title={Stereo Processing by Semiglobal Matching and Mutual Information}, author={Hirschm{\"u}ller, Heiko}, journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, volume={30}, pages={328--341}, year={2008}, publisher={IEEE Computer Society} } @article{hirschmuller_hrsc_with_sgm, title={Stereo processing of HRSC Mars Express images by semi-global matching}, author={Hirschm{\"u}ller, Heiko and Mayer, Helmut and Neukum, G and others}, journal={Int. Arch. Photogramm. Remote Sensing Spatial Inf. Sci}, volume={36}, pages={305--310}, year={2006} } @inproceedings{xiang_2016_low_complexity_fsgm, title={Low complexity optical flow using neighbor-guided semi-global matching}, author={Xiang, Jiang and Li, Ziyun and Blaauw, David and Kim, Hun Seok and Chakrabarti, Chaitali}, booktitle={2016 IEEE International Conference on Image Processing (ICIP)}, pages={4483--4487}, year={2016}, organization={IEEE} } @inproceedings{rothermel2012sure_isgm, title={SURE: Photogrammetric surface reconstruction from imagery}, author={Rothermel, Mathias and Wenzel, Konrad and Fritsch, Dieter and Haala, Norbert}, booktitle={Proceedings LC3D Workshop, Berlin}, volume={8}, year={2012} } @article{hapke2008bidirectional, title={Bidirectional reflectance spectroscopy: 6. Effects of porosity}, author={Hapke, Bruce}, journal={Icarus}, volume={195}, number={2}, pages={918--926}, year={2008}, publisher={Elsevier} } @article{hapke1993opposition, title={The opposition effect of the moon: The contribution of coherent backscatter}, author={Hapke, Bruce W and Nelson, Robert M and Smythe, William D}, journal={Science}, volume={260}, number={5107}, pages={509--511}, year={1993} } @article{johnson2006spectrophotometric, title={Spectrophotometric properties of materials observed by Pancam on the Mars Exploration Rovers: 1. Spirit}, 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}, journal={Journal of Geophysical Research: Planets}, volume={111}, number={E2}, year={2006}, publisher={Wiley Online Library} } @article{fernando2013surface, title={Surface reflectance of Mars observed by CRISM/MRO: 2. Estimation of surface photometric properties in Gusev Crater and Meridiani Planum}, author={Fernando, J and Schmidt, F and Ceamanos, X and Pinet, P and Dout{\'e}, S and Daydou, Y}, journal={Journal of Geophysical Research: Planets}, volume={118}, number={3}, pages={534--559}, year={2013}, publisher={Wiley Online Library} } @inproceedings{smith2011results, title={Results from the Lunar Orbiter Laser Altimeter (LOLA): global, high resolution topographic mapping of the Moon}, author={Smith, DE and Zuber, MT and Neumann, GA and Mazarico, E and Head, J and Torrence, MH and others}, booktitle={Lunar and Planetary Science Conference}, volume={42}, pages={2350}, year={2011} } @inproceedings{zabih1994census, title={Non-parametric local transforms for computing visual correspondence}, author={Zabih, Ramin and Woodfill, John}, booktitle={European conference on computer vision}, pages={151--158}, year={1994}, organization={Springer} } @article{hua2016texture, title={Texture-Aware Dense Image Matching Using Ternary Census Transform}, author={Hua, Han and Chenb, Chongtai and Wua, Bo and Yangc, Xiaoxia and Zhub, Qing and Dingb, Yulin}, journal={ISPRS Annals of Photogrammetry, Remote Sensing and Spatial Information Sciences}, pages={59--66}, year={2016} } @inproceedings{facciolo2015mgm, title={Mgm: A significantly more global matching for stereovision}, author={Facciolo, Gabriele and De Franchis, Carlo and Meinhardt, Enric}, booktitle={Proceedings of the British Machine Vision Conference (BMVC), BMVA Press}, pages={90--1}, year={2015} } @article{asp2018, author = {Beyer, Ross A. and Alexandrov, Oleg and McMichael, Scott}, title = {The {Ames Stereo Pipeline}: {NASA}'s Open Source Software for Deriving and Processing Terrain Data}, journal = {Earth and Space Science}, volume = {}, number = {}, pages = {} } @article{guizar2008efficient, title={Efficient subpixel image registration algorithms}, author={Guizar-Sicairos, Manuel and Thurman, Samuel T and Fienup, James R}, journal={Optics letters}, volume={33}, number={2}, pages={156--158}, year={2008}, publisher={Optical Society of America} } @inproceedings{toldo2010global, title={Global registration of multiple point clouds embedding the generalized procrustes analysis into an ICP framework}, author={Toldo, Roberto and Beinat, Alberto and Crosilla, Fabio}, booktitle={Proc. 3DPVT}, pages={109--122}, year={2010} } @article{sohn2004mathematical, title={Mathematical modelling of historical reconnaissance CORONA KH-4B imagery}, author={Sohn, Hong-Gyoo and Kim, Gi-Hong and Yom, Jae-Hong}, journal={The Photogrammetric Record}, volume={19}, number={105}, pages={51--66}, year={2004}, publisher={Wiley Online Library} } @inproceedings{schenk2003rigorous, title={Rigorous panoramic camera model for DISP imagery}, author={Schenk, Toni and Csatho, Beata and Shin, Sung Woong}, booktitle={Proceedings of the ISPRS Workshop: High Resolution Mapping from Space}, year={2003} } @inproceedings{hare2017community, title={Community Sensor Model standard for the planetary domain}, author={Hare, TM and Kirk, RL}, booktitle={Lunar and Planetary Science Conference}, volume={48}, year={2017} } @article{tsai1987, author={R. {Tsai}}, journal={IEEE Journal on Robotics and Automation}, title={A versatile camera calibration technique for high-accuracy 3D machine vision metrology using off-the-shelf TV cameras and lenses}, year={1987}, volume={3}, number={4}, pages={323-344}, keywords={Calibration;Machine vision;Measurement;Cameras;Calibration;Machine vision;Metrology;TV;Lenses;Robot vision systems;Robotic assembly;Robot kinematics;Application software}, doi={10.1109/JRA.1987.1087109}, ISSN={2374-8710}, month={August} } @article{brown1971, author={Brown, D. C.}, journal={Photogrammetric Engineering}, title={Close-Range Camera Calibration}, year=1971, volume=37, number=8, pages={855-866} } @article{brown1966, author={Brown, D. C.}, journal={Photogrammetric Engineering}, title={Decentering Distortion of Lenses}, year=1966, volume=32, number=3, pages={444-462} } @article{2019EA000713, author = {Laura, J.R. and Mapel, J. and Hare, T.}, title = {Planetary Sensor Models Interoperability using the Community Sensor Model Specification}, year = 2020, journal = {Earth and Space Science}, pages = {e2019EA000713}, doi = {10.1029/2019EA000713}, url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019EA000713}, eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019EA000713}, note = {e2019EA000713 2019EA000713} } @techreport{CSMTRD, author = {Community Sensor Model Working Group}, title = {{Community Sensor Model (CSM) Technical Requirements Document (TRD)}}, institution = {National Geospatial Intelligence Agency}, year = 2007, url = {https://gwg.nga.mil/documents/csmwg/CSM_TRD__Version_2.A%20Revision_2007_Aug_01__for_DISR.pdf} } @INPROCEEDINGS{2015LPI462703B, author = {{Becker}, K.~J. and {Archinal}, B.~A. and {Hare}, T.~H. and {Kirk}, R.~L. and {Howington-Kraus}, E. and {Robinson}, M.~S. and {Rosiek}, M.~R.}, title = "{Criteria for Automated Identification of Stereo Image Pairs}", booktitle = {Lunar and Planetary Science Conference}, year = 2015, series = {Lunar and Planetary Science Conference}, month = mar, pages = {2703}, url = {https://ui.adsabs.harvard.edu/abs/2015LPI....46.2703B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @article{thormahlen1985refractive, title={Refractive index of water and its dependence on wavelength, temperature, and density}, author={Thorm{\"a}hlen, I and Straub, Johannes and Grigull, Ulrich}, journal={Journal of physical and chemical reference data}, volume={14}, number={4}, pages={933--945}, year={1985}, publisher={American Institute of Physics for the National Institute of Standards and~…} } @article{harvey1998calibration, title={Calibration stability of an underwater stereo-video system: implications for measurement accuracy and precision}, author={Harvey, Evan S and Shortis, Mark R}, journal={Marine Technology Society Journal}, volume={32}, number={2}, pages={3--17}, year={1998}, publisher={Washington, DC: Marine Technology Society} } @article{austin1976index, title={The index of refraction of seawater, 121 pp}, author={Austin, RW and Halikas, G}, journal={Scripps Inst. of Oceanogr., Ia Jolla, Calif}, year={1976} } @book{mobley1995optical, title={The optical properties of water. Handbook of Optics, ed Bass M}, author={Mobley, CD}, year={1995}, publisher={McGraw-Hill, New York),} } @book{jerlov1976marine, title={Marine optics}, author={Jerlov, Nils Gunnar}, year={1976}, publisher={Elsevier} } @article{tukey1977exploratory, title={Exploratory Data Analysis Addision-Wesley}, author={Tukey, John W}, journal={Reading, Ma}, volume={688}, year={1977} } @article{buades2015reliable, title={Reliable multiscale and multiwindow stereo matching}, author={Buades, Antoni and Facciolo, Gabriele}, journal={SIAM Journal on Imaging Sciences}, volume={8}, number={2}, pages={888--915}, year={2015}, publisher={SIAM} } @INPROCEEDINGS{Geiger2010ACCV, author = {Andreas Geiger and Martin Roser and Raquel Urtasun}, title = {Efficient Large-Scale Stereo Matching}, booktitle = {Asian Conference on Computer Vision (ACCV)}, year = {2010} } @inproceedings{de2014automatic, title={An automatic and modular stereo pipeline for pushbroom images}, author={De Franchis, Carlo and Meinhardt-Llopis, Enric and Michel, Julien and Morel, Jean-Michel and Facciolo, Gabriele}, booktitle={ISPRS Annals of the Photogrammetry, Remote Sensing and Spatial Information Sciences}, year={2014} } @article{tao2018massive, title={Massive stereo-based DTM production for Mars on cloud computers}, 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}, journal={Planetary and Space Science}, volume={154}, pages={30--58}, year={2018}, publisher={Elsevier} } @article{nugent1966velocity, title={Velocity aberration and atmospheric refraction in satellite laser communication experiments}, author={Nugent, LJ and Condon, RJ}, journal={Applied optics}, volume={5}, number={11}, pages={1832--1837}, year={1966}, publisher={Optical Society of America} } @article{bhushan2021automated, title={Automated digital elevation model (DEM) generation from very-high-resolution Planet SkySat triplet stereo and video imagery}, author={Bhushan, Shashank and Shean, David and Alexandrov, Oleg and Henderson, Scott}, journal={ISPRS Journal of Photogrammetry and Remote Sensing}, volume={173}, pages={151--165}, year={2021}, publisher={Elsevier} } @article{palaseanu2021bathy, title = {Open source satellite derived bathymetry module for NASA Ames Stereo Pipeline}, author = {Palaseanu, Monica and Alexandrov, Oleg and Danielson, Jeff}, journal = {Earth and Space Science Open Archive}, pages = {4}, year = {2021}, doi = {10.1002/essoar.10509185.1}, url = {https://doi.org/10.1002/essoar.10509185.1} } @article{alexandrov2018multiview, title={Multiview Shape-From-Shading for Planetary Images}, author={Alexandrov, Oleg and Beyer, Ross A}, journal={Earth and Space Science}, volume={5}, number={10}, pages={652--666}, year={2018}, publisher={Wiley Online Library} } @article{tao2016optimised, title={An optimised system for generating multi-resolution DTMS using NASA DTMS datasets}, author={Tao, Y and Muller, JP and Sidiropoulos, P and Veitch-Michaelis, J and Yershov, V}, journal={ISPRS-International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences}, volume={41}, pages={115--121}, year={2016}, publisher={Copernicus GmbH} } @article{sidiropoulos2018automatic, title={Automatic coregistration and orthorectification (ACRO) and subsequent mosaicing of NASA high-resolution imagery over the Mars MC11 quadrangle, using HRSC as a baseline}, author={Sidiropoulos, Panagiotis and Muller, Jan-Peter and Watson, Gillian and Michael, Gregory and Walter, Sebastian}, journal={Planetary and Space Science}, volume={151}, pages={33--42}, year={2018}, publisher={Elsevier} } @article{remy2002gstl, title={GsTL: The geostatistical template library in C++}, author={Remy, Nicolas and Shtuka, Arben and Levy, Bruno and Caers, Jef}, journal={Computers \& Geosciences}, volume={28}, number={8}, pages={971--979}, year={2002}, publisher={Elsevier} } @article{ohman2015procedure, title={Procedure for processing LRO WAC monochromatic images with ISIS 3 for photogeologic purposes}, author={{\"O}hman, Teemu}, url = {https://www.lpi.usra.edu/lunar/tools/dems/Ohman_mono-WAC_ISIS_procedure_v1-1.pdf}, journal={Lunar and Planetary Institute}, year={2015} } @article{kirk2016semi, title={A semi-rigorous sensor model for precision geometric processing of mini-RF bistatic radar images of the moon}, 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}, journal={The International Archives of Photogrammetry, Remote Sensing and Spatial Information Sciences}, volume={41}, pages={425}, year={2016}, publisher={Copernicus GmbH} } @inproceedings{kirk2011radargrammetric, title={Radargrammetric Analysis of Mini-RF Lunar Images}, 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}, booktitle={EPSC-DPS Joint Meeting 2011}, volume={2011}, pages={1473}, year={2011} } @article{shin2012progressively, title={Progressively weighted affine adaptive correlation matching for quasi-dense 3D reconstruction}, author={Shin, Dongjoe and Muller, Jan-Peter}, journal={Pattern Recognition}, volume={45}, number={10}, pages={3795--3809}, year={2012}, publisher={Elsevier} } @article{otto1989region, title={‘Region-growing’algorithm for matching of terrain images}, author={Otto, G Paul and Chau, Tony KW}, journal={Image and vision computing}, volume={7}, number={2}, pages={83--94}, year={1989}, publisher={Elsevier} } @article{bertone2023highly, title={Highly Resolved Topography and Illumination at Mercury’s South Pole from MESSENGER MDIS NAC}, 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}, journal={The Planetary Science Journal}, volume={4}, number={2}, pages={21}, year={2023}, publisher={IOP Publishing} } @article{caravaca20203d, title={3D digital outcrop model reconstruction of the Kimberley outcrop (Gale crater, Mars) and its integration into Virtual Reality for simulated geological analysis}, 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}, journal={Planetary and Space Science}, volume={182}, pages={104808}, year={2020}, publisher={Elsevier} } @Article{palaseanu2023, AUTHOR = {Palaseanu-Lovejoy, Monica and Alexandrov, Oleg and Danielson, Jeff and Storlazzi, Curt}, TITLE = {SaTSeaD: Satellite Triangulated Sea Depth Open-Source Bathymetry Module for NASA Ames Stereo Pipeline}, JOURNAL = {Remote Sensing}, VOLUME = {15}, YEAR = {2023}, NUMBER = {16}, ARTICLE-NUMBER = {3950}, URL = {https://www.mdpi.com/2072-4292/15/16/3950}, ISSN = {2072-4292}, ABSTRACT = {}, DOI = {10.3390/rs15163950} } @article{jakkula2010efficient, title={Efficient feature detection using OBAloG: optimized box approximation of Laplacian of Gaussian}, JOURNAL = {Master thesis, Kansas State University}, author={Jakkula, Vinayak Reddy}, year={2010} } @article{jindal2024measuring_v2, title={Measuring erosional and depositional patterns across Comet 67P's Imhotep region}, 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}, journal={Journal of Geophysical Research: Planets}, volume={129}, number={2}, pages={e2023JE008089}, year={2024}, publisher={Wiley Online Library}, doi = {https://doi.org/10.1029/2023JE008089} } @article{Miclea_subpixel, author={Miclea, Vlad-Cristian and Vancea, Cristian-Cosmin and Nedevschi, Sergiu}, journal={2015 IEEE International Conference on Intelligent Computer Communication and Processing (ICCP)}, title={New sub-pixel interpolation functions for accurate real-time stereo-matching algorithms}, year={2015}, volume={}, number={}, pages={173-178}, keywords={Interpolation;Histograms;Accuracy;Real-time systems;Cameras;Approximation algorithms;Pipelines;SGM;Sub-pixel accuracy;Function fitting;Interpolation}, doi={10.1109/ICCP.2015.7312625}} @article{lesage2021constraints, title={Constraints on effusive cryovolcanic eruptions on Europa using topography obtained from Galileo images}, author={Lesage, Elodie and Schmidt, Fr{\'e}d{\'e}ric and Andrieu, Fran{\c{c}}ois and Massol, H{\'e}l{\`e}ne}, journal={Icarus}, volume={361}, pages={114373}, year={2021}, publisher={Elsevier} } @article{nuth2011co, title={Co-registration and bias corrections of satellite elevation data sets for quantifying glacier thickness change}, author={Nuth, Christopher and K{\"a}{\"a}b, Andreas}, journal={The Cryosphere}, volume={5}, number={1}, pages={271--290}, year={2011}, publisher={Copernicus GmbH} } @article{goossens2020high, title={High-resolution gravity field models from GRAIL data and implications for models of the density structure of the Moon's crust}, 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}, journal={Journal of Geophysical Research: Planets}, volume={125}, number={2}, pages={e2019JE006086}, year={2020}, publisher={Wiley Online Library} } @article{ghuffar2022pipeline, title={A pipeline for automated processing of declassified Corona KH-4 (1962--1972) stereo imagery}, author={Ghuffar, Sajid and Bolch, Tobias and Rupnik, Ewelina and Bhattacharya, Atanu}, journal={IEEE Transactions on Geoscience and Remote Sensing}, volume={60}, pages={1--14}, year={2022}, publisher={IEEE} } @article{boatwright2024sfs, title={SfS-Refined Digital Elevation Models of Malapert Massif and Mons Agnes, Moon}, author={Boatwright, Benjamin}, journal={Harvard Dataverse dataset}, pages={289}, year={2024} } @article{hemmi2025lroc, title={LROC NAC-derived Meter-scale Topography of the Moon's South Polar Landing Sites: Digital Terrain Models and Their Quality Assessments}, author={Hemmi, Ryodo and Inoue, Hiroka and Kikuchi, Hiroshi and Sato, Hiroyuki and Miyamoto, Hideaki and Otake, Hisashi and Yamamoto, Mitsuo}, journal={The Planetary Science Journal}, volume={6}, number={11}, year={2025}, publisher={The American Astronomical Society}, month={November}, note={Published 2025 November 14} } @article{quan1995empirical, title={Empirical equation for the index of refraction of seawater}, author={Quan, Xiaohong and Fry, Edward S}, journal={Applied optics}, volume={34}, number={18}, pages={3477--3480}, year={1995}, publisher={Optical Society of America} } ================================================ FILE: docs/building_asp.rst ================================================ .. _building_asp: Building and releasing ASP ========================== This chapter will describe how ASP can be built from source and with conda, how to build the documentation, and how to prepare a new ASP release. This is focused towards the developer. Users should read instead the installation guide in :numref:`installation`. .. _build_from_source: Building ASP from source ------------------------ All dependencies for the *latest development version* of ASP are a available as a `binary tarball `_. The dependencies for the latest stable version of ASP are in the ``stereopipeline-feedstock`` repository (:numref:`packages_to_build`). Assume that all dependencies, including the development tools, are installed in the ``asp_deps`` conda environment and the ``PATH`` variable is set up to use them. Create a work directory:: workDir=$HOME/build_asp mkdir -p $workDir Build VisionWorkbench and Stereo Pipeline version 3.6.0:: cd $workDir envPath=$HOME/miniconda3/envs/asp_deps $envPath/bin/git clone \ git@github.com:visionworkbench/visionworkbench.git cd visionworkbench # Build a specific version git checkout 3.6.0 mkdir -p build cd build $envPath/bin/cmake .. \ -DASP_DEPS_DIR=$envPath \ -DCMAKE_INSTALL_PREFIX=$workDir/install \ make -j10 && make install cd $workDir envPath=$HOME/miniconda3/envs/asp_deps $envPath/bin/git clone \ git@github.com:NeoGeographyToolkit/StereoPipeline.git cd StereoPipeline # Build a specific version git checkout 3.6.0 mkdir -p build cd build $envPath/bin/cmake .. \ -DASP_DEPS_DIR=$envPath \ -DCMAKE_INSTALL_PREFIX=$workDir/install \ -DVISIONWORKBENCH_INSTALL_DIR=$workDir/install \ make -j10 && make install Check if the compilers are picked up correctly. .. _conda_build: Building ASP and its dependencies with conda -------------------------------------------- This page is meant for advanced users of ASP and maintainers who would like to use conda to rebuild ASP and all its dependencies. It is suggested to carefully read :numref:`conda_intro` before this page. To simplify maintenance, ASP and its dependencies are built upon ISIS and its dependencies. The process for this is outlined below. Setting up the ISIS environment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Search for the latest available ISIS conda package:: conda search -c usgs-astrogeology --override-channels isis Here it was found that ISIS version 9.0.0 was the latest, which we will assume throughout the rest of this document. Create a conda environment for this version of ISIS:: conda create -n isis9.0.0 conda activate isis9.0.0 Add these channels to conda:: conda config --env --add channels conda-forge conda config --env --add channels usgs-astrogeology Run:: conda config --show channels and verify that ``usgs-astrogeology`` and ``conda-forge`` are in this order and above all other channels, except perhaps the ``nasa-ames-stereo-pipeline`` channel. Install the desired version of ISIS:: conda install \ -c usgs-astrogeology \ -c conda-forge \ -c defaults \ --channel-priority flexible \ isis==9.0.0 For ISIS 9.0.0, it appears that ensuring flexible channel priority is necessary for successful installation. Install the version of PDAL that is compatible with current ISIS (may already exist as part of latest ISIS):: conda install -c conda-forge --channel-priority flexible libpdal-core Save the current environment for reference as follows:: conda env export > isis9.0.0.yaml Note: As of 12/2025 any recent PDAL is incompatible with ISIS 9.0.0 and needs to be built from source. Also, ISIS 9.0.0 is not available for Mac Arm. An unofficial version of this (``9.0.0_asp``) is available in the ``nasa-ames-stereo-pipeline`` channel. Fetching the build tools ~~~~~~~~~~~~~~~~~~~~~~~~ We will create a new ``tools`` environment to have all the tools we will need. These could be appended to the earlier environment, but it is less likely to to have issues with dependency conflicts if these are kept separate. :: conda create -n tools conda activate tools conda install -c conda-forge anaconda-client conda-build .. _packages_to_build: Build recipe ~~~~~~~~~~~~ ASP has many dependencies that are source code, rather than pre-existing packages. The approach of producing a conda package for each turned out to be laborious, because conda is slow and fragile. The latest approach is to build all these packages and ASP itself in one single script, available at https://github.com/NeoGeographyToolkit/stereopipeline-feedstock To ensure this does not result in failures, the process is first tested by building these manually, as done in the script, with the environment specified there. That environment is produced by adding dependencies to the installed ISIS package. The ASP version in this feedstock needs to be updated for each release. Build command:: conda activate tools conda config --set channel_priority flexible conda build \ -c nasa-ames-stereo-pipeline \ -c usgs-astrogeology \ -c conda-forge \ stereopipeline-feedstock The developers can upload the produced packages to the ``nasa-ames-stereo-pipeline`` channel. After a package is uploaded, it can be installed in the desired environment as:: conda install \ -c nasa-ames-stereo-pipeline \ -c usgs-astrogeology \ -c conda-forge \ -n myEnv \ myPackage=myVersion=myBuildNo If this is slow, check if the solver is set to ``libmamba``. To list all packages in the channel, do:: conda search -c nasa-ames-stereo-pipeline --override-channels To delete a package from this channel, run:: anaconda remove nasa-ames-stereo-pipeline/myPackage/myVersion If adding an updated package with the same version, increment the build number. Otherwise the new package may be confused with a cached version of a prior build. .. _helper_scripts: Helper scripts ~~~~~~~~~~~~~~ The ``.github/workflows`` directory in the ``StereoPipeline`` repository has a few scripts that show in detail the commands that are run to build ASP and its dependencies. .. _build_asp_doc: Building the documentation ~~~~~~~~~~~~~~~~~~~~~~~~~~ The ASP documentation is written in ReStructured Text and is built with `Sphinx `_ and `sphinxcontrib-bibtex `_. See the `online ASP documentation `_. To build the documentation locally, install these packages such as:: conda create -n sphinx -c conda-forge sphinx sphinxcontrib-bibtex conda activate sphinx Note that we used a separate conda environment to minimize the chance of conflict with other dependencies. The ``docs`` directory contains the root of the documentation. Running there ``make html`` will create the HTML version of the documentation in the ``_build`` subdirectory. Building the PDF documentation is no longer supported. If the documentation builds well locally but fails to update on the web, see the `cloud build status page `_. .. _asp_release_guide: Releasing a new version of ASP ------------------------------ This is reading for ASP maintainers. Update the version number ~~~~~~~~~~~~~~~~~~~~~~~~~ Inside *both* the VisionWorkbench and ASP repositories, edit ``src/CMakeLists.txt`` and set the new version, which should be the same for both packages, and in the format ``x.y.z``. If the value there is ``x.y.z-alpha``, which is used to tag a pre-release, remove the ``-alpha`` part. Increment one of these digits, depending on whether this is a major, minor, or bugfix release. See https://semver.org for guidance. Update the documentation ~~~~~~~~~~~~~~~~~~~~~~~~ Search all documentation for the old version number for ASP (such as 3.5.0) and ISIS (such as 8.3.0) and replace it with the new version numbers (such as 3.6.0 and 9.0.0). This includes files in the base directory, not just in ``docs``. Update NEWS.rst. Add the release date on top, along the lines of prior releases (see further down in that file). This file must have a detailed log of all changes, especially those that result in changed behavior or options, and it should be incrementally updated as changes are made during development. Update the copyright year in the README.rst and docs/conf.py files. Commit and tag ~~~~~~~~~~~~~~ Commit all changes. Tag the release in *both* the VisionWorkbench and StereoPipeline repos. Example:: git tag 3.6.0 git push origin 3.6.0 # commit to your branch git push god 3.6.0 # commit to main branch (Here it is assumed that ``origin`` points to your own fork and ``god`` points to the parent repository.) If more commits were made and it is desired to apply this tag to a different commit, first remove the exiting tag with:: git tag -d 3.6.0 git push origin :refs/tags/3.6.0 git push god :refs/tags/3.6.0 Build ASP with conda ~~~~~~~~~~~~~~~~~~~~ See :numref:`conda_build`. .. _build_binaries: Building self-contained binaries ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In addition to creating a conda package, it is also convenient to ship a zipped package having all ASP tools and needed libraries (this includes the ISIS libraries but not the ISIS tools). Such a build is created for each release and also daily. These are posted on the GitHub release page (:numref:`release`). ASP uses a custom build system. It can be downloaded with ``git`` from: https://github.com/NeoGeographyToolkit/BinaryBuilder Create a conda environment that has the dependencies for building ASP, as described in :numref:`build_from_source`. Assume it is called ``asp_deps``. Install the C, C++, and Fortran compilers (same versions as for ISIS), ``cmake>=3.15.5``, ``pbzip2``, ``parallel``, and for Linux also the ``chrpath`` tool, as outlined on that page. The full list of dependencies is in the ``stereopipeline-feedstock`` repository (:numref:`packages_to_build`). Go to the directory ``BinaryBuilder``, and run:: /path/to/python3 \ ./build.py \ --cc \ --cxx \ --gfortran \ --asp-deps-dir $HOME/miniconda3/envs/asp_deps \ --build-root build_asp \ --skip-tests \ visionworkbench stereopipeline This will fetch and build the latest VisionWorkbench and Stereo Pipeline in ``build_asp/build``, and will install them in ``build_asp/install``. See :numref:`helper_scripts` for scrips illustrating this process. Create a conda environment having Python and numpy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ISIS expects a full Python distribution to be shipped. To avoid shipping the entire ``asp_deps`` environment, we create a separate environment having only Python, numpy, with versions as expected by current ISIS. Run, for example:: conda create -c conda-forge -n python_isis_v python=x.y.z numpy=a.b.c Note that different versions of these may be needed for Linux and OSX. The ``conda list`` command within the ``asp_deps`` environment can be used to look up the desired versions. Package the build ~~~~~~~~~~~~~~~~~ Run in ``BinaryBuilder`` the command:: /path/to/python3 \ ./make-dist.py build_asp/install \ --asp-deps-dir $HOME/miniconda3/envs/asp_deps \ --python-env $HOME/miniconda3/envs/python_isis_v Building and packaging should be done separately for Linux and OSX. Test ASP ~~~~~~~~ The script ``auto_build/launch_master.sh`` in ``BinaryBuilder`` can be invoked to build and test ASP. This script and also ``auto_build/utils.sh`` need to be read carefully and some variables adjusted. The `StereoPipeline test suite `_ is run. It has comprehensive tests for the ASP tools. This functionality creates the daily builds, which are then uploaded to the GitHub release page (:numref:`release`). Prepare the documentation ~~~~~~~~~~~~~~~~~~~~~~~~~ Follow the instructions in :numref:`build_asp_doc`. Push the release to GitHub ~~~~~~~~~~~~~~~~~~~~~~~~~~ Create a release on `GitHub `_. Use the tag for the current release. Add to the release notes a link to the appropriate NEWS section of the documentation (:numref:`news`). *Only after this save the release.* *Do not delete and recreate the release* (:numref:`zenodo`). It is fine to upload the binaries after a release is created, and delete and re-upload them. The GitHub ``gh`` program can be invoked to push the binaries to the release. Example:: cd BinaryBuilder/asp_tarballs for file in StereoPipeline-3.6.0-2025-12-26-x86_64-Linux.tar.bz2 \ StereoPipeline-3.6.0-2025-12-26-x86_64-OSX.tar.bz2 \ StereoPipeline-3.6.0-2025-12-26-arm64-OSX.tar.bz2; do gh release upload 3.6.0 $file \ -R git@github.com:NeoGeographyToolkit/StereoPipeline.git done Alternatively, these can be uploaded from a web browser. .. _zenodo: Zenodo link for the release ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Creating a release will trigger producing the Zenodo permanent link (after a few minutes). That link cannot be changed, and the text it copies from the release notes cannot be changed either. It is very important to *create the release just once for the given tag*. Otherwise, the Zenodo permanent link will always point to the earliest attempt at making the release. It is fine to later overwrite the binaries for this release, or even to upload them later. Just do not delete and recreate the release page itself. Do not just rename the latest automatically uploaded daily build, as that will create an incorrect Zenodo link. Wait for Zenodo to mint the link for this release, then visit the Zenodo page at https://zenodo.org/badge/latestdoi/714891 (which will always point to the 'latest' DOI) and find there this release's URL. Put it at the top of `README.rst `_, in the appropriate ``target`` field. *Increment the version in the image field right above that.* Add this link also to the NEWS.rst page, under the section name for the current release. Push this update to GitHub. The new commit will be after the tag for the release, but that is not an issue. It is best to not change the tag after the release and Zenodo link got created. Announce the release ~~~~~~~~~~~~~~~~~~~~ Send an announcement of the new release to the `mailing list `_, with a link to the NEWS section for the current release from the documentation. Post-release work ~~~~~~~~~~~~~~~~~ Update the version number in ``src/CMakeLists.txt`` in boh the VisionWorkbench and ASP repositories. If version 3.6.0 just got released, we expect that the next feature release will likely be be 3.7.0. The version tag should be updated to 3.7.0-alpha in anticipation in *both* the VisionWorkbench and ASP repositories. See https://semver.org for guidance on versions. ================================================ FILE: docs/bundle_adjustment.rst ================================================ .. _bundle_adjustment: Bundle adjustment ================= Overview -------- Satellite position and orientation errors have a direct effect on the accuracy of digital elevation models produced by the Stereo Pipeline. If they are not corrected, these uncertainties will result in systematic errors in the overall position and slope of the DEM. Severe distortions can occur as well, resulting in twisted or "taco-shaped" DEMs, though in most cases these effects are quite subtle and hard to detect. In the worst case, such as with old mission data like Voyager or Apollo, these gross camera misalignments can inhibit Stereo Pipeline's internal interest point matcher and block auto search range detection. .. figure:: images/ba_orig_adjusted.png Bundle adjustment is illustrated here using a color-mapped, hill-shaded DEM mosaic from Apollo 15, Orbit 33, images. (a) Prior to bundle adjustment, large discontinuities can exist between overlapping DEMs made from different images. (b) After bundle adjustment, DEM alignment errors are minimized and no longer visible. Errors in camera position and orientation can be corrected using a process called *bundle adjustment*. Bundle adjustment is the process of simultaneously adjusting the properties of many cameras and the 3D locations of the objects they see in order to minimize the error between the estimated, back-projected pixel locations of the 3D objects and their actual measured locations in the captured images. This is called the *reprojection error*. This complex process can be boiled down to this simple idea: bundle adjustment ensures that the observations in multiple images of a single ground feature are self-consistent. If they are not consistent, then the position and orientation of the cameras as well as the 3D position of the feature must be adjusted until they are. This optimization is carried out along with thousands (or more) of similar constraints involving many different features observed in other images. Bundle adjustment is very powerful and versatile: it can operate on just two overlapping images, or on thousands. It is also a dangerous tool. Careful consideration is required to insure and verify that the solution does represent reality. Bundle adjustment can also take advantage of GCPs (:numref:`bagcp`), which are 3D locations of features that are known a priori (often by measuring them by hand in another existing DEM). GCPs can improve the internal consistency of your DEM or align your DEM to an existing data product. Finally, even though bundle adjustment calculates the locations of the 3D objects it views, only the final properties of the cameras are recorded for use by the Ames Stereo Pipeline. Those properties can be loaded into the ``parallel_stereo`` program which uses its own method for triangulating 3D feature locations. When using the Stereo Pipeline, bundle adjustment is an optional step between the capture of images and the creation of DEMs. The bundle adjustment process described below should be completed prior to running the ``parallel_stereo`` command. Although bundle adjustment is not a required step for generating DEMs, it is *highly recommended* for users who plan to create DEMs for scientific analysis and publication. Incorporating bundle adjustment into the stereo work flow not only results in DEMs that are more internally consistent, it is also the correct way to co-register your DEMs with other existing data sets and geodetic control networks. A DEM obtained after bundle adjustment and stereo may need to be aligned to a known reference coordinate system. For that, use the ``pc_align`` tool (:numref:`pc_align`). See the options ``--heights-from-dem`` (:numref:`heights_from_dem`) and ``--reference-terrain`` further down for how to incorporate an external DEM in bundle adjustment. Note that these can only locally refine camera parameters, an initial alignment with ``pc_align`` is still necessary. Optimizing of camera intrinsics parameters, such as optical center, focal length, and distortion is also possible, as seen below. .. _baasp: Running bundle adjustment ------------------------- Stereo Pipeline provides the ``bundle_adjust`` program (:numref:`bundle_adjust`). Start by running ``parallel_stereo`` without using bundle-adjusted camera models:: parallel_stereo AS15-M-1134.cub AS15-M-1135.cub run_noadjust/run See :numref:`nextsteps` for how how to improve the quality of stereo correlation results (at the expense of speed). Create a DEM and triangulation error image as in :numref:`point2dem`. Run bundle adjustment:: bundle_adjust --camera-position-weight 0 \ --tri-weight 0.1 --tri-robust-threshold 0.1 \ AS15-M-1134.cub AS15-M-1135.cub -o run_ba/run Here only camera positions and orientations are refined. How to optimize the camera intrinsics (if applicable) is discussed further down (:numref:`floatingintrinsics`). Run ``parallel_stereo`` while using the bundle-adjusted camera models:: parallel_stereo AS15-M-1134.cub AS15-M-1135.cub \ --prev-run-prefix run_noadjust/run \ --bundle-adjust-prefix run_ba/run \ run_adjust/run This should be followed, as before, by creation of a DEM and a triangulation error image. Note the option ``--prev-run-prefix`` that allowed reusing the previous run apart from the triangulation step. That speeds up the process, and works well-enough unless the cameras change a lot. .. figure:: images/MOC_tri_error.png :name: moc_dem_intersection_errors An unusually large intersection error (left), and the version after bundle adjustment (right). Note that these do not use the same range of colors. The images are produced with the MOC camera (:numref:`moc_example`). The remaining wavy pattern is due to jitter, that ASP has a solver for (:numref:`jitter_solve`). More illustrations are in :numref:`ba_rpc_distortion` and :numref:`ba_frame_linescan_results`. Bundle adjustment aims to make the cameras more self-consistent but offers no guarantees about their absolute positions (unless GCP are used, :numref:`bagcp`), in fact, the cameras can move away a lot sometimes. The options ``--tri-weight``, ``--rotation-weight``, and ``--camera-position-weight`` can be used to constrain how much the cameras can move during bundle adjustment. Note that large values for these may impact the ability to make the cameras self-consistent. This program can constrain the triangulated points, and hence the cameras, relative to a DEM. This option only works when the cameras are already rather well-aligned to this DEM and only fine-level adjustments are needed. That is discussed in :numref:`heights_from_dem`. ASP also offers the tool ``parallel_bundle_adjust`` which can create match files using multiple processes spread over multiple machines (:numref:`parallel_bundle_adjust`). These can also be used later during stereo with the options ``--match-files-prefix`` and ``--clean-match-files-prefix``. .. _floatingintrinsics: Floating intrinsics and using a lidar or DEM ground truth ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This section documents some advanced functionality, and it suggested the reader study it carefully and invest a certain amount of time to fully take advantage of these concepts. When the input cameras are of Pinhole type (:numref:`pinholemodels`), optical bar (:numref:`panoramic`), or CSM (:numref:`csm`), it is possible to optimize (float, refine) the intrinsic parameters (focal length, optical center, distortion, with a somewhat different list for optical bar cameras), in addition to the extrinsics. It is also possible to take advantage of an existing terrain ground truth, such as a lidar file or a DEM, to correct imperfectly calibrated intrinsic parameters, which can result in greatly improved results, such as creating less distorted DEMs that agree much better with the ground truth. See :numref:`intrinsics_no_constraints` for how to optimize intrinsics with no constraints, :numref:`intrinsics_ground_truth` for when ground constraints can be used (there exist options for sparse ground points and a DEM), and :numref:`kaguya_ba` for how to have several groups of intrinsics. Mixing frame and linescan cameras is discussed in :numref:`ba_frame_linescan`. .. _intrinsics_no_constraints: A first attempt at floating the intrinsics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This section is *only an introduction* of how to float the intrinsics. Detailed examples are further down. It is very strongly suggested to ensure that a good number of images exists, they have a lot of overlap, that the cameras have been already bundle-adjusted with intrinsics fixed and aligned to a DEM (:numref:`ba_pc_align`). Such a DEM should be used as a constraint. Note that when solving for intrinsics, ``bundle_adjust`` will by default optimize all intrinsic parameters and will share them across all cameras. This behavior can be controlled with the ``--intrinsics-to-float`` and ``--intrinsics-to-share`` parameters, or in a finer-grained way, as shown in :numref:`kaguya_ba`. The first invocation of camera optimization should be with intrinsics fixed:: bundle_adjust -t nadirpinhole --inline-adjustments \ left.tif right.tif left.tsai right.tsai -o run_ba/run Here two images have been used for illustration purposes, but a larger number should be used in practice. It is suggested that one run ``parallel_stereo`` with the obtained cameras:: parallel_stereo -t nadirpinhole --alignment-method epipolar \ --stereo-algorithm asp_mgm --subpixel-mode 9 \ left.tif right.tif run_ba/run-left.tsai run_ba/run-right.tsai \ run_stereo/run followed by DEM creation (:numref:`point2dem`):: point2dem --tr RESOLUTION --errorimage run_stereo/run-PC.tif Then examine and plot the intersection error:: gdalinfo -stats run_stereo/run-IntersectionErr.tif colormap run_stereo/run-IntersectionErr.tif stereo_gui run_stereo/run-IntersectionErr_CMAP.tif See :numref:`running-stereo` for other stereo algorithms. For ``colormap`` (:numref:`colormap`), ``--min`` and ``--max`` bounds can be specified if the automatic range is too large. We also suggest inspecting the interest points (:numref:`stereo_gui_view_ip`):: stereo_gui left.tif right.tif run_ba/run and then viewing the interest points from the menu. If the interest points are not well-distributed, this may result in large ray intersection errors where they are missing. Then, one should delete the existing run directory and create a better set, as discussed in :numref:`custom_ip`. If the interest points are good and the mean intersection error is acceptable, but this error shows an odd nonlinear pattern, that means it may be necessary to optimize the intrinsics. We do so by using the cameras with the optimized extrinsics found earlier. This is just an early such attempt, better approaches will be suggested below:: bundle_adjust -t nadirpinhole --inline-adjustments \ --solve-intrinsics --camera-position-weight 0 \ --max-pairwise-matches 20000 \ left.tif right.tif \ run_ba/run-left.tsai run_ba/run-right.tsai \ -o run_ba_intr/run See :numref:`heights_from_dem` for how to use a DEM as a constraint. See :numref:`dense_ip` for how to create dense interest points. Both of these are *very recommended*. It is important to note that only the non-zero intrinsics will be optimized, and the step size used in optimizing a certain intrinsic parameter is proportional to it. Hence, if an intrinsic is 0 and it is desired to optimize it, it should be set to small non-zero value suggestive of its final estimated scale. If the algorithm fails to give a good solution, perhaps different initial values for the intrinsics should be tried. For example, one can try changing the sign of the initial distortion coefficients, or make their values much smaller. It is good to use a lens distortion model such as the one ASP calls *Tsai* (:numref:`pinholemodels`), as then the distortion operation is a simple formula, which is fast and convenient in bundle adjustment, when projecting into the camera is the key operation. Using models like *Photometrix* and *Brown-Conrady* is not advised. Here we assumed all intrinsics are shared. See :numref:`kaguya_ba` for how to have several groups of intrinsics. See also the option ``--intrinsics-to-share``. Sometimes the camera weight may need to be decreased, even all the way to 0, if it appears that the solver is not aggressive enough, or it may need to be increased if perhaps it overfits. This will become less of a concern if there is some ground truth, as discussed later. Next, one can run ``parallel_stereo`` as before, with the new cameras, and see if the obtained solution is more acceptable, that is, if the intersection error is smaller. It is good to note that a preliminary investigation can already be made right after bundle adjustment, by looking at the residual error files before and after bundle adjustment. They are in the ``bundle_adjust`` output directory, with names:: initial_residuals_pointmap.csv final_residuals_pointmap.csv If desired, these csv files can be converted to a DEM with ``point2dem``, which can be invoked with:: --csv-format 1:lon,2:lat,4:height_above_datum then one can look at their statistics, also have them colorized, and viewed in ``stereo_gui`` (:numref:`plot_csv`). This file also shows how often each feature is seen in the images, so, if three images are present, hopefully many features will be seen three times. .. _intrinsics_ground_truth: Using ground truth when floating the intrinsics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If a point cloud having ground truth, such as a DEM or lidar file exists, say named ``ref.tif``, it can be used as part of bundle adjustment. For that, the stereo DEM obtained earlier needs to be first aligned to this ground truth, such as:: pc_align --max-displacement VAL \ run_stereo/run-DEM.tif ref.tif \ --save-inv-transformed-reference-points \ -o run_align/run (see the manual page of this tool in :numref:`pc_align` for more details). This alignment can then be applied to the cameras as well:: bundle_adjust -t nadirpinhole --inline-adjustments \ --initial-transform run_align/run-inverse-transform.txt \ left.tif right.tif run_ba/run-left.tsai run_ba/run-right.tsai \ --apply-initial-transform-only -o run_align/run If ``pc_align`` is called with the clouds in reverse order (the denser cloud should always be the first), when applying the transform to the cameras in ``bundle_adjust`` one should use ``transform.txt`` instead of ``inverse-transform.txt`` above. Note that if your ground truth is in CSV format, any tools that use this cloud must set ``--csv-format`` and perhaps also ``--datum`` and/or ``--csv-srs``. See :numref:`ba_pc_align` for how to handle the case when input adjustments exist. There are two ways of incorporating a ground constraint in bundle adjustment. The first one assumes that the ground truth is a DEM, and is very easy to use with a large number of images (:numref:`heights_from_dem`). A second approach can be used when the ground truth is sparse (and with a DEM as well). This is a bit more involved (:numref:`reference_terrain`). .. _heights_from_dem: Using the heights from a reference DEM ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In some situations the DEM obtained with ASP is, after alignment, quite similar to a reference DEM, but the heights may be off. This can happen, for example, if the focal length or lens distortion are not accurately known. In this case it is possible to borrow more accurate information from the reference DEM. The option for this is ``--heights-from-dem``. An additional control is given, in the form of the option ``--heights-from-dem-uncertainty`` (1 sigma, in meters). The smaller its value is, the stronger the DEM constraint. This value divides the difference between the triangulated points being optimized and their initial value on the DEM when added to the cost function (:numref:`how_ba_works`). The option ``--heights-from-dem-robust-threshold`` ensures that these weighted differences plateau at a certain level and do not dominate the problem. The default value is 0.1, which is smaller than the ``--robust-threshold`` value of 0.5, which is used to control the pixel reprojection error, as that is given a higher priority. It is suggested to not modify this threshold, and adjust instead ``--heights-from-dem-uncertainty``. If a triangulated point is not close to the reference DEM, bundle adjustment falls back to the ``--tri-weight`` constraint. Here is an example when we solve for intrinsics with a DEM constraint. As in the earlier section, *we assume that the cameras and the terrain are already aligned*:: bundle_adjust -t nadirpinhole \ --inline-adjustments \ --solve-intrinsics \ --intrinsics-to-float all \ --intrinsics-to-share all \ --camera-position-weight 0 \ --max-pairwise-matches 20000 \ --heights-from-dem dem.tif \ --heights-from-dem-uncertainty 10.0 \ --parameter-tolerance 1e-12 \ --remove-outliers-params "75.0 3.0 20 25" \ left.tif right.tif \ run_align/run-run-left.tsai \ run_align/run-run-right.tsai \ -o run_ba_hts_from_dem/run One should be careful with setting ``--heights-from-dem-uncertainty``. Having it larger will ensure it does not prevent convergence. It is *strongly suggested* to use dense interest points (:numref:`dense_ip`), if solving for intrinsics, and have ``--max-pairwise-matches`` large enough to not throw some of them out. We set ``--camera-position-weight 0``, as hopefully the DEM constraint is enough to constrain the solution. Here we were rather generous with the parameters for removing outliers, as the input DEM may not be that accurate, and then if tying too much to it some valid matches be be flagged as outliers otherwise, perhaps. The implementation of ``--heights-from-dem`` is as follows. Rays from matching interest points are intersected with this DEM, and the average of the produced points is projected vertically onto the DEM. This is declared to be the intersection point of the rays, and the triangulated points being optimized are constrained via ``--heights-from-dem-uncertainty`` to be close to this point. It is important to note that this heuristic may not be accurate if the rays have a large intersection error. But, since bundle adjustment usually has two passes, at the second pass the improved cameras are used to recompute the point on the DEM with better accuracy. This option can be more effective than using ``--reference-terrain`` when there is a large uncertainty in camera intrinsics. See two other large-scale examples of using ``--heights-from-dem``, without floating the intrinsics, in the SkySat processing example (:numref:`skysat`), using Pinhole cameras, and with linescan Lunar images with variable illumination (:numref:`sfs-lola`). Here we assumed all intrinsics are shared. See :numref:`kaguya_ba` for how to have several groups of intrinsics. See also the option ``--intrinsics-to-share``. It is suggested to look at the documentation of all the options above and adjust them for your use case. See :numref:`bundle_adjust` for the documentation of all options above, and :numref:`ba_out_files` for the output reports being saved, which can help judge how well the optimization worked. .. _reference_terrain: Sparse ground truth and using the disparity ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Here we will discuss an approach that works when the ground truth can be sparse, and we make use of the stereo disparity. It requires more work to set up than the earlier one. We will need to create a disparity from the left and right images that we will use during bundle adjustment. For that we will take the disparity obtained in stereo and remove any intermediate transforms stereo applied to the images and the disparity. This can be done as follows:: stereo_tri -t nadirpinhole --alignment-method epipolar \ --unalign-disparity \ left.tif right.tif \ run_ba/run-left.tsai run_ba/run-right.tsai \ run_stereo/run and then bundle adjustment can be invoked with this disparity and the DEM/lidar file. Note that we use the cameras obtained after alignment:: bundle_adjust -t nadirpinhole --inline-adjustments \ --solve-intrinsics --camera-position-weight 0 \ --max-disp-error 50 \ --max-num-reference-points 1000000 \ --max-pairwise-matches 20000 \ --parameter-tolerance 1e-12 \ --robust-threshold 2 \ --reference-terrain lidar.csv \ --reference-terrain-weight 5 \ --disparity-list run_stereo/run-unaligned-D.tif \ left.tif right.tif \ run_align/run-run-left.tsai run_align/run-run-right.tsai \ -o run_ba_intr_lidar/run Here we set the camera weight all the way to 0, since it is hoped that having a reference terrain is a sufficient constraint to prevent over-fitting. We used ``--robust-threshold 2`` to make the solver work harder where the errors are larger. This may be increased somewhat if the distortion is still not solved well in corners. See the note earlier in the text about what a good lens distortion model is. This tool will write some residual files of the form:: initial_residuals_reference_terrain.txt final_residuals_reference_terrain.txt which may be studied to see if the error-to-lidar decreased. Each residual is defined as the distance, in pixels, between a terrain point projected into the left camera image and then transferred onto the right image via the unaligned disparity and its direct projection into the right camera. If the initial errors in that file are large to start with, say more than 2-3 pixels, there is a chance something is wrong. Either the cameras are not well-aligned to each other or to the ground, or the intrinsics are off too much. In that case it is possible the errors are too large for this approach to reduce them effectively. We strongly recommend that for this process one should not rely on bundle adjustment to create interest points, but to use the dense and uniformly distributed ones created with stereo (:numref:`dense_ip`). The hope is that after these directions are followed, this will result in a smaller intersection error and a smaller error to the lidar/DEM ground truth (the later can be evaluated by invoking ``geodiff --absolute`` on the ASP-created aligned DEM and the reference lidar/DEM file). Here we assumed all intrinsics are shared. See :numref:`kaguya_ba` for how to have several groups of intrinsics. See also the option ``--intrinsics-to-share``. When the lidar file is large, in bundle adjustment one can use the flag ``--lon-lat-limit`` to read only a relevant portion of it. This can speed up setting up the problem but does not affect the optimization. Sparse ground truth and multiple images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Everything mentioned earlier works with more than two images, in fact, having more images is highly desirable, and ideally the images overlap a lot. For example, one can create stereo pairs consisting of first and second images, second and third, third and fourth, etc., invoke the above logic for each pair, that is, run stereo, alignment to the ground truth, dense interest point generation, creation of unaligned disparities, and transforming the cameras using the alignment transform matrix. Then, a directory can be made in which one can copy the dense interest point files, and run bundle adjustment with intrinsics optimization jointly for all cameras. Hence, one should use a command as follows (the example here is for 4 images):: disp1=run_stereo12/run-unaligned-D.tif disp2=run_stereo23/run-unaligned-D.tif disp3=run_stereo34/run-unaligned-D.tif bundle_adjust -t nadirpinhole --inline-adjustments \ --solve-intrinsics --camera-position-weight 0 \ img1.tif img2.tif img3.tif img4.tif \ run_align_12/run-img1.tsai run_align12/run-img2.tsai \ run_align_34/run-img3.tsai run_align34/run-img4.tsai \ --reference-terrain lidar.csv \ --disparity-list "$disp1 $disp2 $disp3" \ --robust-threshold 2 \ --max-disp-error 50 --max-num-reference-points 1000000 \ --overlap-limit 1 --parameter-tolerance 1e-12 \ --reference-terrain-weight 5 \ -o run_ba_intr_lidar/run In case it is desired to omit the disparity between one pair of images, for example, if they don't overlap, instead of the needed unaligned disparity one can put the word ``none`` in this list. Notice that since this joint adjustment was initialized from several stereo pairs, the second camera picked above, for example, could have been either the second camera from the first pair, or the first camera from the second pair, so there was a choice to make. In :numref:`skysat` an example is shown where a preliminary bundle adjustment happens at the beginning, without using a reference terrain, then those cameras are jointly aligned to the reference terrain, and then one continues as done above, but this time one need not have dealt with individual stereo pairs. The option ``--overlap-limit`` can be used to control which images should be tested for interest point matches, and a good value for it is say 1 if one plans to use the interest points generated by stereo, though a value of 2 may not hurt either. One may want to decrease ``--parameter-tolerance``, for example, to 1e-12, and set a value for ``--max-disp-error``, e.g, 50, to exclude unreasonable disparities (this last number may be something one should experiment with, and the results can be somewhat sensitive to it). A larger value of ``--reference-terrain-weight`` can improve the alignment of the cameras to the reference terrain. Also note the earlier comment about sharing and floating the intrinsics individually. .. _kaguya_ba: Refining the intrinsics per sensor ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given a set of sensors, with each acquiring several images, we will optimize the intrinsics per sensor. All images acquired with the same sensor will share the same intrinsics, and none will be shared across sensors. We will work with Kaguya TC linescan cameras and the CSM camera model (:numref:`csm`). Pinhole cameras in .tsai format (:numref:`pinholemodels`) and Frame cameras in CSM format (:numref:`csm_frame_def`) can be used as well. See :numref:`floatingintrinsics` for an introduction on how optimizing intrinsics works, and :numref:`kaguya_tc` for how to prepare and use Kaguya TC cameras. See :numref:`ba_frame_linescan` for fine-level control per group and for how to mix frame and linescan cameras. .. _kaguya_watch: Things to watch for ^^^^^^^^^^^^^^^^^^^ Optimizing the intrinsics can be tricky. One has to be careful to select a non-small set of images that have a lot of overlap, similar illumination, and an overall good baseline between enough images (:numref:`stereo_pairs`). It is suggested to do a lot of inspections along the way. If things turn out to work poorly, it is often hard to understand at what step the process failed. Most of the time the fault lies with the data not satisfying the assumptions being made. The process will fail if, for example, the data is not well-aligned before the refinement of intrinsics is started, if the illumination is so different that interest point matches cannot be found, or if something changed about a sensor and the same intrinsics don't work for all images acquired with that sensor. The ``cam_test`` tool (:numref:`cam_test`) can be used to check if the distortion model gets inverted correctly. The distortion model should also be expressive enough to model the distortion in the images. Image selection ^^^^^^^^^^^^^^^ We chose a set of 10 Kaguya stereo pairs with a lot of overlap (20 images in total). The left image was acquired with the ``TC1`` sensor, and the right one with ``TC2``. These sensors have different intrinsics. Some Kaguya images have different widths. These should not be mixed together. Of the images with narrower width, it was observed that images acquired with "morning" illumination need different calibration than the rest. Hence, there will be two groups of intrinsics for the narrow TC images. Some images had very large difference in illumination (not for the same stereo pair). Then, finding of matching interest points can fail. Kaguya images are rather well-registered to start with, so the resulting small misalignment that could not be corrected by bundle adjustment was not a problem in solving for intrinsics, and ``pc_align`` (:numref:`pc_align`) was used later for individual alignment. This is not preferable, in general. It was tricky however to find many images with a lot of overlap, so this had to make do. A modification of the work flow for the case of images with very different illumination is in :numref:`kaguya_ba_illumination`. .. _kaguya_ba_initial_ba: Initial bundle adjustment with fixed intrinsics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Put the image and camera names in plain text files named ``images.txt`` and ``cameras.txt``. These must be in one-to-one correspondence, and with one image or camera per line. The order should be with TC1 images being before TC2. Later we will use the same order when these are subdivided by sensor. Initial bundle adjustment is done with the intrinsics fixed. :: parallel_bundle_adjust \ --nodes-list nodes.txt \ --image-list images.txt \ --camera-list cameras.txt \ --num-iterations 50 \ --tri-weight 0.2 \ --tri-robust-threshold 0.2 \ --camera-position-weight 0 \ --auto-overlap-params 'dem.tif 15' \ --remove-outliers-params '75.0 3.0 20 20' \ --ip-per-tile 2000 \ --matches-per-tile 2000 \ --max-pairwise-matches 20000 \ -o ba/run The option ``--auto-overlap-params`` is used with a prior DEM (such as gridded and filled with ``point2dem`` at low resolution based on LOLA RDR data). This is needed to estimate which image pairs overlap. The option ``--remove-outliers-params`` is set so that only the worst outliers (with reprojection error of 20 pixels or more) are removed. That because imperfect intrinsics may result in accurate interest points that have a somewhat large reprojection error. We want to keep such features in the corners to help refine the distortion parameters. The option ``--ip-per-tile`` is set to a large value so that many interest points are generated, and then the best ones are kept. This can be way too large for big images. (Consider using instead ``--ip-per-image``.) The option ``--matches-per-tile`` tries to ensure matches are uniformly distributed (:numref:`custom_ip`). Normally 50 iterations should be enough. Two passes will happen. After each pass outliers will be removed. It is very strongly suggested to inspect the obtained clean match files (that is, without outliers) with ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`), and reprojection errors in the final ``pointmap.csv`` file (:numref:`ba_out_files`), using ``stereo_gui`` as well (:numref:`plot_csv`). Insufficient or poorly distributed clean interest point matches will result in a poor solution. The reprojection errors are plotted in :numref:`kaguya_intrinsics_opt_example`. Running stereo ^^^^^^^^^^^^^^ We will use the optimized CSM cameras saved in the ``ba`` directory (:numref:`csm_state`). For each stereo pair, run:: parallel_stereo \ --job-size-h 2500 \ --job-size-w 2500 \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --nodes-list nodes.txt \ left.cub right.cub \ ba/run-left.adjusted_state.json \ ba/run-right.adjusted_state.json \ stereo_left_right/run Then we will create a DEM at the resolution of the input images, which in this case is 10 m/pixel. The local stereographic projection will be used. :: point2dem --tr 10 \ --errorimage \ --stereographic \ --proj-lon 93.7608 \ --proj-lat 3.6282 \ stereo_left_right/run-PC.tif Normally it is suggested to rerun stereo with mapprojected images (:numref:`mapproj-example`) to get higher quality results. For the current goal, of optimizing the intrinsics, the produced terrain is good enough. See also :numref:`nextsteps` for a discussion of various stereo algorithms. Inspect the produced DEMs and intersection error files (:numref:`point2dem`). The latter can be colorized (:numref:`colorize`). Use ``gdalinfo -stats`` (:numref:`gdal_tools`) to see the statistics of the intersection error. In this case it turns out to be around 4 m, which, given the ground resolution of 10 m/pixel, is on the high side. The intersection errors are also higher at left and right image edges, due to distortion. (For a frame sensor this error will instead be larger in the corners.) Evaluating agreement between the DEMs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Overlay the produced DEMs and check for any misalignment. This may happen if there are insufficient interest points or if the unmodeled distortion is large. Create a blended average DEM from the produced DEMs using the ``dem_mosaic`` (:numref:`dem_mosaic`):: dem_mosaic stereo*/run-DEM.tif -o mosaic_ba.tif Alternatively, such a DEM can be created from LOLA RDR data, if dense enough, as:: point2dem \ --csv-format 2:lon,3:lat,4:radius_km \ --search-radius-factor 10 \ --tr --t_srs \ lola.csv It is likely better, however, to ensure there is a lot of overlap between the input images and use the stereo DEM mosaic rather than LOLA. *The process will fail if the DEM that is used as a constraint is misaligned with the cameras.* Alignment is discussed in :numref:`intrinsics_ground_truth`. It is useful to subtract each DEM from the mosaic using ``geodiff`` (:numref:`geodiff`):: geodiff mosaic_ba.tif stereo_left_right/run-DEM.tif \ -o stereo_left_right/run These differences can be colorized with ``stereo_gui`` using the ``--colorbar`` option (:numref:`colorize`). The std dev of the obtained signed difference can be used as a measure of discrepancy. These errors should go down after refining the intrinsics. Uniformly distributed interest points ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For the next step, refining the intrinsics, it is important to have well-distributed interest points. Normally, the sparse interest points produced with bundle adjustment so far can be used. *For most precise work, dense and uniformly distributed interest points produced from disparity are necessary* (:numref:`dense_ip`). For example, if the input dataset consists of 6 overlapping stereo pairs, stereo can be run between each left image and every other right image, producing 36 sets of dense interest points. See an example in :numref:`change3`. The interest point file names must be changed to respect the *naming convention* (:numref:`ba_match_files`), reflecting the names of the raw images, then passed to ``bundle_adjust`` via the ``--match-files`` option. One can also take the sparse interest points, and augment them with dense interest points from stereo only for a select set of pairs. All these must then use the same naming convention. Refining the intrinsics ^^^^^^^^^^^^^^^^^^^^^^^ We will use the camera files produced by ``bundle_adjust`` before, with names as ``ba/run-*.adjusted_state.json``. These have the refined position and orientation. We will re-optimize those together with the intrinsics parameters, including distortion (which in ``bundle_adjust`` goes by the name ``other_intrinsics``). The images and (adjusted) cameras for individual sensors should be put in separate files, but in the same overall order as before, to be able reuse the match files. Then, the image lists will be passed to the ``--image-list`` option with comma as separator (no spaces), and the same for the camera lists. The bundle adjustment command becomes:: bundle_adjust --solve-intrinsics \ --inline-adjustments \ --intrinsics-to-float \ "optical_center focal_length other_intrinsics" \ --image-list tc1_images.txt,tc2_images.txt \ --camera-list tc1_cameras.txt,tc2_cameras.txt \ --num-iterations 10 \ --clean-match-files-prefix ba/run \ --heights-from-dem mosaic_ba.tif \ --heights-from-dem-uncertainty 10.0 \ --heights-from-dem-robust-threshold 0.1 \ --remove-outliers-params '75.0 3.0 20 20' \ --max-pairwise-matches 20000 \ -o ba_other_intrinsics/run See :numref:`heights_from_dem` for the option ``--heights-from-dem``, and :numref:`bundle_adjust` for the documentation of all options above. If only a single sensor exists, the option ``--intrinsics-to-share`` should be set. If large errors are still left at the image periphery, adjust ``--heights-from-dem-uncertainty``. If a small value of this is used with an inaccurate prior DEM, it will make the results worse. Also consider adding more images overlapping with the current ones. Some lens distortion parameters can be kept fixed (option ``--fixed-distortion-indices``). .. figure:: images/kaguya_intrinsics_opt_example.png :name: kaguya_intrinsics_opt_example :alt: kaguya_intrinsics_opt_example The reprojection errors (``pointmap.csv``) before (top) and after (bottom) refinement of distortion. Some outliers are still visible but are harmless. Dense and uniformly distributed interest points (:numref:`dense_ip`) are strongly suggested, but not used here. It can be seen that many red vertical patterns are now much attenuated (these correspond to individual image edges). On the right some systematic errors are seen (due to the search range in stereo chosen here being too small and some ridges having been missed). Those do not affect the optimization. Using mapprojected images would have helped with this. The ultimate check will be the comparison with LOLA RDR (:numref:`kaguya_intrinsics_alignment_diff`). Plotted with ``stereo_gui`` (:numref:`plot_csv`). Recreation of the stereo DEMs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The new cameras can be used to redo stereo and the DEMs. It is suggested to use the option ``--prev-run-prefix`` in ``parallel_stereo`` to redo only the triangulation operation, which greatly speeds up processing (see :numref:`bathy_reuse_run` and :numref:`mapproj_reuse`). As before, it is suggested to examine the intersection error and the difference between each produced DEM and the corresponding combined averaged DEM. These errors drop by a factor of about 2 and 1.5 respectively. Comparing to an external ground truth ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ We solved for intrinsics by constraining against the averaged mosaicked DEM of the stereo pairs produced with initial intrinsics. This works reasonably well if the error due to distortion is somewhat small and the stereo pairs overlap enough that this error gets averaged out in the mosaic. Ideally, a known accurate external DEM should be used. For example, one could create DEMs using LRO NAC data. Note that many such DEMs would be need to be combined, because LRO NAC has a much smaller footprint. Should such a DEM exist, before using it instead of the averaged mosaic, the mosaic (or individual stereo DEMs) should be first aligned to the external DEM. Then, the same alignment transform should be applied to the cameras (:numref:`ba_pc_align`). Then the intrinsics optimization can happen as before. We use the sparse `LOLA RDR `_ dataset for final validation. This works well enough because the ground footprint of Kaguya TC is rather large. Each stereo DEM, before and after intrinsics refinement, is individually aligned to LOLA, and the signed difference to LOLA is found. :: pc_align --max-displacement 50 \ --save-inv-transformed-reference-points \ dem.tif lola.csv \ -o run_align/run point2dem --tr 10 \ --errorimage \ --stereographic \ --proj-lon 93.7608 \ --proj-lat 3.6282 \ run_align/run-trans_reference.tif geodiff --csv-format 2:lon,3:lat,4:radius_km \ run_align/run-trans_reference-DEM.tif lola.csv \ -o run_align/run The ``pc_align`` tool is quite sensitive to the value of ``--max-displacement`` (:numref:`pc_align_max_displacement`). Here it was chosen to be somewhat larger than the vertical difference between the two datasets to align. That because KaguyaTC is already reasonably well-aligned. .. figure:: images/kaguya_intrinsics_diff.png :name: kaguya_intrinsics_alignment_diff :alt: kaguya_intrinsics_alignment_diff The signed difference between aligned stereo DEMs and LOLA RDR before (top) and after (bottom) refinement of distortion. (Blue = -20 meters, red = 20 meters.) It can be seen that the warping of the DEMs due to distortion is much reduced. Plotted with ``stereo_gui`` (:numref:`plot_csv`). .. _kaguya_ba_illumination: Handling images with very different illumination ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If each stereo pair has consistent illumination, but the illumination is very different between pairs, then the above approach may not work well as tie points could be hard to find. It is suggested to do the initial bundle adjustment per each stereo pair, followed by alignment of the individual produced DEMs to a reference dataset. Apply the alignment transform to the pairwise bundle-adjusted cameras as well (:numref:`ba_pc_align`), and use these cameras for the refinement of intrinsics, with the ground constraint being the mosaic of these aligned DEMs. It is suggested to examine how each aligned DEM differs from the reference, and the same for their mosaic. The hope is that the mosaicking will average out the errors in the individual DEMs. If a lot of such stereo pairs are present, for the purpose of refinement of intrinsics it is suggested to pick just a handful of them, corresponding to the area where the mosaicked DEM differs least from the reference, so where the distortion artifacts are most likely to have been averaged well. .. _ba_frame_linescan: Mixing frame and linescan cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ So far we discussed refining the intrinsics for pinhole (frame) cameras, such as in :numref:`heights_from_dem`, and for linescan cameras, such as in :numref:`kaguya_ba`. Here we will consider the situation when we have both. It is assumed that the images acquired with these sensors are close in time and have similar illumination. There should be a solid amount of image overlap, especially in the corners of the images whose distortion should be optimized. It will be illustrated how the presumably more accurate linescan sensor images can be used to refine the intrinsics of the frame sensor. Preparing the inputs ^^^^^^^^^^^^^^^^^^^^ The frame cameras can be in the black-box RPC format (:numref:`rpc`), or any other format supported by ASP. The cameras can be converted to the CSM format using ``cam_gen`` (:numref:`cam_gen_frame`). This will find the best-fit intrinsics, including the lens distortion. It is important to know at least the focal length of the frame cameras somewhat accurately. This can be inferred based on satellite elevation and ground footprint. Once the first frame camera is converted to CSM, the rest of them that are supposed to be for the same sensor model can borrow the just-solved intrinsic parameters using the option ``--sample-file prev_file.json`` (the ``cam_gen`` manual has the full invocation). The linescan cameras can be converted to CSM format using ``cam_gen`` as well (:numref:`cam_gen_linescan`). This does not find a best-fit model, but rather reads the linescan sensor poses and intrinsics from the input file. We will assume in this basic example that we have two frame camera images sharing intrinsics, named ``frame1.tif`` and ``frame2.tif``, and two linescan camera images, for which will not enforce that the intrinsics are shared. They can even be from different vendors. The linescan intrinsics will be kept fixed. Assume these files are named ``linescan1.tif`` and ``linescan2.tif``. The camera names will have the same convention, but ending in ``.json``. Initial bundle adjustment ^^^^^^^^^^^^^^^^^^^^^^^^^ The same approach as in :numref:`kaguya_ba_initial_ba` can be used. A DEM may be helpful to help figure out which image pairs overlap, but is not strictly necessary. Ensure consistent order of the images and cameras, both here and in the next steps. This will guarantee that all generated match files will be used. The order here will be ``frame1``, ``frame2``, ``linescan1``, ``linescan2``. It is very strongly suggested to examine the stereo convergence angles (:numref:`ba_conv_angle`). At least some of them should be at least 10-15 degrees, to ensure a robust solution. Also examine the pairwise matches in ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`), the final residuals per camera (:numref:`ba_errors_per_camera`), and per triangulated point (:numref:`ba_err_per_point`). The latter can be visualized in ``stereo_gui`` (:numref:`plot_csv`). The goal is to ensure well-distributed features, and that the errors are pushed down uniformly. Dense interest points produced from stereo are strongly suggested (:numref:`dense_ip`). An example using these is in :numref:`change3`. Evaluation of terrain models ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As in :numref:`kaguya_ba`, it is suggested to create several stereo DEMs after the initial bundle adjustment. For example, make one DEM for the frame camera pair, and a second for the linescan one. Use mapprojected images, the ``asp_mgm`` algorithm (:numref:`nextsteps`), and a local stereographic projection for the produced DEMs. One should examine the triangulation error for each DEM (:numref:`triangulation_error`), and the difference between them with ``geodiff`` (:numref:`geodiff`). Strong systematic errors for the frame camera data will then motivate the next steps. Refinement of the frame camera intrinsics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ We will follow closely the recipe in :numref:`kaguya_ba`. It is suggested to use for the refinement step the linescan DEM as a constraint (option ``--heights-from-dem``). If a different DEM is employed, the produced bundle-adjusted cameras and DEMs should be aligned to it first (:numref:`ba_pc_align`). As for :numref:`kaguya_ba`, we need to create several text files, with each having the names of the images whose intrinsics are shared, and the same for the cameras. If not sure that the linescan cameras have the same intrinsics, they can be kept in different files. We will keep those intrinsics fixed in either ase. Assume the previous bundle adjustment was done with the output prefix ``ba/run``. The files for the next step are created as follows. For the cameras:: ls ba/run-frame1.adjusted_state.json \ ba/run-frame2.adjusted_state.json > frame_cameras.txt ls ba/run-linescan1.adjusted_state.json > linescan1_cameras.txt ls ba/run-linescan2.adjusted_state.json > linescan2_cameras.txt and similarly the images. Hence, we have 3 groups of sensors. These files will be passed to ``bundle_adjust`` as follows:: --image-list frame_images.txt,linescan1_images.txt,linescan2_images.txt \ --camera-list frame_cameras.txt,linescan1_cameras.txt,linescan2_cameras.txt Use a comma as separator, and no spaces. We will float the intrinsics for the frame cameras, and keep the linescan intrinsics (but not poses) fixed. This is accomplished with the option:: --intrinsics-to-float '1:focal_length,optical_center,other_intrinsics 2:none 3:none' Optimizing the optical center may not be necessary, as this intrinsic parameter may correlate with the position of the cameras, and these are not easy to separate. Optimizing this may produce an implausible optical center. Dense matches from disparity are strongly recommended (:numref:`dense_ip`). Some lens distortion parameters can be kept fixed (option ``--fixed-distortion-indices``). .. _ba_frame_linescan_results: Post-refinement evaluation ^^^^^^^^^^^^^^^^^^^^^^^^^^ New DEMs and intersection error maps can be created. The previous stereo runs can be reused with the option ``--prev-run-prefix`` in ``parallel_stereo`` (:numref:`mapproj_reuse`). .. figure:: images/frame_linescan_dem_diff.png :name: frame_linescan_dem_diff :alt: frame_linescan_dem_diff The signed difference between the frame and linescan DEMs before intrinsics refinement (left) and after (right). .. figure:: images/frame_linescan_intersection_error.png :name: frame_linescan_intersection_error :alt: frame_linescan_intersection_error The triangulation error for the frame cameras before refinement of intrinsics (left) and after (right). It can be seen in both figures that systematic differences are greatly reduced. .. _custom_ip: Custom approaches to interest points ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _sparse_ip: Sparse and roughly uniformly distributed interest points ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To attempt to create roughly uniformly distributed *sparse* interest points during bundle adjustment, use options along the lines ``--ip-per-tile 1000 --matches-per-tile 500 --max-pairwise-matches 10000``. If the images have very different perspectives, it is suggested to create the interest points based on mapprojected images (:numref:`mapip`). Note that if the images are big, this will result in a very large number of potential matches, because a tile has the size of 1024 pixels. (See :numref:`ba_options` for the reference documentation for these options.) To produce sparse interest point matches that are accurate to *subpixel level*, use ``--ip-detect-method 1``. .. _dense_ip: Dense and uniformly distributed interest points ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dense and uniformly distributed interest points can be created during stereo (:numref:`tutorial`). If having many images, that will mean many combinations of stereo pairs. A representative set of stereo pairs between all images is usually sufficient. The resulting interest points will be between the *original, unprojected and unaligned images*. This is true even when stereo itself is done with mapprojected images. For each stereo invocation, add options along the lines of:: --num-matches-from-disparity 10000 or:: --num-matches-from-disp-triplets 10000 in order to create such a match file. The latter option will ensure that, when there are more than two images, a dense subset of features within area of overlap will have corresponding matches in more than two images, with a single triangulated point on the ground for each such matching feature set. If having many such stereo pairs, some triangulated points will be represented with matches in all images. This can be quite important for bundle adjustment. This number of features for each triangulated point is the last field in the ``pointmap.csv`` report files (:numref:`ba_err_per_point`). In the latest ASP (:numref:`release`), these options are equivalent. The produced match file name is named along the lines of:: run/run-disp-left__right.match where ``left.tif`` and ``right.tif`` are the input images. If these images are mapprojected, the latest ASP (post version 3.4.0) will instead adjust the match file name to reflect the original, unprojected image names, as the matches are between those images. In either case, the produced match files must be copied from individual stereo runs to the same directory, and *use the standard naming convention* for the original image names (:numref:`ba_match_files`). The match files must be passed to ``bundle_adjust`` via the ``--match-files-prefix`` option. In this example, the prefix would be ``run/run-disp``. Invoke ``bundle_adjust`` a value of ``--max-pairwise-matches`` that is *at least twice* the number of matches created here to ensure they are all kept. A detailed example of using dense matches for bundle adjustment is in :numref:`change3`. These options are formally described in :numref:`triangulation_options`. Interest points from mapprojected images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Interest point matches can be found between mapprojected images first, and those can be unprojected and used in bundle adjustment. This can produce many more interest points when the difference of perspective or scale between images is large. See :numref:`mapip`. .. _limit_ip: Limit extent of interest point matches ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To limit the triangulated points produced from interest points to a certain area during bundle adjustment, two approaches are supported. One is the option ``--proj-win``, coupled with ``--proj-str``. The other is using the ``--weight-image`` option (also supported by the jitter solver, :numref:`jitter_solve`). In locations where a given georeferenced weight image has non-positive or nodata values, triangulated points will be ignored. Otherwise each pixel reprojection error will be multiplied by the weight closest geographically to the triangulated point. The effect is to work harder on the areas where the weight is higher. Such a weight image can be created from a regular georeferenced image with positive pixel values as follows. Open it in ``stereo_gui``, and draw on top of it one or more polygons, each being traversed in a counterclockwise direction, and with any holes oriented clockwise (:numref:`plot_poly`). Save this shape as ``poly.shp``, and then run:: cp georeferenced_image.tif aux_image.tif gdal_rasterize -i -burn -32768 poly.shp aux_image.tif This will keep the data inside the polygons and set the data outside to this value. The value to burn should be negative and smaller than any valid pixel value in the image. To keep the data outside the polygons, omit the ``-i`` option. Then, create a mask of valid values using ``image_calc`` (:numref:`image_calc`), as follows:: image_calc -c "max(sign(var_0), 0)" \ --output-nodata-value var_0 \ aux_image.tif -o weight.tif Examine the obtained image in ``stereo_gui`` and click on various pixels to inspect the values. If the image does not have positive values to start with, those values can be first shifted up with ``image_calc``. Various such weight images can be merged with ``dem_mosaic`` (:numref:`dem_mosaic`) or the values manipulated with ``image_calc``. .. _ba_rpc_distortion: RPC lens distortion ~~~~~~~~~~~~~~~~~~~ ASP provides a lens distortion model for Pinhole cameras (:numref:`pinholemodels`) that uses Rational Polynomial Coefficients (RPC) of arbitrary degree (:numref:`rpc_distortion`). This can help fit lens distortion where other simpler models cannot. The tool ``convert_pinhole_model`` (:numref:`convert_pinhole_model`) can create camera models with RPC distortion. It is very important for the input distortion coefficients to be manually modified so they are on the order of 1e-7 or more, as otherwise they will be hard to optimize and may stay small. In the latest builds this is done automatically by ``bundle_adjust`` (option ``--min-distortion``). See :numref:`intrinsics_ground_truth` and :numref:`kaguya_ba` for examples of how to to optimize the lens distortion. An example specifically using RPC is illustrated in :numref:`kh7_fig`. It is suggested to use dense interest point matches from disparity (:numref:`dense_ip`). .. figure:: images/biradial_err_rpc.png Triangulation error (:numref:`triangulation_error`) examples without modeling distortion (top), and after optimizing the lens distortion with RPC of degree 6 (bottom). The dataset for this example was acquired by a drone and had "biradial" distortion. .. _jigsaw: Bundle adjustment using ISIS ---------------------------- In what follows we describe how to do bundle adjustment using ISIS's toolchain. It also serves to describe bundle adjustment in more detail, which is applicable to other bundle adjustment tools as well, including Stereo Pipeline's own tool. ASP's ``bundle_adjust`` program can read and write the ISIS control network format, hence the ASP and ISIS tools can be compared or used together (:numref:`control_network`). In bundle adjustment, the position and orientation of each camera station are determined jointly with the 3D position of a set of image tie-points points chosen in the overlapping regions between images. Tie points, as suggested by the name, tie multiple camera images together. Their physical manifestation would be a rock or small crater than can be observed across more than one image. Tie-points are automatically extracted using ISIS's ``autoseed`` and ``pointreg`` (alternatively one could use a number of outside methods such as the famous SURF :cite:`surf08`). Creating a collection of tie points, called a *control network*, is a three step process. First, a general geographic layout of the points must be decided upon. This is traditionally just a grid layout that has some spacing that allows for about 20-30 measurements to be made per image. This shows up in slightly different projected locations in each image due to their slight misalignments. The second step is to have an automatic registration algorithm try to find the same feature in all images using the prior grid as a starting location. The third step is to manually verify all measurements visually, checking to insure that each measurement is looking at the same feature. .. figure:: images/ba_feature_observation.png :name: ba_feature :alt: A feature observation A feature observation in bundle adjustment, from :cite:`moore09` Bundle adjustment in ISIS is performed with the ``jigsaw`` executable. It generally follows the method described in :cite:`triggs00` and determines the best camera parameters that minimize the projection error given by .. math:: {\bf \epsilon} = \sum_k\sum_j(I_k-I(C_j, X_k))^2 where :math:`I_k` are the tie points on the image plane, :math:`C_j` are the camera parameters, and :math:`X_k` are the 3D positions associated with features :math:`I_k`. :math:`I(C_j, X_k)` is an image formation model (i.e. forward projection) for a given camera and 3D point. To recap, it projects the 3D point, :math:`X_k`, into the camera with parameters :math:`C_j`. This produces a predicted image location for the 3D point that is compared against the observed location, :math:`I_k`. It then reduces this error with the Levenberg-Marquardt algorithm (LMA). Speed is improved by using sparse methods as described in :cite:`hartley04`, :cite:`konolige:sparsesparse`, and :cite:`cholmod`. Even though the arithmetic for bundle adjustment sounds clever, there are faults with the base implementation. Imagine a case where all cameras and 3D points were collapsed into a single point. If you evaluate the above cost function, you'll find that the error is indeed zero. This is not the correct solution if the images were taken from orbit. Another example is if a translation was applied equally to all 3D points and camera locations. This again would not affect the cost function. This fault comes from bundle adjustment's inability to control the scale and translation of the solution. It will correct the geometric shape of the problem, yet it cannot guarantee that the solution will have correct scale and translation. ISIS attempts to fix this problem by adding two additional cost functions to bundle adjustment. First of which is .. math:: {\bf \epsilon} = \sum_j(C_j^{initial}-C_j)^2. This constrains camera parameters to stay relatively close to their initial values. Second, a small handful of 3D ground control points (:numref:`bagcp`) can be chosen by hand and added to the error metric as .. math:: {\bf \epsilon} = \sum_k(X_k^{gcp}-X_k)^2 to constrain these points to known locations in the planetary coordinate frame. A physical example of a ground control point could be the location of a lander that has a well known location. GCPs could also be hand-picked points against a highly regarded and prior existing map such as the THEMIS Global Mosaic or the LRO-WAC Global Mosaic. Like other iterative optimization methods, there are several conditions that will cause bundle adjustment to terminate. When updates to parameters become insignificantly small or when the error, :math:`{\bf \epsilon}`, becomes insignificantly small, then the algorithm has converged and the result is most likely as good as it will get. However, the algorithm will also terminate when the number of iterations becomes too large in which case bundle adjustment may or may not have finished refining the parameters of the cameras. .. _ba_example: Tutorial: Processing Mars Orbital Camera images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This tutorial for ISIS's bundle adjustment tools is taken from :cite:`lunokhod:controlnetwork` and :cite:`lunokhod:gcp`. These tools are not a product of NASA nor the authors of Stereo Pipeline. They were created by USGS and their documentation is available at :cite:`isis:documentation`. What follows is an example of bundle adjustment using two MOC images of Hrad Vallis. We use images E02/01461 and M01/00115, the same as used in :numref:`moc_tutorial`. These images are available from NASA's PDS (the ISIS ``mocproc`` program will operate on either the IMQ or IMG format files, we use the ``.imq`` below in the example). Ensure that ISIS and its supporting data is installed, per :numref:`planetary_images`, and that ``ISISROOT`` and ``ISIS3DATA`` are set. The string ``ISIS>`` is not part of the shell commands below, it is just suggestive of the fact that we operate in an ISIS environment. Fetch the MOC images anc convert them to ISIS cubes. :: ISIS> mocproc from=E0201461.imq to=E0201461.cub mapping=no ISIS> mocproc from=M0100115.imq to=M0100115.cub mapping=no Note that the resulting images are not map-projected. That because bundle adjustment requires the ability to project arbitrary 3D points into the camera frame. The process of map-projecting an image dissociates the camera model from the image. Map-projecting can be perceived as the generation of a new infinitely large camera sensor that may be parallel to the surface, a conic shape, or something more complex. That makes it extremely hard to project a random point into the camera's original model. The math would follow the transformation from projection into the camera frame, then projected back down to surface that ISIS uses, then finally up into the infinitely large sensor. ``Jigsaw`` does not support this and thus does not operate on map-projected images. ASP's ``bundle_adjust`` program, however, can create and match features on mapprojected images, and then project those into the original images (:numref:`mapip`). Before we can dive into creating our tie-point measurements we must finish prepping these images. The following commands will add a vector layer to the cube file that describes its outline on the globe. It will also create a data file that describes the overlapping sections between files. :: ISIS> footprintinit from=E0201461.cub ISIS> footprintinit from=M0100115.cub ISIS> ls *.cub > cube.lis ISIS> findimageoverlaps from=cube.lis overlaplist=overlap.lis At this point, we are ready to start generating our measurements. This is a three step process that requires defining a geographic pattern for the layout of the points on the groups, an automatic registration pass, and finally a manual clean up of all measurements. Creating the ground pattern of measurements is performed with ``autoseed``. It requires a settings file that defines the spacing in meters between measurements. For this example, write the following text into a *autoseed.def* file. :: Group = PolygonSeederAlgorithm Name = Grid MinimumThickness = 0.01 MinimumArea = 1 XSpacing = 1000 YSpacing = 2000 End_Group The minimum thickness defines the minimum ratio between the sides of the region that can have points applied to it. A choice of 1 would define a square and anything less defines thinner and thinner rectangles. The minimum area argument defines the minimum square meters that must be in an overlap region. The last two are the spacing in meters between control points. Those values were specifically chosen for this pair so that about 30 measurements would be produced from ``autoseed``. Having more control points just makes for more work later on in this process. Run ``autoseed`` as follows. :: ISIS> autoseed fromlist=cube.lis overlaplist=overlap.lis \ onet=control.net deffile=autoseed.def networkid=moc \ pointid=vallis???? description=hrad_vallis Note the option ``pointid=vallis????``. It must be used verbatim. This command will create ids that will look like ``vallis0001``, ``valis0002``, potentially up to ``vallis9999``. The number of question marks will control hom many measurements are created. See `autoseed `_'s manual page for more details. Inspect this control network with `qnet `_. Type "qnet" in a terminal, with no options. A couple of windows will pop up. From the *File* menu of the ``qnet`` window, click on *Open control network and cube list*. Open the file ``cube.lis``. From the same dialog, open ``control.net``. Click on ``vallis0001`` in the Control Network Navigator window, then click on ``view cubes``. This will show the illustration below. .. figure:: images/qnet/Qnet_AfterAutoseed_400px.png :name: after_autoseed :alt: Autoseed visualization A visualization of the features laid out by ``autoseed`` in ``qnet``. Note that the marks do not cover the same features between images. This is due to the poor initial SPICE (camera pose) data for MOC images. The next step is to perform auto registration of these features between the two images using `pointreg `_. This program also requires a settings file that describes how to do the automatic search. Copy the text box below into a *autoRegTemplate.def* file. :: Object = AutoRegistration Group = Algorithm Name = MaximumCorrelation Tolerance = 0.7 EndGroup Group = PatternChip Samples = 21 Lines = 21 MinimumZScore = 1.5 ValidPercent = 80 EndGroup Group = SearchChip Samples = 75 Lines = 1000 EndGroup EndObject The search chip defines the search range for which ``pointreg`` will look for matching images. The pattern chip is simply the kernel size of the matching template. The search range is specific for this image pair. The control network result after ``autoseed`` had a large vertical offset on the order of 500 pixels. The large misalignment dictated the need for the large search in the lines direction. Use ``qnet`` to get an idea for what the pixel shifts look like in your stereo pair to help you decide on a search range. In this example, only one measurement failed to match automatically. Here are the arguments to use in this example of ``pointreg``. :: ISIS> pointreg fromlist=cube.lis cnet=control.net \ onet=control_pointreg.net deffile=autoRegTemplate.def The third step is to verify the measurements in ``qnet``, and, if necessary, apply manual corrections. Type ``qnet`` in the terminal and then open *cube.lis*, followed by *control_pointreg.net*. From the Control Network Navigator window, click, as before, on the first point, *vallis0001*. That opens a third window called the Qnet Tool. That window will allow you to play a flip animation that shows alignment of the feature between the two images. Correcting a measurement is performed by left clicking in the right image, then clicking *Save Measure*, and finally finishing by clicking *Save Point*. In this tutorial, measurement *0025* ended up being incorrect. Your number may vary if you used different settings than the above or if MOC SPICE (camera pose) data has improved since this writing. When finished, go back to the main Qnet window. Save the final control network as *control_qnet.net* by clicking on *File*, and then *Save As*. .. figure:: images/qnet/Qnet_AfterQnetManual_400px.png :name: after_manual :alt: After Qnet A visualization of the features after manual editing in ``qnet``. Note that the marks now appear in the same location between images. Once the control network is finished, it is finally time to start bundle adjustment. Here's how ``jigsaw`` is called:: ISIS> jigsaw \ fromlist = cube.lis \ update = yes \ twist = no \ radius = yes \ point_radius_sigma = 1000 \ cnet = control_qnet.net \ onet = control_ba.net The update option defines that we would like to update the camera pointing, if our bundle adjustment converges. The ``twist = no`` option says to not solve for the camera rotation about the camera bore. That property is usually very well known as it is critical for integrating an image with a line-scan camera. The ``radius = yes`` setting means that the radius of the 3D features can be solved for. Using ``radius = no`` will force the points to use height values from another source, usually LOLA or MOLA. The ``point_radius_sigma`` option defines the uncertainty of the radius of the 3D points, in units of meter. The above command will print out diagnostic information from every iteration of the optimization algorithm. The most important feature to look at is the *sigma0* value. It represents the mean of pixel errors in the control network. In our run, the initial error was 1065 pixels and the final solution had an error of 1.1 pixels. Producing a DEM using the newly created camera corrections is the same as covered in the Tutorial. When using ``jigsaw``, it modifies a copy of the SPICE data that is stored internally to the cube file. Thus, when we want to create a DEM using the correct camera geometry, no extra information needs to be given to ``parallel_stereo`` since it is already contained in the camera files. More information is in the `jigsaw documentation `_. See :numref:`control_network` for how to use the resulting control network in ``bundle_adjust``. In the event a mistake has been made, ``spiceinit`` will overwrite the SPICE data inside a cube file and provide the original uncorrected camera pointing. It can be invoked on each cub file as:: ISIS> spiceinit from=image.cub In either case, then one can run stereo:: ISIS> parallel_stereo \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ E0201461.cub M0100115.cub \ stereo/run See :numref:`nextsteps` for how how to improve the quality of stereo correlation results (at the expense of speed), how to create a DEM, etc. .. _jigsaw_cnet_details: Using the ISIS cnet format in ASP --------------------------------- ASP's ``bundle_adjust`` program can read and write control networks in the ISIS format (and they are read by ``jitter_solve`` as well). A basic overview of how this works is in :numref:`jigsaw_cnet`. This section provides more details. A priori surface points will be read and written back (they may change only in special cases, see below). Adjusted surface points will be read, optimized, then written back. For constrained surface points, the constraint will be relative to the a priori surface points. These will be used with sigmas from adjusted surface points, as the a priori sigmas are on occasion negative, and likely the adjusted sigmas are more up-to-date. Constrained surface points are treated as GCP in ``bundle_adjust`` (:numref:`bagcp`), so smaller sigmas result in more weight given to the discrepancy betwen surface points being optimized and a priori surface points. Fixed surface points will be set to the a priori values and kept fixed during the optimization. Any input points that are flagged as ignored or rejected will be treated as outliers and will not be used in the optimization. They will be saved the same way. Additional points may be tagged as outliers during optimization. These will be flagged as ignored and rejected on output. Partially constrained points will be treated as free points during the optimization, but the actual flags will be preserved on saving. Control measure sigmas are read and written back. They will be used in the optimization. If not set in the input file, they will be assigned the value 1.0 by ``bundle_adjust``, and it is this value that will be saved. Pixel measurements will have 0.5 subtracted on input, and then added back on output. If ``bundle_adjust`` is invoked with GCP files specified separately in ASP's GCP format, the GCP will be appended to the ISIS control network and then saved together with it. These points will be treated as constrained (with provided sigmas and a priori surface values), unless the sigmas are set to the precise value of 1e-10, or when the flag ``--fix-gcp-xyz`` is used, in which case they will be treated as fixed both during optimization and when saving to the ISIS control network file. (For a small value of sigma, GCP are practically fixed in either case.) Using the ``bundle_adjust`` options ``--initial-transform`` and ``--input-adjustments-prefix`` will force the recomputation of a priori points (using triangulation), as these options can drastically change the cameras. A priori points will change if ``--heights-from-dem`` is used (:numref:`heights_from_dem`). The sigmas will be set to what is provided via the ``--heights-from-dem-uncertainty`` option. If exporting match files from an ISIS control network (option ``--output-cnet-type match-files``), constrained and fixed points won't be saved, as ASP uses GCP files for that. Saved match files will have the rest of the matches, and clean match files will have only the inliers. Any sigma values and surface points from the control network will not be saved. ================================================ FILE: docs/conf.py ================================================ # -*- coding: utf-8 -*- # # Configuration file for the Sphinx documentation builder. # # This file does only contain a selection of the most common options. For a # full list see the documentation: # http://www.sphinx-doc.org/en/master/config # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) import re from pathlib import Path # -- Project information ----------------------------------------------------- project = 'Ames Stereo Pipeline' copyright = ( '2009-2025, United States Government as represented by the ' 'Administrator of the National Aeronautics and Space Administration' ) author = 'ASP Authors' # Extract the ASP version from ../src/CMakeLists.txt version_text = Path("../src/CMakeLists.txt").read_text() version_lines = version_text.splitlines() # Find the line that sets the version. Ignore comments. version_string = "" for line in version_lines: # Match at starting of line PACKAGE_VERSION followed something in parentheses m = re.match(r'^\s*set\s*\(\s*PACKAGE_VERSION\s+(.*?)\s*\)$', line) if m: version_string = m.group(1) break if version_string == "": raise Exception("Could not find the version in CMakeLists.txt") # The short X.Y version version = version_string.replace('_', '-') # The full version, including alpha/beta/rc tags release = version # -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.mathjax', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', 'sphinxcontrib.bibtex', ] bibtex_bibfiles = ['bibliography.bib', 'papersusingasp.bib'] numfig = True # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The master toctree document. master_doc = 'index' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path . exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'alabaster' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] # Custom sidebar templates, must be a dictionary that maps document names # to template names. # # The default sidebars (for documents that don't match any pattern) are # defined by theme itself. Builtin themes are using these templates by # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', # 'searchbox.html']``. # # html_sidebars = {} # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. htmlhelp_basename = 'AmesStereoPipelinedoc' # -- Options for LaTeX output ------------------------------------------------ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'asp_book.tex', 'Ames Stereo Pipeline Documentation', r'Ross A. Beyer, Oleg Alexandrov, Scott McMichael, \\ and the ASP contributors', 'manual'), ] # -- Options for manual page output ------------------------------------------ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'amesstereopipeline', 'Ames Stereo Pipeline Documentation', [author], 1) ] # -- Options for Texinfo output ---------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'AmesStereoPipeline', 'Ames Stereo Pipeline Documentation', author, 'AmesStereoPipeline', 'One line description of project.', 'Miscellaneous'), ] # -- Extension configuration ------------------------------------------------- ================================================ FILE: docs/contributing.rst ================================================ .. include:: ../CONTRIBUTING.rst ================================================ FILE: docs/correlation.rst ================================================ .. _correlation: Advanced stereo topics ====================== In this chapter we will dive much deeper into understanding the core algorithms in the Stereo Pipeline. We start with an overview of the five stages of stereo reconstruction. Then we move into an in-depth discussion and exposition of the various correlation algorithms. The goal of this chapter is to build an intuition for the stereo correlation process. This will help users to identify unusual results in their DEMs and hopefully eliminate them by tuning various parameters in the ``stereo.default`` file (:numref:`stereodefault`). For scientists and engineers who are using DEMs produced with the Stereo Pipeline, this chapter may help to answer the question, "What is the Stereo Pipeline doing to the raw data to produce this DEM?" A related question that is commonly asked is, "How accurate is a DEM produced by the Stereo Pipeline?" This chapter does not yet address matters of accuracy and error, however we have several efforts underway to quantify the accuracy of Stereo Pipeline-derived DEMs, and will be publishing more information about that shortly. Stay tuned. The entire stereo correlation process, from raw input images to a point cloud or DEM, can be viewed as a multistage pipeline as depicted in :numref:`asp`, and detailed in the following sections. .. figure:: images/asp.png :alt: Flow of data through the Stereo Pipeline. :name: asp Flow of data through the Stereo Pipeline. Pre-processing -------------- The first optional (but recommended) step in the process is least squares Bundle Adjustment, which is described in detail in :numref:`bundle_adjustment`. Next, the left and right images are roughly aligned using one of the four methods: (1) a homography transform of the right image based on automated tie-point measurements (interest point matches), (2) an affine epipolar transform of both the left and right images (also based on tie-point measurements as earlier), the effect of which is equivalent to rotating the original cameras which took the pictures, (3) a 3D rotation that achieves epipolar rectification (only implemented for Pinhole sessions for missions like MER or K10, see :numref:`mer-example` and :numref:`k10example`) or (4) map-projection of both the left and right images using the ISIS ``cam2map`` command or through the more general ``mapproject`` tool that works for any cameras supported by ASP (see :numref:`mapproj-example` for the latter). The first three options can be applied automatically by the Stereo Pipeline when the ``alignment-method`` variable in the ``stereo.default`` file is set to ``affineepipolar``, ``homography``, or ``epipolar``, respectively. The latter option, running ``cam2map``, ``cam2map4stereo.py``, or ``mapproject`` must be carried out by the user prior to invoking the ``parallel_stereo`` command. Map-projecting the images using ISIS eliminates any unusual distortion in the image due to the unusual camera acquisition modes (e.g. pitching "ROTO" maneuvers during image acquisition for MOC, or highly elliptical orbits and changing line exposure times for the , HRSC). It also eliminates some of the perspective differences in the image pair that are due to large terrain features by taking the existing low-resolution terrain model into account (e.g. the :term:`MOLA`, :term:`LOLA`, :term:`NED`, or :term:`ULCN` 2005 models). In essence, map-projecting the images results in a pair of very closely matched images that are as close to ideal as possible given existing information. This leaves only small perspective differences in the images, which are exactly the features that the stereo correlation process is designed to detect. For this reason, we recommend map-projection for pre-alignment of most stereo pairs. Its only cost is longer triangulation times as more math must be applied to work back through the transforms applied to the images. In either case, the pre-alignment step is essential for performance because it ensures that the disparity search space is bounded to a known area. In both cases, the effects of pre-alignment are taken into account later in the process during triangulation, so you do not need to worry that pre-alignment will compromise the geometric integrity of your DEM. In some cases the pre-processing step may also normalize the pixel values in the left and right images to bring them into the same dynamic range. Various options in the ``stereo.default`` file affect whether or how normalization is carried out, including ``individually-normalize`` and ``force-use-entire-range``. Although the defaults work in most cases, the use of these normalization steps can vary from data set to data set, so we recommend you refer to the examples in :numref:`examples` to see if these are necessary in your use case. Finally, pre-processing can perform some filtering of the input images (as determined by ``prefilter-mode``) to reduce noise and extract edges in the images. When active, these filters apply a kernel with a sigma of ``prefilter-kernel-width`` pixels that can improve results for noisy images (``prefilter-mode`` must be chosen carefully in conjunction with ``cost-mode``, see :numref:`stereodefault`). The pre-processing modes that extract image edges are useful for stereo pairs that do not have the same lighting conditions, contrast, and absolute brightness :cite:`Nishihara84practical`. We recommend that you use the defaults for these parameters to start with, and then experiment only if your results are sub-optimal. .. _stereo_corr: Disparity map initialization ---------------------------- Correlation is the process at the heart of the Stereo Pipeline. It is a collection of algorithms that compute correspondences between pixels in the left image and pixels in the right image. The map of these correspondences is called a *disparity map*. This is saved in the file named ``output_prefix-D.tif`` (:numref:`out_corr_files`). A disparity map is an image whose pixel locations correspond to the pixel :math:`(u,v)` in the left image, and whose pixel values contain the horizontal and vertical offsets :math:`(d_u, d_v)` to the matching pixel in the right image, which is :math:`(u+d_u, v+d_v)`. The correlation process attempts to find a match for every pixel in the left image. The only pixels skipped are those marked invalid in the mask images. For large images (e.g. from HiRISE, , LROC, or WorldView), this is very expensive computationally, so the correlation process is split into two stages. The disparity map initialization step computes approximate correspondences using a pyramid-based search that is highly optimized for speed, but trades resolution for speed. The results of disparity map initialization are integer-valued disparity estimates. The sub-pixel refinement step takes these integer estimates as initial conditions for an iterative optimization and refines them using the algorithm discussed in the next section. We employ several optimizations to accelerate disparity map initialization: (1) a box filter-like accumulator that reduces duplicate operations during correlation :cite:`Sun02rectangular`; (2) a coarse-to-fine pyramid based approach where disparities are estimated using low-resolution images, and then successively refined at higher resolutions; and (3) partitioning of the disparity search space into rectangular sub-regions with similar values of disparity determined in the previous lower resolution level of the pyramid :cite:`Sun02rectangular`. .. figure:: images/correlation/correlation_400px.png :name: correlation_window :alt: Correlation example The correlation algorithm in disparity map initialization uses a sliding template window from the left image to find the best match in the right image. The size of the template window can be adjusted using the ``H_KERN`` and ``V_KERN`` parameters in the ``stereo.default`` file, and the search range can be adjusted using the ``{H,V}_CORR_{MIN/MAX}`` parameters. Naive correlation itself is carried out by moving a small, rectangular template window from the from left image over the specified search region of the right image, as in :numref:`correlation_window`. The "best" match is determined by applying a cost function that compares the two windows. The location at which the window evaluates to the lowest cost compared to all the other search locations is reported as the disparity value. The ``cost-mode`` variable allows you to choose one of three cost functions, though we recommend normalized cross correlation :cite:`Menard97:robust`, since it is most robust to slight lighting and contrast variations between a pair of images. Try the others if you need more speed at the cost of quality. .. _d_sub: Low-resolution disparity ------------------------ Producing the disparity map at full resolution as in :numref:`stereo_corr` is computationally expensive. To speed up the process, ASP starts by first creating a low-resolution initial guess version of the disparity map. This is saved in the file ``output_prefix-D_sub.tif`` (:numref:`out_corr_files`). Four methods are available for producing this low-resolution disparity, described below. .. _d_sub_corr: Disparity from stereo correlation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The default approach is to use for the low-resolution disparity the same algorithm as for the full-resolution one, but called with the low-resolution images ``output_prefix-L_sub.tif`` and ``output_prefix-R_sub.tif``. Those "sub" images have their size chosen so that their area is around 2.25 megapixels, a size that is easily viewed on the screen unlike the raw source images. This corresponds to the ``parallel_stereo`` option ``--corr-seed-mode 1`` (:numref:`stereodefault`). .. _d_sub_dem: Disparity from a DEM ~~~~~~~~~~~~~~~~~~~~ The low resolution disparity can be computed from a lower-resolution initial guess DEM of the area. This works with all alignment methods except ``epipolar`` (:numref:`image_alignment`). Mapprojected images are supported (:numref:`mapproj-example`). This option assumes rather good alignment between the cameras and the DEM. Otherwise see :numref:`ba_pc_align`. The option ``--disparity-estimation-dem-error`` should be used to specify the uncertainty in such a DEM. This can be useful when there are a lot of clouds, or terrain features are not seen well at low resolution. As an example, invoke ``parallel_stereo`` with options along the lines of:: --corr-seed-mode 2 \ --disparity-estimation-dem ref.tif \ --disparity-estimation-dem-error 5 When features are washed out at low resolution, consider also adding the option ``--corr-max-levels 2``, or see :numref:`sparse_disp`. See :numref:`stereodefault` for more information on these options. It is suggested to extract the produced low-resolution disparity bands with ``gdal_translate`` (:numref:`mask_disparity`) or ``disparitydebug`` (:numref:`disparitydebug`). Inspect them in ``stereo_gui`` (:numref:`stereo_gui`). .. _sparse_disp: Sparse disparity from full-resolution images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For snowy landscapes, whose only features may be small-scale grooves or ridges sculpted by wind (so-called *zastrugi*), the low-resolution images appear blank, so the default low-resolution disparity approach in :numref:`d_sub_corr` fails. One can then use a disparity from a DEM (:numref:`d_sub_dem`), skip the low-resolution disparity (:numref:`d_sub_skip`), or the approach outlined in this section, based on the tool named ``sparse_disp``. This program create the low-resolution initial disparity ``output_prefix-D_sub.tif`` from the full-resolution images, yet only at a sparse set of pixels for reasons, of speed. This low-resolution disparity is then refined as earlier using a pyramid approach, but with fewer levels, to prevent the features being washed out. .. figure:: images/examples/sparse_disp.png :name: fig:sparse-disp-example :figwidth: 100% Example of a difficult terrain obtained without (left) and with (right) ``sparse_disp``. (In these DEMs there is very little elevation change, hence the flat appearance.) Here is an example: :: parallel_stereo -t dg --corr-seed-mode 3 \ --corr-max-levels 2 \ left_mapped.tif right_mapped.tif \ 12FEB12053305-P1BS_R2C1-052783824050_01_P001.XML \ 12FEB12053341-P1BS_R2C1-052783824050_01_P001.XML \ dg/dg srtm_53_07.tif This tool can be customized with the ``parallel_stereo`` switch ``--sparse-disp-options``. Installation of sparse_disp ^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``sparse_disp`` tool is written in Python, and makes use of the ``gdal``, ``numpy``, and ``scipy`` packages. To use it, these packages must be installed with ``conda``. It is very important to use the same version of ``python``, ``numpy``, and ``gdal`` as in ASP. Hence, make adjustments below and then run:: conda create -n sparse_disp c conda-forge \ python=3.12.2 numpy=1.26.4 gdal=3.8.1 scipy ASP can be told where to look for these packages with a line such as:: export ASP_PYTHON_MODULES_PATH=$HOME/miniconda3/envs/sparse_disp/lib/python3.1/site-packages Here, also need to adjust appropriately the ``conda`` installation location and ``python`` version. If ASP is installed with ``conda`` (:numref:`conda_intro`), and ISIS version is at least 9.0.0, it will already have all the needed dependencies. Hence, can adjust ``ASP_PYTHON_MODULES_PATH`` to point to the ``site-packages`` directory of the ASP conda environment. .. _d_sub_skip: Skip the low-resolution disparity ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Any large failure in the low-resolution disparity image will be detrimental to the performance of the higher resolution disparity. In the event that the low-resolution disparity is completely unhelpful, it can be skipped by adding ``corr-seed-mode 0`` in the ``stereo.default`` file and using a manual search range (:numref:`search_range`). This should only be considered in cases where the texture in an image is completely lost when subsampled. An example would be satellite images of fresh snow in the Arctic. Alternatively, ``output_prefix-D_sub.tif`` can be computed at a sparse set of pixels at full resolution, as described in :numref:`sparse_disp`. More on the correlation process ------------------------------- Debugging disparity map initialization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Never will all pixels be successfully matched during stereo matching. Though a good chunk of the image should be correctly processed. If you see large areas where matching failed, this could be due to a variety of reasons: - In regions where the images do not overlap, there should be no valid matches in the disparity map. - Match quality may be poor in regions of the images that have different lighting conditions, contrast, or specular properties of the surface. - Areas that have image content with very little texture or extremely low contrast may have an insufficient signal to noise ratio, and will be rejected by the correlator. - Areas that are highly distorted due to different image perspective, such as crater and canyon walls, may exhibit poor matching performance. This could also be due to failure of the preprocessing step in aligning the images. The correlator can not match images that are rotated differently from each other or have different scale/resolution. Mapprojection is used to at least partially rectify these issues (:numref:`mapproj-example`). Bad matches, often called "blunders" or "artifacts" are also common, and can happen for many of the same reasons listed above. The Stereo Pipeline does its best to automatically detect and eliminate these blunders, but the effectiveness of these outlier rejection strategies does vary depending on the quality of the input images. When tuning up your ``stereo.default`` file, you will find that it is very helpful to look at the raw output of the disparity map initialization step. This can be done using the ``disparitydebug`` tool, which converts the ``output_prefix-D.tif`` file into a pair of normal images that contain the horizontal and vertical components of disparity. You can open these in a standard image viewing application and see immediately which pixels were matched successfully, and which were not. Stereo matching blunders are usually also obvious when inspecting these images. With a good intuition for the effects of various ``stereo.default`` parameters and a good intuition for reading the output of ``disparitydebug``, it is possible to quickly identify and address most problems. If you are seeing too many holes in your disparity images, one option that may give good results is to increase the size of the correlation kernel used by ``stereo_corr`` with the ``--corr-kernel`` option. Increasing the kernel size will increase the processing time but should help fill in regions of the image where no match was found. .. figure:: images/correlation/stereo_corr_box_compare.png :name: corr-kernel-size-effect :alt: Correlation Kernel Size The effect of increasing the correlation kernel size from 35 (left) to 75 (right). This location is covered in snow and several regions lack texture for the correlator to use but a large kernel increases the chances of finding useful texture for a given pixel. .. figure:: images/correlation/quantile_filter_result.png :name: quantile-filtering-effect :alt: Quantile Filtering The effect of using the ``rm-quantile`` filtering option in ``stereo_corr``. In the left image there are a series of high disparity "islands" at the bottom of the image. In the right image quantile filtering has removed those islands while leaving the rest of the image intact. .. _search_range: Search range determination ~~~~~~~~~~~~~~~~~~~~~~~~~~ In some circumstances, the low-resolution disparity ``D_sub.tif`` computation may fail, or it may be inaccurate. This can happen for example if only very small features are present in the original images, and they disappear during the resampling that is necessary to obtain ``D_sub.tif``. In this case, it is possible to set ``corr-seed-mode`` from the default of 1 to the values of 2 or 3, that will use a DEM or sample the full-resolution images to produce a low-resolution disparity (:numref:`d_sub`). Or, set ``corr-seed-mode`` to 0, and manually specify a search range to use for full-resolution correlation via the parameter ``corr-search``. In ``stereo.default`` (:numref:`stereodefault`) this parameter's entry will look like:: corr-search -80 -2 20 2 The search range can also be set on the command line (:numref:`cmdline`). The exact values to use with this option you'll have to discover yourself. These four numbers represent the horizontal minimum boundary, vertical minimum boundary, horizontal maximum boundary, and finally the horizontal maximum boundary within which we will search for the disparity during correlation. It can be tricky to select a good search range. That's why the best way is to let ``parallel_stereo`` perform an automated determination. If you think that you can do a better estimate of the search range, take look at what search ranges ``stereo_corr`` prints in the log files in the output directory, and examine the intermediate disparity images using the ``disparitydebug`` program, to figure out which search directions can be expanded or contracted. The output images will clearly show good data or bad data depending on whether the search range is correct. The worst case scenario is to determine the search range manually. The aligned ``L.tif`` and ``R.tif`` images (:numref:`outputfiles`) can be opened in ``stereo_gui`` (:numref:`stereo_gui`), and the coordinates of points that can be matched visually can be compared. Click on a pixel to have its coordinates printed in the terminal. Subtract row and column locations of a feature in the first image from the locations of the same feature in the second image, and this will yield offsets that can be used in the search range. Make several of these offset measurements (for example, for features at higher and then lower elevations), and use them to define a row and column bounding box, then expand this by 50% and use it for ``corr-search``. This will produce good results in most cases. If the search range produced automatically from the low-resolution disparity is too big, perhaps due to outliers, it can be tightened with either ``--max-disp-spread`` or ``--corr-search-limit``, before continuing with full-resolution correlation (:numref:`stereodefault`). But note that for very steep terrains and no use of mapprojection a large search range is expected, and tightening it too much may result in an inaccurate disparity. .. _subpixel: Sub-pixel refinement -------------------- Once disparity map initialization is complete, every pixel in the disparity map will either have an estimated disparity value, or it will be marked as invalid. All valid pixels are then adjusted in the sub-pixel refinement stage based on the ``subpixel-mode`` setting. The first mode is parabola-fitting sub-pixel refinement (``subpixel-mode 1``). This technique fits a 2D parabola to points on the correlation cost surface in an 8-connected neighborhood around the cost value that was the "best" as measured during disparity map initialization. The parabola's minimum can then be computed analytically and taken as as the new sub-pixel disparity value. This method is easy to implement and extremely fast to compute, but it exhibits a problem known as pixel-locking: the sub-pixel disparities tend toward their integer estimates and can create noticeable "stair steps" on surfaces that should be smooth :cite:`Stein06:attenuating,Szeliski03sampling`. See for example :numref:`parabola_subpixel`. Furthermore, the parabola subpixel mode is not capable of refining a disparity estimate by more than one pixel, so although it produces smooth disparity maps, these results are not much more accurate than the results that come out of the disparity map initialization in the first place. However, the speed of this method makes it very useful as a "draft" mode for quickly generating a DEM for visualization (i.e. non-scientific) purposes. It is also beneficial in the event that a user will simply downsample their DEM after generation in Stereo Pipeline. .. figure:: images/correlation/parabola_results.png :name: parabola_subpixel Left: Input images. Center: results using the parabola draft subpixel mode (subpixel-mode = 1). Right: results using the Bayes EM high quality subpixel mode (subpixel-mode = 2). For high quality results, we recommend ``subpixel-mode 2``: the Bayes EM weighted affine adaptive window correlator. This advanced method produces extremely high quality stereo matches that exhibit a high degree of immunity to image noise. For example Apollo Metric Camera images are affected by two types of noise inherent to the scanning process: (1) the presence of film grain and (2) dust and lint particles present on the film or scanner. The former gives rise to noise in the DEM values that wash out real features, and the latter causes incorrect matches or hard to detect blemishes in the DEM. Attenuating the effect of these scanning artifacts while simultaneously refining the integer disparity map to sub-pixel accuracy has become a critical goal of our system, and is necessary for processing real-world data sets such as the Apollo Metric Camera data. The Bayes EM subpixel correlator also features a deformable template window from the left image that can be rotated, scaled, and translated as it zeros in on the correct match in the right image. This adaptive window is essential for computing accurate matches on crater or canyon walls, and on other areas with significant perspective distortion due to foreshortening. This affine-adaptive behavior is based on the Lucas-Kanade template tracking algorithm, a classic algorithm in the field of computer vision :cite:`Baker04:lucas-kanade`. We have extended this technique; developing a Bayesian model that treats the Lucas-Kanade parameters as random variables in an Expectation Maximization (EM) framework. This statistical model also includes a Gaussian mixture component to model image noise that is the basis for the robustness of our algorithm. We will not go into depth on our approach here, but we encourage interested readers to read our papers on the topic :cite:`nefian:bayes_em,broxton:isvc09`. However we do note that, like the computations in the disparity map initialization stage, we adopt a multi-scale approach for sub-pixel refinement. At each level of the pyramid, the algorithm is initialized with the disparity determined in the previous lower resolution level of the pyramid, thereby allowing the subpixel algorithm to shift the results of the disparity initialization stage by many pixels if a better match can be found using the affine, noise-adapted window. Hence, this sub-pixel algorithm is able to significantly improve upon the results to yield a high quality, high resolution result. Another option when run time is important is ``subpixel-mode 3``: the simple affine correlator. This is essentially the Bayes EM mode with the noise correction features removed in order to decrease the required run time. In data sets with little noise this mode can yield results similar to Bayes EM mode in approximately one fifth the time. A different option is Phase Correlation, ``subpixel-mode 4``, which implements the algorithm from :cite:`guizar2008efficient`. It is slow and does not work well on slopes but since the algorithm is very different it might perform in situations where the other algorithms are not working well. Triangulation ------------- When running an ISIS session, the Stereo Pipeline uses geometric camera models available in ISIS :cite:`anderson08:isis`. These highly accurate models are customized for each instrument that ISIS supports. Each ISIS "cube" file contains all of the information that is required by the Stereo Pipeline to find and use the appropriate camera model for that observation. Other sessions such as DG (*DigitalGlobe*) or Pinhole, require that their camera model be provided as additional arguments to the ``parallel_stereo`` command. Those camera models come in the form of an XML document for DG and as ``*.pinhole, *.tsai, *.cahv, *.cahvor`` for Pinhole sessions. Those files must be the third and forth arguments or immediately follow after the two input images for ``parallel_stereo``. .. figure:: images/correlation/camera_models.png :name: camera_models :alt: Camera Models Most remote sensing cameras fall into two generic categories based on their basic geometry. Framing cameras (left) capture an instantaneous two-dimensional image. Linescan cameras (right) capture images one scan line at a time, building up an image over the course of several seconds as the satellite moves through the sky. ISIS camera models account for all aspects of camera geometry, including both intrinsic (i.e. focal length, pixel size, and lens distortion) and extrinsic (e.g. camera position and orientation) camera parameters. Taken together, these parameters are sufficient to "forward project" a 3D point in the world onto the image plane of the sensor. It is also possible to "back project" from the camera's center of projection through a pixel corresponding to the original 3D point. .. figure:: images/correlation/triangulation_400px.png :name: triangulation :alt: Triangulation Once a disparity map has been generated and refined, it can be used in combination with the geometric camera models to compute the locations of 3D points on the surface of Mars. This figure shows the position (at the origins of the red, green, and blue vectors) and orientation of the Mars Global Surveyor at two points in time where it captured images in a stereo pair. Notice, however, that forward and back projection are not symmetric operations. One camera is sufficient to "image" a 3D point onto a pixel located on the image plane, but the reverse is not true. Given only a single camera and a pixel location :math:`x = (u,v),` that is the image of an unknown 3D point :math:`P = (x,y,z)`, it is only possible to determine that :math:`P` lies somewhere along a ray that emanates from the camera center through the pixel location :math:`x` on the image plane (see :numref:`camera_models`). Alas, once images are captured, the route from image pixel back to 3D points in the real world is through back projection, so we must bring more information to bear on the problem of uniquely reconstructing our 3D point. In order to determine :math:`P` using back projection, we need *two* cameras that both contain pixel locations :math:`x_1` and :math:`x_2` where :math:`P` was imaged. Now, we have two rays that converge on a point in 3D space (see :numref:`triangulation`). The location where they meet must be the original location of :math:`P`. .. _triangulation_error: Triangulation error ~~~~~~~~~~~~~~~~~~~ In practice, the rays emanating from matching pixels in the cameras rarely intersect perfectly on the ground because any slight error in the position or pointing information of the cameras will affect the accuracy of the rays. The matching (correlation) among the images is also not perfect, contributing to the error budget. Then, we take the *closest point of intersection* of the two rays as the location of the intersection point :math:`P`. Additionally, the actual shortest distance between the rays at this point is an interesting and important error metric that measures how self-consistent our two camera models are for this point. It will be seen in the next chapter that this information, when computed and averaged over all reconstructed 3D points, can be a valuable statistic for determining whether to carry out bundle adjustment (:numref:`bundle_adjust`). The distance between the two rays emanating from matching points in the cameras at their closest intersection is recorded in the fourth channel of the point cloud file, ``output-prefix-PC.tif``. This is called the *triangulation error*, or the *ray intersection error*. It is measured in meters. This error can be gridded when a DEM is created from the point cloud by using the ``--errorimage`` argument on the ``point2dem`` command (:numref:`point2dem`). This error *is not* the true accuracy of the DEM. It is only another indirect measure of quality. A DEM with high triangulation error, as compared to the ground sample distance, is always bad and should have its images bundle-adjusted. A DEM with low triangulation error is at least self-consistent, but could still be bad, or at least misaligned. If, after bundle adjustment, the triangulation error is still high at the image corners and the inputs are Pinhole cameras, one may have to refine the intrinsics, including the distortion model. :numref:`bundle_adjustment` discusses bundle adjustment, including optimizing the intrinsics. To improve the location of a triangulated point cloud or created DEM relative to a known ground truth, use alignment (:numref:`pc_align`). See :numref:`error_propagation` for another metric qualifying the accuracy of a point cloud or DEM, namely the horizontal and vertical uncertainty, as propagated from the input cameras. .. _mapproj_with_cam2map: Stereo with images mapprojected using ISIS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is a continuation of the discussion at :numref:`moc_tutorial`. It describes how to mapproject the input images using the ISIS tool ``cam2map`` and how to run stereo with the obtained images. Alternatively, the images can be mapprojected using ASP itself, per :numref:`mapproj-example`. Mapprojection can result in improved results for steep slopes, when the images are taken from very different perspectives, or if the curvature of the planet/body being imaged is non-negligible. We will now describe how this works, but we also provide the ``cam2map4stereo.py`` program (:numref:`cam2map4stereo.py`) which does this automatically. The ISIS ``cam2map`` program will map-project these images:: ISIS> cam2map from=M0100115.cub to=M0100115.map.cub ISIS> cam2map from=E0201461.cub to=E0201461.map.cub \ map=M0100115.map.cub matchmap=true At this stage we can run the stereo program with map-projected images: :: ISIS> parallel_stereo E0201461.map.cub M0100115.map.cub \ --alignment-method none -s stereo.default.example \ results/output Here we have used ``alignment-method none`` since ``cam2map4stereo.py`` brought the two images into the same perspective and using the same resolution. If you invoke ``cam2map`` independently on the two images, without ``matchmap=true``, their resolutions may differ, and using an alignment method rather than ``none`` to correct for that is still necessary. Now you may skip to chapter :numref:`nextsteps` which will discuss the ``parallel_stereo`` program in more detail and the other tools in ASP. Or, you can continue reading below for more details on mapprojection. Advanced discussion of mapprojection ------------------------------------ Notice the order in which the images were run through ``cam2map``. The first projection with ``M0100115.cub`` produced a map-projected image centered on the center of that image. The projection of ``E0201461.cub`` used the ``map=`` parameter to indicate that ``cam2map`` should use the same map projection parameters as those of ``M0100115.map.cub`` (including center of projection, map extents, map scale, etc.) in creating the projected image. By map-projecting the image with the worse resolution first, and then matching to that, we ensure two things: (1) that the second image is summed or scaled down instead of being magnified up, and (2) that we are minimizing the file sizes to make processing in the Stereo Pipeline more efficient. Technically, the same end result could be achieved by using the ``mocproc`` program alone, and using its ``map= M0100115.map.cub`` option for the run of ``mocproc`` on ``E0201461.cub`` (it behaves identically to ``cam2map``). However, this would not allow for determining which of the two images had the worse resolution and extracting their minimum intersecting bounding box (see below). Furthermore, if you choose to conduct bundle adjustment (see :numref:`bundle_adjustment`) as a pre-processing step, you would do so between ``mocproc`` (as run above) and ``cam2map``. The above procedure is in the case of two images which cover similar real estate on the ground. If you have a pair of images where one image has a footprint on the ground that is much larger than the other, only the area that is common to both (the intersection of their areas) should be kept to perform correlation (since non-overlapping regions don't contribute to the stereo solution). ASP normally has no problem identifying the shared area and it still run well. Below we describe, for the adventurous user, some fine-tuning of this procedure. If the image with the larger footprint size also happens to be the image with the better resolution (i.e. the image run through ``cam2map`` second with the ``map=`` parameter), then the above ``cam2map`` procedure with ``matchmap=true`` will take care of it just fine. Otherwise you'll need to figure out the latitude and longitude boundaries of the intersection boundary (with the ISIS ``camrange`` program). Then use that smaller boundary as the arguments to the ``MINLAT``, ``MAXLAT``, ``MINLON``, and ``MAXLON`` parameters of the first run of ``cam2map``. So in the above example, after ``mocproc`` with ``Mapping= NO`` you'd do this: :: ISIS> camrange from=M0100115.cub ... lots of camrange output omitted ... Group = UniversalGroundRange LatitudeType = Planetocentric LongitudeDirection = PositiveEast LongitudeDomain = 360 MinimumLatitude = 34.079818835324 MaximumLatitude = 34.436797628116 MinimumLongitude = 141.50666207418 MaximumLongitude = 141.62534719278 End_Group ... more output of camrange omitted ... :: ISIS> camrange from=E0201461.cub ... lots of camrange output omitted ... Group = UniversalGroundRange LatitudeType = Planetocentric LongitudeDirection = PositiveEast LongitudeDomain = 360 MinimumLatitude = 34.103893080982 MaximumLatitude = 34.547719435156 MinimumLongitude = 141.48853937384 MaximumLongitude = 141.62919740048 End_Group ... more output of camrange omitted ... Now compare the boundaries of the two above and determine the intersection to use as the boundaries for ``cam2map``: :: ISIS> cam2map from=M0100115.cub to=M0100115.map.cub \ DEFAULTRANGE=CAMERA MINLAT=34.10 MAXLAT=34.44 \ MINLON=141.50 MAXLON=141.63 ISIS> cam2map from=E0201461.cub to=E0201461.map.cub \ map=M0100115.map.cub matchmap=true You only have to do the boundaries explicitly for the first run of ``cam2map``, because the second one uses the ``map=`` parameter to mimic the map-projection of the first. These two images are not radically different in spatial coverage, so this is not really necessary for these images, it is just an example. Again, unless you are doing something complicated, using the ``cam2map4stereo.py`` (:numref:`cam2map4stereo.py`) will take care of all these steps for you. .. _local_alignment_issues: Identifying issues in local alignment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Stereo with local epipolar alignment (:numref:`running-stereo`) can perform better than with global affine epipolar alignment. Yet, when stereo fails on a locally aligned tile pair, it is instructive to understand why. Usually it is because the images are difficult at that location, such as due to very steep terrain, clouds, shadows, etc. For a completed ``parallel_stereo`` run which failed in a portion, the first step is to identify the offending tile directory. For that, open the produced DEM in ``stereo_gui``, and use the instructions at :numref:`image_bounds` to find the approximate longitude, latitude, and height at the problematic location. Then run ``stereo_parse`` with the same options as ``parallel_stereo`` and the flag:: --tile-at-location ' ' This should print on the screen a text like:: Tile with location: run/run-2048_3072_1024_1024 If a run failed to complete, find the most recent output tile directories that were being worked on, based on modification time, and investigate one of them. In either case, given a candidate for a problematic tile, from the log file of ``stereo_corr`` in that tile's directory you can infer the full correlation command that failed. Re-run it, while appending the option:: --local-alignment-debug Images and interest point matches before and after alignment will be saved. Those can be examined as:: stereo_gui -left-crop.tif -right-crop.tif \ -left-crop__right-crop.match and:: stereo_gui -left-aligned-tile.tif \ -right-aligned-tile.tif \ -left-aligned-tile__right-aligned-tile.match ================================================ FILE: docs/environment.yml ================================================ # conda environment needed to build the docs. channels: - conda-forge - defaults dependencies: - sphinx - sphinxcontrib-bibtex ================================================ FILE: docs/error_propagation.rst ================================================ .. _error_propagation: Error propagation ================= At the triangulation stage, ``parallel_stereo`` can propagate the errors (uncertainties, standard deviations, covariances) from the input cameras, computing the horizontal and vertical standard deviation (stddev) of the uncertainty for each triangulated point. This is enabled with the option ``--propagate-errors`` (:numref:`stereo-default-error-propagation`). Bundle adjustment can propagate uncertainties as well (:numref:`ba_error_propagation`). The produced uncertainties can be exported from the point cloud to DEM and/or LAS files (:numref:`export_stddev`). The input uncertainties ----------------------- The input uncertainties can be either numbers that are passed on the command line, or, otherwise, for a few camera models, they can be read from the camera files. If the option ``--horizontal-stddev`` is set, with two positive numbers as values, representing the left and right camera stddev of position uncertainty in the local horizontal ground plane having the triangulated point, then these values will be used. The input stddev values are measured in meters. This functionality works with any cameras supported by ASP. If this option is not set, the following strategies are used: - For Pleiades 1A/1B linescan camera models (:numref:`pleiades`) (but not for NEO, :numref:`pleiades_neo`) the ``ACCURACY_STDV`` field is read from the "DIM" XML file for each camera (in the *Absolute Horizontal Accuracy* section of the camera model), and it is used as the horizontal stddev. - For RPC cameras (:numref:`rpc`), the values ``ERRBIAS`` and ``ERRRAND`` are read, whether set in XML files or as part of metadata that GDAL understands. The square root of sum of squares of these quantities is the input horizontal stddev for a camera. - For Maxar (DigitalGlobe) linescan cameras (:numref:`dg_tutorial`), the inputs are the satellite position and orientation covariances, read from the ``EPHEMLIST`` and ``ATTLIST`` fields. These are propagated from the satellites to the ground and then through triangulation. For datasets with a known CE90 measure, or in general a :math:`CE_X` measure, where :math:`X` is between 0% and 100%, use the ``--horizontal-stddev`` option, with values computed using the formula: .. math:: StdDev = CE_X/\sqrt{-2 \ln(1-X/100.0)} (`reference `_). In all cases, the error propagation takes into account whether the cameras are bundle-adjusted or not (:numref:`bundle_adjust`), and if the images are mapprojected (:numref:`mapproj-example`). Produced uncertainty for triangulated points -------------------------------------------- The triangulation covariance matrix is computed in the local North-East-Down (NED) coordinates at each nominal triangulated point, and further decomposed into the horizontal and vertical components (:numref:`produced_covariances`). The square root is taken, creating the horizontal and vertical standard deviations, that are saved as the 5th and 6th band in the point cloud (\*-PC.tif file, :numref:`outputfiles`). Running ``gdalinfo`` (:numref:`gdal_tools`) on the point cloud will show some metadata describing each band in that file. The computed stddev values are in units of meter. Bundle adjustment ----------------- Error propagation is also implemented in ``bundle_adjust`` (:numref:`ba_error_propagation`). In that case, the errors are computed at each interest point, rather than densely. The same underlying logic is employed as for stereo. .. _export_stddev: Export to DEM and LAS --------------------- The stddev values in the point cloud can then be gridded with ``point2dem`` (:numref:`point2dem`) with the option ``--propagate-errors``, using the same algorithm as for computing the DEM heights. Example:: point2dem \ --t_srs \ --tr \ --propagate-errors \ run/run-PC.tif This will produce the files ``run/run-HorizontalStdDev.tif`` and ``run/run-VerticalStdDev.tif`` alongside the output DEM, ``run/run-DEM.tif``. In all these files the values are in units of meter. The ``point2las`` program (:numref:`point2las`) can export the horizontal and vertical stddev values from the point cloud to a LAS file. Implementation details ---------------------- Note that propagating the errors subtly changes the behavior of stereo triangulation, and hence also the output DEM. Triangulated points are saved with a float precision of 1e-8 meters (rather than the usual 1e-3 meters or so, :numref:`triangulation_options`), to avoid creating step artifacts later when gridding the rather slowly varying propagated errors. When error propagation is enabled, the triangulated point cloud stores 6 bands instead of the usual 4 (:numref:`outputfiles`), and the LZW compression is somewhat less efficient since more digits of precision are stored. The size of the point cloud roughly doubles. This does not affect the size of the DEM, but its values and extent may change slightly. .. _uncertainty_vs_triangulation_err: What the produced uncertainties are not --------------------------------------- The horizontal and vertical stddev values created by stereo triangulation and later gridded by ``point2dem`` measure the uncertainty of each nominal triangulated point, given the uncertainties in the input cameras. This is not the discrepancy between this point's location as compared to to a known ground truth. If the input cameras are translated by the same amount in the ECEF coordinate system, the triangulated point position can change a lot, but the produced uncertainties will change very little. To estimate and correct a point cloud's geolocation invoke an alignment algorithm (:numref:`pc_align`). The produced uncertainties are not a measure of the pointing accuracy (:numref:`triangulation_error`). Whether the rays from the cameras meet at the nominal triangulated point perfectly, or their closest distance is, for example, 5 meters, the produced uncertainties around the nominal point will be about the same. See a comparison between these errors in :numref:`grand_mesa_dem_intersection_err` and :numref:`horizontal_vertical_error`. The pointing accuracy can be improved by using bundle adjustment (:numref:`bundle_adjust`) and solving for jitter (:numref:`jitter_solve`). Example ------- For Maxar (DigitalGlobe) linescan cameras:: parallel_stereo \ --alignment-method local_epipolar \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ -t dg \ --propagate-errors \ left.tif right.tif left.xml right.xml run/run proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" point2dem --tr 1.6 \ --t_srs "$proj" \ --propagate-errors \ run/run-PC.tif The projection and grid size above are dependent on the dataset. For steep slopes, consider using mapprojection (:numref:`mapproj-example`). Alternatively, the input horizontal stddev values for the cameras can be set as:: --horizontal-stddev 1.05 1.11 Then these will be used instead. This last approach works for any orbital camera model supported by ASP (:numref:`examples`). .. figure:: images/grand_mesa_dem_intersection_err.png :name: grand_mesa_dem_intersection_err A hillshaded DEM created with DigitalGlobe WorldView images for Grand Mesa, Colorado (left), and the triangulation error (:numref:`triangulation_error`) in meters (right). The input images were mapprojected (:numref:`mapproj-example`). No bundle adjustment was used. Jitter (:numref:`jitter_solve`) is noticeable. .. figure:: images/horizontal_vertical_error.png :name: horizontal_vertical_error Produced horizontal and vertical stddev values (left and right) for the same dataset. It can be seen from the scales (units are in meter) and comparing with :numref:`grand_mesa_dem_intersection_err` that these errors vary little overall, and depend more on the geometry of the stereo pair than the underlying terrain. See :numref:`uncertainty_vs_triangulation_err` for a discussion. .. _produced_covariances: Definitions ----------- The vertical variance of a triangulated point is defined as the lower-right corner of the 3x3 NED covariance matrix (since x=North, y=East, z=Down). To find the horizontal variance component, consider the upper-left :math:`2 \times 2` block of that matrix. Geometrically, the horizontal covariances represent an ellipse. The radius of the circle with the same area is found, which is the square root of the product of ellipse semiaxes, which is the product of the eigenvalues of this symmetric matrix, or its determinant. So, the horizontal component of the covariance is defined as the square root of the upper-left :math:`2 \times 2` bock of the NED covariance matrix. The square root is taken to go from variance to stddev. Theory ------ According to the theory of `propagation of uncertainty `_, given a function :math:`y = f(x)` between multi-dimensional spaces, the covariances of the inputs and outputs are related via .. math:: Cov_Y = J Cov_X J^T Here, :math:`J` is the Jacobian of the function :math:`f` and :math:`J^T` is its transpose. It is assumed that the uncertainties are small enough that this function can be linearized around the nominal location. For this particular application, the input variables are either the coordinates in the local horizontal ground plane having the triangulated point (two real values for each camera), or the satellite positions and orientations (quaternions), which are 7 real values for each camera. The output is the triangulated point in the local North-East-Down coordinates. If the input uncertainties are stddev values, then these are squared, creating variances, before being propagated (then converted back to stddev values at the last step). The Jacobian was computed using centered finite differences, with a step size of 0.01 meters for the position and 1e-6 for the (normalized) quaternions. The computation was not particularly sensitive to these step sizes. A much smaller position step size is not recommended, since the positions are on the order of 7e6 meters, (being measured from planet center) and because double precision computations have only 16 digits of precision. Validation for Maxar (DigitalGlobe) linescan cameras ---------------------------------------------------- The horizontal stddev values propagated through triangulation for Maxar (DigitalGlobe) linescan cameras are usually on the order of 3 meters. The obtained vertical stddev varies very strongly with the convergence angle, and is usually, 5-10 meters, and perhaps more for stereo pairs with a convergence angle under 30 degrees. The dependence on the convergence angle is very expected. But these numbers appear too large given the ground sample distance of DigitalGlobe WorldView cameras. We are very confident that they are correct. The results are so large is because of the input orientation covariances (the relative contribution of input position and orientation covariances can be determined with the options ``--position-covariance-factor`` and ``--orientation-covariance-factor``). The curious user can try the following independent approach to validate these numbers. The linescan camera files in XML format have the orientations on lines with the ``ATTLIST`` field. The numbers on that line are measurement index, then the quaternions (4 values, in order x, y, z, w) and the upper-right half of the 4x4 covariance matrix (10 numbers, stored row-wise). The ``w`` variance (the last number), can be, for example, on the order of 6.3e-12. Its square root, the standard deviation, which is 2.5e-6 or so, is the expected variability in the ``w`` component of the quaternion. Fetch and save the Python script `bias_dg_cam.py `_. Invoke it as:: python bias_dg_cam.py --position-bias "0 0 0" \ --orientation-bias "0 0 0 2.5e-6" \ -i left.xml -o left_bias.xml python bias_dg_cam.py --position-bias "0 0 0" \ --orientation-bias "0 0 0 -2.5e-6" \ -i right.xml -o right_bias.xml This will bias the positions and quaternions in the camera files by the given amounts, creating ``left_bias.xml`` and ``right_bias.xml``. Note that values with different sign were used in the two camera files. It is instructive to compare the original and produced camera files side-by-side, and see the effect of using a different sign and magnitude for the biases. Then, ``parallel_stereo`` can be run twice, with different output prefixes, first with the original cameras, and then the biased ones, in both cases without propagation of errors. Use ``--left-image-crop-win`` and ``--right-image-crop-win`` (:numref:`stereo_gui`) to run on small clips only. The created DEMs (with nominal and then with biased cameras) can have their heights compared using the ``geodiff --absolute`` command (:numref:`geodiff`). We found a height difference that is very similar to the vertical standard deviation produced earlier. ================================================ FILE: docs/examples/apollo15.rst ================================================ .. _apollo15_example: Apollo 15 Metric Camera images ------------------------------ Apollo Metric images were all taken at regular intervals, which means that the same ``stereo.default`` can be used for all sequential pairs of images. Apollo Metric images are ideal for stereo processing. They produce consistent, excellent results. The scans performed by ASU are sufficiently detailed to exhibit film grain at the highest resolution. The amount of noise at the full resolution is not helpful for the correlator, so we recommend subsampling the images by a factor of 4. Currently the tools to ingest Apollo TIFFs into ISIS are not available, but these images should soon be released into the PDS for general public usage. Ansgarius C ~~~~~~~~~~~ Ansgarius C is a small crater on the west edge of the far side of the Moon near the equator. It is east of Kapteyn A and B. .. figure:: ../images/examples/metric/metric_ge_example_combined.png :name: metric_example Example output possible with Apollo Metric frames AS15-M-2380 and AS15-M-2381. Commands ^^^^^^^^ Process Apollo TIFF files into ISIS. :: ISIS> reduce from=AS15-M-2380.cub to=sub4-AS15-M-2380.cub \ sscale=4 lscale=4 ISIS> reduce from=AS15-M-2381.cub to=sub4-AS15-M-2381.cub \ sscale=4 lscale=4 ISIS> spiceinit from=sub4-AS15-M-2380.cub ISIS> spiceinit from=sub4-AS15-M-2381.cub ISIS> parallel_stereo sub4-AS15-M-2380.cub sub4-AS15-M-2381.cub \ result/output See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. ================================================ FILE: docs/examples/aster.rst ================================================ .. _aster: ASTER ----- `Advanced Spaceborne Thermal Emission and Reflection Radiometer `_ (ASTER) is a Japanese instrument. ASP can process ASTER Level 1A VNIR images. These are acquired with a stereo rig consisting of two cameras, pointing nadir and back. The orbit is sun-synchronous, at an elevation of 705 km. The ground sample distance is 15 meters/pixel. See a `ready-made ASTER example `_. It has the input images and cameras, ASP outputs, and instructions for how to run it. Also see a `workbook with illustrations `_. ASP can correct for the jitter in these cameras (:numref:`jitter_aster`). .. _aster_fetch: Fetching the data ^^^^^^^^^^^^^^^^^ ASTER satellite images are freely available from: https://search.earthdata.nasa.gov/search When visiting that page, select a region on the map, search for ``AST_L1A,`` and choose ``ASTER L1A Reconstructed Unprocessed Instrument Data V004``. If too many results are shown, narrow down the choices by using a range in time or deselecting unwanted items manually. Examining the data thumbnails is helpful, to exclude those with clouds, etc. Then click to download. As of end of 2025, the products can only be downloaded in the HDF-EOS format, which requires an ASP build from 2026-01 or later (:numref:`release`). Note that some datasets may not contain the bands 3B and 3N needed for stereo. The EarthData web site also offers pre-existing ASTER Global DEM (GDEM) products. Data preparation ^^^^^^^^^^^^^^^^ In this example we will use the dataset:: AST_L1A_00404012022185436_20250920182851.hdf around the San Luis Reservoir in Northern California. This dataset contains all image data and metadata in single .hdf file. It can be extracted with ``aster2asp`` (:numref:`aster2asp`) as:: aster2asp input.hdf -o out Older V003 datasets were provided as zipped files containing data directories with TIFF images and metadata as text files. In that case, after the data is extracted, the preparation command is:: aster2asp dataDir -o out In either case, four files would be produced, named:: out-Band3N.tif out-Band3B.tif out-Band3N.xml out-Band3B.xml We refer again to the tool's documentation page regarding details of how these files were created. Open the images in ``stereo_gui`` (:numref:`stereo_gui`) as:: stereo_gui out-Band3N.tif out-Band3B.tif and ensure that they are of good quality, or else get another dataset. Stereo with raw images ^^^^^^^^^^^^^^^^^^^^^^ As of build 2026/3 (:numref:`release`), ASTER data are always processed with the CSM model (:numref:`csm`). Run ``parallel_stereo`` (:numref:`parallel_stereo`):: parallel_stereo -t aster \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ out-Band3N.tif out-Band3B.tif \ out-Band3N.xml out-Band3B.xml \ out_stereo/run This uses the ``asp_mgm`` algorithm, which is the most accurate algorithm ASP has. One can also try the option ``--subpixel-mode 2`` which will be much slower but produce better results. See :numref:`nextsteps` for a discussion about various stereo algorithms and speed-vs-quality choices. This is followed by DEM creation with ``point2dem`` (:numref:`point2dem`):: point2dem -r earth --auto-proj-center \ out_stereo/run-PC.tif This will create a DEM named ``out_stereo/run-DEM.tif`` using an auto-guessed local UTM or polar stereographic projection (:numref:`point2dem_proj`), with an auto-guessed resolution (about 15 m / pixel, the image ground sample distance). Visualize the DEM with ``stereo_gui`` (:numref:`stereo_gui`):: stereo_gui --hillshade out_stereo/run-DEM.tif Stereo with mapprojected images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To improve the results for steep terrain, one may consider doing stereo as before, followed by mapprojection onto a coarser and smoother version of the obtained DEM, and then redoing stereo with mapprojected images (per the suggestions in :numref:`mapproj-example`). Initial stereo:: parallel_stereo -t aster \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ out-Band3N.tif out-Band3B.tif \ out-Band3N.xml out-Band3B.xml \ out_stereo/run Create a low-resolution smooth DEM at 200 meters/pixel:: point2dem -r earth --auto-proj-center \ --tr 200 out_stereo/run-PC.tif \ -o out_stereo/run-200m Mapproject onto this DEM at 15 meters/pixel:: mapproject --tr 15 \ out_stereo/run-200m-DEM.tif \ out-Band3N.tif out-Band3N.xml out-Band3N_proj.tif mapproject --tr 15 \ out_stereo/run-200m-DEM.tif \ out-Band3B.tif out-Band3B.xml out-Band3B_proj.tif Run parallel_stereo with the mapprojected images:: parallel_stereo -t aster \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ out-Band3N_proj.tif out-Band3B_proj.tif \ out-Band3N.xml out-Band3B.xml \ out_stereo_proj/run \ out_stereo/run-200m-DEM.tif Create the final DEM:: point2dem -r earth --auto-proj-center \ out_stereo_proj/run-PC.tif It is very important to use the same resolution (option ``--tr``) for both images when mapprojecting. That helps making the resulting images more similar and reduces the processing time (:numref:`mapproj-res`). One could consider mapprojecting at a higher resolution, for example, at 10 meters/pixel. It is suggested to also create and inspect the triangulation error image (:numref:`point2dem`). If it is large (comparable to ground sample distance), the cameras should be bundle-adjusted first (:numref:`bundle_adjust`). See :numref:`aster_dem_ortho_error` for an illustration. Stereo with ortho-ready L1B images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ASTER L1B images are also available. These are produced by projecting L1A images onto the WGS84 ellipsoid at zero elevation. ASTER L1B images can be processed with ASP using the workflow for ortho-ready images (:numref:`mapproj_ortho`). Invoke ``parallel_stereo`` with the L1B images (already mapprojected), L1A cameras, output prefix, and the option ``--ortho-heights 0 0``. The results are nearly the same as obtained with L1A images. .. _aster_csm: The CSM model ^^^^^^^^^^^^^ An ASTER camera model consists of a sequence of satellite position samples and a set of camera directions (sight vectors, in world coordinates), sampled at about a dozen image rows and columns. ASP fits a CSM linescan model (:numref:`csm`) on-the-fly to the ASTER sight vectors and satellite positions. Instead of a set of directions on a grid, there is one camera orientation at each satellite position sample. This enables solving for jitter in ASTER cameras (:numref:`jitter_aster`). The CSM model is produced by optimizing the optical center, focal length, and camera orientations, to fit best the provided ASTER sight vectors. No ground information is used, or stereo pair knowledge. The satellite positions do not change. The bundle adjustment program (:numref:`bundle_adjust`) will optimize and save the produced CSM models (:numref:`csm_state`). To save the best-fit CSM models with no further refinement, invoke this tool with zero iterations. The CSM model may be further refined by tying together multiple datasets and using ground constraints (:numref:`kaguya_ba`). .. _aster_rpc: Using the RPC model ^^^^^^^^^^^^^^^^^^^ ASTER XML files also contain RPC coefficients. These can be used with ``-t rpc`` (:numref:`rpc`) instead of ``-t aster``. The RPC model is an approximation and less accurate than the exact linescan model described above. Use the exact model (``-t aster``) for best results. ================================================ FILE: docs/examples/bathy.rst ================================================ .. include:: .. _bathy_intro: Shallow-water bathymetry ------------------------ ASP supports creation of terrain models where parts of the terrain are under water. Assuming that the water is shallow, still, clear, with sufficient texture to match at the water bottom between the left and right images, the rays emanating from the cameras and converging at those features will be bent according to Snell's law at the water interface, hence determining correctly the position of underwater terrain. The bathymetry module is evaluated in :cite:`palaseanu2021bathy` and :cite:`palaseanu2023`. Software considerations ~~~~~~~~~~~~~~~~~~~~~~~ ASP supports the bathymetry mode only with the ``dg``, ``rpc``, and ``nadirpinhole`` sessions, so with Digital Globe linescan cameras, RPC cameras, and pinhole cameras (:numref:`bathy_non_dg`), all for Earth, with the WGS84 datum. Both raw and mapprojected images can be used (:numref:`bathy_map`), with or without bundle adjustment or alignment (:numref:`bathy_ba_align`). Physics considerations ~~~~~~~~~~~~~~~~~~~~~~ Shallow water does not appear equally transparent at all wavelengths, which will affect the quality of the results. While the process we outline below will work, in principle, with any data, we will focus on stereo with the G band (green, stored at band 3) of Digital Globe multispectral imagery, and we will use the N band (near-infrared 1, stored at band 7), to determine a mask of the ground vs water. These or any other bands can be extracted from a multi-band image as follows: :: b=3 gdal_translate -b ${b} -co compress=lzw -co TILED=yes \ -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \ input.TIF input_b${b}.tif The extra options, in addition to ``-b ${b}`` to extract a given band, are needed to create a compressed and tiled output image, which helps with the performance of ASP later. .. _bathy_thresh: Computation of the water-land threshold ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In order to distinguish points on land from those under water, a mask needs to be computed for each of the left and right input images, with the masks having the same dimensions as those images. A simple way of creating such a mask is to first determine a threshold such that pixels at or below threshold are under water, and those above threshold are on land. It was experimentally found that it is best to use band 7 (near infrared) for Digital Globe multispectral images to find this water threshold, as in them the water appears universally darker than the land. Other methods are available for such thresholding and masking. See :numref:`bathy_water_masking`. ASP provides two tools for finding the threshold in automated way based on histogram analysis. One is ``bathy_threshold_calc.py`` (:numref:`bathy_threshold_calc`), and the second one is ``otsu_threshold`` (:numref:`otsu_threshold`). This last tool produces a somewhat higher threshold compared to the other one, but in practice the results with both approaches are very similar. The ``bathy_threshold_calc.py`` program works based on the observation that, since in such an image the water appears darker than the land, then in a histogram of the pixels in the image, the water and land appear as two noticeable peaks, with a good value for the threshold then being the image value at the bottom of the valley between those peaks. For robustness to noise, this histogram is approximated by a kernel-density estimate (``KDE``) using Gaussian kernels. It is very important to note that even then this tool may return the wrong minimum, which it assumes to be the first one. Therefore, this tool plots the histogram, its kernel density estimate, the positions of the minima, and prints their locations on screen. The user is responsible for validating visually where the most appropriate position of the minimum is (along the horizontal axis). The kernel-density estimate calculation is very time-consuming for large images, hence it is suggested to pass to the tool the number of samples to use (it will pick the samples uniformly in the image). For example, if a million samples are used, the calculation should take a few minutes to complete. This program can be invoked for each of the left and right images as follows: :: ~/miniconda3/envs/bathy/bin/python $(which bathy_threshold_calc.py) \ --image left.tif --num-samples 1000000 Here it is assumed that ASP's ``bin`` directory is in the path. The ``bathy`` conda environment should be installed as described in :numref:`bathy_threshold_calc`. It is suggested to experiment a bit with the number of samples, using, for example, double of this amount, and see the difference. Normally the outcome should be rather similar. It will produce the following output: :: Image file is left.tif Number of samples is 1000000 Number of image rows and columns: 7276, 8820 Picking a uniform sample of dimensions 908, 1101 Please be patient. It may take several minutes to find the answer. Positions of the minima: [ 155.18918919 802.7027027 ... ] Suggested threshold is the position of the first minimum: 155.1891891891892 Please verify with the graph. There is a chance the second minimum may work better. Elapsed time in seconds: 275.2 .. figure:: ../images/examples/bathy/bathy_threshold_calc.png :name: bathy_water_threshold_example Example of the graph plotted by bathy_threshold_calc.py Once the threshold is found, ``stereo_gui`` can be used to visualize the regions at or below threshold (:numref:`thresh`). .. _bathy_mask_creation: Creation of masks based on the threshold ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Having determined the water-land threshold, the left and right image masks will be found from the corresponding images as follows: :: left_thresh=155.1891891891892 image_calc -c "gt(var_0, $left_thresh, 1, 0)" -d float32 \ left_b7.tif -o left_mask.tif Here, ``left_b7.tif`` is suggestive of the fact that the band 7 of WorldView multispectral imagery was used. It is important to remember to use the right image threshold when repeating this process for the right image. The ``image_calc`` tool (:numref:`image_calc`) produces a binary mask, with 1 for land (values strictly larger than the threshold) and 0 for water (values at or below the threshold). If using a spectral index where water has higher values than land (like NDWI), the polarity is reversed (use the ``lt`` operator instead of ``gt``). See :numref:`bathy_water_masking` for details. Later, when doing stereo, if, based on the masks, a pixel in the left image is under water, while the corresponding pixel in the right image is not, for noise or other reasons, that pixel pair will be declared to be on land and hence no bathymetry correction will take place for this pair. Hence, some inspection and potentially cleanup of the masks may be necessary. .. _water_surface: Determination of the water surface ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In order to run stereo and properly triangulate the rays which may intersect under water, it is necessary to determine the water surface. Since for images of large extent the Earth curvature will be important, this surface will be found as a plane in a local stereographic projection. The procedure for this is described in :numref:`bathy_plane_calc`. Stereo with bathymetry correction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Having these in place, stereo can then happen as follows: :: parallel_stereo -t dg \ left.tif right.tif \ left.xml right.xml \ --left-bathy-mask left_mask.tif \ --right-bathy-mask right_mask.tif \ --stereo-algorithm asp_mgm \ --refraction-index 1.34 \ --bathy-plane bathy_plane.txt \ run_bathy/run Here we specified the two masks, the water index of refraction, and the water plane found before. Pixels classified as water must have non-positive value or be no-data in the mask, while land pixels must have positive value. See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. This is followed by creating a DEM (:numref:`point2dem`):: point2dem run_bathy/run-PC.tif --orthoimage run_bathy/run-L.tif The water refraction index was set 1.34 :cite:`jerlov1976marine`. Alternatively, one could use 1.333 :cite:`thormahlen1985refractive,harvey1998calibration`, or a more precise value that depends on wavelength, temperature, and if having saltwater or freshwater (`Parrish (2020) `_, :cite:`austin1976index,mobley1995optical`). For example, using the equation and coefficients found in Parrish (2020), and the green wavelength for saltwater, the water refraction index is 1.340125 when the water temperature is 27 |deg| C (this was applied to a Florida Keys test site for the month of May). The refraction index can be computed with the :ref:`refr_index` program. The obtained point cloud will have both triangulated points above water, so with no correction, and below water, with the correction applied. If desired to have only one of the two, call the ``parallel_stereo`` command with the option ``--output-cloud-type`` with the value ``topo`` or ``bathy`` respectively (the default for this option is ``all``). The bathymetry correction happens at the triangulation stage (though the necessary transformations on the bathymetry masks are done in pre-processing). Hence, after a stereo run finished, it is only necessary to re-run the ``stereo_tri`` step if desired to apply this correction or not, or if to change the value of ``--output-cloud-type``. As in usual invocations of stereo, the input images may be mapprojected, and then a DEM is expected, stereo may happen only in certain regions as chosen in the GUI, bundle adjustment may be used, the output point cloud may be converted to LAS, etc. .. _bathy_validation: Performing sanity checks on a bathy run ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The results produced with the bathymetry mode for stereo need careful validation. Here we will show how to examine if the water-land boundary and corresponding water surface were found correctly. Before that, it is important to note that such runs can take a long time, and one should try to first perform a bathymetry experiment in a carefully chosen small area by running ``stereo_gui`` instead of ``parallel_stereo``, while keeping the rest of the bathy options as above, and then selecting clips in the left and right images with the mouse to run ``parallel_stereo`` on. See :numref:`stereo_gui` for more info. If the ``bathy_plane_calc`` is run with the option:: --output-inlier-shapefile inliers.shp it will produce a shapefile for the inliers. Create an orthoimage from the aligned bathy mask, for example, such as:: point2dem --no-dem run_bathy/run-PC.tif \ --orthoimage run_bathy/run-L_aligned_bathy_mask.tif \ -o run_bathy/run-bathy_mask This should create ``run_bathy/run-bathy_mask-DRG.tif``. This should be overlaid in ``stereo_gui`` on top of the inliers from the bathy plane calculation, as:: stereo_gui --single-window --use-georef inliers.shp \ run_bathy/run-bathy_mask-DRG.tif The inliers should be well-distributed on the land-water interface as shown by the mask. To verify that the water surface was found correctly, one can create a DEM with no bathymetry correction, subtract from that one the DEM with bathymetry correction, and colorize the result. This can be done by redoing the triangulation in the previous run, this time with no bathy information:: mv run_bathy/run-DEM.tif run_bathy/run-yesbathy-DEM.tif parallel_stereo -t dg left.tif right.tif left.xml right.xml \ --stereo-algorithm asp_mgm \ --entry-point 5 run_bathy/run point2dem run_bathy/run-PC.tif -o run_bathy/run-nobathy Note that we started by renaming the bathy DEM. The result of these commands will be ``run_bathy/run-nobathy-DEM.tif``. The differencing and colorizing is done as:: geodiff run_bathy/run-nobathy-DEM.tif \ run_bathy/run-yesbathy-DEM.tif -o run_bathy/run colormap --min 0 --max 1 run_bathy/run-diff.tif The obtained file, ``run_bathy/run-diff_CMAP.tif``, can be added to the ``stereo_gui`` command from above. Colors hotter than blue will be suggestive of how much the depth elevation changed as result of bathymetry correction. It is hoped that no changes will be seen on land, and that the inliers bound well the region where change of depth happened. .. _bathy_ba_align: Bundle adjustment and alignment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is important to note that we did not use bundle adjustment (:numref:`bundle_adjust`) or ``pc_align`` (:numref:`pc_align`) for alignment. That is possible, but then one has to ensure that all the data are kept consistent under such operations. In particular, running bundle adjustment on a PAN image pair, and then on a corresponding multispectral band pair, will result in DEMs which are no longer aligned either to each other, or to their versions before bundle adjustment. The cameras can be prevented by moving too far if ``bundle_adjust`` is called with, for example, ``--tri-weight 0.1``, or some other comparable value, to constrain the triangulated points. Yet, by its very nature, this program changes the positions and orientations of the cameras, and therefore the coordinate system. And note that a very high camera weight may interfere with the convergence of bundle adjustment. It is suggested to use these tools only if a trusted reference dataset exists, and then the produced DEMs should be aligned to that dataset. ASP build 2026-01 or newer (:numref:`release`) supports modeling bathymetry during bundle adjustment (:numref:`ba_bathy`). Only the "topo" component of a DEM obtained with ASP should be used for alignment (see ``--output-cloud-type``), that is, the part above water, as the part under water can be quite variable given the water level. Here's an example for creating the "topo" DEM, just the triangulation stage processing needs modification:: parallel_stereo -t dg left.tif right.tif left.xml right.xml \ --stereo-algorithm asp_mgm \ \ --entry-point 5 --output-cloud-type topo \ run_bathy/run point2dem run_bathy/run-PC.tif -o run_bathy/run-topo which will create ``run_bathy/run-topo-DEM.tif``. Then, after the "topo" DEM is aligned, the alignment transform can be applied to the full DEM (obtained at triangulation stage with ``--output-cloud-type all``), as detailed in :numref:`prevtrans`. The input cameras can be aligned using the same transform (:numref:`ba_pc_align`). When the water surface is determined using a DEM, a mask of the image portion above water, and corresponding camera, and the cameras have been bundle-adjusted or aligned, the option ``--bundle-adjust-prefix`` must be used with ``bathy_plane_calc`` (see :numref:`bathy_plane_raw_img`). Validation of alignment ~~~~~~~~~~~~~~~~~~~~~~~ It is very strongly suggested to use visual inspection in ``stereo_gui`` and the ``geodiff`` and ``colormap`` tools for differencing DEMs to ensure DEMs that are meant to be aligned have small differences. Since bathymetry modeling can measure only very shallow water depths, any misalignment can result in big errors in final results. If DEMs have parts under water and it is desired to remove those for the purpose of alignment, one can take advantage of the fact that the water height is roughly horizontal. Hence, a command like:: height=-21.2 image_calc -c "max($height, var_0)" -d float32 \ --output-nodata-value $height \ dem.tif -o topo_dem.tif will eliminate all heights under -21.2 meters (relative to the datum ellipsoid). Bathymetry with changing water level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the left and right images were acquired at different times, the water level may be different among the two, for example because of the tide. Then, ``bathy_plane_calc`` (:numref:`bathy_plane_calc`) can be used independently for the left and right images, obtaining two such surfaces. These can be passed to ASP as follows:: parallel_stereo --bathy-plane "left_plane.txt right_plane.txt" \ --stereo-algorithm asp_mgm \ The computation will go as before until the triangulation stage. There, the rays emanating from the cameras will bend when meeting the water at different elevations given by these planes, and their intersection may happen in three possible regimes (above both planes, in between them, or below both of them). Care must be taken when doing stereo with images acquired at a different times as the illumination may be too different. A good convergence angle is also expected (:numref:`stereo_pairs`). .. _bathy_reuse_run: How to reuse most of a run ~~~~~~~~~~~~~~~~~~~~~~~~~~ Stereo can take a long time, and the results can have a large size on disk. It is possible to reuse most of such a run, using the option ``--prev-run-prefix``, if cameras or camera adjustments (option ``--bundle-adjust-prefix``) get added, removed, or change, if the water surface (``--bathy-plane``) or index of refraction change, or if the previous run did not do bathy modeling but the new run does (hence the options ``--left-bathy-mask`` and ``--right-bathy-mask`` got added). One must not change ``--left-image-crop-win`` and ``--right-image-crop-win`` in the meantime, if used, as that may invalidate the intermediate files we want to reuse, nor the input images. If the previous run did employ bathy masks, and it is desired to change them (rather than add them while they were not there before), run the ``touch`` command on the new bathy masks, to give the software a hint that the alignment of such masks should be redone. As an example, consider a run with no bathymetry modeling:: parallel_stereo -t dg left.tif right.tif left.xml right.xml \ --stereo-algorithm asp_mgm \ run_nobathy/run A second run, with output prefix ``run_bathy/run``, can be started directly at the triangulation stage while reusing the earlier stages from the other run as:: parallel_stereo -t dg left.tif right.tif left.xml right.xml \ --stereo-algorithm asp_mgm \ --left-bathy-mask left_mask.tif --right-bathy-mask right_mask.tif \ --refraction-index 1.34 --bathy-plane bathy_plane.txt \ --bundle-adjust-prefix ba/run run_yesbathy/run \ --prev-run-prefix run_nobathy/run The explanation behind the shortcut employed above is that the precise cameras and the bathy info are fully used only at the triangulation stage. That because the preprocessing step (step 0), mostly does alignment, for which some general knowledge of the cameras and bathy information is sufficient, and other steps, before triangulation, work primarily on images. This option works by making symbolic links to files created at previous stages of stereo which are needed at triangulation. Note that if the cameras changed, the user must recompute the bathy planes first, using the updated cameras. The ``bathy_plane_calc`` tool which is used for that can take into account the updated cameras via the ``--bundle-adjust-prefix`` option passed to it. If the software notices that the current run invoked with ``--prev-run-prefix`` employs bathy masks, unlike that previous run, or that the modification time of the bathy masks passed in is newer than of files in that run, it will ingest and align the new masks before performing triangulation. If the cameras change notably, it may be suggested to redo the run from scratch. .. _bathy_map: Bathymetry correction with mapprojected images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mapprojecting the input images can improve the results on steep slopes (:numref:`mapproj-example`). While that may not be a big concern in bathymetry applications, this section nevertheless illustrates how stereo with shallow water can be done with mapprojection. Given an external DEM, the left and right images can be mapprojected onto this DEM, for example as: :: mapproject external_dem.tif --tr gridSize \ left.tif left.xml left_map.tif and the same for the right image. The same ground sample distance (resolution) must be used for left and right images, which should be appropriately chosen depending on the data (:numref:`mapproj-res`). One should mapproject the same way the left and right band 7 Digital Globe multispectral images (if applicable), obtaining two images, ``left_map_b7.tif`` and ``right_map_b7.tif``. These two can be used to find the masks, as earlier: :: left_thresh=155.1891891891892 image_calc -c "max($left_thresh, var_0)" \ --output-nodata-value $left_thresh \ left_map_b7.tif -o left_map_mask.tif (and the same for the right image.) The threshold determined with the original non-mapprojected images should still work, and the same water plane can be used. Then, stereo happens as above, with the only differences being the addition of the external DEM and the new names for the images and the masks: :: parallel_stereo -t dg left_map.tif right_map.tif \ left.xml right.xml \ --stereo-algorithm asp_mgm \ --left-bathy-mask left_map_mask.tif \ --right-bathy-mask right_map_mask.tif \ --refraction-index 1.34 \ --bathy-plane bathy_plane.txt \ run_map/run external_dem.tif Using Digital Globe PAN images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The bathymetry mode can be used with Digital Globe PAN images as well, though likely the water bottom may not be as transparent in this case as for the Green band. Yet, if desired to do so, a modification is necessary if the mask for pixels above water is obtained not from the PAN image itself, but from a band of the corresponding multispectral image, because those are acquired with different sensors. Starting with a multispectral image mask, one has to first increase its resolution by a factor of 4 to make it comparable to the PAN image, then crop about 50 columns on the left, and further crop or extend the scaled mask to match the PAN image dimensions. ASP provides a tool for doing this, which can be called as:: scale_bathy_mask.py ms_mask.tif pan_image.tif output_pan_mask.tif Any warnings about ``srcwin ... falls partially outside raster extent`` should be ignored. GDAL will correctly pad the scaled mask with no-data values if it has to grow it to match the PAN image. To verify that the PAN image and obtained scaled PAN mask agree, overlay them in ``stereo_gui``, by choosing from the top menu the option ``View->Single window``. It is not clear if the number of columns to remove on the left should be 50 or 48 pixels. It appears that 50 pixels works better for WV03 while 48 pixels may be appropriate for WV02. These were observed to result in a smaller shift among these images. The default is 50. If desired to experiment with another amount, pass that one as an additional argument to the tool, after the output PAN mask. .. _bathy_non_dg: Using non-Digital Globe images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Stereo with bathymetry was tested with RPC cameras. In fact, the above examples can be re-run by just replacing ``dg`` with ``rpc`` for the ``-t`` option. (It is suggested that the shoreline shapefile and the water plane be redone for the RPC case. It is expected that the results will change to a certain extent.) Experiments were also done with pinhole cameras (using the ``nadirpinhole`` session) with both raw and mapprojected images, and using the alignment methods 'epipolar', 'affineepipolar', 'homography', and 'none', giving plausible results. Effect of bathymetry correction on the output DEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is instructive to compare the DEMs with and without the bathymetry correction. The bathymetry correction results in the points in the output triangulated cloud being pushed "down", as the rays emanating from the cameras become "steeper" after meeting the water. Yet, a DEM is obtained by binning and doing weighted averaging of the points in the cloud. It can happen that with the bathymetry correction on, a point may end up in a different bin than with it off, with the result being that a handful of heights in the bathymetry-corrected DEM can be slightly above the same heights in the DEM without the correction, which is counter-intuitive. This however will happen only close to the water-land interface and is an expected gridding artifact. (A different DEM grid size may result in the artifacts changing location and magnitude.) ================================================ FILE: docs/examples/cassini.rst ================================================ .. _cassini_example: Cassini ISS NAC --------------- This is a proof of concept showing the strength of building the Stereo Pipeline on top of ISIS. Support for processing ISS NAC stereo pairs was not a goal during our design of the software, but the fact that a camera model exists in ISIS means that it too can be processed by the Stereo Pipeline. Identifying stereo pairs from spacecraft that do not orbit their target is a challenge. We have found that one usually has to settle with images that are not ideal: different lighting, little perspective change, and little or no stereo parallax. So far we have had little success with Cassini's data, but nonetheless we provide this example as a potential starting point. Rhea ~~~~ Rhea is the second largest moon of Saturn and is roughly a third the size of our own Moon. This example shows, at the top right of both images, a giant impact basin named Tirawa that is 220 miles across. The bright white area south of Tirawa is ejecta from a new crater. The lack of texture in this area poses a challenge for our correlator. The results are just barely useful: the Tirawa impact can barely be made out in the 3D data while the new crater and ejecta become only noise. .. figure:: ../images/examples/cassini/cassini_rhea_quad.png :name: cassini-example Example output of what is possible with Cassini's ISS NAC. Upper left: original left image. Upper right: original right image. Lower left: mapprojected left image. Lower right: 3D Rendering of the point cloud. Commands ^^^^^^^^ Download the N1511700120_1.IMG and W1567133629_1.IMG images and their label (.LBL) files from the PDS. :: ISIS> ciss2isis f=N1511700120_1.LBL t=N1511700120_1.cub ISIS> ciss2isis f=W1567133629_1.LBL t=W1567133629_1.cub ISIS> cisscal from=N1511700120_1.cub to=N1511700120_1.lev1.cub ISIS> cisscal from=W1567133629_1.cub to=W1567133629_1.lev1.cub ISIS> fillgap from=W1567133629_1.lev1.cub to=W1567133629_1.fill.cub (Note the optional ``fillgap`` command above.) :: ISIS> cubenorm from=N1511700120_1.lev1.cub to=N1511700120_1.norm.cub ISIS> cubenorm from=W1567133629_1.fill.cub to=W1567133629_1.norm.cub ISIS> spiceinit from=N1511700120_1.norm.cub ISIS> spiceinit from=W1567133629_1.norm.cub ISIS> cam2map from=N1511700120_1.norm.cub to=N1511700120_1.map.cub ISIS> cam2map from=W1567133629_1.norm.cub map=N1511700120_1.map.cub \ ISIS> to=W1567133629_1.map.cub matchmap=true ISIS> parallel_stereo N1511700120_1.map.equ.cub \ W1567133629_1.map.equ.cub result/rhea See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. Also consider the following modifications to ``stereo.default``:: ### PREPROCESSING alignment-method none force-use-entire-range individually-normalize ### CORRELATION prefilter-mode 2 prefilter-kernel-width 1.5 cost-mode 2 corr-kernel 25 25 corr-search -55 -2 -5 10 subpixel-mode 3 subpixel-kernel 21 21 ### FILTERING rm-half-kernel 5 5 rm-min-matches 60 # Units = percent rm-threshold 3 rm-cleanup-passes 1 ================================================ FILE: docs/examples/chandrayaan2.rst ================================================ .. _chandrayaan2: Chandrayaan-2 lunar orbiter --------------------------- The example here shows how to create a 3D terrain model with `Chandrayaan-2 lunar orbiter `_ data. We will work with the *Orbiter High Resolution Camera* (OHRC). A *Terrain Mapping Camera-2* (TMC-2) example will be added at a later time. For the moment this exercise works only much additional work. It needs ASP 3.6.0 (:numref:`release`), `ISIS `_ 9.0.0, `ALE `_ (compiled and installed from source to a separate location), SPICE kernels from the `ISRO Science Data Archive `_, and custom addendum (``iak``) directories for ISIS data be set up. This is *not ready for general use* until the kernels are released in the ISIS data area, but is provided for reference. Orbiter High Resolution Camera ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The OHRC instrument is a high-resolution camera with a 0.25 m ground sample distance (GSD). It can adjust its look angle and acquire stereo pairs (:numref:`stereo_pairs`). Fetching the data ^^^^^^^^^^^^^^^^^ Raw and calibrated images for OHRC and TMC-2 cameras, as well as orthoimages and Digital Elevation Models (DEMs) produced from TMC-2 camera data, can be downloaded from `ISRO `_. The first step when using that portal is selecting the appropriate projection for displaying the image footprints. Then, choose the instrument (OHRC or TMC-2), data type (calibrated is suggested, but raw may do), and the area of interest. We selected the region of interest to be between 20 and 21 degrees in longitude, and -70 to -67 degrees in latitude. The OHRC stereo pair we downloaded consisted of images with the prefixes:: ch2_ohr_nrp_20200827T0030107497_d_img_d18 ch2_ohr_nrp_20200827T0226453039_d_img_d18 We also got a TMC-2 orthoimage and corresponding DEM with the prefixes:: ch2_tmc_ndn_20231101T0125121377_d_oth_d18 ch2_tmc_ndn_20231101T0125121377_d_dtm_d18 These are at lower resolution but useful for context. .. figure:: ../images/chandrayaan2_ohrc_tmc.png From left to right: The first and second OHRC images, and their approximate extent in the (many times larger) TMC-2 ortho image. Note that the illumination in the TMC-2 ortho image is very different. Preprocessing ^^^^^^^^^^^^^ Each calibrated image dataset has ``.img`` and ``.xml`` files, with raw data and a PDS-4 label. It will be convenient to rename these to ``ohrc/img1.img`` and ``ohrc/img1.xml`` for the first OHRC dataset, and analogously for the second one. The `isisimport `_ command converts the raw image to a .cub file:: isisimport \ from = ohrc/img1.xml \ to = ohrc/img1.cub \ template = ${template} (and same for the second image). Here, the ``template`` variable is set such as:: template=/path/to/ISIS3/isis/appdata/import/PDS4/Chandrayaan2OHRC.tpl In ISIS 9.0.0 likely the template parameter is optional and the template should be auto-detected. The ``isisimport`` command only works with raw images and not with ortho images. If this command fails with a message about not being able to find a field in the input xml file, it is suggested to edit that file and add a made-up entry for that field. This is a temporary workaround for the problem of Chandrayaan-2 xml files being rather diverse in what fields they record. The SPICE kernels are attached with `spiceinit `_:: spiceinit from = ohrc/img1.cub This expects the SPICE kernels for Chandrayaan-2 to exist locally (see the download link above). For more information on ISIS data, see :numref:`planetary_images` and the links from there. Next, the CSM cameras are created (:numref:`csm`). This makes use of the `isd_generate `_ program installed with the latest ALE built from source (link above). The command is:: export ALESPICEROOT=$ISISDATA isd_generate -k ohrc/img1.cub ohrc/img1.cub and same for ``img2.cub``. Here the .cub file is specified twice, with the first file needed to read the SPICE kernels. It is suggested to do a quick check on the produced ``ohrc/img1.json`` camera with ``cam_test`` (:numref:`cam_test`). The images can be inspected with ``stereo_gui`` (:numref:`stereo_gui`), as:: stereo_gui ohrc/img1.cub ohrc/img2.cub The resulting cub files are very large, on the order of 12,000 x 101,075 pixels. For exploratory work, these can be cropped, with the ISIS `crop `_ command, such as:: crop \ from = ohrc/img1.cub \ to = ohrc/img1_crop.cub \ sample = 1 \ line = 1 \ nsamples = 12000 \ nlines = 50000 It is very important to ensure that the upper-left pixel (1, 1) is part of the crop region, as otherwise the resulting images will be inconsistent with the CSM camera models. Bundle adjustment ^^^^^^^^^^^^^^^^^ We found that these images have notable pointing error, so bundle adjustment (:numref:`bundle_adjust`) is needed:: bundle_adjust \ ohrc/img1_crop.cub ohrc/img2_crop.cub \ ohrc/img1.json ohrc/img2.json \ --ip-per-image 30000 \ -o ba/run This stereo pair was seen to have a decent convergence angle of 25 degrees (:numref:`ba_conv_angle`). .. figure:: ../images/chandrayaan2_ohrc_interest_points.png The left and right cropped OHRC images, and the interest point matches between them (as shown by ``stereo_gui``, :numref:`stereo_gui_view_ip`). Stereo ^^^^^^ Next, we invoked ``parallel_stereo`` (:numref:`parallel_stereo`) to create a point cloud:: parallel_stereo \ --stereo-algorithm asp_mgm \ --clean-match-files-prefix ba/run \ ohrc/img1_crop.cub \ ohrc/img2_crop.cub \ ba/run-img1.adjusted_state.json \ ba/run-img2.adjusted_state.json \ stereo/run A DEM, orthoimage, and triangulation error image are made with ``point2dem`` (:numref:`point2dem`), as:: point2dem \ --tr 1.0 \ --errorimage \ stereo/run-PC.tif \ --orthoimage \ stereo/run-L.tif In a recent version of ASP these will, by default, have a local stereographic projection. .. figure:: ../images/chandrayaan2_ohrc_dem_ortho_err.png From left to right: Produced OHRC DEM (range of heights is 304 to 650 meters), orthoimage, and triangulation error image (blue = 0 m, red = 0.5 m). There is notable jitter, whose magnitude is on the order of image GSD (0.25 m), which is rather high, but which could be corrected (:numref:`jitter_solve`). Some unmodeled lens distortion also seems evident, which could be solved for (:numref:`kaguya_ba`). Alignment ^^^^^^^^^ We will align the produced OHRC DEM to `LOLA `_, which is the usual global reference coordinate system for the Moon. The OHRC DEM turned out to be shifted relative to LOLA by about 4 km along the satellite track, which resulted in failure to align with ``pc_align`` (:numref:`pc_align`). Manual alignment was first performed (:numref:`manual-align`). The inputs were the OHRC DEM and a LOLA point cloud, after gridding both with a 10 m grid size and the same projection with ``point2dem``, and manually picking a few visually similar features. That brought the cloud notably closer, and the output transform from that alignment was used for aligning the full clouds as:: pc_align \ --max-displacement 250 \ --initial-transform init-transform.txt \ --csv-format 2:lon,3:lat,4:radius_km \ --save-inv-transformed-reference-points \ stereo/run-DEM.tif lola/lola.csv \ -o stereo/run-align .. figure:: ../images/chandrayaan2_ohrc_lola.png The difference between the aligned OHRC DEM and LOLA point cloud. Blue: -5 m, red = 5 m. Given that the DEM, in principle, should have a vertical uncertainty of under 1 m, this could be better, but at least one is in the ballpark. A terrain model created with the lower-resolution TMC-2 images would likely be easier to align to LOLA, as it would have a much bigger extent. ================================================ FILE: docs/examples/change3.rst ================================================ .. _change3: Chang'e 3 landing camera ------------------------ This example discusses processing `Chang'e 3 `_ landing camera images. This camera was mounted at the bottom of the lander and acquired images during the descent phase. The images we inspected had a very small convergence angle (:numref:`stereo_pairs`), of under 1.5 degrees, which resulted in an unreliable terrain model. Here we show how these images can be precisely registered to an LRO NAC image (:numref:`lronac-example`), how to refine the landing camera intrinsics including lens distortion, and how to produce an aligned terrain model from a stereo pair between a Chang'e landing camera image and an LRO NAC image with similar illumination. Fetching the Chang'e 3 images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `Chang'e3 landing video `_ is very helpful when it comes to deciding which images to process. The images are available from China's `Lunar Planetary Data Release System `_. Select the ``CE3`` mission, the ``LCAM`` instrument, and the ``2A`` data level. The images have names of the form:: CE3_BMYK_LCAM-1801_SCI_N_20131214130807_20131214130807_0001_A.2A The data is in the PDS3 format, with a plain text metadata header followed by a binary image. The images can be converted to TIF with ``gdal_translate`` (:numref:`gdal_tools`) as:: mkdir -p img gdal_translate CE3_BMYK_LCAM-1801*.2A img/1801.tif Here, ``1801`` is the index in the sequence. We stored the result in the ``img`` directory. .. figure:: ../images/change3_images.png Landing camera images 1801, 1831, 1861, and 1891. A crater seen in all four images is highlighted with a red box. Some parts of the lander body are seen in the foreground. Most of those artifacts can be masked with ``image_calc`` (:numref:`image_calc`) with a command as:: image_calc -c "max(var_0,70)" \ --output-nodata-value 70 \ -d float32 \ img/1801.tif \ -o img/1801_mask.tif This sets to no-data any pixel values not exceeding 70. A more careful processing could be done by opening an image in an image editor, manually setting to black (zero pixel value) all undesirable pixels, and then using the ``image_calc`` ``sign()`` function to create a mask of invalid (value 0) and valid (value 1) pixels. Those could be applied to each image by multiplication, with ``image_calc`` with the option ``--output-nodata-value 0``. The same mask would work for all of them. LRO NAC data ~~~~~~~~~~~~ The Chang'e 3 images will be registered against LRO NAC images. These are larger, with known camera information, and at higher resolution. It was quite tricky to find an LRO NAC image with similar illumination. This required mapprojecting many such images and visual inspection. We settled on image ``M1154358210RE``. How to download and prepare LRO NAC images, including the application of ``lronaccal`` and ``lronacecho``, is described in :numref:`lronac-example`. A CSM camera model can be produced as in :numref:`create_csm_linescan`. The resulting datasets will be called ``img/lro.cub`` and ``img/lro.json``. We will also fetch an `LRO NAC DEM `_ produced specifically for this landing site. We call it ``ref/ref.tif``. The LRO NAC images are very large, and sometimes also scanned in reverse direction, appearing mirror-flipped. This can result in failure in finding matching features for registration. To make the work easier, we will mapproject the needed image portion onto this DEM. Since these two datasets are not explicitly co-registered, we will blur the DEM for mapprojection quite a bit to lessen the effect of artifacts due to misregistration. Later, for alignment to the ground, we will use the original DEM. The blur is done with ``dem_mosaic`` (:numref:`dem_mosaic`) as:: dem_mosaic --dem-blur-sigma 10 \ ref/ref.tif -o ref/ref_blur.tif Define the extent on the ground and the projection:: win="3497495 1340957 3503625 1334379" proj="+proj=eqc +lat_ts=44 +lat_0=0 +lon_0=180 +x_0=0 +y_0=0 +R=1737400 +units=m +no_defs" Then, the mapprojection (:numref:`mapproject`) step follows:: mapproject --tr 2.0 \ --t_projwin $win \ --t_srs "$proj" \ ref/ref_blur.tif \ img/lro.cub \ img/lro.json \ img/lro.map.tif The grid size of 2 meters was chosen to be similar to the resolution of the Chang'e 3 images. GCP creation ~~~~~~~~~~~~ We will find interest point matches between the Chang'e 3 and LRO NAC images, based on which we will compute GCP (:numref:`bagcp`), that will be later used to infer an approximate position and orientation of the Chang'e 3 camera at the time of image acquisition. GCP are found with the ``gcp_gen`` program (:numref:`gcp_gen`) as:: gcp_gen \ --ip-detect-method 1 \ --inlier-threshold 100 \ --ip-per-tile 20000 \ --gcp-sigma 100 \ --individually-normalize \ --camera-image img/1801_mask.tif \ --ortho-image img/lro.map.tif \ --dem ref/ref.tif \ --output-prefix run/run \ -o gcp/gcp_1801.gcp The interest point matches can be visualized with ``stereo_gui`` (:numref:`stereo_gui_view_ip`) as:: stereo_gui img/1801_mask.tif img/lro.map.tif \ run/run-1801__lro.map.match .. figure:: ../images/change3_lro.png Interest point matches between masked Chang'e image 1801 and mapprojected LRO NAC image M1154358210RE. Similar results are obtained for the other images. Initial camera models ~~~~~~~~~~~~~~~~~~~~~ The Chang'e 3 landing camera is a frame camera. The input .2A datasets mention that it has a focal length of 8.3 mm and a pixel size of 6.7 micrometers, which makes the focal length in pixels be about 1238.805 pixels. The image dimensions are 1024 x 1024 pixels. It can be assumed that the optical center is at the center of the image, so its coordinates are (511.5, 511.5). The lens distortion model is not known. We will assume the standard radial-tangential distortion model, and will initialize all distortion coefficients with small values, such as 1e-7, that will be optimized later. This allows us to build a Pinhole model (:numref:`pinholemodels`) with nominal camera position and orientation. We will save it to a file called ``sample.tsai``, with the following content:: VERSION_4 PINHOLE fu = 1238.805 fv = 1238.805 cu = 511.5 cv = 511.5 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0 0 0 R = 1 0 0 0 1 0 0 0 1 pitch = 1 Tsai k1 = 1e-7 k2 = 1e-7 p1 = 1e-7 p2 = 1e-7 k3 = 1e-7 We will make use of the GCP found earlier to infer the camera position and orientation. This is done with ``bundle_adjust`` (:numref:`bundle_adjust`) as:: bundle_adjust \ img/1801_mask.tif \ sample.tsai \ gcp/gcp_1801.gcp \ --datum D_MOON \ --inline-adjustments \ --init-camera-using-gcp \ --camera-weight 0 \ --num-iterations 100 \ -o ba/run cp ba/run-sample.tsai img/1801.tsai The camera model was copied to ``img/1801.tsai``. We will convert this Pinhole model right away to a CSM model (:numref:`csm`), to be in the same format as the LRO data. This is done with ``cam_gen`` (:numref:`cam_gen`):: cam_gen \ --datum D_MOON \ img/1801_mask.tif \ --input-camera img/1801.tsai \ -o img/1801.json The camera model can be validated by mapprojection onto the prior DEM:: mapproject --tr 2.0 \ --t_srs "$proj" \ ref/ref_blur.tif \ img/1801_mask.tif \ img/1801.json \ img/1801.map.tif The value of ``$proj`` is the same as before. The resulting mapprojected image can be overlaid on top of the LRO NAC mapprojected image. Some misalignment is expected at this stage. More validation strategies are discussed in :numref:`cam_gcp_validation`. .. figure:: ../images/change3_over_lro.png Mapprojected and masked Chang'e 3 image 1801 overlaid on top of the LRO NAC mapprojected image. The masked pixels are shown as transparent. A careful inspection shows good initial agreement, but some local deformation is seen, which is likely due to some tilt and lens distortion not being modeled yet. This will be fixed later. .. _change_opt: Optimization of intrinsics ~~~~~~~~~~~~~~~~~~~~~~~~~~ We will optimize the intrinsics and extrinsics of the Chang'e 3 cameras, including the lens distortion, with the LRO data serving as a constraint. The general approach from :numref:`ba_frame_linescan` is followed, while dense matches from disparity are employed, to ensure the best results. Stereo will be run between any pair of images: ``1801``, ``1831``, ``lro``, and dense matches from stereo correlation (disparity) will be produced (:numref:`dense_ip`). :: i=1801; j=1831 parallel_stereo \ img/${i}.map.tif img/${j}.map.tif \ img/${i}.json img/${j}.json \ --stereo-algorithm asp_mgm \ --num-matches-from-disparity 10000 \ stereo_map_${i}_${j}/run \ ref/ref_blur.tif This is repeated for ``i=1801; j=lro``, and ``i=1831; j=lro``. The dense match files are copied to the same location:: mkdir -p dense_matches cp stereo_map*/run-disp*match dense_matches Separate lists are made of Chang'e 3 and LRO images and cameras:: ls img/{1801,1831}_mask.tif > change3_images.txt ls img/lro.cub > lro_images.txt ls img/{1801,1831}.json > change3_cameras.txt ls img/lro.json > lro_cameras.txt Bundle adjustment is run:: bundle_adjust \ --image-list change3_images.txt,lro_images.txt \ --camera-list change3_cameras.txt,lro_cameras.txt \ --solve-intrinsics \ --intrinsics-to-float \ '1:focal_length,optical_center,other_intrinsics 2:none' \ --heights-from-dem ref/ref_blur.tif \ --heights-from-dem-uncertainty 100 \ --match-files-prefix dense_matches/run-disp \ --max-pairwise-matches 50000 \ --num-iterations 50 \ -o ba_dense/run The value of ``--heights-from-dem-uncertainty`` is set to 100 meters, as we know that the input cameras are not yet aligned to the input DEM, so this accounts for the misregistration. This option would fail for very large misregistration, when a preliminary alignment would be needed. Stereo is run between images ``1801`` and ``lro`` with the optimized cameras and reusing the previous run from above:: parallel_stereo \ img/1801.map.tif img/lro.map.tif \ ba_dense/run-1801.adjusted_state.json \ ba_dense/run-lro.adjusted_state.json \ --stereo-algorithm asp_mgm \ --prev-run-prefix stereo_map_1801_lro/run \ stereo_map_opt_1801_lro/run \ ref/ref_blur.tif These two images have a convergence angle of 45 degrees, which is very good for stereo (:numref:`stereo_pairs`). The Chang'e 3 images are not going to produce a good DEM between themselves, because of the very small convergence angle, as mentioned earlier. A DEM is created, at 4 meters per pixel, with ``point2dem`` (:numref:`point2dem`):: point2dem --tr 4.0 \ --errorimage \ stereo_map_opt_1801_lro/run-PC.tif It is good to inspect the resulting triangulation error image to ensure lens distortion was solved for and no systematic errors are present (:numref:`point2dem_ortho_err`). The produced DEM can be aligned to the original DEM with ``pc_align`` (:numref:`pc_align`), and the aligned cloud can be made back into a DEM:: pc_align --max-displacement 100 \ --save-inv-transformed-reference-points \ --alignment-method point-to-plane \ stereo_map_opt_1801_lro/run-DEM.tif \ ref/ref.tif \ -o align/run point2dem --tr 4.0 \ align/run-trans_reference.tif The resulting alignment transform can be applied to the optimized cameras in the ``ba_dense`` directory (:numref:`ba_pc_align`). After mapprojection with the optimized and aligned cameras onto ``ref/ref.tif``, no distortion or misalignment is seen. .. figure:: ../images/change3_lro_dem.png Left: The produced aligned DEM with frame 1801. Right: the original LRO NAC DEM. The Chang'e 3 images are are at a lower resolution, and somewhat differ in illumination from the LRO NAC image, so the quality of the resulting DEM is lower. However, the larger features are captured correctly, and the alignment is also very good. Multi-image registration ~~~~~~~~~~~~~~~~~~~~~~~~ The approach for registering a longer sequence of Chang'e 3 images to each other and to LRO NAC is very similar. GCP are computed automatically for each image. Pairwise dense matches are found between each image and the next, and between each image and the LRO NAC image. Bundle adjustment can be run as above, while optimizing the intrinsics. Stereo is run between each Chang'e 3 image and the LRO NAC image, with the optimized cameras. The resulting DEMs can be merged with ``dem_mosaic``, and the produced mosaic is aligned to the original LRO NAC DEM with ``pc_align``. The alignment transform is applied to the optimized cameras (:numref:`ba_pc_align`). The images with the resulting cameras are mapprojected onto the original LRO NAC DEM. If needed, the bundle adjustment from above can be rerun with the now well-aligned cameras and a lower ``--heights-from-dem-uncertainty``. For a very long sequence of images this method can become impractical. In that case, the intrinsics that are optimized as demonstrated earlier for a short stretch can be used with Structure-from-Motion (:numref:`sfm`) on the full sequence. Just a few well-distributed GCP may be needed to transform the cameras to ground coordinates. DEM creation and alignment refinement can be as earlier. If the intrinsics are not optimized, then dense matches are not required, and the sparse matches produced ``camera_solve`` in SfM or by ``bundle_adjust`` should be enough. .. figure:: ../images/change3_many_over_lro.png From top to bottom, the mapprojected Chang'e images 1780, 1801, 1831, 1861, 1891, and 1910, with the LRO NAC image in the background. These have been pixel-level registered to each other, to the LRO NAC image, and to the LRO NAC DEM. The footprint of the images is decreasing along the sequence, and the resolution is increasing, as the lander is descending. A portion of the data was cropped on the right to remove the noise due to the lander body and to make it easier to evaluate the registration visually. ================================================ FILE: docs/examples/csm.rst ================================================ .. _csm: Community Sensor Model ---------------------- The Community Sensor Model (CSM), established by the U.S. defense and intelligence community, has the goal of standardizing camera models for various remote sensor types :cite:`CSMTRD`. It provides a well-defined application program interface (API) for multiple types of sensors and has been widely adopted by Earth remote sensing software systems :cite:`hare2017community,2019EA000713`. ASP supports and ships the `USGS implementation `_ of CSM for planetary images, which provides Linescan, Frame, Pushframe, and Synthetic Aperture Radar (SAR) implementations. CSM is handled via dynamically loaded plugins. Hence, if a user has a new sensor model, ASP should, in principle, be able to use it as soon as a supporting plugin is added to the existing software, without having to rebuild ASP or modify it otherwise. In practice, while this logic is implemented, ASP defaults to using only the USGS implementation, though only minor changes are needed to support additional plugins. Each stereo pair to be processed by ASP should be made up of two images (for example ``.cub`` or ``.tif`` files) and two plain text camera files with ``.json`` extension. The CSM information is contained in the ``.json`` files and it determines which plugin to load to use with those cameras. CSM model state data can also be embedded in ISIS .cub files (:numref:`embedded_csm`). .. _csm_frame: The USGS CSM Frame sensor ~~~~~~~~~~~~~~~~~~~~~~~~~ The USGS CSM *Frame* sensor models a frame camera. All the pixels get acquired at the same time, unlike for pushbroom and pushframe cameras, which keep on acquiring image lines as they fly (those are considered later in the text). Hence, a single camera center and orientation is present. This model serves the same function as ASP's own Pinhole camera model (:numref:`pinholemodels`). :numref:`csm_frame_def` discusses the CSM Frame sensor in some detail, including the distortion model. In this example we will consider images acquired with the Dawn Framing Camera instrument, which took pictures of the Ceres and Vesta asteroids. This particular example will be for Vesta. Note that one more example of this sensor is shown in this documentation, in :numref:`dawn_isis`, which uses ISIS ``.cub`` camera models rather than CSM ones. This example is available for `download `_. Creating the input images ^^^^^^^^^^^^^^^^^^^^^^^^^ Fetch the data from PDS then extract it:: wget https://sbib.psi.edu/data/PDS-Vesta/Survey/img-1B/FC21B0004011_11224024300F1E.IMG.gz wget https://sbib.psi.edu/data/PDS-Vesta/Survey/img-1B/FC21B0004012_11224030401F1E.IMG.gz gunzip FC21B0004011_11224024300F1E.IMG.gz gunzip FC21B0004012_11224030401F1E.IMG.gz For simplicity of notation, we will rename these to ``left.IMG`` and ``right.IMG``. Set up the ISIS environment (:numref:`planetary_images`). These will need adjusting for your system:: export ISISROOT=$HOME/miniconda3/envs/isis export PATH=$ISISROOT/bin:$PATH export ISISDATA=$HOME/isisdata Create cub files and initialize the kernels:: dawnfc2isis from = left.IMG to = left.cub target = VESTA dawnfc2isis from = right.IMG to = right.cub target = VESTA spiceinit from = left.cub spiceinit from = right.cub The ``target`` field is likely no longer needed in newer versions of ISIS. .. _create_csm_dawn: Creation of CSM Frame camera files ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Set:: export ALESPICEROOT=$ISISDATA Run the ``isd_generate`` command to create the CSM camera files. This script is part of the ALE package, and should be shipped with the latest ISIS or ASP, if installed with conda. It can also be installed separately. :: isd_generate -k left.cub left.cub isd_generate -k right.cub right.cub This will create ``left.json`` and ``right.json``. See the `isd_generate manual `_. As a sanity check, run ``cam_test`` (:numref:`cam_test`) to see how well the CSM camera approximates the ISIS camera:: cam_test --image left.cub --cam1 left.cub --cam2 left.json cam_test --image right.cub --cam1 right.cub --cam2 right.json Note that for a handful of pixels these errors may be big. That is a known issue, and it seems to be due to the fact that a ray traced from the camera center towards the ground may miss the body of the asteroid. That should not result in inaccurate stereo results. Running stereo ^^^^^^^^^^^^^^ :: parallel_stereo --stereo-algorithm asp_mgm \ --left-image-crop-win 243 161 707 825 \ --right-image-crop-win 314 109 663 869 \ left.cub right.cub left.json right.json \ run/run See :numref:`nextsteps` for a discussion about various speed-vs-quality choices when running stereo. This is followed by creation of a DEM (:numref:`point2dem`) and products that can be visualized (:numref:`genhillshade`):: point2dem run/run-PC.tif --orthoimage run/run-L.tif hillshade run/run-DEM.tif colormap run/run-DEM.tif -s run/run-DEM_HILLSHADE.tif .. figure:: ../images/CSM_Frame.png :name: CSM_Frame_example The produced colorized DEM and orthoimage for the CSM Frame camera example. Likely using mapprojection (:numref:`mapproj-example`) may have reduced the number and size of the holes in the DEM. .. _csm_linescan: The USGS CSM linescan sensor ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this example we will use the Mars CTX linescan sensor. The images are regular ``.cub`` files as in the tutorial in :numref:`moc_tutorial`, hence the only distinction compared to that example is that the cameras are stored as ``.json`` files. We will work with the dataset pair:: J03_045994_1986_XN_18N282W.cub J03_046060_1986_XN_18N282W.cub which, for simplicity, we will rename to ``left.cub`` and ``right.cub`` and the same for the associated camera files. See :numref:`kaguya_tc` for another linescan example for the Kaguya linescan sensor for the Moon. .. _create_csm_linescan: Creation CSM linescan cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Note that this recipe looks a little different for Frame and SAR cameras, as can be seen in :numref:`create_csm_dawn` and :numref:`create_csm_sar`. Run the ISIS ``spiceinit`` command on the .cub files as:: spiceinit from = left.cub spiceinit from = right.cub Next, CSM cameras are created, with ``isd_generate``. This program is discussed in :numref:`create_csm_dawn`. *Note:* Currently shipped version of ``isd_generate`` (in ALE 1.0.2) has a bug, creating very large linescan camera models that are very slow to load. If this is noticed, consider putting `this fix `_ in the ``type_sensor.py`` file in the ALE package. Run:: isd_generate left.cub isd_generate right.cub This will produce ``left.json`` and ``right.json``. See the `isd_generate manual `_. Running stereo ^^^^^^^^^^^^^^ :: parallel_stereo --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ left.cub right.cub left.json right.json \ run/run Check the stereo convergence angle as printed during preprocessing (:numref:`stereo_pairs`). If that angle is small, the results are not going to be great. See :numref:`nextsteps` for a discussion about various stereo algorithms and speed-vs-quality choices. The fancier MGM algorithm could be used by running this example with ``--stereo-algorithm asp_mgm``. The actual stereo session used is ``csm``, and here it will be auto-detected based on the extension of the camera files. Next, a DEM is produced (:numref:`point2dem`):: point2dem -r mars --stereographic \ --proj-lon 77.4 --proj-lat 18.4 \ run/run-PC.tif For ``point2dem`` we chose to use a stereographic projection centered at some point in the area of interest. See :numref:`point2dem_proj` for how how a projection for the DEM can be auto-determined. One can also run ``parallel_stereo`` with mapprojected images (:numref:`mapproj-example`). The first step would be to create a low-resolution smooth DEM from the previous cloud:: point2dem -r mars \ --stereographic \ --proj-lon 77.4 --proj-lat 18.4 \ --tr 120 \ run/run-PC.tif \ -o run/run-smooth followed by mapprojecting onto it and redoing stereo:: mapproject --tr 6 run/run-smooth-DEM.tif left.cub \ left.json left.map.tif mapproject --tr 6 run/run-smooth-DEM.tif right.cub \ right.json right.map.tif parallel_stereo --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ left.map.tif right.map.tif left.json right.json \ run_map/run run/run-smooth-DEM.tif Notice how we used the same resolution for both images when mapprojecting. That helps making the resulting images more similar and reduces the processing time (:numref:`mapproj-res`). .. _csm_wac: CSM Pushframe sensor ~~~~~~~~~~~~~~~~~~~~ The USGS CSM *Pushframe* sensor models a pushframe camera. The support for this sensor is not fully mature, and some artifacts can be seen in the DEMs (per below). What follows is an illustration of using this sensor with Lunar Reconnaissance Orbiter (LRO) WAC images. This example, including the inputs, recipe, and produced terrain model `can be downloaded `_. Fetching the data ^^^^^^^^^^^^^^^^^ We will focus on the monochromatic images for this sensor. Visit: https://ode.rsl.wustl.edu/moon/indexproductsearch.aspx Find the *Lunar Reconnaissance Orbiter -> Experiment Data Record Wide Angle Camera - Mono (EDRWAM)* option. Search either based on a longitude-latitude window, or near a notable feature, such as a named crater. We choose a couple of images having the Tycho crater, with download links:: http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0002/DATA/MAP/2010035/WAC/M119923055ME.IMG http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0002/DATA/MAP/2010035/WAC/M119929852ME.IMG Fetch these with ``wget``. Creation of .cub files ^^^^^^^^^^^^^^^^^^^^^^ We broadly follow the tutorial at :cite:`ohman2015procedure`. For a dataset called ``image.IMG``, do:: lrowac2isis from = image.IMG to = image.cub This will create so-called *even* and *odd* datasets, with names like ``image.vis.even.cub`` and ``image.vis.odd.cub``. Run ``spiceinit`` on them to set up the SPICE kernels:: spiceinit from = image.vis.even.cub spiceinit from = image.vis.odd.cub followed by ``lrowaccal`` to adjust the image intensity:: lrowaccal from = image.vis.even.cub to = image.vis.even.cal.cub lrowaccal from = image.vis.odd.cub to = image.vis.odd.cal.cub All these .cub files can be visualized with ``stereo_gui``. It can be seen that instead of a single contiguous image we have a set of narrow horizontal framelets, with some of these in the even and some in the odd cub file. The framelets may also be recorded in reverse. Production of seamless mapprojected images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is not needed for stereo, but may be useful for readers who would like to produce image mosaics using ``cam2map``. :: cam2map from = image.vis.even.cal.cub to = image.vis.even.cal.map.cub cam2map from = image.vis.odd.cal.cub to = image.vis.odd.cal.map.cub \ map = image.vis.even.cal.map.cub matchmap = true Note how in the second ``cam2map`` call we used the ``map`` and ``matchmap`` arguments. This is to ensure that both of these output images have the same resolution and projection. In particular, if more datasets are present, it is suggested for all of them to use the same previously created .cub file as a map reference. That because stereo works a lot better on mapprojected images with the same ground resolution. For more details see :numref:`mapproj-example` and :numref:`mapproj_with_cam2map`. To verify that the obtained images have the same ground resolution, do:: gdalinfo image.vis.even.cal.map.cub | grep -i "pixel size" gdalinfo image.vis.odd.cal.map.cub | grep -i "pixel size" (see :numref:`gdal_tools` regarding this tool). The fusion happens as:: ls image.vis.even.cal.map.cub image.vis.odd.cal.map.cub > image.txt noseam fromlist = image.txt to = image.noseam.cub SAMPLES=73 LINES=73 The obtained file ``image.noseam.cub`` may still have some small artifacts but should be overall reasonably good. Stitching the raw even and odd images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This requires ISIS newer than version 6.0, or the latest development code. For each image in the stereo pair, stitch the even and odd datasets:: framestitch even = image.vis.even.cal.cub odd = image.vis.odd.cal.cub \ to = image.cub flip = true num_lines_overlap = 2 The ``flip`` flag is needed if the order of framelets is reversed relative to what the image is expected to show. The parameter ``num_lines_overlap`` is used to remove a total of this many lines from each framelet (half at the top and half at the bottom) before stitching, in order to deal with the fact that the even and odd framelets have a little overlap, and that they also tend to have artifacts due to some pixels flagged as invalid in each first and last framelet row. The CSM camera models will assume that this parameter is set at 2, so it should not be modified. Note however that WAC framelets may overlap by a little more than that, so resulting DEMs may have some artifacts at framelet borders, as can be seen further down. Creation of CSM WAC cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Set:: export ALESPICEROOT=$ISISDATA CSM cameras are created, with ``isd_generate``. This program is discussed in :numref:`create_csm_dawn`. Run:: isd_generate -k image.vis.even.cal.cub image.vis.even.cal.cub isd_generate -k image.vis.odd.cal.cub image.vis.odd.cal.cub These will create ``image.vis.even.cal.json`` and ``image.vis.odd.cal.json``. Do not use the stitched .cub file as that one lacks camera information. The obtained .json files can be renamed to follow the same convention as the stitched .cub images. Running stereo ^^^^^^^^^^^^^^ :: parallel_stereo --stereo-algorithm asp_mgm \ --left-image-crop-win 341 179 727 781 \ --right-image-crop-win 320 383 824 850 \ M119923055ME.cub M119929852ME.cub \ M119923055ME.json M119929852ME.json \ run/run As printed by ``stereo_pprc``, the convergence angle is about 27 degrees, which is a good number. See :numref:`nextsteps` for a discussion about various stereo speed-vs-quality choices. A DEM is produced with ``point2dem`` (:numref:`point2dem`), and other products are made for visualization (:numref:`manipulating_results`):: point2dem --stereographic --auto-proj-center \ run/run-PC.tif --orthoimage run/run-L.tif hillshade run/run-DEM.tif colormap run/run-DEM.tif -s run/run-DEM_HILLSHADE.tif .. figure:: ../images/CSM_WAC.png :name: CSM_WAC_example The produced colorized DEM and orthoimage for the CSM WAC camera example. The artifacts are due to issues stitching of even and odd framelets. It can be seen that the stereo DEM has some linear artifacts. That is due to the fact that the stitching does not perfectly integrate the framelets. An improved solution can be obtained by creating a low-resolution version of the above DEM, mapprojecting the images on it, and then re-running stereo, per (:numref:`mapproj-example`). :: point2dem --stereographic --auto-proj-center \ --tr 800 run/run-PC.tif --search-radius-factor 5 \ -o run/run-low-res mapproject --tr 80 run/run-low-res-DEM.tif \ M119923055ME.cub M119923055ME.json M119923055ME.map.tif mapproject --tr 80 run/run-low-res-DEM.tif \ M119929852ME.cub M119929852ME.json M119929852ME.map.tif parallel_stereo --stereo-algorithm asp_mgm \ M119923055ME.map.tif M119929852ME.map.tif \ M119923055ME.json M119929852ME.json \ run_map/run run/run-low-res-DEM.tif point2dem --stereographic --auto-proj-center \ run_map/run-PC.tif --orthoimage run_map/run-L.tif hillshade run_map/run-DEM.tif colormap run_map/run-DEM.tif -s run_map/run-DEM_HILLSHADE.tif To create the low-resolution DEM we used a grid size of 800 m, which is coarser by a factor of about 8 compared to the nominal WAC resolution of 100 / pixel. Note that the same resolution is used when mapprojecting both images; that is very important to avoid a large search range in stereo later. This is discussed in more detail in :numref:`mapproj-example`. .. figure:: ../images/CSM_WAC_mapproj.png :name: CSM_WAC_example_mapproj The produced colorized DEM and orthoimage for the CSM WAC camera example, when mapprojected images are used. As can be seen in the second figure, there are somewhat fewer artifacts. The missing lines in the DEM could be filled in if ``point2dem`` was run with ``--search-radius-factor 4``, for example. Given that there exists a wealth of WAC images, one could also try to get several more stereo pairs with similar illumination, run bundle adjustment for all of them (:numref:`bundle_adjust`), run pairwise stereo, create DEMs (at the same resolution), and then merge them with ``dem_mosaic`` (:numref:`dem_mosaic`). This may further attenuate the artifacts as each stereo pair will have them at different locations. See :numref:`stereo_pairs` for guidelines about how to choose good stereo pairs. .. _csm_minirf: The USGS CSM SAR sensor for LRO Mini-RF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This page describes processing data produced with the *Mini-RF* Synthetic Aperture Radar (SAR) sensor on the LRO spacecraft while making use of CSM cameras. A SAR example for Earth is in :numref:`umbra_sar`. It is challenging to process its data with ASP for several reasons: - The synthetic image formation model produces curved rays going from the ground to the pixel in the camera (:cite:`kirk2016semi`). To simplify the calculations, ASP finds where a ray emanating from the camera intersects the standard Moon ellipsoid with radius 1737.4 km and declares the ray to be a straight line from the camera center to this point. - This sensor very rarely acquires stereo pairs. The convergence angle (:numref:`stereo_pairs`) as printed by ``parallel_stereo`` in pre-processing is usually less than 5 degrees, which is little and results in noisy DEMs. In this example we will use a dataset intentionally created with stereo in mind. The images will cover a part of Jackson crater (:cite:`kirk2011radargrammetric`). - It is not clear if all modeling issues with this sensor were resolved. The above publication states that "Comparison of the stereo DTM with ~250 m/post LOLA grid data revealed (in addition to dramatically greater detail) a very smooth discrepancy that varied almost quadratically with latitude and had a peak-to-peak amplitude of nearly 4000 m." - The images are dark and have unusual appearance, which requires some pre-processing and a large amount of interest points. Hence, ASP's support for this sensor is experimental. The results are plausible but likely not fully rigorous. This example, including input images, produced outputs, and a recipe, is available for download at: https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples No ISIS data are needed to run it. Creating the input images ^^^^^^^^^^^^^^^^^^^^^^^^^ Fetch the data from PDS:: 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 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 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 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 These will be renamed to ``left.img``, ``right.img``, etc., to simply the processing. Set, per :numref:`planetary_images`, values for ``ISISROOT`` and ``ISISDATA``. Run:: mrf2isis from = left.lbl to = left.cub mrf2isis from = right.lbl to = right.cub Run ``spiceinit``. Setting the shape to the ellipsoid makes it easier to do image-to-ground computations:: spiceinit from = left.cub shape = ellipsoid spiceinit from = right.cub shape = ellipsoid .. _create_csm_sar: Creation of CSM SAR cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Set:: export ALESPICEROOT=$ISISDATA CSM cameras are created, with ``isd_generate``. This program is discussed in :numref:`create_csm_dawn`. Run:: isd_generate -k left.cub left.cub isd_generate -k right.cub right.cub This will create the CSM camera file ``left.json`` and ``right.json``. Run ``cam_test`` (:numref:`cam_test`) as a sanity check:: cam_test --image left.cub --cam1 left.cub --cam2 left.json cam_test --image right.cub --cam1 right.cub --cam2 right.json Preparing the images ^^^^^^^^^^^^^^^^^^^^ ASP accepts only single-band images, while these .cub files have four of them. We will pull the first band and clamp it to make it easier for stereo to find interest point matches:: gdal_translate -b 1 left.cub left_b1.tif gdal_translate -b 1 right.cub right_b1.tif image_calc -c "min(var_0, 0.5)" left_b1.tif -d float32 \ -o left_b1_clamp.tif image_calc -c "min(var_0, 0.5)" right_b1.tif -d float32 \ -o right_b1_clamp.tif Running stereo ^^^^^^^^^^^^^^ It is simpler to first run a clip with ``stereo_gui`` (:numref:`stereo_gui`). This will result in the following command:: parallel_stereo --ip-per-tile 3500 \ --left-image-crop-win 0 3531 3716 10699 \ --right-image-crop-win -513 22764 3350 10783 \ --stereo-algorithm asp_mgm --min-num-ip 10 \ left_b1_clamp.tif right_b1_clamp.tif \ left.json right.json run/run The stereo convergence angle for this pair is 18.4 degrees which is rather decent. Create a colorized DEM and orthoimage (:numref:`point2dem`):: point2dem run/run-PC.tif --orthoimage run/run-L.tif hillshade run/run-DEM.tif colormap run/run-DEM.tif -s run/run-DEM_HILLSHADE.tif See :numref:`nextsteps` for a discussion about various speed-vs-quality choices when running stereo. .. figure:: ../images/CSM_MiniRF.png :name: CSM_miniRF_example The produced colorized DEM and orthoimage for the CSM SAR example. .. _csm_msl: CSM cameras for MSL ~~~~~~~~~~~~~~~~~~~ This example shows how, given a set of Mars Science Laboratory (MSL) Curiosity rover ``Nav`` or ``Mast`` camera images, CSM camera models can be created. Stereo pairs are then used (with either ``Nav`` or ``Mast`` data) to make DEMs and orthoimages. After recent fixes in ALE (details below), the camera models are accurate enough that stereo pairs acquired at different rover locations and across different days result in consistent DEMs and orthoimages. See :numref:`rig_msl` for a Structure-from-Motion solution without using CSM cameras. That one results in self-consistent meshes that, unlike the DEMs produced here, are not geolocated. Illustration ^^^^^^^^^^^^ .. figure:: ../images/MSL_Kimberly_images.png :name: csm_msl_figure1 :alt: MSL Kimberly images Four out of the 10 images (5 stereo pairs) used in this example. .. figure:: ../images/MSL_Kimberly_DEM_DRG.png :name: csm_msl_figure2 :alt: MSL Kimberly DEM and ortho Produced DEM and orthoimage. See :numref:`csm_msl_multiday` for a larger example. Fetch the images and metadata from PDS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ See :numref:`msl_image_prep`. Here we will work with .cub files rather than converting them to .png. The same Mars day will be used as there (SOL 597). The datasets for SOL 603 were verified to work as well. The dataset used in this example (having .LBL, .cub, and .json files) is available `for download `_. It is suggested to recreate the .json files in that dataset as done below. Download the SPICE data ^^^^^^^^^^^^^^^^^^^^^^^ Fetch the SPICE kernels for MSL (see :numref:`planetary_images` and the links from there). .. _csm_msl_create: Creation of CSM MSL cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Set:: export ALESPICEROOT=$ISISDATA A full-resolution MSL left ``Nav`` image uses the naming convention:: NLB__F.cub with the right image starting instead with ``NRB``. The metadata files downloaded from PDS end with ``.LBL``. A bug in the shipped metakernels requires editing the file:: $ISISDATA/msl/kernels/mk/msl_v01.tm and replacing:: /usgs/cpkgs/isis3/data with your value of $ISISDATA. Ensure that the resulting path still ends with ``/msl/kernels``. CSM cameras are created, with ``isd_generate``. This program is discussed in :numref:`create_csm_dawn`. Run:: isd_generate image.LBL This will produce the file ``image.json``. If running into issues, invoke this command with the ``-v`` option to see where it fails. Simple stereo example ^^^^^^^^^^^^^^^^^^^^^ In this example the camera orientations are not refined using bundle adjustment, as the camera poses are reasonably good. If desired to do that, one could run ``bundle_adjust`` (:numref:`bundle_adjust`) as:: bundle_adjust --no-datum --camera-weight 0 --tri-weight 0.1 \ data/*.cub data/*.json -o ba/run Here and below we use the option ``--no-datum`` as these are ground-level cameras, when rays emanating from them may not reliably intersect the planet datum. For each stereo pair, run ``parallel_stereo`` (:numref:`parallel_stereo`) as:: parallel_stereo \ --stereo-algorithm asp_mgm \ --subpixel-mode 3 --no-datum \ --min-triangulation-angle 1.5 \ left.cub right.cub \ left.json right.json \ run/run If bundle adjustment was used, the above command should be run with the option ``--bundle-adjust-prefix ba/run``. The option ``--min-triangulation-angle 1.5`` is highly essential. It filters out far-away and noisy points. Increasing this will remove more points. For terrains with a lot of shadows (such as for the Moon), also consider using the option ``--no-data-value`` to filter out pixels with low intensity (:numref:`stereodefault`). This is followed by DEM and orthoimage creation (:numref:`point2dem`) with:: point2dem --stereographic \ --proj-lon 137.402 --proj-lat -4.638 \ --search-radius-factor 5 --orthoimage \ run/run-PC.tif run/run-L.tif Here, the option ``--search-radius-factor 5`` is used to fill the point cloud when moving further from the rover. A local stereographic projection was used. The produced DEMs can be mosaicked together with ``dem_mosaic`` (:numref:`dem_mosaic`) as:: dem_mosaic */*DEM.tif -o dem_mosaic.tif For the orthoimages, one can use:: dem_mosaic --first */*DRG.tif -o ortho_mosaic.tif The option ``--first`` picks the first encountered image pixel at each location, rather than blending them together which may blur the output mosaic. See an illustration in :numref:`csm_msl_figure2`, with the input images in :numref:`csm_msl_figure1`. .. _csm_msl_multiday: Multi-day stereo ^^^^^^^^^^^^^^^^ .. figure:: ../images/msl_multiday.png :name: msl_multiday :alt: MSL multiday stereo A combined DEM and orthoimage produced from 15 stereo pairs from SOL 597 and 13 stereo pairs from SOL 603. The misregistration half-way down is not due to mismatch across days but because of insufficient overlap between two image subsets on SOL 603. Here, blue and red correspond to elevations of -5038.921 and -5034.866 meters. In this example we take advantage of the fact that there is decent overlap between images acquired on SOL 597 and SOL 603. They both image the same hill, called *Kimberly*, in Gale crater, from somewhat different perspectives. Hence we combine these datasets to increase the coverage. Good overlap between different days, or even between consecutive rover stops in the same day, is not guaranteed. Sometimes the low-resolution nav cam images (:numref:`low_res_msl`) can help with increasing the overlap and coverage. Lack of good overlap can result in registration errors, as can be seen in :numref:`msl_multiday`. For a larger and better-behaved dataset it is suggested to consider the images from SOL 3551 to 3560. Some effort may be needed to select a good subset. A workflow can be follows. First, individual DEMs were created and mosaicked, as in :numref:`csm_msl`. The quality of the produced DEM can be quite uneven, especially far from the camera. Large holes in the initial DEM were filled in with the ``dem_mosaic`` option ``--fill-search-radius`` (:numref:`dem_mosaic_extrapolate`). Then, it can be made coarser, for example, as:: gdalwarp -r cubic -tr 0.1 0.1 input.tif output.tif (This assumes the projection is local stereographic.) This DEM was then blurred a few times with ``dem_mosaic`` option ``--dem-blur-sigma 10``. This should be repeated until the DEM is smooth enough and shows no artifacts. The resulting DEM is called ``dem.tif``. All images were mapprojected onto this DEM using the same local stereographic projection, and a resolution of 0.01 m:: 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" mapproject --tr 0.01 --t_srs "$proj" \ dem.tif image.cub image.json image.map.tif Bundle adjustment was run on the desired set of input images and cameras, while making use of the mapprojected images to find matches:: dem=dem.tif parallel_bundle_adjust \ --image-list images.txt \ --camera-list cameras.txt \ --mapprojected-data-list map_images.txt \ --camera-weight 0 \ --heights-from-dem $dem \ --heights-from-dem-uncertainty 10.0 \ --heights-from-dem-robust-threshold 0.1 \ --auto-overlap-params "$dem 15" \ -o ba/run In retrospect, this mapprojection step may be not necessary, and one could run bundle adjustment with original images. Then ``parallel_stereo`` was run with mapprojected images, with the option ``--bundle-adjust-prefix ba/run``, to use the bundle-adjusted cameras:: parallel_stereo \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --max-disp-spread 80 \ --min-triangulation-angle 1.5 \ --bundle-adjust-prefix ba/run \ left.map.tif right.map.tif \ left.json right.json run_map/run \ $dem point2dem --tr 0.01 --stereographic \ --proj-lon 137.402 --proj-lat -4.638 \ --errorimage \ run_map/run-PC.tif \ --orthoimage run_map/run-L.tif Each run must use a separate output prefix, instead of ``run_map/run``. Here, the option ``--min-triangulation-angle 1.5`` was highly essential. It filters out far-away and noisy points. Even with this option, the accuracy of a DEM goes down far from the cameras. Artifacts can arise where the same region is seen from two different locations, and it is far from either. In this particular example some problematic portions were cut out with ``gdal_rasterize`` (:numref:`gdal_rasterize_example`). The produced DEMs were inspected, and the best ones were mosaicked together with ``dem_mosaic``, as follows:: dem_mosaic --weights-exponent 0.5 */*DEM.tif -o dem_mosaic.tif The option ``--weights-exponent 0.5`` reduced the artifacts in blending. The orthoimages were mosaicked with:: dem_mosaic --first */*DRG.tif -o ortho_mosaic.tif It is suggested to sort the input images for this call from best to worst in terms of quality. In particular, the images where the rover looks down rather towards the horizon should be earlier in the list. See the produced DEM and orthoimage in :numref:`msl_multiday`. Mapprojection ^^^^^^^^^^^^^ The input .cub image files and the camera .json files can be used to create mapprojected images with the ``mapproject`` program (:numref:`mapproject`). The DEM for mapprojection can be the one created earlier with ``point2dem``. If a third-party DEM is used, one has to make sure its elevations are consistent with the DEMs produced earlier. Use the option ``--t_projwin`` to prevent the produced images from extending for a very long distance towards the horizon. MSL Mast cameras ^^^^^^^^^^^^^^^^ The same procedure works for creating MSL Mast cameras. To run stereo, first use ``gdal_translate -b 1`` to pull the first band from the input images. This workflow was tested with the stereo pair ``0706ML0029980010304577C00_DRCL`` and ``0706MR0029980000402464C00_DRCL`` for SOL 706. .. _low_res_msl: Low-resolution MSL Nav cam images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In addition to full-resolution Nav camera images (1024 pixels), MSL also acquires low-resolution Nav images (256 pixels) at separate times. These have the string ``_D`` as part of their name, instead of ``_F``. Such images were validated to work, and can produce good DEMs that can plug some gaps in coverage. .. _csm_state: CSM model state ~~~~~~~~~~~~~~~ CSM cameras are stored in JSON files, in one of the following two formats: * *ISD*: This has the transforms from sensor coordinates to J2000, and from J2000 to ECEF. * *Model state*: In this file the above-mentioned transforms are combined, and other information is condensed or removed. The model state files have all the data needed to project ground points into the camera and vice-versa, so they are sufficient for any use in ASP. The model state can also be embedded in ISIS cubes (:numref:`embedded_csm`). The `usgscsm_cam_test `_ program (shipped with ASP) can read any of these and write back a model state. ASP's bundle adjustment program (:numref:`bundle_adjust`) normally writes plain text ``.adjust`` files that encode how the position and orientation of the cameras were modified (:numref:`adjust_files`). If invoked for CSM cameras, additional files with extension ``.adjusted_state.json`` are saved in the same output directory, which contain the model state from the input CSM cameras with the optimization adjustments applied to them. Use zero iterations in ``bundle_adjust`` to save the states of the original cameras. This functionality is implemented for all USGS CSM sensors, so, for ``frame``, ``linescan``, ``pushframe``, and ``SAR`` models. The ``cam_gen`` program can convert several linescan camera model types to CSM model state (:numref:`cam_gen_linescan`). It can also approximate some Pinhole, RPC, or other cameras with CSM frame cameras in model state format (:numref:`cam_gen_frame`). ASP's ``parallel_stereo`` and bundle adjustment programs can, in addition to CSM ISD camera model files, also load such model state files, either as previously written by ASP or from an external source (it will auto-detect the type from the format of the JSON files). Hence, the model state is a convenient format for data exchange, while being less complex than the ISD format. If ``parallel_stereo`` is used to create a point cloud from images and CSM cameras, and then that point cloud has a transform applied to it, such as with ``pc_align``, the same transform can be applied to the model states for the cameras using ``bundle_adjust`` (:numref:`ba_pc_align`). To evaluate how well the obtained CSM camera approximates the ISIS camera model, run the program ``cam_test`` shipped with ASP (:numref:`cam_test`) as follows:: cam_test --sample-rate 100 --image camera.cub \ --cam1 camera.cub --cam2 camera.json The pixel errors are expected to be at most on the order of 0.2 pixels. .. _embedded_csm: CSM state embedded in ISIS cubes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ASP usually expects CSM cameras to be specified in JSON files. It also accepts CSM camera model state data (:numref:`csm_state`) embedded in ISIS cubes, if all of the following (reasonable) assumptions are satisfied: * JSON files are not passed in. * The ISIS cubes contain CSM model state data (in the ``CSMState`` group). * The ``--session-type`` (or ``--t``) option value is not set to ``isis`` (or ``isismapisis``). So, its value should be either ``csm`` (or ``csmmapcsm``), or left blank. Hence, if no CSM data is provided, either in the ISIS cubes or separately in JSON files, or ``--session-type`` is set to ``isis`` (or ``isismapisis``), ASP will use the ISIS camera models. The above applies to all ASP tools that read CSM cameras (``parallel_stereo``, ``bundle_adjust``, ``jitter_solve``, ``mapproject``, ``cam_test``). If ``bundle_adjust`` (:numref:`bundle_adjust`) or ``jitter_solve`` (:numref:`jitter_solve`) is run with CSM cameras, either embedded in ISIS cubes or specified separately, and the flag ``--update-isis-cubes-with-csm-state`` is set, then the optimized model states will be saved back to the ISIS cubes, while the SPICE and other obsolete information from the cubes will be deleted. (Note that `spiceinit `_ can restore the cubes.) Separate model state files in the JSON format will be saved by ``bundle_adjust`` as well, as done without this option. Note that if images are mapprojected with certain camera files, and then those camera files are updated in-place, this will result in wrong results if stereo is run with the old mapprojected images and updated cameras. The `csminit `_ program can also embed a .json model state file into a .cub file (in ISIS 9.0.0 and later). Example:: csminit from = img.cub state = csm.json ================================================ FILE: docs/examples/ctx.rst ================================================ .. _ctx_example: Mars Reconnaissance Orbiter CTX ------------------------------- Overview ~~~~~~~~ CTX is a moderately difficult camera to work with. The processing time can be pretty long when using the Bayes EM subpixel refinement (``subpixel-mode 2``). Otherwise the disparity between images is relatively small, allowing efficient computation and a reasonable processing time. In this example we use mapprojected images, which is the most reliable way to align the images for correlation. Mapprojection is discussed in :numref:`mapproj_with_cam2map` and :numref:`mapproj-example`. Note that mapprojection can slow down the triangulation step, but given that ``parallel_stereo`` performs the triangulation using multiple processes, that is not a concern. This example's recipe is is in the ``examples/CTX`` directory shipped with ASP (type 'make' there to run it). .. figure:: ../images/examples/ctx/n_terra_meridiani_ctx_combined.png :name: ctx_example_fig Example output possible with the CTX imager aboard MRO. The images are for the North Terra Meridiani region. Download ~~~~~~~~ Download the CTX images P02_001981_1823_XI_02N356W.IMG and P03_002258_1817_XI_01N356W.IMG from PDS, at: https://ode.rsl.wustl.edu/mars/indexproductsearch.aspx The download commands are:: wget https://planetarydata.jpl.nasa.gov/img/data/mro/ctx/mrox_0031/data/P02_001981_1823_XI_02N356W.IMG wget https://planetarydata.jpl.nasa.gov/img/data/mro/ctx/mrox_0042/data/P03_002258_1817_XI_01N356W.IMG Creation of cub files ~~~~~~~~~~~~~~~~~~~~~ Install ISIS (:numref:`planetary_images`). Convert the .IMG files to ISIS .cub files, initialize the metadata (SPICE), and calibrate:: ISIS> mroctx2isis from = P02_001981_1823_XI_02N356W.IMG \ to = P02_001981_1823.cub ISIS> mroctx2isis from = P03_002258_1817_XI_01N356W.IMG \ to = P03_002258_1817.cub ISIS> spiceinit from = P02_001981_1823.cub web = true ISIS> spiceinit from = P03_002258_1817.cub web = true ISIS> ctxcal from = P02_001981_1823.cub to = P02_001981_1823.cal.cub ISIS> ctxcal from = P03_002258_1817.cub to = P03_002258_1817.cal.cub Optionally run ``ctxevenodd`` on the ``cal.cub`` files. The `spiceinit `_ command initializes the cub file metadata. The option ``web = true`` fetches the needed data on-the-fly. If it does not work, it is necessary to download this data manually, from the ``mro`` directory of the `ISIS data area `_. Running stereo ~~~~~~~~~~~~~~ Run ``parallel_stereo`` (:numref:`parallel_stereo`) and ``point2dem`` (:numref:`point2dem`):: cam2map4stereo.py P02_001981_1823.cal.cub P03_002258_1817.cal.cub parallel_stereo \ --stereo-algorithm asp_mgm --subpixel-mode 9 \ P02_001981_1823.map.cub P03_002258_1817.map.cub \ results/out point2dem -r mars --stereographic --auto-proj-center \ results/out-PC.tif Higher quality results can be obtained by using the ``aspm_mgm`` algorithm and mapprojection (:numref:`nextsteps`). It is recommended to bundle-adjust the CTX cameras before stereo (:numref:`bundle_adjustment`). Then the ``cam2map4stereo.py`` script cannot be used, but mapprojection can be done with ``mapproject`` (:numref:`mapproj-example`). Further processing ~~~~~~~~~~~~~~~~~~ It is strongly suggested to use CSM camera models for improved performance (:numref:`csm`). See :numref:`create_csm_linescan` for how to create CSM camera models for linescan cameras, including for CTX. CTX cameras can exhibit jitter. How to correct it is discussed in :numref:`jitter_ctx`. Shape-from-Shading with CTX images is illustrated in :numref:`sfs_ctx`. Automated Processing of HiRISE and CTX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ While he was at the University of Chicago, David Mayer developed a set of scripts for automating Stereo Pipeline for CTX and HiRISE images. Those scripts and more information can now be found at https://github.com/USGS-Astrogeology/asp_scripts. ================================================ FILE: docs/examples/dawn.rst ================================================ .. _dawn_isis: Dawn (FC) Framing Camera ------------------------ This is a NASA mission to visit two of the largest objects in the asteroid belt, Vesta and Ceres. The framing camera on board Dawn is quite small and packs only a resolution of 1024x1024 pixels. This means processing time is extremely short. To its benefit, it seems that the mission planners leave the framing camera on taking shots quite rapidly. On a single pass, they seem to usually take a chain of FC images that have a high overlap percentage. This opens the idea of using ASP to process not only the sequential pairs, but also the wider baseline shots. Then someone could potentially average all the DEMs together to create a more robust data product. For this example, we used the images FC21A0010191_11286212239F1T and FC21A0010192_11286212639F1T which show the Cornelia crater on Vesta. We learned about them from the anaglyph shown on the Planetary Science Blog :cite:`planetaryblog:vesta`. A different example (using CSM cameras) is in :numref:`csm_frame`. .. figure:: ../images/examples/dawn/Vesta_figure.png :name: dawn-nomap-example Example colorized height map and ortho image output. Commands ~~~~~~~~ First you must download and unzip the Dawn FC images from PDS from https://sbib.psi.edu/data/PDS-Vesta/pds-vesta.html:: wget https://sbib.psi.edu/data/PDS-Vesta/HAMO/img-1A/FC21A0010191_11286212239F1T.IMG.gz wget https://sbib.psi.edu/data/PDS-Vesta/HAMO/img-1A/FC21A0010192_11286212639F1T.IMG.gz gunzip FC21A0010191_11286212239F1T.IMG.gz gunzip FC21A0010192_11286212639F1T.IMG.gz Then, these are converted to ISIS .cub files and ``parallel_stereo`` is run:: dawnfc2isis from=FC21A0010191_11286212239F1T.IMG \ to=FC21A0010191_11286212239F1T.cub target=VESTA dawnfc2isis from=FC21A0010192_11286212639F1T.IMG \ to=FC21A0010192_11286212639F1T.cub target=VESTA spiceinit from=FC21A0010191_11286212239F1T.cub spiceinit from=FC21A0010192_11286212639F1T.cub parallel_stereo FC21A0010191_11286212239F1T.cub \ FC21A0010192_11286212639F1T.cub stereo/stereo A DEM is then created with ``point2dem`` (:numref:`point2dem`):: point2dem stereo-PC.tif --orthoimage stereo-L.tif \ --t_srs "+proj=eqc +lat_ts=-11.5 +a=280000 +b=229000 +units=m" The option ``target=VESTA`` is necessary with ISIS version 5, and is likely not needed in later versions. See :numref:`nextsteps` for a discussion about various speed-vs-quality choices when it comes to stereo algorithms. ================================================ FILE: docs/examples/dg.rst ================================================ .. _digital_globe_example: DigitalGlobe ------------ Processing of DigitalGlobe/Maxar images is described extensively in the tutorial in :numref:`dg_tutorial`. See :numref:`rpc` for how to process DigitalGlobe/Maxar data if using the RPC model instead of the exact linescan one. See :numref:`examples` for other examples. ================================================ FILE: docs/examples/hirise.rst ================================================ .. _hirise_example: Mars Reconnaissance Orbiter HiRISE ---------------------------------- HiRISE is one of the most challenging cameras to use when making 3D models because HiRISE exposures can be several gigabytes each. Working with this data requires patience as it will take time. One important fact to know about HiRISE is that it is composed of multiple linear CCDs that are arranged side by side with some vertical offsets. These offsets mean that the CCDs will view some of the same terrain but at a slightly different time and a slightly different angle. Mosaicking the CCDs together to a single image is not a simple process and involves living with some imperfections. One cannot simply use the HiRISE RDR products, as they do not have the required geometric stability. Instead, the HiRISE EDR products must be assembled using ISIS ``noproj``. The USGS distributes a script in use by the HiRISE team that works forward from the team-produced 'balance' cubes, which provides a de-jittered, noproj'ed mosaic of a single observation, which is perfectly suitable for use by the Stereo Pipeline (this script was originally engineered to provide input for SOCET SET). However, the 'balance' cubes are not available to the general public, and so we include a program (``hiedr2mosaic.py`` (:numref:`hiedr2mosaic`), written in Python, that will take PDS available HiRISE EDR products and walk through the processing steps required to provide good input images for ``parallel_stereo``. The program takes all the red CCDs and projects them using the ISIS ``noproj`` command into the perspective of the RED5 CCD. From there, ``hijitreg`` is performed to work out the relative offsets between CCDs. Finally the CCDs are mosaicked together using the average offset listed from ``hijitreg`` using the ``handmos`` command, and the mosaic is normalized with ``cubenorm``. Below is an outline of the processing. :: hi2isis # Import HiRISE IMG to Isis hical # Calibrate histitch # Assemble whole-CCD images from the channels spiceinit spicefit # For good measure noproj # Project all images into perspective of RED5 hijitreg # Work out alignment between CCDs handmos # Mosaic to single file cubenorm # Normalize the mosaic To use our script, first download a set of HiRISE data. Here is an example, using wget to fetch all RED CCDs for a dataset and process them. :: wget -r -l1 -np \ "http://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_029400_029499/ESP_029421_2300/" \ -A "*RED*IMG" Alternately, you can pass the ``--download-folder`` option to ``hiedr2mosaic.py`` and pass in the URL of the web page containing the EDR files as the only positional argument. This will cause the tool to first download all of the RED CCD images to the specified folder and then continue with processing. :: hiedr2mosaic.py --download-folder hirise_example/ \ http://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_029400_029499/ESP_029421_2300/ Assuming you downloaded the files manually, go to the directory containing the files. You can run the ``hiedr2mosaic.py`` program without any arguments to view a short help statement, with the ``-h`` option to view a longer help statement, or just run the program on the EDR files like so:: hiedr2mosaic.py *.IMG If you have more than one observation's worth of EDRs in that directory, then limit the program to just one observation's EDRs at a time, e.g. ``hiedr2mosaic.py PSP_001513_1655*IMG``. If you run into problems, try using the ``-k`` option to retain all of the intermediary image files to help track down the issue. The ``hiedr2mosaic.py`` program will create a single mosaic file with the extension ``.mos_hijitreged.norm.cub``. Be warned that the operations carried out by ``hiedr2mosaic.py`` can take many hours to complete on the very large HiRISE images. If you get any errors, make sure you have ISIS and its data installed, and the environmental variable ``ISISDATA`` is set (:numref:`planetary_images`). An example of using ASP with HiRISE data is included in the ``examples/HiRISE`` directory (just type 'make' there). The dataset ~~~~~~~~~~~ HiRISE observations `PSP_001513_1655 `_ and `PSP_001777_1650 `_ are on the floor of Gusev Crater and cover the area where the MER Spirit landed and has roved, including the Columbia Hills. .. figure:: ../images/examples/hirise/chills_hirise_combined.png :name: hirise_chills_example Example output using HiRISE images PSP_001513_1655 and PSP_001777_1650 of the Columbia Hills. Commands ~~~~~~~~ Download all 20 of the RED EDR ``.IMG`` files for each observation:: wget -r -l1 -np \ "http://hirise-pds.lpl.arizona.edu/PDS/EDR/PSP/ORB_001500_001599/PSP_001513_1655/" \ -A "*RED*IMG" wget -r -l1 -np \ "http://hirise-pds.lpl.arizona.edu/PDS/EDR/PSP/ORB_001700_001799/PSP_001777_1650/" \ -A "*RED*IMG" Then process:: ISIS> hiedr2mosaic.py PSP_001513_1655_RED*.IMG ISIS> hiedr2mosaic.py PSP_001777_1650_RED*.IMG ISIS> cam2map4stereo.py PSP_001777_1650_RED.mos_hijitreged.norm.cub \ PSP_001513_1655_RED.mos_hijitreged.norm.cub ISIS> parallel_stereo PSP_001513_1655.map.cub \ PSP_001777_1650.map.cub result/output See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. The ``corr-kernel`` value can usually be safely reduced to 21 pixels to resolve finer detail and faster processing for images with good contrast. ================================================ FILE: docs/examples/historical.rst ================================================ .. _kh4: Declassified satellite images: KH-4B ------------------------------------ ASP has preliminary support for the declassified high-resolution CORONA KH-4B images. *This support is very experimental, and likely a lot of work is needed to make it work reliably.* For the latest suggested processing workflow, in the context of KH-9 images, see :numref:`kh9`. These images can be processed using either optical bar (panoramic) camera models or as pinhole camera models with RPC distortion. Most of the steps are similar to the example in :numref:`skysat-example`. The optical bar camera model is based on :cite:`schenk2003rigorous` and :cite:`sohn2004mathematical`, whose format is described in :numref:`panoramic`. For KH-9 images, the Improvements suggested in :cite:`ghuffar2022pipeline` are incorporated (:numref:`ghuffar_method`). Fetching the data ~~~~~~~~~~~~~~~~~ KH-4B images are available via the USGS Earth Explorer, at https://earthexplorer.usgs.gov/ (an account is required to download the data). We will work with the KH-4B image pair:: DS1105-2248DF076 DS1105-2248DA082 To get these from Earth Explorer, click on the ``Data Sets`` tab and select the three types of declassified data available, then in the ``Additional Criteria`` tab choose ``Declass 1``, and in the ``Entity ID`` field in that tab paste the above frames (if no results are returned, one can attempt switching above to ``Declass 2``, etc). Clicking on the ``Results`` tab presents the user with information about these frames. Clicking on ``Show Metadata and Browse`` for every image will pop-up a table with meta-information. That one can be pasted into a text file, named for example, ``DS1105-2248DF076.txt`` for the first image, from which later the longitude and latitude of each image corner will be parsed. Then one can click on ``Download Options`` to download the data. .. _resizing_images: Resizing the images ~~~~~~~~~~~~~~~~~~~ Sometimes the input images can be so large, that either the ASP tools or the auxiliary ImageMagick ``convert`` program will fail, or the machine will run out of memory. It is suggested to resize the images to a more manageable size, at least for initial processing. This is easiest to do by opening the images in ``stereo_gui`` (:numref:`stereo_gui`), which will create a pyramid of subsampled ("sub") images at 1/2 the full resolution, then 1/4th, etc. This resampling is done using local averaging, to avoid aliasing effects. Alternatively, one can call ``gdal_translate`` (:numref:`gdal_tools`), such as:: gdal_translate -outsize 25% 25% -r average input.tif output.tif This will reduce the image size by a factor of 4. The ``-r average`` option will, as before, help avoid aliasing. A camera model (pinhole or optical bar) created at one resolution can be converted to another resolution by adjusting the ``pitch`` parameter (a higher value of pitch means bigger pixels so lower resolution). For optical bar cameras the image dimensions and image center need to be adjusted as well, as those are in units of pixels. Stitching the images ~~~~~~~~~~~~~~~~~~~~ Each downloaded image will be made up of 2-4 portions, presumably due to the limitations of the scanning equipment. They can be stitched together using ASP's ``image_mosaic`` tool (:numref:`image_mosaic`). For some reason, the KH-4B images are scanned in an unusual order. To mosaic them, the last image must be placed first, the next to last should be second, etc. In addition, as seen from the tables of metadata discussed earlier, some images correspond to the ``Aft`` camera type. Those should be rotated 180 degrees after mosaicking, hence below we use the ``--rotate`` flag for that one. The overlap width is manually determined by looking at two of the sub images in ``stereo_gui``. With this in mind, image mosaicking for these two images will happen as follows:: image_mosaic DS1105-2248DF076_d.tif DS1105-2248DF076_c.tif \ DS1105-2248DF076_b.tif DS1105-2248DF076_a.tif \ -o DS1105-2248DF076.tif \ --ot byte --overlap-width 7000 --blend-radius 2000 image_mosaic DS1105-2248DA082_d.tif DS1105-2248DA082_c.tif \ DS1105-2248DA082_b.tif DS1105-2248DA082_a.tif \ -o DS1105-2248DA082.tif \ --ot byte --overlap-width 7000 --blend-radius 2000 \ --rotate In order to process with the optical bar camera model these images need to be cropped to remove the most of empty area around the image. The four corners of the valid image area can be manually found by clicking on the corners in ``stereo_gui``. Note that for some input images it can be unclear where the proper location for the corner is due to edge artifacts in the film. Do your best to select the image corners such that obvious artifacts are kept out and all reasonable image sections are kept in. ASP provides a simple Python tool called ``historical_helper.py`` to rotate the image so that the top edge is horizontal while also cropping the boundaries. This tool requires installing the ImageMagick software. See :numref:`historical_helper` for more details. Pass in the corner coordinates as shown below in the order top-left, top-right, bot-right, bot-left (column then row). This is also a good opportunity to simplify the file names going forwards. :: historical_helper.py rotate-crop \ --interest-points '4523 1506 114956 1450 114956 9355 4453 9408' \ --input-path DS1105-2248DA082.tif \ --output-path aft.tif historical_helper.py rotate-crop \ --interest-points '6335 1093 115555 1315 115536 9205 6265 8992' \ --input-path DS1105-2248DF076.tif \ --output-path for.tif See :numref:`resizing_images` if these steps failed, as perhaps the images were too large. Fetching a ground truth DEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~ To create initial cameras to use with these images, and to later refine and validate the terrain model made from them, we will need a ground truth source. Several good sets of DEMs exist, including SRTM, ASTER, and TanDEM-X (:numref:`initial_terrain`). Here we will work with SRTM, which provides DEMs with a 30-meter grid size. The bounds of the region of interest are inferred from the tables with meta-information from above. The SRTM DEM must be adjusted to be relative to the WGS84 datum, as discussed in :numref:`conv_to_ellipsoid`. The visualization of all images and DEMs can be done in ``stereo_gui``. Creating camera files ~~~~~~~~~~~~~~~~~~~~~ ASP provides the tool named ``cam_gen`` (:numref:`cam_gen`) that, based on a camera's intrinsics and the positions of the image corners on Earth's surface will create initial camera models that will be the starting point for aligning the cameras. To create optical bar camera models, an example camera model file is needed. This needs to contain all of the expected values for the camera, though image_size, image_center, iC, and IR can be any value since they will be recalculated. The pitch is determined by the resolution of the scanner used, which is seven microns. The other values are determined by looking at available information about the satellite. For the first image (DS1105-2248DF076) the following values were used:: VERSION_4 OPTICAL_BAR image_size = 13656 1033 image_center = 6828 517 pitch = 7.0e-06 f = 0.61000001430511475 scan_time = 0.5 forward_tilt = 0.2618 iC = -1030862.1946224371 5468503.8842079658 3407902.5154047827 iR = -0.95700845635275322 -0.27527006183758934 0.091439638698163225 -0.26345593052063937 0.69302501329766897 -0.67104940475144637 0.1213498543172795 -0.66629027007731101 -0.73575232847574434 speed = 7700 mean_earth_radius = 6371000 mean_surface_elevation = 4000 motion_compensation_factor = 1.0 scan_dir = right For a description of each value, see :numref:`panoramic`. For the other image (aft camera) the forward tilt was set to -0.2618 and scan_dir was set to 'left'. The correct values for scan_dir (left or right) and use_motion_compensation (1.0 or -1.0) are not known for certain due to uncertainties about how the images were recorded and may even change between launches of the KH-4 satellite. You will need to experiment to see which combination of settings produces the best results for your particular data set. The metadata table from Earth Explorer has the following entries for DS1105-2248DF076:: NW Corner Lat dec 31.266 NW Corner Long dec 99.55 NE Corner Lat dec 31.55 NE Corner Long dec 101.866 SE Corner Lat dec 31.416 SE Corner Long dec 101.916 SW Corner Lat dec 31.133 SW Corner Long dec 99.55 These correspond to the upper-left, upper-right, lower-right, and lower-left pixels in the image. We will invoke ``cam_gen`` as follows:: cam_gen --sample-file sample_kh4b_for_optical_bar.tsai \ --camera-type opticalbar \ --lon-lat-values \ '99.55 31.266 101.866 31.55 101.916 31.416 99.55 31.133' \ for.tif --reference-dem dem.tif --refine-camera -o for.tsai cam_gen --sample-file sample_kh4b_aft_optical_bar.tsai \ --camera-type opticalbar \ --lon-lat-values \ '99.566 31.266 101.95 31.55 101.933 31.416 99.616 31.15' \ aft.tif --reference-dem dem.tif --refine-camera -o aft.tsai It is very important to note that if, for example, the upper-left image corner is in fact the NE corner from the metadata, then that corner should be the first in the longitude-latitude list when invoking this tool. Bundle adjustment and stereo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Before processing the input images it is a good idea to experiment with reduced resolution copies in order to accelerate testing. You can easily generate reduced resolution copies of the images using ``stereo_gui`` as shown below. :: stereo_gui for.tif aft.tif --create-image-pyramids-only ln -s for_sub8.tif for_small.tif ln -s aft_sub8.tif aft_small.tif cp for.tsai for_small.tsai cp aft.tsai aft_small.tsai The new .tsai files need to be adjusted by updating the image_size, image_center (divide by resolution factor, which is 8 here), and the pitch (multiply by the resolution factor) to account for the downsample amount. You can now run bundle adjustment on the downsampled images:: bundle_adjust for_small.tif aft_small.tif \ for_small.tsai aft_small.tsai \ -t opticalbar \ --max-iterations 100 \ --camera-weight 0 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --disable-tri-ip-filter \ --skip-rough-homography \ --inline-adjustments \ --ip-detect-method 1 \ --datum WGS84 \ -o ba_small/run Validation of cameras ~~~~~~~~~~~~~~~~~~~~~ An important sanity check is to mapproject the images with these cameras, for example as:: mapproject dem.tif for.tif for.tsai for.map.tif mapproject dem.tif aft.tif aft.tsai aft.map.tif and then overlay the mapprojected images on top of the DEM in ``stereo_gui``. If it appears that the images were not projected correctly, or there are gross alignment errors, likely the order of image corners was incorrect. At this stage it is not unusual that the mapprojected images are somewhat shifted from where they should be, that will be corrected later. This exercise can be done with the small versions of the images and cameras, and also before and after bundle adjustment. Running stereo ~~~~~~~~~~~~~~ Stereo with raw images:: parallel_stereo --stereo-algorithm asp_mgm \ for_small.tif aft_small.tif \ ba_small/run-for_small.tsai ba_small/run-aft_small.tsai \ --subpixel-mode 9 \ --alignment-method affineepipolar \ -t opticalbar --skip-rough-homography \ --disable-tri-ip-filter \ --ip-detect-method 1 \ stereo_small_mgm/run It is strongly suggested to run stereo with *mapprojected images*, per :numref:`mapproj-example`. Ensure the mapprojected images have the same resolution, and overlay them on top of the initial DEM first, to check for gross misalignment. See :numref:`nextsteps` for a discussion about various speed-vs-quality choices in stereo. .. _kh4_align: DEM generation and alignment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Next, a DEM is created, with an auto-determined UTM or polar stereographic projection (:numref:`point2dem`):: point2dem --auto-proj-center \ --tr 30 stereo_small_mgm/run-PC.tif The grid size (``--tr``) is in meters. The produced DEM could be rough. It is sufficient however to align to the SRTM DEM by hillshading the two and finding matching features (:numref:`pc_hillshade`):: pc_align --max-displacement -1 \ --initial-transform-from-hillshading similarity \ --save-transformed-source-points \ --num-iterations 0 \ dem.tif stereo_small_mgm/run-DEM.tif \ -o stereo_small_mgm/run Here one should choose carefully the transform type. The options are ``translation``, ``rigid``, and ``similarity`` (:numref:`pc_align_options`). The resulting aligned cloud can be regridded as:: point2dem --auto-proj-center \ --tr 30 \ stereo_small_mgm/run-trans_source.tif Consider examining in ``stereo_gui`` the left and right hillshaded files produced by ``pc_align`` and the match file among them, to ensure tie points among the two DEMs were found properly (:numref:`stereo_gui_view_ip`). There is a chance that this may fail as the two DEMs to align could be too different. In that case, the two DEMs can be regridded as in :numref:`regrid`, say with a grid size of 120 meters. The newly obtained coarser SRTM DEM can be aligned to the coarser DEM from stereo. The alignment transform could later be refined or applied to the initial clouds (:numref:`prevtrans`). Floating the intrinsics ~~~~~~~~~~~~~~~~~~~~~~~ The obtained alignment transform can be used to align the cameras as well, and then one can experiment with floating the intrinsics. See :numref:`intrinsics_ground_truth`. Modeling the camera models as pinhole cameras with RPC distortion ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Once sufficiently good optical bar cameras are produced and the DEMs from them are reasonably similar to some reference terrain ground truth, such as SRTM, one may attempt to improve the accuracy further by modeling these cameras as simple pinhole models with the nonlinear effects represented as a distortion model given by Rational Polynomial Coefficients (RPC) of any desired degree (see :numref:`pinholemodels`). The best fit RPC representation can be found for both optical bar models, and the RPC can be further optimized using the reference DEM as a constraint. To convert from optical bar models to pinhole models with RPC distortion one does:: convert_pinhole_model for_small.tif for_small.tsai \ -o for_small_rpc.tsai --output-type RPC \ --camera-to-ground-dist 300000 \ --sample-spacing 50 --rpc-degree 2 and the same for the other camera. Here, one has to choose carefully the camera-to-ground-distance. Above it was set to 300 km. The obtained cameras should be bundle-adjusted as before. One can create a DEM and compare it with the one obtained with the earlier cameras. Likely some shift in the position of the DEM will be present, but hopefully not too large. The ``pc_align`` tool can be used to make this DEM aligned to the reference DEM. Next, one follows the same process as outlined in :numref:`skysat` and :numref:`floatingintrinsics` to refine the RPC coefficients. It is suggested to use the ``--heights-from-dem`` option as in that example. Here we use the more complicated ``--reference-terrain`` option. We will float the RPC coefficients of the left and right images independently, as they are unrelated. The initial coefficients must be manually modified to be at least 1e-7, as otherwise they will not be optimized. In the latest builds this is done automatically by ``bundle_adjust`` (option ``--min-distortion``). The command we will use is:: bundle_adjust for_small.tif aft_small.tif \ for_small_rpc.tsai aft_small_rpc.tsai \ -o ba_rpc/run --max-iterations 200 \ --camera-weight 0 --disable-tri-ip-filter \ --skip-rough-homography --inline-adjustments \ --ip-detect-method 1 -t nadirpinhole --datum WGS84 \ --force-reuse-match-files --reference-terrain-weight 1000 \ --parameter-tolerance 1e-12 --max-disp-error 100 \ --disparity-list stereo/run-unaligned-D.tif \ --max-num-reference-points 40000 --reference-terrain srtm.tif \ --solve-intrinsics \ --intrinsics-to-share 'focal_length optical_center' \ --intrinsics-to-float other_intrinsics --robust-threshold 10 \ --initial-transform pc_align/run-transform.txt Here it is suggested to use a match file with dense interest points (:numref:`dense_ip`). The initial transform is the transform written by ``pc_align`` applied to the reference terrain and the DEM obtained with the camera models ``for_small_rpc.tsai`` and ``aft_small_rpc.tsai`` (with the reference terrain being the first of the two clouds passed to the alignment program). The unaligned disparity in the disparity list should be from the stereo run with these initial guess camera models (hence stereo should be used with the ``--unalign-disparity`` option). It is suggested that the optical center and focal lengths of the two cameras be kept fixed, as RPC distortion should be able model any changes in those quantities as well. One can also experiment with the option ``--heights-from-dem`` instead of ``--reference-terrain``. The former seems to be able to handle better large height differences between the DEM with the initial cameras and the reference terrain, while the latter is better at refining the solution. Then one can create a new DEM from the optimized camera models and see if it is an improvement. Another example of using RPC and an illustration is in :numref:`kh7_fig`. .. _kh7: Declassified satellite images: KH-7 ----------------------------------- KH-7 was an effective observation satellite that followed the Corona program. It contained an index (frame) camera and a single strip (pushbroom) camera. ASP has *no exact camera model for this camera.* An RPC distortion model can be fit as in :numref:`dem2gcp`. See a figure in :numref:`kh7_fig`. *This produces an approximate solution, which goes the right way but is likely not good enough.* For the latest suggested processing workflow, see the section on KH-9 images (:numref:`kh9`). For this example we find the following images in Earth Explorer declassified collection 2:: DZB00401800038H025001 DZB00401800038H026001 Make note of the latitude/longitude corners of the images listed in Earth Explorer, and note which image corners correspond to which compass locations. It is suggested to resize the images to a more manageable size. This can avoid failures in the processing below (:numref:`resizing_images`). We will merge the images with the ``image_mosaic`` tool. These images have a large amount of overlap and we need to manually lower the blend radius so that we do not have memory problems when merging the images. Note that the image order is different for each image. :: image_mosaic DZB00401800038H025001_b.tif DZB00401800038H025001_a.tif \ -o DZB00401800038H025001.tif --ot byte --blend-radius 2000 \ --overlap-width 10000 image_mosaic DZB00401800038H026001_a.tif DZB00401800038H026001_b.tif \ -o DZB00401800038H026001.tif --ot byte --blend-radius 2000 \ --overlap-width 10000 For this image pair we will use the following SRTM images from Earth Explorer:: n22_e113_1arc_v3.tif n23_e113_1arc_v3.tif dem_mosaic n22_e113_1arc_v3.tif n23_e113_1arc_v3.tif -o srtm_dem.tif The SRTM DEM must be first adjusted to be relative to WGS84 (:numref:`conv_to_ellipsoid`). Next we crop the input images so they only contain valid image area. We use, as above, the ``historical_helper.py`` tool. See :numref:`historical_helper` for how to install the ImageMagick software that it needs. :: historical_helper.py rotate-crop \ --interest-points '1847 2656 61348 2599 61338 33523 1880 33567'\ --input-path DZB00401800038H025001.tif \ --output-path 5001.tif historical_helper.py rotate-crop \ --interest-points '566 2678 62421 2683 62290 33596 465 33595' \ --input-path DZB00401800038H026001.tif \ --output-path 6001.tif We will try to approximate the KH-7 camera using a pinhole model. The pitch of the image is determined by the scanner, which is 7.0e-06 meters per pixel. The focal length of the camera is reported to be 1.96 meters, and we will set the optical center at the center of the image. We need to convert the optical center to units of meters, which means multiplying the pixel coordinates by the pitch to get units of meters. Using the image corner coordinates which we recorded earlier, use the ``cam_gen`` tool (:numref:`cam_gen`) to generate camera models for each image, being careful of the order of coordinates. :: cam_gen --pixel-pitch 7.0e-06 --focal-length 1.96 \ --optical-center 0.2082535 0.1082305 \ --lon-lat-values '113.25 22.882 113.315 23.315 113.6 23.282 113.532 22.85' \ 5001.tif --reference-dem srtm_dem.tif --refine-camera -o 5001.tsai cam_gen --pixel-pitch 7.0e-06 --focal-length 1.96 \ --optical-center 0.216853 0.108227 \ --lon-lat-values '113.2 22.95 113.265 23.382 113.565 23.35 113.482 22.915' \ 6001.tif --reference-dem srtm_dem.tif --refine-camera -o 6001.tsai A quick way to evaluate the camera models is to use the ``camera_footprint`` tool to create KML footprint files, then look at them in Google Earth. For a more detailed view, you can mapproject them and overlay them on the reference DEM in ``stereo_gui``. :: camera_footprint 5001.tif 5001.tsai --datum WGS_1984 --quick \ --output-kml 5001_footprint.kml -t nadirpinhole --dem-file srtm_dem.tif camera_footprint 6001.tif 6001.tsai --datum WGS_1984 --quick \ --output-kml 6001_footprint.kml -t nadirpinhole --dem-file srtm_dem.tif The output files from ``cam_gen`` will be roughly accurate but they may still be bad enough that ``bundle_adjust`` has trouble finding a solution. One way to improve your initial models is to use ground control points. For this test case it was possible to match features along the rivers to the same rivers in a hillshaded version of the reference DEM. Three sets of GCPs (:numref:`bagcp`) were created, one for each image individually and a joint set for both images. Then ``bundle_adjust`` was run individually for each camera using the GCPs. :: bundle_adjust 5001.tif 5001.tsai gcp_5001.gcp \ -t nadirpinhole --inline-adjustments \ --num-passes 1 --camera-weight 0 \ --ip-detect-method 1 -o bundle_5001/out \ --max-iterations 30 --fix-gcp-xyz bundle_adjust 6001.tif 6001.tsai gcp_6001.gcp \ -t nadirpinhole --inline-adjustments \ --num-passes 1 --camera-weight 0 \ --ip-detect-method 1 -o bundle_6001/out \ --max-iterations 30 --fix-gcp-xyz Check the GCP pixel residuals at the end of the produced residual file (:numref:`ba_err_per_point`). At this point it is a good idea to experiment with lower-resolution copies of the input images before running processing with the full size images. You can generate these using ``stereo_gui`` :: stereo_gui 5001.tif 6001.tif --create-image-pyramids-only ln -s 5001_sub16.tif 5001_small.tif ln -s 6001_sub16.tif 6001_small.tif Make copies of the camera files for the smaller images:: cp 5001.tsai 5001_small.tsai cp 6001.tsai 6001_small.tsai Multiply the pitch in the produced cameras by the resolution scale factor. Now we can run ``bundle_adjust`` and ``parallel_stereo``. If you are using the GCPs from earlier, the pixel values will need to be scaled to match the subsampling applied to the input images. :: bundle_adjust 5001_small.tif 6001_small.tif \ bundle_5001/out-5001_small.tsai \ bundle_6001/out-6001_small.tsai \ gcp_small.gcp -t nadirpinhole -o bundle_small_new/out \ --force-reuse-match-files --max-iterations 30 \ --camera-weight 0 --disable-tri-ip-filter \ --skip-rough-homography \ --inline-adjustments --ip-detect-method 1 \ --datum WGS84 --num-passes 2 parallel_stereo --alignment-method homography \ --skip-rough-homography --disable-tri-ip-filter \ --ip-detect-method 1 --session-type nadirpinhole \ --stereo-algorithm asp_mgm --subpixel-mode 9 \ 5001_small.tif 6001_small.tif \ bundle_small_new/out-out-5001_small.tsai \ bundle_small_new/out-out-6001_small.tsai \ st_small_new/out A DEM is created with ``point2dem`` (:numref:`point2dem`):: point2dem --auto-proj-center st_small_new/out-PC.tif The above may produce a DEM with many holes. It is strongly suggested to run stereo with *mapprojected images* (:numref:`mapproj-example`). Use the ``asp_mgm`` algorithm. See also :numref:`nextsteps` for a discussion about various speed-vs-quality choices in stereo. .. figure:: ../images/kh7_dem.png :name: kh7_fig An example of a DEM created from KH-7 images after modeling distortion with RPC 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`` algorithm. Fitting an RPC model to the cameras with the help of GCP created by the ``dem2gcp`` program (:numref:`dem2gcp`) can greatly help improve the produced DEM. See an illustration in :numref:`kh7_fig`, and difference maps in :numref:`kh7_orig_vs_opt`. .. _kh9: Declassified satellite images: KH-9 ----------------------------------- The KH-9 satellite contained one frame camera and two panoramic cameras, one pitched forward and one aft. The frame camera is a regular pinhole model (:numref:`pinholemodels`). The images produced with it could be handled as for KH-7 (:numref:`kh7`), SkySat (:numref:`skysat`), or using Structure-from-Motion (:numref:`sfm`). This example describes how to process the KH-9 panoramic camera images. The workflow below is more recent than the one for KH-4B (:numref:`kh4`) or KH-7, and it requires the latest build (:numref:`release`). *The ASP support for panoramic images is highly experimental and is work in progress.* Image mosaicking ~~~~~~~~~~~~~~~~ For this example we use the following images from the Earth Explorer declassified collection 3:: D3C1216-200548A041 D3C1216-200548F040 Make note of the latitude/longitude corners of the images listed in Earth Explorer and corresponding raw image corners. It is suggested to resize the images to a more manageable size, such as 1/16th the original image resolution, at least to start with (:numref:`resizing_images`). This can avoid failures with ImageMagick in the processing below when the images are very large. We merge the images with ``image_mosaic`` (:numref:`image_mosaic`):: image_mosaic \ D3C1216-200548F040_a.tif D3C1216-200548F040_b.tif \ D3C1216-200548F040_c.tif D3C1216-200548F040_d.tif \ D3C1216-200548F040_e.tif D3C1216-200548F040_f.tif \ D3C1216-200548F040_g.tif D3C1216-200548F040_h.tif \ D3C1216-200548F040_i.tif D3C1216-200548F040_j.tif \ D3C1216-200548F040_k.tif D3C1216-200548F040_l.tif \ --ot byte --overlap-width 3000 \ -o D3C1216-200548F040.tif image_mosaic \ D3C1216-200548A041_a.tif D3C1216-200548A041_b.tif \ D3C1216-200548A041_c.tif D3C1216-200548A041_d.tif \ D3C1216-200548A041_e.tif D3C1216-200548A041_f.tif \ D3C1216-200548A041_g.tif D3C1216-200548A041_h.tif \ D3C1216-200548A041_i.tif D3C1216-200548A041_j.tif \ D3C1216-200548A041_k.tif --overlap-width 1000 \ --ot byte -o D3C1216-200548A041.tif --rotate These images also need to be cropped to remove most of the area around the images:: historical_helper.py rotate-crop \ --input-path D3C1216-200548F040.tif \ --output-path for.tif \ --interest-points '2414 1190 346001 1714 345952 23960 2356 23174' historical_helper.py rotate-crop \ --input-path D3C1216-200548A041.tif \ --output-path aft.tif \ --interest-points '1624 1333 346183 1812 346212 24085 1538 23504' We used, as above, the ``historical_helper.py`` tool. See :numref:`historical_helper` for how to install the ImageMagick software that it needs. Reference terrain ~~~~~~~~~~~~~~~~~ Fetch a reference DEM for the given site (:numref:`initial_terrain`). It should be converted to be relative to the WGS84 datum (:numref:`conv_to_ellipsoid`) and to a local UTM projection with ``gdalwarp`` with bicubic interpolation (:numref:`gdal_tools`). We will call this terrain ``ref.tif``. This terrain will help with registration later. For the purpose of mapprojection, the terrain should be blurred to attenuate any misalignment (:numref:`dem_prep`). The blurred version of this will be called ``ref_blur.tif``. .. _ghuffar_method: Modeling the cameras ~~~~~~~~~~~~~~~~~~~~ We follow the approach in :cite:`ghuffar2022pipeline`. This work makes the following additional improvements as compared to the prior efforts in :numref:`kh4`: - The satellite velocity is a 3D vector, which is solved for independently, rather than being tied to satellite pose and camera tilt. - It is not assumed that the satellite pose is fixed during scanning. Rather, there are two camera poses, for the starting and ending scan times, with *slerp* interpolation in between. - The scan time and scalar speed are absorbed into the motion compensation factor. - The forward tilt is not modeled, hence only the camera pose is taken into account, rather than the satellite pose and its relation to the camera pose. Sample camera format ~~~~~~~~~~~~~~~~~~~~ It is strongly advised to work at 1/16th resolution of the original images, as the images are very large. Later, any optimized cameras can be adjusted to be at a different resolution, as documented in :numref:`resizing_images`. At 1/16th the resolution, a sample Panoramic (OpticalBar) camera file, before refinements of intrinsics and extrinsics, has the form:: VERSION_4 OPTICAL_BAR image_size = 21599 1363 image_center = 10799.5 681.5 pitch = 0.000112 f = 1.52 scan_time = 1 forward_tilt = 0 iC = 0 0 0 iR = 1 0 0 0 1 0 0 0 1 speed = 0 mean_earth_radius = 6371000 mean_surface_elevation = 0 motion_compensation_factor = 0 scan_dir = right velocity = 0 0 0 We call this file ``sample_sub16.tsai``. There are several notable differences with the optical bar models before the workflow and modeling was updated (:numref:`ghuffar_method`). Compared to the sample file in :numref:`panoramic`, the scan time, forward tilt, speed, mean surface elevation, and motion compensation factor are set to nominal values. The additional ``velocity`` field is present, which for now has zero values. If this field is not set, the prior optical bar logic will be invoked. Hence internally both implementations are still supported. The ``iR`` matrix has the starting camera pose. If the ending camera pose is not provided, it is assumed to be the same as the starting one. When an optical bar model is saved, the ending camera pose will be added as a line of the form:: final_pose = 0.66695010211673467 2.3625446924332656 1.5976801601116621 This represents a rotation in the axis-angle format, unlike ``iR`` which is shown in regular matrix notation. The discrepancy in notation is for backward compatibility. The focal length is 1.52 m, per existing documentation. The pixel pitch (at which the film is scanned) is known to be 7e-6 m. Here it is multiplied by 16 to account for the fact that we work at 1/16th the resolution of the original images. The image size comes from the image file (at the current lower resolution). The image center is set to half the image size. Creation of initial cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Camera files are generated using ``cam_gen`` (:numref:`cam_gen`), with the help of the sample file from above. Let the Fwd image at 1/16th resolution be called ``fwd_sub16.tif``. The command is:: cam_gen \ --sample-file sample_sub16.tsai \ --camera-type opticalbar \ --lon-lat-values \ '-151.954 61.999 -145.237 61.186 -145.298 60.944 -152.149 61.771' \ fwd_sub16.tif \ --reference-dem ref.tif \ --refine-camera \ --gcp-file fwd_sub16.gcp \ -o fwd_sub16.tsai This creates the camera file ``fwd_sub16.tsai`` and the GCP file ``fwd_sub16.gcp``. The historical images are often cropped after being scanned, and the image size and optical center (image center) will be different for each image. The command above will write the correct image size in the output file, and will set the optical center to half of that. Hence, the entries for these in the sample file will be ignored. An analogous command is run for the Aft camera. The longitude-latitude corners must correspond to the expected traversal of the raw (non-mapprojected) image corners (:numref:`cam_gen_pinhole`). This requires some care, especially given that the Fwd and Aft images have 180 degrees of rotation between them. Validation of guessed cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The produced cameras should be verified by mapprojection (:numref:`mapproject`):: mapproject \ --tr 12 \ ref_blur.tif \ fwd_sub16.tif \ fwd_sub16.tsai \ fwd_sub16.map.tif The grid size (``--tr``) is in meters. Here, it was known from existing information that the ground sample distance at full resolution was about 0.75 m / pixel. This was multiplied by 16 given the lower resolution used here. If not known, the grid size can be auto-guessed by this program. The Fwd and Aft mapprojected images should be overlaid with georeference information on top of the reference DEM. It is expected that the general position and orientation would be good, but there would be a lot of warping due to unknown intrinsics. .. figure:: ../images/kh9_initial_cameras.png :name: kh9_init_fig An example of Fwd and Aft mapprojected images. Notable warping is observed. Optimization of cameras ~~~~~~~~~~~~~~~~~~~~~~~ We will follow the bundle adjustment approach outlined in :numref:`heights_from_dem`. The quantities to be optimized are the extrinsics (camera position and starting orientation), and the intrinsics, which include the image center (optical offset), focal length, motion compensation factor, velocity vector, and the ending orientation. The last three fall under the ``other_intrinsics`` category in bundle adjustment. The command can be as follows:: bundle_adjust \ fwd_sub16.tif aft_sub16.tif \ fwd_sub16.tsai aft_sub16.tsai \ --mapprojected-data \ 'fwd_sub16.map.tif aft_sub16.map.tif' \ fwd_sub16.gcp aft_sub16.gcp \ --inline-adjustments \ --solve-intrinsics \ --intrinsics-to-float other_intrinsics \ --intrinsics-to-share none \ --heights-from-dem ref.tif \ --heights-from-dem-uncertainty 10000 \ --ip-per-image 100000 \ --ip-inlier-factor 1000 \ --remove-outliers-params '75 3 1000 1000' \ --num-iterations 250 \ -o ba/run We passed in the GCP files produced earlier, that have information about the ground coordinates of image corners. We made use of mapprojected images for interest point matching (:numref:`mapip`). The values for ``--heights-from-dem-uncertainty``, ``--ip-per-image``, ``--ip-inlier-factor``, and ``--remove-outliers-params`` are much larger than usual, because of the very large distortion seen above. Otherwise too many valid interest points may be eliminated. Later these parameters can be tightened. Check the produced clean match files with ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`). It is very important to have many of them in the corners and roughly uniformly distributed across the images. One could also consider adding the ``--ip-per-tile`` and ``--matches-per-tile`` parameters (:numref:`ba_ip`). These would need some tuning at each resolution to ensure the number of matches is not overly large. The updated cameras will be saved in the output directory. These should be validated by mapprojection as before. We did not optimize for now the focal length and optical center, as they were known more reliably than the other intrinsics. All these can be optimized together in a subsequent pass. See :numref:`bundle_adjust` for more information about ``bundle_adjust`` and the various report files that are produced. .. figure:: ../images/kh9_opt_cameras.png :name: kh9_opt_fig Fwd and Aft mapprojected images, after optimization of intrinsics. The images are much better aligned. Creation of a terrain model ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Inspect the mapprojected images created with the new cameras. They will likely be more consistent than before. Look at the convergence angles report (:numref:`ba_conv_angle`). Hopefully this angle will have a reasonable value, such as between 10 and 40 degrees. Run stereo and DEM creation with the mapprojected images and the ``asp_mgm`` algorithm. It is suggested to follow very closely the steps in :numref:`mapproj-example`. Fixing horizontal registration errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is quite likely that the mapprojected images after the last bundle adjustment are much improved, but the stereo terrain model still shows systematic issues relative to the reference terrain. Then, the ``dem2gcp`` program (:numref:`dem2gcp`) can be invoked to create GCP that can fix this misregistration. Pass to this program the option ``--max-disp`` if the disparity that is an input to that tool is not accurate in flat areas. Bundle adjustment can happen with these dense GCP, while optimizing all intrinsics and extrinsics. We will share none of the intrinsics (the optical center, at least, must be unique for each individual image due to how they are scanned and cropped). Afterwards, a new stereo DEM can be created as before. If happy enough with results at a given resolution, the cameras can be rescaled to a finer resolution and the process continued. See :numref:`resizing_images` for how a camera model can be modified to work at a different resolution. Fixing local warping ~~~~~~~~~~~~~~~~~~~~ The panoramic (OpticalBar) camera model we worked with may not have enough degrees of freedom to fix issues with local warping that arise during the storage of the film having the historical images or its subsequent digitization. To address that, the cameras can be converted to CSM linescan format (and the images rotated by 90 degrees). See :numref:`opticalbar2csm`. Then, the jitter solver (:numref:`jitter_solve`) can be employed. It is suggested to set ``--num-lines-per-position`` and ``--num-lines-per-orientation`` for this program so that there exist about 10-40 position and orientation samples along the scan direction. This program can also accept GCP files, just like ``bundle_adjust``. We invoked it as follows:: jitter_solve \ fwd_sub16.tif aft_sub16.tif \ fwd_sub16.json aft_sub16.json \ fwd_sub16.gcp aft_sub16.gcp \ --match-files-prefix ba/run \ --num-lines-per-position 1000 \ --num-lines-per-orientation 1000 \ --heights-from-dem ref.tif \ --heights-from-dem-uncertainty 500 \ --max-initial-reprojection-error 100 \ --num-iterations 100 \ -o jitter_sub16/run The GCP had a sigma of 100 or so, so less uncertainty than in ``--heights-from-dem-uncertainty``, by a notable factor. At higher resolution, and if confident in GCP, one can reduce the GCP uncertainty further. In practice we found that after one pass of the jitter solver and stereo DEM creation, it may be needed to run GCP creation with ``dem2gcp`` and bundle adjustment again to refine all the intrinsics, including focal length and lens distortion, this time with the CSM linescan model. Then, one can invoke ``jitter_solve`` one more time. Each step should offer a further improvement in results. For fine-level control over interest point matches, dense matches from disparity are suggested (:numref:`dense_ip`). If the satellite acquired several overlapping pairs of images in quick succession, it is suggested to use them together, as that can improve the registration. The linescan cameras are not as easy to convert to a different resolution as the OpticalBar cameras. An `experimental program `_ for this is available. ================================================ FILE: docs/examples/hrsc.rst ================================================ .. _hrsc_example: Mars Express High Resolution Stereo Camera (HRSC) ------------------------------------------------- The HRSC camera on the Mars Express satellite is a complicated system, consisting of multiple channels pointed in different directions plus another super resolution channel. The best option to create DEMs is to use the two dedicated stereo channels. These are pointed ahead of and behind the nadir channel and collect a stereo observation in a single pass of the satellite. Since each observation contains both stereo channels, one observation is sufficient to create a DEM. Data can be downloaded from the `HRSC node `_ in the Planetary Data System (PDS). HRSC data is organized into categories. Level 2 is radiometrically corrected, level 3 is corrected and mapprojected onto MOLA, and level 4 is corrected and mapprojected on to a DEM created from the HRSC data. You should use the level 2 data for creating DEMs with ASP. If you would like to download one of the already created DEMs, it may be easiest to use the areoid referenced version (.da4 extension) since that is consistent with MOLA. Preparing the data ~~~~~~~~~~~~~~~~~~ Fetch the two stereo channels using ``wget`` from:: https://pds-geosciences.wustl.edu/mex/mex-m-hrsc-3-rdr-v4/mexhrs_4000/data/1995/h1995_0000_s13.img https://pds-geosciences.wustl.edu/mex/mex-m-hrsc-3-rdr-v4/mexhrs_4000/data/1995/h1995_0000_s23.img .. figure:: ../images/examples/hrsc/hrsc_example.png :name: hrsc_figure Sample outputs from a cropped region of HRSC frame 1995. Left: Cropped input. Center: Block matching with subpixel mode 3. Right: MGM algorithm with cost mode 3. See :numref:`planetary_images` for how to set up ISIS and download the needed kernels. For HRSC, they are part of the ``mex`` dataset. It appears that ``hrsc2isis`` is not able to read the level 3 images that were downloaded above, and PDS no longer offers level 2 images. What seems to work is edit the .img files and change level 3 to level 2. That can be done with:: perl -pi -e 's#(PROCESSING_LEVEL_ID\s+=) 3#$1 2#g' *.img Then run:: hrsc2isis from=h1995_0000_s13.img to=h1995_0000_s13.cub hrsc2isis from=h1995_0000_s23.img to=h1995_0000_s23.cub spiceinit from=h1995_0000_s13.cub ckpredicted=true spiceinit from=h1995_0000_s23.cub ckpredicted=true Here we added the ``ckpredicted=true`` flag to ``spiceinit``. Adding ``web=true`` can help avoid downloading the kernels, if this works. See the (`spiceinit documentation `_). Running stereo ~~~~~~~~~~~~~~ HRSC images are large and may have compression artifacts so you should experiment running stereo on a small region with ``stereo_gui`` (:numref:`stereo_gui`). The suggested command to run on the full images is:: parallel_stereo h1995_0000_s13.cub h1995_0000_s23.cub \ --stereo-algorithm asp_mgm \ --cost-mode 3 \ mgm/out See :numref:`nextsteps` for other stereo algorithms, and information on tradeoffs between them. A DEM is created with ``point2dem`` (:numref:`point2dem`):: point2dem \ --stereographic --auto-proj-center \ mgm/out-PC.tif ================================================ FILE: docs/examples/isis_minirf.rst ================================================ .. _isis_minirf: LRO Mini-RF using ISIS camera models ------------------------------------ See :numref:`csm_minirf`. That example uses CSM cameras. Running it with ISIS ``.cub`` cameras amounts to replacing ``.json`` with ``.cub`` in all commands. ================================================ FILE: docs/examples/junocam.rst ================================================ .. _junocam: JunoCam ------- JunoCam is an optical camera on the Juno spacecraft. It has been taking images of Jupiter and its satellites since 2016. This example shows how to produce terrain models and ortho images from JunoCam images for Ganymede, the largest moon of Jupiter. These will be registered to the Voyager-Galileo global mosaic of Ganymede. Fetching the data ~~~~~~~~~~~~~~~~~ Set (in bash):: url=https://planetarydata.jpl.nasa.gov/img/data/juno/JNOJNC_0018/DATA/RDR/JUPITER/ORBIT_34/ Download the .IMG and .LBL files for two observations:: for f in JNCR_2021158_34C00001_V01 JNCR_2021158_34C00002_V01; do for ext in .IMG .LBL; do wget $url/$f$ext done done Preparing the data ~~~~~~~~~~~~~~~~~~ Ensure ISIS is installed (:numref:`planetary_images`). Create ISIS .cub files:: for f in JNCR_2021158_34C00001_V01 JNCR_2021158_34C00002_V01; do junocam2isis fr = $f.LBL to = $f.cub fullccd = yes done This will result in many files, because JunoCam acquires multiple overlapping images in quick succession. Run ``spiceinit`` to get the camera pointing and other information:: for f in *.cub; do spiceinit from = $f web = true done If the ``web = true`` option does not work, the ISIS data for the ``juno`` mission needs to be downloaded, per the ISIS documentation. We will put all these files into an ``img`` subdirectory. .. figure:: ../images/junocam_raw.png JunoCam images JNCR_2021158_34C00001_V01_0012 and JNCR_2021158_34C00002_V01_0010 as shown by ``stereo_gui`` (:numref:`stereo_gui`). The shared area and a couple of matching craters are highlighted. A JunoCam image is made of 3 framelets, each about 128 pixels tall. The image width is 1648 pixels. Consecutive images have overlapping areas, which helps eliminate the effect of the gaps between the framelets. External reference ~~~~~~~~~~~~~~~~~~ We will pixel-level register the JunoCam images to the 1 km / pixel Ganymede `Voyager - Galileo global mosaic `_. Crop from it a portion that covers our area of interest as:: win="5745386 2069139 7893530 36002" gdal_translate -projwin $win \ Ganymede_Voyager_GalileoSSI_global_mosaic_1km.tif \ galileo_ortho.tif This will be stored in a subdirectory named ``ref``. Initial DEM ~~~~~~~~~~~ Both image registration and stereo DEM creation benefit from mapprojecting the JunoCam images onto a prior low-resolution DEM. A reasonably good such DEM can be created by considering the surface zero height corresponding to the earlier orthoimage clip. Given that the elevations on Ganymede are on the order of 1 km, which is about the image resolution, this works well enough. Such a DEM is produced with ``image_calc`` (:numref:`image_calc`) as:: image_calc -c "var_0 * 0" \ --output-nodata-value -1e+6 \ -d float32 \ ref/galileo_ortho.tif \ -o ref/flat_dem.tif Image selection ~~~~~~~~~~~~~~~ We chose to focus on the highest resolution JunoCam images of Ganymede, as that resulted in the best terrain model. The quality of the terrain model degraded towards the limb, as expected. We worked with the images:: JNCR_2021158_34C00001_V01_0009 JNCR_2021158_34C00001_V01_0010 JNCR_2021158_34C00001_V01_0011 JNCR_2021158_34C00001_V01_0012 JNCR_2021158_34C00001_V01_0013 and corresponding images that have ``34C00002`` in their name. Mapprojection ~~~~~~~~~~~~~ Each image was mapprojected (:numref:`mapproject`) at 1 km / pixel resolution, with a command such as:: mapproject --tr 1000 \ ref/flat_dem.tif \ img/JNCR_2021158_34C00001_V01_0010.cub \ map/JNCR_2021158_34C00001_V01_0010.map.tif GCP creation ~~~~~~~~~~~~ We will create GCP that ties each JunoCam image to the reference Voyager-Galileo image mosaic with ``gcp_gen`` (:numref:`gcp_gen`), invoked as follows:: f=JNCR_2021158_34C00001_V01_0010 gcp_gen \ --ip-detect-method 0 \ --inlier-threshold 50 \ --ip-per-image 20000 \ --individually-normalize \ --camera-image img/${f}.cub \ --mapproj-image map/${f}.map.tif \ --ortho-image ref/galileo_ortho.tif \ --dem ref/flat_dem.tif \ --gcp-sigma 1000 \ --output-prefix gcp/run \ --output-gcp gcp/${f}.gcp We set ``--gcp-sigma 1000``, which is rather high, as we do not know the exact DEM that was employed to produce the reference image mosaic. The option ``--individually-normalize`` was essential, as these images come from different sources. .. figure:: ../images/junocam_galileo_matches.png Interest point matches between mapprojected image JNCR_2021158_34C00001_V01_0010 and the Voyager-Galileo mosaic. GCP are made from these matches. Bundle adjustment ~~~~~~~~~~~~~~~~~ Bundle adjustment (:numref:`parallel_bundle_adjust`) was run with the 10 images selected earlier and the GCP files:: parallel_bundle_adjust \ img/JNCR_2021158_34C0000[1-2]_V01_000[9-9].cub \ img/JNCR_2021158_34C0000[1-2]_V01_001[0-3].cub \ --ip-per-image 20000 \ --num-iterations 500 \ gcp/*.gcp \ -o ba/run Stereo terrain creation ~~~~~~~~~~~~~~~~~~~~~~~ We ran ``parallel_stereo`` on *every combination* of overlapping images between the ``34C00001`` set and the ``34C00002`` one:: l=JNCR_2021158_34C00001_V01_xxxx r=JNCR_2021158_34C00002_V01_yyyy pref=stereo_map/${l}_${r}/run parallel_stereo \ map/$l.map.tif map/$r.map.tif \ img/$l.cub img/$r.cub \ --bundle-adjust-prefix ba/run \ --ip-per-image 20000 \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --subpixel-kernel 7 7 \ --nodata-value 0 \ --num-matches-from-disparity 10000 \ ${pref} \ ref/flat_dem.tif Here we used a small ``subpixel-kernel`` of 7 x 7 pixels, to ensure as little as possible is eroded from the already narrow images. Note that the ``asp_mgm`` algorithm default ``corr-kernel`` value is 5 x 5 pixels (:numref:`stereodefault`). The stereo convergence angle (:numref:`stereo_pairs`) was about 35 degrees, which is very good. Set the output projection (the same as in the reference image mosaic):: 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' Then, ``point2dem`` (:numref:`point2dem`) was run:: point2dem \ --t_srs "$proj" \ --tr 1000 \ ${pref}-PC.tif \ --orthoimage \ ${pref}-L.tif This was followed by mosaicking of DEMs and orthoimages with ``dem_mosaic`` (:numref:`dem_mosaic`), and colorization with ``colormap`` (:numref:`colormap`). .. figure:: ../images/junocam_dem_drg.png Left: Mosaicked DEM created from stereo of JunCam images. The color range corresponds to elevations between -1500 and 1500 meters. Right: produced JunoCam orthoimage overlaid on top of the Voyager-Galileo global mosaic. The results of this processing are shown in the figure above. Three things are notable: - The image registration is pixel-level. - There are some seams at the top and bottom. Those can be eliminated with more images. - There are systematic artifacts in the elevations. The latter issue is likely due to not well-modeled distortion and TDI effects, given the JunoCam camera design. This will be fixed in the next section. Handling gaps between DEMs ~~~~~~~~~~~~~~~~~~~~~~~~~~ The JunoCam images have very little overlap and sometimes that results in gaps between the DEMs produced from stereo. These are most notable around the first and last DEMs in any given sequence. So adding more overlapping stereo pairs pairs at the beginning and end of the sequence will help cover those areas. Consider decreasing the grid size for mapprojection as well, say from 1000 m to 800 m, which should result in more pixels in overlapping areas. These parameter changes in the workflow above may also help: - ``--edge-buffer-size 1`` or ``0`` (the default is larger) - ``--subpixel-kernel 5 5`` (instead of ``7 7``) - ``--corr-kernel 3 3`` (the default is ``5 5`` for ``asp_mgm``) These parameters are described in :numref:`stereodefault`. Intrinsics refinement ~~~~~~~~~~~~~~~~~~~~~ .. _junocam_opt: .. figure:: ../images/junocam_dem_opt.png Left: The earlier mosaicked DEM created from stereo of JunCam images. Right: the produced DEM after optimizing the lens distortion with a DEM constraint. These are plotted with the same range of of elevations (-1500 to 1500 meters). The systematic artifacts are much less pronounced. To address the systematic elevation artifacts, we will refine the intrinsics and extrinsics of the cameras, while using the zero elevation DEM as a ground constraint (with an uncertainty). The approach in :numref:`ba_frame_linescan` is followed. We will make use of dense matches from disparity, as in :numref:`dense_ip`. The option for that, ``--num-matches-from-disparity``, was already set in the stereo runs above. We got good results with sparse matches too, as produced by ``bundle_adjust``, if there are a lot of them, but dense matches offer more control over the coverage. These matches will augment existing sparse matches in the ``ba`` directory. For that, first the sparse matches will be copied to a new directory, called ``dense_matches``. Then, we will copy on top the small number of dense matches from each stereo directory above, while removing the string ``-disp`` from each such file name, and ensuring each corresponding sparse match file is overwritten. It is necessary to create CSM cameras (:numref:`csm`) for the JunoCam images, to be able to optimize the intrinsics. For the first camera, that is done with the ``cam_gen`` program (:numref:`cam_gen`), with a command such as:: cam_gen img/JNCR_2021158_34C00001_V01_0010.cub \ --input-camera img/JNCR_2021158_34C00001_V01_0010.cub \ --reference-dem ref/flat_dem.tif \ --focal-length 1480.5905405405405405 \ --optical-center 814.21 600.0 \ --pixel-pitch 1 \ --refine-camera \ --refine-intrinsics distortion \ -o csm/JNCR_2021158_34C00001_V01_0010.json The values for the focal length (in pixels) and optical center (in pixels) were obtained by peeking in the .cub file metadata. The resulting lens distortion model is not the one for JunoCam, which has two distortion parameters, but rather the OpenCV radial-tangential model with five parameters (:numref:`csm_frame_def`). To use the JunoCam lens distortion model, adjust the value of ``--distortion-type`` in ``cam_gen`` above. The ``cam_test`` program (:numref:`cam_test`) can help validate that the camera is converted well. The intrinsics of this camera are transferred without further optimization to the other cameras as:: sample=csm/JNCR_2021158_34C00001_V01_0010.json for f in \ img/JNCR_2021158_34C0000[1-2]_V01_0009.cub \ img/JNCR_2021158_34C0000[1-2]_V01_001[0-3].cub \ ; do g=${f/.cub/.json} g=csm/$(basename $g) cam_gen $f \ --input-camera $f \ --sample-file $sample \ --reference-dem ref/flat_dem.tif \ --pixel-pitch 1 \ --refine-camera \ --refine-intrinsics none \ -o $g done Next, bundle adjustment is run, with the previously optimized adjustments that reflect the registration to the reference Voyager-Galileo mosaic:: bundle_adjust \ img/JNCR_2021158_34C0000[1-2]_V01_0009.cub \ img/JNCR_2021158_34C0000[1-2]_V01_001[0-3].cub \ csm/JNCR_2021158_34C0000[1-2]_V01_0009.json \ csm/JNCR_2021158_34C0000[1-2]_V01_001[0-3].json \ --input-adjustments-prefix ba/run \ --match-files-prefix dense_matches/run \ --num-iterations 50 \ --solve-intrinsics \ --intrinsics-to-float all \ --intrinsics-to-share all \ --heights-from-dem ref/flat_dem.tif \ --heights-from-dem-uncertainty 5000 \ gcp/*.gcp \ -o ba_rfne/run Lastly, stereo is run with the optimized model state camera files (:numref:`csm_state`) saved in ``ba_rfne``. The result is in :numref:`junocam_opt`. It was found that better DEMs are produced by re-mapprojecting with latest cameras and re-running stereo from scratch, rather than reusing stereo runs with the option ``--prev-run-prefix`` (:numref:`parallel_stereo`). Likely that is because the cameras change in non-small ways. With ISIS 9.0.0 and later, a CSM file produced as above can be embedded in the .cub file to be used with ISIS (:numref:`embedded_csm`). ================================================ FILE: docs/examples/k10.rst ================================================ .. _k10example: K10 --- K10 is an Earth-based research rover within the Intelligent Robotics Group at NASA Ames, the group ASP developers belong to. The cameras on this rover use a simple Pinhole model. The use of ASP with these cameras is illustrated in the ``examples/K10`` directory (just type 'make' there). Just as for the MER datatset (:numref:`mer-example`), only the creation of a point cloud is supported. See :numref:`examples` for other examples. ================================================ FILE: docs/examples/kaguya.rst ================================================ .. _kaguya_tc: Kaguya Terrain Camera --------------------- The Kaguya Terrain Camera (TC) is a push-broom imager, with a spatial resolution of 10 m. The images are acquired from a 100 km altitude above the Moon. It was part of the JAXA `Kaguya `_ orbiter. Kaguya TC has two sensors, named TC1 and TC2, forming a stereo pair. They see roughly the same region on the ground, with a convergence angle of about 30 degrees (:numref:`stereo_pairs`). These sensors may have slightly different focal lengths and distortion coefficients. Fetching the data ~~~~~~~~~~~~~~~~~ Visit the `product search `_ page, and enter a small search region. Fetch the raw data sets for a desired stereo pair, starting with the *TC1* and *TC2* prefixes (not the DEM or other products). Both the .img and .lbl files are needed. :: wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC1W2B0_01_02936N034E0938.img.gz wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC1W2B0_01_02936N034E0938.lbl wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC2W2B0_01_02936N036E0938.img.gz wget https://darts.isas.jaxa.jp/pub/pds3/sln-l-tc-3-w-level2b0-v1.0/20080605/data/TC2W2B0_01_02936N036E0938.lbl Preparing the data ~~~~~~~~~~~~~~~~~~ Unzip the .img.gz files with ``gunzip``. Ensure that ISIS is installed, and that ISISROOT and ISISDATA are set, per :numref:`planetary_images`. The Kaguya kernels can then be downloaded with the command:: $ISISROOT/bin/downloadIsisData kaguya $ISISDATA For each image, run commands along the lines of:: $ISISROOT/bin/kaguyatc2isis \ from=TC1W2B0_01_02936N034E0938.lbl \ to=TC1W2B0_01_02936N034E0938.cub \ setnullrange=NO sethrsrange=NO sethisrange=NO \ setlrsrange=NO setlisrange=NO $ISISROOT/bin/spiceinit from=TC1W2B0_01_02936N034E0938.cub \ web=false attach=TRUE cksmithed=FALSE ckrecon=TRUE \ ckpredicted=FALSE cknadir=FALSE spksmithed=true \ spkrecon=TRUE spkpredicted=FALSE shape=SYSTEM \ startpad=0.0 endpad=0.0 Create CSM cameras (:numref:`csm`):: $ISISROOT/bin/isd_generate --only_naif_spice \ TC1W2B0_01_02936N034E0938.cub \ -k TC1W2B0_01_02936N034E0938.cub Bundle adjustment and stereo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Run bundle adjustment (:numref:`bundle_adjust`) and stereo (:numref:`parallel_stereo`):: bundle_adjust \ TC1W2B0_01_02936N034E0938.cub TC2W2B0_01_02936N036E0938.cub \ TC1W2B0_01_02936N034E0938.json TC2W2B0_01_02936N036E0938.json \ --tri-weight 0.1 --camera-weight 0.0 \ -o ba/run parallel_stereo --stereo-algorithm asp_mgm --subpixel-mode 9 \ TC1W2B0_01_02936N034E0938.cub TC2W2B0_01_02936N036E0938.cub \ TC1W2B0_01_02936N034E0938.json TC2W2B0_01_02936N036E0938.json \ --bundle-adjust-prefix ba/run \ stereo/run For datasets with very oblique illumination, ``--subpixel-mode 2`` (:numref:`subpixel_options`) worked better, but is much slower. Run ``point2dem`` (:numref:`point2dem`) to get a DEM. Consider using the stereographic projection centered at the region of interest:: point2dem --stereographic --auto-proj-center \ --tr 10 stereo/run-PC.tif See :numref:`sfs_kaguya_example` for a clip of the produced DEM. It is suggested to rerun stereo with mapprojected images (:numref:`mapproj-example`), to get a higher quality output. See :numref:`nextsteps` for a discussion about various speed-vs-quality choices when running stereo. Alignment ~~~~~~~~~ The produced DEM can be aligned with ``pc_align`` (:numref:`pc_align`) to the LOLA RDR product. .. _sfs_kaguya: Shape-from-shading with Kaguya TC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Here it will be illustrated how to run Shape-from-Shading (:numref:`sfs`) on Kaguya TC images. An overview of SfS and examples for other planets are given in :numref:`sfs_usage`. First, ensure that the data are fetched and a stereo terrain is created, per :numref:`kaguya_tc`. Shape-from-shading expects a DEM with no holes which is also rather smooth. It should be at the same ground resolution as the input images, which in this case is 10 meters per pixel. It is best to have it in a local projection, such as stereographic. We will modify the DEM creation command from above to use a large search radius to fill any holes:: point2dem --stereographic --auto-proj-center \ --tr 10 --search-radius-factor 10 \ stereo/run-PC.tif (adjust the projection center for your location). Inspect the produced DEM ``stereo/run-DEM.tif`` in ``stereo_gui`` in hillshading mode. Any additional holes can be filled with ``dem_mosaic`` (:numref:`dem_mosaic_extrapolate`). It is also suggested to blur it a little, to make it smoother:: dem_mosaic --dem-blur-sigma 2 stereo/run-filled-dem.tif \ -o stereo/run-blurred-dem.tif Then crop a region with ``gdal_translate`` that has no missing data. Mapproject (:numref:`mapproject`) onto this DEM the left and right images with the corresponding ``.json`` camera files, while using the adjustments in ``ba/run``. Overlay the resulting georeferenced images in ``stereo_gui``. This is a very important sanity check to ensure that the cameras are registered correctly. Run SfS as:: parallel_sfs -i stereo/run-cropped-dem.tif \ TC1W2B0_01_02936N034E0938.cub \ TC2W2B0_01_02936N036E0938.cub \ TC1W2B0_01_02936N034E0938.json \ TC2W2B0_01_02936N036E0938.json \ --bundle-adjust-prefix ba/run \ --reflectance-type 1 \ --blending-dist 10 \ --min-blend-size 50 \ --allow-borderline-data \ --threads 4 \ --save-sparingly \ --crop-input-images \ --smoothness-weight 40000 \ --initial-dem-constraint-weight 10 \ --max-iterations 5 \ --shadow-thresholds "120 120" \ --tile-size 200 \ --padding 50 \ --processes 10 \ -o sfs/run If there are artifacts in the produced DEM, increase the smoothness weight. But if it is too large, it may blur the produced DEM too much. The initial and final DEM can be inspected in ``stereo_gui``. The ``geodiff`` (:numref:`geodiff`) tool can be used to compare how much the DEM changed. The initial DEM constraint was set rather high to ensure the DEM does not change much as result of SfS. The shadow threshold depends on the pixel values and can be very different for other images. See, for comparison, the parameter choices made for LRO NAC (:numref:`sfs-lola`). That example, and that entire chapter, also has the most detailed discussion for how to run SfS, including the essential role of alignment. .. figure:: ../images/sfs_kaguya_example.png :name: sfs_kaguya_example :alt: SfS with Kaguya TC images From left to right: the stereo DEM, SfS DEM (hillshaded), and a mapprojected image. Some numerical noise is still seen, which can be removed by increasing the smoothing weight. See below for another example. Using multiple images with diverse illumination results in more detail and fewer artifacts. For such data, bundle adjustment and pairwise stereo need to be run first, and the produced DEMs and cameras must be aligned to a common reference, such as LOLA (:numref:`ba_pc_align`). Then the aligned DEMs are inspected and merged with ``dem_mosaic``, a clip is selected, holes are filled, noise is blurred, and SfS is run. The process is explained in detail in :numref:`sfs-lola`. Here is an example of running SfS with the datasets:: TC{1,2}W2B0_01_02921S050E1100 TC{1,2}W2B0_01_05936S048E1097 All four images were used, though likely the first of each pair would have been sufficient, given that images in each pair have the same illumination. .. figure:: ../images/sfs_kaguya_dems.png :name: sfs_kaguya_dems :alt: SfS with Kaguya TC images with different illumination SfS with Kaguya images with different illumination. From left to right: first pair stereo DEM, second pair stereo DEM, and the SfS DEM (all hillshaded). It can be seen that SfS adds more detail and removes numerical noise. .. figure:: ../images/sfs_kaguya_ortho.png :name: sfs_kaguya_ortho :alt: SfS Kaguya TC ortho images The images used for SfS (one from each pair). The Sun is in the East and West, respectively. Refining the camera intrinsics for Kaguya TC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :numref:`kaguya_ba`. .. _jitter_kaguya: Solving for jitter for Kaguya TC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Kaguya TC cameras exhibit some jitter, but its effect is not as strong as the one of lens distortion, which needs to be solved for first, as in :numref:`kaguya_ba`. Then, jitter can be corrected as for CTX in :numref:`jitter_ctx`. The precise commands are below. .. figure:: ../images/kaguya_jitter.png :name: jitter_kaguya_fig :alt: Jitter for Kaguya TC First row: the stereo DEM and orthoimage. Second row: The difference of stereo DEM to LOLA. Third row: the triangulation error (:numref:`triangulation_error`). These are before (left) and after (right) solving for jitter. The ranges in the colorbar are in meters. Here we worked with the stereo pair:: TC1W2B0_01_05324N054E2169 TC2W2B0_01_05324N056E2169 Stereo was run with mapprojected images (:numref:`mapproj-example`). Dense matches were produced from stereo disparity (:numref:`dense_ip`). Having on the order of 20,000 dense matches is suggested. The DEM and cameras were aligned to LOLA, and lens distortion was solved for as in :numref:`kaguya_ba` (using additional overlapping images). The resulting optimized cameras were passed in to the jitter solver. The DEM to constrain against was produced from LOLA, with a command as:: point2dem \ -r moon \ --stereographic \ --auto-proj-center \ --csv-format 2:lon,3:lat,4:radius_km \ --search-radius-factor 5 \ --tr 25 \ lola.csv Solving for jitter:: jitter_solve \ TC1W2B0_01_05324N054E2169.cub \ TC2W2B0_01_05324N056E2169.cub \ ba/run-TC1W2B0_01_05324N054E2169.adjusted_state.json \ ba/run-TC2W2B0_01_05324N056E2169.adjusted_state.json \ --max-pairwise-matches 20000 \ --num-lines-per-position 300 \ --num-lines-per-orientation 300 \ --max-initial-reprojection-error 20 \ --match-files-prefix dense_matches/run \ --heights-from-dem lola-DEM.tif \ --heights-from-dem-uncertainty 10 \ --anchor-dem lola-DEM.tif \ --num-anchor-points 5000 \ --num-anchor-points-extra-lines 1000 \ --anchor-weight 0.01 \ --num-iterations 20 \ -o jitter/run The value of ``--anchor-weight`` can be increased to 0.1 - 0.5, if oscillations are seen at the starting and ending image lines. ================================================ FILE: docs/examples/lronac.rst ================================================ .. _lronac-example: Lunar Reconnaissance Orbiter (LRO) NAC -------------------------------------- This section will describe in detail how to process an LRO NAC dataset. (See also :numref:`lronac_csm` for a ready-made example using a different dataset for which all inputs have already been prepared.) The site ~~~~~~~~ In this example we will consider a stereo pair that covers the Taurus-Littrow valley on the Moon where, on December 11, 1972, the astronauts of Apollo 17 landed. However, this stereo pair does not contain the landing site. It is slightly west; focusing on the Lee-Lincoln scarp that is on North Massif. The scarp is an 80 m high feature that is the only visible sign of a deep fault. .. figure:: ../images/examples/lrocna/lroc-na-example2_combined.png Example output possible with a LROC NA stereo pair, using both CCDs from each observation, courtesy of the lronac2mosaic.py tool. LRO NAC camera design ~~~~~~~~~~~~~~~~~~~~~ LRO has two Narrow Angle Cameras (NAC), with both acquiring image data at the same time, so each observation consists of two images, left and right, denoted with ``L`` and ``R``. These are not meant to be used as a stereo pair, as the camera center is virtually in the same place for both, and they have very little overlap. For stereo one needs two such observations, with a reasonable perspective difference (baseline) among the two. Then stereo can happen by pairing an L or R image from the first observation with an L or R image from the second. Alternatively, each observation's L and R images can be stitched first, then stereo happens between the two stitched images. Both of these approaches will be discussed below. Download ~~~~~~~~ Download the experimental data records (EDR) for observations M104318871 and M104311715 from http://wms.lroc.asu.edu/lroc/search. Alternatively, search by original IDs of 2DB8 and 4C86 in the PDS. The download will result in four files, named M104318871LE.img, M104318871RE.img, M104311715LE.img, and M104311715RE.img. .. _lro_nac_no_stitch: Preparing the inputs without stitching ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The individual ``L`` and ``R`` images in an LRO NAC observation can be used without stitching if desired to keep the original camera models. Unstitched cameras can also be converted to CSM (:numref:`csm`), which will provide a great speed up for stereo, bundle adjustment, and Shape-from-Shading (:numref:`sfs_usage`). We convert each .img file to an ISIS .cub camera image, initialize the SPICE kernels, and perform radiometric calibration and echo correction. Here are the steps, illustrated on one image:: f=M104318871LE lronac2isis from = ${f}.IMG to = ${f}.cub spiceinit from = ${f}.cub lronaccal from = ${f}.cub to = ${f}.cal.cub lronacecho from = ${f}.cal.cub to = ${f}.cal.echo.cub Note that for these commands to succeed, ISIS and its supporting data must be downloaded, per :numref:`planetary_images`. Stitching the LE and RE observations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this case all ISIS preprocessing of the EDRs is performed via the ``lronac2mosaic.py`` command (:numref:`lronac2mosaic`):: lronac2mosaic.py M104318871LE.img M104318871RE.img lronac2mosaic.py M104311715LE.img M104311715RE.img This runs ``lronac2isis``, ``lronaccal``, ``lronacecho``, ``spiceinit``, ``noproj``, and ``handmos`` to create a stitched unprojected image for each observation. In this example we don't mapproject the images as ASP can usually get good results. More aggressive terrain might require an additional ``cam2map4stereo.py`` step. In case of failure, it is suggested to re-run this tool with the option ``--keep`` to keep the intermediate files, and then inspect the ones before the final step. Running stereo ~~~~~~~~~~~~~~ Stereo can then be run either with unstitched or stitched .cub files. Here's an example with the unstitched LE images:: parallel_stereo M104318871LE.cub M104311715LE.cub \ --alignment-method affineepipolar \ run/run Create a DEM, orthoimage, and error image with ``point2dem`` (:numref:`point2dem`):: point2dem --stereographic --auto-proj-center \ --errorimage --orthoimage \ run/run-PC.tif run/run-L.tif Check the stereo convergence angle as printed during preprocessing (:numref:`stereo_pairs`). That angle is often too small for LRO NAC, and then the results are not going to be great. Check the triangulation error (:numref:`triangulation_error`) in the produced error image. This may suggest that bundle adjustment may be needed (:numref:`bundle_adjust`). See :numref:`nextsteps` for a discussion about various stereo speed-vs-quality choices. Consider using mapprojection (:numref:`mapproj-example`) for best results for steep slopes. It is strongly suggested to convert the cameras to CSM (:numref:`csm_linescan`). This makes mapprojection faster, and also can help solve for jitter (:numref:`jitter_solve`). .. _lronac_align: Validation and alignment ~~~~~~~~~~~~~~~~~~~~~~~~ A `LOLA `_ point cloud can be downloaded for the area of interest. Download the RDR ``PointPerRow`` product. The produced DEM can be aligned to LOLA with ``pc_align`` (:numref:`pc_align`), with a command as:: pc_align --max-displacement 500 \ --csv-format 2:lon,3:lat,4:radius_km \ --save-inv-transformed-reference-points \ run/run-DEM.tif LOLA.csv \ -o run/run-align Solving for jitter ~~~~~~~~~~~~~~~~~~ LRO NAC images can have jitter. A process as for CTX in :numref:`jitter_ctx` usually works well to remove it (see also a multi-image example in :numref:`jitter_multiple_images`). ================================================ FILE: docs/examples/mer.rst ================================================ .. _mer-example: Mars Exploration Rovers ----------------------- The Mars Exploration Rovers (MER) have several cameras onboard that acquire stereo pairs. The images come with CAHVOR camera models, that have local positions and orientations. ASP can create point clouds and textured meshes from these cameras. DEMs cannot be created right away, unlike for MSL, which has geolocation information (:numref:`csm_msl`), but an SfM solution is likely to work as in :numref:`rig_msl`. PANCAM, NAVCAM, HAZCAM ~~~~~~~~~~~~~~~~~~~~~~ These are cameras on the rover and are all processed the same way. It is preferred to use NAVCAM images, as those have less distortion than the HAZCAM. .. figure:: ../images/examples/mer/mer_mesh.png Left input image and produced textured mesh. Recipe ^^^^^^ Download the data from the `PDS Image Atlas `_. :: wget https://planetarydata.jpl.nasa.gov/img/data/mer/mer2no_0xxx/data/sol0766/edr/2n194370551effap00p0675l0m1.img wget https://planetarydata.jpl.nasa.gov/img/data/mer/mer2no_0xxx/data/sol0766/edr/2n194370551effap00p0675r0m1.img Create the CAHVOR cameras:: mer2camera 2n194370551effap00p0675l0m1.img mer2camera 2n194370551effap00p0675r0m1.img Run stereo (:numref:`parallel_stereo`) and create a mesh with ``point2mesh`` (:numref:`point2mesh`):: parallel_stereo \ 2n194370551effap00p0675l0m1.img \ 2n194370551effap00p0675r0m1.img \ 2n194370551effap00p0675l0m1.cahvor \ 2n194370551effap00p0675r0m1.cahvor \ run/run point2mesh -s 2 --texture-step-size 2 \ run/run-PC.tif run/run-L.tif See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. It is suggested to filter out points that are not triangulated well because they are too far using the ``parallel_stereo`` option ``--min-triangulation-angle`` (:numref:`stereodefault`). For finer-grained control, can use:: --universe-center camera --near-universe-radius 0.7 \ --far-universe-radius 80.0 These may be suggested as well:: --alignment-method epipolar --force-use-entire-range ================================================ FILE: docs/examples/moc.rst ================================================ .. _moc_example: Mars Global Surveyor MOC-NA --------------------------- In the Stereo Pipeline Tutorial in :numref:`moc_tutorial`, we showed you how to process a narrow angle MOC stereo pair that covered a portion of Hrad Vallis. In this section we will show you more examples, some of which exhibit a problem common to stereo pairs from linescan imagers: ``spacecraft jitter`` is caused by oscillations of the spacecraft due to the movement of other spacecraft hardware. All spacecraft wobble around to some degree but some are particularly susceptible. Jitter causes wave-like distortions along the track of the satellite orbit in DEMs produced from linescan camera images. This effect can be very subtle or quite pronounced, so it is important to check your data products carefully for any sign of this type of artifact. The following examples will show the typical distortions created by this problem. Note that the science teams of HiRISE and LROC are actively working on detecting and correctly modeling jitter in their respective SPICE data. If they succeed in this, the distortions will still be present in the raw images, but the jitter will no longer produce ripple artifacts in the DEMs produced using ours or other stereo reconstruction software. ASP has its own jitter solver, which was shown to reduce the jitter for CTX (Mars) and DigitalGlobe (Earth) data (:numref:`jitter_solve`). Ceraunius Tholus ~~~~~~~~~~~~~~~~ Ceraunius Tholus is a volcano in northern Tharsis on Mars. It can be found at 23.96 N and 262.60 E. This DEM crosses the volcano's caldera. .. figure:: ../images/examples/mocna/ceraunius_tholus_mocna_ge_combined.png :name: mocna_ceraunius_example Example output for MOC-NA of Ceraunius Tholus. Notice the presence of severe washboarding artifacts due to spacecraft jitter. .. _commands-2: Commands ^^^^^^^^ Download the M08/06047 and R07/01361 images from the PDS: :: wget -O M0806047.imq \ https://planetarydata.jpl.nasa.gov/img/data/mgs-m-moc-na_wa-2-sdp-l0-v1.0/mgsc_1068/m08060/m0806047.imq wget -O R0701361.imq \ https://planetarydata.jpl.nasa.gov/img/data/mgs-m-moc-na_wa-2-sdp-l0-v1.0/mgsc_1270/r07013/r0701361.imq Then process: :: ISIS> moc2isis f=M0806047.imq t=M0806047.cub ISIS> moc2isis f=R0701361.imq t=R0701361.cub ISIS> spiceinit from=M0806047.cub ISIS> spiceinit from=R0701361.cub ISIS> cam2map4stereo.py M0806047.cub R0701361.cub ISIS> parallel_stereo M0806047.map.cub R0701361.map.cub result/output See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. See :numref:`examples` for other examples. ================================================ FILE: docs/examples/msl.rst ================================================ .. _rig_msl: MSL navcam example ------------------ This is an example of using the ASP tools to process images taken by the Mars Science Laboratory (MSL) rover `Curiosity `_. See :numref:`rig_examples` for other examples. This approach uses the images to create a self-consistent solution, which can be registered to the ground (:numref:`msl_registration`). :numref:`csm_msl` discusses using the known camera poses for MSL. .. _rig_msl_figure: Illustration ~~~~~~~~~~~~ .. figure:: ../images/msl_kimberly_mesh.png :name: rig_msl_figure1 :alt: MSL Kimberly mesh .. figure:: ../images/msl_kimberly_photo.png :name: rig_msl_figure2 :alt: MSL Kimberly photo A mesh created with 22 MSL navcam images acquired on SOL 597 (top), and several representative images from this set (bottom). Sensor information ~~~~~~~~~~~~~~~~~~ Curiosity has two navcam sensors (left and right) mounted on a stereo rig. Each records images at a resolution of 1024 x 1024 pixels. The field of view is 45 degrees. .. _msl_challenges: Challenges ~~~~~~~~~~ The navcam images are used to plan the path of the rover. They are not acquired specifically for mapping. While there is good overlap and perspective difference between images that are taken at the same time with the stereo rig, these assumptions may not hold for images produced at different times. Moreover, after the rover changes position, there is usually a large perspective difference and little overlap with earlier images. Prior work ~~~~~~~~~~ A very useful reference on processing MSL images is :cite:`caravaca20203d`. It uses the commercial Agisoft Photoscan software. To help with matching the images, that paper uses the global position and orientation of each image and projects these onto the ground. Such data is not fully present in the .LBL files in PDS, as those contain only local coordinates, and would necessitate queering the SPICE database. It also incorporates lower-resolution "TRAV" images to tie the data together. .. _msl_image_prep: Data preparation ~~~~~~~~~~~~~~~~ The images are fetched from PDS. For example, to get the data for day (SOL) 597 on Mars, use the command:: dir=data/msl/MSLNAV_0XXX/DATA/SOL00597 wget -r -nH --cut-dirs=4 --no-parent \ --reject="index.html*" \ https://pds-imaging.jpl.nasa.gov/$dir \ --include $dir This will create the directory ``SOL00597`` containing .IMG data files and .LBL metadata. Using the ISIS ``pds2isis`` program (see :numref:`planetary_images` for installation), these can be converted to .cub files as:: pds2isis from = SOL00597/image.LBL to = SOL00597/image.cub A .cub file obtained with the left navcam sensor will have a name like:: SOL00597/NLB_451023553EDR_F0310946NCAM00492M1.cub while for the right sensor the prefix will be instead ``NRB``. The full-resolution images have ``_F`` as part of their name, as above. We will convert the .cub files to the TIF format so that they can be understood by ``theia_sfm``. The ``rig_calibrator`` convention will be used, of storing each sensor's data in its own subdirectory (:numref:`rig_data_conv`). We will name the left and right navcam sensors ``lnav`` and ``rnav``. Then, the conversion commands are along the lines of:: mkdir -p SOL00597/lnav isis2std from = SOL00597/left_image.cub \ to = SOL00597/lnav/left_image.tif Each produced image will have a timestamp, with the same value for the left and right navcam images taken at the same time. Image selection ~~~~~~~~~~~~~~~ A subset of 22 images was selected for SOL 597 (half for each of the left and right navcam sensors). Images were chosen based on visual inspection. A fully automatic approach may be challenging (:numref:`msl_challenges`). This dataset is available for `download `_. .. _msl_init_rig: Setting up the initial rig ~~~~~~~~~~~~~~~~~~~~~~~~~~ Given the earlier sensor information, the focal length can be found using the formula: .. math:: f = \frac{w}{2\tan(\frac{\theta}{2})} where :math:`w` is sensor width in pixels and :math:`\theta` is the field of view. The focal length is then about 1236.0773 pixels. We will start by assuming that the optical center is at the image center, and no distortion. Hence, the initial rig configuration (:numref:`rig_config`) will look like:: ref_sensor_name: lnav sensor_name: lnav focal_length: 1236.0773 optical_center: 512 512 distortion_coeffs: distortion_type: no_distortion image_size: 1024 1024 distorted_crop_size: 1024 1024 undistorted_image_size: 1024 1024 ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0 depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0 ref_to_sensor_timestamp_offset: 0 with an additional identical block for the ``rnav`` sensor (without ``ref_sensor_name``). SfM map creation ~~~~~~~~~~~~~~~~ Given the data and rig configuration, the image names in .tif format were put in a list, with one entry per line. The ``theia_sfm`` program (:numref:`theia_sfm`) was run to find initial camera poses:: theia_sfm \ --rig-config rig_config.txt \ --image-list list.txt \ --out-dir theia_rig Next, ``rig_calibrator`` (:numref:`rig_calibrator`) is used, to enforce the rig constraint between the left and right navcam sensors and refine the intrinsics:: params="focal_length,optical_center" float="lnav:${params} rnav:${params}" rig_calibrator \ --rig-config rig_config.txt \ --nvm theia_rig/cameras.nvm \ --camera-poses-to-float "lnav rnav" \ --intrinsics-to-float "$float" \ --num-iterations 100 \ --num-passes 2 \ --num-overlaps 5 \ --out-dir rig_out To optimize the distortion, one can adjust the rig configuration by setting initial distortion values and type:: distortion_coeffs: 1e-8 1e-8 1e-8 1e-8 1e-8 distortion_type: radtan and then defining the list of parameters to optimize as:: params="focal_length,optical_center,distortion" For this example, plausible solutions were obtained with and without using distortion modeling, but likely for creation of pixel-level registered textured meshes handling distortion is important. The produced pairwise matches in ``rig_out/cameras.nvm`` can be inspected with ``stereo_gui`` (:numref:`stereo_gui_nvm`). Mesh creation ~~~~~~~~~~~~~ Here, a point cloud is created from every stereo pair consisting of a left sensor image and corresponding right image, and those are fused into a mesh. Some parameters are set up first. Stereo options (:numref:`stereodefault`):: stereo_opts=" --stereo-algorithm asp_mgm --alignment-method affineepipolar --ip-per-image 10000 --min-triangulation-angle 0.1 --global-alignment-threshold 5 --session nadirpinhole --no-datum --corr-seed-mode 1 --max-disp-spread 300 --ip-inlier-factor 0.4 --nodata-value 0" Point cloud filter options (:numref:`pc_filter`):: maxDistanceFromCamera=100.0 pc_filter_opts=" --max-camera-ray-to-surface-normal-angle 85 --max-valid-triangulation-error 10.0 --max-distance-from-camera $maxDistanceFromCamera --blending-dist 50 --blending-power 1" Mesh generation options (:numref:`voxblox_mesh`):: mesh_gen_opts=" --min_ray_length 0.1 --max_ray_length $maxDistanceFromCamera --voxel_size 0.05" Set up the pairs to run stereo on:: outDir=stereo mkdir -p ${outDir} grep lnav list.txt > ${outDir}/left.txt grep rnav list.txt > ${outDir}/right.txt The optimized rig, in ``rig_out/rig_config.txt``, and optimized cameras, in ``rig_out/cameras.txt``, are passed to ``multi_stereo`` (:numref:`multi_stereo`):: multi_stereo \ --rig_config rig_out/rig_config.txt \ --camera_poses rig_out/cameras.txt \ --undistorted_crop_win '1100 1100' \ --rig_sensor "lnav rnav" \ --first_step stereo \ --last_step mesh_gen \ --stereo_options "$stereo_opts" \ --pc_filter_options "$pc_filter_opts" \ --mesh_gen_options "$mesh_gen_opts" \ --left ${outDir}/left.txt \ --right ${outDir}/right.txt \ --out_dir ${outDir} This created:: ${outDir}/lnav_rnav/fused_mesh.ply See the produced mesh in :numref:`rig_msl_figure`. .. _msl_registration: Ground registration ~~~~~~~~~~~~~~~~~~~ To create DEMs, for example for rover cameras, the cameras should be registered to the ground. We will discuss how to do that both when a prior DEM is available and when not. For registration to a local Cartesian coordinate system, see instead :numref:`rig_calibrator_registration`. Invocation of bundle adjustment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``rig_calibrator`` option ``--save_pinhole_cameras`` can export the camera poses to Pinhole format (:numref:`pinholemodels`). It will also save the list of input images (:numref:`rc_ba`). These can be ingested by ASP's bundle adjustment program (:numref:`bundle_adjust`). It can transform the cameras to ground coordinates using ground control points (GCP, :numref:`bagcp`), with the option ``--transform-cameras-with-shared-gcp``. Here is an example invocation:: bundle_adjust \ --image-list rig_out/image_list.txt \ --camera-list rig_out/camera_list.txt \ --nvm rig_out/cameras.nvm \ --num-iterations 0 \ --inline-adjustments \ --datum D_MARS \ --remove-outliers-params "75 3 50 50" \ --transform-cameras-with-shared-gcp \ gcp1.gcp gcp2.gcp gcp3.gcp \ -o ba/run The ``--datum`` option is very important, and it should be set depending on the planetary body. Using zero iterations will only apply the registration transform, and *will preserve* the rig structure, up to a scale factor. With a positive number of iterations, the cameras will be further refined in bundle adjustment, while using the GCP. For such refinement it is important to have many interest point matches between the images. This will *not preserve* the rig structure. We used high values in ``--remove-outliers-params`` to avoid removing valid features in the images if there is unmodeled distortion. See :numref:`ba_err_per_point` for a report file that measures reprojection errors, including for GCP. It is very important to examine those. They should be less than a few dozen pixels, and ideally less. With the cameras correctly registered and self-consistent, dense stereo point clouds and DEMs can be created (:numref:`nextsteps`), that can be mosaicked (:numref:`dem_mosaic`) and aligned to a prior dataset (:numref:`pc_align`). For difficult areas with few interest points matches, the images (with cameras now in planetary coordinates) can be mapprojected, and the resulting images can be used to find many more interest points (:numref:`mapip`). Use of registered data with rig_calibrator ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``bundle_adjust`` program will produce the file ``ba/run.nvm`` having the registered camera positions and the control network. This can be passed back to ``rig_calibrator``, if needed, together with the latest optimized rig, which is at ``rig_out/rig_config.txt``. The command is:: rig_calibrator \ --rig-config rig_out/rig_config.txt \ --nvm ba/run.nvm \ --camera-poses-to-float "lnav rnav" \ --intrinsics-to-float "$float" \ --num-iterations 100 \ --num-passes 2 \ --num-overlaps 0 \ --out-dir rig_out_reg Here we set ``--num_overlaps 0`` as we do not want to try to create interest point matches again. GCP and custom DEM creation ^^^^^^^^^^^^^^^^^^^^^^^^^^^ GCP files can be created manually by point-and-click in ``stereo_gui`` (:numref:`creatinggcp`) or automatically (:numref:`gcp_gen`), if a prior DEM and/or orthoimage are available. If no prior DEM is available, it is possible to tie several features in the images to made-up ground points. For example, consider a ground box with given width and height, in meters, such as 10 x 4 meters. Create a CSV file named ``ground.csv`` of the form:: # x (meters) y(meters) height (meters) 0 0 0 10 0 0 10 4 0 0 4 0 This can be made into a DEM with ``point2dem`` (:numref:`point2dem`):: 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" format="1:northing,2:easting,3:height_above_datum" point2dem \ --datum D_MARS \ --csv-format "$format" \ --csv-srs "$proj" \ --t_srs "$proj" \ --tr 0.1 \ --search-radius-factor 0.5 \ ground.csv Ensure the correct planet radii and datum are used. The projection can be auto-determined (:numref:`point2dem_proj`). Then, following the procedure :numref:`creatinggcp`, features can be picked in the images and tied to some of the corners of this box, creating GCP files, which are then used as earlier. Multiple subsets of the images can be used, with each producing a GCP file. All can then be passed together to ``bundle_adjust``. .. _msl_validation: Validation of registered DEMs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Solving for both intrinsics and camera poses is a complex nonlinear problem, that may have more than one solution. It is strongly suggested to compare the produced individual DEMs (after alignment, :numref:`pc_align`) to a trusted DEM, even if at a lower resolution. In case of horizontal misalignment, it is suggested to individually align the produced DEMs to the prior DEM, apply the alignment transform to the cameras (:numref:`ba_pc_align`), then redo the bundle-adjustment with the aligned cameras and the prior DEM as a constraint (:numref:`kaguya_ba`), while refining the intrinsics. It is suggested to use a value of ``--heights-from-dem-uncertainty`` maybe as low as 0.1 or 0.01, if desired to fit tightly to the prior DEM. This may come, however, at the cost of internal consistency. The triangulation error for each DEM (:numref:`point2dem`) can help evaluate the accuracy of the intrinsics. The ``geodiff`` program (:numref:`geodiff`), can be used to assess the vertical agreement between DEMs. For cases when the ASP-produced DEMs have remaining strong differences with the prior DEM, use the ``dem2gcp`` program (:numref:`dem2gcp`) to create GCPs to help correct this. One GCP file can be produced for each stereo pair, and then all can be passed to ``bundle_adjust``. .. figure:: ../images/viper_ground_truth_stereo_dem.png :name: viper_ground_truth_stereo_dem :alt: VIPER ground truth stereo DEM A DEM measured with a point cloud scanner (top) and a mosaicked DEM produced with ASP (bottom), that was carefully validated with the measured DEM. Data acquired in the `Regolith Testbed `_ at NASA Ames. The noise in the upper-left corner is due to an occluding light source. Other sources of noise are because of shadows. The ``asp_bm`` algorithm was used (:numref:`stereo_alg_overview`), which is one of the older algorithms in ASP. Notes ~~~~~ - The voxel size for binning and meshing the point cloud was chosen manually. An automated approach for choosing a representative voxel size is to be implemented. - The ``multi_stereo`` program does not use the interest points found during SfM map construction. That would likely result in a good speedup. It also does not run the stereo pairs in parallel. ================================================ FILE: docs/examples/orbital_rig.rst ================================================ .. _orbital_rig: Orbital rig ----------- This example shows how to produce synthetic images and cameras that model an orbital rig with two frame camera sensors, and how to use the :ref:`rig_calibrator` tool to refine the rig parameters, camera intrinsics, and camera poses. This example demonstrates the new DEM height constraint feature that constrains triangulated points to a reference DEM for improved accuracy. Input DEM and orthoimage ~~~~~~~~~~~~~~~~~~~~~~~~ The synthetic data for this example is created with :ref:`sat_sim`, which requires a DEM and an orthoimage of a region of interest as input. To prepare this data, we obtained the free ASTER dataset:: AST_L1A_00404012022185436_20250920182851.hdf around the San Luis Reservoir in Northern California. A DEM was created following the workflow in :numref:`aster`. The orthoimage was produced by invoking :ref:`mapproject` at a nominal resolution of 15 m/pixel. This resolution reflects the ground sample distance (GSD) of the ASTER images. Synthetic images ~~~~~~~~~~~~~~~~ The synthetic images and cameras were created with ``sat_sim``, which can simulate an orbital rig (:numref:`sat_sim_rig`). The rig was designed with left and right frame cameras, named ``left`` and ``right``. The initial rig configuration was created as described in :numref:`msl_init_rig`. The sensor dimensions were set to 1000 x 1000 pixels, with the principal point at the image center. No lens distortion was assumed. The satellite height was set to 700 km, and the focal length to 35000 pixels. This results in an estimated GSD of about 20 meters (GSD is approximately the satellite height divided by the focal length). These parameters are consistent with the ASTER instrument. The ``sat_sim`` command for the nadir images was:: sat_sim \ --dem aster_dem.tif \ --ortho aster_ortho.tif \ --rig-config aster_rig.txt \ --rig-sensor-ground-offsets \ -0.01,0,-4000,0,0.01,0,4000,0 \ --first 1300 1200 700000 \ --last 1300 1500 700000 \ --first-ground-pos 1300 1200 \ --last-ground-pos 1300 1500 \ --roll 0 --pitch 0 --yaw 0 \ --num 3 \ --velocity 7500 \ -o sat_sim/run-nadir The ``--rig-sensor-ground-offsets`` option places the left and right sensor centers 0.01 m to each side of the rig center, and their footprints on the ground are separated by 8000 m in the East-West direction. The satellite itself follows a North-South orbit. The rig configuration incorporating these controls is saved to the file:: sat_sim/run-nadir-rig_config.txt This file contains the relationship between the rig sensors in the ``ref_to_sensor_transform`` field, in addition to the intrinsics from the input rig. More details are in :numref:`sat_sim_rig_adjust`. A similar command is run to create forward-looking images, but with the ``--pitch`` value set to 30 degrees and the output prefix set to ``sat_sim/run-fwd``. The produced images will have names like:: sat_sim/run-nadir-0010000.418204756-left.tif sat_sim/run-fwd-0009939.411652856-right.tif following the naming convention in :numref:`rig_data_conv`. The components of these filenames are the output prefix, the timestamp, and the sensor name. Time modeling is described in :numref:`sat_sim_time`, and all options for this program are documented in :ref:`sat_sim_options`. .. figure:: ../images/orbital_rig.png :name: orbital_rig_fig :alt: Orbital rig example A sample left and right image as produced by the rig (after mapprojection). The images have notable overlap. These show some fields and mountain foothills in California's Central Valley. Interest point matches ~~~~~~~~~~~~~~~~~~~~~~ The ``rig_calibrator`` program expects the camera poses and the interest point matches between images to be stored in an NVM file (a format commonly employed in Structure-from-Motion applications). See :numref:`ba_nvm`. Since there are 12 input images, and each must be matched against every other one, the :numref:`parallel_bundle_adjust` program is called to ensure parallelization:: parallel_bundle_adjust \ --ip-per-image 10000 \ --output-cnet-type nvm \ sat_sim/*{left,right}.tif \ sat_sim/*{left,right}.tsai \ --camera-weight 1.0 \ --tri-weight 1.0 \ --num-iterations 100 \ -o ba/run Rig calibration ~~~~~~~~~~~~~~~ The :ref:`rig_calibrator` program is then run:: rig_calibrator \ --rig-config sat_sim/run-nadir-rig_config.txt \ --use-initial-rig-transforms \ --fix-rig-translations \ --nvm ba/run.nvm \ --camera-poses-to-float "left right" \ --intrinsics-to-float \ "left:focal_length right:focal_length" \ --camera-position-uncertainty 1.0 \ --heights-from-dem aster_dem.tif \ --heights-from-dem-uncertainty 2.0 \ --heights-from-dem-robust-threshold 0.1 \ --tri-weight 1.0 \ --save-pinhole-cameras \ --num-iterations 100 \ --out-dir rig Since the input data is perfect, very few changes are expected. The produced pinhole cameras (:numref:`pinholemodels`), saved in the output ``rig`` directory (via the ``--save-pinhole-cameras`` option), should be very similar to the initial inputs in the ``sat_sim`` directory. The ``--heights-from-dem`` option demonstrates the new DEM constraint feature. The implementation is as for bundle adjustment (:numref:`heights_from_dem`). Here we used ``--use-initial-rig-transforms`` because we start with a known rig, rather than having to determine it from camera poses. The option ``--fix-rig-translations`` is quite important for orbital rigs. The distance between rig sensors is very small compared to the distance from the satellite to the ground. Without this constraint the rig sensors could move notably in the sensor plane without affecting the reprojection error. Consider using here the option ``--camera-position-uncertainty``. It is suggested to be generous with the uncertainty value, as this constraint can prevent convergence. See :numref:`rig_opts` for the full list of options. ================================================ FILE: docs/examples/pbs_slurm.rst ================================================ .. _pbs_slurm: Using PBS and SLURM ------------------- Running ``parallel_stereo`` (:numref:`parallel_stereo`) can be very computationally expensive, so often it is launched on high-performance multi-machine systems. Here it will be shown how to run this program on a *Portable Batch System* (*PBS*) setup, such as NASA Pleiades, and on a *Simple Linux Utility for Resource Management* (*SLURM*) system. In either of these, it is assumed that all compute nodes share disk storage space and are able communicate with ssh without password. The list of nodes must be passed as an argument to this program via ``--nodes-list``. PBS ~~~ On a PBS system, one can have a script as follows:: #!/bin/bash # Change to current directory cd $PBS_O_WORKDIR # Set the path to ASP tools export PATH=/path/to/ASP/bin:$PATH # Run parallel_stereo parallel_stereo --stereo-algorithm asp_mgm \ --processes 4 --subpixel-mode 3 -t rpc \ --nodes-list $PBS_NODEFILE \ left.tif right.tif left.xml right.xml \ run/run # Run point2dem point2dem --auto-proj-center run/run-PC.tif Note the two special environmental variables ``PBS_O_WORKDIR`` and ``PBS_NODEFILE`` which refer to the current work directory in which the script is started, and the list of nodes allocated for the job. Ensure the option ``--nodes-list`` is set, otherwise only the head node will be used. This script, named for example, ``run.sh``, can be launched as:: qsub -m n -r n -N jobName -l walltime=12:00:00 \ -W group_list=yourGroup -j oe -S /bin/bash \ -l select=8:ncpus=20:model=ivy -- $(pwd)/run.sh Additional arguments can be passed in on this line to ``run.sh``, which can be accessed from within that script as ``$1``, ``$2``, etc., per bash shell conventions. It is strongly suggested to learn what each of the above options does and adjust them for your needs. SLURM ~~~~~ With SLURM, a script as follows can work:: #!/bin/bash #SBATCH --job-name=asp #SBATCH --output=asp.log #SBATCH --nodes=4 #SBATCH --ntasks-per-node=36 #SBATCH --time=50:00:00 #SBATCH --partition=queue1 # Change to the directory in which the job was submitted cd $SLURM_SUBMIT_DIR # Create a temporary list of nodes in current directory nodesList=$(mktemp -p $(pwd)) # Set up the nodes list scontrol show hostname $SLURM_NODELIST | tr ' ' '\n' > $nodesList # Run parallel_stereo. (Ensure that this program is in the path.) parallel_stereo --nodes-list $nodesList \ --processes 4 \ --parallel-options '--sshdelay 0.1' \ # Delete the temporary list of nodes /bin/rm -fv $nodesList As before, the options and values above should be adjusted for your needs. Ensure the option ``--nodes-list`` is set, otherwise only the head node will be used. If your SLURM setup requires a custom ssh port, set in the list of nodes the full ssh command to each node, rather than the node name. Example:: ssh -p port1 node1 ssh -p port2 node2 ================================================ FILE: docs/examples/perusat1.rst ================================================ .. _perusat1: PeruSat-1 --------- PeruSat-1 (launched 2016) is a Peruvian Earth observation satellite with 0.7-meter panchromatic resolution. It provides exact linescan camera models and RPC-approximated camera models in separate files. The names for these start with "DIM" and "RPC", respectively, and end with ".XML". ASP expects raw (non-orthorectified) images. The USGS CSM library (:numref:`csm`) is used for the linescan model. The session type is ``-t perusat`` (:numref:`ps_options`). If the ``-t`` option is not specified, it will be auto-detected from the camera files. For the RPC model (:numref:`rpc`), the option ``-t rpc`` should be used and the RPC camera files should be passed in. .. _perusat1_stereo: Bundle adjustment and stereo with raw images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Bundle adjustment (:numref:`bundle_adjust`) is suggested before stereo:: bundle_adjust -t perusat \ --camera-weight 0 \ --tri-weight 0.1 \ left.tif right.tif \ left_exact.xml right_exact.xml \ -o ba/run With the exact models, the stereo command, with bundle-adjusted cameras, is:: parallel_stereo -t perusat \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --bundle-adjust-prefix ba/run \ left.tif right.tif \ left_exact.xml right_exact.xml \ results/run Then, a DEM is created with ``point2dem`` (:numref:`point2dem`):: point2dem results/run-PC.tif For steep terrain, it is suggested to run stereo with mapprojected images (:numref:`perusat1_map`). See :numref:`nextsteps` for a discussion about various speed-vs-quality choices for stereo. See :numref:`jitter_pleiades` for an example of solving for jitter with these cameras. Note the limitations of the jitter solver in :numref:`jitter_limitations`. This is available as of build 2026/03 (:numref:`release`). .. _perusat1_map: Stereo with mapprojected images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ASP supports running stereo with mapprojected PeruSat-1 images (:numref:`mapproj-example`). As of build 2026/03 (:numref:`release`), mapprojection is significantly faster due to the switch to the CSM camera model. All input images must be mapprojected at the same resolution (which is comparable with the ground sample distance, GSD). The same camera models must be used for mapprojection as for stereo, so one should not mix the exact and RPC cameras. It is strongly suggested to verify that the input DEM used for mapprojection is relative to the ellipsoid (:numref:`conv_to_ellipsoid`). Example:: proj="+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs" mapproject -t perusat \ --tr 0.7 \ --t_srs "$proj" \ --bundle-adjust-prefix ba/run \ ref_dem.tif \ left.tif \ left_exact.xml \ left_map.tif mapproject -t perusat \ --tr 0.7 \ --t_srs "$proj" \ --bundle-adjust-prefix ba/run \ ref_dem.tif \ right.tif \ right_exact.xml \ right_map.tif parallel_stereo -t perusat \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --bundle-adjust-prefix ba/run \ left_map.tif right_map.tif \ left_exact.xml right_exact.xml \ run_map/run \ ref_dem.tif point2dem run_map/run-PC.tif The projection string above needs to be modified for your area of interest. It is strongly suggested to use an auto-determined UTM or polar stereographic projection (:numref:`point2dem_proj`). The value of the ``--tr`` option is the ground sample distance. It is normally 0.7 meters for PeruSat-1 PAN images. The XML files should have the GSD value. To not use bundle-adjusted cameras, remove the option ``--bundle-adjust-prefix`` from all ``mapproject`` and ``parallel_stereo`` commands above. It is strongly suggested to overlay the left and right mapprojected images on each other and on the input DEM in ``stereo_gui`` (:numref:`stereo_gui`). A systematic shift likely indicates a vertical datum disagreement between the DEM and the camera models. .. _perusat1_notes: Notes ~~~~~ For PeruSat-1 exact linescan camera models the atmospheric correction and velocity aberration corrections (:cite:`nugent1966velocity`) are disabled, as these decrease somewhat the agreement with the RPC models. DEMs created with the exact and RPC models differ by a systematic vertical shift of about 15 meters for unknown reasons, even though the intersection error maps are very similar. Nothing in the sensor manual or camera metadata suggests the cause of this. The ``pc_align`` tool (:numref:`pc_align`) can be used to reduce this discrepancy. The mean absolute difference of the (full-image extent) aligned DEMs is about 0.17 meters. ================================================ FILE: docs/examples/pleiades.rst ================================================ .. _pleiades: Pleiades -------- ASP supports the 1A/1B and NEO satellites from Airbus Pleiades. For NEO, see :numref:`pleiades_neo` for additional notes. SPOT 6 and 7 use a closely related camera model (:numref:`spot67`). Generally, ASP expects raw images, not orthorectified images. ASP supports the Pleiades ortho products, if the projection was done on a surface of constant height (:numref:`pleiades_projected`). It does not support images orthorectified with a 3D terrain model. The Airbus Pleiades data have both an exact linescan camera model and an approximate RPC model (:numref:`rpc`). These are stored in separate files. The names for these start with "DIM" and "RPC", respectively, and end with ".XML". ASP supports both kinds. The USGS CSM library (:numref:`csm`) is used for linescan models. See :numref:`jitter_pleiades` for an example of solving for jitter for these cameras. Bundle adjustment and stereo with raw images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :numref:`airbus_tiled` if the input images arrive in multiple tiles. Bundle adjustment (:numref:`bundle_adjust`) is suggested before stereo. It should be run as:: bundle_adjust -t pleiades \ --camera-weight 0 \ --tri-weight 0.1 \ left.tif right.tif \ left_exact.xml right_exact.xml \ -o ba/run With the exact models, the stereo command, with bundle-adjusted cameras, is:: parallel_stereo -t pleiades \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --bundle-adjust-prefix ba/run \ left.tif right.tif \ left_exact.xml right_exact.xml \ results/run Then, a DEM is created with ``point2dem`` (:numref:`point2dem`):: point2dem results/run-PC.tif For steep terrain, it is suggested to run stereo with mapprojected images (:numref:`pleiades_map`). See :numref:`nextsteps` for a discussion about various speed-vs-quality choices for stereo. For the RPC model the option ``-t rpc`` should be used and the correct camera files should be passed in. If the ``-t`` option is not specified, it will be auto-guessed based on the content of the camera files provided as inputs. The ``--bundle-adjust-prefix`` option above enables the use of bundle-adjusted cameras. For Pleiades exact linescan camera models the atmospheric correction and velocity aberration corrections (:cite:`nugent1966velocity`) are disabled. This ensures that the exact and RPC camera models agree (see below). .. _pleiades_map: Stereo with mapprojected images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ASP supports running stereo with mapprojected Pleiades images (:numref:`mapproj-example`). All input images must be mapprojected at the same resolution (which is comparable with the ground sample distance, GSD). The same camera models must be used for mapprojection as for stereo, so one should not mix the exact and RPC cameras. Ensure the input DEM used for mapprojection is relative to the ellipsoid (:numref:`conv_to_ellipsoid`). Example:: proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" mapproject -t pleiades \ --tr 0.5 \ --t_srs "$proj" \ --bundle-adjust-prefix ba/run \ ref_dem.tif \ left.tif \ left_exact.xml \ left_map.tif mapproject -t pleiades \ --tr 0.5 \ --t_srs "$proj" \ --bundle-adjust-prefix ba/run \ ref_dem.tif \ right.tif \ right_exact.xml \ right_map.tif parallel_stereo -t pleiades \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --bundle-adjust-prefix ba/run \ left_map.tif right_map.tif \ left_exact.xml right_exact.xml \ run_map/run \ ref_dem.tif point2dem run_map/run-PC.tif The projection string above needs to be modified for your area of interest. It is strongly suggested to use an auto-determined UTM or polar stereographic projection (:numref:`point2dem_proj`). The value of the ``--tr`` option is the ground sample distance. It is normally 0.5 to 0.7 meters for Pleiades PAN images. The XML files should have the GSD value. To not use bundle-adjusted cameras, remove the option ``--bundle-adjust-prefix`` from all ``mapproject`` and ``parallel_stereo`` commands above. Exact and RPC cameras ~~~~~~~~~~~~~~~~~~~~~ To compare the linescan (exact) and RPC models, run ``cam_test`` (:numref:`cam_test`) as:: cam_test --image img.tif \ --cam1 cam_exact.xml \ --cam2 cam_rpc.xml \ --session1 pleiades --session2 rpc This should give great agreement when it comes to pixels projected from one camera to the ground, then projected back to the other camera:: cam1 to cam2 pixel diff Max: 0.00304066 cam2 to cam1 pixel diff Max: 0.00296764 The camera centers computed by the two methods won't agree, because the RPC camera model does not store the camera center. ASP then substitutes it with an estimated point on the ray from the camera center to the ground. This disagreement is not an issue in practice. Commands similar to the above can be used to compare the exact and RPC cameras not to each other but against themselves. This tool will also print timing information for the operation of projecting a pixel to the ground and back. .. _pleiades_neo: Pleiades NEO ~~~~~~~~~~~~ Several peculiarities make the Pleiades NEO data different from 1A/1B (:numref:`pleiades`): - The tabulated positions and orientations may start slightly after the first image line and end slightly before the last image line. If these scenarios are encountered, linear extrapolation based on two nearest values is used to fill in the missing values and a warning is printed for each such operation. - There is no field for standard deviation of the ground locations of pixels projected from the cameras, so error propagation is not possible unless such a value is specified manually (:numref:`error_propagation`). - The RPC camera models for a stereo triplet can be rather inconsistent with each other, resulting in large triangulation error. It is suggested to use instead the exact linescan camera model. .. _pleiades_projected: Pleiades projected images ~~~~~~~~~~~~~~~~~~~~~~~~~ Airbus offers Pleiades ortho images, that are projected onto a surface of constant height above a datum. A pair of such images can be used for stereo and terrain creation. Each ortho image comes with two XML files. The first, with the ``DIM`` prefix, stores the projection height, in the ``Bounding_Polygon`` XML field, in the ``H`` subfield. This height is in meters, above the WGS84 ellipsoid. This file lacks the camera model, unlike the earlier products. The second XML file starts with the ``RPC`` prefix and contains the RPC camera model. Given two such images forming a stereo pair, the heights should be manually read from the ``DIM`` files. Then, ``parallel_stereo`` should be invoked with the RPC camera files, as discussed in :numref:`mapproj_ortho`. ASP does not support Airbus images that are orthorectified with a 3D terrain model, as that terrain model is not known. .. _airbus_tiled: Pleiades tiled images ~~~~~~~~~~~~~~~~~~~~~ With some Airbus Pleiades data, each of the left and right images may arrive broken up into .TIF or .JP2 tiles, with names ending in R1C1.tif, R2C1.tif, etc. These need to be mosaicked before being used. That can be done as follows (individually for the left and right stereo image), using ``gdalbuildvrt`` (:numref:`gdal_tools`):: gdalbuildvrt vrt.tif *R*C*.tif This expects any input .tif file to have an associated .tfw (.TFW) file containing information about how the tiles should be combined. If both PAN and multispectral tiles are present, use only the PAN ones. This will create a virtual mosaic, which is just a plain text file having pointers to the subimages. ASP can use that one as if it were a real image. If desired, an actual self-contained image can be produced with:: gdal_translate -co TILED=YES -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \ -co BIGTIFF=IF_SAFER vrt.tif image.tif Note that the size of this image will be comparable to the sum of sizes of the original tiles. The Orfeo Toolbox provides functionality for stitching such images as well. ================================================ FILE: docs/examples/rig.rst ================================================ .. _rig_calibrator_example: A 3-sensor rig example ^^^^^^^^^^^^^^^^^^^^^^ This is an example using ``rig_calibrator`` (:numref:`rig_calibrator`) on images acquired in a lab with cameras mounted on the `Astrobee `_ robot. See :numref:`rig_examples` for more examples. An illustration is in :numref:`rig_calibrator_textures`. The dataset for this example is available `for download `_. This robot has three cameras: ``nav_cam`` (wide field of view, using the fisheye distortion model), ``sci_cam`` (narrow field of view, using the radtan distortion model), and ``haz_cam`` (has depth measurements, with one depth xyz value per pixel, narrow field of view, using the radtan distortion model). We assume the intrinsics of each sensor are reasonably well-known (but can be optimized later). Those are set in the rig configuration (:numref:`rig_config`). The images are organized as as in :numref:`rig_data_conv`. The first step is solving for the camera poses, for which we use ``theia_sfm`` (:numref:`theia_sfm`):: theia_sfm --rig-config rig_input/rig_config.txt \ --images 'rig_input/nav_cam/*.tif rig_input/haz_cam/*.tif rig_input/sci_cam/*.tif' \ --out-dir rig_theia This tool will use the Theia flags file from ``share/theia_flags.txt`` in the software distribution, which can be copied to a new name, edited, and passed to this program via ``--theia_flags``. For this example, it is suggested to edit that flags file and set ``--feature_density=DENSE``, as the default number of features found by Theia may be too low for the images in this dataset. The created cameras can be visualized as:: view_reconstruction --reconstruction rig_theia/reconstruction-0 See an illustration in :numref:`view_reconstruction`. The solved camera poses are exported to ``rig_theia/cameras.nvm``. The images and interest point matches can be visualized in a pairwise manner using ``stereo_gui`` (:numref:`stereo_gui_nvm`) as:: stereo_gui rig_theia/cameras.nvm The images in the nvm file will be in random order. This will be rectified by ``rig_calibrator``. Next, we run ``rig_calibrator``:: float_intr="" # not floating intrinsics rig_calibrator \ --rig-config rig_input/rig_config.txt \ --nvm rig_theia/cameras.nvm \ --camera-poses-to-float "nav_cam sci_cam haz_cam" \ --intrinsics-to-float "$float_intr" \ --depth-to-image-transforms-to-float "haz_cam" \ --float-scale \ --bracket-len 1.0 \ --bracket-single-image \ --num-iterations 100 \ --num-passes 2 \ --registration \ --hugin-file control_points.pto \ --xyz-file xyz.txt \ --export-to-voxblox \ --out-dir rig_out The previously found camera poses are read in. They are registered to world coordinates (this is optional). For that, the four corners of a square with known dimensions visible in a couple of images were picked at control points in ``Hugin`` (https://hugin.sourceforge.io/) and saved to ``control_points.pto``, and the corresponding measurements of their coordinates were saved in ``xyz.txt``. See :numref:`rig_calibrator_registration` for more details. The ``nav_cam`` camera is chosen to be the reference sensor in the rig configuration. Its poses are allowed to float, that is, to be optimized (``--camera-poses-to-float``), and the rig transforms from this one to the other ones are floated as well, when passed in via the same option. The scale of depth clouds is floated as well (``--float-scale``). Here we chose to optimize the rig while keeping the intrinsics fixed. Floating the intrinsics, especially the distortion parameters, requires many interest point matches, especially towards image boundary, and can make the problem less stable. If desired to float them, one can replace ``float_intr=""`` with:: intr="focal_length,optical_center,distortion" float_intr="nav_cam:${intr} haz_cam:${intr} sci_cam:${intr}" which will be passed above to the option ``--intrinsics-to-float``. In this particular case, the real-world scale (but not orientation) would have been solved for correctly even without registration, as it would be inferred from the depth clouds. Since the ``nav_cam`` camera has a wide field of view, the values in ``distorted_crop_size`` in the rig configuration are smaller than actual image dimensions to reduce the worst effects of peripheral distortion. One could pass in ``--num-overlaps 10`` to get more interest point matches than what Theia finds, but this is usually not necessary. This number better be kept small, especially if the features are poor, as it may result in many outliers among images that do not match well. The value of ``--bracket-len`` should be a little larger than the differences (in seconds) between the image times for which it is desired to do pose interpolation in time. The option ``--bracket-single-image`` is used to ensure that just a single non-reference image is used for each time bracket (useful if there are too many images). The options ``--save-pinhole-cameras`` and ``--save-matches`` can be employed to save the pinhole cameras and the interest point matches in formats understood by ``bundle_adjust`` (:numref:`bundle_adjust`) and ``stereo_gui`` (:numref:`stereo_gui_nvm`), respectively. See :numref:`rig_opts` for the full list of options. The obtained point clouds can be fused into a mesh using ``voxblox_mesh`` (:numref:`voxblox_mesh`), using the command:: voxblox_mesh --index rig_out/voxblox/haz_cam/index.txt \ --output_mesh rig_out/fused_mesh.ply \ --min_ray_length 0.1 --max_ray_length 4.0 \ --voxel_size 0.01 This assumes that depth sensors were present. Otherwise, can needs to create point clouds with stereo, see :numref:`multi_stereo`. The output mesh is ``fused_mesh.ply``, points no further than 2 meters from each camera center are used, and the mesh is obtained after binning the points into voxels of 1 cm in size. Full-resolution textured meshes can be obtained by projecting and fusing the images for each sensor with ``texrecon`` (:numref:`texrecon`):: for cam in nav_cam sci_cam; do texrecon --rig_config rig_out/rig_config.txt \ --camera_poses rig_out/cameras.txt \ --mesh rig_out/fused_mesh.ply \ --rig_sensor ${cam} \ --undistorted_crop_win '1000 800' \ --out_dir rig_out/texture done The obtained textured meshes can be inspected for disagreements, by loading them in MeshLab, as:: meshlab rig_out/fused_mesh.ply \ rig_out/texture/nav_cam/texture.obj \ rig_out/texture/sci_cam/texture.obj See an illustration in :numref:`rig_calibrator_textures`. See a larger example in :numref:`sfm_iss`, using two rigs. ================================================ FILE: docs/examples/rpc.rst ================================================ .. _rpc: RPC camera models ----------------- Some vendors, such as GeoEye with its Ikonos and two GeoEye satellites, Airbus, with its SPOT and Pleiades satellites, the Indian Cartosat-1 satellite, PeruSat-1, the Spanish Deimos 1 and 2, etc., provide Rational Polynomial Coefficient (RPC) camera models. (Certain providers also offer exact linescan models. ASP supports the ones from DigitalGlobe/Maxar (:numref:`dg_tutorial`), PeruSat-1 (:numref:`perusat1`), Pleiades 1A/1B (:numref:`pleiades`), SPOT 5 (:numref:`spot5`), and SPOT 6/7 (:numref:`spot67`).) About RPC ~~~~~~~~~ RPC represents four 20-element polynomials that map geodetic coordinates (longitude-latitude-height above datum) to image pixels. Since they are easy to implement and fast to evaluate, RPC represents a universal camera model providing a simple approximation to complex exact camera models that are unique to each vendor. The only downside is that it has less precision in our opinion compared to the exact camera models. Our RPC read driver is GDAL. If the command ``gdalinfo`` (:numref:`gdal_tools`) can identify the RPC information inside the headers of your image files (whether that information is actually embedded in the images, or stored separately in some auxiliary files with a convention GDAL understands), ASP will likely be able to see it as well. This means that sometimes we can get away with only providing a left and right image, with no extra files containing camera information. This is specifically the case for GeoEye, and Cartosat-1. Otherwise, the camera files must be specified separately in XML files, as done for DigitalGlobe/Maxar images (:numref:`rawdg`) and PeruSat-1. See :numref:`airbus_tiled` if the input Pleiades images arrive in multiple tiles. Examples ~~~~~~~~ Here we work with a GeoEye dataset for Hobart, Australia. As previously stated in :numref:`dg_tutorial`, these types of images are not ideal for ASP. This is both a forest and a urban area which makes correlation difficult. ASP was designed more for modeling bare rock and ice. Any results we produce in other environments is a bonus but is not our objective. .. figure:: ../images/examples/geoeye/GeoEye_CloseUp_triple.png :name: geoeye-nomap-example Example colorized height map and ortho image output, produced with ``point2dem`` (:numref:`point2dem`) and ``mapproject`` (:numref:`mapproject`), respectively. GoeEye's datasets have the RPC coefficients stored as part of the images. The stereo command is then:: parallel_stereo -t rpc \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ left.tif right.tif \ results/run See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. For terrains having steep slopes, we recommend that images be mapprojected onto an existing DEM before running stereo. This is described in :numref:`mapproj-example`. Next, ``point2dem`` (:numref:`point2dem`) is run:: point2dem --auto-proj-center results/run-PC.tif For some cameras the RPC coefficients are stored in separate files ending in .RPB or \_RPC.TXT (or in lower-case). These will be loaded automatically and should not be specified in the stereo command. For Cartosat data sometimes one should overwrite the \_RPC.TXT files that are present with the ones that end in RPC_ORG.TXT in order for stereo to work. If the RPC cameras are stored separately in XML files, the stereo command is:: parallel_stereo -t rpc \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ left.tif right.tif \ left.xml right.xml \ results/run The RPC cameras can be bundle-adjusted (:numref:`bundle_adjust`). If the RPC coefficients are stored in the input images, ``mapproject`` copies them to the output mapprojected images. If these coefficients are in the associated .RPB or \_RPC.TXT files, ``mapproject`` creates such files for each mapprojected image. See :numref:`other-mapproj` for how ``parallel_stereo`` is invoked with mapprojected images when the cameras are stored either separately or part of the images. .. _rpc_and_ba: Adjusted RPC cameras ~~~~~~~~~~~~~~~~~~~~ It is suggested to run bundle adjustment (:numref:`bundle_adjust`) before stereo, to ensure the cameras are self-consistent. An example is in :numref:`ba_rpc`. Bundle adjustment produces ``.adjust`` files that have rotation and translation adjustments to the original cameras. These can be passed to other ASP tools via the ``--bundle-adjust-prefix`` option. To make new RPC cameras, with the adjustments already applied to them, use the ``bundle_adjust`` option ``--save-adjusted-rpc``. These are saved in the ``bundle_adjust`` output directory, with names ending in ``.adjusted_rpc.xml``. These cameras can be used with ASP and third-party software. Any produced adjusted RPC model file can be loaded by GDAL when reading an image (including with ``gdalinfo``, :numref:`gdal_tools`) if it is renamed to have the same name as the image but with the ``.xml`` extension, and no analogously named ``.RPB`` or ``_RPC.txt`` files are present that *may take precedence*. See the `GeoTiff documentation `_. Applying the adjustments refits the RPC models, and should create cameras that agree well with the ones with the adjustments applied externally. It is strongly suggested to use the ``cam_test`` program to see how well an input RPC camera agrees with itself, and the same for testing with the RPC camera produced as documented here against itself (:numref:`cam_test`). With this program, choose the value of the option ``--height-above-datum`` to be not too far from the height offset in the RPC model, or surely within the acceptable height range of the RPC model, as given by the height offset and height scale. This refitting will not work well for Umbra SAR cameras (:numref:`umbra_sar`), where the height scale parameter is very large and the RPC fit does not work in the full-height box, but only in a small range around the height offset. If ``bundle_adjust`` is invoked with 0 iterations, the input RPC and refit RPC should also be tested for agreement, as then they in principle should be about the same. To export an existing RPC camera to XML format without refitting it, use ``cam_gen`` (:numref:`cam_gen_rpc`). Creation of RPC cameras ~~~~~~~~~~~~~~~~~~~~~~~ In addition to supporting the provided RPC models, ASP provides a tool named ``cam2rpc`` (:numref:`cam2rpc`), that can be used to create RPC camera models from ISIS and all other cameras that ASP understands, including for non-Earth planets (currently only the Earth, Moon and Mars are supported). In such situations, the planet datum must be passed to the tools reading the RPC models, via the ``--datum`` option. .. _rpc_tri: Triangulation with RPC cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An RPC camera model is a black-box model, rather than one using rigorous camera geometry. It is only able to compute a pixel value in the camera given a point on the ground. For triangulation, it is necessary to be able to calculate a ray emanating from a given pixel going to the ground. With RPC cameras, a somewhat indirect method is used. A ray is found by determining with a solver two points on the ground that project into the same pixel, with both points within the lon-lat-height box of the RPC model. In the latest ASP build (:numref:`release`), these points are picked at +/- min(50.0, ``height_scale``) meters from the height offset specified in the RPC model. A larger range does not make a difference, except for situations when ``height_scale`` does not represent correctly the actual height range the RPC model was fit on, such as for Umbra SAR (:numref:`umbra_sar`). In earlier ASP versions, the points were picked at +/- 0.9 times the height scale, which worked well enough except for SAR. Another ray is found the same way for the second image. Then, the two rays are intersected as usual. Note that the RPC model does not have the concept of camera center. This is set to a point in the lon-lat-height box that projects into the pixel (0, 0) in the camera (at maximum height in the box). This is not a serious problem as long as the camera centers are not used for modeling the orbit or controlling the camera location. Bundle adjustment and terrain reconstruction are not affected. ================================================ FILE: docs/examples/sfm_iss.rst ================================================ .. _sfm_iss: Mapping the ISS using 2 rigs with 3 cameras each ------------------------------------------------ This example will show how to use the tools shipped with ASP to create a 360-degree textured mesh of the `Japanese Experiment Module `_ (JEM, also known as Kibo), on the International Space Station. See :numref:`rig_examples` for more examples. These tools were created as part of the `ISAAC `_ project. .. _sfm_iss_figure: Illustration ^^^^^^^^^^^^ .. figure:: ../images/sci_cam_texture.png :name: sfm_iss_texture :alt: Rig calibrator texture. .. figure:: ../images/sci_cam_large_texture.png :name: sfm_large_iss_texture :alt: Rig calibrator texture. .. figure:: ../images/sci_cam_photo.png :name: sfm_iss_photo :alt: Rig calibrator photo. A mesh created with the ``haz_cam`` depth + image sensor and textured with ``sci_cam`` (top). A zoomed-out version showing more of the module (middle). A ``sci_cam`` image that was used to texture the mesh (bottom). The JEM module has many cables and cargo, and the bot acquired the data spinning in place. This resulted in some noise and holes in the mesh. The ``sci_cam`` texture was, however, quite seamless, with very good agreement with the ``nav_cam`` texture (not shown), which shows that the registration was done correctly. Overview ^^^^^^^^ Two `Astrobee `_ robots, named *bumble* and *queen*, scanned the JEM, with each doing a portion. Both robots have a wide-field of view navigation camera (``nav_cam``), a color camera (``sci_cam``), and a low-resolution depth+intensity camera (``haz_cam``). To record the data, the robots took several stops along the center module axis, and at each stop acquired data from a multitude of perspectives, while rotating in place. The data was combined into a sparse SfM map using ``theia_sfm`` (:numref:`theia_sfm`). The camera poses were refined with ``rig_calibrator`` (:numref:`rig_calibrator`). That tool models the fact that each set of sensors is on a rig (contained within a rigid robot frame). Then, the depth clouds were fused into a mesh with ``voxblox_mesh`` (:numref:`voxblox_mesh`), and textured with ``texrecon`` (:numref:`texrecon`). .. _sfm_iss_acquisition: Data acquisition strategy ^^^^^^^^^^^^^^^^^^^^^^^^^ If designing a mapping approach, it is best to: - Have the cameras face the surface being imaged while moving parallel to it, in a panning motion. - Ensure consecutively acquired images have about 75% - 90% overlap. This and the earlier condition result in a solid perspective difference but enough similarity so that the images are registered successfully. - If more than one robot (rig) is used, there should be a decently-sized surface portion seen by more than rig, to be able to tie them reliably together. Challenges ^^^^^^^^^^ This example required care to address the in-place rotations, which resulted in very little perspective change between nearby images (hence in uncertain triangulated points), a wide range of resolutions and distances, and occlusions (which resulted in holes). Another difficulty was the low resolution and unique imaging modality of ``haz_cam``, which made it tricky to find interest point matches (tie points) to other sensor data. .. _sfm_iss_processing: Data processing strategy ^^^^^^^^^^^^^^^^^^^^^^^^ All sensors acquire the data at independent times. The color ``sci_cam`` sensor takes one picture every few seconds, the ``nav_cam`` takes about 2-3 pictures per second, and ``haz_cam`` takes about 10 pictures per second. The ``nav_cam`` sensor was chosen to be the *reference* sensor. A set of images made by this sensor with both robots was selected, ideally as in :numref:`sfm_iss_acquisition`, and a Structure-from-Motion *sparse map* was built. Since the ``haz_cam`` sensor acquires images and depth data frequently (0.1 seconds), for each ``nav_cam`` image the ``haz_cam`` frame closest in time was selected and its acquisition timestamp was declared to be the same as for the ``nav_cam``. Even if this approximation may result in the geometry moving somewhat, it is likely to not be noticeable in the final textured mesh. The same approximation is likely to be insufficient for ``sci_cam`` when tying it to ``nav_cam``, as the time gap is now larger, and it can result in at least a few pixels of movement whose outcome will be a very noticeable registration error. The approach that ``rig_calibrator`` uses is to bracket each ``sci_cam`` image by ``nav_cam`` images, as seen in :numref:`rig_calibrator_example`, followed by pose interpolation in time. This however doubles the number of ``nav_cam`` images and the amount of time for the various iterations that may be needed to refine the processing. To avoid that, we use the following approach. We assume that a reasonably accurate rig configuration file for the 2-rig 6-sensor setup already exists, but it may not be fully precise. It is shown in :numref:`sfm_iss_sample_rig_config`. It can be found as described in the previous paragraph, on a small subset of the data. Then, given the SfM sparse map created with ``nav_cam`` only, the ``haz_cam`` images (declared to be acquired at the same time as ``nav_cam``) were inserted into this map via the rig constraint. The joint map was registered and optimized, while refining the rig configuration (the transforms between rig sensors). A mesh was created and textured, for each sensor. Any issues with mesh quality and registration challenges can be dealt with at this time. Then, the ``sci_cam`` images were also inserted via the rig constraint, but not using ``nav_cam`` for bracketing, so the placement was approximate. Lastly, the combined map was optimized, while keeping the ``nav_cam`` and ``haz_cam`` poses fixed and refining the ``sci_cam`` poses without the rig constraint or using the timestamp information, which allows the ``sci_cam`` poses to move freely to conform to the other already registered images. This approach also helps with the fact that the ``sci_cam`` timestamp can be somewhat unreliable, given that those images are acquired with a different processor on the robot, so freeing these images from the rig and time acquisition constraints helps with accuracy. How all this is done will be shown in detail below. Installing the software ^^^^^^^^^^^^^^^^^^^^^^^ See :numref:`installation`. The ``bin`` directory of the ASP software should be added to the ``PATH`` environmental variable. Note that ASP ships its own version of Python. That can cause conflicts if ROS and ASP are run in the same terminal. .. _sfm_isis_data_prep: Data preparation ^^^^^^^^^^^^^^^^ The Astrobee data is stored in ROS bags (with an exception for ``sci_cam``), with multiple bags for each robot. sci_cam ~~~~~~~ The ``sci_cam`` data is not stored in bags, but as individual images, for performance reasons, as the images are too big to publish over ROS. Their size is 5344 x 4008 pixels. It is suggested to resample them using the GDAL tool suite shipped with ASP (:numref:`gdal_tools`) as:: gdal_translate -r average -outsize 25% 25% -of jpeg \ input.jpg output.jpg The obtained images should be distributed in directories corresponding to the robot, with names like ``my_data/bumble_sci`` and ``my_data/queen_sci`` (:numref:`rig_data_conv`). nav_cam ~~~~~~~ For each ``sci_cam`` image, the ``nav_cam`` image closest in time will be extracted, using the ``extract_bag`` tool (:numref:`ros_tools_extract`). This is illustrated for one of the robots:: ls my_data/bumble_sci/*.jpg > bumble_sci.txt /usr/bin/python /path/to/ASP/libexec/extract_bag \ --bag mybag.bag \ --timestamp_list bumble_sci.txt \ --topics "/my/nav_cam/topic" \ --dirs "my_data/bumble_nav" \ --timestamp_tol 1.0 Here we used the fact that the ``sci_cam`` images have the acquisition timestamp as part of their name (:numref:`rig_data_conv`). This will create the directory ``my_data/bumble_nav``. The produced files will contain, as for the other cameras, the timestamp as part of their name, which will be different but close in time to the ``sci_cam`` timestamp. The same command should be repeated for the other robot. Examine the created images with the ``eog`` program on the local system. Hopefully the images will have enough overlap. If not, images with intermediate timestamps need to be extracted, with the help of the timestamp-listing tool (:numref:`ros_tools_list`). If, on the other hand, the resulting images are very similar, some may be deleted (also with ``eog``). It is suggested to follow the principles outlined in :numref:`sfm_iss_acquisition`. haz_cam ~~~~~~~ As mentioned in :numref:`sfm_iss_processing`, while the ``nav_cam`` and ``sci_cam`` timestamps are kept precise, it makes the problem much simpler to find the closest ``haz_cam`` images to the chosen ``nav_cam`` images, and to change their timestamps to match ``nav_cam``. For that, the data should be extracted as follows:: ls my_data/bumble_nav/*.jpg > bumble_nav.txt /usr/bin/python /path/to/ASP/libexec/extract_bag \ --bag mybag.bag \ --timestamp_list bumble_nav.txt \ --topics "/my/haz_intensity/topic /my/haz_depth/topic" \ --dirs "my_data/bumble_haz my_data/bumble_haz" \ --timestamp_tol 0.2 \ --approx_timestamp Notice several important differences with the earlier command. We use the ``nav_cam`` timestamps for querying. The tolerance for how close in time produced ``haz_cam`` timestamps are to input ``nav_cam`` images is much smaller, and we use the option ``--approx_timestamp`` to change the timestamp values (and hence the names of the produced files) to conform to ``nav_cam`` timestamps. This tool is called with two topics, to extract the intensity (image) and depth (point cloud) datasets, with the outputs going to the same directory (specified twice, for each topic). The format of the depth clouds is described in :numref:`point_cloud_format`. An analogous invocation should happen for the other rig, with the outputs going to subdirectories for those sensors. A first small run ^^^^^^^^^^^^^^^^^ The strategy in :numref:`sfm_iss_processing` will be followed. Consider a region that is seen in all ``nav_cam`` and ``haz_cam`` images (4 sensors in total). We will take advantage of the fact that each rig configuration is reasonably well-known, so we will create a map with only the ``nav_cam`` data for both robots, and the other sensors will be added later. If no initial rig configuration exists, see :numref:`rig_calibrator_example`. The initial map ~~~~~~~~~~~~~~~ Create a text file having a few dozen ``nav_cam`` images from both rigs in the desired region named ``small_nav_list.txt``, with one image per line. Inspect the images in ``eog``. Ensure that each image has a decent overlap (75%-90%) with some of the other ones, and they cover a connected surface portion. Run ``theia_sfm`` (:numref:`theia_sfm`) with the initial rig configuration (:numref:`sfm_iss_sample_rig_config`), which we will keep in a file called ``initial_rig.txt``:: theia_sfm --rig-config initial_rig.txt \ --image-list small_nav_list.txt \ --out-dir small_theia_nav_rig The images and interest points can be examined in ``stereo_gui`` (:numref:`stereo_gui_nvm`) as:: stereo_gui small_theia_nav_rig/cameras.nvm Control points ~~~~~~~~~~~~~~ The obtained map should be registered to world coordinates. Looking ahead, the full map will need registering as well, so it is good to collect control points over the entire module, perhaps 6-12 of them (the more, the better), with at least four of them in the small desired area of interest that is being done now. The process is described in :numref:`rig_calibrator_registration`. More specific instructions can be found in the `Astrobee documentation `_. If precise registration is not required, one could simply pick some visible object in the scene, roughly estimate its dimensions, and create control points based on that. The produced 3D model will then still be geometrically self-consistent, but the orientation and scale may be off. We will call the produced registration files ``jem_map.pto`` and ``jem_map.txt``. The control points for the images in the future map that are currently not used will be ignored for the time being. Adding haz_cam ~~~~~~~~~~~~~~ Create a list called ``small_haz_list.txt`` having the ``haz_cam`` images with the same timestamps as the ``nav_cam`` images:: ls my_data/*_haz/*.jpg > small_haz_list.txt Insert these in the small map, and optimize all poses together as:: float="bumble_nav bumble_haz queen_nav queen_haz" rig_calibrator \ --registration \ --hugin-file jem_map.pto \ --xyz-file jem_map.txt \ --use-initial-rig-transforms \ --extra-list small_haz_list.txt \ --rig-config initial_rig.txt \ --nvm small_theia_nav_rig/cameras.nvm \ --out-dir small_rig \ --camera-poses-to-float "$float" \ --depth-to-image-transforms-to-float "$float" \ --float-scale \ --intrinsics-to-float "" \ --num-iterations 100 \ --export-to-voxblox \ --num-overlaps 5 \ --min-triangulation-angle 0.5 The depth files will the same names but with the .pc extension will will be picked up automatically. The value of ``--min-triangulation-angle`` filters out rays with a very small angle of convergence. That usually makes the geometry more stable, but if the surface is far from the sensor, and there is not enough perspective difference between images, it may eliminate too many features. The ``--max-reprojection-error`` option may eliminate features as well. Consider adding the option ``--bracket-len 1.0`` that decides the length of time, in seconds, between reference images used to bracket the other sensor. The option ``--bracket-single-image`` will allow only one image of any non-reference sensor to be bracketed. It is suggested to carefully examine the text printed on screen by this tool. See :numref:`rig_calibrator_registration` and :numref:`rig_calibration_stats` for the explanation of some statistics being produced and their expected values. Then, compare the optimized configuration file ``small_rig/rig_config.txt`` with the initial guess rig configuration. The scales of the matrices in the ``depth_to_image_transform`` fields for both sensors should remain quite similar to each other, while different perhaps from their initial values in the earlier file, otherwise the results later will be incorrect. If encountering difficulties here, consider not floating the scales at all, so omitting the ``--float-scale`` option above. The scales will still be adjusted, but not as part of the optimization but when the registration with control points happens. Then they will be multiplied by the same factor. Open the produced ``small_rig/cameras.nvm`` file in ``stereo_gui`` and examine the features between the ``nav_cam`` and ``haz_cam`` images. Usually they are very few, but hopefully at least some are present. Notice that in this run we do not optimize the intrinsics, only the camera poses and depth-to-image transforms. If desired to do so, optimizing the focal length may provide the most payoff, followed by the optical center. It can be tricky to optimize the distortion model, as one needs to ensure there are many features at the periphery of images where the distortion is strongest. It is better to avoid optimizing the intrinsics unless the final texture has subtle misregistration, which may due to intrinsics. Gross misregistration is usually due to other factors, such as insufficient features being matched between the images. Or, perhaps, not all images that see the same view have been matched together. Normally some unmodeled distortion in the images is tolerable if there are many overlapping images, as then their central areas are used the most, and the effect of distortion on the final textured mesh is likely minimal. Mesh creation ~~~~~~~~~~~~~ The registered depth point clouds can be fused with ``voxblox_mesh`` (:numref:`voxblox_mesh`):: cat small_rig/voxblox/*haz*/index.txt > \ small_rig/all_haz_index.txt voxblox_mesh \ --index small_rig/all_haz_index.txt \ --output_mesh small_rig/fused_mesh.ply \ --min_ray_length 0.1 \ --max_ray_length 2.0 \ --median_filter '5 0.01' \ --voxel_size 0.01 The first line combines the index files for the ``bumble_haz`` and ``queen_haz`` sensors. The produced mesh can be examined in ``meshlab``. Normally it should be quite seamless, otherwise the images failed to be tied properly together. There can be noise where the surface being imaged has black objects (which the depth sensor handles poorly), cables, etc. Some rather big holes can be created in the occluded areas. To not use all the input images and clouds, the index file passed in can be edited and entries removed. The names in these files are in one-to-one correspondence with the list of ``haz_cam`` images used earlier. The options ``--min_ray_length`` and ``--max_ray_length`` are used to filter out depth points that are too close or too far from the sensor. The mesh should be post-processed with the CGAL tools (:numref:`cgal_tools`). It is suggested to first remove most small connected components, then do some smoothing and hole-filling, in this order. Several iterations of may be needed, and some tuning of the parameters. Texturing ~~~~~~~~~ Create the ``nav_cam`` texture with ``texrecon`` (:numref:`texrecon`):: sensor="bumble_nav haz queen_nav" texrecon \ --rig_config small_rig/rig_config.txt \ --camera_poses small_rig/cameras.txt \ --mesh small_rig/fused_mesh.ply \ --rig_sensor "${sensor}" \ --undistorted_crop_win '1300 1200' \ --skip_local_seam_leveling \ --out_dir small_rig The same can be done for ``haz_cam``. Then reduce the undistorted crop window to '250 200'. It is helpful to open these together in ``meshlab`` and see if there are seams or differences between them. To use just a subset of the images, see the ``--subset`` option. That is especially important if the robot spins in place, as then some of the depth clouds have points that are far away and may be less accurate. When working with ``meshlab``, it is useful to save for the future several of the "camera views", that is, the perspectives from which the meshes were visualized, and load them next time around. That is done from the "Window" menu, in reasonably recent ``meshlab`` versions. Adding sci_cam ~~~~~~~~~~~~~~ If the above steps are successful, the ``sci_cam`` images for the same region can be added in, while keeping the cameras for the sensors already solved for fixed. This goes as follows:: ls my_data/*_sci/*.jpg > small_sci_list.txt float="bumble_sci queen_sci" rig_calibrator \ --use-initial-rig-transforms \ --nearest-neighbor-interp \ --no-rig \ --bracket-len 1.0 \ --extra-list small_sci_list.txt \ --rig-config small_rig/rig_config.txt \ --nvm small_rig/cameras.nvm \ --out-dir small_sci_rig \ --camera-poses-to-float "$float" \ --depth-to-image-transforms-to-float "$float" \ --intrinsics-to-float "" \ --num-iterations 100 \ --export-to-voxblox \ --num-overlaps 5 \ --min-triangulation-angle 0.5 The notable differences with the earlier invocation is that this time only the ``sci_cam`` images are optimized (floated), the option ``--nearest-neighbor-interp`` is used, which is needed since the ``sci_cam`` images will not have the same timestamps as for the earlier sensor, and the option ``--no-rig`` was added, which decouples the ``sci_cam`` images from the rig, while still optimizing them with the rest of the data, which is fixed and used as a constraint. The option ``--bracket-len`` helps with checking how far in time newly added images are from existing ones. The texturing command is:: sensor="bumble_sci queen_sci" texrecon \ --rig_config small_sci_rig/rig_config.txt \ --camera_poses small_sci_rig/cameras.txt \ --mesh small_rig/fused_mesh.ply \ --rig_sensor "${sensor}" \ --undistorted_crop_win '1300 1200' \ --skip_local_seam_leveling \ --out_dir small_sci_rig Notice how we used the rig configuration and poses from ``small_sci_rig`` but with the earlier mesh from ``small_rig``. The sensor names now refer to ``sci_cam`` as well. The produced textured mesh can be overlaid on top of the earlier ones in ``meshlab``. Results ^^^^^^^ See :numref:`sfm_iss`. Scaling up the problem ^^^^^^^^^^^^^^^^^^^^^^ If all goes well, one can map the whole module. Create several lists of ``nav_cam`` images corresponding to different module portions. For example, for the JEM, which is long in one dimension, one can subdivide it along that axis. Ensure that the portions have generous overlap, so many images show up in more than one list, and that each obtained group of images forms a connected component. That is to say, the union of surface patches as seen from all images in a group should be a contiguous surface. For example, each group can have about 150-200 images, with 50-75 images being shared with each neighboring group. More images being shared will result in a tighter coupling of the datasets and in less registration error. Run ``theia_sfm`` on each group of ``nav_cam`` images. A run can take about 2 hours. While in principle this tool can be run on all images at once, that may take longer than running it on smaller sets with overlaps, unless one has under 500 images or so. The obtained .nvm files can be merged with ``sfm_merge`` (:numref:`sfm_merge`) as:: sfm_merge --fast_merge --rig_config small_rig/rig_config.txt \ theia*/cameras.nvm --output_map merged.nvm Then, given the large merged map, one can continue as earlier in the document, with registration, adding ``haz_cam`` and ``sci_cam`` images, mesh creation, and texturing. Fine-tuning ^^^^^^^^^^^ If the input images show many perspectives and correspond to many distances from the surface being imaged, all this variety is good for tying it all together, but can make texturing problematic. It is suggested to create the fused and textured meshes (using ``voxblox_mesh`` and ``texrecon``) only with subsets of the depth clouds and images that are closest to the surface being imaged and face it head-on. Both of these tools can work with a subset of the data. Manual inspection can be used to delete the low-quality inputs. Consider experimenting with the ``--median_filter``, ``--max_ray_length``, and ``--distance_weight`` options in ``voxblox_mesh`` (:numref:`voxblox_mesh`). Some experimentation can be done with the two ways of creating textures given by the ``texrecon`` option ``--texture_alg`` (:numref:`texrecon`). The default method, named "center", uses the most central area of each image, so, if there are any seams when the the camera is panning, they will be when transitioning from a surface portion using one image to a different one. The other approach, called "area", tries for every small surface portion to find the camera whose direction is more aligned with the surface normal. This may give better results when imaging a round object from many perspectives. In either case, seams are a symptom of registration having failed. It is likely because not all images seeing the same surface have been tied together. Or, perhaps the intrinsics of the sensors were inaccurate. .. _map_surgery: Surgery with maps ^^^^^^^^^^^^^^^^^ If a produced textured mesh is mostly good, but some local portion has artifacts and may benefit from more images and/or depth clouds, either acquired in between existing ones or from a new dataset, this can be done without redoing all the work. A small portion of the existing map can be extracted with the ``sfm_submap`` program (:numref:`sfm_submap`), having just ``nav_cam`` images. A new small map can be made with images from this map and additional ones using ``theia_sfm``. This map can be merged into the existing small map with ``sfm_merge --fast_merge`` (:numref:`sfm_merge`). If the first map passed to this tool is the original small map, its coordinate system will be kept, and the new Theia map will conform to it. Depth clouds for the additional images can be extracted. The combined small map can be refined with ``rig_calibrator``, and depth clouds corresponding to the new data can be inserted, as earlier. The option ``--fixed-image-list`` can be used to keep some images (from the original small map) fixed to not change the scale or position of the optimized combined small map. These operations should be quite fast if the chosen subset of data is small. Then, a mesh can be created and textured just for this data. If happy with the results, this data can then be merged into the original large map, and the combined map can be optimized as before. .. _sfm_iss_sample_rig_config: Sample rig configuration ^^^^^^^^^^^^^^^^^^^^^^^^ This is a rig configuration file having two rigs, with the reference sensor for each given by ``ref_sensor_name``. The reference documentation is in :numref:`rig_config`. :: ref_sensor_name: bumble_nav sensor_name: bumble_nav focal_length: 608 optical_center: 632.53683999999998 549.08385999999996 distortion_coeffs: 0.99869300000000005 distortion_type: fov image_size: 1280 960 distorted_crop_size: 1200 900 undistorted_image_size: 1200 1000 ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0 depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0 ref_to_sensor_timestamp_offset: 0 sensor_name: bumble_haz focal_length: 206.19094999999999 optical_center: 112.48999000000001 81.216598000000005 distortion_coeffs: -0.25949800000000001 -0.084849339999999995 0.0032980310999999999 -0.00024045673000000001 distortion_type: radtan image_size: 224 171 distorted_crop_size: 224 171 undistorted_image_size: 250 200 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 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 ref_to_sensor_timestamp_offset: 0 sensor_name: bumble_sci focal_length: 1023.6054 optical_center: 683.97547 511.2185 distortion_coeffs: -0.025598438 0.048258987 -0.00041380657 0.0056673533 distortion_type: radtan image_size: 1336 1002 distorted_crop_size: 1300 1000 undistorted_image_size: 1300 1200 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 depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0 ref_to_sensor_timestamp_offset: 0.0 ref_sensor_name: queen_nav sensor_name: queen_nav focal_length: 604.39999999999998 optical_center: 588.79561999999999 509.73835000000003 distortion_coeffs: 1.0020100000000001 distortion_type: fov image_size: 1280 960 distorted_crop_size: 1200 900 undistorted_image_size: 1200 1000 ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0 depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0 ref_to_sensor_timestamp_offset: 0 sensor_name: queen_haz focal_length: 210.7242 optical_center: 124.59857 87.888262999999995 distortion_coeffs: -0.37295935000000002 -0.011153150000000001 0.0029100743 -0.013234186 distortion_type: radtan image_size: 224 171 distorted_crop_size: 224 171 undistorted_image_size: 250 200 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 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 ref_to_sensor_timestamp_offset: 0 sensor_name: queen_sci focal_length: 1016.3726 optical_center: 689.17409 501.88817 distortion_coeffs: -0.019654579 0.024057067 -0.00060629998 0.0027509131 distortion_type: radtan image_size: 1336 1002 distorted_crop_size: 1300 1000 undistorted_image_size: 1300 1200 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 depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0 ref_to_sensor_timestamp_offset: 0 ================================================ FILE: docs/examples/sfs_ctx.rst ================================================ .. _sfs_ctx: Shape-from-Shading with CTX images ---------------------------------- This example shows how to refine a stereo terrain model produced with CTX images (:numref:`ctx_example`) with Shape-from-Shading (SfS, :numref:`sfs`). See :numref:`sfs_usage` for an overview and examples for other planets. .. _sfs_ctx_results: Results ~~~~~~~ .. figure:: ../images/ctx_sfs_zoom_in.png :name: ctx_sfs_zoom_in :alt: ctx_sfs_zoom_in :align: left From left to right: (a) a terrain model produced with CTX images and stereo, (b) the same terrain refined with SfS and CTX images, (c) corresponding terrain produced with stereo with HiRISE images. SfS adds notably more detail to the CTX DEM. .. figure:: ../images/ctx_sfs_dem_err.png :name: ctx_sfs_dem_err :alt: ctx_sfs_dem_err :align: left A larger area (about 1100 x 1100 pixels, at 6 m/pixel). The site is inside the Jezero Crater. The top row shows, as before, the CTX stereo terrain, CTX SfS-refined terrain, and a HiRISE terrain for comparison. The bottom row has the differences to the HiRISE stereo DEM of the CTX stereo DEM (left) and SfS-refined DEM (right). The SfS-refined terrain shows somewhat improved agreement with the HiRISE terrain. The range of colors is from -10 to 10 meters. There seems to be some local vertical bias between the CTX and HiRISE terrains that is unrelated to SfS refinement. .. figure:: ../images/ctx_ortho.png :name: ctx_ortho :alt: ctx_ortho :align: left Two input CTX images with different illumination conditions. There are notable lighting differences on the mound in the upper-right area. Preparation ~~~~~~~~~~~ How to fetch and prepare the images is described in :numref:`ctx_example`. The camera models are produced as in :numref:`create_csm_linescan`. It is important to have images with very diverse illumination conditions (Sun azimuth). The azimuth angle can be found with ``sfs --query``. More details are in :numref:`sfs_azimuth`. Some of these images will be used to create terrain models with stereo. Any stereo pair should have similar illumination and a non-small convergence angle (about 30 degrees is feasible for CTX). See :numref:`stereo_pairs`. The full dataset for this area had 115 images. It is recommended to fetch a lot of images first and then select a subset after inspection. The Sun azimuth angle was between -141.5 and -72.8 degrees. This is diverse enough, but a larger range would have been preferable. No data with the Sun on the right was found. The images were bundle-adjusted (:numref:`bundle_adjust`). The resulting model state files (:numref:`csm_state`) were used at all stages of subsequent processing. Three DEMs were produced with ``parallel_stereo`` (:numref:`parallel_stereo`) and ``point2dem`` (:numref:`point2dem`). It is strongly advised to use the ``aspm_mgm`` algorithm (:numref:`nextsteps`) and mapprojection (:numref:`mapproj-example`). CTX images can have very notable jitter (:numref:`jitter_ctx`), and there may be some unmodeled lens distortion. It is suggested to mosaic the produced DEMs with ``dem_mosaic`` (:numref:`dem_mosaic`) and then run ``geodiff`` (:numref:`geodiff`) to compare the mosaic with each individual DEM. The least consistent DEMs should be discarded, and the remaining ones mosaicked together. Any holes in the produced DEM should be filled, and a bit of blur is suggested (:numref:`dem_mosaic_extrapolate`). The resulting mosaic will be the input for SfS refinement. A HiRISE (:numref:`hirise_example`) stereo DEM needs to be created as well. It will help evaluate the results, as it is at a much higher resolution. The HiRISE DEM can be brought into alignment with the CTX one with ``pc_align`` (:numref:`pc_align`). Running SfS ~~~~~~~~~~~ The ids of the CTX images that were input to SfS were as follows. The Sun azimuth and elevation are measured in degrees from the North and the horizon, respectively. .. list-table:: :header-rows: 1 * - image_id - azimuth - elevation * - J10_048842_1986_XN_18N282W - -141.468 - 36.741 * - D14_032794_1989_XN_18N282W - -117.901 - 52.206 * - F05_037752_2008_XN_20N282W - -102.218 - 33.286 * - F03_037119_2001_XN_20N283W - -90.224 - 38.861 * - J22_053233_1984_XN_18N282W - -72.785 - 45.893 The ``parallel_sfs`` (:numref:`parallel_sfs`) command was:: parallel_sfs \ --processes 4 \ --threads 8 \ --save-sparingly \ --tile-size 400 \ --padding 50 \ --nodes-list machines.txt \ -i ctx_dem.tif \ --image-list image_list.txt \ --camera-list camera_list.txt \ --smoothness-weight 0.01 \ --initial-dem-constraint-weight 0.0002 \ --reflectance-type 0 \ --num-haze-coeffs 1 \ --max-iterations 5 \ --float-exposure \ --float-haze \ --float-albedo \ --crop-input-images \ -o sfs/run This produced the DEM named ``sfs/run-DEM-final.tif``. See :numref:`sfs` for the description of these options and the output files. It was very important to model and optimize the albedo, image exposure, and atmospheric haze. There was notable sensitivity on the value of ``--initial-dem-constraint-weight``. That is likely because the input CTX DEM and the reference HiRISE DEM appear to be somewhat inconsistent. Making this value smaller resulted in the SfS DEM being in less agreement with HiRISE. Somewhat surprisingly, the plain Lambertian reflectance (``--reflectance-type 0``) worked about the same as the Lunar-Lambertian model (type 1), with the Hapke model with default parameters (type 2) doing just a very tiny bit better. Co-optimizing the reflectance model coefficients (option ``--float-reflectance-model``) did not make a difference. The value of ``--smoothness-weight`` could have been increased a bit, as some numerical noise is visible. The results are in :numref:`sfs_ctx_results`. Further thoughts ~~~~~~~~~~~~~~~~ The shadows were not modeled here. Given that the Sun was rather high in the sky, with various azimuth and elevation values, their effect is likely not very strong. Pixels in shadows can be given less weight with the ``sfs`` parameter ``--robust-threshold``. This will penalize pixels for which the disagreement between the simulated and measured images is roughly more than this quantity. See :numref:`sfs_earth` for an example and discussion. The disagreement between the stereo CTX and HiRISE terrains (that is seen even before SfS) can be made smaller by individually aligning SfS-refined small tiles (with overlap) to HiRISE, followed by mosaicking. That can make it easier to see where SfS still needs improvement. ================================================ FILE: docs/examples/sfs_earth.rst ================================================ .. _sfs_earth: Shape-from-Shading for Earth ---------------------------- This example shows how to refine a terrain model for Earth using Shape-from-Shading (SfS, :numref:`sfs`). An overview and examples for other planets are given in :numref:`sfs_usage`. .. figure:: ../images/earth_closeup.png :name: earth_input_images :alt: earth_input_images 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. .. figure:: ../images/earth_stereo_sfs_dem.png :name: earth_stereo_sfs_dem :alt: earth_stereo_sfs_dem 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. .. figure:: ../images/earth_ortho_sfs_diff.png :name: earth_ortho_sfs_diff :alt: earth_ortho_sfs_diff Left: Max-lit orthoimage (this eliminates shadows). Right: SfS DEM minus the input DEM. The range of colors is between -0.1 to 0.1 meters. We do not have rigorous validation, but these results look plausible. Earth-specific issues ~~~~~~~~~~~~~~~~~~~~~ We will produce a terrain model for the *Lunar Surface Proving Ground* (LSPG) at the Mojave Air and Space Port in California (35.072321 N, 118.153957 W). The site has dimensions of 100 x 100 meters. This site is meant to mimic the topography and optical properties of Moon's surface. It has very strong albedo variations that need modeling. Being on Earth, the site has an atmosphere that scatters sunlight, that needs to be taken into account as well. It is likely that other rocky Earth terrains will have similar properties. Surfaces with vegetation, fresh snow, or urban areas will be very different, and likely for those the SfS method will not work well. Input data ~~~~~~~~~~ The site was imaged with an UAS flying at an elevation of about 100 meters. The images are acquired with a color frame camera, looking nadir, with dimensions of 9248 x 6944 pixels, JPEG-compressed. The ground resolution is 0.01 meters per pixel. The camera was carefully calibrated, with its intrinsic parameters (focal length, optical center, lens distortion) known. Five sets of images were recorded, at different times of day. Diverse illumination is very important for separating the albedo from ground reflectance and atmospheric effects. Since SfS processes grayscale data, the red image band was used. Registration and initial model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SfS expects a reasonably accurate DEM as input, that will be refined. The camera intrinsics, and their positions and orientations must be known very accurately relative to the DEM. The ``mapproject`` program (:numref:`mapproject`) can be invoked to verify the agreement between these data. The usual process of producing such data with ASP is to run Structure-from-Motion (:numref:`sfm`), including bundle adjustment (:numref:`bundle_adjust`), followed by stereo (:numref:`tutorial`) for pairs of images with a good convergence angle (:numref:`stereo_pairs`), terrain model creation (:numref:`point2dem`), and merge of the terrain models (:numref:`dem_mosaic`). If desired to refine the intrinsics, the ``bundle_adjust`` program can be run (:numref:`heights_from_dem`), with the terrain produced so far as a constraint. If needed, alignment to a prior terrain can be done (:numref:`pc_align`), followed by carrying over the cameras (:numref:`ba_pc_align`). The ``stereo_gui`` program (:numref:`stereo_gui`) can help visualize the inputs, intermediate results, and final products. Use of prior data ~~~~~~~~~~~~~~~~~ In this example, all this processing was done with Agisoft Photoscan, a commercial package that automates the steps mentioned above. It produced a terrain model, orthoimages, the camera intrinsics, and the camera positions and orientations. Camera preparation ~~~~~~~~~~~~~~~~~~ A pinhole camera model file (:numref:`pinholemodels`) was created for each image. To ensure tight registration, a GCP file (:numref:`bagcp`) was made for each image with the ``gcp_gen`` program (:numref:`gcp_gen`). The inputs were the raw images, orthoimages, and the existing DEM. The invocation was as follows, for each image index ``i``:: gcp_gen \ --ip-detect-method 2 \ --inlier-threshold 50 \ --ip-per-tile 1000 \ --gcp-sigma 0.1 \ --camera-image image${i}.tif \ --ortho-image ortho_image.tif \ --dem dem.tif \ --output-prefix gcp/run \ -o gcp/image${i}.gcp A single orthoimage was provided for all images with the same illumination. This program's page has more information for how to inspect and validate the GCP file. If the camera positions and orientations are not known, such a GCP file can create the camera files from scratch (:numref:`cam_from_gcp`). The images and cameras were then bundle-adjusted (:numref:`bundle_adjust`), together with these GCP. The provided DEM was used as a constraint, with the options ``--heights-from-dem dem.tif --heights-from-dem-uncertainty 10.0``. The latter parameter's value was to give less weight to the DEM than to the GCP (see ``--gcp-sigma`` above), as the GCP are known to be quite accurate. The ``mapproject`` program (:numref:`mapproject`) was run to verify that the produced cameras result in orthoimages that agree well with the input DEM and each other. It is strongly suggested to first run this process with a small subset of the images, for example, one for each illumination. One should also inspect the various ``bundle_adjust`` report files (:numref:`ba_out_files`). Terrain model preparation ~~~~~~~~~~~~~~~~~~~~~~~~~ The input terrain was regridded to a resolution of 0.01 meters per pixel with ``gdalwarp`` (:numref:`gdal_tools`):: gdalwarp \ -overwrite \ -r cubicspline \ -tr 0.01 0.01 \ dem.tif dem_tr0.01.tif It is important to use a local projection in meters, such as UTM. This program can also resample an input DEM that has a geographic projection (longitude-latitude) to a local projection, with the option ``-t_srs``. The produced DEM was smoothed a bit, to reduce the numerical noise:: dem_mosaic \ --dem-blur-sigma 1 \ dem_tr0.01.tif \ -o dem_tr0.01_smooth.tif The resulting DEM can be hillshaded and visualized in ``stereo_gui`` (:numref:`stereo_gui_hillshade`). Illumination angles ~~~~~~~~~~~~~~~~~~~ The illumination information was specified in a file named ``sfs_sun_list.txt``, with each line having the image name and the Sun azimuth and elevation (altitude) in degrees, in double precision, with a space as separator. The azimuth is measured clockwise from the North, and the elevation is measured from the horizon. The `SunCalc `_ site was very useful in determining this information, given the coordinates of the site and the image acquisition time as stored in the EXIF data. One has to be mindful of local vs UTC time. It was sufficient to use the same Sun azimuth and elevation for all images acquired in quick succession. Input images ~~~~~~~~~~~~ The number of input images can be very large, which can slow down the SfS program. It is suggested to divide them into groups, by illumination conditions, and ignore those outside the area of interest. ASP has logic that can help with that (:numref:`sfs_azimuth`). Out of all images from a given group, a subset should be selected that covers the site fully. That can be done by mapprojecting the images onto the DEM, and then running the ``image_subset`` program (:numref:`image_subset`):: image_subset \ --t_projwin min_x min_y max_x max_y \ --threshold 0.01 \ --image-list image_list.txt \ -o subset.txt The values passed in via ``--t_projwin`` have the desired region extent (it can be found with ``gdalinfo``, :numref:`gdal_tools`), or with ``stereo_gui``. It is optional. For an initial run, it is simpler to manually pick an image from each group. The raw camera images corresponding to the union of all such subsets were put in a file named ``sfs_image_list.txt``. The corresponding camera model files were listed in the file ``sfs_camera_list.txt``, one per line. These must be in the same order. Running SfS ~~~~~~~~~~~ The best SfS results were produced by first estimating the image exposures, haze, and a low-resolution albedo for the full site, then refining all these further per tile. This all done under the hood by ``parallel_sfs`` (:numref:`parallel_sfs`) in the latest build (:numref:`release`). The command is:: parallel_sfs \ -i dem.tif \ --image-list sfs_image_list.txt \ --camera-list sfs_camera_list.txt \ --sun-angles sfs_sun_list.txt \ --processes 6 \ --threads 8 \ --tile-size 200 \ --padding 50 \ --blending-dist 10 \ --smoothness-weight 3 \ --robust-threshold 10 \ --reflectance-type 0 \ --num-haze-coeffs 1 \ --initial-dem-constraint-weight 0.001 \ --albedo-robust-threshold 0.025 \ --crop-input-images \ --save-sparingly \ --max-iterations 5 \ -o sfs/run This program can be very sensitive to the smoothness weight. A higher value will produce blurred results, while a lower value will result in a noisy output. One could try various values for it that differ by a factor of 10 before refining it further. The ``--robust-threshold`` parameter is very important for eliminating the effect of shadows. Its value should be a fraction of the difference in intensity between lit and shadowed pixels. Some experimentation may be needed to find the right value. A large value will result in visible shadow artifacts. A smaller value may require more iterations and may blur more the output. It is strongly suggested to first run SfS on a small clip to get an intuition for the parameters (then can use the ``sfs`` program directly). We used the Lambertian reflectance model (``--reflectance-type 0``). For the Moon, usually the Lunar-Lambertian model is preferred (value 1). The produced DEM will be named ``sfs/run-DEM-final.tif``. Other outputs are listed in :numref:`sfs_outputs`. The results are shown in :numref:`earth_input_images`. ================================================ FILE: docs/examples/skysat.rst ================================================ .. _skysat: SkySat Stereo and Video data ---------------------------- SkySat is a constellation of sub-meter resolution Earth observation satellites owned by *Planet*. There are two type of SkySat products, *Stereo* and *Video*, with each made up of sequences of overlapping images. Their processing is described in :numref:`skysat_stereo` and :numref:`skysat_video`, respectively. SkySat images are challenging to process with ASP because they come in a very long sequence, with small footprints, and high focal length. It requires a lot of care to determine and refine the camera positions and orientations. A very informative paper on processing SkySat data with ASP is :cite:`bhushan2021automated`, and their workflow is `publicly available `_. .. _skysat_stereo: Stereo data ~~~~~~~~~~~ The SkySat *Stereo* products may come with Pinhole cameras (stored in files with the ``_pinhole.json`` suffix) and/or with RPC cameras (embedded in the TIF images or in files with the ``_RPC.txt`` suffix). This product may have images acquired with either two or three perspectives, and for each of those there are three sensors with overlapping fields of view. Each sensor creates on the order of 300 images with much overlap among them. Individual pairs of stereo images are rather easy to process with ASP, following the example in :numref:`rpc`. Here we focus on creating stereo from the full sequences of images. Due to non-trivial errors in each provided camera's position and orientation, it was found necessary to convert the given cameras to ASP's Pinhole format (:numref:`pinholemodels`) and then run bundle adjustment (:numref:`bundle_adjust`), to refine the camera poses. (Note that for RPC cameras, this conversion decouples the camera intrinsics from their poses.) Then, pairwise stereo is run, and the obtained DEMs are mosaicked. A possible workflow is as follows. (Compare this with the processing of Video data in :numref:`skysat_video`. This section is newer, and if in doubt, use the approach here.) Creation of input cameras ^^^^^^^^^^^^^^^^^^^^^^^^^ Pinhole cameras can be created with ``cam_gen`` (:numref:`cam_gen`). Two approaches can be used. The first is to ingest SkySat's provided Pinhole cameras, which have a ``_pinhole.json`` suffix. :: pref=img/1259344359.55622339_sc00104_c2_PAN_i0000000320 cam_gen ${pref}.tif \ --input-camera ${pref}_pinhole.json \ -o ${pref}.tsai This approach is preferred. Specify a .json extension if desired to mix and match various sensor types (:numref:`ba_frame_linescan`). With SkySat, it is suggested not to refine the vendor-provided cameras at this stage, but do a straightforward conversion only. Note that this was tested only with the L1A SkySat product. Alternatively, if the ``pinhole.json`` files are not available, a Pinhole camera can be derived from each of their RPC cameras. :: pref=img/1259344359.55622339_sc00104_c2_PAN_i0000000320 cam_gen ${pref}.tif \ --input-camera ${pref}.tif \ --focal-length 553846.153846 \ --optical-center 1280 540 \ --pixel-pitch 1.0 \ --reference-dem ref.tif \ --height-above-datum 4000 \ --refine-camera \ --frame-index frame_index.csv \ --parse-ecef \ --cam-ctr-weight 1000 \ --gcp-std 1 \ --gcp-file ${pref}.gcp \ -o ${pref}.tsai It is very important to examine if the data is of type L1A or L1B. The value of ``--pixel-pitch`` should be 0.8 in the L1B products, but 1.0 for L1A. Above, we read the ECEF camera positions from the ``frame_index.csv`` file provided by Planet. These positions are more accurate than what ``cam_gen`` can get on its own based on the RPC camera. The ``--cam-ctr-weight`` and ``--refine-camera`` options will keep the camera position in place by penalizing any deviations with the given weight, while refining the camera orientation. The reference DEM ``ref.tif`` is a Copernicus 30 m DEM (:numref:`initial_terrain`). Ensure the DEM is relative to WGS84 and not EGM96, and convert it if necessary; see :numref:`conv_to_ellipsoid`. The option ``--input-camera`` will make use of existing RPC cameras to accurately find the pinhole camera poses. The option ``--height-above-datum`` should not be necessary if the DEM footprint covers fully the area of interest. See :numref:`cam_gen_validation` for how to validate the created cameras. .. _skysat_bundle_adjustment: Bundle adjustment ^^^^^^^^^^^^^^^^^ For the next steps, it may be convenient to make symbolic links from the image names and cameras to something shorter (once relevant metadata that needs the original names is parsed from ``frame_index.csv``). For example, if all the images and cameras just produced are in a directory called ``img``, one can do:: cd img ln -s ${pref}.tif n1000.tif for the first Nadir-looking image, and similarly for Forward and Aft-looking images and cameras, if available, and their associated RPC metadata files. For bundle adjustment it may be preferable to have the lists of images and pinhole cameras stored in files, as otherwise they may be too many to individually pass on the command line. :: ls img/*.tif > images.txt ls img/*.tsai > cameras.txt The entries in these files must be in the same order. Then run ``parallel_bundle_adjust`` (:numref:`parallel_bundle_adjust`), rather than ``bundle_adjust``, as there are very many pairs of images to match. :: nodesList=machine_names.txt parallel_bundle_adjust \ --inline-adjustments \ --num-iterations 200 \ --image-list images.txt \ --camera-list cameras.txt \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --rotation-weight 0 \ --camera-position-weight 0 \ --auto-overlap-params "ref.tif 15" \ --min-matches 5 \ --remove-outliers-params '75.0 3.0 20 20' \ --min-triangulation-angle 15.0 \ --max-pairwise-matches 200 \ --nodes-list $nodesList \ -o ba/run See :numref:`ba_validation` for important sanity checks and report files to examine after bundle adjustment. See :numref:`cam_gen_validation` for how to validate the created cameras. See :numref:`pbs_slurm` for more details on running ASP tools on multiple machines. The ``--camera-position-weight`` can be set to a large number to keep the camera positions move little during bundle adjustment. This is important if it is assumed that the camera positions are already accurate and it is desired to only refine the camera orientations. Such a constraint can prevent bundle adjustment from converging to a solution, so should be used with great care. See :numref:`ba_cam_constraints`. The ``--tri-weight`` option (:numref:`ba_ground_constraints`) prevents the triangulated points from moving too much (a lower weight value will constrain less). The value of ``--tri-robust-threshold`` (0.1) is intentionally set to be less than the one used for ``--robust-threshold`` (0.5) to ensure pixel reprojection errors are always given a higher priority than triangulation errors. See :numref:`ba_ground_constraints`. The ``--rotation-weight`` value was set to 0, so the camera orientations can change with no restrictions. See :numref:`ba_cam_constraints` for a discussion of camera constraints. If the input cameras are reasonably accurate to start with, for example, consistent with a known DEM to within a small handful of meters, that DEM can be used to constrain the cameras, instead of the triangulation constraint. So, the above options can be replaced, for example, with:: --heights-from-dem dem.tif \ --heights-from-dem-uncertainty 10.0 \ --heights-from-dem-robust-threshold 0.1 \ The DEM must be relative to the WGS84 ellipsoid, rather than to a geoid, and the weight and threshold above should be lower if the DEM has higher uncertainty when it comes to its heights or alignment to the cameras. See also :numref:`heights_from_dem`. The option ``--auto-overlap-params`` automatically determines which image pairs overlap. We used ``--max-pairwise-matches 200`` as otherwise too many interest point matches were found. The option ``--mapproj-dem`` (:numref:`ba_mapproj_dem`) can be used to preview the quality of registration of the images on the ground after bundle adjustment. The option ``--min-triangulation-angle 15.0`` filtered out interest point matches with a convergence angle less than this. This is very important for creating a reliable sparse set of triangulated points based on interest point matches (:numref:`ba_out_files`). This one can be used to compute the alignment transform to the reference terrain:: pc_align --max-displacement 200 \ --csv-format 1:lon,2:lat,3:height_above_datum \ --save-transformed-source-points \ ref.tif ba/run-final_residuals_pointmap.csv \ -o $dir/run If desired, the obtained alignment transform can be applied to the cameras as well (:numref:`ba_pc_align`). Use ``stereo_gui`` to inspect the reprojection errors in the final ``pointmap.csv`` file (:numref:`plot_csv`). See the outcome in :numref:`skysat_stereo_grand_mesa_pointmap`. .. _skysat_stereo_grand_mesa_poses: .. figure:: ../images/skysat_stereo_grand_mesa_poses.png :name: skysat-stereo-example-poses :alt: SkySat stereo example camera poses The roll, pitch, and yaw of the camera orientations before and after bundle adjustment for the Aft, Forward, and Nadir cameras (for the center sensor of the Skysat triplet). Plotted with ``orbit_plot.py`` (:numref:`orbit_plot`). The best linear fit of this data before bundle adjustment was subtracted to emphasize the differences, which are very small. The cameras centers were *tightly constrained* here with a large camera position weight. Yet, see :numref:`skysat_stereo_grand_mesa_pointmap` for the effect on the reprojection errors. .. _skysat_stereo_grand_mesa_pointmap: .. figure:: ../images/skysat_stereo_grand_mesa.png :name: skysat-stereo-example :alt: SkySat stereo example The colorized bundle adjustment camera reprojection errors (pointmap.csv) overlaid on top of the Copernicus 30 m DEM for Grand Mesa, Colorado, before optimization (left) and after (right). Plotted with ``stereo_gui``. Maximum shade of red is reprojection error of at least 5 pixels. The same set of clean interest points was used in both plots. It can be seen that while bundle adjustment changes the cameras very little, it makes a very big difference in how consistent the cameras become. The camera positions and orientations (the latter in NED coordinates) are summarized in two report files, before and after optimization (:numref:`ba_cam_pose`). It is suggested to examine if these are plausible. It is expected that the spacecraft position and orientation will change in a slow and smooth manner, and that these will not change drastically during bundle adjustment. If desired to do further experiments in bundle adjustment, the existing interest matches can be reused via the options ``--clean-match-files-prefix`` and ``--match-files-prefix``. The matches can be inspected with ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`). DEM creation ^^^^^^^^^^^^ How to decide which pairs of images to choose for stereo and how to combine the resulting DEMs taking into account the stereo convergence angle is described in :numref:`sfm_multiview`. .. _skysat_video: Video data ~~~~~~~~~~ The rest of this section will be concerned with the ``Video`` product, which is a set of images recorded together in quick sequence. This is a very capricious dataset, so some patience will be needed to work with it. That is due to the following factors: - The baseline can be small, so the perspective of the left and right image can be too similar. - The footprint on the ground is small, on the order of 2 km. - The terrain can be very steep. - The known longitude-latitude corners of each image have only a few digits of precision, which can result in poor initial estimated cameras. Below a recipe for how to deal with this data is described, together with things to watch for and advice when things don't work. See also how the Stereo product was processed (:numref:`skysat_stereo`). That section is newer, and that product was explored in more detail. Stereo products are better-behaved than Video products, so it is suggested to work with Stereo data, if possible, or at least cross-reference with that section the logic below. The input data ~~~~~~~~~~~~~~ We will use as an illustration a mountainous terrain close to Breckenridge, Colorado. The dataset we fetched is called ``s4_20181107T175036Z_video.zip``. We chose to work with the following four images from it:: 1225648254.44006968_sc00004_c1_PAN.tiff 1225648269.40892076_sc00004_c1_PAN.tiff 1225648284.37777185_sc00004_c1_PAN.tiff 1225648299.37995577_sc00004_c1_PAN.tiff A sample picture from this image set is shown in :numref:`skysat-example`. It is very important to pick images that have sufficient difference in perspective, but which are still reasonably similar, as otherwise the procedure outlined in this section will fail. .. figure:: ../images/Breckenridge.jpg :name: skysat-example :alt: SkySat example An image used in the SkySat example. Reproduced with permission. .. _refdem: Initial camera models and a reference DEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Based on vendor's documentation, these images are :math:`2560 \times 1080` pixels. We use the geometric center of the image as the optical center, which turned out to be a reasonable enough assumption (verified by allowing it to float later). Since the focal length is given as 3.6 m and the pixel pitch is :math:`6.5 \times 10^{-6}` m, the focal length in pixels is .. math:: 3.6/6.5 \times 10^{-6} = 553846.153846. Next, a reference DEM needs to be found. Recently we recommend getting a Copernicus 30 m DEM (:numref:`initial_terrain`). It is very important to note that SRTM DEMs can be relative to the WGS84 ellipsoidal vertical datum, or relative to the EGM96 geoid. In the latter case, ``dem_geoid`` (:numref:`dem_geoid`) needs to be used to first convert it to be relative to WGS84. This may apply up to 100 meters of vertical adjustment. See :numref:`conv_to_ellipsoid`. It is good to be a bit generous when selecting the extent of the reference DEM. We will rename the downloaded DEM to ``ref_dem.tif``. Using the ``cam_gen`` tool (:numref:`cam_gen`) bundled with ASP, we create an initial camera model and a GCP file (:numref:`bagcp`) for the first image as as follows:: cam_gen 1225648254.44006968_sc00004_c1_PAN.tiff \ --frame-index output/video/frame_index.csv \ --reference-dem ref_dem.tif \ --focal-length 553846.153846 \ --optical-center 1280 540 \ --pixel-pitch 1 --height-above-datum 4000 \ --refine-camera \ --gcp-std 1 \ --gcp-file v1.gcp \ -o v1.tsai This tool works by reading the longitude and latitude of each image corner on the ground from the file ``frame_index.csv``, and finding the position and orientation of the camera that best fits this data. The camera is written to ``v1.tsai``. A GCP file is written to ``v1.gcp``. This will help later with bundle adjustment. If an input camera exists, such as embedded in the image file, it is strongly suggested to pass it to this tool using the ``--input-camera`` option, as it will improve the accuracy of produced cameras (:numref:`skysat-rpc`). In the above command, the optical center and focal length are as mentioned earlier. The reference SRTM DEM is used to infer the height above datum for each image corner based on its longitude and latitude. The height value specified via ``--height-above-datum`` is used as a fallback option, if for example, the DEM is incomplete, and is not strictly necessary for this example. This tool also accepts the longitude and latitude of the corners as an option, via ``--lon-lat-values``. The flag ``--refine-camera`` makes ``cam_gen`` solve a least square problem to refine the output camera. In some cases it can get the refinement wrong, so it is suggested experimenting with and without using this option. For simplicity of notation, we will create a symbolic link from this image to the shorter name ``v1.tif``, and the GCP file needs to be edited to reflect this. The same will apply to the other files. We will have then four images, ``v1.tif, v2.tif, v3.tif, v4.tif``, and corresponding camera and GCP files. A good sanity check is to visualize the computed cameras. ASP's ``sfm_view`` tool can be used (:numref:`sfm_view`). Alternatively, ASP's ``orbitviz`` program (:numref:`orbitviz`) can create KML files that can then be opened in Google Earth. We very strongly recommend inspecting the camera positions and orientations, since this may catch inaccurate cameras which will cause problems later. Another important check is to mapproject these images using the cameras and overlay them in ``stereo_gui`` on top of the reference DEM. Here is an example for the first image:: mapproject --t_srs \ '+proj=stere +lat_0=39.4702 +lon_0=253.908 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m' \ ref_dem.tif v1.tif v1.tsai v1_map.tif Notice that we used above a longitude and latitude around the area of interest. This will need to be modified for your specific example. Bundle adjustment ~~~~~~~~~~~~~~~~~ At this stage, the cameras should be about right, but not quite exact. We will take care of this using bundle adjustment. We will invoke this tool twice. In the first call we will make the cameras self-consistent. This may move them somewhat, though the ``--tri-weight`` constraint that is used below should help. In the second call we will try to bring the back to the original location. :: parallel_bundle_adjust \ v[1-4].tif v[1-4].tsai \ -t nadirpinhole \ --disable-tri-ip-filter \ --skip-rough-homography \ --force-reuse-match-files \ --ip-inlier-factor 2.0 \ --ip-uniqueness-threshold 0.8 \ --ip-per-image 20000 \ --datum WGS84 \ --inline-adjustments \ --camera-weight 0 \ --tri-weight 0.1 \ --robust-threshold 2 \ --remove-outliers-params '75 3 4 5' \ --ip-num-ransac-iterations 1000 \ --num-passes 2 \ --auto-overlap-params "ref.tif 15" \ --num-iterations 1000 \ -o ba/run parallel_bundle_adjust \ -t nadirpinhole \ --datum WGS84 \ --force-reuse-match-files \ --inline-adjustments \ --num-passes 1 --num-iterations 0 \ --transform-cameras-using-gcp \ v[1-4].tif ba/run-v[1-4].tsai v[1-4].gcp \ -o ba/run The ``--auto-overlap-params`` option used earlier is useful a very large number of images is present and a preexisting DEM of the area is available, which need not be perfectly aligned with the cameras. It can be used to determine each camera's footprint, and hence, which cameras overlap. Otherwise, use the ``--overlap-limit`` option to control how many subsequent images to match with a given image. The output optimized cameras will be named ``ba/run-run-v[1-4].tsai``. The reason one has the word "run" repeated is because we ran this tool twice. The intermediate cameras from the first run were called ``ba/run-v[1-4].tsai``. Here we use ``--ip-per-image 20000`` to create a lot of interest points. This will help with alignment later. It is suggested that the user study all these options and understand what they do. We also used ``--robust-threshold 10`` to force the solver to work the bigger errors. That is necessary since the initial cameras could be pretty inaccurate. It is very important to examine the residual file named:: ba/run-final_residuals_pointmap.csv (:numref:`ba_err_per_point`). Here, the third column are the heights of triangulated interest points, while the fourth column are the reprojection errors. Normally these errors should be a fraction of a pixel, as otherwise the solution did not converge. The last entries in this file correspond to the GCP, and those should be looked at carefully as well. The reprojection errors for GCP should be on the order of tens of pixels because the longitude and latitude of each GCP are not well-known. This can be done with :numref:`stereo_gui`, which will also colorize the residuals (:numref:`plot_csv`). It is also very important to examine the obtained match files in the output directory. For that, use ``stereo_gui`` with the option ``--pairwise-matches`` (:numref:`stereo_gui_view_ip`). If there are too few matches, particularly among very similar images, one may need to increase the value of ``--epipolar-threshold`` (or of ``--ip-inlier-factor`` for the not-recommended pinhole session). Note that a large value here may allow more outliers, but those should normally by filtered out by ``bundle_adjust``. Another thing one should keep an eye on is the height above datum of the camera centers as printed by bundle adjustment towards the end. Any large difference in camera heights (say more than a few km) could be a symptom of some failure. Also look at how much the triangulated points and camera centers moved as a result of bundle adjustment. Appropriate constraints may need to be applied (:numref:`ba_constraints`). Note that using the ``nadirpinhole`` session is equivalent to using ``pinhole`` and setting ``--datum``. .. _skysat_video_stereo: Creating terrain models ~~~~~~~~~~~~~~~~~~~~~~~ The next steps are to run ``parallel_stereo`` and create DEMs. We will run the following command for each pair of images. Note that we reuse the filtered match points created by bundle adjustment, with the ``--clean-match-files-prefix`` option. :: i=1 ((j=i+1)) st=stereo_v${i}${j} rm -rfv $st mkdir -p $st parallel_stereo --skip-rough-homography \ -t nadirpinhole --stereo-algorithm asp_mgm \ v${i}.tif v${j}.tif \ ba/run-run-v${i}.tsai ba/run-run-v${j}.tsai \ --clean-match-files-prefix ba/run \ $st/run point2dem --auto-proj-center \ --tr 4 --errorimage $st/run-PC.tif (Repeat this for other values of :math:`i`.) See :numref:`nextsteps` for a discussion about various speed-vs-quality choices. See :numref:`point2dem_proj` about DEM projection determination. It is important to examine the mean triangulation error (:numref:`triangulation_error`) for each DEM:: gdalinfo -stats stereo_v12/run-IntersectionErr.tif | grep Mean which should hopefully be no more than 0.5 meters, otherwise likely bundle adjustment failed. One should also compare the DEMs among themselves:: geodiff --absolute stereo_v12/run-DEM.tif stereo_v23/run-DEM.tif -o tmp gdalinfo -stats tmp-diff.tif | grep Mean (And so on for any other pair.) Here the mean error should be on the order of 2 meters, or hopefully less. Mosaicking and alignment ~~~~~~~~~~~~~~~~~~~~~~~~ If more than one image pair was used, the obtained DEMs can be mosaicked with ``dem_mosaic`` (:numref:`dem_mosaic`):: dem_mosaic stereo_v12/run-DEM.tif stereo_v23/run-DEM.tif \ stereo_v34/run-DEM.tif -o mosaic.tif This DEM can be hillshaded and overlaid on top of the reference DEM. The next step is aligning it to the reference. :: pc_align --max-displacement 1000 --save-transformed-source-points \ --alignment-method similarity-point-to-point \ ref_dem.tif mosaic.tif -o align/run It is important to look at the errors printed by this tool before and after alignment, as well as details about the alignment that was applied. The obtained aligned cloud can be made into a DEM again:: point2dem \ --auto-proj-center \ --tr 4 \ align/run-trans_source.tif The absolute difference before and after alignment can be found as follows:: geodiff --absolute mosaic.tif ref_dem.tif -o tmp gdalinfo -stats tmp-diff.tif | grep Mean :: geodiff --absolute align/run-trans_source-DEM.tif ref_dem.tif -o tmp gdalinfo -stats tmp-diff.tif | grep Mean In this case the mean error after alignment was about 6.5 m, which is not too bad given that the reference DEM resolution is about 30 m/pixel. Alignment of cameras ~~~~~~~~~~~~~~~~~~~~ The transform computed with ``pc_align`` can be used to bring the cameras in alignment to the reference DEM. That can be done as follows:: parallel_bundle_adjust -t nadirpinhole --datum wgs84 \ --force-reuse-match-files \ --inline-adjustments \ --initial-transform align/run-transform.txt \ --apply-initial-transform-only \ v[1-4].tif ba/run-run-v[1-4].tsai -o ba/run creating the aligned cameras ``ba/run-run-run-v[1-4].tsai``. If ``pc_align`` was called with the reference DEM being the second cloud, one should use above the file:: align/run-inverse-transform.txt as the initial transform. Mapprojection ~~~~~~~~~~~~~ If the steep topography prevents good DEMs from being created, one can mapproject the images first onto the reference DEM:: for i in 1 2 3 4; do mapproject --tr gridSize ref_dem.tif v${i}.tif \ ba/run-run-run-v${i}.tsai v${i}_map.tif done It is very important to use the same resolution (option ``--tr``) for both images when mapprojecting. That helps making the resulting images more similar and reduces the processing time (:numref:`mapproj-res`). Then run ``parallel_stereo`` with the mapprojected images, such as:: i=1 ((j=i+1)) rm -rfv stereo_map_v${i}${j} parallel_stereo v${i}_map.tif v${j}_map.tif \ ba/run-run-run-v${i}.tsai ba/run-run-run-v${j}.tsai \ --session-type pinhole --alignment-method none \ --cost-mode 4 --stereo-algorithm asp_mgm --corr-seed-mode 1 \ stereo_map_v${i}${j}/run ref_dem.tif point2dem --auto-proj-center \ --tr 4 --errorimage \ stereo_map_v${i}${j}/run-PC.tif It is important to note that here we used the cameras that were aligned with the reference DEM. We could have as well mapprojected onto a lower-resolution version of the mosaicked and aligned DEM with its holes filled. When things fail ~~~~~~~~~~~~~~~~ Processing SkySat images is difficult, for various reasons mentioned earlier. A few suggestions were also offered along the way when things go wrong. Problems are usually due to cameras being initialized inaccurately by ``cam_gen`` or bundle adjustment not optimizing them well. The simplest solution is often to just try a different pair of images from the sequence, say from earlier or later in the flight, or a pair with less overlap, or with more time elapsed between the two acquisitions. Modifying various parameters may help as well. We have experimented sufficiently with various SkySat datasets to be sure that the intrinsics (focal length, optical center, and pixel pitch) are usually not the issue, rather the positions and orientations of the cameras. Structure from motion ~~~~~~~~~~~~~~~~~~~~~ In case ``cam_gen`` does not create sufficiently good cameras, one can attempt to use the ``camera_solve`` tool (:numref:`sfm`). This will create hopefully good cameras but in an arbitrary coordinate system. Then we will transfer those to the world coordinates using GCP. Here is an example for two cameras:: out=out_v12 ba_params="--num-passes 1 --num-iterations 0 --transform-cameras-using-gcp" theia_overdides="--sift_num_levels=6 --lowes_ratio=0.9 --min_num_inliers_for_valid_match=10 --min_num_absolute_pose_inliers=10 --bundle_adjustment_robust_loss_function=CAUCHY --post_rotation_filtering_degrees=180.0 --v=2 --max_sampson_error_for_verified_match=100.0 --max_reprojection_error_pixels=100.0 --triangulation_reprojection_error_pixels=100.0 --min_num_inliers_for_valid_match=10 --min_num_absolute_pose_inliers=10" rm -rfv $out camera_solve $out --datum WGS84 --calib-file v1.tsai \ --bundle-adjust-params "$ba_params v1.gcp v2.gcp" \ v1.tif v2.tif The obtained cameras should be bundle-adjusted as done for the outputs of ``cam_gen``. Note that this tool is capricious and its outputs can be often wrong. In the future it will be replaced by something more robust. .. _skysat-rpc: RPC models ~~~~~~~~~~ Some SkySat datasets come with RPC camera models, typically embedded in the images. This can be verified by running:: gdalinfo -stats output/video/frames/1225648254.44006968_sc00004_c1_PAN.tiff We found that these models are not sufficiently robust for stereo. But they can be used to create initial guess pinhole cameras (:numref:`pinholemodels`) with ``cam_gen``. We will use the RPC camera model instead of longitude and latitude of image corners to infer the pinhole camera position and orientation. This greatly improves the accuracy and reliability. Here is an example:: img=output/video/frames/1225648254.44006968_sc00004_c1_PAN.tiff cam_gen $img --reference-dem ref_dem.tif --focal-length 553846.153846 \ --optical-center 1280 540 --pixel-pitch 1 --height-above-datum 4000 \ --refine-camera --gcp-std 1 --input-camera $img \ -o v1_rpc.tsai --gcp-file v1_rpc.gcp Note that the Breckenridge dataset does not have RPC data, but other datasets do. If the input camera is stored separately in a camera file, use that one with ``--input-camera``. If an RPC model is embedded in the image, one can validate how well the new Pinhole camera approximates the existing RPC camera with ``cam_test`` (:numref:`cam_test`), with a command like:: cam_test --image image.tif --cam1 image.tif --cam2 out_cam.tsai \ --height-above-datum 4000 Then one can proceed as earlier (particularly the GCP file can be edited to reflect the shorter image name). One can also regenerate the provided SkySat RPC model as:: cam2rpc -t rpc --dem-file dem.tif input.tif output.xml Here, the reference DEM should go beyond the extent of the image. This tool makes it possible to decide how finely to sample the DEM, and one can simply use longitude-latitude and height ranges instead of the DEM. We assumed in the last command that the input image implicitly stores the RPC camera model, as is the case for SkySat. Also, any pinhole camera models obtained using our software can be converted to RPC models as follows:: cam2rpc --dem-file dem.tif input.tif input.tsai output.xml Bundle adjustment using reference terrain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ At this stage, if desired, but this is rather unnecessary, one can do joint optimization of the cameras using dense and uniformly distributed interest points, and using the reference DEM as a constraint. This should make the DEMs more consistent among themselves and closer to the reference DEM. It is also possible to float the intrinsics, per :numref:`floatingintrinsics`, which sometimes can improve the results further. For that, one should repeat the ``stereo_tri`` part of of the stereo commands from :numref:`skysat_video_stereo` with the flags ``--num-matches-from-disp-triplets 10000`` and ``--unalign-disparity`` to obtain dense interest points and unaligned disparity. (To not generate the triangulated point cloud after this, add the option ``--compute-point-cloud-center-only``.) Use ``--num-matches-from-disparity 10000`` if the images are large, as the earlier related option can be very slow then. The match points can be examined as:: stereo_gui v1.tif v2.tif stereo_v12/run-disp-v1__v2.match and the same for the other image pairs. Hopefully they will fill as much of the images as possible. One should also study the unaligned disparities, for example:: stereo_v12/run-v1__v2-unaligned-D.tif by invoking ``disparitydebug`` on it and then visualizing the two obtained images. Hopefully these disparities are dense and with few holes. The dense interest points should be copied to the new bundle adjustment directory, such as:: mkdir -p ba_ref_terrain cp stereo_v12/run-disp-v1__v2.match ba_ref_terrain/run-v1__v2.match and the same for the other ones (note the convention for match files in the new directory). The unaligned disparities can be used from where they are. Then bundle adjustment using the reference terrain constraint proceeds as follows:: disp_list=$(ls stereo_v[1-4][1-4]/*-unaligned-D.tif) bundle_adjust v[1-4].tif ba/run-run-run-v[1-4].tsai -o ba_ref_terrain/run \ --reference-terrain ref_dem.tif --disparity-list "$disp_list" \ --max-num-reference-points 10000000 --reference-terrain-weight 50 \ --parameter-tolerance 1e-12 -t nadirpinhole --max-iterations 500 \ --overlap-limit 1 --inline-adjustments --robust-threshold 2 \ --force-reuse-match-files --max-disp-error 100 --camera-weight 0 If invoking this creates new match files, it means that the dense match files were not copied successfully to the new location. If this optimization is slow, perhaps too many reference terrain points were picked. This will create, as before, the residual file named:: ba_ref_terrain/run-final_residuals_pointmap.csv showing how consistent are the cameras among themselves, and in addition, a file named:: ba_ref_terrain/run-final_residuals_reference_terrain.txt which tells how well the cameras are aligned to the reference terrain. The errors in the first file should be under 1 pixel, and in the second one should be mostly under 2-3 pixels (both are the fourth column in these files). The value of ``--reference-terrain-weight`` can be increased to make the alignment to the reference terrain a little tighter. It is hoped that after running ``parallel_stereo`` with these refined cameras, the obtained DEMs will differ by less than 2 m among themselves, and by less than 4 m as compared to the reference DEM. Floating the camera intrinsics ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If desired to float the focal length as part of the optimization, one should pass in addition, the options:: --solve-intrinsics --intrinsics-to-float 'focal_length' Floating the optical center can be done by adding it in as well. It is important to note that for SkySat the intrinsics seem to be already quite good, and floating them is not necessary and is only shown for completeness. If one wants to float them, one should vary the focal length while keeping the optical center fixed, and vice versa, and compare the results. Then, with the result that shows most promise, one should vary the other parameter. If optimizing the intrinsics too aggressively, it is not clear if they will still deliver better results with other images or if comparing with a different reference terrain. Yet, if desired, one can float even the distortion parameters. For that, the input camera files need to be converted to some camera model having these (see :numref:`pinholemodels`), and their values can be set to something very small. One can use the Brown-Conrady model, for example, so each camera file must have instead of ``NULL`` at the end the fields:: BrownConrady xp = -1e-12 yp = -1e-12 k1 = -1e-10 k2 = -1e-14 k3 = -1e-22 p1 = -1e-12 p2 = -1e-12 phi = -1e-12 There is always a chance when solving these parameters that the obtained solution is not optimal. Hence, one can also try using as initial guesses different values, for example, by negating the above numbers. One can also try to experiment with the option ``--heights-from-dem``, and also with ``--robust-threshold`` if it appears that the large errors are not minimized enough. ================================================ FILE: docs/examples/spot5.rst ================================================ .. _spot5: SPOT5 ----- SPOT5 is a CNES (Space Agency of France) satellite launched on May 2002 and decommissioned in March 2015. SPOT5 contained two High Resolution Stereoscopic (HRS) instruments with a ground resolution of 5 meters. These two cameras were pointed forwards and backwards, allowing capture of a stereo image pair in a single pass of the satellite. For the newer SPOT 6 and SPOT 7 satellites, which use a different format and camera model, see :numref:`spot67`. ASP supports only images from the HRS sensors on SPOT5. These images come in two parts, the data file (extension ``.bil`` or ``.tif``) and the header file the data file (extension ``.dim``). The data file can be either a plain binary file with no header information or a GeoTIFF file. The header file is a plain text XML file. When using SPOT5 images with ASP tools, pass in the data file as the image file and the header file as the camera model file. All ASP tools can handle ``.bil`` images (and also ``.bip`` and ``.bsq``) as long as a similarly named ``.dim`` file exists that can be looked up. The lookup succeeds if, for example, the ``.dim`` and ``.bil`` files differ only by extension (lower or upper case), or, as below, when an IMAGERY.BIL file has a corresponding METADATA file. A sample SPOT5 image can be found at at http://www.geo-airbusds.com/en/23-sample-imagery. Image preparation ~~~~~~~~~~~~~~~~~ SPOT5 datasets come in a directory structure where the front and back images have the same name, without the path, and the same for the camera files. This conflicts with the ``bundle_adjust`` assumptions. A simple workaround is to rename the images and cameras:: mv front/SEGMT01/METADATA.BIL front/SEGMT01/METADATA_FRONT.BIL mv back/SEGMT01/METADATA.BIL back/SEGMT01/METADATA_BACK.BIL mv front/SEGMT01/METADATA.DIM front/SEGMT01/METADATA_FRONT.DIM mv back/SEGMT01/METADATA.DIM back/SEGMT01/METADATA_BACK.DIM Stereo with raw images ^^^^^^^^^^^^^^^^^^^^^^ Run bundle adjustment (:numref:`bundle_adjust`):: bundle_adjust -t spot5 \ front/SEGMT01/IMAGERY_FRONT.BIL \ back/SEGMT01/IMAGERY_BACK.BIL \ front/SEGMT01/METADATA_FRONT.DIM \ back/SEGMT01/METADATA_BACK.DIM \ -o ba_run/out It is not clear if SPOT5 images benefit from bundle adjustment. Run ``parallel_stereo`` (:numref:`parallel_stereo`) with the adjusted cameras:: parallel_stereo -t spot5 \ --bundle-adjust-prefix ba_run/out \ --stereo-algorithm asp_mgm \ front/SEGMT01/IMAGERY_FRONT.BIL \ back/SEGMT01/IMAGERY_BACK.BIL \ front/SEGMT01/METADATA_FRONT.DIM \ back/SEGMT01/METADATA_BACK.DIM \ st_run/out Here uses the ``asp_mgm`` algorithm. See :numref:`nextsteps` for a discussion about various speed-vs-quality choices of the stereo algorithms. This is followed by DEM creation with ``point2dem`` (:numref:`point2dem`):: point2dem st_run/out-PC.tif Stereo with mapprojected images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For terrains with steep slopes, it is strongly suggested to run stereo with mapprojected images (:numref:`mapproj-example`). For that, first use the ``add_spot_rpc`` tool to generate an RPC model approximation of the SPOT5 sensor model. :: add_spot_rpc front/SEGMT01/METADATA_FRONT.DIM \ -o front/SEGMT01/METADATA_FRONT.DIM add_spot_rpc back/SEGMT01/METADATA.DIM \ -o back/SEGMT01/METADATA_BACK.DIM This will append the RPC model to the existing file. If the output is a separate file, only the RPC model will be saved to the new file. Then use the ``spot5maprpc`` session type when running parallel_stereo on the mapprojected images. Ensure that any external DEM is adjusted, if needed, to be relative the ellipsoid (:numref:`conv_to_ellipsoid`). See the note in :numref:`dem_prep` about perhaps reducing the resolution of the DEM to mapproject onto (and perhaps blurring it) if ghosting artifacts are seen in the produced DEM. The mapprojection step is next (:numref:`mapproject`):: mapproject -t rpc \ --bundle-adjust-prefix ba_run/out \ --tr gridSize \ sample_dem.tif \ front/SEGMT01/IMAGERY_FRONT.BIL \ front/SEGMT01/METADATA_FRONT.DIM \ front_map_proj.tif mapproject -t rpc \ --bundle-adjust-prefix ba_run/out \ --ref-map front_map_proj.tif \ sample_dem.tif \ back/SEGMT01/IMAGERY_BACK.BIL \ back/SEGMT01/METADATA_BACK.DIM \ back_map_proj.tif The grid size is the known ground sample distance (GSD) of the image, in meters. If not set, it will be auto-guessed. Notice how we used the option ``--ref-map`` to ensure the second mapprojected image uses the same grid size and projection as the first one. In older versions of ASP, one must specify for both images the same projection in meters (such as UTM), via ``--t_srs``, and the same grid size, via ``--tr``. Stereo:: parallel_stereo -t spot5maprpc \ --bundle-adjust-prefix ba_run/out \ --stereo-algorithm asp_mgm \ front_map_proj.tif \ back_map_proj.tif \ front/SEGMT01/METADATA_FRONT.DIM \ back/SEGMT01/METADATA_BACK.DIM \ st_run_map/out \ sample_dem.tif DEM creation:: point2dem st_run_map/out-PC.tif See :numref:`nextsteps` for a discussion about various speed-vs-quality choices of the stereo algorithms. If desired not to use bundle adjustment, then need not set the option ``--bundle-adjust-prefix``. .. figure:: ../images/examples/spot5_figure.png :name: spot5_output Cropped region of SPOT5 image and a portion of the associated stereo DEM overlaid on a low resolution Bedmap2 DEM. ================================================ FILE: docs/examples/spot67.rst ================================================ .. _spot67: SPOT 6/7 -------- SPOT 6 (launched 2012) and SPOT 7 (launched 2014) are Airbus Earth observation satellites with 1.5-meter panchromatic resolution. They are part of the same SPOT family as SPOT 5 (:numref:`spot5`), but use the DIMAP V2 XML format and a linescan camera model that closely follows the Pleiades sensor (:numref:`pleiades`). ASP expects raw (non-orthorectified) images. The data have both an exact linescan camera model and an approximate RPC model (:numref:`rpc`), stored in separate XML files whose names start with "DIM" and "RPC", respectively. ASP supports both. The USGS CSM library (:numref:`csm`) is used for linescan models. The session type is ``-t spot`` (:numref:`ps_options`). If the ``-t`` option is not specified, it will be auto-detected from the camera files. .. _spot67_stereo: Bundle adjustment and stereo with raw images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Bundle adjustment (:numref:`bundle_adjust`) is suggested before stereo:: bundle_adjust -t spot \ --camera-weight 0 \ --tri-weight 0.1 \ left.tif right.tif \ left_exact.xml right_exact.xml \ -o ba/run With the exact models, the stereo command, with bundle-adjusted cameras, is:: parallel_stereo -t spot \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --bundle-adjust-prefix ba/run \ left.tif right.tif \ left_exact.xml right_exact.xml \ results/run Then, a DEM is created with ``point2dem`` (:numref:`point2dem`):: point2dem results/run-PC.tif For steep terrain, it is suggested to run stereo with mapprojected images (:numref:`spot67_map`). See :numref:`nextsteps` for a discussion about various speed-vs-quality choices for stereo. See :numref:`jitter_pleiades` for an example of solving for jitter with these cameras. Note the limitations of the jitter solver in :numref:`jitter_limitations`. This is available as of build 2026/03 (:numref:`release`). For the RPC model (:numref:`rpc`), the option ``-t rpc`` should be used and the RPC camera files should be passed in. If the ``-t`` option is not specified, it will be auto-guessed based on the content of the camera files provided as inputs. .. _spot67_map: Stereo with mapprojected images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ASP supports running stereo with mapprojected SPOT 6/7 images (:numref:`mapproj-example`). All input images must be mapprojected at the same resolution (which is comparable with the ground sample distance, GSD). The same camera models must be used for mapprojection as for stereo, so one should not mix the exact and RPC cameras. Ensure the input DEM used for mapprojection is relative to the ellipsoid (:numref:`conv_to_ellipsoid`). Example:: proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" mapproject -t spot \ --tr 1.5 \ --t_srs "$proj" \ --bundle-adjust-prefix ba/run \ ref_dem.tif \ left.tif \ left_exact.xml \ left_map.tif mapproject -t spot \ --tr 1.5 \ --t_srs "$proj" \ --bundle-adjust-prefix ba/run \ ref_dem.tif \ right.tif \ right_exact.xml \ right_map.tif parallel_stereo -t spot \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --bundle-adjust-prefix ba/run \ left_map.tif right_map.tif \ left_exact.xml right_exact.xml \ run_map/run \ ref_dem.tif point2dem run_map/run-PC.tif The projection string above needs to be modified for your area of interest. It is strongly suggested to use an auto-determined UTM or polar stereographic projection (:numref:`point2dem_proj`). The value of the ``--tr`` option is the ground sample distance. It is normally 1.5 meters for SPOT 6/7 PAN images. The XML files should have the GSD value. To not use bundle-adjusted cameras, remove the option ``--bundle-adjust-prefix`` from all ``mapproject`` and ``parallel_stereo`` commands above. .. _spot67_exact_vs_rpc: Exact and RPC cameras ~~~~~~~~~~~~~~~~~~~~~ To compare the linescan (exact) and RPC models, run ``cam_test`` (:numref:`cam_test`) as:: cam_test --image img.tif \ --cam1 cam_exact.xml \ --cam2 cam_rpc.xml \ --session1 spot --session2 rpc With the ESA La Crau sample (PAN band) and the additional option ``--height-above-datum 200`` (given the validity range in the RPC model), the pixel difference between exact and RPC models was max 0.002 pixels. The camera centers computed by the two methods won't agree, because the RPC camera model does not store the camera center. ASP then substitutes it with an estimated point on the ray from the camera center to the ground. This disagreement is not an issue in practice. Note that SPOT 6/7 RPCs use 0-based pixel offsets, while Pleiades RPCs use 1-based offsets. ASP handles both conventions automatically. ================================================ FILE: docs/examples/stereo_pairs.rst ================================================ .. _stereo_pairs: Guidelines for selecting stereo pairs ------------------------------------- When choosing image pairs to process, images that are taken with similar lighting conditions and significant surface coverage overlap are best suited for creating terrain models :cite:`2015LPI462703B`. The images should have sufficient difference in perspective, hence a reasonably large baseline, or, equivalently, a non-small convergence angle between the matching rays emanating from the two cameras, for stereo triangulation to be accurate. Yet, if the perspectives are very different, it will be challenging to compute the stereo correlation between images. A convergence angle of 10 to 60 degrees is likely reasonable. Depending on the characteristics of the mission data set and the individual images, the degree of acceptable variation will differ. Significant differences between image characteristics increases the likelihood of stereo matching error and artifacts, and these errors will propagate through to the resulting data products. The ``parallel_stereo`` and ``bundle_adjust`` programs compute the convergence angle for input cameras. In stereo that happens at the preprocessing and triangulation stages (:numref:`entrypoints`), with the result printed on the screen and saved to the log files. In ``bundle_adjust`` this computation takes place after the optimization of the cameras finishes, and the results are saved to a file on disk (:numref:`ba_out_files`). To find good stereo pairs, one can run bundle adjustment on a large set of images and pick a pair with a decent convergence angle. Although images do not need to be mapprojected before running the ``parallel_stereo`` program, we recommend that you do run ``cam2map`` (or ``cam2map4stereo.py``) beforehand, especially for image pairs that contain large topographic variation (and therefore large disparity differences across the scene, e.g., Valles Marineris). mapprojection is especially necessary when processing HiRISE images. This removes the large disparity differences between HiRISE images and leaves only the small detail for the Stereo Pipeline to compute. Remember that ISIS can work backwards through a mapprojection when applying the camera model, so the geometric integrity of your images will not be sacrificed if you mapproject first. An alternative way of mapprojection, that applies to non-ISIS images as well, is with the ``mapproject`` tool (:numref:`mapproj-example`). Excessively noisy images will not correlate well, so images should be photometrically calibrated in whatever fashion suits your purposes. If there are photometric problems with the images, those photometric defects can be misinterpreted as topography. Remember, in order for ``parallel_stereo`` to process stereo pairs in ISIS cube format, the images must have had SPICE data associated by running ISIS's ``spiceinit`` program run on them first. ================================================ FILE: docs/examples/umbra_sar.rst ================================================ .. _umbra_sar: Umbra SAR --------- Here we describe processing Synthetic Aperture Radar (SAR) images for Earth produced by `Umbra `_. A SAR example for the Moon is in :numref:`csm_minirf`. Overview ~~~~~~~~ Umbra images are acquired in `Spotlight mode `_. SAR image appearance can vary drastically depending on the perspective. It is important to choose images that are acquired close in time and have similar viewing angles. The latter is measured by the provided incidence and azimuth angles. Another measure is the squint angle. If the stereo convergence angle (:numref:`stereo_pairs`) is too small, the produced terrain model may not be accurate. If it is too large, the images may be too different, and processing may fail. For the example below, this angle is 5.8 degrees (as printed by both ``parallel_stereo`` and ``bundle_adjust``). This angle correlates well with the larger of the discrepancy in azimuth and incidence angles between the images. We obtained acceptable results even with convergence angles as low as 2.5 degrees. Umbra provides GEC images that are corrected to be relative to an ellipsoid. More raw products are available, including SICD, that have complex-valued pixels. GEC images come with RPC (:numref:`rpc`) camera models embedded in the images that we employ. ASP does not support the more rigorous SAR sensor models. .. figure:: ../images/umbra_sar.png :name: umbra_sar_fig From left to right: hillshaded-terrain model, mapprojected (:numref:`mapproject`) SAR image, and triangulation error image (:numref:`triangulation_error`). The units in the colorbar on the right are in meters. Fetching the data ~~~~~~~~~~~~~~~~~ We downloaded the image pair:: 2024-02-01-03-28-13_UMBRA-06_GEC.tif 2024-04-03-14-53-17_UMBRA-04_GEC.tif showing a portion of the Panama Canal. Many other `Umbra datasets `_ are available. To make the notation shorter, we call these ``left.tif`` and ``right.tif``. Mapprojection ~~~~~~~~~~~~~ It is suggested to run bundle adjustment first (:numref:`bundle_adjust`), to make the images more self-consistent and reduce the triangulation error (:numref:`triangulation_error`). For this data, bundle adjustment worked best after mapprojecting the images. Mapprojection should be done at the effective ground sample distance (GSD), not nominal GSD, which can be so fine that the images may be noisy at that level. How to find the effective resolution may require some inspection and/or reading vendor's documentation. How to find a DEM for mapprojection and how to adjust it to be relative to the ellipsoid is described in :numref:`initial_terrain` and :numref:`conv_to_ellipsoid`. We call that DEM ``ref.tif``. Set the projection string. The UTM zone to use depends on the location of the images. :: proj="+proj=utm +zone=17 +ellps=WGS84 +units=m +no_defs" The mapprojection (:numref:`mapproject`) step is as follows:: mapproject \ --tr 0.5 \ --t_srs "$proj" \ ref.tif \ left.tif \ left_proj.tif and the same for the right image. In the latest ASP, the projection string can be auto-determined (:numref:`mapproj_auto_proj`). See :numref:`mapproj_refmap` for how to transfer the projection to the right image. Ignore any warnings about images already being mapprojected. The raw Umbra SAR images do have some georeference information, but we will mapproject them in either case, as results are better that way. Bundle adjustment ~~~~~~~~~~~~~~~~~ Bundle adjustment (:numref:`bundle_adjust`) was run, while making use of the mapprojected images (:numref:`mapip`):: bundle_adjust -t rpc \ left.tif right.tif \ --remove-outliers-params \ "75.0 3.0 50 50" \ --mapprojected-data \ "left_proj.tif right_proj.tif ref.tif" \ -o ba/run The cameras are embedded in the images, so they are not specified separately. Alternatively, one can try the SIFT feature detection method (``--ip-detect-method 1``) rather than the default (method 0). One may also search for more interest point matches with an option such as ``--ip-per-tile``. SAR images can be noisy and features hard to find. More features may not always result in more matches if they are inaccurate. How to create new RPC cameras that incorporate the adjustments is discussed in :numref:`rpc_and_ba`. The default solution is to create external ``.adjust`` files that are passed to ``parallel_stereo`` via ``--bundle-adjust-prefix``, as below. More details on the ``bundle_adjust`` options are in :numref:`ba_options`. Stereo processing ~~~~~~~~~~~~~~~~~ Next, ``parallel_stereo`` (:numref:`parallel_stereo`) was run. As before, it is preferred to work with mapprojected images (:numref:`mapproj-example`). :: parallel_stereo -t rpc \ --bundle-adjust-prefix ba/run \ --stereo-algorithm asp_mgm \ --nodes-list machines.txt \ left_proj.tif right_proj.tif \ stereo/run \ ref.tif The ``asp_mgm`` algorithm worked much better than the default ``asp_bm`` (:numref:`stereo_alg_overview`). If this program fails to find interest points, the same suggestions as for bundle adjustment earlier apply. A terrain model was produced with ``point2dem`` (:numref:`point2dem`), in a local UTM projection (:numref:`point2dem_proj`):: point2dem \ --auto-proj-center \ --t_srs "$proj" \ --errorimage \ --tr 2.0 \ stereo/run-PC.tif It is suggested to compare the resulting terrain with the prior reference terrain in ``ref.tif``. Check if the stereo convergence angle is reasonable, as mentioned earlier. Alignment ~~~~~~~~~ The ASP-created DEM was aligned to the reference DEM with ``pc_align`` (:numref:`pc_align`):: pc_align \ --max-displacement 300 \ --save-inv-transformed-reference-points \ stereo/run-DEM.tif ref.tif \ -o align/run A good value for the ``--max-displacement`` option is perhaps 1.5 times the mean elevation difference between the two input DEMs that can be found with ``geodiff`` (:numref:`geodiff`) and ``gdalinfo -stats``. The transformed cloud can be gridded back to a DEM as:: point2dem --tr 2.0 \ --t_srs "$proj" \ align/run-trans_reference.tif Here, the projection string in ``$proj`` can be the same as for the DEM created earlier (the ``gdalinfo -proj4`` command invoked on that DEM can print it). The ``geodiff`` program can take the difference of the now-aligned DEMs. Other inspections can be done as discussed in :numref:`visualizing_results`. .. _umbra_failure: Handling failure ~~~~~~~~~~~~~~~~ SAR images can be very hard to process, even when they look similar enough, due to noise and fine-level speckle. If the suggestions from above about increasing the number of interest point matches in bundle adjustment and stereo do not work, consider trying a different stereo pair, with a narrower stereo convergence angle, as this may result in more similar images. Alternatively, bundle adjustment can be skipped altogether. Then, ``parallel_stereo`` can be tried with the option ``--corr-seed-mode 2`` (:numref:`d_sub_dem`). In the latest build (:numref:`release`) this option can function without interest points. Consider increasing the correlation kernel size in ``parallel_stereo`` (:numref:`corr_section`), with an option such as ``--corr-kernel 9 9``. The default is 5. The regular block matching algorithm (``asp_bm``, :numref:`stereo_alg_overview`) may also work better for very noisy images, as it has a larger default kernel size. ================================================ FILE: docs/examples.rst ================================================ .. include:: .. _examples: Stereo processing examples ========================== This chapter showcases examples of processing data sets acquired with specific instruments. For a general introduction, see the tutorial (:numref:`tutorial`). Structure-from-Motion examples are in :numref:`sfm_toc` (for orbital images with no rig), and :numref:`rig_examples` (using a rig and robot images). .. toctree:: examples/stereo_pairs examples/hirise examples/ctx examples/moc examples/mer examples/k10 examples/lronac examples/change3 examples/apollo15 examples/hrsc examples/cassini examples/csm examples/dawn examples/kaguya examples/chandrayaan2 examples/junocam examples/isis_minirf examples/pbs_slurm examples/aster examples/dg examples/rpc examples/perusat1 examples/pleiades examples/spot5 examples/spot67 examples/skysat examples/historical examples/bathy examples/umbra_sar .. _sfm_toc: SfM examples ============ This chapter illustrates how to solve for cameras using Structure-from-Motion (SfM), how to register the cameras to the ground, followed by producing a terrain model. .. toctree:: sfm .. _rig_examples: SfM examples with a rig ======================= These examples shows how to solve for camera poses using Structure-from-Motion (SfM) and then create textured meshes. The images are acquired using a rig mounted on a robot on the ISS (:numref:`rig_calibrator_example`, :numref:`sfm_iss`) and with the MSL Curiosity rover (:numref:`rig_msl`). Somewhat related examples, but without using a rig or the above workflow, are in :numref:`sfm` (the images are acquired in orbit using a satellite and a DEM is produced) and :numref:`mer-example` (a basic and rather old two-image example for the MER rovers). See also :numref:`csm_msl` for an example using CSM cameras for the MSL rover, without employing SfM. .. toctree:: examples/rig examples/sfm_iss examples/msl examples/orbital_rig Shape-from-Shading ================== .. toctree:: sfs_usage examples/sfs_earth examples/sfs_ctx ================================================ FILE: docs/experimental.rst ================================================ .. _experimental: Experimental features ===================== .. _casp_go: The CASP-GO stereo processing system ------------------------------------ CASP-GO (Co-registered ASP using Gotcha Optimisation, https://github.com/mssl-imaging/CASP-GO) is a set of algorithms that are meant to augment certain parts of ASP :cite:`tao2016optimised, tao2018massive, shin2012progressively, otto1989region`. Thse algorithms were developed at the Imaging Group, Mullard Space Science Laboratory, University College London, by Yu Tao, under the direction of Jan-Peter Muller, with funding from the EU-FP7 project titled "iMars: Analysis of Mars Multi-Resolution Images using Auto-Coregistration, Data Mining and Crowd Sourcing Techniques", under contract #607379. Under NASA proposal 19-PDART19_2-0094 we researched incorporating these algorithms into ASP. CASP-GO consists of three algorithms: - Gotcha disparity refinement. Its purpose is to fix artifacts in ASP's older ``asp_bm`` block-matching algorithm (:numref:`stereo_algos_full`) at the disparity filtering stage. It takes as input and overwrites the ``F.tif`` disparity (which is described in :numref:`outputfiles`). This algorithm definitely provides some in-filling functionality over the older ``asp_bm`` performance, but users may want to experiment with other ASP stereo algorithms (like MGM) which may also result in high quality disparities. This logic can be turned on with the ``--gotcha-disparity-refinement`` option of ``parallel_stereo``. See below for the parameters which control it. - Image alignment. This component uses feature detection to find interest point matches among orthoimages associated with given DEMs, which is then used to compute an alignment transform among the DEMs :cite:`sidiropoulos2018automatic`. It was incorporated into ASP and further extended as the ``image_align`` tool (:numref:`image_align`). - Kriging. This logic is meant to produce DEMs with fewer holes than ASP's older method in ``point2dem`` (:numref:`point2dem`) which used a Delaunay triangulation. It is based on a technique called ``kriging``, which is a family of generalized linear least square regression algorithms (:cite:`remy2002gstl`), implemented in the ``Geostatistics Template Library`` (http://gstl.sourceforge.net/). The CASP-GO DEM-creation algorithm functions along the same lines as ASP's recent and default implementation in ``point2dem``. The input is a point cloud, the output is a gridded DEM, and weighted averaging is used to combine the 3D points to produce the DEM. The only difference is that the recent ``point2dem`` implementation (circa 3.1.0) computes the weights based on a Gaussian with given sigma and neighborhood size, while CASP-GO uses weights produced by the kriging procedure with a user-specified covariance. CASP-GO's covariance function assigns the same covariance value to all points, which results in the kriging procedure returning constant weights. In effect, the resulting algorithm is a particular case of the modern approach in ``point2dem``, when the sigma value is very large. Thus, no separate implementation for kriging was implemented at this time. .. For that reason, while kriging seems to be a very interesting technique, because CASP-GO did not implement a good covariance function, and since it would be quite tricky to assign a nontrivial covariance to points in a cloud, we chose to not incorporate this implementation, as it does not add to the existing functionality. The CASP-GO parameter file ~~~~~~~~~~~~~~~~~~~~~~~~~~ CASP-GO's behavior is controlled by a parameter file, which ASP ships as ``share/CASP-GO_params.xml``, and which can be overridden with the ``parallel_stereo`` option ``--casp-go-param-file``. Only the parameters relevant for Gotcha disparity refinement are read from this file, as we did not implement the kriging algorithm, and the ``image_align`` tool we added has its own interface. Here are two sets of values for these parameters, optimized for CTX and HiRISE cameras, respectively. CTX:: ALSC iterations: 8 Max. eigenvalue: 150 ALSC kernel: 21 Grow neighbor: 8 HiRISE:: ALSC iterations: 8 Max. eigenvalue: 80 ALSC kernel: 11 Grow neighbor: 8 ================================================ FILE: docs/glossary.rst ================================================ Glossary ======== .. glossary:: ASP Ames Stereo Pipeline CTX Context Camera DEM digital elevation model, synonym for DTM DTM digital terrain model, synonym for DEM ET ephemeris time GCP ground control point (:numref:`bagcp`) HRSC High Resolution Stereo Camera HiRISE High Resolution Imaging Science Experiment IRG Intelligent Robotics Group ISIS `Integrated Software for Imagers and Spectrometers `_ KML Keyhole Markup Language LROC Lunar Reconnaissance Orbiter Camera LRO Lunar Reconnaissance Orbiter LOLA Lunar Orbiter Laser Altimeter MER Mars Exploration Rover MGS Mars Global Surveyor MOC Mars Orbiter Camera MOLA Mars Orbiter Laser Altimeter MRO Mars Reconnaissance Orbiter MPL Mars Polar Lander NED National Elevation Dataset NASA National Aeronautics and Space Administration PDS Planetary Data System PVL Parameter Value Language THEMIS Thermal Emission Imaging System ULCN Unified Lunar Coordinate Network USGS United States Geological Survey VW Vision Workbench ================================================ FILE: docs/index.rst ================================================ .. Ames Stereo Pipeline documentation master file. Ames Stereo Pipeline documentation (version |version|) ====================================================== .. toctree:: :maxdepth: 2 :numbered: introduction installation tutorial next_steps tips_tricks examples bundle_adjustment error_propagation correlation experimental tools stereodefault stereo_algorithms outputfiles pinholemodels bathy_water_masking papersusingasp news contributing building_asp thirdparty acknowledgements glossary zzreferences .. only:: html Indices and tables ================== * :ref:`genindex` * :ref:`search` ================================================ FILE: docs/installation.rst ================================================ .. _installation: .. include:: ../INSTALLGUIDE.rst .. _vwrc: Settings optimization --------------------- Finally, the last thing to be done for Stereo Pipeline is to setup up Vision Workbench's render and logging settings. This step is optional, but for best performance some thought should be applied here. Vision Workbench is a multi-threaded image processing library used by Stereo Pipeline. The settings by which Vision Workbench processes data are configurable by having a ``.vwrc`` file hidden in your home directory. Below is an example:: # This is an example VW configuration file. Save this file to # ~/.vwrc to adjust the VW log settings, even if the program is #already running. # General settings [general] default_num_threads = 16 write_pool_size = 40 system_cache_size = 1073741824 # ~ 1 GB # The following integers are associated with the log levels # throughout the Vision Workbench. Use these in the log rules # below. # # ErrorMessage = 0 # WarningMessage = 10 # InfoMessage = 20 # DebugMessage = 30 # VerboseDebugMessage = 40 # EveryMessage = 100 # # You can create a new log file or adjust the settings # for the console log: # logfile # - or - # logfile console # Once you have created a logfile (or selected the console), you # can add log rules using the following syntax. (Note that you # can use wildcard characters '*' to catch all log_levels for a # given log_namespace, or vice versa.) # # Below are examples of using the log settings. # Turn on various logging levels for several subsystems, with # the output going to the console (standard output). [logfile console] # Turn on error and warning messages for the thread subsystem. 10 = thread # Turn on error, warning, and info messages for the # asp subsystem. 20 = asp # Turn on error, warning, info, and debug messages for the # stereo subsystem. 30 = stereo # Turn on every single message for the cache subsystem (this will # be extremely verbose and is not recommended). # 100 = cache # Turn off all progress bars to the console (not recommended). # 0 = *.progress # Turn on logging of error and warning messages to a file for the # stereo subsystem. Warning: This file will be always appended # to, so it should be deleted periodically. # [logfile /tmp/vw_log.txt] # 10 = stereo There are a lot of possible options that can be implemented in the above example. Let's cover the most important options and the concerns the user should have when selecting a value. Performance settings ~~~~~~~~~~~~~~~~~~~~ ``default_num_threads`` (default=2) This sets the maximum number of threads that can be used for rendering. When stereo's ``subpixel_rfne`` is running you'll probably notice 10 threads are running when you have ``default_num_threads`` set to 8. This is not an error, you are seeing 8 threads being used for rendering, 1 thread for holding ``main()``'s execution, and finally 1 optional thread acting as the interface to the file driver. It is usually best to set this parameter equal to the number of processors on your system. Be sure to include the number of logical processors in your arithmetic if your system supports hyper-threading. Adding more threads for rasterization increases the memory demands of Stereo Pipeline. If your system is memory limited, it might be best to lower the ``default_num_threads`` option. ``write_pool_size`` (default=21) The ``write_pool_size`` option represents the max waiting pool size of tiles waiting to be written to disk. Most file formats do not allow tiles to be written arbitrarily out of order. Most however will let rows of tiles to be written out of order, while tiles inside a row must be written in order. Because of the previous constraint, after a tile is rasterized it might spend some time waiting in the write pool before it can be written to disk. If the write pool fills up, only the next tile in order can be rasterized. That makes Stereo Pipeline perform like it is only using a single processor. Increasing the ``write_pool_size`` makes Stereo Pipeline more able to use all processing cores in the system. Having this value too large can mean excessive use of memory as it must keep more portions of the image around in memory while they wait to be written. This number should be larger than the number of threads, perhaps by about 20. ``system_cache_size`` (default=1073741824) Accessing a file from the hard drive can be very slow. It is especially bad if an application needs to make multiple passes over an input file. To increase performance, Vision Workbench will usually leave an input file stored in memory for quick access. This file storage is known as the 'system cache' and its max size is dictated by ``system_cache_size``. The default value is 1 GB. Setting this value too high can cause your application to crash. It is usually recommend to keep this value around 1/4 of the maximum available memory on the system. The units of this property is in bytes. All tools shipped with ASP have the option ``--cache-size-mb`` to override the value of ``system_cache_size``. Its default value is 1024 MB (1 GB). The recommendations for these values are based on use of the block matching algorithm in ASP. When using memory intensive algorithms such as SGM you may wish to lower some of these values (such as the cache size) to leave more memory available for the algorithm to use. .. _logging: Logging settings ~~~~~~~~~~~~~~~~ The messages displayed in the console by Stereo Pipeline are grouped into several namespaces, and by level of verbosity. An example of customizing Stereo Pipeline's output is given in the ``.vwrc`` file shown above. Several of the tools in Stereo Pipeline, including ``parallel_stereo``, automatically append the information displayed in the console to a log file in the current output directory. These logs contain in addition some data about your system and settings, which may be helpful in resolving problems with the tools (:numref:`outputfiles`). It is also possible to specify a global log file to which all tools will append to, as illustrated in ``.vwrc``. ================================================ FILE: docs/introduction.rst ================================================ Introduction ============ The NASA Ames Stereo Pipeline (ASP) is a suite of free and open source automated geodesy and stereogrammetry tools designed for processing images captured from satellites, around Earth and other planets (:numref:`examples`), robotic rovers (:numref:`rig_msl`, :numref:`csm_msl`), aerial cameras and low-cost satellites (:numref:`skysat`), historical images (:numref:`kh4`), with and without accurate camera pose information. It has functionality for 3D terrain creation from stereo (:numref:`tutorial`), alignment of point clouds (:numref:`pc_align`), structure-from-motion (:numref:`sfm`), shape-from-shading (:numref:`sfs_usage`), bundle adjustment (:numref:`bundle_adjust`), solving for jitter (:numref:`jitter_solve`), rig calibration (:numref:`rig_calibrator`), refining camera intrinsics (:numref:`floatingintrinsics`), GCP generation (:numref:`gcp_gen`, :numref:`dem2gcp`), and a versatile GUI shell (:numref:`stereo_gui`). ASP produces cartographic products, including digital terrain models (DTMs) and ortho-projected images (:numref:`builddem`), 3D models (:numref:`point2mesh`), textured meshes (:numref:`sfm_iss`), and bundle-adjusted networks of cameras (:numref:`control_network`). ASP's data products are suitable for science analysis, mission planning, and public outreach. .. figure:: images/introduction/p19view2_400px.png :alt: 3D model of Mars This 3D model was generated from a image pair M01/00115 and E02/01461 (34.66N, 141.29E). The complete stereo reconstruction process takes approximately thirty minutes on a 3.0 GHz workstation for input images of this size (1024 |times| 8064 pixels). This model, shown here without vertical exaggeration, is roughly 2 km wide in the cross-track dimension. Background ---------- The Intelligent Robotics Group (IRG) at the NASA Ames Research Center has been developing 3D surface reconstruction and visualization capabilities for planetary exploration for more than a decade. First demonstrated during the Mars Pathfinder Mission, the IRG has delivered tools providing these capabilities to the science operations teams of the :term:`MPL` mission, the :term:`MER` mission, the :term:`MRO` mission, and the :term:`LRO` mission. A critical component technology enabling this work is the ASP. The Stereo Pipeline generates high quality, dense, texture-mapped 3D surface models from stereo image pairs. In addition, ASP provides tools to perform many other cartography tasks including map projection, point cloud and DEM registration, automatic registration of cameras, data format conversion, and data visualization. Although initially developed for ground control and scientific visualization applications, the Stereo Pipeline has evolved to address orbital stereogrammetry and cartographic applications. In particular, long-range mission planning requires detailed knowledge of planetary topography, and high resolution topography is often derived from stereo pairs captured from orbit. Orbital mapping satellites are sent as precursors to planetary bodies in advance of landers and rovers. They return a wealth of images and other data that helps mission planners and scientists identify areas worthy of more detailed study. Topographic information often plays a central role in this planning and analysis process. Our recent development of the Stereo Pipeline coincides with a period of time when NASA orbital mapping missions are returning orders of magnitude more data than ever before. Data volumes from the Mars and Lunar Reconnaissance Orbiter missions now measure in the tens of terabytes. There is growing consensus that existing processing techniques, which are still extremely human intensive and expensive, are no longer adequate to address the data processing needs of NASA and the Planetary Science community. To pick an example of particular relevance, the :term:`HiRISE` instrument has captured a few thousand stereo pairs. Of these, only about two hundred stereo pairs have been processed to date; mostly on human-operated, high-end photogrammetric workstations. It is clear that much more value could be extracted from this valuable raw data if a more streamlined, efficient process could be developed. The Stereo Pipeline was designed to address this very need. By applying recent advances in computer vision, we have created an *automated* process that is capable of generating high quality DTMs with minimal human intervention. Users of the Stereo Pipeline can expect to spend some time picking a handful of settings when they first start processing a new type of image, but once this is done, the Stereo Pipeline can be used to process tens, hundreds, or even thousands of stereo pairs without further adjustment. With the release of this software, we hope to encourage the adoption of this tool chain at institutions that run and support these remote sensing missions. Over time, we hope to see this tool incorporated into ground data processing systems alongside other automated image processing pipelines. As this tool continues to mature, we believe that it will be capable of producing digital elevation models of exceptional quality without any human intervention. Human vs. Computer: When to Choose Automation? ---------------------------------------------- When is it appropriate to choose automated stereo mapping over the use of a conventional, human-operated photogrammetric workstation? This is a philosophical question with an answer that is likely to evolve over the coming years as automated data processing technologies become more robust and widely adopted. For now, our opinion is that you should *always* rely on human-guided, manual data processing techniques for producing mission critical data products for missions where human lives or considerable capital resources are at risk. In particular, maps for landing site analysis and precision landing absolutely require the benefit of an expert human operator to eliminate obvious errors in the DEMs, and also to guarantee that the proper procedures have been followed to correct satellite telemetry errors so that the data have the best possible geodetic control. When it comes to using DTMs for scientific analysis, both techniques have their merits. Human-guided stereo reconstruction produces DTMs of unparalleled quality that benefit from the intuition and experience of an expert. The process of building and validating these DTMs is well-established and accepted in the scientific community. However, only a limited number of DTMs can be processed to this level of quality. For the rest, automated stereo processing can be used to produce DTMs at a fraction of the cost. The results are not necessarily less accurate than those produced by the human operator, but they will not benefit from the same level of scrutiny and quality control. As such, users of these DTMs must be able to identify potential issues, and be on the lookout for errors that may result from the improper use of these tools. We recommend that all users of the Stereo Pipeline take the time to thoroughly read this documentation and build an understanding of how stereo reconstruction and bundle adjustment can be best used together to produce high quality results. You are welcome to contact us if you have any questions (:numref:`get-help`). Software foundations -------------------- NASA Vision Workbench ~~~~~~~~~~~~~~~~~~~~~ The Stereo Pipeline is built upon the Vision Workbench software which is a general purpose image processing and computer vision library also developed by the IRG. Some of the tools discussed in this document are actually Vision Workbench programs, and any distribution of the Stereo Pipeline requires the Vision Workbench. This distinction is important only if compiling this software. The USGS Integrated Software for Imagers and Spectrometers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For processing non-terrestrial NASA satellite images, Stereo Pipeline must be installed alongside a copy of the Integrated Software for Imagers and Spectrometers (:term:`ISIS`). ISIS is however not required for processing terrestrial images (DigitalGlobe/Maxar WorldView, etc.). ISIS is widely used in the planetary science community for processing raw spacecraft images into high level data products of scientific interest such as map-projected and mosaicked images :cite:`2004LPI.35.2039A,1997LPI.28.387G,ISIS_website`. We chose ISIS because (1) it is widely adopted by the planetary science community, (2) it contains the authoritative collection of geometric camera models for planetary remote sensing instruments, and (3) it is open source software that is easy to leverage. By installing the Stereo Pipeline, you will be adding an advanced stereo image processing capability that can be used in your existing ISIS workflow. The Stereo Pipeline supports the ISIS cube (``.cub``) file format, and can make use of the camera models and ancillary information (i.e. SPICE kernels) for imagers on many NASA spacecraft. The use of this single standardized set of camera models ensures consistency between products generated in the Stereo Pipeline and those generated by ISIS. Also by leveraging ISIS camera models, the Stereo Pipeline can process stereo pairs captured by just about any NASA mission. .. _get-help: Getting help and reporting bugs ------------------------------- All bugs, feature requests, and general discussion should be posted on the ASP support forum: https://groups.google.com/forum/#!forum/ames-stereo-pipeline-support To contact the developers and project manager directly, send an email to: stereo-pipeline-owner@lists.nasa.gov When you submit a bug report, it may be helpful to attach the logs output by ``parallel_stereo`` and other tools (:numref:`logging`). Typographical conventions ------------------------- Names of programs that are meant to be run on the command line are written in a constant-width font, like the ``parallel_stereo`` program, as are options to those programs. An indented line of constant-width text can be typed into your terminal, these lines will either begin with a '``>``' to denote a regular shell, or with '``ISIS>``' which denotes an ISIS-enabled shell (which means you have to set the ``ISISROOT`` environment variable and have sourced the appropriate ISIS startup script, as detailed in the ISIS instructions). :: > ls ISIS> pds2isis Constant-width text enclosed in greater-than and less-than brackets denotes an option or argument that a user will need to supply. For example, '``stereo E0201461.map.cub M0100115.map.cub out``' is specific, but '``stereo out``' indicates that ```` and ```` are not the names of specific files, but dummy parameters which need to be replaced with actual file names. Square brackets denote optional options or values to a command, and items separated by a vertical bar are either aliases for each other, or different, specific options. Default arguments or other notes are enclosed by parentheses, and line continuation with a backslash:: point2dem [-h|--help] [-r moon|mars] [-s ] \ [-o ] -PC.tif The above indicates a run of the ``point2dem`` program. The only argument that it requires is a point cloud file, which is produced by the ``parallel_stereo`` program and ends in ``-PC.tif``, although its prefix could be anything (hence the greater-than and less-than enclosing brackets). Everything else is in square brackets indicating that they are optional. Here, ``--help`` and ``-h`` refer to the same thing. Similarly, the argument to the ``-r`` option must be either ``moon`` or ``mars``. The ``-s`` option takes a floating point value as its argument, and has a default value of zero. The ``-o`` option takes a filename that will be used as the output DTM. Although there are two lines of constant-width text, the backslash at the end of the first line indicates that the command continues on the second line. You can either type everything into one long line on your own terminal, or use the backslash character and a return to continue typing on a second line in your terminal. Citing the Ames Stereo Pipeline in your work -------------------------------------------- In general, use this reference: Beyer, Ross A., Oleg Alexandrov, and Scott McMichael. 2018. The Ames Stereo Pipeline: NASA's open source software for deriving and processing terrain data. *Earth and Space Science*, **5**. https://doi.org/10.1029/2018EA000409. If you are using ASP for application to Earth images, or need a reference which details the quality of output, then we suggest also referencing: Shean, D. E., O. Alexandrov, Z. Moratto, B. E. Smith, I. R. Joughin, C. C. Porter, Morin, P. J. 2016. An automated, open-source pipeline for mass production of digital elevation models (DEMs) from very high-resolution commercial stereo satellite imagery. *ISPRS Journal of Photogrammetry and Remote Sensing.* **116**. In addition to using the references above, in order to help you better cite the specific version of ASP that you are using in a work, as of ASP version 2.6.0, we have started using `Zenodo `__ to create digital object identifiers (DOIs) for each ASP release. For example, the DOI for version 2.6.2 is 10.5281/zenodo.3247734, and you can cite it like this: Beyer, Ross A., Oleg Alexandrov, and Scott McMichael. 2019. NeoGeographyToolkit/StereoPipeline: Ames Stereo Pipeline version 2.6.2. *Zenodo*. `DOI: 10.5281/zenodo.3247734 `__. Of course, every new release of ASP will have its own unique DOI, and this link should always point to the `latest DOI `__ for ASP. If you publish a paper using ASP, please let us know. We'll cite your work in this document, in :numref:`papersusingasp`. Warnings to users of the Ames Stereo Pipeline --------------------------------------------- Ames Stereo Pipeline is a **research** product. There may be bugs or incomplete features. We reserve the ability to change the API and command line options of the tools we provide. Although we hope you will find this release helpful, you use it at your own risk. While we are confident that the algorithms used by this software are robust, the Ames Stereo Pipeline has a lot of adjustable parameters, and even experienced operators can produce poor results. We *strongly recommend* that if you have any concerns about the products that you (or others) create with this software, please just get in contact with us. We can help you figure out either how to make the product better, or help you accurately describe the limitations of the data or the data products, so that you can use it to confidently make new and wonderful discoveries. Please check each release's NEWS file (:numref:`news`) to see a summary of our recent changes. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/news.rst ================================================ .. _news: News and development history ============================ .. include:: ../NEWS.rst ================================================ FILE: docs/next_steps.rst ================================================ .. _nextsteps: The next steps ============== This chapter will discuss in more detail ASP's stereo process and other tools available to either pre-process the input images/cameras or to manipulate ``parallel_stereo``'s outputs, both in the context of planetary ISIS data and for Earth images. This includes how to customize ``parallel_stereo``'s settings (:numref:`running-stereo`), use ``point2dem`` to create 3D terrain models (:numref:`manipulating_results`), visualize the results (:numref:`genhillshade`). Other topics include bundle adjustment (:numref:`next_steps_ba`), align the obtained point clouds to another data source (:numref:`pc-align-example`), perform 3D terrain adjustments in respect to a geoid (:numref:`geoid_adj`), converted to LAS (:numref:`gen_las`), etc. It is suggested to read the tutorial (:numref:`tutorial`) before this chapter. .. _running-stereo: Stereo Pipeline in more detail ------------------------------ .. _stereo_alg_overview: Choice of stereo algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: images/stereo_algos.png :name: stereo_alg_fig A DEM produced (from top-left) with the ``asp_bm``, ``asp_mgm``, ``libelas``, and ``opencv_sgbm`` stereo algorithms. The ``libelas`` algorithm is rather fast and the results are of good quality. No mapprojection (:numref:`mapproj-example`) was used here. The most important choice a user has to make when running ASP is the stereo algorithm to use. By default, ASP runs as if invoked with:: parallel_stereo --alignment-method affineepipolar \ --stereo-algorithm asp_bm --subpixel-mode 1 \ This invokes block-matching stereo with parabola subpixel mode, which can be fast but not of high quality. Much better results are likely produced with:: parallel_stereo \ --alignment-method affineepipolar \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ which uses ASP's implementation of MGM (:numref:`asp_sgm`). Using ``--subpixel-mode 3`` will likely further improve the results, but will be slower. For best results one can use ``--subpixel-mode 2``, but that is very slow. Do not use ``--subpixel-mode 1`` with ``asp_mgm``/``asp_sgm`` as that produces artifacts. See :numref:`subpixel` for more background on some subpixel modes. For steep terrains *it is strongly suggested to mapproject the images* (:numref:`mapproj-example`). ASP also implements *local alignment*, when the input images are split into tiles (with overlap) and locally aligned. This makes it possible to use third-party algorithms in addition to the ones ASP implements. With ASP's own MGM algorithm, local alignment can be invoked as:: parallel_stereo \ --alignment-method local_epipolar \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ ASP also ships with the following third-party stereo algorithms: MGM (original author implementation), OpenCV SGBM, Libelas, MSMW, MSMW2, and OpenCV BM. For more details see :numref:`stereo_algos`. For example, the rather solid and reasonably fast Libelas implementation can be called as:: parallel_stereo \ --alignment-method local_epipolar \ --stereo-algorithm libelas \ --job-size-h 512 --job-size-w 512 \ --sgm-collar-size 128 \ Above we used tiles of size 512 pixels with an extra padding of 128 pixels on each side, for a total size of 768 pixels. Smaller tiles are easier to align accurately, and also use less memory. The defaults in ``parallel_stereo`` are double these values, which work well with ASP's MGM which is more conservative with its use of memory but can be too much for some other implementations. It is suggested to not specify here ``--subpixel-mode``, in which case it will use each algorithm's own subpixel implementation. Using ``--subpixel-mode 3`` will refine that result using ASP's subpixel implementation. Using ``--subpixel-mode 2`` will be much slower but likely produce even better results. Next we will discuss more advanced parameters which rarely need to be set in practice. .. _settingoptionsinstereodefault: Setting options in the ``stereo.default`` file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``parallel_stereo`` program can use a ``stereo.default`` file that contains settings that affect the stereo reconstruction process. Its contents can be altered for your needs; details are found in :numref:`stereodefault`. You may find it useful to save multiple versions of the ``stereo.default`` file for various processing needs. If you do this, be sure to specify the desired settings file by invoking ``parallel_stereo`` with the ``-s`` option. If this option is not given, the ``parallel_stereo`` program will search for a file named ``stereo.default`` in the current working directory. If ``parallel_stereo`` does not find ``stereo.default`` in the current working directory and no file was given with the ``-s`` option, ``parallel_stereo`` will assume default settings and continue. An example ``stereo.default`` file is available in the top-level directory of ASP. The actual file has a lot of comments to show you what options and values are possible. Here is a trimmed version of the important values in that file. :: alignment-method affineepipolar stereo-algorithm asp_bm cost-mode 2 corr-kernel 21 21 subpixel-mode 1 subpixel-kernel 21 21 For the ``asp_sgm`` and ``asp_mgm`` algorithms, the default correlation kernel size is 5 x 5 rather than 21 x 21. Note that the ``corr-kernel`` option does not apply to the external algorithms. Instead, each algorithm has its own options that need to be set (:numref:`stereo_algos`). All these options can be overridden from the command line, as described in :numref:`cmdline`. Alignment method ^^^^^^^^^^^^^^^^ For raw images, alignment is always necessary, as the left and right images are from different perspectives. Several alignment methods are supported, including ``local_epipolar``, ``affineepipolar`` and ``homography`` (see :numref:`image_alignment` for details). Alternatively, stereo can be performed with mapprojected images (:numref:`mapproj-example`). In effect we take a smooth low-resolution terrain and map both the left and right raw images onto that terrain. This automatically brings both images into the same perspective, and as such, for mapprojected images the alignment method is always set to ``none``. .. _stereo_algos: Stereo algorithms ^^^^^^^^^^^^^^^^^ ASP can invoke several algorithms for doing stereo, some internally implemented, some collected from the community, and the user can add their own algorithms as well (:numref:`adding_algos`). The list of algorithms is as follows. (See :numref:`stereo_algos_full` for a full discussion.) **Algorithms implemented in ASP** asp_bm (or specify the value '0') The ASP implementation of Block Matching. Search in the right image for the best match for a small image block in the left image. This is the fastest algorithm and works well for similar images with good texture coverage. How to set the block (kernel) size and subpixel mode is described further down. See also :numref:`asp_sgm`. asp_sgm (or specify the value '1') The ASP implementation of the Semi-Global Matching (SGM) algorithm :cite:`hirschmuller_sgm_original`. This algorithm is slow and has high memory requirements but it performs better in images with less texture. See :numref:`asp_sgm` for important details on using this algorithm. asp_mgm (or specify the value '2') The ASP implementation of the More Global Matching (MGM) variant of the SGM algorithm :cite:`facciolo2015mgm` to reduce high frequency artifacts in the output image at the cost of increased run time. See :numref:`asp_sgm` for important details on using this algorithm. asp_final_mgm (or specify the value '3') Use MGM on the final resolution level and SGM on preceding resolution levels. This produces a result somewhere in between the pure SGM and MGM options. **External implementations (shipped with ASP)** mgm The MGM implementation by its authors. See :numref:`original_mgm`. opencv_sgbm Semi-global block-matching algorithm from OpenCV 3. See :numref:`opencv_sgbm_options`. libelas The LIBELAS algorithm :cite:`Geiger2010ACCV`. See :numref:`libelas`. msmw and msmw2 Multi-Scale Multi-Window algorithm (two versions provided). See :numref:`msmw`. opencv_bm Classical block-matching algorithm from OpenCV 3. See :numref:`opencv_bm`. Correlation parameters ^^^^^^^^^^^^^^^^^^^^^^ The option ``corr-kernel`` in ``stereo.default`` define what correlation metric *(normalized cross correlation)* we'll be using and how big the template or kernel size should be *(21 pixels square)*. A pixel in the left image will be matched to a pixel in the right image by comparing the windows of this size centered at them. Making the kernel sizes smaller, such as 15 |times| 15, or even 11 |times| 11, may improve results on more complex features, such as steep cliffs, at the expense of perhaps introducing more false matches or noise. These options only to the algorithms implemented in ASP (those whose name is prefixed with ``asp_``). For externally implemented algorithms, any options to them can be passed as part of the ``stereo-algorithm`` field, as discussed in :numref:`stereo_algos_full`. Subpixel refinement parameters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A highly critical parameter in ASP is the value of ``subpixel-mode``. When set to 1, ``parallel_stereo`` performs parabola subpixel refinement, which is very fast but not very accurate. When set to 2, it produces very accurate results, but it is about an order of magnitude slower. When set to 3, the accuracy and speed will be somewhere in between the other methods. For the algorithms not implemented in ASP itself, not specifying this field will result in each algorithm using its own subpixel mode. The option ``subpixel-kernel`` sets the kernel size to use during subpixel refinement *(also 21 pixels square)*. .. _search_range2: Search range determination ^^^^^^^^^^^^^^^^^^^^^^^^^^ ASP will attempt to work out the minimum and maximum disparity it will search for automatically. The search range can be explicitly set with a command-line option such as:: --corr-search -80 -2 20 2 These four integers define the minimum horizontal and vertical disparity and then the maximum horizontal and vertical disparity (:numref:`corr_section`). The search range can be tightened with the option ``--max-disp-spread`` before full-image resolution happens. It is suggested that these settings be used only if the run-time is high or the inputs are difficult. For more details see :numref:`search_range`. The inner working of stereo correlation can be found in :numref:`correlation`. .. _perform-stereo: Performing stereo correlation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: images/p19-stereo-output_400px.png :name: p19-stereo-output :alt: Outputs of the ``parallel_stereo`` program. These are the four viewable ``.tif`` files created by the ``parallel_stereo`` program. On the left are the two aligned, pre-processed images: (``results/output-L.tif`` and ``results/output-R.tif``). The next two are mask images (``results/output-lMask.tif`` and ``results/output-rMask.tif``), which indicate which pixels in the aligned images are good to use in stereo correlation. The image on the right is the "Good Pixel map", (``results/output-GoodPixelMap.tif``), which indicates (in gray) which were successfully matched with the correlator, and (in red) those that were not matched. As already mentioned, the ``parallel_stereo`` program can be invoked for ISIS images as:: ISIS> parallel_stereo left_image.cub right_image.cub \ -s stereo.default results/output For DigitalGlobe/Maxar images the cameras need to be specified separately:: parallel_stereo left.tif right.tif left.xml right.xml \ -s stereo.default results/output The string ``results/output`` is arbitrary, and in this case we will simply make all outputs go to the ``results`` directory. When ``parallel_stereo`` finishes, it will have produced a point cloud image. :numref:`manipulating_results` describes how to convert it to a digital elevation model (DEM) or other formats. The ``parallel_stereo`` program can be used purely for computing the correlation (disparity) of two images, without cameras (:numref:`correlator-mode`). The quality of correlation can be evaluated with the ``corr_eval`` program (:numref:`corr_eval`). The ``parallel_stereo`` command can also take multiple input images, performing multi-view stereo (:numref:`multiview`), though this approach is rather discouraged as better results can be obtained with bundle adjustment followed by pairwise stereo and merging of DEMs with ``dem_mosaic`` (:numref:`dem_mosaic`). Running the GUI frontend ~~~~~~~~~~~~~~~~~~~~~~~~ The ``stereo_gui`` program (:numref:`stereo_gui`) is a GUI frontend to ``parallel_stereo``. It is invoked with the same options as ``parallel_stereo`` (except for the more specialized ones such as ``--job-size-h``, etc.). It displays the input images, and makes it possible to zoom in and select smaller regions to run stereo on. .. _cmdline: Specifying settings on the command line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All the settings given via the ``stereo.default`` file (:numref:`stereodefault`) can be overridden from the command line. For this add a double hyphen (``--``) in front of the option's name and set the value as in the configuration file. For options in the ``stereo.default`` file that take multiple numbers, they must be separated by spaces (like ``--corr-kernel 25 25``) on the command line. Example:: parallel_stereo E0201461.map.cub M0100115.map.cub \ -s stereo.map --corr-search -70 -4 40 4 \ --subpixel-mode 3 results/output Stereo on multiple machines ~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the input images are really large it may desirable to distribute the work over several computing nodes. For that, the ``--nodes-list`` option of ``parallel_stereo`` must be used. See :numref:`pbs_slurm`. .. _mapproj-example: Stereo with mapprojected images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The way stereo correlation works is by matching a neighborhood of each pixel in the left image to a similar neighborhood in the right image. This matching process can fail or become unreliable if the two images are too different, which can happen for example if the perspectives of the two cameras are very different, the underlying terrain has steep portions, or because of clouds and deep shadows. This can result in large disparity search ranges, long run times, and ASP producing 3D terrains with noise or missing data. ASP can mitigate this by *mapprojecting* the left and right images onto some pre-existing low-resolution smooth terrain model without holes, and using the output images to do stereo. In effect, this makes the images much more similar and more likely for stereo correlation to succeed. In this mode, ASP does not create a terrain model from scratch, but rather uses an existing terrain model as an initial guess, and improves on it. .. _initial_terrain: Choice of initial guess terrain model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For Earth, an existing terrain model can be, for example, the Copernicus 30 m DEM from: https://portal.opentopography.org/raster?opentopoID=OTSDEM.032021.4326.3 or the NASA SRTM DEM (available on the same web site as above), GMTED2010, USGS's NED data, or NGA's DTED data. The Copernicus 30 m DEM heights are relative to the EGM96 geoid. *Any such DEM must be converted using* ``dem_geoid`` *to WGS84 ellipsoid heights, for any processing to be accurate.* See (:numref:`conv_to_ellipsoid`). There exist pre-made terrain models for other planets as well, for example the Moon LRO LOLA global DEM and the Mars MGS MOLA DEM. Check, as before, if your DEM is relative to the areoid rather than an ellipsoid (:numref:`conv_to_ellipsoid`). Some Mars DEMs may have an additional 190 meter vertical offset (such as the dataset ``molaMarsPlanetaryRadius0001.cub`` shipped with ISIS data), which can be taken care of with ``image_calc`` (:numref:`image_calc`). Alternatively, a low-resolution smooth DEM can be obtained by running ASP itself (:numref:`isis_map_proj`). In such a run, subpixel mode may be set to parabola (``subpixel-mode 1``) for speed. To make it sufficiently coarse and smooth, the resolution can be set to about 40 times coarser than either the default ``point2dem`` (:numref:`point2dem`) resolution or the resolution of the input images. If the resulting DEM turns out to be noisy or have holes, one could change in ``point2dem`` the search radius factor, use hole-filling, invoke more aggressive outlier removal, and erode pixels at the boundary (those tend to be less reliable). .. _conv_to_ellipsoid: Conversion of initial guess terrain to ellipsoid heights ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is very important that your DEM be relative to a datum/ellipsoid (such as WGS84), and *not* to a geoid/areoid, such as EGM96 for Earth. Otherwise there will be a systematic offset of several tens of meters between the images and the DEM, which can result in artifacts in mapprojection and stereo. A DEM relative to a geoid/areoid must be converted so that its heights are relative to an ellipsoid. This must be done for any Copernicus and SRTM DEMs. For others, consult the documentation of the source of the DEM to see this operation is needed. The ``gdalwarp`` program in recent versions of GDAL and our own ``dem_geoid`` tool (:numref:`dem_geoid`) can be used to perform the necessary conversions, if needed. For example, with ``dem_geoid``, one can convert EGM96 heights to WGS84 with the command:: dem_geoid --geoid egm96 --reverse-adjustment \ dem.tif -o dem This will create ``dem-adj.tif``. .. _dem_prep: Hole-filling and smoothing the input DEM ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is suggested to inspect and then hole-fill the input DEM (:numref:`dem_mosaic_fill` and :numref:`dem_mosaic_extrapolate`). If the input DEM has too much detail, and those features do not agree with the images mapprojected on it, this can result in artifacts in the final DEM. A blur is suggested, after the holes are filled. Example:: dem_mosaic --dem-blur-sigma 5 dem.tif -o dem_blur.tif The amount of blur may depend on the input DEM resolution, image ground sample distance, and how misregistered the initial DEM is relative to the images. One can experiment on a clip with values of 5 and 10 for sigma, for example. .. _mapproj-res: Grid size and projection ^^^^^^^^^^^^^^^^^^^^^^^^ It is very important to specify the *same* grid size (ground sample distance, ground resolution) and projection string when mapprojecting the images (options ``--tr`` and ``--t_srs`` for ``mapproject``, :numref:`mapproject`), to avoid big search range issues later in correlation. Normally, ``mapproject`` is rather good at auto-guessing the resolution, so this tool can be invoked with no specification of the resolution for the left image, then then ``gdalinfo`` can be used to find the obtained pixel size, and that value can be used with the right image. In the latest build ASP, these quantities can be borrowed from the first mapprojected image with the option ``--ref-map`` (:numref:`mapproj_refmap`). Invoking ``mapproject`` with the ``--query-projection`` option will print the estimated ground sample distance (output pixel size) without doing the mapprojection. If these two images have rather different auto-determined resolutions, it is suggested that the smaller ground sample distance be used for both, or otherwise something in the middle. Using a ground sample distance which is too different than what is appropriate can result in aliasing in mapprojected images and artifacts in stereo. .. _isis_map_proj: Example for ISIS images ^^^^^^^^^^^^^^^^^^^^^^^ .. figure:: images/stereo_mapproj_400px.png :name: mapproj-example-fig :alt: DEMs from camera geometry images and from mapprojected images. A DEM obtained using plain stereo (left) and stereo with mapprojected images (right). Their quality will be comparable for relatively flat terrain and the second will be much better for rugged terrain. The right image has some artifacts at the boundary, which could have been avoided by running without clipping the input images or by cropping the input DEM. We used the ``asp_mgm`` algorithm (:numref:`running-stereo`). This example illustrates how to run stereo with mapprojected images for ISIS data. For an alternative approach using ``cam2map``, see :numref:`mapproj_with_cam2map`. We start with LRO NAC Lunar images M1121224102LE and M1121209902LE from ASU's LRO NAC web site (https://wms.lroc.asu.edu/lroc/search), fetching them as:: wget http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0015/DATA/ESM/2013111/NAC/M1121224102LE.IMG wget http://pds.lroc.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0015/DATA/ESM/2013111/NAC/M1121209902LE.IMG We convert them to ISIS cubes using the ISIS program ``lronac2isis``, then we use the ISIS tools ``spiceinit``, ``lronaccal``, and ``lrnonacecho`` to update the SPICE kernels and to do radiometric and echo correction. This process is described in :numref:`lro_nac_no_stitch`. We name the two obtained .cub files ``left.cub`` and ``right.cub``. Here we decided to run ASP to create the low-resolution DEM needed for mapprojection, rather than get them from an external source. For speed, we process just a small portion of the images:: parallel_stereo left.cub right.cub \ --left-image-crop-win 1984 11602 4000 5000 \ --right-image-crop-win 3111 11027 4000 5000 \ --job-size-w 1024 --job-size-h 1024 \ --subpixel-mode 1 \ run_nomap/run (the crop windows can be determined using ``stereo_gui``, :numref:`image_bounds`). The input images have resolution of about 1 meter. We create the low-resolution DEM using a resolution 40 times as coarse, with a local stereographic projection:: point2dem --stereographic --auto-proj-center --tr 40.0 \ --search-radius-factor 5 run_nomap/run-PC.tif Or, the projection center can be passed to ``point2dem`` such as:: point2dem --stereographic --proj-lon --proj-lat Some experimentation with the parameters used by ``point2dem`` may be necessary for this low-resolution DEM to be smooth enough and with no holes. For Earth, a projection such as UTM can be used. We used ``--search-radius-factor 5`` to expand the DEM a bit, to counteract future erosion at image boundary in stereo due to the correlation kernel size. This is optional. By calling ``gdalinfo -proj4``, the PROJ string of the obtained DEM can be found, which can be used in mapprojection later, and with the resolution switched to meters from degrees (see :numref:`dg-mapproj` for more details). This DEM can be hole-filled and blurred with ``dem_mosaic`` if needed (:numref:`dem_mosaic_extrapolate`), producing a DEM called ``run_nomap/run-smooth.tif``. Inspect the result. It should be smooth and with no holes. Next, we mapproject the left image onto this DEM with the ``mapproject`` program (:numref:`mapproject`):: mapproject run_nomap/run-smooth.tif \ left.cub left_proj.tif The resolution of mapprojection is automatically determined, and can be later inspected with ``gdalinfo`` (:numref:`gdal_tools`). The projection may be auto-determined as well (:numref:`mapproj_auto_proj`). It is very important to use the *same resolution and projection* for mapprojecting the right image (:numref:`mapproj-res`), and to adjust these below (``--tr`` and ``--t_srs``). In the latest builds of ASP, ``mapproject`` can borrow the resolution and projection for the right image from the left one that was already mapprojected, with the ``--ref-map`` option:: mapproject \ --ref-map left_proj.tif \ run_nomap/run-smooth.tif \ right.cub right_proj.tif Next, we do stereo with these mapprojected images, with the mapprojection DEM as the last argument:: parallel_stereo \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --sgm-collar-size 256 \ left_proj.tif right_proj.tif \ left.cub right.cub \ run_map/run \ run_nomap/run-smooth.tif Even though we use mapprojected images, we still specified the original images as the third and fourth arguments. That because we need the camera information from those files. The fifth argument is the output prefix, while the sixth is the low-resolution DEM we used for mapprojection. We have used here ``--subpixel-mode 9`` with the ``asp_mgm`` algorithm as this will be the final point cloud and we want the increased accuracy. See :numref:`running-stereo` for more details about the various speed-vs-accuracy tradeoffs for stereo. The mapprojection DEM can be set via ``--dem`` above, in any place in the command, rather than being the very last argument (as of build 2026/02, :numref:`release`). Lastly, we create a DEM at 1 meter resolution with ``point2dem`` (:numref:`point2dem`):: point2dem --stereographic \ --auto-proj-center \ --tr 1.0 \ run_map/run-PC.tif We could have used a coarser resolution for the final DEM, such as 4 meters/pixel, since we won't see detail at the level of 1 meter in this DEM, as the stereo process is lossy. This is explained in more detail in :numref:`post-spacing`. In :numref:`mapproj-example-fig` we show the effect of using mapprojected images on accuracy of the final DEM. Some experimentation on a small area may be necessary to obtain the best results. Once images are mapprojected, they can be cropped to a small shared region using ``gdal_translate -projwin`` and then stereo with these clips can be invoked. We could have mapprojected the images using the ISIS tool ``cam2map``, as described in :numref:`mapproj_with_cam2map`. The current approach may be preferable since it allows us to choose the DEM to mapproject onto, and it is faster, since ASP's ``mapproject`` uses multiple processes, while ``cam2map`` is restricted to one process and one thread. .. _dg-mapproj: Example for DigitalGlobe/Maxar images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In this section we will describe how to run stereo with mapprojected images for DigitalGlobe/Maxar cameras for Earth. The same process can be used for any satellite images from any vendor (:numref:`other-mapproj`). Unlike the previous section, here we will use an external DEM to mapproject onto, rather than creating our own. We will use a variant of NASA SRTM data with no holes. See :numref:`initial_terrain` for how to fetch such a terrain. We will name this DEM ``ref_dem.tif``. It is important to note that ASP expects the input low-resolution DEM to be in reference to a datum ellipsoid, such as WGS84 or NAD83. If the DEM is in respect to either the EGM96 or NAVD88 geoids, the ASP tool ``dem_geoid`` can be used to convert the DEM to WGS84 or NAD83 (:numref:`dem_geoid`). See :numref:`conv_to_ellipsoid` for more details. Not applying this conversion might not properly negate the parallax seen between the two images, though it will not corrupt the triangulation results. In other words, sometimes one may be able to ignore the vertical datums on the input but we do not recommend doing that. Also, you should note that the geoheader attached to those types of files usually does not describe the vertical datum they used. That can only be understood by careful reading of your provider's documents. .. figure:: images/examples/dg/Mapped.png :name: fig:dg-map-example :figwidth: 100% Example colorized height map and ortho image output. A DigitalGlobe/Maxar camera file contains both an exact (linescan) camera model and an approximate RPC camera model. In this example, we use the exact linescan camera model for mapprojection (``-t dg``). In older ASP the RPC model was used instead as it was faster (``-t rpc``). Triangulation will happen either way with the exact model. Mapprojection does not need the precise model as it can be seen as a form of orthorectification that is undone when needed. It is *strongly suggested* to use a local projection for the mapprojection, especially around poles, as there the default longitude-latitude projection is not accurate. The *same* appropriately chosen resolution setting (option ``--tr``) must be used for both images to avoid long run-times and artifacts (:numref:`mapproj-res`). The ``ref_dem.tif`` dataset should be at a coarser resolution, such as 40 times coarser than the input images, as discussed earlier, to ensure no misregistration artifacts transfer over to the mapprojected images. Ensure the input DEM is relative to an ellipsoid and not a geoid (:numref:`conv_to_ellipsoid`). Fill and blur the input DEM if needed (:numref:`dem_mosaic_extrapolate`). Mapprojection commands:: proj='+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs' mapproject -t dg \ --t_srs "$proj" \ --tr 0.5 \ ref_dem.tif \ 12FEB12053305-P1BS_R2C1-052783824050_01_P001.TIF \ 12FEB12053305-P1BS_R2C1-052783824050_01_P001.XML \ left_mapproj.tif mapproject -t dg \ --t_srs "$proj" \ --tr 0.5 \ ref_dem.tif \ 12FEB12053341-P1BS_R2C1-052783824050_01_P001.TIF \ 12FEB12053341-P1BS_R2C1-052783824050_01_P001.XML \ right_mapproj.tif If the ``--t_srs`` option is not specified, the projection string will be read from the low-resolution input DEM, unless the DEM is in a geographic projection, when a projection in meters will be found (:numref:`mapproj_auto_proj`). See :numref:`mapproj_refmap` for how to ensure both images share the same projection and grid size. The zone of the UTM projection depends on the location of the images. Hence, if not relying on projection auto-determination, the zone should be set appropriately. The complete list of options for ``mapproject`` is described in :numref:`mapproject`. Running ``parallel_stereo`` with these mapprojected images, and the DEM used for mapprojection as the last argument:: parallel_stereo \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --alignment-method none \ --nodes-list nodes_list.txt \ left_mapproj.tif right_mapproj.tif \ 12FEB12053305-P1BS_R2C1-052783824050_01_P001.XML \ 12FEB12053341-P1BS_R2C1-052783824050_01_P001.XML \ dg/dg \ ref_dem.tif See :numref:`running-stereo` for more details about the various speed-vs-accuracy tradeoffs. See :numref:`pbs_slurm` for running on multiple machines. We have used ``alignment-method none``, since the images are mapprojected onto the same terrain with the same resolution, thus no additional alignment is necessary. More details about how to set these and other ``parallel_stereo`` parameters can be found in :numref:`settingoptionsinstereodefault`. The mapprojection DEM can be set via ``--dem`` above, in any place in the command, rather than being the very last argument (as of build 2026/02, :numref:`release`). DEM creation (:numref:`point2dem`):: point2dem --tr 0.5 dg/dg-PC.tif This DEM will inherit the projection from the mapprojected images. To auto-guess a local UTM projection, see :numref:`point2dem_proj`. .. _other-mapproj: Mapprojection with other camera models ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Stereo with mapprojected images can be used with any camera model supported by ASP, including RPC (:numref:`rpc`), Pinhole (:numref:`sfmgeneric`), CSM (:numref:`csm`), OpticalBar (:numref:`kh4`), etc. The ``mapproject`` command needs to be invoked with ``-t rpc``, ``-t pinhole``, etc., and normally it auto-detects this option (except when a camera file has both ``DG`` and ``RPC`` cameras). The cameras can also be bundle-adjusted, as discussed later. As earlier, when invoking ``parallel_stereo`` with mapprojected images, the first two arguments should be these images, followed by the camera models, output prefix, and the name of the DEM used for mapprojection. The session name (``-t``) passed to ``parallel_stereo`` should be ``rpcmaprpc``, ``pinholemappinhole``, or just ``rpc``, ``pinhole``, etc. Normally this is detected and set automatically. The stereo command with mapprojected images when the cameras are stored separately is along the lines of:: parallel_stereo \ -t rpc \ --stereo-algorithm asp_mgm \ --nodes-list nodes_list.txt \ left.map.tif right.map.tif \ left.xml right.xml \ run/run \ ref_dem.tif or:: parallel_stereo \ -t pinhole \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --nodes-list nodes_list.txt \ left.map.tif right.map.tif \ left.tsai right.tsai \ run/run \ ref_dem.tif When the cameras are embedded in the images, the command is:: parallel_stereo \ -t rpc \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --nodes-list nodes_list.txt \ left.map.tif right.map.tif \ run/run \ ref_dem.tif If your cameras have been corrected with bundle adjustment (:numref:`bundle_adjust`), one should pass ``--bundle-adjust-prefix`` to all ``mapproject`` and ``parallel_stereo`` invocations. See also :numref:`ba_pc_align` for when alignment was used as well. Then, ``point2dem`` can be run, as above, to create a DEM. .. _mapproj_reuse: Reusing a run with mapprojected images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mapprojection of input images is a preprocessing step, to help rectify them. The camera model type, bundle adjust prefix, and even camera names used in mapprojection are completely independent of the camera model type, bundle adjust prefix, and camera names used later in stereo with these mapprojected images. Moreover, once stereo is done with one choices of these, the produced run can be reused with a whole new set of choices, with only the triangulation step needing to be redone. That because the correlation between the images is still valid when the cameras change. This works best when the cameras do not change a lot after the initial run is made. Otherwise, it is better to redo the mapprojection and the full run from scratch. Once such a run is done, using say the output prefix ``dg/dg``, ``parallel_stereo`` can be done with the option ``--prev-run-prefix dg/dg``, a new output prefix, and modifications to the variables above, which will redo only the triangulation step. Even the camera files can be changed for stereo (only with ASP 3.3.0 or later). For example, ``jitter_solve`` (:numref:`jitter_solve`) can produce CSM cameras given input cameras in Maxar / DigitalGlobe .xml files or input CSM .json files (:numref:`csm`). So, if stereo was done with mapprojected images named ``left_mapproj.tif`` and ``right_mapproj.tif``, with cameras with names like ``left.xml`` and ``right.xml``, before solving for jitter, and this solver produced cameras of the form ``adjusted_left.json``, ``adjusted_right.json``, the reuse of the previous run can be done as:: parallel_stereo \ left_mapproj.tif right_mapproj.tif \ adjusted_left.json adjusted_right.json \ --prev-run-prefix dg/dg \ jitter/run \ ref_dem.tif Under the hood, this will read the metadata from the mapprojected images (:numref:`mapproj_metadata`), will look up the original ``left.xml`` and ``right.xml`` cameras, figure out what camera model was used in mapprojection will undo the mapprojection with this data, and then will do the triangulation with the new cameras. It is very important that ``--bundle-adjust-prefix`` needs to be used or not depending on the circumstances. For example, jitter-solved cameras already incorporate any prior bundle adjustment that ``jitter_solve`` was passed on input, so it was not specified in the above invocation, and in fact the results would be wrong if it was specified. An example without mapprojected images is shown in :numref:`bathy_reuse_run`. .. _mapproj_ortho: Stereo with ortho-ready images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Some vendors offer orthoimages that have been projected onto surfaces of constant height above a datum. Examples are Maxar's OR2A product and the Airbus Pleiades ortho product. These can be processed with ASP after some preparation. The orthoimages may have different pixel sizes (as read with ``gdalinfo``, :numref:`gdal_tools`). The coarser one must be regridded to the pixel size of the finer one, with a command such as:: gdalwarp -r cubicspline -overwrite -tr 0.4 0.4 \ ortho.tif ortho_regrid.tif The orthoimages must have the same projection, in units of meters (such as UTM). If these are different, the desired projection string can be added to the ``gdalwarp`` command above via the option ``-t_srs``. If desired to also clip both images to a region, add the option ``-te ``. The stereo command is:: parallel_stereo \ -t rpc \ --stereo-algorithm asp_mgm \ --ortho-heights 23.5 27.6 \ left_regrid.tif right_regrid.tif \ left.xml right.xml \ run/run The values passed in via ``--ortho-heights`` are the heights above the datum that were used to project the images. The datum is read from the geoheader of the images. For Maxar OR2A data (as evidenced by the ``ORStandard2A`` tag in the XML camera files), the option ``--ortho-heights`` need not be set, as the entries will be auto-populated from the ```` field in the camera files. The option ``--ortho-heights``, if set, takes priority over fields in those camera files. For Pleiades data, the needed values need to be looked up as described in :numref:`pleiades_projected`, and then set as above. All products we encountered (both Maxar and Airbus Pleiades) employed the RPC camera model. If that model is of a different type, adjust the ``-t`` option above (:numref:`ps_options`). After stereo, ``point2dem`` (:numref:`point2dem`) is run as usual. It is suggested to inspect the triangulation error created by that program, and to compare with a prior terrain, such as in :numref:`initial_terrain`. .. _diagnosing_problems: Diagnosing problems ~~~~~~~~~~~~~~~~~~~ Once invoked, ``parallel_stereo`` proceeds through several stages that are detailed in :numref:`entrypoints`. Intermediate and final output files are generated as it goes. See :numref:`outputfiles`, page for a comprehensive listing. Many of these files are useful for diagnosing and debugging problems. For example, as :numref:`p19-stereo-output` shows, a quick look at some of the TIFF files in the ``results/`` directory provides some insight into the process. Perhaps the most accessible file for assessing the quality of your results is the good pixel image (``results/output-GoodPixelMap.tif``). If this file shows mostly good, gray pixels in the overlap area (the area that is white in both the ``results/output-lMask.tif`` and ``results/output-rMask.tif`` files), then your results are just fine. If the good pixel image shows lots of failed data, signified by red pixels in the overlap area, then you need to go back and tune your ``stereo.default`` file until your results improve. This might be a good time to make a copy of ``stereo.default`` as you tune the parameters to improve the results. .. _p19-disparity: .. figure:: images/p19-disparity_400px.png :alt: Disparity images produced using the ``disparitydebug`` tool. Disparity images produced using the ``disparitydebug`` tool. The two images on the left are the ``results/output-D-H.tif`` and ``results/output-D-V.tif`` files, which are normalized horizontal and vertical disparity components produced by the disparity map initialization phase. The two images on the right are ``results/output-F-H.tif`` and ``results/output-F-V.tif``, which are the final filtered, sub-pixel-refined disparity maps that are fed into the Triangulation phase to build the point cloud image. Since these MOC images were acquired by rolling the spacecraft across-track, most of the disparity that represents topography is present in the horizontal disparity map. The vertical disparity map shows disparity due to "wash-boarding", which is not due to topography but because of spacecraft movement. Note however that the horizontal and vertical disparity images are normalized independently. Although both have the same range of gray values from white to black, they represent significantly different absolute ranges of disparity. Whenever ``parallel_stereo``, ``point2dem``, and other executables are run, they create log files in given tool's results directory, containing a copy of the configuration file, the command that was run, your system settings, and tool's console output. This will help track what was performed so that others in the future can recreate your work. Another handy debugging tool is the ``disparitydebug`` program (:numref:`disparitydebug`), which allows you to generate viewable versions of the intermediate results from the stereo correlation algorithm. ``disparitydebug`` converts information in the disparity image files into two TIFF images that contain horizontal and vertical components of the disparity (i.e. matching offsets for each pixel in the horizontal and vertical directions). There are actually three flavors of disparity map: the ``-D.tif``, the ``-RD.tif``, and ``-F.tif``. You can run ``disparitydebug`` on any of them. Each shows the disparity map at the different stages of processing. :: disparitydebug results/output-F.tif If the output H and V files from ``disparitydebug`` look good, then the point cloud image is most likely ready for post-processing. You can proceed to make a mesh or a DEM by processing ``results/output-PC.tif`` using the ``point2mesh`` or ``point2dem`` tools, respectively. :numref:`p19-disparity` shows the outputs of ``disparitydebug``. If the input images are mapprojected (georeferenced) and the alignment method is ``none``, all images output by stereo are georeferenced as well, such as GoodPixelMap, D_sub, disparity, etc. As such, all these data can be overlaid in ``stereo_gui``. ``disparitydebug`` also preserves any georeference. .. _longrun: Dealing with long run-times and failures ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If ``stereo_corr`` takes unreasonably long, it may have encountered a portion of the image where, due to noise (such as clouds, shadows, etc.) the determined search range is much larger than what it should be. The search range is displayed in a terminal and saved to ``stereo_corr`` log files (:numref:`out_log_files`). A width and height over 100 pixels is generally too large. In this case it is suggested to mapproject the images (:numref:`mapproj-example`). This will make the images more similar and reduce the search range. A few other strategies, with or without mapprojected images, are as follows. If running on multiple machines, ensure the ``--nodes-list`` option is used (:numref:`pbs_slurm`). With the default block-matching algorithm, ``--stereo-algorithm asp_bm``, the option ``--corr-timeout integer`` can be used to limit how long each 1024 |times| 1024 pixel tile can take. A good value here could be 300 (seconds) or more if your terrain is expected to have large height variations. With the ``asp_sgm`` or ``asp_mgm`` algorithms, set a value for ``--corr-memory-limit-mb`` (:numref:`asp_sgm`) for the number of megabytes of memory to use for each correlation process. This needs to take into account how much memory is available and how many processes are running in parallel per node. To remove outliers one can tighten ``--outlier-removal-params`` (:numref:`stereodefault`), or mapproject the images (:numref:`mapproj-example`). A smaller manual search range can be specified (:numref:`search_range2`). In particular, with mapprojected images, the option ``--max-disp-spread`` can be very useful (:numref:`corr_section`). If a run failed partially during correlation, it can be resumed with the ``parallel_stereo`` option ``--resume-at-corr`` (:numref:`parallel_stereo`). A ran can be started at the triangulation stage after making changes to the cameras while reusing a previous run with the option ``--prev-run-prefix``. If a run failed due to running out of memory with ``asp_mgm``/``asp_sgm``, also consider lowering the value of ``--processes``. See also :numref:`handling_clouds` with considers the situation that clouds are present in the input images. The suggestions there may apply in other contexts as well. On Linux, the ``parallel_stereo`` program writes in each output tile location a file of the form:: --resource-usage.txt having the elapsed time and memory usage, as output by ``/usr/bin/time``. This can guide tuning of parameters to reduce resource usage. .. _next_steps_ba: Correcting camera positions and orientations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``bundle_adjust`` program (:numref:`bundle_adjust`) can be used to adjust the camera positions and orientations before running stereo. These adjustments makes the cameras self-consistent, but not consistent with the ground. A stereo terrain created with bundle-adjusted cameras can be aligned to an existing reference using ``pc_align`` (:numref:`pc-align-example`). The same alignment transform can be applied to the bundle-adjusted cameras (:numref:`ba_pc_align`). .. _pc-align-example: Alignment to point clouds from a different source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Often the 3D terrain models output by ``parallel_stereo`` (point clouds and DEMs) can be intrinsically quite accurate yet their actual position on the planet may be off by several meters or several kilometers, depending on the spacecraft. This can result from small errors in the position and orientation of the satellite cameras taking the pictures. Such errors can be corrected in advance using bundle adjustment, as described in the previous section. That requires using ground control points, that may not be easy to collect. Alternatively, the images and cameras can be used as they are, and the absolute position of the output point clouds can be corrected in post-processing. For that, ASP provides a tool named ``pc_align`` (:numref:`pc_align`). This program aligns a 3D terrain to a much more accurately positioned (if potentially sparser) dataset. Such datasets can be made up of GPS measurements (in the case of Earth), or from laser altimetry instruments on satellites, such as ICESat/GLASS for Earth, LRO/LOLA on the Moon, and MGS/MOLA on Mars. Under the hood, ``pc_align`` uses the Iterative Closest Point algorithm (ICP) (both the point-to-plane and point-to-point flavors are supported, and with point-to-point ICP it is also possible to solve for a scale change). The ``pc_align`` tool requires another input, an a priori guess for the maximum displacement we expect to see as result of alignment, i.e., by how much the points are allowed to move when the alignment transform is applied. If not known, a large (but not unreasonably so) number can be specified. It is used to remove most of the points in the source (movable) point cloud which have no chance of having a corresponding point in the reference (fixed) point cloud. .. figure:: images/examples/align_compare_500px.png :alt: pc_align results :name: pc-align-fig Example of using ``pc_align`` to align a DEM obtained using stereo from CTX images to a set of MOLA tracks. The MOLA points are colored by the offset error initially (left) and after pc align was applied (right) to the terrain model. The red dots indicate more than 100 m of error and blue less than 5 m. The ``pc_align`` algorithm determined that by moving the terrain model approximately 40 m south, 70 m west, and 175 m vertically, goodness of fit between MOLA and the CTX model was increased substantially. Here is an example. Recall that the denser *reference* cloud is specified first, the sparser *source* cloud to be aligned is specified second, and that this program is very sensitive to the value of ``--max-displacement`` (:numref:`pc_align_max_displacement`):: pc_align --max-displacement 200 \ --datum MOLA \ --save-transformed-source-points \ --save-inv-transformed-reference-points \ --csv-format '1:lon 2:lat 3:radius_m' \ stereo-PC.tif mola.csv \ -o align/run The cloud ``mola.csv`` will be transformed to the coordinate system of ``stereo-PC.tif`` and saved as ``run/run-trans_source.csv``. The cloud ``stereo-PC.tif`` will be transformed to to the coordinate system of ``mola.csv`` and saved as ``align/run-trans_reference.tif``. It can then be gridded with ``point2dem`` (:numref:`point2dem`) and compared to ``mola.csv`` using ``geodiff`` (:numref:`geodiff`). Validation and error metrics are discussed in :numref:`pc_align_validation` and :numref:`pc_align_error`. It is important to note here that there are two widely used Mars datums, and if your CSV file has, unlike above, the heights relative to a datum, the correct datum name must be specified via ``--datum``. :numref:`molacmp` talks in more detail about the Mars datums. See an illustration in :numref:`pc-align-fig`. An alignment transform can be applied to cameras models (:numref:`ba_pc_align`). The complete documentation for this program is in :numref:`pc_align`. Validation of alignment ~~~~~~~~~~~~~~~~~~~~~~~ The ``pc_align`` program saves some error report files in the output directory (:numref:`pc_align_error`). The produced aligned cloud can be compared to the cloud it was aligned to. :numref:`pc_align_validation` has more details on this, including how to use the ``geodiff`` program (:numref:`geodiff`) to take the difference between clouds, which can then be colorized. Alignment and orthoimages ~~~~~~~~~~~~~~~~~~~~~~~~~ After ASP has created a DEM, and the left and right images are mapprojected to it, they are often shifted in respect to each other. That is due to the errors in camera positions. To rectify this, one has to run ``bundle_adjust`` (:numref:`bundle_adjust`) first, then rerun stereo, DEM creation, followed by mapprojection onto the new DEM. For each of these, the bundle-adjusted cameras must be passed in via ``--bundle-adjust-prefix``. Note that this approach will create self-consistent outputs, but which are not necessarily aligned with pre-existing ground truth. That can be accomplished as follows. First, need to align the DEM to the ground truth with ``pc_align`` (:numref:`pc_align`). Then, invoke ``bundle_adjust`` on the two input images and cameras, while passing to it the transform obtained from ``pc_align`` via the ``--initial-transform`` option. This will move the cameras to be consistent with the ground truth. Then one can mapproject with the updated cameras. This approach is described in detail in :numref:`ba_pc_align`. If the alignment is applied not to a DEM, but to the triangulated point cloud produced by stereo, one can use ``point2dem`` with the ``--orthoimage`` option, with the point cloud after alignment and the ``L`` image before alignment. See :numref:`point2dem` for the description of this option and an example. If the alignment was done with the DEM produced from a triangulated point cloud, it can be applied with ``pc_align`` to the point cloud and then continue as above. .. _manipulating_results: Manipulating the results ------------------------ When ``parallel_stereo`` finishes, it will have produced a point cloud image, with a name like ``results/output-PC.tif`` (:numref:`outputfiles`), which can be used to create many kinds of data products, such as DEMs and orthoimages (:numref:`point2dem`), textured meshes (:numref:`point2mesh`), LAS files (:numref:`point2las`), colormaps (:numref:`colormap`), hillshaded images (:numref:`genhillshade`), etc. Produced DEMs can also be mosaicked (:numref:`dem_mosaic`), subtracted from other DEMs or CSV files (:numref:`geodiff`), aligned to a reference (:numref:`pc-align-example`), etc. .. _p19-osg: .. figure:: images/p19-osg_400px.png :alt: A visualization of a mesh. A visualization of a mesh. Building a 3D mesh model ~~~~~~~~~~~~~~~~~~~~~~~~ The ``point2mesh`` command (:numref:`point2mesh`) can create a 3D textured mesh in the plain text ``.obj`` format that can be opened in a mesh viewer such as MeshLab. The ``point2mesh`` program takes the point cloud file and the left normalized image as inputs:: point2mesh --center results/output-PC.tif results/output-L.tif The option ``--center`` shifts the points towards the origin, as otherwise the mesh may have rendering artifacts because of the large values of the vertices. Each mesh will have its own shift, however, so this option will result in meshes that are not aligned with each other. An example visualization is shown in :numref:`p19-osg`. If you already have a DEM and an ortho image (:numref:`builddem`), they can be used to build a mesh as well, in the same way as done above:: point2mesh --center results/output-DEM.tif results/output-DRG.tif .. _builddem: Building a digital elevation model and ortho image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Running the ``point2dem`` program (:numref:`point2dem`):: point2dem --auto-proj-center results/output-PC.tif will creates a Digital Elevation Model (DEM) named ``results/output-DEM.tif``. The default projection will be in units of meters. See :numref:`point2dem_proj` for how to set a projection or how auto-guessing it works. The planetary body is usually auto-guessed as well, or can be set explicitly with the an option such as ``-r mars``. The DEM can be transformed into a hill-shaded image for visualization (:numref:`genhillshade`). The DEM can be examined in ``stereo_gui``, as:: stereo_gui --hillshade results/output-DEM.tif The ``point2dem`` program can also be used to orthoproject raw satellite images onto the DEM. To do this, invoke ``point2dem`` just as before, but add the ``--orthoimage`` option and specify the use of the left image file as the texture file to use for the projection:: point2dem --auto-proj-center \ results/output-PC.tif \ --orthoimage results/output-L.tif The texture file ``L.tif`` must always be specified after the point cloud file ``PC.tif`` in this command. This produces ``results/output-DRG.tif``, which can be visualized in ``stereo_gui``. See :numref:`p19-norm_ortho` on the right for the output image. To fill in any holes in the obtained orthoimage, one can invoke it with a larger value of the grid size (the ``--tr`` option) and/or with a variation of the options:: --no-dem --orthoimage-hole-fill-len 100 --search-radius-factor 2 The ``point2dem`` program is also able to accept output projection options the same way as the tools in GDAL. Well-known EPSG, IAU2000 projections, and custom PROJ or WKT strings can applied with the target spatial reference set flag, ``--t_srs``. If the target spatial reference flag is applied with any of the reference spheroid options, the reference spheroid option will overwrite the datum defined in the target spatial reference set. The following two examples produce the same output. However, the last one will also show correctly the name of the datum in the geoheader, not just the values of its axes. :: point2dem --t_srs "+proj=longlat +a=3396190 +b=3376200" \ results/output-PC.tif point2dem --t_srs \ 'GEOGCS["Geographic Coordinate System", DATUM["D_Mars_2000", SPHEROID["Mars_2000_IAU_IAG",3396190,169.894447223611]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]' \ results/output-PC.tif The ``point2dem`` program can be used in many different ways. The complete documentation is in :numref:`point2dem`. .. _p19-norm_ortho: .. figure:: images/p19-norm_ortho_500px.png :alt: Normalized DEM and orthoimage. The image on the left is a normalized DEM (generated using the ``point2dem`` option ``-n``), which shows low terrain values as black and high terrain values as white. The image on the right is the left input image projected onto the DEM (created using the ``--orthoimage`` option to ``point2dem``). Orthorectification of an image from a different source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you have already obtained a DEM, using ASP or some other approach, and have an image and camera pair which you would like to overlay on top of this terrain, use the ``mapproject`` tool (:numref:`mapproject`). .. _geoid_adj: Creating DEMs relative to the geoid/areoid ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The DEMs generated using ``point2dem`` are in reference to a datum ellipsoid. If desired, the ``dem_geoid`` (:numref:`dem_geoid`) program can be used to convert this DEM to be relative to a geoid/areoid on Earth/Mars respectively. Example usage:: dem_geoid results/output-DEM.tif .. _gen_las: Converting to the LAS format ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If it is desired to use the ``parallel_stereo`` generated point cloud outside of ASP, it can be converted to the LAS file format, which is a public file format for the interchange of 3-dimensional point cloud data. The tool ``point2las`` can be used for that purpose (:numref:`point2las`). Example usage:: point2las --compressed -r Earth results/output-PC.tif .. _genhillshade: Generating color hillshade maps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Once you have generated a DEM file, you can use the ``colormap`` (:numref:`colormap`) and ``hillshade`` (:numref:`hillshade`) programs to create colorized and/or shaded relief images. To create a colorized version of the DEM, you need only specify the DEM file to use. The colormap is applied to the full range of the DEM, which is computed automatically. Alternatively you can specify your own min and max range for the color map. :: colormap results/output-DEM.tif -o colorized.tif See :numref:`colormap` for available colormap styles and illustrations for how they appear. To create a hillshade of the DEM, specify the DEM file to use. You can control the azimuth and elevation of the light source using the ``-a`` and ``-e`` options. :: hillshade results/output-DEM.tif -o shaded.tif -e 25 -a 300 To create a colorized version of the shaded relief file, specify the DEM and the shaded relief file that should be used:: colormap results/output-DEM.tif -s shaded.tif -o color-shaded.tif This program can also create the hillshaded file first, and then apply it, if invoked with the option ``--hillshade``. See :numref:`hrad-color` showing the images obtained with these commands. .. _hrad-color: .. figure:: images/p19-colorized-shaded_500px.png The colorized DEM, the shaded relief image, and the colorized hillshade. .. _cog_output: Cloud-Optimized GeoTIFF ~~~~~~~~~~~~~~~~~~~~~~~ ASP supports writing cloud-optimized GeoTIFFs (COG) with the ``--cog`` option for :ref:`point2dem`, :ref:`mapproject`, :ref:`image_mosaic`, :ref:`dem_mosaic`, :ref:`geodiff`, :ref:`image_calc`, :ref:`hillshade`, and :ref:`colormap`. This creates files with 512 x 512 tiles, internal overviews (pyramids), and optimized compression for efficient streaming from cloud storage. Use ``gdalinfo`` (:numref:`gdal_tools`) to check if an output file is a COG. .. _visualizing_results: Visualizing the results ----------------------- The ``stereo_gui`` program (:numref:`stereo_gui`) is a very versatile viewer that can overlay hillshaded DEMs, orthoimages, interest point matches, ASP's report files in CSV format, polygons, etc. .. _asp_plot: Diagnostic plots and reports with asp_plot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `asp_plot `__ Python package can be used to generate diagnostic plots and comprehensive PDF reports from ASP outputs. It provides visualization of stereo DEMs (hillshades, colormaps, difference maps), bundle adjustment residuals, interest point matches, map-projected image overlays, CSM camera model comparisons, and stereo geometry. For Earth-based datasets, it also supports comparison against ICESat-2 altimetry data via `SlideRule `_. The ``asp_plot`` package supports processing outputs from many sensors, including WorldView, LRO NAC, etc. (:numref:`examples`). ``asp_plot`` is available via ``conda`` and ``pip``:: conda install -c conda-forge asp_plot or:: pip install asp_plot For full documentation, including installation, CLI usage, example notebooks, and example reports, see the `asp_plot documentation `__. .. _google_earth_overlays: Building overlays for Moon and Mars mode in Google Earth ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sometimes it may be convenient to see how the DEMs and orthoimages generated by ASP look on top of existing images in Google Earth. ASP provides a tool named ``image2qtree`` for that purpose. It creates multi-resolution image tiles and a metadata tree in KML format that can be loaded into Google Earth from your local hard drive or streamed from a remote server over the Internet. The ``image2qtree`` program can only be used on 8-bit image files with georeferencing information (e.g. grayscale or RGB GeoTIFF images). In this example, it can be used to process | ``results/output-DEM-normalized.tif``, ``results/output-DRG.tif``, ``shaded.tif``, | ``colorized.tif``, and ``shaded-colorized.tif``. These images were generated respectively by using ``point2dem`` with the ``-n`` option creating a normalized DEM, the ``--orthoimage`` option to ``point2dem`` which projects the left image onto the DEM, and the images created earlier with ``colormap``. Here's an example of how to invoke this program:: image2qtree shaded-colorized.tif -m kml --draw-order 100 :numref:`hrad-kml` shows the obtained KML files in Google Earth. The complete documentation is in :numref:`image2qtree`. .. _hrad-kml: .. figure:: images/p19-googlemars_500px.png The colorized hillshade DEM as a KML overlay. Using DERT to visualize terrain models ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The open source Desktop Exploration of Remote Terrain (DERT) software tool can be used to explore large digital terrain models, like those created by the Ames Stereo Pipeline. For more information, visit https://github.com/nasa/DERT. .. _blender: Using Blender to visualize meshes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The :ref:`point2mesh` program will create ``.obj`` and ``.mtl`` files that you can import directly into Blender (https://www.blender.org/). Remember that ``.obj`` files don't particularly have a way to specify 'units' but the 'units' of an ``.obj`` file written out by ASP are going to be 'meters.' If you open a large .obj model created by ASP (like HiRISE), you'll need to remember to move the default viewpoint away from the origin, and extend the clipping distance to a few thousand (which will be a few kilometers), otherwise it may 'appear' that the model hasn't loaded (because your viewpoint is inside of it, and you can't see far enough). The default step size for :ref:`point2mesh` is 10, which only samples every 10th point, so you may want to read the documentation which talks more about the ``-s`` argument to :ref:`point2mesh`. Depending on how big your model is, even that might be too small, and I'd be very cautious about using ``-s 1`` on a HiRISE model that isn't cropped somehow first. You can also use :ref:`point2mesh` to pull off this trick with terrain models you've already made (maybe with SOCET or something else). Our :ref:`point2mesh` program certainly knows how to read our ASP ``*-PC.tif`` files, but it can also read GeoTIFFs. So if you have a DEM as a GeoTIFF, or an ISIS cube which is a terrain model (you can use ``gdal_translate`` to convert them to GeoTIFFs), then you can run :ref:`point2mesh` on them to get ``.obj`` and ``.mtl`` files. .. _meshlab: Using MeshLab to visualize meshes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MeshLab is another program that can view meshes in ``.obj`` files. It can be downloaded from:: https://github.com/cnr-isti-vclab/meshlab/releases and can be installed and run in user's directory without needing administrative privileges. Using QGIS to visualize terrain models ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The free and open source geographic information system QGIS (https://qgis.org) as of version 3.0 has a 3D Map View feature that can be used to easily visualize perspective views of terrain models. After you use :ref:`point2dem` to create a terrain model (the ``*-DEM.tif`` file), or both the terrain model and an ortho image via ``--orthoimage`` (the ``*-DRG.tif`` file), those files can be loaded as raster data files, and the 'New 3D Map View' under the View menu will create a new window, and by clicking on the wrench icon, you can set the DEM file as the terrain source, and are able to move around a perspective view of your terrain. .. _existing_terrain: Use of existing terrain data ---------------------------- ASP's tools can incorporate prior ground data, such as DEMs, lidar point clouds, or GCP files (:numref:`bagcp`). ASP assumes such data is well-aligned with the input images and cameras. To perform such alignment, one may first run bundle adjustment (:numref:`bundle_adjust`), followed by stereo (:numref:`parallel_stereo`), DEM creation (:numref:`point2dem`), alignment of DEM to existing terrain (:numref:`pc-align-example`), and then the aligment can be applied to the bundle-adjusted cameras (:numref:`ba_pc_align`). Any input terrain is assumed to be relative to a datum ellipsoid, otherwise it should be converted with ``dem_geoid`` (:numref:`conv_to_ellipsoid`). This applies, in particular, to OpenTopography DEMs (:numref:`initial_terrain`). These are the various approaches of integrating well-aligned prior terrain data. - Bundle adjustment can be performed with a terrain constraint. If the terrain is a DEM, use the ``--heights-from-dem`` option (:numref:`heights_from_dem`). This also works for a rather dense point cloud in various formats, after gridding it with ``point2dem``. - The ``jitter_solve`` program (:numref:`jitter_solve`) can be called in the same way with the option ``--heights-from-dem``. - For sparse point clouds or DEM data, the ``bundle_adjust`` option named ``--reference-terrain`` can be invoked (:numref:`reference_terrain`). This one is harder to use as it takes as input stereo disparities. - The ``jitter_solve`` program also has the option ``--reference-terrain``. This one is easier to use than the analogous ``bundle_adjust`` option, as the unaligning of the disparity is done for the user on the fly (:numref:`jitter_ref_terrain`). - Low-resolution stereo disparity can be initialized from a DEM, with the option ``--corr-seed-mode 2`` (:numref:`d_sub_dem`). - Stereo can be run with mapprojected images. The DEM for mapprojection can be external, or from a previous stereo run (:numref:`mapproj-example`). - GCP files (:numref:`bagcp`) can be incorporated into bundle adjustment and jitter solving. These can also be used for aligment with ``pc_align`` (as the *source* cloud). - Given a prior DEM and an ASP-produced DEM, ASP can create dense correspondences between hillshaded versions of these, that can be passed to the ``dem2gcp`` program (:numref:`dem2gcp`) to produce dense GCP. This can help correct warping in the ASP-produced DEM, by either solving for lens distortion or jitter. .. _multiview: Multi-view stereo ~~~~~~~~~~~~~~~~~ ASP supports multi-view stereo at the triangulation stage. This mode is *discouraged*. See instead :numref:`sfm_multiview` for an approach based on pairwise stereo. If using this multiview stereo mode (not suggested), the first image is set as reference, disparities are computed from it to all the other images, and then joint triangulation is performed :cite:`slabaugh2001optimal`. A single point cloud is generated with one 3D point for each pixel in the first image. The inputs to multi-view stereo and its output point cloud are handled in the same way as for two-view stereo (e.g., inputs can be mapprojected, the output can be converted to a DEM, etc.). It is suggested that images be bundle-adjusted (:numref:`baasp`) before running multi-view stereo. Example (for ISIS with three images):: parallel_stereo file1.cub file2.cub file3.cub results/run Example (for DigitalGlobe/Maxar data with three mapprojected images):: parallel_stereo file1.tif file2.tif file3.tif \ file1.xml file2.xml file3.xml \ results/run input-DEM.tif For a sequence of images, multi-view stereo can be run several times with each image as a reference, and the obtained point clouds combined into a single DEM using ``point2dem`` (:numref:`point2dem`). The ray intersection error, the fourth band in the point cloud file, is computed as twice the mean of distances from the optimally computed intersection point to the individual rays. For two rays, this agrees with the intersection error for two-view stereo which is defined as the minimal distance between rays. For multi-view stereo this error is much less amenable to interpretation than for two-view stereo, since the number of valid rays corresponding to a given feature can vary across the image, which results in discontinuities in the intersection error. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/outputfiles.rst ================================================ .. _outputfiles: Guide to output files ===================== The ``parallel_stereo`` program (:numref:`parallel_stereo`) generates a variety of intermediate files that are useful for debugging. These are listed below, along with brief descriptions about the contents of each file. Some of these files are stored at the location given by the specified output prefix, while others are in subdirectories of that location corresponding to individual tiles created by ``parallel_stereo``. The files are listed based on the stereo stage they are created at (:numref:`parallel_stereo`). Files created in preprocessing ------------------------------ \*-cropped\*.tif Cropped versions of the input images, before alignment, when options ``--left-image-crop-win`` and/or ``--right-image-crop-win`` are used. \*.vwip Interest point matches per image, before matching. If the images are ``left.cub`` and ``right.cub``, these files end in ``left.vwip`` and ``right.vwip``. Several interest point detection modes are available (see ``--ip-detect-method`` in :numref:`stereodefault`). The ``.vwip`` files can be visualized in ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`). \*.match - image-to-image interest point matches (tie-points) The match file lists a select group of unique points out of the previous ``.vwip`` files that have been identified and matched in a pair of images. For example, if the input images are ``left.cub`` and ``right.cub``, the match file will end in ``left__right.match``. The ``.vwip`` and ``.match`` files are meant to serve as cached tie-point information, and they help speed up the pre-processing phase of the Stereo Pipeline. If these files exist, then the ``parallel_stereo`` program will skip over the interest point alignment stage and instead use the cached tie-points contained in the ``*.match`` files, unless the images or cameras are newer, or if invoked with the options ``--left-image-crop-win`` or ``--right-image-crop-win``. In the rare case that these files get corrupted, they should be deleted and ``parallel_stereo`` should be rerun. The ``.match`` files can be visualized in ``stereo_gui`` (:numref:`stereo_gui_view_ip`), and can be converted to plain text for inspection with ``parse_match_file.py`` (:numref:`parse_match_file`). This program supports plain-text match files (:numref:`txt_match`). \*-L.tif - rectified left input image Left input image of the stereo pair, after the pre-processing step, which may involve cropping, normalization of pixel values, and alignment. \*-R.tif - rectified right input image Right input image of the stereo pair, after the pre-processing step, which may involve cropping, normalization of pixel values, and alignment. \*-lMask.tif - mask for left rectified image This file and \*-rMask.tif contain binary masks for the input images. They are used throughout the stereo process to mask out pixels where there is no input data. \*-rMask.tif - mask for right rectified image See \*-lMask.tif, above. \*-align-L.txt and R.txt - left and right alignment matrices These 3 |times| 3 affine transformation matrices that are used to warp the left and right images to roughly align them. These are only generated if ``alignment-method`` is not ``none`` or ``epipolar`` (:numref:`stereodefault`). The older .exr format for these is still supported on reading but will be removed in the future. \*bathy_mask\*.tif - data related to water-land masks, for stereo with shallow water (:numref:`bathy_intro`). \*-L_sub.tif, \*-R_sub.tif, \*-lMask_sub.tif, \*-rMask_sub.tif are low-resolution versions of the aligned left and right input images and corresponding masks. \*-stereo.default - backup of the Stereo Pipeline settings file This is a copy of the ``stereo.default`` file used by ``parallel_stereo``. It is stored alongside the output products as a record of the settings that were used for this particular stereo processing task. .. _out_corr_files: Files created during correlation -------------------------------- \*-D_sub.tif - Low-resolution initial disparity (:numref:`d_sub`). Computed at the correlation stage. Not recomputed when a run is resumed. The options ``--corr-seed-mode 2`` and ``3`` also produce \*-D_sub_spread.tif, which has the spread of this disparity. It is in the same format as ``D.tif`` (below). \*-D.tif - Full-resolution disparity map produced from the low-resolution disparity The disparity shows the amount of horizontal and vertical shift between left and right images, in units of pixel (:numref:`stereo_corr`). The ``D.tif`` file contains a preliminary disparity that is used to seed the subsequent sub-pixel correlation. It is largely unfiltered, and may contain some bad matches. Disparity map files are stored in TIF format as 3-channel, 32-bit floating point images. Channel 0 = horizontal disparity, channel 1 = vertical disparity, and channel 2 = good pixel mask. The ``disparitydebug`` program (:numref:`disparitydebug`) can help inspect scaled versions of these. Or the raw bands can be extracted and visualized as in :numref:`mask_disparity`. \*-L-R-disp-diff.tif - the discrepancy between left-to-right and right-to-left disparities. See option ``--save-left-right-disparity-difference`` in :numref:`stereodefault` for more details. \*-PC_sub.tif - triangulated point cloud image. Made from the low-resolution disparity ``D_sub.tif`` (created after filtering this disparity; will be written unless disparity filtering is disabled, see ``outlier-removal-params``). Files created during blending ----------------------------- \*-B.tif - disparity map blending the D.tif results from all tiles. Will be produced unless using the ``asp_bm`` stereo algorithm without local epipolar alignment. It is in the same format as ``D.tif`` (above). Files created during refinement ------------------------------- \*-RD.tif - disparity map after sub-pixel correlation This file contains the disparity map after sub-pixel refinement. Pixel values now have sub-pixel precision, and some outliers have been rejected by the sub-pixel matching process. It is in the same format as ``D.tif`` (above). File created during filtering ----------------------------- \*-F-corrected.tif - intermediate data product Only created when ``alignment-method`` is not ``none``. This is ``*-F.tif`` with effects of interest point alignment removed. \*-F.tif - filtered disparity map The filtered, sub-pixel disparity map with outliers removed (and holes filled with the inpainting algorithm if ``FILL_HOLES`` is on). This is the final version of the disparity map. It is in the same format as ``D.tif`` (above). \*-GoodPixelMap.tif - map of good pixels. An image showing which pixels were matched by the stereo correlator (gray pixels), and which were filled in by the hole filling algorithm (red pixels). .. _triangulation_files: Files created at triangulation ------------------------------ \*-PC.tif - point cloud image The point cloud image is generated by the triangulation phase of Stereo Pipeline. Each pixel in the point cloud image corresponds to a pixel in the left input image (\*-L.tif). The point cloud has four channels, the first three are the Cartesian coordinates of each point, and the last one has the intersection error of the two rays which created that point (:numref:`triangulation_error`). By default, the origin of the Cartesian coordinate system being used is a point in the neighborhood of the point cloud. This makes the values of the points in the cloud relatively small, and we save them in single precision (32 bits). This origin is saved in the point cloud as well using the tag ``POINT_OFFSET`` in the GeoTiff header. To output point clouds using double precision with the origin at the planet center (ECEF), call ``stereo_tri`` with the option ``--save-double-precision-point-cloud``. This can effectively double the size of the point cloud. If the option ``--compute-error-vector`` (:numref:`triangulation_options`) or ``--propagate-errors`` (:numref:`error_propagation`) is set, the point cloud will have 6 channels. The first 3 channels store, as before, the triangulated points. \*-PC-center.txt - the point cloud local origin (add this to cloud points to convert them to ECEF). Stored in plain text. Has the same information as the ``POINT_OFFSET`` header in ``PC.tif``. .. _stereo_diag: Diagnostics files ----------------- \*-stereo-status.txt - processing status file As ``parallel_stereo`` runs, it updates this file. It records the current processing step (:numref:`entrypoints`), the number of done tiles, and the total number of tiles (both for the current step). See :numref:`ps_tiling` for more details on tiling. For the preprocessing and filtering stages tiling is not done. Then, the number of tiles is set to 1, and the number of done tiles is 0 if this stage is in progress, and 1 if it is done. The status is also printed to standard output as each tile gets done (unless there is only one tile). \*-tiles.shp - shapefile having the tiles This file saves the tiles used in processing (:numref:`ps_tiling`). Each is shown as a rectangle (the units are described below). This file is produced only by ``parallel_stereo``, and not by ``stereo``. The padding of each tile (for ``asp_mgm`` for example) is not included. A file named ``*-tiles.qml`` is also created. With this one present, when the shapefile is opened in QGIS, the tile index (an integer starting with zero) will be printed inside each tile. The ``stereo_gui`` program (:numref:`plot_poly`) can also read and display this shapefile and the indices. Note that the actual tile list is saved in ``*-dirList.txt``. When the images are mapprojected, the shapefile is saved in the projection of the ``L.tif`` image and can be overlaid on top ``L.tif`` and ``R.tif`` in QGIS and ``stereo_gui``. Otherwise the shapefile is in pixel units. The y coordinate is then written with the negative sign, so that the shapefile appears correctly on top of ``L.tif`` and ``R.tif`` in QGIS and ``stereo_gui``. .. _out_log_files: Other files created at all stages --------------------------------- \*-log* - log files Each program invoked by ``parallel_stereo`` writes a log file containing the command name, build information, and various messages output by that program. Those are saved to the output prefix location, or to tile subdirectories, depending on the stage of processing. The tiles are deleted after a successful run, which makes the log files in subdirectories go away. See the ``--keep-only`` option (:numref:`ps_options`) for how to keep all data, including the log files. \*--resource-usage.txt - resource usage files For Linux, write such a file for each ``parallel_stereo`` subprocess. It contains the elapsed time and memory usage, as output by ``/usr/bin/time``. These are written to tile subdirectories, and are deleted after a successful run. See the ``--keep-only`` option for how to keep all files. Inspection and properties of the output files --------------------------------------------- All the output images that are single-band can be visualized in ``stereo_gui`` (:numref:`stereo_gui`). The disparities can be first split into the individual horizontal and vertical disparity files using ``disparitydebug`` (:numref:`disparitydebug`), then they can be seen in this viewer as well. If the input images are map-projected (georeferenced) and the alignment method is ``none``, all the output images listed above, will also be georeferenced, and hence can be overlaid in ``stereo_gui`` on top of the input images (the outputs of ``disparitydebug`` will then be georeferenced as well). The point cloud file saves the datum (and projection if available) inferred from the input images, regardless of whether these images are map-projected or not. The ``point2mesh`` (:numref:`point2mesh`) and ``point2dem`` (:numref:`point2dem`) programs can be used to convert the point cloud to formats that are easier to visualize. .. _txt_match: Plain text match files ---------------------- ASP programs store interest point matches between two images as a match file, in either binary format with a ``.match`` extension, or in plain text format, with a ``.txt`` extension. The latter is supported as of build 2026/02 (:numref:`release`). Plain text matches are provided for use with external logic for interest point matching. The next sections describe how to use such files and their format. When there are multiple images, one may use pairwise match files or a control network format. See :numref:`control_network`. Turn on plain text matches ~~~~~~~~~~~~~~~~~~~~~~~~~~ By default, ASP programs work with binary match files. The switch ``--matches-as-txt`` will enable reading and writing plain text match files instead. In that case, all existing ``.match`` files will be ignored. This applies to :ref:`bundle_adjust`, :ref:`parallel_stereo`, :ref:`jitter_solve`, :ref:`image_align`, :ref:`gcp_gen`, and :ref:`ipmatch`. Conversions between these formats can be done with ``ipmatch`` (:numref:`ipmatch_convert`). Do not use the ``parse_match_file.py`` (:numref:`parse_match_file`) program as that one has a different purpose. Naming convention ~~~~~~~~~~~~~~~~~ Given two images ``input/image1.tif`` and ``input/image2.tif``, and given an output prefix such as ``out/run``, the plain-text match file name will be:: out/run-image1__image2.txt Binary match files will have the same format but will end in ``.match``. The ``bundle_adjust`` program needs to be invoked with the input images and:: --match-files-prefix out/run to read the above file. The same option is also available for ``parallel_stereo`` and ``jitter_solve``. Individual image names (without the path and extension) will be truncated to 60 characters to avoid excessively long file names and problems with some libraries. It is suggested to avoid using such long file names in the first place. .. _txt_format: File format ~~~~~~~~~~~ Each line in a plain-text match file will have six numbers, in float precision, separated by spaces:: x1 y1 unc1 x2 y2 unc2 Here, ``x1 y1`` are the coordinates of an interest point in the first image (column and row, starting from 0), ``unc1`` is its uncertainty (in pixels), and ``x2 y2 unc2`` are the corresponding values for the second image. In bundle adjustment each pixel is weighted by the inverse of its uncertainty. The uncertainties must be positive. Note that this is not the same format as in ``parse_match_file.py`` (:numref:`parse_match_file`). Inspection ~~~~~~~~~~ To view plain text match files use ``stereo_gui`` (:numref:`stereo_gui_view_ip`) as:: stereo_gui \ --matches-as-txt \ image1.tif image2.tif \ --match-file out/run-image1__image2.txt .. _poly_files: Format of polygon files ----------------------- The ``stereo_gui`` program can read and write polygons in the shapefile format, and also in in plain text with a ``.txt`` or ``.csv`` extension (:numref:`plot_poly`). Here the plain text format is described. The x and y coordinates are stored as columns side-by side. Individual polygons are separated by an empty line. A color for the polygons is specified as a line of the form: ``color = red``. The given color applies to all polygons on subsequent lines until overridden by another such statement. How to create and save such files is shown in :numref:`plot_poly`. When such polygons are saved, a header will be added to the file, consisting of lines starting with the pound sign, containing the WKT string for the georeference, the value of ``--csv-format`` to interpret the vertices, and the style (usually set to ``poly``). This allows for overlaying polygons with different georeferences in ``stereo_gui``. The plain text polygon file supports text labels. They should be on lines that start with the text ``anno`` (annotation), followed by a space, then the x and y coordinates, separated by spaces, then the text label. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/papersusingasp.bib ================================================ @article{2014NatCo...5E3417L, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2014NatCo...5E3417L}, Author = {{Lucas}, A. and {Mangeney}, A. and {Ampuero}, J.~P.}, Date-Added = {2014-03-25 00:01:22 +0000}, Date-Modified = {2014-03-25 00:01:22 +0000}, Eid = {3417}, Journal = {Nature Communications}, Month = mar, Title = {{Frictional velocity-weakening in landslides on Earth and on other planetary bodies}}, Volume = 5, Year = 2014, Bdsk-Url-1 = {http://dx.doi.org/10.1038/ncomms4417} } @inproceedings{2014LPI....45.1211H, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2014LPI....45.1211H}, Author = {{Hughes}, A.~C.~G. and {Hauber}, E. and {Rossi}, A.~P.}, Booktitle = {Lunar and Planetary Science Conference 45}, Date-Added = {2014-03-24 23:57:03 +0000}, Date-Modified = {2014-03-24 23:57:20 +0000}, Month = mar, Number = {\#1211}, Series = {Lunar and Planetary Institute Science Conference Abstracts}, Title = {{Geomorphology of Glacial and Periglacial Landforms Within a Small Crater in Terra Cimmeria, Mars: Stratigraphy and Inferred Chronology of Processes}}, Volume = 45, Year = 2014} @inproceedings{2014LPI....45.1723L, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2014LPI....45.1723L}, Author = {{Lucchetti}, A. and {Thomas}, R. and {Cremonese}, G. and {Massironi}, M. and {Rothery}, D.~A. and {Conway}, S.~J. and {Anand}, M.}, Booktitle = {Lunar and Planetary Science Conference 45}, Date-Added = {2014-03-24 23:52:55 +0000}, Date-Modified = {2014-03-24 23:53:18 +0000}, Month = mar, Number = {\#1723}, Series = {Lunar and Planetary Institute Science Conference Abstracts}, Title = {{Analysis and Numerical Modeling of a Pit Crater on Mercury}}, Volume = 45, Year = 2014} @inproceedings{2014LPI....45.2836W, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2014LPI....45.2836W}, Author = {{Watters}, W.~A. and {Radford}, A.~C.}, Booktitle = {Lunar and Planetary Science 45}, Date-Added = {2014-03-24 23:46:59 +0000}, Date-Modified = {2014-03-24 23:47:39 +0000}, Month = mar, Number = {\#2836}, Series = {Lunar and Planetary Institute Science Conference Abstracts}, Title = {{3-D Morphometry of Martian Secondary Impact Craters from Zunil and Gratteri}}, Volume = 45, Year = 2014} @inproceedings{2013LPI....44.3081W, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2013LPI....44.3081W}, Author = {{Watters}, W.~A. and {Geiger}, L. and {Fendrock}, M.}, Booktitle = {Lunar and Planetary Science Conference 44}, Date-Added = {2014-03-24 23:45:48 +0000}, Date-Modified = {2014-03-24 23:46:59 +0000}, Month = mar, Number = {\#3081}, Series = {Lunar and Planetary Institute Science Conference Abstracts}, Title = {{Shape Distribution of Fresh Martian Impact Craters from High-Resolution DEMs}}, Volume = 44, Year = 2013} @inproceedings{2010LPI....41.1863W, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2010LPI....41.1863W}, Author = {{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}}, Booktitle = {Lunar and Planetary Science Conference 41}, Date-Added = {2013-04-26 22:58:00 +0000}, Date-Modified = {2013-04-26 22:58:00 +0000}, Editor = {{Mackwell}, S. and {Stansbery}, E.}, Month = mar, Number = {\#1863}, Organization = {Lunar and Planetary Institute, Houston}, Title = {{Lunar Thrust Faults: Implications for the Thermal History of the Moon}}, Year = 2010, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2010LPI....41.1863W}} @inproceedings{2010LPI....41.2678B, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2010LPI....41.2678B}, Author = {{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}}, Booktitle = {Lunar and Planetary Science Conference 41}, Date-Added = {2013-04-26 22:56:25 +0000}, Date-Modified = {2013-04-26 22:56:25 +0000}, Editor = {{Mackwell}, S. and {Stansbery}, E.}, Month = mar, Number = {\#2678}, Organization = {Lunar and Planetary Institute, Houston}, Title = {{LROC Stereo Data--Results of Initial Analysis}}, Year = 2010, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2010LPI....41.2678B}} @article{2010AGUFM.P21B1596P, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2010AGUFM.P21B1596P}, Author = {{Phillips}, C.~B. and {Beyer}, R.~A. and {Nimmo}, F. and {Roberts}, J.~H. and {Robuchon}, G.}, Date-Added = {2013-04-26 22:54:02 +0000}, Date-Modified = {2013-04-26 22:54:02 +0000}, Journal = {AGU Fall Meeting Abstracts}, Keywords = {[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}, Month = dec, Number = {\#P21B-1596}, Title = {{Crater Relaxation and Stereo Imaging of the Icy Satellites of Jupiter and Saturn}}, Year = 2010, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2010AGUFM.P21B1596P}} @inproceedings{2011LPI....42.2267M, Author = {{Moratto}, Z. and Nefian, A. and {Kim}, T. and {Broxton}, M. and {Beyer}, R.~A. and Fong, T.}, Booktitle = {Lunar and Planetary Science Conference 42}, Date-Added = {2013-04-26 22:52:38 +0000}, Date-Modified = {2013-04-26 22:52:38 +0000}, Editor = {{Mackwell}, S. and {Stansbery}, E.}, Number = {\#2267}, Organization = {Lunar and Planetary Institute, Houston}, Title = {{Stereo Reconstruction from Apollo 15 and 16 Metric Camera}}, Year = {2011}} @inproceedings{2011LPI....42.2418L, Author = {{Lefort}, A. and {Burr}, D.~M. and {Beyer}, R.~A. and {Howard}, A.~D.}, Booktitle = {Lunar and Planetary Science Conference 42}, Date-Added = {2013-04-26 22:51:25 +0000}, Date-Modified = {2013-04-26 22:51:25 +0000}, Editor = {{Mackwell}, S. and {Stansbery}, E.}, Number = {\#2418}, Organization = {Lunar and Planetary Institute, Houston}, Title = {Topographic Post-Formation Modifications of Inverted Fluvial Features in the Western {Medusa Fossae} Formation, {Mars}}, Year = {2011}} @inproceedings{2011LPI....42.2633H, Author = {Hammond, N. P. and C. B. Phillips and G. Robuchon and {Beyer}, R.~A. and Nimmo, F. and J. Roberts}, Booktitle = {Lunar and Planetary Science Conference 42}, Date-Added = {2013-04-26 22:50:53 +0000}, Date-Modified = {2013-04-26 22:50:53 +0000}, Editor = {{Mackwell}, S. and {Stansbery}, E.}, Number = {\#2633}, Organization = {Lunar and Planetary Institute, Houston}, Title = {Crater Relaxation and Stereo Imaging of {Rhea}}, Year = {2011}} @inproceedings{2011LPI....42.2715B, Author = {{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}}, Booktitle = {Lunar and Planetary Science Conference 42}, Date-Added = {2013-04-26 22:49:58 +0000}, Date-Modified = {2013-04-26 22:49:58 +0000}, Editor = {{Mackwell}, S. and {Stansbery}, E.}, Number = {\#2715}, Organization = {Lunar and Planetary Institute, Houston}, Title = {{LROC DTM} Comparison Effort}, Year = {2011}} @article{2011AGUFM.P41F..07P, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2011AGUFM.P41F..07P}, Author = {{Phillips}, C.~B. and {Hammond}, N.~P. and {Nimmo}, F. and {robuchon}, G. and {Beyer}, R.~A. and {Roberts}, J.~H.}, Date-Added = {2013-04-26 22:48:22 +0000}, Date-Modified = {2013-04-26 22:48:22 +0000}, Journal = {AGU Fall Meeting Abstracts}, Keywords = {[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}, Month = dec, Number = {\#P41F-07}, Title = {{Crater Relaxation and Stereo Imaging of Icy Satellites}}, Year = 2011, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2011AGUFM.P41F..07P}} @article{2012JGRE..117.3007L, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2012JGRE..117.3007L}, Author = {{Lefort}, A. and {Burr}, D.~M. and {Beyer}, R.~A. and {Howard}, A.~D.}, Date-Added = {2013-04-26 22:47:19 +0000}, Date-Modified = {2013-04-26 22:47:19 +0000}, Eid = {E03007}, Journal = {Journal of Geophysical Research (Planets)}, Keywords = {Hydrology: Geomorphology: general (1625), Hydrology: Geomorphology: fluvial (1625), Planetary Sciences: Comets and Small Bodies: Surfaces, Planetary Sciences: Solar System Objects: Mars}, Month = mar, Pages = {3007}, Title = {{Inverted fluvial features in the Aeolis-Zephyria Plana, western Medusae Fossae Formation, Mars: Evidence for post-formation modification}}, Volume = 117, Year = 2012, Bdsk-Url-1 = {http://dx.doi.org/10.1029/2011JE004008}} @inproceedings{2012LPI....43.1953L, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2012LPI....43.1953L}, Author = {{Lefort}, A. and {Burr}, D.~M. and {Beyer}, R.~A. and {Howard}, A.~D.}, Booktitle = {Lunar and Planetary Science Conference 43}, Date-Added = {2013-04-26 22:46:30 +0000}, Date-Modified = {2013-04-26 22:46:30 +0000}, Eid = {1953}, Month = mar, Number = {\#1953}, Title = {{Sinuous Ridges as Tools to Investigate Post-Flow Modification in the Aeolis-Zephyria Plana, Western Medusae Fossae Formation, Mars}}, Year = 2012, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2012LPI....43.1953L}} @inproceedings{2012LPI....43.2571P, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2012LPI....43.2571P}, Author = {{Phillips}, C.~B. and {Hammond}, N.~P. and {Robuchon}, G. and {Nimmo}, F. and {Beyer}, R.~A. and {Roberts}, J.}, Booktitle = {Lunar and Planetary Science Conference 43}, Date-Added = {2013-04-26 22:45:46 +0000}, Date-Modified = {2013-04-26 22:45:46 +0000}, Eid = {2571}, Month = mar, Number = {\#2571}, Title = {{Stereo Imaging, Crater Relaxation, and Thermal Histories of Rhea and Dione}}, Year = 2012, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2012LPI....43.2571P}} @inproceedings{2012LPI....43.2815M, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2012LPI....43.2815M}, Author = {{Morgan}, A.~M. and {Beyer}, R.~A. and {Howard}, A.~D. and {Moore}, J.~M.}, Booktitle = {Lunar and Planetary Science Conference 43}, Date-Added = {2013-04-26 22:44:21 +0000}, Date-Modified = {2013-04-26 22:44:21 +0000}, Eid = {2815}, Month = mar, Number = {\#2815}, Title = {{The Alluvial Fans of Saheki Crater}}, Year = 2012, Bdsk-Url-1 = {http://adsabs.harvard.edu/abs/2012LPI....43.2815M}} @inproceedings{2013LPICo1719.2766P, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2013LPICo1719.2766P}, Author = {{Phillips}, C.~B. and {Hammond}, N.~P. and {Roberts}, J.~H. and {Nimmo}, F. and {Beyer}, R.~A. and {Kattenhorn}, S.}, Booktitle = {Lunar and Planetary Science Conference 44}, Date-Added = {2013-04-26 22:42:21 +0000}, Date-Modified = {2013-04-26 22:42:21 +0000}, Journal = {LPI Contributions}, Month = mar, Number = {\#2766}, Title = {{Stereo Topography and Subsurface Thermal Profiles on Icy Satellites of Saturn}}, Year = 2013} @article{2013LPICo1719.2966O, Adsnote = {Provided by the SAO/NASA Astrophysics Data System}, Adsurl = {http://adsabs.harvard.edu/abs/2013LPICo1719.2966O}, Author = {{{\"O}hman}, T. and {McGovern}, P.~J.}, Date-Added = {2013-04-26 22:32:13 +0000}, Date-Modified = {2013-04-26 22:32:13 +0000}, Journal = {LPI Contributions}, Month = mar, Pages = {2966}, Title = {{Strain Calculations for Circumferential Graben on Alba Mons, Mars}}, Volume = 1719, Year = 2013} @article{Golombek:2012ys, Author = {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.}, Date-Added = {2013-04-26 19:09:50 +0000}, Date-Modified = {2013-04-26 19:09:50 +0000}, Issn = {0038-6308}, Journal = {Space Science Reviews}, Keywords = {Landing sites; Mars; Surface materials; Surface characteristics; Mars Science Laboratory}, Language = {English}, Number = {1-4}, Pages = {641-737}, Publisher = {Springer Netherlands}, Title = {Selection of the {Mars Science Laboratory} Landing Site}, Url = {http://dx.doi.org/10.1007/s11214-012-9916-y}, Volume = {170}, Year = {2012}, Bdsk-Url-1 = {http://dx.doi.org/10.1007/s11214-012-9916-y}} @article{JGRE:JGRE2993, Author = {{\"O}hman, Teemu and Kring, David A.}, Date-Added = {2013-04-26 18:50:46 +0000}, Date-Modified = {2013-04-26 18:50:46 +0000}, Issn = {2156-2202}, Journal = {Journal of Geophysical Research: Planets}, Keywords = {impact cratering, impact melts, lunar craters, lunar exploration, rheology}, Number = {E12}, Pages = {n/a--n/a}, Title = {Photogeologic analysis of impact melt-rich lithologies in {Kepler} crater that could be sampled by future missions}, Url = {http://dx.doi.org/10.1029/2011JE003918}, Volume = {117}, Year = {2012}, Bdsk-Url-1 = {http://dx.doi.org/10.1029/2011JE003918}} @article{Hammond2013418, Author = {N.P. Hammond and C.B. Phillips and F. Nimmo and S.A. Kattenhorn}, Date-Added = {2013-04-26 18:48:50 +0000}, Date-Modified = {2013-04-26 18:48:50 +0000}, Issn = {0019-1035}, Journal = {Icarus}, Keywords = {Tectonics}, Number = {1}, Pages = {418 - 422}, Title = {Flexure on {Dione}: Investigating subsurface structure and thermal history}, Url = {http://www.sciencedirect.com/science/article/pii/S0019103513000043}, Volume = {223}, Year = {2013}, Bdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0019103513000043}, Bdsk-Url-2 = {http://dx.doi.org/10.1016/j.icarus.2012.12.021}} @article{Peel2013, Author = {Samantha E. Peel and Caleb I. Fassett}, Date-Added = {2013-04-26 18:46:01 +0000}, Date-Modified = {2013-04-26 18:46:01 +0000}, Issn = {0019-1035}, Journal = {Icarus}, Keywords = {Pit Craters}, Number = {0}, Pages = {-}, Title = {Valleys in Pit Craters on {Mars}: Characteristics, Distribution, and Formation Mechanisms}, Url = {http://www.sciencedirect.com/science/article/pii/S0019103513001474}, Year = {2013}, Bdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0019103513001474}, Bdsk-Url-2 = {http://dx.doi.org/10.1016/j.icarus.2013.03.031}} @article{doi:10.1117/12.974524, Author = {Re, Cristina and Cremonese, Gabriele and Dall'Asta, Elisa and Forlani, Gianfranco and Naletto, Giampiero and Roncella, Riccardo}, Date-Added = {2013-04-26 18:40:24 +0000}, Date-Modified = {2013-04-26 18:41:53 +0000}, Journal = {Proc. SPIE 8537, Image and Signal Processing for Remote Sensing XVIII}, Pages = {85370V-85370V-12}, Title = {Performance evaluation of {DTM} area-based matching reconstruction of {Moon} and {Mars}}, Url = {http://dx.doi.org/10.1117/12.974524}, Year = {2012}, Bdsk-Url-1 = {+%20http://dx.doi.org/10.1117/12.974524}, Bdsk-Url-2 = {http://dx.doi.org/10.1117/12.974524}} @article{ROB:ROB20410, Author = {SunSpiral, Vytas and Wheeler, D.W. and Chavez-Clemente, Daniel and Mittman, David}, Date-Added = {2013-04-26 18:34:31 +0000}, Date-Modified = {2013-04-26 18:34:31 +0000}, Issn = {1556-4967}, Journal = {Journal of Field Robotics}, Number = {3}, Pages = {483--505}, Publisher = {Wiley Subscription Services, Inc., A Wiley Company}, Title = {Development and field testing of the {FootFall} planning system for the {ATHLETE} robots}, Url = {http://dx.doi.org/10.1002/rob.20410}, Volume = {29}, Year = {2012}, Bdsk-Url-1 = {http://dx.doi.org/10.1002/rob.20410}} @article{Huffman20111273, Author = {John Huffman and Andrew Forsberg and Andrew Loomis and James Head and James Dickson and Caleb Fassett}, Date-Added = {2013-04-26 18:30:45 +0000}, Date-Modified = {2013-04-26 18:30:45 +0000}, Issn = {0032-0633}, Journal = {Planetary and Space Science}, Keywords = {Mars stereo visualization workflow analysis}, Number = {11--12}, Pages = {1273 - 1279}, Title = {Integrating advanced visualization technology into the planetary Geoscience workflow}, Url = {http://www.sciencedirect.com/science/article/pii/S0032063310002175}, Volume = {59}, Year = {2011}, Bdsk-Url-1 = {http://www.sciencedirect.com/science/article/pii/S0032063310002175}, Bdsk-Url-2 = {http://dx.doi.org/10.1016/j.pss.2010.07.015} } @article{stevens2015greenland, title={{Greenland} supraglacial lake drainages triggered by hydrologically induced basal slip}, 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}, journal={Nature}, volume={522}, number={7554}, pages={73--76}, year={2015}, publisher={Nature Publishing Group} } @article{willis2015outlet, title={Outlet glacier response to the 2012 collapse of the {Matusevich Ice Shelf, Severnaya Zemlya, Russian Arctic}}, author={Willis, Michael J and Melkonian, Andrew K and Pritchard, Matthew E}, journal={Journal of Geophysical Research: Earth Surface}, volume={120}, number={10}, pages={2040--2055}, year={2015}, publisher={Wiley Online Library} } @article{shean2016automated, title={An automated, open-source pipeline for mass production of digital elevation models ({DEMs}) from very-high-resolution commercial stereo satellite imagery}, 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}, journal={ISPRS Journal of Photogrammetry and Remote Sensing}, volume={116}, pages={101--117}, year={2016}, publisher={Elsevier} } @article{lacroix2016landslides, title={Landslides triggered by the {Gorkha} earthquake in the {Langtang} valley, volumes and initiation processes}, author={Lacroix, Pascal}, journal={Earth, Planets and Space}, volume={68}, number={1}, pages={1--10}, year={2016}, publisher={Springer} } @article{pope2016estimating, title={Estimating supraglacial lake depth in {West Greenland} using {Landsat 8} and comparison with other multispectral methods}, author={Pope, Allen and Scambos, TA and Moussavi, M and Tedesco, M and Willis, M and Shean, D and Grigsby, S}, journal={The Cryosphere}, volume={10}, pages={15}, year={2016} } @article{melkonian2016recent, title={Recent changes in glacier velocities and thinning at {Novaya Zemlya}}, author={Melkonian, Andrew K and Willis, Michael J and Pritchard, Matthew E and Stewart, Adam J}, journal={Remote Sensing of Environment}, volume={174}, pages={244--257}, year={2016}, publisher={Elsevier} } @article{Montesano201776, title = "The use of sun elevation angle for stereogrammetric boreal forest height in open canopies", journal = "Remote Sensing of Environment", volume = "196", number = "", pages = "76 - 88", year = "2017", note = "", issn = "0034-4257", url = "http://www.sciencedirect.com/science/article/pii/S0034425717301827", author = "Paul M. Montesano and Christopher Neigh and Guoqing Sun and Laura Duncanson and Jamon Van Den Hoek and K. Jon Ranson", keywords = {"WorldView", "Sun elevation angle", "Forest structure", "Biome boundary", "Ecotone", "Taiga", "Tundra", "Stereogrammetry", "Photogrammetry", "Digital surface model"} } @article{stereosfsfusion, title = "Fusion of photogrammetric and photoclinometric information for high-resolution {DEMs} from {Mars} in-orbit imagery", journal = "ISPRS Journal of Photogrammetry and Remote Sensing", volume = "130", number = "", pages = "Pages 418-430", year = "2017", note = "", issn = "", url = "http://www.sciencedirect.com/science/article/pii/S0924271616306554", author = "Cheng Jiang and Sylvain Dout\'e and Bin Luob and Liangpei Zhang" } @article{tc-11-1501-2017, AUTHOR = {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.}, TITLE = {Winter mass balance of {Drangaj\"{o}kull} ice cap ({NW Iceland}) derived from satellite sub-meter stereo images}, JOURNAL = {The Cryosphere}, VOLUME = {11}, YEAR = {2017}, NUMBER = {3}, PAGES = {1501--1517}, URL = {https://www.the-cryosphere.net/11/1501/2017/}, } @INPROCEEDINGS{2012EGUGA..14.8723A, author = {{Allemand}, P. and {Deschamps}, A. and {Lesaout}, M. and {Delacourt}, C. and {Quantin}, C. and {Clenet}, H.}, title = "{Magma rheology from {3D} geometry of martian lava flows}", booktitle = {EGU General Assembly Conference Abstracts}, year = 2012, volume = {14}, month = Apr, pages = {8723}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2012EGUGA..14.8723A}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2012LPI....43.2371L, author = {{Laura}, J.~R. and {Miller}, D. and {Paul}, M.~V.}, title = "{{Ames Stereo Pipeline} Derived {DEM} Accuracy Experiment Using {LROC-NAC} Stereopairs and Weighted Spatial Dependence Simulation for {Lunar} Site Selection}", booktitle = {Lunar and Planetary Science Conference}, year = 2012, month = Mar, eid = {2371}, pages = {2371}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2012LPI....43.2371L}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2014AGUFM.P34C..05M, author = {{Mouginis-Mark}, P.~J. and {Boyce}, J.~M. and {Garbeil}, H.}, title = "{Digital Elevation Models Aid the Analysis of Double Layered Ejecta ({DLE}) Impact Craters on {Mars}}", keywords = {5415 Erosion and weathering, PLANETARY SCIENCES: SOLID SURFACE PLANETS, 5455 Origin and evolution, PLANETARY SCIENCES: SOLID SURFACE PLANETS, 5464 Remote sensing, PLANETARY SCIENCES: SOLID SURFACE PLANETS, 5499 General or miscellaneous, PLANETARY SCIENCES: SOLID SURFACE PLANETS}, booktitle = {AGU Fall Meeting Abstracts}, year = 2014, volume = {2014}, month = Dec, eid = {P34C-05}, pages = {P34C-05}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2014AGUFM.P34C..05M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2014LPI....45.2892M, author = {{Moratto}, Z.~M. and {McMichael}, S.~T. and {Beyer}, R.~A. and {Alexandrov}, O. and {Fong}, T.}, title = "{Automated and Accurate: Making {DTMs} from {LRO-NAC} Using the {Ames Stereo Pipeline}}", booktitle = {Lunar and Planetary Science Conference}, year = 2014, month = Mar, pages = {2892}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2014LPI....45.2892M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2014LPI....45.2902B, author = {{Beyer}, R.~A. and {Alexandrov}, O. and {Moratto}, Z.~M.}, title = "{Aligning Terrain Model and Laser Altimeter Point Clouds with the {Ames Stereo Pipeline}}", booktitle = {Lunar and Planetary Science Conference}, year = 2014, month = Mar, pages = {2902}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2014LPI....45.2902B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2013AGUFM.P53A1846P, author = {{Phillips}, C.~B. and {El Henson}, E. and {Nimmo}, F.}, title = "{Stereo Topography of Surface Features on Europa and Comparisons with Formation Models}", keywords = {5464 PLANETARY SCIENCES: SOLID SURFACE PLANETS Remote sensing, 6221 PLANETARY SCIENCES: SOLAR SYSTEM OBJECTS Europa}, booktitle = {AGU Fall Meeting Abstracts}, year = 2013, volume = {2013}, month = Dec, eid = {P53A-1846}, pages = {P53A-1846}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2013AGUFM.P53A1846P}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2014cosp...40E3719Y, author = {{Yershov}, Vladimir and {Ivanov}, Anton and {Muller}, Jan-Peter and {Tao}, Yu and {Mr} and {Pool}, William and {Kim}, Jung-Rack and {Sidiropoulos}, Panagiotis}, title = "{Assessment of Digital Terrain Model algorithms for the development of a massive processing system for all high-resolution stereo images of Mars from CTX and HiRISE}", booktitle = {40th COSPAR Scientific Assembly}, year = 2014, volume = {40}, month = Jan, eid = {B0.8-11-14}, pages = {B0.8-11-14}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2014cosp...40E3719Y}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2015LPI....46.2491M, author = {{McMichael}, S. and {Moratto}, Z.~M. and {Beyer}, R.~A.}, title = "{LRO-NAC Mass DTM Pipeline}", booktitle = {Lunar and Planetary Science Conference}, year = 2015, month = Mar, pages = {2491}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2015LPI....46.2491M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2015LPICo1841.9032W, author = {{Watters}, W.~A. and {Geiger}, L. and {Fendrock}, M. and {Gibson}, R. and {Radford}, A.}, title = "{Statistical Morphometry of Small Martian Craters: New Methods and Results}", booktitle = {Issues in Crater Studies and the Dating of Planetary Surfaces}, year = 2015, volume = {1841}, month = May, pages = {9032}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2015LPICo1841.9032W}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2015EPSC...10..343Y, author = {{Yershov}, V.}, title = "{A system for generating multi-resolution Digital Terrain Models of Mars based on the ESA Mars Express and NASA Mars Reconnaissance Orbiter data}", booktitle = {European Planetary Science Congress}, year = 2015, month = Oct, eid = {EPSC2015-343}, pages = {EPSC2015-343}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2015EPSC...10..343Y}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2015AGUFM.P41C2079B, author = {{Bauer}, R.~S. and {Barker}, M.~K. and {Mazarico}, E. and {Neumann}, G.~A.}, title = "{Calibration of Mercury Laser Altimeter Data Using Digital Elevation Models Derived from Stereo Image Pairs}", keywords = {1221 Lunar and planetary geodesy and gravity, GEODESY AND GRAVITY, 1294 Instruments and techniques, GEODESY AND GRAVITY, 6019 Gravitational fields, PLANETARY SCIENCES: COMETS AND SMALL BODIES, 5417 Gravitational fields, PLANETARY SCIENCES: SOLID SURFACE PLANETS}, booktitle = {AGU Fall Meeting Abstracts}, year = 2015, volume = {2015}, month = Dec, eid = {P41C-2079}, pages = {P41C-2079}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2015AGUFM.P41C2079B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2016LPI....47.1241M, author = {{Mayer}, D.~P. and {Kite}, E.~S.}, title = "{An Integrated Workflow for Producing Digital Terrain Models of Mars from CTX and HiRISE Stereo Data Using the NASA Ames Stereo Pipeline}", booktitle = {Lunar and Planetary Science Conference}, year = 2016, month = Mar, pages = {1241}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2016LPI....47.1241M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2016cosp...41E.877I, author = {{Ivanov}, Anton and {Muller}, Jan-Peter and {Tao}, Yu and {Kim}, Jung- Rack and {Gwinner}, Klaus and {Van Gasselt}, Stephan and {Morley}, Jeremy and {Houghton}, Robert and {Bamford}, Steven and {Sidiropoulos}, Panagiotis and {Fanara}, Lida and {Waenlish}, Marita and {Walter}, Sebastian and {Steinkert}, Ralf and {Schreiner}, Bjorn and {Cantini}, Federico and {Wardlaw}, Jessica and {Sprinks}, James and {Giordano}, Michele and {Marsh}, Stuart}, title = "{EU-FP7-iMARS: analysis of Mars multi-resolution images using auto-coregistration, data mining and crowd source techniques}", booktitle = {41st COSPAR Scientific Assembly}, year = 2016, volume = {41}, month = Jul, eid = {B0.2-22-16}, pages = {B0.2-22-16}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2016cosp...41E.877I}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2016DPS....4811608N, author = {{Nebouy}, David and {Capanna}, Claire and {Jorda}, Laurent and {Gaskell}, Robert W. and {Faurschou Hviid}, Stubbe and {Scholten}, Frank and {Preusker}, Frank and {OSIRIS Team}}, title = "{Co-registration and comparison of high-resolution shape models of comet 67P/C-G}", booktitle = {AAS/Division for Planetary Sciences Meeting Abstracts \#48}, year = 2016, series = {AAS/Division for Planetary Sciences Meeting Abstracts}, month = Oct, eid = {116.08}, pages = {116.08}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2016DPS....4811608N}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2016DPS....4851311F, author = {{Fanara}, Lida and {Gwinner}, Klaus and {Hauber}, Ernst and {Oberst}, Juergen}, title = "{Frequency of block displacements at the north pole of Mars based on HiRISE images}", booktitle = {AAS/Division for Planetary Sciences Meeting Abstracts \#48}, year = 2016, series = {AAS/Division for Planetary Sciences Meeting Abstracts}, month = Oct, eid = {513.11}, pages = {513.11}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2016DPS....4851311F}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2016AGUFM.P11E..01M, author = {{Mouginis-Mark}, P.~J. and {Sharpton}, V.~L.}, title = "{Topographic Analysis of the Asymmetric Ejecta of Zunil Crater, Mars}", keywords = {6299 General or miscellaneous, PLANETARY SCIENCES: SOLAR SYSTEM OBJECTSDE: 5464 Remote sensing, PLANETARY SCIENCES: SOLID SURFACE PLANETSDE: 5470 Surface materials and properties, PLANETARY SCIENCES: SOLID SURFACE PLANETSDE: 5499 General or miscellaneous, PLANETARY SCIENCES: SOLID SURFACE PLANETS}, booktitle = {AGU Fall Meeting Abstracts}, year = 2016, month = Dec, eid = {P11E-01}, pages = {P11E-01}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2016AGUFM.P11E..01M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @ARTICLE{2016P&SS..134...19F, author = {{Fassett}, Caleb I.}, title = "{Ames Stereo Pipeline-derived digital terrain models of Mercury from MESSENGER stereo imaging}", journal = {Planetary and Space Science}, keywords = {Mercury, surface, Topography, Stereo image processing, Hollows, Pits}, year = 2016, month = Dec, volume = {134}, pages = {19-28}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2016P&SS..134...19F}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2017EGUGA..1918917M, author = {{Muller}, Jan-Peter and {Sidiropoulos}, Panagiotis and {Tao}, Yu and {Putri}, Kiky and {Campbell}, Jacqueline and {Xiong}, Si-Ting and {Gwinner}, Klaus and {Willner}, Konrad and {Fanara}, Lida and {Waehlisch}, Marita and {Walter}, Sebastian and {Schreiner}, Bjoern and {Steikert}, Ralf and {Ivanov}, Anton and {Cantini}, Federico and {Wardlaw}, Jessica and {Sprinks}, James and {Houghton}, Robert and {Kim}, Jung-Rack}, title = "{EU-FP7-iMARS: analysis of Mars multi-resolution images using auto- coregistration, data mining and crowd source techniques: A Final Report on the very variable surface of Mars}", booktitle = {EGU General Assembly Conference Abstracts}, year = 2017, volume = {19}, month = Apr, pages = {18917}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2017EGUGA..1918917M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2017LPICo1986.7090M, author = {{McMichael}, S. and {Alexandrov}, O. and {Beyer}, R.}, title = "{Enhanced 3D Surface Generation in the Ames Stereo Pipeline}", booktitle = {Third Planetary Data Workshop and The Planetary Geologic Mappers Annual Meeting}, year = 2017, volume = {1986}, month = Jun, eid = {7090}, pages = {7090}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2017LPICo1986.7090M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2017LPICo1986.7096B, author = {{Brown}, H.~M. and {Awumah}, A.~A. and {Henriksen}, M.~R. and {Manheim}, M.~R. and {Cisneros}, E. and {Wagner}, R.~V. and {Robinson}, M.~S.}, title = "{Ames Stereo Pipeline and LROC ASU Digital Terrain Model (DTM) Comparison}", booktitle = {Third Planetary Data Workshop and The Planetary Geologic Mappers Annual Meeting}, year = 2017, volume = {1986}, month = Jun, eid = {7096}, pages = {7096}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2017LPICo1986.7096B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @ARTICLE{2017SSRv..211..109F, author = {{Fergason}, R.~L. and {Kirk}, R.~L. and {Cushing}, G. and {Galuszka}, D.~M. and {Golombek}, M.~P. and {Hare}, T.~M. and {Howington- Kraus}, E. and {Kipp}, D.~M. and {Redding}, B.~L.}, title = "{Analysis of Local Slopes at the InSight Landing Site on Mars}", journal = {Space Science Reviews}, keywords = {Mars, Topography, DTM, Slope, InSight}, year = 2017, month = Oct, volume = {211}, pages = {109-133}, adsurl = {https://ui.adsabs.harvard.edu/\#abs/2017SSRv..211..109F}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2017AGUFM.P24C..04A, author = {{Annex}, A.~M. and {Lewis}, K.~W. and {Edwards}, C.~S.}, title = "{Stratigraphic Mapping of Intra-Crater Layered Deposits in Arabia Terra from High-Resolution Imaging and Stereo Topography}", keywords = {5464 Remote sensing, PLANETARY SCIENCES: SOLID SURFACE PLANETS, 5494 Instruments and techniques, PLANETARY SCIENCES: SOLID SURFACE PLANETS, 5499 General or miscellaneous, PLANETARY SCIENCES: SOLID SURFACE PLANETS}, booktitle = {AGU Fall Meeting Abstracts}, year = 2017, volume = {2017}, month = Dec, eid = {P24C-04}, pages = {P24C-04}, adsurl = {https://ui.adsabs.harvard.edu/#abs/2017AGUFM.P24C..04A}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2017AGUFM.P43D2914R, author = {{Rezza}, C. and {Phillips}, C.~B. and {Cable}, M.~L.}, title = "{`Dem DEMs: Comparing Methods of Digital Elevation Model Creation}", keywords = {0770 Properties, CRYOSPHERE, 6218 Jovian satellites, PLANETARY SCIENCES: SOLAR SYSTEM OBJECTS, 6280 Saturnian satellites, PLANETARY SCIENCES: SOLAR SYSTEM OBJECTS, 5422 Ices, PLANETARY SCIENCES: SOLID SURFACE PLANETS}, booktitle = {AGU Fall Meeting Abstracts}, year = 2017, volume = {2017}, month = Dec, eid = {P43D-2914}, pages = {P43D-2914}, adsurl = {https://ui.adsabs.harvard.edu/#abs/2017AGUFM.P43D2914R}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2018LPI....49.1384M, author = {{Moon}, S.~H. and {Choi}, H.~L.}, title = "{Alignment and Ortho-Rectification of Lunar Surface Image Using the NASA Ames Stereo Pipeline}", booktitle = {Lunar and Planetary Science Conference}, year = 2018, month = Mar, eid = {1384}, pages = {1384}, adsurl = {https://ui.adsabs.harvard.edu/#abs/2018LPI....49.1384M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2018LPI....49.1604M, author = {{Mayer}, D.~P.}, title = "{An Improved Workflow for Producing Digital Terrain Models of Mars from CTX Stereo Data Using the NASA Ames Stereo Pipeline}", booktitle = {Lunar and Planetary Science Conference}, year = 2018, month = Mar, eid = {1604}, pages = {1604}, adsurl = {https://ui.adsabs.harvard.edu/#abs/2018LPI....49.1604M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2018EGUGA..20.1120P, author = {{Putri}, Alfiah Rizky Diana and {Sidiropoulos}, Panagiotis and {Tao}, Yu and {Muller}, Jan-Peter}, title = "{Automatic Multiple-Expert Quality Assessment for Batch Processed Martian DTMs}", booktitle = {EGU General Assembly Conference Abstracts}, year = 2018, volume = {20}, month = Apr, pages = {1120}, adsurl = {https://ui.adsabs.harvard.edu/#abs/2018EGUGA..20.1120P}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2018EGUGA..2015971M, author = {{Muller}, Jan-Peter and {Tao}, Yu and {Sidiropoulos}, Panagiotis and {Putri}, Alfiah and {Campbell}, Jacqueline and {Walter}, Sebastian}, title = "{Assessment of approximately 5,000 {Mars}-wide {CTX DTMs} created using the EU-FP7 iMars CASP-GO system}", booktitle = {EGU General Assembly Conference Abstracts}, year = 2018, volume = {20}, month = Apr, pages = {15971}, adsurl = {https://ui.adsabs.harvard.edu/#abs/2018EGUGA..2015971M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @ARTICLE{2018P&SS..154...30T, author = {{Tao}, Y. and {Muller}, J. -P. and {Sidiropoulos}, P. and {Xiong}, Si- Ting and {Putri}, A.~R.~D. and {Walter}, S.~H.~G. and {Veitch- Michaelis}, J. and {Yershov}, V.}, title = "{Massive stereo-based DTM production for Mars on cloud computers}", journal = {Planetary and Space Science}, keywords = {Mars, Global DTM, CTX, HiRISE, CASP-GO, Clouds computing}, year = 2018, month = May, volume = {154}, pages = {30-58}, adsurl = {https://ui.adsabs.harvard.edu/#abs/2018P&SS..154...30T}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @article{bickel2019analysis, title={Analysis of Lunar Boulder Tracks: Implications for Trafficability of Pyroclastic Deposits}, 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}, journal={Journal of Geophysical Research: Planets}, year={2019}, publisher={Wiley Online Library} } @ARTICLE{2019GeoRL..46.2408S, author = {{Shahrzad}, S. and {Kinch}, K.~M. and {Goudge}, T.~A. and {Fassett}, C.~I. and {Needham}, D.~H. and {Quantin-Nataf}, C. and {Knudsen}, C.~P. }, title = "{Crater Statistics on the Dark-Toned, Mafic Floor Unit in Jezero Crater, Mars}", journal = {Geophysical Research Letters}, keywords = {Jezero crater, crater counting, Mars 2020, Mars, age}, year = 2019, month = mar, volume = 46, pages = {2408-2416}, doi = {10.1029/2018GL081402}, adsurl = {http://adsabs.harvard.edu/abs/2019GeoRL..46.2408S}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2019LPI....50.1759H, author = {{Hemmi}, R. and {Miyamoto}, H.}, title = "{HiRISE Digital Elevation Model of Phobos: Implications for Morphological Analysis of Grooves}", booktitle = {Lunar and Planetary Science Conference}, year = "2019", month = "Mar", eid = {1759}, pages = {1759}, adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1759H}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2019LPI....50.2479H, author = {{Hemmi}, R. and {Miyamoto}, H.}, title = "{High-resolution Topographic Analysis of Pitted Mounds in Southern Acidalia Planitia, Mars: Updates on Morphometric Parameters of Candidate Mud Volcanoes}", booktitle = {Lunar and Planetary Science Conference}, year = "2019", month = "Mar", eid = {2479}, pages = {2479}, adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.2479H}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @article{hemmi2018high, title={High-Resolution Topographic Analyses of Mounds in Southern {Acidalia Planitia, Mars}: Implications for Possible Mud Volcanism in Submarine and Subaerial Environments}, author={Hemmi, Ryodo and Miyamoto, Hideaki}, journal={Geosciences}, volume={8}, number={5}, pages={152}, year={2018}, publisher={Multidisciplinary Digital Publishing Institute} } @article{hemmi2017distribution, title={Distribution, morphology, and morphometry of circular mounds in the elongated basin of northern {Terra Sirenum, Mars}}, author={Hemmi, Ryodo and Miyamoto, Hideaki}, journal={Progress in Earth and Planetary Science}, volume={4}, number={1}, pages={26}, year={2017}, publisher={SpringerOpen} } @article{hemmi2020morphology, title={Morphology and morphometry of sub-kilometer craters on the nearside of Phobos and implications for regolith properties}, author={Hemmi, Ryodo and Miyamoto, Hideaki}, journal={Transactions of the Japan Society for Aeronautical and Space Sciences}, volume={63}, number={4}, pages={124--131}, year={2020}, publisher={THE JAPAN SOCIETY FOR AERONAUTICAL AND SPACE SCIENCES} } @INPROCEEDINGS{2019LPI....50.1128M, author = {{Mayer}, D.~P.}, title = "{Filling the Gap: Building a CTX-Based Digital Terrain Model Mosaic of the South Pole of Mars}", booktitle = {Lunar and Planetary Science Conference}, year = "2019", month = "Mar", eid = {1128}, pages = {1128}, adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1128M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2019LPI....50.1069M, author = {{Mouginis-Mark}, P.~J. and {Garbeil}, H.}, title = "{CTX Digital Elevation Models Facilitate Geomorphic Analysis of Mars}", booktitle = {Lunar and Planetary Science Conference}, year = "2019", month = "Mar", eid = {1069}, pages = {1069}, adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1069M}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2019LPI....50.1973A, author = {{Annex}, A.~M. and {Koeppel}, A.~H.~D. and {Pan}, C. and {Edwards}, C.~E. and {Lewis}, K.~W.}, title = "{Scarp Associated with Martian Layered Deposits in Arabia Terra}", booktitle = {Lunar and Planetary Science Conference}, year = "2019", month = "Mar", eid = {1973}, pages = {1973}, adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1973A}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2019LPI....50.1223G, author = {{Goudge}, T.~A. and {Fassett}, C.~I. and {Osinski}, G.~R.}, title = "{How Do Crater Lakes on Mars Develop Inlet Valleys?}", booktitle = {Lunar and Planetary Science Conference}, year = "2019", month = "Mar", eid = {1223}, pages = {1223}, adsurl = {https://ui.adsabs.harvard.edu/abs/2019LPI....50.1223G}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @article{lacroix2019irrigation, title={Irrigation-triggered landslides in a {Peruvian} desert caused by modern intensive farming}, author={Lacroix, Pascal and Dehecq, Amaury and Taipe, Edu}, journal={Nature Geoscience}, pages={1--5}, year={2019}, publisher={Nature Publishing Group} } @article{hepburn2019creating, title={Creating {HiRISE} digital elevation models for {Mars} using the open-source {Ames Stereo Pipeline}}, author={Hepburn, Adam J and Holt, Tom and Hubbard, Bryn and Ng, Felix}, journal={Geoscientific Instrumentation, Methods and Data Systems}, volume={8}, number={2}, pages={293--313}, year={2019}, publisher={Copernicus Publications} } @INPROCEEDINGS{2019EPSC...13..849B, author = {{Beyer}, Ross and {Porter}, Simon and {Schenk}, Paul and {Spencer}, John and {Beddingfield}, Chloe and {Grundy}, William and {Keane}, James and {Lauer}, Tod and {Moore}, Jeff and {Olkin}, Catherine and {Parker}, Joel and {Stern}, Alan and {Umurhan}, Orkan and {Verbiscer}, Anne and {Weaver}, Harold}, title = "{Stereo Topography of {KBO (486958) 2014 MU69}}", booktitle = {EPSC-DPS Joint Meeting 2019}, year = 2019, volume = {2019}, month = sep, eid = {EPSC-DPS2019-849}, pages = {EPSC-DPS2019-849}, adsurl = {https://ui.adsabs.harvard.edu/abs/2019EPSC...13..849B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @ARTICLE{2020PEPS....7...13P, author = {{Parsons}, Reid A. and {Kanzaki}, Tomohiro and {Hemmi}, Ryodo and {Miyamoto}, Hideaki}, title = "{Cold-based glaciation of Pavonis Mons, Mars: evidence for moraine deposition during glacial advance}", journal = {Progress in Earth and Planetary Science}, keywords = {Thermomechanical ice sheet model, Mars, Amazonian climate, Moraine deposition, Tharsis, Glaciation}, year = 2020, month = mar, volume = {7}, number = {1}, eid = {13}, pages = {13}, doi = {10.1186/s40645-020-0323-9}, adsurl = {https://ui.adsabs.harvard.edu/abs/2020PEPS....7...13P}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @inproceedings{10.1117/12.2532975, author = {Tomonori Yamamoto and Koichiro Yawata}, title = {{Improvement of land classification in airports using 3D information}}, volume = {11157}, booktitle = {Remote Sensing Technologies and Applications in Urban Environments IV}, editor = {Thilo Erbertseder and Nektarios Chrysoulakis and Ying Zhang and Frank Baier}, organization = {International Society for Optics and Photonics}, publisher = {SPIE}, pages = {89 -- 97}, keywords = {land classification, VHR satellite images, deep learning, U-NET, MVS, CNN, semantic segmentation}, year = {2019}, doi = {10.1117/12.2532975}, URL = {https://doi.org/10.1117/12.2532975} } @article{10.1785/0220180227, 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}, 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}, journal={Seismological Research Letters}, volume={90}, number={1}, pages={97--107}, year={2019}, publisher={Seismological Society of America} } @article{SARKAR2019199, title = "Tectonic evolution of Juventae Chasma, Mars, and the deformational and depositional structural attributes of the four major light-toned rock exposures therein", journal = "Icarus", volume = "333", pages = "199 - 233", year = "2019", issn = "0019-1035", doi = "https://doi.org/10.1016/j.icarus.2019.05.032", url = "http://www.sciencedirect.com/science/article/pii/S0019103518306766", author = "Ranjan Sarkar and Kenneth S. Edgett and Dibyendu Ghosh and Alok Porwal and Pragya Singh" } @article{BEDDINGFIELD2020113383, title = "Landslides on Charon", journal = "Icarus", volume = "335", pages = "113383", year = "2020", issn = "0019-1035", doi = "https://doi.org/10.1016/j.icarus.2019.07.017", url = "http://www.sciencedirect.com/science/article/pii/S0019103518306341", author = "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" } @article{doi:10.1029/2019JE006167, author = {Stucky de Quay, Gaia and Kite, Edwin S and Mayer, David P.}, title = {Prolonged Fluvial Activity From Channel-Fan Systems on Mars}, journal = {Journal of Geophysical Research: Planets}, volume = {124}, number = {11}, pages = {3119-3139}, keywords = {Mars, fluvial, timescale, erosion, sediment transport, alluvial fan}, doi = {10.1029/2019JE006167}, url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019JE006167}, eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019JE006167}, year = {2019} } @article{doi:10.1029/2019JE006083, author = {Schorghofer, N. and Levy, J.S. and Goudge, T.A.}, title = {High-Resolution Thermal Environment of Recurring Slope Lineae in Palikir Crater, Mars, and Its Implications for Volatiles}, journal = {Journal of Geophysical Research: Planets}, volume = {124}, number = {11}, pages = {2852-2862}, keywords = {Recurring Slope Lineae, Mars, volatiles, thermal models}, doi = {10.1029/2019JE006083}, url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019JE006083}, eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019JE006083}, year = {2019} } @article{rivera2019deltas, title={Do deltas along the crustal dichotomy boundary of Mars in the Gale crater region record a northern ocean?}, author={Rivera-Hern{\'a}ndez, Frances and Palucis, Marisa C}, journal={Geophysical Research Letters}, volume={46}, number={15}, pages={8689--8699}, year={2019}, publisher={Wiley Online Library} } @article{FANARA2020104733, title = "Automated detection of block falls in the north polar region of Mars", journal = "Planetary and Space Science", volume = "180", pages = "104733", year = "2020", issn = "0032-0633", doi = "https://doi.org/10.1016/j.pss.2019.104733", url = "http://www.sciencedirect.com/science/article/pii/S0032063318304422", author = "L. Fanara and K. Gwinner and E. Hauber and J. Oberst", keywords = "Change detection, Block falls, Machine learning, Blob detection, Mars" } @article{TEBOLT2020113536, title = "Slope, elevation, and thermal inertia trends of martian recurring slope lineae initiation and termination points: Multiple possible processes occurring on coarse, sandy slopes", journal = "Icarus", volume = "338", pages = "113536", year = "2020", issn = "0019-1035", doi = "https://doi.org/10.1016/j.icarus.2019.113536", url = "http://www.sciencedirect.com/science/article/pii/S0019103519305779", author = "Michelle Tebolt and Joseph Levy and Timothy Goudge and Norbert Schorghofer" } @article{doi:10.1029/2019GL085584, author = {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.}, title = {Orbital Identification of Hydrated Silica in Jezero Crater, Mars}, journal = {Geophysical Research Letters}, volume = {46}, number = {22}, pages = {12771-12782}, keywords = {Mars, Jezero, silica, biosignature}, doi = {10.1029/2019GL085584}, url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019GL085584}, eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019GL085584}, year = {2019} } @article {Sterneaaw9771, author = {Stern, S. A. and Weaver, H. A. and Spencer, J. R. and Olkin, C. B. and Gladstone, G. R. and Grundy, W. M. and Moore, J. M. and Cruikshank, D. P. and Elliott, H. A. and McKinnon, W. B. and Parker, J. Wm. and Verbiscer, A. J. and Young, L. A. and Aguilar, D. A. and Albers, J. M. and Andert, T. and Andrews, J. P. and Bagenal, F. and Banks, M. E. and Bauer, B. A. and Bauman, J. A. and Bechtold, K. E. and Beddingfield, C. B. and Behrooz, N. and Beisser, K. B. and Benecchi, S. D. and Bernardoni, E. and Beyer, R. A. and Bhaskaran, S. and Bierson, C. J. and Binzel, R. P. and Birath, E. M. and Bird, M. K. and Boone, D. R. and Bowman, A. F. and Bray, V. J. and Britt, D. T. and Brown, L. E. and Buckley, M. R. and Buie, M. W. and Buratti, B. J. and Burke, L. M. and Bushman, S. S. and Carcich, B. and Chaikin, A. L. and Chavez, C. L. and Cheng, A. F. and Colwell, E. J. and Conard, S. J. and Conner, M. P. and Conrad, C. A. and Cook, J. C. and Cooper, S. B. and Custodio, O. S. and Dalle Ore, C. M. and Deboy, C. C. and Dharmavaram, P. and Dhingra, R. D. and Dunn, G. F. and Earle, A. M. and Egan, A. F. and Eisig, J. and El-Maarry, M. R. and Engelbrecht, C. and Enke, B. L. and Ercol, C. J. and Fattig, E. D. and Ferrell, C. L. and Finley, T. J. and Firer, J. and Fischetti, J. and Folkner, W. M. and Fosbury, M. N. and Fountain, G. H. and Freeze, J. M. and Gabasova, L. and Glaze, L. S. and Green, J. L. and Griffith, G. A. and Guo, Y. and Hahn, M. and Hals, D. W. and Hamilton, D. P. and Hamilton, S. A. and Hanley, J. J. and Harch, A. and Harmon, K. A. and Hart, H. M. and Hayes, J. and Hersman, C. B. and Hill, M. E. and Hill, T. A. and Hofgartner, J. D. and Holdridge, M. E. and Hor{\'a}nyi, M. and Hosadurga, A. and Howard, A. D. and Howett, C. J. A. and Jaskulek, S. E. and Jennings, D. E. and Jensen, J. R. and Jones, M. R. and Kang, H. K. and Katz, D. J. and Kaufmann, D. E. and Kavelaars, J. J. and Keane, J. T. and Keleher, G. P. and Kinczyk, M. and Kochte, M. C. and Kollmann, P. and Krimigis, S. M. and Kruizinga, G. L. and Kusnierkiewicz, D. Y. and Lahr, M. S. and Lauer, T. R. and Lawrence, G. B. and Lee, J. E. and Lessac-Chenen, E. J. and Linscott, I. R. and Lisse, C. M. and Lunsford, A. W. and Mages, D. M. and Mallder, V. A. and Martin, N. P. and May, B. H. and McComas, D. J. and McNutt, R. L. and Mehoke, D. S. and Mehoke, T. S. and Nelson, D. S. and Nguyen, H. D. and N{\'u}{\~n}ez, J. I. and Ocampo, A. C. and Owen, W. M. and Oxton, G. K. and Parker, A. H. and P{\"a}tzold, M. and Pelgrift, J. Y. and Pelletier, F. J. and Pineau, J. P. and Piquette, M. R. and Porter, S. B. and Protopapa, S. and Quirico, E. and Redfern, J. A. and Regiec, A. L. and Reitsema, H. J. and Reuter, D. C. and Richardson, D. C. and Riedel, J. E. and Ritterbush, M. A. and Robbins, S. J. and Rodgers, D. J. and Rogers, G. D. and Rose, D. M. and Rosendall, P. E. and Runyon, K. D. and Ryschkewitsch, M. G. and Saina, M. M. and Salinas, M. J. and Schenk, P. M. and Scherrer, J. R. and Schlei, W. R. and Schmitt, B. and Schultz, D. J. and Schurr, D. C. and Scipioni, F. and Sepan, R. L. and Shelton, R. G. and Showalter, M. R. and Simon, M. and Singer, K. N. and Stahlheber, E. W. and Stanbridge, D. R. and Stansberry, J. A. and Steffl, A. J. and Strobel, D. F. and Stothoff, M. M. and Stryk, T. and Stuart, J. R. and Summers, M. E. and Tapley, M. B. and Taylor, A. and Taylor, H. W. and Tedford, R. M. and Throop, H. B. and Turner, L. S. and Umurhan, O. M. and Van Eck, J. and Velez, D. and Versteeg, M. H. and Vincent, M. A. and Webbert, R. W. and Weidner, S. E. and Weigle, G. E. and Wendel, J. R. and White, O. L. and Whittenburg, K. E. and Williams, B. G. and Williams, K. E. and Williams, S. P. and Winters, H. L. and Zangari, A. M. and Zurbuchen, T. H.}, title = {Initial results from the New Horizons exploration of 2014 MU69, a small Kuiper Belt object}, volume = {364}, number = {6441}, elocation-id = {eaaw9771}, year = {2019}, doi = {10.1126/science.aaw9771}, publisher = {American Association for the Advancement of Science}, issn = {0036-8075}, URL = {https://science.sciencemag.org/content/364/6441/eaaw9771}, eprint = {https://science.sciencemag.org/content/364/6441/eaaw9771.full.pdf}, journal = {Science} } @article{pan2020crust, title={Crust stratigraphy and heterogeneities of the first kilometers at the dichotomy boundary in western Elysium Planitia and implications for InSight lander}, 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}, journal={Icarus}, volume={338}, pages={113511}, year={2020}, publisher={Elsevier} } @article{tc-13-2633-2019, AUTHOR = {Shean, D. E. and Joughin, I. R. and Dutrieux, P. and Smith, B. E. and Berthier, E.}, TITLE = {Ice shelf basal melt rates from a high-resolution digital elevation model (DEM) record for Pine Island Glacier, Antarctica}, JOURNAL = {The Cryosphere}, VOLUME = {13}, YEAR = {2019}, NUMBER = {10}, PAGES = {2633--2656}, URL = {https://www.the-cryosphere.net/13/2633/2019/}, DOI = {10.5194/tc-13-2633-2019} } @article{Palaseanu_Lovejoy_2019, title={High-Resolution and Accurate Topography Reconstruction of Mount Etna from Pleiades Satellite Data}, volume={11}, ISSN={2072-4292}, url={http://dx.doi.org/10.3390/rs11242983}, DOI={10.3390/rs11242983}, number={24}, journal={Remote Sensing}, publisher={MDPI AG}, author={Palaseanu-Lovejoy, Monica and Bisson, Marina and Spinetti, Claudia and Buongiorno, Maria Fabrizia and Alexandrov, Oleg and Cecere, Thomas}, year={2019}, month={Dec}, pages={2983}} @Article{tc-14-211-2020, AUTHOR = {Joughin, I. and Shean, D. E. and Smith, B. E. and Floricioiu, D.}, TITLE = {A decade of variability on Jakobshavn Isbr{\ae}: ocean temperatures pace speed through influence on m\'{e}lange rigidity}, JOURNAL = {The Cryosphere}, VOLUME = {14}, YEAR = {2020}, NUMBER = {1}, PAGES = {211--227}, URL = {https://www.the-cryosphere.net/14/211/2020/}, DOI = {10.5194/tc-14-211-2020} } @ARTICLE{10.3389/feart.2019.00363, AUTHOR={Shean, David E. and Bhushan, Shashank and Montesano, Paul and Rounce, David R. and Arendt, Anthony and Osmanoglu, Batuhan}, TITLE={A Systematic, Regional Assessment of High Mountain Asia Glacier Mass Balance}, JOURNAL={Frontiers in Earth Science}, VOLUME={7}, PAGES={363}, YEAR={2020}, URL={https://www.frontiersin.org/article/10.3389/feart.2019.00363}, DOI={10.3389/feart.2019.00363}, ISSN={2296-6463} } @article{Socquet2019, author={Socquet, Anne and Hollingsworth, James and Pathier, Erwan and Bouchon, Michel}, title={Evidence of supershear during the 2018 magnitude 7.5 Palu earthquake from space geodesy}, journal={Nature Geoscience}, volume=12, pages={192-199}, year=2019, doi={10.1038/s41561-018-0296-0} } @article{Ye_2020, title={Area-Based Dense Image Matching with Subpixel Accuracy for Remote Sensing Applications: Practical Analysis and Comparative Study}, volume={12}, ISSN={2072-4292}, url={http://dx.doi.org/10.3390/rs12040696}, DOI={10.3390/rs12040696}, number={4}, journal={Remote Sensing}, publisher={MDPI AG}, author={Ye, Zhen and Xu, Yusheng and Chen, Hao and Zhu, Jingwei and Tong, Xiaohua and Stilla, Uwe}, year={2020}, month={Feb}, pages={696}} @article {Spencereaay3999, author = {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.}, title = {The geology and geophysics of Kuiper Belt object (486958) Arrokoth}, volume = {367}, number = {6481}, year = {2020}, doi = {10.1126/science.aay3999}, publisher = {American Association for the Advancement of Science}, issn = {0036-8075}, URL = {https://science.sciencemag.org/content/367/6481/eaay3999}, eprint = {https://science.sciencemag.org/content/367/6481/eaay3999.full.pdf}, journal = {Science} } @article{doi:10.1029/2019JE006188, author = {Annex, Andrew M. and Lewis, Kevin W.}, title = {Regional Correlations in the Layered Deposits of Arabia Terra, Mars}, journal = {Journal of Geophysical Research: Planets}, volume = {125}, number = {6}, pages = {e2019JE006188}, keywords = {Mars}, doi = {10.1029/2019JE006188}, url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019JE006188}, eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2019JE006188}, note = {e2019JE006188 10.1029/2019JE006188}, year = {2020} } @inproceedings{shean_mro_2011, title = {{MRO} {CTX} {Stereo} {Image} {Processing} and {Preliminary} {DEM} {Quality} {Assessment}}, volume = {42}, url = {http://www.lpi.usra.edu/meetings/lpsc2011/pdf/2646.pdf}, booktitle = {42nd {Lunar} and {Planetary} {Science} {Conference} {Abstracts}}, author = {Shean, D. E. and Fahle, J. and Malin, M. C. and Edwards, L. J. and Posiolova, L.}, month = mar, year = {2011}, pages = {2646}, } @article{joughin_grounding_2016, title = {Grounding line variability and subglacial lake drainage on {Pine} {Island} {Glacier}, {Antarctica}}, volume = {43}, issn = {00948276}, shorttitle = {Grounding line variability and subglacial lake drainage on {Pine} {Island} {Glacier}, {Antarctica}}, url = {http://doi.wiley.com/10.1002/2016GL070259}, doi = {10.1002/2016GL070259}, language = {en}, number = {17}, urldate = {2017-11-20}, journal = {Geophysical Research Letters}, author = {Joughin, Ian and Shean, David E. and Smith, Ben E. and Dutrieux, P.}, month = sep, year = {2016}, pages = {9093--9102}, } @article{christianson_sensitivity_2016, title = {Sensitivity of {Pine} {Island} {Glacier} to observed ocean forcing: {PIG} response to ocean forcing}, volume = {43}, issn = {00948276}, shorttitle = {Sensitivity of {Pine} {Island} {Glacier} to observed ocean forcing}, url = {http://doi.wiley.com/10.1002/2016GL070500}, doi = {10.1002/2016GL070500}, language = {en}, number = {20}, urldate = {2016-11-21}, journal = {Geophysical Research Letters}, author = {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.}, month = oct, year = {2016}, pages = {10,817--10,825}, } @article{shean_gps-derived_2017, title = {{GPS}-derived estimates of surface mass balance and ocean-induced basal melt for {Pine} {Island} {Glacier} ice shelf, {Antarctica}}, volume = {11}, issn = {1994-0424}, url = {https://www.the-cryosphere.net/11/2655/2017/}, doi = {10.5194/tc-11-2655-2017}, number = {6}, urldate = {2017-11-21}, journal = {The Cryosphere}, author = {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.}, month = nov, year = {2017}, pages = {2655--2674}, } @article{kehrl_seasonal_2017, title = {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}}, volume = {122}, issn = {21699003}, shorttitle = {Seasonal and interannual variabilities in terminus position, glacier velocity, and surface elevation at {Helheim} and {Kangerlussuaq} {Glaciers} from 2008 to 2016}, url = {http://doi.wiley.com/10.1002/2016JF004133}, doi = {10.1002/2016JF004133}, language = {en}, number = {9}, urldate = {2017-11-30}, journal = {Journal of Geophysical Research: Earth Surface}, author = {Kehrl, L. M. and Joughin, I. and Shean, D. E. and Floricioiu, D. and Krieger, L.}, month = aug, year = {2017}, pages = {1635--1652}, } @article{haritashya_evolution_2018, title = {Evolution and {Controls} of {Large} {Glacial} {Lakes} in the {Nepal} {Himalaya}}, volume = {10}, url = {http://www.mdpi.com/2072-4292/10/5/798}, doi = {10.3390/rs10050798}, language = {en}, number = {5}, urldate = {2018-05-24}, journal = {Remote Sensing}, author = {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}, month = may, year = {2018}, keywords = {remote sensing, glacier, Nepal, Himalaya, glacial lake, GLOF, High Mountain Asia (HMA), moraine-dammed, proglacial lake}, pages = {798}, } @article{lilien_changes_2018, title = {Changes in flow of {Crosson} and {Dotson} ice shelves, {West} {Antarctica}, in response to elevated melt}, volume = {12}, issn = {1994-0416}, url = {https://www.the-cryosphere.net/12/1415/2018/}, doi = {10.5194/tc-12-1415-2018}, language = {English}, number = {4}, urldate = {2018-11-08}, journal = {The Cryosphere}, author = {Lilien, David A. and Joughin, Ian and Smith, Benjamin and Shean, David E.}, month = apr, year = {2018}, pages = {1415--1431}, } @article{menounos_heterogeneous_2019, title = {Heterogeneous {Changes} in {Western} {North} {American} {Glaciers} {Linked} to {Decadal} {Variability} in {Zonal} {Wind} {Strength}}, volume = {46}, issn = {1944-8007}, url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2018GL080942}, doi = {10.1029/2018GL080942}, language = {en}, number = {1}, urldate = {2019-08-05}, journal = {Geophysical Research Letters}, author = {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.}, year = {2019}, keywords = {mass balance, glacier change, zonal wind}, pages = {200--209}, } @article{olson_terrain_2019, title = {Terrain {Induced} {Biases} in {Clear}-{Sky} {Shortwave} {Radiation} {Due} to {Digital} {Elevation} {Model} {Resolution} for {Glaciers} in {Complex} {Terrain}}, volume = {7}, issn = {2296-6463}, url = {https://www.frontiersin.org/articles/10.3389/feart.2019.00216/full}, doi = {10.3389/feart.2019.00216}, language = {English}, urldate = {2019-10-22}, journal = {Frontiers in Earth Science}, author = {Olson, Matthew and Rupper, Summer and Shean, David E.}, year = {2019}, keywords = {glaciers, Digital elevation model, topography, modeling, energy balance, shortwave radiation, solar radiation}, } @article{mcgrath_spatially_2019, title = {Spatially {Extensive} {Ground}-{Penetrating} {Radar} {Snow} {Depth} {Observations} {During} {NASA}'s 2017 {SnowEx} {Campaign}: {Comparison} {With} {In} {Situ}, {Airborne}, and {Satellite} {Observations}}, volume = {55}, issn = {1944-7973}, shorttitle = {Spatially {Extensive} {Ground}-{Penetrating} {Radar} {Snow} {Depth} {Observations} {During} {NASA}'s 2017 {SnowEx} {Campaign}}, url = {http://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2019WR024907}, doi = {10.1029/2019WR024907}, language = {en}, number = {11}, urldate = {2020-02-06}, journal = {Water Resources Research}, author = {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}, year = {2019}, keywords = {remote sensing, ground-penetrating radar, SnowEx, Seasonal snow}, pages = {10026--10036}, } @article{rs13173511, AUTHOR = {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}, TITLE = {Evaluating Stereo Digital Terrain Model Quality at Mars Rover Landing Sites with HRSC, CTX, and HiRISE Images}, JOURNAL = {Remote Sensing}, VOLUME = {13}, YEAR = {2021}, NUMBER = {17}, ARTICLE-NUMBER = {3511}, URL = {https://www.mdpi.com/2072-4292/13/17/3511}, ISSN = {2072-4292}, DOI = {10.3390/rs13173511} } @article{dehecqAutomatedProcessingDeclassified2020, title = {Automated Processing of Declassified KH-9 Hexagon Satellite Images for Global Elevation Change Analysis Since the 1970s}, author = {Dehecq, Amaury and Gardner, Alex S. and Alexandrov, Oleg and McMichael, Scott and Hugonnet, Romain and Shean, David and Marty, Mauro}, year = {2020}, journal = {Frontiers in Earth Science}, volume = {8}, publisher = {{Frontiers}}, doi = {10.3389/feart.2020.566802}, langid = {english}, } @article{purinton2023image, title={Image Texture as Quality Indicator for Optical DEM Generation: Geomorphic Applications in the Arid Central Andes}, author={Purinton, Benjamin and Mueting, Ariane and Bookhagen, Bodo}, journal={Remote Sensing}, volume={15}, number={1}, pages={85}, year={2023}, publisher={Multidisciplinary Digital Publishing Institute} } @article{belart2017winter, title={Winter mass balance of Drangaj{\"o}kull ice cap (NW Iceland) derived from satellite sub-meter stereo images}, 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}, journal={The Cryosphere}, volume={11}, number={3}, pages={1501--1517}, year={2017}, publisher={Copernicus GmbH} } @article{brun_spatially_2017, title = {A spatially resolved estimate of {High} {Mountain} {Asia} glacier mass balances from 2000 to 2016}, volume = {10}, issn = {1752-0894}, url = {http://dx.doi.org/10.1038/ngeo2999}, doi = {10.1038/ngeo2999}, number = {9}, journal = {Nature Geoscience}, author = {Brun, Fanny and Berthier, Etienne and Wagnon, Patrick and K\"{a}\"{a}b, Andreas and Treichler, Desiree}, year = {2017}, pages = {668--673}, } @article{dussaillant2018geodetic, title={Geodetic mass balance of the Northern Patagonian Icefield from 2000 to 2012 using two independent methods}, author={Dussaillant, In{\'e}s and Berthier, Etienne and Brun, Fanny}, journal={Frontiers in Earth Science}, volume={6}, pages={8}, year={2018}, publisher={Frontiers Media SA} } @article{kaab2018massive, title={Massive collapse of two glaciers in western Tibet in 2016 after surge-like instability}, 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}, journal={Nature Geoscience}, volume={11}, number={2}, pages={114--120}, year={2018}, publisher={Nature Publishing Group} } @article{berthier_brief_2018, title = {Brief communication: {Unabated} wastage of the {Juneau} and {Stikine} icefields (southeast {Alaska}) in the early 21st century}, volume = {12}, issn = {1994-0424}, url = {https://www.the-cryosphere.net/12/1523/2018/}, doi = {10.5194/tc-12-1523-2018}, number = {4}, journal = {The Cryosphere}, author = {Berthier, E. and Larsen, C. and Durkin, W. J. and Willis, M. J. and Pritchard, M. E.}, year = {2018}, pages = {1523--1530}, } @article{barandun_multi-decadal_2018, title = {Multi-decadal mass balance series of three {Kyrgyz} glaciers inferred from modelling constrained with repeated snow line observations}, volume = {12}, issn = {1994-0424}, url = {https://www.the-cryosphere.net/12/1899/2018/}, doi = {10.5194/tc-12-1899-2018}, number = {6}, journal = {The Cryosphere}, author = {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.}, year = {2018}, pages = {1899--1919}, } @article{gilbert_mechanisms_2018, title = {Mechanisms leading to the 2016 giant twin glacier collapses, {Aru} {Range}, {Tibet}}, volume = {12}, issn = {1994-0424}, url = {https://www.the-cryosphere.net/12/2883/2018/}, doi = {10.5194/tc-12-2883-2018}, number = {9}, journal = {The Cryosphere}, author = {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.}, year = {2018}, pages = {2883--2900}, } @article{brun_ice_2018, title = {Ice cliff contribution to the tongue-wide ablation of {Changri} {Nup} {Glacier}, {Nepal}, central {Himalaya}}, volume = {12}, issn = {1994-0424}, url = {https://www.the-cryosphere.net/12/3439/2018/}, doi = {10.5194/tc-12-3439-2018}, number = {11}, journal = {The Cryosphere}, author = {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.}, year = {2018}, pages = {3439--3457}, } @article{miles_glacial_2018, title = {Glacial and geomorphic effects of a supraglacial lake drainage and outburst event, {Everest} region, {Nepal} {Himalaya}}, volume = {12}, issn = {1994-0424}, url = {https://www.the-cryosphere.net/12/3891/2018/}, doi = {10.5194/tc-12-3891-2018}, number = {12}, journal = {The Cryosphere}, author = {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.}, year = {2018}, pages = {3891--3905}, } @article{deschamps-berger_closing_2019, title = {Closing the mass budget of a tidewater glacier: the example of {Kronebreen}, {Svalbard}}, volume = {65}, issn = {0022-1430}, url = {https://doi.org/10.1017/jog.2018.98}, doi = {10.1017/jog.2018.98}, number = {249}, journal = {Journal of Glaciology}, author = {Deschamps-Berger, C. and Nuth, C. and van Pelt, W. J. J. and Berthier, E. and Kohler, J. and Altema, B.}, year = {2019}, keywords = {remote sensing, glacier mass balance, glaciological instruments and methods}, pages = {136--148}, } @article{almeida2019deriving, title={Deriving high spatial-resolution coastal topography from sub-meter satellite stereo imagery}, 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}, journal={Remote Sensing}, volume={11}, number={5}, pages={590}, year={2019}, publisher={MDPI} } @article{belart2019geodetic, title={The geodetic mass balance of Eyjafjallaj{\"o}kull ice cap for 1945--2014: processing guidelines and relation to climate}, 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}, journal={Journal of Glaciology}, volume={65}, number={251}, pages={395--409}, year={2019}, publisher={Cambridge University Press} } @article{berthier_karakoram_2019, title = {Karakoram geodetic glacier mass balances between 2008 and 2016: persistence of the anomaly and influence of a large rock avalanche on {Siachen} {Glacier}}, volume = {65}, issn = {0022-1430}, url = {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}, doi = {10.1017/jog.2019.32}, number = {251}, journal = {Journal of Glaciology}, author = {Berthier, E and Brun, F.}, year = {2019}, keywords = {remote sensing, glacier mass balance, mountain glaciers, glacier surges}, pages = {494--507}, } @article{dussaillant_two_2019, title = {Two decades of glacier mass loss along the {Andes}}, volume = {12}, issn = {1752-0908}, url = {https://doi.org/10.1038/s41561-019-0432-5}, doi = {10.1038/s41561-019-0432-5}, number = {10}, journal = {Nature Geoscience}, author = {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.}, year = {2019}, pages = {802--808}, } @article{belart2020mass, title={Mass balance of 14 Icelandic glaciers, 1945--2017: spatial variations and links with climate}, 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}, journal={Frontiers in Earth Science}, pages={163}, year={2020}, publisher={Frontiers} } @article{deschamps-berger_snow_2020, title = {Snow depth mapping from stereo satellite imagery in mountainous terrain: evaluation using airborne laser-scanning data}, volume = {14}, url = {https://tc.copernicus.org/articles/14/2925/2020/}, doi = {10.5194/tc-14-2925-2020}, number = {9}, journal = {The Cryosphere}, author = {Deschamps-Berger, C. and Gascoin, S. and Berthier, E. and Deems, J. and Gutmann, E. and Dehecq, A. and Shean, D. and Dumont, M.}, year = {2020}, pages = {2925--2940}, } @article{ferri2020ice, title={Ice mass loss in the Central Andes of Argentina between 2000 and 2018 derived from a new glacier inventory and satellite stereo-imagery}, 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}, journal={Frontiers in Earth Science}, volume={8}, pages={530997}, year={2020}, publisher={Frontiers Media SA} } @article{young_imbalancing_2021, title = {An imbalancing act: the delayed dynamic response of the {Kaskawulsh} {Glacier} to sustained mass loss}, volume = {67}, issn = {0022-1430}, url = {https://www.cambridge.org/core/article/an-imbalancing-act-the-delayed-dynamic-response-of-the-kaskawulsh-glacier-to-sustained-mass-loss/350065B3C0CD9A900DCBA7D60445D583}, doi = {10.1017/jog.2020.107}, number = {262}, journal = {Journal of Glaciology}, author = {Young, Erik M. and Flowers, Gwenn E. and Berthier, Etienne and Latto, Rebecca}, year = {2021}, note = {Edition: 2020/12/29 Publisher: Cambridge University Press}, keywords = {Glacier mass balance, mountain glaciers, ground-penetrating radar, ice and climate, melt-surface}, pages = {313--330}, } @article{lei_response_2021, title = {Response of downstream lakes to {Aru} glacier collapses on the western {Tibetan} {Plateau}}, volume = {15}, issn = {1994-0424}, url = {https://tc.copernicus.org/articles/15/199/2021/}, doi = {10.5194/tc-15-199-2021}, number = {1}, journal = {The Cryosphere}, author = {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.}, year = {2021}, note = {Publisher: Copernicus Publications}, pages = {199--214}, } @article{denzinger_geodetic_2021, title = {Geodetic mass balance of {Abramov} {Glacier} from 1975 to 2015}, volume = {67}, issn = {0022-1430}, url = {https://www.cambridge.org/core/article/geodetic-mass-balance-of-abramov-glacier-from-1975-to-2015/46235271A5791FB520EC0DDBABB51356}, doi = {10.1017/jog.2020.108}, number = {262}, journal = {Journal of Glaciology}, author = {Denzinger, Florian and Machguth, Horst and Barandun, Martina and Berthier, Etienne and Girod, Luc and Kronenberg, Marlene and Usubaliev, Ryskul and Hoelzle, Martin}, year = {2021}, note = {Edition: 2021/01/26 Publisher: Cambridge University Press}, keywords = {Glacier mass balance, remote sensing, glacier volume}, pages = {313--342}, } @article{wagnon2021reanalysing, title={Reanalysing the 2007--19 glaciological mass-balance series of Mera Glacier, Nepal, Central Himalaya, using geodetic mass balance}, 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}, journal={Journal of Glaciology}, volume={67}, number={261}, pages={117--125}, year={2021}, publisher={Cambridge University Press} } @article{shugar_massive_2021, title = {A massive rock and ice avalanche caused the 2021 disaster at {Chamoli}, {Indian} {Himalaya}}, volume = {373}, url = {http://science.sciencemag.org/content/373/6552/300.abstract}, doi = {10.1126/science.abh4455}, number = {6552}, journal = {Science}, author = {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.}, year = {2021}, pages = {300}, } @article{muhammad_holistic_2021, title = {A holistic view of {Shisper} {Glacier} surge and outburst floods: from physical processes to downstream impacts}, volume = {12}, issn = {1947-5705}, url = {https://doi.org/10.1080/19475705.2021.1975833}, doi = {10.1080/19475705.2021.1975833}, number = {1}, journal = {Geomatics, Natural Hazards and Risk}, author = {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}, year = {2021}, note = {Publisher: Taylor \& Francis}, pages = {2755--2775}, annote = {doi: 10.1080/19475705.2021.1975833}, } @article{pitte2022recent, title={Recent mass-balance changes of Agua Negra glacier (30 S) in the Desert Andes of Argentina}, 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}, journal={Journal of Glaciology}, pages={1--13}, year={2022}, publisher={Cambridge University Press} } @article{van2022pre, title={Pre-collapse motion of the February 2021 Chamoli rock--ice avalanche, Indian Himalaya}, 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}, journal={Natural Hazards and Earth System Sciences}, volume={22}, number={10}, pages={3309--3327}, year={2022}, publisher={Copernicus GmbH} } @article{gouhier2022cnes, title={CNES-ESA satellite contribution to the operational monitoring of volcanic activity: The 2021 Icelandic eruption of Mt. Fagradalsfjall}, 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}, journal={Journal of Applied Volcanology}, volume={11}, number={1}, pages={1--16}, year={2022}, publisher={BioMed Central} } @article{lacroix2022mechanisms, title={Mechanisms of landslide destabilization induced by glacier-retreat on Tungnakv{\'\i}slarj{\"o}kull area, Iceland}, 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}, journal={Geophysical Research Letters}, volume={49}, number={14}, pages={e2022GL098302}, year={2022}, publisher={Wiley Online Library} } @article{pedersen2022volume, title={Volume, effusion rate, and lava transport during the 2021 Fagradalsfjall eruption: Results from near real-time photogrammetric monitoring}, 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}, journal={Geophysical Research Letters}, volume={49}, number={13}, pages={e2021GL097125}, year={2022}, publisher={Wiley Online Library} } @article{falaschi2022increased, 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}, author={Falaschi, Daniel and Berthier, Etienne and Belart, Joaqu{\'\i}n MC and Bravo, Claudio and Castro, Mariano and Durand, Marcelo and Villalba, Ricardo}, journal={Journal of Glaciology}, pages={1--17}, year={2022}, publisher={Cambridge University Press} } @article{deschamps-berger_improving_2022, title = {Improving the {Spatial} {Distribution} of {Snow} {Cover} {Simulations} by {Assimilation} of {Satellite} {Stereoscopic} {Imagery}}, volume = {58}, issn = {0043-1397}, url = {https://doi.org/10.1029/2021WR030271}, doi = {10.1029/2021WR030271}, number = {3}, urldate = {2022-03-09}, journal = {Water Resources Research}, author = {Deschamps-Berger, C. and Cluzet, B. and Dumont, M. and Lafaysse, M. and Berthier, E. and Fanise, P. and Gascoin, S.}, month = mar, year = {2022}, note = {Publisher: John Wiley \& Sons, Ltd}, keywords = {remote sensing, photogrammetry, modeling, snow cover, assimilation, ungauged basins}, pages = {e2021WR030271}, annote = {https://doi.org/10.1029/2021WR030271}, } @article{hugonnet2022uncertainty, title={Uncertainty analysis of digital elevation models by spatial inference from stable terrain}, author={Hugonnet, Romain and Brun, Fanny and Berthier, Etienne and Dehecq, Amaury and Mannerfelt, Erik Schytt and Eckert, Nicolas and Farinotti, Daniel}, journal={IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing}, volume={15}, pages={6456--6472}, year={2022}, publisher={IEEE} } @article{volat2022digital, 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}, author={Volat, Matthieu and Quantin-Nataf, Cathy and Dehecq, Amaury}, journal={Planetary and Space Science}, volume={222}, pages={105552}, year={2022}, publisher={Elsevier}, doi={10.1016/j.pss.2022.105552} } @Article{rs15163950, AUTHOR = {Palaseanu-Lovejoy, Monica and Alexandrov, Oleg and Danielson, Jeff and Storlazzi, Curt}, TITLE = {SaTSeaD: Satellite Triangulated Sea Depth Open-Source Bathymetry Module for NASA Ames Stereo Pipeline}, JOURNAL = {Remote Sensing}, VOLUME = {15}, YEAR = {2023}, NUMBER = {16}, ARTICLE-NUMBER = {3950}, URL = {https://www.mdpi.com/2072-4292/15/16/3950}, ISSN = {2072-4292}, ABSTRACT = {}, DOI = {10.3390/rs15163950} } @article{jindal2024measuring, title={Measuring erosional and depositional patterns across Comet 67P's Imhotep region}, 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}, journal={Journal of Geophysical Research: Planets}, volume={129}, number={2}, pages={e2023JE008089}, year={2024}, publisher={Wiley Online Library}, doi = {https://doi.org/10.1029/2023JE008089} } @ARTICLE{Bhushan2024-rx, title = "Deriving seasonal and annual surface mass balance for debris-covered glaciers from flow-corrected satellite stereo {DEM} time series", author = "Bhushan, Shashank and Shean, David and Hu, Jyun-Yi Michelle and Guillet, Gr{\'e}goire and Rounce, David Robert", journal = "Journal of Glaciology", publisher = "Cambridge University Press (CUP)", volume = 70, number = "e6", year = 2024, language = "en", doi = {https://doi.org/10.1017/jog.2024.57}, } @inproceedings{Leite2024, title = {Spaceborne Lidar and Stereogrammetry Data Fusion to Predict Aboveground Biomass in Tropical Forests}, url = {http://dx.doi.org/10.1109/igarss53475.2024.10641914}, DOI = {10.1109/igarss53475.2024.10641914}, booktitle = {IGARSS 2024 - 2024 IEEE International Geoscience and Remote Sensing Symposium}, publisher = {IEEE}, 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.}, year = {2024}, month = jul, pages = {3592–3595} } @article{Hu2023, title = {Six Consecutive Seasons of High‐Resolution Mountain Snow Depth Maps From Satellite Stereo Imagery}, volume = {50}, ISSN = {1944-8007}, url = {http://dx.doi.org/10.1029/2023gl104871}, DOI = {10.1029/2023gl104871}, number = {24}, journal = {Geophysical Research Letters}, publisher = {American Geophysical Union (AGU)}, author = {Hu, J. Michelle and Shean, David and Bhushan, Shashank}, year = {2023}, month = dec } @article{Zheng2023, title = {GLAcier Feature Tracking testkit (GLAFT): A statistically- and physically-based framework for evaluating glacier velocity products derived from satellite image feature tracking}, url = {http://dx.doi.org/10.5194/tc-2023-38}, DOI = {10.5194/tc-2023-38}, journal = {The Cryosphere}, publisher = {Copernicus GmbH}, 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}, year = {2023}, month = apr } @article{Knuth2023, title = {Historical Structure from Motion (HSfM): Automated processing of historical aerial photographs for long-term topographic change analysis}, volume = {285}, ISSN = {0034-4257}, url = {http://dx.doi.org/10.1016/j.rse.2022.113379}, DOI = {10.1016/j.rse.2022.113379}, journal = {Remote Sensing of Environment}, publisher = {Elsevier BV}, 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}, year = {2023}, month = feb, pages = {113379} } @article{Bhushan2021, title = {Automated digital elevation model (DEM) generation from very-high-resolution Planet SkySat triplet stereo and video imagery}, volume = {173}, ISSN = {0924-2716}, url = {http://dx.doi.org/10.1016/j.isprsjprs.2020.12.012}, DOI = {10.1016/j.isprsjprs.2020.12.012}, journal = {ISPRS Journal of Photogrammetry and Remote Sensing}, publisher = {Elsevier BV}, author = {Bhushan, Shashank and Shean, David and Alexandrov, Oleg and Henderson, Scott}, year = {2021}, month = mar, pages = {151–165} } ================================================ FILE: docs/papersusingasp.rst ================================================ .. _papersusingasp: Papers that used ASP ==================== These works (papers and conference abstracts) have made use of the Ames Stereo Pipeline to produce their results or enable their studies. If something is missing, `let us know `__, we will add it! You can also make a pull request directly to the `papersusingasp.bib `_ if you are familiar with GitHub and BibTeX. .. bibliography:: papersusingasp.bib :list: bullet :notcited: :style: alpha ================================================ FILE: docs/pinholemodels.rst ================================================ Frame camera models =================== Ames Stereo Pipeline supports a generic Pinhole camera model with several lens distortion models which cover common calibration methods (:numref:`pinholemodels`), the somewhat more complicated panoramic (*optical bar*) camera model (:numref:`panoramic`), and the CSM Frame model, that has several lens distortion implementations (:numref:`csm_frame_def`). Bundle adjustment can refine the intrinsic and extrinsic camera parameters, including the lens distortion model (:numref:`floatingintrinsics`). .. _pinholemodels: Pinhole models -------------- Overview ~~~~~~~~ The generic Pinhole model uses the following parameters: - *fu* = The horizontal focal length in pixels or physical units. - *fv* = The vertical focal length in pixels or physical units. This is usually equal to *fu*. Here, *vertical* means along an image column. - *cu* = The horizontal offset of the principal point of the camera relative to the upper-left image corner, in pixels or physical units. - *cv* = The vertical offset of the principal point of the camera relative to the upper-left image corner, in pixels or physical units. - *pitch* = The size of each pixel. This is required to correctly interpret the four parameters listed above. The pitch is usually 1.0 if the intrinsics are in pixel units, or it is the size of a pixel in millimeters or meters (physical units). Making an image resolution coarser by a factor must be accompanied by *multiplying the pitch by the same factor* (all other parameters including distortion do not change). The focal length is sometimes known as the *principal distance*. The value :math:`cu` is usually approximately half the image width in pixels times the pitch, while :math:`cv` is often the image height in pixels times the pitch, though there are situations when these can be quite different. The camera position and orientation are recorded in the fields *C* and *R*. The underlying mathematical model is in :numref:`pinholemath`. Along with the basic Pinhole camera parameters, a lens distortion model can be added. Normally the distortion model is applied after the pixels are shifted to be relative to the principal point and divided by the focal length, at least for the radial-tangential (Tsai), fisheye, FOV, and RPC models. See the Brown-Conrady model for an exception. The lens distortion models are enumerated in :numref:`pinhole_distortion`. A sample Pinhole model is in :numref:`file_format`. .. _pinhole_distortion: Lens distortion models ~~~~~~~~~~~~~~~~~~~~~~ Here are the lens distortion models supported by ASP. Samples for each model are shown in :numref:`file_format`. Null ^^^^ A placeholder model that applies no distortion. They string ``NULL`` is written in the camera file, after the rotation matrix, in lieu of the distortion model. Tsai ^^^^ A common distortion model :cite:`tsai1987`. In the most recent builds (after ASP 3.3.0) this was made to agree precisely with the `OpenCV radial-tangential lens distortion model `_. This model uses the following parameters: *K1, K2, K3* = Radial distortion parameters. The last one is optional. *P1, P2* = Tangential distortion parameters. The lens distortion operation is computed via an explicit formula, and for undistortion a nonlinear solver is used based on Newton's method. This is the preferred model, unless the lens has a wide field of view, when the Fisheye model should be used (described further below). An example of how these values are specified in a camera file is in :numref:`tsai_dist_example`. Adjustable Tsai ^^^^^^^^^^^^^^^^ A variant of the Tsai model where any number of *K* terms and a skew term (alpha) can be used. Can apply the AgiSoft Lens calibration parameters. An example of how these values are specified in a camera file is in :numref:`adjustable_tsai_dist_example`. .. _brown_conrady: Brown-Conrady ^^^^^^^^^^^^^ This is an older model based on a centering angle :cite:`brown1966,brown1971`. Example usage is in :numref:`sfmgeneric`. This model uses the following parameters: *K1, K2, K3* = Radial distortion parameters. *P1, P2* = Tangential distortion parameters. *xp, yp* = Principal point offset. *phi* = Tangential distortion angle in radians. The following equations describe the distortion. Note that this model uses *non-normalized* pixel units, so they can be in millimeters or meters: .. math:: x = x_{dist} - xp y = y_{dist} - yp r^{2} = x^{2} + y^{2} dr = K_{1}r^{3} + K_{2}r^{5} + K_{3}r^{7} x_{undist} = x + x\frac{dr}{r} - (P_{1}r^{2} +P_{2}r^{4})\sin(phi) y_{undist} = y + y\frac{dr}{r} + (P_{1}r^{2} +P_{2}r^{4})\cos(phi) The formulas start with distorted pixels that are then undistorted. This is not preferable with ASP, as then the distortion operation requires a solver, which makes bundle adjustment and mapprojection very slow. Use instead the Tsai model. A Brown-Conrady model can be converted to a Tsai model with ``convert_pinhole_model`` (:numref:`convert_pinhole_model`). The produced model can be refined with bundle adjustment (:numref:`floatingintrinsics`), if having several images and many interest point matches. An example of how these values are specified in a camera file is in :numref:`brown_conrady_dist_example`. Photometrix ^^^^^^^^^^^ A model matching the conventions used by the Australis software from Photometrix. *K1, K2, K3* = Radial distortion parameters. *P1, P2* = Tangential distortion parameters. *xp, yp* = Principal point offset. *B1, B2* = Unused parameters. The following equations describe the undistortion. Note that this model uses non-normalized pixel units, so they are in mm. .. math:: x = x_{dist} - xp y = y_{dist} - yp r^{2} = x^{2} + y^{2} dr = K_{1}r^{3} + K_{2}r^{5} + K_{3}r^{7} x_{undist} = x + x\frac{dr}{r} + P_{1}(r^{2} +2x^{2}) + 2P_{2}xy y_{undist} = y + y\frac{dr}{r} + P_{2}(r^{2} +2y^{2}) + 2P_{1}xy These formulas also start with distorted pixels and undistort them, just as the Brown-Conrady model. This is not preferred. Use instead the Tsai model. An example of how these values are specified in a camera file is in :numref:`photometrix_dist_example`. Fisheye ^^^^^^^ A four-parameter model for wide field-of-view lenses, with the `same implementation as OpenCV `_ and ``rig_calibrator`` (:numref:`rig_calibrator`). The parameters are named ``k1, k2, k3, k4``. To apply the lens distortion with this model, the undistorted pixels are first shifted relative to the optical center, divided by the focal length, producing pixel (*x, y*), and then the following equations are applied: .. math:: r = \sqrt{x^2 + y^2} \theta = \arctan(r) \theta_d = \theta (1 + k_1 \theta^2 + k_2 \theta^4 + k_3 \theta^6 + k_4 \theta^8) s = \frac{\theta_d}{r} x_{dist} = s \cdot x y_{dist} = s \cdot y These values are then multiplied by the focal length, and the optical center is added back in. The undistortion operation goes in the opposite direction. It requires inverting a nonlinear function, which is done with Newton's method. Care is needed around the origin to avoid division of small numbers. An example of how these values are specified in a camera file is in :numref:`fisheye_dist_example`. FOV ^^^ A field-of-view model with a single parameter, for wide-angle lenses. This is in agreement with ``rig_calibrator`` (:numref:`rig_calibrator`). The implementation is as follows. Let *k1* by the distortion parameter. Given an undistorted pixel, shift it relative to the optical center, divide by the focal length, producing pixel (*x, y*). Then, the following equations are applied: .. math:: p_1 = 1 / k_1 p_2 = 2 \tan(k_1 / 2) r_u = \sqrt{x^2 + y^2} r_d = p_1 \arctan(r_u p_2) s = r_d / r_u x_{dist} = s \cdot x y_{dist} = s \cdot y These values are then multiplied by the focal length, and the optical center is added back in. The undistortion operation goes in the opposite direction, and an explicit formula exists for that. Care is needed around the origin to avoid division of small numbers. An example of how *k1* is specified in a camera file is in :numref:`fov_dist_example`. .. _rpc_distortion: RPC ^^^ A rational polynomial coefficient (RPC) model is employed for distortion. The degree can be arbitrary. This is different than going from ground to image coordinates via RPC (:numref:`rpc`). In this model, the transform from undistorted *normalized* pixels :math:`(x, y)` to distorted normalized pixels is via the formulas .. math:: x_{dist} = \frac{P_1(x, y)}{Q_1(x, y)} y_{dist} = \frac{P_2(x, y)}{Q_2(x, y)} The functions in the numerator and denominator are polynomials in :math:`x` and :math:`y` with certain coefficients. The degree of polynomials can be any positive integer. A degree of 3 or 4 is usually more than sufficient. The inputs and output pixels are normalized, that is, shifted relative to the optical center, and (in the most latest builds) are also divided by the focal length. Such normalizations are applied before distortion / undistortion operations, and then undone after them. This is consistent with the radial-tangential and fisheye models. RPC distortion models can be generated as approximations to other pre-existing models with the tool ``convert_pinhole_model`` (:numref:`convert_pinhole_model`). In the latest builds, the RPC undistortion is computed via a solver based on Newton's method, as for the fisheye lens distortion model. An illustration for how to use the RPC lens distortion is in :numref:`ba_rpc_distortion`. An example of how these values are specified in a camera file is in :numref:`rpc_dist_example`. .. _file_format: File formats ~~~~~~~~~~~~ ASP Pinhole model files are written in an easy to work with plain text format using the extension ``.tsai``. A sample file is shown below. :: VERSION_4 PINHOLE fu = 28.429 fv = 28.429 cu = 17.9712 cv = 11.9808 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 266.943 -105.583 -2.14189 R = 0.0825447 0.996303 -0.0238243 -0.996008 0.0832884 0.0321213 0.0339869 0.0210777 0.9992 pitch = 0.0064 TSAI k1 = -0.094196634563 k2 = 0.115036424262 k3 = -0.032238313341 p1 = -0.000256622541 p2 = -0.000353613460 The first half of the file is the same for all Pinhole models: * ``VERSION_X`` A header line used to track the format of the file. Version 4 expects the ``PINHOLE`` or ``OPTICAL_BAR`` line next. For version 3 these should not be present and the camera is assumed to be a Pinhole model. * ``PINHOLE`` The type of camera model, so that other types can be stored with the .tsai extension (for version 4). * ``fu, fv, cu, cv`` The first four intrinsic parameters described in the previous section. * ``u, v, w`` directions. These allow for additional permutations and flips of the axes of the camera coordinates. By default, the positive column direction aligns with x, the positive row direction aligns with y, and downward into the image aligns with z. It is suggested to avoid adjusting these and modify the rotation matrix instead. * ``C`` The location of the camera center, usually in the geocentric coordinate system (GCC/ECEF). * ``R`` The rotation matrix describing the camera's absolute pose in the world coordinate system (camera-to-world rotation, :numref:`pinholemath`). * ``pitch`` The pitch intrinsic parameter described in the previous section. The second half of the file describes the lens distortion model. The name of the model appears first, followed by a list of model parameters. Partial samples of each format are shown below. *The part up to and including the line having the pitch is the same for all models and not shown in the examples.* .. _null_dist_example: Null ^^^^ :: NULL No lens distortion. .. _tsai_dist_example: Tsai ^^^^ :: TSAI k1 = 1.31024e-04 k2 = -2.05354e-07 p1 = 0.5 p2 = 0.4 k3 = 1e-3 This is the same as the radial-tangential distortion model in OpenCV. The ``k3`` parameter is optional in the Tsai model. If not set, its value is 0. Internally it is stored last in the distortion vector. The option ``--fixed-distortion-indices`` can keep some of these parameters fixed during bundle adjustment (:numref:`ba_options`). .. _adjustable_tsai_dist_example: Adjustable Tsai ^^^^^^^^^^^^^^^ :: AdjustableTSAI Radial Coeff: Vector3(1.31024e-04, 1.31024e-07, 1.31024e-08) Tangential Coeff: Vector2(-2.05354e-07, 1.05354e-07) Alpha: 0.4 .. _brown_conrady_dist_example: Brown-Conrady ^^^^^^^^^^^^^ :: BrownConrady xp = 0.5 yp = 0.4 k1 = 1.31024e-04 k2 = -2.05354e-07 k3 = 1.31024e-08 p1 = 0.5 p2 = 0.4 phi = 0.001 .. _photometrix_dist_example: Photometrix ^^^^^^^^^^^ :: Photometrix xp = 0.004 yp = -0.191 k1 = 1.31024e-04 k2 = -2.05354e-07 k3 = -5.28558e-011 p1 = 7.2359e-006 p2 = 2.2656e-006 b1 = 0.0 b2 = 0.0 .. _fisheye_dist_example: Fisheye ^^^^^^^ :: FISHEYE k1 = -0.036031089735101024 k2 = 0.038013929764216248 k3 = -0.058893197165394658 k4 = 0.02915171342570104 .. _fov_dist_example: FOV ^^^ :: FOV k1 = 1.0001 .. _rpc_dist_example: RPC ^^^ :: RPC rpc_degree = 1 distortion_num_x = 0 1 0 distortion_den_x = 1 0 0 distortion_num_y = 0 0 1 distortion_den_y = 1 0 0 This sample RPC lens distortion model represents the case of no distortion, when the degree of the polynomials is 1, and both the distortion and undistortion formula leave the pixels unchanged, that is, the distortion transform is .. 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). In general, if the degree of the polynomials is :math:`n`, there are :math:`2(n+1)(n+2)` coefficients. The zero-th degree coefficients in the denominator are always set to 1. Notes ~~~~~ For several years Ames Stereo Pipeline generated Pinhole files in the binary ``.pinhole`` format. That format is no longer supported. Also in the past Ames Stereo Pipeline has generated a shorter version of the current file format, also with the extension ``.tsai``, which only supported the TSAI lens distortion model. Existing files in that format can still be used by ASP. Note that the ``orbitviz`` tool can be useful for checking the formatting of ``.tsai`` files you create and to estimate the position and orientation. To inspect the orientation use the optional ``.dae`` model file input option and observe the rotation of the 3D model. .. _pinholemath: How the pinhole model is applied ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As mentioned in :numref:`pinholemodels`, the ASP Pinhole models store the focal length as :math:`fu` and :math:`fv`, the optical center :math:`(cu, cv)` (which is the pixel location at which the ray coming from the center of the camera is perpendicular to the image plane, in units of the pixel pitch), the vector :math:`C` which is the camera center in the world coordinate system (such as ECEF, so body-fixed), and the matrix :math:`R` that is the transform from camera to world coordinates. To go in more detail, a point :math:`Q` in the camera coordinate system gets transformed to a point :math:`P` in the world coordinate system via: .. math:: P = RQ + C Hence, to go from world to camera coordinates one does: .. math:: Q = R^{-1} P - R^{-1} C From here the ``undistorted`` pixel location is computed as: .. math:: \frac{1}{p} \left(fu \frac{Q_1}{Q_3} + cu, fv \frac{Q_2}{Q_3} + cv\right) where :math:`p` is the pixel pitch. Next, a distortion model may be applied, as discussed earlier. .. _panoramic: Panoramic Camera Model ---------------------- ASP also supports a simple Panoramic (OpticalBar) camera model for use with images such as the declassified Corona KH4 (:numref:`kh4`) and KH9 (:numref:`kh9`) images . It implements the model from :cite:`schenk2003rigorous` with the motion compensation from :cite:`sohn2004mathematical`. The latest ASP build has further improvements (:numref:`ghuffar_method`). Such a model looks as follows: :: VERSION_4 OPTICAL_BAR image_size = 110507 7904 image_center = 55253.5 3952 pitch = 7.0e-06 f = 0.61000001430511475 scan_time = 0.5 forward_tilt = -0.261799 iC = -1047140.9611702315 5508464.4323527571 3340425.4078937685 iR = -0.96635634448923746 -0.16918164442572045 0.1937343197650008 -0.23427205529446918 0.26804084264169648 -0.93448954557235941 0.10616976770014927 -0.94843643849513648 -0.29865750042675621 speed = 7700 mean_earth_radius = 6371000 mean_surface_elevation = 4000 motion_compensation_factor = 1.0 scan_dir = left Here, the image size and center are given in pixels, with the width followed by the height. The pixel pitch and focal length ``f`` are in meters. The scan time is seconds, the forward tilt is in radians, the speed is in meters per second, and the Earth radius and mean surface elevation are in meters. The initial camera center ``iC`` is in meters (in ECEF coordinates), and the rotation matrix ``iR`` stores the absolute pose, that is, the camera-to-world rotation. This is analogous to the ``C`` and ``R`` fields in the Tsai model (:numref:`pinholemodels`). The ``scan_dir`` must be set to ``left`` or ``right``. The values ``scan_dir`` and ``use_motion_compensation`` control how the sensor model accounts accounts for the motion of the satellite during the image scan. Without the benefit of detailed historical documents it may require experimentation to find the good initial values for these cameras. When using ``bundle_adjust`` (:numref:`floatingintrinsics`), the intrinsic parameters that are solved for are ``speed``, ``motion_compensation_factor``, and ``scan_time``, as part of the ``other_intrinsics`` group, and also the focal length and optical center (image center). The option in ``bundle_adjust`` that controls these is ``--intrinsics-to-float`` (:numref:`ba_options`). An example of solving for intrinsics is in :numref:`kh9`. The ``convert_pinhole_model`` program (:numref:`convert_pinhole_model`) can convert a Panoramic (optical bar) model to a Pinhole model with lens distortion. The resulting model is an approximation, but can help give some intuition about the optical bar model. The ``cam_gen`` program can fit a CSM linescan camera to an optical bar camera (:numref:`opticalbar2csm`). .. _csm_frame_def: CSM frame camera ---------------- ASP supports the CSM (:numref:`csm`) frame camera model. This is analogous to the ASP Pinhole model (:numref:`pinholemodels`). The CSM frame camera model has its own collection of lens distortion models. Those include the `OpenCV radial-tangential distortion model `_ (it has 5 parameters, in the order k1, k2, p1, p2, k3), *radial distortion*, with 3 coeffecients, k1, k2, k3, and *transverse* distortion, which is a pair of full polynomials of degree 3 in both x and y (20 coefficients), and various other `specialized models `_. The Pinhole model with no distortion or with radial-tangential (tsai) distortion is equivalent to the CSM frame camera model with the same distortion model and values. This can be verified with ``cam_test`` (:numref:`cam_test`). In the CSM .json model state files (:numref:`csm_state`), the radial, transverse and radial-tangential distortion models have ``m_distortionType`` set to the values of 0, 1, and 7, respectively, with ``m_opticalDistCoeffs`` having the distortion parameters. ASP's ``cam_gen`` program (:numref:`cam_gen_frame`) can find the best-fit CSM frame camera model with these lens distortion models. Then bundle adjustment can be employed to refine the intrinsic and extrinsic camera parameters (:numref:`ba_frame_linescan`). The ``sat_sim`` program (:numref:`sat_sim`) can create CSM frame cameras simulating a satellite in orbit. ================================================ FILE: docs/requirements.txt ================================================ sphinxcontrib-bibtex ================================================ FILE: docs/sfm.rst ================================================ .. _sfm: About SfM --------- This chapter discusses how to create a terrain model (DEM) with Structure-from-Motion (SfM) if there exist two or more images and the camera models may not be fully known. This can be useful with aerial, hand-held, and historical images. If the images have known metadata, such as stored in the EXIF header or from other sources, SfM can be avoided. That is discussed in the UAS example (:numref:`sfm_uas`). If preexisting orthoimages and DEMs are available, it is possible to also avoid SfM by first creating a GCP file (:numref:`bagcp`) and then the camera models based on that (:numref:`camera_solve_gcp`). If the longitude and latitude of the corners of all images are known, see :numref:`cam_gen`. Camera solving overview ----------------------- The ``camera_solve`` program (:numref:`camera_solve`) offers several ways to find the pose of frame camera images that do not come with any attached pose metadata, or when information may be incomplete or inaccurate. The ``camera_solve`` program is a Python script invoking two other tools that we ship. The first of these is `TheiaSfM `_. It generates initial camera position estimates in a local coordinate space. The second one is ``bundle_adjust`` (:numref:`bundle_adjust`). This program improves the solution to account for lens distortion and transforms the solution from local to global coordinates by making use of additional input data. The ``camera_solve`` program only solves for the extrinsic camera parameters (camera position and orientation) and the user must provide intrinsic camera information, such as focal length, optical center, and distortion parameters. The ``camera_calibrate`` tool (see :numref:`camera_calibrate`) can solve for intrinsic parameters if you have access to the camera in question. The ``rig_calibrator`` (:numref:`rig_calibrator`) program can calibrate a rig with one more cameras based on data acquired in situ, without a calibration target. It can handle a mix of optical images and depth clouds. That program has its own SfM script called ``theia_sfm`` (:numref:`theia_sfm`). The ``bundle_adjust`` program can also solve for the intrinsics, without using a rig or a calibration target. It can optionally constrain the solution against a well-aligned prior terrain (:numref:`floatingintrinsics`). The camera calibration information must be contained in a .tsai pinhole camera model file and must passed in using the ``--calib-file`` option. :numref:`camera_solve_gcp` has an example of a pinhole camera model file and discusses some heuristics for how to guess the intrinsics. A description of our supported pinhole camera models in :numref:`pinholemodels`. In order to transform the camera models from local to world coordinates, one of three pieces of information may be used. These sources are listed below and described in more detail in the examples that follow: - A set of ground control points (:numref:`bagcp`). GCP can also be used to bypass SfM altogether, if there are many (:numref:`camera_solve_gcp`). - A set of estimated camera positions (perhaps from a GPS unit) stored in a csv file (see :numref:`sfmicebridge`). - A DEM or lidar datset that a local point cloud can be registered to using ``pc_align`` (:numref:`pc_align`). This method can be more accurate if estimated camera positions are also used. Power users can tweak the individual steps that ``camera_solve`` goes through to optimize their results. This primarily involves setting up a custom flag file for Theia and/or passing in settings to ``bundle_adjust``. .. _sfmgeneric: Example: Apollo 15 Metric Camera -------------------------------- Preparing the inputs ^^^^^^^^^^^^^^^^^^^^ To demonstrate the ability of the Ames Stereo Pipeline to process a generic frame camera we use images from the Apollo 15 Metric camera. The calibration information for this camera is available online and we have accurate digital terrain models we can use to verify our results. First, download with ``wget`` the two images at:: http://apollo.sese.asu.edu/data/metric/AS15/png/AS15-M-0114_MED.png http://apollo.sese.asu.edu/data/metric/AS15/png/AS15-M-0115_MED.png Convert these to TIF:: gdal_translate AS15-M-0114_MED.png AS15-M-0114_MED.tif gdal_translate AS15-M-0115_MED.png AS15-M-0115_MED.tif .. figure:: images/examples/pinhole/AS15-M-combined.png :name: pinhole-a15-input-images The two Apollo 15 images In order to make the example run faster we use downsampled versions of the original images. The images at those links have already been downsampled by a factor of :math:`4 \sqrt{2}` from the original images. This means that the effective pixel size has increased from five microns (0.005 millimeters) to 0.028284 millimeters. The next step is to fill out the rest of the pinhole camera model information we need, based on the `Apollo 15 photographic equipment and mission summary report `_. Looking at the ASP lens distortion models in :numref:`pinholemodels`, we see that the description matches ASP's Brown-Conrady model. This model is, not recommended in general, as the distortion operation is slow (see a discussion in :numref:`brown_conrady`), but here we have to conform to what is expected. Using the example in the appendix we can fill out the rest of the sensor model file (metric_model.tsai) so it looks as follows:: VERSION_4 PINHOLE fu = 76.080 fv = 76.080 cu = 57.246816 cv = 57.246816 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0 0 0 R = 1 0 0 0 1 0 0 0 1 pitch = 0.028284 BrownConrady xp = -0.006 yp = -0.002 k1 = -0.13361854e-5 k2 = 0.52261757e-09 k3 = -0.50728336e-13 p1 = -0.54958195e-06 p2 = -0.46089420e-10 phi = 2.9659070 These parameters use units of millimeters so we have to convert the nominal center point of the images from 2024 pixels to units of millimeters. Note that for some older images like these the nominal image center can be checked by looking for some sort of marking around the image borders that indicates where the center should lie. For these pictures there are black triangles at the center positions and they line up nicely with the center of the image. Before we try to solve for the camera positions we can run a simple tool to check the quality of our camera model file:: undistort_image AS15-M-0114_MED.tif metric_model.tsai \ -o corrected_414.tif It is difficult to tell if the distortion model is correct by using this tool but it should be obvious if there are any gross errors in your camera model file such as incorrect units or missing parameters. In this case the tool will fail to run or will produce a significantly distorted image. For certain distortion models the ``undistort_image`` tool may take a long time to run. If your input images are not all from the same camera or were scanned such that the center point is not at the same pixel, you can run ``camera_solve`` with one camera model file per input image. To do so pass a space-separated list of files surrounded by quotes to the ``--calib-file`` option such as ``--calib-file "c1.tsai c2.tsai c3.tsai"``. Creation of cameras in an arbitrary coordinate system ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If we do not see any obvious problems we can go ahead and run the ``camera_solve`` tool:: camera_solve out/ AS15-M-0114_MED.tif AS15-M-0115_MED.tif \ --theia-overrides '--matching_strategy=CASCADE_HASHING' \ --datum D_MOON --calib-file metric_model.tsai The reconstruction can be visualized as:: view_reconstruction --reconstruction out/theia_reconstruction.dat One may need to zoom out to see all cameras. See an illustration in :numref:`view_reconstruction`. :numref:`camera_solve_gcp` discusses how to avoid SfM altogether. .. _sfm_world_coords: Creation of cameras in world coordinates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to generate a useful DEM, we need to move our cameras from local coordinates to global coordinates. The easiest way to do this is to obtain known ground control points (GCPs, :numref:`bagcp`) which can be identified in the frame images. This will allow an accurate positioning of the cameras provided that the GCPs and the camera model parameters are accurate. We use ``stereo_gui`` to create GCP (:numref:`creatinggcp`). The input DEM is generated from LRO NAC images. An arbitrary DEM for the desired planet can make do for the purpose of transforming the cameras to plausible orbital coordinates. (See :numref:`camera_solve_gcp` for more on GCP.) For GCP to be usable, they can be one of two kinds. The preferred option is to have at least three GCP, with each seen in at least two images. Then their triangulated positions can be determined in local coordinates and in global (world) coordinates, and ``bundle_adjust`` will be able to compute the transform between these coordinate systems, and convert the cameras to world coordinates. The ``camera_solve`` program will automatically attempt this transformation. This amounts to invoking ``bundle_adjust`` with the option ``--transform-cameras-with-shared-gcp``. If this is not possible, then at least two of the images should have at least three GCP each, and they need not be shared among the images. For example, for each image the longitude, latitude, and height of each of its four corners can be known. Then, one can pass such a GCP file to ``camera_solve`` together with the flag:: --bundle-adjust-params "--transform-cameras-using-gcp" This may not be as robust as the earlier approach. Consider the option ``--fix-gcp-xyz``, to not move the GCP during optimization. Solving for cameras when using GCP:: camera_solve out_gcp/ \ AS15-M-0114_MED.tif AS15-M-0115_MED.tif \ --datum D_MOON --calib-file metric_model.tsai \ --theia-overrides '--matching_strategy=CASCADE_HASHING' \ --gcp-file ground_control_points.gcp Examine the lines ending in ``# GCP`` in the file:: out_gcp/asp_ba_out-final_residuals_pointmap.csv (:numref:`ba_err_per_point`). If the residuals are no more than a handful pixels, and ideally less than a pixel, the GCP were used successfully. Increase the value of ``--robust-threshold`` in ``bundle_adjust`` (via ``--bundle-adjust-params`` in ``camera_solve``) if desired to bring down the big residuals in that file at the expense of increasing the smaller ones. Consider also deleting GCP corresponding to large residuals, as those may be inaccurate. In recent ASP, one or more GCP files can be passed in without setting ``--gcp-file``. They should end in ``.gcp``. Running stereo ^^^^^^^^^^^^^^ :: parallel_stereo \ AS15-M-0114_MED.tif \ AS15-M-0115_MED.tif \ out_gcp/AS15-M-0114_MED.tif.final.tsai \ out_gcp/AS15-M-0115_MED.tif.final.tsai \ -t pinhole \ --skip-rough-homography \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --sgm-collar-size 256 \ s_global/out Create a terrain model and orthoimage:: point2dem -r moon \ --stereographic --auto-proj-center \ s_global/out-PC.tif \ --orthoimage s_global/out-L.tif \ --errorimage See :numref:`parallel_stereo` and :numref:`point2dem` for more information on the options used here. The error image can be useful to see if the intrinsics are good. Big errors in the corners of the images may indicate that the intrinsics need refinement (:numref:`floatingintrinsics`). .. figure:: images/examples/pinhole/a15_fig.png :name: pinhole-a15-result-image Produced hillshaded DEM (left) and orthoimage (right). See :numref:`stereo_alg_fig` for a comparison of stereo algorithms. :numref:`nextsteps` will discuss the ``parallel_stereo`` program in more detail and the other tools in ASP. .. _sfm_multiview: Multiview reconstruction ^^^^^^^^^^^^^^^^^^^^^^^^ The ``bundle_adjust`` program produces a report file having the convergence angle and number of matches between any two images in a given set (:numref:`ba_conv_angle`). That data can be used to decide on promising stereo pairs to consider (:numref:`stereo_pairs`). Pairwise stereo and DEM creation can be run, as in :numref:`tutorial`. The DEMs can be mosaicked together with ``dem_mosaic`` (:numref:`dem_mosaic`). To give more weight in mosaicking to DEMs with a larger convergence angle, see :numref:`dem_mosaic_external_weights`. The input DEMs should agree quite well if the intrinsics are accurate, there is enough overlap between the images, many interest point matches were found, and the cameras were bundle-adjusted. Refining intrinsics is discussed in :numref:`floatingintrinsics`. The produced mosaicked DEM (and cameras) can be aligned to a reference terrain with ``pc_align`` (:numref:`pc_align`). The creation of a fused mesh is discussed in :numref:`multi_stereo`. .. _sfmicebridge: Example: IceBridge DMS Camera ----------------------------- The DMS (Digital Mapping System) Camera is a frame camera flown on as part of the `NASA IceBridge program `_, whose goal was to collect images of polar terrain. The approach is, with a few exceptions, very similar to the one for the Apollo Metric camera. The DMS images are available for download at the `IceBridge ftp site `_. A list of the available data types can be found at the `mission data summary `_ page. Several ways of creating cameras are discussed below, with or without SfM. SfM approach ^^^^^^^^^^^^ This example uses data from the November 5, 2009 flight over Antarctica. The following camera model (icebridge_model.tsai) was used (see :numref:`pinholemodels` on Pinhole camera models):: VERSION_4 PINHOLE fu = 28.429 fv = 28.429 cu = 17.9712 cv = 11.9808 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0 0 0 R = 1 0 0 0 1 0 0 0 1 pitch = 0.0064 Photometrix xp = 0.004 yp = -0.191 k1 = 1.31024e-04 k2 = -2.05354e-07 k3 = -5.28558e-011 p1 = 7.2359e-006 p2 = 2.2656e-006 b1 = 0.0 b2 = 0.0 Note that these images are RGB format which is not supported by all ASP tools. To use the files with ASP, first convert them to single channel images using a tool such as ImageMagick's ``convert``, ``gdal_translate``, or ``gdal_edit.py``. Different conversion methods may produce slightly different results depending on the contents of your input images. Some conversion command examples are shown below:: convert rgb.jpg -colorspace Gray gray.jpg gdal_calc.py --overwrite --type=Float32 --NoDataValue=-32768 \ -A rgb.tif --A_band=1 -B rgb.tif --B_band=2 -C rgb.tif \ --C_band=3 --outfile=gray.tif --calc="A*0.2989+B*0.5870+C*0.1140" gdal_translate -b 1 rgb.jpg gray.jpg In the third command we used ``gdal_translate`` to pick a single band rather than combining the three. This tool is shipped with ASP (:numref:`gdal_tools`). Obtaining ground control points for icy locations on Earth can be particularly difficult because they are not well surveyed or because the terrain shifts over time. This may force you to use estimated camera positions to convert the local camera models into global coordinates. To make this easier for IceBridge data sets, ASP provides the ``icebridge_kmz_to_csv`` tool (see :numref:`icebridgekmztocsv`) which extracts a list of estimated camera positions (in ECEF coordinates) from the kmz files available for each IceBridge flight at http://asapdata.arc.nasa.gov/dms/missions.html. For such logic based on camera positions to work well, the camera positions must not be along a line, as then the 3D transform computed based on these positions will not be well-defined. Another option which is useful when processing IceBridge data is the ``--position-filter-dist`` option for ``bundle_adjust`` (measured in meters). IceBridge data sets contain a large number of images and when processing many at once you can significantly decrease your processing time by using this option to limit interest-point matching to image pairs which are actually close enough to overlap. A good way to determine what distance to use is to load the camera position kmz file from their website into Google Earth and use the ruler tool to measure the distance between a pair of frames that are as far apart as you want to match. Commands using these options may look like this:: icebridge_kmz_to_csv 1000123_DMS_Frame_Events.kmz \ camera_positions.csv camera_solve out \ 2009_11_05_00667.JPG 2009_11_05_00668.JPG \ 2009_11_05_00669.JPG 2009_11_05_00670.JPG \ 2009_11_05_02947.JPG 2009_11_05_02948.JPG \ 2009_11_05_02949.JPG 2009_11_05_02950.JPG \ 2009_11_05_01381.JPG 2009_11_05_01382.JPG \ --theia-overrides '--matching_strategy=CASCADE_HASHING' \ --datum WGS84 --calib-file icebridge_model.tsai \ --bundle-adjust-params \ '--no-datum --camera-positions camera_positions.csv --csv-format "1:file 2:lon 3:lat 4:height_above_datum" --position-filter-dist 0' Run ``orbitviz`` (:numref:`orbitviz`) to visualize the camera positions:: orbitviz out --load-camera-solve --hide-labels \ -r wgs84 -t nadirpinhole Cameras from measurements ^^^^^^^^^^^^^^^^^^^^^^^^^ For some Earth missions the positions and orientations of the cameras are known. The cameras can then be found as in :numref:`cam_gen_extrinsics`. Cameras from GCP ^^^^^^^^^^^^^^^^ See :numref:`camera_solve_gcp`. Cameras from orthoimages ^^^^^^^^^^^^^^^^^^^^^^^^ Cameras can be created based on orthoimages, if available, such as for IceBridge. The ``ortho2pinhole`` (:numref:`ortho2pinhole`) tool is used. Later, the obtained cameras can be bundle-adjusted. Example for grayscale images:: ortho2pinhole raw_image.tif ortho_image.tif \ icebridge_model.tsai output_pinhole.tsai This needs the camera height above the datum. If not specified, it will be read from the orthoimage metadata, if set there. See this tool's manual for more information. .. figure:: images/examples/pinhole/icebridge_camera_results.png :name: pinhole-icebridge-camera-results Left: Measuring the distance between estimated frame locations using Google Earth and an IceBridge kmz file. The kmz file is from the IceBridge website with no modifications. A well-chosen position filter distance will mostly limit image IP matching in this case to each image's immediate "neighbors". Right: Display of ``camera_solve`` results for ten IceBridge images using ``orbitviz``. Some IceBridge flights contain data from the Land, Vegetation, and Ice Sensor (LVIS) lidar which can be used to register DEMs created using DMS images. LVIS data can be downloaded at ftp://n5eil01u.ecs.nsidc.org/SAN2/ICEBRIDGE/ILVIS2.001/. The lidar data comes in plain text files that ``pc_align`` and ``point2dem`` can parse using the following option:: --csv-format "5:lat 4:lon 6:height_above_datum" ASP provides the ``lvis2kml`` tool to help visualize the coverage and terrain contained in LVIS files, see :numref:`lvis2kml` for details. The LVIS lidar coverage is sparse compared to the image coverage and you will have difficulty getting a good registration unless the region has terrain features such as hills or you are registering very large point clouds that overlap with the lidar coverage across a wide area. Otherwise ``pc_align`` will simply slide the flat terrain to an incorrect location to produce a low-error fit with the narrow lidar tracks. This test case was specifically chosen to provide strong terrain features to make alignment more accurate but ``pc_align`` still failed to produce a good fit until the lidar point cloud was converted into a smoothed DEM. Terrain creation ^^^^^^^^^^^^^^^^ Run ``parallel_stereo`` (:numref:`parallel_stereo`) on the DMS images:: parallel_stereo -t nadirpinhole \ --sgm-collar-size 256 \ --skip-rough-homography \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --sgm-collar-size 256 \ 2009_11_05_02948.JPG \ 2009_11_05_02949.JPG \ out/2009_11_05_02948.JPG.final.tsai \ out/2009_11_05_02949.JPG.final.tsai \ st_run/out Create a DEM and orthoimage from the stereo results with ``point2dem`` (:numref:`point2dem`):: point2dem --datum WGS_1984 \ --auto-proj-center \ st_run/out-PC.tif \ --orthoimage st_run/out-L.tif This will auto-guess an UTM or polar stereographic projection (:numref:`point2dem_proj`). Colorize and hillshade the DEM:: colormap --hillshade st_run/out-DEM.tif Create a DEM from the LVIS data:: point2dem ILVIS2_AQ2009_1105_R1408_055812.TXT \ --datum WGS_1984 \ --auto-proj-center \ --csv-format "5:lat 4:lon 6:height_above_datum" \ --tr 30 \ --search-radius-factor 2.0 \ -o lvis How to combine multiple DEMs is described in :numref:`sfm_multiview`. Terrain alignment ^^^^^^^^^^^^^^^^^ Align the produced stereo point cloud to the LVIS data using ``pc_align`` (:numref:`pc_align`):: pc_align --max-displacement 1000 \ st_run/out-DEM.tif ILVIS2_AQ2009_1105_R1408_055812.TXT \ --csv-format "5:lat 4:lon 6:height_above_datum" \ --save-inv-transformed-reference-points \ --datum wgs84 --outlier-ratio 0.55 \ -o align_run/out A DEM can be produced from the aligned point cloud, that can then be overlaid on top of the LVIS DEM. For processing multiple images, see :numref:`sfm_multiview`. .. figure:: images/examples/pinhole/icebridge_dem.png :name: pinhole-icebridge :alt: A DEM and orthoimage produced with IceBridge data A DEM and orthoimage produced with IceBridge data. The wavy artifacts in the bottom-right should go away if running a second-pass stereo with mapprojected images (:numref:`mapproj-example`), with a blurred version of this DEM as an initial guess. Other IceBridge flights contain data from the Airborne Topographic Mapper (ATM) lidar sensor. Data from this sensor comes packed in one of several formats (variants of .qi or .h5) so ASP provides the ``extract_icebridge_ATM_points`` tool to convert them into plain text files, which later can be read into other ASP tools using the formatting:: --csv-format "1:lat 2:lon 3:height_above_datum" To run the tool, just pass in the name of the input file as an argument and a new file with a csv extension will be created in the same directory. Using the ATM sensor data is similar to using the LVIS sensor data. For some IceBridge flights, lidar-aligned DEM files generated from the DMS image files are available, see the web page here: http://nsidc.org/data/iodms3 These files are improperly formatted and cannot be used by ASP as is. To correct them, run the ``correct_icebridge_l3_dem`` tool as follows:: correct_icebridge_l3_dem IODMS3_20120315_21152106_07371_DEM.tif \ fixed_dem.tif 1 The third argument should be 1 if the DEM is in the northern hemisphere and 0 otherwise. The corrected DEM files can be used with ASP like any other DEM file. :numref:`nextsteps` will discuss the ``parallel_stereo`` program in more detail and the other tools in ASP. .. _camera_solve_gcp: Solving for pinhole cameras using GCP ------------------------------------- A quick alternative to SfM with ``camera_solve`` is to create correctly oriented cameras using ground control points (GCP, :numref:`bagcp`), an initial camera having intrinsics only, and bundle adjustment. Here we outline this process. GCP creation ^^^^^^^^^^^^ Given the camera image, a similar-enough orthoimage, and a DEM, the ``gcp_gen`` program (:numref:`gcp_gen`) can create a GCP file for it:: gcp_gen --camera-image img.tif \ --ortho-image ortho.tif \ --dem dem.tif \ --output-prefix run/run \ --output-gcp gcp.gcp If only a DEM is known, but in which one could visually discern roughly the same features seen in the camera image, GCP can be created with point-and-click in ``stereo_gui`` (:numref:`creatinggcp`). Such an input DEM can be found as shown in :numref:`initial_terrain`. If the geolocations of image corners are known, use instead ``cam_gen`` (:numref:`cam_gen`). .. _cam_from_gcp: Camera creation from GCP ^^^^^^^^^^^^^^^^^^^^^^^^ We use the GCP to find the camera pose. For that, first create a Pinhole camera (:numref:`pinholemodels`) file, say called ``init.tsai``, with only the intrinsics (focal length and optical center), and using trivial values for the camera center and rotation matrix:: VERSION_4 PINHOLE fu = 28.429 fv = 28.429 cu = 17.9712 cv = 11.9808 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0 0 0 R = 1 0 0 0 1 0 0 0 1 pitch = 0.0064 NULL The entries ``fu``, ``fv``, ``cu``, ``cv``, amd ``pitch`` must be in the same units (millimeters or pixels). When the units are pixels, the pixel pitch must be set to 1. The optical center can be half the image dimensions, and the focal length can be determined using the observation that the ratio of focal length to image width in pixels is the same as the ratio of camera elevation to ground footprint width in meters. Here we assumed no distortion. Distortion can be refined later, if needed (:numref:`floatingintrinsics`). For each camera image, run bundle adjustment with this data:: bundle_adjust -t nadirpinhole \ img.tif init.tsai gcp.gcp \ --datum WGS84 \ --inline-adjustments \ --init-camera-using-gcp \ --camera-weight 0 \ --num-iterations 100 \ --robust-threshold 2 \ -o ba/run This will write the desired correctly oriented camera file as ``ba/run-init.tsai``. The process can be repeated for each camera with an individual output prefix. The datum field must be adjusted depending on the planet. .. _cam_gcp_validation: Validation ^^^^^^^^^^ It is very important to inspect the file:: ba/run-final_residuals_pointmap.csv and look at the 4th column. Those will be the pixel residuals (reprojection error into cameras). They should be under a few pixels each, otherwise there is a mistake. If bundle adjustment is invoked with a positive number of iterations, and with a small value for the robust threshold, it tends to optimize only some of the corners and ignore the others, resulting in a large reprojection error, which is not desirable. If however, this threshold is too large, it may try to optimize GCP that may be outliers, resulting in a poorly placed camera. One can use the bundle adjustment option ``--fix-gcp-xyz`` to not move the GCP during optimization, hence forcing the cameras to move more to conform to them. Validate the produced camera with ``mapproject``:: mapproject dem.tif img.tif ba/run-init.tsai img.map.tif and overlay the result on top of the DEM. ASP provides a tool named ``cam_gen`` which can also create a pinhole camera as above, and, in addition, is able to extract the heights of the corners from a DEM (:numref:`cam_gen`). See also the ``bundle_adjust`` option ``--transform-cameras-with-shared-gcp``. This applies a wholesale transform to a self-consistent collection of cameras. .. _findintrinsics: Refining the camera poses and intrinsics ---------------------------------------- The poses of the produced camera models can be jointly optimized with ``bundle_adjust`` (:numref:`bundle_adjust`). Optionally, the intrinsics can be refined as well. Detailed recipes are in :numref:`floatingintrinsics`. .. _sfm_uas: UAS example ----------- The following example demonstrates how to produce camera models and a joint DEM from images taken by a UAS (Unmanned Aerial System). It is assumed that: - The images store in the EXIF metadata the camera center longitude, latitude, height above the datum, and yaw angle (the ``GPSImgDirection`` field), relative to the North direction. Alternatively, this information (and perhaps also camera roll and pitch) is available in a list. - The camera looks generally downward. This is not a strong assumption but makes it easier to determine which images overlap with which. - The camera is Frame (Pinhole) (:numref:`pinholemodels`), with known intrinsics. If those are not known, it is shown below how to estimate them and then refine them later. The metadata is extracted from the EXIF header with the ``sfm_proc`` program (:numref:`sfm_proc`):: ls images/*.JPG > images/image_list.txt sfm_proc \ --image-list images/image_list.txt \ --out-dir cameras This writes the file ``cameras/extrinsics.txt``, having the above-mentioned information. This file can also be created manually if the needed data are stored in other ways. The format of this file and how to use the ``cam_gen`` program to create the camera models is shown in :numref:`cam_gen_extrinsics`. That program needs the camera intrinsics, including the focal length and optical center in pixel units, and the lens distortion parameters. If the focal length is not known, it is suggested to estimate it from the ``FocalLengthIn35mmFilm`` field in the EXIF header, if available. For example, if this has the value ``46``, and the image width is known to be 9248 pixels, the following gives an estimate for the focal length in pixels:: focal_length = 46.0 * 9248.0 / 35.0 = 12154.51428571 The optical center can be set to half the image dimensions. The lens distortion coefficients can be set to 0 for an initial estimate. The produced rough camera models can be validated as shown in :numref:`cam_gen_validation`. That will require an external DEM, that can be found as described in :numref:`initial_terrain`, and which may need an adjustment as shown in :numref:`conv_to_ellipsoid`. The camera models can be refined with ``bundle_adjust`` with fixed intrinsics, as shown in :numref:`kaguya_ba_initial_ba`. The intrinsics can be refined later (:numref:`floatingintrinsics`). The images and produced cameras can be used to create and then merge DEMs, per :numref:`sfm_multiview`. The general Structure-from-Motion (SfM) approach is described in :numref:`sfm`. ================================================ FILE: docs/sfs_usage.rst ================================================ .. _sfs_usage: Overview of SfS --------------- ASP provides a tool, named ``sfs`` (:numref:`sfs`), that can improve the level of detail of DEMs created by ASP or any other source using *shape-from-shading* (SfS). This program takes as input one or more images and cameras, a DEM at roughly the same resolution as the images, and returns a refined DEM. The modeling approach is described in :cite:`alexandrov2018multiview`. The ``sfs`` program works with any cameras supported by ASP, for Earth and other planets. The option ``--sun-angles`` can be used to to specify the Sun information for each image. For ISIS and CSM cameras, if this option is not set, the needed information is read from the camera files. The ``sfs`` program can model position-dependent albedo (:numref:`sfs_albedo`), exposure values for each camera, atmospheric haze, shadows in the input images, and regions in the DEM occluded from the Sun. A program named ``parallel_sfs`` is provided (:numref:`parallel_sfs`) that parallelizes ``sfs`` using multiple processes (optionally on multiple machines) by splitting the input DEM into tiles with padding, running ``sfs`` on each tile, and then blending the results. It was used to create DEMs of dimensions 10,000 by 10,000 pixels. .. _sfs_examples: Examples -------- - A single image example with LRO NAC Lunar images (:numref:`sfs_single_image`). - A small example with multiple LRO NAC images (:numref:`sfs_multiview`). - Large-scale SfS with LRO NAC images (:numref:`sfs-lola`). - Kaguya Lunar images (:numref:`sfs_kaguya`). - Earth example, with atmospheric haze (:numref:`sfs_earth`). - CTX Mars example (:numref:`sfs_ctx`). Limitations ----------- This program is experimental. It assumes a certain reflectance model of the surface, which may or may not be accurate for a given setting. ``sfs`` is very sensitive to errors in the position and orientation of the cameras, the accuracy of the initial DEM, and to the value of the weights it uses. ``sfs`` has been tested thoroughly with Lunar LRO NAC datasets. As can be seen below, ``sfs`` returns reasonable results on the Moon as far as 85 degrees and even 89.6 degrees South. SfS was shown to give reasonable results with CTX Mars images (:numref:`sfs_ctx`). The improvement is real, but somewhat modest. An example for Earth is :numref:`sfs_earth`, that shows that our program can give plausible results. It is suggested to invoke this tool with a terrain model that is already reasonably accurate, and with images with diverse illumination conditions registered to it, when ``sfs`` can do fine-level refinements. The program was employed successfully for Mercury (:cite:`bertone2023highly`). Applications for the Moon are described in :cite:`hemmi2025lroc` and :cite:`boatwright2024sfs`. .. _sfs_formulation: Mathematical model ------------------ This program works by minimizing the cost function .. math:: \label{cost} \int\!\! \int \! \sum_k \left[ I_k(\phi(x, y)) - T_k A(x, y) R_k(\phi(x, y)) - H_k\right]^2\, \\ + \mu \left\|\nabla^2 \phi(x, y) \right\|^2 + \lambda \left[ \phi(x, y) - \phi_0(x, y) \right]^2 \, dx\, dy. Here, :math:`I_k(\phi(x, y))` is the :math:`k`-th camera image interpolated at pixels obtained by projecting into the camera 3D points from the terrain :math:`\phi(x, y)`, :math:`T_k` is the :math:`k`-th image exposure, :math:`A(x, y)` is the per-pixel normalized albedo, :math:`R_k(\phi(x, y))` is the reflectance computed from the terrain for :math:`k`-th image, :math:`\left\|\nabla^2 \phi(x, y) \right\|^2` is the sum of squares of all second-order partial derivatives of :math:`\phi`. The term :math:`H_k` is the atmospheric haze, which is assumed to be zero for the Moon but is modeled for Earth and Mars. The value :math:`\mu > 0` is a smoothness weight, and :math:`\lambda > 0` determines how close we should stay to the input terrain :math:`\phi_0` (smaller :math:`\mu` will show more detail but may introduce some artifacts, and smaller :math:`\lambda` may allow for more flexibility in optimization but the terrain may move too far from the input). We use either the regular Lambertian reflectance model, or the Lunar-Lambertian model :cite:`mcewen1991photometric`, more specifically as given in :cite:`lohse2006derivation` (equations (3) and (4)). Also supported is the Hapke model, :cite:`johnson2006spectrophotometric`, :cite:`fernando2013surface`, :cite:`hapke2008bidirectional`, :cite:`hapke1993opposition`. Custom values for the coefficients of these models can be passed to the program. Note that the albedo in the above expression is normalized, its nominal value is 1. The image intensity ideally equals the image exposure times albedo times reflectance, hence the image exposure absorbs any existing constant multiplier. The exposure value for a camera is computed as the average of the image intensity divided by the average reflectance, both computed over the DEM. If the problem is parallelized using ``parallel_sfs``, the exposures are found just once, over the entire DEM, rather than for each tile. The exposures can be optimized while solving for the DEM. It is important to note that the default Lunar-Lambertian model may not be the right choice for other planetary bodies, hence some research may be needed to decide the correct model for your application. .. _fetch_lro_images: How to get images ----------------- We obtain the images from http://wms.lroc.asu.edu/lroc/search (search for EDR images of type NACL and NACR). A faster (but not as complete) interface is provided by http://ode.rsl.wustl.edu/moon/indexproductsearch.aspx. This site allows for bulk downloads, but does not permit datasets bigger than several tens of GB, so several attempts may be necessary. The related site http://ode.rsl.wustl.edu/moon/indextools.aspx?displaypage=lolardr can provide LOLA datasets which can be used as (sparse) ground truth. If desired to use a gridded LOLA DEM as an initial guess, see :numref:`sfs-lola`. We advise the following strategy for picking images. First choose a small longitude-latitude window in which to perform a search for images. Pick two images that are very close in time and with a big amount of overlap (ideally they would have consecutive orbit numbers). A good convergence angle is expected (:numref:`stereo_pairs`). Those images can be passed to ASP's ``parallel_stereo`` tool to create an initial DEM. Then, search for other images close to the center of the maximum overlap of the first two images. Pick one or more of those, ideally with different illumination conditions than the first two. Those (together with one of the first two images) can be used for SfS. To locate the area of spatial overlap, the images can be map-projected (either with ``cam2map`` with a coarse resolution) or with ``mapproject``, using for example the LOLA DEM as the terrain to project onto, or the DEM obtained from running ``parallel_stereo`` on those images. Then the images can be overlaid as georeferenced images in ``stereo_gui`` (:numref:`stereo_gui`). A good sanity check is to examine the shadows in various images. If they point in different directions in the images and perhaps also have different lengths, that means that illumination conditions are different enough, which will help constrain the ``sfs`` problem better. An example for how to download and prepare the datasets is shown in :numref:`sfs_single_image`. .. _sfs_isis_vs_csm: ISIS vs CSM models ------------------ CSM (:numref:`csm`) is a modern sensor model which can be used with multiple threads, and can be on the order of 7-15 times faster than the ISIS .cub model it is meant to replace, as benchmarked with ``mapproject``, ``bundle_adjust``, and ``sfs``. Given a set of ISIS .cub camera files it is desired to run SfS on, it is *strongly suggested* to convert them to corresponding CSM models as described in :numref:`create_csm_linescan`. If the CSM models have no more than 0.5 pixels of discrepancy when compared to the .cub cameras, as validated with ``cam_test`` (:numref:`cam_test`), use the CSM models instead of the ISIS ones in all the tools outlined below (``parallel_bundle_adjust``, ``parallel_stereo``, ``mapproject``, and ``parallel_sfs``). The SfS DEMs obtained with these two methods were observed to differ by several millimeters at most, on average, but an evaluation may be necessary for your particular case. This will work only for the datasets with original dimensions, so not together with the ``reduce`` or ``crop`` commands. Any of the commands further down which only use .cub files can be adapted for use with CSM cameras by appending to those commands the CSM .json cameras in the same order as the .cub files, from which only the image information will then be used, with the camera information coming from the .json files. For example, if ``sfs`` is run with an ISIS camera as:: sfs --use-approx-camera-models\ --crop-input-images \ -i input_dem.tif image.cub \ -o sfs_isis/run then, the corresponding command using the CSM model will be:: sfs --crop-input-images \ -i input_dem.tif \ image.cub image.json \ -o sfs_csm/run The option ``--use-approx-camera-models`` is no longer necessary as the CSM model is fast enough. It is however suggested to still keep the ``--crop-input-images`` option. Bundle adjustment saves CSM camera files with adjustments already applied to them, so the resulting cameras can be used without the ``--bundle-adjust-prefix`` option. .. _sfs_single_image: SfS at 1 meter/pixel using a single image ----------------------------------------- In both this and the next sections we will work with LRO NAC images taken close to the Lunar South Pole, at a latitude of 85 degrees South (the tool was tested on equatorial regions as well). We will use four images, M139939938LE, M139946735RE, M173004270LE, and M122270273LE. Data preparation ^^^^^^^^^^^^^^^^ Fetch the images:: wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0005/DATA/SCI/2010267/NAC/M139939938LE.IMG wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0005/DATA/SCI/2010267/NAC/M139946735RE.IMG wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0009/DATA/SCI/2011284/NAC/M173004270LE.IMG wget http://lroc.sese.asu.edu/data/LRO-L-LROC-2-EDR-V1.0/LROLRC_0002/DATA/MAP/2010062/NAC/M122270273LE.IMG We convert these to ISIS cubes, initialize the SPICE kernels, and perform radiometric calibration and echo correction. That is explained in :numref:`lro_nac_no_stitch`. It can be convenient to create preview versions of these datasets, at 10% of original resolution, for the purpose of inspection. That is done as follows:: f=M139939938LE reduce from = ${f}.cal.echo.cub to = ${f}.cal.echo.sub10.cub \ sscale = 10 lscale = 10 For simplicity, we create we create shorter aliases for these images:: ln -s M139939938LE.cal.echo.cub A.cub ln -s M139946735RE.cal.echo.cub B.cub ln -s M173004270LE.cal.echo.cub C.cub ln -s M122270273LE.cal.echo.cub D.cub .. _initial_sfs_dem: Initial DEM creation ^^^^^^^^^^^^^^^^^^^^ The first step is to run bundle adjustment (:numref:`bundle_adjust`) and stereo (:numref:`parallel_stereo`) to create an initial guess DEM. We picked for this the first two of these images. These form a stereo pair (:numref:`stereo_pairs`), that is, they have a reasonable baseline and sufficiently close times of acquisition hence very similar illuminations). These conditions are necessary to obtain a good stereo result. Below we assume CSM cameras are used (:numref:`sfs_isis_vs_csm`). Otherwise the ``.json`` files should be omitted. :: bundle_adjust A.cub B.cub A.json B.json \ --num-iterations 100 -o ba/run parallel_stereo \ --left-image-crop-win 0 7998 2728 2696 \ --right-image-crop-win 0 9377 2733 2505 \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --bundle-adjust-prefix ba/run \ A.cub B.cub A.json B.json \ run_full1/run See :numref:`running-stereo` for a discussion about various speed-vs-quality choices in stereo. See :numref:`mapproj-example` about handling artifacts in steep terrain. The crop windows above were chosen with ``stereo_gui`` (:numref:`stereo_gui`). Next we create a DEM. We use the stereographic projection since this dataset is very close to the South Pole. Normally a projection centered close to area of interest is suggested (:numref:`point2dem_proj`). :: point2dem -r moon --stereographic --proj-lon 0 \ --proj-lat -90 run_full1/run-PC.tif It is very important that the resolution of the DEM be comparable to the ground sample distance (GSD) of the images. This will ensure optimal sampling. SfS can only be run on a DEM with valid data at each grid point. The DEM obtained above should be opened in ``stereo_gui``, and the bounds of a clip having only valid data should be determined (:numref:`image_bounds`). Such a clip is cropped using ``gdal_translate`` (:numref:`gdal_tools`) as:: gdal_translate -projwin -15471.9 150986 -14986.7 150549 \ run_full1/run-DEM.tif run_full1/run-crop-DEM.tif This creates a DEM clip of size 456 |times| 410 pixels. The ``point2dem`` program auto-determines the DEM resolution (grid size), as an estimate of the image *ground sample distance (GSD)*. This is the optimal resolution to run SfS at. If creating your input DEM some other way, it is strongly suggested to use a DEM grid size not too different from the GSD, in order to get the best quality. The ``mapproject`` program (:numref:`mapproject`), when invoked with no input grid size, computes the grid size as the image GSD, and that value can then be used when creating the input SfS DEM. If this DEM has holes, those can be filled in ``dem_mosaic`` (:numref:`dem_mosaic_extrapolate`). The ``dem_mosaic`` program can also apply some blur to attenuate big artifacts (:numref:`dem_mosaic_blur`). Use, for example, ``--dem-blur-sigma 2``. Note that ``sfs`` has a smoothness term which should take care of very small imperfections in the input. See :numref:`sfs_initial_terrain` for how to use a third-party DEM as input to SfS. Then, alignment of the cameras to that DEM is needed. This is a multi-step process, outlined in detail in :numref:`sfs-lola`. Running SfS ^^^^^^^^^^^ Then we run ``sfs`` on this clip (for a larger clip ``parallel_sfs`` should be used instead, see :numref:`parallel_sfs`):: sfs -i run_full1/run-crop-DEM.tif \ A.cub A.json \ --use-approx-camera-models \ --crop-input-images \ --reflectance-type 1 \ --smoothness-weight 0.08 \ --initial-dem-constraint-weight 0.001 \ --max-iterations 10 \ -o sfs_ref1/run The smoothness weight is a parameter that needs tuning. If it is too small, SfS will return noisy results, if it is too large, too much detail will be blurred. One can experiment with values between 0.01 and 100,000 with a factor of 10 to find this weight, and then refine it in smaller steps. A discussion of this term is in :cite:`lesage2021constraints`. Here we used the Lunar-Lambertian model. The meaning of the other ``sfs`` options can be looked up in :numref:`sfs`. Normally 5-10 iterations is enough, even when convergence is not reached, as the solution usually improves quickly at first and only very fine refinements happen later. The value of ``--initial-dem-constraint-weight`` is best set to something very small when the initial DEM is not very reliable, as otherwise defects from it can be inherited by the SfS result. Otherwise a value between 0.001 and 0.002 may be good enough. Use a higher value when the input DEM is reliable but the reflectance model is not. See :numref:`sfs_albedo` for modeling of albedo. Shadow thresholds may be needed to avoid artifacts in shadow. See :numref:`sfs_crater_bottoms` for a potential solution to flat crater bottoms in areas in shadow. In the next sections, where SfS will be done with multiple images, more parameters which can control the quality of the result will be explored. See :numref:`sfs_outputs` for where ``sfs`` stores its outputs. See :numref:`sfs_kaguya` for an example of running SfS on Kaguya TC images. .. _sfs_inspection: Inspecting the results ^^^^^^^^^^^^^^^^^^^^^^ We show the results of running this program in :numref:`sfs1`. The left-most figure is the hill-shaded original DEM, which was obtained by running the ``hillshade`` program (:numref:`hillshade`):: hillshade --azimuth 300 --elevation 20 run_full1/run-crop-DEM.tif \ -o run_full1/run-crop-hill.tif The second image is the hill-shaded DEM obtained after running ``sfs`` for 10 iterations. The third image is, for comparison, the map-projection of A.cub onto the original DEM, obtained via the command:: mapproject --tr 1 run_full1/run-crop-DEM.tif A.cub A_map.tif \ --tile-size 1024 (For small DEMs one can use a smaller ``--tile-size`` to start more subprocesses in parallel to do the mapprojection. That is not needed with CSM cameras as then ``mapproject`` is multithreaded.) The fourth image is the colored absolute difference between the original DEM and the SfS output, obtained by running ``geodiff`` (:numref:`geodiff`):: geodiff --absolute sfs_ref1/run-DEM-final.tif \ run_full1/run-crop-DEM.tif -o out colormap --min 0 --max 2 out-diff.tif .. figure:: images/sfs1.jpg :name: sfs1 :alt: An sfs illustration An illustration of ``sfs``. The images are, from left to right, the original hill-shaded DEM, the hill-shaded DEM obtained from ``sfs``, the image A.cub map-projected onto the original DEM, and the absolute difference of the original and final DEM, where the brightest shade of red corresponds to a 2 meter height difference. It can be seen that the optimized DEM provides a wealth of detail and looks quite similar to the input image. It also did not diverge significantly from the input DEM. We will see in the next section that SfS is in fact able to make the refined DEM more accurate than the initial guess (as compared to some known ground truth), though that is not guaranteed, and most likely did not happen here where just one image was used. .. _sfs_albedo: Albedo modeling with one or more images --------------------------------------- When using a single input image, it may be preferable to avoid floating (solving for) the albedo (option ``--float-albedo``), hence to have it set to 1 and kept fixed. The reason for that is because for a single image it is not possible to distinguish if a bright image area comes from lighter-colored terrain or from having an inclination which makes it face the Sun more. If desired to float the albedo with one image, it is suggested to use a higher value of ``--initial-dem-constraint-weight`` to constrain the terrain better in order to make albedo determination more reliable. The albedo can be prevented from changing too much if the ``--albedo-constraint-weight`` parameter is used. Albedo should be floated with two or more images, if albedo variations are clearly visible, and if those images have sufficiently different illumination conditions, as then the albedo and slope effects can be separated more easily. For images not having obvious albedo variations it may be prudent to keep the albedo fixed at the nominal value of 1. It is important to use appropriate values for the ``--shadow-thresholds`` parameter, as otherwise regions in shadow will be interpreted as lit terrain with a pitch-black color, and the computed albedo and terrain will have artifacts. See :numref:`sfs_outputs` for the produced file having the albedo. An example showing modeling of albedo (and atmospheric haze) is in :numref:`sfs_earth`. .. _sfs_multiview: SfS with multiple images in the presence of shadows --------------------------------------------------- In this section we will run ``sfs`` with multiple images. We would like to be able to see if SfS improves the accuracy of the DEM rather than just adding detail to it. We evaluate this using the following (admittedly imperfect) approach. We reduce the resolution of the original images by a factor of 10, run stereo with them, followed by SfS using the stereo result as an initial guess and with the resampled images. As ground truth, we create a DEM from the original images at the higher resolution of 1 meter/pixel, which we bring closer to the initial guess for SfS using ``pc_align``. We would like to know if running SfS brings us even closer to this "ground truth" DEM. The most significant challenge in running SfS with multiple images is that shape-from-shading is highly sensitive to errors in camera position and orientation. It is suggested to bundle-adjust the cameras first (:numref:`bundle_adjust`). It is important to note that bundle adjustment may fail if the images have very different illumination, as it will not be able to find matches among images. A solution to this is discussed in :numref:`sfs-lola`, and it amounts to bridging the gap with more images of intermediate illumination. It is strongly suggested that, when doing bundle adjustment, the images should be specified in the order given by Sun azimuth angle (see :numref:`sfs_azimuth`). The images should also be mapprojected and visualized (in the same order), to verify that the illumination is changing gradually. To make bundle adjustment and stereo faster, we first crop the images, such as shown below (the crop parameters can be determined via ``stereo_gui``, :numref:`stereo_gui`). :: crop from = A.cub to = A_crop.cub sample = 1 line = 6644 \ nsamples = 2192 nlines = 4982 crop from = B.cub to = B_crop.cub sample = 1 line = 7013 \ nsamples = 2531 nlines = 7337 crop from = C.cub to = C_crop.cub sample = 1 line = 1 \ nsamples = 2531 nlines = 8305 crop from = D.cub to = D_crop.cub sample = 1 line = 1 \ nsamples = 2531 nlines = 2740 Note that manual cropping is not practical for a very large number of images. In that case, it is suggested to mapproject the input images onto some smooth DEM whose extent corresponds to the terrain to be created with ``sfs`` (with some extra padding), then run bundle adjustment with mapprojected images (option ``--mapprojected-data``, illustrated in :numref:`sfs-lola`) and stereo also with mapprojected images (:numref:`mapproj-example`). This will not only be automated and faster, but also more accurate, as the inputs will be more similar after mapprojection. Bundle adjustment (:numref:`bundle_adjust`) and stereo happens as follows:: bundle_adjust A_crop.cub B_crop.cub C_crop.cub D_crop.cub \ --num-iterations 100 --save-intermediate-cameras \ --ip-per-image 20000 --max-pairwise-matches 2000 \ --min-matches 1 --num-passes 1 -o run_ba/run parallel_stereo A_crop.cub B_crop.cub run_full2/run \ --subpixel-mode 3 --bundle-adjust-prefix run_ba/run One can try using the stereo option ``--nodata-value`` (:numref:`stereodefault`) to mask away shadowed regions, which may result in more holes but less noise in the terrain created from stereo. See :numref:`running-stereo` for a discussion about various speed-vs-quality choices, and :numref:`mapproj-example` about handling artifacts in steep terrain. Consider using CSM cameras instead of ISIS cameras (:numref:`sfs_isis_vs_csm`). The resulting cloud, ``run_full2/run-PC.tif``, will be used to create the "ground truth" DEM. As mentioned before, we'll in fact run SfS with images subsampled by a factor of 10. Subsampling is done by running the ISIS ``reduce`` command:: for f in A B C D; do reduce from = ${f}_crop.cub to = ${f}_crop_sub10.cub \ sscale = 10 lscale = 10 done We run bundle adjustment and parallel_stereo with the subsampled images using commands analogous to the above. It was quite challenging to find match points, hence the ``--mapprojected-data`` option in ``bundle_adjust`` was used, to find interest matches among mapprojected images. The process went as follows:: # Prepare mapprojected images (see note in the text below) parallel_stereo A_crop_sub10.cub B_crop_sub10.cub \ --subpixel-mode 3 run_sub10_noba/run point2dem -r moon --tr 10 --stereographic \ --proj-lon 0 --proj-lat -90 \ run_sub10_noba/run-PC.tif for f in A B C D; do mapproject run_sub10_noba/run-DEM.tif --tr 10 \ ${f}_crop_sub10.cub ${f}_sub10.map.noba.tif done # Run bundle adjustment bundle_adjust A_crop_sub10.cub B_crop_sub10.cub \ C_crop_sub10.cub D_crop_sub10.cub --min-matches 1 \ --num-iterations 100 --save-intermediate-cameras \ -o run_ba_sub10/run --ip-per-image 20000 \ --max-pairwise-matches 2000 --overlap-limit 200 \ --match-first-to-last --num-passes 1 \ --mapprojected-data \ "$(ls [A-D]_sub10.map.noba.tif) run_sub10_noba/run-DEM.tif" It is suggested to use above a DEM not much bigger than the eventual area of interest, otherwise interest points which are far away may be created. While that may provide robustness, in some occasions, given that LRO NAC images are very long and can have jitter, interest points far away could actually degrade the quality of eventual registration in the desired smaller area. The same resolution should be used for both mapprojected images (option ``--tr``), and it should be similar to the ground sample distance of these images. The option ``--mapprojected-data`` assumes that the images have been mapprojected without bundle adjustment. The option ``--max-pairwise-matches`` in ``bundle_adjust`` should reduce the number of matches to the set value, if too many were created originally. The option ``--overlap-limit`` reduces the number of subsequent images to be matched to the current one to this value. For a large number of images consider using the option ``--auto-overlap-params`` which will find which images overlap. Run stereo and create a DEM:: parallel_stereo A_crop_sub10.cub B_crop_sub10.cub \ run_sub10/run --subpixel-mode 3 \ --bundle-adjust-prefix run_ba_sub10/run point2dem -r moon --tr 10 --stereographic \ --proj-lon 0 --proj-lat -90 run_sub10/run-PC.tif This will create a point cloud named ``run_sub10/run-PC.tif`` and a DEM ``run_sub10/run-DEM.tif``. It is *strongly suggested* to mapproject the bundle-adjusted images onto this DEM and verify that the obtained images agree:: for f in A B C D; do mapproject run_sub10/run-DEM.tif \ ${f}_crop_sub10.cub ${f}_sub10.map.yesba.tif \ --bundle-adjust-prefix run_ba_sub10/run done stereo_gui --use-georef --single-window *yesba.tif We'll bring the "ground truth" point cloud closer to the initial guess for SfS using ``pc_align``:: pc_align --max-displacement 200 run_full2/run-PC.tif \ run_sub10/run-PC.tif -o run_full2/run \ --save-inv-transformed-reference-points This step is extremely important. Since we ran two bundle adjustment steps, and both were without ground control points, the resulting clouds may differ by a large translation, which we correct here. Hence we would like to make the "ground truth" terrain aligned with the datasets on which we will perform SfS. Next we create the "ground truth" DEM from the aligned high-resolution point cloud, and crop it to a desired region:: point2dem -r moon --tr 10 --stereographic \ --proj-lon 0 --proj-lat -90 \ run_full2/run-trans_reference.tif gdal_translate \ -projwin -15540.7 151403 -14554.5 150473 \ run_full2/run-trans_reference-DEM.tif \ run_full2/run-crop-DEM.tif We repeat the same steps for the initial guess for SfS:: point2dem -r moon --tr 10 --stereographic \ --proj-lon 0 --proj-lat -90 \ run_sub10/run-PC.tif gdal_translate \ -projwin -15540.7 151403 -14554.5 150473 \ run_sub10/run-DEM.tif \ run_sub10/run-crop-DEM.tif Since our dataset has many shadows, we found that specifying the shadow thresholds for the tool improves the results. The thresholds can be determined using ``stereo_gui``. This can be done by turning on threshold mode from the GUI menu, and then clicking on a few points in the shadows. The largest of the determined pixel values will be the used as the shadow threshold. Then, the thresholded images can be visualized/updated from the menu as well, and this process can be iterated. See :numref:`thresh` for more details. We also found that for LRO NAC a shadow threshold value of 0.003 works well enough usually. Alternatively, the ``otsu_threshold`` tool (:numref:`otsu_threshold`) can be used to find the shadow thresholds automatically. It can overestimate them somewhat. Then, we run ``sfs``:: sfs -i run_sub10/run-crop-DEM.tif \ A_crop_sub10.cub C_crop_sub10.cub D_crop_sub10.cub \ -o sfs_sub10_ref1/run --threads 4 \ --smoothness-weight 0.12 \ --initial-dem-constraint-weight 0.001 \ --reflectance-type 1 --use-approx-camera-models \ --max-iterations 5 --crop-input-images \ --bundle-adjust-prefix run_ba_sub10/run \ --blending-dist 10 --allow-borderline-data \ --min-blend-size 20 \ --shadow-thresholds '0.00162484 0.0012166 0.000781663' Varying the exposures and haze is not suggested in a first attempt. Note the two "blending" parameters, those help where there are seams or light-shadow boundaries. The precise numbers may need adjustment. In particular, decreasing ``--min-blend-size`` may result in more seamless terrain models at the expense of some erosion. One should experiment with floating the albedo (option ``--float-albedo``) if noticeable albedo variations are seen in the images. See :numref:`sfs_albedo` for a longer discussion. After this command finishes, we compare the initial guess to ``sfs`` to the "ground truth" DEM obtained earlier and the same for the final refined DEM using ``geodiff`` as in the previous section. Before SfS:: geodiff --absolute run_full2/run-crop-DEM.tif \ run_sub10/run-crop-DEM.tif -o out gdalinfo -stats out-diff.tif | grep Mean= and after SfS:: geodiff --absolute run_full2/run-crop-DEM.tif \ sfs_sub10_ref1/run-DEM-final.tif -o out gdalinfo -stats out-diff.tif | grep Mean= The mean error goes from 2.64 m to 1.29 m, while the standard deviation decreases from 2.50 m to 1.29 m. See :numref:`sfs2_fig` for an illustration. Visually the refined DEM looks more detailed. The same experiment can be repeated with the Lambertian reflectance model (reflectance-type 0), and then it is seen that it performs a little worse. We also show in this figure the first of the images used for SfS, ``A_crop_sub10.cub``, map-projected upon the optimized DEM. Note that we use the previously computed bundle-adjusted cameras when map-projecting, otherwise the image will show as shifted from its true location:: mapproject sfs_sub10_ref1/run-DEM-final.tif A_crop_sub10.cub \ A_crop_sub10_map.tif --bundle-adjust-prefix run_ba_sub10/run See :numref:`sfs-lola` for a large-scale example. .. _sfs_borderline: Handling borderline areas ^^^^^^^^^^^^^^^^^^^^^^^^^ With the option ``--allow-borderline-data``, ``sfs`` is able to do a better job at resolving the terrain at the border of regions that have no lit pixels in any images. It works by not letting the image blending weights decay to 0 at at this boundary, which is normally the case when ``--blending-dist`` is used. These weights still decrease to 0 at other image boundaries. In the example in :numref:`sfs_borderline_fig`, in some input images the top terrain portion was lit, and in some the bottom portion. With this option, as it can be seen, the blur in the transition zone is removed. The craters are still too shallow, but that is a known issue with weak illumination, and something to to be addressed at a future time. The value of ``--blending-dist`` should be set to 10 or so. A smaller value may result in seams. Increasing this will allow the seams to be attenuated, but may result in more erosion. The tool ``sfs_blend`` tool (:numref:`sfs_blend`) can be used to tune the areas in complete shadow after doing SfS. .. figure:: images/sfs_borderline.png :name: sfs_borderline_fig :alt: SfS with borderline image data. The SfS result without option ``--allow-borderline-data`` (left), with it (center), and the max-lit mosaic (right). It can be seen in the max-lit mosaic that the illumination direction (position of lit crater rim) is quite different in the top and bottom halves (which appear to be separated by a horizontal ridge), which was causing issues for the algorithm. .. _sfs_crater_bottoms: Handling lack of data in shadowed crater bottoms ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As seen in :numref:`sfs2_fig`, ``sfs`` makes the crater bottoms flat in shadowed areas, where is no data. A *very experimental* way of fixing this is to add a new curvature term in the areas in shadow, of the form .. math:: \label{curvature} w \left(\frac{\partial^2 \phi}{\partial x^2} + \frac{\partial^2 \phi}{\partial y^2} - c\right) to the SfS formulation in :numref:`sfs_formulation`. As an example, running:: sfs -i run_sub10/run-crop-DEM.tif \ A_crop_sub10.cub C_crop_sub10.cub D_crop_sub10.cub \ -o sfs_sub10_v2/run \ --threads 4 --smoothness-weight 0.12 \ --max-iterations 5 \ --initial-dem-constraint-weight 0.001 \ --reflectance-type 1 \ --use-approx-camera-models \ --crop-input-images \ --bundle-adjust-prefix run_ba_sub10/run \ --shadow-thresholds '0.002 0.002 0.002' \ --curvature-in-shadow 0.15 \ --curvature-in-shadow-weight 0.1 \ --lit-curvature-dist 10 \ --shadow-curvature-dist 5 will produce the terrain in :numref:`sfs2_fix_fig`. The curvature ``c`` is given by option ``--curvature-in-shadow``, its weight ``w`` by ``--curvature-in-shadow-weight``, and the parameters ``--lit-curvature-dist`` and ``--shadow-curvature-dist`` help gradually phase in this term at the light-shadow interface, this many pixels inside each corresponding region. Some tuning of these parameters should be done depending on the resolution. They could be made larger if no effect is seen. .. _sfs2_fig: .. figure:: images/sfs2.jpg :alt: Another sfs illustration An illustration of ``sfs``. The images are, from left to right, the hill-shaded initial guess DEM for SfS, the hill-shaded DEM obtained from ``sfs``, the "ground truth" DEM, and the first of the images used in SfS map-projected onto the optimized DEM. .. _sfs2_fix_fig: .. figure:: images/sfs2_fix_depth.jpg :alt: SfS with curved crater bottom An illustration of adding a curvature term to the SfS cost function, per :numref:`sfs_crater_bottoms`. It can be seen that, compared to the earlier figure, the crater bottom is now curved, rather than flat, but more modeling is needed to ensure a seamless transition. .. _sfs-lola: Large-scale SfS --------------- SfS has been run successfully on a site close to the Lunar South Pole, at around 85.5 degrees South. Its size was 14336 x 11008 pixels, at 1 m/pixel. It used 814 LRO NAC images for bundle adjustment and 420 of those for SfS. The shadows on the ground were observed to make a full 360 degree loop. A seamless terrain was created (see the `LPSC poster `_). .. figure:: images/large_scale_sfs.png :name: large_scale_sfs :alt: A portion of a large scale SfS terrain. A portion of a large-scale terrain produced with SfS showing a challenging area with very diverse illumination around some permanently-shadowed regions. Left: hillshaded SfS terrain. Right: max-lit mosaic. The quality of the produced terrain gracefully degrades as illumination gets worse. Challenges ^^^^^^^^^^ The challenges encountered were that the shadows were extensive and varied drastically from image to image, and some portions of the terrain showed up only in some images. All this made it difficult to register the images to each other and to the ground. We solved this by doing bundle adjustment with a large number of images that were sorted by illumination conditions. We made sure that there exist images close to each other in the image list that overlap and have similar enough illumination, which resulted in all images being tied together. The user is strongly cautioned that the difficulty of getting things right and figuring out what went wrong greatly increases with dataset complexity. It is strongly suggested to first try SfS on a site of size perhaps 2000 x 2000 pixels, with a dozen carefully inspected images with slowly varying illumination, and having at least one stereo pair among them (:numref:`stereo_pairs`) that can be used for alignment to the ground. If happy with the results, more images can be added and the site size increased. .. _sfs_initial_terrain: The initial terrain ^^^^^^^^^^^^^^^^^^^ A LOLA DEM was used as an initial guess terrain for SfS and as reference ground truth. A mosaic of several stereo DEMs with bundle-adjusted cameras can be used as well. A Lunar South Pole 87-90 degree latitude DEM at 5 m/pixel is at: https://pgda.gsfc.nasa.gov/products/81 Some lunar DEMs at 10 m/pixel and other resolutions, for latitude between 83 and 90 degrees South, are available at: https://pgda.gsfc.nasa.gov/products/90 The site: https://core2.gsfc.nasa.gov/PGDA/LOLA_5mpp has LOLA DEMs at 5 m/pixel for a few locations. A 20 meter/pixel LOLA product, which is rather low in resolution, but covers a significant portion of the South Pole, is available at:: http://imbrium.mit.edu/DATA/LOLA_GDR/POLAR/IMG/LDEM_80S_20M.IMG http://imbrium.mit.edu/DATA/LOLA_GDR/POLAR/IMG/LDEM_80S_20M.LBL Preprocessing the terrain ^^^^^^^^^^^^^^^^^^^^^^^^^ The higher-resolution DEMs mentioned above only need regridding. The ``LDEM_80S_20M`` IMG and LBL files can be fetched with ``wget``. Then, this dataset should be converted to a .cub file as:: pds2isis from = LDEM_80S_20M.LBL to = ldem_80s_20m.cub The heights for this DEM need to be multiplied by 0.5, per the information in the LBL file. We do that with ``image_calc`` (:numref:`image_calc`):: image_calc -c "0.5*var_0" ldem_80s_20m.cub -o ldem_80s_20m_scale.tif Resample the DEM to 1 m/pixel using ``gdalwarp`` (:numref:`gdal_tools`), creating a DEM named ``ref_dem.tif``:: gdalwarp -overwrite -r cubicspline -tr 1 1 \ -co COMPRESSION=LZW -co TILED=yes -co INTERLEAVE=BAND \ -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \ -te -7050.5 -10890.5 -1919.5 -5759.5 \ ldem_80s_20m_scale.tif ref_dem.tif The values passed to ``-te`` are the bounds of the area of interest. See a discussion about them below. The DEM grid size should be not too different from the *ground sample distance (GSD)* of the images, for optimal results. That one can be found with ``mapproject`` (:numref:`mapproject`). For LRO NAC images, use 1 m / pixel. It is suggested to use a `stereographic projection `_. It should be a polar one, if around the poles, or otherwise centered at the area of interest. For example, set:: proj="+proj=stere +lat_0=-90 +lon_0=0 +R=1737400 +units=m +no_defs" then run ``gdalwarp`` with the additional option ``-t_srs "$proj"``. The interpolated DEM was created with bicubic spline interpolation, which is preferable to the default nearest neighbor interpolation, and it was saved internally using blocks of size 256 x 256, which ASP handles better than the GDAL default with each block as tall or wide as a row or column. Inspect this DEM with ``stereo_gui`` (:numref:`stereo_gui`) in hillshade mode. Any spikes or other artifacts should be blurred, such as by running:: dem_mosaic --dem-blur-sigma 2 ref_dem.tif -o ref_blur.tif Any holes can also be filled ``dem_mosaic`` (:numref:`dem_mosaic_extrapolate`, :numref:`dem_mosaic_fill`). A subsequent blur with a sigma of 2 pixels is suggested (:numref:`dem_mosaic_blur`). See :numref:`initial_sfs_dem` for how to create an initial DEM using stereo. A stereo DEM can also be blended with the LOLA DEM using ``dem_mosaic`` (after alignment, :numref:`sfs_ground_align`). .. _terrain_bounds: Terrain bounds ^^^^^^^^^^^^^^ Later when we mapproject images onto this DEM, those will be computed at integer multiples of the grid size, with each ground pixel centered at a grid point. Given that the grid size is 1 m, the extent of those images as displayed by ``gdalinfo`` will have a fractional value of 0.5. The ``sfs_blend`` program will fail later unless the resampled initial DEM also has this property, as it expects a one-to-one correspondence between mapprojected images and the ground. Hence, ``gdalwarp`` was used earlier with the ``-te`` option, with the bounds having a fractional part of 0.5. Note that the bounds passed to ``-te`` are in the order:: xmin, ymin, xmax, ymax Ensure the min and max values are not swapped, as ``gdalwarp`` will not give a warning if they are, but the resulting DEM will be incorrect. The ``dem_mosaic`` program (:numref:`dem_mosaic`) can be used to automatically compute the bounds of a DEM or orthoimage and change them to integer multiples of pixel size. It can be invoked, for example, as:: dem_mosaic --tr 1 --tap input.tif -o output.tif This will use bilinear interpolation. .. _sfs_azimuth: Image selection and sorting by illumination ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By far the hardest part of this exercise is choosing the images. We downloaded up to 1,400 of them, as described in :numref:`fetch_lro_images`, given the desired longitude-latitude bounds. The PDS .IMG files were converted to ISIS .cub cameras as in :numref:`sfs_single_image`, and they were mapprojected onto the reference DEM, initially at a lower resolution to get a preview of things (:numref:`sfs_inspection`). It is very strongly recommended to use the CSM camera models instead of ISIS models (:numref:`sfs_isis_vs_csm`). Inspection of a large number of images and choosing those that have valid pixels in the area of interest can be very arduous. To make this easier, we make use of the reporting facility of ``dem_mosaic`` (:numref:`dem_mosaic`) when invoked with the option ``--block-max``, with a large value of ``--block-size`` (larger than the image size), and using the ``--t_projwin`` option to specify the region of interest (in ``stereo_gui`` one can find this region by selecting it with Control-Mouse). When the mosaicking tool runs, the sum of pixels in the current region for each image will be printed to the screen. Images with a positive sum of pixels are likely to contribute to the desired region. Example:: dem_mosaic --block-max --block-size 10000 --threads 1 \ --t_projwin -7050.500 -10890.500 -1919.500 -5759.500 \ M*.map.lowres.tif -o tmp.tif | tee pixel_sum_list.txt Eliminate the images that are not relevant to the area. Having them in impacts reliability and performance. The obtained subset of images *must* be sorted by illumination conditions, that is, the Sun azimuth, measured from true North. This angle is printed when running ``sfs`` with the ``--query`` option on the .cub files. Here is an example:: M114859732RE.cal.echo.cub 73.1771 M148012947LE.cal.echo.cub 75.9232 M147992619RE.cal.echo.cub 78.7806 M152979020RE.cal.echo.cub 96.895 M117241732LE.cal.echo.cub 97.9219 M152924707RE.cal.echo.cub 104.529 M150366876RE.cal.echo.cub 104.626 M152897611RE.cal.echo.cub 108.337 M152856903RE.cal.echo.cub 114.057 M140021445LE.cal.echo.cub 121.838 M157843789LE.cal.echo.cub 130.831 M157830228LE.cal.echo.cub 132.74 M157830228RE.cal.echo.cub 132.74 M157809893RE.cal.echo.cub 135.604 M139743255RE.cal.echo.cub 161.014 M139729686RE.cal.echo.cub 162.926 M139709342LE.cal.echo.cub 165.791 M139695762LE.cal.echo.cub 167.704 M142240314RE.cal.echo.cub 168.682 M142226765RE.cal.echo.cub 170.588 M142213197LE.cal.echo.cub 172.497 M132001536LE.cal.echo.cub 175.515 M103870068LE.cal.echo.cub 183.501 M103841430LE.cal.echo.cub 187.544 M142104686LE.cal.echo.cub 187.765 M162499044LE.cal.echo.cub 192.747 M162492261LE.cal.echo.cub 193.704 M162485477LE.cal.echo.cub 194.662 M162478694LE.cal.echo.cub 195.62 M103776992RE.cal.echo.cub 196.643 M103776992LE.cal.echo.cub 196.643 (the Sun azimuth is shown on the right, in degrees). The primary reason why registration can fail later is illumination varying too drastically between nearby images, and not being able to find matching interest points. Hence, there must be sufficient images so that the illumination conditions over the entire site change slowly as one goes down the list. A representative subset of the produced images can be found with the program ``image_subset`` (:numref:`image_subset`). That tool must be invoked once the images have been registered to each other and to the ground, so later in the process (:numref:`parallel_sfs_usage`). The paper :cite:`bertone2023highly` discusses how to automate the process of selecting images. Incorporation of well-registered images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The approach outlined in the next sections consists of doing bundle adjustment, alignment, then refinement of bundle adjustment with ground constraints. For the Lunar South Pole, a large set of well-registered cameras exists. Using them requires running ``spiceinit`` with the `provided kernels `_, followed by creation of CSM cameras as usual. In that case, consider first understanding the workflow below, then modify it as follows. In the first bundle adjustment, keep the subset of well-registered cameras for the given site fixed. Then, do not do alignment, but redo bundle adjustment with no fixed cameras, starting with the cameras from the first step. Lastly, run bundle adjustment with ground constraints as in the regular workflow. The explanation is as follows. The well-registered cameras will help register the other cameras. Then alignment is not needed. However, a subsequent bundle adjustment with no fixed cameras will eliminate some minor registration issues in the well-registered cameras (which are known not to be perfect). The final bundle adjustment with the ground constraint reduces any vertical discrepancies. Bundle adjustment ^^^^^^^^^^^^^^^^^ The ``parallel_bundle_adjust`` tool (:numref:`parallel_bundle_adjust`) is employed to co-register the images and correct camera errors. The images must be, as mentioned earlier, ordered by Sun azimuth angle. It is very important to have interest point matches that tie all images together. To make the determination of such matches more successful, the images were first mapprojected at 1 m/pixel (LRO NAC nominal resolution) to have them in the same perspective. The mapprojected images must all be at the same resolution. Once images are mapprojected, the cameras used for that should not change, as that will result in incorrect results. See :numref:`mapip` for more details. Create three lists, each being a plain text file with one file name on each line, having the input images (sorted by illumination), corresponding cameras (in .json or .cub format), and corresponding mapprojected images. The DEM used in mapprojection can be appended to the last list, but is optional (since the 1/2026 build) if it can be looked up in the geoheaders of the mapprojected images. Run bundle adjustment:: parallel_bundle_adjust \ --image-list image_list.txt \ --camera-list camera_list.txt \ --mapprojected-data-list mapprojected_list.txt \ --processes 10 \ --threads 8 \ --ip-per-image 30000 \ --overlap-limit 100 \ --num-iterations 100 \ --num-passes 2 \ --min-matches 1 \ --max-pairwise-matches 2000 \ --camera-weight 0 \ --robust-threshold 2 \ --tri-weight 0.05 \ --tri-robust-threshold 0.05 \ --remove-outliers-params "75.0 3.0 100 100" \ --save-intermediate-cameras \ --match-first-to-last \ --forced-triangulation-distance 100000 \ --min-triangulation-angle 1e-10 \ --datum D_MOON \ --nodes-list \ -o ba/run The option ``--overlap-limit`` needs a large value, but the process can take a very long time. The ``--auto-overlap-params`` option can help determine which images overlap. The key reason for failure in this process is images not being matched to enough relevant consecutive images, or simply not having enough such images to start with. Here more bundle adjustment iterations are desirable, but this step takes too long. A large ``--ip-per-image`` can make a difference in images with rather different different illumination conditions but it can also slow down the process a lot. Note that the value of ``--max-pairwise-matches`` was set to 2000. That should hopefully create enough matches among any two images. A higher value here will make bundle adjustment run slower and use more memory. Towards the poles the Sun may describe a full loop in the sky, and hence the earliest images (sorted by Sun azimuth angle) may become similar to the latest ones. That is the reason above we used the option ``--match-first-to-last``. If having an estimate how how accurate initial camera positions are, the option ``--camera-position-uncertainty`` is suggested. If this uncertainty is is too small, it can prevent convergence. For LRO NAC, perhaps 100 - 500 m is a good value. See also :numref:`ba_camera_offsets`. Note that this invocation may run for more than a day, or even more. And it may be necessary to get good convergence. If the process gets interrupted, or the user gives up on waiting, the adjustments obtained so far can still be usable, if invoking bundle adjustment, as above, with ``--save-intermediate-cameras``. As before, using the CSM model can result in much-improved performance. Here we used ``--camera-weight 0`` and ``--robust-threshold 2`` to give cameras which start far from the solution more chances to converge. We are very generous with outlier filtering in the option ``--remove-outliers-params``. That will ensure that in case the solution did not fully converge, valid matches with large reprojection error are not thrown out as outliers. A large value of ``--processes`` can result in running out of memory. .. _sfs_ba_validation: Validation of bundle adjustment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The file:: ba/run-final_residuals_stats.txt should be examined. The median reprojection error per camera must be at most 1-2 pixels (the mean error could be larger). If that is not the case, bundle adjustment failed to converge. To help it, consider doing a preliminary step of bundle adjustment with ``--robust-threshold 5`` to force the larger errors to go down, and then do a second invocation to refine the cameras with ``--robust-threshold 2`` as earlier. In the second invocation, either use the original cameras and with the option ``--input-adjustments-prefix``, pointing to the latest adjustments, or use the latest optimized cameras, if in CSM format. Reuse the match files with the option ``--match-files-prefix``. It is best to avoid throwing out images at this stage. More images means a higher chance that the images will be tied together. The images that have a zero count in the stats file can be thrown out. .. _sfs_ground_align: Alignment to the ground ^^^^^^^^^^^^^^^^^^^^^^^ A very critical part of the process is to move from the coordinate system of the cameras to the coordinate system of the initial guess terrain in ``ref_dem.tif``. The only reliable approach for this is to create a terrain model using stereo with some of the images and bundle-adjusted cameras produced so far, align that one to ``ref_dem.tif``, and then apply this alignment to the cameras. With LRO NAC images, stereo pairs may be hard to find. In addition, after the earlier step of bundle adjustment the images may already be within 10-30 meters horizontally relative to the reference LOLA DEM, as validated by mapprojection. If it looks that the alignment is already in the ballpark, and it is tricky to find stereo pairs, or the attempt at alignment fails, consider skipping this step. The produced SfS DEM will likely need additional alignment in either case (:numref:`sfs_align_refine`). Examine the file having the stereo convergence angles for each pair of images as produced by bundle adjustment (:numref:`ba_conv_angle`). Eliminate those with a convergence angle of under 10 degrees or so, and sort the rest in decreasing number of matches (if not enough pairs left, can decrease this angle to 3 - 5 degrees). Produce 30 - 100 stereo DEMs from the stereo pairs with non-small convergence angles. These must *cover well* the full site, even if there are missing areas in between. This helps with consistent alignment. It is very important that the camera adjustments created so far are used in stereo, by passing them via ``--bundle-adjust-prefix``. Or, with CSM cameras, can use the latest optimized cameras instead, without the ``--bundle-adjust-prefix`` option. Stereo with mapprojected images is preferable (:numref:`mapproj-example`). So, the stereo command can look as follows:: parallel_stereo A.map.tif B.map.tif \ ba/run-A.adjusted_state.json \ ba/run-B.adjusted_state.json \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ run_stereo/run \ ref_dem.tif Here, ``ref_dem.tif`` is the DEM used for mapprojection. Note that the mapprojected images won't fully agree with the DEM or each other yet, as they are not registered to the DEM, but stereo should still run fine. When invoking ``point2dem`` on the resulting point clouds, use the same projection (``--t_srs``) as in the reference terrain and a grid size (``--tr``) of 1 meter. Inspect the triangulation error (:numref:`point2dem`). Ideally its average should not be more than 1 meter. The created DEMs can be mosaicked with ``dem_mosaic`` (:numref:`dem_mosaic`) as:: dem_mosaic -o stereo_mosaic.tif --dem-list stereo_dem_list.txt It is strongly suggested to use the ``geodiff`` program (:numref:`geodiff`) to inspect how well the individual DEMs agree with their mosaic. This can help catch problems early. If most DEMs agree well with the mosaic, but some are way off, this may need investigation, or the bad ones can be thrown out, and the mosaic redone. Overlay and inspect the produced stereo DEM mosaic and the reference DEM in ``stereo_gui``. Align the mosaicked DEM to the initial LOLA terrain in ``ref_dem.tif`` using ``pc_align`` (:numref:`pc_align`):: pc_align --max-displacement 500 \ stereo_mosaic.tif ref_dem.tif \ --save-inv-transformed-reference-points \ -o run_align/run The output 50th *error percentile of smallest errors* as printed by this tool should be under 1-5 meters, and ideally less. Otherwise likely something is not right, and the registration of images may fail later. The ``pc_align`` tool can be quite sensitive to the ``--max-displacement`` value. It should be somewhat larger than the total estimated translation (horizontal + vertical) among the two datasets. The option ``--compute-translation-only`` may be necessary if ``pc_align`` introduces a bogus rotation. The resulting transformed cloud ``run_align/run-trans_reference.tif`` needs to be regridded with ``point2dem`` with the same projection and grid size as before. This DEM should be hillshaded (:numref:`hillshade`) and overladed on top of the LOLA DEM and see if there is any noticeable shift, which would be a sign of alignment not being successful. If no luck, and visually the misalignment looks small horizontally, alignment could be skipped, for now, and one could continue with the next step, of using a DEM constraint, to fix vertical alignment issues. After that, perhaps alignment will work better. The ``geodiff`` tool should be used to examine any discrepancy among the two (:numref:`geodiff`), followed by ``colormap`` (:numref:`colormap`) and inspection in ``stereo_gui``. If happy with the results, the alignment transform can be applied to the cameras. With CSM cameras, that goes as follows:: bundle_adjust \ --image-list ba/run-image_list.txt \ --camera-list ba/run-camera_list.txt \ --initial-transform run_align/run-inverse-transform.txt \ --apply-initial-transform-only \ -o ba_align/run It is very important to note that we used above ``run-inverse-transform.txt``, which goes from the stereo DEM coordinate system to the LOLA one. This is discussed in detail in :numref:`ba_pc_align`. We used the latest optimized cameras in the ``ba`` directory. It is suggested to mapproject the images using the obtained bundle-adjusted cameras in ``ba_align/run`` onto ``ref_dem.tif``, and check for alignment errors in ``stereo_gui`` by overlaying the images using georeference information. Small errors (under 5-10 pixels) are likely fine and will be corrected at the next step. If the images are too many, inspect at least a dozen of them. The report file introduced at the next step will help with a large number of images. The following command can be used to quickly overlay a few dozen mapprojected images:: stereo_gui --hide-all --single-window --use-georef $(cat list.txt) Then individual images can be toggled on and off. .. _sfs_ba_refine: Registration refinement ^^^^^^^^^^^^^^^^^^^^^^^ If the images mapproject reasonably well onto the reference DEM, with no shift across the board, but there are still some registration errors, one can refine the cameras using the reference terrain as a constraint in bundle adjustment (:numref:`heights_from_dem`):: bundle_adjust \ --image-list ba_align/run-image_list.txt \ --camera-list ba_align/run-camera_list.txt \ --match-files-prefix ba/run \ --max-pairwise-matches 2000 \ --match-first-to-last \ --min-matches 1 \ --skip-matching \ --num-iterations 100 \ --num-passes 2 \ --camera-weight 0 \ --save-intermediate-cameras \ --heights-from-dem ref_dem.tif \ --heights-from-dem-uncertainty 20.0 \ --mapproj-dem ref_dem.tif \ --forced-triangulation-distance 100000 \ --min-triangulation-angle 1e-10 \ --remove-outliers-params "75.0 3.0 100 100" \ --parameter-tolerance 1e-20 \ --threads 20 \ -o ba_align_ref/run Note how we use the match files with the original ``ba/run`` prefix, and also use ``--skip-matching`` to save time by not recomputing them. But the cameras come from ``ba_align/run``, as the ones with the ``ba/run`` prefix are before alignment. We used the CSM cameras (:numref:`sfs_isis_vs_csm`). The option ``--mapproj-dem`` is very helpful for identifying misregistered images (see below). The value used for ``--heights-from-dem-uncertainty`` can be larger, such as 100, if it is believed that the stereo DEM mosaic produced so far is too different from LOLA. See also :numref:`heights_from_dem`. The switch ``--save-intermediate cameras`` is helpful, as before, if desired to stop if things take too long. .. _sfs_reg_valid: Validation of registration ^^^^^^^^^^^^^^^^^^^^^^^^^^ Mapproject the input images with the latest aligned cameras:: mapproject --tr 1.0 \ ref_dem.tif \ image.cub \ ba_align_ref/run*image.adjusted_state.json \ image.align.map.tif Above, the correct camera for the given image should be picked up from the latest bundle-adjusted and aligned camera directory. These resulting mapprojected images can be overlaid in ``stereo_gui`` with georeference information and checked for misregistration. A maximally-lit mosaic can be created with the command:: dem_mosaic --max -o max_lit.tif *.align.map.tif Misregistered images will create ghosting in this mosaic. Given, for example, a few hundred input images, it is very time-consuming to do pairwise inspections to find the misaligned images. Bundle adjustment created a report file with the name:: ba_align_ref/run-mapproj_match_offset_stats.txt which greatly simplifies this job. This file shows how much each mapprojected image disagrees with the rest, in meters. See :numref:`ba_mapproj_dem` for details. Images with low count in this report can be thrown out. If the 85th percentile of registration errors for an image is over 1.5 meters (assuming a 1 meter ground resolution), it likely registered badly. Those can be deprioritized. The more images are eliminated, the more one risks loss of coverage. It is suggested to sort the images in increasing order of 85th percentile of misregistration error, and create a few candidate sets, with each set having a different threshold for what is considered an acceptable registration error. For example, use cutoffs of 1.25 m, 1.5 m, 1.75 m. Create the maximally lit mosaic for each of these and overlay them in ``stereo_gui``. Inspect them carefully. Choose the set which does not sacrifice coverage and has a small amount of misregistration. Some images with a larger registration error could be added after careful inspection, to increase the coverage. The images with a high 95th error percentile (say over 2 meters) should be overlaid on top of this maximally lit mosaic and removed if they show obvious misregistration. See also the earlier section of validation of bundle adjustment (:numref:`sfs_ba_validation`). That one discusses a report file that measures the errors in the pixel space rather than on the ground. Further refinement and re-validation can be done after solving for jitter, but this is a more advanced topic (:numref:`sfs_jitter`). .. _sfs_fail: Handling failure ^^^^^^^^^^^^^^^^ If the maximally lit mosaic has registration errors, most frequent causes are: - Images were not sorted by illumination in bundle adjustment. - There are not enough images of intermediate illumination to tie the data together. - The interest point matches are inaccurate (locking onto moving shadows). - The value of ``--overlap-limit`` was too small. - Horizontal or vertical alignment failed. Ensure that the recipe in :numref:`sfs-lola` was followed carefully. Further strategies: - See if many mapprojected images are misregistered with the DEM. If yes, bundle adjustment and/or alignment failed and needs to be redone or refined. - Crop all mapprojected images produced with bundle-adjusted cameras to a small site, and overlay them while sorted by illumination (solar azimuth angle). See for which images the registration failure occurs. - Inspect the match files for unprojected images (``.match`` and ``clean.match``) in ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`). Perhaps there were not enough matches or too many of them were thrown out as outliers. - Fallback to a smaller subset of images which is self-consistent, even if losing coverage that way. Can be guided for this by the report files (:numref:`sfs_reg_valid`, :numref:`sfs_ba_validation`). - See if more images can be added with intermediate illumination conditions and to increase coverage. If a well-aligned SfS terrain is produced with a subset of the images, consider doing the same for a subset of the remaining ones. The second SfS terrain can be aligned to the first one on a clip where they both produce good results, with ``pc_align`` with correlation-based alignment (:numref:`pc_corr`) and the option ``--initial-transform-from-hillshading translation``. This alignment can be applied to the full second terrain. Alternatively, max-lit mosaics for the subsets could be correlated (:numref:`correlator-mode`), and the produced disparity could be used for image (:numref:`image_align`) and terrain alignment (:numref:`pc_corr`). If the alignment is successful, apply it to the second set of cameras as well (:numref:`ba_pc_align`), and then tighten the vertical alignment for the second set with ``bundle_adjust`` with the option ``--heights-from-dem``, as above. Then, joint SfS for the union of the two sets should work. If no luck, break up a large site into 4 quadrants with overlap, eliminate all images not having good pixels in a given quadrant, and create a solution for each. Any match file should however have features in the full site, for reuse later. If the resulting subsets of bundle-adjusted cameras are individually self-consistent and consistent with the ground, do a combined bundle adjustment using the union of all sets of match files, by copying them to a single directory, with ``--overlap-limit`` set to 0 to use all match files. Ensure that each match file extends over the full region in that case. The ``image_align`` program (:numref:`image_align`) was reported to be of help in co-registering images. Note however that failure of registration is almost surely because not all images are connected together using match points, or the images are consistent with each other but not with the ground. Note that interest point matches produced from stereo (:numref:`dense_ip`) are less sensitive to illumination changes, but that process is quite slow and does not scale for a large number of pairwise matches. .. _parallel_sfs_usage: Running SfS in parallel ^^^^^^^^^^^^^^^^^^^^^^^ Next, SfS follows, using ``parallel_sfs`` (:numref:`parallel_sfs`):: parallel_sfs -i ref_dem.tif \ --nodes-list nodes_list.txt \ --processes 6 \ --threads 8 \ --tile-size 200 \ --padding 50 \ --image-list ba_align_ref/run-image_list.txt \ --camera-list ba_align_ref/run-camera_list.txt \ --shadow-threshold 0.005 \ --use-approx-camera-models \ --crop-input-images \ --blending-dist 10 \ --min-blend-size 50 \ --allow-borderline-data \ --low-light-threshold 0.03 \ --smoothness-weight 0.08 \ --initial-dem-constraint-weight 0.0025 \ --reflectance-type 1 \ --max-iterations 5 \ --save-sparingly \ -o sfs/run For this step not all images need to be used, just a representative enough subset. Normally, having two or three sufficiently different illumination conditions at each location is good enough, ideally with the shadows from one image being roughly perpendicular to shadows from other images. A representative subset of the produced images can be found with the program ``image_subset`` (:numref:`image_subset`). Invoke that program with low-resolution versions of the mapprojected co-registered input images. That program's page has more details. SfS should work fine with a few hundred input images, but it can be slow. It is best to avoid images with very low illumination angles as those can result in artifacts in the produced SfS terrain. The first step that will happen, when this program is launched, is computing the image exposures, and, if applicable, the initial haze values and albedo. See the option ``--estimate-exposure-haze-albedo`` in :numref:`sfs` for more details. Then the computed exposures (also haze and albedo, if applicable) are passed to each tile that is run in parallel, via ``--image-exposures-prefix`` (and, if applicable, ``--haze-prefix``, ``--input-albedo``). All these are further optimized per tile if ``--float-exposure``, ``--float-haze``, and/or ``--float-albedo`` are used. The option ``--allow-borderline-data`` improves the level of detail close to permanently shadowed areas. See :numref:`sfs_borderline`. It was found empirically that a shadow threshold of 0.005 was good enough. It is also possible to specify individual shadow thresholds if desired, via ``--custom-shadow-threshold-list``. This may be useful for images having diffuse shadows cast from elevated areas that are far-off. For those, the threshold may need to be raised to as much as 0.01. The value of ``--initial-dem-constraint-weight`` may need to be increased somewhat if the resulting SfS terrain differs too much from the initial LOLA terrain, or if a tiling pattern is seen. The ``geodiff`` program (:numref:`geodiff`) can help evaluate the difference. Use a larger ``--blending-dist`` if the produced terrain has visible artifacts around shadow regions which do not go away after increasing the shadow thresholds. To get more seamless results around small shadowed craters reduce the value of ``--min-blend-size``. This can result in more erosion. See :numref:`sfs_seams` for fixing seams in low-light areas. The option ``--use-approx-camera-models`` is not necessary with CSM cameras. One should experiment with floating the albedo (option ``--float-albedo``) if noticeable albedo variations are seen in the images. See :numref:`sfs_albedo` for a longer discussion. It is suggested to run SfS without this flag first and inspect the results. When it comes to selecting the number of nodes to use, it is good to notice how many tiles the ``parallel_sfs`` program produces (the tool prints that), as a process will be launched for each tile. Since above it is chosen to run 5-10 processes on each node, the number of nodes can be a fraction of the number of tiles over number of processes. One should examine how much memory and CPU these processes use and adjust these numbers accordingly. See :numref:`sfs_crater_bottoms` for a potential solution for SfS producing flat crater bottoms where there is no illumination to guide the solver. See :numref:`sfs_borderline` for a very preliminary solution for how one can try to improve very low-lit areas (it only works on manually selected clips and 1-3 images for each clip). See an illustration of the produced terrain in :numref:`large_scale_sfs`. .. _sfs_align_refine: Inspection and refinement ^^^^^^^^^^^^^^^^^^^^^^^^^ The obtained shape-from-shading terrain should be studied carefully to see if it shows any systematic shift or rotation compared to the initial LOLA gridded terrain. For that, the SfS terrain can be overlaid as a hillshaded (:numref:`hillshade`) image on top of the initial terrain in ``stereo_gui``, in georeference mode, and the SfS terrain can be toggled on and off. Measurement of misalignment """"""""""""""""""""""""""" Misalignment can be measured quantitatively by hillshading the gridded LOLA and SfS terrain and doing stereo correlation. This goes as follows. Hillshade both DEMs:: hillshade -e 10 ref_dem.tif -o ref_dem_hill.tif hillshade -e 10 sfs_dem.tif -o sfs_dem_hill.tif It is assumed as before that these two DEMs have precisely the same projection, grid size and extent. Consider adjusting the elevation (``-e``) parameter and also the azimuth (``-a``) parameter to produce well-lit images with good range of intensities that fill most of the 0 to 255 range. If some areas appear saturated or too much in shadow, consider a hillshade command along the lines of:: gdaldem hillshade -multidirectional -compute_edges -alt 20 \ dem.tif dem_hill.tif Run stereo in correlator mode (:numref:`correlator-mode`):: parallel_stereo \ --correlator-mode \ --stereo-algorithm asp_mgm \ --corr-kernel 9 9 \ --ip-per-image 40000 \ --subpixel-mode 9 \ --corr-search -25 -25 25 25 \ --nodes-list nodes_list.txt \ sfs_dem_hill.tif \ ref_dem_hill.tif \ sfs_ref_corr/run The search range in ``--corr-search`` is determined by the expected amount of misalignment (:numref:`search_range`). Here, the SfS DEM is intentionally specified as the first input, as that is needed by subsequent logic. The produced ``F.tif`` disparity can be split into bands while masking no-data values (:numref:`mask_disparity`) and viewed with ``stereo_gui`` (:numref:`colorize`) as:: stereo_gui --colorbar \ --min -10 --max 10 \ sfs_ref_corr/run-F_b1_nodata.tif \ sfs_ref_corr/run-F_b2_nodata.tif It is very important to confirm that the visually-observed shifts agree with the disparities shown by this plot. .. figure:: images/sfs_lola_disp.png :name: sfs_disp :alt: SfS to LOLA disparity Colorized horizontal and vertical disparities from the SfS DEM to the LOLA DEM. There exists a horizontal misalignment of 5 pixels in the upper-right corner (left plot), and a vertical misalignment of 10 pixels in the upper-left corner (right plot). A sample plot of such disparities is shown in :numref:`sfs_disp`. It can be seen that here the misregistration is large and non-uniform. In this case, the only reliable solution for repair is to make use of custom GCP produced with ``dem2gcp`` as seen in the next section. A simpler recipe for correcting a shift or rotation only with ``pc_align`` is shown further down. .. _sfs_gcp: GCP-based refinement """""""""""""""""""" The ``dem2gcp`` program (:numref:`dem2gcp`) will take as input this disparity and move each ground point produced by triangulation of interest point matches from the "warped" location on the SfS DEM to the correct location on the LOLA DEM, forming ground control points (:numref:`bagcp`). This invocation requires a build of ASP as of 2025/11 or later (:numref:`release`). :: dem2gcp \ --warped-dem sfs_dem.tif \ --ref-dem ref_dem.tif \ --warped-to-ref-disparity sfs_ref_corr/run-F.tif \ --image-list ba_align_ref/run-image_list.txt \ --camera-list ba_align_ref/run-camera_list.txt \ --clean-match-files-prefix ba/run \ --max-pairwise-matches 5000 \ --gcp-sigma 1.0 \ --max-num-gcp 2000000 \ --output-gcp sfs_ref_corr/run.gcp The value of ``--gcp-sigma`` should be on the order of the ground sample distance (in meters), to ensure that the GCP constraint is strong enough. This program can be sensitive to outliers, so the clean matches above should be produced with bundle adjustment with a value of ``--remove-outliers-params`` that removes outliers with reprojection error more than 5-10 pixels or so. The resulting GCP file can be passed to ``bundle_adjust`` together with the images and *latest* cameras, such as in :numref:`sfs_ba_refine`. Care must be taken that these GCP do not conflict with triangulated points in bundle adjustment, with or without the ``--heights-from-dem`` option. See :numref:`gcp_vs_tri`. Then, SfS must be rerun with the new cameras. Misalignment can be evaluated as before. The created SfS terrain can be employed to improve the registration of any problematic images (:numref:`sfs_sim`). Refinement based on a rigid transform """"""""""""""""""""""""""""""""""""" If the misalignment looks as if produced by a rigid transform, one can try alignment based on dense correlation of hillshaded images (:numref:`pc_corr`). This requires that the correlation be run with the inputs in *reverse* order from the above, so the first input would be the reference LOLA DEM. Alternatively, one can do sparse features-based alignment (:numref:`pc_hillshade`). This works better on lower-resolution versions of the inputs, when the high-frequency discrepancies do not confuse the alignment, so, for example, at 1/4 or 1/8 resolution of the DEMs, as created with ``stereo_gui``:: pc_align --initial-transform-from-hillshading rigid \ ref_dem_sub4.tif sfs_dem_sub4.tif -o align_sub4/run \ --num-iterations 0 --max-displacement -1 In either case, the alignment transform can then be applied to the full SfS DEM (:numref:`prevtrans`):: pc_align --initial-transform align_sub4/run-transform.txt \ ref_dem.tif sfs_dem.tif -o align/run --num-iterations 0 \ --max-displacement -1 --save-transformed-source-points \ --max-num-reference-points 1000 --max-num-source-points 1000 The number of points being used is not important since we will just apply the alignment and transform the full DEM. The aligned SfS DEM can be created from the obtained transformed cloud as:: point2dem --tr 1 --search-radius-factor 2 --t_srs projection_str \ align/run-trans_source.tif Here, the projection string should be the same one as in the reference LOLA DEM named ``ref_dem.tif``. It can be found by invoking:: gdalinfo -proj4 ref_dem.tif and looking for the value of the ``PROJ`` field. The alignment transform should be applied to the cameras (:numref:`ba_pc_align`), then bundle adjustment with a terrain constraint should be redone as in :numref:`sfs_ba_refine`. Lastly, the SfS DEM must be regenerated with the new cameras. Ideally, after all this, there should be no systematic offset between the SfS terrain and the reference LOLA terrain. Image-based refinement """""""""""""""""""""" Another approach is to find the stereo disparity from the hillshaded SfS DEM to the hillshaded reference DEM (at 1/4th the resolution) with ``parallel_stereo --correlator-mode``, then invoke ``image_align`` (:numref:`image_align`) on the disparity. It appears that the stereo correlation works better if the first cloud is the SfS DEM, as it has more detail. This can produce an alignment transform (:numref:`image_align_ecef_trans`) that can be passed in to ``pc_align`` with zero iterations to align the SfS DEM to the reference DEM (:numref:`prevtrans`). Manual alignment """""""""""""""" If these approaches fail to remove the visually noticeable displacement between the SfS and LOLA terrain, one can try to nudge the SfS terrain manually, by using ``pc_align`` as:: pc_align --initial-ned-translation \ "north_shift east_shift down_shift" \ ref_dem.tif sfs_dem.tif -o align/run --num-iterations 0 \ --max-displacement -1 --save-transformed-source-points \ --max-num-reference-points 1000 --max-num-source-points 1000 Here, the value of ``down_shift`` should be 0, as we attempt a horizontal shift. For the others, one may try some values and observe their effect in moving the SfS terrain to the desired place. The transform obtained by using these numbers will be saved in ``align/run-transform.txt`` (while being converted from the local North-East-Down coordinates to ECEF) and can be used to transform the cameras to bring them in closer alignment with the reference terrain. If a manual rotation nudge is necessary, use ``pc_align`` with ``--initial-rotation-angle``. The transformed cloud then needs to be regridded with ``point2dem`` as before. In all cases the SfS DEM must be regenerated with the aligned cameras. Comparison with initial terrain ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``geodiff`` tool can be deployed to see how the SfS DEM compares to the initial guess or to the raw ungridded LOLA measurements. One can use the ``--absolute`` option for this tool and then invoke ``colormap`` to colorize the difference map. By and large, the SfS DEM should not differ from the reference DEM by more than 1-2 meters. It is also suggested to produce produce a maximally-list mosaic, as in :numref:`sfs_reg_valid`. This should not look too different if projecting on the initial guess DEM or on the refined one created with SfS. .. _sfs_issues: Handling issues in the SfS result ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Misregistration errors between the images can result in craters or other features being duplicated in the SfS terrain. Then, registration must be redone as discussed in the earlier sections. If in some low-light locations the SfS DEM has seams, see :numref:`sfs_seams`. Artifacts around permanently shadowed areas can be fixed with ``sfs_blend`` (:numref:`sfs_blend`). See :numref:`sfs_borderline` for how to increase the coverage in areas with very low illumination. If the SfS DEM has localized defects, those can be fixed in a small region and then blended in. For example, a clip around the defect, perhaps of dimensions 400 pixels or larger, can be cut from the input DEM. If that clip has noise which affects the final SfS result, it can be blurred with ``dem_mosaic``, using for example, ``--dem-blur-sigma 2`` (or a larger sigma value). Then one can try to run ``parallel_sfs`` on just this clip, and if needed, vary some of the SfS parameters or exclude some images. If happy enough with the result, this small SfS clip can be blended back to the larger SfS DEM with ``dem_mosaic`` as:: dem_mosaic --priority-blending-length 75 \ small_sfs.tif large_sfs.tif -o merged_sfs.tif Inspect the resulting hillshaded DEM to ensure this did not result in blending artifacts. .. _sfs_seams: Fixing seams in the SfS terrain ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Images with partially shadowed areas can result in seams in the SfS hillshaded DEM. The best available approach for fixing these problems starts by setting a threshold for such semi-shadowed pixels. Pixels with values between this and the shadow threshold will be given less weight, in inverse proportion to the discrepancy between the observed and simulated pixel value. This weight can be raised to a certain power to make this attenuation effect stronger, and the resulting weight image can be blurred somewhat to reduce any discontinuities. Pixels for which no other images have higher values at the given ground location are excluded from this process, to avoid unnecessary erosion. (However, the blur operation on the weights, per above, may still result in some erosion.) This approach is available with a build from 2025/11 or later (:numref:`release`). After extensive experimentation, it was validated that this option works well when enabled for a full run, not just for clips that show seams. If not desired, remove the ``--low-light-threshold`` option from the ``parallel_sfs`` invocation (:numref:`parallel_sfs_usage`). To enable this approach, the option ``--allow-borderline-data`` is assumed (:numref:`sfs_borderline`). Then, the following additional options are needed:: --low-light-threshold 0.03 \ --low-light-weight-power 4.0 \ --low-light-blur-sigma 3.0 The value of ``--low-light-threshold`` should be chosen based on the specific dataset. For LRO NAC, where the shadow threshold is around 0.005, a value of 0.03 was observed to work well. The full documentation for these options is :numref:`sfs`. How to blend in repaired clips is discussed in :numref:`sfs_issues`. Blending the SfS result with the initial terrain ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ After computing a satisfactory SfS DEM, it can be processed to replace the values in the permanently shadowed areas with values from the LOLA reference DEM, with a transition region. This process will fail unless the SfS DEM and the LOLA DEM have the same grid. How to prepare the initial terrain is described in :numref:`sfs_initial_terrain`, and more details about bounds are in :numref:`terrain_bounds`. A workaround is suggested later in this section. The blending can be done as:: sfs_blend --lola-dem lola_dem.tif --sfs-dem sfs_dem.tif \ --max-lit-image-mosaic max_lit.tif --image-threshold 0.005 \ --lit-blend-length 25 --shadow-blend-length 5 \ --min-blend-size 50 --weight-blur-sigma 5 \ --output-dem sfs_blend.tif --output-weight sfs_weight.tif Here, the inputs are the LOLA and SfS DEMs, the maximally lit mosaic provided as before, the shadow threshold (the same value as in invoking SfS should be used). These are expected to have precisely the same extent, projection, and resolution. The outputs are the blended DEM as described earlier, and the weight which tells how much the SfS DEM contributed to the blended DEM. That weight equals to 1 where only the SfS DEM was used, is between 0 and 1 in the transition region between the lit and shadowed areas, which is determined by the values of the ``--lit-blend-length`` and ``--shadow-blend-length`` parameters (it grows somewhat depending on the value of ``--weight-blur-sigma``), and is 0 where only the LOLA values contribute to the solution. The weight function is the truncated signed Euclidean distance to the lit boundary, scaled to have values between 0 and 1, then blurred with a Gaussian kernel with the above-mentioned sigma. No blending happens for shadowed regions of dimensions less than ``--min-blend-size``, where the SfS DEM is kept. See :numref:`sfs_blend` for more details. If ``sfs_blend`` fails due to the grids not matching, it is suggested that the input LOLA terrain be prepared with ``gdalwarp -te `` as described in :numref:`sfs_initial_terrain`, and then the SfS terrain be regenerated starting with this terrain, with any desired transform applied to the cameras before ``parallel_sfs`` is rerun, and then the extent of the LOLA and SfS terrains will agree. Or, the SfS terrain which exists so far (``sfs_dem.tif``), the LOLA terrain (``lola_dem.tif``), and the maximally lit mosaic (``max_lit.tif``) can all be resampled to the same grid with ``gdalwarp`` with the ``--te`` and ``-r cubicspline`` options, or with ``dem_mosaic --tap``, before invoking ``sfs_blend``. .. _sfs_sim: Post-SfS registration ^^^^^^^^^^^^^^^^^^^^^ This section discusses how to use a produced SfS terrain to measure and repair any misregistration of input images. It is assumed that this SfS terrain is well-registered to the reference DEM (e.g., from LOLA), as validated in :numref:`sfs_align_refine`. Image misregistration can arise from the fact that interest point matching can be inaccurate for images with diverse illumination conditions, as discussed in :numref:`sfs_fail`. We make use of the observation that given a raw (measured) image and corresponding camera, a simulated image with the same view and illumination, produced with the SfS terrain, will look very similar to the raw mapprojected image, apart from some shift or rotation. This discrepancy can be measured and corrected, bringing the images in better registration with the SfS terrain. This process is done for each image individually. The resulting improved cameras could be used to create a refined SfS terrain. To define some notation, let ``sfs_dem.tif`` be the final SfS DEM, ``image.cub`` be the input raw image, and ``camera.json`` be the best-registered camera available for this image. Mapproject the raw image onto the SfS DEM with this camera, producing ``image_map.tif``:: mapproject \ --tr 1.0 \ sfs_dem.tif \ image.cub \ camera.json \ image_map.tif Create the simulated orthoimage (this requires a build from 2025/12 or later, :numref:`release`):: sfs -i sfs_dem.tif \ --save-sim-intensity-only \ image.cub \ camera.json \ --ref-map image_map.tif \ -o run/image This will write ``run/image-camera-sim-intensity.tif``. Ensure the name of this file is unique for each input image. Inspect the measured and simulated orthoimages. They should be very similar, apart from any misregistration. The ``image_align`` tool (:numref:`image_align`) can find the transform that aligns the measured image to the simulated one. Note that the simulated image is the reference, and is specified first. :: image_align \ --ip-detect-method 0 \ --inlier-threshold 50 \ --ip-per-tile 2500 \ --ip-per-image 0 \ --alignment-transform translation \ run/image-camera-sim-intensity.tif \ image_map.tif \ --output-prefix align/run \ -o aligned_image.tif This transform will be saved to a file. It will also be printed to standard output and recorded in the log file after the line ``Alignment transform (in pixels)``. It is suggested to also check the number of interest point matches inliers in the log file, as that can be a proxy for how accurate the computed transform is. For a more complex misregistration, one can try a ``rigid`` transform. This is a bit harder to interpret. The ``gcp_gen`` program (:numref:`gcp_gen`) can create ground control points (GCP, :numref:`bagcp`). These GCP will tie pixel locations in the original raw image to 3D locations on the SfS DEM. :: gcp_gen \ --ip-detect-method 0 \ --inlier-threshold 50 \ --ip-per-image 0 \ --ip-per-tile 2500 \ --gcp-sigma 1.0 \ --camera-image image.cub \ --mapproj-image image_map.tif \ --ortho-image run/image-camera-sim-intensity.tif \ --dem sfs_dem.tif \ --output-prefix gcp_gen/run \ -o image_gcp.gcp A GCP sigma of 1.0 meter is reasonable if the DEM resolution is 1 m/pixel. The newly created GCP file is used with ``bundle_adjust`` (:numref:`bundle_adjust`) to refine the camera model for the input image. :: bundle_adjust \ image.cub \ camera.json \ image_gcp.gcp \ -o ba_gcp/run This will produce an updated camera model named ``ba_gcp/run-image.json``. To validate the correction, mapproject the input image with the newly aligned camera:: mapproject --tr 1.0 \ sfs_dem.tif \ image.cub \ ba_gcp/run-image.json \ image_aligned.tif The resulting orthoimage should show better agreement with the SfS DEM, with the simulated image, and with other similarly aligned images. This process can be repeated for all input images. Creation of mask of SfS pixels ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The SfS DEM used the information from images where the ground was lit, so above the shadow threshold. In the shadowed areas just the smoothness constraint and initial DEM constraint were used. To create the mask of such lit pixels, with value of 1 where lit and 0 where unlit, use the maximally-lit mosaic found earlier, and run:: thresh=0.005 image_calc -c "sign(max(var_0, $thresh) - $thresh)" \ max_lit.tif -o sfs_mask.tif Here, the shadow threshold used during SfS should be used, separating lit and unlit pixels. .. _sfs_unc: SfS height uncertainty map ^^^^^^^^^^^^^^^^^^^^^^^^^^ The recommended approach for assessing the quality of the SfS result is to compute the variance for each DEM pixel (available in ASP 3.6.0 or later). The square root of the variance is the standard deviation, a relative measure of DEM height uncertainty. This feature is experimental: the values are uncalibrated and they do not represent real elevation uncertainties in meters. Use the ``--save-variances`` option (:numref:`sfs_opt`) with ``parallel_sfs`` (:numref:`parallel_sfs_usage`). The resulting output file is described in :numref:`sfs_outputs`. The variance is computed from the diagonal of the covariance matrix of the optimized parameters, using the `Ceres Covariance Estimation `_ method. The ``--save-covariances`` option (:numref:`sfs_opt`), available in build 2026/2 or later (:numref:`release`), saves the covariance between each DEM pixel and its four immediate neighbors (left, right, top, bottom). This can be useful for understanding spatial correlation of errors. See :numref:`sfs_outputs` for the output files. Previously, the option ``--estimate-height-errors`` was employed, with a different implementation. This is now obsolete. See :numref:`sfs_opt` for details. A useful exercise is to run SfS with two independent sets of images, each with diverse illumination, compare the produced DEMs, and see how that compares with the estimated uncertainty. .. _sfs_jitter: Solving for jitter ^^^^^^^^^^^^^^^^^^ ASP has a jitter solver (:numref:`jitter_solve`). This one can refine individual position and orientation samples in a linescan camera. Normally, for SfS, bundle adjustment as in :numref:`sfs_ba_refine` is sufficient. However, we found the jitter solver helpful for a very large site (more than 50 km on the side, at 1 m/pixel). It was able to resolve very long-wavelength error accumulation in linescan cameras and produce better registration. It is important to note that, as seen below, the solver should be called with carefully set constraints, to avoid large oscillations in the solution, and these constraints should be balanced well. The Google Ceres solver that is employed also has an upper bound on problem size, beyond which it will refuse to run. This particular site had a DEM of 57840 by 41790 pixels, at 1 m/pixel resolution. There were about 3650 images. At this stage the images should already be well-aligned with the reference DEM. We will take the last batch of optimized cameras stored in ``ba_align_ref`` from :numref:`sfs_ba_refine`, and run the jitter command as:: jitter_solve \ --image-list ba_align_ref/run-image_list.txt \ --camera-list ba_align_ref/run-camera_list.txt \ --num-lines-per-position 15000 \ --num-lines-per-orientation 4000 \ --clean-match-files-prefix ba/run \ --max-pairwise-matches 75 \ --match-first-to-last \ --min-matches 1 \ --forced-triangulation-distance 100000 \ --min-triangulation-angle 1e-10 \ --num-iterations 50 \ --num-passes 2 \ --max-initial-reprojection-error 50 \ --overlap-limit 10000 \ --parameter-tolerance 1e-20 \ --heights-from-dem ref_dem.tif \ --heights-from-dem-uncertainty 10.0 \ --anchor-dem ref_dem_extra.tif \ --num-anchor-points-per-tile 1 \ --num-anchor-points-extra-lines 40000 \ --anchor-weight 0.05 \ --mapproj-dem ref_dem.tif \ --max-gcp-reproj-err 30 \ --camera-position-uncertainty 500,500 \ --threads 60 \ -o jitter_align_ref/run \ input.gcp It is important to compare this with the bundle adjustment command in :numref:`sfs_ba_refine`. The camera position constraints prevented the cameras from moving far. The anchor points constrained the ground points. These together implicitly constrained the orientations as well. The number of triangulated points, GCP, and anchor points should be kept relatively balanced. This program prints the number of triangulated non-GCP points and the number of GCP. The uncertainties and weights for these should also be chosen carefully. The anchor DEM (``ref_dem_extra.tif``) went 40 km beyond the site of interest to ensure we constrain oscillations in the cameras even outside the main DEM extent. The option ``--num-anchor-points-extra-lines`` placed anchor points well beyond the first and last image lines, covering the full orbit strip within the anchor DEM. These values were likely excessive for this dataset. The camera position uncertainty was set to 500 m horizontally and vertically, which is generous enough to allow the expected 30-100 m corrections but prevents wild oscillations. This is a soft constraint and in practice the camera positions can move somewhat beyond that. GCP were produced as earlier (:numref:`sfs_gcp`), with ``dem2gcp`` (:numref:`dem2gcp`). The GCP sigma was set to 10 meters. The option ``--max-gcp-reproj-err`` was used to filter GCP outliers. Clean matches from bundle adjustment were reused. The number of pairwise matches can be adjusted to balance quality and problem size. Too many matches can cause the Ceres Jacobian to overflow for large datasets. We assume the cameras in ``ba_align_ref`` are in CSM format, with the adjustments and alignment already applied to them. The option ``--mapproj-dem`` will result, as before, in a report file, named:: jitter_align_ref/run-mapproj_match_offset_stats.txt that can be compared with the one from bundle adjustment. Hopefully the median registration errors go down somewhat. The validation can proceed as earlier, in :numref:`sfs_reg_valid`. .. _sfsinsights: Insights for getting the most of SfS ------------------------------------ Here are a few suggestions we have found helpful when running ``sfs``: - First determine the appropriate smoothing weight :math:`\mu` by running a small clip, and using just one image. A value between 0.06 and 0.12 seems to work all the time with LRO NAC, even when the images are subsampled. The other weight, :math:`\lambda`, that is, the value of ``--initial-dem-constraint-weight``, can be set to something small, like :math:`0.001.` This can be increased to :math:`0.002` if noticing that the output DEM strays too far. - Having images with diverse illumination conditions results in a more accurate terrain. - Floating the albedo (option ``--float-albedo``) can introduce instability and divergence, unless the images have very diverse illumination. See :numref:`sfs_albedo` for a longer discussion. - Floating the exposures was useful for the Earth and Mars examples, but less so for the Moon. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/stereo_algorithms.rst ================================================ .. _stereo_algos_full: The stereo algorithms in ASP in detail ====================================== Here we will discuss in a lot of detail ASP's stereo algorithms. For a brief summary and an illustration see :numref:`stereo_alg_overview`. For how to add new such algorithms, see :numref:`adding_algos`. .. _asp_bm: Block-matching -------------- Block-matching is ASP's oldest and default algorithm. It can be invoked with both ``stereo`` and ``parallel_stereo`` with the option:: --stereo-algorithm asp_bm and works with any alignment method (:numref:`image_alignment`). For each pixel in the left image, the algorithm matches a small block around this pixel with another similar block in the right image. The block size is given by the value of ``--corr-kernel``. The obtained correspondence is then refined based on the value of ``--subpixel-mode``, using a block given by ``--subpixel-kernel``. The option ``--corr-timeout`` can be used to ensure long-running block matching operations are stopped after a given time. The related block-matching algorithm in OpenCV that ASP can invoke is discussed in :numref:`opencv_bm`. .. _asp_sgm: Semi-Global Matching and More Global Matching algorithms -------------------------------------------------------- ASP implements the popular Semi-Global Matching (SGM) algorithm introduced in :cite:`hirschmuller_sgm_original`, and the More Global Matching (MGM) algorithm :cite:`facciolo2015mgm`, which is a modification of SGM, and usually produces higher quality results. These should be invoked with ``parallel_stereo``, with the option ``--stereo-algorithm`` being passed the value ``asp_sgm`` and ``asp_mgm``, respectively. It is suggested to use these algorithms with ``--alignment-method local_epipolar``, when piecewise alignment between left and right images is computed which results in the disparity being 1D and faster to find (:numref:`image_alignment`). However, the versions of SGM and MGM implemented by ASP can perform a full 2D disparity search, similar to what is done in the NG-fSGM algorithm :cite:`xiang_2016_low_complexity_fsgm`. Since ASP processes a wide variety of cameras with varying degrees of metadata quality, the standard assumption with SGM that the disparity search can be performed only along a one-dimensional epipolar line does not hold when the alignment method is not ``local_epipolar`` or for map-projected images. The other major change is that ASP's implementation uses a multi-resolution hierarchical search combined with a compressed memory scheme similar to what is used in the SGM algorithm :cite:`rothermel2012sure_isgm`. The MGM algorithm reduces the amount of high frequency artifacts in textureless regions at the cost of a longer run time. ASP also offers the option of a hybrid SGM/MGM mode (``--stereo-algorithm final_mgm``) where MGM is used only for the final resolution level which obtains results somewhere between the pure SGM and MGM options. The greatest advantage of the SGM algorithm over the ASP block-matching algorithm is an improved ability to find disparity matches in areas of repetitive or low texture. SGM can also discern finer resolution features than the standard correlation algorithm since it tends to use much smaller matching kernels. Along with these advantages come several disadvantages. First, SGM is computationally expensive and requires a lot of memory. Second, in some situations it can produce noticeable artifacts at tile boundaries. Third, it can sometimes produce inaccurate results in textureless regions. With careful parameter selection and usage these disadvantages can be mitigated. MGM is currently limited to using 8 simultaneous threads but SGM does not have a limit. It is suggested to use these algorithms with default options. If desired, customizations can be done as follows. - Set the ``--processes`` option keeping in mind memory constraints as discussed earlier. Each process will run one simultaneous SGM instance and consume memory (:numref:`parallel_stereo`). - The ``--corr-memory-limit-mb`` parameter limits the number of megabytes of memory that can be used by SGM/MGM. This limit is per-process. To be safe, make sure that you have more RAM available than the value of this parameter multiplied by the number of processes. - See :numref:`ps_tiling` regarding tiling and padding. Each process spawned by ``parallel_stereo`` can use multiple threads with ``threads-singleprocess`` without affecting the stereo results. When SGM or MGM is specified, certain stereo parameters have their default values replaced with values that will work with SGM. You can still manually specify these options. - ``cost-mode`` (default 4). Mean absolute distance (MAD) (``cost-mode <= 2``) usually does not work well. The census transform mode (``cost-mode 3``) :cite:`zabih1994census` tends to perform better overall but can produce artifacts on featureless terrain. The ternary census transform mode (``cost-mode 4``) :cite:`hua2016texture` is a modification of the census transform that is more stable on low contrast terrain but may be less accurate elsewhere. - ``corr-kernel``. SGM kernels must always be odd. The SGM algorithm works with much smaller kernel sizes than the regular integer correlator so the default large kernel is not recommended. The MAD cost mode can be used with any odd kernel size (including size 1) but the census cost modes can only be used with kernel sizes 3, 5, 7, and 9. Size 5 or 7 is usually a good choice. The default is 5. - ``xcorr-threshold``. By default this is enabled and set to 2, which doubles the run time of the SGM algorithm. Set it to -1 to turn it off, which may result in less accuracy. If setting ``min-xcorr-level`` to 1, one can perform the cross check on the smaller resolution levels without spending the time to run it on the highest resolution level, which is level 0. - The median and texture filters in the ``stereo_fltr`` tool (defaults 3, 11, 0.13). These filters were designed specifically to clean up output from the SGM algorithm and are especially useful in suppressing image artifacts in low-texture portions of the image. A median filter size of 3 and a texture filter size of 11 are good starts but the best values will depend on your input images. The ``texture-smooth-scale`` parameter will have to be adjusted to taste, but a range of 0.13 to 0.15 is typical for icy images. These values are enabled by default and must be manually disabled. If your images have good texture throughout it may be best to disable these filters. - The ``prefilter-mode`` setting is ignored when using SGM. - The ``subpixel-mode`` If not set, or set to values 7-12, SGM will perform subpixel interpolation during the stereo correlation step and will not do additional work in the stereo refinement step. This means that after dealing with the long SGM processing time you do not need to follow it up with a slow subpixel option. If desired, you can specify a subpixel mode (with value between 1 and 4) to force those subpixel operations to be performed after the default SGM subpixel method. This can remove some staircasing and other artifacts. It is suggested that in this case subpixel mode 3 be used which is somewhat less accurate than subpixel mode 2 but faster. .. figure:: images/correlation/icebridge_example_crop.png :name: corr-sgm-example A section of a NASA IceBridge image on the left with a pair of hill-shaded DEMs to the right it showing the difference between default ASP processing (upper right) and processing using the SGM algorithm (lower right). See another illustration in :numref:`stereo_alg_fig`. :numref:`corr-sgm-example` shows a comparison between two stereo modes. The DEM on the left was generated using the default stereo parameters and ``--subpixel-mode 3``. The DEM on the right was generated using the command:: parallel_stereo --stereo-algorithm asp_sgm \ --corr-kernel 7 7 --cost-mode 4 \ --median-filter-size 3 --texture-smooth-size 13 \ --texture-smooth-scale 0.13 Some grid pattern noise is visible in the image produced using SGM. Using ``--stereo-algorithm asp_mgm`` should reduce it. .. _original_mgm: Original implementation of MGM ------------------------------ ASP ships the MGM algorithm as implemented by its authors (:cite:`facciolo2015mgm`) at:: https://github.com/gfacciol/mgm That program is released under the AGPL license. We do not link to it directly, rather it is called as a separate process from ``stereo_corr``, avoiding license compatibility issues. To use it, run:: parallel_stereo --alignment-method local_epipolar \ --stereo-algorithm mgm \ --job-size-w 512 --job-size-h 512 \ --sgm-collar-size 128 \ left.tif right.tif left.xml right.xml In this mode, locally aligned portions of the input left and right images are saved to disk, the MGM program (named ``mgm``) is called for each such pair, it writes the computed disparity back to disk, which is then ingested by ASP. To be more specific, a global affine epipolar alignment of the left and right images is computed first, then the aligned images are broken up into tiles, with each tile being by default 1024 x 1024 pixels with a 512 pixel padding (hence the total tile size is 2048 x 2048), local epipolar alignment is computed for each tile, the combination of the global and subsequent local alignment is applied to each original image to get the locally aligned image tiles, and those are written to disk, to be passed to ``mgm``. The ``mgm`` program has its own options. Some are environmental variables, to be set before the tool is called, such as ``CENSUS_NCC_WIN=5``, while others are passed to the ``mgm`` executable on the command line, for example, ``-t census``. To communicate any such options to this program, invoke ``parallel_stereo`` (for example) with:: --stereo-algorithm 'mgm CENSUS_NCC_WIN=5 -t census' ASP will ensure these will be passed correctly to ``mgm``. By default, ASP uses:: MEDIAN=1 CENSUS_NCC_WIN=5 USE_TRUNCATED_LINEAR_POTENTIALS=1 TSGM=3 \ -s vfit -t census -O 8 These are adjusted depending on which ones the user chooses to override. The ``CENSUS_NCC_WIN`` parameter is is one of the more notable parameters, as it determines the size of the window to use for correlation, so it corresponds to the option ``--corr-kernel`` of ASP-implemented algorithms. ASP automatically finds the minimum and maximum estimated disparity, and it passes it to ``mgm`` via the ``-r`` and ``-R`` switches. Options for mgm ~~~~~~~~~~~~~~~ -r (default = -30): Minimum horizontal disparity value. (The images are assumed to be rectified, which eliminates the vertical disparity.) -R (default = 30): Maximum horizontal disparity value. -O (default = 4): Number of search directions. Options: 2, 4, 8, 16. -P1 (default = 8) SGM regularization parameter P1. -P2 (default = 32): SGM regularization parameter P2. -p (default = none): Prefilter algorithm. Options: none, census, sobelx, gblur. The ``census`` mode uses the window of dimensions ``CENSUS_NCC_WIN``. -t (default = ad): Distance function. Options: census, ad, sd, ncc, btad, btsd. For ``ncc`` the window of dimensions ``CENSUS_NCC_WIN`` is used. The ``bt`` option is the Birchfield-Tomasi distance. -truncDist (default = inf): Truncate distances at nch * truncDist. -s (default = none): Subpixel refinement algorithm. Options: none, vfit, parabola, cubic. -aP1 (default = 1): Multiplier factor of P1 when sum \|I1 - I2\|^2 < nch * aThresh^2. -aP2 (default = 1): Multiplier factor of P2 as above. -aThresh (default = 5): Threshold for the multiplier factors. -m FILE (default = none): A file with minimum input disparity. -M FILE (default = none): A file with maximum input disparity. -l FILE (default = none): Write here the disparity without the left-to-right test. Environmental variables for mgm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ These should be set on the command line before ``mgm`` is invoked. (ASP does that automatically.) CENSUS_NCC_WIN=3: Size of the window for the census prefilter algorithm and NCC (normalized cross-correlation). TESTLRRL=1: If 1, do left-to-right and right-to-left consistency checks. MEDIAN=0: Radius of the median filter post-processing. TSGM=4: Regularity level. TSGM_ITER=1: Number of iterations. TSGM_FIX_OVERCOUNT=1: If 1, fix overcounting of the data term in the energy. TSGM_DEBUG=0: If 1, print debug information. TSGM_2LMIN=0: Use the improved TSGM cost only for TSGM=2. Overrides the TSGM value. USE_TRUNCATED_LINEAR_POTENTIALS=0: If 1, use the Felzenszwalb-Huttenlocher truncated linear potential. Then P1 and P2 change meaning. The potential they describe becomes V(p,q) = min(P2, P1*\|p-q\|). .. _opencv_sgbm_options: OpenCV SGBM ----------- The ``parallel_stereo`` program can invoke the OpenCV semi-global block-matching algorithm (SGBM) if called with:: --alignment-method local_epipolar \ --stereo-algorithm "opencv_sgbm" Alternatively, the full string having this algorithm and its options can be used, as:: --alignment-method local_epipolar \ --stereo-algorithm \ "opencv_sgbm -mode sgbm -block_size 3 -P1 8 -P2 32 -prefilter_cap 63 -uniqueness_ratio 10 -speckle_size 100 -speckle_range 32 -disp12_diff 1" If an invocation as follows is used:: --alignment-method local_epipolar \ --stereo-algorithm "opencv_sgbm -block_size 7" ASP will use the earlier values for all the options except ``-block_size`` which will be set to 7. Hence, the user can explicitly specify options whose values are desired to be different than the default choices. See an illustration in :numref:`stereo_alg_fig`. SGBM options ~~~~~~~~~~~~ -mode (default = sgbm): Choose among several flavors of SGBM. Use ``sgbm`` for the less-memory intensive mode. Setting this mode to ``hh`` will run the full-scale two-pass dynamic programming algorithm. It will consume O(image_width * image_height * num_disparities) bytes of memory, and may run out of memory for a large input disparity range. Use ``3way`` for yet another flavor which OpenCV does not document. -block_size (default = 3): Block size to use to match blocks from left to right image. It must be an odd number >=1. Normally, it should be somewhere in the 3 - 11 range. -P1 (default = 8): Multiplier for the first parameter controlling the disparity smoothness. This parameter is used for the case of slanted surfaces. This is multiplied by num_image_channels block_size * block_size, and ASP uses num_image_channels = 1. It is used as the penalty on the disparity change by plus or minus 1 between neighbor pixels. -P2 (default = 32): Multiplier for the second parameter controlling the disparity smoothness. This is multiplied by num_image_channels block_size * block_size, and ASP uses num_image_channels = 1. This parameter is used for "solving" the depth discontinuities problem. The larger the values are, the smoother the disparity is. This parameter is the penalty on the disparity change by more than 1 between neighbor pixels. The algorithm requires P2 > P1. -disp12_diff (default = 1): Maximum allowed difference (in integer pixel units) in the left-to-right vs right-to-left disparity check. Set it to a non-positive value to disable the check. -prefilter_cap (default = 63): Truncation value for the prefiltered image pixels. The algorithm first computes the x-derivative at each pixel and clips its value by [-prefilter_cap, prefilter_cap] interval. The result values are passed to the Birchfield-Tomasi pixel cost function. -uniqueness_ratio (default = 10): Margin in percentage by which the best (minimum) computed cost function value should "win" the second best value to consider the found match correct. Normally, a value within the 5 - 15 range is good enough. -speckle_size (default = 100): Maximum size of smooth disparity regions to consider their noise speckles and invalidate. Set it to 0 to disable speckle filtering. Otherwise, set it somewhere in the 50 - 200 range. -speckle_range (default = 32): Maximum disparity variation within each connected component. If you do speckle filtering, set the parameter to a positive value, it will be implicitly multiplied by 16. Normally, 1 or 2 is good enough. .. _libelas: LIBELAS stereo algorithm ------------------------ ASP ships and can invoke the ``LIBELAS`` (Library for Efficient Large-scale Stereo Matching) algorithm :cite:`Geiger2010ACCV`, described at:: http://www.cvlibs.net/software/libelas/ See an illustration in :numref:`stereo_alg_fig`. We implemented an interface around this library to overcome its assumption of the disparity being always positive, and added other minor changes. Our fork having these additions is at:: https://github.com/NeoGeographyToolkit/libelas This software is released under GPL. ASP does not link to it directly, rather it gets invoked as via a system call, with its inputs and outputs being on disk. To invoke it, run:: parallel_stereo --alignment-method local_epipolar \ --stereo-algorithm libelas \ If desired to override the values of any of its parameters, those can be passed as follows:: --stereo-algorithm "libelas -ipol_gap_width 100" (This particular parameter is used to fill holes in the disparity, with a larger value resulting in bigger holes being filled.) The algorithm options, and their defaults, as used by ASP, are as follows. -disp_min (default = 0): Minimum disparity (ASP estimates this unless the user overrides it). -disp_max (default = 255): Maximum disparity (ASP estimates this unless the user overrides it). -support_threshold (default = 0.85): Maximum uniqueness ratio (best vs. second-best support match). -support_texture (default = 10): Minimum texture for support points. -candidate_stepsize (default = 5): Step size of regular grid on which support points are matched. -incon_window_size (default = 5): Window size of inconsistent support point check. -incon_threshold (default = 5): Disparity similarity threshold for support point to be considered consistent. -incon_min_support (default = 5): Minimum number of consistent support points. -add_corners (default = 0): Add support points at image corners with nearest neighbor disparities. -grid_size (default = 20): Size of neighborhood for additional support point extrapolation. -beta (default = 0.02): Image likelihood parameter. -gamma (default = 3): Prior constant. -sigma (default = 1): Prior sigma. -sradius (default = 2): Prior sigma radius. -match_texture (default = 1): Minimum texture for dense matching. -lr_threshold (default = 2): Disparity threshold for left-right consistency check. -speckle_sim_threshold (default = 1): Similarity threshold for speckle segmentation. -speckle_size (default = 200): Speckles larger than this get removed. -ipol_gap_width (default = 3): Fill holes in disparity of height and width at most this value. -filter_median (default = 0): If non-zero, use an approximate median filter. -filter_adaptive_mean (default = 1): If non-zero, use an approximate adaptive mean filter. -postprocess_only_left (default = 0): If non-zero, saves time by not postprocessing the right image. -verbose (default = 0): If non-zero, print some information about the values of the options being used, as well as what the input and output files are. -debug_images (default = 0): If non-zero, save the images to disk right before being passed to libelas (the images are thus padded, aligned, and scaled to have byte pixels). .. _msmw: Multi-Scale Multi-Window stereo matching ---------------------------------------- ASP provides access to the ``Multi-Scale Multi-Window`` (MSMW) stereo matching algorithm :cite:`buades2015reliable`, by invoking its two implementations ``msmw`` and ``msmw2`` from:: https://github.com/centreborelli/s2p (see the ``3rdparty`` directory). While that repository is released under the AGPL-3.0 license and ASP is under the more permissive Apache II license, ASP invokes that functionality as an external program via a system call, so its license does not conflict with ours. Options for msmw ~~~~~~~~~~~~~~~~ To invoke the ``msmw`` algorithm, run ``parallel_stereo`` with the option:: --alignment-method local_epipolar \ --stereo-algorithm msmw By default, ASP invokes this program as if it is called with:: --stereo-algorithm "msmw -i 1 -n 4 -p 4 -W 5 -x 9 -y 9 -r 1 -d 1 -t -1 -s 0 -b 0 -o 0.25 -f 0 -P 32" In addition ASP, automatically calculates and passes to ``msmw`` values for the ``-m`` and ``-M`` options which correspond to estimated minimum and maximum disparity values. Any options explicitly specified by the user, such as:: --stereo-algorithm "msmw -x 7 -y 7" are substituted in the earlier string before ASP invokes this tool. The meaning of these switches is as follows. -m: Minimum disparity. -M: Maximum disparity. -x (default = 0): Width of the window (block) to match from the left to right image. Must be set to a positive odd value. -y (default = 0): Matching window height. Must be set to a positive odd value. -w (default = 0): Flag for weighting window. -W (default = 5): Flag for using windows as lists (5x5 windows only). A non-zero value indicates how many of the orientations should be considered. (Note: Not sure what all this means.) -i (default = 1): Type of distance. -p (default = 1): Number of precisions for single scale. -P (default = 1): Factor of disparity refinement by cubic interpolation. -n (default = 3): Number of scales. -f (default = 0): Standard deviation noise. -r (default = 0): Reciprocity value. -g (default = 0): Subpixel reciprocity flag. -R (default = 0): Dual reciprocity value. -l (default = 0): Inverse reciprocity value. -d (default = 0): Mindist value. -t (default = 0): Mindist dilatation. -s (default = 0): Self-similarity value. -b (default = 0): Integral of derivatives. -v (default = 0): Variance value. -o (default = 0): Remove isolated flag. -O (default = 0): Remove isolated grain (number pixels). -C (default = -1): Filter using the cost, train removing a fraction of the accepted points (e.g. 0.05). -a (default = 0): Use Laplacian of the image instead of the image itself. Options for msmw2 ~~~~~~~~~~~~~~~~~ This flavor of the MSMW algorithm is called analogously, with:: --stereo-algorithm msmw2 ASP fills in its options as if it is called as:: --stereo-algorithm "msmw2 -i 1 -n 4 -p 4 -W 5 -x 9 -y 9 -r 1 -d 1 -t -1 -s 0 -b 0 -o -0.25 -f 0 -P 32 -D 0 -O 25 -c 0" As earlier, any of these can be overridden. Compared to ``msmw`` this tool has the additional options: -D (default = 0): Regression mindist. -c (default = 0): Combine last scale with the previous one to densify the result. .. _opencv_bm: OpenCV BM --------- The simpler and not as performing block-matching (BM) algorithm of OpenCV can be invoked in a very similar manner to OpenCV's SGBM (:numref:`opencv_sgbm_options`), with the algorithm name passed to ``--stereo-algorithm`` being ``opencv_bm``. It accepts the same parameters except ``-P1`` and ``-P2``, and uses in addition the option: -texture_thresh (default = 10): The disparity is only computed for pixels whose "texture" measure is no less than this value. Hence lowering this will result in the disparity being computed at more pixels but it may be more erroneous. The full default string of options that is used by ``--stereo-algorithm`` is:: "opencv_bm -block_size 21 -texture_thresh 10 -prefilter_cap 31 -uniqueness_ratio 15 -speckle_size 100 -speckle_range 32 -disp12_diff 1" and any of these can be modified as for the SGBM algorithm. Notice how the BM algorithm has to use a bigger block size than SGBM. .. _adding_algos: Adding new algorithms to ASP ---------------------------- ASP makes it possible for anybody to add their own algorithm to be used for stereo correlation without having to recompile ASP itself. Any such algorithm must be a program to be invoked as:: myprog left_image.tif right_image.tif \ output_disparity.tif Here, as often assumed in the computer vision community, ``left_image.tif`` and ``right_image.tif`` are small image clips with epipolar alignment applied to them, so that the epipolar lines are horizontal and the resulting disparity only need to be searched in the ``x`` direction (along each row). The images must have the same size. (ASP will take care of preparing these images.) The images must be in the TIF format, with pixel values being of the ``float`` type, and no-data pixels being set to ``NaN``. The output disparity is expected to satisfy the same assumptions and be of dimensions equal to those of the input images. The options passed to this program are expected to have no other characters except letters, numbers, space, period, underscore, plus, minus, and equal signs. Each option must have exactly one value, such as:: -opt1 val1 -opt2 val2 -opt3 val3 (More flexible options, including boolean ones, so with no value, may be implemented going forward.) Such a program, say named ``myprog``, should be copied to the location:: plugins/stereo/myprog/bin/myprog relative to the ASP top-level directory. Any libraries this program depends on *must be copied or sym-linked as absolute path to directory*:: plugins/stereo/myprog/lib Then, add a line to the file:: plugins/stereo/plugin_list.txt in the ASP top-level directory, in the format:: myprog plugins/stereo/myprog/bin/myprog plugins/stereo/myprog/lib The entries here are the program name (in lowercase), path to the program, and path to libraries. As of build 2025/11 (:numref:`release`), the path to the libraries can be a combination of multiple relative and absolute paths, separated by a colon (``:``). The relative paths will be made to be relative to the ASP library directory. Then, ASP can invoke this program by calling it, for example, as:: parallel_stereo --alignment-method local_epipolar \ --stereo-algorithm "myprog " \ The program will be called for each pair of locally aligned tiles obtained from these input images, with one subdirectory for each such pair of inputs. That subdirectory will also have the output disparity produced by the program. All such disparities will be read back by ASP, blended together, then ASP will continue with the steps of disparity filtering and triangulation. It may be helpful to visit one of such subdirectories, examine the ``stereo_corr`` log file which will show how precisely the program was called, and the path to the libraries for the plugins. Also look at its input image tiles and output disparity stored there. Note such auxiliary data is removed by default, unless ``parallel_stereo`` is called with the option ``--keep-only unchanged`` (:numref:`parallel_stereo`). ================================================ FILE: docs/stereodefault.rst ================================================ .. _stereodefault: The ``stereo.default`` file =========================== The ``stereo.default`` file contains configuration parameters that the ``parallel_stereo`` (:numref:`parallel_stereo`) and ``stereo`` programs use to process images. The ``stereo.default`` file is loaded from the current working directory, unless a different file is specified with the ``-s`` option. The file extension is not important. As mentioned in :numref:`cmdline`, all the ``parallel_stereo`` parameters can also be specified on the command line, by prepending them with two dashes. The command-line options take precedence over what is specified in this file. This file is optional, and it is often preferred to only use command-line options. A sample ``stereo.default.example`` file is included in the top-level directory of the Stereo Pipeline software distribution. That configuration is optimized for speed. See :numref:`nextsteps` for various speed-vs-accuracy tradeoffs of stereo algorithms. Listed below are the parameters used by ``parallel_stereo``, grouped by processing stage. .. _stereodefault-pprc: Preprocessing ------------- Interest point determination ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ip-per-tile How many interest points to detect in each :math:`1024^2` image tile (default: automatic determination). This is before matching. Not all interest points will have a match. See also ``--matches-per-tile``. ip-per-image How many interest points to detect in each image (default: automatic determination, usually 5000). Can set either this or ``--ip-per-tile``. ip-detect-method What type of interest point detection algorithm to use for image alignment. 0 = Custom OBAloG (:cite:`jakkula2010efficient`) implementation (default), 1 = SIFT implementation from OpenCV, 2 = ORB implementation from OpenCV. The SIFT method, unlike OBALoG, produces interest points that are accurate to subpixel level. Remove any existing ``.vwip`` files before recomputing interest points with a different method. epipolar-threshold Maximum distance in pixels from the epipolar line to search for matches for each interest point. Due to the way ASP finds matches, reducing this value can actually increase the number of interest points detected. If image alignment seems to be working well but you are not getting enough interest points to get a good search range estimate, try setting this value to a small number, perhaps in the low double digits. ip-inlier-factor A higher factor will result in more interest points, but perhaps also more outliers and a bigger search range. It is important to note that this parameter overlaps somewhat in scope and effect with ``--epipolar-threshold`` and sometimes not both are active. It is suggested to experiment with both, as well as with ``--ip-uniqueness-threshold`` below, which has a different justification but also somewhat similar effects. ip-uniqueness-threshold A higher threshold will result in more interest points, but perhaps less unique ones. ip-triangulation-max-error When matching IP, filter out any pairs with a triangulation error higher than this. ip-num-ransac-iterations How many RANSAC iterations to do in interest point matching. ip-nodata-radius Remove IP near nodata with this radius, in pixels. force-reuse-match-files Force reusing the match files even if older than the images or cameras. match-files-prefix Use the match file with this prefix. Normally match files are created with ``bundle_adjust`` or ``parallel_stereo``. Works only with non-mapprojected images. See the naming convention in :numref:`ba_match_files`. See also ``clean-match-files-prefix``. Only one of these two options can be specified. clean-match-files-prefix Use as input match file the ``*-clean.match`` file from this prefix (this had the outliers filtered out by ``bundle_adjust``). See also ``match-files-prefix``. matches-per-tile How many interest point matches to compute in each image tile (of size normally :math:`1024^2` pixels). Use a value of ``--ip-per-tile`` a few times larger than this. See also ``--matches-per-tile-params``. matches-per-tile-params To be used with ``--matches-per-tile``. The first value is the image tile size for both images. A larger second value allows each right tile to further expand to this size, resulting in the tiles overlapping. This may be needed if the homography alignment between these images is not great, as this transform is used to pair up left and right image tiles. band Use this band (channel) from input images if more than one. The band count starts from 1. If not set and more than one band is present, use the first band and print a warning. ortho-heights It is assumed that the left and right input images have been mapprojected onto surfaces with these heights above a datum. The datum is read from the image geoheaders. See :numref:`mapproj_ortho`. .. _image_alignment: Image alignment ~~~~~~~~~~~~~~~ alignment-method (= affineepipolar, local_epipolar, homography, epipolar, none) (default = affineepipolar) When ``alignment-method`` is set to ``local_epipolar``, the images are divided into small tiles with padding (:numref:`ps_tiling`). Local epipolar alignment is applied to each pair of tiles, making the stereo disparity horizontal, then a desired 1D correlation algorithm (specified via ``--stereo-algorithm``) finds this disparity :cite:`de2014automatic`. Then the local alignment is undone for each disparity, the resulting disparities are merged and blended across the tiles, ASP's subpixel refinement is applied, if set via ``--subpixel-mode``, the combined disparity is filtered, and triangulation is performed. This mode works only with ``parallel_stereo``. When ``alignment-method`` is set to ``affineepipolar``, ``parallel_stereo`` will attempt to pre-align the images by detecting tie-points using feature matching, and using those to transform the images such that pairs of conjugate epipolar lines become collinear and parallel to one of the image axes. The effect of this is equivalent to rotating the original cameras which took the pictures. When ``alignment-method`` is set to ``homography``, ``parallel_stereo`` will attempt to pre-align the images by automatically detecting tie-points between images using a feature matching. Tie points are stored in a ``*.match`` file that is used to compute a linear homography transformation of the right image so that it closely matches the left image. Note: the user may exercise more control over this process by using the ``ipfind`` and ``ipmatch`` tools. When ``alignment-method`` is set to ``epipolar``, ``parallel_stereo`` will apply a 3D transform to both images so that their epipolar lines will be horizontal. This speeds of stereo correlation as it greatly reduces the area required for searching. Epipolar alignment is *only available* with ``--session-type pinhole`` or ``nadirpinhole`` (:numref:`ps_options`). global-alignment-threshold (*float*) (default = 10) Maximum distance from inlier interest point matches to the epipolar line when calculating the global affine epipolar alignment. local-alignment-threshold (*float*) (default = 2) Maximum distance from inlier interest point matches to the epipolar line when calculating the local affine epipolar alignment. alignment-num-ransac-iterations (*integer*) (default = 1000) How many RANSAC iterations to use for global or local epipolar alignment. outlier-removal-params (*double, double*) (default = 95.0, 3.0) 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. These values are rather relaxed by default to not remove good data with a big spread. disparity-range-expansion-percent (*integer*) (default = 20) Expand the disparity range estimated from interest points by this percentage before computing the stereo correlation with local epipolar alignment. flann-method (*string*) (default = "auto") Choose the FLANN method for matching interest points. Options: ``kmeans``: slower but deterministic, ``kdtree``: faster (up to 6x) but not deterministic (starting with FLANN 1.9.2). The default (``auto``) is to use ``kmeans`` for 25,000 features or less and ``kdtree`` otherwise. This does not apply to ORB feature matching. Other pre-processing options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ force-use-entire-range By default, the Stereo Pipeline will normalize ISIS images so that their maximum and minimum channel values are :math:`\pm`\ 2 standard deviations from a mean value of 1.0. Use this option if you want to *disable* normalization and force the raw values to pass directly to the stereo correlations algorithms. For example, if the ISIS ``histeq`` tool has already been used to normalize the images, then use this option to disable normalization as a (redundant) pre-processing step. individually-normalize By default, the maximum and minimum valid pixel value is determined by looking at both images. Normalized with the same "global" min and max guarantees that the two images will retain their brightness and contrast relative to each other. This option forces each image to be normalized to its own maximum and minimum valid pixel value. This is useful in the event that images have different and non-overlapping dynamic ranges. You can sometimes tell when this option is needed: after a failed stereo attempt one of the rectified images (``*-L.tif`` and ``*-R.tif``) may be either mostly white or black. Activating this option may correct this problem. Note: Photometric calibration and image normalization are steps that can and should be carried out beforehand using ISIS's own utilities. This provides the best possible input to the stereo pipeline and yields the best stereo matching results. dem Input DEM for processing map-projected images. Can be used instead of specifying the DEM as the last positional argument (:numref:`mapproj-example`). matches-as-txt Read and write match files as plain text instead of binary. See :numref:`txt_match` for more details. skip-image-normalization 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. nodata-value (default = NaN) Pixels with values less than or equal to this number are treated as no-data. This overrides the nodata values from input images. stddev-mask-kernel (*integer*) (default = -1) 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``. stddev-mask-thresh (*double*) (default = 0.5) 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``. datum (default = "") Set the planet 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). If not set or inferred from the images or camera models, the datum will be auto-guessed based on camera centers (for Earth, Mars, and Moon). no-datum Do not assume a reliable datum exists, such as for irregularly shaped bodies or when at the ground level. This is also helpful when the input cameras are not very accurate, as the datum is used to do some camera-based filtering of interest points. skip-rough-homography Skip the step of performing datum-based rough homography if it fails. left-image-crop-win xoff yoff xsize ysize Do stereo in a region of the left image. Default: use the entire image. This option forces redoing all the pre-processing steps if a run is resumed. The region be created by ``stereo_gui`` (:numref:`stereo_gui`). See also ``right-image-crop-win`` and ``proj-win``. right-image-crop-win xoff yoff xsize ysize When combined with ``left-image-crop-win``, do stereo in given subregions of left and right images. The crop windows can be determined using ``stereo_gui``. See also ``proj-win``. proj-win minx miny maxx maxy Limit stereo to this projection window for input mapprojected images (:numref:`mapproj-example`). Also works with :ref:`stereo_dist`. This option forces redoing all the pre-processing steps in a resumed run. Available in build 2026-01 or later (:numref:`release`). See also ``left-image-crop-win`` and ``right-image-crop-win``. left-image-clip: (*string*) (default = "") If ``--left-image-crop-win`` is used, replaced the left image cropped to that window with this clip. right-image-clip: (*string*) (default = "") If ``--right-image-crop-win`` is used, replaced the right image cropped to that window with this clip. accept-provided-mapproj-dem Accept the DEM provided on the command line as the one mapprojection was done with, even if it disagrees with the DEM recorded in the geoheaders of input images. allow-different-mapproject-gsd Allow the left and right mapprojected images to have different GSD. This is for backward compatibility and is not recommended, as it can produce worse results. threads (*integer*) (default = 0) Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. cache-size-mb (*integer*) (default = 1024) Set the system cache size, in MB, for each process. .. _corr_section: Correlation ----------- stereo-algorithm (*string*) (default = "asp_bm") Use this option to switch between the different stereo correlation algorithms supported by ASP. Options: ``asp_bm``, ``asp_sgm``, ``asp_mgm``, ``asp_final_mgm``, ``mgm`` (original author implementation), ``opencv_sgbm``, ``libelas``, ``msmw``, ``msmw2``, and ``opencv_bm``. See :numref:`stereo_algos` for their description. prefilter-mode (= 0,1,2) (default = 2) Filter used to prepare images before performing correlation. Used only with the ``asp_bm`` algorithm. Options: 0 - None 1 - Subtracted mean Takes a preferably large Gaussian kernel and subtracts its value from the input image. This effectively reduces low frequency content in the image. The result is correlation that is immune to translations in image intensity. 2 - LoG filter Takes the Laplacian of Gaussian of the image. This provides some immunity to differences in lighting conditions between a pair of images by isolating and matching on blob features in the image. For all of the modes above, the size of the filter kernel is determined by the ``prefilter-kernel-width`` parameter below. The choice of pre-processing filter must be made with thought to the cost function being used (see ``cost-mode``, below). LoG filter preprocessing provides good immunity to variations in lighting conditions and is usually the recommended choice. prefilter-kernel-width (*float*) (default = 1.5) The diameter of the Gaussian convolution kernel used for the prefilter modes 1 and 2 above. A value of 1.5 works well for ``LoG`` and 25 - 30 works well for ``subtracted mean``. corr-seed-mode (=0,1,2,3) (default = 1) This integer parameter selects a strategy for how to solve for the low-resolution integer correlation disparity, which is used to seed the full-resolution disparity later on. 0 - None Don't calculate a low-resolution variant of the disparity image. The search range provided by ``corr-search`` is used directly in computing the full-resolution disparity. 1 - Low-resolution disparity from stereo Calculate a low-resolution version of the disparity from the integer correlation of subsampled left and right images. The low-resolution disparity will be used to narrow down the search range for the full-resolution disparity. This is a useful option despite the fact that our integer correlation implementation does indeed use a pyramid approach. Our implementation cannot search infinitely into lower resolutions due to its independent and tiled nature. This low-resolution disparity seed is a good hybrid approach. 2 - Low-resolution disparity from an input DEM Use a lower-resolution DEM together with an estimated value for its error to compute the low-resolution disparity, which will then be used to find the full-resolution disparity as above. These quantities can be specified via the options ``disparity-estimation-dem`` and ``disparity-estimation-dem-error`` respectively. See also :numref:`d_sub_dem`. 3 - Disparity from full-resolution images at a sparse number of points. This is an advanced option for terrain having snow and no large-scale features. This is described in :numref:`sparse_disp`. corr-sub-seed-percent (*float*) (default=0.25) When using ``corr-seed-mode 1``, the solved-for or user-provided search range is grown by this factor for the purpose of computing the low-resolution disparity. min-num-ip (*integer*) (default = 20) Automatic search range estimation will quit if at least this many interest points are not detected. cost-mode (= 0, 1, 2, 3, 4) The default is 2 for the ``asp_bm`` algorithm and 4 for ``asp_sgm`` and ``asp_mgm``. This defines the cost function used during integer correlation. Squared difference is the fastest cost function. However it comes at the price of not being resilient against noise. Absolute difference is the next fastest and is a better choice. Normalized cross correlation is the slowest but is designed to be more robust against image intensity changes and slight lighting differences. Normalized cross correlation is about 2x slower than absolute difference and about 3x slower than squared difference. The census transform :cite:`zabih1994census` and ternary census transform :cite:`hua2016texture` can only be used with the ASP_SGM and ASP_MGM correlators. See :numref:`asp_sgm` for details. | 0 - absolute difference | 1 - squared difference | 2 - normalized cross correlation | 3 - census transform | 4 - ternary census transform corr-kernel (*integer integer*) The default is 21 x 21 for the ``asp_bm`` algorithm and 5 x 5 for the ``asp_sgm`` and ``asp_mgm`` algorithms (:numref:`asp_sgm`). This option determine the size (in pixels) of the correlation kernel used in the initialization step. A different size can be set in the horizontal and vertical directions, but square correlation kernels are almost always used in practice. The kernel size is at most 9 x 9 with ``--stereo-algorithm asp_mgm`` or ``asp_sgm``. corr-search (*integer integer integer integer*) These parameters determine the size of the initial correlation search range. It will be used to find the low-resolution disparity (:numref:`d_sub`), which will then be used to find the full-resolution disparity (:numref:`stereo_corr`). This is an advanced parameter. Normally, the search range is automatically determined based on interest point matches. The ideal search range depends on a variety of factors ranging from how the images were pre-aligned to the resolution and range of disparities seen in a given image pair. This search range is successively refined during initialization, so it is often acceptable to set a large search range that is guaranteed to contain all of the disparities in a given image. However, setting tighter bounds on the search can sometimes reduce the number of erroneous matches, so it can be advantageous to tune the search range for a particular data set. These four integers define the minimum horizontal and vertical disparity and then the maximum horizontal and vertical disparity. With this option and with ``alignment-method`` being ``none`` or ``epipolar``, ``parallel_stereo`` will continue even if interest point matching fails. In either case, interest point matches will not be used to initialize the search range. See also the option ``corr-search-limit``. That is used to constrain any produced search range, rather than initialize it as here. max-disp-spread (*double*) (default = -1.0) 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``. Use this with care. With non-mapprojected images, the valid spread of the disparity can be a few thousand pixels, if the terrain is very steep. With mapprojected images this likely should be under 100-200 pixels. In the latest build of ASP, if this is set, it will be applied in each process that computes the disparity. In older ASP, the existing low-resolution disparity needs to be deleted before restarting a run with this option. That disparity also needs to be deleted if it is desired to relax or no longer use this option. corr-search-limit (*integer integer integer integer*) Set these parameters to constrain the disparity search range, whether it was produced based on interest point matches, with ``corr-search``, or other methods (:numref:`d_sub`). This limit is applied before both the low-resolution and full-resolution disparity computation. The interpretation of the four values are as for ``corr-search``. See also ``--max-disp-spread``. ip-filter-using-dem (*string*) (default = "") 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: ' . Example: 'dem.tif 50.0'. elevation-limit (*float float*) (default = ``unspecified``) Remove as outliers interest points whose height above datum (in meters) does not fall within this range. This can reduce the disparity search range. corr-max-levels (*integer*) (default = 5) The maximum number of additional (lower) resolution levels to use when performing integer correlation. Setting this value to zero just performs correlation at the native resolution. xcorr-threshold (*float*) (default = 2.0) Integer correlation to a limited sense performs a correlation forward and backwards to double check its result. This is one of the first filtering steps to insure that we have indeed converged to a global minimum for an individual pixel. The ``xcorr-threshold`` parameter defines an agreement threshold in pixels between the forward and backward result. See also ``--save-left-right-disparity-difference``. Optionally, this parameter can be set to a negative number. This will signal the correlator to only use the forward correlation result. This will drastically improve speed at the cost of additional noise. min-xcorr-level (*integer*) (default = 0) When using the cross-correlation check controlled by xcorr-threshold, this parameter sets the minimum pyramid resolution level that the check will be performed at. By default the check will be performed at every resolution level but you may wish to increase this value to save time by not doubling up on processing the largest levels. Currently this feature is not enabled when using the default block-matching correlation method. In that case the cross correlation check is only ever performed on the last resolution level, which is level 0. save-left-right-disparity-difference Save the discrepancy between left-to-right and right-to-left disparities, defined as ``max(abs(left_disp_x - right_disp_x), abs(left_disp_y - right_disp_y))``. Assumes a non-negative value of ``--xcorr-threshold`` and stereo algorithms ``asp_bm``, ``asp_sgm``, ``asp_mgm``, or ``asp_final_mgm``. Missing values are set to no-data. This is saved to ``-L-R-disp-diff.tif``. rm-quantile-percentile (*double*) (default = 0.85) See rm-quantile-multiple for details. rm-quantile-multiple (*double*) (default = -1) Used for filtering disparity values in the low-resolution disparity ``D_sub.tif`` (:numref:`outputfiles`). Disparities greater than ``quantile multiple`` times the ``quantile percentile`` (of the histogram) will be discarded. If this value is set greater than zero, this filtering method will be used instead of the method using the values ``rm-min-matches`` and ``rm_threshold``. This method will help filter out clusters of pixels which are too large to be filtered out by the neighborhood method but that have disparities significantly greater than the rest of the image. corr-timeout (*integer*) (default = 900) Correlation timeout for an image tile, in seconds. corr-blob-filter (*integer*) (default = 0) Set to apply a blob filter in each level of pyramidal integer correlation. When the correlator fails it often leaves "islands" of erroneous disparity results. Using this blob filter to remove them cleans up the final stereo output and can even reduce processing times by preventing the correlator from searching at large, incorrect disparity amounts. The value provided is the size of blobs in pixels that will be removed at the full image resolution. sgm-collar-size (*integer*) (default = auto) Specify the size of a region of additional processing around each correlation tile for SGM, MGM, and external algorithms. This helps reduce seam artifacts at tile borders when processing an image that needs to be broken up into tiles at the cost of additional processing time. This has no effect if the entire image can fit in one tile. See :numref:`ps_tiling`. corr-tile-size (*integer*) (default = auto) An internal parameter that sets the size of each tile to be processed. This is set automatically. See :numref:`ps_tiling` for user-accessible controls. sgm-search-buffer (*integer integer*) (default = 4 4) This option determines the size (in pixels) searches around the expected disparity location in successive levels of the correlation pyramid. A smaller value will decrease run time and memory usage but will increase the chance of blunders. It is not recommended to reduce either value below 2. corr-memory-limit-mb (*integer*) (default = 5120) Restrict the amount of memory used by the correlation step to be slightly above this value. This only really affects SGM/MGM which use a pair of large memory buffer in their computation. The total memory usage of these buffers is compared to this limit, and if it is greater then smaller search ranges will be used for uncertain pixels in order to reduce memory usage. If the required memory is still over this limit then the program will error out. The unit is in megabytes. correlator-mode Function as an image correlator only (including with subpixel refinement). Assume no cameras, aligned input images, and stop before triangulation, so at filtered disparity. See :numref:`correlator-mode` for more details. disparity-estimation-dem (*string*) (default = "") The DEM to use in estimating the low-resolution disparity (when ``corr-seed-mode`` is 2). disparity-estimation-dem-error (*double*) (default = 0.0) Error, or uncertainty, in meters, of the disparity estimation DEM. disparity-estimation-sample-rate (*int*) (default = 1) Use one out of this many samples along each row and column, for ``corr-seed-mode 2``. stereo-debug A developer option used to debug stereo correlation. local-alignment-debug A developer option used to debug local epipolar alignment issues. An example is in :numref:`local_alignment_issues`. .. _subpixel_options: Subpixel refinement ------------------- subpixel-mode (*integer*) (default = auto) This parameter selects the subpixel correlation method. Parabola subpixel (mode 1) is very fast but will produce results that are only slightly more accurate than those produced by the integer disparity step. Bayes EM (mode 2) is very slow but offers the best quality. When tuning ``stereo.default`` parameters, it is expedient to start out using parabola subpixel as a "draft mode." When the results are looking good with parabola subpixel mode, then they will look even better with subpixel mode 2. For inputs with little noise, the affine method (subpixel mode 3) may produce results equivalent to Bayes EM in a shorter time. Phase correlation (subpixel mode 4) is uses a frequency domain technique. It is slow and is best may not produce better results than mode 2 but it may work well in some situations with flat terrain. Subpixel modes 5 and 6 are experimental. Modes 7-12 are only used as part of SGM/MGM correlation (see the stereo algorithms in :numref:`stereo_alg_overview`). These are much faster than subpixel modes 2-4 and if selected (with SGM/MGM) will be the only subpixel mode performed. They interpolate between the SGM/MGM integer results and should produce reasonable values. The default blend method for SGM/MGM is a custom algorithm that should work well but the you may find that one of the other options is better for your data. Subpixel modes 1-4 can be used in conjunction with SGM/MGM. In this case subpixel mode 12 will be used first, followed by the selected subpixel mode. Depending on your data this may produce better results than using just the SGM/MGM only methods. You may get bad artifacts combining mode 1 with SGM/MGM. | 0 - no subpixel refinement | 1 - parabola fitting | 2 - affine adaptive window, Bayes EM weighting | 3 - affine window | 4 - phase correlation | 5 - Lucas-Kanade method (experimental) | 6 - affine adaptive window, Bayes EM with Gamma Noise Distribution (turned off) | 7 - SGM None | 8 - SGM linear | 9 - SGM Poly4 | 10 - SGM Cosine | 11 - SGM Parabola | 12 - SGM Blend The default subpixel mode value is 1 with ``--stereo-algorithm asp_bm`` and 12 with the ``asp_sgm`` and ``asp_mgm`` algorithms. See :cite:`Miclea_subpixel` for the SGM subpixel methods. For a visual comparison of the quality of these subpixel modes, refer back to :numref:`correlation`. subpixel-kernel (*integer integer*) (default = 35 35) Specify the size of the horizontal and vertical size (in pixels) of the subpixel correlation kernel. It is advantageous to keep this small for parabola fitting in order to resolve finer details. However for the Bayes EM methods, keep the kernel slightly larger. Those methods weight the kernel with a Gaussian distribution, thus the effective area is small than the kernel size defined here. This affects ``edge-buffer-size``. phase-subpixel-accuracy (*integer*) (default = 20) Set the maximum resolution of the phase subpixel correlator. The maximum resolution is equal to 1.0 / this value. Larger values increase accuracy but also computation time. .. _filter_options: Filtering --------- filter-mode (*integer*) (default = 1) This parameter sets the filter mode. Three modes are supported as described below. Here, by neighboring pixels for a current pixel we mean those pixels within the window of half-size of ``rm-half-kernel`` centered at the current pixel. The default is 1 for the full-resolution disparity, but mode 2 is hard-coded for filtering the low-resolution disparity ``D_sub.tif``. Options: 0 No filtering. 1 Filter by discarding pixels at which disparity differs from mean disparity of neighbors by more than ``max-mean-diff``. 2 Filter by discarding pixels at which percentage of neighboring disparities that are within ``rm-threshold`` of current disparity is less than ``rm-min-matches``. rm-half-kernel (*integer integer*) (default = 5 5) This setting adjusts the behavior of an outlier rejection scheme that "erodes" isolated regions of pixels in the disparity map that are in disagreement with their neighbors. The two parameters determine the size of the half kernel that is used to perform the automatic removal of low confidence pixels. A 5 |times| 5 half kernel would result in an 11 |times| 11 kernel with 121 pixels in it. max-mean-diff (*integer*) (default = 3) This parameter sets the *maximum difference* between the current pixel disparity and the mean of disparities of neighbors in order for a given disparity value to be retained (for ``filter-mode`` 1). rm-min-matches (*integer*) (default = 60) This parameter sets the *percentage* of neighboring disparity values that must fall within the inlier threshold in order for a given disparity value to be retained (for ``filter-mode`` 2). rm-threshold (*double*) (default = 3) This parameter sets the inlier threshold for the outlier rejection scheme. This option works in conjunction with ``rm-min-matches`` above. A disparity value is rejected if it differs by more than ``rm_threshold`` disparity values from ``rm-min-matches`` percent of pixels in the region being considered (for ``filter-mode`` 2). rm-cleanup-passes (*integer*) (default = 1) Select the number of outlier removal passes that are carried out. Each pass will erode pixels that do not match their neighbors. One pass is usually sufficient. median-filter-size (*integer*) (default = 0) Apply a median filter of the selected kernel size to the subpixel disparity results. This option can only be used if ``rm-cleanup-passes`` is set to zero. texture-smooth-size (*integer*) (default = 0) Apply an adaptive filter to smooth the disparity results inversely proportional to the amount of texture present in the input image. This value sets the maximum size of the smoothing kernel used (in pixels). This option can only be used if ``rm-cleanup-passes`` is set to zero. texture-smooth-scale (*float*) (default = 0.15) Used in conjunction with ``texture-smooth-size``, this value helps control the regions of the image that will be smoothed. A larger value will result in more smoothing being applied to more of the image. A smaller value will leave high-texture regions of the image unsmoothed. enable-fill-holes Enable filling of holes in disparity using an inpainting method. Obsolete. It is suggested to use instead point2dem's analogous functionality. fill-holes-max-size (*integer*) (default = 100,000) Holes with no more pixels than this number should be filled in. edge-buffer-size (*integer*) (default = -1) Crop to be applied around image borders during filtering. If not set, and ``subpixel-mode`` is between 1 and 6 (inclusive), use the max of two ``subpixel-kernel`` values. Otherwise set to 5. erode-max-size (*integer*) (default = 0) Isolated blobs with no more pixels than this number should be removed. gotcha-disparity-refinement Turn on the experimental Gotcha disparity refinement (:numref:`casp_go`). It refines and overwrites ``F.tif``. See the option ``casp-go-param-file`` for customizing its behavior. casp-go-param-file (*string*) (default = ""): The parameter file to use with Gotcha disparity refinement when invoking the ``gotcha-disparity-refinement`` option. The default is to use the file ``share/CASP-GO_params.xml`` shipped with ASP. .. _triangulation_options: Post-processing (triangulation) ------------------------------- near-universe-radius (*float*) (default = 0.0) far-universe-radius (*float*) (default = 0.0) These parameters can be used to remove outliers from the 3D triangulated point cloud. The points that will be kept are those whose distance from the universe center (see below) is between ``near-universe-radius`` and ``far-universe-radius``, in meters. universe-center (default = none) Defines the reference location to use when filtering the output point cloud using the above near and far radius options. The available options are: None Disable filtering. Camera Use the left camera center as the universe center. Zero Use the planet center as the universe center. bundle-adjust-prefix (*string*) Use the camera adjustments obtained by previously running bundle_adjust with this output prefix. min-triangulation-angle (*double*) 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. max-valid-triangulation-error (*double*) (default = 0.0) If positive, points with triangulation error larger than this will be removed from the cloud. Measured in meters. point-cloud-rounding-error (*double*) 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: :math:`1/2^{10}` meters (about 1mm) for Earth and proportionally less for smaller bodies, unless error propagation happens (:numref:`error_propagation`), when it is set by default to :math:`10^{-8}` meters, to avoid introducing step artifacts in these errors. See also ``--save-double-precision-point-cloud`` below, and ``--rounding-error`` in ``point2dem`` (:numref:`point2dem_options`). save-double-precision-point-cloud 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). num-matches-from-disp-triplets (*integer*) (default = 0) Create a match file with roughly this many points uniformly sampled from the stereo disparity, while making sure that if there are more than two images, a set of ground features are represented by matches in at least three of them. These are useful when refining camera intrinsics (:numref:`floatingintrinsics`) or solving for jitter (:numref:`jitter_solve`). See :numref:`dense_ip` for more details. To not continue with triangulation, use ``--compute-point-cloud-center-only``. num-matches-from-disparity (*integer*) (default = 0) Create a match file with roughly this many points uniformly sampled from the stereo disparity. The matches are between original images (that is, before any alignment or map-projection). These can be used in bundle adjustment See also ``num-matches-from-disp-triplets``. compute-point-cloud-center-only Only compute the center of triangulated point cloud and exit. Hence, do not compute the triangulated point cloud. compute-error-vector When writing the output point cloud, save the 3D triangulation error vector (the vector between the closest points on the rays emanating from the two cameras), rather than just its length. In this case, the point cloud will have 6 bands (storing the triangulation point and triangulation error vector) rather than the usual 4. When invoking ``point2dem`` on this 6-band point cloud and specifying the ``--errorimage`` option, the error image will contain the three components of the triangulation error vector in the North-East-Down coordinate system. enable-atmospheric-refraction-correction Enable atmospheric refraction correction for Pleiades linescan cameras. By default, such a correction is enabled only for WorldView linescan cameras. enable-velocity-aberration-correction Enable velocity aberration correction for Pleiades linescan cameras. By default, such a correction is enabled only for WorldView linescan cameras. .. _stereo-default-error-propagation: Error propagation (used in triangulation) ----------------------------------------- propagate-errors Propagate the errors from the input cameras to the triangulated point cloud. See :numref:`error_propagation`. horizontal-stddev <*double double* (default = 0.0 0.0)> If positive, propagate these left and right camera horizontal ground plane stddev values through triangulation. To be used with ``--propagate-errors``. position-covariance-factor Multiply the satellite position covariances by this number before propagating them to the triangulated point cloud. Applicable only to Maxar(DigitalGlobe) linescan cameras. orientation-covariance-factor Multiply the satellite quaternion covariances by this number before propagating them to the triangulated point cloud. Applicable only to Maxar(DigitalGlobe) linescan cameras. Bathymetry correction options ----------------------------- These are options are used to infer the depth of shallow-water bodies (see :numref:`bathy_intro`). Pre-processing stage ~~~~~~~~~~~~~~~~~~~~ left-bathy-mask (*string*) Mask to use for the left image when doing bathymetry. Pixels classified as water must be either no data or have zero value in the mask, while land pixels must have positive value. right-bathy-mask (*string*) Mask to use for the right image when doing bathymetry. See also ``left-bathy-mask``. Triangulation stage ~~~~~~~~~~~~~~~~~~~ bathy-plane (*string*) Path to a file containing a plane approximating the water surface, for bathymetry correction with underwater terrain (:numref:`bathy_plane_def`). This corrects camera rays passing through water using Snell's law. If there is one plane per image, use ``bathy-plane-list``. Use together with ``refraction-index``. bathy-plane-list (*string*) Path to a file containing a list of bathy plane files for bathymetry correction, if more than one. Set one plane file per line. Must specify one plane per input image, in the same order. Use with ``refraction-index``. refraction-index (*double*) (default = 0.0) The index of refraction of water to be used in bathymetry correction. Must be specified and bigger than 1. This index can be computed with the :ref:`refr_index` program. output-cloud-type arg (*string*) (default = all) 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'). GUI options ----------- See :numref:`gui_options`. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/thirdparty.rst ================================================ Third party licenses ==================== .. include:: ../THIRDPARTYLICENSES.rst ================================================ FILE: docs/tips_tricks.rst ================================================ .. _tips: Tips and tricks =============== Here we summarize, in one place, some insights in how to get the most from ASP, particularly the highest quality results in the smallest amount of time. - Ask for help or if you have questions. We're always glad to share what we know, implement suggestions, and fix issues (:numref:`get-help`). - Use the GUI (:numref:`stereo_gui`) to get comfortable with ASP on a small region and to tune parameters (:numref:`stereo_gui`). A solution specific to ISIS images is to crop your stereo pair (using the ISIS ``crop`` command being careful to retain SPICE information, or ``cam2map4stereo.py`` for map-projected images) to a small region of interest. - The highest quality results with ASP can be obtained with map-projected images (:numref:`mapproj-example`). - Run stereo on multiple machines (:numref:`parallel_stereo`). - Improve the quality of the inputs to get better outputs. Bundle-adjustment can be used to find out the camera positions more accurately (:numref:`baasp`). CCD artifact correction can be used to remove artifacts from WorldView images (:numref:`wvcorrect-example`). - Align the output point cloud to some known absolute reference with ``pc_align`` (:numref:`pc-align-example`). - Remove noise from the output point cloud. During stereo triangulation, points that are further or closer than given distances from planet center or left camera center can be removed as outliers (:numref:`triangulation_options`). During DEM generation (:numref:`point2dem`), points with large triangulation error can be removed using ``--remove-outliers-params``. Spikes can be removed with ``--median-filter-params``. Points close to the boundary, that tend to be less accurate, can be eroded (``--erode-length``). - During stereo filtering, islands can be removed with ``--erode-max-size``. - Remove noise from the low-resolution disparity (D_sub) that can greatly slow down a run using ``--rm-quantile-percentile`` and ``--rm-quantile-multiple``. Some care is needed with these to not remove too much information. - Fill holes in output orthoimages for nicer display (also in DEMs), during DEM and orthoimage generation with ``point2dem`` (:numref:`point2dem`). Holes in an existing DEM can also be filled using ``dem_mosaic`` (:numref:`dem_mosaic`). - To get good results if the images lack large-scale features (such as for ice plains) use a different way to get the low-resolution disparity (:numref:`sparse_disp`). - If a run takes unreasonably long, decreasing the timeout parameter may be in order (:numref:`longrun`). - Manually set the search range if the automated approach fails (:numref:`search_range`). - To increase speed, the image pair can be subsampled. For ISIS images, the ISIS ``reduce`` command can be used, while for DigitalGlobe/Maxar data one can invoke the ``dg_mosaic`` tool (:numref:`dg_mosaic`, though note that this tool may introduce aliasing). With subsampling, you are trading resolution for speed, so this probably only makes sense for debugging or "previewing" 3D terrain. That said, subsampling will tend to increase the signal to noise ratio, so it may also be helpful for obtaining 3D terrain out of noisy, low quality images. - Photometric calibration (using the ISIS tools) can be used to improve the input images and hence get higher quality stereo results. - If your images have missing or inaccurate camera pose information, and they were acquired with frame (pinhole cameras), such data can be solved for using structure-from-motion and bundle adjustment (:numref:`sfm`). - Shape-from-shading (:numref:`sfs`) can be used to further increase the level of detail of a DEM obtained from stereo, though this is a computationally expensive process and its results are not easy to validate. We'll be happy to add here more suggestions from community's accumulated wisdom on using ASP. ================================================ FILE: docs/tools/add_spot_rpc.rst ================================================ .. _add_spot_rpc: add_spot_rpc ------------ The ``add_spot_rpc`` tool creates an RPC model to approximate a SPOT5 sensor model. The RPC model can be appended to the end of a SPOT5 metadata file, allowing it to be used with the RPC session type in other ASP tools. The most important application is to map project SPOT5 images, then to perform stereo on the map projected images with the ``spot5maprpc`` session type. If the output file does not exist, a new file is created containing the RPC model. Otherwise the RPC model is appended to an existing file. When an existing SPOT5 metadata file is the output file, the new RPC model is properly inserted into the file so that it is ready to use. An example for how to use this tool is given in :numref:`spot5`. Usage:: add_spot_rpc -o It is important to note that the tool expects the minimum and maximum simulation box heights (in meters, above the datum) in which to compute the RPC approximation. The defaults are 0 and 8000, corresponding to sea level and the highest location on Earth. Narrowing down these numbers (if it is known what range of terrain heights is expected) may result in slightly more accurate models. Command-line options for add_spot_rpc: -o, --output-prefix Specify the output prefix. --min-height The minimum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation. --max-height The maximum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation. --num-samples How many samples to use between the minimum and maximum heights. --penalty-weight Penalty weight to use to keep the higher-order RPC coefficients small. Higher penalty weight results in smaller such coefficients. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/aster2asp.rst ================================================ .. _aster2asp: aster2asp --------- The ``aster2asp`` tool takes as input an HDF file or a directory containing ASTER Level 1A data and creates TIF and XML files that can then be passed to :ref:`parallel_stereo` to create a point cloud. An example for how to fetch the data and use this tool is given in :numref:`aster`. ASTER acquires stereo imagery using two VNIR (visible and near-infrared) telescopes that view the same ground area from different angles: - **Band3N**: Nadir-looking telescope (views ground from directly above) - **Band3B**: Backward-looking telescope (views ground from behind at 27.6 degrees) Both bands have 15-meter resolution, enabling stereo reconstruction of terrain elevation. Input formats ~~~~~~~~~~~~~ The tool supports two ASTER Level 1A data formats: - **V003 directory format**: Pre-extracted text files with all metadata, including latitude and longitude grids. This was the original format distributed by NASA. - **V004 HDF format**: All data stored in HDF4_EOS datasets. The program automatically extracts the required datasets and computes latitude and longitude grids from the orbital geometry. This functionality is available in build 2026-01 or later (:numref:`release`). The various plain text files containing satellite positions, sight vectors, etc., are described in :cite:`abrams2002aster`. Usage ~~~~~ :: aster2asp -o For V004 HDF format:: aster2asp -o Output ~~~~~~ The tool will apply the existing radiometric corrections to the images, and save two images with Float32 pixels with names like ``out-Band3N.tif`` and ``out-Band3B.tif``. It will create approximate RPC camera models in XML format (:numref:`rpc`) for the left and right cameras, following :cite:`girod2015improvement`, with names of the form ``out-Band3N.xml`` and ``out-Band3B.xml``. See :numref:`aster` for how to run :ref:`parallel_stereo` with these files. RPC height range ~~~~~~~~~~~~~~~~ It is important to note that the tool expects the minimum and maximum simulation box heights (in meters, above the datum) in which to compute the RPC approximation. The defaults are 0 and 8000, corresponding to sea level and the highest location on Earth. Narrowing down these numbers (if it is known what range of terrain heights is expected) may result in slightly more accurate models. References ~~~~~~~~~~ For more information about ASTER data formats, see: - `ASTER User Guide Version 4 `_ - `ASTER L1 Product Specifications `_ Command-line options ~~~~~~~~~~~~~~~~~~~~ -o, --output-prefix Specify the output prefix. --min-height The minimum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation. --max-height The maximum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation. --num-samples How many samples to use between the minimum and maximum heights. --penalty-weight Penalty weight to use to keep the higher-order RPC coefficients small. Higher penalty weight results in smaller such coefficients. --keep-tmp-dir Keep the temporary directory where HDF data is extracted (for debugging). --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/bathy_plane_calc.rst ================================================ .. _bathy_plane_calc: bathy_plane_calc ---------------- The ``bathy_plane_calc`` program estimates the surface of a body of water as a plane in a local stereographic projection. This plane can be slightly non-horizontal due to imperfections in the positions and orientations of the cameras that were used to create the input DEM. Further context is given in :numref:`bathy_intro`. The examples below show the several ways in which the inputs can be specified. .. _bathy_plane_raw_img: Using a camera, a mask, and a DEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Preparation and running the program ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Given a multispectral stereo dataset, a DEM obtained from a pair of images for one of the bands, a camera file from that pair, and a mask for the corresponding raw camera image delineating water from land, the water plane can be found as follows:: bathy_plane_calc --session-type dg --mask mask.tif \ --camera camera.xml --dem dem.tif --num-samples 10000 \ --outlier-threshold 0.5 --bathy-plane plane.txt \ --output-inlier-shapefile inliers.shp Such a mask can be obtained by thresholding an image where the water shows up darker than the land. A good example for this is the band 7 of Digital Globe multispectral images. The thresholding happens as follows:: thresh=155 image_calc -c "gt(var_0, $thresh, 1, 0)" image.tif -o mask.tif The mask has values of 1 for land and 0 for water. The image must be raw, not projected, and if the image is part of a stereo pair, the corresponding camera for that image must be used. In particular, if the image is multispectral, the camera must be for this dataset, not for the PAN one. For the DEM, it is suggested to use the one obtained from PAN images, as it is more accurate, or otherwise from the Green band images. The NIR1 band is good for finding the masks, as the water is dark in them, but the DEM with NIR1 images may not be that accurate to use in this context. It is important to decide carefully what outlier threshold to use and to check the number of resulting inliers. If too few, that may mean that the outlier threshold is too strict. Above, the inliers are saved as a shapefile and can be inspected. The inliers should be well-distributed over the entire shoreline. For some datasets an outlier threshold of 1.0 works better than 0.5. For a stereo pair, this tool can be run with both the left image and left camera, then separately for the right image and right camera. Ideally the results should be very similar. The ``--session-type`` option determines which camera model to use (Digital Globe files have both an exact ``dg`` model and an approximate ``rpc`` model). See the next section for when it is possible to use the PAN DEM and/or data with alignments applied to them. Running this command will produce an output as follows:: Found 5017 / 13490 inliers. Max distance to the plane (meters): 6.00301 Max inlier distance to the plane (meters): 0.499632 Mean plane height above datum (meters): -22.2469 Writing: plane.txt .. _bathy_plane_def: Bathy plane definition ^^^^^^^^^^^^^^^^^^^^^^ The file ``plane.txt`` having the bathy plane will look like this:: -0.0090 0.0130 0.9998 22.2460 # Latitude and longitude of the local stereographic projection with the WGS_1984 datum: 24.5836 -81.7730 The last line has the center of the local stereographic projection in which the plane is computed, and the first line has the equation of the plane in that local coordinate system as:: a * x + b * y + c * z + d = 0. The value of ``c`` is almost 1, hence this plane is almost perfectly horizontal in local coordinates and the value of ``-d/c`` gives its height above the datum (The small deviation from the horizontal may be due to the orientations of the satellites taking the pictures not being perfectly known.) Handling adjusted cameras and alignment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The DEM and camera to be passed to ``bathy_plane_calc`` must be in the same coordinate system. That is the case, for example, for Digital Globe images, when no bundle adjustment or alignment is performed by the user. Without these, given a stereo pair having multispectral and PAN images, the DEM obtained with the multispectral images and cameras themselves are consistent with the DEM obtained from the PAN images and corresponding cameras, with the only difference being that the multispectral images are coarser by a factor of 4, hence the resulting DEM is less precise. Therefore, it is possible to use the PAN DEM instead of multispectral DEM with this tool, while still using the multispectral cameras. Great care must be used if bundle adjustment or alignment takes place, to keep all datasets consistent. If the multispectral images were bundle-adjusted, the same adjustments can be used with all multispectral bands. If the DEM above is obtained with bundle-adjusted multispectral images, then ``--bundle-adjust-prefix`` must be passed to ``bathy_plane_calc`` above. If it is desired to use the PAN DEM with ``bathy_plane_calc``, but bundle adjustment or alignment happened, with one or both of the multispectral and PAN pairs, the produced multispectral and PAN DEMs will no longer be aligned to each other. Thus, these must be individually aligned to a chosen reference DEM, the alignments applied to the cameras, as discussed in :numref:`ba_pc_align`, and then the updated multispectral camera adjustments must be passed to ``bathy_plane_calc`` via ``--bundle-adjust-prefix``. .. _bathy_plane_ortho_mask: Using a DEM and an orthoimage mask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this example we assume that there exists a DEM and an orthoimage which is consistent with the DEM and has zero or nodata values on water and positive values on land. The bathy plane is found as follows:: bathy_plane_calc \ --ortho-mask ortho_mask.tif \ --dem dem.tif \ --outlier-threshold 0.5 \ --bathy-plane plane.txt \ --output-inlier-shapefile inliers.shp An input mask can be created, for example, with ``image_calc`` (:numref:`image_calc_create_mask`). The orthoimage itself, before masking, can be produced with ``mapproject`` (:numref:`mapproject`). .. _bathy_plane_shapefile: Using a DEM and shapefile ~~~~~~~~~~~~~~~~~~~~~~~~~ This example uses a DEM and a shapefile whose vertices sample the water edge as inputs:: bathy_plane_calc \ --shapefile shape.shp \ --dem dem.tif \ --outlier-threshold 0.5 \ --output-inlier-shapefile inliers.shp \ --bathy-plane plane.txt As earlier, it is important to consider carefully what outlier threshold to use, and to examine the number and distribution of inliers. Here it is suggested that the DEM be obtained as in the previous example, from a stereo pair, and the shapefile delineating the water-land interface be drawn on top of an orthoimage created with the same stereo pair. The commands for that can be as follows:: parallel_stereo -t dg \ left.tif right.tif \ left.xml right.xml \ run/run point2dem --auto-proj-center \ --orthoimage run/run-L.tif \ run/run-PC.tif See :numref:`nextsteps` for a discussion about various speed-vs-quality choices in stereo, and the ``point2dem`` documentation in :numref:`point2dem`. Here is an example of a shapefile created on top of an orthoimage: .. figure:: ../images/examples/bathy/water_outline.png :name: bathy_water_plane_example Example of a shapefile whose vertices are at the water-land boundary. .. _bathy_plane_lonlat: Using a DEM and lon-lat values ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This example is similar to the one using a shapefile, but the points at which the DEM is sampled are provided in a CSV file having longitude and latitude values:: bathy_plane_calc \ --lon-lat-measurements meas.csv \ --csv-format "2:lon 3:lat" \ --dem dem.tif \ --outlier-threshold 0.5 \ --output-inlier-shapefile inliers.shp \ --bathy-plane plane.txt The heights will be looked up in the DEM with bilinear interpolation. The longitude and latitude will be interpreted relative to the DEM georeference. The ``--csv-format`` option must be set correctly to identify the columns having the longitude and latitude. The CSV file can have other columns as well (such as an ID), which will be ignored. See :numref:`bathy_plane_water_meas` for more details on the CSV format. .. _bathy_plane_water_meas: Using water height measurements ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this example, a set of actual measurements of the water surface is provided, as the longitude and latitude (in degrees, in decimal format), and water height above the WGS_1984 datum (ellipsoid heights), measured in meters. If the water heights are given relative to a geoid (such as EGM2008), or some other datum (such as NAD83), those need to be converted to WGS_1984. It is expected that the measurements are given in a CSV file, with commas or spaces used as separators. A procedure for collecting such data is outlined further down this document (:numref:`water_meas_collection`). Here is an sample file, named ``meas.csv``, for Florida Keys:: FID,Lon,Lat,WGS84_m 0,-81.59864018,24.58775288,-23.86539 1,-81.62377319,24.58180388,-23.84653 2,-81.62987019,24.57838388,-23.8864 3,-81.6745502,24.56443387,-23.86815 4,-81.71131321,24.55574886,-23.86031 5,-81.75447022,24.55158486,-23.85464 6,-81.75601722,24.55176286,-23.89892 7,-81.77999023,24.54843186,-23.89824 Any lines starting with the pound sign (``#``) will be ignored as comments. If the first line does not start this way but does not have valid data it will be ignored as well. Empty lines will be ignored too. The program is called as follows:: bathy_plane_calc --water-height-measurements meas.csv \ --csv-format "2:lon 3:lat 4:height_above_datum" \ --outlier-threshold 0.5 --bathy-plane meas_plane.txt \ --output-inlier-shapefile meas_inliers.shp Note the ``--csv-format`` option, which should be set correctly. As specified here, it will result in columns 2, 3, and 4, being read, having the longitude, latitude, and height above datum (WGS84 ellipsoid). The order in which the columns show up is not important, as long as ``--csv-format`` correctly reflects that. Any extraneous columns will be ignored, such as the ID in column 1. Care must be taken to ensure all the measurements, resulting bathy plane, and any DEMs are in the same coordinate system. This is discussed further in :numref:`bathy_ba_align`. .. _bathy_plane_mask_samples: Pick a sample set of points at the water-land boundary ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this example, instead of computing the best-fitting plane, ``bathy_plane_calc`` finds a set of samples (given by ``--num-samples``) at the water-land interface and saves them as a shapefile of points, having longitude-latitude pairs relative to the WGS_1984 datum (ellipsoid). Example:: bathy_plane_calc --session-type dg --mask mask.tif \ --camera camera.xml --dem dem.tif --num-samples 100 \ --mask-boundary-shapefile samples.shp When the input is a mask, a random sample is picked (their number given by ``--num-samples``). The heights are looked up in the DEM if not already present in the input. This shapefile may then be passed to some external tool for looking up water level heights at these points. .. _water_meas_collection: Acquisition of water height data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This section describes how to acquire a set of water height measurements, which then could be used to create the best-fit water plane for the purpose of shallow-water bathymetry. An example of using this data is given in :numref:`bathy_plane_water_meas`. Absent direct measurements of water surface level at the date and time of satellite image acquisition, it is suggested to use the discrete tidal zoning information provided by the `National Ocean Service `_ , while for the metadata use the `CO-OPS Discrete Tidal Zoning Map `_. An organizational Esri GIS online login is needed to access the data. Each polygon on the map is a discrete tidal zone, within which NOAA considers the tide characteristics the same. If the user clicks a polygon on the map, a window will pop up and show the control tide station (ControlStn) for that zone, average time corrector (AvgTimeCorr, in minutes), and range ratio (RangeRatio). Note that: - The control station is usually an active water level station of NOAA. - ``Average time corrector`` is the time difference (phase difference) between the tide at the tide zone and at the control station. Positive time means the tide level is this many minutes later in the tidal zone polygon than at the control station (and vice versa). - ``Range ratio`` is the ratio of tide range at the tidal zone divided by that at the control station. The user can access tidal gauge data for the satellite day and time of acquisition at the `Center for Operational Oceanographic Products and Services `_. Choose Verified Data-> Six Minutes Data->Try me. The user can download tide data in any reference as long as the value is expressed in meters. This value needs to be transformed into an ellipsoid heights value relative to the WGS_1984 datum. For this the `NOAA VDATUM Java program `_ can be used, or the `NOAA online app `_. Please note that even if lots of points on the land/water limit belong to the same tidal zone polygon, so they will have same elevation value, the transformation in ellipsoid heights with VDATUM will result in different ellipsoid heights since VDATUM uses the position of the point in latitude/longitude besides the height of the point. Export your data to a CSV file with a header containing ID, longitude, latitude, and WGS_1984 height measurements. Command-line options for bathy_plane_calc ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --shapefile The shapefile with vertices whose coordinates will be looked up in the DEM with bilinear interpolation. --dem The DEM to use. --mask An input mask, created from a raw camera image and hence having the same dimensions, with values of 1 on land and 0 on water, or positive values on land and nodata values on water. The larger of the nodata value and zero is used as the water value. The heights will be looked up in the DEM with bilinear interpolation. --camera The camera file to use with the mask. --bathy-plane arg The output file storing the computed plane (:numref:`bathy_plane_def`). --output-inlier-shapefile If specified, save at this location the shape file with the inlier vertices. --output-outlier-shapefile If specified, save at this location the shape file with the outlier vertices. --bundle-adjust-prefix Use the camera adjustment at this output prefix, if the cameras changed based on bundle adjustment or alignment. -t, --session-type 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 :numref:`ps_options` for options. --outlier-threshold A value, in meters, to determine the distance from a sampled point on the DEM to the best-fit plane to determine if it will be marked as outlier and not included in the calculation of that plane. The default is 0.5. Its value should be roughly the expected vertical uncertainty of the DEM. --num-ransac-iterations Number of RANSAC iterations to use to find the best-fitting plane. The default is 1000. --num-samples Number of samples to pick at the water-land interface if using a mask. The default is 10000. --ortho-mask An input mask, that is georeferenced and aligned with the DEM, with positive values on land and 0 or nodata values on water. The larger of the nodata value and zero is used as the water value. --lon-lat-measurements Use this CSV file having longitude and latitude measurements for the water surface. The heights will be looked up in the DEM with bilinear interpolation. The option --csv-format must be used. --water-height-measurements Use this CSV file having longitude, latitude, and height measurements for the water surface, in degrees and meters, respectively, relative to the WGS84 datum. The option --csv-format must be used. --csv-format Specify the format of the CSV file having water height measurements or longitude and latitude values. The format should have a list of entries with syntax column_index:column_type (indices start from 1). Example: '2:lon 3:lat 4:height_above_datum'. Note that this option must be enclosed in quotes so it is parsed correctly by the shell. --mask-boundary-shapefile If specified, save the extracted points (before RANSAC) to this shapefile and exit. When the input is a mask, a random sample is picked (their number given by ``--num-samples``). The heights are looked up in the DEM if not already present in the input. See an example in :numref:`bathy_plane_mask_samples`. --save-shapefiles-as-polygons Save the inlier and outlier shapefiles as polygons, rather than made of discrete vertices. May be more convenient for processing in a GIS tool. --dem-minus-plane If specified, subtract from the input DEM the best-fit plane and save the obtained DEM to this GeoTiff file. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/bathy_threshold_calc.rst ================================================ .. _bathy_threshold_calc: bathy_threshold_calc.py ----------------------- The ``bathy_threshold_calc.py`` program takes as input a single-channel image, for example, band 7 of a WorldView multispectral image, and computes the threshold separating the water and land pixels. See :numref:`bathy_thresh` for further context, and a sample output and graph. Example usage ~~~~~~~~~~~~~ Install the ``bathy`` conda environment as described in :numref:`bathy_threshold_dependencies` below. This program can be invoked as: :: ~/miniconda3/envs/bathy/bin/python $(which bathy_threshold_calc.py) \ --image image.tif --num-samples 1000000 Here it is assumed that ASP's ``bin`` directory is in the path, otherwise the full path to this Python script must be specified above. .. _bathy_threshold_dependencies: Dependencies ~~~~~~~~~~~~ This tool needs Python 3 and some additional Python packages to be installed with ``conda``. Conda can be obtained from https://docs.conda.io/en/latest/miniconda.html Run:: ./Miniconda3-latest-Linux-x86_64.sh on Linux, and the appropriate version on OSX (this script needs to be made executable first). Use the suggested:: $HOME/miniconda3 directory for installation. Activate conda. The needed packages can be installed as follows: :: conda create --name bathy -c conda-forge python=3.6 gdal conda activate bathy conda install -c conda-forge numpy scipy matplotlib Command-line options for bathy_threshold_calc.py ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -h, --help Display the help message. --image The single-channel image to use to find the water-land threshold. --num-samples The number of samples to pick from the image (more samples will result in more accuracy but will be slower). --no-plot Do not show the plot. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/bundle_adjust.rst ================================================ .. _bundle_adjust: bundle_adjust ------------- The ``bundle_adjust`` program performs bundle adjustment on a given set of images and cameras. An introduction to bundle adjustment, and some advanced usage, including solving for intrinsics, can be found in :numref:`bundle_adjustment`. If it is desired to process a large number of images, consider using ``parallel_bundle_adjust`` (:numref:`parallel_bundle_adjust`). This tool solves a least squares problem (:numref:`how_ba_works`). It uses Google's `Ceres Solver `_. Usage:: bundle_adjust \ -o [options] .. _ba_examples: Examples ~~~~~~~~ ISIS cameras ^^^^^^^^^^^^ See :numref:`moc_tutorial` for an introduction to these cameras. :: bundle_adjust --camera-weight 0 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ file1.cub file2.cub file3.cub \ -o run_ba/run The above choices for camera weight and triangulation weight have in the meantime become the defaults. These are helpful in preventing the cameras from drifting too far from initial locations. How to use the adjusted cameras is shown in :numref:`ba_use`. .. _maxar_gcp: Maxar Earth cameras and GCP ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Here we use Maxar (DigitalGlobe) Earth data (:numref:`dg_tutorial`) and ground control points (:numref:`bagcp`):: bundle_adjust \ --camera-weight 0 \ --tri-weight 0.1 \ --num-passes 2 \ --datum WGS_1984 \ file1.tif file2.tif \ file1.xml file2.xml \ gcp1.gcp gcp2.gcp gcp3.gcp \ --fix-gcp-xyz \ -o run_ba/run How to use the adjusted cameras is shown in :numref:`ba_use`. Using the proper value for ``--datum`` is very important, otherwise the longitude-latitude-height values in the GCP files will not be interpreted correctly. There can be more than one GCP file. The option ``--fix-gcp-xyz`` fixes the GCP coordinates during optimization. This is useful when the GCP are very accurate. Otherwise set per-GCP sigma. The residuals for the GCP will be printed at the end of the ``final_residuals_pointmap.csv`` file, and flagged with the string ``# GCP`` (:numref:`ba_err_per_point`). We invoked the tool with two passes, which also enables removal of outliers (see option ``--remove-outliers-params``, :numref:`ba_options`). .. _ba_rpc: RPC cameras and image lists ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Examples for RPC cameras (:numref:`rpc`). With the cameras stored separately:: bundle_adjust -t rpc left.tif right.tif left.xml right.xml \ -o run_ba/run With the cameras embedded in the images:: bundle_adjust -t rpc left.tif right.tif -o run_ba/run How to use the adjusted cameras is shown in :numref:`ba_use`. How to produce RPC cameras with the adjustments applied to them is discussed in :numref:`rpc_and_ba`. The images can be also passed in via ``--image-list`` and cameras with ``--camera-list``. When the cameras are embedded in the images, the ``--camera-list`` option accepts the image files instead. Pinhole cameras ^^^^^^^^^^^^^^^ :: bundle_adjust -t nadirpinhole \ --inline-adjustments \ --camera-weight 0 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --datum WGS_1984 \ file1.JPG file2.JPG \ file1.tsai file2.tsai \ -o run_ba/run See :numref:`pinholemodels` for the pinhole camera model format. Here we assumed that the cameras point towards planet's surface and used the ``nadirpinhole`` session. If this assumption is not true, one should use the ``pinhole`` session or the ``--no-datum`` option. The value of ``--datum`` should reflect the planetary body being imaged. If not set, some functionality will not be available. It will be auto-guessed, either based on camera files, input DEM, or camera center (the latter only for Earth, Mars, Moon). The option ``--inline-adjustments`` will save to disk the optimized cameras with adjustments already applied to them. These can be passed directly to ``parallel_stereo``, without using the original cameras and the adjustments as in :numref:`ba_use`. CSM cameras ^^^^^^^^^^^ :: bundle_adjust \ file1.cub file2.cub \ file1.json file2.json \ -t csm \ --camera-weight 0 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ -o run_ba/run CSM cameras (:numref:`csm`) can be stored in .json files or in .cub files. After bundle adjustment, updated .json camera files will be written to disk, in addition to .adjust files. See :numref:`csm_state` and :numref:`embedded_csm`. Later, use either the original cameras with the computed adjustments (:numref:`ba_use`), or the updated cameras without the adjustments. The datum will be read from the camera files. .. _ba_bathy: Bathymetry correction ^^^^^^^^^^^^^^^^^^^^^ When working with underwater terrain, bundle adjustment can model light refraction through water for triangulation of ground points and ground-to-image operations. Example:: echo left_bathy_mask.tif right_bathy_mask.tif > mask_list.txt bundle_adjust \ left_image.tif right_image.tif \ left_camera.xml right_camera.xml \ --bathy-mask-list mask_list.txt \ --refraction-index 1.333 \ --bathy-plane bathy_plane.txt \ -o run/run The mask files must be in a list to distinguish them from the image files. Each input image has a corresponding bathy mask, and these entities must be in the same order (and also with the cameras). Lists can also be used for the input images and cameras, via ``--image-list`` and ``--camera-list``. The preparation of bathy masks, the bathy plane (or more than one), and the refraction index are as for stereo processing (:numref:`bathy_intro`). The options invoked above are described in :numref:`ba_options`. Inspect carefully the produced report files (:numref:`ba_out_files`). Consider using the option ``--camera-position-uncertainty`` for finer control. Also, the bathy plane needs to be recreated with the bundle-adjusted cameras, if using those new cameras for stereo (:numref:`bathy_plane_calc`). Otherwise a tilt may be present with the old plane. Other cameras ^^^^^^^^^^^^^ Bundle adjustment supports many other camera models. See :numref:`examples` for the various sensor types. .. _ba_use: Use of the results ~~~~~~~~~~~~~~~~~~ This program will write the adjustments to the cameras as ``*.adjust`` files at a location given by the specified output prefix (:numref:`adjust_files`). For ``parallel_stereo`` to use the adjusted cameras, it should not be passed in the ``.adjust`` files. Rather, it should be invoked with the original cameras and the ``bundle_adjust`` output prefix via the option ``--bundle-adjust-prefix``. For example:: parallel_stereo file1.cub file2.cub run_stereo/run \ --bundle-adjust-prefix run_ba/run The same option can be used with mapprojection (:numref:`mapproject`) and some other tools. Example (for .cub files that contain both the image and the camera):: mapproject --bundle-adjust-prefix run_ba/run \ input-DEM.tif input.cub output.tif Example (for cameras in .xml format, so the image and camera are in separate files):: mapproject --bundle-adjust-prefix run_ba/run \ input-DEM.tif image.tif camera.xml mapped_image.tif For Pinhole (:numref:`pinholemodels`) and OpticalBar (:numref:`panoramic`) cameras, if the ``--inline-adjustments`` option is used, the tool will save to disk copies of the input cameras with adjustments already applied to them. These output cameras can then be passed directly to ``parallel_stereo``:: parallel_stereo \ file1.JPG file2.JPG \ run_ba/run-file1.tsai run_ba/run-file2.tsai \ run_stereo/run When cameras are of CSM type (:numref:`csm`), self-contained optimized cameras will be written to disk (:numref:`csm_state`). These cameras can also be used as-is, so without the ``--bundle-adjust-prefix`` option. If the CSM cameras are appended to the .cub files (:numref:`embedded_csm`), the updated .cub files can also be used as-is. To pass adjustments to ``bundle_adjust`` itself, use the option ``--input-adjustments-prefix``. Camera adjustments and applying a transform ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``bundle_adjust`` program can read camera adjustments from a previous run, via ``--input-adjustments-prefix string``. Their format is described in :numref:`adjust_files`. It can also apply to the input cameras a transform as output by ``pc_align``, via ``--initial-transform string``. This is useful if a DEM produced by ASP was aligned to a ground truth, and it is desired to apply the same alignment to the cameras that were used to create that DEM. The initial transform can have a rotation, translation, and scale, and it is applied after the input adjustments are read, if those are present. An example is shown in (:numref:`ba_pc_align`). .. _ba_validation: Validation ~~~~~~~~~~ The first report file to check after a run concludes is:: {output-prefix}-final_residuals_stats.txt (:numref:`ba_errors_per_camera`). It will have the mean and median pixel reprojection error for each camera, and their count. The errors should be under 1 pixel, ideally under 0.5 pixels. The count must be at least a dozen, and ideally more. Otherwise bundle adjustment did not work well. A fine-grained metric is the *triangulation error*, computed densely across the images with stereo (:numref:`triangulation_error`). A systematic pattern in this error may suggest the need to refine the camera intrinsics (:numref:`floatingintrinsics`). Other report files are described in :numref:`ba_out_files`. Handling failures ~~~~~~~~~~~~~~~~~ This program will fail if the illumination changes too much between images (see also :numref:`sfs_azimuth`). Various approaches of creation of interest point matches are presented in :numref:`ba_ip` (the existing ones should be deleted first). Use ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`) to inspect the matches. To make the program work harder at reducing big pixel reprojection errors, the ``--robust-threshold`` can be increased, perhaps to 2.0. This may result in the smallest reprojection errors increasing. .. _ba_constraints: Constraints ~~~~~~~~~~~ The primary goal of bundle adjustment is to minimize the pixel reprojection errors, so that the cameras are consistent with each other and with triangulated points. To ensure the cameras and triangulated points do not drift, ground constraints are set by default. They are meant to be rather soft, to not prevent the reduction in reprojection errors. .. _ba_ground_constraints: Ground constraints ^^^^^^^^^^^^^^^^^^ The option ``--tri-weight`` constrains how much the triangulated points move. This is a soft constraint and given less priority than reducing the pixel reprojection errors in the cameras. Its default value is 0.1. An example is in :numref:`skysat_stereo`. This constraint adapts appropriately to the number of interest points and the local average ground sample distance. The measured distances between the initial and final triangulated points are saved to a file (:numref:`ba_tri_offsets`) and should be inspected. Also check the pixel reprojection errors per camera (:numref:`ba_errors_per_camera`). The implementation is as follows. The distances between initially triangulated points and those being optimized points are computed, then divided by the local averaged ground sample distance (GSD) (to make them into pixel units, like the reprojection errors). These are multiplied by ``--tri-weight``. Then, the robust threshold given by ``--tri-robust-threshold`` is applied, with a value of 0.1, to attenuate the big residuals. This threshold is smaller than the pixel reprojection error threshold (``--robust-threshold``), whose default value is 0.5, to ensure that this constraint does not prevent the optimization from minimizing the pixel reprojection errors. Triangulated points that are constrained via a DEM (option ``--heights-from-dem``, :numref:`heights_from_dem`), that is, those that are close to a valid portion of this DEM, are not affected by the triangulation constraint. GCP can be used as well (:numref:`bagcp`). .. _ba_cam_constraints: Camera constraints ^^^^^^^^^^^^^^^^^^ The option ``--camera-position-uncertainty`` constrains the camera position horizontally and vertically, with given uncertainties, in the local North-East-Down coordinate system of each camera. The input to this option is a file with one line per image. Each line has the image name, horizontal uncertainty, and the vertical one, separated by spaces. Example:: image1.tif 5.0 10.0 image2.tif 3.0 2.0 All quantities are measured in meters. To have the same uncertainties for all cameras, pass instead of a file name two values separated by a comma (no spaces). Example: ``5.0,10.0`` (post 10/2025 build). It is suggested to overestimate these uncertainties. *A strict constraint can prevent the problem from converging to a good solution.* It is suggested to examine the camera change report (:numref:`ba_camera_offsets`) and pixel reprojection report (:numref:`ba_errors_per_camera`) to see the effect of this constraint. In the latest build (:numref:`release`, post 10/2025), the implementation of this was changed. A sum of squares of quantities such as:: (curr_position - init_position) / uncertainty is added to the cost function (:numref:`how_ba_works`) for each camera. The horizontal and vertical components result in separate terms. This performs better than prior alternatives, but the camera motion may be perhaps 1-10 times more than expected. For the jitter solver (:numref:`jitter_solve`) and a linescan camera, such a term exists for each position sample in the camera, and then each is divided (after squaring) by the number of samples. The advanced option ``--camera-position-uncertainty-power`` can be used to change the power to which the normalized position difference is raised before being added to the cost function. The default value is 2. A value such as 4 may result in stricter enforcement of this constraint, but may also make the problem harder to solve. The default behavior is preferred. It is suggested to avoid the older options ``--camera-position-weight`` and ``--rotation-weight``, which will be removed in the future. Use cases ~~~~~~~~~ Large-scale bundle adjustment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Bundle adjustment has been tested extensively and used successfully with thousands of frame (pinhole) cameras and with close to 1000 linescan cameras. Large-scale usage of bundle adjustment is illustrated in the SkySat processing example (:numref:`skysat`), with many Pinhole cameras, and with a large number of linescan Lunar images with variable illumination (:numref:`sfs-lola`). Attention to choices of parameters and solid validation is needed in such cases. The tool creates report files with various metrics that can help judge how good the solution is (:numref:`ba_out_files`). See also the related jitter-solving program (:numref:`jitter_solve`), and the rig calibrator (:numref:`rig_calibrator`). Solving for intrinsics ^^^^^^^^^^^^^^^^^^^^^^ See :numref:`bundle_adjustment` for how to solve for intrinsics. In particular, see :numref:`kaguya_ba` for the case when there exist several sensors, each with its own intrinsics parameters. .. _ba_ip: Well-distributed interest points ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When different parts of the image have different properties, such as rock vs snow, additional work may be needed to ensure interest points are created somewhat uniformly. For that, use the option ``--matches-per-tile``:: bundle_adjust image1.tif image2.tif \ image1.tsai image2.tsai \ --ip-per-tile 300 \ --matches-per-tile 100 \ --max-pairwise-matches 20000 \ --camera-weight 0 --tri-weight 0.1 \ --remove-outliers-params '75 3 10 10' \ -o run_ba/run For very large images, the number of interest points and matches per tile (whose size is 1024 pixels on the side) should be decreased from the above. If the images have very different perspectives, it is suggested to create the interest points based on mapprojected images (:numref:`mapip`.) Uniformly distributed interest points can be produced from stereo disparity. See :numref:`custom_ip` for more details. This program supports plain-text match files (:numref:`txt_match`). Controlling where interest points are placed ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A custom image or mask can be used to define a region where interest points are created (:numref:`limit_ip`). Using mapprojected images ^^^^^^^^^^^^^^^^^^^^^^^^^ For images that have very large variation in elevation, it is suggested to use bundle adjustment with the option ``--mapprojected-data`` for creating interest point matches. An example is given in :numref:`mapip`. .. _how_ba_works: How bundle adjustment works ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Features are matched across images. Rays are cast though matching features using the cameras, and triangulation happens, creating points on the ground. More than two rays can meet at one triangulated point, if a feature was successfully identified in more than two images. The triangulated point is projected back in the cameras. The sum of squares of differences (also called residuals) between the pixel coordinates of the features and the locations where the projections in the cameras occur is minimized. To not let outliers dominate, a robust "loss" function is applied to each error term to attenuate the residuals if they are too big. See the `Google Ceres `_ documentation on robust cost functions. The option ``--cost-function`` controls the type of loss function, and ``--robust-threshold`` option is used to decide at which value of the residuals the attenuation starts to work. The option ``--min-triangulation-angle`` is used to eliminate triangulated points for which all the rays converging to it are too close to being parallel. Such rays make the problem less well-behaved. The option ``--remove-outliers-params`` is used to filter outliers if more than one optimization pass is used. See :numref:`ba_options` for more options. See :numref:`bundle_adjustment` for a longer explanation. The variables of optimization are the camera positions and orientations, and the triangulated points on the ground. The intrinsics can be optimized as well, either as a single set for all cameras or individually (:numref:`floatingintrinsics`), or per group of cameras (:numref:`kaguya_ba`). Triangulated points can be constrained via ``--tri-weight`` (:numref:`ba_ground_constraints`) or ``--heights-from-dem`` (with a *well-aligned* prior DEM, :numref:`heights_from_dem`). The camera positions can be constrained as well (:numref:`ba_cam_constraints`). Ground control points can be employed to incorporate measurements as part of the constraints (:numref:`bagcp`). .. _bagcp: Ground control points ~~~~~~~~~~~~~~~~~~~~~ Ground control points consist of known points on the ground, together with their pixel locations in one or more images. Their use is to refine, initialize, or transform to desired coordinates the camera poses (:numref:`ba_use_gcp`). GCP can be created with ``stereo_gui`` (:numref:`creatinggcp`), ``gcp_gen`` (:numref:`gcp_gen`), and ``dem2gcp`` (:numref:`dem2gcp`). They can be inspected with ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`). GCP file format ^^^^^^^^^^^^^^^ A GCP file must end with a ``.gcp`` extension, and contain one ground control point per line. Each line must have the following fields: - ground control point id (integer) - latitude (in degrees) - longitude (in degrees) - height above datum (in meters), with the datum itself specified separately, via ``--datum`` - :math:`x, y, z` standard deviations (*sigma* values, three positive floating point numbers, smaller values suggest more reliable measurements, measured in meters) On the same line, for each image in which the ground control point is visible there should be: - image file name - column index in image (float, starting from 0) - row index in image (float, starting from 0) - column and row standard deviations (also called *sigma* values, two positive floating point numbers, smaller values suggest more reliable measurements, in units of pixel) The fields can be separated by spaces or commas. Here is a sample representation of a ground control point measurement:: 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 .. _ba_use_gcp: Uses of GCP ^^^^^^^^^^^ One or more ``.gcp`` files can be passed to ``bundle_adjust`` as shown in :numref:`ba_examples`, together with one or more images and cameras, to refine the camera poses. The option ``--datum`` must be set correctly to interpret the GCP. GCP can also be employed to initialize the cameras (:numref:`camera_solve_gcp`), or to transform them as a group, with the ``bundle_adjust`` options ``--transform-cameras-with-shared-gcp`` and ``--transform-cameras-using-gcp``. For use with SfM, see :numref:`sfm_world_coords`. The option ``--fix-gcp-xyz`` fixes the GCP coordinates during optimization. This is useful when the GCP are very accurate. Otherwise set per-GCP sigma. The option ``--save-cnet-as-gcp`` can be invoked to save the optimized control network in the GCP format, after outlier filtering. Any input GCP are included in the output. This can be useful for inspecting the final triangulated points. The xyz sigma is 1 meter for regular non-GCP triangulated points and the value of ``--heights-from-dem-uncertainty`` for DEM-constrained points. See also ``--max-gcp-reproj-err`` for filtering GCP by reprojection error. When the ``--use-lon-lat-height-gcp-error`` flag is set, the three standard deviations are interpreted as applying not to :math:`x, y, z` but to latitude, longitude, and height above datum (in this order). Hence, if the latitude and longitude are known accurately, while the height less so, the third standard deviation can be set to something larger. See :numref:`ba_out_files` for the output files, including for more details about reports for GCP files. Effect on optimization ^^^^^^^^^^^^^^^^^^^^^^ Each ground control point will result in the following terms being added to the cost function: .. math:: \frac{(x-x_0)^2}{\sigma_x^2} + \frac{(y-y_0)^2}{\sigma_y^2} + \frac{(z-z_0)^2}{\sigma_z^2} Here, :math:`(x_0, y_0, z_0)` is the input GCP, :math:`(x, y, z)` is its version being optimized, and the sigma values are the standard deviations from above. No robust cost function is applied to these error terms (see below). Note that the cost function normally contains sums of squares of pixel differences (:numref:`how_ba_works`), while these terms are dimensionless, if the numerators and denominators are assumed to be in meters. Care should be taken that these terms not be allowed to dominate the cost function at the expense of other terms. The sums of squares of differences between projections into the cameras of the GCP and the pixel values specified in the GCP file will be added to the bundle adjustment cost function, with each difference being divided by the corresponding pixel standard deviation (sigma). To prevent these from dominating the problem, each such error has a robust cost function applied to it, just as done for the regular reprojection errors without GCP. See the `Google Ceres `_ documentation on robust cost functions. See also ``--cost-function`` and ``--robust-threshold`` option descriptions (:numref:`ba_options`). The GCP pixel reprojection errors will be saved as the last lines of the report files ending in ``pointmap.csv``. Differences between initial and optimized GCP will be printed in a report file as well. See :numref:`ba_out_files` for more details. To not optimize the GCP, use the option ``--fix-gcp-xyz``. .. _control_network: Control network ~~~~~~~~~~~~~~~ .. _ba_match_files: Match files ^^^^^^^^^^^ By default, ``bundle_adjust`` will create interest point matches between all pairs of images (see also ``--auto-overlap-params``). These matches are assembled into a *control network*, in which a triangulated point is associated with features in two or more images. The match files are saved with the specified output prefix and a ``.match`` extension. The naming convention for the match files is:: -__.match where the image names are without the directory name and extension. Excessively long image names will be truncated. For example, for two images named ``input/image1.tif`` and ``input/image2.tif``, and given the output prefix ``out/run``, the match file will be:: out/run-image1__image2.match If such files have been already produced by a different invocation of ``bundle_adjust`` or by other means, they can be loaded by ``bundle_adjust``, ``parallel_stereo`` and ``jitter_solve``, with the option ``--match-files-prefix``. In this example, the value of this option would be ``out/run``. Plain-text match files are supported as well (:numref:`txt_match`). Bundle adjustment also produces outlier-filtered versions of these files, that end with ``-clean.match``. These can be used with the option ``--clean-match-files-prefix``. The option ``--remove-outliers-params`` controls the outlier filtering. Any such files can be inspected with ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`) and converted to text with ``parse_match_file.py`` (:numref:`parse_match_file`) or ``ipmatch`` (:numref:`ipmatch_convert`). .. _jigsaw_cnet: ISIS control network ^^^^^^^^^^^^^^^^^^^^ This program can read and write ISIS ``jigsaw`` binary control networks. Example:: bundle_adjust \ --image-list image_list.txt \ --isis-cnet controlNet.net \ -o ba/run This format makes it possible to handle a very large number of control points. It is very important that the images in the list be in the order as expected in the control network. A copy of this list will be saved, for the record, in the output directory. In this mode, ``bundle_adjust`` will also write the updated control network in the ISIS format, with the name ``.net`` (instead of match files). If GCP are provided via a .gcp file (:numref:`bagcp`), these will be added to the optimization and to the output control network. The option ``--output-cnet-type`` explicitly sets the output format for interest point matches. This allows for the input and output formats to be different. The ``stereo_gui`` program (:numref:`stereo_gui_isis_cnet`) can visualize such a control network file. See :numref:`jigsaw_cnet_details` for more technical details. See also ASP's ``jigsaw`` tutorial (:numref:`jigsaw`). .. _ba_nvm: NVM format ^^^^^^^^^^ The ``bundle_adjust`` program can read and write the `VisualSfM NVM format `_ for a control network. This helps in interfacing with ``rig_calibrator`` (:numref:`rc_ba`) and ``theia_sfm`` (:numref:`theia_sfm`). Usage:: bundle_adjust --nvm input.nvm \ --image-list images.txt \ --camera-list cameras.txt \ --inline-adjustments \ -o ba/run This will write the file ``ba/run.nvm`` having the inlier interest point matches. The NVM file assumes that the interest points are shifted relative to the optical center of each camera. The optical centers are kept in a separate file ending with ``_offsets.txt``. The NVM format can be used with any cameras supported by ASP. To export to this format, use ``--output-cnet-type nvm``. Unless this option is explicitly set, the output format is the same as the input format. If the cameras are of Pinhole (:numref:`pinholemodels`) or CSM Frame (:numref:`csm_frame`) type, the camera poses will be read from the NVM file as well, and the optimized poses will be saved to such a file, unless invoked with ``--no-poses-from-nvm``. The optical centers will be read and written as well. The input cameras must still be provided as above, however, so that the intrinsics can be read. With the option ``--inline-adjustments``, the updated Pinhole camera files will be written separately as well. For all other types, no camera pose information will be read or written to the NVM file, and the optical centers will be set to half the image dimensions. .. _ba_out_files: Output files ~~~~~~~~~~~~ .. _ba_errors_per_camera: Reprojection errors per camera ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The initial and final mean and median pixel reprojection error (distance from each interest point and camera projection of the triangulated point) for each camera, and their count, are written to:: {output-prefix}-initial_residuals_stats.txt {output-prefix}-final_residuals_stats.txt It is very important to ensure all cameras have a small final reprojection error, ideally under 1 pixel, as otherwise this means that the cameras are not well-registered to each other, or that systematic effects exist, such as uncorrected lens distortion. See :numref:`ba_mapproj_dem` for an analogous report at the ground level and :numref:`ba_err_per_point` for finer-grained reporting. .. _ba_camera_offsets: Camera position changes ^^^^^^^^^^^^^^^^^^^^^^^ If the ``--datum`` option is specified or auto-guessed based on images and cameras, the file:: {output-prefix}-camera_offsets.txt will be written. It will have, for each camera, the horizontal and vertical component of the difference in camera center before and after optimization, in meters. This is after applying any initial adjustments or transform to the cameras (:numref:`ba_pc_align`). The local North-East-Down coordinate system of each camera determines the horizontal and vertical components. This file is useful for understanding how far cameras may move and can help with adding camera constraints (:numref:`ba_cam_constraints`). For linescan cameras, the camera centers will be for the upper-left image pixel. .. _ba_tri_offsets: Changes in triangulated points ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The distance between each initial triangulated point (after applying any initial adjustments or alignment transform, but before any DEM constraint) and final triangulated point (after optimization) are computed (in ECEF, in meters). The mean, median, and count of these distances, per camera, are saved to:: {output-prefix}-triangulation_offsets.txt This is helpful in understanding how much the triangulated points move. An unreasonable amount of movement may suggest imposing stronger constraints on the triangulated points (:numref:`ba_ground_constraints`). .. _ba_conv_angle: Convergence angles ^^^^^^^^^^^^^^^^^^ The convergence angle percentiles for rays emanating from matching interest points and intersecting on the ground (:numref:`stereo_pairs`) are saved to:: {output-prefix}-convergence_angles.txt There is one entry for each pair of images having matches. .. _ba_err_per_point: Reprojection errors per triangulated point ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If the ``--datum`` option is specified or auto-guessed based on images and cameras, ``bundle_adjust`` will write the triangulated ground position for every feature being matched in two or more images, and the mean pixel reprojection error (:numref:`bundle_adjustment`) for each position, before the first and after the last optimization pass, in geodetic coordinates. The files are named :: {output-prefix}-initial_residuals_pointmap.csv {output-prefix}-final_residuals_pointmap.csv Here is a sample file:: # lon, lat, height_above_datum, mean_residual, num_observations -55.11690935, -69.34307716, 4.824523817, 0.1141333633, 2 The field ``num_observations`` counts in how many images each triangulated point is seen. Such files can be plotted and overlaid with ``stereo_gui`` (:numref:`plot_csv`) to see at which triangulated points the reprojection errors are large and their geographic locations. Pixel reprojection errors corresponding to GCP will be printed at the end of these files and flagged with the string ``# GCP``. During the optimization the pixel differences are divided by pixel sigma. This is undone when the pixel reprojection errors are later computed. The command:: geodiff --absolute --csv-format '1:lon 2:lat 3:height_above_datum' \ {output-prefix}-final_residuals_pointmap.csv dem.tif (:numref:`geodiff`) can be called to evaluate how well the residuals agree with a given DEM. That can be especially useful if bundle adjustment was invoked with the ``--heights-from-dem`` option (:numref:`heights_from_dem`). One can also invoke ``point2dem`` (:numref:`point2dem`) with the above ``--csv-format`` option to grid these files to create a coarse DEM (also for the error residuals). The final triangulated positions can be used for alignment with ``pc_align`` (:numref:`pc_align`). Then, use ``--min-triangulation-angle 10.0`` with bundle adjustment or some other higher value, to filter out unreliable triangulated points. (This still allows, for example, to have a triangulated point obtained by the intersection of three rays, with some of those rays having an angle of at least this while some a much smaller angle.) GCP report ^^^^^^^^^^ If GCP are present, the file ``{output-prefix}-gcp_report.txt`` will be saved to disk, having the initial and optimized GCP coordinates, and their difference, both in ECEF and longitude-latitude-height above datum. The reprojection error file may be more helpful than this GCP report file (:numref:`ba_err_per_point`). The GCP are flagged with the string ``# GCP`` at the end of that file. .. _ba_out_cams: Image and camera lists ^^^^^^^^^^^^^^^^^^^^^^ The list of input images will be saved to:: {output-prefix}-image_list.txt The list of optimized cameras (such as for CSM cameras or with the option ``--inline-adjustments`` for Pinhole cameras) will be saved to:: {output-prefix}-camera_list.txt If only ``.adjust`` files are saved, these will be in the list instead. This is convenient because both ``bundle_adjust`` and ``jitter_solve`` can read such lists with the ``--image-list`` and ``--camera-list`` options (but not if ``.adjust`` files are saved). .. _ba_error_propagation: Error propagation ^^^^^^^^^^^^^^^^^ When the option ``--propagate-errors`` is specified, propagate the errors (uncertainties) from the input cameras to the triangulated point for each pair of inlier interest point matches. The produced uncertainties will be separated into horizontal and vertical components relative to the datum. Statistical measures will be produced for each pair of images. The same logic as in stereo triangulation is employed (:numref:`error_propagation`), but for the sparse set of interest point matches rather than for the dense image disparity. Since the produced uncertainties depend only weakly on the triangulated surface, computing them for a sparse set of features, and summarizing the statistics, as done here, is usually sufficient. Specify ``--horizontal-stddev`` (a single value for all cameras, measured in meters), to use this as the input camera ground horizontal uncertainty. Otherwise, as in the above-mentioned section, the input errors will be read from camera files, if available. The produced errors are saved to the file:: {output-prefix}-triangulation_uncertainty.txt This file will have, for each image pair having matches, the median horizontal and vertical components of the triangulation uncertainties, the mean of each type of uncertainty, the standard deviations, and number of samples used (usually the same as the number of inlier interest points). All errors are in meters. This operation will use the cameras after bundle adjustment. Invoke with ``--num-iterations 0`` for the original cameras. It is instructive to compare these uncertainties with their dense counterparts, as produced by ``point2dem`` (:numref:`export_stddev`). .. _ba_cam_pose: Camera positions and orientations ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If the cameras are Pinhole and a datum exists, the camera names, camera centers (in meters, in ECEF coordinates), as well as the rotations from each camera to world North-East-Down (NED) coordinates at the camera center are saved to:: {output-prefix}-initial-cameras.csv {output-prefix}-final-cameras.csv (before and after optimization; in either case, after any initial transform and/or adjustments are applied). These are useful for analysis when the number of cameras is large and the images are acquired in quick succession (such as for SkySat data, :numref:`skysat`). Note that such a rotation determines a camera's orientation in NED coordinates. A conversion to geodetic coordinates for the position and to Euler angles for the orientation may help with this data's interpretation. .. _ba_mapproj_dem: Registration errors on the ground ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If the option ``--mapproj-dem`` (with a DEM file as a value) is specified, for each pair of interest point matches (after bundle adjustment and outlier removal) rays will be traced with the optimized cameras, that will be intersected with this DEM. Ideally, these rays should meet the DEM at the same location, so distance between the intersection points measures the amount of misregistration. The file:: {output-prefix}-mapproj_match_offset_stats.txt will have the percentiles (25%, 50%, 75%, 85%, 95%) of these distances for all matches in each image against all other images, in meters, and their count. Do *not* use this option for any initial evaluation of bundle adjustment. Inspect instead the files mentioned earlier in :numref:`ba_out_files`. This very advanced metric is only helpful if the images are expected to be well-registered to each other and to the DEM, which is not the case without explicit prior alignment. This also expects a rather accurate DEM, and for bundle adjustment to be invoked with the option ``--heights-from-dem`` (:numref:`heights_from_dem`). The 50th percentiles should be on the order of 1 GSD or less. The file:: {output-prefix}-mapproj_match_offset_pair_stats.txt saves such measurements for every pair of images. The full report will be saved to:: {output-prefix}-mapproj_match_offsets.txt having the longitude, latitude, and height above datum of the midpoint of each pair of intersection points with the DEM, and the distance between them (in meters). This file is very analogous to the ``pointmap.csv`` file, except that these errors are measured on the ground in meters, and not in the cameras in pixels. This file can be displayed and colorized in ``stereo_gui`` as a scatterplot (:numref:`plot_csv`). .. _adjust_files: Format of .adjust files ~~~~~~~~~~~~~~~~~~~~~~~ The ``bundle_adjust`` program normally saves external adjustments to the input cameras, or in some cases it creates standalone cameras with adjustments applied internally (:numref:`ba_use`). An external adjustment is stored in a ``.adjust`` file. It has a translation *T* as *x, y, z* (measured in meters) and a rotation *R* as a quaternion in the order *w, x, y, z*. The rotation is around the camera center *C* for pixel (0, 0) (for a linescan camera the camera center depends on the pixel). These are applied on top of initial cameras. Hence, if *P* is a point in ECEF, that is, the world in which the camera exists, and an adjustment is applied to the camera, projecting *P* in the original camera gives the same result as projecting:: P' = R * (P - C) + C + T in the adjusted camera. Note that currently the camera center *C* is not exposed in the ``.adjust`` file, so external tools cannot recreate this transform. This will be rectified at a future time. Adjustments are relative to the initial cameras, so a nominal adjustment has the zero translation and identity rotation (quaternion 1, 0, 0, 0). .. _ba_options: Command-line options ~~~~~~~~~~~~~~~~~~~~ -h, --help Display the help message. -o, --output-prefix Prefix for output filenames. --cost-function Choose a cost function from: Cauchy, PseudoHuber, Huber, L1, L2 --robust-threshold Set the threshold for the robust reprojection error cost function. Increasing this makes the solver focus harder on the larger errors while becoming more sensitive to outliers. See the `Google Ceres `_ documentation on robust cost functions. --datum Set the datum. This will override the datum from the input images and also ``--t_srs``, ``--semi-major-axis``, and ``--semi-minor-axis``. If not set or inferred from the images or camera models, the datum will be auto-guessed based on camera centers for Earth, Mars, and Moon. Options: - WGS_1984 - D_MOON (1,737,400 meters) - D_MARS (3,396,190 meters) - MOLA (3,396,000 meters) - NAD83 - WGS72 - NAD27 - Earth (alias for WGS_1984) - Mars (alias for D_MARS) - Moon (alias for D_MOON) --semi-major-axis Explicitly set the datum semi-major axis in meters. --semi-minor-axis Explicitly set the datum semi-minor axis in meters. -t, --session-type 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 :numref:`ps_options` for options. --min-matches Set the minimum number of matches between images that will be considered. --max-pairwise-matches Reduce the number of matches per pair of images to at most this number, by selecting a random subset, if needed. This happens when setting up the optimization, and before outlier filtering. --num-iterations Set the maximum number of iterations. --parameter-tolerance Stop when the relative error in the variables being optimized is less than this. When ``--solve-intrinsics`` is used, the default is 1e-12. --overlap-limit Limit the number of subsequent images to search for matches to the current image to this value. By default try to match all images. See also ``--auto-overlap-params``. --overlap-list 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. The order in which pairs are specified is not important. --auto-overlap-params Determine which camera images overlap by finding the bounding boxes of their ground footprints given the specified DEM, expanding them by a given percentage, and see if those intersect. A higher percentage should be used when there is more uncertainty about the input camera poses. As of the 10/2025 build, a third parameter can be provided to limit the number of subsequent images that overlap to this many. Example: 'dem.tif 15.0 6'. Using this with ``--mapprojected-data`` will restrict the matching only to the ground-level overlap regions (expanded by this percentage). As of the 10/2025 build, this works also with ``--match-first-to-last``. --auto-overlap-buffer Try to automatically determine which images overlap. Used only if this option is explicitly set. Only supports Worldview style XML camera files. The lon-lat footprints of the cameras are expanded outwards on all sides by this value (in degrees), before checking if they intersect. --match-first-to-last Match the first several images to last several images by extending the logic of ``--overlap-limit`` past the last image to the earliest ones. As of the 10/2025 build, this works also with ``--auto-overlap-params``. --tri-weight The weight to give to the constraint that optimized triangulated points stay close to original triangulated points. A positive value will help ensure the cameras do not move too far, but a large value may prevent convergence. It is suggested to use here 0.1 to 0.5. This will be divided by ground sample distance (GSD) to convert this constraint to pixel units, since the reprojection errors are in pixels. See also ``--tri-robust-threshold``. Does not apply to GCP or points constrained by a DEM. --tri-robust-threshold The robust threshold to attenuate large differences between initial and optimized triangulation points, after multiplying them by ``--tri-weight`` and dividing by GSD. This is less than ``--robust-threshold``, as the primary goal is to reduce pixel reprojection errors, even if that results in big differences in the triangulated points. It is suggested to not modify this value, and adjust instead ``--tri-weight``. --camera-position-uncertainty A file having on each line the image name and the horizontal and vertical camera position uncertainty (1 sigma, in meters). This strongly constrains the movement of cameras, potentially at the expense of accuracy. To have the same uncertainties for all cameras, pass instead of a file name two values separated by a comma (no spaces). See :numref:`ba_cam_constraints` for an example. See also ``--camera-position-uncertainty-power``. --camera-position-uncertainty-power A higher value makes the cost function rise more steeply when ``--camera-position-uncertainty`` is close to being violated. This is an advanced option. The default should be good enough. --camera-position-weight A soft constraint to keep the camera positions close to the original values. It is meant to prevent a wholesale shift of the cameras. It can impede the reduction in reprojection errors. It adjusts to the ground sample distance and the number of interest points in the images. The computed discrepancy is attenuated with ``--camera-position-robust-threshold``. It is suggested to use instead ``--camera-position-uncertainty``. See :numref:`ba_cam_constraints` for details. --camera-position-robust-threshold The robust threshold to attenuate large discrepancies between initial and optimized camera positions with the option ``--camera-position-weight``. This is less than ``--robust-threshold``, as the primary goal is to reduce pixel reprojection errors, even if that results in big differences in the camera positions. It is suggested to not modify this value, and adjust instead ``--camera-position-weight``. --rotation-weight A higher weight will penalize more camera rotation deviations from the original configuration. This adds to the cost function the per-coordinate differences between initial and optimized normalized camera quaternions, multiplied by this weight, and then squared. No robust threshold is used to attenuate this term. --camera-weight The weight to give to the constraint that the camera positions/orientations stay close to the original values. A higher weight means that the values will change less. This option is deprecated. Use instead ``--camera-position-weight`` and ``--tri-weight``. --ip-per-tile How many interest points to detect in each :math:`1024^2` image tile (default: automatic determination). This is before matching. Not all interest points will have a match. See also ``--matches-per-tile``. --ip-per-image How many interest points to detect in each image (default: automatic determination). Can set either this or ``--ip-per-tile``. --ip-detect-method Choose an interest point detection method from: 0 = OBAloG (:cite:`jakkula2010efficient`), 1 = SIFT (from OpenCV), 2 = ORB (from OpenCV). The SIFT method, unlike OBALoG, produces interest points that are accurate to subpixel level. Remove any existing ``.vwip`` files before recomputing interest points with a different method. See also :numref:`custom_ip`. --matches-per-tile How many interest point matches to compute in each image tile (of size normally :math:`1024^2` pixels). Use a value of ``--ip-per-tile`` a few times larger than this. See an example in :numref:`ba_examples`. See also ``--matches-per-tile-params``. --matches-per-tile-params To be used with ``--matches-per-tile``. The first value is the image tile size for both images. A larger second value allows each right tile to further expand to this size, resulting in the tiles overlapping. This may be needed if the homography alignment between these images is not great, as this transform is used to pair up left and right image tiles. --inline-adjustments If this is set, and the input cameras are of the pinhole or panoramic type, apply the adjustments directly to the cameras, rather than saving them separately as .adjust files. --input-adjustments-prefix Prefix to read initial adjustments from, written by a previous invocation of this program. --isis-cnet Read a control network having interest point matches from this binary file in the ISIS control network format. This can be used with any images and cameras supported by ASP. See also ``--output-cnet-type``. --nvm Read a control network having interest point matches from this file in the NVM format. This can be used with any images and cameras supported by ASP. For Pinhole or CSM frame cameras, the (optimized) camera poses will be read from / written to NVM as well (:numref:`ba_nvm`). See also ``--output-cnet-type``, ``--no-poses-from-nvm``. --output-cnet-type The format in which to save the control network of interest point matches. Options: ``match-files`` (match files in ASP's format), ``isis-cnet`` (ISIS jigsaw format), ``nvm`` (plain text VisualSfM NVM format). If not set, the same format as for the input is used. --no-poses-from-nvm Do not read the camera poses from the NVM file or write them to such a file. Applicable only with the option ``--nvm`` and Pinhole camera models. --initial-transform Before optimizing the cameras, apply to them the 4 |times| 4 rotation + translation transform from this file. The transform is in respect to the planet center, such as written by pc_align's source-to-reference or reference-to-source alignment transform. Set the number of iterations to 0 to stop at this step. If ``--input-adjustments-prefix`` is specified, the transform gets applied after the adjustments are read. --fixed-camera-indices A list of indices, in quotes and starting from 0, with space as separator, corresponding to cameras to keep fixed during the optimization process. --fixed-image-list A file having a list of images (separated by spaces or newlines) whose cameras should be fixed during optimization. --fix-gcp-xyz If the GCP are highly accurate, use this option to not float them during the optimization. --use-lon-lat-height-gcp-error When having GCP (or a DEM constraint), constrain the triangulated points in the longitude, latitude, and height space, instead of ECEF. The standard deviations in the GCP file (or DEM uncertainty) are applied accordingly. --solve-intrinsics Optimize intrinsic camera parameters. Only used for pinhole, optical bar, and CSM (frame and linescan) cameras. This implies ``--inline-adjustments``. See :numref:`heights_from_dem` for an example. --intrinsics-to-float If solving for intrinsics and is desired to float only a few of them, specify here, in quotes, one or more of: ``focal_length``, ``optical_center``, ``other_intrinsics`` (same as ``distortion``). Not specifying anything will float all of them. Also can specify ``all`` or ``none``. See :numref:`ba_frame_linescan` for controlling these per each group of cameras sharing a sensor. See also ``--fixed-distortion-indices``. --intrinsics-to-share If solving for intrinsics and desired to share only a few of them across all cameras, specify here, in quotes, one or more of: ``focal_length``, ``optical_center``, ``other_intrinsics`` (same as ``distortion``). By default all of the intrinsics are shared, so to not share any of them pass in an empty string. Also can specify as ``all`` or ``none``. If sharing intrinsics per sensor, this option is ignored, as then the sharing is more fine-grained (:numref:`kaguya_ba`). --intrinsics-limits Set a string in quotes that contains min max ratio pairs for intrinsic parameters. For example, "0.8 1.2" limits the parameter to changing by no more than 20 percent. The first pair is for focal length, the next two are for the center pixel, and the remaining pairs are for other intrinsic parameters. If too many pairs are passed in the program will throw an exception and print the number of intrinsic parameters the cameras use. Cameras adjust all of the parameters in the order they are specified in the camera model unless it is specified otherwise in :numref:`pinholemodels`. Setting limits can greatly slow down the solver. --num-passes How many passes of bundle adjustment to do, with given number of iterations in each pass. For more than one pass, outliers will be removed between passes using ``--remove-outliers-params``, and re-optimization will take place. Residual files and a copy of the match files with the outliers removed (``*-clean.match``) will be written to disk. --num-random-passes 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. Only the results for the optimization pass with the lowest error are kept. --remove-outliers-params <'pct factor err1 err2' (default: '75.0 3.0 5.0 8.0')> Outlier removal based on percentage, when more than one bundle adjustment pass is used. Triangulated points (that are not GCP) with reprojection error in pixels larger than:: min(max(pct-th percentile * factor, err1), err2) will be removed as outliers. Hence, never remove pixel reprojection errors smaller than ``err1`` but always remove those bigger than ``err2``. Specify as a list in quotes. Also remove outliers based on distribution of interest point matches and triangulated points. --elevation-limit 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. --lon-lat-limit 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 four values. --max-gcp-reproj-err If positive, after each pass remove GCPs whose mean reprojection error (averaged over all cameras seeing that point) is more than this value (in pixels). --heights-from-dem Assuming the cameras have already been bundle-adjusted and aligned to a known DEM, constrain the triangulated points to be close to the DEM. See also ``--heights-from-dem-uncertainty`` and :numref:`heights_from_dem`. --heights-from-dem-uncertainty The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value constrains more the triangulated points to the DEM specified via ``--heights-from-dem``. The discrepancy between a triangulated point and corresponding point on the DEM is divided by this uncertainty to make it dimensionless, before being added to the cost function (:numref:`how_ba_works`). See also ``--heights-from-dem-robust-threshold``. --heights-from-dem-robust-threshold The robust threshold to use to keep the triangulated points close to the DEM if specified via ``--heights-from-dem``. This is applied after the point differences are divided by ``--heights-from-dem-uncertainty``. It will attenuate large height difference outliers. It is suggested to not modify this value, and adjust instead ``--heights-from-dem-uncertainty``. --mapproj-dem If specified, mapproject every pair of matched interest points onto this DEM and compute their distance, then percentiles of such distances for each image vs the rest and each image pair. This is done after bundle adjustment and outlier removal. Measured in meters. See :numref:`ba_mapproj_dem` for more details. Not related to ``--mapprojected-data``. --csv-format 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`` (a Cartesian coordinate system with origin at planet center is assumed, with the units being in meters), ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees, the radius is measured in meters from planet center), ``3:lat 2:lon 1:height_above_datum``, ``1:easting 2:northing 3:height_above_datum`` (need to set ``--csv-srs``; the height above datum is in meters). Can also use radius_km for column_type, when it is again measured from planet center. --csv-srs The PROJ or WKT string for interpreting the entries in input CSV files. --update-isis-cubes-with-csm-state Save the model state of optimized CSM cameras as part of the .cub files. Any prior version and any SPICE data will be deleted. Mapprojected images obtained with prior version of the cameras must no longer be used in stereo. --save-adjusted-rpc In addition to external adjustments to the input cameras, save RPC cameras with the adjustments applied to them, in XML format. This recomputes the RPC models (:numref:`rpc_and_ba`). --min-triangulation-angle Filter as outlier any triangulation point for which all rays converging to it have an angle less than this (measured in degrees). This happens on loading the match files and after each optimization pass. This should be used cautiously with very uncertain input cameras. See also ``--forced-triangulation-distance`` and ``--max-triangulation-angle``. --forced-triangulation-distance When triangulation fails, for example, when input cameras are inaccurate or the triangulation angle is too small, artificially create a triangulation point this far ahead of the camera, in units of meters. Some of these may later be filtered as outliers. Can also set a very small value for ``--min-triangulation-angle`` in this case. --ip-num-ransac-iterations How many RANSAC iterations to do in interest point matching. --save-cnet-as-gcp Save the optimized control network, after outlier filtering, in the format used by ground control points (:numref:`bagcp`), including any input GCP. The xyz sigma is 1 meter for regular non-GCP triangulated points and the value of ``--heights-from-dem-uncertainty`` for DEM-constrained points. Can be inspected with ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`). --camera-positions CSV file containing estimated position of each camera, in ECEF coordinates. For this to work well the camera must travel not along linear path, as this data will be used to find an alignment transform. Only used with the inline-adjustments setting to initialize global camera coordinates. If used, the csv-format setting must also be set. The "file" field is searched for strings that are found in the input image files to match locations to cameras. See :numref:`sfmicebridge` for an example. --init-camera-using-gcp Given an image, a pinhole camera lacking correct position and orientation, and a GCP file, find the pinhole camera with given intrinsics most consistent with the GCP (:numref:`camera_solve_gcp`). --transform-cameras-with-shared-gcp Given at least 3 GCP, with each seen in at least 2 images, find the triangulated positions based on pixels values in the GCP, and apply a rotation + translation + scale transform to the entire camera system so that the triangulated points get mapped to the ground coordinates in the GCP. --transform-cameras-using-gcp Given a set of GCP, with at least two images having at least three GCP each (but with each GCP not shared among the images), transform the cameras to ground coordinates. This is not as robust as ``--transform-cameras-with-shared-gcp``. --disable-pinhole-gcp-init Do not try to initialize pinhole camera coordinates using provided GCP coordinates. This is ignored as it is now the default. See also: ``--init-camera-using-gcp``. --position-filter-dist If estimated camera positions are used, this option can be used to set a threshold distance in meters between the cameras. If any pair of cameras is farther apart than this distance, the tool will not attempt to find matching interest points between those two cameras. --force-reuse-match-files Force reusing the match files even if older than the images or cameras. Then the order of images in each interest point match file need not be the same as for input images. Additional match files will be created if needed. --skip-matching Only use the match files that be loaded from disk. This implies ``--force-reuse-match-files``. --matches-as-txt Read and write match files as plain text instead of binary. See :numref:`txt_match`. --match-files-prefix Use the match files from this prefix instead of the current output prefix. See the naming convention in :numref:`ba_match_files`. This implies ``--skip-matching``. The order of images in each interest point match file need not be the same as for input images. See also ``--clean-match-files-prefix``. --clean-match-files-prefix Use as input the ``*-clean.match`` files from this prefix. This implies ``--skip-matching``. The order of images in each interest point match file need not be the same as for input images. Only one of ``--match-files-prefix`` and ``--clean-match-files-prefix`` can be set. --enable-rough-homography 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. --skip-rough-homography Skip the step of performing datum-based rough homography. This obsolete option is ignored as it is the default. --enable-tri-ip-filter Enable triangulation-based interest points filtering. This is best used with reasonably reliable input cameras. --disable-tri-ip-filter Disable triangulation-based interest points filtering. This obsolete option is ignored as is the default. --no-datum Do not assume a reliable datum exists, such as for irregularly shaped bodies or when at the ground level. This is also helpful when the input cameras are not very accurate, as the datum is used to do some camera-based filtering of interest points. --mapprojected-data Given map-projected versions of the input images and the DEM they were mapprojected onto, create interest point matches between the mapprojected images. Unproject and save those matches, then continue with bundle adjustment. Existing match files will be reused. Specify the mapprojected images and the DEM as a string in quotes, separated by spaces. The order must be same as for the input images. The DEM is optional (since the 1/2026 build) if it can be looked up in the geoheaders of the mapprojected images. If provided, the DEM must be the last file. See :numref:`mapip` for an example. It is suggested to use this with ``--auto-overlap-params.`` See also ``--mapprojected-data-list``. --save-intermediate-cameras Save the values for the cameras at each iteration. --apply-initial-transform-only Apply to the cameras the transform given by ``--initial-transform``. No iterations, GCP loading, image matching, or report generation take place. Using ``--num-iterations 0`` and without this option will create those. --image-list A file containing the list of images, when they are too many to specify on the command line. Use in the file a space or newline as separator. When solving for intrinsics for several sensors, pass to this option several lists, with comma as separator between the file names (no space). An example is in :numref:`kaguya_ba`. See also ``--camera-list`` and ``--mapprojected-data-list``. --camera-list A file containing the list of cameras, when they are too many to specify on the command line. If the images have embedded camera information, such as for ISIS, this file may be omitted, or specify the image names instead of camera names. --mapprojected-data-list A file containing the list of mapprojected images and the DEM (see ``--mapprojected-data``), when they are too many to specify on the command line. The order must be the same as for input images. The DEM is optional (since the 1/2026 build) if it can be looked up in the geoheaders of the mapprojected images. If provided, the DEM must be the last entry. --proj-win Flag as outliers input triangulated points not in this proj win (box in projected units as provided by ``--proj_str``). This should be generous if the input cameras have significant errors. --proj-str To be used in conjunction with ``--proj-win``. --weight-image Given a georeferenced image with float values, for each initial triangulated point find its location in the image and closest pixel value. Multiply the reprojection errors in the cameras for this point by this weight value. The solver will focus more on optimizing points with a higher weight. Points that fall outside the image and weights that are non-positive, NaN, or equal to nodata will be ignored. See :numref:`limit_ip` for details. --propagate-errors Propagate the errors from the input cameras to the triangulated points for all pairs of match points, and produce a report having the median, mean, standard deviation, and number of samples for each camera pair (:numref:`ba_error_propagation`). --horizontal-stddev If positive, propagate this stddev of horizontal ground plane camera uncertainty through triangulation for all cameras. To be used with ``--propagate-errors``. --epipolar-threshold Maximum distance from the epipolar line to search for IP matches. If this option isn't given, it will default to an automatic determination. --ip-inlier-factor Inlier factor used to remove outliers with homography filtering and RANSAC. A higher factor will result in more interest points, but perhaps also more outliers. --ip-uniqueness-threshold A higher threshold will result in more interest points, but perhaps less unique ones. --nodata-value Pixels with values less than or equal to this number are treated as no-data. This overrides the no-data values from input images. --individually-normalize Individually normalize the input images instead of using common values. --min-distortion Distortion parameters that are optimized and that are smaller in magnitude than this value are set to this value. This is to ensure the parameters are big enough to be optimized. Can be negative. This is affected by ``--fixed-distortion-indices``. Applies to Pinhole cameras (all distortion models) and CSM (radial-tangential distortion only). Does not apply to optical bar models. --fixed-distortion-indices A sequence of indices, separated by commas (with no spaces) starting from 0, corresponding to lens distortion parameters to keep fixed, if ``--solve-intrinsics`` is invoked. These will not be changed by the ``--min-distortion`` setting. Sample input: ``0,3,4``. The order of distortion parameters is as saved in output camera files. For example, for radial-tangential distortion, the order is ``k1, k2, p1, p2, k3`` (:numref:`pinhole_distortion`). --reference-terrain An externally provided trustworthy reference terrain to use as a constraint. It can be either a DEM or a point cloud in CSV format. It must be well-aligned with the input cameras (:numref:`reference_terrain`). --reference-terrain-weight How much weight to give to the cost function terms involving the reference terrain. --max-num-reference-points Maximum number of (randomly picked) points from the reference terrain to use. --disparity-list <'filename12 filename23 ...'> The unaligned disparity files to use when optimizing the intrinsics based on a reference terrain. Specify them as a list in quotes separated by spaces. First file is for the first two images, second is for the second and third images, etc. If an image pair has no disparity file, use 'none'. --max-disp-error 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. --bathy-plane Path to a file containing a plane approximating the water surface, for bathymetry correction with underwater terrain (:numref:`bathy_intro`). This corrects camera rays passing through water using Snell's law. If multiple images are used and they have different water surfaces use ``--bathy-plane-list``. Use together with ``--refraction-index``. See also ``--bathy-mask-list``. --bathy-plane-list Path to a file containing a list of bathy plane files for bathymetry correction, if more than one. Set one plane file per line. Must specify one plane per input image, in the same order. Use with ``--bathy-mask-list`` and ``--refraction-index``. --bathy-mask-list Path to a file containing a list of water mask images for bathymetry correction, one mask per line. Must specify one mask per input image, in the same order. Pixels classified as water must be either no-data or have zero value, while land pixels must have positive values. Must be used with ``--bathy-plane`` and ``--refraction-index``. An example is in :numref:`ba_bathy`. --refraction-index Index of refraction of water for bathymetry correction. Typical values: 1.333 to 1.341 depending on wavelength and temperature. Must be used with ``--bathy-plane``. See :numref:`refr_index` to compute the effective refraction index for a specific satellite band and water conditions. --max-triangulation-angle Filter as outlier any triangulation points for which the maximum angle of rays converging to it are more than this (measured in degrees). Set to a positive value. See also ``--min-triangulation-angle``. --ip-triangulation-max-error When matching IP, filter out any pairs with a triangulation error higher than this. The triangulation error is the shortest distance between rays. This gets used only when the usual triangulation error filtering fails. --flann-method Choose the FLANN method for matching interest points. Options: ``kmeans``: slower but deterministic, ``kdtree``: faster (up to 6x) but not deterministic (starting with FLANN 1.9.2). The default (``auto``) is to use ``kmeans`` for 25,000 features or less and ``kdtree`` otherwise. This does not apply to ORB feature matching. --ip-nodata-radius Remove IP near nodata with this radius, in pixels. --accept-provided-mapproj-dem Accept the DEM provided on the command line as the one mapprojection was done with, even if it disagrees with the DEM recorded in the geoheaders of input images. --save-vwip Save ``.vwip`` files (interest point matches per image, before matching). This option is currently ignored as ``.vwip`` are always saved. --threads Set the number threads to use. 0 means use the default defined in the program or in ``~/.vwrc``. Note that when using more than one thread and the Ceres option the results will vary slightly each time the tool is run. --cache-size-mb Set the system cache size, in MB, for each process. -v, --version Display the version of software. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/cam2map4stereo.rst ================================================ .. _cam2map4stereo.py: cam2map4stereo.py ----------------- This program takes similar arguments as the ISIS ``cam2map`` program, but takes two input images. With no arguments, the program determines the minimum overlap of the two images, and the worst common resolution, and then map-projects the two images to this identical area and resolution. The detailed reasons for doing this, and a manual step-by-step walkthrough of what ``cam2map4stereo.py`` does is provided in the discussion on aligning images in the Tutorial. The ``cam2map4stereo.py`` is also useful for selecting a subsection and/or reduced resolution portion of the full image. You can inspect a raw camera geometry image in qview after you have run ``spiceinit`` on it, select the latitude and longitude ranges, and then use ``cam2map4stereo.py``\ ’s ``--lat``, ``--lon``, and optionally ``--resolution`` options to pick out just the part you want. Use the ``--dry-run`` option the first few times to get an idea of what ``cam2map4stereo.py`` does for you. Command-line options for cam2map4stereo.py: -h, --help Display the help message. --manual Read the manual. -m, --map The mapfile to use for ``cam2map``. -p, --pixres The pixel resolution mode to use for ``cam2map``. -r, --resolution Resolution of the final map for ``cam2map``. -i, --interp Pixel interpolation scheme for ``cam2map``. -a, --lat Latitude range for ``cam2map``, where ``LAT`` is of the form *min:max*. So to specify a latitude range between -5 and 10 degrees, it would look like ``--lat=-5:10``. -o, --lon Longitude range for ``cam2map``, where ``LON`` is of the form *min:max*. So to specify a longitude range between 45 and 47 degrees, it would look like ``--lon=40:47``. -n, --dry-run Make calculations, and print the ``cam2map`` command that would be executed, but don’t actually run it. --prefix Make all output files use this prefix. Default: no prefix. -s, --suffix Suffix that gets inserted in the output file names. ================================================ FILE: docs/tools/cam2rpc.rst ================================================ .. _cam2rpc: cam2rpc ------- This tool is used to generate an approximate RPC model (:numref:`rpc`) for any camera model supported by ASP, in a given longitude-latitude-height region for a given datum, or for a terrain covered by a given DEM. If ``--save-tif-image`` is specified, the image portion corresponding to the RPC model will be saved in the TIF format. The produced RPC camera can be restricted to a given ground or pixel box. In either case it will be consistent with the image portion that is saved. The accuracy of RPC models generally degrades if expected to cover very large regions. Hence, they can be used piecewise, and the obtained terrain models from ASP can be then mosaicked together using ``dem_mosaic`` (:numref:`dem_mosaic`). Examples ~~~~~~~~ Example for ISIS cub cameras for Mars:: cam2rpc input.cub output.xml --session-type isis \ --datum D_MARS --save-tif-image \ --height-range -10000 -9000 \ --lon-lat-range 141.50 34.43 141.61 34.15 \ --penalty-weight 0.03 --gsd 1 Example for pinhole cameras, with the lon-lat-height box produced from a DEM. Here the image is also cropped and the image portion on which the RPC model is defined is saved:: cam2rpc input.tif input.tsai output.xml --session-type nadirpinhole \ --dem-file DEM.tif --save-tif-image --image-crop-box 90 70 5511 3675 Uses ~~~~ The obtained RPC models and (potentially cropped) images can be used with the ASP tools when invoked with ``--session-type rpc``. The datum is read from the ```` field, as written by ``cam2rpc``. It is suggested to also pass it via the ``--datum`` option. The RPC models should work with the third-party ``S2P`` and ``SETSM`` stereo software. Note that both of these packages are for Earth only. The produced RPC model file can be read by GDAL (including ``gdalinfo``, :numref:`gdal_tools`) if has the same name as the image but with the .xml extension, and no analogously named ``.rpb`` or ``_RPC.txt`` files are present. Validation ~~~~~~~~~~ It is suggested to mapproject the produced image and camera onto a DEM using ``mapproject`` (:numref:`mapproject`) and compare with the result from the original image and camera. In addition, *if the produced image file contains the original upper-left image corner*, the ``cam_test`` program (:numref:`cam_test`) can be invoked to compare the original and resulting RPC camera, for example as follows:: cam_test --image output.tif --cam1 input.tsai --cam2 output.xml \ --height-above-datum val Here, ``val`` is a value that is between the minimum and maximum heights used when the RPC model was computed. This should result in similar values for the camera directions and pixel differences, but not for the camera centers, because the RPC model does not have a well-defined camera center. Large pixel differences are a sign that the image was not cropped to the region containing the original upper-left corner (option ``--no-crop`` may help then, in addition to specifying larger lon-lat bounds or a bigger DEM to fit to). Usage ~~~~~ :: cam2rpc [options] See also ~~~~~~~~ To export an existing RPC camera to a file in XML format, use ``cam_gen`` (:numref:`cam_gen_rpc`). Command-line options ~~~~~~~~~~~~~~~~~~~~ --datum Set the datum. This will override the datum from the input images and also ``--semi-major-axis``, and ``--semi-minor-axis``. The datum from ``--t_srs`` or ``--dem-file`` takes priority, if set. Options: - WGS_1984 - D_MOON (1,737,400 meters) - D_MARS (3,396,190 meters) - MOLA (3,396,000 meters) - NAD83 - WGS72 - NAD27 - Earth (alias for WGS_1984) - Mars (alias for D_MARS) - Moon (alias for D_MOON) --semi-major-axis Explicitly set the datum semi-major axis in meters. The datum from ``--t_srs`` or ``--dem-file`` takes priority, if set. --semi-minor-axis Explicitly set the datum semi-minor axis in meters. The datum from ``--t_srs`` or ``--dem-file`` takes priority, if set. --t_srs Specify a GDAL projection string instead of the datum (in WKT, GeoJSON, or PROJ format). The datum from ``--dem-file`` takes priority, if set. --lon-lat-range The longitude-latitude range in which to compute the RPC model. Specify in the format: lon_min lat_min lon_max lat_max. --height-range Minimum and maximum heights above the datum in which to compute the RPC model. --dem-file Compute the longitude-latitude-height box in which to fit the RPC camera as the bounding box of the portion of this DEM that is seen by the input camera. --num-samples How many samples to use in each direction in the longitude-latitude-height range. --penalty-weight A higher penalty weight will result in smaller higher-order RPC coefficients. --save-tif-image 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. --input-nodata-value Set the image input nodata value. --output-nodata-value Set the image output nodata value. -t, --session-type 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 :numref:`ps_options` for options. --bundle-adjust-prefix Use the camera adjustment obtained by previously running bundle_adjust with this output prefix. --image-crop-box The output image and RPC model should not exceed this box, specified in input image pixels as minx miny widx widy. --no-crop 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. --skip-computing-rpc Skip computing the RPC model. --gsd Expected resolution on the ground, in meters. This is needed for SETSM. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --tile-size Image tile size used for multi-threaded processing. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/cam_gen.rst ================================================ .. _cam_gen: cam_gen ------- This program can create Pinhole (:numref:`pinholemodels`), Optical Bar (:numref:`panoramic`), and CSM (:numref:`csm`) camera models, given camera's optical center, focal length, pixel pitch, the longitude-latitude coordinates of the camera image corners (or some other pixels) as measured on a DEM. This tool can also approximate any camera supported by ASP, and produce a camera given geodetic coordinates of the camera center and roll, pitch, and yaw angles. A datum (and a height above it) can be used instead of the DEM. Normally all these inputs are known only approximately, so the output camera model will not be quite precise either, yet it could be good enough to refine later with bundle adjustment, which can also make use of the GCP file that this tool creates. This program can be used with historical images (:numref:`kh4`) for which camera position and orientation is not known. If the corners of the image on the ground are not known, they could be guessed in Google Earth. :numref:`skysat` makes use of ``cam_gen`` for SkySat images. It can also help avoid full Structure-from-Motion (:numref:`sfm`). The accuracy of this tool decreases as the field of view becomes very narrow. In that case it is suggested to use it to approximate a good known camera rather than creating a camera from scratch given corner ground coordinates (:numref:`cam_gen_prior`). The ``sat_sim`` program (:numref:`sat_sim`) can also create cameras, taking into account the orbit and look angle of the camera. See :numref:`cam_gen_validation` for how to validate the created cameras, and :numref:`initial_terrain` for how to find a reference DEM. Usage:: cam_gen [options] -o Examples ~~~~~~~~ .. _cam_gen_pinhole: Pinhole cameras ^^^^^^^^^^^^^^^ To create a Pinhole (:numref:`pinholemodels`) camera, given the longitude and and latitude of the image corners and camera intrinsics, run:: cam_gen --refine-camera --lon-lat-values \ '-122.389 37.627,-122.354 37.626,-122.358 37.612,-122.393 37.613' \ --reference-dem dem.tif --focal-length 553846.153846 \ --optical-center 1280 540 --pixel-pitch 1 \ img.tif -o img.tsai --gcp-file img.gcp --gcp-std 1e-2 The image corners corresponding to the lon-lat values are traversed in the order (0, 0) (w, 0) (w, h), (0, h) where w and h are the image width and height. Some other pixels can be used instead of image corners, with the ``--pixel-values`` option. Here we assume that the pixel pitch is 1, hence both the focal length and the optical center are in units of pixels. If the focal length and pixel pitch are given in meters, and one assumes the optical center to be the center of the image, then the optical center passed to this tool should be about half of the image width and height, with both multiplied by the pixel pitch, to make them in meters as well. This procedure is not as accurate as approximating an existing camera (:numref:`cam_gen_prior`). The camera center, if known, can be set with the option ``--camera-center`` or ``--camera-center-llh``. Otherwise the program will solve for it. Lens distortion parameters, if needed, can be added manually to the produced files (:numref:`pinholemodels`). To create the camera in the CSM Frame format (:numref:`csm`), ensure the output camera has the ``.json`` extension instead of ``.tsai``. See :numref:`cam_gen_validation` for how to validate the created cameras. Optical bar cameras ^^^^^^^^^^^^^^^^^^^ For creating optical bar cameras, the camera parameters must be passed in using the ``--sample-file`` option instead of specifying them all manually. An example is in :numref:`kh9`. For fitting a CSM linescan camera to an Optical Bar camera, see :numref:`opticalbar2csm`. .. _cam_gen_prior: Fit a prior camera ^^^^^^^^^^^^^^^^^^ This tool can also create a Pinhole camera approximating any camera supported by ASP, such as from ISIS cubes, RPC cameras, etc., as long as the intrinsics are approximately known. For that, it will shoot rays from the image corners (and also some inner points) using the provided camera that will intersect the provided DEM, determining the footprint on the ground. This will be used to find the best-fit pinhole model. In this case, the corner longitude-latitude coordinates need not be specified. Here is an example for ISIS cameras:: cam_gen image.cub --input-camera image.cub \ --focal-length 1000 --optical-center 500 300 \ --pixel-pitch 1 \ --gcp-std 1 --refine-camera \ --reference-dem dem.tif \ --height-above-datum 4000 \ -o output.tsai --gcp-file output.gcp Here we passed the image as the input camera, since for ISIS cubes (and also for some RPC cameras) the camera information is not stored in a separate camera file. If desired to refine the intrinsics, including the focal length and lens distortion, one has to produce CSM cameras (:numref:`cam_gen_frame`). Ensure the correct datum is passed for your planet, if a DEM is not used on input. For example: ``--datum D_MARS``. The ``--height-above-datum`` option will not be used if the input DEM covers the image ground footprint. See :numref:`cam_gen_validation` for how to validate the created cameras. .. _cam_gen_frame: CSM Frame cameras ^^^^^^^^^^^^^^^^^ This program can create a CSM Frame camera (:numref:`csm`) given the ground coordinates of the image corners and the camera intrinsics. The approach is in :numref:`cam_gen_pinhole`, except that the output camera has the ``.json`` extension. In addition, ``cam_gen`` can create a CSM Frame camera that approximates any given camera supported by ASP. In this mode, lens distortion is modeled as well. If the input camera is Pinhole with radial-tangential (Tsai) distortion, or no distortion at all (:numref:`pinholemodels`), it can be converted exactly to a CSM Frame model (with latest ASP), as:: cam_gen input.tif \ --input-camera input.tsai \ -o output.json See :numref:`cam_gen_validation` for how to validate the created cameras. For any other camera or distortion type, the best-fit model is found. An additional solver pass can be invoked, which can refine the intrinsics, that is, the focal length, optical center, and the distortion coefficients. See the ``--distortion`` option in :numref:`cam_gen_options` for the distortion model. Good initial guesses, especially for the focal length and optical center, are still expected. Example:: cam_gen input.tif \ --input-camera input.xml \ --reference-dem dem.tif \ --focal-length 30000 \ --optical-center 3000 2000 \ --pixel-pitch 1 \ --refine-camera \ --refine-intrinsics focal_length,distortion \ -o output.json Here it was assumed that the pixel pitch was 1. The pixel pitch can also be in millimeters, but then the focal length and optical center must be in the same units. Upon conversion to CSM Frame cameras, the focal length is kept as-is, but the optical center is divided by the pixel pitch, as CSM expects pixel units. It is suggested to not optimize the optical center (at least in a first pass), as that correlates with the camera pose and can lead to an implausible solution. The ``--distortion`` option need not be set, as the program will try to figure that out. If invoked with ``--refine-intrinsics none``, the provided intrinsics will be passed to the CSM model, but then only the camera pose will be refined. This is different than just using ``--refine-camera`` alone, which does not support lens distortion. If the camera model is contained within the image, pass the image to ``--input-camera``. Instead of specifying the focal length, optical center, and distortion, one can pass a camera model having those to ``--sample-file``. To transfer the intrinsics produced by the invocation above to another camera acquired with the same sensor, run:: cam_gen input2.tif \ --input-camera input2.xml \ --reference-dem dem.tif \ --pixel-pitch 1 \ --refine-camera \ --refine-intrinsics none \ --sample-file output.json \ -o output2.json The produced camera intrinsics can be jointly refined with other frame or linescan cameras using ``bundle_adjust`` (:numref:`ba_frame_linescan`). Several lens distortion models are supported (option ``--distortion-type``, :numref:`cam_gen_options`). See :numref:`cam_gen_validation` for how to validate the created cameras. .. _cam_gen_linescan: CSM linescan cameras ^^^^^^^^^^^^^^^^^^^^ This program can take as input a linescan camera, such as WorldView (:numref:`dg_tutorial`), Pleiades (:numref:`pleiades`), ASTER (:numref:`aster`), and CSM (:numref:`csm`), and convert it to the CSM linescan model state format (:numref:`csm_state`). This allows one to use ASP with a combination of linescan cameras from different vendors and also with Frame cameras (:numref:`ba_frame_linescan`). An example is as follows:: cam_gen --camera-type linescan \ input.tif --input-camera input.xml \ -o output.json The option ``--bundle-adjust-prefix`` can be used to apply an adjustment to the camera on loading. For fitting a CSM linescan camera to an Optical Bar camera, see :numref:`opticalbar2csm`. The ``cam_test`` program (:numref:`cam_test`) can verify the agreement between the input and output cameras. Do not specify the ``--bundle-adjust-prefix`` option for such experiments, as the original camera does not have the adjustment applied to it, the produced one does, and ``cam_test`` will apply such an adjustment to both. If desired to create linescan cameras to given specifications, use instead ``sat_sim`` (:numref:`sat_sim`). See :numref:`cam_gen_validation` for how to validate the created cameras. .. _opticalbar2csm: Fit CSM to Optical Bar ^^^^^^^^^^^^^^^^^^^^^^ Optical bar cameras (:numref:`panoramic`) can be approximated very well by CSM (:numref:`csm`) linescan cameras. Example usage:: cam_gen --camera-type linescan \ input.tif \ --input-camera input.tsai \ -o output.json It is very important to note that the images acquired with this sensor, such as for KH-9 (:numref:`kh9`), are usually stored on disk with the scan lines parallel to image columns. The CSM linescan model assumes that the scan lines are parallel to the image lines. Because of this, the invocation above does an in-sensor 90-degree clockwise rotation. The image must be rotated as well, to be consistent with the new camera. The preferred way to rotate an image is with the ``image_mosaic`` option ``--rotate-90`` (:numref:`image_mosaic`). This will handle large images, unlike the ImageMagick ``convert`` program. The input and output cameras are not directly comparable via ``cam_test`` (:numref:`cam_test`) because of the in-sensor rotation, yet a sanity check of the output camera against itself can take place. These images and camera models can be compared with the help of mapprojection (:numref:`cam_gen_validation`). The original image and cameras are passed to one mapprojection command, then the new image and new camera to another. The resulting images should agree at the pixel level. .. _cam_gen_extrinsics: Geodetic coordinates and angles ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Given a file named ``extrinsics.txt`` with lines of the form:: # image, lon, lat, height_above_datum, roll, pitch, yaw img.tif, -95.092, 29.508, 1280.175, 0.073, 11.122, 144.002 the command:: cam_gen \ --extrinsics extrinsics.txt \ --sample-file sample.tsai \ --datum WGS84 will write for each line a camera model based on these measurements of camera position and orientation. The heights are in meters, measured above the specified datum. The camera model file is obtained from the image name by replacing the extension with ``.tsai``. The three angles are applied in the order roll, pitch, yaw, starting from the camera pointing straight down, which is the camera z axis. The yas is measured from the North direction (x axis). The intrinsics are taken from the sample file, an example of which is in :numref:`file_format`. Only the focal length, optical center, lens distortion, and pixel pitch values from such a file are used. The text file passed in to ``--extrinsics`` can have the entries in any order, and additional entries as well, as long as there is one-to-one correspondence between the names in the starting header line and the values in subsequent lines. All the desired named columns must exist, with these precise names. Comma and space can be used as separators. Empty lines and lines starting with the pound sign are ignored. Such functionality can be helpful for processing images acquired with an aircraft that records metadata in a list (:numref:`sfmicebridge`), or in EXIF (:numref:`sfm_uas`). See :numref:`cam_gen_validation` for how to validate the created cameras. .. _cam_gen_rpc: Export RPC ^^^^^^^^^^ If the input image has an associated RPC camera model (:numref:`rpc`), whether embedded in the image, or in a separate file with an .RPB or _RPC.TXT suffix, the ``cam_gen`` program can export it to a separate XML file, as follows:: cam_gen \ --camera-type rpc \ input.tif \ -o output.xml An input camera in XML format can be explicitly specified via ``--input-camera``, if not embedded in the image. Example:: cam_gen \ --camera-type rpc \ input.tif \ --input-camera camera.xml \ -o output.xml See the `GeoTiff RPC documentation `_ for how the RPC model associated with an image is specified, and regarding the *order of lookup* if several candidates exist. To create an RPC camera model from another camera type, or to refit an existing one, use ``cam2rpc`` (:numref:`cam2rpc`). Further refinement ~~~~~~~~~~~~~~~~~~ The camera obtained using this tool (whether with or without the ``--refine-camera`` option) can be re-optimized in ``bundle_adjust`` using the GCP file written above as follows:: bundle_adjust img.tif img.tsai img.gcp -o run/run --datum WGS84 \ --inline-adjustments --robust-threshold 10000 It is suggested that this is avoided by default. One has to be a bit careful when doing this optimization to ensure some corners are not optimized at the expense of others. This is discussed in :numref:`camera_solve_gcp`. See :numref:`kaguya_ba` regarding optimizing camera intrinsics. .. _cam_gen_validation: Validation ~~~~~~~~~~ It is strongly suggested to mapproject the image with the obtained camera to verify if it projects where expected:: mapproject dem.tif img.tif img.tsai img_map.tif The output ``img_map.tif`` can be overlaid onto the hillshaded DEM in ``stereo_gui`` (:numref:`stereo_gui`). Use ``cam_test`` program (:numref:`cam_test`) for sanity checks. This is particularly helpful when ``cam_gen`` is used to approximate a prior camera. Then these can be compared. The ``sfm_view`` program (:numref:`sfm_view`) can be used to visualize the cameras in orbit. One can invoke ``orbitviz`` (:numref:`orbitviz`):: orbitviz img.tif img.tsai -o orbit.kml to create a KML file that can then be opened in Google Earth. It will display the cameras above the planet. .. _cam_gen_options: Command-line options ~~~~~~~~~~~~~~~~~~~~ -o, --output-camera-file Specify the output camera file. --camera-type Specify the output camera type. Options: ``pinhole``, ``opticalbar``, ``linescan`` (:numref:`cam_gen_linescan`), ``rpc`` (:numref:`cam_gen_rpc`). --lon-lat-values A (quoted) string listing numbers, separated by commas or spaces, having the longitude and latitude (alternating and in this order) of each image corner or some other list of pixels given by ``--pixel-values``. If the corners are used, they are traversed in the order (0, 0) (w, 0) (w, h), (0, h) where w and h are the image width and height. --pixel-values 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. --reference-dem Use this DEM to infer the heights above datum of the image corners. --datum 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 * NAD27 * Earth (alias for WGS_1984) * Mars (alias for D_MARS) * Moon (alias for D_MOON) --height-above-datum Assume this height above datum in meters for the image corners unless read from the DEM. --sample-file Read the camera intrinsics from this file. Required for optical bar cameras. See :numref:`kh9`, :numref:`file_format`, and :numref:`panoramic`. --focal-length The camera focal length. If ``--pixel-pitch`` is in millimeters, this must be in millimeters as well. --optical-center The camera optical center (horizontal and vertical components). If ``--pixel-pitch`` is in millimeters, this must be in millimeters as well. If not specified for pinhole cameras, it will be set to image center (half of image dimensions) times the pixel pitch. The optical bar camera always uses the image center. --pixel-pitch The camera pixel pitch, that is, the width of a pixel. It can be in millimeters, and then the focal length and optical center must be in millimeters as well. If set to 1, the focal length and optical center are in units of pixel. --distortion Distortion model parameters. It is best to leave this blank and have the program determine them. By default, the OpenCV `radial-tangential lens distortion `_ model is used. Then, can specify 5 numbers, in quotes, in the order k1, k2, p1, p2, k3. Also supported are the radial distortion model with 3 parameters, k1, k2, and k3, and the transverse model, which needs 20 values. The latter are the coefficients of a pair of polynomials of degree 3 in x and y. Only applicable when creating CSM Frame cameras. The default is zero distortion. See also ``--distortion-type``. --distortion-type Set the distortion type. Options: ``radtan``, ``radial``, ``transverse``. Only applicable when creating CSM Frame cameras (:numref:`cam_gen_frame`). --camera-center The camera center in ECEF coordinates. If not set, the program will solve for it. If setting ``--refine-camera``, consider using ``--cam-ctr-weight``. See also ``--camera-center-llh``. --camera-center-llh The camera center in longitude, latitude, and height above datum. See also: ``--camera-center``. --refine-camera After a rough initial camera is obtained, refine it using least squares. This does not support distortion. For CSM Frame cameras, a more powerful solver is available, see option ``--refine-intrinsics``. Consider not refining the camera here, but having ``bundle_adjust`` take in the camera as-is, together with GCP. --refine-intrinsics Refine the camera intrinsics together with the camera pose. Specify, in quotes or with comma as separator, one or more of: ``focal_length``, ``optical_center``, ``other_intrinsics`` (same as ``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 (:numref:`cam_gen_frame`). --frame-index 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. --gcp-file If provided, save the image corner coordinates and heights in the GCP format to this file. --gcp-std 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. --input-camera Create a camera approximating this camera. See the examples above and in :numref:`skysat_stereo` for various applications. --extrinsics Read a file having on each line an image name and extrinsic parameters as longitude, latitude, height above datum, roll, pitch, and yaw. Write one .tsai camera file per image. See :numref:`cam_gen_extrinsics`. --cam-height If both this and ``--cam-weight`` are positive, enforce that the output camera is at this height above datum. --cam-weight If positive, try to enforce the option ``--cam-height`` with this weight (a bigger weight means try harder to enforce). --cam-ctr-weight If positive, try to enforce that during camera refinement the camera center stays close to the initial value (a bigger weight means try harder to enforce this, a value like 1000 is good enough). -t, --session-type 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 :numref:`ps_options` for options. --bundle-adjust-prefix Use the camera adjustment obtained by previously running bundle_adjust when providing an input camera. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/cam_test.rst ================================================ .. _cam_test: cam_test -------- This tool compares two camera models for the same image, or a camera model against itself. It finds the camera center and ray direction at a set of sampled pixels for both cameras and checks how they differ. Then, it projects pixels to the datum using the first camera and back-projects the resulting ECEF points into the second camera, and estimates the pixel discrepancy. It prints the average time (in milliseconds) for the operation of projecting from the camera to the ground and back. Examples ~~~~~~~~ See :numref:`examples` for information on the camera types used below. Compare a CSM camera model against itself:: cam_test --image input.cub --cam1 input.json --cam2 input.json \ --session1 csm --session2 csm Compare a PeruSat-1 exact linescan model to its RPC approximation:: cam_test --image input.tif --cam1 exact_cam.xml --cam2 rpc_cam.xml Here the two individual camera types will be auto-guessed as ``perusat`` and ``rpc``, or can be specified as above with ``--session1`` and ``--session2``. Compare ISIS to CSM cameras:: cam_test --image input.cub --cam1 input.cub --cam2 input.json \ --sample-rate 5000 Compare the exact and RPC model stored in the same DigitalGlobe / Maxar file:: cam_test --image input.tif --cam1 input.xml --cam2 input.xml \ --session1 dg --session2 rpc --sample-rate 1000 Evaluate a camera transformed with ``convert_pinhole_model`` (:numref:`convert_pinhole_model`). In this case the session names would be the same but the cameras would differ:: cam_test --image input.tif --cam1 in.tsai --cam2 out.tsai \ --session1 pinhole --session2 pinhole Here we evaluate a CSM camera against itself, with no .cub image file. The image dimensions are contained in the camera file. This verifies that the ground-to-image and image-to-ground functions are inverse of each other, up to a certain tolerance. :: cam_test --image input.json --cam1 input.json --cam2 input.json \ --session1 csm --session2 csm --sample-rate 100 \ --subpixel-offset 0.3 Usage ~~~~~ :: cam_test --image --cam1 \ --cam2 [other options] Command-line options ~~~~~~~~~~~~~~~~~~~~ --image Image file. --cam1 Camera 1 file. --cam2 Camera 2 file. --session1 Session to use for camera 1 (if not provided it will be guessed). --session2 Session to use for camera 2 (if not provided it will be guessed). --sample-rate Use one out of these many pixels when sampling the image. --subpixel-offset Add to each integer pixel this offset (in x and y) when sampling the image. Sampling at non-integer location may make testing more thorough. --single-pixel Instead of sampling pixels from the image use only this pixel. --print-per-pixel-results Print the results at each pixel. --datum Set the datum. This will override the datum from the input cameras. Usually needed only for Pinhole cameras, when the camera does not have the datum information. 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). --height-above-datum Let the ground surface be at this height above the datum (measured in meters). --bundle-adjust-prefix Adjust the cameras using this prefix (:numref:`bundle_adjust`). --cam1-bundle-adjust-prefix Adjust the first camera using this prefix. --cam2-bundle-adjust-prefix Adjust the second camera using this prefix. --cache-size-mb Set the system cache size, in MB. --bathy-plane Read from this file a bathy plane, so a water surface which is a plane in local projected coordinates (:numref:`bathy_plane_def`). A ray from the camera to the ellipsoid determined by ``--height-above-datum`` that encounters this bathy plane along the way will get bent according to Snell's law. Same for a ray going in reverse. --refraction-index The index of refraction of water to be used in bathymetry correction. Must be bigger than 1. This index can be computed with :ref:`refr_index`. -h, --help Display the help message. ================================================ FILE: docs/tools/camera_calibrate.rst ================================================ .. _camera_calibrate: camera_calibrate ---------------- Overview ~~~~~~~~ The ``camera_calibrate`` tool can generate camera models suitable for use by ``camera_solve`` (:numref:`camera_solve`), and other ASP tools. This program only solves for intrinsic camera parameters. To obtain the camera pose you should use ``camera_solve``. This tool is a wrapper around the `OpenCV camera calibration `_ software, which takes care of converting the output into readily usable formats. Other tools ~~~~~~~~~~~ ASP also ships the ``rig_calibrator`` program (:numref:`rig_calibrator`), which calibrates the intrinsic and extrinsics of a rig of cameras, without using a calibration target. The ``bundle_adjust`` program can refine the intrinsics and extrinsics of cameras, and can also constrain against a known well-aligned terrain (:numref:`floatingintrinsics`). Example ~~~~~~~ :: camera_calibrate --box-size-cm 4.28625 outputFolder \ 12 12 "images/image*.jpg" Here, the checkerboard pattern has 13 squares in each direction, so 12 inner corners. How to use ~~~~~~~~~~ :: camera_calibrate [options] \ \ \ When you run the tool, three camera model files will be created in the output folder: ``solve_cam_params.txt``, ``vw_cam_params.tsai``, and ``ocv_cam_params.yml``. The first file can be used as a camera calibration file for ``camera_solve``. The second file is a pinhole camera format that is recognized by ASP but remember that the extrinsic parameters were not solved for so ASP is limited in what it can do with the camera file. The last file contains the camera information as formatted by the OpenCV calibration tool. If you use the first file as an input to ``camera_solve`` you must remember to replace the wildcard image path in the file with the one to the images you want to use solve for (as opposed to the checkerboard images). In order to use this tool you must provide multiple images of the same checkerboard pattern acquired with the camera you wish to calibrate. When calling the tool you must specify the number of *inner* square corners contained in your checkerboard pattern (width and height can be swapped) so that OpenCV knows what to look for. You must also specify an image wildcard path such as ``"checkers/image*.jpg"``. This must be in quotes so that the wildcard is not expanded before it is passed to the tool. If you do not provide the ``--box-size`` parameter, the output calibration numbers will be unitless. Command-line options ~~~~~~~~~~~~~~~~~~~~ -h, --help Display this help message. --overwrite Recompute any intermediate steps already completed on disk. --suppress-output Reduce the amount of program console output. --box-size-cm The size of the checkerboard squares in centimeters. --duplicate-files Make a copy of the VisionWorkbench parameter file for each input camera. ================================================ FILE: docs/tools/camera_footprint.rst ================================================ .. _camera_footprint: camera_footprint ---------------- The ``camera_footprint`` program computes what the footprint of an image would be if mapprojected (:numref:`mapproject`) onto the provided DEM or datum. The bounding box of the footprint is printed to the screen. It will be in units of the DEM projection, or in longitude-latitude if a datum is provided. These can be overridden with ``--t_srs``. The estimated ground sample distance will be printed as well, in the same units. This tool can be useful for debugging camera orientations or getting a quick overview of where the input image is located on the ground. Save as shapefile ~~~~~~~~~~~~~~~~~ If a shapefile output path is provided, this program will also create a shapefile containing the convex hull of the footprint. The coordinate system will be determined, as above, depending on whether ``--t_srs``, ``--dem-file``, or ``--datum`` is used. Example:: camera_footprint \ --dem-file dem.tif \ image.tif \ camera.tsai \ --output-shp footprint.shp Such a shapefile can be displayed and overlaid on top of georeferenced images with ``stereo_gui`` (:numref:`plot_poly`). Save as KML ~~~~~~~~~~~ If a KML output path is provided, this program will also create a KML file containing the footprint. The KML will show a box with an X pattern displaying the points ASP used to compute the footprint. If the provided DEM is smaller than the image footprint, additional point samples may be drawn within the image footprint, as the DEM is sampled. The entries in the KML file will be in longitude-latitude coordinates. Example:: camera_footprint \ --dem-file dem.tif \ image.tif \ camera.tsai \ --output-kml footprint.kml Project onto a datum ~~~~~~~~~~~~~~~~~~~~ If a DEM is not provided, the program will project onto a datum instead. For that, use an option such as ``--datum WGS_1984`` instead of ``--dem-file``. Usage ~~~~~ :: camera_footprint [options] Command-line options ~~~~~~~~~~~~~~~~~~~~ --dem-file Intersect with this DEM instead of a datum. --datum Use this datum to interpret the heights. Options are: WGS_1984, D_MOON, D_MARS, and MOLA. --t_srs Specify the georeference projection (PROJ or WKT) string. -t, --session-type Select the stereo session type to use for processing. Normally this is autodetected. --bundle-adjust-prefix Use the camera adjustment obtained by previously running bundle_adjust with this output prefix. --output-shp Save the convex hull of the points sampled on the camera footprint as a shapefile with this name. --output-kml Write an output KML file at this location. --quick Use a faster but less accurate computation. -h, --help Display the help message. ================================================ FILE: docs/tools/camera_solve.rst ================================================ .. _camera_solve: camera_solve ------------ The ``camera_solve`` tool takes as input a set of images acquired with a camera, and finds each camera's pose (position and orientation). If ground control points are provided, the resulting set of cameras is transformed to be in a desired coordinate system. For more context and examples see :numref:`sfm`. Overview ~~~~~~~~ This tool is a wrapper around the `TheiaSfM `_ structure-from-motion software, and its goal is to create camera models which can later be used with ASP's bundle adjustment (:numref:`bundle_adjust`) and stereo (:numref:`tutorial`). The camera calibration passed with the ``--calib-file`` option should be a .tsai pinhole camera model file in one of the formats compatible with ASP. Our supported pinhole camera models are described in :numref:`pinholemodels`. One can use a set of estimated camera positions to register camera models in world coordinates. This method is not as accurate as using ground control points but it may be easier to use. To do this, use the ``--camera-positions`` parameter to ``bundle_adjust`` via the ``--bundle-adjust-params`` option similar to the example line below. If you see the camera models shifting too far from their starting positions, try using the ``--camera-weight`` option to restrain their movement. This tool will generate two .tsai camera model files in the output folder per input image. The first file, appended with .tsai, is in a local coordinate system and does not include optimizations for intrinsic parameters but it may be useful for debugging purposes. The second file, appended with .final.tsai, contains the final solver results. If ground control points or estimated camera positions were provided, then the second file will be in a global coordinate system. This program produces somewhat different results each time it is run. A related tool is ``theia_sfm`` (:numref:`theia_sfm`). Flags file ~~~~~~~~~~ To customize the options passed to Theia, edit the flag file which is saved in each output folder and pass it back to ``camera_solve`` via ``--theia-flagfile``, or use the option ``--theia-overrides``. In particular, setting ``--feature_density=DENSE`` in the flags file can be of great help if there are not enough matches between images. The option ``--matching_strategy=CASCADE_HASHING`` can greatly speed up finding matches. Example ~~~~~~~ :: camera_solve \ --theia-overrides '--matching_strategy=CASCADE_HASHING' \ --bundle-adjust-params '--camera-positions nav.csv --csv-format 1:file,12:lat,13:lon,14:height_above_datum' \ The produced Theia reconstruction can be visualized with ``view_reconstruction`` (:numref:`view_reconstruction`). Usage ~~~~~ :: camera_solve [options] Command-line options ~~~~~~~~~~~~~~~~~~~~ --datum The datum to use when calibrating. Default is WGS84. --calib-file Path to an ASP compatible pinhole model file containing camera model information. The position and pose information will be ignored. To use a unique file for each input image, pass a space-separated list of files surrounded by quotes. --gcp-file Obsolete option for specifying GCP. One or more GCP files will be recognized and loaded if ending with .gcp, without this option. --bundle-adjust-params Additional parameters (in single quotes) to pass to the ``bundle_adjust`` tool. --theia-overrides Override any option in the auto-generated Theia flag file. Set as ``"--option1=val1 --option2=val2 ..."``. 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. --theia-flagfile Path to a custom Theia flagfile to use settings from. File paths specified in this file are ignored. --overwrite Recompute any intermediate steps already completed on disk. --reuse-theia-matches Pass Theia's computed interest point matches to bundle adjustment instead of recreating them. This is ignored as it is the default. --suppress-output Reduce the amount of program console output. --threads Number of threads to use. If set to 0, will use 16 threads. -h, --help Display this help message. ================================================ FILE: docs/tools/cgal_tools.rst ================================================ .. _cgal_tools: CGAL tools ---------- ASP distributes in the ``bin`` directory the following CGAL tools for manipulating meshes in .ply format, which are produced with the ``multi_stereo`` (:numref:`multi_stereo`) and ``voxblox_mesh`` (:numref:`voxblox_mesh`) tools:: - rm_connected_components - smoothe_mesh - fill_holes - simplify_mesh These tools can be built and used independently of ASP. See the `source code and build instructions `_. Examples ~~~~~~~~ Remove small connected components from the mesh:: num_min_faces_in_component=100 num_components_to_keep=10 rm_connected_components \ $num_min_faces_in_component \ $num_components_to_keep \ Mesh smoothing:: num_iter=1; smoothing_time=5e-5; smoothe_boundary=1 smoothe_mesh \ $num_iter $smoothing_time $smoothe_boundary \ Hole-filling:: max_hole_diameter=0.8 max_num_hole_edges=100 fill_holes \ $max_hole_diameter $max_num_hole_edges \ Mesh simplification:: edge_keep_ratio=0.2 simplify_mesh $edge_keep_ratio \ It is very strongly recommended to first run these tools on small meshes to get a feel for how they work. Meshlab can be used to inspect the results. ================================================ FILE: docs/tools/colormap.rst ================================================ .. _colormap: colormap -------- The ``colormap`` tool reads a DEM or some other single-channel image, and writes a corresponding color-coded image that can be used for visualization. Usage:: colormap [options] Example:: colormap --min -5 --max 10 image.tif This will produce ``image_CMAP.tif``, with the "hottest" color corresponding to pixel values at least 10, and the "coolest" color representing pixel values less than or equal to -5. To create a hillshaded (:numref:`hillshade`) colormap of a DEM, run:: colormap --hillshade -e 25 -a 300 dem.tif -o color-shaded.tif Alternatively, run:: hillshade -e 25 -a 300 dem.tif -o shaded.tif colormap dem.tif -s shaded.tif -o color-shaded.tif The second approach can incorporate any type of grayscale image as a multiplier to the colorized image. See :numref:`visualizing_results` for a discussion of ASP's visualization tools, including this one. To add a colorbar and axes, use ``stereo_gui`` (:numref:`colorize`). .. figure:: ../images/colormaps.png :name: Colormaps Example of images produced with the following colormaps (left to right, and top-down): ``binary-red-blue`` (default), ``jet``, ``black-body``, ``viridis``, ``kindlmann``, ``cubehelix``, ``plasma``, ``inferno``, ``rainbow``, ``turbo`` (`source1 `_, `source2 `_). Using your own colormap ^^^^^^^^^^^^^^^^^^^^^^^ Both this tool and ``stereo_gui`` (:numref:`stereo_gui`) accept a user-defined colormap. It should be in a file named, for example, ``mycolormap``, and can be passed to these tools via ``--colormap-style mycolormap``. Such a file must be in plain text, with four columns having on each row a floating point number (increasing from 0 to 1), then 3 integers between 0 and 255, corresponding to the RGB components of a color. Here's an example Python code which creates a custom colormap, by exporting it from a `matplotlib colormap `_:: #!/usr/bin/python from matplotlib import cm # colormap name goes here, e.g., 'turbo' cmap = cm.turbo num = cmap.N for i in range(num): rgba = cmap(i) print(i / float(num - 1), round(255 * rgba[0]), round(255 * rgba[1]), round(255 * rgba[2])) Save this script as ``export_colormap.py``, and run it as:: python ~/bin/export_colormap.py > mycolormap Command-line options for ``colormap`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -o, --output-file Specify the output file. --colormap-style Specify the colormap style. Options: ``binary-red-blue`` (default), ``jet``, ``black-body``, ``viridis``, ``kindlmann``, ``cubehelix``, ``plasma``, ``inferno``, ``rainbow``, ``turbo``. Or specify the name of a file having the colormap, on each line of which there must be a normalized or percentage intensity and the three integer RGB values it maps to. --nodata-value Remap the DEM default value to the min altitude value. --min Minimum height of the color map. --max Maximum height of the color map. --moon Set the min and max height to good values for the Moon. --mars Set the min and max height to good values for Mars. -s, --shaded-relief-file Specify a shaded relief image (grayscale) to apply to the colorized image. For example, this can be a hillshaded image. --hillshade Create a hillshaded image first, then incorporate it in the colormap. This is equivalent to using an external file with the ``--shaded-relief-file`` option. -a, --azimuth Sets the direction that the light source is coming from (in degrees). Zero degrees is to the right, with positive degrees counter-clockwise. To be used with the ``--hillshade`` option. -e, --elevation Set the elevation of the light source (in degrees). To be used with the ``--hillshade`` option. --legend Generate an unlabeled legend, will be saved as ``legend.png``. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :ref:`cog_output`. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/convert_pinhole_model.rst ================================================ .. _convert_pinhole_model: convert_pinhole_model --------------------- This tool can be used to approximately convert a pinhole model from one of the types listed in :numref:`pinholemodels` or an optical bar model (:numref:`panoramic`) to any other pinhole model type. This can be convenient, for example, because for the Brown-Conrady and Photometrix models the distortion operation is iterative and slow, and by converting to a Tsai or Adjustable Tsai model this operation can be sped up. This program can also be used to convert a pinhole or optical bar model to a pinhole model with RPC lens distortion (:numref:`rpc_distortion`), which is a model where distortion is expressed as a ratio of polynomials. The degree of the RPC lens distortion can be specified via ``--rpc-degree``. A smaller value is suggested to start with, as lower-degree polynomials may be easier to interpret. Usage ~~~~~ :: convert_pinhole_model [options] \ -o Examples ~~~~~~~~ Convert a camera model to have RPC lens distortion of degree 3:: convert_pinhole_model input.jpg input.tsai --output-type RPC \ --rpc-degree 3 -o output_rpc.tsai RPC polynomials of degree up to 6 have been used successfully (:numref:`ba_rpc_distortion`, :numref:`dem2gcp`). Specify the image dimensions instead of the image, and convert to radial-tangential (Tsai) lens distortion:: convert_pinhole_model input.tsai --output-type TsaiLensDistortion \ --image-size "5000 4000" -o output.tsai Validation ~~~~~~~~~~ The ``cam_test`` program (:numref:`cam_test`) can be used to project from the camera to the ground using one of the models, and then back to the camera using the converted model. Here is an example:: cam_test --image input.jpg --cam1 input.tsai --cam2 output.tsai \ --session1 pinhole --session2 pinhole --datum D_MOON The ``--datum`` defines the ground to use. The produced statistics of pixel differences can be used to judge the quality of the distortion model conversion. Refinement ~~~~~~~~~~ Bundle adjustment can refine a produced camera model. For that, it is suggested to have many overlapping images, a well-aligned terrain model to constrain against, and to ensure that all images acquired with the same sensor share the intrinsic parameters. A detailed recipe is in :numref:`kaguya_ba`. Command-line options ~~~~~~~~~~~~~~~~~~~~ -o, --output-file Specify the output file. It is expected to have the .tsai extension. --output-type The output model type. Options: TsaiLensDistortion, BrownConradyDistortion, RPC. --sample-spacing Pick one out of this many consecutive pixels to sample. If not specified, it will be auto-computed. --rpc-degree The degree of the polynomials, if the output distortion model is RPC. --camera-to-ground-dist The distance from the camera to the ground, in meters. This is necessary to convert an optical bar model to pinhole. --image-size <"int int" (default: "")> Image width and height, specified as two numbers in quotes and separated by a space, unless the input image file is provided. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/corr_eval.rst ================================================ .. _corr_eval: corr_eval --------- The ``corr_eval`` program takes as input left and right aligned images and a disparity, as produced by ``parallel_stereo`` (:numref:`parallel_stereo`), and creates an image of same dimensions as the left image, having a measure of the quality of the disparity at each pixel. The input disparity can be any of ``D.tif``, ``B.tif``, ``RD.tif``, or ``F.tif``. (:numref:`outputfiles` describes these.) Two quality metrics are supported, for the moment. - Normalized cross-correlation (NCC). For each left aligned image pixel find the normalized cross-correlation between the patch of dimensions given by the kernel size around that pixel and corresponding patch in the right aligned image, as determined by the disparity at that pixel. A higher value means a more reliable disparity. Since the disparity is floating-point, bilinear interpolation is used in the right image (unless the flag ``--round-to-int`` is set, when the disparity is rounded to int and no interpolation happens). Pixels with no-data values and out-of-range pixels are excluded from the calculation. Note that NCC is not the zero-normalized cross-correlation, so there is no subtraction from each pixel of the mean of all pixels in the patch. - Average of standard deviations of left and right matching patches. The output image has no-data values at pixels where it could not compute the desired metric. Usage:: corr_eval [options] Example for a disparity created with ``--stereo-algorithm asp_bm``:: corr_eval --prefilter-mode 2 --kernel-size 21 21 --metric ncc \ run/run-L.tif run/run-R.tif run/run-RD.tif run/run Example for a disparity created with the ``asp_mgm`` algorithm:: corr_eval --prefilter-mode 0 --kernel-size 5 5 --metric ncc \ run/run-L.tif run/run-R.tif run/run-RD.tif run/run This will create ``run/run-ncc.tif``. It appears that always using ``--prefilter-mode 2`` makes this tool produce better results. This is to be investigated further. Consider also experimenting with ``--kernel-size``. The external stereo algorithms (:numref:`stereo_algos_full`) do not use the prefilter mode, and each of them specifies the correlation kernel size in its own way. See also the somewhat-related image correlator tool which can find the disparity of two images without assuming camera information (:numref:`correlator-mode`). Command-line options for ``corr_eval``: --kernel-size The dimensions of image patches. These must be positive odd numbers. --metric The metric to use to evaluate the quality of correlation. Options: ``ncc``, ``stddev``. --prefilter-mode Prefilter mode. This is the same prefilter as in stereo correlation (:numref:`stereodefault`) with the ``asp_bm`` method. Options: 0 (none), 1 (subtracted mean), 2 (LoG). --prefilter-kernel-width The diameter of the Gaussian convolution kernel for prefilter modes 1 and 2. A value of 1.5 works well for ``LoG``, and 25 - 30 is suggested for ``subtracted mean``. --sample-rate Compute the quality image only at one out of this many rows and columns, for speed. The output image size does not change. To shrink it (say by 2x), run ``gdal_translate -r average -outsize 50% 50% in.tif out.tif``. --round-to-int 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. --threads Set the number of threads to use. By default use the number of threads as given in .vwrc, which can be 8 or 16. (The actual number will be printed when this program starts.) --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/correlator.rst ================================================ .. _correlator-mode: Image correlator ---------------- The ``parallel_stereo`` program (:numref:`parallel_stereo`) can function purely as an image correlator, that is, it can find the disparity between two given images without assuming any cameras are present and without generating a point cloud. This mode assumes that the images are already roughly aligned, up to a translation. Hence, the images can be either raw but with no large rotation/shear/scale differences, or mapprojected, or to be portions of aligned images ``L.tif`` and ``R.tif`` (:numref:`outputfiles`) as created by ASP itself. The produced disparity map can be used for image alignment (:numref:`image_align`) and terrain alignment (:numref:`pc_corr`). See also ``corr_eval`` (:numref:`corr_eval`) a program for estimating the quality of the disparity at each pixel. Example:: parallel_stereo \ --correlator-mode \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ left.tif right.tif \ run_corr/run This will create the filtered subpixel disparity ``run_corr/run-F.tif`` (:numref:`outputfiles`). This disparity can be preprocessed and inspected (:numref:`mask_disparity`). ASP supports many stereo correlation algorithms (:numref:`stereo_alg_overview`). It may be worth comparing the result of the ``asp_mgm`` algorithm with what is produced from regular block matching (``asp_bm``), especially if the images are noisy or differ in illumination. If the expected search range is known, it can be specified with the option ``--corr-search`` (:numref:`corr_section`). Low resolution disparity computation can be skipped with ``--corr-seed-mode 0``. These can be helpful if interest point matching or low-res disparity are problematic. If the options ``--num-matches-from-disparity`` or ``--num-matches-from-disp-triplets`` are specified, dense matches from disparity will be produced (:numref:`stereodefault`). These can be used in bundle adjustment (:numref:`dense_ip`). All the usual options of ``parallel_stereo`` apply. See :numref:`nextsteps` for a discussion regarding various quality vs speed tradeoffs. Since the images are assumed to be aligned, the program will set the alignment method to ``none``. To skip preprocessing (if invoked previously), or to avoid subpixel refinement or filtering, use the options ``--entry-point`` and ``--stop-point``. ================================================ FILE: docs/tools/dem2gcp.rst ================================================ .. _dem2gcp: dem2gcp ------- This program generates GCP (:numref:`bagcp`) based on densely measuring the misregistration and/or warping between two DEMs, which helps correct these effects. The cause is usually inaccuracies in camera extrinsics or intrinsics, including lens distortion. The approach is as follows. The dense disparity from an ASP-produced misregistered or warped DEM to a correct reference DEM is found. This program will take as input that disparity and interest point matches between the raw images, and will produce GCP with correct ground positions based on the reference DEM. Bundle adjustment with intrinsics optimization (:numref:`intrinsics_ground_truth`) or the jitter solver (:numref:`jitter_solve`) can then be invoked with the GCP to correct the issues. This program was motivated by the processing of historical images (:numref:`kh4`), particularly the KH-7 and KH-9 panoramic images. ASP DEM creation ~~~~~~~~~~~~~~~~ Prepare the images and camera models, such as in :numref:`kh9` or :numref:`kh7`. This workflow expects the cameras to already incorporate any prior alignment or adjustments. Bundle adjustment (:numref:`bundle_adjust`) can apply such transforms for Pinhole (:numref:`pinholemodels`), CSM (:numref:`csm`), and OpticalBar (:numref:`panoramic`) cameras. Mapproject (:numref:`mapproject`) the images at the same appropriate resolution (close to native image GSD) onto the reference DEM. Use a local projection for mapprojection, such as UTM or stereographic. Run stereo with the mapprojected images (:numref:`mapproj-example`). Use the ``asp_mgm`` algorithm with ``--subpixel-mode 9`` (:numref:`stereo_alg_overview`). This will ensure the best quality. If more than two images, pairwise stereo can be run and the DEMs can be mosaicked with ``dem_mosaic`` (:numref:`dem_mosaic`). Overlay the mapprojected images, produced DEM, and reference DEM in ``stereo_gui`` (:numref:`stereo_gui`). These should be roughly in the same place, but with some misregistration or warping. Ensure ``parallel_stereo`` was invoked to generate dense matches from disparity (:numref:`dense_ip`). It is suggested to use ``--num-matches-from-disparity 100000`` or so. That is a very large number of interest points, but will help produce sufficient GCP later on. The number of matches can be reduced later for bundle adjustment with the option ``--max-pairwise-matches``, and fewer GCP can be created with ``dem2gcp`` as described below. The dense match files should follow the *naming convention* for the original raw images (:numref:`ba_match_files`). Sufficiently numerous sparse matches, as produced by bundle adjustment, will likely work as well. Comparison with the reference DEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: ../images/kh7_dem_vs_ref.png :name: kh7_dm_vs_ref A low-resolution KH-7 DEM produced by ASP (left) and a reference DEM (right). These must be visually similar and with enough features for ``dem2gcp`` to work. The DEMs can be overlaid to see if there is significant local warping. Some hole-filling and blur can be applied to the ASP DEM with ``dem_mosaic`` (:numref:`dem_mosaic_blur` and :numref:`dem_mosaic_extrapolate`). For example:: gdal_translate -r average -outsize 50% 50% dem.tif dem_small.tif can reduce the resolution. This likely will do a better job than ``gdalwarp``, which uses interpolation. The two DEMs must be re-gridded to the same local projection and grid size. Example (adjust the projection center):: 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' gdalwarp -tr 20 20 -t_srs "$proj" -r cubicspline dem_in.tif dem_out.tif It is not required that the produced DEMs have precisely the same extent, but this is strongly advised. This helps with visualizing the disparity between the DEMs (see below) and allows for manual control of disparity via ``--corr-search`` (:numref:`search_range`). The ``gdalwarp`` ``-te`` option can produce datasets with a given extent. The DEMs should be hillshaded. It is suggested to use the GDAL (:numref:`gdal_tools`) hillshading method, as it is more accurate than ASP's own ``hillshade`` (:numref:`hillshade`). Here's an example invocation, to be applied to each DEM:: gdaldem hillshade \ -multidirectional \ -compute_edges \ input_dem.tif \ output_dem_hill.tif Inspect the hillshaded images in ``stereo_gui``. They should be similar enough in appearance and with a good range of values. Consider adjusting the lighting azimuth and elevation in the hillshade program to get good contrast. See the options ``-az`` and ``-alt`` in ``gdaldem hillshade``, and ``-a`` and ``-e`` in ASP's ``hillshade``. Find the dense disparity from the warped hillshaded DEM to the reference hillshaded DEM with ASP's correlator mode (:numref:`correlator-mode`):: parallel_stereo \ --correlator-mode \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --ip-per-tile 500 \ warped_hill.tif \ ref_hill.tif \ warp/run The order of hillshaded images here is very important. Increase ``--ip-per-tile`` if not enough matches are found. One could consider experimenting with ASP's various stereo algorithms (:numref:`stereo_alg_overview`). Inspect the bands of the produced disparity image ``warp/run-F.tif``. This requires extracting the horizontal and vertical disparities, and masking the invalid values, as in :numref:`mask_disparity`. These can be visualized, for example, as follows:: stereo_gui --colorbar \ --min -100 --max 100 \ warp/run-F_b1_nodata.tif \ warp/run-F_b2_nodata.tif Running ``dem2gcp`` ~~~~~~~~~~~~~~~~~~~ This command must be invoked with the warped ASP DEM and the reference DEM whose hillshaded versions were used to produce the disparity. Do not use here DEMs before cropping/regridding/blur applications, as those are not consistent with the disparity. :: dem2gcp \ --warped-dem asp_dem.tif \ --ref-dem ref_dem.tif \ --warped-to-ref-disparity warp/run-F.tif \ --left-image left.tif \ --right-image right.tif \ --left-camera left.tsai \ --right-camera right.tsai \ --match-file dense_matches/run-left__right.match \ --max-pairwise-matches 50000 \ --max-num-gcp 20000 \ --gcp-sigma 1.0 \ --output-gcp out.gcp Here we passed in the left and right raw images, the latest left and right camera models that produced the warped DEM, and the dense matches between the raw images. If there are more than two images, the "warped" DEM can be produced, for example, by merging with ``dem_mosaic`` (:numref:`dem_mosaic`) individual pairwise stereo DEMs (as long as these are consistent). Then, this program can be called for the full image set as in :numref:`dem2gcp_multi_image`. Alternatively, this tool can be invoked pairwise for individual stereo DEMs, creating many GCP files. The match file need not have dense matches. It is only assumed that there are many and well-distributed. Dense matches are produced from the disparity, so they are usually clean. Otherwise, one should consider clean match files loaded with the option ``--clean-match-files-prefix``, as bundle adjustment is sensitive to inaccurate GCP. All produced GCP files should be passed together with all images and cameras to ``bundle_adjust``, as shown below. Consider using the option ``--max-disp`` if the disparity has portions that are not accurate, such as when the ASP DEM and reference DEM were acquired at different times and too much changed on the ground. Note the options ``--max-num-gcp`` and ``--max-pairwise-matches`` above. These are off by default. .. figure:: ../images/dem2gcp_ip_vs_gcp.png :name: dem2gcp_ip_vs_gcp Interest point matches (left, in red) and produced GCP (right), on top of the raw images. Flat areas do not have GCP. Plotted with ``stereo_gui`` (:numref:`stereo_gui`). Plotted in :numref:`dem2gcp_ip_vs_gcp` are the interest point matches and the resulting GCP. Their number is likely excessive here, though the bigger concern is if they are lacking over featureless terrain. Solving for extrinsics and intrinsics ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We employ the recipe from :numref:`heights_from_dem`, that mostly addresses the vertical component of disagreement between the ASP-produced and reference DEMs. The added GCP mostly address the horizontal component. The most recent bundle-adjusted and aligned cameras can be converted to use the RPC lens distortion model (:numref:`rpc_distortion`) as in :numref:`convert_pinhole_model`. Or, the cameras can be used as is. If solving for intrinsics and using RPC lens distortion, the small RPC coefficients *must be changed manually to be at least 1e-7* in older builds, otherwise they will not get optimized. Here, RPC of degree 3 is used. A higher degree can be employed, either initially, or for subsequent iterations. In the latest builds this is done automatically by ``bundle_adjust`` (option ``--min-distortion``). The command when it is desired to refine the intrinsics as well:: bundle_adjust \ left_image.tif right_image.tif \ left_rpc_camera.tsai right_rpc_camera.tsai \ --inline-adjustments \ --solve-intrinsics \ --intrinsics-to-float all \ --intrinsics-to-share none \ --num-iterations 100 \ --match-files-prefix dense_matches/run \ --max-pairwise-matches 10000 \ --remove-outliers-params '75.0 3.0 100 100' \ --heights-from-dem ref_dem.tif \ --heights-from-dem-uncertainty 250 \ out.gcp \ -o ba_rpc_gcp_ht/run Clean matches are preferable when they do not come from the disparity. Use ``--clean-match-files-prefix`` instead of ``--match-files-prefix`` in that case. Care must be taken to ensure that GCP are not overwhelmed by other constraints. See :numref:`gcp_vs_tri` for a discussion. This invocation can be sensitive to inaccurate GCP, as those do not use a robust cost function. That is why GCP should be produced with clean match files (:numref:`ba_match_files`), and the outlier filtering threshold used to create those clean matches (``--remove-outliers-params``, :numref:`ba_options`) should be no more than 5 to 10 pixels. Consider also using the ``bundle_adjust`` option ``--max-gcp-reproj-err`` (:numref:`ba_options`) to remove worst GCP outliers. The option ``--max-disp`` for ``dem2gcp`` can help with this as well. For linescan cameras, the jitter solver can be invoked instead with a very similar command to the above (:numref:`jitter_solve`). Examine the pixel residuals before and after bundle adjustment (:numref:`ba_err_per_point`) in ``stereo_gui`` as:: stereo_gui --colorbar --min 0 --max 10 \ ba_rpc_gcp_ht/run-initial_residuals_pointmap.csv \ ba_rpc_gcp_ht/run-final_residuals_pointmap.csv It should be rather obvious to see which residuals are from the GCP. These are also flagged in those csv files. .. figure:: ../images/kh7_orig_vs_opt.png :name: kh7_orig_vs_opt Difference between the ASP DEM and reference DEM. The vertical range is -1000 m to 1000 m. From left-to-right: (a) no distortion modeling (b) modeling distortion with RPC of degree 3 and optimizing with ``--heights-from-dem`` (c) additionally, use the GCP produced by ``dem2gcp``. The differences are found with ``geodiff`` (:numref:`geodiff`) and plotted with ``stereo_gui``. .. figure:: ../images/kh7_dem.png :name: kh7_fig2 The unwarped ASP DEM that results in the right-most difference in the above figure (within the green polygon), on top of the reference DEM. Then, one can rerun stereo with the optimized cameras and the original images (again with the option ``--prev-run-prefix``, or by doing a new run from scratch). The results are in :numref:`kh7_orig_vs_opt`. The warping is much reduced but not eliminated. We further improved the results for KH-7 and KH-9 cameras by creating linescan cameras (:numref:`opticalbar2csm`) and running ``jitter_solve`` with GCP (:numref:`jitter_solve`). .. _gcp_vs_tri: Balancing GCP against other constraints ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When using GCP from ``dem2gcp`` in ``bundle_adjust`` or ``jitter_solve``, triangulated points that lack GCP are still constrained by ``--heights-from-dem`` or ``--tri-weight`` (:numref:`ba_options`). Both of these anchor such points to their initial (potentially incorrect) positions. If these points greatly outnumber the GCP, or have smaller uncertainties than GCP, they can dominate the solution and prevent the GCP from correcting the cameras. To avoid this: - Use a smaller value of ``--max-pairwise-matches`` and check how many triangulated points without GCP have been loaded, vs GCP. - Increase ``--heights-from-dem-uncertainty`` so the DEM constraint is weaker. - Use a small value of ``--gcp-sigma``. It is however suggested not to have this under one GSD. - Be aware that ``--tri-weight`` has the same anchoring effect as ``--heights-from-dem`` and should be used with the same caution. Though this constraint is usually weak and should not be an issue if triangulated points without GCP are not more than ones with GCP. .. _dem2gcp_multi_image: Multiple images and cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~ This program can work with multiple images, cameras, and match files, as long as the "warped" DEM is consistent with these datasets. In particular, this DEM can even be produced with Shape-from-Shading (:numref:`sfs`). The match files can be specified via ``--match-files-prefix`` or ``--clean-match-files-prefix``, in the manner of ``bundle_adjust`` (:numref:`ba_match_files`). :: dem2gcp \ --warped-dem asp_dem.tif \ --ref-dem ref_dem.tif \ --warped-to-ref-disparity warp/run-F.tif \ --image-list image_list.txt \ --camera-list camera_list.txt \ --clean-match-files-prefix matches/run \ --max-pairwise-matches 50000 \ --max-num-gcp 100000 \ --gcp-sigma 1.0 \ --output-gcp out.gcp Here, the entries in the camera list are usually after bundle adjustment, and the ``matches/run`` prefix points to the interest point matches, such as produced by ``bundle_adjust``, or with dense matching (:numref:`dense_ip`). As before, care should be taken that the matches are clean. See :numref:`gcp_vs_tri` for how to ensure GCP are not overwhelmed by other constraints. The value of ``--gcp-sigma`` should be on the order of the ground sample distance (in meters), to ensure that GCP provide strong constraints in bundle adjustment. The value in ``--max-pairwise-matches`` can be reduced if there is a large number of pairs of images. The produced GCP file can then be passed to ``bundle_adjust`` or ``jitter_solve`` with the same lists of images, cameras, and match files. Command-line options ~~~~~~~~~~~~~~~~~~~~ --warped-dem The DEM file produced by stereo, that may have warping due to unmodeled distortion. --ref-dem The reference DEM file, which is assumed to be accurate. --warped-to-ref-disparity The stereo disparity from the warped DEM to the reference DEM (use the first band of the hillshaded DEMs as the inputs for the disparity). --left-image The left raw image that produced the warped DEM. --right-image The right raw image that produced the warped DEM. --left-camera The left camera that was used for stereo. --right-camera The right camera that was used for stereo. --match-file The match file between the left and right raw images. --image-list 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``. --camera-list A file containing the list of cameras, when they are too many to specify on the command line. If the images have embedded camera information, such as for ISIS, this file may be omitted, or specify the image names instead of camera names. --match-files-prefix Use the match files with this prefix. --clean-match-files-prefix Use as input ``*-clean.match`` files with this prefix. --max-pairwise-matches If positive, reduce the number of matches to load from any given match file to at most this value. --gcp-sigma The sigma to use for the GCP points. A smaller value will give to GCP more weight. This should be a fraction of the image ground sample distance. Measured in meters. See also ``--gcp-sigma-image``. --output-gcp The produced GCP file with ground coordinates from the reference DEM. --max-num-gcp The maximum number of GCP to write. If negative, all GCP are written. If more than this number, a random subset will be picked. The same subset will be selected if this program is called again. --max-disp If positive, flag a disparity whose norm is larger than this as erroneous and do not use it for creating GCP. Measured in pixels. See also option ``--max-gcp-reproj-err`` in ``bundle_adjust`` (:numref:`ba_options`). --gcp-sigma-image Given a georeferenced image with float values, for each GCP find its location in this image and closest pixel value. Let the GCP sigma be that value. Skip GCP that result in values that are no-data or are not positive. This overrides ``--gcp-sigma``. --search-len How many DEM pixels to search around to find a valid DEM disparity (pick the closest). This may help with a spotty disparity but should not be overused. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/dem_geoid.rst ================================================ .. _dem_geoid: dem_geoid --------- This program takes as input a DEM whose height values are relative to the datum ellipsoid, and adjusts those values to be relative to the equipotential surface of the planet (geoid on Earth, areoid on Mars, etc.). This entails subtracting from a DEM height relative to an ellipsoid a correction value. The program corrects, if need be, for differences between the DEM and geoid correction datum ellipsoids. Bicubic interpolation is used. This program can also perform the reverse adjustment. Supported geoids ~~~~~~~~~~~~~~~~~ Three geoids and one areoid are supported (also custom geoids). The Earth geoids are EGM96 and EGM2008, relative to the WGS84 datum ellipsoid (see the `NGA Office of Geomatics `_), and `NAVD88 `_, which is relative to the NAD83 ellipsoid. The Mars areoid is `MOLA MEGDR `_. When importing it into ASP, we adjusted the areoid height values to be relative to the IAU reference spheroid for Mars of radius 3,396,190 m. The areoid at that source was relative to the Mars radius of 3,396,000 m. Yet ``dem_geoid`` can adjust correctly Mars DEMs created in respect to either spheroid. .. _custom_geoid: Custom geoids ~~~~~~~~~~~~~ The ``dem_geoid`` program can work with a provided geoid correction GeoTiff file, with the option ``--geoid-path`` (:numref:`dem_geoid_cmd_opts`). As an example, `this Moon geoid correction `_ has been adapted from :cite:`goossens2020high` to work with this program. The ``dem_geoid`` program employs bicubic interpolation into the geoid correction file. The ``gdalwarp`` program (:numref:`gdal_tools`) can resample any such file to a fine-enough resolution and with the desired interpolation method before passing it to this program. Examples ~~~~~~~~ Go from a DEM in respect to the WGS84 datum to one in respect to the EGM2008 geoid:: dem_geoid input-DEM.tif --geoid egm2008 The corrected DEM will be saved with the suffix ``-adj.tif``. .. _dem_geoid_cmd_opts: Command-line options for dem_geoid ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --nodata-value The value of no-data pixels, unless specified in the DEM. --geoid Specify the geoid to use for the given datum. For WGS84 use ``EGM96`` or ``EGM2008``. For Mars use ``MOLA`` or leave blank. For NAD83 use ``NAVD88`` or leave blank. When not specified it will be auto-detected. See also ``--geoid-path``. --geoid-path Specify the path to a custom GeoTiff file having the geoid correction, in units of meter. Values from this file will be subtracted from the DEM values in order to convert from ellipsoid to geoid heights. See :numref:`custom_geoid`. -o, --output-prefix Specify the output file prefix. --double Output using double precision (64 bit) instead of float (32 bit). --reverse-adjustment Go from DEM relative to the geoid/areoid to DEM relative to the datum ellipsoid. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/dem_mosaic.rst ================================================ .. _dem_mosaic: dem_mosaic ---------- The program ``dem_mosaic`` takes as input a list of DEM files and creates a mosaic. By default, it seamlessly blends the DEMs where they overlap. It can also combine the inputs in other ways. See many examples in :numref:`dem_mosaic_examples`. Overview ~~~~~~~~ The output mosaic is written as non-overlapping tiles with desired tile size, with the size set either in pixels or in georeferenced (projected) units. The default tile size is large enough that normally the entire mosaic is saved as one tile, named as:: output_prefix-tile-0.tif Alternatively, one can pass to the ``-o`` option an output file, such as ``output.tif``. Then the mosaic will be written with this exact name. (This will fail if the tool decides there is a need for more than one tile.) Individual tiles can be saved via the ``--tile-index`` option (the tool displays the total number of tiles when it is being run). As such, separate processes can be invoked for individual tiles for increased robustness and perhaps speed. By the default, the output mosaicked DEM will use the same grid size and projection as the first input DEM. These can be changed via the ``--tr`` and ``--t_srs`` options. Also note the ``--gdal-tap`` and ``--tap`` options. The default behavior is to blend the DEMs everywhere. If the option ``--priority-blending-length integer`` is invoked, the blending behavior will be different. At any location, the pixel value of the DEM earliest in the list present at this location will be kept, unless closer to the boundary of that DEM than this blending length (measured in input DEM pixels), only in the latter case blending will happen. This mode is useful when blending several high-resolution "foreground" DEMs covering small regions with larger "background" DEMs covering a larger extent. Then, the pixels from the high-resolution DEMs are more desirable, yet at their boundary these DEMs should blend into the background. To obtain smoother blending when the input DEMs are quite different at the boundary, one can increase ``--weights-blur-sigma`` and ``--weights-exponent``. The latter will result in weights growing slower at each DEM boundary faster inwards. Some experimentation may be necessary, helped for example by examining the weights used in blending; they can be written out with ``--save-dem-weight integer``. Instead of blending, ``dem_mosaic`` can compute the image of first, last, minimum, maximum, mean, standard deviation, median, and count of all encountered valid DEM heights at output grid points. For the "first" and "last" operations, the order in which DEMs were passed in is used. With any of these options, the tile names will be adjusted accordingly. It is important to note that with these options blending will not happen, since it is explicitly requested that particular values of the input DEMs be used. If the number of input DEMs is very large, the tool can fail as the operating system may refuse to load all DEMs. In that case, it is suggested to use the parameter ``--tile-size`` to break up the output DEM into several large tiles, and to invoke the tool for each of the output tiles with the option ``--tile-index``. Later, ``dem_mosaic`` can be invoked again to merge these tiles into a single DEM. If the DEMs have reasonably regular boundaries and no holes, smoother blending may be obtained by using ``--use-centerline-weights``. This tool can also apply hole-filling, smoothing, and pixel erosion at boundary. .. _dem_mosaic_examples: Examples ~~~~~~~~ Blend DEMs ^^^^^^^^^^ This creates a seamless DEM:: dem_mosaic dem1.tif dem2.tif -o blended.tif Priority blending ^^^^^^^^^^^^^^^^^ Read the DEMs from a list, and apply priority blending. The first DEM in the list is given priority, with the others used as a background with this transition length. :: echo dem1.tif dem2.tif > image_list.txt dem_mosaic -l image_list.txt --priority-blending-length 14 \ -o priority_blended Since an extension for the output was not specified, it will be saved as ``priority_blended/tile-0.tif`` (there may be more than one tile if the ``--tile-size`` parameter is set). Mean height DEM ^^^^^^^^^^^^^^^ :: dem_mosaic -l image_list.txt --mean -o mosaic This uses no blending. Also supported are the options ``--first``, ``--last``, ``--min``, ``--max``, ``--stddev``, ``--median``, ``--nmad``, and ``--count``. .. _dem_mosaic_external_weights: External weights ^^^^^^^^^^^^^^^^ The default behavior of ``dem_mosaic`` is to blend the DEMs using a weighted average with internal weights that decrease to zero towards the boundary of the DEM and plateau inwards, away from the boundary (see ``--extra-crop-length`` and ``--weights-exponent``). If, for example, the DEMs are known to have different vertical uncertainties (:numref:`error_propagation`), these gridded uncertainties (:numref:`export_stddev`) can be used as external weights. These weights can be inverted (to ensure that a larger weight is given to a smaller vertical uncertainty), then multiplied by the internal weights before blending. A larger stereo convergence angle (:numref:`stereo_pairs`) results in less vertical uncertainty. Example:: ls stereo_runs/*/run-DEM.tif > stereo_runs/dem_list.txt ls stereo_runs/*/run-VerticalStdDev.tif > stereo_runs/vert_list.txt dem_mosaic \ --dem-list stereo_runs/dem_list.txt \ --weight-list stereo_runs/vert_list.txt \ --invert-weights \ -o stereo_runs/weighted_mosaic.tif In addition to the option ``--invert-weights``, the option ``--min-weight`` can help ensure that the weights are not too small (before being inverted). The weights must be in one-to-one correspondence with the DEMs to be mosaicked. Any weight value that equals the no-data value will be ignored. Another candidate for the weight could be the triangulation error (:numref:`point2dem_ortho_err`). The ``--min-weight`` option is strongly encouraged in this case, as an extremely small triangulation error many not suggest high reliability alone. The ``image_calc`` program (:numref:`image_calc`) can help devise schemas for how various uncertainty measures could be combined into a single weight image. Regridding ^^^^^^^^^^ Enforce that the output pixel centers are at integer multiples of grid size:: dem_mosaic --tr 0.10 --tap input.tif -o output.tif If the bounds of the output DEM from above are examined with ``gdalinfo`` (:numref:`gdal_tools`), they will be multiples of 0.05, because each grid point is centered at an integer multiple of 0.10, and extends for half a grid vertically and horizontally. (Note that ``point2dem`` (:numref:`point2dem`) and ``mapproject`` (:numref:`mapproject`) create their outputs by default that way, and if ``dem_mosaic`` is invoked on such datasets, it will respect the input grid even without ``--tap`` being explicitly set.) See :numref:`gdal_tap` for when it is desired to emulate the GDAL ``-tap`` option. .. _dem_mosaic_blur: Apply a blur ^^^^^^^^^^^^ :: dem_mosaic --dem-blur-sigma 1 input.tif -o output.tif This option will also extend the DEM somewhat and fill some holes, especially with a larger sigma. Erosion ^^^^^^^ Erode 3 pixels at the boundary:: dem_mosaic --erode-length 3 input.tif -o output.tif .. _dem_mosaic_fill: Fill small holes ^^^^^^^^^^^^^^^^ :: dem_mosaic --hole-fill-length 50 input.tif -o output.tif .. _dem_mosaic_extrapolate: Extrapolating a DEM ^^^^^^^^^^^^^^^^^^^ To extrapolate a DEM based on a weighted average of neighbors, run:: dem_mosaic \ --fill-search-radius 25 \ --fill-power 8 \ --fill-percent 10 \ --fill-num-passes 3 \ input.tif -o filled.tif This command will become very slow for large ``--fill-search-radius``. It is suggested to increase ``--fill-num-passes`` instead. This method will also grow the DEM outwards, not just within a hole, unlike the hole-filling example in :numref:`dem_mosaic_fill`. It is suggested to blur a little the obtained DEM, such as:: dem_mosaic --dem-blur-sigma 2 filled.tif -o blurred.tif To preserve as much as possible the input DEM values in the resulting DEM, except a small transition area at the boundary, run:: dem_mosaic --priority-blending-length 20 \ input.tif blurred.tif -o output.tif The extrapolation works as follows. For any pixel that is invalid (lacks data), ``dem_mosaic`` will search for valid pixels within the specified search radius. If the percentage of valid to total number of found pixels is no less than the specified value, the invalid pixel will be filled with the weighted average of the valid pixel values, with the weight given as: .. math:: \frac{1}{d^p + 1} where :math:`d` is the distance from the invalid to the valid pixel to borrow the value from, and :math:`p` is given by ``--fill-power``. This process will be repeated the specified number of times, with the valid portion of the DEM growing each time. .. _gdal_tap: Target aligned pixels ^^^^^^^^^^^^^^^^^^^^^ A command such as:: dem_mosaic --gdal-tap \ --tr 1 \ --t_projwin 641401 4120288 652701 4133728 \ input.tif -o output.tif should produce a DEM with the bounds and grid size specified above, with bilinear interpolation. This is analogous to ``gdalwarp`` (:numref:`gdal_tools`) with the options ``-tap -tr 1 1 -r bilinear -te``. Here, a projection in units of meter is assumed. Processing ~~~~~~~~~~ The tool reads input DEMs as single precision (float32), performs all processing in double precision (float64) for numerical accuracy, and writes output mosaics as single precision (float32) by default. The output type can be changed via the ``--ot`` option to Byte, UInt16, Int16, UInt32, Int32, or Float32. Usage ~~~~~ :: dem_mosaic [options] -o output_prefix or:: dem_mosaic [options] -l dem_files_list.txt -o output_prefix Command-line options ~~~~~~~~~~~~~~~~~~~~ -l, --dem-list A text file listing the DEM files to mosaic, one per line. -o, --output-prefix Specify the output prefix. One or more tiles will be written with this prefix. Alternatively, an exact output file can be specified, with a .tif extension. --tile-size The maximum size of output DEM tile files to write, in pixels. --tile-index The index of the tile to save (starting from zero). When this program is invoked, it will print out how many tiles are there. Default: save all tiles. --tile-list List of tile indices (in quotes) to save. A tile index starts from 0. --priority-blending-length If positive, keep unmodified values from the earliest available DEM except a band this wide measured in pixels inward of its boundary where blending with subsequent DEMs will happen. --tr Output grid size, that is, the DEM resolution in target georeferenced units per pixel. Default: use the same resolution as the first DEM to be mosaicked. --t_srs Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). If not provided, use the one from the first DEM to be mosaicked. --t_projwin Limit the mosaic to this region, with the corners given in georeferenced coordinates (xmin ymin xmax ymax). Max is exclusive. See the ``--gdal-tap`` and ``--tap`` options if desired to apply addition adjustments to this extent. --first Keep the first encountered DEM value (in the input order). --last Keep the last encountered DEM value (in the input order). --min Keep the smallest encountered DEM value. --max Keep the largest encountered DEM value. --mean Find the mean DEM value. --stddev Find the standard deviation of DEM values. --median Find the median DEM value (this can be memory-intensive, fewer threads are suggested). --nmad Find the normalized median absolute deviation DEM value (this can be memory-intensive, fewer threads are suggested). --count Each pixel is set to the number of valid DEM heights at that pixel. --hole-fill-length Maximum dimensions of a hole in the DEM to fill, in pixels. See also ``--fill-search-radius``. --fill-search-radius Fill an invalid pixel with a weighted average of pixel values within this radius in pixels. The weight is :math:`1/(d^p + 1)`, where the distance is measured in pixels. See an example in :numref:`dem_mosaic_examples`. See also ``--fill-power``, ``--fill-percent`` and ``--fill-num-passes``. --fill-power Power exponent to use when filling nodata values with ``--fill-search-radius``. --fill-percent Fill an invalid pixel using weighted values of neighbors only if the percentage of valid pixels within the radius given by ``--fill-search-radius`` is at least this. --fill-num-passes Fill invalid values using ``--fill-search-radius`` this many times. --erode-length Erode the DEM by this many pixels at boundary. --weight-list A text file having a list of external weight files to use in blending, one per line. These are multiplied by the internal weights to ensure seamless blending. The weights must be in one-to-one correspondence with the DEMs to be mosaicked. See :numref:`dem_mosaic_external_weights`. --invert-weights Use 1/weight instead of weight in blending, with ``--weight-list``. --min-weight Limit from below with this value the weights provided with ``--weight-list``. --georef-tile-size Set the tile size in georeferenced (projected) units (e.g., degrees or meters). --output-nodata-value No-data value to use on output. Default: use the one from the first DEM to be mosaicked. --ot 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. --weights-blur-sigma The standard deviation of the Gaussian used to blur the weights. Higher value results in smoother weights and blending. Set to 0 to not use blurring. --weights-exponent The weights used to blend the DEMs should increase away from the boundary as a power with this exponent. Higher values will result in smoother but faster-growing weights. --use-centerline-weights Compute weights based on a DEM centerline algorithm. Produces smoother weights if the input DEMs don't have holes or complicated boundary. --dem-blur-sigma Blur the DEM using a Gaussian with this value of sigma. A larger value will blur more. Default: No blur. --extra-crop-length Crop the DEMs this far from the current tile (measured in pixels) before blending them (a small value may result in artifacts). This value also helps determine how to plateau the blending weights inwards, away from the DEM boundary. --nodata-threshold Values no larger than this number will be interpreted as no-data. --force-projwin Make the output mosaic fill precisely the specified projwin, by padding it if necessary and aligning the output grid to the region. This is the default with ``--gdal-tap --projwin``. --gdal-tap Ensure that the bounds of output products (as printed by ``gdalinfo``, :numref:`gdal_tools`) are integer multiples of the grid size (as set with ``--tr``). When ``--t_projwin`` is set and its entries are integer multiples of the grid size, that precise extent will be produced on output. This functions as the GDAL ``-tap`` option. An example is in :numref:`gdal_tap`. --tap Let the output grid be at integer multiples of the grid size (like the default behavior of ``point2dem`` and ``mapproject``, and ``gdalwarp`` when invoked with ``-tap``, though the latter does not have the half-a-pixel extra extent this tool has). If this option is not set, the input grids determine the output grid. See also ``--gdal-tap``. --save-dem-weight Save the weight image that tracks how much the input DEM with given index contributed to the output mosaic at each pixel (smallest index is 0). --save-index-map For each output pixel, save the index of the input DEM it came from (applicable only for ``--first``, ``--last``, ``--min``, ``--max``, ``--median``, and ``--nmad``). A text file with the index assigned to each input DEM is saved as well. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --tif-tile-size The dimensions of each block in the output image. --cache-size-mb Set the system cache size, in MB. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/dg_mosaic.rst ================================================ .. _dg_mosaic: dg_mosaic --------- This tool can be used when processing Digital Globe images (:numref:`dg_tutorial`). Such an image product may be packaged as several sub-images and corresponding camera XML files. ``dg_mosaic`` will mosaic these sub-images into a single file, and create the appropriate combined camera XML file. The tool needs to be applied to the sub-images which form the left image, and then in the same way to obtain the right image. These can then be passed to ``parallel_stereo`` (:numref:`parallel_stereo`). Digital Globe camera files contain, in addition to the original camera models, their RPC approximations (:numref:`rpc`). ``dg_mosaic`` outputs both types of combined models. The combined RPC model can be used to mapproject the mosaicked images with the goal of computing stereo from them (:numref:`mapproj-example`). ``dg_mosaic`` can also reduce the image resolution while creating the mosaics (with the camera files modified accordingly). This may result in aliasing artifacts in produced terrain models, but can be useful for quick previews. Some older (2009 or earlier) Digital Globe images may exhibit seams upon mosaicking due to inconsistent image and camera information. The ``--fix-seams`` switch can be used to rectify this problem. Its effect should be minimal if such inconsistencies are not present. Digital Globe images can be used as they are as well, but in that case each left sub-image needs to be paired up with one more more right sub-images, create individual DEMs, and then mosaic those into a single output DEM. Hence this program simplifies the data processing. Only level 1B images are supported (see the `product info `_). Example:: dg_mosaic WV03_20160925183217*P1BS_R*C1-012844055010_01_P001.tif This will create ``012844055010_01_P001.r100.tif`` and ``012844055010_01_P001.r100.xml``, where ``r.100`` stands for the full 100% resolution. Care should be taken to not mosaic together PAN and multispectral images, which have ``P1BS`` and ``M1BS`` as part of their names. Command-line options for dg_mosaic: -h, --help Display the help message. --target-resolution Choose the output resolution in meters per pixel on the ground (note that a coarse resolution may result in aliasing). --reduce-percent Render a reduced resolution image and XML based on this percentage. This can result in aliasing artifacts. --skip-rpc-gen Skip RPC model generation. --skip-tif-gen Skip TIF file generation. --rpc-penalty-weight The weight to use to penalize higher order RPC coefficients when generating the combined RPC model. Higher penalty weight results in smaller such coefficients. --output-prefix The prefix for the output .tif and .xml files. --cache-size-mb Set the system cache size, in MB, for each process. --threads How many threads to use. --band integer Which band to use (for multi-spectral images). --input-nodata-value Nodata value to use on input; input pixel values less than or equal to this are considered invalid. --output-nodata-value Nodata value to use on output. --ot Output data type. If the output type is a kind of integer, values are rounded and then clamped to the limits of that type. --fix-seams Fix seams in the output mosaic due to inconsistencies between image and camera data using interest point matching. --ignore-inconsistencies Ignore the fact that some of the files to be mosaicked have inconsistent EPH/ATT values. Do this at your own risk. --preview Render a small 8 bit png of the input for preview. -n, --dry-run Make calculations, but just print out the commands. ================================================ FILE: docs/tools/disp2ip.rst ================================================ .. _disp2ip: disp2ip ------- This program has some rather specialized functionality. It is meant to solve the following problem. Consider a rover on a planetary body, with a stereo pair of cameras. To save on bandwidth, only the left raw image and filtered versions of both left and right images are transmitted to Earth. The filter is usually the sign of the Laplacian of Gaussian (sLoG), or the Laplacian of Gaussian (LoG). Filtered images are enough for stereo, but not for interest point matching between images acquired at different times (rather than simultaneously). This makes it problematic to find the relative poses of the cameras, which is needed for ``rig_calibrator`` (:numref:`rig_calibrator`) or bundle adjustment (:numref:`bundle_adjust`). The solution to find interest point matches only between the left raw images, then to use the disparities between the left and right filtered images to find versions of these interest points in the right images, producing a set of matches between all filtered images. This is the purpose of this program. Procedure ~~~~~~~~~ Stereo between filtered images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is assumed by this program that the stereo runs were created with ``affineepipolar`` alignment and that cameras may not be available. This program uses the disparities ``F.tif`` (:numref:`outputfiles`) as input. Hence, ``parallel_stereo`` (:numref:`parallel_stereo`) should be invoked, for stereo pair with index ``i``, along the lines of:: parallel_stereo \ --correlator-mode \ --prefilter-mode 0 \ --stereo-algorithm asp_bm \ --sgm-collar-size 0 \ --alignment-method affineepipolar \ fltr/left/left_filtered_${i}.png \ fltr/right/right_filtered_${i}.png \ stereo_${i}/run The option ``--prefilter-mode 0`` is very important, if the images are already filtered, otherwise a second filter would be applied on top. See :numref:`stereodefault` for more details. It may be hard to find features in LoG-filtered images so consider using very large values of ``--ip-per-tile`` and ``--matches-per-tile``, such as 50000 or more (this must be decreased for large images). SfM between the left raw images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Structure-from-Motion (SfM) finds the interest point matches between the left raw images and the relative poses of the cameras:: theia_sfm --rig-config rig_config.txt \ --theia-flags theia_flags.txt \ --images 'raw/left/left_raw*.png' \ --out-dir theia_left This will produce the NVM file named ``theia_left/cameras.nvm``. See :numref:`rig_calibrator_example` for more details. Running this program ^^^^^^^^^^^^^^^^^^^^ Several lists should be prepared, and these must be in one-to-one correspondence:: ls fltr/left/left_filtered*.png > left_filtered.txt ls fltr/right/right_filtered*.png > right_filtered.txt ls raw/left/left_raw*.png > left_raw.txt ls stereo_*/run-F.tif | perl -p -e 's/-F\.tif//' > stereo.txt Also ensure that the optical centers for all images are available in a file, as expected by the option ``--optical-center-list``. For example, this may work, with the right values:: # Left images for f in $(cat left_filtered.txt); do echo $f 1064 1025 done > optical_centers.txt # Append the right images for f in $(cat right_filtered.txt); do echo $f 1055 1032 done >> optical_centers.txt Then, run:: disp2ip \ --left-raw-image-list left_raw.txt \ --left-filtered-image-list left_filtered.txt \ --right-filtered-image-list right_filtered.txt \ --stereo-prefix-list stereo.txt \ --optical-center-list optical_centers.txt \ --input-nvm theia_left/cameras.nvm \ --output-nvm combined.nvm The interest points in the input NVM file are assumed to be shifted relative to the optical center of those images, with the file ``theia_left/camera_offsets.txt`` (given the earlier notation) having those optical centers. The program will shift the produced interest points relative to the optical centers as well, creating ``combined_offsets.txt``. .. _disp2ip_rig: Use of results ~~~~~~~~~~~~~~ The ``rig_calibrator`` program (:numref:`rig_calibrator`), when called with the produced interest point matches, must use the option ``--use_initial_rig_transforms``, and the rig configuration in ``--rig_config`` must have valid transforms between the sensors (field ``ref_to_sensor_transform``). That is because ``disp2ip`` is unable to produce the correct poses for the camera images it adds, and those are populated with a nominal value. The initial guess value of this transform is best determined with the ``rig_calibrator`` program itself, by running it with the left and right raw images, that here are not available. The following observed value worked well for a stereo rig:: ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 -0.14 0 0 This transform will be refined when ``rig_calibrator`` is run with the result produced by ``disp2ip``. The input and produced interest point matches can be inspected with ``stereo_gui`` (:numref:`stereo_gui_nvm`). .. _disp2ip_filter: The input filter ~~~~~~~~~~~~~~~~ This program will run equally well if the LoG filter is applied to them (:numref:`stereodefault`), the sign of LoG, or no filter at all. What is important is for the left and right filtered images to be consistent, so a reliable disparity map can be produced, and that the left raw images are available. Command-line options ~~~~~~~~~~~~~~~~~~~~ --left-raw-image-list File containing the list of raw left images, one per line. --left-filtered-image-list File containing the list of left images after applying the LoG (Laplacian of Gaussian) filter, or some other filter, one per line. --right-filtered-image-list File containing the list of right images after applying the LoG filter, or some other filter, one per line. --stereo-prefix-list File containing the list of stereo prefixes, one per line. Each prefix is for a stereo run with a left filtered and right filtered image, with affine epipolar alignment. Stereo could have been run with ``--correlator-mode``, so without cameras. --optical-center-list File containing the list of optical centers for all filtered images, in pixels. On each line must have the image name, optical center column, then row. The order of images is not important. --input-nvm Input NVM file, having interest point matches between the left raw images. --output-nvm Output NVM file, having interest point matches between all filtered images, produced with the help of disparity maps. ================================================ FILE: docs/tools/disparitydebug.rst ================================================ .. _disparitydebug: disparitydebug -------------- The ``disparitydebug`` program produces visualizable images from disparity maps created with ``parallel_stereo`` and ``stereo``. These are named ``D_sub.tif``, ``D.tif``, ``RD.tif``, and ``F.tif`` (see :numref:`outputfiles` for what each is). The disparity map files can be useful for debugging because they contain raw disparity values as measured by the correlator; however they cannot be directly visualized or opened in a conventional image browser. The ``disparitydebug`` tool converts a single disparity map file into two normalized TIFF image files (``*-H.tif`` and ``*-V.tif``, containing the horizontal and vertical, or line and sample, components of disparity, respectively) that can be viewed using any image display program, including with the ``stereo_gui`` tool shipped with ASP (:numref:`stereo_gui`). The ``disparitydebug`` program will also print out the range of disparity values in a disparity map, that can serve as useful summary statistics when tuning the search range settings in the ``stereo.default`` file (:numref:`search_range`). If the input images are map-projected (georeferenced), the outputs of ``disparitydebug`` will also be georeferenced. Examples ~~~~~~~~ :: disparitydebug run/run-D_sub.tif View the obtained horizontal and vertical disparities with:: stereo_gui run/run-D_sub-H.tif run/run-D_sub-V.tif Another example of using this tool (and a figure) is given in :numref:`diagnosing_problems`, when discussing how to examine a produced run. .. _raw_disp: Raw disparity extraction ~~~~~~~~~~~~~~~~~~~~~~~~ To extract the horizontal and vertical bands from a disparity without normalization, run a command such as:: disparitydebug --raw run/run-F.tif Invalid values are set to a no-data value (-1e+6) that is saved in the geoheader of the output files. This option is available in build 1/2026 and later. Command-line options ~~~~~~~~~~~~~~~~~~~~ -o, --output-prefix Specify the output file prefix. This is set automatically if not provided. --raw Save the raw disparity values without any normalization. Invalid pixels are set to no-data. --save-norm Save the norm of the disparity instead of its two bands. --save-norm-diff Save the maximum of norms of differences between a disparity and its four neighbors. --normalization <(integer integer integer integer) (default = auto)> Normalization range. Specify in the format: hmin vmin hmax vmax. --roi <(integer integer integer integer) (default = auto)> Region of interest. Specify in the format: xmin ymin xmax ymax. -t, --output-filetype Specify the output file type. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/gcp_gen.rst ================================================ .. _gcp_gen: gcp_gen ------- This program creates ground control points (GCP, :numref:`bagcp`) given a raw camera image, orthoimage, and DEM. The GCP can then be used to initialize or constrain a camera model for the camera image. This is a very quick and convenient way of creating cameras that avoids full Structure-from-Motion (:numref:`sfm`). The approach is to find interest point matches between the camera image (which does not have a georeference) and orthoimage (which does), infer the geolocation of those points from the orthoimage, and their elevation from the DEM. The context and next steps after using this program are discussed in :numref:`camera_solve_gcp`. See the related program named ``dem2gcp`` (:numref:`dem2gcp`). Examples ~~~~~~~~ :: gcp_gen \ --camera-image camera_image.tif \ --ortho-image ortho_image.tif \ --dem dem.tif \ --individual-normalize \ --gcp-sigma 1.0 \ --output-prefix run/run \ --output-gcp gcp.gcp If given several images, the program should be invoked individually for each image, thus creating several GCP files. For certain datasets, the SIFT interest point detection (method 1) and a smaller RANSAC threshold turned out to work better. Here's an alternative invocation, also with more interest points per tile, and individually normalizing the images:: gcp_gen \ --ip-detect-method 1 \ --inlier-threshold 50 \ --gcp-sigma 1.0 \ --ip-per-tile 1000 \ --ip-per-image 0 \ --camera-image camera_image.tif \ --ortho-image ortho_image.tif \ --dem dem.tif \ --output-prefix run/run \ --output-gcp gcp.gcp In some cases, ``--ip-detect-method 2`` (ORB) worked out better than SIFT. This program produces a match file at the output prefix location, which will be reused next time the program is run with the same inputs. A couple of detailed applications of this program for registration are shown in :numref:`change3` (Chang'e 3) and :numref:`junocam` (JunoCam). Advanced usage ~~~~~~~~~~~~~~ If the extent of the raw camera image is very different than the orthoimage, or if the camera image appears to be a mirror-flipped version of the orthoimage, this program can fail. In that case, it is recommended to mapproject (:numref:`mapproject`) the raw camera image onto a DEM, and pass in the mapprojected image as a helper to this tool, with the option:: --mapproj-image mapproj_image.tif If needed, both the mapprojected image and orthoimage can be cropped first to a shared area. If the camera image and orthoimage have very different ranges of pixel values, use the option ``--individual-normalize``. It is preferred that these images have similar lighting conditions and similar-enough resolutions. This invocation will look up the DEM and camera model from the mapprojected image's metadata, so these must be available. A match file for this program, between the mapprojected image and orthoimage, can be produced with dense stereo correlation (:numref:`correlator-mode`). If renamed to follow the naming convention (:numref:`ba_match_files`), it will be picked up by this program. Dense correlation may be more robust to lighting differences. This program supports plain-text match files (:numref:`txt_match`). If no luck, manual selection of interest points can be invoked (:numref:`creatinggcp`). Validation ~~~~~~~~~~ Run ``stereo_gui``:: stereo_gui camera_image.tif ortho_image.tif \ run/run-camera_image__ortho_image.match to inspect the produced match file (see also :numref:`stereo_gui_view_ip`). It should show correctly the correspondences. The GCP file can be inspected in ``stereo_gui`` as well (:numref:`stereo_gui_vwip_gcp`). The images and GCP files can be passed together to ``bundle_adjust`` to refine, transform, or initialize the camera models (:numref:`ba_use_gcp`). Then, ``mapproject`` (:numref:`mapproject`) can be invoked with the camera image, updated camera (or the original camera with the option ``--bundle-adjust-prefix``), and the DEM. The resulting orthoimage can be overlaid on top of the original orthoimage in ``stereo_gui`` (:numref:`stereo_gui`) to visually inspect the agreement. Alternatively, the residuals for each GCP can be inspected in the ``pointmap.csv`` files produced by ``bundle_adjust`` (:numref:`ba_err_per_point`). Command-line options ~~~~~~~~~~~~~~~~~~~~ --camera-image The camera image. --ortho-image The ortho image to geolocate the interest points in. --dem The DEM to infer the elevations from. --output-gcp, -o The output GCP file. --output-prefix Save the intermediate data, including match files, in this directory. This will cache any matches found, and those will be used to create the GCP file. The match file needs to be deleted if desired to recompute it. --gcp-sigma The sigma (uncertainty, in meters) to use for the GCPs (:numref:`bagcp`). A smaller sigma suggests a more accurate GCP. See also option ``--fix-gcp-xyz`` in ``bundle_adjust`` (:numref:`ba_options`). --ip-per-image How many interest points to detect in each image (the resulting number of matches will be much less). --ip-per-tile 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``. --matches-per-tile How many interest point matches to compute in each image tile (of size normally 1024^2 pixels). Use a value of ``--ip-per-tile`` a few times larger than this. See also ``--matches-per-tile-params``. --matches-per-tile-params To be used with ``--matches-per-tile``. The first value is the image tile size for both images. A larger second value allows each right tile to further expand to this size, resulting in the tiles overlapping. This may be needed if the homography alignment between these images is not great, as this transform is used to pair up left and right image tiles. --individually-normalize Individually normalize the input images instead of using common values. --matches-as-txt Read and write match files as plain text instead of binary. See :numref:`txt_match`. --num-ransac-iterations How many iterations to perform in RANSAC when finding interest point matches. --inlier-threshold The inlier threshold (in pixels) to separate inliers from outliers when computing interest point matches. A smaller threshold will result in fewer inliers. The default is auto-determined. --ip-detect-method Choose an interest point detection method from: 0 = OBAloG (:cite:`jakkula2010efficient`), 1 = SIFT (from OpenCV), 2 = ORB (from OpenCV). The SIFT method, unlike OBALoG, produces interest points that are accurate to subpixel level. Remove any existing ``.vwip`` files before recomputing interest points with a different method. See also :numref:`custom_ip`. --min-matches Set the minimum number of inlier matches between images for successful matching. --nodata-value Pixels with values less than or equal to this number are treated as no-data. This overrides the no-data values from input images. --match-file If set, use this match file instead of creating one. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/gdal.rst ================================================ .. _gdal_tools: GDAL tools ---------- ASP distributes in the ``bin`` directory the following `GDAL `_ programs: - gdal_rasterize (modify images based on shape files) - gdal_translate (crop, resample) - gdalbuildvrt (mosaic) - gdaldem (hillshade) - gdalinfo (show stats) - gdaltransform (transforms between coordinate systems) - gdalwarp (convert to another projection and interpolate) - gdaladdo (create multi-resolution pyramids) and a handful of other ones. These executables are compiled with JPEG2000 and BigTiff support, and can handle NTF images in addition to most image formats. They can be used to see image statistics, crop and scale images, build virtual mosaics, reproject DEMs, etc. If ASP was installed via conda, rather than using the release tarball (:numref:`installation`), make sure to activate that conda environment before using these tools or set the ``PROJ_LIB`` and/or ``PROJ_DATA`` environmental variable to points to the ``share/proj`` subdirectory of the ASP conda environment. Otherwise there will be warnings about failing to find such a directory. This is a known PROJ issue. Certain conversion between datums using the GDAL/PROJ tools may need additional data, which can be stored either locally or fetched via a network (see the `PROJ documentation `_). ================================================ FILE: docs/tools/geodiff.rst ================================================ .. _geodiff: geodiff ------- The ``geodiff`` program takes as input two DEMs, or a DEM and a CSV file, and subtracts the second from the first. The grid is from the first DEM, so the second one is interpolated into it using bilinear interpolation. When one file is a CSV, the grid from the DEM is used, regardless of the order of inputs. It is important to note that ``geodiff`` is very sensitive to the order of the two DEMs, due to the fact that the grid comes from the first one. Ideally the grid of the first DEM would be denser than the one of the second. Usage:: geodiff [options] [ -o output_prefix ] Examples ~~~~~~~~ Take the absolute difference of two DEMs:: geodiff --absolute dem1.tif dem2.tif -o run This will create ``run-diff.tif``. The ``stereo_gui`` program (:numref:`colorize`) can colorize on-the-fly and display the difference image. The ``colormap`` program (:numref:`colormap`) can write a colorized image. Take the difference of a DEM and a CSV file:: geodiff dem1.tif file.csv \ --csv-format '1:lon 2:lat 3:height_above_datum' \ -o run The produced ``run-diff.csv`` file can be visualized and colorized with ``stereo_gui`` (:numref:`plot_csv`), as:: stereo_gui --colorbar run-diff.csv This program can also overlay the difference on top of the DEM. See also ~~~~~~~~ The ``image_calc`` program (:numref:`image_calc`) can perform many operations on images, as long as they are the same size (use ``gdalwarp``, :numref:`gdal_tools`, to convert images to the same extent and georeference). Command-line options ~~~~~~~~~~~~~~~~~~~~ -o, --output-prefix Specify the output prefix. --absolute Output the absolute difference as opposed to just the difference. --csv-format 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`` (a Cartesian coordinate system with origin at planet center is assumed, with the units being in meters), ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees, the radius is measured in meters from planet center), ``3:lat 2:lon 1:height_above_datum``, ``1:easting 2:northing 3:height_above_datum`` (need to set ``--csv-srs``; the height above datum is in meters). Can also use radius_km for column_type, when it is again measured from planet center. --csv-srs The PROJ or WKT string to use to interpret the entries in input CSV files, if those files contain Easting and Northing fields. If not specified, it will be borrowed from the DEM. --nodata-value The no-data value to use, unless present in the DEM geoheaders. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --float Output using float (32 bit) instead of using doubles (64 bit). This is now the default, and this option is obsolete. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/hiedr2mosaic.rst ================================================ .. _hiedr2mosaic: hiedr2mosaic.py --------------- Assemble a collection of HiRISE EDR files into a single image. This runs the sequence of ISIS preprocessing commands, followed by hijitreg, to assemble the input images into a single output image. You can either download the input files yourself and pass them all in or specify a download folder and pass in only a URL such as http://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_029400_029499/ESP_029421_2300/. If you use a URL, the program will attempt to download all of the HiRISE images found at that location and then run the processing script. See the "Mars Reconnaissance Orbiter HiRISE" section in the examples chapter for a more detailed explanation. Usage:: hiedr2mosaic.py [options] Command-line options for hiedr2mosaic.py: --manual Display the help message. -w, --web Invokes spiceinit with web=true, to fetch the kernels from the web. -m, --match The CCD number passed as the match argument to noproj (default 5). --stop-at-no-proj Stops processing after the noproj steps are complete. --resume-at-no-proj Restarts processing using the results from ``--stop-at-no-proj``. --download-folder Download input files to this folder. Must pass in a URL instead of files. -t, --threads Specify the number of threads to use. -k, --keep Keep all intermediate files. ================================================ FILE: docs/tools/hillshade.rst ================================================ .. _hillshade: hillshade --------- The ``hillshade`` tool reads in a DEM and outputs an image of that DEM as though it were a three-dimensional surface, with every pixel shaded as though it were illuminated by a light from a specified location. Example:: hillshade -a 300 -e 30 dem.tif -o hillshaded.tif See an illustration in :numref:`genhillshade`. View these side-by-side with ``stereo_gui`` (:numref:`stereo_gui`):: stereo_gui dem.tif hillshaded.tif .. _gdal_hill: GDAL hillshade ~~~~~~~~~~~~~~ The ``gdaldem hillshade`` command in GDAL (:numref:`gdal_tools`) provides similar functionality to ``hillshade``, and its output is often more accurate. Example:: gdaldem hillshade -multidirectional -compute_edges \ input_dem.tif output_hillshade.tif Command-line options ~~~~~~~~~~~~~~~~~~~~ --input-file Explicitly specify the input file. -o, --output-file Specify the output file. --align-to-georef Azimuth is relative to geographic East, not +x in the image. -a, --azimuth Sets the direction that the light source is coming from (in degrees). Zero degrees is to the right, with positive degrees counter-clockwise. -e, --elevation Set the elevation of the light source (in degrees). -s, --scale Set the scale of a pixel (in the same units as the DTM height values). --nodata-value Remap the DEM default value to the min altitude value. --blur Pre-blur the DEM with the specified sigma. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :ref:`cog_output`. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/historical_helper.rst ================================================ .. _historical_helper: historical_helper.py -------------------- The ``historical_helper.py`` program is a helper script for processing historical imagery. See examples for how to use it in :numref:`kh4` and :numref:`kh7`. This tool needs the ``convert`` program from the ``ImageMagick`` package. If ASP was installed with ``conda`` (:numref:`conda_intro`), this will have a program named ``convert``, but that will be a utility that is part of the ``embree`` package, rather than the tool we need. To install the correct ``convert`` tool with conda, run:: conda create -n imagemagick -c conda-forge imagemagick -y Then, either prepend the path to ``convert`` to your ``PATH``, or invoke ``historical_helper.py`` with the option:: --convert-path $HOME/miniconda3/envs/imagemagick/bin/convert Usage:: historical_helper.py [options] Command-line options: --input-path Path of the input file to process. --output-path The output file to write. --interest-points List of column and row pairs contained in quotes. --convert-path 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. -h, --help Display this help message. ================================================ FILE: docs/tools/icebridge_kmz_to_csv.rst ================================================ .. _icebridgekmztocsv: icebridge_kmz_to_csv -------------------- This is a simple tool for use with data from the NASA IceBridge program. It takes as input Google Earth compatible .kmz files from: http://asapdata.arc.nasa.gov/dms/missions.html which display the aircraft position at the point when each DMS frame image was captured. This tool exports those camera positions in ECEF to a csv file which can be passed to ``bundle_adjust`` (:numref:`bundle_adjust`) using the following parameters:: --camera-positions ../camera_positions.csv \ --csv-format "1:file 2:lon 3:lat 4:height_above_datum" This list is used to transform the camera positions and orientations from a local coordinate system to the ECEF coordinate system for the current planet. This may be useful in conjunction with ``camera_solve`` (:numref:`camera_solve`). See :numref:`sfmicebridge` for an example. Usage:: icebridge_kmz_to_csv ================================================ FILE: docs/tools/image2qtree.rst ================================================ .. _image2qtree: image2qtree ----------- ``image2qtree`` turns a georeferenced image (or images) into a quadtree with geographical metadata for viewing in Google Earth. See :numref:`google_earth_overlays` for usage examples. Command-line options for image2qtree: --help Display a help message. -o, --output-name Specify the base output directory. -q, --quiet Quiet output. -v, --verbose Verbose output. --cache Cache size, in megabytes. --force-wgs84 Use WGS84 as the input images' geographic coordinate systems, even if they’re not (old behavior). --pixel-scale Scale factor to apply to pixels. --pixel-offset Offset to apply to pixels. --normalize Normalize input images so that their full dynamic range falls in between [0,255]. -m, --output-metadata Specify the output metadata type. --file-type Output file type. --channel-type Output (and input) channel type. --module-name The module where the output will be placed. Ex: marsds for Uniview, or Sol/Mars for Celestia. --terrain Outputs image files suitable for a Uniview terrain view. Implies output format as PNG, channel type uint16. Uniview only. --jpeg-quality JPEG quality factor (0.0 to 1.0). --png-compression PNG compression level (0 to 9). --palette-file Apply a palette from the given file. --palette-scale Apply a scale factor before applying the palette. --palette-offset Apply an offset before applying the palette. --tile-size Tile size, in pixels. --max-lod-pixels Max LoD in pixels, or -1 for none (kml only). --draw-order-offset Offset for the ```` tag for this overlay (kml only). --composite-multiband Composite images using multi-band blending. --aspect-ratio Pixel aspect ratio (for polar overlays; should be a power of two). --north The northernmost latitude in degrees. --south The southernmost latitude in degrees. --east The easternmost longitude in degrees. --west The westernmost longitude in degrees. --sinusoidal Assume a sinusoidal projection. --mercator Assume a Mercator projection. --transverse-mercator Assume a transverse Mercator projection. --orthographic Assume an orthographic projection. --stereographic Assume a stereographic projection. --lambert-azimuthal Assume a Lambert azimuthal projection. --lambert-conformal-conic Assume a Lambert Conformal Conic projection. --utm Assume UTM projection with the given zone. --proj-lat The center of projection latitude (if applicable). --proj-lon The center of projection longitude (if applicable). --proj-scale The projection scale (if applicable). --std-parallel1 Standard parallels for Lambert Conformal Conic projection. --std-parallel2 Standard parallels for Lambert Conformal Conic projection. --nudge-x Nudge the image, in projected coordinates. --nudge-y Nudge the image, in projected coordinates. ================================================ FILE: docs/tools/image_align.rst ================================================ .. _image_align: image_align ------------ The program ``image_align`` aligns a second image to a first image. In the produced aligned second image, each feature has the same row and column coordinates as in the first image. It can return a transform in pixel space and one in planet's coordinate system. Several alignment transforms are supported, including ``rigid``, ``translation``, ``similarity``, etc. The alignment transform is determined with subpixel precision and is applied using bilinear interpolation. Features are matched among the images using either interest points or a disparity produced with ASP's correlation algorithms. If the first image is georeferenced, the second aligned image will use the same georeference as the first one. The first image and second aligned image can then be blended with ``dem_mosaic`` (:numref:`dem_mosaic`). The images are expected to have a single band and have float or integer values. If the images have more than one band, only the first one will be read. The processing is done in double precision. The default output pixel value value is ``float32``, as casting to integer may result in precision loss. Since the first image is kept fixed, if portions of the second aligned image move higher or more to the left than the upper-left corner of the first image, those extra portions will be cut. In that case it is suggested to reverse the order of images when invoking this tool. The alignment transform can be saved, and a custom alignment transform can be applied instead of the one found automatically. The interest point matches which determine the alignment transform can be saved as well. This tool extends the co-registration functionality of CASP-GO (:numref:`casp_go`). Examples ~~~~~~~~ Interest point based alignment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: image_align \ --alignment-transform rigid \ --ip-per-image 20000 \ image1.tif image2.tif \ --output-prefix out_image_align/run \ -o image2_align.tif The directory ``out_image_align`` will contain the interest point matches (that are cached for future runs), the computed transform, and other auxiliary data. This program supports plain-text match files (:numref:`txt_match`). Disparity based alignment ^^^^^^^^^^^^^^^^^^^^^^^^^ Alternatively, instead of using interest points for alignment, use a (dense) disparity produced from correlation (:numref:`correlator-mode`). This method can be more robust to differences in illumination. :: parallel_stereo --correlator-mode --stereo-algorithm asp_mgm \ --subpixel-mode 9 image1.tif image2.tif run/run-corr image_align \ image1.tif image2.tif \ --disparity-params "run/run-corr-F.tif 1000000" \ --output-prefix run/run \ --output-image image2_align.tif The file ending in ``F.tif`` has the disparity. For very precise subpixel alignment, use ``--subpixel-mode 2`` above, but this is very slow. See :numref:`running-stereo` for the choices when it comes to stereo algorithms and subpixel methods, and :numref:`correlator-mode` for the image correlator functionality. For noisy images the ``asp_bm`` algorithm should also be considered. It has a larger correlation window size. The disparity will be computed from the first to second image, but the alignment transform is from the second to first image, so the disparity and this transform will show opposite trends. Application for alignment of DEMs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given a DEM, it can be treated as an image with float values, or an image can be produced from it with the ``hillshade`` command (:numref:`hillshade`), or, if the DEM is obtained from a stereo point cloud with ``point2dem``, an orthoimage in one-to-one correspondence with this DEM can be created with the ``--orthoimage`` option of this tool (:numref:`point2dem`). In either case, given two DEMs, ``dem1.tif`` and ``dem2.tif``, their corresponding images can be aligned to each other as:: image_align image1.tif image2.tif --output-prefix run \ --alignment-transform rigid -o image2_align.tif Then, the alignment transform can be used to align the second DEM to the first, as:: image_align dem1.tif dem2.tif \ --input-transform run/run-transform.txt \ --output-prefix run/run \ -o dem2_align.tif It appears that applying this tool on the DEMs themselves may result in more accurate results than if applied on their hillshaded images. (Consider also using for hillshading the tool ``gdaldem hillshade``, :numref:`gdal_tools`.) If the DEMs have very different grids and projections, regridding them with ``gdalwarp`` may make them more similar and easier to align (invoke this tool with cubic spline interpolation). Note that the alignment transform is a 3x3 matrix and can be examined and edited. Its inputs and outputs are 2D pixels in *homogeneous coordinates*, that is, of the form (*x*, *y*, *1*). It is able to model affine and homography transforms in the pixel plane. See the related tool ``pc_align`` (:numref:`pc_align`) for alignment of point clouds. That one is likely to perform better than ``image_align``, as it makes use of the 3D nature of of point clouds, the inputs need not be gridded, and one of the clouds can be sparse. .. _image_align_ecef_trans: Determination of ECEF transform ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the images are georeferenced, this program can find the approximate 3D transform around the planet that brings the second image in alignment with the first one. It is assumed that there exist DEMs associated with these images, from which the 3D coordinates of the locations of interest point matches are determined, and the best-fit 3D transform is computed. Example:: image_align img1.tif img2.tif \ -o img2_align.tif \ --alignment-transform rigid \ --ecef-transform-type rigid \ --dem1 dem1.tif \ --dem2 dem2.tif \ --output-prefix run/run This will save ``run/run-ecef-transform.txt`` in the ``pc_align`` format (rotation + translation + scale, :numref:`alignmenttransform`). This transform can be passed to ``pc_align`` in order to transform a point cloud (:numref:`prevtrans`), and to ``bundle_adjust`` if desired to transform cameras (:numref:`ba_pc_align`). Use zero iterations with these tools to apply the transform without further refinement. It is important to keep in mind that the ECEF transform is from the second cloud to the first, hence ``pc_align`` should have the clouds *in the same order* as for ``image_align`` in order to use this transform. The inverse of this transform is saved as well, if desired to transform the clouds or cameras from the coordinate system of the first image to the one of the second image. If no DEMs exist, the images themselves can be used in their place. The grayscale values will be interpreted as heights above the datum in meters. The ``image_calc`` program (:numref:`image_calc`) can modify these values before the DEMs are passed to ``image_align``. If only DEMs exist, their hillshaded versions (:numref:`hillshade`) can be used as images. As earlier, the more similar visually the images are, the better the results. It is suggested to use ``--alignment-transform rigid`` and ``--ecef-transform-type rigid`` if it is thought that a rotational component exists, and the value ``translation`` for these options if no rotation is expected. Note that this will produce a rotation + translation around planet center, rather than a local "in-plane" transform, so it can be hard to interpret. A similarity transform can be used when there is a difference in scale. Note that this transform is an approximation. It is not possible to precisely convert a 2D transform between images to a 3D transform in ECEF unless the underlying terrain is perfectly flat. Usage ~~~~~ :: image_align [options] \ --output-prefix -o .. _image_align_opts: Command-line options for image_align ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --output-image, -o Specify the output image. --output-prefix Save the interest point matches, computed transform, and other auxiliary data at this prefix. These are cached for future runs. --alignment-transform Specify the transform to use to align the second image to the first. Options: ``translation``, ``rigid`` (translation + rotation), ``similarity`` (translation + rotation + scale), ``affine``, ``homography``. --output-data-type, -d The data type of the output file. Options: ``uint8``, ``uint16``, ``uint32``, ``int16``, ``int32``, ``float32``, ``float64``. The values are clamped (and also rounded for integer types) to avoid overflow. --ip-detect-method Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB). --ip-per-image How many interest points to detect in each image (the resulting number of matches will be much less). --ip-per-tile 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``. --matches-per-tile How many interest point matches to compute in each image tile (of size normally 1024^2 pixels). Use a value of ``--ip-per-tile`` a few times larger than this. See also ``--matches-per-tile-params``. --matches-per-tile-params To be used with ``--matches-per-tile``. The first value is the image tile size for both images. A larger second value allows each right tile to further expand to this size, resulting in the tiles overlapping. This may be needed if the homography alignment between these images is not great, as this transform is used to pair up left and right image tiles. --individually-normalize Individually normalize the input images instead of using common values. --matches-as-txt Read and write match files as plain text instead of binary. See :numref:`txt_match`. --num-ransac-iterations How many iterations to perform in RANSAC when finding interest point matches. --inlier-threshold The inlier threshold (in pixels) to separate inliers from outliers when computing interest point matches. A smaller threshold will result in fewer inliers. --min-matches Set the minimum number of inlier matches between images for successful matching. --disparity-params Find the alignment transform by using, instead of interest points, a disparity, such as produced by ``parallel_stereo --correlator-mode``. Specify as a string in quotes, in the format: "disparity.tif num_samples". --input-transform Instead of computing an alignment transform, read and apply the one from this file. Must be stored as a 3x3 matrix. --ecef-transform-type Save the ECEF transform corresponding to the image alignment transform to ``-ecef-transform.txt``. The type can be: 'translation', 'rigid' (rotation + translation), or 'similarity' (rotation + translation + scale). See :numref:`image_align_ecef_trans` for an example. --dem1 The DEM associated with the first image. To be used with ``--ecef-transform-type``. --dem2 The DEM associated with the second image. To be used with ``--ecef-transform-type``. --nodata-value Pixels with values less than or equal to this number are treated as no-data. This overrides the no-data values from input images. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/image_calc.rst ================================================ .. _image_calc: image_calc ---------- This tool can be used to perform simple, per-pixel arithmetic on one or more input images. An arithmetic operation specified on the command line is parsed and applied to each pixel, then the result is written to disk. The tool supports multiple input images but each must be the same size and data type. Input images are restricted to one channel (band). For images with more than one channel, only the first channel will be read. The pixel in the first image is referred to as ``var_0``, the second as ``var_1``, and so on. The following symbols are allowed in the arithmetic string: ``+``, ``-``, ``\*``, ``/``, ``()``, ``min()``, ``max()``, ``pow()``, ``abs()``, ``sign()``. The tool also supports certain conditional operations: ``lt``, ``gt``, ``lte``, ``gte``, ``eq`` (``<``, ``>``, ``<=``, ``>=``, ``==`` respectively). These must be used in a format like ``lt(a, b, c, d)``, which translates to ``if a < b then c else d``. Here, the values of ``a``, ``b``, ``c``, and ``d`` can be any variables or constants (:numref:`image_calc_above_thresh`). An example arithmetic string to be passed via ``-c`` is:: "-abs(var_0) + min(58, var_1, var_2) / 2" The tool respects the normal PEMDAS order of operations *except* that it parses equal priority operations with right-to-left associativity, so, ``a * b * c`` becomes ``a * (b * c)``. Parentheses can be used to enforce any preferred order of evaluation. Examples ~~~~~~~~ Apply operation and save pixels as float32 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: image_calc -c "pow(var_0/3.0, 1.1)" input_image.tif \ -o output_image.tif -d float32 .. _image_calc_mask: Apply a mask to an image ^^^^^^^^^^^^^^^^^^^^^^^^ Masking applies an existing binary mask to an image, where mask values of 1 keep pixels and 0 discards them:: image_calc -c "var_0 * var_1" -d float32 \ --output-nodata-value 0 \ input.tif mask.tif -o output.tif Here it is assumed that the image and the mask have the same dimensions, and that the output pixels with value 0 are invalid. .. _image_calc_create_mask: Create a binary mask via thresholding ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Thresholding compares pixel values against a threshold to produce binary decisions. This creates a mask with values of 1 and 0:: thresh=0.27 image_calc -c "gte(var_0, $thresh, 1, 0)" \ -d float32 \ --output-nodata-value -1e+6 \ input.tif -o output.tif Here, values greater or equal than the threshold become 1, and the rest become 0. It is suggested to ensure that both the input and output nodata values are different than either 0 or 1, and ideally less than these. Threshold and invalidate pixels below a value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This sets pixels below a threshold to nodata:: thresh=5.2 image_calc -c "max($thresh, var_0)" -d float32 \ --output-nodata-value $thresh \ input.tif -o output.tif Pixels with values at or below the threshold become nodata (set to the threshold value), while pixels strictly above the threshold retain their original values. .. _image_calc_above_thresh: Threshold and invalidate pixels above a value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This sets pixels at or above a threshold to nodata:: thresh=1000 nodata=-10000 image_calc -c "gte(var_0, $thresh, $nodata, var_0)" \ -d float32 \ --output-nodata-value $nodata \ input.tif -o output.tif Pixels at or above the threshold become nodata, while pixels below retain their original values. Create an image with random values ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: image_calc -c "rand(var_0)" -d float32 \ input.tif -o output.tif The produced values will be between 0 and 1. Other operations can be combined with this one. For example, one could add a random value multiplied by a constant to the input image. .. _image_calc_metadata: Add a value to the geoheader metadata ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: image_calc -c "var_0" --mo 'VAR1=VAL1' -d float32 \ input.tif -o output.tif If this variable already exists, its value will be overwritten. Other existing variables will be preserved. Use ``gdalinfo`` to view the metadata. .. _image_calc_stretch: Stretch and convert to 8-bit ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Linearly stretch the pixel values of a single-channel image to the 0 - 255 range and convert to ``uint8``. The input range is determined by the specified percentiles (default: 2% and 98%), mapping them to 0 and 255. Resulting values are rounded and clamped. :: image_calc --stretch input.tif -o output.tif This is useful for visualizing floating-point data. Customize the bounds with ``--percentile-range``. See also: ``colormap`` (:numref:`colormap`) and ``hillshade`` (:numref:`hillshade`). Subtract 360 degrees from the longitudes in a GeoTiff file ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: image_calc -c "var_0" input.tif -o output.tif \ --longitude-offset -360 -d float32 .. _mask_disparity: Extract disparity bands respecting invalid disparities ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ASP produces disparity maps (:numref:`stereo_corr`) with three bands, having the horizontal and vertical disparity, and mask of pixels showing the valid disparity. Extracting one disparity band with ``gdal_translate`` (:numref:`gdal_tools`) makes it hard to see where the disparity is zero but valid, and where it is invalid. This can be disambiguated with ``image_calc``, by using the mask from the third band to set the invalid disparities in a band to nodata. For that, first extract the three bands from a disparity produced by ASP (:numref:`out_corr_files`), such as ``F.tif``:: for b in 1 2 3; do gdal_translate -b $b F.tif F_b${b}.tif done Then consider a value ``t`` that is larger than any disparity, such as ``t=1e+6``. Add this value to all disparities, apply the mask from the third band, then subtract that value. Invalid values will become equal to ``-t``, which is set as the nodata value. :: t=1e+6 for b in 1 2; do image_calc -c "(var_0 + $t)*var_1 - $t" \ --output-nodata-value -$t \ F_b${b}.tif F_b3.tif \ -o F_b${b}_nodata.tif done The obtained disparity bands can be inspected (and colorized) with ``stereo_gui`` (:numref:`stereo_gui`). As of build 1/2026, this logic is implemented in ``disparitydebug`` (:numref:`disparitydebug`), with the option ``--raw``. Usage ~~~~~ :: image_calc [options] -c -o Command-line options ~~~~~~~~~~~~~~~~~~~~ -c, --calc The arithmetic string, in quotes. For a single input image, if this is not set, it defaults to ``var_0`` so the identity operation. It is required when there are multiple input images. -d, --output-data-type The data type of the output file. Options: uint8, uint16, uint32, int16, int32, float32, float64. --input-nodata-value Set the nodata value for the input images, overriding the value in the images, if present. --output-nodata-value Manually specify a nodata value for the output image. By default it is read from the first input which has it, or, if missing, it is set to data type min. -o, --output-file Output file name. --mo 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. --longitude-offset Add this value to the longitudes in the geoheader (can be used to offset the longitudes by 360 degrees). --no-georef Remove any georeference information (useful with subsequent GDAL-based processing). --stretch Linearly stretch, round, and clamp the input values to the 0 - 255 range (uint8) based on the specified percentiles. See ``--percentile-range``. --percentile-range The percentiles to use for stretching the image to 8-bit. These are double values. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/image_mosaic.rst ================================================ .. _image_mosaic: image_mosaic ------------ The program ``image_mosaic`` aligns multiple input images into a single output image. Currently it only supports a horizontal sequence of images such as scanned Corona images (:numref:`kh4`). It is expected that the second input image is a continuation on the right of the first image, and so on. Otherwise, this program must be called with the images in reverse order, or by setting the ``--reverse`` option. Example ~~~~~~~ :: image_mosaic input1.tif input2.tif \ --ot Float32 --blend-radius 2000 \ --overlap-width 5000 \ -o output.tif More examples are in :numref:`kh4`, :numref:`kh7`, and :numref:`kh9`. Handling failure ~~~~~~~~~~~~~~~~ In case of failure, inspect the input images. This tool assumes the second image can be appended to the right of the first image. It expects no rotation between the images. This program can fail if not enough interest points are found to align the images. It will try a couple of attempts with a larger value of ``--ip-per-tile`` before giving up. Try using an even larger value of this parameter than what the program attempted and printed on the screen. Also consider adjusting ``--inlier-threshold`` and ``--num-ransac-iterations`` if the produced transform is not accurate. A lower inlier threshold will result in a more accurate transform but a higher chance of failure. Usage ~~~~~ :: image_mosaic [options] -o output_file_path Command-line options ~~~~~~~~~~~~~~~~~~~~ --t_orientation Specify the image layout. Currently only supports horizontal. --reverse Mosaic the images in reverse order. --rotate After mosaicking, rotate the image by 180 degrees around its center. --rotate-90 After mosaicking, rotate the image by 90 degrees clockwise around its center. --rotate-90-ccw After mosaicking, rotate the image by 90 degrees counter-clockwise around its center. --use-affine-transform Solve for full affine transforms between segments instead of a simpler rotate+translate transform. -o, --output-image Specify the output file path. Required. --overlap-width The width of the expected overlap region in the images, in pixels. --blend-radius The width in pixels over which blending is performed. Default is calculated based on the overlap width. --band Specify a band (channel) to use for multi-channel images. The band count starts from 1. --ot 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. --input-nodata-value Override the input nodata value. --output-nodata-value double Specify the output nodata value. --ip-per-tile integer How many interest points to detect in each :math:`1024^2` image tile (default: automatic determination). --output-prefix If specified, save here the interest point matches used in mosaicking. --num-ransac-iterations How many iterations to perform in RANSAC when finding interest point matches. --inlier-threshold The inlier threshold (in pixels) to separate inliers from outliers when computing interest point matches. A smaller threshold will result in fewer inliers. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/image_subset.rst ================================================ .. _image_subset: image_subset ------------ Given a set of overlapping georeferenced images, this program will extract a subset that results in almost the same coverage as the original images. This program is slow, as the algorithm complexity is proportional to the square of number of input images and the number of output pixels. It is best used with at most 100-200 images, each of dimensions of 1000 - 2000 pixels. As of build 2025/11, this program is multi-threaded and reads each image in fully in memory, so it should not be used with large images. Overview ~~~~~~~~ A threshold determines if a pixel is considered to add to the coverage. This program finds the image that contributes the most pixels no less than the threshold, then the image that contributes the most additional pixels, etc. The produced subset is saved to an output list, with the image name and number of contributing pixels on each line. The images are sorted in decreasing order of contribution to coverage. Background and example ~~~~~~~~~~~~~~~~~~~~~~ This program was developed as an auxiliary tool for Shape-from-Shading processing (:numref:`sfs_usage`). Early in this process it is desired to have a very large number of images of diverse illumination to be able to coregister them all. However, once that is done, just a representative subset of images is needed for SfS, as using the full set can be prohibitive computationally. The following way of invoking this tool is suggested. First, for a very large terrain, it is suggested to break it up into quadrants with some overlap, collect all relevant images for each quadrant, and then process these quadrants separately. This will result in a faster runtime and produce images that are more relevant to each smaller area. Then, break up the input image set into several groups, by Sun azimuth (:numref:`sfs_azimuth`), with 50 - 150 images in each group. This will help produce subsets of images with diverse illumination. For the images in each group, create a list of mapprojected images at a low resolution, for example, at 1/16 of original image resolution. This can be accomplished by using ``sub`` images produced by ``stereo_gui`` (:numref:`stereo_gui`), whose resolution can be further reduced with a command such as:: gdalwarp -r cubicspline -tr input.tif output.tif Then, for each group, this program can be called as:: image_subset \ --threads 40 \ --threshold 0.01 \ --image-list list.txt \ -o subset.txt Note, as before, that this program can be slow. A progress bar is displayed and helps track its advancement. If this is unreasonably slow, run it on lower-resolution images or with fewer images. A good threshold can be found by clicking on pixels of representative images in ``stereo_gui`` and observing the pixel values printed in the terminal. Validation ~~~~~~~~~~ When this program finishes, overlay the images in the produced list and inspect if they cover the desired area in decreasing order of contribution to coverage. The program ``dem_mosaic`` (:numref:`dem_mosaic`) with the ``--max`` option can be helpful in determining if the produced subset coverage is about the same as for the original images. It is likely acceptable to drop the last few images in the produced list, as their contribution may be marginal. Command-line options ~~~~~~~~~~~~~~~~~~~~ --image-list The list of input images. --output-list, -o The file having the produced image subset, and for each image the number of contributing pixels (sorted in decreasing order of contribution). --threshold The image threshold. Pixels no less than this will contribute to the coverage. --t_projwin Specify a custom extent in projected coordinates in which to evaluate the coverage. The format is ``min_x min_y max_x max_y`` or ``min_x max_y max_x min_y``, with no quotes. In this mode all input images must use the same projection. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/ipfind.rst ================================================ .. _ipfind: ipfind ------ The ``ipfind`` tool detects interest points (IPs) in images and writes them out to .vwip files. ASP is able to read these files to recover the IPs. These files can be visualized with ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`). This tool is useful in testing out different IP detection settings and visualizing them (using the option ``--debug-image``). One can pass multiple input images to ``ipfind`` and they will be processed one after another. This program works in conjunction with ``ipmatch`` (:numref:`ipmatch`) to match interest points across images. Usage:: ipfind [options] Exaple:: ipfind image1.tif image2.tif image3.tif This will write ``image1.vwip``, ``image2.vwip``, ``image3.vwip``. Command-line options for ipfind: --interest-operator Choose an interest point detector. SIFT and ORB are implemented in OpenCV. OBALoG is from :cite:`jakkula2010efficient`. IAGD (Integral Auto Gain Detector) is a variant of OBALoG. --descriptor-generator Choose a descriptor generator. Some descriptors work only with certain interest point operators (for example, for 'OBALoG' use 'sgrad', 'sgrad2', 'patch'). --ip-per-image Set the maximum number of IP to find in the whole image. If not specified, use instead the value of ``--ip-per-tile``. --ip-per-tile Set the maximum number of IP to find in each tile. The tile size is set with ``--tile-size``. -g, --gain Increasing this number will increase the gain at which interest points are detected. --single-scale Turn off scale-invariant interest point detection. This option only searches for interest points in the first octave of the scale space. Harris and LoG only. --no-orientation Turn off rotational invariance. --normalize Normalize the input. Use for images that have non-standard values such as ISIS cube files. --per-tile-normalize Individually normalize each processing tile. --nodata-radius Don't detect IP within this many pixels of image borders or nodata. --output-folder Write output files to this location. -d, --debug-image <0|1|2 (default: 0)> Write out a low-resolution or full-resolution debug image with interest points on it if the value of this flag is respectively 1 or 2. The default (0) is to do nothing. --print-ip Print information for this many detected IP. --lowe Save the interest points in an ASCII data format that is compatible with the Lowe-SIFT toolchain. --binary-to-txt Convert a .vwip file to a text file. Each line has the fields: x, y, scale, orientation, interest, polarity, octave, scale_lvl, followed by the descriptor values. Usage:: ipfind --binary-to-txt input.vwip output.txt --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/ipmatch.rst ================================================ .. _ipmatch: ipmatch ------- The ``ipmatch`` program reads interest points (IPs) from ``.vwip`` files produced with ``ipfind`` (:numref:`ipfind`) and finds matches among them, writing out ``.match`` files containing the results. It can also produce debug images with plotted match points. If more than two image/``.vwip`` sets are passed in, each possible combination of images will be matched. Example ~~~~~~~ :: ipmatch input/image1.tif input/image2.tif -o output/run This will read the ``input/image1.vwip`` and ``input/image2.vwip`` files created by ``ipfind`` and write the binary match file:: output/run-image1__image2.match The ``.vwip`` files can be specified explicitly, after the image files. If there are more images, then all combinations of matches will be written out. Note that this tool does not implement many of the IP matching steps that are used in :ref:`parallel_stereo` and :ref:`bundle_adjust`, since it does not use any camera information. Plain text match files and inspections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To write plain text match files instead of binary, add the option ``--matches-as-txt``. See also :numref:`txt_match`. The binary and plain text match files can be inspected with ``stereo_gui`` (:numref:`stereo_gui_view_ip`). .. _ipmatch_convert: Match file format conversion ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Convert a binary match file to plain text:: ipmatch --binary-to-txt input.match output.txt The format of the plain text file is described in :numref:`txt_format`. Convert a plain text match file to binary:: ipmatch --txt-to-binary input.txt output.match The program ``parse_match_file.py`` (:numref:`parse_match_file`) can do conversions as well. .. _ipmatch_merge: Merging match files ~~~~~~~~~~~~~~~~~~~ Merge multiple match files for the same image pair into one:: ipmatch --merge-match-files input1.match input2.match output.match Duplicates are identified by left interest point coordinates. The output can be saved as plain text by adding ``--matches-as-txt``. Naming convention ~~~~~~~~~~~~~~~~~ The naming convention for the output binary files is:: -__.match where the image names are without the directory name and extension. See :numref:`ba_match_files` for more details. Usage ~~~~~ Usage:: ipmatch [options] Command-line options ~~~~~~~~~~~~~~~~~~~~ Command-line options for ipmatch: --output-prefix Write output files using this prefix. --matcher-threshold Threshold for the separation between closest and next closest interest points. --distance-metric Distance metric to use. Hamming should only be used for binary types like ORB. --ransac-constraint RANSAC constraint type. --inlier-threshold RANSAC inlier threshold. --ransac-iterations Number of RANSAC iterations. --flann-method Choose the FLANN method for matching interest points. The default ``kmeans`` is slower but deterministic, while ``kdtree`` is faster but not deterministic (starting with FLANN 1.9.2). --non-flann Use an implementation of the interest matcher that is not reliant on FLANN. --matches-as-txt Read and write match files as plain text instead of binary. See :numref:`txt_match`. --binary-to-txt Read a binary match file and write it as plain text. The input and output match files must be specified with appropriate extensions. --txt-to-binary Read a plain text match file and write it as binary. The input and output match files must be specified with appropriate extensions. --merge-match-files Given several match files for the same image pair, merge them into one. Duplicates are removed based on left interest point coordinates. -d, --debug-image Set to write out debug images. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/jitter_solve.rst ================================================ .. _jitter_solve: jitter_solve ------------- The ``jitter_solve`` program takes as input several overlapping images and linescan and/or frame camera models in CSM format (such as for LRO NAC, CTX, HiRISE, Airbus Pleiades, DigitalGlobe, etc., :numref:`csm`) and adjusts each individual camera position and orientation in the linescan model to make them more consistent with each other and to the ground. The goal is to reduce the effect of unmeasured perturbations in the linescan sensor as it acquires the data. This is quite analogous to what ``bundle_adjust`` does (:numref:`bundle_adjust`), except that the latter tool has just a single position and orientation per camera, instead of a sequence of them. Usage:: jitter_solve \ -o [options] .. _jitter_limitations: Limitations ~~~~~~~~~~~ When the scan lines from the images are nearly parallel to each other the jitter cannot be fully disambiguated, and some residual jitter is left unsolved. Best results are achieved if scan lines from one image cross blocks of scan lines from another image that correspond to at least one jitter period. In practice, for WorldView images, for example, the across-track angle can vary notably from one image to another, resulting in such a favorable regime. If the prior DEM used as constraint (:numref:`jitter_dem_constraint`) has systematic differences with what is expected from the images, this can bias the results. Potential solutions are to mask the problematic areas in the DEM and / or use a value of ``--heights-from-dem-uncertainty`` that is quite a lot larger than the actual uncertainty. GCP files produced from a prior DEM of good quality can help increase the accuracy (:numref:`dem2gcp`). A larger number of images (more than two, ideally with scan lines notably crossing each other) can improve the results. It is suggested to use this solver with carefully set camera position constraints and with anchor points, to prevent oscillations in the solution. An example is in :numref:`sfs_jitter`. More research is needed about how to set up parameters for this solver in various situations. If frame camera images exist for the same extent, they will help solve for jitter, as such images are rigid across scan lines. .. _jitter_ground: Ground constraints ~~~~~~~~~~~~~~~~~~ Optimizing the cameras to reduce the jitter and make them self-consistent can result in the camera system moving away from the initial location or warping of any eventually produced DEM. Hence, ground and camera constraints are very important. This tool uses several kinds of constraints. They are described below, and an example of comparing different ground constraints is given in :numref:`jitter_pleiades`. .. _jitter_tri_constraint: Intrinsic constraint ^^^^^^^^^^^^^^^^^^^^ Triangulated ground points obtained from interest point matches are kept, during optimization, close to their initial values. This works well when the images have very good overlap. This is controlled by the option ``--tri-weight`` whose default value is 0.1. This is divided by the image GSD when computing the cost function, to make the distances on the ground in units of pixels. A report file having the change in triangulated points is written to disk (:numref:`jitter_cam_offsets`). It can help evaluate the effect of this constraint. Also check the pixel reprojection errors per camera (:numref:`jitter_errors_per_camera`) and per triangulated point (:numref:`jitter_tri_err`), before and after solving for jitter. Triangulated points that are constrained via a DEM (option ``--heights-from-dem``, :numref:`jitter_dem_constraint`), that is, those that are near a valid portion of this DEM, are not affected by the triangulation constraint. The implementation is just as for bundle adjustment (:numref:`ba_ground_constraints`). An example is given in :numref:`jitter_dg`. See :numref:`jitter_options` for the full description of this option. .. _jitter_dem_constraint: Extrinsic constraint ^^^^^^^^^^^^^^^^^^^^ This ties the triangulated ground points obtained from interest point matches to an external DEM, which may be at a lower resolution than the images. It is expected that this external DEM is *well-aligned* with the input cameras (see :numref:`ba_pc_align` for how to do the alignment). This option is named ``--heights-from-dem``, and it is controlled via ``--heights-from-dem-uncertainty`` and ``--heights-from-dem-robust-threshold``. The use of these options is shown in :numref:`jitter_ctx`. The previously mentioned intrinsic constraint will be employed where the triangulated points are not close to the DEM given by this option. The DEM constraint is preferred, if a decent DEM that is well-aligned with the cameras is available. If the difference between the stereo DEM before jitter correction and the reference DEM is large, the value of ``--heights-from-dem-uncertainty`` should be increased. If the reference DEM has systematic differences, such as due to vegetation, this constraint may need to be omitted, or have the systematic differences masked. An example with and without this constraint is shown in :numref:`jitter_pleiades`. See also :numref:`jitter_limitations` for limitations of this constraint. The implementation of this constraint is the same as for bundle adjustment (:numref:`heights_from_dem`). This solver can also use a sparse point cloud as a constraint. This is an advanced option. See :numref:`jitter_ref_terrain`. Ground control points ^^^^^^^^^^^^^^^^^^^^^ Just like ``bundle_adjust`` (:numref:`bagcp`), this program can make use of ground control points. The pixel residuals at ground control points are flagged in the produced report file (:numref:`jitter_tri_err`). Ground control points can be produced by tying a stereo DEM to a different high quality DEM (:numref:`dem2gcp`). .. _jitter_camera: Camera constraints ~~~~~~~~~~~~~~~~~~ Jitter is believed to be caused by vibrations in the linescan camera as it acquires the image. If that is the case, the camera positions are likely accurate, and can be constrained to not move much, while the orientations can move more. If estimates for the horizontal and vertical camera position uncertainties exist, per camera, these can be incorporated into the optimization via the option ``--camera-position-uncertainty``. It is good to use those uncertainties generously, so to set them to be larger than the actual uncertainty. See the ``bundle_adjust`` documentation at :numref:`ba_cam_constraints` for an example and implementation details. This program writes report files that record the changes in camera position (:numref:`jitter_cam_offsets`) and the resulting pixel reprojection errors per camera (:numref:`jitter_errors_per_camera`). It is suggested to examine these and adjust the camera constraints, if needed. A tight constraint can prevent convergence and result in large reprojection errors. An alternative constraint, ``--camera-position-weight``, can be set to a large value, on the order of 1e+4, to effectively keep the camera positions in place. This is an older option that will be removed. Camera position and ground constraints should be sufficient. It is suggested not to use the experimental ``--rotation-weight`` option. Smoothness constraint ^^^^^^^^^^^^^^^^^^^^^ The option ``--smoothness-weight`` constraints how much each sequence of linescan poses can change in curvature relative to the initial values. This can prevent convergence. A range of values is suggested in :numref:`jitter_options`. Roll and yaw constraints ^^^^^^^^^^^^^^^^^^^^^^^^ Other related options that may improve the regularity of the camera poses are ``--roll-weight`` and ``--yaw-weight`` (they should be used with the ``--initial-camera-constraint`` option). It is strongly suggested not to use these (or the smoothness weight) in a first pass. Only if happy enough with the results and it is desired to control various aspects of the solution, one should try these options. Values for these are suggested in :numref:`jitter_options`. Resampling the poses ~~~~~~~~~~~~~~~~~~~~ Oftentimes, the number of tabulated camera positions and orientations in the CSM file is very small. For example, for Airbus Pleiades, the position is sampled every 30 seconds, while acquiring the whole image can take only 1.6 seconds. For CTX the opposite problem happens, the orientations are sampled too finely, resulting in too many variables to optimize. Hence, it is strongly suggested to resample the provided positions and orientations before the solver optimizes them. Use the options: ``--num-lines-per-position`` and ``--num-lines-per-orientation``. The estimated number of lines per position and orientation will be printed on screen, before and after resampling. In the two examples below drastically different sampling rates will be used. Inspection of residual files (:numref:`jitter_out_files`), and of triangulation errors (:numref:`triangulation_error`) and DEM differences after solving for jitter (:numref:`jitter_dg`) can help decide the sampling rate. .. _jitter_ip: Interest point matches ~~~~~~~~~~~~~~~~~~~~~~ Since solving for jitter is a fine-grained operation, modifying many positions and orientations along the satellite track. Hence, many dense and well-distributed interest points are necessary. It is suggested to create these with *pairwise stereo*, with the option ``--num-matches-from-disparity`` (:numref:`dense_ip`). An example is shown in :numref:`jitter_ctx`. *An alternative* to pairwise stereo is discussed below. The most accurate interest points are obtained when the images are mapprojected. This is illustrated in :numref:`jitter_dg`. The produced interest point matches will be, however, between the *original, unprojected images*, as expected by the solver. It was found experimentally that the *best* dense interest point matches are obtained by invoking ``parallel_stereo`` with the options ``--stereo-algorithm asp_bm`` and ``--subpixel-mode 1``. The ``asp_mgm`` algorithm (:numref:`stereo_alg_overview`), while producing more pleasing results, smears somewhat the interest points which makes solving for subpixel-level accurate jitter less accurate. All interest point matches from disparity must be copied to a single directory and *renamed according to the naming convention* (:numref:`ba_match_files`). The jitter solver is passed the prefix of these files with the option ``--match-files-prefix``. If having more than two images, one can do pairwise stereo to get dense matches. For a large number of images this is prohibitive. *Sparse* interest point matches can work *almost* as well if sufficiently well-distributed and accurate. Then stereo is not necessary. Use ``parallel_bundle_adjust`` with the options ``--ip-detect-method 1`` to create subpixel-level accurate matches, and with ``--ip-per-tile 500 --matches-per-tile 500`` to ensure there are plenty of them. The option ``--mapprojected-data`` (:numref:`mapip`) is suggested as well. It is suggested to call ``jitter_solve`` with a large value of ``--max-pairwise-matches``, such as 40000, or 2-3 times more than that for images with lots of lines and high-frequency jitter. *There must be at least a handful of matches for each jitter period.* Examine the interest point matches in ``stereo_gui`` (:numref:`stereo_gui_view_ip`). Also examine the produced ``pointmap.csv`` files to see the distribution and residuals of interest points (:numref:`jitter_tri_err`), and if the matches are dense enough given the observed jitter. This program can read interest point matches in the ISIS control network format, using the option ``--isis-cnet``, and from an NVM file, with the option ``--nvm``. See :numref:`control_network` in the ``bundle_adjust`` manual for more details about control networks. Unlike that program, ``jitter_solve`` does not save an updated control network, as this tool changes the triangulated points only in very minor ways. Camera poses from NVM files are not read either. .. _jitter_anchor_points: Anchor points ~~~~~~~~~~~~~ The anchor points constraint uses a well-aligned external DEM, but with important differences, as compared to interest point matches. The anchor points are created based on pixels that are uniformly distributed over each image, not just where the images overlap, and can even go beyond the first and last image line. This ensures that the optimized poses do not oscillate where the images overlap very little or not at all. This constraint works by projecting rays to the ground from the chosen uniformly distributed pixels, finding the *anchor points* where the rays intersect the DEM, then adding to the cost function to optimize reprojection errors (:numref:`bundle_adjustment`) for the anchor points. This complements the reprojection errors from triangulated interest point matches, and the external DEM constraint (if used). Anchor points are strongly encouraged either with an intrinsic constraint or an external DEM constraint. Their number and weights should be less than for the interest points, to avoid these dominating the problem. Resampling the camera poses very finely may require more anchor points. A report file that has the residuals at anchor points is written down (:numref:`anchor_point_files`). The relevant options are ``--num-anchor-points``, ``--num-anchor-points-per-tile``, ``--anchor-weight``, ``--anchor-dem``, and ``--num-anchor-points-extra-lines``. An example is given in :numref:`jitter_dg`. Solving for intrinsics ~~~~~~~~~~~~~~~~~~~~~~ For some datasets there can be both jitter and lens distortion effects, such as for Kaguya TC (:numref:`kaguya_ba`, :numref:`jitter_kaguya`). In such cases, the stronger phenomenon should be solved for first. The ``bundle_adjust`` and ``jitter_solve`` programs can use each other's output cameras as inputs, as each saves image and optimized camera lists (:numref:`ba_out_cams`), which can then be passed in to the other program via the ``--image-list`` and ``--camera-list`` options. .. _jitter_ctx: Example 1: CTX images on Mars ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A CTX stereo pair will be used which has quite noticeable jitter. See :numref:`jitter_multiple_images` for a discussion of multiple images, and a similar example for KaguyaTC in :numref:`jitter_kaguya`. See also :numref:`jitter_limitations` for limitations of this constraint. Input images ^^^^^^^^^^^^ The pair consists of images with ids:: J03_045820_1915_XN_11N210W K05_055472_1916_XN_11N210W See :numref:`ctx_example` for how to prepare the image files and :numref:`create_csm_linescan` for how to create CSM camera models. All produced images and cameras were stored in a directory named ``img``. .. _jitter_solve_ctx_dem: Reference datasets ^^^^^^^^^^^^^^^^^^ The MOLA dataset from: https://ode.rsl.wustl.edu/mars/datapointsearch.aspx is used for alignment. The data for the following (very generous) longitude-latitude extent was fetched: 146E to 152E, and 7N to 15N. The obtained CSV file was saved as ``mola.csv``. A gridded DEM produced from this unorganized set of points is shipped with the ISIS data. It is gridded at 463 meters per pixel, which is quite coarse compared to CTX images, which are at 6 m/pixel, but it is good enough to constrain the cameras when solving for jitter. A clip can be cut out of it with the command:: gdal_translate -co compress=lzw -co TILED=yes \ -co INTERLEAVE=BAND -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 \ -projwin -2057237.6 1077503.1 -1546698.4 275566.33 \ $ISISDATA/base/dems/molaMarsPlanetaryRadius0005.cub \ ref_dem_shift.tif This one has a 190 meter vertical shift relative to the preferred Mars radius of 3396190 meters, which can be removed as follows:: image_calc -c "var_0-190" -d float32 ref_dem_shift.tif \ -o ref_dem.tif As a sanity check, one can take the absolute difference of this DEM and the MOLA csv file as:: geodiff --absolute --csv-format 1:lon,2:lat,5:radius_m \ mola.csv ref_dem.tif This will give a median difference of 3 meters, which is about right, given the uncertainties in these datasets. A DEM can also be created from MOLA data with ``point2dem`` (:numref:`point2dem`):: point2dem -r mars --tr 500 \ --stereographic --auto-proj-center \ --csv-format 1:lon,2:lat,5:radius_m \ --search-radius-factor 10 \ mola.csv This DEM can be blurred with ``dem_mosaic``, with the option ``--dem-blur-sigma 5``. Uncorrected DEM creation ^^^^^^^^^^^^^^^^^^^^^^^^ Bundle adjustment is run first:: bundle_adjust \ --ip-per-image 20000 \ --max-pairwise-matches 100000 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --camera-weight 0 \ --remove-outliers-params '75.0 3.0 10 10' \ img/J03_045820_1915_XN_11N210W.cal.cub \ img/K05_055472_1916_XN_11N210W.cal.cub \ img/J03_045820_1915_XN_11N210W.cal.json \ img/K05_055472_1916_XN_11N210W.cal.json \ -o ba/run The triangulation weight was used to help the cameras from drifting. Outlier removal was allowed to be more generous (hence the values of 10 pixels above) as perhaps due to jitter some triangulated points obtained from interest point matches may not project perfectly in the cameras. Here we chose to use a large value for ``--max-pairwise-matches`` and we will do the same when solving for jitter below. That is because jitter-solving is a finer-grained operation than bundle adjustment, and a lot of interest point matches are needed. It is very important to inspect the ``final_residuals_stats.txt`` report file to ensure each image has had enough features and has small enough reprojection errors (:numref:`ba_out_files`). Stereo is run next. The ``local_epipolar`` alignment (:numref:`running-stereo`) here did a flawless job, unlike ``affineepipolar`` alignment which resulted in some blunders. :: parallel_stereo \ --bundle-adjust-prefix ba/run \ --stereo-algorithm asp_mgm \ --num-matches-from-disparity 40000 \ --alignment-method local_epipolar \ img/J03_045820_1915_XN_11N210W.cal.cub \ img/K05_055472_1916_XN_11N210W.cal.cub \ img/J03_045820_1915_XN_11N210W.cal.json \ img/K05_055472_1916_XN_11N210W.cal.json \ stereo/run point2dem --stereographic --auto-proj-center \ --errorimage stereo/run-PC.tif Note how above we chose to create dense interest point matches from disparity. They will be used to solve for jitter. We used the option ``--num-matches-from-disparity``. See :numref:`jitter_ip` for more details. See :numref:`nextsteps` for a discussion about various speed-vs-quality choices for stereo. Consider using mapprojected images (:numref:`mapproj-example`). We chose to use here a local stereographic projection (:numref:`point2dem_proj`). This DEM was aligned to MOLA and recreated, as:: pc_align --max-displacement 400 \ --csv-format 1:lon,2:lat,5:radius_m \ stereo/run-DEM.tif mola.csv \ --save-inv-transformed-reference-points \ -o stereo/run-align point2dem --stereographic --auto-proj-center \ stereo/run-align-trans_reference.tif The value in ``--max-displacement`` may need tuning (:numref:`pc_align`). This transform was applied to the cameras (note that this approach is applicable *only* when the first cloud in ``pc_align`` was the ASP-produced DEM, otherwise see :numref:`ba_pc_align`):: bundle_adjust \ --input-adjustments-prefix ba/run \ --initial-transform stereo/run-align-inverse-transform.txt \ img/J03_045820_1915_XN_11N210W.cal.cub \ img/K05_055472_1916_XN_11N210W.cal.cub \ img/J03_045820_1915_XN_11N210W.cal.json \ img/K05_055472_1916_XN_11N210W.cal.json \ --apply-initial-transform-only \ -o ba_align/run Solving for jitter ^^^^^^^^^^^^^^^^^^ Then, jitter was solved for, using the *original cameras*, with the adjustments prefix having the latest refinements and alignment:: jitter_solve \ img/J03_045820_1915_XN_11N210W.cal.cub \ img/K05_055472_1916_XN_11N210W.cal.cub \ img/J03_045820_1915_XN_11N210W.cal.json \ img/K05_055472_1916_XN_11N210W.cal.json \ --input-adjustments-prefix ba_align/run \ --max-pairwise-matches 100000 \ --match-files-prefix stereo/run-disp \ --num-lines-per-position 1000 \ --num-lines-per-orientation 1000 \ --max-initial-reprojection-error 20 \ --heights-from-dem ref_dem.tif \ --heights-from-dem-uncertainty 20.0 \ --num-iterations 50 \ --num-anchor-points 0 \ --anchor-weight 0 \ --tri-weight 0.1 \ -o jitter/run It was found that using about 1000 lines per pose (position and orientation) sample gave good results, and if using too few lines, the poses become noisy. Either dense and *uniformly distributed* interest point matches or sufficiently dense *subpixel-level accurate sparse matches* are necessary to solve for jitter (:numref:`jitter_ip`). Here *anchor points* were not used. They can be necessary to stabilize the solution (:numref:`jitter_anchor_points`). The constraint relative to the reference DEM is needed, to make sure the DEM produced later agrees with the reference one. Otherwise, the final solution may not be unique, as a long-wavelength perturbation consistently applied to all obtained camera trajectories may work just as well. If using camera position constraints (:numref:`jitter_camera`), it is suggested to be generous with the uncertainties. For CTX they are likely rather large. The report files mentioned in :numref:`jitter_out_files` can be very helpful in evaluating how well the jitter solver worked, even before rerunning stereo. The model states (:numref:`csm_state`) of optimized cameras are saved with names like:: jitter/run-*.adjusted_state.json Then, stereo can be redone, just at the triangulation stage, which is much faster than doing it from scratch. The optimized cameras were used:: parallel_stereo \ --prev-run-prefix stereo/run \ --stereo-algorithm asp_mgm \ --alignment-method local_epipolar \ img/J03_045820_1915_XN_11N210W.cal.cub \ img/K05_055472_1916_XN_11N210W.cal.cub \ jitter/run-J03_045820_1915_XN_11N210W.cal.adjusted_state.json \ jitter/run-K05_055472_1916_XN_11N210W.cal.adjusted_state.json \ stereo_jitter/run point2dem --stereographic --auto-proj-center \ --errorimage stereo_jitter/run-PC.tif To validate the results, first the triangulation (ray intersection) error (:numref:`point2dem`) was plotted, before and after solving for jitter. These were colorized as:: colormap --min 0 --max 10 stereo/run-IntersectionErr.tif colormap --min 0 --max 10 stereo_jitter/run-IntersectionErr.tif The result is below. .. figure:: ../images/jitter_intersection_error.png :name: ctx_jitter_intersection_error The colorized triangulation error (max shade of red is 10 m) before and after optimization for jitter. Then, the absolute difference was computed between the sparse MOLA dataset and the DEM after alignment and before solving for jitter, and the same was done with the DEM produced after solving for it:: geodiff --absolute \ --csv-format 1:lon,2:lat,5:radius_m \ stereo/run-align-trans_reference-DEM.tif mola.csv \ -o stereo/run geodiff --absolute \ --csv-format 1:lon,2:lat,5:radius_m \ stereo_jitter/run-DEM.tif mola.csv \ -o stereo_jitter/run Similar commands are used to find differences with the reference DEM:: geodiff --absolute ref_dem.tif \ stereo/run-align-trans_reference-DEM.tif -o \ stereo/run colormap --min 0 --max 20 stereo/run-diff.tif geodiff --absolute ref_dem.tif \ stereo_jitter/run-DEM.tif \ -o stereo_jitter/run colormap --min 0 --max 20 stereo_jitter/run-diff.tif Plot with:: stereo_gui --colorize --min 0 --max 20 \ stereo/run-diff.csv \ stereo_jitter/run-diff.csv \ stereo/run-diff_CMAP.tif \ stereo_jitter/run-diff_CMAP.tif \ stereo_jitter/run-DEM.tif \ ref_dem.tif DEMs can later be hillshaded. .. figure:: ../images/jitter_dem_diff.png :name: ctx_jitter_dem_diff_error From left to right are shown colorized absolute differences of (a) jitter-unoptimized but aligned DEM and ungridded MOLA (b) jitter-optimized DEM and ungridded MOLA (c) unoptimized DEM and gridded MOLA (d) jitter-optimized DEM and gridded MOLA. Then, (e) hillshaded optimized DEM (f) hillshaded gridded MOLA (which is the reference DEM). The max shade of red is 20 m difference. It can be seen that the banded systematic error due to jitter is gone, both in the triangulation error maps and DEM differences. The produced DEM still disagrees somewhat with the reference, but we believe that this is due to the reference DEM being very coarse, per plots (e) and (f) in the figure. .. _jitter_multiple_images: Multiple CTX images ^^^^^^^^^^^^^^^^^^^ Jitter was solved jointly for a set of 27 CTX images with much overlap. The extent was roughly between -157.8 and -155.5 degrees of longitude, and from -0.3 to 3.8 degrees of latitude. Bundle adjustment for the entire set was run as before. The ``convergence_angles.txt`` report file (:numref:`ba_conv_angle`) was used to find stereo pairs. Only stereo pairs with a median convergence angle of at least 5 degrees were processed, and which had at least several dozen shared interest points. This resulted in 42 stereo pairs. The resulting stereo DEMs can be mosaicked with ``dem_mosaic`` (:numref:`dem_mosaic`). Alignment to MOLA can be done as before, and the alignment transform must be applied to the cameras (:numref:`ba_pc_align`). Then, jitter was solved for, as earlier, but for the entire set at once. Dense pairwise matches were used (:numref:`dense_ip`). They were copied from individual stereo directories to a single directory. It is important to use the proper naming convention (:numref:`ba_match_files`). One could augment or substitute the dense matches with *subpixel-level accurate* sparse matches from bundle adjustment if renamed to the proper convention (:numref:`jitter_ip`). This can be helpful to ensure all images are tied together. The DEM used as a constraint can be either the existing gridded MOLA product, or it can be created from MOLA with ``point2dem`` (:numref:`jitter_solve_ctx_dem`). Here the second option was used. Consider adjusting the value of ``--heights-from-dem-uncertainty``. Tightening the DEM constraint is usually not problematic, if the alignment to the DEM is good. .. figure:: ../images/jitter_ctx_dem_drg.png :name: jitter_ctx_dem_drg DEM and orthoimage produced by mosaicking the results for the 27 stereo pairs. Some seams in the DEMs are seen. Perhaps it is due to insufficiently good distortion modeling. For the orthoimages, the first encountered pixel was used at a given location. .. figure:: ../images/jitter_ctx_error_image.png :name: jitter_ctx_error_image Mosaicked triangulation error image (:numref:`triangulation_error`), before (left) and after (right) solving for jitter. The range of values is between 0 and 15 meters. It can be seen that the triangulation error greatly decreases. This was produced with ``dem_mosaic --max``. .. figure:: ../images/jitter_ctx_mola_diff.png :name: jitter_ctx_mola_diff Signed difference of the mosaicked DEM and MOLA before (left) and after (right) solving for jitter. It can be seen that the jitter artifacts are greatly attenuated. Some systematic error is seen in the vertical direction, roughly in the middle of the image. It is in the area where the MOLA data is sparsest, and maybe that results in the ground constraint not working as well. Or could be related to the seams issue noted earlier. .. _jitter_dg: Example 2: WorldView-3 DigitalGlobe images on Earth ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Jitter was successfully solved for a pair of WorldView-3 images over a mountainous site in `Grand Mesa `_, Colorado, US. This is a much more challenging example than the earlier one for CTX, because: - Images are much larger, at 42500 x 71396 pixels, compared to 5000 x 52224 pixels for CTX. - The jitter appears to be at much higher frequency, necessitating using 50 image lines for each position and orientation to optimize rather than 1000. - Many dense interest point matches and anchor points are needed to capture the high-frequency jitter Many anchor points are needed to prevent the solution from becoming unstable at earlier and later image lines. - The terrain is very steep, which introduces some extraneous signal in the problem to optimize. See :numref:`jitter_limitations` regarding limitations of this program. We consider a dataset with two images named 1.tif and 2.tif, and corresponding camera files 1.xml and 2.xml, having the exact DigitalGlobe linescan model. Bundle adjustment ^^^^^^^^^^^^^^^^^ Bundle adjustment was invoked first to reduce any errors between the cameras. This is not strictly necessary for WorldView images, as they are usually quite well-registered. This command expects raw (not mapprojected) images:: bundle_adjust \ -t dg \ --ip-detect-method 1 \ --ip-per-image 10000 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --camera-weight 0 \ --remove-outliers-params '75.0 3.0 10 10' \ 1.tif 2.tif \ 1.xml 2.xml \ -o ba/run A lot of interest points were used, and the outlier filter threshold was generous, since because of trees and shadows in the images likely some interest points may not be too precise but they could still be good. Mapprojection ^^^^^^^^^^^^^ Because of the steep terrain, the images were mapprojected onto the Copernicus 30 m DEM (:numref:`initial_terrain`). We name that DEM ``ref.tif``. (Ensure the DEM is relative to WGS84 and not EGM96, and convert if necessary; see :numref:`conv_to_ellipsoid`.) .. figure:: ../images/grand_mesa_copernicus_dem.png :scale: 50% :name: grand_mesa_copernicus_dem The Copernicus 30 DEM for the area of interest. Some of the topographic signal, including cliff edges and trees will be noticeable in the error images produced below. Mapprojection of the two images (:numref:`mapproj-example`):: proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" for i in 1 2; do mapproject -t dg \ --nodes-list nodes_list.txt \ --tr 0.4 \ --t_srs "$proj" \ ref.tif ${i}.tif ${i}.xml ${i}.map.tif done Here the exact cameras were used for mapprojection (option ``-t dg``). In earlier versions of ASP this was slow, and the faster RPC model was used (``-t rpc``). Here we did not use the adjustments from ``bundle_adjust``, as it appears that the original cameras are already quite accurate. We will incorporate those into subsequent steps, however. Stereo ^^^^^^ Stereo was done with the ``asp_mgm`` algorithm. We found that the option ``--subpixel-mode 1`` may result in somewhat more accurate interest point matches from disparity (for use later) but ``--subpixel-mode 9`` could produce a terrain model with less artifacts. This likely needs more study. We will proceed with ``--subpixel-mode 1`` here. Subpixel mode 3 (or 2) would likely be better than any of these, but are a lot slower. It also appears that it is preferable to use mapprojected images than some other alignment methods as those would result in more subpixel artifacts which would obscure the jitter signal which we will solve for. The option ``--max-disp-spread 100`` was used because the images had many clouds (:numref:`handling_clouds`). A large number of *dense interest point matches* from stereo disparity will be created (:numref:`jitter_ip`), to be used later to solve for jitter. :: parallel_stereo \ --max-disp-spread 100 \ --nodes-list nodes_list.txt \ --ip-per-image 10000 \ --stereo-algorithm asp_mgm \ --subpixel-mode 1 \ --processes 6 \ --alignment-method none \ --num-matches-from-disparity 60000 \ --bundle-adjust-prefix ba/run \ 1.map.tif 2.map.tif 1.xml 2.xml \ run_1_2_map/run \ ref.tif proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" point2dem --tr 0.4 --t_srs "$proj" --errorimage \ run_1_2_map/run-PC.tif A discussion regarding the projection to use above is in :numref:`point2dem_proj`. Alignment ^^^^^^^^^ The alignment step is not strictly necessary for WorldView images, as they are rather well-aligned already. Here we show the step for completeness. Align the stereo DEM to the reference DEM:: pc_align --max-displacement 100 \ run_1_2_map/run-DEM.tif ref.tif \ --save-inv-transformed-reference-points \ -o align/run proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" point2dem --tr 0.4 --t_srs "$proj" align/run-trans_reference.tif It is suggested to hillshade and inspect the obtained DEM and overlay it onto the hillshaded reference DEM. The ``geodiff`` command (:numref:`geodiff`) can be used to take their difference. Apply the alignment transform to the bundle-adjusted cameras, to align them with the reference terrain:: bundle_adjust \ --input-adjustments-prefix ba/run \ --match-files-prefix ba/run \ --skip-matching \ --initial-transform align/run-inverse-transform.txt \ 1.tif 2.tif 1.xml 2.xml \ --apply-initial-transform-only \ -o align/run If the clouds in ``pc_align`` were in reverse order, the direct transform must be used, *not the inverse* (:numref:`ba_pc_align`). Solving for jitter ^^^^^^^^^^^^^^^^^^ Copy the produced dense interest point matches for use in solving for jitter:: mkdir -p dense cp run_1_2_map/run-disp-1.map__2.map.match \ dense/run-1__2.match In ASP 3.4.0 or later, that file to be copied is named instead ``run_1_2_map/run-disp-1__2.match``, or so, reflecting the names of the raw images, as these matches are between the *original images*, even if produced from mapprojected images. See :numref:`jitter_ip` for a longer explanation regarding dense and sparse interest point matches. Solve for jitter. This commands expects raw (not mapprojected) images:: jitter_solve \ 1.tif 2.tif \ 1.xml 2.xml \ --input-adjustments-prefix align/run \ --match-files-prefix dense/run \ --num-iterations 50 \ --max-pairwise-matches 100000 \ --max-initial-reprojection-error 20 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --num-lines-per-position 400 \ --num-lines-per-orientation 400 \ --heights-from-dem ref.tif \ --heights-from-dem-uncertainty 20 \ --num-anchor-points 10000 \ --num-anchor-points-extra-lines 500 \ --anchor-dem ref.tif \ --anchor-weight 0.1 \ -o jitter/run The value of ``--heights-from-dem-uncertainty`` is very important. See :numref:`jitter_dem_constraint` regarding the DEM constraint, :numref:`jitter_camera` regarding camera constraints, and :numref:`jitter_anchor_points` regarding anchor points. The report files mentioned in :numref:`jitter_out_files` can be very helpful in evaluating how well the jitter solver worked, even before rerunning stereo. .. _fig_dg_jitter_pointmap_anchor_points: .. figure:: ../images/dg_jitter_pointmap_anchor_points.png :name: dg_jitter_pointmap_anchor_points The pixel reprojection errors per triangulated point (first column) and per anchor point (second column) before and after (left and right) solving for jitter. Blue shows an error of 0, and red is an error of at least 0.3 pixels. It can be seen in :numref:`fig_dg_jitter_pointmap_anchor_points` that after optimization the jitter (oscillatory pattern) goes away, but the errors per anchor point do not increase much. The remaining red points are because of the steep terrain. See :numref:`jitter_out_files` for description of these output files and how they were plotted. Redoing mapprojection and stereo ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The jitter solver produces optimized CSM cameras (:numref:`csm`), for all types of input cameras. One can reuse the previously created mapprojected images with the new cameras (:numref:`jitter_reuse_run`). Alternatively, here is how to recreate the mapprojected images:: proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" for i in 1 2; do mapproject -t csm \ --nodes-list nodes_list.txt \ --tr 0.4 --t_srs "$proj" \ ref.tif ${i}.tif \ jitter/run-${i}.adjusted_state.json \ ${i}.jitter.map.tif done Run stereo:: parallel_stereo \ --max-disp-spread 100 \ --nodes-list nodes_list.txt \ --ip-per-image 20000 \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --processes 6 \ --alignment-method none \ 1.jitter.map.tif 2.jitter.map.tif \ jitter/run-1.adjusted_state.json \ jitter/run-2.adjusted_state.json \ stereo_jitter/run \ ref.tif point2dem --tr 0.4 --t_srs "$proj" \ --errorimage \ stereo_jitter/run-PC.tif .. _jitter_reuse_run: Reusing a previous run ^^^^^^^^^^^^^^^^^^^^^^ In ASP 3.3.0 or later, the mapprojection need not be redone, and stereo can resume at the triangulation stage (:numref:`mapproj_reuse`). This saves a lot of computing. The commands in the previous section can be replaced with:: parallel_stereo \ --max-disp-spread 100 \ --nodes-list nodes_list.txt \ --ip-per-image 20000 \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --processes 6 \ --alignment-method none \ --prev-run-prefix run_1_2_map/run \ 1.map.tif 2.map.tif \ jitter/run-1.adjusted_state.json \ jitter/run-2.adjusted_state.json \ stereo_jitter/run \ ref.tif point2dem --tr 0.4 --t_srs "$proj" \ --errorimage \ stereo_jitter/run-PC.tif Note how we used the old mapprojected images ``1.map.tif`` and ``2.map.tif``, the option ``--prev-run-prefix`` pointing to the old run, while the triangulation is done with the new jitter-corrected CSM cameras. Validation ^^^^^^^^^^ The geodiff command (:numref:`geodiff`) can be used to take the absolute difference of the aligned DEM before jitter correction and the one after it:: geodiff --float --absolute align/run-trans_reference-DEM.tif \ stereo_jitter/run-DEM.tif -o stereo_jitter/run See :numref:`fig_dg_jitter_intersection_err_dem_diff` for results. .. _fig_dg_jitter_intersection_err_dem_diff: .. figure:: ../images/dg_jitter_intersection_err_dem_diff.png :name: dg_jitter_intersection_err_dem_diff The colorized triangulation error (:numref:`triangulation_error`) before and after solving for jitter, and the absolute difference of the DEMs before and after solving for jitter (left-to-right). It can be seen that the oscillatory pattern in the intersection error is gone, and the DEM changes as a result. The remaining signal is due to the steep terrain, and is rather small. .. _jitter_pleiades: Example 3: Airbus Pleiades ~~~~~~~~~~~~~~~~~~~~~~~~~~ In this section we will solve for jitter with Pleiades linescan cameras. The same approach applies to SPOT 6/7 (:numref:`spot67`) and PeruSat-1 (:numref:`perusat1`). SPOT 6/7 and PeruSat-1 support is available as of build 2026/03 (:numref:`release`). We will investigate the effects of two kinds of ground constraints: ``--tri-weight`` and ``--heights-from-dem`` (:numref:`jitter_ground`). The first constraint tries to keep the triangulated points close to where they are, and the second tries to tie them to a reference DEM. Note that if these are used together, the first one will kick in only in regions where there is no coverage in the provided DEM. The conclusion is that if the two kinds of ground constraints are weak, and the reference DEM is decent, the results are rather similar. The DEM constraint is preferred if a good reference DEM is available, and the cameras are aligned to it. See :numref:`jitter_limitations` regarding limitations of this program. Creation of terrain model ^^^^^^^^^^^^^^^^^^^^^^^^^ The site used is Grand Mesa, as in :numref:`jitter_dg`, and the two recipes also have similarities. First, a reference DEM (Copernicus) for the area is fetched, and adjusted to be relative to WGS84, creating the file ``ref-adj.tif`` (:numref:`initial_terrain`). Let the images be called ``1.tif`` and ``2.tif``. The Pleiades exact camera model names usually start with the prefix ``DIM``. Here, for simplicity, we will name them ``1.xml`` and ``2.xml``. *Do not use the Pleiades RPC camera models.* Their names start with the ``PRC`` prefix. Since the GSD specified in these files is about 0.72 m, this value is used in mapprojection of both images (:numref:`mapproj-example`):: proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" mapproject --processes 4 --threads 4 \ --tr 0.72 --t_srs "$proj" \ --nodes-list nodes_list.txt \ ref-adj.tif 1.tif 1.xml 1.map.tif and same for the other image. Since the two mapprojected images agree very well with the hillshaded reference DEM when overlaid in ``stereo_gui`` (:numref:`stereo_gui`), no bundle adjustment was used. Stereo was run, and we create dense interest point matches from disparity, that will be needed later:: outPrefix=stereo_map_12/run parallel_stereo \ --max-disp-spread 100 \ --nodes-list nodes_list.txt \ --ip-per-image 10000 \ --num-matches-from-disparity 90000 \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ --processes 6 \ --alignment-method none \ 1.map.tif 2.map.tif \ 1.xml 2.xml \ $outPrefix \ ref-adj.tif \ DEM creation:: proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" point2dem --t_srs "$proj" \ --errorimage \ ${outPrefix}-PC.tif See :numref:`point2dem_proj` for a discussion of the projection to use. Colorize the triangulation (ray intersection) error, and create some image pyramids for inspection later:: colormap --min 0 --max 1.0 ${outPrefix}-IntersectionErr.tif stereo_gui --create-image-pyramids-only \ --hillshade ${outPrefix}-DEM.tif stereo_gui --create-image-pyramids-only \ ${outPrefix}-IntersectionErr_CMAP.tif .. _pleiades_img_dem: .. figure:: ../images/pleiades_imag_dem.png :name: pleiades_image_and_dem Left to right: One of the input images, the produced hillshaded DEM, and the reference Copernicus DEM. It can be seen in :numref:`pleiades_img_dem` (center) that a small portion having snow failed to correlate. That is not a showstopper here. Perhaps adjusting the image normalization options in :numref:`stereodefault` may resolve this. Correcting the jitter ^^^^^^^^^^^^^^^^^^^^^ The jitter can clearly be seen in :numref:`pleiades_err` (left). There seem to be about a dozen oscillations. Hence, ``jitter_solve`` will be invoked with one position and orientation sample for each 500 image lines, which results in about 100 samples for these, along the satellite track. Note that earlier we used ``--num-matches-from-disparity 90000`` which created about 300 x 300 dense interest point matches for these roughly square input images. These numbers usually need to be chosen with some care. Copy the dense interest point matches found in stereo, using the convention (:numref:`ba_match_files`) expected later by ``jitter_solve``:: mkdir -p matches /bin/cp -fv stereo_map_12/run-disp-1.map__2.map.match \ matches/run-1__2.match In ASP 3.4.0 or later, that file to be copied is named instead ``run_1_2_map/run-disp-1__2.match``, or so, reflecting the names of the raw images. See :numref:`jitter_ip` for a longer explanation regarding dense interest point matches. Solve for jitter with the intrinsic ``--tri-weight`` ground constraint (:numref:`jitter_ground`). Normally, the cameras should be bundle-adjusted and aligned to the reference DEM, and then below the option ``--input-adjustments-prefix`` should be used, but in this case the initial cameras were accurate enough, so these steps were skipped. :: jitter_solve \ 1.tif 2.tif \ 1.xml 2.xml \ --match-files-prefix matches/run \ --num-iterations 50 \ --max-pairwise-matches 100000 \ --max-initial-reprojection-error 20 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --num-lines-per-position 500 \ --num-lines-per-orientation 500 \ --num-anchor-points 10000 \ --num-anchor-points-extra-lines 500 \ --anchor-dem ref-adj.tif \ --anchor-weight 0.1 \ -o jitter_tri/run See :numref:`jitter_camera` for a discussion of camera constraints. See :numref:`jitter_anchor_points` regarding anchor points. The report files mentioned in :numref:`jitter_out_files` can be very helpful in evaluating how well the jitter solver worked, even before rerunning stereo. Next, we invoke the solver with the same initial data, but with a constraint tying to the reference DEM, with the option ``--heights-from-dem ref-adj.tif``. Since the difference between the created stereo DEM and the reference DEM is on the order of 5-10 meters, we will use ``--heights-from-dem-uncertainty 20``. .. figure:: ../images/pleiades_err.png :name: pleiades_err Stereo intersection error (:numref:`triangulation_error`) before solving for jitter (left), after solving for it with the ``--tri-weight`` constraint (middle) and with the ``--heights-from-dem`` constraint (right). Blue = 0 m, red = 1 m. It can be seen in :numref:`pleiades_err` that any of these constraints can work at eliminating the jitter. .. figure:: ../images/pleiades_dem_abs_diff.png :name: pleiades_dem_diff Absolute difference of the stereo DEMs before and after solving for jitter. Left: with the ``--tri-weight`` constraint. Right: with the ``--heights-from-dem`` constraint. Blue = 0 m, red = 1 m. It is very instructive to examine how much the DEM changed as a result. It can be seen in :numref:`pleiades_dem_diff` that the reference DEM constraint changes the result more. Likely, a smaller value of the weight for that constraint could have been used. .. _jitter_aster: ASTER cameras ~~~~~~~~~~~~~ ASTER (:numref:`aster`) is a very good testbed for studying jitter because there are millions of free images over a span of 20 years, with many over the same location, and the images are rather small, on the order of 4,000 - 5,000 pixels along each dimension. See :numref:`jitter_limitations` regarding limitations of this program. Setup ^^^^^ In this example we worked on a rocky site in Egypt with a latitude 24.03562 degrees and longitude of 25.85006 degrees. Dozens of cloud-free stereo pairs are available here. The jitter pattern, including its frequency, turned out to be quite different in each stereo pair we tried, but the solver was able to minimize it in all cases. Fetch and prepare the data as documented in :numref:`aster_fetch`. Here we will work with dataset ``AST_L1A_00301062002090416_20231023221708_3693``. A reference Copernicus DEM can be downloaded per :numref:`initial_terrain`. Use ``dem_geoid`` to convert the DEM to be relative to WGS84. Initial stereo and alignment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ We will call the two images in an ASTER stereo pair ``out-Band3N.tif`` and ``out-Band3B.tif``. This is the convention used by ``aster2asp`` (:numref:`aster2asp`), and instead of ``out`` any other string can be used. The corresponding cameras are ``out-Band3N.xml`` and ``out-Band3B.xml``. The reference Copernicus DEM relative to WGS84 is ``ref.tif``. Bundle adjustment:: bundle_adjust -t aster \ --camera-weight 0.0 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --num-iterations 50 \ out-Band3N.tif out-Band3B.tif \ out-Band3N.xml out-Band3B.xml \ -o ba/run Not using ``-t aster`` will result in RPC cameras being used, which would lead to wrong results. The adjusted cameras are saved in CSM format (:numref:`csm_state`), which is needed for the jitter solver. The produced .adjust files should not be used as they save the adjustments only. Stereo was done with mapprojected images. The reference DEM was blurred a little as it is at the resolution of the images, and then any small misalignment between the images and the DEM may result in artifacts:: dem_mosaic --dem-blur-sigma 2 ref.tif -o ref_blur.tif Mapprojection in local stereographic projection:: 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' mapproject -t csm \ --tr 15 --t_srs "$proj" \ ref_blur.tif out-Band3N.tif \ ba/run-out-Band3N.adjusted_state.json \ out-Band3N.map.tif The same command is used for the other image. Both must use the same resolution in mapprojection (option ``--tr``). It is suggested to overlay and inspect in ``stereo_gui`` (:numref:`stereo_gui`) the produced images and the reference DEM and check for any misalignment or artifacts. ASTER is quite well-aligned to the reference DEM. Stereo with mapprojected images (:numref:`mapproj-example`) and DEM generation is run. Here the ``asp_mgm`` algorithm is not used as it smears the jitter signal:: parallel_stereo \ --stereo-algorithm asp_bm \ --subpixel-mode 1 \ --max-disp-spread 100 \ --num-matches-from-disparity 100000 \ out-Band3N.map.tif out-Band3B.map.tif \ ba/run-out-Band3N.adjusted_state.json \ ba/run-out-Band3B.adjusted_state.json \ stereo_bm/run \ ref_blur.tif point2dem --errorimage --t_srs "$proj" \ --tr 15 stereo_bm/run-PC.tif \ --orthoimage stereo_bm/run-L.tif We chose to use option ``--num-matches-from-disparity`` to create a large and uniformly distributed set of interest point matches. That is necessary because the jitter that we will solve for has rather high frequency. See :numref:`point2dem_proj` for a discussion of the projection to use in DEM creation. .. figure:: ../images/aster_dem_ortho_error.png :name: aster_dem_ortho_error Produced DEM, orthoimage and intersection error. The correlation algorithm has some trouble over sand, resulting in holes. The jitter is clearly visible, and will be solved for next. The color scale on the right is from 0 to 10 meters. The created DEM is brought in the coordinate system of the reference DEM. This results in a small shift in this case, but it is important to do this each time before solving for jitter. :: pc_align --max-displacement 50 \ stereo_bm/run-DEM.tif ref.tif \ -o stereo_bm/run-align \ --save-inv-transformed-reference-points point2dem --t_srs "$proj" --tr 15 \ stereo_bm/run-align-trans_reference.tif One has to be careful with the value of ``--max-displacement`` that is used (:numref:`pc_align`). Take the difference with the reference DEM after alignment:: geodiff stereo_bm/run-align-trans_reference-DEM.tif \ ref.tif -o stereo_bm/run The result of this is shown in :numref:`aster_jitter_dem_diff`. Apply the alignment transform to the cameras (:numref:`ba_pc_align`):: bundle_adjust -t csm \ --initial-transform \ stereo_bm/run-align-inverse-transform.txt \ --apply-initial-transform-only \ out-Band3N.map.tif out-Band3B.map.tif \ ba/run-out-Band3N.adjusted_state.json \ ba/run-out-Band3B.adjusted_state.json \ -o ba_align/run This will create new cameras in CSM format in the directory ``ba_align``. It is important to use here the inverse alignment transform, as we want to map from the stereo DEM to the reference DEM, and the forward transform would do the opposite, given how ``pc_align`` was invoked. If the produced difference of DEMs shows large residuals consistent with the terrain, one should consider applying more blur to the reference terrain and/or redoing mapprojection and stereo with the now-aligned cameras, and see if this improves this difference. .. _jitter_naming_convention: Solving for jitter ^^^^^^^^^^^^^^^^^^ Copy the dense match file (:numref:`dense_ip`) to follow the naming convention for unprojected (original) images:: mkdir -p jitter cp stereo_bm/run-disp-out-Band3N.map__out-Band3B.map.match \ jitter/run-out-Band3N__out-Band3B.match In ASP 3.4.0 or later, that file to be copied is named instead ``run_1_2_map/run-disp-Band3N__out-Band3B.match``, or so, reflecting the names of the raw images. The *naming convention for the match files* is:: -__.match where the image names are without the directory name and extension. See :numref:`jitter_ip` for more information on interest point matches. Here it is important to use a lot of match points and a low value for ``--num-lines-per-orientation`` and same for position, because the jitter has rather high frequency. Solve for jitter with the aligned cameras:: jitter_solve out-Band3N.tif out-Band3B.tif \ ba_align/run-run-out-Band3N.adjusted_state.json \ ba_align/run-run-out-Band3B.adjusted_state.json \ --max-pairwise-matches 100000 \ --num-lines-per-position 100 \ --num-lines-per-orientation 100 \ --max-initial-reprojection-error 20 \ --num-iterations 50 \ --match-files-prefix jitter/run \ --heights-from-dem ref.tif \ --heights-from-dem-uncertainty 20 \ --num-anchor-points 0 \ --anchor-weight 0.0 \ -o jitter/run The DEM uncertainty constraint was set to 20, as the image GSD is 15 meters. A higher value for the uncertainty is recommended, such as 200 or more, if the reference DEM has large systematic differences with the stereo DEM. A tight uncertainty constraint can result in unphysical oscillations in the terrain model. Here, ``--num-lines-per-position`` and ``--num-lines-per-orientation`` are quite low. This may result in high-frequency oscillations in the produced DEM. If so, these need to be increased by 2x or 4x. See :numref:`jitter_camera` for a discussion of camera constraints, and :numref:`jitter_anchor_points` regarding anchor points. The report files mentioned in :numref:`jitter_out_files` can be very helpful in evaluating how well the jitter solver worked, even before rerunning stereo. .. figure:: ../images/aster_jitter_pointmap.png :name: aster_jitter_pointmap Pixel reprojection errors (:numref:`jitter_out_files`) before (left) and after (right) solving for jitter. Compare with the ray intersection error in :numref:`aster_jitter_intersection_err`. Then, ``mapproject``, ``parallel_stereo`` and ``point2dem`` can be run again, with the new cameras created in the ``jitter`` directory. *Do not* reuse the previous stereo run. So, do not use the option ``--prev-run-prefix``. This introduces artifacts in the DEM. Likely it is because the cameras changed too much. It is suggested to re-mapproject with the optimized cameras, and re-run stereo from scratch. .. figure:: ../images/aster_jitter_intersection_err.png :name: aster_jitter_intersection_err The ray intersection error before (left) and after (right) solving for jitter. The scale is in meters. Same pattern is seen as for the pixel reprojection errors earlier. .. figure:: ../images/aster_jitter_dem_diff.png :name: aster_jitter_dem_diff The signed difference between the ASP DEM and the reference DEM, before (left) and after (right) solving for jitter. The scale is in meters. It can be seen that the jitter pattern is gone. .. _jitter_sat_sim: Jitter with synthetic cameras and orientation constraints ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The effectiveness of ``jitter_solve`` can be validated using synthetic data, when we know what the answer should be ahead of time. The synthetic data can be created with ``sat_sim`` (:numref:`sat_sim`). See a recipe in :numref:`sat_sim_linescan`. For example, one may create three linescan images and cameras, using various values for the pitch angle, such as -30, 0, and 30 degrees, modeling a camera that looks forward, down, and aft. One can choose to *not* have any jitter in the images or cameras, then create a second set of cameras with *pitch* (along-track) jitter. Then, ``jitter_solve`` can be used to solve for the jitter. It can be invoked with the images not having jitter and the cameras having the jitter. It is suggested to use the roll and yaw constraints (``--roll-weight`` and ``--yaw-weight``, with values on the order of 1e+4), to keep these angles in check while correcting the pitch jitter. Note that with non-synthetic cameras, need to add the ``--initial-camera-constraint`` option. The ``--heights-from-dem`` option should be used as well, to tie the solution to the reference DEM. We found experimentally that, if the scan lines for all the input cameras are perfectly parallel, then the jitter solver will not converge to the known solution. This is because the optimization problem is under-constrained. If the scan lines for different cameras meet at, for example, a 6-15 degree angle, and the lines are long enough to offer good overlap, then the "rigidity" of a given scan line will be able to help correct the jitter in the scan lines for the other cameras intersecting it, resulting in a solution close to the expected one. See a worked-out example for how to set orientation constraints in :numref:`jitter_linescan_frame_cam`. There, frame cameras are used as well, to add "rigidity" to the setup. .. _jitter_real_cameras: Constraining direction of jitter with real cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For synthetic cameras created with ``sat_sim`` (:numref:`sat_sim`), it is assumed that the orbit is a straight segment in projected coordinates (hence an ellipse if the orbit end points are at the same height above the datum). It is also assumed that such a camera has a fixed roll, pitch, and yaw relative to the satellite along-track / across-track directions, with jitter added to these angles (:numref:`sat_sim_roll_pitch_yaw`, and :numref:`sat_sim_jitter_model`). For a real linescan satellite camera, the camera orientation is variable and not correlated to the orbit trajectory. The ``jitter_solve`` program can then constrain each camera sample being optimized not relative to the orbit trajectory, but relative to initial camera orientation for that sample. That is accomplished by invoking the jitter solver as in :numref:`jitter_sat_sim`, with the additional option ``--initial-camera-constraint``. See the description of this option in :numref:`jitter_options`. This option is very experimental and its effectiveness was only partially validated. If having a rig, it is suggested to employ instead the strategy in :numref:`jitter_rig`. This option can be used with synthetic cameras as well. The results then will be somewhat different than without this option, especially towards orbit end points, where the overlap with other cameras is small. .. _jitter_linescan_frame_cam: Mixing linescan and frame cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This solver allows solving for jitter using a combination of linescan and frame (pinhole) cameras, if both of these are stored in the CSM format (:numref:`csm`). How to convert existing cameras to this format is described in :numref:`cam_gen_frame` and :numref:`cam_gen_linescan`. For now, this functionality was validated only with synthetic cameras created with ``sat_sim`` (:numref:`sat_sim`). In this case, roll and yaw constraints for the orientations of cameras being optimized are supported, for both linescan and frame cameras. When using real data, it is important to ensure they are acquired at close-enough times, with similar illumination and ground conditions (such as snow thickness). Here is a detailed recipe. Consider a DEM named ``dem.tif``, and an orthoimage named ``ortho.tif``. Let ``x`` be a column index in the DEM and ``y1`` and ``y2`` be two row indices. These will determine the path on the ground seen by the satellite. Let ``h`` be the satellite height above the datum, in meters. Set, for example:: x=4115 y1=38498 y2=47006 h=501589 opt="--dem dem.tif --ortho ortho.tif --first $x $y1 $h --last $x $y2 $h --first-ground-pos $x $y1 --last-ground-pos $x $y2 --frame-rate 45 --jitter-frequency 5 --focal-length 551589 --optical-center 2560 2560 --image-size 5120 5120 --velocity 7500 --save-ref-cams" Create nadir-looking frame images and cameras with no jitter:: sat_sim $opt \ --save-as-csm \ --sensor-type pinhole \ --roll 0 --pitch 0 --yaw 0 \ --horizontal-uncertainty \ "0.0 0.0 0.0" \ --output-prefix jitter0.0/n Create a forward-looking linescan image and camera, with no jitter:: sat_sim $opt \ --sensor-type linescan \ --roll 0 --pitch 30 --yaw 0 \ --horizontal-uncertainty \ "0.0 0.0 0.0" \ --output-prefix jitter0.0/f Create a forward-looking linescan camera, with no images, with pitch jitter:: sat_sim $opt \ --no-images \ --sensor-type linescan \ --roll 0 --pitch 30 --yaw 0 \ --horizontal-uncertainty \ "0.0 2.0 0.0" \ --output-prefix jitter2.0/f The tool ``cam_test`` (:numref:`cam_test`) can be run to compare the camera with and without jitter:: cam_test --session1 csm \ --session2 csm \ --image jitter0.0/f.tif \ --cam1 jitter0.0/f.json \ --cam2 jitter2.0/f.json This will show that projecting a pixel from the first camera to the ground and then projecting it back to the second camera will result in around 2 pixels of discrepancy, which makes sense given the horizontal uncertainty set above and the fact that our images are at around 0.9 m/pixel ground resolution. To reliably create reasonably dense interest point matches between the frame and linescan images, first mapproject (:numref:`mapproject`) them:: for f in jitter0.0/f.tif \ jitter0.0/n-1[0-9][0-9][0-9][0-9].tif; do g=${f/.tif/} # remove .tif mapproject --tr 0.9 \ dem.tif ${g}.tif ${g}.json ${g}.map.tif done This assumes that the DEM is in a local projection in units of meter. Otherwise the ``--t_srs`` option should be set. Create the lists of images, cameras, then a list for the mapprojected images and the DEM. We use individual ``ls`` command to avoid the inputs being reordered:: dir=ba mkdir -p $dir ls jitter0.0/f.tif > $dir/images.txt ls jitter0.0/n-1[0-9][0-9][0-9][0-9].tif >> $dir/images.txt ls jitter0.0/f.json > $dir/cameras.txt ls jitter0.0/n-1[0-9][0-9][0-9][0-9].json >> $dir/cameras.txt ls jitter0.0/f.map.tif > $dir/map_images.txt ls jitter0.0/n-1[0-9][0-9][0-9][0-9].map.tif >> $dir/map_images.txt ls dem.tif >> $dir/map_images.txt Run bundle adjustment to get interest point matches:: parallel_bundle_adjust \ --processes 10 \ --nodes-list nodes_list.txt \ --num-iterations 50 \ --ip-detect-method 1 \ --tri-weight 0.1 \ --camera-weight 0 \ --auto-overlap-params "dem.tif 15" \ --min-matches 5 \ --remove-outliers-params '75.0 3.0 10 10' \ --min-triangulation-angle 5.0 \ --ip-per-tile 500 \ --matches-per-tile 500 \ --max-pairwise-matches 6000 \ --image-list $dir/images.txt \ --camera-list $dir/cameras.txt \ --mapprojected-data-list $dir/map_images.txt \ -o ba/run Here we assumed a minimum triangulation convergence angle of 5 degrees between the two sets of cameras (:numref:`stereo_pairs`). See :numref:`pbs_slurm` for how to set up the computing nodes needed for ``--nodes-list``. We use ``--ip-detect-method 1`` to detect interest points. This invokes the SIFT feature detection method, which is more accurate than the default ``--ip-detect-method 0``. See :numref:`jitter_ip` for more information on interest point matches. We could have used a ground constraint above, but since we only need the interest points and not the camera poses, it is not necessary. The default camera position constraint is also on (:numref:`jitter_camera`). Solve for jitter with a ground constraint. Use roll and yaw constraints, to ensure movement only for the pitch angle:: jitter_solve \ --num-iterations 50 \ --max-pairwise-matches 3000 \ --clean-match-files-prefix \ ba/run \ --roll-weight 10000 \ --yaw-weight 10000 \ --max-initial-reprojection-error 100 \ --tri-weight 0.1 \ --tri-robust-threshold 0.1 \ --num-anchor-points 10000 \ --num-anchor-points-extra-lines 500 \ --anchor-dem dem.tif \ --anchor-weight 0.05 \ --heights-from-dem dem.tif \ --heights-from-dem-uncertainty 10 \ jitter0.0/f.tif \ jitter0.0/n-images.txt \ jitter2.0/f.json \ jitter0.0/n-cameras.txt \ -o jitter_solve/run The value of ``--heights-from-dem-uncertainty`` should be chosen with care. For non-synthetic cameras, need to add the option ``--initial-camera-constraint``. We used ``--max-pairwise-matches 3000`` as the linescan camera has many matches with each frame camera image, and there are many such frame camera images. A much larger number would be used if we had only a couple of linescan camera images and no frame camera images. The initial cameras were not bundle-adjusted and aligned to the reference DEM, as they were good enough. Normally one would use them as input to ``jitter_solve`` with the option ``--input-adjustments-prefix``. See :numref:`jitter_camera` for a discussion of camera constraints. Notice that the nadir-looking frame images are read from a list, in ``jitter0.0/n-images.txt``. This file is created by ``sat_sim``. All the images in such a list must be acquired in quick succession and be along the same satellite orbit portion, as the trajectory of all these cameras will be used to enforce the roll and yaw constraints. A separate list must be created for each such orbital stretch, then added to the invocation above. The same logic is applied to the cameras for these images. There is a single forward-looking image, but it is linescan, so there are many camera samples for it. The forward-looking camera has jitter, so we used its version from the ``jitter2.0`` directory, not the one in ``jitter0.0``. This solver does not create anchor points for the frame cameras. There are usually many such images and they overlap a lot, so anchor points are not needed as much as for linescan cameras. .. _jitter_rig: Rig constraints ~~~~~~~~~~~~~~~ This solver can model the fact that the input images have been acquired with one or more rigs. A rig can have one or more sensors. A sensor can be frame or linescan. Each rig can acquire several data collections. Each rig can have its own design. Rig configuration ^^^^^^^^^^^^^^^^^ Each rig must have a designated *reference sensor*. The transforms from the reference sensor to other sensors on that rig will be optimized by this solver. The intrinsics of all sensors for all rigs should be set in a single configuration file, in the format described in :numref:`rig_config`. This solver assumes no lens distortion, no offsets between clocks of individual sensors, and no depth measurements, so the entries for these in the rig configuration file should be left at nominal values. The entries for ``distorted_crop_size`` and ``undistorted_image_size`` should have the image dimensions. Assumptions ^^^^^^^^^^^ - When a rig has both linescan and frame sensors, the reference sensor must be linescan. That is because the linescan sensor acquires image data more frequently. - The *reference sensor* must acquire pose readings *frequently enough* that pose interpolation in time is accurate. For a frame reference sensor, that may mean that all frame sensors acquire data simultaneously, or the reference sensor captures data at a finer rate than any observed jitter. For a linescan reference sensor, the parameters ``--num-lines-per-position`` and ``--num-lines-per-orientation`` need to be smaller than 1/2 of the jitter period. - The acquisition times of all sensors on a rig during a contiguous observation stretch must be within the time range of the reference sensor, to avoid extrapolation in time. - The acquisition times are known very accurately. It is not assumed that acquisition times are synchronized between sensors, or that a frame camera has a fixed frame rate. Naming convention ^^^^^^^^^^^^^^^^^ The images and cameras passed in must be in one-to-one correspondence. The following format is expected for frame image and camera names:: /. Any separator characters in ```` *must not contain alphanumeric characters*, as that will confuse the program. The timestamp must be of the form ``.`` (no values such as 1e+7). Example:: data/acq1_10000.23_sensor1.tif All images acquired by a frame sensor in a given contiguous stretch of time must be listed in a text file of the form:: /.txt which is passed in to the solver as an image file would be otherwise. The same applies to the cameras. An example is below. Each linescan sensor image or camera name must be of the form:: /. Each contiguous acquisition with a rig must have a unique group name, that will be part of all filenames produced at that time. In other words, acquisitions with different rigs or by the same rig at another time need to have different group names. .. _jitter_no_baseline_example: Example of sensors on a rig with a very small baseline ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In this example we consider a rig with one linescan and one frame sensor. The rig looks straight down, so there is very little overall baseline between the sensors. The linescan sensor acquires a single wide and tall image, while the frame camera records many rectangular images of much smaller dimensions. They both experience the same jitter. The solver enforces the rig constraint between the sensors. The frame camera images are shown to be able to help correct the jitter. That is because each frame camera image can serve as a template, relative to which oscillations in the linescan sensor can be measured. The rig constraint is not essential here. This constraint is useful however when there are two sensors side-by-side, as then the rig helps constrain the yaw angle. Synthetic data for this example can be produced as in :numref:`jitter_linescan_frame_cam`, with the addition of modeling a rig, as in :numref:`sat_sim_rig`. A straightforward application of the jitter-solving recipe in :numref:`jitter_linescan_frame_cam` will fail, as it is not possible to triangulate properly the points seen by the cameras, since the rays are almost parallel or slightly diverging. The following adjustments are suggested: - Use ``--forced-triangulation-distance 500000`` for both bundle adjustment and jitter solving (the precise value here is not very important if the ``--heights-from-dem`` constraint is used, as the triangulated point will be adjusted based on the DEM). This will result in triangulated points even when the rays are parallel or a little divergent. - Use ``--min-triangulation-angle 1e-10`` in both bundle adjustment and jitter solving, to ensure we don't throw away features with small convergence angle, as that will be almost all of them. - Be generous with outlier filtering when there is a lot of jitter. Use, for example, ``--remove-outliers-params '75.0 3.0 10 10'`` in ``bundle_adjust`` and ``--max-initial-reprojection-error 20`` in ``jitter_solve``. - The option ``--heights-from-dem`` should be used (:numref:`heights_from_dem`). - Use ``--match-files-prefix`` instead of ``--clean-match-files-prefix`` in ``jitter_solve``, as maybe bundle adjustment filtered out too many good matches with a small convergence angle (if it was not invoked as suggested above). Here's the command for solving for jitter. This assumes interest points were produced with bundle adjustment. It is preferred that they are dense, as in previous sections. The same rig configuration can be used as when the input images and cameras are created with ``sat_sim`` (:numref:`sat_sim_rig`). :: jitter_solve \ --rig-config rig.txt \ --forced-triangulation-distance 500000 \ --min-matches 1 \ --min-triangulation-angle 1e-10 \ --num-iterations 50 \ --max-pairwise-matches 50000 \ --match-files-prefix ba/run \ --max-initial-reprojection-error 100 \ --num-anchor-points-per-tile 100 \ --num-anchor-points-extra-lines 500 \ --anchor-dem dem.tif \ --anchor-weight 0.01 \ --heights-from-dem dem.tif \ --heights-from-dem-uncertainty 10 \ data/nadir_linescan.tif \ data/nadir_frame_images.txt \ data/nadir_linescan.json \ data/nadir_frame_cameras.txt \ -o jitter/run The options ``--use-initial-rig-transforms``, ``--fix-rig-rotations``, ``--fix-rig-translations``, and ``--camera-position-uncertainty`` / ``--camera-position-weight`` can constrain the solution in various ways. A rig can be created by hand or generated by ``sat_sim`` to desired specifications (:numref:`sat_sim_rig`). The optimized rig will be saved in the output directory and can be inspected. The value of ``--heights-from-dem-uncertainty`` can be decreased if the input DEM is reliable and it is desired to tie the solution more to it. When the linescan sensor is much wider than the frame sensor, the anchor points should be constrained to the shared area of the produced images, to have the same effect on both sensors. That is accomplished with the option ``--anchor-weight-image``. It is important to examine the produced triangulated points and reprojection errors (:numref:`ba_err_per_point`) to ensure the points are well-distributed and that the errors are small and uniform. The ``orbit_plot`` program (:numref:`orbit_plot`) can inspect the camera orientations before and after optimization. .. _jitter_ref_terrain: Point cloud constraint ~~~~~~~~~~~~~~~~~~~~~~ In this scenario it is assumed that a reference point cloud is available that can constrain the jitter solution. The cloud can be in CSV format or a DEM. *The cloud must be well-aligned with the input cameras.* The cloud can be sparse. This workflow requires having filtered stereo disparity files (``F.tif``, :numref:`outputfiles`) as made by ``parallel_stereo`` (:numref:`parallel_stereo`). For the moment, *only a single stereo run is supported*. The algorithm projects a reference terrain point into one camera, propagates it through the stereo disparity to the other camera, and takes the pixel difference with the direct projection in the other camera (this difference is called the *residual* further down). The option ``--reference-terrain-uncertainty`` can set the uncertainty, with a higher uncertainty resulting in less weight for this constraint. The weight is also adjusted for the ground sample distance at each reference terrain point. The stereo runs should be produced either with the same images as invoked by the jitter solver, or with mapprojected versions of those (the same order of images need not be kept). The stereo run produces a file named ``{output prefix}-info.txt`` that has some information which ``jitter_solve`` will use. It is not important that the cameras or bundle-adjust prefixes passed to the jitter solving be the same as the ones for the stereo runs, but all the relevant files must be available, and the inputs to stereo must not be changed after the stereo runs are created. The list of stereo prefixes (:numref:`tutorial`), should be set via ``--stereo-prefix-list``. The jitter solver will peek in those runs and figure out how they relate to the images passed in to the solver. It will undo any alignment or mapprojection transforms as appropriate. This workflow does not preclude using the ``--heights-from-dem`` option or anchor points. It assumes that no rig is present and that all cameras are linescan. If the images are mapprojected, *this option loads fully in memory the DEM that was used for mapprojecting them*, for performance reasons, so it should not be too large. Both mapprojected images must use the same DEM. The solver will not fully load in memory the stereo disparity file (``F.tif``), but only portions as needed. Example usage:: echo {output prefix} > stereo_list.txt jitter_solve \ --max-pairwise-matches 50000 \ --match-files-prefix ba/run \ --num-iterations 50 \ --reference-terrain lidar.csv \ --max-num-reference-points 50000 \ --reference-terrain-uncertainty 10 \ --csv-format 1:lon,2:lat,3:height_above_datum \ --stereo-prefix-list stereo_list.txt \ --num-anchor-points-per-tile 50 \ --num-anchor-points-extra-lines 1000 \ --anchor-weight 0.1 \ --anchor-dem anchor_dem.tif \ left.tif right.tif \ left.json right.json \ -o jitter/run If the reference terrain is a CSV file rather than a DEM, and it has a custom projection, rather than geographic coordinates, the option ``--csv-srs`` must be set to specify the projection. Then adjust ``--csv-format`` accordingly above. The initial and final residuals for the reference terrain points are saved to disk in CSV format and should be examined (:numref:`jitter_ref_err`). Also examine the pixel reprojection errors (:numref:`jitter_tri_err`). The solver may be slow for very large runs. Then decreasing the number of iterations to 10 or so will help. The number of reference points can be decreased as well. .. _jitter_out_files: Output files ~~~~~~~~~~~~ Optimized cameras ^^^^^^^^^^^^^^^^^ The optimized CSM model state files (:numref:`csm_state`), which reduce the jitter and also incorporate the initial adjustments as well, are saved in the directory for the specified output prefix. The optimized state files can also be appended to the .cub files (:numref:`embedded_csm`). .. _jitter_errors_per_camera: Reprojection errors per camera ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The initial and final mean and median pixel reprojection error (distance from each interest point and camera projection of the triangulated point) for each camera, and their count, are written to:: {output-prefix}-initial_residuals_stats.txt {output-prefix}-final_residuals_stats.txt It is very important to ensure all cameras have a small reprojection error, ideally under 1 pixel, as otherwise this means that the cameras are not well-registered to each other, or that systematic effects exist, such as uncorrected lens distortion. .. _jitter_cam_offsets: Changes in camera positions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ This program writes, just like ``bundle_adjust``, a report file that records the changes in camera position (:numref:`ba_camera_offsets`). This can help with adjusting camera constraints (:numref:`jitter_camera`). .. _jitter_tri_offsets: Changes in triangulated points ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The distance between each initial triangulated point (after applying any initial adjustments, but before any DEM constraint) and final triangulated point (after optimization) are computed (in ECEF, in meters). The mean, median, and count of these distances, per camera, are saved to:: {output-prefix}-triangulation_offsets.txt This is helpful in understanding how much the triangulated points move. An unreasonable amount of movement may suggest imposing stronger constraints on the triangulated points (option ``--tri-weight``). .. _jitter_tri_err: Reprojection errors per triangulated point ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This program saves, just like ``bundle_adjust`` (:numref:`ba_err_per_point`), two .csv error files, before and after optimization. Each has the triangulated world position for every feature being matched in two or more images, the mean absolute residual error (pixel reprojection error in the cameras, :numref:`bundle_adjustment`) for each triangulated position, and the number of images in which the triangulated position is seen. The files are named:: {output-prefix}-initial_residuals_pointmap.csv and:: {output-prefix}-final_residuals_pointmap.csv Such CSV files can be colorized and overlaid with ``stereo_gui`` (:numref:`plot_csv`) to see at which triangulated points the residual error is large. These files are very correlated to the dense results produced with stereo (the DEM and intersection error, respectively, before and after solving for jitter), but the csv files can be examined without creating stereo runs, which can take many hours. If GCP are passed on input, they will be flagged in this file, just as for ``bundle_adjust`` (:numref:`ba_err_per_point`). .. _anchor_point_files: Anchor points ^^^^^^^^^^^^^ If anchor points are used, the coordinates of each anchor point and the norm of the pixel residual at those points are saved as well, to:: {output-prefix}-initial_residuals_anchor_points.csv and:: {output-prefix}-final_residuals_anchor_points.csv These have almost the same format as the earlier file. The key distinction is that each anchor point corresponds to just one pixel, so the last field from above (the count) is not present. When being optimized, the reprojection errors of anchor points are multiplied by the anchor weight. In this file they are saved without that weight multiplier, so they are in units of pixel. These can be plotted and colorized in ``stereo_gui`` as well, for example, with:: stereo_gui --colorize --min 0 --max 0.5 \ --plot-point-radius 2 \ {output-prefix}-final_residuals_anchor_points.csv Note that the initial ``pointmap.csv`` file created with the ``--heights-from-dem`` option reflects the fact that the triangulated points have had their heights set to the DEM height, which can be confusing. Yet in the final (optimized) file these points have moved, so then the result makes more sense. When using the ``--tri-weight`` option the true initial triangulated points and errors are used. .. _jitter_ref_err: Reference terrain residuals ^^^^^^^^^^^^^^^^^^^^^^^^^^^ If ``jitter_solve`` is run with the option ``--reference-terrain`` (:numref:`jitter_ref_terrain`), the pixel residuals for each reference terrain point are saved to:: {output-prefix}-initial_residuals_ref_terrain.csv {output-prefix}-final_residuals_ref_terrain.csv The format is the same as for pixel reprojection errors (:numref:`ba_err_per_point`). These files can be inspected in ``stereo_gui`` as well. Image and camera lists ^^^^^^^^^^^^^^^^^^^^^^ The list of input images will be saved to:: {output-prefix}-image_list.txt The list of optimized cameras will be saved to:: {output-prefix}-camera_list.txt This is convenient because both ``bundle_adjust`` and ``jitter_solve`` can read such lists with the ``--image-list`` and ``--camera-list`` options. .. _other_jitter_out: Other output files ^^^^^^^^^^^^^^^^^^ This program writes the stereo convergence angles (:numref:`ba_conv_angle`) and can compute the registration errors on the ground (:numref:`ba_mapproj_dem`). These are the same as for ``bundle_adjust``, hence the referral to the relevant sections for that program. .. _jitter_options: Command-line options for jitter_solve ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -o, --output-prefix Prefix for output filenames. -t, --session-type 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 :numref:`ps_options` for options. --robust-threshold Set the threshold for the robust reprojection error cost function, in pixels. Increasing this makes the solver focus harder on the larger errors. --min-matches Set the minimum number of matches between images that will be considered. --max-pairwise-matches Reduce the number of matches per pair of images to at most this number, by selecting a random subset, if needed. This happens when setting up the optimization, and before outlier filtering. It is suggested to set this to a large number, such as one million, to avoid filtering out too many matches. It may be reduced only if the number of images is large and the number of matches becomes unsustainable. --num-iterations Set the maximum number of iterations. --parameter-tolerance Stop when the relative error in the variables being optimized is less than this. --input-adjustments-prefix Prefix to read initial adjustments from, written by ``bundle_adjust``. Not required. Cameras in .json files in ISD or model state format can be passed in with no adjustments. --num-lines-per-position Resample the input camera positions and velocities, using this many lines per produced position and velocity. If not set, use the positions and velocities from the CSM file as they are. --num-lines-per-orientation Resample the input camera orientations, using this many lines per produced orientation. If not set, use the orientations from the CSM file as they are. Small values may result in high-frequency oscillations. --tri-weight The weight to give to the constraint that optimized triangulated points stay close to original triangulated points. A positive value will help ensure the cameras do not move too far, but a large value may prevent convergence. It is suggested to use here 0.1 to 0.5. This will be divided by ground sample distance (GSD) to convert this constraint to pixel units, since the reprojection errors are in pixels. See also ``--tri-robust-threshold``. Does not apply to GCP or points constrained by a DEM. --tri-robust-threshold The robust threshold to attenuate large differences between initial and optimized triangulation points, after multiplying them by ``--tri-weight`` and dividing by GSD. This is less than ``--robust-threshold``, as the primary goal is to reduce pixel reprojection errors, even if that results in big differences in the triangulated points. It is suggested to not modify this value, and adjust instead ``--tri-weight``. --heights-from-dem Assuming the cameras have already been bundle-adjusted and aligned to a known DEM, constrain the triangulated points to be close to the DEM. See also ``--heights-from-dem-uncertainty`` :numref:`jitter_dem_constraint`. --heights-from-dem-uncertainty The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value constrains more the triangulated points to the DEM specified via ``--heights-from-dem``. --heights-from-dem-robust-threshold The robust threshold to use to keep the triangulated points close to the DEM if specified via ``--heights-from-dem``. This is applied after the point differences are divided by ``--heights-from-dem-uncertainty``. It will attenuate large height difference outliers. It is suggested to not modify this value, and adjust instead ``--heights-from-dem-uncertainty``. --match-files-prefix Use the match files from this prefix. Matches are typically dense ones produced by stereo or sparse ones produced by bundle adjustment. The order of images in each interest point match file need not be the same as for input images. See also ``--isis-cnet``. --clean-match-files-prefix Use as input match files the \*-clean.match files from this prefix. The order of images in each interest point match file need not be the same as for input images. --matches-as-txt Read and write match files as plain text instead of binary. See :numref:`txt_match`. --isis-cnet Read a control network having interest point matches from this binary file in the ISIS control network format. This can be used with any images and cameras supported by ASP. --nvm Read a control network having interest point matches from this file in the NVM format. This can be used with any images and cameras supported by ASP. Camera poses will not be read from the NVM file. --max-initial-reprojection-error Filter as outliers any triangulated points that have a reprojection error (in pixels) of more than this value, with the initial cameras. Since jitter corrections are supposed to be small and cameras bundle-adjusted by now, this value need not be too big. Does not apply to GCP. --max-gcp-reproj-err If positive, after each pass remove GCPs whose mean reprojection error (averaged over all cameras seeing that point) is more than this value (in pixels). --num-anchor-points How many anchor points to create tying each pixel to a point on a DEM along the ray from that pixel to the ground. These points will be uniformly distributed across each input image. Only applies to linescan cameras. See also ``--anchor-weight`` and ``--anchor-dem``. --num-anchor-points-per-tile How many anchor points to create per 1024 x 1024 image tile. They will be uniformly distributed. Useful when images of vastly different sizes (such as frame and linescan) are used together. See also ``--anchor-weight`` and ``--anchor-dem``. --anchor-weight How much weight to give to each anchor point. Anchor points are obtained by intersecting rays from initial cameras with the DEM given by ``--heights-from-dem``. A larger weight will make it harder for the cameras to move, hence preventing unreasonable changes. --anchor-dem Use this DEM to create anchor points. --num-anchor-points-extra-lines Start placing anchor points this many lines before first image line and after last image line. --quat-norm-weight How much weight to give to the constraint that the norm of each quaternion must be 1. It is implicitly assumed in the solver that the quaternion norm does not deviate much from 1, so, this should be kept positive. --camera-position-uncertainty A file having on each line the image name and the horizontal and vertical camera position uncertainty (1 sigma, in meters). This strongly constrains the movement of cameras, potentially at the expense of accuracy. It is better to overestimate these. To have the same uncertainties for all cameras, pass instead of a file name two values separated by a comma (no spaces). See :numref:`ba_cam_constraints` for an example. See also ``--camera-position-uncertainty-power``. --camera-position-uncertainty-power A higher value makes the cost function rise more steeply when ``--camera-position-uncertainty`` is close to being violated. This is an advanced option. The default should be good enough. --camera-position-weight A soft constraint to keep the camera positions close to the original values. It is meant to prevent a wholesale shift of the cameras. It can impede the reduction in reprojection errors. It adjusts to the ground sample distance and the number of interest points in the images. The computed discrepancy is attenuated with ``--camera-position-robust-threshold``. It is suggested to use instead ``--camera-position-uncertainty``. See also :numref:`jitter_camera`. --camera-position-robust-threshold The robust threshold to attenuate large discrepancies between initial and optimized camera positions with the option ``--camera-position-weight``. This is less than ``--robust-threshold``, as the primary goal is to reduce pixel reprojection errors, even if that results in big differences in the camera positions. It is suggested to not modify this value, and adjust instead ``--camera-position-weight``. --rotation-weight A higher weight will penalize more deviations from the original camera orientations. This adds to the cost function the per-coordinate differences between initial and optimized normalized camera quaternions, multiplied by this weight, and then squared. No robust threshold is used to attenuate this term. See also :numref:`jitter_camera`. --smoothness-weight A weight to penalize high-frequency changes in the sequence of orientations in the linescan cameras being optimized. This is internally adjusted based on the initial curvature of the sequence of orientations. A value of 0.01 to 0.1 is recommended. This may impede convergence if high. Use with ``--camera-position-weight 1e+6`` or so, to tightly constrain the cameras positions. --roll-weight A weight to penalize the deviation of camera roll orientation as measured from the along-track direction. Pass in a large value, such as 1e+5. This is best used only with linescan cameras created with ``sat_sim`` (:numref:`sat_sim`). With non-synthetic cameras, add the ``--initial-camera-constraint`` option. Use with ``--camera-position-weight 1e+6`` or so, to tightly constrain the cameras positions. --yaw-weight A weight to penalize the deviation of camera yaw orientation as measured from the along-track direction. Pass in a large value, such as 1e+5. This is best used only with linescan cameras created with ``sat_sim`` (:numref:`sat_sim`). With non-synthetic cameras, add the ``--initial-camera-constraint`` option. Use with ``--camera-position-weight 1e+6`` or so, to tightly constrain the cameras positions. --initial-camera-constraint When constraining roll and yaw, measure these not in the satellite along-track/across-track/down coordinate system, but relative to the initial camera poses. This is experimental. Internally, the roll weight will then be applied to the camera pitch angle (rotation around camera *y* axis), because the camera coordinate system is rotated by 90 degrees in the sensor plane relative to the satellite coordinate system. The goal is the same, to penalize deviations that are not aligned with satellite pitch. --weight-image Given a georeferenced image with float values, for each initial triangulated point find its location in the image and closest pixel value. Multiply the reprojection errors in the cameras for this point by this weight value. The solver will focus more on optimizing points with a higher weight. Points that fall outside the image and weights that are non-positive, NaN, or equal to nodata will be ignored. See :numref:`limit_ip` for details. --anchor-weight-image Weight image for anchor points. Limits where anchor points are placed and their weight. Weights are additionally multiplied by ``--anchor-weight``. See also ``--weight-image``. --image-list A file containing the list of images, when they are too many to specify on the command line. Use in the file a space or newline as separator. See also ``--camera-list``. --camera-list A file containing the list of cameras, when they are too many to specify on the command line. If the images have embedded camera information, such as for ISIS, this file may be omitted, or specify the image names instead of camera names. --update-isis-cubes-with-csm-state Save the model state of optimized CSM cameras as part of the .cub files. Any prior version and any SPICE data will be deleted. Mapprojected images obtained with prior version of the cameras must no longer be used in stereo. --save-cnet-as-gcp Save the optimized control network, after outlier filtering, in the format used by ground control points (:numref:`bagcp`), including any input GCP. The xyz sigma is 1 meter for regular non-GCP triangulated points and the value of ``--heights-from-dem-uncertainty`` for DEM-constrained points. Can be inspected with ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`). --min-triangulation-angle The minimum angle, in degrees, at which rays must meet at a triangulated point to accept this point as valid. It must be a positive value. --forced-triangulation-distance When triangulation fails, for example, when input cameras are inaccurate, artificially create a triangulation point this far ahead of the camera, in units of meters. Some of these may be later filtered as outliers. --num-passes How many passes of jitter solving to do, with the given number of iterations in each pass. Each pass uses the previously refined cameras, which improves the accuracy of the DEM constraint and the final result. --mapproj-dem If specified, mapproject every pair of matched interest points onto this DEM and compute their distance, then percentiles of such distances for each image vs the rest and each image pair. This is done after bundle adjustment and outlier removal. Measured in meters. See :numref:`ba_mapproj_dem` for more details. --rig-config Assume that the cameras are acquired with a set of rigs with this configuration file (:numref:`jitter_rig`). The intrinsics will be read, but not the transforms between sensors, as those will be auto-computed (unless ``--use-initial-rig-transforms`` is set). The optimized rig, including the sensor transforms, will be saved. --fix-rig-translations Fix the translation component of the transforms between the sensors on a rig. --fix-rig-rotations Fix the rotation component of the transforms between the sensors on a rig. --use-initial-rig-transforms Use the transforms between the sensors (``ref_to_sensor_transform``) of the rig given by ``--rig-config``, instead of computing them from the poses of individual cameras. --reference-terrain An externally provided trustworthy reference terrain to use as a constraint. It can be either a DEM or a point cloud in CSV format. It must be well-aligned with the input cameras (:numref:`jitter_ref_terrain`). --reference-terrain-uncertainty The uncertainty of the reference terrain, in meters. A smaller value will result in a stronger constraint. It is suggested to not make this too small as it may prevent convergence. --max-num-reference-points Maximum number of (randomly picked) points from the reference terrain to use. A large value will greatly slow down the solver. --reference-terrain-robust-threshold The robust threshold, in pixels, for the option ``--reference-terrain``. It is suggested to not modify this value, and adjust instead ``--reference-terrain-uncertainty``. --fix-gcp-xyz If the GCP are highly accurate, use this option to not float them during the optimization. --use-lon-lat-height-gcp-error Constrain the triangulated points tied to GCP in the longitude, latitude, and height space, instead of ECEF. The standard deviations in the GCP file are applied accordingly. --overlap-limit Limit the number of subsequent images to search for matches to the current image to this value. By default try to match all images. --match-first-to-last Match the first several images to last several images by extending the logic of ``--overlap-limit`` past the last image to the earliest ones. --accept-provided-mapproj-dem Accept the DEM provided on the command line as the one mapprojection was done with, even if it disagrees with the DEM recorded in the geoheaders of input images. --threads Set the number threads to use. 0 means use the default defined in the program or in ``~/.vwrc``. Note that when using more than one thread and the Ceres option the results will vary slightly each time the tool is run. --cache-size-mb Set the system cache size, in MB, for each process. -h, --help Display the help message. -v, --version Display the version of software. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/lronac2mosaic.rst ================================================ .. _lronac2mosaic: lronac2mosaic.py ---------------- This tool takes in two LRONAC files (M*LE.IMG and M*RE.IMG) and produces a single noproj mosaic composed of the two inputs. It performs the following operations in this process: ``lronac2isis``, ``spiceinit``, ``lronaccal``, ``lronacecho``, an optional crop to the top-most lines, ``noproj``, and ``handmos``. The offsets used in ``handmos`` are calculated using an ASP internal tool called ``lronacjitreg`` and is similar in functionality to the ISIS command ``hijitreg``. Offsets need to be calculated via feature measurements in image to correct for imperfections in camera pointing. The angle between LE and RE optics changes slightly with spacecraft temperature. Optionally, ``lronac2mosiac.py`` can be given many IMG files all at once. The tool will then look at image names to determine which should be paired and mosaicked. The tool will also spawn multiple processes of ISIS commands were possible to finish the task faster. The max number of simultaneous processes is limited by the ``--threads`` option. Usage:: lronac2mosaic.py [options] Command-line options for lronac2mosaic.py: --manual Display the help message. -o, --output-dir Set the output folder (default is input folder). --stop-at-no-proj Stops processing after the noproj steps are complete. --resume-at-no-proj Start after ``spiceinit``, ``lronaccal``, ``lronacecho``, and the optional crop. This allows for custom preparation of the inputs. --spiceinit-options Options to pass to spiceinit. Specify in quotes. -c, --crop Process only this many first lines of the images. -t, --threads Specify the number of threads to use. -k, --keep Keep all intermediate files. ================================================ FILE: docs/tools/lvis2kml.rst ================================================ .. _lvis2kml: lvis2kml -------- A simple tool for use with LVIS (Land, Vegetation, and Ice Sensor) lidar data from the NASA IceBridge program. Generates a Google Earth compatible .kml files from either an LVIS data file (.TXT extension) or an LVIS boundary file (.xml extension). Using this tool makes it easy to visualize what region a given LVIS file covers and what the shape of its data looks like. If the output path is not passed to the tool it will generate an output path by appending ".kml" to the input path. This tool requires the simplekml Python package to run. One way to get this is to install the ASP Python tools, described at the end of :numref:`sparse_disp`. Usage:: > lvis2kml [options] [output path] Command-line options for lvis2kml: -h, --help Display this help message. --name Assign a name to the KML file. --color Draw plots in the named color. --skip When loading a data file, plot only every N-th point. Has no effect on boundary files. .. figure:: ../images/lvis2kml_snap.png :name: lvis2kml_example :alt: KML visualizations Example of KML visualizations produced with ``lvis2kml``. The output from both the boundary file (red) and the data file (green) with a point skip of 500 are shown in this image. The color saturation of data points is scaled with the elevation such that the points in the file with the least elevation show up as white and the highest points show up as the specified color. ================================================ FILE: docs/tools/mapproject.rst ================================================ .. _mapproject: mapproject ---------- The tool ``mapproject`` is used to orthorectify (mapproject) a camera image onto a DEM or datum. ASP is able to use mapprojected images to run stereo, see :numref:`mapproj-example`. The ``mapproject`` program can be run using multiple processes and can be distributed over multiple machines (options ``--nodes-list`` and ``--processes``). This is particularly useful for ISIS cameras, as in that case any single process must use only one thread due to the limitations of ISIS. The tool splits the image up into tiles, distributes the tiles to sub-processes, and then merges the tiles into the requested output image. If the input image is small but takes a while to process, smaller tiles can be used to start more simultaneous processes (use the parameters ``--tile-size`` and ``--processes``). It is important to note that processing more tiles at a time may actually slow things down, if all processes write to the same disk and if processing each tile is dominated by the speed of writing to disk. Hence some benchmarking may be necessary for your camera type and storage setup. The grid size, that is the dimension of pixels on the ground, set via the ``--tr`` option, should be in units as expected by the projection string obtained either from the DEM to project onto, or, if specified, from the ``--t_srs`` option. If the grid size is not set, it will be estimated as the mean *ground sampling distance (GSD)*. See the ``--tr`` option for how this affects the extent of the output image. If the resulting mapprojected images are used for stereo, all mapprojected images should have the same grid size and projection (:numref:`mapproj-res`). .. _mapproj_auto_proj: Determination of projection ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use the option ``--t_srs`` to set a desired output projection. The projection should be local to the area of interest, in units of meter. If this is not set, the projection from the DEM will be used, unless it is the ``longlat`` projection. In that case a good output projection is auto-determined. For Earth, with the WGS84 datum, the auto-determined projection is UTM with an auto-computed zone, except for latitudes above 84 degrees North and below 80 degrees South, where the `NSDIC polar stereographic projections `_ are used. For other Earth datums and other planetary bodies, the automatic determination produces a local stereographic projection. The projection center is found by a median calculation based on a sample of image pixels. Or consider using the cylindrical equal area projection. To ensure the automatic projection determination is always invoked, overriding all other cases from above, use ``--t_srs auto``. All mapprojected images passed to stereo should use the same projection and grid size (:numref:`mapproj-example`). Examples ~~~~~~~~ Earth image with auto projection ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mapproject an image with a pinhole camera (:numref:`pinholemodels`), with a grid size of 2 meters, for Earth (WGS84):: mapproject --tr 2.0 DEM.tif image.tif camera.tsai output.tif If the DEM has a ``longlat`` projection, a projection in meters is found first (:numref:`mapproj_auto_proj`). Moon image with a custom projection ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mapproject a .cub file (:numref:`moc_tutorial`). Such a file has both image and camera information. The planetary body is the Moon. Use a custom stereographic projection:: proj="+proj=stere +lat_0=-85.364 +lon_0=31.238 +R=1737400 +units=m +no_defs" The grid size is set to 1 meter/pixel:: mapproject --tr 1.0 --t_srs "$proj" DEM.tif image.cub output.tif RPC camera with bundle adjustment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mapproject an image file with an RPC camera model (:numref:`rpc`) in XML format. Use bundle-adjusted cameras (:numref:`bundle_adjust`):: mapproject -t rpc --bundle-adjust-prefix ba/run \ DEM.tif image.tif camera.xml output.tif Here, the grid size is auto-determined. See :numref:`rpc` for other ways of specifying the RPC camera model. CSM camera ^^^^^^^^^^ Mapproject with the CSM camera model (:numref:`csm`):: mapproject -t csm DEM.tif image.cub camera.json output.tif .. _mapproj_refmap: Preexisting projection and grid size ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The projection and grid size of a given mapprojected image can be borrowed when mapprojecting another image:: mapproject -t rpc \ --ref-map image1_map.tif \ DEM.tif image2.tif camera2.xml \ image2_map.tif This becomes important for stereo, when the two input mapprojected images must share these attributes (:numref:`mapproj-example`). Multiple camera models ^^^^^^^^^^^^^^^^^^^^^^ A DigitalGlobe / Maxar camera file has both an exact linescan model and an approximate RPC model. The RPC model is somewhat faster to use. To choose between these with ``mapproject``, invoke it either with ``-t dg`` or ``-t rpc``. See :numref:`dg_tutorial` for more information. Mapproject with no DEM ^^^^^^^^^^^^^^^^^^^^^^ Mapproject onto the surface of zero height above a datum:: mapproject -t rpc WGS84 image.tif image.xml output.tif Valid datum names include WGS84, NAD83, NAD27, D_MOON, D_MARS, and MOLA. .. _mapproj_metadata: Saved metadata ~~~~~~~~~~~~~~ The output image will have the following metadata saved to its geoheader: * ``INPUT_IMAGE_FILE``, the input image name. * ``BUNDLE_ADJUST_PREFIX``, the bundle adjustment prefix. Set to ``NONE`` if not present. * ``CAMERA_MODEL_TYPE``, this is the session name, such as set with ``-t rpc``. * ``CAMERA_FILE``, the camera file used on input. Can be empty if the camera is contained within the input image. * ``DEM_FILE``, the DEM used in mapprojection. These metadata values are used to undo the mapprojection in stereo triangulation (:numref:`mapproj_reuse`). The geoheader can be inspected with ``gdalinfo`` (:numref:`gdal_tools`). In addition, if the cameras have been bundle-adjusted, the translation and quaternion rotation from the .adjust file will be saved to the fields ``ADJUSTMENT_TRANSLATION`` and ``ADJUSTMENT_QUATERNION``. This is useful for having mapprojection be reproducible if the separately stored ``.adjust`` files are not available. These fields are editable with ``image_calc`` (:numref:`image_calc_metadata`), but this is not recommended. .. _mapproj_isis: ISIS compatibility ~~~~~~~~~~~~~~~~~~ ISIS is in the process of merging in logic for the `cam2map `_ program that, when called with ``asp_map=true``, uses the same per-pixel projection algorithm as ``mapproject``. When the grid size is not specified, each program auto-computes it from the camera and DEM, and the results may differ slightly (under 1e-6 relative error) due to implementation details. The produced projection bounds may disagree somewhat as well. However, given the same inputs and the same grid size, these programs will create results that agree to float numerical precision at every grid point. Example with camera in cube file ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Consider an LRO NAC (:numref:`lronac-example`) image having the camera information in the .cub file and an equicylindrical DEM on the Moon. Set up the projection string:: proj="+proj=eqc +lat_ts=0 +lon_0=15.3 +x_0=0 +y_0=0 +R=1737400 +units=m +no_defs" Run both programs with the same inputs and grid size:: mapproject --tr 1.2 --t_srs "$proj" \ dem.tif image.cub output_asp.tif cam2map asp_map=true useproj=true \ projstring="$proj" \ pixres=mpp resolution=1.2 \ dem=dem.tif from=image.cub to=output_isis.cub The ``--tr`` option in ``mapproject`` and ``pixres=mpp resolution=`` in ``cam2map`` both set the grid size (ground sample distance) in meters per pixel. The DEM must be a GeoTIFF file with pixel values representing height above datum, in meters. Example with CSM camera model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use a CSM (:numref:`csm`) camera model from an ISD file instead of the SPICE camera in the cube. Assume the projection string is defined as above. :: mapproject --tr 1.2 --t_srs "$proj" \ dem.tif image.cub image.json output_asp.tif cam2map asp_map=true useproj=true \ projstring="$proj" \ pixres=mpp resolution=1.2 \ dem=dem.tif isd=image.json \ from=image.cub to=output_isis.cub The CSM and SPICE camera models differ somewhat in implementation. When comparing map-projected images obtained with the two, the pixel difference may be on the order of 1e-4, and the extents may differ too. However, ``mapproject`` and ``cam2map asp_map=true`` will still agree to float numerical precision at every grid point, when the same CSM camera model is used as input to both. The ``isd`` parameter requires CSM plugins to be installed, which is the default in recent versions of ISIS. Example with preexisting map ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If an existing georeferenced image or .cub file is available, say named ``ref.cub``, its projection, extent, and grid size can be reused:: cam2map asp_map=true dem=dem.tif \ map=ref.cub matchmap=true \ from=image.cub to=output_isis.cub A PVL ``.map`` file with these projection parameters can also be passed to the ``map`` argument. Using a georeferenced image supports a wider range of projections, since GDAL reads the projection directly from the file. Validation ^^^^^^^^^^ The two results can be compared with :ref:`geodiff`:: geodiff output_isis.cub output_asp.tif -o run gdalinfo -stats run-diff.tif The expected pixel difference should be on the order of 1e-7 or less. The ``gdalinfo`` command can also be employed to verify that both outputs have the same projection, extent, and grid size. Running stereo ^^^^^^^^^^^^^^ Images mapprojected with ``cam2map asp_map=true`` do not retain the original camera information in the cube header. The original cameras must be provided as additional arguments to ``parallel_stereo`` (:numref:`parallel_stereo`). The first two arguments are the mapprojected images and the next two are the cameras:: parallel_stereo \ left_cam2map.cub right_cam2map.cub \ left.cub right.cub \ run/run \ --dem dem.tif \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 point2dem --tr 1.2 run/run-PC.tif This is the same workflow as stereo with ISIS mapprojected images (:numref:`mapproj_with_cam2map`), where the camera arguments are the original unprojected .cub files. The DEMs produced with these two invocations should agree with nearly float precision if invoked with the same choices of parameters. Saved metadata ^^^^^^^^^^^^^^ When ``cam2map`` is run with ``asp_map=true``, the output .cub file contains an ``AspMapproject`` PVL group with the same fields as ``mapproject`` saves in the GeoTIFF geoheader (:numref:`mapproj_metadata`): ``INPUT_IMAGE_FILE``, ``BUNDLE_ADJUST_PREFIX``, ``CAMERA_MODEL_TYPE``, ``CAMERA_FILE``, and ``DEM_FILE``. This group can be inspected with ``gdalinfo -mdd all`` or ``catlab``. Other cam2map options ^^^^^^^^^^^^^^^^^^^^^ The ``cam2map`` options ``minlat``, ``maxlat``, ``minlon``, ``maxlon`` are supported in ``asp_map`` mode. Since cam2map can only create mapprojected cube files with projection in meters, these input bounds will be converted to projected units for the input projection. When the option ``pixres`` is not set, the default value is used (``camera``), which amounts to auto-determining the grid size from the camera and DEM. This is the same behavior as for ``mapproject`` when the ``--tr`` option is not set. This implementation supports multi-band inputs with float values. ASP's ``mapproject`` program can handle single-band float images and RGB images. For other multi-band inputs (including RGBA), only the first band is used. When comparing with ``cam2map`` on multi-band inputs, ``mapproject`` results correspond to the first band of the ``cam2map`` output. The ``defaultrange`` option is partially supported: ``defaultrange=camera`` unlocks the ``minlat``/``maxlat``/``minlon``/``maxlon`` overrides, and ``defaultrange=map`` uses the map file's extent. Other values are silently ignored (bounds are auto-computed from the camera footprint and DEM). The ``cam2map`` options ``interp``, ``warpalgorithm``, ``patchsize``, ``trim``, ``occlusion``, and ``lonseam`` are ignored in ``asp_map`` mode, which always uses per-pixel bicubic interpolation. Grid snapping and output extent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When ``cam2map`` is run with ``asp_map=true``, the output grid is snapped to integer multiples of the grid size, consistent with ``mapproject``. The produced extent goes half a grid pixel beyond the snapped grid on each side, because the grid is at pixel centers. Usage ~~~~~ :: mapproject [options] .. _mapproj_options: Command-line options ~~~~~~~~~~~~~~~~~~~~ --t_srs Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). See :numref:`mapproj_auto_proj` for details. --tr Set the output file resolution (ground sample distance) in target georeferenced units per pixel. This may be in meters or degrees, depending on the projection. The center of each output pixel will be at integer multiples of this grid size, unless ``--gdal-tap`` is set. -t, --session-type Select the stereo session type to use for processing. See :numref:`ps_options` for the list of types. --t_projwin Limit the mapprojected image to this region, with the corners given in georeferenced coordinates (xmin ymin xmax ymax). See also ``--gdal-tap``. --t_pixelwin Limit the mapprojected image to this region, with the corners given in pixels (xmin ymin xmax ymax). Max is exclusive. --gdal-tap Ensure that the output image bounds (as printed by ``gdalinfo``, :numref:`gdal_tools`) are integer multiples of the grid size (as set with ``--tr``). When ``--t_projwin`` is set and its entries are integer multiples of the grid size, that precise extent will be produced on output. This functions as the GDAL ``-tap`` option. --bundle-adjust-prefix Use the camera adjustment obtained by previously running bundle_adjust with this output prefix. --ref-map Read the projection and grid size from this mapprojected image (:numref:`mapproj_refmap`). --processes Number of processes to use on each node (the default is for the program to choose). --num-processes Same as --processes. Used for backwards compatibility. --nodes-list List of available computing nodes to use. If not set, use the local machine. See also :numref:`pbs_slurm`. --tile-size Size of square tiles to break up processing into. Each tile is run by an individual process. The default is 1024 pixels for ISIS cameras, as then each process is single-threaded, and 5120 pixels for other cameras, as such a process is multi-threaded, and disk I/O becomes a bigger consideration. --mpp Set the output file resolution in meters per pixel. --ppd Set the output file resolution in pixels per degree. --datum-offset When projecting to a datum instead of a DEM, add this elevation offset to the datum. --ot Output data type, when the input is single channel. 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. This option will be ignored for multi-channel images, when the output type is set to be the same as the input type. --nearest-neighbor Use nearest neighbor interpolation instead of bicubic interpolation. *This is not recommended, as it can result in artifacts.* --mo 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. --query-projection Display the computed projection information, estimated ground sample distance, and projected bounding box. Save the projection as a WKT file named ``.wkt``. Quit afterwards. --query-pixel Trace a ray from this input image pixel (values start from 0) to the ground. Print the intersection point with the DEM as lon, lat, height, then as DEM column, row, height. Quit afterwards. --parallel-options Options to pass directly to GNU Parallel. --no-geoheader-info Do not write information in the geoheader. Otherwise mapproject will write the camera model type, the bundle adjustment prefix used, the rotation and translation from the .adjust file, the DEM it mapprojected onto, and the value of the ``--mo`` option. --nodata-value No-data value to use unless specified in the input image. --suppress-output Suppress output from sub-processes. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB, for each process. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`. -v, --version Display the version of software. -h, --help Display the help message. ================================================ FILE: docs/tools/multi_stereo.rst ================================================ .. _multi_stereo: multi_stereo ------------ The ``multi_stereo`` program takes as input a set of images and cameras, runs pairwise stereo between each image/camera and the next one in the list, filters the produced points clouds, fuses them, and creates a mesh. The input cameras are found using Structure-from-Motion. For the moment, this program is very tied to ``rig_calibrator`` (:numref:`rig_calibrator`). It will become more generic and versatile with time. In particular, logic is planned for automatically selecting stereo pairs and for distributing and load-balancing all resulting processing jobs over multiple machines. Examples ^^^^^^^^ Here we will create a mesh of a small portion of the International Space Station (ISS), based on images acquired with the `Astrobee `_ robot (later this example will be expanded to a full module). In this example it is very important to choose for pairwise stereo images with a convergence angle of about 5-10 degrees. A smaller convergence angle results in unreliable depth determination, while for a bigger one the scene changes enough sometimes that stereo correlation can be erroneous, resulting in artifacts. Note that ``rig_calibrator`` (as well as ``bundle_adjust`` and ``parallel_stereo``) compute the convergence angles. Then, ``pc_filter`` was used for filtering blunders according to many geometric criteria. The 7-image dataset used below, the full recipe, and output mesh, are available for `download `_. See another example in :numref:`rig_msl`. That one runs stereo on pairs of images created with a stereo rig onboard the MSL Curiosity rover. Creation of camera models ~~~~~~~~~~~~~~~~~~~~~~~~~ We follow the approach in :numref:`rig_calibrator`, but with a rig consisting of just one camera. The camera intrinsics and the images are used to find the camera poses:: theia_sfm --rig-config camera_config.txt \ --images 'images/nav_cam/*jpg' \ --out-dir theia_out Note that the images are stored in the ``nav_cam`` subdirectory, and each image name consists of a number and an image extension, following the conventions used by ``rig_calibrator``, even though here we have just a single sensor acquiring all images. Next is refinement of camera poses and registration to world coordinates (this requires first manually picking some features with known 3D positions in the images, per :numref:`rig_calibrator_registration`):: rig_calibrator \ --rig-config camera_config.txt \ --nvm theia_out/cameras.nvm \ --camera-poses-to-float "nav_cam" \ --intrinsics-to-float "" \ --num-iterations 100 \ --num-passes 2 \ --num-overlaps 10 \ --registration \ --hugin-file control_points.pto \ --xyz-file xyz.txt \ --out-dir rig_out Registration to world coordinates is optional. It is still suggested to use at least some rough guesses for where the world positions of some points are. The camera configuration will not be deformed in order to fit precisely the measurements; a single best-fit similarity transform will be applied to the whole setup. Running stereo and mesh creation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As mentioned earlier, the geometry of the scene being imaged requires some careful choices of parameters for stereo. Then, this tool calls several other tools under the hood, so options for those should be set as well. Here's a recipe which works reasonably well:: maxDistanceFromCamera=3.0 stereo_opts=" --stereo-algorithm asp_mgm --alignment-method affineepipolar --ip-per-image 10000 --min-triangulation-angle 0.5 --global-alignment-threshold 5 --session nadirpinhole --no-datum --corr-seed-mode 1 --max-disp-spread 300 --ip-inlier-factor 0.4 --nodata-value 0" pc_filter_opts=" --max-camera-ray-to-surface-normal-angle 75 --max-valid-triangulation-error 0.0025 --max-distance-from-camera $maxDistanceFromCamera --blending-dist 50 --blending-power 1" mesh_gen_opts=" --min_ray_length 0.1 --max_ray_length $maxDistanceFromCamera --voxel_size 0.01" multi_stereo \ --rig_config rig_out/rig_config.txt \ --camera_poses rig_out/cameras.txt \ --undistorted_crop_win '1100 700' \ --rig_sensor nav_cam \ --first_step stereo \ --last_step mesh_gen \ --stereo_options "$stereo_opts" \ --pc_filter_options "$pc_filter_opts" \ --mesh_gen_options "$mesh_gen_opts" \ --out_dir stereo_out The surface resolution of the cameras is on the order of 1 mm (0.001 meters), the camera is about 1-3 meters from the surface, hence a good value for the triangulation error was about 0.0025 meters, and the points in the cloud were binned (before meshing) into voxels of size 0.005 meters. Later some of these choices will be automated, or scale-independent parameters will be provided. The value ``--max-disp-spread 300`` is about right for this case, but should normally be omitted as sometimes it may restrict the disparity unnecessarily. There are three steps happening above, namely: * stereo: Runs ``parallel_stereo`` (:numref:`parallel_stereo`) and writes a point cloud in .tif format for each image/camera in the list and the next one. This is the most time-consuming step. * pc_filter: For each point cloud runs ``pc_filter`` (:numref:`pc_filter`) and writes filtered point clouds in .tif and .pcd formats, and a textured mesh for that run in .obj format. The .pcd file is in left camera's coordinates. The .obj file is for individual stereo run inspection purposes. * mesh_gen: Use ``voxblox_mesh`` (:numref:`voxblox_mesh`) to fuse the filtered point clouds in .pcd format and create a mesh in .ply format. The images are undistorted internally before stereo is run. (The undistortion step may be optional in future versions.) See ``--first_step`` and ``--last_step`` in :numref:`multi_stereo_command_line` for how to choose which processing steps to run. This tool also has controls for the range of images to run. Creating a textured mesh ~~~~~~~~~~~~~~~~~~~~~~~~ The obtained mesh can be post-processed (smoothed, hole-filled, etc.) using a handful of CGAL-based tools shipped with ASP (:numref:`cgal_tools`). Then, it can be textured with the original images using the ``texrecon`` tool (:numref:`texrecon`) as:: texrecon --rig_config rig_out/rig_config.txt \ --camera_poses rig_out/cameras.txt \ --mesh stereo_out/nav_cam/fused_mesh.ply \ --rig_sensor nav_cam \ --undistorted_crop_win '1100 700' \ --out_dir stereo_out This produces ``stereo_out/nav_cam/texture.obj``. .. figure:: ../images/bumble_dock_texture.png :name: bumble_dock_texture :alt: Bumble dock texture Fused .ply mesh and textured .obj file produced by ``voxblox_mesh`` and ``texrecon`` (left and right). Here, no smoothing or hole-filling of the meshes was used (:numref:`cgal_tools`). See :numref:`sfm_iss` for an example of mesh and texture creation for depth data. Handling issues ^^^^^^^^^^^^^^^ If the produced mesh is noisy, it is suggested to inspect individual .obj files produced by each stereo pair, the triangulation error of each filtered point cloud (fourth band, extractable with ``gdal_translate -b 4``), and the blending weight files saved by ``pc_filter``. One may need to decrease the value of ``--max-valid-triangulation-error``, use less of the boundary image region (``--undistorted_crop_win``) or redo the bundle adjustment with ``rig_calibrator``. .. _multi_stereo_command_line: Command-line options for multi_stereo ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --rig_config Rig configuration file. --rig_sensor Which rig sensor images to use. Must be among the sensors specified via ``--rig_config``. To use images from several sensors, pass in a quoted list of them, separated by a space. --camera_poses Read images and camera poses for this sensor from this list. --out_dir The directory where to write the stereo output, textured mesh, other data. --stereo_options Options to pass to ``parallel_stereo``. Use double quotes around the full list and simple quotes if needed by an individual option, or vice-versa. --pc_filter_options Options to pass to ``pc_filter``. --mesh_gen_options Options to pass to ``voxblox_mesh`` for mesh generation. --undistorted_crop_win The dimensions of the central image region to keep after the internal undistortion step and before using it in stereo. Normally 85% - 90% of distorted (actual) image dimensions would do. Suggested the Astrobee images: sci_cam: '1250 1000' nav_cam: '1100 776'. haz_cam: '250 200'. --first_step Let the first step run by this tool be one of: 'stereo', 'pc_filter', or 'mesh_gen'. This allows resuming a run at a desired step. The stereo subdirectories are deleted before that step takes place. --last_step The last step run by this tool. See ``--first_step`` for allowed values. --first-image-index The index of the first image to use for stereo, in the list of images. Indices start from 1. By default, use all the images. --last-image-index The index of the last image to use for stereo, in the list of images. Indices start from 1. By default, use all the images. --left Instead of running pairwise stereo between every image and the next one given in ``--camera_poses``, use every image from this list and corresponding one from the list given by the ``--right`` option. --right To be used with ``--left``. -h, --help Show this help message and exit. ================================================ FILE: docs/tools/n_align.rst ================================================ .. _n_align: n_align ------- This tool can be used to jointly align a set of two or more point clouds, hence it extends the functionality of ``pc_align`` (:numref:`pc_align`). It implements the ICP flavor from :cite:`toldo2010global`, more exactly, `this MATLAB algorithm `_. This program does not scale well for large clouds. In practice, ``pc_align`` is preferred. Usage:: n_align -o This tool supports the same types of data on input and output as ``pc_align``, except for LAZ COPC files. Even for two clouds this algorithm is not the same as the ones that are part of ``pc_align``. This algorithm is expected to be more robust to outliers than the regular ICP in ``pc_align`` since it uses a cross-check. Yet, it may not handle a large translation difference between the clouds as well. In that case, given a set of clouds, one can first use ``pc_align`` to align all other clouds to the first one, then invoke this algorithm for joint alignment while passing the obtained alignment transforms as an argument to this tool, to be used as initial guesses. The option to use for this, as shown below for simplicity for three clouds, is:: --initial-transforms 'identity.txt run_12/run-transform.txt run_13/run-transform.txt' where the file ``identity.txt`` contains the 4 |times| 4 identity matrix (the transform from the first cloud to itself), and ``run_12/run`` is the output prefix for ``pc_align`` when invoked on the first and second clouds, etc. The final transforms output by this tool will incorporate the initial guesses. This tool should be less sensitive than ``pc_align`` to the order of the clouds since any two of them are compared against each other. The number of iterations and number of input points used will dramatically affect its performance, and likely the accuracy. Cropping all clouds to the same region is likely to to improve both run-time and the results. Command-line options for n_align: --num-iterations Maximum number of iterations. --max-num-points Maximum number of (randomly picked) points from each cloud to use. --csv-format 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`` (a Cartesian coordinate system with origin at planet center is assumed, with the units being in meters), ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees, the radius is measured in meters from planet center), ``3:lat 2:lon 1:height_above_datum``, ``1:easting 2:northing 3:height_above_datum`` (need to set ``--csv-srs``; the height above datum is in meters). Can also use radius_km for column_type, when it is again measured from planet center. --csv-srs The PROJ or WKT string to use to interpret the entries in input CSV files. --datum 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 - NAD27 - Earth (alias for WGS_1984) - Mars (alias for D_MARS) - Moon (alias for D_MOON) --semi-major-axis Explicitly set the datum semi-major axis in meters. --semi-minor-axis Explicitly set the datum semi-minor axis in meters. -o, --output-prefix Specify the output prefix. The computed alignment transforms and, if desired, the transformed clouds, will be saved to names starting with this prefix. --save-transformed-clouds Apply the obtained alignment transforms to the input clouds and save them. --initial-transforms-prefix The prefix of the transforms to be used as initial guesses. The naming convention is the same as for the transforms written on output. --initial-transforms Specify the initial transforms as a list of files separated by spaces and in quotes, that is, as ``'trans1.txt ... trans_n.txt'``. --relative-error-tolerance Stop when the change in the error divided by the error itself is less than this. --align-to-first-cloud Align the other clouds to the first one, rather than to their common centroid. --verbose Print the alignment error after each iteration. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/orbit_plot.rst ================================================ .. _orbit_plot: orbit_plot.py ------------- The ``orbit_plot.py`` program is a Python script that takes an input one or more orbital sequences of cameras, and plots the camera orientation as it changes along the orbit. Each orientation is decomposed into roll, pitch, and yaw components (in degrees), that are plotted separately (:numref:`orbit_plot_fig`). If a second set of orbital sequences exists, for example, if the camera orientations are later optimized, with ``bundle_adjust`` (:numref:`bundle_adjust`) or ``jitter_solve`` (:numref:`jitter_solve`), this tool can overlay the two sets. Each orbital sequence consists of several frame (pinhole) cameras, in .tsai (:numref:`pinholemodels`) or CSM (:numref:`csm_frame`) format, or it can be a single linescan camera in the CSM model state format (:numref:`csm_state`). At some point this program will also plot the camera positions. The ``orbit_plot`` conda environment should be first installed as described in :numref:`orbit_plot_dependencies`. Satellite coordinate system ~~~~~~~~~~~~~~~~~~~~~~~~~~~ This program estimates the camera orientation relative to the local satellite coordinate system at each sample, which is defined as follows: the origin is the camera center (in ECEF), the *x* axis is tangent to the orbit, so it points along the track, the z axis points roughly from the camera center to the planet center while being perpendicular to the *x* axis, and the *y* axis is perpendicular to the *x* and *z* axes, so it points across-track. Given that we have only a set of samples for the camera center, all these axes are approximate, and it is implicitly assumed that the planet and orbit are somewhat spherical (circular). Hence, the produced plots have some small inaccuracies. When synthetic cameras are created with ``sat_sim`` (:numref:`sat_sim`), that tool can save the precise satellite orientation if invoked with the option ``--save-ref-cams``. This program can then read those orientations if called with the ``--use-ref-cams`` option. Roll, pitch, and yaw angles ~~~~~~~~~~~~~~~~~~~~~~~~~~~ The camera orientation relative to the local satellite coordinate system is decomposed into roll, pitch, and yaw angles, measured in degrees. When all these angles are zero, the camera looks straight down. For a positive pitch, the camera looks somewhat ahead. See :numref:`roll_pitch_yaw_def` for a more technical discussion of these angles and for the relation between the camera and satellite coordinate systems. Examples ~~~~~~~~ Plot one dataset ^^^^^^^^^^^^^^^^ We assume that ASP's ``bin`` directory is in the path, otherwise the full path to this script must be specified below. Then, the dependencies are should be installed (:numref:`orbit_plot_dependencies`). Plot a single set of cameras along a given orbit:: ~/miniconda3/envs/orbit_plot/bin/python \ $(which orbit_plot.py) \ --dataset dataset1/ \ --dataset-label dataset1 \ --orbit-id pinhole-fwd \ --orbit-label pinhole We assume that the cameras are in the directory ``dataset1/``, and their names in that directory contain the string ``pinhole-fwd``. The slash (``/``) at the end of the directory name is important, on reading the tool will match the dataset name, followed by some characters, followed by the orbit id. The rest of a camera name can be any string ending in ``.tsai`` or ``.json``. Hence, only the cameras satisfying this convention will be read. See an illustration in :numref:`orbit_plot_fig`. For finer-grained control, the desired cameras can be put in a list. For example:: ls dataset1/pinhole*.tsai > pinhole_list.txt ~/miniconda3/envs/orbit_plot/bin/python \ $(which orbit_plot.py) \ --list pinhole_list.txt \ --dataset-label dataset1 \ --orbit-id pinhole-fwd \ --orbit-label pinhole Then, only the images in the list that match the value of ``--orbit-id`` will be read. If these are synthetic cameras created with ``sat_sim`` (:numref:`sat_sim`), consider adding the option ``--use-ref-cams`` (this option does not work with ``--list``). Plot two datasets ^^^^^^^^^^^^^^^^^ We consider two camera datasets, with the camera names starting with:: dataset1/pinhole-fwd dataset2/run-pinhole-fwd The naming convention used above is suggestive of the first dataset being a set of input cameras, while the second being created from the first using ``bundle_adjust`` or ``jitter_solve``. The string ``pinhole-fwd`` is the orbit id. :: ~/miniconda3/envs/orbit_plot/bin/python \ $(which orbit_plot.py) \ --dataset dataset1/,dataset2/run- \ --orbit-id pinhole-fwd \ --dataset-label data1,data2 \ --orbit-label pinhole Notice how above the shared orbit id is specified separately from the dataset names. Here we omitted the option ``--use-ref-cams``. It may be convenient on occasion to read from lists instead, while respecting the pattern in in ``--orbit-id``:: ~/miniconda3/envs/orbit_plot/bin/python \ $(which orbit_plot.py) \ --list list1.txt,list2.txt \ --orbit-id pinhole-fwd \ --dataset-label data1,data2 \ --orbit-label pinhole These two datasets will be plotted on top of each other, in red and blue, respectively. .. figure:: ../images/orbit_plot.png :name: orbit_plot_fig :alt: orbit_plot_fig Roll, pitch, and yaw angle (in degrees) for two orbital sequences, shown in red and blue. The option ``--subtract-line-fit`` can be used to see finer-level differences between the two sequences. Plot two orbital groups, including linescan cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Here, in addition to a group of pinhole cameras looking forward, before and after bundle adjustment, we also consider a group consisting of a single linescan camera, which looks down, before and after solving for jitter. It is assumed that the linescan camera will have many position and orientation samples, and that these numbers of samples are equal (unless the option ``--use-ref-cams`` is used). The only change in the command above is that the orbit id now has the additional value ``linescan-nadir``, so the plot command becomes:: ~/miniconda3/envs/orbit_plot/bin/python \ $(which orbit_plot.py) \ --dataset dataset1/,dataset2/run- \ --orbit-id pinhole-fwd,linescan-nadir \ --dataset-label data1,data2 The cameras before optimization will be in directory ``dataset1/``, with the pinhole camera names starting with ``pinhole-fwd``, and the linescan camera name starting with ``linescan-nadir``. The cameras after optimization will start with ``dataset2/run-``, followed again by the orbit id. The resulting plot will have two rows, showing the two orbital groups. .. _orbit_plot_dependencies: Dependencies ~~~~~~~~~~~~ This tool needs Python 3 and some additional Python packages to be installed with ``conda``. Conda can be obtained from https://docs.conda.io/en/latest/miniconda.html Run:: ./Miniconda3-latest-Linux-x86_64.sh on Linux, and the appropriate version on OSX (this script needs to be made executable first). Use the suggested:: $HOME/miniconda3 directory for installation. Activate conda. The needed packages can be installed, for example, as follows: :: conda create -n orbit_plot numpy scipy pyproj matplotlib See also ~~~~~~~~ The tool ``sfm_view`` (:numref:`sfm_view`) can be used to visualize cameras in orbit. The ``asp_plot`` package (:numref:`asp_plot`) can generate diagnostic plots and PDF reports from ASP stereo outputs. Command-line options ~~~~~~~~~~~~~~~~~~~~ --dataset The dataset to plot. Only one or two datasets are supported (for example, before and after optimization). Each dataset can have several types of images, given by ``--orbit-id``. The dataset is the prefix of the cameras, such as "cameras/" or "opt/run-". It is to be followed by the orbit id, such as, "nadir" or "aft". If more than one dataset, they will be plotted on top of each other. --list Instead of specifying ``--dataset``, load the cameras listed in this file (one per line). Only the names matching ``--orbit-id`` will be read. If more than one list, separate them by comma, with no spaces in between. --orbit-id The id (a string) that determines an orbital group of cameras. If more than one, separate them by comma, with no spaces in between. --dataset-label The label to use for each dataset in the legend. If more than one, separate them by comma, with no spaces in between. If not set, will use the dataset name. --orbit-label The label to use for each orbital group (will be shown as part of the title). If more than one, separate them by comma, with no spaces in between. If not set, will use the orbit id. --num-cameras Plot only the first this many cameras from each orbital sequence. By default, plot all of them. --use-ref-cams Read from disk reference cameras that determine the satellite orientation. This assumes the first dataset was created with ``sat_sim`` with the option ``--save-ref-cams``. The naming convention assumes the additional ``-ref`` string as part of the reference camera names, before the filename extension. Without this option, the satellite orientations are estimated based on camera positions. --ref-list When ``--list`` is specified, read the reference cameras from this file. --subtract-line-fit If set, subtract the best line fit from the curves being plotted. If more than one dataset is present, the same line fit (for the first one) will be subtracted from all of them. This is useful for inspecting subtle changes. --use-rmse Compute and display the root mean square error (RMSE) rather than the standard deviation. This is useful when a systematic shift is present. See also ``--subtract-line-fit``. --trim-ratio Trim ratio. Given a value between 0 and 1 (inclusive), remove this fraction of camera poses from each sequence, with half of this amount for poses at the beginning and half at the end of the sequence. This is used only for linescan cameras, to not plot camera poses beyond image lines. For cameras created with ``sat_sim``, a value of 0.5 should be used. --figure-size Specify the width and height of the figure having the plots, in inches. Use two numbers with comma as separator (no spaces). --title Set this as the figure title, to be shown on top of all plots. --line-width Line width for the plots. --font-size Font size for the plots. --output-file Save the figure to this image file, instead of showing it on the screen. A png extension is recommended. -h, --help Display this help message. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/orbitviz.rst ================================================ .. _orbitviz: orbitviz -------- Produces a Google Earth KML file useful for visualizing camera positions. The input for this tool is one or more images and camera files. .. figure:: ../images/orbitviz_ge_result_600px.png :name: orbitviz_example :alt: KML visualization Example of a KML visualization produced with ``orbitviz`` depicting camera locations for the Apollo 15 Metric Camera during orbit 33 of the Apollo command module. Example:: orbitviz image[1-4].tif camera[1-4].tsai -o orbit.kml Usage:: orbitviz [options] Command-line options for orbitviz: -o, --output The output kml file that will be written. --linescan-line Get the camera position at this pixel line. --linescan-sample Get the camera position at this pixel sample. -s, --model-scale Scale the size of the coordinate axes by this amount. Ex: To scale axis sizes up to Earth size, use 3.66. -u, --use-path-to-dae-model Use this dae model to represent camera location. *Google Sketch up can create these.* -r, --reference-spheroid 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 - NAD27 - Earth (alias for WGS_1984) - Mars (alias for D_MARS) - Moon (alias for D_MOON) -t, --session-type 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 :numref:`ps_options` for options. --load-camera-solve Use a specialized display for showing the results of the ``camera_solve`` tool. When using this option, only pass in the path to the ``camera_solve`` output folder as a positional argument. Green lines drawn between the camera positions indicate a successful interest point match between those two images. --hide-labels Hide image names unless the camera is highlighted. --bundle-adjust-prefix Use the camera adjustment obtained by previously running bundle_adjust with this output prefix. --write-csv Write a csv file with the orbital data. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/ortho2pinhole.rst ================================================ .. _ortho2pinhole: ortho2pinhole ------------- Given an orthoimage, a raw image, and a sample pinhole camera model having camera intrinsics, this program computes a new pinhole camera model that best reflects how the orthoimage was created from the raw image, so it adds the extrinsic parameters (camera position and orientation) to the model. Example invocation:: ortho2pinhole raw_image.jpg ortho_image.tif \ sample_model.tsai output_model.tsai \ --camera-height 1459.9561 \ --orthoimage-height 886.5911 The .tsai pinhole model format is described in :numref:`pinholemodels`. The option ``--reference-dem`` can be used to specify a DEM from which to extract the ground height, instead of using the value in ``--orthoimage-height``. As a way of verifying the results, the ``mapproject`` program can be used to project the raw image with the produced camera model onto the reference DEM. The resulting image should have a similar position and orientation on the ground as the orthoimage. More context is given in :numref:`sfmicebridge`. Command-line options for ``ortho2pinhole``: --camera-estimate An estimated camera model used for location and pose estimate only. --max-translation The maximum distance the camera solution is allowed to move from camera-estimate. --camera-height 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. --orthoimage-height The approximate height above the datum, in meters, at which the orthoimage is positioned. We assume flat ground. See also ``--reference-dem``. --reference-dem If provided, extract from this DEM the heights above the ground rather than assuming the value in ``--orthoimage-height``. --ip-per-tile How many interest points to detect in each 1024^2 image tile (default: automatic determination). --ip-detect-method Interest point detection algorithm (0: Integral OBALoG, 1: OpenCV SIFT (default), 2: OpenCV ORB. Remove any existing ``.vwip`` files before recomputing interest points with a different method. --minimum-ip Don't create a camera model if fewer than this many interest point matches were found. --ip-inlier-factor Interest points inlier factor. --individually-normalize Individually normalize the input images instead of using common values. --skip-image-normalization Skip the step of normalizing the values of input images. --short-circuit No processing, just copy input intrinsic parameters to camera-estimate and write out. --show-error Print point error. --keep-match-file Don't delete the .match file after running. --write-gcp-file Write a ``bundle_adjust``-compatible GCP file (:numref:`bagcp`). --crop-reference-dem Crop the reference DEM to a generous area to make it faster to load. -v, --version Display the version of software. -h, --help Display the help message. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/otsu_threshold.rst ================================================ .. _otsu_threshold: otsu_threshold -------------- The ``otsu_threshold`` program takes as input a single-channel image and computes the optimal `Otsu threshold `_. See also `this overview `_ with some example images and thresholds plotted vs histograms at the very bottom of that page. If the input image is, for example, band 7 of a WorldView multispectral image, this will return a value for the threshold separating land from water (since water shows up rather dark in the infrared). If the input is an image of the Moon, with shadows present, the threshold will separate shadowed and lit regions. Note that the threshold value returned by this tool is not necessarily the position corresponding to the bottom of the "saddle" of the histogram of this image, if it is bi-modal (see the figure). To get that behavior, use instead ``bathy_threshold_calc.py`` (:numref:`bathy_threshold_calc`). .. figure:: ../images/otsu_threshold.png :name: otsu_threshold_example Illustration of the Otsu threshold. Example:: otsu_threshold image.tif It will produce output as follows:: Reading image: image.tif No nodata value present in the file. Number of image rows and columns: 7276, 8820 Picking a uniform sample of dimensions 7276, 8820 Number of bins in the histogram: 256 It may take several minutes to find the answer. Otsu threshold for image image.tif: 224.7686274509804 Usage:: otsu_threshold Command-line options for otsu_threshold: --num-samples The number of samples to pick from the image (more samples will result in more accuracy but will be slower). If not specified, hence set to -1, the full image will be used. --num-bins Number of bins to use for the histogram. A larger value is suggested if the image has some outlying pixel values. --nodata-value Use this nodata value instead of what is read from the file, if present. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/pansharp.rst ================================================ .. _pansharp: pansharp -------- This tool reads in a high resolution grayscale file and a low resolution RGB file and produces a high resolution RGB file. The output image will be at the resolution of the grayscale image and will cover the region where the two images overlap. Both images must have georeferencing information. This can either be projection information in the image metadata or it can be a separate Worldview format XML camera file containing four ground control points (if using the tool with Digital Globe images). Usage:: pansharp [options] Command-line options for pansharp: --min-value Manually specify the bottom of the input data range. --max-value Manually specify the top of the input data range. --gray-xml Look for georeference data here if not present in the grayscale image. --color-xml Look for georeference data here if not present in the RGB image. --nodata-value The nodata value to use for the output RGB file. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/parallel_bundle_adjust.rst ================================================ .. _parallel_bundle_adjust: parallel_bundle_adjust ---------------------- The ``parallel_bundle_adjust`` program is a modification of ``bundle_adjust`` (:numref:`bundle_adjust`) designed to distribute some of the preprocessing steps over multiple processes and multiple computing nodes. It uses GNU Parallel to manage the jobs in the same manner as ``parallel_stereo`` (:numref:`parallel_stereo`). An example is in :numref:`skysat_bundle_adjustment`. Setting up the nodes list is discussed in :numref:`pbs_slurm`. Processing steps ~~~~~~~~~~~~~~~~ The ``parallel_bundle_adjust`` tool has three processing steps: 0: statistics computation, 1: interest point matching, 2: optimization. Steps 0 and 1 produce the ``*-stats.tif`` and ``*.match`` files. Only the first two steps can be done in parallel. In the last step, ``bundle_adjust`` is invoked as a single process, with the data produced so far. Use of results ~~~~~~~~~~~~~~ The files created by ``parallel_bundle_adjust`` can be used by later invocations of ``bundle_adjust`` or with ``parallel_stereo`` with the options ``--match-files-prefix`` and ``--clean-match-files-prefix`` (:numref:`ba_options`). If ``bundle_adjust`` is called with the same output prefix as ``parallel_bundle_adjust``, and without the options above, it will try to see if some match files are missing and need to be created. To avoid that, use the options ``--force-reuse-match-files`` and ``--skip-matching``. Parallelization ~~~~~~~~~~~~~~~ The default number of processes per node is 1/4 of the number of cores on the head node, and the default number of threads per process is the number of cores on the head node over the number of processes. The number of launched jobs over all nodes is number of nodes times number of processes per node. Command-line options ~~~~~~~~~~~~~~~~~~~~ These options are in addition to the ones for ``bundle_adjust`` (:numref:`ba_options`). --nodes-list The list of computing nodes, one per line. If not provided, run on the local machine. -e, --entry-point Bundle adjustment entry point (start at this stage). Options: statistics and interest points per image = 0, interest point matching = 1, optimization = 2. --stop-point Bundle adjustment stop point (stop *before* this stage). Options: statistics = 0, matching = 1, optimization = 2, all = 3. --parallel-options Options to pass directly to GNU Parallel. --verbose Display the commands being executed. --processes The number of processes per node. The default is a quarter of the number of cores on the head node. --threads The number of threads per process. The default is the number of cores on the head node over the number of processes. --cache-size-mb Set the system cache size, in MB, for each process. -v, --version Display the version of software. -h, --help Display the help message. ================================================ FILE: docs/tools/parallel_sfs.rst ================================================ .. _parallel_sfs: parallel_sfs ------------ The program ``parallel_sfs`` is a wrapper around ``sfs`` (:numref:`sfs`) meant to divide the input DEM into tiles with overlap, run ``sfs`` on each tile as multiple processes, potentially on multiple machines, and then merge the results into a single output DEM. It has the same options as ``sfs``, and a few additional ones, as outlined below. An example for how to invoke this program is in :numref:`parallel_sfs_usage`. See :numref:`sfs_usage` for the larger context. If having many computing nodes, the option ``--nodes-list`` must be set, to ensure all nodes are used. Usage:: parallel_sfs -i -n -o \ [other options] Command-line options for ``parallel_sfs``: --tile-size Size of approximately square tiles to break up processing into (not counting the padding). --padding How much to expand a tile in each direction. This helps with reducing artifacts in the final mosaicked SfS output. --processes Number of processes to use on each node (the default is for the program to choose). --num-processes Same as ``--processes``. Used for backwards compatibility. --nodes-list A file containing the list of computing nodes, one per line. If not provided, run on the local machine. See also :numref:`pbs_slurm`. --threads How many threads each process should use. This will be changed to 1 for ISIS cameras when ``--use-approx-camera-models`` is not set (:numref:`sfs`), as ISIS is single-threaded. Not all parts of the computation benefit from parallelization. --parallel-options Options to pass directly to GNU Parallel. --resume Resume a partially done run. Only process the tiles for which the desired per-tile output files are missing or invalid (as checked by ``gdalinfo``). --suppress-output Suppress output of sub-calls. -v, --version Display the version of software. -h, --help Display the help message. ================================================ FILE: docs/tools/parallel_stereo.rst ================================================ .. _parallel_stereo: parallel_stereo --------------- The ``parallel_stereo`` program is the primary tool of the Ames Stereo Pipeline. It takes a stereo pair of images that overlap with corresponding cameras and creates an output point cloud image that can be processed into a visualizable mesh or a DEM using :ref:`point2mesh` and :ref:`point2dem` respectively. This program can distribute the stereo processing over multiple computing nodes if invoked with the ``--nodes-list`` option. It uses GNU Parallel to manage the jobs, a program that is shipped with the Stereo Pipeline. It expects that all nodes can connect to each other using ssh without password and that they share the same storage space. Usage:: parallel_stereo [options] [] See :numref:`tutorial` for more details. Many examples of this program are in :numref:`examples`. See :numref:`pbs_slurm` for how to set up this tool for PBS and SLURM systems. This program operates only on single channel (grayscale) images. Multi-channel images need to first be converted to grayscale or a single channel should be extracted with ``gdal_translate`` with the ``-b`` option. Processes and threads ~~~~~~~~~~~~~~~~~~~~~ It is suggested that after this program is started, one examine how well it uses the CPUs and memory on all nodes, especially at the correlation stage (:numref:`entrypoints`). One may want to set the ``--processes``, ``--threads-multiprocess``, and ``--threads-singleprocess`` options (:numref:`ps_options`), and also ``--corr-memory-limit-mb`` (:numref:`stereodefault`). Make sure that ``--nodes-list`` is set, otherwise only the head node will be used. Note that the SGM and MGM algorithms can be quite memory-intensive. For these, by default, the number of threads is set to 8, and the number of processes is the number of cores divided by the number of threads, on each node. Otherwise, the default is to use as many processes as there are cores. Multiple machines ~~~~~~~~~~~~~~~~~ This program has several stages, described in :numref:`entrypoints`. When the option ``--nodes-list`` is set, only the correlation, blending, subpixel refinement, and triangulation stages of ``parallel_stereo`` are spread over multiple machines, with the preprocessing and filtering stages using just one node, as they require global knowledge of the data. In addition, not all stages of stereo benefit equally from parallelization. Most likely to gain are stages 1 and 3 (correlation and refinement) which are the most computationally expensive. Output files ~~~~~~~~~~~~ This tool will create a set of output files (:numref:`outputfiles`). Internally some of them will be GDAL VRT files, that is, plain text virtual mosaics of files created by individual processes, with the actual files in subdirectories. ASP and GDAL tools are able to use these virtual files in the same way as regular binary TIF files. The files in subdirectories are combined into a single file at the end of the run, and the subdirectories are deleted (option ``--keep-only``). .. _ps_tiling: Tiling ~~~~~~ The input images are divided into tiles, that are processed in parallel. For many algorithms, each tile is padded. Then, the produced disparities overlap and are blended. The size of the tiles can be set with the ``--job-size-w`` and ``--job-size-h`` options. The default is 2048 x 2048 pixels, unless local alignment (:numref:`stereo_alg_overview`) is used, in which case it is 512 x 512 pixels (local alignment works better with smaller tiles). The size of the padding is set with ``--sgm-collar-size``. The default is 0 for the ``asp_bm`` algorithm, 256 for ``asp_sgm``/``asp_mgm``, and 128 with local alignment. The padding can be increased if artifacts at tile boundary are noticed. Resuming a run ~~~~~~~~~~~~~~ All the intermediate results produced by ``parallel_stereo``, up to but not including triangulation, can be reused if only the cameras or camera adjustments change (for example, if the cameras got moved, per :numref:`ba_pc_align`). An example is given in :numref:`mapproj_reuse`. Another one is in :numref:`bathy_reuse_run` (in the context of stereo with shallow water). If the program failed during correlation, such as because of insufficient memory, it can be told to resume without recomputing the existing good partial results with the option ``--resume-at-corr``. Output files ~~~~~~~~~~~~ The output files created by this program are described in :numref:`outputfiles`. .. _entrypoints: Processing stages ~~~~~~~~~~~~~~~~~ The ``parallel_stereo`` tool is written in Python, and invokes separate C++ executables for various steps in processing. These C++ executables have their own command-line options (:numref:`stereodefault`). Those options can be passed to ``parallel_stereo`` which will in turn pass them on as needed. By invoking each executable with no options, it will display the list of options it accepts. The steps run by ``parallel_stereo`` are as follows. The ``--entry-point`` and ``--stop-point`` options can be used to run only a portion of these steps. The program will stop *before* the stage indicated by ``--stop-point``. Step 0 (Preprocessing) Runs ``stereo_pprc``. Normalizes the two images and aligns them by locating interest points and matching them in both images. The program is designed to reject outlier interest points. This stage writes out the pre-aligned images and the image masks. It also computes the convergence angle for this stereo pair (for non-mapprojected images and with alignment method ``homography``, ``affineepipolar``, or ``local_epipolar``). Step 1 (Stereo correlation) Runs ``stereo_corr``. Performs correlation using various algorithms which can be specified via ``--stereo-algorithm``. It writes a disparity map ending in ``D.tif``. Step 2 (Blend) Runs ``stereo_blend``. Blend the borders of adjacent disparity map tiles obtained during stereo correlation. Needed for all stereo algorithms except the classical ``ASP_BM`` when run without local epipolar alignment. The result is the file ending in ``B.tif``. Step 3 (Sub-pixel refinement) Runs ``stereo_rfne``. Performs sub-pixel correlation that refines the disparity map. Note that all stereo algorithms except ``ASP_BM`` already do their own refinement at step 1, however further refinement can happen at this step if the ``--subpixel-mode`` option is set. This produces a file ending in ``RD.tif``. Step 4 (Outlier rejection) Runs ``stereo_fltr``. Performs filtering of the disparity map and (optionally) fills in holes using an inpainting algorithm. It creates ``F.tif``. Also computes ``GoodPixelMap.tif``. Step 5 (Triangulation) Runs ``stereo_tri``. Generates a 3D triangulated point cloud from the disparity map by intersecting rays traced from the cameras. The output filename ends in ``PC.tif``. Step 6 (Cleanup) If the run was successful, the data from run subdirectories are combined and the subdirectories are removed. See ``--keep-only``. This is followed usually by DEM creation with :ref:`point2dem`, which is not part of this program. .. _ps_options: Command-line options ~~~~~~~~~~~~~~~~~~~~ --nodes-list The list of computing nodes, one per line. If not provided, run on the local machine. Alternatively, specify the full ssh command for each node, including the port, so one command per line. See examples for PBS and SLURM in :numref:`pbs_slurm`. -t, --session-type Select the stereo session type to use for processing. Usually the program can select this automatically by the file extension except for xml cameras (if it has both DG and RPC models). Options and when to use: - nadirpinhole -- for satellites/aircraft with pinhole cameras (:numref:`skysat`, :numref:`sfmicebridge`). This equivalent to using ``pinhole`` and setting ``--datum``. The datum will be auto-guessed with ``nadirpinhole`` based on the camera center coordinates, if not set (only for Earth, Moon, and Mars). - pinhole -- ground-level cameras, not assuming a datum (:numref:`mer-example`). A datum can be set, however, with ``--datum``. - isis -- with planetary images stored in .cub files (:numref:`moc_tutorial`) - dg -- with Maxar / DigitalGlobe exact linescan cameras (:numref:`dg_tutorial`), which are implemented as CSM (:numref:`dg_csm`) - rpc -- with any RPC cameras (:numref:`rpc`) - spot5 -- SPOT 5 exact linescan camera (:numref:`spot5`) - spot -- SPOT 6/7 exact linescan camera (:numref:`spot67`) - aster -- exact ASTER camera model (:numref:`aster`) - perusat -- PeruSat-1 exact linescan camera model (:numref:`perusat1`) - opticalbar -- Optical Bar cameras (:numref:`kh4`) - csm -- Community Sensor Model (:numref:`csm`) - pleiades -- Pleiades satellites (:numref:`pleiades`) The next sessions are for mapprojected images (:numref:`mapproj-example`). If ``-t`` is specified as earlier, the sessions will be converted to the entities below automatically. - pinholemappinhole - isismapisis - dgmaprpc / dgmapdg - rpcmaprpc - spot5maprpc - spotmapspot - astermapaster / astermaprpc - opticalbarmapopticalbar - csmmapcsm / csmmaprpc - pleiadesmappleiades -e, --entry-point Stereo Pipeline entry point. Start at this stage. See :numref:`entrypoints`. --stop-point Stereo Pipeline stop point (stop at the stage *right before* this). --corr-seed-mode Correlation seed strategy (:numref:`corr_section`). --sparse-disp-options Options to pass directly to sparse_disp (:numref:`sparse_disp`). Use quotes around this string. --job-size-w Pixel width of input image tile for a single process. See :numref:`ps_tiling`. --job-size-h Pixel height of input image tile for a single process. See :numref:`ps_tiling`. --sgm-collar-size The padding around each tile to process. See :numref:`ps_tiling`. --processes The number of processes to use per node. --threads-multiprocess The number of threads to use per process when running multiple processes, for the correlation, subpixel refinement, and triangulation steps (:numref:`entrypoints`). --threads-singleprocess The number of threads to use when running a single process (for the pre-processing and filtering steps, :numref:`entrypoints`). --resume-at-corr Start at the correlation stage and skip recomputing the valid low and full-res disparities for that stage. Do not change ``--left-image-crop-win``, etc, when running this. --prev-run-prefix Start at the triangulation stage while reusing the data from this prefix. The new run can use different cameras, bundle adjustment prefix, or bathy planes (if applicable). Do not change crop windows, as that would invalidate the run. See :numref:`bathy_reuse_run` for an example. --keep-only If set to ``all_combined``, which is the default, at the end of a successful run combine the results from subdirectories into ``.tif`` files with the given output prefix, and delete the subdirectories. If set to ``essential``, keep only ``PC.tif`` and the files needed to recreate it (those ending with ``L.txt``, ``R.txt``, ``.exr``, ``-L.tif``, ``-F.tif``). If set to ``unchanged``, keep the run directory as it is. For fine-grained control, specify a quoted list of suffixes of files to keep, such as ``"L.txt R.txt .exr .match -L.tif -PC.tif"``. --verbose Display the commands being executed. --dry-run Do not launch the jobs, only print the commands that should be run. --ssh Specify the path to an alternate version of the ssh tool to use. --parallel-options Options to pass directly to GNU Parallel. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/parse_match_file.rst ================================================ .. _parse_match_file: parse_match_file.py ------------------- This tool reads an ASP match file in binary format as written by ``ipmatch`` (:numref:`ipmatch`), ``bundle_adjust`` (:numref:`bundle_adjust`), or ``stereo`` (:numref:`outputfiles`), and writes it as a text file, with each line having an interest point and other associated information. The program can be invoked in reverse, to create a binary match file from a text file. Such a match file can be viewed (:numref:`stereo_gui_view_ip`) and edited (:numref:`stereo_gui_edit_ip`) in ``stereo_gui``. It is assumed that the version of Python in the path has the ``numpy`` and ``argparse`` packages installed, and that ``parse_match_file.py`` is in the path. Examples ~~~~~~~~ :: python $(which parse_match_file.py) run/run-left__right.match \ run/run-matches.txt The reverse of this operation can be performed as:: python $(which parse_match_file.py) -rev run/run-matches.txt \ run/run-left__right.match Other functionality which may be used to understand interest points is the option ``--save-cnet-as-csv`` in ``bundle_adjust`` which saves the interest point matches in the plain text format used by ground control points (GCP). .. _parse_match_format: File format ~~~~~~~~~~~ The first line in the file has the number of matches in the left and right images. These are always the same. After this, the first half of the text file saved by this program has interest points for the left image, and the second half has corresponding points in the right image. Each such line has the following fields, separated by spaces:: x y ix iy orientation scale interest polarity octave scale_lv num_descr [descriptors] Here are is an example of the first two lines of such a file:: 25 25 2995.8699 636.7928 2996 637 -2.0879858 2.9508026 0.09294365 0 0 0 0 In this case there will be a total of 25 + 25 = 50 lines having interest points, after the first line, with each in the format of the second line. The only important values are the first two, which are the x and y coordinates of each interest point pixel, and the scale, which is treated as the uncertainty of the pixel in bundle adjustment (higher scale means less weight given during optimization). A larger value of the ``interest`` field means it may be more prominent (salient), though this is not employed in any way. As of of build 2026/02 (:numref:`release`), ASP supports operating on matches in text format. That uses however a simpler format (:numref:`txt_match`). Descriptors ~~~~~~~~~~~ If this program is invoked with the ``--save-descriptors`` option, the interest point descriptors are also saved in the text file. Otherwise their number is set to zero, and no descriptors are saved. Note that in either case the descriptors are not saved for the reverse operation, when converting from the text file back to the binary file. In practice that is not important, as descriptors are needed only when the interest points are matched during creation, and not for later use. Command-line options ~~~~~~~~~~~~~~~~~~~~ -rev, --reverse Convert a text file having matches into an ASP binary match file. --save-descriptors When converting a binary match file to text, save the interest point descriptors as well. -h, --help Display the help message. ================================================ FILE: docs/tools/pc_align.rst ================================================ .. _pc_align: pc_align -------- The ``pc_align`` programs aligns two point clouds. The supported algorithms are Iterative Closest Point (:numref:`pc_icp`), Nuth and Kaab (:numref:`nuth`), Fast Global Registration (:numref:`fgr`), and feature-based alignment (:numref:`pc_hillshade`). Some of the provided ICP implementations can handle a scale change, in addition to rotations and translations. Usage:: pc_align --max-displacement [other options] \ -o } The denser cloud must be the first one to be passed to this tool. This program is very sensitive to the value of ``--max-displacement`` (:numref:`pc_align_max_displacement`). An example is in :numref:`pc-align-example`. Validation and error metrics are discussed in :numref:`pc_align_validation` and :numref:`pc_align_error`. See the related program ``image_align`` (:numref:`image_align`). Several important things need to be kept in mind if ``pc_align`` is to be used successfully and give accurate results, as described below. The input point clouds ~~~~~~~~~~~~~~~~~~~~~~ Due to the nature of ICP, the first input point cloud, that is, the reference (fixed) cloud, should be denser than the second, source (movable) point cloud, to get the most accurate results. This is not a serious restriction, as one can perform the alignment this way and then simply invert the obtained transform if desired (``pc_align`` outputs both the direct and inverse transform, and can output the reference point cloud transformed to match the source and vice-versa). The user can choose how many points to pick from the reference and source point clouds to perform the alignment. The amount of memory and processing time used by ``pc_align`` is directly proportional to these numbers, ideally the more points the better. Pre-cropping to judiciously chosen regions may improve the accuracy and/or run-time. .. _pc_align_max_displacement: The max displacement option ~~~~~~~~~~~~~~~~~~~~~~~~~~~ In many typical applications, the source and reference point clouds are already roughly aligned, but the source point cloud may cover a larger area than the reference. The user should provide to ``pc_align`` the expected maximum distance (displacement) source points may move by as result of alignment, using the option ``--max-displacement``. This number will help remove source points too far from the reference point cloud which may not match successfully and may degrade the accuracy. If in doubt, this value can be set to something large but still reasonable, as the tool is able to throw away a certain number of unmatched outliers. At the end of alignment, ``pc_align`` will display the *observed* maximum displacement, a multiple of which can be used to seed the tool in a subsequent run. If an initial transform is applied to the source cloud (:numref:`prevtrans`), the outliers are thrown out *after* this operation. The observed maximum displacement is also between the source points with this transform applied and the source points after alignment to the reference. The :ref:`geodiff` program can find the vertical difference between two DEMs or a DEM and a CSV file. Likely a multiple of the standard deviation of this difference (for example, a factor of 5-10) can be a good value for ``--max-displacement``, assuming that there is no large horizontal misalignment. If a large horizontal misalignment exists, consider using feature-based alignment first (:numref:`pc_hillshade`). .. _align-method: Alignment method ~~~~~~~~~~~~~~~~ The alignment method can be set with the option ``--alignment-method`` (:numref:`pc_align_options`). The default is ``point-to-plane`` ICP. .. _pc_icp: ICP algorithms ^^^^^^^^^^^^^^ ASP provides several flavors of the Iterative Closest Point (ICP) algorithm, with the implementation given by the `libpointmatcher `_ library (:cite:`Pomerleau12comp`). The default alignment method is Point-to-Plane ICP, which may be more robust to large translations than Point-to-Point ICP, though the latter can be good enough if the input point clouds have small alignment errors and it is faster and uses less memory as well. The tool also accepts an option named ``--highest-accuracy`` which will compute the normals for Point-to-Plane ICP at all points rather than about a tenth of them. This option is not necessary most of the time, but may result in better alignment at the expense of using more memory and processing time. The default alignment transform is rigid, that is, a combination of rotation and translation. It is also possible to solve for a scale change, by setting ``--alignment-method`` to ``similarity-point-to-plane`` or ``similarity-point-to-point``. The first of these works better than the second one. If the translation between the point clouds is very large, see :numref:`pc_hillshade`. .. _nuth: Nuth and Kaab ^^^^^^^^^^^^^ The Nuth and Kaab alignment method (:cite:`nuth2011co`) can be sub-grid-size accurate. It is accessible with ``--alignment-method nuth``. The implementation is based on `dem_align.py `_. It is assumed that: - The input clouds are dense and detailed DEMs with notable relief - The DEMs have a lot of overlap - The alignment transform is a pure translation in projected coordinates (both horizontal and vertical). If the last two assumptions do not hold, consider using a different alignment algorithm first (for example, feature-based alignment in combination with ICP, :numref:`pc_hillshade`). The resulting aligned source point cloud needs to be regridded with ``point2dem``, and then the alignment further refined with this method. The order of inputs should be so that the reference DEM (the first input) has a grid size that is no bigger than of the second DEM. The second DEM will be interpolated to the grid of the first one. Both DEMs should be in projected coordinates, so with the grid size measured in meters, and with the same datum. Otherwise, regridding can be done with ``gdalwarp -r cubic`` (:numref:`gdal_tools`). LAS files can be regridded with ``point2dem`` (:numref:`point2dem`). The produced alignment transform will be converted to a rotation + translation transform around the planet center (ECEF coordinates), for consistency with the other alignment methods. It will be an ECEF translation if the option ``--compute-translation-only`` is set. The DEMs should fit fully in memory, with a solid margin. Large DEMs with good relief could be regridded (with cubic interpolation) to a 2x coarser grid, which would still result in a good alignment. That goes as follows, for any input DEM:: gdal_translate -r average -outsize 50% 50% input.tif output.tif Any produced transform with lower-resolution DEMs can be applied to the original DEMs (:numref:`prevtrans`). Additional options can be passed in via ``--nuth-options`` (:numref:`nuth_options`). This alignment method does not support the ``--initial-transform`` option, because it computes the alignment transform in projected coordinates of the reference DEM, and in that space an external ECEF transform cannot be applied exactly. .. _fgr: FGR algorithm ^^^^^^^^^^^^^ The `Fast Global Registration `_ (FGR) algorithm can be called with ``--alignment-method fgr``, and is customizable via ``--fgr-options`` (:numref:`pc_align_options`). This approach can perform better than ICP when the clouds are close enough to each other but there is a large number of outliers, since it does a cross-check. When the clouds are far, another algorithm can be employed to bring them closer first (:numref:`prevtrans`). .. _pc_hillshade: Feature-based alignment ^^^^^^^^^^^^^^^^^^^^^^^ If the clouds differ by a large translation or scale factor, alignment can fail. If the clouds are DEMs, one may specify the option ``--initial-transform-from-hillshading`` which will hillshade the two DEMs, find interest point matches between them, and use that to compute an initial transform between the clouds, which may or may not contain scale. This transform can be passed as an initial guess to the other alignment algorithms (:numref:`prevtrans`). See an example in :numref:`kh4_align`. The related correlation-based alignment method is described in :numref:`pc_corr`. In the latest ASP (10/2025 and later), hillshading is done with ``gdaldem hillshade`` (:numref:`gdal_hill`). ASP's own ``hillshade`` program (:numref:`hillshade`) is also supported. See the option ``--hillshade-command`` in :numref:`pc_align_options`. Inspect the produced hillshaded images and, if needed, change the hillshade command or its options to get visually good results. The interest point finding and matching are performed with ASP's ``ipfind`` (:numref:`ipfind`) and ``ipmatch`` (:numref:`ipmatch`) programs. These can be customized with ``--ipfind-options`` and ``--ipmatch-options``. For example, one can increase the number of interest points being found or the detection method. The option ``--initial-transform-ransac-params`` controls the outlier removal. See :numref:`pc_align_options` for details about these options. The match file having the correspondences between the two hillshaded DEMs is saved in the output directory and can be inspected (:numref:`stereo_gui_view_ip`). It can also be created or edited manually (:numref:`manual-align`). If the two clouds look too different for interest point matching to work, or they are not DEMs to start with, they can be gridded to use the same (usually coarser) grid, as described in :numref:`regrid`. The clouds can be cropped to a shared area as well. The produced transform will be applicable to the original clouds (a translation transform may be more reliable if cropping happens). .. _pc_corr: Correlation-based alignment ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Given two DEMs with the same grid size that look visually similar when hillshaded, the dense image correlation can be found between the hillshaded images, and that can be employed to align the clouds. For that, first produce the hillshades, either with ``gdaldem hillshade`` (:numref:`gdal_hill`) or with the ASP ``hillshade`` program (:numref:`hillshade`). Call these outputs ``ref_hill.tif`` and ``src_hill.tif``. Consider increasing the hillshaded image contrast and range of intensities with ``hillshade`` by decreasing the ``--elevation`` option value. Carefully inspect the produced hillshaded images. Washed out and textureless regions are likely not going to work well. Image correlation is performed (:numref:`correlator-mode`) on hillshaded images:: parallel_stereo --correlator-mode \ --ip-per-image 40000 \ --stereo-algorithm asp_mgm \ --subpixel-mode 9 \ ref_hill.tif src_hill.tif \ --num-matches-from-disparity 40000 \ run_corr/run Stereo correlation can take a long time. It can be run over several nodes (:numref:`pbs_slurm`). The option ``--max-disp-spread`` can help with reducing the search range (:numref:`corr_section`). A value like 50 is likely adequate. Increasing the correlation kernel size, such as ``--corr-kernel 9 9`` (from the default of ``5 5`` for the ``aspm_mgm`` algorithm) may help with noisy DEMs. Also running this for lower-resolution versions of the input DEMs. ASP supports many stereo correlation algorithms (:numref:`stereo_alg_overview`). This produces a dense match file (:numref:`dense_ip`) that should be inspected (:numref:`stereo_gui_view_ip`), and then passed to ``pc_align``:: matchFile=run_corr/run-disp-ref_hill__src_hill.match pc_align \ --max-displacement -1 \ --num-iterations 0 \ --max-num-reference-points 1000000 \ --match-file $matchFile \ --initial-transform-from-hillshading rigid \ --initial-transform-ransac-params 1000 3 \ --save-transformed-source-points \ ref.tif src.tif \ -o run_align/run One has to consider carefully if the transform to be solved for should be rigid (rotation + translation) or a translation only. Inspecting the bands of the disparity map ``run_corr/run-F.tif`` can help with that (:numref:`mask_disparity`). The resulting aligned cloud ``run_align/run-trans_source.tif`` can be regridded with ``point2dem`` and same grid size and projection as the input DEMs, and evaluate if it moved as expected. This method will fail if the input DEMs do not overlap a lot when overlaid with georeference information. If the usable overlap is small, consider running this on cropped versions of the DEMs first, then applying the resulting transform to the full datasets (:numref:`prevtrans`). In that case, a translation-only transform will be more robust than one with rotation or scale. The related method in :numref:`pc_hillshade` uses sparse features from hillshading, and can handle a large translation between the clouds. .. _pc_least_squares: Least squares ^^^^^^^^^^^^^ Another option is to use least squares (with outlier handling using a robust cost function) to find the transform, if the reference cloud is a DEM. This is an *experimental mode* that is *not recommended*. For this, one should specify the alignment method as ``least-squares`` or ``similarity-least-squares`` (the latter also solves for scale). It is suggested that the input clouds be very close or otherwise the ``--initial-transform`` option be used, for the method to converge, and use perhaps on the order of 10-20 iterations and a smaller value for ``--max-num-source-points`` (perhaps a few thousand) for this approach to converge reasonably fast. File formats ~~~~~~~~~~~~ The input point clouds can be in one of several formats: ASP's point cloud format (the output of ``parallel_stereo``, :numref:`outputfiles`), DEMs as GeoTIFF or ISIS cub files, LAS files (including LAZ and COPC), or plain-text CSV files (with .csv or .txt extension). CSV ^^^ By default, CSV files are expected to have on each line the latitude and longitude (in degrees), and the height above the datum (in meters), separated by commas or spaces. Alternatively, the user can specify the format of the CSV file via the ``--csv-format`` option. Entries in the CSV file can then be (in any order) (a) longitude, latitude (in degrees), height above datum (in meters), (b) longitude, latitude, distance from planet center (in meters or km), (c) easting, northing and height above datum (in meters), in this case a PROJ or WKT string must be set via ``--csv-srs``, (d) Cartesian coordinates :math:`(x, y, z)` measured from planet center (in meters). The precise syntax is in :numref:`pc_align_options`. The tool can also auto-detect the LOLA RDR PointPerRow format. Any line in a CSV file starting with the pound character (#) is ignored. If none of the input files have a geoheader with datum information, and the input files are not in Cartesian coordinates, the datum needs to be specified via the ``--datum`` option, or by setting ``--semi-major-axis`` and ``--semi-minor-axis``. .. _pc_align_las: LAS and COPC ^^^^^^^^^^^^ The ``pc_align`` program supports clouds in the LAS format, including compressed (LAZ) and cloud-optimized (`COPC `_) data. The processing is done with `PDAL `_, which is shipped with ASP. If the reference / source cloud is in the COPC format, the option ``--ref-copc-win`` / ``--src-copc-win`` is required, so that the program can know the region of these spatially organized clouds that needs processing. Or can set ``--ref-copc-read-all`` / ``--src-copc-read-all``. See the full description of these options in :numref:`pc_align_options`. For COPC files, the corresponding output cloud with the transform applied to it will be in the LAZ format, and will be restricted to the region used in processing. .. _alignmenttransform: The alignment transform ~~~~~~~~~~~~~~~~~~~~~~~ The transform obtained by ``pc_align`` is output to a text file as a 4 |times| 4 matrix with the upper-left 3 |times| 3 submatrix being the rotation (and potentially also a scale, per :numref:`align-method`) and the top three elements of the right-most column being the translation. It is named ``-transform.txt``. This transform, if applied to the source point cloud, will bring it in alignment with the reference point cloud. The transform assumes the 3D Cartesian coordinate system with the origin at the planet center (known as ECEF). This matrix can be supplied back to the tool as an initial guess (:numref:`prevtrans`). The inverse transform, from the reference cloud to the source cloud is saved as well, as ``-inverse-transform.txt``. These two transforms can be used to move cameras from one cloud's coordinate system to another one's, as shown in :numref:`ba_pc_align`. .. _prevtrans: Applying an initial transform ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``pc_align``-produced transform (:numref:`alignmenttransform`) can be supplied back to the tool as an initial guess via the ``--initial-transform`` option, with the same clouds as earlier, or some supersets or subsets of them. If it is desired to apply this transform without further refinement, one can specify ``--num-iterations 0``. An initial transform can be found, for example, based on hillshading the two clouds (:numref:`pc_hillshade`) or with correlation-based alignment (:numref:`pc_corr`). To illustrate applying a transform, consider a DEM, named ``dem.tif``, obtained with ASP, from which just a portion, ``dem_crop.tif`` is known to have reliable measurements, which are stored, for example, in a file called ``meas.csv``. Hence, ``pc_align`` is first used on the smaller DEM, as:: pc_align dem_crop.tif meas.csv -o run/run Then, the command:: pc_align \ --max-displacement -1 \ --num-iterations 0 \ --max-num-reference-points 1000 \ --max-num-source-points 1000 \ --save-transformed-source-points \ --save-inv-transformed-reference-points \ --initial-transform run/run-transform.txt \ --csv-format \ dem.tif meas.csv \ -o run_full/run will transform the full ``dem.tif`` into the coordinate system of ``meas.csv``, and ``meas.csv`` into the coordinate system of ``ref.tif`` with no further iterations. The number of input points here is small, for speed, as they will not be used. See also :numref:`ba_pc_align` for how to use such transforms with cameras. If an initial transform is used, with zero or more iterations, the output transform produced by such an invocation will be from the source points *before* the initial transform, hence the output alignment transform will incorporate the initial transform. Using ``--max-displacement -1`` should be avoided, as that will do no outlier filtering in the source cloud. Here that is not necessary, as this invocation simply moves the DEM according to the specified transform. If a good initial alignment is found, it is suggested to use a smaller value for ``--max-displacement`` to refine the alignment, as the clouds will already be mostly on top of each other after the initial transform is applied. Applying an initial specified translation or rotation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ One can apply to the source cloud an initial shift, expressed in the North-East-Down coordinate system at the centroid of the source points, before the alignment algorithm is invoked. Hence, if it is desired to first move the source cloud North by 5 m, East by 10 m, and down by 15 m relative to the point on planet surface which is the centroid of the source points, the continue with alignment, one can invoke ``pc_align`` with:: --initial-ned-translation "5 10 15" (Notice the quotes.) The option ``--initial-rotation-angle`` can be used analogously. As in :numref:`prevtrans`, one can simply stop after such an operation, if using zero iterations. In either case, such initial transform will be incorporated into the transform file output by ``pc_align``, hence that one will go from the source cloud before user's initial transform to the reference cloud. Interpreting the transform ~~~~~~~~~~~~~~~~~~~~~~~~~~ The alignment transform, with its origin at the center of the planet, can result in large movements on the planet surface even for small angles of rotation. Because of this it may be difficult to interpret both its rotation and translation components. The ``pc_align`` program outputs the translation component of this transform, defined as the vector from the centroid of the original source points (before any initial transform applied to them) to the centroid of the source points with the computed alignment transform applied to them. This translation component is displayed in three ways (a) Cartesian coordinates with the origin at the planet center, (b) Local North-East-Down coordinates at the centroid of the source points (before any initial transform), and (c) Latitude-Longitude-Height differences between the two centroids. If the effect of the transform is small (e.g., the points moved by at most several hundred meters) then the representation in the form (b) above is most amenable to interpretation as it is in respect to cardinal directions and height above ground if standing at a point on the planet surface. This program prints to screen the Euler angles of the rotation transform, and also the axis of rotation and the angle measured against that axis. It can be convenient to interpret the rotation as being around the center of gravity of the reference cloud, even though it was computed as a rotation around the planet center, since changing the point around which a rigid transform is applied will only affect its translation component, which is relative to that point, but not the rotation matrix. .. _pc_align_error: Error metrics and outliers ~~~~~~~~~~~~~~~~~~~~~~~~~~ The tool outputs to CSV files the lists of errors together with their locations in the source point cloud, before the alignment of the source points (but after applying any initial transform), and also after the alignment computed by the tool. They are named ``-beg_errors.csv`` and ``-end_errors.csv``. An error is defined as the distance from a source point used in alignment to the closest reference point (measured in meters). The format of output CSV files is the same as of input CSV files, or as given by ``--csv-format``, although any columns of extraneous data in the input files are not saved on output. The first line in these files shows the names of the columns. See :numref:`plot_csv` for how to visualize these files. By default, this tool shows the 4th column in these files, which is the absolute error difference. Run, for example:: stereo_gui --colorbar run/run-end_errors.csv The program prints to screen and saves to a log file the 16th, 50th, and 84th error percentiles as well as the means of the smallest 25%, 50%, 75%, and 100% of the errors. When the reference point cloud is a DEM, a more accurate computation of the errors from source points to the reference cloud is used. A source point is projected onto the datum of the reference DEM, its longitude and latitude are found, then the DEM height at that position is interpolated. That way we determine the closest point on the reference DEM that interprets the DEM not just as a collection of points but rather as a polyhedral surface going through those points. These errors are what is printed in the statistics. To instead compute errors as done for other type of point clouds, use the option ``--no-dem-distances``. By default, when ``pc_align`` discards outliers during the computation of the alignment transform, it keeps the 75% of the points with the smallest errors. As such, a way of judging the effectiveness of the tool is to look at the mean of the smallest 75% of the errors before and after alignment. .. _pc_align_validation: Evaluation of aligned clouds ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``pc_align`` program can save the source cloud after being aligned to the reference cloud and vice-versa, via ``--save-transformed-source-points`` and ``--save-inv-transformed-reference-points``. To validate that the aligned source cloud is very close to the reference cloud, DEMs can be made out of them with ``point2dem`` (:numref:`point2dem`), and those can be overlaid as georeferenced images in ``stereo_gui`` (:numref:`stereo_gui`) for inspection. A GIS tool can be used as well. Alternatively, the ``geodiff`` program (:numref:`geodiff`) can compute the (absolute) difference between aligned DEMs, which can be colorized with ``colormap`` (:numref:`colormap`), or colorized on-the-fly and displayed with a colorbar in ``stereo_gui`` (:numref:`colorize`). The ``geodiff`` tool can take the difference between a DEM and a CSV file as well. The obtained error differences can be visualized in ``stereo_gui`` (:numref:`plot_csv`). Output point clouds and convergence history ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The transformed input point clouds (the source transformed to match the reference, and the reference transformed to match the source) can also be saved to disk if desired. If an input point cloud is in CSV, ASP point cloud format, or LAS format, the output transformed cloud will be in the same format. If the input is a DEM, the output will be an ASP point cloud, since a gridded point cloud may not stay so after a 3D transform. As an example, assume that ``pc_align`` is run as:: pc_align --max-displacement 100 \ --csv-format '1:x 2:y 3:z' \ --save-transformed-source-points \ --save-inv-transformed-reference-points \ ref_dem.tif source.csv \ -o run/run This will save ``run/run-trans_reference.tif`` which is a point cloud in the coordinate system of the source dataset, and ``run/run-trans_source.csv`` which is in reference coordinate system of the reference dataset. The ``point2dem`` program (:numref:`point2dem`) can re-grid the obtained point cloud back to a DEM. Care is needed, as before, with setting ``--max-displacement``. The convergence history for ``pc_align`` (the translation and rotation change at each iteration) is saved to disk with a name like:: -iterationInfo.csv and can be used to fine-tune the stopping criteria. .. _manual-align: Manual alignment ~~~~~~~~~~~~~~~~ If automatic alignment fails, for example, if the clouds are too different, or they differ by a scale factor, a manual alignment can be computed as an initial guess transform (and one can stop there if ``pc_align`` is invoked with 0 iterations). For that, the input point clouds should be first converted to DEMs using ``point2dem``, unless in that format already. Then, ``stereo_gui`` can be called to create manual point correspondences (interest point matches) from the reference to the source DEM (:numref:`stereo_gui_edit_ip`). The DEMs should be displayed in the GUI with the reference DEM on the left, and should be hillshaded. Once the match file is saved to disk, it can be passed to ``pc_align`` via the ``--match-file`` option, which will compute an initial transform (whose type is set with ``--initial-transform-from-hillshading``), before continuing with alignment. Example:: pc_align ref-DEM.tif src-DEM.tif \ --max-displacement 500 \ --initial-transform-ransac-params 1000 100 \ --initial-transform-from-hillshading rigid \ --match-file run/run-ref-DEM__src-DEM.match \ -o run/run This transform can also be used for non-DEM clouds once it is found using DEMs obtained from those clouds (:numref:`prevtrans`). Note that both a rigid and similarity transform is supported, both for the initial transform and for the alignment. A rigid transform is usually enough. Here the second value of ``--initial-transform-ransac-params`` was set rather high, to not remove any matches as outliers. .. _regrid: Regrid a DEM ~~~~~~~~~~~~ Given a DEM, if one invokes ``pc_align`` as follows:: pc_align dem.tif dem.tif --max-displacement -1 --num-iterations 0 \ --save-transformed-source-points -o run/run this will create a point cloud out of the DEM. This cloud can then be re-gridded using ``point2dem`` (:numref:`point2dem`), with desired grid size and projection. Alternatively, the ``gdalwarp`` program (:numref:`gdal_tools`) can be employed for regridding, with an option such as ``-r cubic``. The ``point2dem`` approach is preferable if the output grid size is very coarse, as this tool does binning in a neighborhood, rather than interpolation. .. _ba_pc_align: Applying a transform to cameras ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If ``pc_align`` is used to align a DEM obtained with ASP to a preexisting reference DEM or other cloud, the obtained alignment transform can be applied to the cameras used to create the ASP DEM, so the cameras then become aligned with the reference. That is accomplished by running bundle adjustment with the options ``--initial-transform`` and ``--apply-initial-transform-only``. Please note that the way this transform is applied depends on the order of clouds in ``pc_align`` and on whether the cameras have been bundle-adjusted or not. Precise commands are given below. First, assume, for example, that the reference is ``ref.tif``, and the ASP DEM is created *without* bundle adjustment, as:: parallel_stereo left.tif right.tif left.xml right.xml output/run point2dem --auto-proj-center output/run-PC.tif It is very important to distinguish the cases when the obtained DEM is the first or second argument of ``pc_align``. If the ASP DEM ``output/run-DEM.tif`` is aligned to the reference as:: pc_align --max-displacement 1000 ref.tif output/run-DEM.tif \ -o align/run then, the alignment is applied to cameras the following way:: bundle_adjust left.tif right.tif left.xml right.xml \ --initial-transform align/run-transform.txt \ --apply-initial-transform-only -o ba_align/run This should create the camera adjustments incorporating the alignment transform:: ba_align/run-left.adjust, ba_align/run-right.adjust (see :numref:`adjust_files` for discussion of .adjust files). For CSM cameras, this will also create stand-alone ``model state`` cameras with adjustments already applied to them (:numref:`csm_state`). If ``pc_align`` was invoked with the two clouds in reverse order, the transform to use is:: align/run-inverse-transform.txt The idea here is that ``run-transform.txt`` goes from the second cloud passed to ``pc_align`` to the first, hence, ``bundle_adjust`` invoked with this transform would move cameras from second cloud's coordinate system's to first. And vice-versa, if ``run-inverse-transform.txt`` is used, cameras from first clouds's coordinate system would be moved to second's. After applying a transform this way, the cameras that are now aligned with the reference can be used to mapproject onto it, hopefully with no registration error, as:: mapproject ref.tif left.tif left_map.tif \ --bundle-adjust-prefix ba_align/run and in the same way for the right image. Overlaying the produced images is a very useful sanity check. If, the initial stereo was done with cameras that already were bundle-adjusted, with output prefix ``initial_ba/run``, so the stereo command had the option:: --bundle-adjust-prefix initial_ba/run we need to integrate those initial adjustments with this alignment transform. To do that, again need to consider two cases, as before. If the just-created stereo DEM is the second argument to ``pc_align``, then run the slightly modified command:: bundle_adjust left.tif right.tif left.xml right.xml \ --initial-transform align/run-transform.txt \ --input-adjustments-prefix initial_ba/run \ --apply-initial-transform-only -o ba_align/run Otherwise, if the stereo DEM is the first argument to ``pc_align``, use instead ``align/run-inverse-transform.txt`` as input to ``--initial-transform``. Note that this way bundle adjustment will not do any further camera refinements after the initial transform is applied. A stereo run can be reused after the cameras have been modified as above, with the option ``--prev-run-prefix``. Only triangulation will then be redone. Ensure the option ``--bundle-adjust-prefix ba_align/run`` is used to point to the new cameras. See :numref:`bathy_reuse_run` and :numref:`mapproj_reuse`. Troubleshooting ~~~~~~~~~~~~~~~ Remember that filtering is applied only to the source point cloud. If you have an input cloud with a lot of noise, make sure it is being used as the source cloud. If you are not getting good results with ``pc_align``, something that you can try is to convert an input point cloud into a smoothed DEM. Use ``point2dem`` to do this and set ``--search-radius-factor`` if needed to fill in holes in the DEM. For some input data this can significantly improve alignment accuracy. .. _pc_align_options: Command-line options for pc_align ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --num-iterations Maximum number of iterations. --max-displacement Maximum expected displacement (horizontal + vertical) 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 (movable) point cloud. -o, --output-prefix Specify the output file prefix. --outlier-ratio Fraction of source (movable) points considered inliers (after gross outliers further than max-displacement from reference points are removed). --max-num-reference-points Maximum number of (randomly picked) reference points to use. --max-num-source-points Maximum number of (randomly picked) source points to use (after discarding gross outliers). --alignment-method Alignment method. Options: ``point-to-plane``, ``point-to-point``, ``similarity-point-to-plane``, ``similarity-point-to-point`` (:numref:`pc_icp`), ``nuth`` (:numref:`nuth`), ``fgr`` (:numref:`fgr`), ``least-squares``, ``similarity-least-squares`` (:numref:`pc_least_squares`). --highest-accuracy Compute with highest accuracy for point-to-plane (can be much slower). --datum Sets the datum for CSV files. Options: * WGS_1984 * D_MOON (1,737,400 meters) * D_MARS (3,396,190 meters) * MOLA (3,396,000 meters) * NAD83 * WGS72 * NAD27 * Earth (alias for WGS_1984) * Mars (alias for D_MARS) * Moon (alias for D_MOON) --semi-major-axis Explicitly set the datum semi-major axis in meters. --semi-minor-axis Explicitly set the datum semi-minor axis in meters. --csv-format Specify, in quotes, 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'`` (a Cartesian coordinate system with origin at planet center is assumed, with the units being in meters), ``'5:lon 6:lat 7:radius_m'`` (longitude and latitude are in degrees, the radius is measured in meters from planet center), ``'3:lat 2:lon 1:height_above_datum'``, ``'1:easting 2:northing 3:height_above_datum'`` (for the latter need to also set ``--csv-srs``). The height above datum is in meters. Can also use ``radius_km`` for ``column_type``, when it is again measured from planet center. --csv-srs The PROJ or WKT string to use to interpret the entries in input CSV files. --compute-translation-only Compute the transform from source to reference point cloud as a translation only (no rotation). --save-transformed-source-points Apply the obtained transform to the source points so they match the reference points and save them. The transformed point cloud can be gridded with ``point2dem`` (:numref:`point2dem`). --save-inv-transformed-reference-points Apply the inverse of the obtained transform to the reference points so they match the source points and save them. --initial-transform The file containing the transform to be used as an initial guess. It can come from a previous run of the tool. --initial-ned-translation 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. --initial-rotation-angle 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. --initial-transform-from-hillshading If both input clouds are DEMs, find interest point matches among their hillshaded versions, and use them to compute an initial transform to apply to the source cloud before proceeding with alignment (:numref:`pc_hillshade`). Specify here the type of transform, as one of: ``rigid`` (rotation + translation), ``translation``, or ``similarity`` (rotation + translation + scale). See the options further down for tuning this. The alignment algorithm can refine the scale later if set to ``similarity-point-to-plane``, etc. --hillshade-command The hillshade command and options to use when computing the transform from hillshading. The default is: ``gdaldem hillshade -multidirectional -compute_edges -co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256``. An alternative is: ``hillshade --azimuth 300 --elevation 20 --align-to-georef``. --hillshade-options Options to pass to the ``hillshade`` program when computing the transform from hillshading. This is for backward compatibility. Use instead the ``--hillshade-command`` option. --ipfind-options Options to pass to the ``ipfind`` program when computing the transform from hillshading. Default: ``--ip-per-image 1000000 --interest-operator sift --descriptor-generator sift``. --ipmatch-options Options to pass to the ``ipmatch`` program when computing the transform from hillshading. Default: ``--inlier-threshold 100 --ransac-iterations 10000 --ransac-constraint similarity``. --initial-transform-ransac-params When computing an initial transform based on hillshading, use this number of RANSAC iterations and outlier factor. A smaller factor will reject more outliers. --match-file Compute an initial transform from the source to the reference point cloud given interest point matches from the reference to the source DEM in this file. This file can be produced manually, in ``stereo_gui`` (:numref:`manual-align`), or automatically, as in :numref:`pc_hillshade` or :numref:`pc_corr`. See also ``--initial-transform-from-hillshading`` and ``--initial-transform-ransac-params``. --nuth-options Options to pass to the Nuth and Kaab algorithm. Set in quotes. See :ref:`nuth_options` for more details. --fgr-options Options to pass to the Fast Global Registration (FGR) algorithm. Set in quotes. Default: "div_factor: 1.4 use_absolute_scale: 0 max_corr_dist: 0.025 iteration_number: 100 tuple_scale: 0.95 tuple_max_cnt: 10000". --ref-copc-win Specify the region to read from the reference cloud, if it is a COPC LAZ file. The units are based the projection in the file. This is required unless ``--ref-copc-read- all`` is set. Specify as ``minx miny maxx maxy``, or ``minx maxy maxx miny``, with no quotes. See also ``--src-copc-win`` and :numref:`pc_align_las`. --src-copc-win Specify the region to read from the source cloud, if it is a COPC LAZ file. The units are based the projection in the file. This is required unless ``--src-copc-read-all all`` is set. Specify as ``minx miny maxx maxy``, or ``minx maxy maxx miny``, with no quotes. If not set, the ``--ref-copc-win`` option will be used, or otherwise it will be estimated based on the extent of reference points and the ``--max-displacement`` option. --ref-copc-read-all Read the full reference COPC file, ignoring the ``--ref-copc-win`` option. --src-copc-read-all Read the full source COPC file, ignoring the ``--src-copc-win`` option. --diff-rotation-error Change in rotation amount below which the algorithm will stop (if translation error is also below bound), in degrees. A small value can result in numerical precision issues and many iterations. --diff-translation-error Change in translation amount below which the algorithm will stop (if rotation error is also below bound), in meters. --no-dem-distances 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 (the text above has more detailed information). --skip-shared-box-estimation Do not estimate the shared bounding box of the two clouds. This estimation can be costly for large clouds but helps with eliminating outliers. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. .. _nuth_options: Options for Nuth and Kaab ~~~~~~~~~~~~~~~~~~~~~~~~~ The Nuth and Kaab algorithm (:numref:`nuth`) accepts the regular ``pc_align`` options ``--max-displacement``, ``--num-iterations``, ``--compute-translation-only``, ``--threads``. In addition, it can be tuned via the ``--nuth-options`` argument. Its value is a string in quotes, with spaces as separators. Example:: --nuth-options "--slope-lim 0.1 40.0 --tol 0.01" Default values will be used for any unspecified options. The options are: --slope-lim Minimum and maximum surface slope limits to consider (degrees). --tol Stop when the addition to the alignment translation at given iteration has magnitude below this tolerance (meters). --max-horizontal-offset Maximum expected horizontal translation magnitude (meters). Used to filter outliers. If not set, use the value in ``--max-displacement``. --max-vertical-offset Maximum expected vertical translation in meters (meters). Used to filter outliers. If not set, use the value in ``--max-displacement``. --num-inner-iter Maximum number of iterations for the inner loop, when finding the best fit parameters for the current translation. .. |times| unicode:: U+00D7 .. MULTIPLICATION SIGN ================================================ FILE: docs/tools/pc_filter.rst ================================================ .. _pc_filter: pc_filter --------- This program takes as input a four-band ``PC.tif`` point cloud as created by stereo triangulation (:numref:`outputfiles`) and applies various outlier filters. It can be especially useful for indoor stereo datasets, which can have poor texture and very oblique angles, and hence result in noisy point clouds. Each point that is kept can be assigned a reliability weight (for some of the options below), which will be used when the point clouds (if in ``.pcd`` format) are fused into a mesh with ``voxblox_mesh`` (:numref:`voxblox_mesh`). It is assumed that the input cloud fits fully in memory, and some filtering options expect that the cloud was created with pinhole cameras. This may change in future versions. The output cloud has the same format and dimensions as the input, with outliers replaced by points with all coordinates equal to 0. The cloud can also be saved in ``.ply`` or ``.pcd`` format (depending on the specified extension). In those cases the coordinates are saved as ``float32``, which may result in loss of precision for orbital data. Invalid points and outliers are excluded from those clouds. A textured mesh in .obj format can be created from the output cloud using ``point2mesh`` (:numref:`point2mesh`), just as for the original cloud. Usage:: pc_filter [options] --input-cloud input.tif --output-cloud output.tif Example 1 (save the output in .tif format):: pc_filter --max-distance-from-camera 1.5 \ --max-camera-ray-to-surface-normal-angle 75 \ --input-cloud run/run-PC.tif \ --input-texture run/run-L.tif \ --camera left.tsai \ --output-cloud run/run-PC-filter.tif Example 2 (save the output in .pcd format and transform to camera coordinates, for use with VoxBlox):: pc_filter --max-distance-from-camera 1.5 \ --max-camera-ray-to-surface-normal-angle 75 \ --input-cloud run/run-PC.tif \ --input-texture run/run-L.tif \ --transform-to-camera-coordinates \ --output-cloud run/run-PC-filter.pcd Create a mesh from the filtered point cloud:: point2mesh -s 4 --texture-step-size 1 \ run/run-PC-filter.tif run/run-L.tif Command-line options for ``pc_filter``: --input-cloud Input cloud name. A four-band .tif file as produced by stereo triangulation. --output-cloud 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 mesh faces). In those case 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. --input-texture 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. --camera The left or right camera used to produce this cloud. Used for some filtering operations. --max-distance-from-camera If positive, remove points further from camera center than this value. Measured in meters. --max-valid-triangulation-error If positive, points with triangulation error larger than this will be removed from the cloud. Measured in meters. --max-camera-ray-to-surface-normal-angle 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. --max-camera-dir-to-surface-normal-angle 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. --max-camera-dir-to-camera-ray-angle 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. --distance-from-camera-weight-power 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. --blending-dist 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. --blending-power Use this as the power when setting ``--blending-dist``. --reliable-surface-resolution 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. --transform-to-camera-coordinates Transform the point cloud to the coordinate system of the camera provided with ``--camera``. For use with VoxBlox. --output-weight If specified, save the weight assigned to each point to this file. This has the same dimensions as the point cloud and ``L.tif``. (Use the .tif extension.) --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/pc_merge.rst ================================================ .. _pc_merge: pc_merge -------- This is a simple tool for combining multiple ASP-generated point cloud files into a single concatenated file. The output file will be float32 unless the input images are float64 or the user has specified the float64 option. ``pc_merge`` can merge clouds with 1, 3, 4, and 6 bands. In particular, it can merge *output-prefix*-L.tif images created by ``stereo`` (:numref:`outputfiles`). This is useful if it is desired to create an orthoimage from a merged cloud with ``point2dem`` (:numref:`point2dem`). In that case, one can invoke ``pc_merge`` on individual ``L.tif`` files to create a merged texture file to pass to ``point2dem`` together with the merged point cloud tile. Example:: pc_merge cloud1.tif cloud2.tif -o merged_cloud.tif Usage:: pc_merge [options] -o Command-line options for pc_merge: -d, --write-double Force output file to be float64 instead of float32. -o, --output-file Specify the output file (required). --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/point2dem.rst ================================================ .. _point2dem: point2dem --------- The ``point2dem`` program produces a digital elevation model (DEM) in the GeoTIFF format and/or an orthographic image from a set of point clouds. The clouds can be created by ``parallel_stereo`` (:numref:`parallel_stereo`), or be in CSV (:numref:`point2dem_csv`) or LAS (:numref:`point2dem_las`) format. The heights in the produced DEM are relative to a datum (ellipsoid). They are calculated by weighted averaging around each grid point of the heights of points in the cloud (see ``--search-radius-factor``). The grid size is set with ``--tr`` for the given projection. The grid points are placed at integer multiples of the grid size, and the created DEM has a ground footprint that is outwardly larger by half a grid pixel than the bounding box of the grid points. If not set, the grid size is estimated automatically. The behavior is somewhat different with ``--gdal-tap``. A custom extent can be specified with the option ``--t_projwin``. This will be adjusted to ensure, as above, that the grid points are placed at integer multiples of the grid size. The obtained DEMs can be colorized or hillshaded (:numref:`genhillshade`), visualized with ``stereo_gui`` (:numref:`stereo_gui`), mosaicked with ``dem_mosaic`` (:numref:`dem_mosaic`), or analyzed with GDAL tools (:numref:`gdal_tools`). .. _point2dem_proj: Determination of projection ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use the option ``--t_srs`` to set a desired output projection. The projection should be local to the area of interest, in units of meter. If this is not set: - The ``point2dem`` program inherits the projection from the input images, if those are mapprojected (:numref:`mapproj-example`) and the projection is not geographic. - If the input is a LAS file having a projection that is not geographic, that will be used. - If the input is a CSV file, the projection from ``--csv-srs`` will be used. If none of these are applicable, in the latest ASP (:numref:`release`), ``point2dem`` automatically finds a good local projection in meters. For ASP 3.4.0 and earlier, the default projection was geographic. For Earth, with the WGS84 datum, the auto-determined projection is UTM with an auto-computed zone, except for latitudes above 84° North and below 80° South, where the `NSDIC polar stereographic projections `_ are used. For other Earth datums and other planetary bodies, the automatic determination produces a local stereographic projection. The projection center is found by computing the median of a sample of points in the cloud. To ensure the automatic projection determination is always invoked, overriding all other cases from above, use ``--t_srs auto``. See the options ``--stereographic``, ``--orthographic``, ``--proj-lon``, ``--proj-lat`` for other ways to set the projection. Examples ~~~~~~~~ Local stereographic projection ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Create a DEM for Mars in a local stereographic projection, auto-guessing the projection center and grid size. :: point2dem -r mars \ --stereographic \ --auto-proj-center \ run/run-PC.tif This creates ``run/run-DEM.tif``, which is a GeoTIFF file, with each 32-bit floating point pixel value being the height above the datum (ellipsoid). The datum and projection are saved in the geoheader and can be seen with ``gdalinfo -proj4`` (:numref:`gdal_tools`). ASP normally auto-guesses the planet (datum), otherwise the option ``-r`` can be used. If desired to change the output no-data value (which can also be inspected with ``gdalinfo``), use the options ``--nodata-value``. .. _point2dem_ortho_err: Orthoimage and error image ^^^^^^^^^^^^^^^^^^^^^^^^^^ :: point2dem -r moon \ --auto-proj-center \ run/run-PC.tif \ --orthoimage run/run-L.tif \ --errorimage This produced a lunar DEM. The projection is found as in :numref:`point2dem_proj`. The left aligned image was used to create an orthoimage, by orthographically projecting it onto the DEM. The resulting ``run/run-DRG.tif`` file will be saved as a GeoTIFF image with the same geoheader as the DEM. In addition, the file ``run/run-IntersectionErr.tif`` is created, based on the 4th band of the ``PC.tif`` file, having the gridded version of the closest distance between the pair of rays intersecting at each point in the cloud (:numref:`triangulation_error`). This is also called the *triangulation error*, but it is only one way of evaluating the quality of the DEM. Here we have explicitly specified the spheroid (``-r moon``), rather than have it inferred automatically. The Moon spheroid will have a radius of 1737.4 km. Specify a projection string ^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: point2dem --t_srs '+proj=sinu +R=3396190 +no_defs' \ run/run-PC.tif This is the sinusoidal projection for Mars. The option ``gdalinfo --proj4`` can find the projection string in a GeoTIFF file. Custom grid size with geographic projection ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: point2dem -r earth --geographic --tr 0.0001 run/run-PC.tif It is important to note that here the grid size passed to ``--tr``, is in degrees, rather than meters, because the projection is geographic. This projection is *not recommended* except close to the equator. It is best to let the grid size be computed automatically, so not specifying ``--tr`` at all, or otherwise use a multiple of the automatically determined grid size (:numref:`post-spacing`). If desired to change the range of longitudes from [0, 360] to [-180, 180], or vice-versa, post-process obtained DEM with ``image_calc`` (:numref:`image_calc`). Polar stereographic projection ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: point2dem -r moon \ --stereographic \ --proj-lon 0 --proj-lat -90 \ run/run-PC.tif .. _point2dem_utm: UTM projection ^^^^^^^^^^^^^^ :: point2dem --utm 13 run/run-PC.tif Or:: proj="+proj=utm +zone=13 +datum=WGS84 +units=m +no_defs" point2dem --t_srs "$proj" run/run-PC.tif The zone for the UTM projection depends on the region of interest. It can be auto-guessed (:numref:`point2dem_proj`). The `Geoplanner `_ website is a reliable source for UTM zone information. See the options ``--sinusoidal``, ``--mercator``, etc., in :numref:`point2dem_options` for how to set other projections. .. _point2dem_csv: CSV files ^^^^^^^^^ The ``point2dem`` program can grid CSV files having longitude, latitude, and height values as:: point2dem -r moon \ --dem-spacing 10 \ --csv-format 1:lon,2:lat,3:height_above_datum \ in.csv \ -o run/run This will produce a DEM in projected coordinates (in meters, rather than degrees), unless the option ``--geographic`` is passed in and the ``--dem-spacing`` is set to a fraction of a degree (:numref:`point2dem_proj`). For input data in projected coordinates, one can set a projection and the CSV format:: proj="+proj=utm +zone=10 +datum=WGS84 +units=m +no_defs" format="1:easting,2:northing,3:height_above_datum" then run:: point2dem -r Earth \ --dem-spacing 10 \ --csv-srs "$proj" \ --csv-format "$format" \ --t_srs "$proj" \ in.csv \ -o run/run .. _point2dem_las: LAS and COPC ^^^^^^^^^^^^ The ``point2dem`` program can grid LAS files, including compressed (LAZ) and cloud-optimized (`COPC `_) data. The processing is done with `PDAL `_, which is shipped with ASP. For example, to create a DEM from a LAS file, run:: point2dem -r Earth --tr 10 in.las -o run/run This assumes that the LAS file is in projected coordinates with the file having the projection. If the points are in ECEF coordinates, a projection needs to be set with ``--t_srs``. For COPC files, which are potentially immense but spatially organized, the option ``--copc-win`` must be set. It determines the bounds of desired data to process, in projected coordinates. Example:: point2dem --tr 2.0 \ --copc-win 636400 852260 638180 849990 \ cloud.laz \ -o run/run To process the full file, use the option ``--copc-read-all``. The determination of whether an input file is COPC or plain LAZ is done by peeking at the relevant bits with PDAL. This program can process LAS files created with ``point2las`` (:numref:`point2las`). Multiple clouds ^^^^^^^^^^^^^^^ Several point clouds of different types can be passed in on input:: point2dem -r earth \ --dem-spacing 10 \ --csv-format 1:lon,2:lat,3:height_above_datum \ in1.las in2.csv run/run-PC.tif -o combined Here LAS, CSV, and TIF point clouds (the latter obtained with ``parallel_stereo``) are fused together into a single DEM. The CSV file is in longitude, latitude, and height above datum format, but the produced DEM will be in a projection in meters, unless borrowed from the LAS file or explicitly set with ``--t_srs`` (:numref:`point2dem_proj`). If it is desired to use the ``--orthoimage`` option with multiple clouds, the clouds need to be specified first, followed by the ``L.tif`` images. Ground-level or projected data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If a dataset is in a tif file with three bands, representing projected data or Cartesian values in a local coordinate system, it can be gridded as:: point2dem --input-is-projected \ --t_srs \ --tr 0.1 \ data.tif See ``--input-is-projected`` for more details. More examples are shown in :numref:`builddem`. .. _molacmp: Comparing with MOLA ~~~~~~~~~~~~~~~~~~~ When comparing the output of ``point2dem`` to laser altimeter data, like MOLA, it is important to understand the different kinds of data that are being discussed. By default, ``point2dem`` returns planetary radius values in meters. These are often large numbers that are difficult to deal with. If you use the ``-r mars`` option, the output terrain model will be in meters of elevation with reference to the IAU reference spheroid for Mars: 3,396,190 m. So if a post would have a radius value of 3,396,195 m, in the model returned with the ``-r mars`` option, that pixel would just be 5 m. You may want to compare the output to MOLA data. MOLA data is released in three 'flavors', namely: Topography, Radius, and Areoid. The MOLA Topography data product that most people use is just the MOLA Radius product with the MOLA Areoid product subtracted. Additionally, it is important to note that all of these data products have a reference value subtracted from them. The MOLA reference value is NOT the IAU reference value, but 3,396,000 m. In order to compare with the MOLA data, you can do one of two different things. You could operate purely in radius space, and have ``point2dem`` create radius values that are directly comparable to the MOLA radius data. You can do this by having ``point2dem`` subtract the MOLA reference value, by using either ``-r mola`` or setting ``--semi-major-axis 3396000`` and ``--semi-minor-axis 3396000``. Alternatively, to get values that are directly comparable to MOLA *Topography* data, you will need to run ``point2dem`` with either ``-r mars`` or ``-r mola``, then run the ASP tool ``dem_geoid`` (:numref:`dem_geoid`). This program will convert the DEM height values from being relative to the IAU reference spheroid or the MOLA spheroid to being relative to the MOLA Areoid. The newly obtained DEM will inherit the datum from the unadjusted DEM, so it could be either of the two earlier encountered radii, but of course the heights in it will be in respect to the areoid, not to this datum. It is important to note that one cannot tell from inspecting a DEM if it was adjusted to be in respect to the areoid or not, so there is the potential of mixing up adjusted and unadjusted terrain models. .. _post-spacing: Post spacing ~~~~~~~~~~~~ Recall that ``parallel_stereo`` creates a point cloud file as its output and that you need to use ``point2dem`` on to create a GeoTIFF that you can use in other tools. The point cloud file is the result of taking the image-to-image matches (which were created from the kernel sizes you specified, and the subpixel versions of the same, if used) and projecting them out into space from the cameras, and arriving at a point in real world coordinates. Since ``stereo`` does this for every pixel in the input images, the *default* value that ``point2dem`` uses (if you don't specify anything explicitly) is the input image scale, because there's an "answer" in the point cloud file for each pixel in the original image. However, as you may suspect, this is probably not the best value to use because there really is not that much "information" in the data. The true resolution of the output model is dependent on a whole bunch of things (like the kernel sizes you choose to use) but also can vary from place to place in the image depending on the texture. The general rule of thumb is to produce a terrain model that has a post spacing of about 3x the input image ground scale. This is based on the fact that it is nearly impossible to uniquely identify a single pixel correspondence between two images, but a 3x3 patch of pixels provides improved matching reliability. This depends on the stereo algorithm as well, however, with the ``asp_mgm`` algorithm producing a higher effective DEM resolution than ``asp_bm``. As you go to numerically larger post-spacings on output, you are averaging more point data (that is probably spatially correlated anyway) together. So you can either use the ``--dem-spacing`` argument to ``point2dem`` to do that directly, or you can use your favorite averaging algorithm to reduce the ``point2dem``-created model down to the scale you want. If you attempt to derive science results from an ASP-produced terrain model with the default DEM spacing, expect serious questions from reviewers. LAS or CSV clouds ~~~~~~~~~~~~~~~~~ The ``point2dem`` program can take as inputs point clouds in LAS and CSV formats. These differ from point clouds created by stereo by being, in general, not uniformly distributed. It is suggested that the user pick carefully the output resolution for such files (``--dem-spacing``). If the output DEM turns out to be sparse, the spacing could be increased, or one could experiment with increasing the value of ``--search-radius-factor``, which will fill in small gaps in the output DEM by searching further for points in the input clouds. It is expected that the input LAS files have spatial reference information such as WKT data. Otherwise it is assumed that the points are raw :math:`x,y,z` values in meters in reference to the planet center (ECEF). Unless the output projection is explicitly set when invoking ``point2dem``, the one from the first LAS file will be used. For LAS or CSV clouds it is not possible to generate triangulation (ray intersection) error maps or ortho images. For CSV point clouds, the option ``--csv-format`` must be set. The option ``--csv-srs`` containing a PROJ or WKT string needs to be specified to interpret this data. If not provided, the value set in ``--t_srs`` will be used. Output statistics ~~~~~~~~~~~~~~~~~ When ``point2dem`` concludes, it prints the *percentage of valid pixels*, which is the number of pixels in the produced floating-point image that are valid heights (not equal to the no-data value saved in the geoheader) divided by the total number of pixels, and then multiplied by 100. Note that if the DEM footprint is rotated in the image frame, there will be blank regions at image corners, so normally this percentage can be between 50 and 100 (or so) even when stereo correlation was fully successful. .. _point2dem_options: Command-line options for point2dem ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --t_srs 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. See :numref:`point2dem_proj` for details. -s, --tr, --dem-spacing Set output DEM resolution (in target georeferenced units per pixel). These units may be in meters or degrees, depending on the projection. If not specified, it will be computed automatically (except for LAS and CSV files). Multiple spacings can be set (in quotes) to generate multiple output files. -o, --output-prefix Specify the output prefix. The output DEM will be ``-DEM.tif``. --t_projwin Specify a custom extent in georeferenced coordinates. This will be adjusted to ensure that the grid points are placed at integer multiples of the grid size, unless ``--gdal-tap`` is on. --datum Set the datum. This will override the datum from the input images and also ``--t_srs``, ``--semi-major-axis``, and ``--semi-minor-axis``. Options: - WGS84 (WGS_1984) - WGS72 - NAD83 - NAD27 - Earth (alias for WGS84) - D_MOON (1,737,400 meters) - D_MARS (3,396,190 meters) - MOLA (3,396,000 meters) - Mars (alias for D_MARS) - Moon (alias for D_MOON) --orthoimage Write an orthoimage based on the texture files passed in as inputs (after the point clouds). Must pass ``-L.tif`` when using this option. Produces ``-DRG.tif``. --errorimage Write an additional image, whose values represent the triangulation ray intersection error in meters (the closest distance between the rays emanating from the two cameras corresponding to the same point on the ground). Filename is ``-IntersectionErr.tif``. If stereo triangulation was done with the option ``--compute-error-vector``, this intersection error will instead have 3 bands, corresponding to the North-East-Down coordinates of that vector (:numref:`triangulation_options`), unless the option ``--scalar-error`` is set. --nodata-value Set the nodata value. --reference-spheroid This is identical to the datum option. --semi-major-axis Explicitly set the datum semi-major axis in meters. --semi-minor-axis Explicitly set the datum semi-minor axis in meters. --sinusoidal Save using a sinusoidal projection. --mercator Save using a Mercator projection. --transverse-mercator Save using a transverse Mercator projection. --orthographic Save using an orthographic projection. --stereographic Save using a stereographic projection. See also ``--auto-proj-center``. --oblique-stereographic Save using an oblique stereographic projection. --gnomonic Save using a gnomonic projection. --lambert-azimuthal Save using a Lambert azimuthal projection. --utm Save using a UTM projection with the given zone (:numref:`point2dem_utm`). --geographic Save using the geographic projection (longitude and latitude). Recommended only close to the equator. --proj-lon The center of projection longitude. If not specified, it will be computed automatically based on the estimated point cloud median (option ``--auto-proj-center``). --proj-lat The center of projection latitude. See also ``--proj-lon``. --auto-proj-center Automatically compute the projection center, based on the median of a sample of points in the cloud, unless ``--proj-lon`` and ``--proj-lat`` are set. This is the default in the latest build, but should be set for ASP 3.4.0 and earlier. --search-radius-factor Multiply this factor by ``--dem-spacing`` to get the search radius. The DEM height at a given grid point is obtained as the weighted average of heights of all points in the cloud within search radius of the grid point, with the weight given by the Gaussian of the distance from the grid point to the cloud point (see ``--gaussian-sigma-factor``). If not specified, the default search radius is the maximum of user-set ``--dem-spacing`` and internally estimated median DEM spacing, so the default factor is about 1. --gaussian-sigma-factor The value :math:`s` to be used in the Gaussian :math:`\exp(-s*(x/grid\_size)^2)` when computing the weight to give to a cloud point's contribution to a given DEM grid point, with *x* the distance in meters between the two. The default is -log(0.25) = 1.3863. A smaller value will result in a smoother terrain. --csv-format 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`` (a Cartesian coordinate system with origin at planet center is assumed, with the units being in meters), ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees, the radius is measured in meters from planet center), ``3:lat 2:lon 1:height_above_datum``, ``1:easting 2:northing 3:height_above_datum`` (need to set ``--csv-srs``; the height above datum is in meters). Can also use radius_km for column_type, when it is again measured from planet center. --csv-srs The PROJ or WKT string to use to interpret the entries in input CSV files. If not specified, ``--t_srs`` will be used. See also :numref:`point2dem_proj`. --filter 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`` if ``--filter min`` is used. --gdal-tap Ensure that the bounds of output products (as printed by ``gdalinfo``, :numref:`gdal_tools`) are integer multiples of the grid size (as set with ``--tr``). This implies that the centers of output pixels are offset by 0.5 times the grid size. When ``--t_projwin`` is set and its entries are integer multiples of the grid size, that precise extent will be produced on output. This functions as the GDAL ``-tap`` option. --propagate-errors Write files with names ``-HorizontalStdDev.tif`` and ``-VerticalStdDev.tif`` having the gridded stddev produced from bands 5 and 6 of the input point cloud, if this cloud was created with the ``parallel_stereo`` option ``--propagate-errors`` (:numref:`error_propagation`). The same gridding algorithm is used as for creating the DEM. --remove-outliers-params 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. --use-tukey-outlier-removal Remove outliers above Q3 + 1.5*(Q3 - Q1). Takes precedence over ``--remove-outliers-params``. --max-valid-triangulation-error 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``. --scalar-error If the point cloud has a vector triangulation error, ensure that the intersection error produced by this program is the rasterized norm of that vector. See also ``--error-image``. -t, --output-filetype Specify the output file type. --proj-scale The projection scale (if applicable). --false-northing The projection false northing (if applicable). --false-easting The projection false easting (if applicable). --input-is-projected Input data is already in projected coordinates, or is a point cloud in Cartesian coordinates in a box such as [-10, 10]^3. Need not be spatially organized. If both a top and bottom surface exists (such as indoors), one of them must be cropped out. Point (0, 0, 0) is considered invalid. Must specify a projection to interpret the data and the output grid size. --rounding-error 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. See also ``--point-cloud-rounding-error`` and ``--save-double-precision-point-cloud`` for when the input point cloud is created (:numref:`triangulation_options`). --dem-hole-fill-len Maximum dimensions of a hole in the output DEM to fill in, in pixels. For large holes, use instead ``dem_mosaic`` (:numref:`dem_mosaic_extrapolate`). --orthoimage-hole-fill-len Maximum dimensions of a hole in the output orthoimage to fill in, in pixels. See also ``--orthoimage-hole-fill-extra-len``. For large holes, use instead ``mapproject`` (:numref:`mapproject`). --orthoimage-hole-fill-extra-len 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. --max-output-size Creating of the DEM will be aborted if it is calculated to exceed this size in pixels. --median-filter-params 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. --erode-length Erode input point clouds by this many pixels at boundary (after outliers are removed, but before filling in holes). --copc-win Specify the region to read from a COPC LAZ file. The units are based on the projection in the file. This is required unless ``--copc-read-all`` is set. Specify as ``minx miny maxx maxy``, or ``minx maxy maxx miny``, with no quotes. See :numref:`point2dem_las`. --copc-read-all Read the full COPC file, ignoring the ``--copc-win`` option. --x-offset Add a longitude offset (in degrees) to the DEM. --y-offset Add a latitude offset (in degrees) to the DEM. --z-offset Add a vertical offset (in meters) to the DEM. --use-alpha Create images that have an alpha channel. -n, --normalized Also write a normalized version of the DEM (for debugging). --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. --cog Write a cloud-optimized GeoTIFF (COG). See :numref:`cog_output`. -h, --help Display the help message. ================================================ FILE: docs/tools/point2las.rst ================================================ .. _point2las: point2las --------- This tool can convert point clouds generated by ASP (:numref:`triangulation_files`) and DEMs to the `LAS format `_ It relies on the `PDAL library `_, which is shipped with ASP. If the input cloud has a datum, or the ``--datum`` option is specified, then the output LAS file will be created in respect to this datum. Otherwise ECEF :math:`x,y,z` values will be saved. The ``point2dem`` program (:numref:`point2dem`) can create a DEM from the LAS file, and ``pc_align`` (:numref:`pc_align`) can align point clouds, including in the LAS format. Examples ~~~~~~~~ Create a LAS file:: point2las output-prefix-PC.tif -o output-prefix This will produce the file ``output-prefix.las``. If the ``--compressed`` option is passed in, it will write instead ``output-prefix.laz`` The datum can be set as ``--datum WGS_1984`` or ``--datum D_MOON``, for example. It is usually auto-guessed. A projection can be set with ``--t_srs``. Save the intensity of each triangulated point, as borrowed from the aligned (and normalized) left image ``L.tif`` (:numref:`outputfiles`), in the ``W`` field of the LAS file, in double precision:: point2las output-prefix-PC.tif \ --save-intensity-from-image output-prefix-L.tif \ -o output-prefix Save the triangulation error (:numref:`triangulation_error`) as the ``TextureU`` field in the LAS file in double precision:: point2las --save-triangulation-error \ output-prefix-PC.tif \ -o output-prefix Save the standard deviations of the horizontal and vertical components of uncertainty (:numref:`error_propagation`) to the ``TextureV`` and ``TextureW`` fields in the LAS file in double precision:: point2las --save-stddev \ output-prefix-PC.tif \ -o output-prefix Convert a DEM to a LAS file:: point2las --dem dem.tif -o output-prefix See the command-line options in :numref:`point2las_options` for more details. Validation ~~~~~~~~~~ A LAS or LAZ file can be inspected as:: pdal info --all file.las Outlier removal ~~~~~~~~~~~~~~~ The ``point2las`` program filters out outliers in the input point cloud using the ray triangulation error (:numref:`triangulation_error`). Points with an error above a certain threshold are not included in the output LAS file. The triangulation error can be saved as well (:numref:`point2las_options`). This program first picks a desired number of samples from the cloud, sorts the positive triangulation errors from the sample (the errors equal to 0 correspond to invalid points, so these are ignored), and computes some statistical measures which are printed to the screen. Those include the minimum, mean, standard deviation, maximum, and the error percentiles at 25% (Q1), 50% (median, Q2) and 75% (Q3). Then, given the desired percentile and factor in ``--remove-outliers-params``, it computes the error for this percentile and multiplies it by the factor. With the default settings, this amounts to 3*Q3. This value is used as the cutoff threshold to remove outliers. If the option ``--use-tukey-outlier-removal`` is set, the outlier cutoff is computed as Q3 + 1.5*(Q3 - Q1) :cite:`tukey1977exploratory`. This takes precedence over the earlier approach. Alternatively, the user can specify a custom outlier cutoff via ``--max-valid-triangulation-error``, when it will be used instead of any of the above. If it is desired to not remove any outliers, the percentage in ``--remove-outliers-params`` can be set to 100. After the LAS file is saved, the number of outliers and their percentage from the total number of points are printed on the screen. Generally, the outlier threshold should not be so restrictive that more than approximately 30% of the points are eliminated. .. _point2las_options: Command-line options for point2las ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --datum 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 - NAD27 - Earth (alias for WGS_1984) - Mars (alias for D_MARS) - Moon (alias for D_MOON) --reference-spheroid This is identical to the datum option. --t_srs 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. --compressed Compress using laszip. -o, --output-prefix Specify the output file prefix. --remove-outliers-params Outlier removal based on percentage. Points with triangulation error larger than pct-th percentile times factor will be removed as outliers. --use-tukey-outlier-removal Remove outliers above Q3 + 1.5*(Q3 - Q1) (:cite:`tukey1977exploratory`). This takes precedence over ``--remove-outliers-params``. --max-valid-triangulation-error 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 options. --save-intensity-from-image Save the intensity of each triangulated point, as borrowed from the aligned left image specified via this option, in the ``W`` field of the LAS file, in double precision. This bumps the LAS file version from 1.2 to 1.4. --save-triangulation-error Save the triangulation error (:numref:`triangulation_error`) from the input point cloud as the ``TextureU`` field in the LAS file, in double precision. Take into account the outlier filtering. This bumps the LAS file version from 1.2 to 1.4. --save-stddev Save the standard deviations of the horizontal and vertical components of uncertainty (:numref:`error_propagation`) from the ASP point cloud file to the ``TextureV`` and ``TextureW`` fields in the LAS file, in double precision. This bumps the LAS file version from 1.2 to 1.4. --num-samples-for-outlier-estimation Approximate number of samples to pick from the input cloud to find the outlier cutoff based on triangulation error. --dem Assume the input file is a DEM. --ecef Save the point cloud in ECEF, rather than with a projection relative to a datum. --no-input-georef Do not attempt to read the georeference from the input point cloud. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/point2mesh.rst ================================================ .. _point2mesh: point2mesh ---------- The ``point2mesh`` tool produces a mesh file in ``.obj`` format that can be visualized in any mesh viewer, such as Blender or MeshLab (see :numref:`blender` and :numref:`meshlab` for details). Unlike DEMs, the 3D mesh is not meant to be used as a finished scientific product. Rather, it can be used for fast visualization to create a 3D view of the generated terrain. The ``point2mesh`` program requires a point cloud file or a DEM, and an optional texture file. For example, it can be used with ``output-prefix-PC.tif`` and ``output-prefix-L.tif``, as output by ``stereo``, or otherwise with ``output-prefix-DEM.tif`` and ``output-prefix-DRG.tif``, with the latter two output by ``point2dem`` (:numref:`point2dem`). When a texture file is not provided, a constant texture is applied. (A mesh viewer will still show a color variation that depends on the local curvature of the mesh.) In either case, ``point2mesh`` will produce a mesh file in plain text format. The ``-s`` (``--point-cloud-step-size``) flag sets the point cloud sub-sampling rate, and dictates the degree to which the 3D model should be simplified. For 3D reconstructions, this can be essential for producing a model that can fit in memory. The default value is 10, meaning every 10th point is used in the X and Y directions. In other words that mean only :math:`1/10^2` of the points are being used to create the model. Adjust this sampling rate according to how much detail is desired, but remember that large models will impact the frame rate of the 3D viewer and affect performance. The ``--texture-step-size`` flag sets the texture sub-sampling rate. For visualization it may be preferable for the produced cloud to be rather coarse but for the texture overlaid on it to have higher resolution. This program enforces that the cloud subsampling rate be a multiple of the texture subsampling rate, hence the sampled texture indices are a superset of the point cloud indices. Examples ~~~~~~~~ :: point2mesh --center --point-cloud-step-size 4 \ --texture-step-size 2 output-prefix-PC.tif \ output-prefix-L.tif point2mesh --center -s 2 output-prefix-DEM.tif \ output-prefix-DRG.tif meshlab output-prefix.obj These examples use the option ``--center`` to shift the points towards the origin, as otherwise, given that mesh vertices are measured from planet center, and hence are large, mesh viewers, which typically use float32 precision, may render the mesh with artifacts without this option. (Note that older versions of MeshLab may have a hard time opening a mesh if the output prefix is a directory. In that case either open the mesh from the GUI or change to that directory having the ``.obj`` file first and invoke MeshLab there.) Command-line options ~~~~~~~~~~~~~~~~~~~~ -s, --point-cloud-step-size Sample by picking one out of these many samples from the point cloud. --texture-step-size Sample by picking one out of these many samples from the texture. --input-file Explicitly specify the input file. -o, --output-prefix Specify the output prefix. --texture-file Explicitly specify the texture file. --center Let the origin be the midpoint of the bounding box of the cloud. Use this option if you are experiencing numerical precision issues. --precision How many digits of precision to save. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/refr_index.rst ================================================ .. _refr_index: refr_index ---------- The ``refr_index`` program computes the effective refraction index of water for a specific satellite sensor band and given temperature and salinity. This has applications for shallow water bathymetry (:numref:`bathy_intro`). Examples ~~~~~~~~ Single wavelength refraction index:: refr_index --salinity 35 --temperature 20 \ --wavelength 532 Provide a spectral response file:: refr_index --salinity 35 --temperature 20 \ --spectral-response WV03_Green.csv The result is printed to standard output. Methodology ~~~~~~~~~~~ .. _spectral_response: Spectral response ^^^^^^^^^^^^^^^^^ It is assumed that a satellite band, such as Green for WorldView-3, records light in a narrow range of wavelengths. The spectral response of the band contains the sensitivity of the sensor to each wavelength in that band. An effective wavelength is first computed as the weighted average of the wavelengths, with the weights given by the spectral response. The refraction index is then computed with this effective wavelength (:numref:`refr_model`). The spectral response CSV file must have two columns, with the wavelength (in nanometers) in the first column, the relative response for that wavelength in the second column. Use commas, spaces, or tabs as separators. The first line must be a header and will be ignored. Wavelengths outside the range 300-1100 nm will be ignored (skipped). Wavelengths in the range 300-1100 nm but outside 400-700 nm will be used but a warning will be printed, as they are outside the validated range for the models (:numref:`refr_model`). Example:: wavelength response 521 0.78240309 522 0.78540934 523 0.79221241 524 0.79904049 525 0.80684987 Salinity and temperature ^^^^^^^^^^^^^^^^^^^^^^^^ The salinity is measured in parts per thousand (ppt). Typical seawater has a salinity of 35 ppt and freshwater has a salinity of 0 ppt. The temperature is measured in degrees Celsius. The model expects values between 0°C and 30°C. .. _refr_model: Modeling ^^^^^^^^ Two methods are available for computing the refraction index: * Quan and Fry (:cite:`quan1995empirical`, `source code `_) - directly handles salinity without interpolation. This is the default. * `Parrish (2020) `_ - uses linear interpolation between freshwater (S=0) and seawater (S=35) coefficients. Use the ``--mode`` switch to choose between these two. .. _refr_options: Command-line options ~~~~~~~~~~~~~~~~~~~~ --salinity Salinity in parts per thousand (ppt). A good value is 35 ppt. Required. --temperature Temperature in degrees Celsius. Must be between 0 and 30. Required. --mode Refraction index equation to use: ``Quan-Fry`` (default) or ``Parrish``. See :numref:`refr_model` for details. --spectral-response CSV file containing the spectral response of the sensor band. See an example in :numref:`spectral_response`. Mutually exclusive with ``--wavelength``. --wavelength Calculate refraction index for single wavelength (nm). Validated range is 400-700 nm. A warning will be printed for wavelengths between 300-1100 nm and outside the narrower range. There will be an error outside the 300-1100 nm range. Mutually exclusive with ``--spectral-response``. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/rig_calibrator.rst ================================================ .. _rig_calibrator: rig_calibrator -------------- The ``rig_calibrator`` program takes as input image and/or depth+image datasets acquired with one or more rigs, each having one or more cameras. It finds the relationship among the rig sensors, the pose of each camera image, and refines the intrinsics of each sensor. This tool was created as part of the `ISAAC `_ project. The ``rig_calibrator`` program was extensively tested with actual hardware and can model many real-world issues encountered with a rig. Its output can be used to create a fused surface mesh with seamless texture from each of its sensors, and, for ground data, also terrain models and orthoimages. The intrinsics of the sensors and each camera pose can also be optimized without the rig assumption. Then the sensors can acquire data at unrelated times (e.g., years apart). In that case the transforms among the sensors on the rig are not modeled, but any group of images acquired with the same sensor still share intrinsics. The `Theia `_ package is invoked (and shipped with ASP) to find the initial camera poses (:numref:`theia_sfm`). See :numref:`rig_calibrator_example` for a solved example, :numref:`sfm_iss` for a larger example covering a full ISS module, and :numref:`rig_msl` for an example using MSL Curiosity rover images. .. figure:: ../images/rig_calibrator_textures.png :name: rig_calibrator_textures :alt: Rig calibrator texture outputs. Textures obtained with the ``nav_cam`` and ``sci_cam`` rig cameras, (left and right) projected onto the mesh obtained with the ``haz_cam`` depth+image camera. The textures are nearly seamless and agree very well when overlaid, which shows that the rig calibration was successful. Note that the ``sci_cam`` pictures (on the right) have some lightning variation due to the fact that auto-exposure was used. The images show a portion of the Granite Lab at NASA Ames. Capabilities ~~~~~~~~~~~~ - The cameras on the rig may be purely image cameras, or may have a depth component. In the latter case, the transform from a camera's depth to image coordinate system is modeled. - No calibration target is assumed, so the image/depth data are acquired in situ. - The solved-for camera poses and relationships among sensors can be registered to real-world coordinates via user-selected control points. - All images acquired with one sensor are assumed to share intrinsics. The user may choose which intrinsics of which sensor are optimized or kept fixed, while the rig transforms and camera poses are optimized. - There can be zero, one, or more rigs. - It is not assumed that the rig sensors have a shared field of view. Yet, a surface seen in one sensor should at some point be seen also in other sensors. - The sensors on the rig may acquire data simultaneously or not. In the latter case one sensor is expected to acquire data frequently enough to be used to bracket data from the other sensors in time using bilinear interpolation of the camera poses (if the rig assumption is used). - A known time offset among the clocks of the various sensors on the rig is modeled and can be optimized. (By default no offset is assumed.) - A preexisting mesh of the surface being imaged can be used as a constraint (rays corresponding to the same feature must intersect close to the mesh). Otherwise one can constrain the triangulated points to not move too far from their original values. - Several quality metrics are printed on output, error reports are saved to disk, and for each image with its optimized camera a textured mesh with that image is created, for visual examination of any misalignments (if an input mesh is given). .. _rig_data_conv: Input data conventions ~~~~~~~~~~~~~~~~~~~~~~ Each rig sensor must have a name, such as ``ref_cam``, ``alt_cam``, etc. Each image must have a timestamp and be associated with a sensor. This information can be specified with a file / directory structure or in a list. File name convention ^^^^^^^^^^^^^^^^^^^^ If an image name (without directory) has a timestamp followed by a sensor string as part of its name, those will be parsed. Example:: my_images/10004.6.jpg The last encountered sequence of digits (optionally followed by decimal period and more digits) before the sensor name will be the timestamp. The earliest encountered string matching the sensor name will be used. *It is strongly suggested to not have any other digits in the image name, as that may confuse the parser.* An example of this naming convention is in :numref:`orbital_rig`. Directory structure ^^^^^^^^^^^^^^^^^^^ The images can be organized in directories according to the convention:: //. For example, two images acquired at time 1004.6 can be named:: my_images/ref_cam/10004.6_ref_cam.jpg my_images/alt_cam/10004.6_alt_cam.jpg List format ^^^^^^^^^^^ With the ``--image-sensor-list`` option, can pass in a list, in which each line can look as:: /image.tif ref_cam 10004.6 The second entry is the sensor name and the third is the timestamp. Assumptions about images ^^^^^^^^^^^^^^^^^^^^^^^^ All image names (without directory path) must unique. The images are expected to be 8 or 16 bit, with .jpg, .png, or .tif extension. Assumptions about the timestamp ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A timestamp that is part of a file name must consist only of digits and a decimal period. Anything starting with another character (including another period) will not be part of the timestamp. Hence, a value like 123.4e+5 will be converted to 123.4. If the rig constraint is used (omitting ``--no-rig``), and the sensors acquire the images at independent times, the timestamp must represent the precise image acquisition time, in seconds, in double precision. Without the rig constraint, or if all the sensors on the rig take pictures simultaneously, the only assumption is that images have the same timestamp only if taken at the same time, with the precise timestamp value not used (but one must set ``--bracket-len`` to a small value). See also ``--num-overlaps``. The following bash script can copy the images to new names of the form ``dir//.``:: mkdir -p new_images/my_cam ext=".jpg" ((timestamp=100000)) for image in $(ls old_images/*${ext}); do /bin/cp -fv $image new_images/my_cam/${timestamp}.my_cam${ext} ((timestamp++)) done Depth data ^^^^^^^^^^ If for some images there is depth data, a depth data file must have the same name as the corresponding image, but with a ``.pc`` extension. Example:: my_images/alt_cam/10004.6_alt_cam.pc All such depth cloud files will be loaded automatically alongside images if present. See :numref:`point_cloud_format` for the file format. The reference sensor ~~~~~~~~~~~~~~~~~~~~ With the rig constraint, if each sensor acquires images independently, one of the sensors, named the *reference* sensor, should acquire images frequently enough to help bracket the other sensors in time using bilinear pose interpolation. .. _rig_config: Configuration file ~~~~~~~~~~~~~~~~~~ What is known about the rig, or set of rigs, should be specified in a plain text file, with the following syntax:: # Anything after the pound sign is a comment ref_sensor_name: # For each sensor on the rig, specify the following: sensor_name: focal_length: # units of pixel optical_center: # units of pixel distortion_coeffs: distortion_type: image_size: distorted_crop_size: undistorted_image_size: ref_to_sensor_transform: <12 doubles> depth_to_image_transform: <12 doubles> ref_to_sensor_timestamp_offset: Example (only one of the *N* sensors is shown):: ref_sensor_name: nav_cam sensor_name: nav_cam focal_length: 621.04422 optical_center: 580.56426999999996 495.51236 distortion_coeffs: 1.0092038999999999 distortion_type: fov image_size: 1280 960 distorted_crop_size: 1280 960 undistorted_image_size: 1500 1200 ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 0 0 0 depth_to_image_transform: 1 0 0 0 1 0 0 0 1 0 0 0 ref_to_sensor_timestamp_offset: 0 If there is more than one sensor on the rig, need to create a new value for ``sensor_name``, and add a block as above for each sensor (without a new ``ref_sensor_name``). The first specified sensor must be the reference one. If there is more than one rig, there should be a new line having ``ref_sensor_name``, and then continue as above. See a full example with two rigs in :numref:`sfm_iss_sample_rig_config`. The lens distortion model can be one of ``no_distortion`` (zero distortion parameters), ``fov`` (1 distortion parameter), ``fisheye`` (4 distortion parameters), or ``radtan`` (radial-tangential, 4 or 5 distortion parameters). The ``fisheye`` and ``radtan`` distortion models are the same as in OpenCV. The ``fisheye`` model with one distortion parameter will be cast to ``fov`` (this is for backward compatibility). See :numref:`pinholemodels` for more details. The ``ref_to_sensor_transform`` field has the rotation (9 doubles, stored row after row) and translation (3 doubles) transform from the reference sensor to the sensor with given name, while ``depth_to_image_transform`` is the transform from the depth to image coordinate systems of a given depth+image sensor. These must be set to the identity transform (example below) if not known or not applicable. That is usually the case for the first invocation of this tool, when the ``ref_to_sensor_transform`` values are initialized based on the camera poses of each input camera (unless ``--use-initial-rig-transforms`` is set). The value ``ref_to_sensor_timestamp_offset``, measured in seconds, is what should be added to the reference camera clock to get the time in current sensor's clock. Set to 0 if the clocks are synchronized. The ``image_size`` field has the image dimensions (width and height). The ``distorted_crop_size`` has the dimensions of the region whose center is also the image center in which the given distortion model is valid. Normally it should be the whole image. The ``undistorted_image_size`` has a somewhat generous overestimate of the image dimensions after undistortion. Educated guess can be provided for the quantities that are not known. This tool can be used to optimize the focal length, optical center, and distortion coefficients (the latter requires many interest point matches, espcially around image corners). The undistorted image size also need not be known accurately. A tighter ``distorted_crop_size`` can help for images with strong distortion if the distortion model is not expressive enough to fit it precisely. But this then also eliminates interest point matches in the corners of the image, which is not good when solving for lens distortion. A file in the same format will be written in the output directory, with the name:: /rig_config.txt This time the transforms among the rig sensors will be known, having been computed and optimized. Such a file can be read with the option ``--rig-config``. .. _rig_calibrator_outputs: Output files ~~~~~~~~~~~~ The optimized rig configuration in the format described in :numref:`rig_config` is saved to:: /rig_config.txt The image names, camera poses, and interest point matches are stored in the NVM format. These are determined using the Theia structure-from-motion software, and are read by ``rig_calibrator`` via the ``--nvm`` option. The optimized camera poses and inlier interest point matches will be written in the same format when this program finishes. Then the output nvm file name is:: /cameras.nvm In this file, the interest point matches are offset relative to the optical center. This file can be passed in to a new invocation ``rig_calibrator`` via ``--nvm``. The optical centers per image are written separately, to:: /cameras_offsets.txt This is because these are not part of the .nvm file format. If the option ``--save-nvm-no-shift`` is specified, the additional file:: /cameras_no_shift.nvm will be saved, in the same format as above, but without interest points being shifted relative to the optical center for the corresponding image. This file is is easier to plot, as there is no shift to undo, with the latter needing to be stored separately. To read this back, use ``--read-nvm-no-shift``. The produced .nvm files can be visualized with ``stereo_gui`` (:numref:`stereo_gui_nvm`). A submap can be extracted with ``sfm_submap`` (:numref:`sfm_submap`). In addition, a plain text file having just the list of images and world-to-camera poses will be written, with the name:: /cameras.txt Each line in this file has the format:: //. <12 doubles> Here, the 12 values are the rows of the world-to-camera rotation and then the world-to-camera translation. See the ``--camera-poses`` option (:numref:`rig_opts`) for how this file can be read back in. Note that camera's position and orientation in world coordinates are determined by taking the inverse of this rotation + translation transform. The inlier residuals for each camera (that is, norm of reprojection errors, with reprojection errors defined as the difference of interest points and projection of triangulated interest points back in the camera), before and after optimization, are saved to:: /-initial-residuals.txt /-final-residuals.txt in the format:: distorted_pixel_x distorted_pixel_y norm(residual_x, residual_y) The convergence angle percentiles for each pair of images having inlier matches, together with the number of such matches for each pair, are saved to:: /convergence_angles.txt The option ``--export-to-voxblox`` saves files that can be used with ``voxblox_mesh`` (:numref:`voxblox_mesh`). The list of images is saved (one per line) to:: /image_list.txt How to export the data for use in bundle adjustment is discussed in :numref:`rc_ba`. Examples ~~~~~~~~ - A step-by-step-example (:numref:`rig_calibrator_example`). - A larger example covering a full ISS module (:numref:`sfm_iss`). - An example using MSL Curiosity rover images (:numref:`rig_msl`). - An orbital rig with DEM constraints (:numref:`orbital_rig`). Notes ~~~~~ Optimizing the camera poses (without control points or a preexisting mesh constraint) can change the scale and orientation of the camera set. The output directory will have the optimized rig configuration and camera poses for all images. These can be used as inputs for a subsequent invocation, if needed to fine-tune things. .. _rig_constraints: Constraints on rig transforms ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this section we assume that ``--no-rig`` is not set, so we have a rig. If ``--camera-poses-to-float`` lists all sensors, all cameras can change in any way, as long as they are tied together by an (evolving) rig at all times. If only the reference sensor is mentioned in ``--camera-poses-to-float``, the cameras for this sensor will change freely, but the other cameras will only change as necessary to respect the rig constraint, while the rig configuration stays fixed. If the reference sensor is not specified in ``--camera-poses-to-float``, the cameras for this sensor will stay fixed, while the transform from the reference sensor to another sensor will change only if that sensor is mentioned in ``--camera-poses-to-float``. An analogous parameter is ``--depth-to-image-transforms-to-float``. Independent of these, the options ``--fix-rig-translations`` and ``--fix-rig-rotations``, used separately or together, can constrain either the translation or rotation component of all transforms from the reference sensor to the other sensors. These options are described in :numref:`rig_opts`. Constraints on cameras ~~~~~~~~~~~~~~~~~~~~~~ The parameter ``--camera-position-uncertainty`` constrains how far cameras can move. This specifies the expected uncertainty (1 sigma, in meters) for camera positions. Smaller values create tighter constraints that may impede convergence. This is added to the cost function as the sum of squares of differences between initial and current camera positions, divided by the uncertainty. Constraints on triangulated points ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Triangulated points are, by default, set to not move too far, after registration. See ``--tri-weight`` and ``--tri-robust-threshold``. The ``--heights-from-dem`` option can constrain triangulated points to be close to a DEM. This is applicable for orbital images. The logic is as for bundle adjustment (:numref:`heights_from_dem`). An example is in :numref:`orbital_rig`. Additional constraints are ``--depth-mesh-weight`` and ``--depth-tri-weight`` (:numref:`rig_opts`). .. _rig_calibrator_registration: Determination of scale and registration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The cameras produced so far are in an arbitrary coordinate system. This section describes how to register them to known Cartesian coordinates. For registering rover cameras to a DEM, see :numref:`msl_registration`. To transform the system of cameras to world coordinates, it is necessary to know the Cartesian coordinates of at least three control points in the scene, and then to pick the pixel of coordinates of each of these points in at least two images. All images used in registration must be for the same sensor. To find the pixel coordinates, open, for example, a subset of the camera images for one of the sensors in Hugin, such as:: hugin //*.jpg It will ask to enter a value for the FoV (field of view). That value is not important since we won't use it. One can input 10 degrees, for example. Go to the "Expert" interface, choose a couple of distinct images, and click on a desired control point in both images. Make sure the left and right image are not the same or highly similar, as that may result in poor triangulation and registration. Add that point. Then repeat this process for all control points. Save the Hugin project to disk. Create a separate text file which contains the world coordinates of the control points picked earlier, with each line in the "x y z" format, and in the same order as the Hugin project file. That is to say, if a control point was picked in several image pairs in Hugin, it must show up also the same number of times in the text file, in the same order. In the xyz text file all lines starting with the pound sign (#) are ignored, as well as all entries on any line beyond three numerical values. The dataset from :numref:`rig_calibrator_example` has examples of files used for registration, and shows how to pass these to the tool. After registration is done, it will print each transformed coordinate point from the map and its corresponding measured point, as well as the error among the two. That will look as follows:: transformed computed xyz -- measured xyz -- error norm (meters) -0.0149 -0.0539 0.0120 -- 0.0000 0.0000 0.0000 -- 0.0472 img1.jpg img2.jpg 1.8587 0.9533 0.1531 -- 1.8710 0.9330 0.1620 -- 0.0254 img3.jpg img4.jpg Each error norm (last value), is the distance between a measured 3D point and its computed value based on the registered cameras. If some of them are too large, may be the measurements have some error, or the camera poses or intrinsics are not accurate enough. Note that the registration happens before the optimization, and that can move the cameras around somewhat. Hence the registration is redone after the last optimization pass, unless the flag ``--skip-post-registration`` is specified. The initial registration does not change the depth-to-image transforms, as those are presumed to be reasonably known, unlike the image camera poses, which are determined normally using Theia and are in an arbitrary coordinate system. After the cameras and all transforms are optimized, including the depth-to-image transforms, if present, and if registration happens at the end, these transforms will be changed as well, for consistency with the transforms among the image cameras. If the images cover a large area, it is suggested to use registration points distributed over that area. Registration may not always produce perfect results since a structure-from-motion solution may drift over large distances. The software does not force the camera poses to move individually to fit better the control points. Therefore, the cameras are always kept self-consistent, then the camera configuration has a single registration transform applied to it to fit the control points. The only approach to make the cameras individually conform more faithfully to what is considered accurate geometry is to use the mesh constraint, if such a prior surface mesh is available. .. _rig_calibration_stats: Quality metrics ~~~~~~~~~~~~~~~ The rig calibrator will print out some statistics showing the residual errors before and after each optimization pass (before outlier removal at the end of the pass), as follows:: The 25, 50, 75, and 100th percentile residual stats after opt depth_mesh_x_m: 0.0018037 0.0040546 0.011257 0.17554 (742 residuals) depth_mesh_y_m: 0.0044289 0.010466 0.025742 0.29996 (742 residuals) depth_mesh_z_m: 0.0016272 0.0040004 0.0080849 0.067716 (742 residuals) depth_tri_x_m: 0.0012726 0.0054119 0.013084 1.6865 (742 residuals) depth_tri_y_m: 0.0010357 0.0043689 0.022755 3.8577 (742 residuals) depth_tri_z_m: 0.00063148 0.0023309 0.0072923 0.80546 (742 residuals) haz_cam_pix_x: 0.44218 0.99311 2.1193 38.905 (819 residuals) haz_cam_pix_y: 0.2147 0.49129 1.3759 95.075 (819 residuals) mesh_tri_x_m: 0.0002686 0.00072069 0.014236 6.3835 (5656 residuals) mesh_tri_y_m: 9.631e-05 0.00032232 0.057742 9.7644 (5656 residuals) mesh_tri_z_m: 0.00011342 0.00031634 0.010118 1.0238 (5656 residuals) nav_cam_pix_x: 0.098472 0.28129 0.6482 155.99 (47561 residuals) nav_cam_pix_y: 0.11931 0.27414 0.55118 412.36 (47561 residuals) sci_cam_pix_x: 0.33381 0.70169 1.4287 25.294 (2412 residuals) sci_cam_pix_y: 0.24164 0.52997 0.90982 18.333 (2412 residuals) These can be helpful in figuring out if the calibration result is good. The errors whose name ends in "_m" are in meters and measure the absolute differences between the depth clouds and mesh (depth_mesh), between depth clouds and triangulated points (depth_tri), and between mesh points and triangulated points (mesh_tri), in x, y, and z, respectively. The ``mesh`` residuals will be printed only if a mesh is passed on input and if the mesh-related weights are positive. Some outliers are unavoidable, hence some of these numbers can be big even if the calibration overall does well (the robust threshold set via ``--robust-threshold`` does not allow outliers to dominate). See the option ``--max-reprojection-error`` for filtering outliers. It is best to not filter them too aggressively unless one has very high confidence in the modeling of the cameras. Source of errors can be, as before, inaccurate intrinsics, camera poses, or insufficiently good modeling of lens distortion. When each rig sensor has its own clock, or acquires images at is own rate, the discrepancy among the clocks (if the timestamp offsets are not set correctly) or insufficiently tight bracketing (cameras moving too much between acquisitions meant to serve as brackets) may be source of errors as well. In this case one can also try the tool with the ``--no-rig`` option, when the cameras are decoupled and see if this makes a difference. Handling failures ~~~~~~~~~~~~~~~~~ This software was very carefully tested in many circumstances, and it is though to be, by and large, correct, and it should normally co-register all images to within 0-5 pixels, and likely even better if distortion is modeled accurately. (Quality can be verified as above, by projecting the camera images onto a mesh obtained either from depth clouds or stereo.) If it performs poorly, it may be because: - Image timestamps are not accurate. Then try using the ``--no-rig`` option, adjust the timestamp offsets, or use tighter bracketing with ``--bracket-len``. - Distortion is very strong and not modeled well. Then reduce the domain of each image by making ``distorted_crop_size`` smaller in the rig configuration, or switch to a different distortion model, or allow distortion to be optimized by this tool. - The best-fit distortion model can be inaccurate unless there are many interest point matches, especially in the image periphery. See :numref:`theia_sfm_config` for how to get more matches. The produced matches should be visualized in ``stereo_gui`` (:numref:`stereo_gui_nvm`). - Some image pairs have insufficient matches, which may result in poor initial camera poses. This can be addressed as for distortion, in the paragraph above. This tool has good robustness to that when the rig constraint is used (so without ``--no-rig``) as then the transforms between rig sensors are found by using the median of transforms derived from individual image pairs, and the same rig transform applies for all acquisitions. - Some weights passed in (e.g., ``--tri-weight``, ``--mesh-tri-weight``) may be too high and prevent convergence. - The options ``--camera-poses-to-float`` (:numref:`rig_constraints`), ``--intrinsics-to-float``, ``--depth-to-image-transforms-to-float``, were not all specified and hence some optimizations did not take place. For understanding issues, it is strongly suggested to drastically reduce the problem to perhaps one or two images from each sensor, and turn on the debugging flags ``--save-matches``, ``--export-to-voxblox``, ``--save-transformed-depth-clouds``, ``--out-texture-dir``. Then, the images can be projected individually onto a mesh, and/or individual transformed clouds can be inspected. See an example output in :numref:`rig_calibrator_textures`. See note on validation in :numref:`msl_validation` for when working with orbital or ground-level images. One should also look at the statistics printed by the tool. .. _point_cloud_format: Point cloud file format ~~~~~~~~~~~~~~~~~~~~~~~ The depth point clouds (for the depth component of cameras, if applicable) are saved to disk in binary. The first three entries are of type ``int32``, having the number of rows, columns and channels (whose value is 3). Then, one iterates over rows, for each row iterates over columns, and three ``float32`` values corresponding to x, y, z coordinates are read or written. If all three values are zero, this point is considered to be invalid, but has to be read or written to ensure there exists one depth point for each corresponding image pixel. Note that the ``float32`` datatype has limited precision, but is adequate, unless the measurements are ground data taken from a planet's orbit. .. _rc_ba: Interfacing with bundle_adjust ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This program's program's output control network in .nvm format (including camera poses and interest point matches between the images) can be read by ``bundle_adjust`` (:numref:`bundle_adjust`), and vice-versa. The details are in :numref:`ba_nvm`. The optimized cameras produced with ``rig_calibrator`` can be saved in the ASP Pinhole format (:numref:`pinholemodels`) with the option ``--save-pinhole-cameras``. The list of saved cameras will be in the file:: rig_out/camera_list.txt while the list of input images will be in:: rig_out/image_list.txt Here and below we assume that the output directory is ``rig_out``. If ``rig_calibrator`` is called with the option ``--save-matches``, it will save the inlier interest point matches in the ASP ``bundle_adjust`` (:numref:`bundle_adjust`) format with the proper naming convention (:numref:`ba_match_files`). These can then be inspected in ``stereo_gui`` (:numref:`stereo_gui_pairwise_matches`) as:: stereo_gui $(cat rig_out/image_list.txt) \ rig_out/matches/run --pairwise-matches If both the matches and cameras are saved, ``bundle_adjust`` can be invoked as:: bundle_adjust \ --image-list rig_out/image_list.txt \ --camera-list rig_out/camera_list.txt \ --inline-adjustments \ --match-files-prefix rig_out/matches/run \ -o ba/run For a large number of images it is preferable to use the NVM file instead of the match files as input to ``bundle_adjust``, as described earlier. In order for exporting data this way to work, all input image names (without directory path) must be unique, as the ASP bundle adjustment counts on that. See the input naming convention in :numref:`rig_data_conv`. How to register the produced cameras to the ground is discussed in :numref:`msl_registration`. Usage ~~~~~ :: rig_calibrator --rig-config \ --nvm \ --image-sensor-list \ -o [options] .. _rig_opts: Command-line options ~~~~~~~~~~~~~~~~~~~~ --rig-config Read the rig configuration from file. --nvm Read images and camera poses from this nvm file, as exported by Theia. --image-sensor-list Read image name, sensor name, and timestamp, from each line in this list. The order need not be as in the nvm file. Alternatively, a directory structure can be used. See :numref:`rig_data_conv`. --robust-threshold Residual pixel errors and 3D point residuals (the latter multiplied by corresponding weight) much larger than this will be logarithmically attenuated to affect less the cost function. See also ``--tri-robust-threshold``. --affine-depth-to-image Assume that the depth-to-image transform for each depth + image camera is an arbitrary affine transform rather than scale * rotation + translation. See also ``--float-scale``. --bracket-len Lookup non-reference cam images only between consecutive ref cam images whose distance in time is no more than this (in seconds), after adjusting for the timestamp offset between these cameras. It is assumed the rig moves slowly and uniformly during this time. A large value here will make the calibrator compute a poor solution but a small value may prevent enough images being bracketed. The timestamp (in seconds) is part of the image name. See also ``--bracket-single-image``. --num-passes How many passes of optimization to do. Outliers will be removed after every pass. Each pass will start with the previously optimized solution as an initial guess. Mesh intersections (if applicable) and ray triangulation will be recomputed before each pass. --camera-poses-to-float Specify the cameras for which sensors can have their poses floated. Example: 'cam1 cam3'. See more details in :numref:`rig_constraints`. --fix-rig-translations Fix the translation component of the transforms between the sensors on a rig. Works only when ``--no-rig`` is not set. --fix-rig-rotations Fix the rotation component of the transforms between the sensors on a rig. Works only when ``--no-rig`` is not set. --camera-position-uncertainty Camera position uncertainty (1 sigma, in meters). This strongly constrains the movement of cameras, potentially at the expense of accuracy. Specify as a single value. --heights-from-dem Use this DEM to constrain the triangulated points. The uncertainty of the DEM is specified via ``--heights-from-dem-uncertainty``. --heights-from-dem-uncertainty Uncertainty (1 sigma) for ``--heights-from-dem``. A smaller value constrains more the triangulated points to the DEM specified via ``--heights-from-dem``. --heights-from-dem-robust-threshold Robust threshold for residual errors in triangulated points relative to DEM specified via ``--heights-from-dem``. This is applied after the point differences are divided by ``--heights-from-dem-uncertainty``. It will attenuate large height differences. Set to 0 to turn off. --tri-weight The weight to give to the constraint that optimized triangulated points stay close to original triangulated points. A positive value will help ensure the cameras do not move too far, but a large value may prevent convergence. This does not gets set for triangulated points at which ``--heights-from-dem`` or ``--mesh`` constraints are applied. --tri-robust-threshold The robust threshold to use with the triangulation weight. Must be positive. See also ``--robust-threshold``. --use-initial-triangulated-points Use the triangulated points from the input nvm file. Together with ``--tri-weight``, this ensures the cameras do not move too far from the initial solution. This will fail if additional interest point matches are created with ``--num-overlaps``. If registration is used, the initial triangulated points are transformed appropriately. --depth-mesh-weight A larger value will give more weight to the constraint that the depth clouds stay close to the mesh. Not suggested by default. --depth-to-image-transforms-to-float Specify for which sensors to float the depth-to-image transform (if depth data exists). Example: 'cam1 cam3'. --depth-tri-weight The weight to give to the constraint that depth measurements agree with triangulated points. Use a bigger number as depth errors are usually on the order of 0.01 meters while reprojection errors are on the order of 1 pixel. --float-scale If to optimize the scale of the clouds, part of depth-to-image transform. If kept fixed, the configuration of cameras should adjust to respect the given scale. This parameter should not be used with ``--affine-depth-to-image`` when the transform is affine, rather than rigid and a scale. --float-timestamp-offsets If to optimize the timestamp offsets among the cameras. This is experimental. --camera-poses Read the images and world-to-camera poses from this list. The same format is used as when this tool saves the updated poses in the output directory. It is preferred to read the camera poses with the ``--nvm`` option, as then interest point matches will be read as well. --initial-max-reprojection-error If filtering outliers, remove interest points for which the reprojection error, in pixels, is larger than this. This filtering happens when matches are created, before cameras are optimized, and a big value should be used if the initial cameras are not trusted. --intrinsics-to-float Specify which intrinsics to float for each sensor. Example: 'cam1:focal_length,optical_center,distortion cam2:focal_length'. --max-ray-dist The maximum search distance from a starting point along a ray when intersecting the ray with a mesh, in meters (if applicable). --max-reprojection-error If filtering outliers, remove interest points for which the reprojection error, in pixels, is larger than this. This filtering happens after each optimization pass finishes, unless disabled. It is better to not filter too aggressively unless confident of the solution. --mesh Use this mesh to help constrain the calibration (in .ply format). Must use a positive ``--mesh-tri-weight``. --mesh-tri-weight A larger value will give more weight to the constraint that triangulated points stay close to a preexisting mesh. Not suggested by default. --min-ray-dist The minimum search distance from a starting point along a ray when intersecting the ray with a mesh, in meters (if applicable). --no-rig Do not assumes the cameras are on a rig. Hence, the pose of any camera of any sensor type may vary on its own and not being tied to other sensor types. See also ``--camera-poses-to-float``. --num-iterations How many solver iterations to perform in calibration. --num-threads How many threads to use. (default: Number of cores on a machine). --num-match-threads How many threads to use in feature detection/matching. A large number can use a lot of memory. -o, --out-dir Save in this directory the camera intrinsics and extrinsics. See also ``--save-matches``, ``--verbose``. --out-texture-dir If non-empty and if an input mesh was provided, project the camera images using the optimized poses onto the mesh and write the obtained .obj files in the given directory. --num-overlaps Match an image with this many images (of all camera types for the same rig) following it in increasing order of timestamp value. Set to a positive value only if desired to find more interest point matches than read from the input nvm file. Not suggested by default. --no-nvm-matches Do not read interest point matches from the nvm file. So read only camera poses. This implies ``--num-overlaps`` is positive, to be able to find new matches. --parameter-tolerance Stop when the optimization variables change by less than this. --min-triangulation-angle If filtering outliers, remove triangulated points for which all rays converging to it make an angle (in degrees) less than this. Note that some cameras in the rig may be very close to each other relative to the triangulated points, so care is needed here. --registration If true, and registration control points for the sparse map exist and are specified by ``--hugin-file`` and ``--xyz-file``, register all camera poses and the rig transforms before starting the optimization. For now, the depth-to-image transforms do not change as result of this, which may be a problem. To apply the registration only, use zero iterations. --skip-post-registration If true and registration to world coordinates takes place, do not apply the registration again after the cameras are optimized. This is usually not recommended, unless one is quite confident that other constraints (such as using ``--tri-weight`` or ``--mesh-tri-weight``) are sufficient to keep the cameras from drifting. --hugin-file The path to the hugin .pto file used for registration. --xyz-file The path to the xyz file used for registration. --read-nvm-no-shift Read an nvm file assuming that interest point matches were not shifted to the origin. --save-nvm-no-shift Save the optimized camera poses and inlier interest point matches to /cameras_no_shift.nvm. Interest point matches are not offset relative to the optical center, which is not standard, but which allows this file to be self-contained and for the matches to be drawn with ``stereo_gui``. --save-matches Save the interest point matches (all matches and inlier matches after filtering). ``stereo_gui`` can be used to visualize these (:numref:`rc_ba`). --export-to-voxblox Save the depth clouds and optimized transforms needed to create a mesh with ``voxblox`` (if depth clouds exist). --save-transformed-depth-clouds Save the depth clouds with the camera transform applied to them to make them be in world coordinates. --save-pinhole-cameras Save the optimized cameras in ASP's Pinhole format (:numref:`rc_ba`). The distortion model gets saved if it is of ``radtan`` type (OpenCV radial-tangential distortion model). --timestamp-offsets-max-change If floating the timestamp offsets, do not let them change by more than this (measured in seconds). Existing image bracketing acts as an additional constraint. --use-initial-rig-transforms Use the transforms between the sensors (``ref_to_sensor_transform``) of the rig specified via ``--rig-config`` to initialize all non-reference camera poses based on the reference camera poses and the rig transforms. If this option is not set, derive the rig transforms from the poses of individual cameras. --fixed-image-list A file having a list of images (separated by spaces or newlines) whose camera poses should be fixed during optimization. These can be only reference sensor images when the rig constraint is on. --bracket-single-image If more than one image from a given sensor is acquired between two consecutive reference sensor images, as measured by timestamps, keep only one, choosing the image that is closest to the midpoint of the interval formed by reference sensor timestamps. Only applicable without ``--no-rig``. --extra-list Add to the SfM solution the camera poses for the additional images/depth clouds in this list. Use bilinear interpolation of poses in time and nearest neighbor extrapolation (within ``--bracket-len``) and/or the rig constraint to find the new poses (will be followed by bundle adjustment refinement). This can give incorrect results if the new images are not very similar or not close in time to the existing ones. This list can contain entries for the data already present. --nearest-neighbor-interp Use nearest neighbor interpolation (in time) when inserting extra camera poses. --verbose Print a lot of verbose information about how matching goes. -v, --version Display the version of software. -h, --help Display the help message. ================================================ FILE: docs/tools/ros.rst ================================================ .. _ros_tools: ROS bag handling tools ---------------------- ASP provides a couple of Python scripts that can query and extract images and depth clouds from a ROS bag. These are stored in the ``libexec`` directory of the ASP distribution, as they use the local system's Python rather than the Python shipped with ASP. It is assumed that ROS is installed on the local system. These tools are motivated by the fact that robot Structure-from-Motion datasets often come in ROS bags. For context and examples, see :numref:`sfm_iss`. .. _ros_tools_list: list_timestamps ^^^^^^^^^^^^^^^ Write the list of timestamps for all data in the bag for given topics. Example usage:: /usr/bin/python \ /path/to/ASP/libexec/list_timestamps \ --bag bag.bag --list bag_list.txt \ --topics "/topic1 /topic2" The output list will have entries of the form:: 1654694879.1690574 /topic1 The first value is a timestamp, in seconds since epoch. It is not the message timestamp, which is the time the message arrived at, but the timestamp saved in the message header, which is assumed to have the creation time of an image or depth cloud. .. _ros_tools_extract: extract_bag ^^^^^^^^^^^ Extract images and depth clouds from a bag. See :numref:`sfm_isis_data_prep` for usage. Command line options: ``--bag`` Input bag. ``--topics`` A list of topics, in quotes, having image, compressed image, or point cloud (depth) data. ``--dirs`` A list of directories, in quotes, one for each topic, in which to save the data for that topic. ``--timestamp_list`` Extract data for the timestamps in this list. If not set, extract all data. Each line in this file must contain a number of the form . (the timestamp) and perhaps other text as well, or it will be ignored. So, a filename containing a timestamp as part of its name will be accepted. ``--timestamp_tol`` If set, extract the data for each the given topics whose timestamps are closest to the ones in the input list, within this tolerance, in seconds. This should be kept small. It is assumed the bag stores the data for each topic in increasing value of timestamp. ``--approx_timestamp`` If using ``--timestamp_tol``, change the timestamp of the data being saved (which becomes part of the output filename) to be the closest timestamp in the input list. ================================================ FILE: docs/tools/sat_sim.rst ================================================ .. _sat_sim: sat_sim ------- The ``sat_sim`` program simulates a satellite traveling around a planet and taking pictures. It can either create camera models (Pinhole or linescan), or read them from disk. In either case it creates synthetic images for the given cameras. This tool can model camera jitter, a rig, and recording acquisition time. The inputs are a DEM and georeferenced image (ortho image) of the area of interest. See :numref:`sat_sim_dem` for how to create such inputs. If the input cameras are not specified, the orbit is determined by given endpoints. It is represented as a straight edge in the projected coordinate system of the DEM, which results in an arc around the planet. The images are created with bicubic interpolation in the ortho image and are saved with float pixels. Missing pixels will have nodata values. If the cameras are created from scratch, the camera view can follow a custom path on the surface with varying orientation (:numref:`sat_sim_custom_path`), or the cameras can have a fixed orientation, without (:numref:`sat_sim_roll_pitch_yaw`) and with (:numref:`sat_sim_roll_pitch_yaw_ground`) ground constraints. The cameras are assumed to be of Pinhole (Frame) type by default, and are saved as .tsai files (:numref:`pinholemodels`). The option ``--save-as-csm`` can be used to save the cameras in CSM format (:numref:`csm`). Linescan cameras are supported as well (:numref:`sat_sim_linescan`). Lens distortion is not modeled. Several use cases are below. .. _sat_sim_prior: Prior frame or linescan cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: sat_sim --dem dem.tif \ --ortho ortho.tif \ --camera-list camera_list.txt \ --image-size 800 600 \ -o run/run The camera names in the list should be one per line. The produced image names will be created from camera names by keeping the filename (without directory name) and replacing the extension with ``.tif``. They will start with specified output prefix. Hence, if the input camera is ``path/to/camera.tsai``, the output image will be ``run/run-camera.tif``. The value of ``--image-size`` should be chosen so that the ground sample distance of the produced images is close to the one of the input ortho image. To see how a created image projects onto the ground, run ``mapproject`` (:numref:`mapproject`) as:: mapproject dem.tif run/run-camera.tif path/to/camera.tsai \ camera.map.tif The images can be overlaid in ``stereo_gui`` (:numref:`stereo_gui`). A perturbation can be apply to given cameras (:numref:`sat_sim_perturb`). .. _sat_sim_nadir: Create nadir-pointing frame cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: sat_sim --dem dem.tif \ --ortho ortho.tif \ --first 397.1 400.7 450000 \ --last 397.1 500.7 450000 \ --num 5 \ --focal-length 450000 \ --optical-center 500 500 \ --image-size 1000 1000 \ -o run/run See :numref:`sat_sim_roll_pitch_yaw` for how to apply a custom rotation to the cameras. The first and last cameras will be located as specified by ``--first`` and ``--last`` (:numref:`sat_sim_options`). See also ``--frame-rate``. In this example, the camera is 450,000 m above the ground and the focal length is 450,000 pixels. If the magnitude of DEM heights is within several hundred meters, this will result in the ground sample distance being around 1 meter per pixel. The resulting cameras will point in a direction perpendicular to the orbit trajectory. They will point precisely to the planet center only if the orbit endpoints are at the same height and the datum is spherical. The produced image and camera names will be along the lines of:: run/run-10000.tif run/run-10000.tsai These names will be adjusted per sensor, if a rig is present (:numref:`sat_sim_rig`), or if time is modeled (:numref:`sat_sim_time`). .. figure:: ../images/sfm_view_nadir_clip.png :name: sat_sim_illustration_nadir_clip :alt: sat_sim_illustration_nadir_clip Illustration of ``sat_sim`` creating nadir-looking cameras. See :numref:`orbit_plot` for how to visualize the roll, pitch, and yaw angles of the cameras with ``orbit_plot.py``. Plotted with ``sfm_view`` (:numref:`sfm_view`). .. _sat_sim_custom_path: Follow custom ground path with varying orientation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Given two locations on the DEM, each specified by the column and row of DEM pixel, to ensure that the center of the camera footprint travels along the straight edge (in DEM pixel coordinates) between these, use options as:: --first-ground-pos 484.3 510.7 \ --last-ground-pos 332.5 893.6 This will result in the camera orientation changing gradually to keep the desired view. .. figure:: ../images/sfm_view.png :name: sat_sim_illustration :alt: Illustration of ``sat_sim`` looking at a ground point. An example of several generated cameras looking along a short ground path. Plotted with ``sfm_view`` (:numref:`sfm_view`). .. _sat_sim_roll_pitch_yaw: Fixed camera orientation ^^^^^^^^^^^^^^^^^^^^^^^^ When custom cameras are created (not read from disk), and unless the ``--first-ground-pos`` and ``--last-ground-pos`` options are specified, the cameras will look straight down (nadir, perpendicular to along and across track directions). If desired to have a custom orientation, use the ``--roll``, ``--pitch`` and ``--yaw`` options (measured in degrees, all three must be specified). See :numref:`roll_pitch_yaw_def` for how these angles are defined. Example invocation:: sat_sim --dem dem.tif \ --ortho ortho.tif \ --first 397.1 400.7 450000 \ --last 397.1 500.7 450000 \ --num 5 \ --roll 0 --pitch 25 --yaw 0 \ --focal-length 450000 \ --optical-center 500 500 \ --image-size 1000 1000 \ -o run/run See :numref:`orbit_plot` for how to visualize the roll, pitch, and yaw angles of the cameras with ``orbit_plot.py``. .. _sat_sim_roll_pitch_yaw_ground: Pose and ground constraints ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Given an orbital trajectory, a path on the ground, and a desired fixed camera orientation (roll, pitch, yaw), this tool can find the correct endpoints along the satellite orbit, then use those to generate the cameras (positioned between those endpoints), with the center of the camera ground footprint following the desired ground path. Example:: sat_sim --dem dem.tif \ --ortho ortho.tif \ --first 397.1 400.7 450000 \ --last 397.1 500.7 450000 \ --first-ground-pos 397.1 400.7 \ --last-ground-pos 397.1 500.7 \ --roll 0 --pitch 25 --yaw 0 \ --num 5 \ --focal-length 450000 \ --optical-center 500 500 \ --image-size 1000 1000 \ -o run/run Here, unlike in :numref:`sat_sim_nadir`, we will use ``--first`` and ``--last`` only to identify the orbit. The endpoints to use on it will be found given that we have to satisfy the orientation constraints in ``--roll``, ``--pitch``, ``--yaw`` and the ground path constraints in ``--first-ground-pos`` and ``--last-ground-pos``. Unlike in :numref:`sat_sim_custom_path`, the camera orientations will not change. Currently, in this mode one must have the roll and yaw angles set to zero. Then, the satellite should follow an orbit whose vertical projection onto the ground is quite similar to the provided ground path. These restrictions may be relaxed in the future. It is not important to know very accurately the values of ``--first-ground-pos`` and ``--last-ground-pos``. The trajectory of the camera center ground footprint will be computed, points on it closest to these two ground coordinates will be found, which in turn will be used to find the orbital segment endpoints. .. figure:: ../images/sfm_view_nadir_off_nadir.png :name: sat_sim_illustration_nadir_off_nadir :alt: sat_sim_illustration_nadir_off_nadir Illustration of ``sat_sim`` creating two sets of cameras, with different fixed orientations for each, with both sets looking at the same ground path. A separate invocation of ``sat_sim`` is needed for each set. .. _sat_sim_jitter_model: Jitter modelling ^^^^^^^^^^^^^^^^ As a satellite moves in orbit, it vibrates ever so slightly. The effect of this on the acquired images is called *jitter*, and it occurs for both Linescan and Pinhole cameras. See :numref:`jitter_solve` for how jitter is solved for when the cameras are Linescan. Here we will discuss modeling jitter for synthetic Pinhole cameras. See :numref:`sat_sim_linescan` for how to create synthetic Linescan cameras (with or without jitter). We assume the jitter is a superposition of periodic perturbations of the roll, pitch, and yaw angles. For each period, there will be an individual amplitude and phase shift for these three angles. For example, to model along-track (pitch) jitter only, the amplitudes for the other angles can be set to zero. Across-track jitter is modeled by a roll perturbation. The jitter frequency will be measured in Hz. For example, *f* = 45 Hz (45 oscillations per second). If the satellite velocity is *v* meters per second, the jitter period in meters is :math:`v / f`. More than one jitter frequency (hence period) can be specified. Their contributions will be summed up. Denote by :math:`A_{ij}` the jitter amplitude, in degrees. The index :math:`i` corresponds to jitter frequency :math:`f_i`, and :math:`j` = 1, 2, 3 is the index for roll, pitch, and yaw. The jitter perturbation is modeled as: .. math:: \sum_i A_{ij} \sin\left(d \frac{2 \pi f_i}{v} + \phi_{ij}\right) Some care is needed to define the parameter *d*. We set it to be the distance from the starting orbit point as specified by ``--first`` to the current camera center (both in ECEF, along the curved orbit). This starting point is *before* adjusting the orbital segment for roll, pitch, yaw, and ground constraints (:numref:`sat_sim_roll_pitch_yaw_ground`). This way the jitter amplitude at the adjusted starting point (first camera position) is uncorrelated between several sets of cameras along the same orbit but with different values of roll, pitch, yaw. The phase shift :math:`\phi_{ij}` is measured in radians. If not specified, it is set to zero. How to set it is discussed below. .. _sat_sim_jitter_amplitude_meters: Specifying the jitter amplitude in meters ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The jitter amplitude is usually very small and not easy to measure or interpret. It can be set in micro radians, as done in :numref:`sat_sim_jitter_amplitude_micro_radians`. Here we will discuss how jitter can be defined indirectly, via its effect on the *horizontal uncertainty* of the intersection of a ray emanating from the camera center with the datum (see also :numref:`error_propagation`). Consider a nadir-facing camera with the camera center at height *D* meters above the datum. If the ray pointing straight down from that camera intersects the datum at a certain point, and then that ray is perturbed by :math:`A` degrees, the intersection point will move horizontally by .. math:: H = D \tan\left( \frac{\pi}{180} A \right) This is the horizontal ground uncertainty of the intersection point. It is a rather intuitive concept and many vendors publish it for their cameras. For example, if the camera ground sample distance (pixel size on the ground) is 1 m/pixel, a horizontal uncertainty of 0.1 m or less is very good. If the camera orientation is found using a star-tracker or some other estimations in orbit, and no bundle adjustment (:numref:`bundle_adjust`) is performed, the horizontal uncertainty will likely be much larger, for example on the order of 1-4 meters. In either case, this number is easy to understand, and the jitter amplitude can be defined as the value of :math:`A_{ij}` that produces the desired horizontal uncertainty: .. math:: A_{ij} = \frac{180}{\pi} \arctan\left( \frac{H_j}{D} \right) Note that we will use the same jitter amplitude for all frequencies, since we are limited by just a single horizontal uncertainty value for each of roll, pitch, and yaw. One should also note that the effect of a yaw perturbation by a given amount is much less than the effect of the same amount of roll or pitch perturbation, because for the latter two the effect is magnified by the distance from the camera center to the datum, unlike for yaw. The height above datum for the starting and ending points of the orbital segment is the third value in ``--first`` and ``--last``. These values can, in principle, be different, and then a linearly interpolated value will be used at each camera position (and note that the orbital segment endpoints are adjusted, per :numref:`sat_sim_roll_pitch_yaw_ground`). As an example of using this functionality, consider the ``sat_sim`` invocation as in :numref:`sat_sim_roll_pitch_yaw_ground`, and add the options:: --velocity 7500 --jitter-frequency "45.0 100.0" \ --horizontal-uncertainty "0.0 2.0 0.0" This will produce a set of cameras with along-track (pitch) jitter only. Two frequencies will be used, of 45 and 100 Hz. To add a phase :math:`\phi_{ij}`, in radians, to roll, pitch, and yaw jitter, specify it as:: --jitter-phase "1.5708 1.5708 1.5708 0.0 0.0 0.0" Here we used an approximation of :math:`\pi/2` radians, which is 90 degrees, for the 45 Hz frequency, and 0 radians for the 100 Hz frequency. The values can also be separated by commas, without spaces, then the quotes are not necessary. See :numref:`sat_sim_options` for more information on these options. Jitter can be applied to existing cameras as well (:numref:`sat_sim_perturb`). A useful test is compare a camera without jitter with the corresponding one with jitter. For that, project a pixel from the first camera to the datum, and project the obtained point back into the second camera. See how different the produced pixel value is compared to the original pixel. That is done with ``cam_test`` (:numref:`cam_test`):: cam_test --session1 pinhole \ --session2 pinhole \ --image sim_jitter0/n-10020.tif \ --cam1 sim_jitter0/n-10020.tsai \ --cam2 sim_jitter2/n-10020.tsai It will produce an output as:: cam1 to cam2 pixel diff Min: 1.89408 Median: 1.89408 Max: 1.89408 cam2 to cam1 pixel diff Min: 1.89408 Median: 1.89408 Max: 1.89408 .. _sat_sim_jitter_amplitude_micro_radians: Specifying the jitter amplitude in micro radians ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alternatively, instead of three horizontal uncertainties, the full set of amplitudes can be specified directly, in micro radians. The option for that is ``--jitter-amplitude``. Use a quoted list of values separated by commas of spaces. The first three values are for roll, pitch and yaw of the first frequency, the next three values are for the second frequency, and so on. For example:: --jitter-amplitude "0 1 0 0 1 0" These will be multiplied by 1e-6 to convert to radians, then converted to degrees, and used as the jitter amplitudes :math:`A_{ij}`. In this example only the pitch amplitudes are nonzero, and are equal to 1 micro radian. .. _sat_sim_linescan: Linescan cameras ^^^^^^^^^^^^^^^^ The ``sat_sim`` tool can be used to simulate linescan cameras and images, with or without jitter. Then, instead of many Pinhole cameras and/or images along the orbit, a single Linescan camera and/or image will be created. For use with existing cameras, see :numref:`sat_sim_prior`. The option ``--num`` (or ``--frame-rate``) will control how many camera samples are created between the first and last image lines (including these lines). An additional set of camera samples will be created, with the same total size, before the first and after the last image line, evenly divided between the two, to help with along-track pose interpolation and jitter modeling. Lagrange interpolation (with 8th degree polynomials) will be used in between the samples. All above modes are supported. One has to add to ``sat_sim`` the option ``--sensor-type linescan``. By default, if the linescan cameras are not provided with ``--camera-list``, the input image height is auto-computed so that the horizontal and vertical ground sample distances are very similar. The produced image height will be the same regardless of amount of jitter in the input cameras or whether jitter is modeled at all. This can be overridden with ``--non-square-pixels``. When creating synthetic linescan cameras, the row coordinate of the optical center (the second value in ``--optical-center``) will be ignored and will be treated as set to 0. Hence, we assume that the ray from the camera center that is perpendicular to the sensor plane intersects the single-row sensor array. The produced linescan cameras are in the CSM model state format (:numref:`csm_state`). This is a standard CSM format and can be read by all ASP tools including this one. Here is an example invocation. The use case here is as in :numref:`sat_sim_roll_pitch_yaw_ground`. The camera maintains fixed roll, pitch, and yaw, and the ground path determines the orbital segment endpoints. Here we also model along-track jitter. :: sat_sim --dem dem.tif \ --ortho ortho.tif \ --first 397.1 400.7 450000 \ --last 397.1 500.7 450000 \ --first-ground-pos 397.1 400.7 \ --last-ground-pos 397.1 500.7 \ --roll 0 --pitch 30 --yaw 0 \ --num 5 \ --focal-length 450000 \ --optical-center 500 500 \ --image-size 1000 1000 \ --sensor-type linescan \ --velocity 7500 \ --jitter-frequency 5 \ --horizontal-uncertainty '0 2 0' \ --jitter-phase "0.4 0.8 1.2" \ -o jitter2/run See :numref:`jitter_sat_sim` for how such cameras can be used with ASP's jitter solver. As in :numref:`sat_sim_jitter_amplitude_meters`, one can compare cameras with and without jitter as:: cam_test \ --session1 csm \ --session2 csm \ --image jitter0/run.tif \ --cam1 jitter0/run.json \ --cam2 jitter2/run.json .. _sat_sim_rig: Modeling a rig ^^^^^^^^^^^^^^ The ``sat_sim`` program can simulate a rig that has a mix of frame (pinhole) and linescan cameras. The rig should be passed in via ``--rig-config``. Its format is defined in :numref:`rig_config`. The rig can be adjusted after loading (:numref:`sat_sim_rig_adjust`). An example is in :numref:`orbital_rig`. The produced image and camera file names will include the sensor name, before the image/camera extension. Example:: out/out-10000_my_cam.tsai The option ``--sensor-type`` controls the type of each rig sensor. A single value will apply to all sensors. To have per-sensor type, set a list of values separated by commas, with no spaces. Example:: --sensor-type linescan,pinhole,linescan Lens distortion is not supported. If desired to produce cameras and images only for a subset of the rig sensors, use the ``--sensor-name`` option. Consider using the option ``--save-as-csm``. .. figure:: ../images/sat_sim_rig.png :name: sat_sim_rig_illustration :alt: sat_sim_rig_illustration Illustration of ``sat_sim`` creating a rig of 3 frame cameras. The resulting images have been mapprojected onto the ground. .. _sat_sim_rig_adjust: Adjusting a rig ^^^^^^^^^^^^^^^ Given a rig (:numref:`sat_sim_rig`), the positions and orientations of the sensors in the focal plane and of their footprints on the ground can be overridden by setting ``--rig-sensor-ground-offsets``. For example, consider a rig with two cameras. If it is desired to have the rig sensor centers separated by 0.02 m in the *x* direction the sensor plane, and the centers of their footprints separated by 2000 m in the *x* (across-track) direction on the ground, with no separation vertically, use:: --rig-sensor-ground-offsets -0.01,0,-1000,0,0.01,0,1000,0 Additionally, an option such as:: --rig-sensor-rotation-angles 0.0,5.0 can be invoked to rotate each sensor in the sensor plane by the corresponding angle in degrees. The in-sensor rotations get applied before the sensor and ground offsets. After the images and cameras are saved, the rig that created the data will be modified to make each sensor transform relative to the first sensor. The rig configuration will be saved to disk as:: -rig_config.txt Such a rig configuration can be passed in to ``jitter_solve`` (:numref:`jitter_solve`) and ``rig_calibrator`` (:numref:`rig_calibrator`). If this rig is passed back in to ``sat_sim``, one must again specify the offsets and angles, if any, as such adjustments are lost when the rig is saved as above. .. _sat_sim_time: Modeling time ^^^^^^^^^^^^^ Given two points on the orbit (specified by ``--first`` and ``--last``), the starting ground position (``--first-ground-pos``), and satellite velocity (``--velocity``), the option ``--model-time`` ensures the precise time is recorded for each acquisition. The time is measured in seconds in double precision. Time is important for modeling a rig, when this option is set to true even when not explicitly set. The time will be saved with the linescan camera metadata. It will be part of the name of the pinhole cameras and images (but not part of the name for linescan sensors). As an example, given an orbit, and three separate invocations of ``sat_sim``, with the camera pitch being --40, 0, and 40 degrees, respectively (so considering *forward*, *nadir*, and *backward*-looking cameras), the created cameras will have names that look like:: out/out-0009997.588028494_my_cam.tsai out/out-0010000.000000000_my_cam.tsai out/out-0010002.411951096_my_cam.tsai This needs ``--reference-time`` to be defined, which is the time when the camera looks straight down at the starting point of the ground path. The default value is 10,000 seconds. For different orbits it is suggested to use a different value for ``--reference-time``, and also a different output prefix. It is suggested to keep the reference time in the 1000 - 100,000 second range to ensure the produced and nearby times are positive but not too large, which can result in loss of precision. Here we also assumed a rig was present (:numref:`sat_sim_rig`), with the sensor name being ``my_cam``. .. _sat_sim_perturb: Perturbing existing cameras ^^^^^^^^^^^^^^^^^^^^^^^^^^^ This program can apply a periodic jitter perturbation (:numref:`sat_sim_jitter_model`) or a random position or pose perturbation to a sequence of given Pinhole cameras (:numref:`pinholemodels`). If more than one sequence is present, such as nadir-looking and forward-looking cameras, ``sat_sim`` should be called separately for each one. In this mode, no images are generated and no rig can be used. Example:: ls nadir_cameras/*tsai > camera_list.txt sat_sim \ --perturb-cameras \ --camera-list camera_list.txt \ --dem dem.tif \ --velocity 7500 \ --jitter-frequency 5 \ --horizontal-uncertainty '0 2 0' \ -o run/run If an input image is named ``camDir/camName.tsai`` and the output prefix is ``run/run``, the output camera will be saved as ``run/run-camName.tsai``. The list of written cameras is saved in a file named ``run/run-cameras.txt``. That list can be passed to ``bundle_adjust`` (:numref:`bundle_adjust`) and ``jitter_solve`` (:numref:`jitter_solve`). To save the perturbed cameras in CSM model state format, add the option ``--save-as-csm`` and specify the image dimensions (``--image-size``). To apply a random pose perturbation with maximum roll-pitch-yaw amplitude given by ``--horizontal-uncertainty``, run:: sat_sim \ --random-pose-perturbation \ --dem dem.tif \ --horizontal-uncertainty '0 2 0' \ -o run/run To apply a random position perturbation, use an option such as ``--random-position-perturbation 2.0``. .. _roll_pitch_yaw_def: Roll, pitch, and yaw ^^^^^^^^^^^^^^^^^^^^ The roll, pitch and yaw angles (measured in degrees) are used to determine the camera orientation relative to the local coordinate system in orbit. When all these are set to 0 (the default is ``NaN``) the camera looks straight down. If the pitch is 90 degrees and the other angles are zero, the camera will look along the track rather than down. If a non-zero yaw is set, the camera will rotate around its view axis. The rotations are applied to the camera body in the roll, pitch, and yaw order. So, the combined rotation matrix is:: R = yawRot * pitchRot * rollRot (the application is from right to left). The camera-to-ECEF rotation is produced by further multiplying this matrix on the left by the rotation from the local satellite coordinate system to ECEF. It is important to note that the satellite and the camera use different coordinate systems. The satellite orientation is with the *x*, *y* and *z* axes pointing along satellite track, across track, and towards the planet, respectively. For the camera, it is preferable for the rows of pixels to be parallel to the across track direction, and for the columns to be parallel to the along track direction. So, the camera *y* direction is along the track, the camera *x* direction is the negative of the across-track direction, and *z* points towards the ground as before. Camera models with desired roll, pitch, and yaw angles can be also created when the camera follows a variable path with variable orientation (:numref:`cam_gen_extrinsics`). Efficiency considerations ^^^^^^^^^^^^^^^^^^^^^^^^^ Each image (of size about 2000 x 1000 pixels) can take about 10 seconds to create using multiple threads. A job can be divided over several processes using the ``--first-index`` and ``--last-index`` options (see :numref:`sat_sim_options`). The last index is the index before the last camera. The option ``--no-images`` can be used to skip the image creation step. .. _sat_sim_dem: Preparing the input DEM and orthoimage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The input DEM must not have holes, be reasonably smooth, and extend well-beyond the area of interest. It is suggested to create it using stereo (:numref:`tutorial`). For steep terrain one should first mapproject the images (:numref:`mapproj-example`). The stereo cloud should be converted to a DEM, preferably in the local stereographic projection, using a grid size that is perhaps 4 times the ground sample distance (GSD). For example, for images having a GSD of 0.4 meters, a command as follows may work:: point2dem --auto-proj-center --tr 1.6 run/run-PC.tif See :numref:`point2dem_proj` for a discussion regarding the projection of the produced DEM. The ``dem_mosaic`` (:numref:`dem_mosaic`) tool can be used to fill holes in the DEM, using either the ``--hole-fill-length`` or ``--fill-search-radius`` option. It is also suggested to blur it a little, which may reduce some of the noise in the DEM. For that, use ``dem_mosaic`` with the option ``--dem-blur-sigma`` with a value of 1 or 2. Very large holes may be infilled from a third-party low-resolution DEM, like Copernicus (:numref:`initial_terrain`), but this is a measure of last resort. Do not forget to first convert it to be relative to the WGS84 ellipsoid, using ``dem_geoid`` (:numref:`conv_to_ellipsoid`). This DEM can be converted to the local projection and grid size using ``gdalwarp`` (:numref:`gdal_tools`, bicubic or bilinear interpolation is suggested), and cropped to desired area with ``gdal_translate``. Then, it can be used as:: dem_mosaic --priority-blending-length 100 \ stereo-DEM.tif copernicus-DEM.tif \ -o filled-DEM.tif This assumes that the two DEMs being blended are reasonably well-aligned. Otherwise, alignment may be needed (:numref:`pc_align`). One can also use such a third-party DEM if no stereo DEM can be produced. The orthoimage can be obtained by mapprojecting (:numref:`mapproject`) a satellite image onto the DEM at the native resolution of the image:: mapproject -t rpc filled-DEM.tif \ image.tif image.xml ortho.tif Here we assumed a WorldView satellite, so option ``-t rpc`` was used. See :numref:`other-mapproj` for how to handle other satellites. The resolution and projection can be set via ``--tr`` and ``--t_srs`` if need be. Output files ^^^^^^^^^^^^ In addition to the images and/or cameras, when ``--sensor-type`` is ``pinhole``, ``sat_sim`` will also save two files, having the lists of created images and cameras, one per line, with names as:: -images.txt -cameras.txt These will be adjusted per sensor name, if a rig is present (:numref:`sat_sim_rig`). These files will not be saved if ``--first-index`` is non-zero, as then ``sat_sim`` is presumably being invoked concurrently by several processes to write several ranges of images and/or cameras, and that may result in these files being corrupted. Then, the list of images will not be saved if ``--no-images`` is used, and the list of cameras will not be saved if ``--camera-list`` is set, as then the cameras are not being generated by ``sat_sim``. .. _sat_sim_options: Command-line options ^^^^^^^^^^^^^^^^^^^^ --dem Input DEM file. --ortho Input georeferenced image file. -o, --output-prefix Specify the output prefix. All the files that are saved will start with this prefix. --camera-list A file containing the list of pinhole cameras to create synthetic images for. Then these cameras will be used instead of generating them. Specify one file per line. The options ``--first``, ``--last``, ``--num``, ``--focal-length``, and ``--optical-center`` will be ignored. --first First camera position, specified as DEM pixel column and row, and height above the DEM datum. This may be adjusted, per :numref:`sat_sim_roll_pitch_yaw_ground`. Can use ``mapproject --query-pixel`` to find the DEM pixel column and row for a given image pixel (:numref:`mapproj_options`). --last Last camera position, specified as DEM pixel column and row, and height above the DEM datum. See also ``--first``. --num Number of cameras to generate, including the first and last ones. Must be positive. The cameras are uniformly distributed along the straight edge from first to last (in projected coordinates). See also ``--frame-rate``. --first-ground-pos Coordinates of first camera ground footprint center (DEM column and row). If not set, the cameras will look straight down (perpendicular to along and across track directions). --last-ground-pos Coordinates of last camera ground footprint center (DEM column and row). If not set, the cameras will look straight down (perpendicular to along and across track directions). --focal-length Output camera focal length in units of pixel. --optical-center Output camera optical center (image column and row). Units of pixel. --image-size Output camera image size (width and height). --roll Camera roll angle, in degrees. See :numref:`sat_sim_roll_pitch_yaw` for details. --pitch Camera pitch angle, in degrees. See :numref:`sat_sim_roll_pitch_yaw` for details. --yaw Camera yaw angle, in degrees. See :numref:`sat_sim_roll_pitch_yaw` for details. --velocity Satellite velocity, in meters per second. Used for modeling jitter. A value of around 8000 m/s is typical for a satellite like SkySat in Sun-synchronous orbit (90 minute period) at an altitude of about 450 km. For WorldView, the velocity is around 7500 m/s, with a higher altitude and longer period. --jitter-frequency Jitter frequency, in Hz. Used for modeling jitter (satellite vibration). Several frequencies can be specified. Use a quoted list, with spaces as separators (or separated by commas with no quotes). See also ``--jitter-amplitude`` and ``--horizontal-uncertainty``. --jitter-phase Jitter phase, in radians. Measures the jitter phase offset from the start of the orbit as set by ``--first``. Specify as a quoted list of numbers separated by space (or separated by commas with no quotes). The Number of values must be 3 times the number of frequencies. The order in this list corresponds to phase for roll, pitch, and yaw for first frequency, then second frequency, etc. If not specified, will be set to 0. --jitter-amplitude Jitter amplitude, in micro radians. Specify as a quoted list having amplitude in roll, pitch, yaw for first frequency, then second frequency, etc. Separate the values by spaces (or commas with no quotes). --horizontal-uncertainty Camera horizontal uncertainty on the ground, in meters, at nadir orientation. Specify as three numbers, in quotes, used for roll, pitch, and yaw (or separated by commas with no quotes). The jitter amplitude for each of these angles is found as ``amplitude = atan(horizontal_uncertainty / satellite_elevation_above_datum)``, then converted to degrees. See :numref:`sat_sim_jitter_model` for details. --frame-rate Camera frame rate, per second. Can be in double precision. If set, it will override ``--num``. The cameras will start from ``--first`` (after any position adjustment, if applicable, per :numref:`sat_sim_roll_pitch_yaw_ground`). Set the ``--velocity`` value. The last camera will be no further than the (adjusted) value of ``--last`` along the orbit. --sensor-type Sensor type for created cameras and images. Can be one of: ``pinhole``, ``linescan``. Can use ``frame`` instead of ``pinhole``. With a rig (:numref:`sat_sim_rig`), this can be a list of values, separated by commas, with no spaces, one per sensor, if desired to have different types for different sensors. --non-square-pixels When creating linescan cameras and images, use the provided image height in pixels, even if that results in non-square pixels. The default is to auto-compute the image height. --first-index Index of first camera and/or image to generate, starting from 0. If not set, will create all images/cameras. This is used for parallelization. --last-index Index of last image and/or camera to generate, starting from 0. Stop before this index. If not set, will create all images/cameras. This is used for parallelization. --no-images Create only cameras, and no images. Cannot be used with ``--camera-list``. --save-ref-cams For each created camera, save also the 'reference' camera that has no roll, pitch, yaw, jitter, or 90 degree in-sensor-plane rotation from camera to satellite coordinates. Their names have ``-ref-`` after the output prefix. --save-as-csm Save Pinhole (frame) cameras in the CSM format, as done for linescan cameras. Can be used to combine these sensors in bundle adjustment and solving for jitter. See an example in :numref:`jitter_linescan_frame_cam`. --rig-config Simulate a frame camera rig with this configuration file. Then do not set the image size, focal length, optical center on the command line, as those are set by the rig. The transforms on this rig may be adjusted via ``--rig-sensor-ground-offsets`` and ``--rig-sensor-rotation-angles``. See :numref:`sat_sim_rig`. --rig-sensor-ground-offsets Modify the input rig so that each sensor center has the given horizontal offsets from the rig center in the rig plane, and the sensor ground footprint centers have the given ground plane offsets from the nominal ground footprint center at nadir. Specify as a quoted list of values, separated by spaces or commas. The order is sensor1_x sensor1_y ground1_x ground1_y followed by sensor 2, etc. The units are in meter. These will determine the sensor rotations. Separate the values by spaces with quotes or commas with no quotes. If not set, use 0 for all sensors. --rig-sensor-rotation-angles Modify the input rig by rotating each sensor by the given angle in the sensor plane. Specify as one number per sensor, in degrees, separated by commas, or in quotes and separated by spaces. --sensor-name Name of the sensor in the rig to simulate (:numref:`sat_sim_rig`). If more than one, list them separated by commas (no spaces). --model-time Model time at each camera position (:numref:`sat_sim_time`). See also ``--reference-time``. --reference-time The measured time, in seconds, when the satellite is along given orbit, in nadir orientation, with the center view direction closest to the ground point at ``--first-ground-pos``. A unique value for each orbit is suggested. A large value (millions), may result in numerical issues. See :numref:`sat_sim_time`. --perturb-cameras Apply a periodic jitter perturbation to poses of existing cameras (:numref:`sat_sim_perturb`). --random-pose-perturbation Apply a random pose perturbation to existing cameras, with the amplitude specified by ``--horizontal-uncertainty`` (:numref:`sat_sim_perturb`). Repeated invocation will produce the same random perturbation. --random-position-perturbation Apply a random position perturbation to existing cameras, with the amplitude specified by the given value, in meters (:numref:`sat_sim_perturb`). --blur-sigma When creating images, blur them with a Gaussian with this sigma. The sigma is in input orthoimage pixel units. --dem-height-error-tol When intersecting a ray with a DEM, use this as the height error tolerance (measured in meters). It is expected that the default will be always good enough. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --tif-compress TIFF compression method. Options: None, LZW, Deflate, Packbits. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/sfm_merge.rst ================================================ .. _sfm_merge: sfm_merge --------- The ``sfm_merge`` program takes two or more Structure-from-Motion (SfM) maps in .nvm format, as produced by ``theia_sfm`` (:numref:`theia_sfm`) or ``rig_calibrator`` (:numref:`rig_calibrator`), and merges them into a single map. It finds correspondences (feature matches) between the images in the maps, and then transforms the maps to first map's coordinate system. The input maps may or may not have shared images, but the surfaces they see must overlap. If there are more than two maps, the second is merged to the first, which is then merged with the third, etc. The produced map must be bundle-adjusted to refine it, using ``rig_calibrator`` (with or without the rig constraint). The inputs must satisfy one of the naming conventions in :numref:`rig_data_conv`. This program supports the option ``--image_sensor_list`` for when the directory structure or filenames do not have enough information on sensor types and timestamps. The output map can be visualized in ``stereo_gui`` (:numref:`stereo_gui_nvm`). See also ``sfm_submap`` (:numref:`sfm_submap`), a program to extract a submap from a larger map. A discussion for how this tool can be used is in :numref:`map_surgery`. Example ^^^^^^^ :: sfm_merge --rig_config rig_config.txt \ --num_image_overlaps_at_endpoints 100 \ map1.nvm map2.nvm -output_map merged.nvm Increasing the number of overlaps can make the program quite slow as its complexity is the square of this number. However, if very few similar images are detected between the maps, they will not be merged accurately. The option ``--fast_merge`` can be used when the input maps are known to have a good number of images in common. The option ``--no_transform`` is useful when the maps are individually registered or when they do not overlap, but in either case it is desired to integrate them without changing the camera poses. Unless the ``--no_shift`` option is used, this invocation will write a file of the form ``_offsets.txt`` having the optical center of each camera. The .nvm file has these offsets subtracted from the features, and the offsets are needed for plotting the features with ``stereo_gui``. Handling tracks ^^^^^^^^^^^^^^^ A track is a feature (interest point) seen in multiple images, corresponding to a triangulated position on the ground. This tool preserves the tracks from the input maps. Matching of features creates additional tracks. Duplicate tracks (showing in multiple input maps and/or created during matching) are removed. This tool does not merge tracks that have a subsequence in common, or eliminate a track if another track exists which is longer than a given one. These features may be added in future versions. Command-line options for sfm_merge ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --rig_config Read the configuration of sensors from this file in the format used for ``rig_calibrator`` (this tool does not use the rig structure). The output of this program can be passed back to ``rig_calibrator`` (with or without a rig constraint). --output_map Output file containing the merged map. --num_image_overlaps_at_endpoints Search this many images at the beginning and end of the first map for matches to this many images at the beginning and end of the second map. Default: 10, --image_sensor_list Read image name, sensor name, and timestamp, from each line in this list. Alternatively, a directory structure can be used (:numref:`rig_data_conv`). --fast_merge When merging maps that have shared images, use their camera poses to find the transform from other maps to first map, and skip finding additional matches among the images. --fix_first_map If true, after merging the maps and reconciling the camera poses for the shared images, overwrite the shared poses with those from the first map, so it does not change. This is helpful if the first map is already registered and evaluated. --no_shift Assume that in the input .nvm files the features are not shifted relative to the optical center. The merged map will then be saved the same way. --no_transform Do not compute and apply a transform from the other maps to the first one. This keeps the camera poses as they are (shared poses and features will be reconciled). This will succeed even when the two maps do not overlap. --close_dist Two triangulated points are considered to be close if no further than this distance, in meters. Used as inlier threshold when identifying triangulated points after the maps are aligned. Auto-computed, taking into account the extent of a tight subset of the triangulated points and printed on screen if not set. This is an advanced option. ================================================ FILE: docs/tools/sfm_proc.rst ================================================ .. _sfm_proc: sfm_proc -------- This helper program takes as input a list of images with EXIF data, such as produced by an UAS flight, and writes a text file having on each line the image name, camera center longitude, latitude, and height above datum, then the roll, pitch, and yaw of the camera. The roll and pitch are set to 0 as they are not available in the EXIF data. The yaw, measured from the North direction, is read from the field ``EXIF_GPSImgDirection``. The fields ``EXIF_GPSLongitude``, ``EXIF_GPSLatitude``, ``EXIF_GPSAltitude``, and ``EXIF_GPSLongitudeRef`` are read for the other data mentioned earlier. An example is in :numref:`sfm_uas`. Command-line options ~~~~~~~~~~~~~~~~~~~~ --image-list A file listing the input images with EXIF data, one per line. --out-dir The output directory that will contain the processed data. -h, --help Display this help message. ================================================ FILE: docs/tools/sfm_submap.rst ================================================ .. _sfm_submap: sfm_submap ---------- The ``sfm_submap`` program takes as input a Structure-from-Motion (SfM) map in .nvm format, as produced by ``theia_sfm`` (:numref:`theia_sfm`) or ``rig_calibrator`` (:numref:`rig_calibrator`), and extracts from it a submap for a desired subset of the images. It works with .nvm files in which the keypoints were shifted relative to the optical center (which is the default for both ``theia_sfm`` and ``rig_calibrator``) or not (as can be saved by ``rig_calibrator``, see :numref:`rig_calibrator_outputs`). This property is preserved by this tool. The produced map can be visualized in ``stereo_gui`` (:numref:`stereo_gui_nvm`). For now, if the features are shifted relative to the optical center, the user must produce the list of shifts, as detailed at the above link, for the features to be plotted correctly. It is suggested to always use ``rig_calibrator`` with the option ``--save_nvm_no_shift`` to create an unshifted file to start with. See also ``sfm_merge`` (:numref:`sfm_merge`), a tool for merging maps. Examples ^^^^^^^^ Example 1 (specify the images to have in the submap on the command line):: sfm_submap -input_map in_map.nvm -output_map out_map.nvm \ image1.jpg image2.jpg ... Example 2 (let those images be in a file, one per line):: sfm_submap -input_map in_map.nvm -output_map out_map.nvm \ -image_list list.txt The images in the list not present in the input map will be ignored. Command-line options for sfm_submap ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``--input_map`` The input map, in .nvm format. Type: string. Default: "". ``--output_map`` The output map, in .nvm format. Type: string. Default: "". ``--image_list`` A file having the names of the images to be included in the submap, one per line. ================================================ FILE: docs/tools/sfm_view.rst ================================================ .. _sfm_view: sfm_view -------- The ``sfm_view`` program displays the positions and orientations of a set of orbital Pinhole camera models (:numref:`pinholemodels`) relative to the ground. This program is based on `umve `_, by Simon Fuhrmann. The cameras are represented as pyramids (the pyramid tip is the camera center and the base is the sensor plane), and the ground as shown as a plane. The ground plane is meant to be only a suggestion, and is not at the correct distance or scale from the cameras. It is determined as the plane perpendicular to the vector from the planet center to the mean of camera centers. The planet curvature is not modeled. The actual field of view (focal length) and optical center of the cameras are not reflected in the plots. Zooming and scene rotation are done with the computer mouse. .. figure:: ../images/sfm_view_nadir.png :name: nadir_sfm_view_illustration :alt: Illustration of ``sfm_view`` Illustration showing two cameras pointing generally downward. The left panel lists the camera file names. Clicking on an entry highlights that camera's view direction. Synthetic cameras can be created with ``sat_sim`` (:numref:`sat_sim`). Example ^^^^^^^ :: sfm_view cameras/*.tsai See also ^^^^^^^^ The ``orbit_plot.py`` tool (:numref:`orbit_plot`) can visualize the roll, pitch, and yaw angles of a set of pinhole and linescan cameras. The ``view_reconstruction`` program (:numref:`view_reconstruction`) can display a 3D point cloud and the cameras that were used to create it, if the reconstruction was created with ``theia_sfm`` (:numref:`theia_sfm`). Camera poses can be converted to KML with ``orbitviz`` (:numref:`orbitviz`), to be shown in Google Earth. Command-line options ^^^^^^^^^^^^^^^^^^^^ --width Window width in pixels. Specify as ``--width=1400``. --height Window height in pixels. Specify as ``--height=1200``. ================================================ FILE: docs/tools/sfs.rst ================================================ .. _sfs: sfs --- The ``sfs`` tool can add more detail to a DEM using shape-from-shading (:cite:`alexandrov2018multiview`). The ``parallel_sfs`` program (:numref:`parallel_sfs`) extends ``sfs`` to run using multiple processes on multiple machines. An overview and examples of using this program are in :numref:`sfs_usage`. Illustration ~~~~~~~~~~~~ .. figure:: ../images/SfS_Comet_67P.png :name: SfS_Comet_67P :alt: SfS_Comet_67P.png Refining the surface of Comet 67P with shape-from-shading (:cite:`jindal2024measuring_v2`). Left: produced terrain. Right: input image. Usage ~~~~~ :: sfs -i -n -o \ [other options] The tool outputs at each iteration the current DEM and other auxiliary and appropriately-named datasets, which are documented further down. Example ~~~~~~~ :: sfs --max-iterations 5 --use-approx-camera-models \ --crop-input-images --bundle-adjust-prefix ba/run \ -i input_dem.tif image1.cub image2.cub -o run/run See many detailed worked-out examples in :numref:`sfs_usage`, including for the Moon and Earth. Inputs ~~~~~~ The SfS program takes as input a DEM to refine, images, cameras (contained within the ``.cub`` image files for ISIS data), Sun positions (normally embedded in the cameras), and (optionally but strongly suggested) camera adjustments, which makes sure the images are registered to each other and to the ground (the detailed examples in :numref:`sfs_usage` discuss this). .. _sfs_outputs: Outputs ~~~~~~~ The ``sfs`` outputs are saved at the location given by the output prefix (option ``-o``). If that is set to ``run/run`` as in the example above, the following outputs are produced. - ``run/run-DEM-final.tif`` The produced SfS DEM. - ``run/run-exposures.txt`` The computed exposures for the images. These can be passed back to ``sfs`` via ``--image-exposures-prefix``. - ``run/run-haze.txt`` The computed haze values for the images. These can be passed back to ``sfs`` via ``--haze-prefix``. Only created if ``--num-haze-coeffs`` is positive. - ``run-albedo-estim.tif`` The estimated initial albedo (if ``--float-albedo`` is on). It is produced by sampling the DEM with option ``--num-samples-for-estim``, then interpolated to all DEM pixels. Can be passed to ``sfs`` via ``--input-albedo``. Normally ``parallel_sfs`` takes care of the initial estimation and passing this along. - ``run/run-albedo-final.tif`` The computed albedo. All its values are 1 unless the option ``--float-albedo`` is used. - ``run/run--final-meas-intensity.tif`` For each input image, this has the actual (measured) image values at each refined DEM grid point. See also ``--save-meas-intensity-only``. - ``run/run--final-sim-intensity.tif`` For each input image, this has the simulated image values at each refined DEM grid point using the reflectance model and the Sun position for the current image. If the modeling is perfect, the measured input image will precisely agree with the simulated (modeled) image. In reality these are close but different. This was called the "computed" intensity prior to build 2025/11. See also ``--save-sim-intensity-only``. - ``run/run-DEM-variance.tif`` If ``--save-variances`` was set, this file stores the uncalibrated variance for each DEM pixel. If ``--float-albedo`` is also on, the albedo variance is stored in ``-albedo-variance.tif``. Values within 3 pixels of the boundary are set to nodata. See :numref:`sfs_unc`. - ``run/run-DEM-{left,right,top,bottom}-covariance.tif`` If ``--save-covariances`` was set, the "-dr1_dcn1" file stores the uncalibrated covariance of each DEM pixel with its top-left neighbor ("+1" row and "-1" column away). If ``--float-albedo`` is also on, the albedo covariances with analogous names are saved as well. Values within 3 pixels of the boundary are set to nodata. See :numref:`sfs_unc`. In addition, SfS saves intermediate values of many of these quantities at each iteration, unless the flag ``--save-sparingly`` is used. SfS may also save the "haze" values if this is solved for (see the appropriate options below and :numref:`sfs_formulation`). .. _sfs_opt: Command-line options for sfs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -i, --input-dem The input DEM to refine using SfS. --image-list 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``. --camera-list A file containing the list of cameras, when they are too many to specify on the command line. If the images have embedded camera information, such as for ISIS, this file must be empty but must be specified if ``--image-list`` is specified. -o, --output-prefix Prefix for output filenames. -n, --max-iterations Set the maximum number of iterations. Normally 5-10 iterations is enough, even when convergence is not reached, as the solution usually improves quickly at first and only very fine refinements happen later. --reflectance-type Reflectance types: 0. Lambertian 1. Lunar-Lambert 2. Hapke 3. Experimental extension of Lunar-Lambert 4. Charon model (a variation of Lunar-Lambert). --smoothness-weight The weight given to the cost function term which consists of sums of squares of second-order derivatives. A larger value will result in a smoother solution with fewer artifacts. The range can be in 0.01 -- 10,000. A discussion of this term is in :cite:`lesage2021constraints`. See also ``--gradient-weight``. --initial-dem-constraint-weight A larger value will try harder to keep the SfS-optimized DEM closer to the initial guess DEM. A value between 0.0001 and 0.001 may work, unless your initial DEM is very unreliable. --albedo-constraint-weight If floating the albedo, a larger value will try harder to keep the optimized albedo close to the initial albedo. See also: ``--input-albedo`` and ``--albedo-robust-threshold``. In build 2025/11 and later, this is also used in estimating the initial low-resolution albedo (option ``--estimate-exposure-haze-albedo``). --albedo-robust-threshold If floating the albedo and this threshold is positive, apply a Cauchy loss with this threshold to the product of the albedo difference and the albedo constraint weight. In build 2025/11 and later, this is also used in estimating the initial low-resolution albedo (option ``--estimate-exposure-haze-albedo``). --bundle-adjust-prefix Use the camera adjustments obtained by previously running bundle_adjust with this output prefix. --float-albedo Float the albedo for each pixel. Will give incorrect results if only one image is present. The albedo is normalized, its nominal value is 1. --float-exposure Float the exposure for each image. Will give incorrect results if only one image is present. It usually gives marginal results. --shadow-threshold A shadow threshold to apply to all images. Must be positive. Areas that are in shadow in all images will result in a blurred version of the input DEM, influenced by the ``--smoothness-weight``. --shadow-thresholds Optional shadow thresholds for the input images (a list of real values in quotes, one per image). See also ``--shadow-threshold``. --custom-shadow-threshold-list A list having one image and one shadow threshold per line. For the images specified there, override the shadow threshold supplied by other means with this value. --robust-threshold If positive, set the threshold for the robust measured-to-simulated intensity difference (using the Cauchy loss). Any difference much larger than this will be penalized. A good value may be 5% to 25% of the average image value or the same fraction of the computed image exposure values. --estimate-height-errors Estimate the SfS DEM height uncertainty (in meters). This option is obsolete. Use ``--save-variances`` instead (:numref:`sfs_unc`). This older implementation works by finding the height perturbation at each grid point which will make at least one of the simulated images at that point change by more than twice the discrepancy between the unperturbed simulated image and the measured image. The SfS DEM must be provided via the ``-i`` option. The number of iterations, blending parameters (``--blending-dist``, etc.), and smoothness weight are ignored. Results are not computed at image pixels in shadow. This produces ``-height-error.tif``. No SfS DEM is computed. See also ``--height-error-params``. This uncertainty may be overly optimistic (:cite:`jindal2024measuring_v2`). --height-error-params Specify the largest height deviation to examine (in meters), and how many samples to use from 0 to that height. --model-shadows Model the fact that some points on the DEM are in the shadow (occluded from the Sun). --sun-positions A file having on each line an image name and three values in double precision specifying the Sun position in meters in ECEF coordinates (origin is planet center). Use a space as separator. If not provided, these will be read from the camera file for ISIS and CSM models. See also ``--sun-angles``. --sun-angles A file having on each line an image name and two values in double precision specifying the Sun azimuth and elevation in degrees, relative to the center point of the input DEM. Use a space as separator. The azimuth is measured clockwise from the North, and the elevation is measured from the horizon. The site https://www.suncalc.org/ can help find these values. This is an alternative to ``--sun-positions``. --save-dem-with-nodata Save a copy of the DEM while using a no-data value at a DEM grid point where all images show shadows. To be used if shadow thresholds are set. --save-variances Save the uncalibrated variance of the DEM for each pixel. If ``--float-albedo`` is on, also save the variance of the albedo. Note that computing the albedo variance can be ill-posed if ``--float-haze`` and/or ``--float-exposure`` is also on. See :numref:`sfs_outputs` for output filenames and :numref:`sfs_unc` for usage. --save-covariances In addition to saving the uncalibrated variance of the DEM (and albedo) at each pixel (as for ``--save-variances``), also save the covariance between each DEM pixel and its four immediate neighbors (left, right, top, bottom), and the same for the albedo if ``--float-albedo`` is on. See :numref:`sfs_outputs` for output filenames and :numref:`sfs_unc` for usage. --use-approx-camera-models Use approximate camera models for speed. Only with ISIS .cub cameras. --crop-input-images Crop the images to a region that was computed to be large enough and keep them fully in memory, for speed. This is the default in the latest builds. --blending-dist Give less weight to image pixels close to no-data or boundary values. Enabled only when crop-input-images is true, for performance reasons. Blend over this many pixels. See also ``--blending-power``, ``--min-blend-size`` and ``--allow-borderline-data``. See example in :numref:`sfs-lola`. --blending-power Raise the blending weights (they are no more to 1.0) to this power. A higher value will result in smoother (but more abrupt) blending as the weights decay faster close to 0. --min-blend-size Do not apply blending in shadowed areas for which both the width and height are less than this. This avoids losing data around small holes, but the solution may become less smooth. --estimate-exposure-haze-albedo Estimate the exposure for each image, the haze for each image (if ``--num-haze-coeffs`` is positive), and the global low-resolution albedo (if ``--float-albedo`` is on), then quit. This operation samples the input DEM based on ``--num-samples-for-estim``. The produced files are described in :numref:`sfs_outputs`. This is invoked automatically by ``parallel_sfs`` before running ``sfs`` proper, unless these quantities are provided as inputs. --compute-exposures-only This older option is equivalent to ``--estimate-exposure-haze-albedo``. --image-exposures-prefix Use this prefix to optionally read initial exposures (filename is ``-exposures.txt``). --input-albedo The input albedo image, if known. Must have the same dimensions as the input DEM. Otherwise it is initialized to 1. Can be refined with ``--float-albedo``. --save-sim-intensity-only Save the simulated image intensities at each DEM pixel for the given DEM, images, cameras, and reflectance model, without refining the DEM. The output files are of the form ``-*-sim-intensity.tif``. The image exposures will be computed along the way unless specified via ``--image-exposures-prefix``, and will be saved in either case to ``-exposures.txt``. Same for haze, if applicable. See also ``--save-meas-intensity-only``. --save-meas-intensity-only Save the measured image intensities at each DEM pixel for the given DEM, images, and cameras, without refining the DEM. The output files are of the form ``-*-meas-intensity.tif`` for each input image. See also ``--save-sim-intensity-only``. --ref-map Save the simulated or measured intensity images to the extent given by this mapprojected image. For use with ``--save-sim-intensity-only`` and ``--save-meas-intensity-only``. --allow-borderline-data At the border of the region where there are no lit pixels in any images, do not let the blending weights decay to 0. This noticeably improves the level of detail. The ``sfs_blend`` (:numref:`sfs_blend`) tool may need to be used to further tune this region. See an illustration in :numref:`sfs_borderline`. --low-light-threshold A threshold for low-light pixels. If positive, pixels with intensity between this and the shadow threshold will be given less weight, if other images have higher intensity values at the same ground point. This helps fix seams. See usage in :numref:`sfs_seams`. See also ``--low-light-weight-power``, ``--low-light-blur-sigma``, and ``--erode-seams``. --low-light-weight-power With the option ``--low-light-threshold``, the weight of a low-light pixel is inversely proportional with the discrepancy between the simulated and observed pixel value, raised to this power. --low-light-blur-sigma With the option ``--low-light-threshold``, apply a Gaussian blur with this sigma to the low-light weight image, to make it continuous. --erode-seams Be more aggressive in removing seam artifacts, even if this results in erosion of valid terrain. --model-coeffs-prefix Use this prefix to optionally read model coefficients from a file (filename is ``-model_coeffs.txt``). --model-coeffs Use the reflectance model coefficients specified as a list of numbers in quotes. For example: * Lunar-Lambertian: O, A, B, C, would be ``"1 -0.019 0.000242 -0.00000146"`` * Hapke: omega, b, c, B0, h, would be ``"0.68 0.17 0.62 0.52 0.52"`` * Charon: A, f(alpha), would be ``"0.7 0.63"`` --crop-win Crop the input DEM to this region before continuing. --init-dem-height Use this value for initial DEM heights (measured in meters, relative to the datum). An input DEM still needs to be provided for georeference information. --nodata-value Use this as the DEM no-data value, over-riding what is in the initial guess DEM. --fix-dem Do not float the DEM at all. Useful when floating the model params. --float-reflectance-model Allow the coefficients of the reflectance model to float (not recommended). --query Print some info, including DEM size and the solar azimuth and elevation for the images, and exit. Invoked from parallel_sfs. -t, --session-type 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 :numref:`ps_options` for options. --steepness-factor Try to make the terrain steeper by this factor. This is not recommended in regular use. --curvature-in-shadow Attempt to make the curvature of the DEM (the Laplacian) at points in shadow in all images equal to this value, which should make the DEM curve down. --curvature-in-shadow-weight The weight to give to the curvature in shadow constraint. --lit-curvature-dist If using a curvature in shadow, start phasing it in this far from the shadow boundary in the lit region (in units of pixels). --shadow-curvature-dist If using a curvature in shadow, have it fully phased in this far from shadow boundary in the shadow region (in units of pixels). --integrability-constraint-weight Use the integrability constraint from Horn 1990 with this value of its weight (experimental). --smoothness-weight-pq Smoothness weight for p and q, when the integrability constraint is used. A larger value will result in a smoother solution (experimental). --num-haze-coeffs Set this to 1 to model the problem as ``image = exposure * albedo * reflectance + haze``, where ``haze`` is a single value for each image (:numref:`sfs_formulation`). --float-haze If specified, float the haze coefficients as part of the optimization (if ``--num-haze-coeffs`` is 1). --haze-prefix Use this prefix to read initial haze values (filename is ``-haze.txt``). The file format is the same as what the tool writes itself, when triggered by the earlier options. If haze is modeled, it will be initially set to 0 unless read from such a file, and will be floated or not depending on whether ``--float-haze`` is on. The final haze values will be saved to ``-haze.txt``. --num-samples-for-estim Number of samples to use for estimating the exposure, haze, and albedo. A large value will result in a more accurate estimate, but will take a lot more memory. --read-exposures If set, read the image exposures with the current output prefix. Useful with a repeat invocation from ``parallel_sfs``, when with this option the exposures of the current tile are read, and not for the whole site. --read-haze If set, read the haze values with the current output prefix. See also ``--read-exposures``. --read-albedo If set, read the computed albedo with the current output prefix. See also ``--read-exposures``. --gradient-weight The weight given to the cost function term which consists of sums of squares of first-order derivatives. A larger value will result in shallower slopes but less noise. This can be used in conjunction with ``--smoothness-weight``. It is suggested to experiment with this with a value of 0.0001 - 0.01, while reducing the smoothness weight to a very small value. --save-sparingly Avoid saving any results except the adjustments and the DEM, as that's a lot of files. --camera-position-step-size Larger step size will result in more aggressiveness in varying the camera position if it is being floated (which may result in a better solution or in divergence). --threads How many threads each process should use. This will be changed to 1 for ISIS cameras when ``--use-approx-camera-models`` is not set, as ISIS is single-threaded. Not all parts of the computation benefit from parallelization. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/sfs_blend.rst ================================================ .. _sfs_blend: sfs_blend --------- The ``sfs_blend`` tool is a very specialized DEM blending program developed for use in conjunction with Shape-from-Shading (:numref:`sfs`). It replaces in an SfS-produced DEM height values that are in permanent shadow with values from the initial guess DEM used for SfS (which is typically the LOLA gridded DEM), with a transition region between the two DEMs. Motivation and an example of an invocation of this tool are given in the :ref:`SfS usage ` chapter. Command-line options: --sfs-dem The SfS DEM to process. --lola-dem The LOLA DEM to use to fill in the regions in permanent shadow. --max-lit-image-mosaic The maximally lit image mosaic to use to determine the permanently shadowed regions. --image-threshold The value separating permanently shadowed pixels from lit pixels in the maximally lit image mosaic. --lit-blend-length 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. Because of the weight blur below, the effective blending length can be somewhat bigger than this. --shadow-blend-length 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. Because of the weight blur below, the effective blending length can be somewhat bigger than this. --weight-blur-sigma 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. --min-blend-size Do not apply blending in shadowed areas of dimensions less than this, hence keeping there the SfS DEM. --output-dem The blended output DEM to save. --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). --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/stereo.rst ================================================ .. _stereo: stereo ------ The ``stereo`` program takes as input a stereo pair of images that overlap with corresponding camera models and creates an output point cloud image that can be processed into a visualizable mesh or a DEM using :ref:`point2mesh` and :ref:`point2dem` respectively. This program is deprecated and can be used only with ASP's original block matching algorithm (``ASP_BM``). It is suggested to use instead ``parallel_stereo`` (:numref:`parallel_stereo`). Usage:: stereo [options] [] Example (for ISIS):: stereo --stereo-algorithm asp_bm --subpixel-mode 1 \ file1.cub file2.cub results/run Example (for DigitalGlobe Earth images):: stereo -t dg --stereo-algorithm asp_bm --subpixel-mode 3 \ file1.tif file2.tif file1.xml file2.xml \ results/run See :numref:`tutorial` for introductory examples, :numref:`nextsteps` for the various stereo algorithms available, and :numref:`examples` for many usage examples. How to pass options to ``stereo`` via the command line or the ``stereo.default`` configuration file is discussed in :numref:`stereodefault`. ``stereo`` creates a set of intermediate files, they are described in :numref:`outputfiles`. Command-line options ~~~~~~~~~~~~~~~~~~~~ -t, --session-type Select the stereo session type to use for processing. Usually the program can select this automatically by the file extension. See :numref:`parallel_stereo` for options. -s, --stereo-file Define the stereo.default file to use. -e, --entry-point Stereo Pipeline entry point. Start at this stage. See :numref:`entrypoints`. --stop-point Stereo Pipeline stop point (stop at the stage *right before* this). --corr-seed-mode Correlation seed strategy (:numref:`corr_section`). --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display the help message. ================================================ FILE: docs/tools/stereo_dist.rst ================================================ .. _stereo_dist: stereo_dist ----------- The ``stereo_dist`` program performs distributed stereo processing. Nearly all steps are run on small tiles in parallel across a set of computing nodes. This also includes the preprocessing and filtering steps, which are serial in :ref:`parallel_stereo`. DEM creation per tile and mosaicking of produced DEMs are also distributed. This program requires that input images be mapprojected, or the ``--mapproject`` option be passed in to mapproject them automatically. GNU Parallel manages the jobs. It is expected that all nodes can connect to each other using ssh without password and that they share the same storage space. .. _stereo_dist_example: Example with mapprojected images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: stereo_dist \ left_map.tif right_map.tif \ left.json right.json \ run/run \ --dem input_dem.tif \ --tile-size 2048 \ --tile-padding 256 \ --nodes-list machines.txt \ --processes 5 \ --threads-multiprocess 4 \ --threads-singleprocess 16 \ --point2dem-options \ '--tr 2.0 --orthoimage --errorimage' The input images must be mapprojected (:numref:`mapproj-example`). The mapprojection DEM should be set with ``--dem``. All output files (:numref:`outputfiles`) will start with the provided prefix (``run/run`` above). The result of this program will be the stereo DEM (and optionally ortho and error images). The workflow in :numref:`stereo_dist_workflow` has more details. This program can be run on PBS and SLURM systems in a manner analogous to :ref:`parallel_stereo`. The ``--nodes-list`` option is then required. See :numref:`pbs_slurm` for details. The option ``--point2dem-options`` must include ``--tr`` and the grid size (typically in meters) to ensure a consistent grid size across all tiles that are later merged. .. _stereo_dist_mapproject: Example with raw images ~~~~~~~~~~~~~~~~~~~~~~~ With the ``--mapproject`` option, raw (not mapprojected) images can be specified as inputs. The program will mapproject both images onto the DEM before running stereo. :: stereo_dist \ --mapproject \ left.cub right.cub \ run/run \ --nodes-list machines.txt \ --dem input_dem.tif \ --tile-size 2048 \ --tile-padding 256 \ --point2dem-options \ '--tr 2.0' Here we omitted the cameras as those are contained in the cub files. The projection is auto-determined based on the DEM and the left image (:numref:`mapproj_auto_proj`). The mapprojection grid size (GSD) is set to the minimum of those estimated from the input images. The mapprojection region is the intersection of the regions for the two images. Any of these can be explicitly set with ``--t_srs``, ``--tr``, and ``--t_projwin`` (:numref:`stereo_dist_options`). The mapprojected images are saved as ``-left_map.tif`` and ``-right_map.tif``. Then, the same processing is done as with pre-existing mapprojected images. These are reused with ``--entry-point 1`` or higher. .. _stereo_dist_workflow: Workflow ~~~~~~~~ The processing is as follows: - The images are mapprojected (with the ``--mapproject`` option only). - Statistics is computed for the input mapprojected images. This is a serial process but is quite fast. - The list of tiles is created and saved with a name based on the output prefix and ending in ``-distTileList.txt``. A shapefile with the tile boundaries is also created for visualization. - All tiles are run in parallel with the :ref:`stereo_tile` program. That program creates a subdirectory for the given tile and provides the global statistics via a symbolic link. It then does preprocessing, correlation, refinement, filtering, triangulation, and DEM creation. These operations are described in :numref:`entrypoints`. - The per-tile DEMs are mosaicked into a single output DEM with :ref:`dem_mosaic`. This is done in parallel as well, for subsets of DEMs, whose results are then mosaicked together. - If ``--orthoimage`` is in ``--point2dem-options``, the per-tile ortho images (DRG files, :numref:`point2dem_ortho_err`) are mosaicked the same way. The ``L.tif`` file needed by ``--orthoimage`` is autocompleted for each tile. Similarly, if ``--errorimage`` is passed, the per-tile intersection error images are mosaicked. - Unlike :ref:`parallel_stereo`, the blend step for disparities is skipped. Each tile is processed fully independently, and blending only happens between DEMs during the final mosaic. The ``--entry-point`` and ``--stop-point`` options can be invoked to run only a portion of these steps. See :numref:`stereo_dist_options` for the step numbers. Any options that are not specific to this program are passed directly to :ref:`stereo_tile` and the stereo executables (:numref:`cmdline`). .. _stereo_dist_options: Command-line options ~~~~~~~~~~~~~~~~~~~~ --dem Input DEM. Required. Used for mapprojection (with ``--mapproject``) and for stereo triangulation. --mapproject Mapproject the input images onto the DEM before running stereo. The projection, grid size, and bounding box are auto-determined to be consistent for both images. See :numref:`stereo_dist_mapproject`. --tile-size Size of each tile (in pixels) for distributed processing. This is before the padding is added. --tile-padding Padding around each tile (in pixels) to avoid boundary artifacts. --point2dem-options Options to pass to :ref:`point2dem`. Must include ``--tr`` to set the grid size for consistent tiling. Can pass ``--orthoimage`` with no argument, and the L.tif file for each tile will be autocompleted. Can also pass ``--errorimage``. See :numref:`stereo_dist_workflow`. --nodes-list A file containing the list of computing nodes, one per line. If not provided, run on the local machine. --processes The number of processes to use per node. --threads-multiprocess The number of threads to use per process when running multiple processes. --threads-singleprocess The number of threads to use when running a single process. -e, --entry-point Stereo pipeline entry point. Values: 0=pprc, 1=corr, 2=blend (skipped, kept for compatibility with :ref:`parallel_stereo` steps), 3=rfne, 4=fltr, 5=tri, 6=cleanup, 7=dem, 8=mosaic. --stop-point Stereo pipeline stop point (stop before this step). --t_srs Output projection for mapprojection. A PROJ string, EPSG code, or path to a WKT file. Auto-determined from the left image if not set. Only used with ``--mapproject``. --tr Output grid size (ground sample distance) for mapprojection, in units of the projection. Auto-determined as the finer of the two images if not set. Only used with ``--mapproject``. --t_projwin Bounding box for mapprojection in projected coordinates. Auto-determined as the intersection of the two image footprints if not set. Only used with ``--mapproject``. If the images are already mapprojected, use instead the ``--proj-win`` option which will be passed to the stereo executables (:numref:`stereodefault`). --parallel-options Options to pass directly to GNU Parallel. --verbose Display the commands being executed. --dry-run Do not launch the jobs, only print the commands that should be run. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/stereo_gui.rst ================================================ .. _stereo_gui: stereo_gui ---------- The ``stereo_gui`` program is a GUI frontend to ``stereo`` and ``parallel_stereo`` (:numref:`parallel_stereo`). It can be used for running stereo on small clips. In addition, it can inspect the input images and produced datasets. Use as stereo front-end ~~~~~~~~~~~~~~~~~~~~~~~ This program can be invoked just as ``parallel_stereo``:: stereo_gui [options] [] output_prefix [dem] Here is an example when using RPC cameras:: stereo_gui -t rpc left.tif right.tif left.xml right.xml run/run One can zoom with the mouse wheel, or by dragging the mouse from upper-left to lower-right (zoom in), and vice-versa (zoom out). The ``=`` and ``-`` keys zoom in and out (also in the ``View`` menu). Use the arrow keys to pan (first click to bring the image in focus). By pressing the ``Control`` key while dragging the mouse, clips can be selected in the input images, and then the stereo programs can be run on these clips from the ``Run`` menu. The desired regions are passed to these programs via the ``--left-image-crop-win`` and ``--right-image-crop-win`` options. The actual command being used will be displayed on screen, and can be re-run on a more powerful machine/cluster without GUI access. If the images are map-projected (:numref:`mapproj-example`), the low-resolution DEM will show up as the third image. There is no need to select a clip in that DEM. .. figure:: ../images/stereo_gui.jpg :name: asp_gui_fig :alt: stereo_gui An illustration of ``stereo_gui``. Stereo processing will happen on the regions selected by red rectangles. If this program is invoked with two images (with or without cameras and output prefix) and with values for ``--left-image-crop-win`` and ``--right-image-crop-win``, it will draw the corresponding regions on startup. See also our tutorials in :numref:`tutorial`. Use as an image viewer ~~~~~~~~~~~~~~~~~~~~~~ This program can be also used as a general-purpose image viewer, case in which no stereo options or cameras are necessary. It can display arbitrarily large images with integer, floating-point, or RGB pixels, including ISIS .cub files and DEMs. It handles large images by building on disk pyramids of increasingly coarser subsampled images and displaying the subsampled versions that are appropriate for the current level of zoom. The images can be shown either all side-by-side (default), several side-by-side (``--view-several-side-by-side``), as tiles on a grid (using ``--grid-cols integer``), or on top of each other (using ``--single-window``). When the images are shown on top of each other, the option ``--use-georef`` will overlay the images correctly if georeference information is present. In recent builds this is the default, if all georeferences exist, and this mode can be turned off with ``--no-georef``. It is possible to switch among the various display modes from the ``View`` menu. When the images are shown side-by-side, the GUI can zoom in all images to the same region, for easier comparison among them. This is accessible from the ``View`` menu and with the option ``--zoom-all-to-same-region``. When the images are in a single window, an individual image can be turned on or off via a checkbox. Clicking on an image's name will zoom to it and display it on top of other images. By right-clicking on an image name, other operations can be performed, such as hillshading, etc. In this mode, the keys ``n`` and ``p`` can be used to cycle among the images. .. _stereo_gui_other: Other features ~~~~~~~~~~~~~~ The ``stereo_gui`` program can: - Create and show hillshaded DEMs (:numref:`stereo_gui_hillshade`). - Colorize images on-the-fly (``--colorize``) and optionally show a colorbar with axes (``--colorbar``). See :numref:`colorize`. - Display the output of the ASP ``colormap`` and ``hillshade`` tools (:numref:`colormap`, :numref:`hillshade`). - Overlay scatter plots on top of images (:numref:`plot_csv`). - Overlay and edit polygons (:numref:`plot_poly`). - Find pixel values and region bounds (:numref:`image_bounds`). - View (:numref:`stereo_gui_view_ip`) and edit (:numref:`stereo_gui_edit_ip`) interest point matches displayed on top of images. - Load .nvm files having an SfM solution (:numref:`stereo_gui_nvm`). - View ISIS ``jigsaw`` control network files (:numref:`stereo_gui_isis_cnet`). - View GCP and .vwip files (:numref:`stereo_gui_vwip_gcp`). - Create GCP with georeferenced images and a DEM (:numref:`creatinggcp`). - Create interest point matches using mapprojected images (:numref:`mapip`). - Threshold images (:numref:`thresh`). - Cycle through images, showing one at a time (:numref:`gui_cycle`). - Save a screenshot to disk in the BMP or XPM format. .. _stereo_gui_hillshade: Hillshading ~~~~~~~~~~~ The ``stereo_gui`` program can create and display hillshaded DEMs. Example:: stereo_gui --hillshade dem.tif Or, after the DEM is open, select from the GUI View menu the ``Hillshaded images`` option. Right-click to change the azimuth and elevation angles, hence the direction and height of the light source. Then toggle hillshading off and then on again. Hillshaded images can also be produced with the ``hillshade`` tool (:numref:`hillshade`) or with ``gdaldem hillshade`` (:numref:`gdal_tools`). Images that are both colorized and hillshaded can be created with ``colormap`` (:numref:`colormap`), and then loaded in this program. .. _colorize: Displaying colorized images, with a colorbar and axes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``stereo_gui`` can have images be colorized on-the-fly by mapping intensities to colors of a given colormap. Optionally, a colorbar with axes (ticks) can be shown next to each image. CSV files can be colorized as well. The ``--colorize`` and ``--colorbar`` flags are per-image with sticky semantics: each applies to all subsequent images until turned off by ``--no-colorize`` or ``--no-colorbar``. The ``--colorbar`` flag implies ``--colorize``. An example invocation is as follows:: stereo_gui --colorbar \ --colormap-style inferno \ img1.tif \ --colormap-style binary-red-blue \ img2.tif \ --no-colorbar \ img3.tif This will colorize the first two images (with colorbar) using the ``inferno`` and ``binary-red-blue`` colormaps respectively. The third image is still colorized (because ``--no-colorbar`` does not turn off colorization) but has no colorbar. Use ``--no-colorize`` to fully turn off colorization. See :numref:`colormap` for the full list of colormaps. Each ``--colormap-style`` option also applies to all subsequent images until overridden by this option with another value. The range of intensities of each colorized image is computed automatically. Right-click in each image to adjust this range. The ``--min`` and ``--max`` options will set values for these that will apply to all images. Colorization works as well with overlaid and georeferenced images. .. figure:: ../images/colorbar_axes.png :name: colorbar_axes_fig :alt: colorbar_axes_fig. An illustration of displaying images with specified colormap, with colorbar and axes, and without them. See :numref:`scattered_points_colorbar` for an example having scattered points. .. _plot_csv: View scattered points ~~~~~~~~~~~~~~~~~~~~~ ``stereo_gui`` can plot and colorize scattered points stored in CSV files, and overlay them on top of images or each other. Each point will show up as a dot with a radius given by ``--plot-point-radius``. Use ``--colorize`` or ``--colorbar`` to enable colorization. A colorbar and axes can be shown as well (:numref:`scattered_points_colorbar`). Here is an example of plotting the final ``*pointmap.csv`` residuals created by ``bundle_adjust`` for each interest point (:numref:`ba_out_files`):: stereo_gui --colorize --colormap-style binary-red-blue \ --min 0 --max 0.5 --plot-point-radius 2 \ ba/run-final_residuals_pointmap.csv This will use the longitude and latitude as the position, and will determine a color based on the 4th field in this file (the error) and the min and max values specified above (which correspond to blue and red in the colorized plot, respectively). Files whose name contain the strings ``match_offsets`` and ``anchor_points`` (created by ``bundle_adjust`` and ``jitter_solve``, :numref:`jitter_solve`), and error files created by ``pc_align`` (:numref:`pc_align_error`) can be plotted the same way. Same with ``diff.csv`` files created by ``geodiff`` (:numref:`geodiff`), only in the latter case the third (rather than fourth) column will have the intensity (error) value. The option ``--colormap-style`` accepts the same values as ``colormap`` (:numref:`colormap`). To plot an arbitrary CSV file with longitude, latitude and value, do:: stereo_gui --csv-format "1:lon 2:lat 3:height_above_datum" \ --datum D_MOON --colorize \ filename.csv If the file has data in projected units (such as using Easting and Northing values), specify the option ``--csv-srs`` having the projection, and use for the CSV format a string such as:: "1:easting 2:northing 3:height_above_datum" .. figure:: ../images/scattered_points.png :name: scattered_points :alt: scattered_points A colorized CSV file overlaid on top of a georeferenced image. .. figure:: ../images/scattered_points_colorbar.png :name: scattered_points_colorbar :alt: scattered_points_colorbar A colorized CSV file with a colorbar and axes. This uses the ``--colorbar`` option. Datasets with colorbars are displayed side-by-side (:numref:`colorize`). .. _plot_poly: Polygon editing and contouring ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``stereo_gui`` can be used to draw and edit polygonal shapes on top of georeferenced images, save them as shape files (``*.shp``) or in plain text, and load such files from the command line (including ones produced with external tools). The editing functionality can be accessed by turning on polygon editing from the ``Vector layer`` menu, and then right-clicking with the mouse to access the various functions. To create polygons, click with the left mouse button on points to be added. When clicking close to the starting point, the polygon becomes closed and and a new one can be drawn. A single point can be drawn by clicking twice in the same location. To draw a segment, click on its starting point, ending point, and then its starting point again. *One must return to the starting point for the polygon to be recorded.* The resulting shapes can be saved from the right-click menu as shapefiles or in plain text. The shapefile specification prohibits having a mix of points, segments, and polygons in the same file, so all drawn shapes must be of the same kind. When reading polygons and georeferenced images from disk, choose "View as georeferenced images" to plot the polygons on top of the images. .. figure:: ../images/stereo_gui_poly.png :name: stereo_gui_poly :alt: stereo_gui_poly A polygon drawn on top of a georeferenced image, in the "move vertices" editing mode. Plain-text polygon files ^^^^^^^^^^^^^^^^^^^^^^^^ The ``stereo_gui`` program can overlay plain-text polygon files on top of images, such as:: stereo_gui --use-georef --single-window \ poly1.txt poly2.txt image.tif if each of these has georeference (and csv format) information. That is the case when the polygons were created in the GUI and saved to disk. This polygon format is described in :numref:`poly_files`. To display polygons from any text file, additional options should be specified, such as:: stereo_gui --style poly --csv-format 1:lon,2:lat \ --csv-datum D_MOON poly.csv If such a file has multiple columns, the indices above can be changed to the ones desired to plot. Files having Easting-Northing information can be loaded as in :numref:`plot_csv`, while omitting the third column in the csv format string. If no georeference information exists, the CSV format can be set to ``1:x,2:y`` if it is desired to have the y axis point up, and ``1:pix_x,2:pix_y`` if it should point down, so that such polygons can be overlaid on top of images. Any polygon properties set in the files will override the ones specified on the command line, to ensure that files with different properties can be loaded together. .. _gdal_rasterize_example: Applications ^^^^^^^^^^^^ The ``gdal_rasterize`` command can be used to keep or exclude the portion of a given georeferenced image or a DEM that is within or outside a polygonal shape. Example:: gdal_rasterize -i -burn poly.shp dem.tif Here, if the DEM nodata value is specified, the DEM will be edited and values outside the polygon will be replaced with no data. The ``stereo_gui`` program can find the polygonal contour at a given image threshold (which can be either set or computed from the ``Threshold`` menu). This option is accessible from the ``Vector layer`` menu as well, with or without the polygon editing mode on. .. _image_bounds: Finding pixel values and region bounds ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When clicking on a pixel of an image opened in ``stereo_gui``, the pixel indices and image value at that pixel will be printed on screen. When selecting a region by pressing the ``Control`` key while dragging the mouse, the region pixel bounds (``src win``) will be displayed on screen. If the image is geo-referenced, the extent of the region in projected coordinates (``proj win``) and in the longitude-latitude domain (``lonlat win``) will be shown as well. The pixel bounds can be used to crop the image with ``gdal_translate -srcwin`` (:numref:`gdal_tools`) and with the ISIS ``crop`` command. The extent in projected coordinates can be used to crop with ``gdal_translate -projwin``, and is also accepted by ``gdalwarp``, ``point2dem``, ``dem_mosaic``, and ``mapproject``, for use with operations on regions. One can zoom to a desired proj win from the ``View`` menu. This is helpful to reproduce a zoom level. If multiple images are present, the proj win used is for the first one. This can be invoked at startup via ``--zoom-proj-win``. .. _stereo_gui_view_ip: View interest point matches ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``stereo_gui`` can be used to view interest point matches (``*.match`` files), such as generated by ``ipmatch`` (:numref:`ipmatch`), ``bundle_adjust`` (:numref:`bundle_adjust`), or ``parallel_stereo``. Several modes are supported. View matches for an image pair ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The match file to load can be specified via ``--match-file``, or loaded based on extension, so both of these will work:: stereo_gui left.tif right.tif \ --match-file run/run-left__right.match stereo_gui left.tif right.tif run/run-left__right.match The match file may also be auto-detected if ``stereo_gui`` was invoked like ``parallel_stereo``, with an output prefix:: stereo_gui left.tif right.tif run/run and then the match file is loaded from the *IP matches -> View IP matches* menu. (Auto-detection works only when the images are not mapprojected, stereo was not run on image clips, and alignment method is not ``epipolar`` or ``none``.) Plain-text match files (:numref:`txt_match`) can be loaded as:: stereo_gui \ --matches-as-txt \ left.tif right.tif \ --match-file run/run-left__right.txt These two options must be explicitly set, as otherwise the program may mistake the text file for a CSV file. See also editing of interest point matches in :numref:`stereo_gui_edit_ip`. .. _stereo_gui_pairwise_matches: View pairwise matches for *N* images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Given *N* images and interest point matches among any of them, such as created by ``bundle_adjust``, the options ``--pairwise-matches`` and ``--pairwise-clean-matches`` (:numref:`gui_options`), also accessible from the *IP matches* menu, can load the match file for a selected image pair if the output prefix was specified. For that, run:: stereo_gui --pairwise-matches image1.tif ... imageN.tif run/run then select a couple of images to view using the checkboxes on the left, and their match file will be displayed automatically. This mode is available also from the *View* menu. See an illustration in :numref:`asp_gui_nvm`. .. _stereo_gui_N_image_matches: View all matches for *N* images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This mode allows viewing (and editing, see :numref:`stereo_gui_edit_ip`), interest points for *N* images at once, but some rigid and a bit awkward conventions are used, to be able to display all those points at the same time. For image i, the match file must contain the matches from image i-1 to i, or from image 0 to i. You can provide these match files to ``stereo_gui`` by conforming to its naming convention (``output-prefix-fname1__fname2.match``) or by selecting them from the GUI when prompted. All match files must describe the same set of interest points. The tool will check the positions of loaded points and discard any that do not correspond to the already loaded points. Run:: stereo_gui image1.tif ... imageN.tif run/run (the last string is the output prefix). Select viewing of interest point matches. If one of the match files fails to load or does not contain enough match points, the missing points will be added to an arbitrary position and flagged as invalid. You must either validate these points by manually moving them to the correct position or else delete them. .. _stereo_gui_nvm: View NVM files ^^^^^^^^^^^^^^ This tool can also visualize pairwise interest point matches loaded from a plain-text .nvm file created by a Structure-from-Motion tool, such as ``theia_sfm`` (:numref:`theia_sfm`) and ``rig_calibrator`` (:numref:`rig_calibrator`). This file normally has all features shifted relative to the camera optical center. Then an associated ``_offsets.txt`` file must exist having the optical center per image. The above-mentioned programs write such an offset file. This file is auto-loaded along with the .nvm file. An .nvm file having features that are not shifted can be loaded as well. Such files are created by ``rig_calibrator`` with the ``--save_nvm_no_shift`` option (:numref:`rig_calibrator`). In this case, call ``stereo_gui`` with the additional option ``--nvm-no-shift``. Example:: stereo_gui --nvm-no-shift --nvm nvm_no_shift.nvm (The ``--nvm`` option can also be omitted, and only the file itself can be specified.) In this mode, the lowest-resolution subimage size is larger than usual, to avoid creating small files. See ``--lowest-resolution-subimage-num-pixels``. .. figure:: ../images/stereo_gui_nvm.png :name: asp_gui_nvm :alt: stereo_gui_nvm. An illustration of ``stereo_gui`` displaying an .nvm file. Pairs of images can be chosen on the left, and matches will be shown. The images were created with the MSL Curiosity rover (:numref:`rig_msl`). .. _stereo_gui_isis_cnet: View ISIS control network files ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ISIS jigsaw (:numref:`jigsaw`) binary control network format can be visualized as:: stereo_gui --isis-cnet This file is expected to end with ``.net``. The images must be the same as in the control network, and in the same order, or else the results will be incorrect. This file format does not keep track of the image names. ASP's ``bundle_adjust`` can also create and update such files (:numref:`control_network`). Then, non-ISIS images can be used as well, and this tool can load the resulting control network. .. _stereo_gui_vwip_gcp: View GCP and .vwip files ~~~~~~~~~~~~~~~~~~~~~~~~ This tool can show the interest points from a GCP file (:numref:`bagcp`). Example:: stereo_gui image1.tif ... imageN.tif --gcp-file mygcp.gcp This works even for a single image. If ``--gcp-file`` is not specified but the GCP file is provided, this file will still be loaded. Creating GCP is described in :numref:`creatinggcp`. The ``stereo_gui`` program can also display ``.vwip`` files. Those are interest points created by ``ipfind``, ``bundle_adjust``, or ``parallel_stereo``, before they are matched across images. One should specify as many such files as images when launching this program. .. _stereo_gui_edit_ip: Edit interest point matches ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``stereo_gui`` can be used to manually create and delete interest point matches (useful in situations when automatic interest point matching is unreliable due to large changes in illumination). This works for *N* images. Example:: stereo_gui image1.tif ... imageN.tif run/run (the last string is the output prefix). Select from the top menu:: IP matches -> View IP matches If some matches exist already, they will be loaded, per :numref:`stereo_gui_N_image_matches`. Do not use ``--pairwise-matches`` and ``--pairwise-clean-matches`` here. Interest point matches can be created or deleted with the right-mouse click. This works whether a pre-existing match file was loaded, or starting from scratch. To move interest points, right-click on an image and check "Move match point". While this is checked, one can move interest points by clicking and dragging them within the image extent. Uncheck "Move match point" to stop moving interest points. The edited interest point matches can be saved from the *IP matches* menu. :numref:`ba_match_files` describes the naming convention (both for ``bundle_adjust`` and ``parallel_stereo``). Then these programs will be able to pick up the produced matches. If handling *N* images at once becomes too complicated, it is suggested to edit the matches one pair at a time. .. _creatinggcp: Creating GCP with with an orthoimage and a DEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There exist situations when one has one or more images for which the camera files are either inaccurate or, for Pinhole camera models, just the intrinsics may be known. Given a DEM of the area of interest, and optionally an orthoimage (mapprojected image, georeferenced image), these an be used to create GCP files (:numref:`bagcp`). GCP can be provided to ``bundle_adjust`` to refine the camera poses, transform the cameras to given coordinates, or to create new cameras (:numref:`ba_use_gcp`). A DEM can be obtained using the instructions in :numref:`initial_terrain`. Use, if applicable, ``dem_geoid`` to convert the DEM to be relative to an ellipsoid. Open the desired images, the orthoimage, the DEM, and the GCP file to be created in the GUI, as follows:: stereo_gui img1.tif img2.tif img3.tif \ ortho.tif \ --dem-file dem.tif \ --gcp-file output.gcp \ --gcp-sigma 1.0 \ run/run The orthoimage must be after the images for which GCP will be created. If no orthoimage exists, one can use the given DEM instead (and it can be hillshaded after loading to easier identify features). The ground locations are found from the orthoimage and their elevations from the DEM. The interest points in the orthoimage are not saved to the GCP file. A feature is identified and manually added as a matching interest point (match point) in all open images, from left to right. For that, use the right right-click menu, and select ``Add match point``. This process is repeated a few times. If the match point is not added in all images before starting with a new one, that will result in an error. The match points can be moved around by right-clicking to turn on this mode, and then dragging them with the mouse. When done creating interest points, use the ``IP matches -> Write GCP file`` menu item to save the GCP file. It is suggested to save the interest point matches from the same menu, as later those can be edited and reused to create GCP, while GCP cannot be edited. If above the reference DEM and GCP file were not set, the GUI will prompt for their names. If having many images, this process can be repeated for several small sets, creating several GCP files that can then be passed together to ``bundle_adjust``. The sigmas for the GCP should be set via the option ``--gcp-sigma``. Or use ``bundle_adjust`` with the option ``--fix-gcp-xyz`` to ensure GCP are kept fixed during optimization. GCP can be visualized in ``stereo_gui`` (:numref:`stereo_gui_vwip_gcp`). If the input images and the orthoimage are very similar visually, one can try to automatically detect and load interest point matches as follows:: ipfind img.tif ortho.tif ipmatch img.tif ortho.tif stereo_gui img.tif ortho.tif \ --match-file img__ortho.match \ --dem-file dem.tif \ --gcp-file output.gcp \ --gcp-sigma 1.0 Then, the interest points can be inspected and edited as needed, and the GCP file can be saved as above. See the documentation of ``ipfind`` (:numref:`ipfind`) and ``ipmatch`` (:numref:`ipmatch`), for how to increase the number of matches, etc. Lastly, non-GUI automatic approaches exists as well. Two methods are supported: tying a raw image to an orthoimage and a DEM (:numref:`gcp_gen`), and tying a produced DEM to a prior DEM (:numref:`dem2gcp`). See earlier in this section for how GCP can be used. .. _mapip: Creating interest point matches using mapprojected images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To make it easier to create interest point matches in situations when the images are very different or taken from very diverse perspectives, the images can be first mapprojected onto a DEM, as then they look a lot more similar. The interest points are created among the mapprojected images, and the matches are transferred to the original images. This section will describe how to do this with automatic and manual (GUI) means. Given three images ``A.tif``, ``B.tif``, and ``C.tif``, cameras ``A.tsai``, ``B.tsai``, and ``C.tsai``, and a DEM named ``dem.tif``, mapproject the images onto this DEM (:numref:`mapproject`), obtaining the images ``A.map.tif``, ``B.map.tif``, and ``C.map.tif``. :: for f in A B C; do mapproject --tr 1.0 dem.tif $f.tif $f.tsai $f.map.tif done The same resolution (option ``--tr``) should be used for all images, which should be a compromise between the ground sample distance values for these images. See :numref:`mapproj-example` how how to find a DEM for mapprojection and other details. Bundle adjustment will find interest point matches among the mapprojected images, and transfer them to the original images. Run:: bundle_adjust A.tif B.tif C.tif A.tsai B.tsai C.tsai \ --mapprojected-data 'A.map.tif B.map.tif C.map.tif dem.tif' \ --min-matches 0 -o run/run This will not recreate any existing match files either for mapprojected images or for unprojected ones. If that is desired, existing match files need to be deleted first. Add options such as ``--ip-per-tile 250 --matches-per-tile 250`` if needed to increase the number of interest point matches. If these images become too many to set on the command line, use the options ``--image-list``, ``--camera-list``, ``--mapprojected-data-list`` (:numref:`ba_options`). The DEM at the end of this option is optional in the latest builds, if it can be looked up from the geoheader of the mapprojected images. Each mapprojected image stores in its metadata the name of the original image, the camera model, the bundle-adjust prefix, if any, and the DEM it was mapprojected onto. Hence, the above command will succeed even if invoked with different cameras than the ones used for mapprojection, as long as the original cameras are still present and did not change. If the mapprojected images are still too different for interest point matching among them to succeed, one can try to bring in more images that are intermediate in appearance or illumination between the existing ones, so bridging the gap. Alternatively, interest point matching can be done *manually* in the GUI as follows:: stereo_gui --view-matches A.map.tif B.map.tif C.map.tif run/run Interest points can be picked by right-clicking on the same feature in each image, from left to right, and selecting ``Add match point``. Repeat this process for a different feature. The matches can be saved to disk from the menu. The bundle adjustment command from above can be invoked to unproject the matches. Do not forget to first delete first the match files among unprojected images so that ``bundle_adjust`` can recreate them based on the projected images. Run:: stereo_gui --view-matches A.tif B.tif C.tif run/run to check if the interest point matches, that were created using mapprojected images, were correctly transferred to the original images. Consider using instead the option ``--pairwise-matches`` if some features are not seen in all images. See :numref:`sfs3` for an illustration of this process. It is suggested to use ``--mapprojected-data`` with ``--auto-overlap-params.`` Then, the interest point matching will be restricted to the region of overlap (expanded by the percentage in the latter option). .. figure:: ../images/sfs3.jpg :name: sfs3 :alt: interest points picked manually An illustration of how interest points are picked manually for the purpose of bundle adjustment. This is normally not necessary if there exist images with intermediate illumination. .. _thresh: Image threshold ~~~~~~~~~~~~~~~ ``stereo_gui`` can be used to compute an image threshold for each of a given set of images based on sampling pixels (useful for shape-from-shading, see :numref:`sfs_usage`). This can be done by turning on from the menu the ``Threshold detection`` mode, and then clicking on pixels in the image. The largest of the chosen pixel values will be set to the threshold for each image and printed to the screen. From the same menu it is possible to see or change the current threshold. To highlight in the images the pixels at or below the image threshold, select from the menu the ``View thresholded images`` option. Those pixels will show up in red. Related to this, if the viewer is invoked with ``--nodata-value ``, it will display pixels with values less than or equal to this as transparent, and will set the image threshold to that no-data value. .. _gui_cycle: Cycle through images ~~~~~~~~~~~~~~~~~~~~ To load only one image at a time, for speed, specify all images on the command line, together with the ``--preview`` option. Then, can cycle through them with the 'n' and 'p' keys. In this mode, the lowest-resolution subimage size is larger than usual to avoid creating small images when building an image pyramid. See ``--lowest-resolution-subimage-num-pixels``. See also ~~~~~~~~ The ``sfm_view`` tool (:numref:`sfm_view`) can visualize cameras in orbit. The ``asp_plot`` package (:numref:`asp_plot`) can generate diagnostic plots and PDF reports from ASP outputs. The ``orbit_plot.py`` tool (:numref:`orbit_plot`) can visualize camera orientations along an orbit. .. _gui_options: Command line options for ``stereo_gui`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Listed below are the options specific to ``stereo_gui``. It will accept all other ``parallel_stereo`` options as well. --grid-cols Display images as tiles on a grid with this many columns. --window-size The width and height of the GUI window in pixels. -w, --single-window Show all images in the same window (with a dialog to choose among them) rather than next to each other. --preview Load and display the images one at a time, for speed. The 'n' and 'p' keys can be used to cycle through them. --view-several-side-by-side View several images side-by-side, with a dialog to choose which images to show (also accessible from the View menu). --use-georef Plot the images in the projected coordinate system given by the image georeferences. This is currently the default, and can be turned off with ``--no-georef`` or from the View menu. --nodata-value Pixels with values less than or equal to this number are treated as no-data and displayed as transparent. This overrides the no-data values from input images. --hillshade Interpret the input images as DEMs and hillshade them. --hillshade-azimuth The azimuth value when showing hillshaded images. --hillshade-elevation The elevation value when showing hillshaded images. --view-matches Locate and display the interest point matches for a stereo pair. See also ``--view-pairwise-matches``, ``--view-pairwise-clean-matches``. --match-file Display this match file instead of looking one up based on existing conventions (implies ``--view-matches``). --pairwise-matches 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. --pairwise-clean-matches Same as ``--pairwise-matches``, but use ``*-clean.match`` files. --nvm Load this .nvm file having interest point matches. See also ``--nvm-no-shift``. The ``rig_calibrator`` program (:numref:`rig_calibrator`) can create such files. This option implies ``--pairwise-matches``. --nvm-no-shift Assume that the image features in the input nvm file were saved without being shifted to be relative to the optical center of the camera. --isis-cnet Load a control network having interest point matches from this binary file in the ISIS jigsaw format. See also ``--nvm``. --gcp-file Display the GCP pixel coordinates for this GCP file (implies ``--view-matches``). Also save here GCP if created from the GUI. See also ``--gcp-sigma``. --gcp-sigma The sigma (uncertainty, in meters) to use for the GCPs (:numref:`bagcp`). A smaller sigma suggests a more accurate GCP. See also option ``--fix-gcp-xyz`` in ``bundle_adjust`` (:numref:`ba_options`). --dem-file Use this DEM when creating GCP from images. --hide-all Start with all images turned off (if all images are in the same window, useful with a large number of images). --zoom-proj-win Zoom to this proj win on startup (:numref:`image_bounds`). It is assumed that the images are georeferenced. Also accessible from the *View* menu. This implies ``--zoom-all-to-same-region``. --zoom-all-to-same-region Zoom all images to the same region. Also accessible from the *View* menu. --colorize Colorize all images and/or CSV files after this option until ``--no-colorize`` is encountered. Per-image flag with sticky semantics (:numref:`colorize`). --no-colorize Turn off colorization for subsequent images, until ``--colorize`` or ``--colorbar`` is encountered. --colorbar Colorize all images and/or CSV files after this option until ``--no-colorbar`` is encountered, and show a colorbar with axes (:numref:`colorize`). Implies ``--colorize``. Right-click in each image to adjust the range of intensities to colorize. --no-colorbar Turn off the colorbar for subsequent images, until ``--colorbar`` is encountered. Does not turn off colorization. --colormap-style Specify the colormap style. See :numref:`colormap` for options. Each style applies to all images after this option, until overridden by another instance of this option with a different value. --min Value corresponding to 'coldest' color in the color map, when using ``--colorize`` or ``--colorbar``, and plotting CSV data. Also used to manually set the minimum value in grayscale images. If not set, use the dataset minimum for color images, and estimate the minimum for grayscale images. --max Value corresponding to the 'hottest' color in the color map, when using ``--colorize`` or ``--colorbar``, and plotting CSV data. Also used to manually set the maximum value in grayscale images. If not set, use the dataset maximum for color images, and estimate the maximum for grayscale images. --plot-point-radius When plotting points from CSV files, let each point be drawn as a filled ball with this radius, in pixels. --csv-format 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`` (a Cartesian coordinate system with origin at planet center is assumed, with the units being in meters), ``5:lon 6:lat 7:radius_m`` (longitude and latitude are in degrees, the radius is measured in meters from planet center), ``3:lat 2:lon 1:height_above_datum``, ``1:easting 2:northing 3:height_above_datum`` (need to set ``--csv-srs``; the height above datum is in meters). Can also use radius_km for column_type, when it is again measured from planet center. --csv-datum The datum to use to to use when plotting a CSV file. Options: 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). --csv-srs The PROJ or WKT string to use when plotting a CSV file. If not specified, try to use the ``--datum`` option. --lowest-resolution-subimage-num-pixels 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 to avoid creating many small files. --font-size Set the font size. --no-georef Do not use the georeference information when displaying the data, even when it exists. Also controllable from the View menu. --delete-temporary-files-on-exit Delete any subsampled and other files created by the GUI when exiting. --create-image-pyramids-only Without starting the GUI, build multi-resolution pyramids for the inputs, to be able to load them fast later. If used with ``--hillshade``, also build the hillshaded images and their multi-resolution pyramids. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. Options: None, LZW, Deflate, Packbits. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/stereo_sweep.rst ================================================ .. _stereo_sweep: stereo_sweep ------------ This program runs :ref:`parallel_stereo` with different parameter combinations and portions of input images. .. _stereo_sweep_example: Example ~~~~~~~ :: stereo_sweep \ --param-sweep \ "--corr-kernel 7,7 9,9 --stereo-algorithm asp_sgm asp_mgm --subpixel-mode 1 9 --proj-win -180,3873,3287,180 -947,1418,3022,-2752" \ --param-sweep \ "--corr-kernel 19,19 21,21 --stereo-algorithm asp_bm --subpixel-mode 1 3" \ left_map_image.tif right_map_image.tif \ left_cam.xml right_cam.xml \ --dem dem.tif \ --point2dem-params \ "--tr 4.0 --orthoimage --errorimage" \ --output-dir stereo_out Note that the option ``--param-sweep`` is specified twice, with each resulting in a set of runs. For the first one, there are two possible values for the correlation kernel, two stereo algorithms, two subpixel modes, and two image regions (projection windows). This results in a total of 16 different runs of ``parallel_stereo``. For the second ``--param-sweep``, there are two kernel sizes, one stereo algorithm, and two subpixel modes, resulting in 4 runs on the full image extents. Parameters with multiple values (like ``--corr-kernel 7,7`` or ``--proj-win``) have commas as separator, with no spaces. This is necessary so ``--param-sweep`` can be parsed correctly. The commas are replaced with spaces when passing the arguments to ``parallel_stereo`` (:numref:`stereodefault`). The :ref:`point2dem` command will be run on each output of ``parallel_stereo``. Arguments to it can be passed via the ``--point2dem-params`` option. See :numref:`stereo_sweep_opts` for more details. Workflow ~~~~~~~~ This program generates a file named ``run_index.csv`` in the output directory that enumerates the run directories and corresponding parameter values. When the images are mapprojected already (:numref:`mapproj-example`), pass the mapprojection DEM to ``--dem``. This allows sweeping over different clips with ``--proj-win``. Otherwise, an individual clip can be passed in to ``parallel_stereo``, if desired, via ``--left-image-crop-win`` and ``--right-image-crop-win``. Any other options will be passed directly to ``parallel_stereo``. .. _stereo_sweep_opts: Command-line options ~~~~~~~~~~~~~~~~~~~~ --param-sweep Parameter sweep. Must be in quotes. Multiple such options can be specified. Each defines a different set of parameter combinations to test. See :numref:`stereo_sweep_example` for an example. --output-dir Output directory. --dem Input DEM for mapprojection. Required if using ``--proj-win`` in parameter sweeps. --point2dem-params Parameters to pass to point2dem. If ``--orthoimage`` (with no argument) is passed in, the needed ``L.tif`` will be passed to each created point2dem command. --dry-run Print commands without executing them. --help Display the help message and exit. ================================================ FILE: docs/tools/stereo_tile.rst ================================================ .. _stereo_tile: stereo_tile ----------- This is an auxiliary program invoked by :ref:`stereo_dist` to process a single tile or to mosaic a block of DEMs. It runs the stereo pipeline stages (preprocessing through DEM creation, :numref:`entrypoints`) on one tile, writing results to a tile subdirectory. It can also run :ref:`dem_mosaic` on one block of DEMs, as part of the final mosaic step in ``stereo_dist``. .. _stereo_tile_options: Command-line options ~~~~~~~~~~~~~~~~~~~~ --tile-index Index of the tile to process (0-based). Required for tile processing. -e, --entry-point Stereo pipeline entry point. Values: 0=pprc, 1=corr, 2=blend, 3=rfne, 4=fltr, 5=tri, 6=cleanup, 7=dem. --stop-point Stereo pipeline stop point (stop before this step). --dem Input DEM for mapprojection. Required for tile processing. --point2dem-options Options to pass to :ref:`point2dem`. Can pass ``--orthoimage`` with no argument, and the L.tif file for each tile will be autocompleted. Can also pass ``--errorimage``. -s, --stereo-file Explicitly specify the ``stereo.default`` file to use (:numref:`stereodefault`). This file is optional and need not exist. --corr-seed-mode Correlation seed strategy (:numref:`corr_section`). Default is 0. --sparse-disp-options Options to pass directly to sparse_disp (:numref:`sparse_disp`). --dem-mosaic-index Index of the mosaic block to process (0-based). Requires ``--dem-mosaic-master``. Invoked by ``stereo_dist`` for parallel DEM mosaicking. --dem-mosaic-master Master file enumerating for each block to mosaic the input DEM list file and output DEM path, one block per line. Used with ``--dem-mosaic-index``. --run-dir Directory in which the script is running. Set by ``stereo_dist``. --verbose Display the commands being executed. --dry-run Do not launch the jobs, only print the commands that should be run. -v, --version Display the version of the software. -h, --help Display this help message. ================================================ FILE: docs/tools/texrecon.rst ================================================ .. _texrecon: texrecon -------- The ``texrecon`` script takes as input several images, their camera poses, camera intrinsics for one or more sensors, a mesh, in .ply format, and creates a textured mesh as an .obj file. This tool is a wrapper around the third-party `MVS-Texturing `_ software. See also the ``voxblox_mesh`` program (:numref:`voxblox_mesh`) which can produce a mesh that is usable with this tool. Example ^^^^^^^ The dataset: https://github.com/NeoGeographyToolkit/StereoPipelineSolvedExamples/releases/tag/rig_calibrator has an example of how a set of camera images acquired with a rig were co-registered using the ``rig_calibrator`` program (:numref:`rig_calibrator`), and how a mesh was created. With that data and this tool, a textured mesh can be obtained as follows:: texrecon --rig_config rig_out/rig_config.txt \ --camera_poses rig_out/cameras.txt \ --mesh rig_out/fused_mesh.ply \ --rig_sensor sci_cam \ --undistorted_crop_win '1000 800' \ --out_dir texrecon_out The inputs to this program need not be created with ``rig_calibrator``. What is important is that the camera poses and the mesh be co-registered. Command-line options ^^^^^^^^^^^^^^^^^^^^ --rig_config Rig configuration file. --rig_sensor Which rig sensor images to texture. Can be more than one (bound by quotes then). Must be among the sensors specified via ``--rig_config``. --camera_poses Read images and camera poses from this list. --mesh The mesh to use for texturing, in .ply format. --subset Use only the subset of images from this list. --undistorted_crop_win The dimensions of the central image region to keep after undistorting an image and before using it in texturing. Normally 85% - 90% of distorted (actual) image dimensions would do. Suggested for Astrobee images: sci_cam: '1250 1000' nav_cam: '1100 776'. haz_cam: '250 200'. --max_texture_size The maximum size (in pixels) of each texture file created for the produced textured mesh. --out_dir The directory where to write the textured mesh and other data. --texture_alg 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; this is the default), or 'area' (for a surface patch choose the image whose camera view direction is most aligned with the surface normal). --skip_local_seam_leveling If set, skip a postprocessing algorithm which may remove some seams but which on occasion can cause a crash. ================================================ FILE: docs/tools/theia_sfm.rst ================================================ .. _theia_sfm: theia_sfm --------- The ``theia_sfm`` program is a wrapper around the `Theia `_ Structure-from-Motion (SfM) software. It assumes that the there are are several sensors with each acquiring images. The produced SfM solution can be passed on to ``rig_calibrator`` (:numref:`rig_calibrator`), but this program can be used without a rig. ASP offers another wrapper around Theia, namely ``camera_solve`` (:numref:`camera_solve`), whose aim is to work with ASP's ``bundle_adjust`` program (:numref:`bundle_adjust`). .. _theia_naming_conv: Naming convention ~~~~~~~~~~~~~~~~~ To distinguish which images are made with which sensor, either: - The image file name (without directory) should contain the sensor name. - The name of the immediate directory having the image should be the sensor name. - A list should be provided, in which each line has the image name, sensor name and image timestamp, separated by spaces. Examples:: my_images/image1_cam1.png my_images/cam1/image1.png where ``cam1`` is the name of the sensor that acquired this image. If a list is provided, each line should be of the form:: my_images/image1.png cam1 This list should be passed in via ``--image_sensor_list``. The timestamp is not used but is there for compatibility with ``rig_calibrator`` (:numref:`rig_data_conv`). All images names (without directory path) must be unique. Configuration ~~~~~~~~~~~~~ The configuration file contains the intrinsics for each sensor. Is the same as for ``rig_calibrator`` (:numref:`rig_config`). This program does not use the transforms between sensors, and there is no concept of reference sensor. See `TheiaSfM's supported camera model types `_. In the rig configuration those are named ``no_distortion``, ``radtan``, ``fisheye`` and ``fov``. .. _theia_sfm_config: Flags file ~~~~~~~~~~ This program will use the Theia flags file from ``share/theia_flags.txt`` in the software distribution, which can be copied to a new name, edited, and passed to ``theia_sfm`` via ``--theia_flags``. As an example, for tricky configurations, setting:: --feature_density=DENSE in the flags file can create a lot more interest points matches. Examples ~~~~~~~~ A step-by-step-example is in :numref:`rig_msl`. Usage ~~~~~ :: theia_sfm --rig-config [images] \ [--theia-flags ] --out-dir The input images can be specified as wildcards:: theia_sfm --rig-config rig_input/rig_config.txt \ --images 'rig_input/cam1/*.tif rig_input/cam2/*.tif' \ --out-dir rig_theia in a list:: ls rig_input/cam*/*.jpg > image_list.txt theia_sfm --rig-config rig_input/rig_config.txt \ --image-list image_list.txt \ --out-dir rig_theia on the command line:: theia_sfm --rig-config rig_input/rig_config.txt \ rig_input/cam1/image1.png rig_input/cam2/image2.png \ --out-dir rig_theia Use ``--image_sensor_list`` instead of ``--list`` if the sensor names are not part of image names (:numref:`theia_naming_conv`). Output files ~~~~~~~~~~~~ This tool produces an SfM solution with a name like ``out_dir/cameras.nvm``. The optical offsets per image are in ``out_dir/cameras_offsets.txt``. A reconstruction in binary format is saved to ``out_dir/reconstruction-0``. The nvm file can be passed in to ``bundle_adjust`` (:numref:`ba_nvm`) and ``rig_calibrator`` (:numref:`rig_calibrator`). Visualization ~~~~~~~~~~~~~ The created camera poses can be visualized as:: view_reconstruction --reconstruction out_dir/reconstruction-0 See this program's manual in :numref:`view_reconstruction`. The interest point matches in the .nvm file can be inspected with ``stereo_gui`` (:numref:`stereo_gui_nvm`). This will show the images in the random order produced by Theia. The ``rig_calibrator`` program (:numref:`rig_calibrator`), which can be used as the next step, will order these lexicographically. Manipulating SfM solutions ~~~~~~~~~~~~~~~~~~~~~~~~~~ Several produced solutions can be merged into a larger reconstruction with the ``sfm_merge`` (:numref:`sfm_merge`) program. Portions can be extracted with ``sfm_submap`` (:numref:`sfm_submap`). .. _theia_sfm_command_line: Command-line options for theia_sfm ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --rig-config Rig configuration file. --images Images, as individual wildcards. Example: ``'dir/cam1/*tif dir/cam2/*tif'``. --image-list Use the images from this list, instead of setting ``--images``. Images must be separated by a newline. --image-sensor-list An alternative way of listing the input images, when the sensor name is specified separately in the same file (:numref:`theia_naming_conv`). --theia-flags The flags to pass to Theia. By default, the file ``share/theia_flags.txt`` in the software distribution is used. The option ``--random_seed=1`` is passed to Theia by default, to ensure reproducible results. --out-dir The output directory. -h, --help Show this help message and exit. ================================================ FILE: docs/tools/undistort_image.rst ================================================ .. _undistort_image: undistort_image --------------- The ``undistort_image`` program takes as input an image and a pinhole model .tsai file describing the image. The tool will generate a copy of the input image with the lens distortion specified in the pinhole model file removed. It will also save the corresponding pinhole camera model file without the distortion. Usage:: undistort_image [options] -o See an example in :numref:`sfmgeneric`. Command-line options for undistort_image: -o, --output-file Specify the output file. --output-nodata-value Set the output nodata value. Only applicable if the output is a single-channel image with pixels that are float or double. --interpolation-method Interpolation method. --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools/view_reconstruction.rst ================================================ .. _view_reconstruction: view_reconstruction ------------------- This viewer is part of the Theia SfM suite of tools that ASP ships (:numref:`theia_sfm`). It can show a 3D point cloud and the camera poses. See ``sfm_view`` (:numref:`sfm_view`) for a program that can show orbital cameras (with no 3D points). Zoom in and out with the mouse wheel. Pan with the left mouse button. Rotate with the right mouse button. Example:: view_reconstruction --reconstruction theia/reconstruction-0 .. figure:: ../images/view_reconstruction.png :name: view_reconstruction_fig :alt: view_reconstruction_tag Illustration of ``view_reconstruction``. The camera poses are shown as red pyramids. The triangulated points are in gray. ================================================ FILE: docs/tools/voxblox_mesh.rst ================================================ .. _voxblox_mesh: voxblox_mesh ------------ The ``voxblox_mesh`` program takes as input several camera poses, for each such pose a point cloud in that camera's coordinates, and fuses them into a mesh. The input point clouds can be created either with stereo (such as with ``multi_stereo``, :numref:`multi_stereo`) or a depth sensor (see the example below). The produced mesh can be textured with ``texrecon`` (:numref:`texrecon`). A basic median filter can be applied to the input clouds before fusing them. This tool is a wrapper around `VoxBlox `_. Example ^^^^^^^ With that data and this tool, a fused mesh can be obtained as follows:: voxblox_mesh --index rig_out/voxblox/haz_cam/index.txt \ --output_mesh rig_out/fused_mesh.ply \ --min_ray_length 0.1 --max_ray_length 2.0 \ --voxel_size 0.005 Here, the output mesh is ``fused_mesh.ply``, points no further than 2 meters from each camera center are used, and the mesh is obtained after binning the points into voxels of 1 cm in size. The obtained mesh can be post-processed, by smoothing it, filling in holes, etc., using several CGAL tools shipped with ASP (:numref:`cgal_tools`). This `dataset `_ has an example of how a set of camera images and depth clouds acquired with a rig were co-registered using the ``rig_calibrator`` program (:numref:`rig_calibrator`). Format of the inputs ^^^^^^^^^^^^^^^^^^^^ The input index file to this program has two lines for each cloud. The first is a file having the camera-to-world transform for a point cloud, as a 4x4 matrix (rotation and translation), and the second one has the cloud itself, in binary ``.pcd`` format, in camera's coordinate system. Here is an example:: data_dir/1_cam2world.txt data_dir/1.pcd data_dir/2_cam2world.txt data_dir/2.pcd Each .pcd file is in the ``pcl::PointNormal`` format, with each data point having 6 entries, corresponding to cloud x, y, z, point intensity, reliability weight given to the point, and the value 0 (the latter is unused). Such clouds can be created with the ``pc_filter`` program from ASP's usual ``PC.tif`` point clouds (:numref:`pc_filter`). One has to make sure the cloud is transformed to camera coordinates. The command to create such a ``.pcd`` file is along the lines of:: pc_filter --transform-to-camera-coordinates \ --max-distance-from-camera 2.0 \ --max-camera-ray-to-surface-normal-angle 75 \ --input-cloud run/run-PC.tif \ --input-texture run/run-L.tif \ --camera left.tsai \ --output-cloud run/run.pcd Note how the camera file ``left.tsai`` which was used to create the PC.tif cloud is passed in as an argument. .. _voxblox_mesh_command_line: Command-line options for voxblox_mesh ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``--index`` (*string*) (default = "") A list having input camera transforms and point cloud files. ``--output_mesh`` (*string*) (default = "") The output mesh file name, in .ply format. ``--voxel_size`` (*double*) (default = 0.01) Voxel size, in meters. ``--min_ray_length`` (*double*) (default = -1.0) The minimum length of a ray from camera center to the points. Points closer than that will be ignored. ``--max_ray_length`` (*double*) (default = -1.0) The maximum length of a ray from camera center to the points. Points beyond that will be ignored. ``--enable_anti_grazing`` If true, enable anti-grazing. This is an advanced option. ``--integrator`` (*string*) (default = "") Specify how the points should be integrated. Options: "simple", "merged", "fast". See the VoxBlox documentation for details. ``--min_weight`` (*double*) (default = 1e-6) The minimum weighht for a point to be included in the mesh. ``--voxel_carving_enabled`` If true, the entire length of a ray is integrated. Otherwise only the region inside the truncation distance is used. This is an advanced option. ``--median_filter`` (*string*) (default = "") Filter out depth points that differ in any of the coordinates by more than a given threshold from the median of such coordinates in a square window of given size. Specify in quotes, as: 'window thresh'. The window is an odd integer and in units of pixel (given the image storage format of the cloud) and the threshold is measured in meters. This assumes that the input .pcd files have more than one row and column, rather than the data being stored in a single row. ``--distance_weight`` (*string*) (default = "") Give to an input depth point ``P`` the weight ``1/(1 + (norm(P)/d)^a)``. This makes points further from the sensor have less weight. Specify the input parameters as 'd a'. This multiplies any other per-point weight read from the point cloud (normally the input weight is 1 unless ``pc_filter`` (:numref:`pc_filter`) is used). See also ``--min_weight`` and ``--max_ray_length``. See also the `VoxBlox documentation `_. ================================================ FILE: docs/tools/wv_correct.rst ================================================ .. _wv_correct: wv_correct ---------- An image taken by one of Maxar (DigitalGlobe) World View satellite cameras is formed of several blocks as tall as the image, mosaicked from left to right, with each block coming from an individual CCD sensor :cite:`digital-globe:camera`. Either due to imperfections in the camera or in the subsequent processing, the image blocks are offset in respect to each other in both row and column directions by a subpixel amount. These so-called *CCD boundary artifacts* are not visible in the images but manifest themselves as discontinuities in the DEMs obtained with ASP. The tool named ``wv_correct`` is able to significantly attenuate these artifacts (see :numref:`ccd-artifact-example` in the Digital Globe tutorial for an example). This tool should be used on raw Digital Globe images before calling ``dg_mosaic`` and ``mapproject``. It is important to note that both the positions of the CCD offsets and the offset amounts were determined empirically without knowledge of Digital Globe's mosaicking process; this is why we are not able to remove these artifacts completely. For PAN images, the WV01 and WV02 datasets are supported, for most TDI for the forward and reverse scan directions. For WV03 PAN images, CCD artifacts are less noticeable than for WV01 and WV02, and they are not corrected at this time. For multispectral images, only a few select TDI are supported for band 3 of WV02 data. If a certain combination of spacecraft/TDI is not supported, the tool will print a warning and will write on output the uncorrected input image. The ASP source code repository has additional documentation and tools for how to tabulate the corrections for the cases not yet covered by this tool. Note for WV-2 images ^^^^^^^^^^^^^^^^^^^^ Maxar (DigitalGlobe) WorldView-2 images with a processing (generation) date (rather than acquisition date) of May 26, 2022 or newer have much-reduced CCD artifacts, and for those this tool will in fact make the solution worse, not better. ASP of version 3.3.0 or later (and any development build after 2023-06-21) will automatically detect this and will not apply the correction (a copy of the input image will be written on output). A warning will be printed in that case. This holds for both PAN and multi-spectral images. This scenario does not apply to WorldView-1, 3, or GeoEye-1. Usage ^^^^^ :: wv_correct [options] Examples ^^^^^^^^ Example for PAN images:: wv_correct pan.tif pan.xml pan_corr.tif Example for multispectral images (first extract the third band):: gdal_translate -co TILED=YES -co COMPRESS=LZW \ -co BIGTIFF=IF_SAFER -b 3 ms.tif ms_b3.tif wv_correct --band 3 ms_b3.tif ms.xml ms_b3_corr.tif Example if per-column corrections are available, for either PAN or multispectral images:: wv_correct --dx dx.txt --dy dy.txt image.tif image.xml image_corr.tif Command-line options for wv_correct ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --ot 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. --band For multi-spectral images, specify the band to correct. Required unless --dx and --dy are set. --dx 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. --dy As above, but for the y direction. --print-per-column-corrections Print on standard output the per-column corrections about to apply (for multispectral images). --threads Select the number of threads to use for each process. If 0, use the value in ~/.vwrc. --cache-size-mb Set the system cache size, in MB. --tile-size Image tile size used for multi-threaded processing. --no-bigtiff Tell GDAL to not create BigTiff files. --tif-compress TIFF compression method. -v, --version Display the version of software. -h, --help Display this help message. ================================================ FILE: docs/tools.rst ================================================ Tools ===== This chapter provides a overview of the various tools that are provided as part of the Ames Stereo Pipeline, and a summary of their command line options. .. toctree:: :glob: tools/* ================================================ FILE: docs/tutorial.rst ================================================ .. _tutorial: How ASP works ============= The Stereo Pipeline package contains command-line and GUI programs that convert a stereo pair consisting of images and cameras into a 3D "point cloud" image. This is an intermediate format that can be passed along to one of several programs that convert a point cloud into a mesh for 3D viewing, a gridded digital terrain model (DTM) for GIS purposes, or a LAS/LAZ point cloud. There are a number of ways to fine-tune parameters and analyze the results, but ultimately this software suite takes images and builds models in a mostly automatic way. To create a point cloud file, *not necessarily of best quality*, for now, one simply passes two image files to the ``parallel_stereo`` (:numref:`parallel_stereo`) command:: parallel_stereo --stereo-algorithm asp_bm \ --nodes-list nodes_list.txt \ left_image.cub right_image.cub results/run Higher quality results, at the expense of more computation, can be achieved by running:: parallel_stereo --alignment-method affineepipolar \ --stereo-algorithm asp_mgm --subpixel-mode 3 \ --nodes-list nodes_list.txt \ left_image.cub right_image.cub results/run The option ``--subpixel-mode 9`` is faster and still creates decent results (with ``asp_mgm``/``asp_sgm``). The best quality will likely be obtained with ``--subpixel-mode 2``, but this is even more computationally expensive. It is very recommended to read :numref:`nextsteps`, which describes other alignment methods and stereo algorithms. See :numref:`ps_options` for the ``--nodes-list`` option. Then normally one would create a DEM (:numref:`point2dem`):: point2dem --auto-proj-center results/run-PC.tif Here it is assumed that the ``PATH`` and ``ISISDATA`` environmental variables have been set, as shown in :numref:`installation`. The ``.cub`` file format is used for non-Earth images (:numref:`moc_tutorial`). For Earth, the images are usually in the ``.tif`` format (:numref:`dg_tutorial`). The above commands will decompose the images in tiles to run in parallel, potentially on multiple machines (:numref:`pbs_slurm`). Or the ``stereo_gui`` frontend can be invoked, with the same options, as described in :numref:`stereo_gui`. This tool makes it possible to manually select smaller clips on which to run ``parallel_stereo``. The string ``results/run`` is an arbitrary output prefix. All ``parallel_stereo`` output files will be in the ``results`` directory and start with ``output``. See :numref:`outputfiles` for the list of output files. A a visualizable mesh can be made with the following command (the ``results/run-PC.tif`` and ``results/run-L.tif`` files are created by the ``parallel_stereo`` program above):: point2mesh results/run-PC.tif results/run-L.tif Visualization is further discussed in :numref:`visualizing_results`. A produced DEM may need to be aligned to some pre-existing reference (:numref:`pc_align`). If the positions, orientations, or intrinsics of the cameras are not known well, then bundle adjustment may be necessary (:numref:`bundle_adjustment`). What follows are two examples of processing non-Earth data. An example using Earth data is in :numref:`dg_tutorial`. The various stereo algorithms are discussed in :numref:`nextsteps`. More examples can be found in :numref:`examples`. .. _nonearth_tutorial: Tutorial: Processing planetary data (non-Earth) =============================================== .. _lronac_csm: Lightning-fast example using Lunar images ----------------------------------------- This example is designed to have the user create useful results with ASP using Lunar data 10 minutes or less. It does not require a download of ISIS or ISIS data (which can be a couple of hundreds of GB) because it uses the CSM camera model (:numref:`csm`). The steps to process it are as follows: - Get ASP per the installation page (:numref:`installation`). - Fetch the `LRO NAC example `_ with ``wget``, and extract it as:: tar xfv LRONAC_example.tar - Start ``stereo_gui`` (:numref:`stereo_gui`) with a selection of clips:: cd LRONAC_example stereo_gui M181058717LE_crop.cub M181073012LE_crop.cub \ M181058717LE.json M181073012LE.json \ --alignment-method local_epipolar \ --left-image-crop-win 2259 1196 900 973 \ --right-image-crop-win 2432 1423 1173 1218 \ --stereo-algorithm asp_mgm --subpixel-mode 9 \ run/run The crop windows from above will show up as red rectangles. Choose from the menu ``Run -> Run parallel_stereo``. When finished, quit the GUI and run ``point2dem`` (:numref:`point2dem`) from the command line:: point2dem --auto-proj-center \ --errorimage run/run-PC.tif \ --orthoimage run/run-L.tif Open the computed DEM and orthoimage as:: stereo_gui run/run-DEM.tif run/run-DRG.tif Right-click on the DEM on the left and choose to toggle hillshading to show the DEM hillshaded. See the figure below for the output. How to get higher quality results is described in :numref:`nextsteps`. For other examples, see :numref:`examples`. .. figure:: images/lronac_csm_example.png :name: lronac_csm_example Example of produced DEM and orthoimage using LRO NAC stereo pair ``M181058717LE`` and ``M181073012LE`` and CSM cameras. How to obtain and prepare the inputs is discussed in :numref:`lronac-example`. Mapprojection can eliminate the staircasing artifacts (:numref:`mapproj-example`). .. _moc_tutorial: Example using Mars MOC images ----------------------------- The data set that is used in the tutorial and examples below is a pair of Mars Orbital Camera (MOC) :cite:`1992JGR.97.7699M,2001JGR.10623429M` images whose PDS Product IDs are M01/00115 and E02/01461. This data can be downloaded from the PDS directly, or they can be found in the ``examples/MOC`` directory of your Stereo Pipeline distribution. These raw PDS images (``M0100115.imq`` and ``E0201461.imq``) need to be converted to .cub files and radiometrically calibrated. You will need to be in an ISIS environment (:numref:`planetary_images`), usually via a ``conda activate`` command which sets the ``ISISROOT`` and ``ISISDATA`` environment variables; we will denote this state with the ``ISIS>`` prompt. Then you can use the ``mocproc`` program, as follows:: ISIS> mocproc from=M0100115.imq to=M0100115.cub Mapping=NO ISIS> mocproc from=E0201461.imq to=E0201461.cub Mapping=NO There are also ``Ingestion`` and ``Calibration`` parameters whose defaults are ``YES`` which will bring the image into the ISIS format and perform radiometric calibration. By setting the ``Mapping`` parameter to ``NO``, the resultant file will be an ISIS cube file that is calibrated, but not map-projected. Note that while we have not explicitly run ``spiceinit``, the Ingestion portion of ``mocproc`` quietly ran ``spiceinit`` for you (you'll find the record of it in the ISIS Session Log, usually written out to a file named ``print.prt``). :numref:`p19-images` shows the results at this stage of processing. .. _p19-images: .. figure:: images/p19-figure.png :alt: MOC images after initial processing. This figure shows ``E0201461.cub`` and ``M0100115.cub`` open in ISIS's qview program. The view on the left shows their full extents at the same zoom level, showing how they have different ground scales. The view on the right shows both images zoomed in on the same feature. See :numref:`examples` for many solved examples, including how to preprocess the data with tools specific for each mission. Once the ``.cub`` files are obtained, it is possible to run ``parallel_stereo`` right away, and create a DEM:: ISIS> parallel_stereo \ --alignment-method affineepipolar \ --nodes-list nodes_list.txt \ -s stereo.default.example \ E0201461.cub M0100115.cub \ results/output ISIS> point2dem --auto-proj-center \ results/output-PC.tif In this case, the first thing ``parallel_stereo`` does is to internally align (or rectify) the images, which helps with finding stereo matches. Here we have used ``affineepipolar`` alignment. Other alignment methods are described in :numref:`settingoptionsinstereodefault`. If your data has steep slopes, mapprojection can improve the results. See :numref:`mapproj-example` and :numref:`mapproj_with_cam2map`. See :numref:`pbs_slurm` for running on multiple machines and :numref:`ps_options` for the ``--nodes-list`` option. When creating a DEM, it is suggested to use a local projection (:numref:`point2dem_proj`). See :numref:`nextsteps` for a more in-depth discussion of stereo algorithms. .. figure:: images/p19-colorized-shaded_500px.png The produced colorized DEM, the shaded relief image, and the colorized hillshade. See :numref:`builddem` for more details. .. _dg_tutorial: Tutorial: Processing Earth images ================================= In this chapter we will focus on how to process Earth images, or more specifically DigitalGlobe (Maxar) WorldView and QuickBird images. This example is different from the one in the previous chapter in that at no point will we be using ISIS utilities. This is because ISIS only supports NASA instruments, while most Earth images comes from commercial providers. In addition to DigitalGlobe/Maxar's satellites, ASP supports any Earth images that uses the RPC camera model format. How to process such data is described in :numref:`rpc`, although following this tutorial may still be insightful even if your data is not from DigitalGlobe/Maxar. If this is your first time running ASP, it may be easier to start with ASTER data (:numref:`aster`), as its images are free and much smaller than DigitalGlobe's. A ready-made example having all inputs, outputs, and commands, is provided there. DigitalGlobe provides images from QuickBird and the three WorldView satellites. These are the hardest images to process with Ames Stereo Pipeline because they are exceedingly large, much larger than HiRISE images. The GUI (:numref:`stereo_gui`) can be used to run stereo on just a portion of the images. The camera information for DigitalGlobe/Maxar images is contained in an XML file for each image. In addition to the exact linear camera model, the XML file also has its RPC approximation. In this chapter we will focus only on processing data using the linear camera model. For more detail on RPC camera models we refer as before to :numref:`rpc`. Our implementation of the Digital Globe linear camera model accounts for the sensor geometry, velocity aberration and atmospheric refraction (:numref:`dg_csm`). In the next two sections we will show how to process unmodified and map-projected variants of WorldView images. These images represent a non-ideal problem for us since this is an urban location, but at least you should be able to download these images yourself and follow along. Supported products ------------------ ASP can only process DigitalGlobe / Maxar Level 1B satellite images, and there is experimental support for View-Ready OR2A images (see :numref:`mapproj_ortho`). ASP cannot handle images that are orthorectified onto a DEM. See the `list of products `_. .. _rawdg: Processing raw -------------- After you have downloaded the example stereo images of Stockholm, you will find a directory titled:: 056082198020_01_P001_PAN It has a lot of files and many of them contain redundant information just displayed in different formats. We are interested only in the TIF or NTF images and the similarly named XML files. Some WorldView folders will contain multiple image files. This is because DigitalGlobe/Maxar breaks down a single observation into multiple files for what we assume are size reasons. These files have a pattern string of "_R[N]C1-", where N increments for every subframe of the full observation. The tool named ``dg_mosaic`` (:numref:`dg_mosaic`) can be used to mosaic such a set of sub-observations into a single image file and create an appropriate camera file:: dg_mosaic 12FEB16101327*TIF --output-prefix 12FEB16101327 and analogously for the second set. See :numref:`dg_mosaic` for more details. The ``parallel_stereo`` program can use either the original or the mosaicked images. This sample data only contains two image files so we do not need to use ``dg_mosaic``. Since we are ingesting these images raw, it is strongly recommended that you use affine epipolar alignment to reduce the search range. Commands:: parallel_stereo -t dg --stereo-algorithm asp_mgm \ --subpixel-mode 9 --alignment-method affineepipolar \ --nodes-list nodes_list.txt \ 12FEB16101327.r50.tif 12FEB16101426.r50.tif \ 12FEB16101327.r50.xml 12FEB16101426.r50.xml \ run/run point2dem --auto-proj-center run-PC.tif As discussed in :numref:`tutorial`, one can experiment with various tradeoffs of quality versus run time by using various stereo algorithms, and use stereo in parallel or from a GUI. For more details, see :numref:`nextsteps`. How to create a DEM and visualize the results of stereo is described in :numref:`manipulating_results`. Choosing a projection is discussed in :numref:`point2dem_proj`. See :numref:`pbs_slurm` for running on multiple machines and :numref:`ps_options` for the ``--nodes-list`` option. .. figure:: images/examples/dg/wv_tutorial.png :name: fig:dg-example A colorized and hillshaded terrain model for Grand Mesa, Colorado, produced with WorldView images, while employing mapprojection (:numref:`mapproj-example`). It is important to note that we could have performed stereo using the approximate RPC model instead of the exact linear camera model (both models are in the same XML file), by switching the session in the ``parallel_stereo`` command above from ``-t dg`` to ``-t rpc``. The RPC model is somewhat less accurate, so the results will not be the same, in our experiments we've seen differences in the 3D terrains using the two approaches of 5 meters or more. Many more stereo processing examples can be found in :numref:`examples`. .. _mapproj: Processing map-projected images -------------------------------- ASP computes the highest quality 3D terrain if used with images map-projected onto a low-resolution DEM that is used as an initial guess. This process is described in :numref:`mapproj-example`. .. _handling_clouds: Dealing with clouds ------------------- Clouds can result in unreasonably large disparity search ranges and a long run-time. It is then suggested to mapproject the images (:numref:`mapproj-example`). With our without mapprojection, one can reduce the computed search range via ``--max-disp-spread`` (:numref:`stereodefault`). Use this with care. Without mapprojection and with steep terrain, the true spread of the disparity can, in rare cases, reach a few thousand pixels. This is best used with mapprojected images, when it is likely to be under 150-200, or even under 100. If a reasonable DEM of the area of interest exists, the option ``--ip-filter-using-dem`` can be used to filter out interest points whose heights differ by more than a given value than what is provided by that DEM. This should reduce the search range. Without a DEM, the option ``--elevation-limit`` can be used and should have a similar effect. Another option (which can be used in conjunction with the earlier suggestions) is to tighten the outlier filtering in the low-resolution disparity ``D_sub.tif`` (:numref:`outputfiles`), for example, by setting ``--outlier-removal-params 70 2`` from the default ``95 3`` (:numref:`stereodefault`). Note that decreasing these a lot may also filter out valid steep terrain. If a run failed because of a large disparity search range, ``D_sub.tif`` should be deleted, parameters adjusted as above, and one should run ``stereo_corr`` with the same arguments that ``parallel_stereo`` was run before (except those used for tiling and number of processes, etc.), while adding the option ``--compute-low-res-disparity-only``. Then examine the re-created ``D_sub.tif`` with ``disparitydebug`` (:numref:`disparitydebug`) and the various search ranges printed on screen. The ``D_sub.tif`` file can be created from a DEM (:numref:`d_sub_dem`). When ``D_sub.tif`` is found to be reasonable, ``parallel_stereo`` should be re-run with the option ``--resume-at-corr``. See also :numref:`longrun` which offers further suggestions for how to deal with long run-times. .. _wvcorrect-example: Handling CCD boundary artifacts ------------------------------- DigitalGlobe/Maxar WorldView images :cite:`digital-globe:camera` may exhibit slight subpixel artifacts which manifest themselves as discontinuities in the 3D terrain obtained using ASP. We provide a tool named ``wv_correct``, that can largely correct such artifacts for World View-1 and WorldView-2 images for most TDI. Note that Maxar (DigitalGlobe) WorldView-2 images with a processing date (not acquisition date) of May 26, 2022 or newer have much-reduced CCD artifacts, and for those this tool will in fact make the solution worse, not better. This does not apply to WorldView-1, 3, or GeoEye-1. This tool can be invoked as follows:: wv_correct image_in.ntf image.xml image_out.tif The corrected images can be used just as the originals, and the camera models do not change. When working with such images, we recommend that CCD artifact correction happen first, on original un-projected images. Afterward images can be mosaicked with ``dg_mosaic``, map-projected, and the resulting data used to run stereo and create terrain models. This tool is described in :numref:`wv_correct`, and an example of using it is in :numref:`ccd-artifact-example`. .. figure:: images/examples/ccd_before_after.png :name: ccd-artifact-example Example of a hill-shaded terrain obtained using stereo without (left) and with (right) CCD boundary artifact corrections applied using ``wv_correct``. Images lacking large-scale features ----------------------------------- See :numref:`d_sub_dem` and :numref:`sparse_disp` for suggestions on how to deal with images that lack large-scale features, such as when the images have a lot of snow. Jitter ------ Another source of artifacts in linescan cameras, such as from DigitalGlobe, is jitter. ASP can solve for it using a jitter solver (:numref:`jitter_solve`). Multi-spectral images --------------------- In addition to panchromatic (grayscale) images, the DigitalGlobe/Maxar satellites also produce lower-resolution multi-spectral (multi-band) images. Stereo Pipeline is designed to process single-band images only. If invoked on multi-spectral data, it will quietly process the first band and ignore the rest. To use one of the other bands it can be singled out by invoking ``dg_mosaic`` (:numref:`rawdg`) with the ``--band `` option. We have evaluated ASP with DigitalGlobe/Maxar's multi-spectral images, but support for it is still experimental. We recommend using the panchromatic images whenever possible. .. _dg_csm: Implementation details ---------------------- WorldView linescan cameras use the CSM model (:numref:`csm`) internally. The session name must still be ``-t dg``, ``-t dgmaprpc``, etc., rather than ``-t csm``, ``-t csmmapcsm``, etc. Bundle adjustment (:numref:`bundle_adjust`) and solving for jitter (:numref:`jitter_solve`) produce optimized camera models in CSM's model state format (:numref:`csm_state`). These can be used just as the original cameras, but with the option ``-t csm``. Alternatively, the ``bundle_adjust`` .adjust files can be used with the original cameras. Atmospheric refraction and velocity aberration (:cite:`nugent1966velocity`) are corrected for. These make the linescan models be very close to the associated RPC models. These corrections are incorporated by slightly modifying the linescan rotation samples as part of the CSM model upon loading. Bundle adjustment (:numref:`bundle_adjust`) and alignment (:numref:`pc_align`) are still recommended even given these corrections. WorldView images and cameras can be combined with those from other linescan instruments, such as Pleiades (:numref:`pleiades`), and also with frame camera models (:numref:`pinholemodels`), for the purposes of refining the cameras and creating terrain models (:numref:`ba_frame_linescan`). ================================================ FILE: docs/zzreferences.rst ================================================ .. only:: html References ========== .. bibliography:: bibliography.bib :style: alpha ================================================ FILE: examples/CTX/Makefile ================================================ # This is makefile to run the demo for MRO CTX of North Terra Meridiani all: nonmap/nonmap-DEM_CMAP.tif map/map-DEM_CMAP.tif P02_001981_1823_XI_02N356W.IMG: wget -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' P03_002258_1817_XI_01N356W.IMG: wget -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' %.cal.cub: %.IMG mroctx2isis from= $< to= $<.temp.cub spiceinit from= $<.temp.cub ctxcal from= $<.temp.cub to= $<.temp2.cub crop from=$<.temp2.cub to=$@ line=10000 nlines=3000 rm $<.temp.cub rm $<.temp2.cub nonmapprojected: P02_001981_1823_XI_02N356W.cal.cub P03_002258_1817_XI_01N356W.cal.cub mapprojected: nonmapprojected if [ ! -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 map/map-PC.tif: mapprojected if [ ! -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 map/map-DEM.tif: map/map-PC.tif cd map; \ point2dem -r mars --nodata -32767 map-PC.tif --error --orthoimage map-L.tif map/map-DEM_CMAP.tif: map/map-DEM.tif cd map; \ hillshade map-DEM.tif; \ colormap -s map-DEM_HILLSHADE.tif map-DEM.tif; \ colormap map-IntersectionErr.tif --colormap-style ../../TriangulationError.lut nonmap/nonmap-PC.tif: nonmapprojected if [ ! -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 nonmap/nonmap-DEM.tif: nonmap/nonmap-PC.tif cd nonmap; \ point2dem -r mars --nodata -32767 nonmap-PC.tif --errorimage nonmap/nonmap-DEM_CMAP.tif: nonmap/nonmap-DEM.tif cd nonmap; \ hillshade nonmap-DEM.tif; \ colormap -s nonmap-DEM_HILLSHADE.tif nonmap-DEM.tif; \ colormap nonmap-IntersectionErr.tif clean: rm -rf nonmap map *.vwip distclean: clean rm -rf *.cub *~ *.match ================================================ FILE: examples/CTX/stereo.nonmap ================================================ # -*- mode: sh -*- # Pre-Processing / stereo_pprc ################################################################ # Pre-alignment options # # Available choices are (however not all are supported by all sessions): # NONE (Recommended for anything map projected) # EPIPOLAR (Recommended for Pinhole Sessions) # HOMOGRAPHY (Recommended for ISIS wide-angle shots) # AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions) alignment-method affineepipolar # Intensity Normalization force-use-entire-range # Use entire input range # Select a preprocessing filter: # # 0 - None # 1 - Subtracted Mean # 2 - Laplacian of Gaussian (recommended) prefilter-mode 2 # Kernel size (1-sigma) for pre-processing # # Recommend 1.4 px for Laplacian of Gaussian # Recommend 25 px for Subtracted Mean prefilter-kernel-width 1.4 # Integer Correlation / stereo_corr ################################################################ # Select a cost function to use for initialization: # # 0 - absolute difference (fast) # 1 - squared difference (faster .. but usually bad) # 2 - normalized cross correlation (recommended) cost-mode 0 # Initialization step: correlation kernel size corr-kernel 25 25 # Initialization step: correlation search range # # Uncomment the following to use explicit search ranges. Otherwise, a # value will be choosen for you. # corr-search -100 -100 100 100 # Subpixel Refinement / stereo_rfne ################################################################ # Subpixel step: subpixel modes # # 0 - disable subpixel correlation (fastest) # 1 - parabola fitting (draft mode - not as accurate) # 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate) subpixel-mode 1 # Subpixel step: correlation kernel size subpixel-kernel 25 25 # Post Filtering / stereo_fltr ################################################################ # Automatic "erode" low confidence pixels rm-half-kernel 3 3 rm-min-matches 60 rm-threshold 3 rm-cleanup-passes 1 # Triangulation / stereo_tri ################################################################ # Size max of the universe in meters and altitude off the ground. # Setting both values to zero turns this post-processing step off. near-universe-radius 0.0 far-universe-radius 0.0 ================================================ FILE: examples/HiRISE/Makefile ================================================ # This Makefile is just a demo to verify hirise processing works. all: nonmap/nonmap-DEM_CMAP.tif %.IMG: chmod a+x ./downloader.sh && ./downloader.sh $@ # Commands to process the full image, these take a long time! #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 # hiedr2mosaic.py $^ #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 # hiedr2mosaic.py $^ # Abbreviated processing commands 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 hiedr2mosaic.py $^ 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 hiedr2mosaic.py $^ PSP_005201_1640_RED.mos_hijitreged.norm.crop.cub: PSP_005201_1640_RED.mos_hijitreged.norm.cub crop from=$^ to=$@ line=27000 nlines=3000 PSP_005913_1640_RED.mos_hijitreged.norm.crop.cub: PSP_005913_1640_RED.mos_hijitreged.norm.cub crop from=$^ to=$@ line=33000 nlines=3000 nonmap/nonmap-PC.tif: PSP_005913_1640_RED.mos_hijitreged.norm.crop.cub PSP_005201_1640_RED.mos_hijitreged.norm.crop.cub stereo $^ nonmap/nonmap -s stereo.nonmap nonmap/nonmap-DEM.tif: nonmap/nonmap-PC.tif cd nonmap; \ point2dem -r mars --nodata -32767 nonmap-PC.tif --errorimage nonmap/nonmap-DEM_CMAP.tif: nonmap/nonmap-DEM.tif cd nonmap; \ hillshade nonmap-DEM.tif; \ colormap -s nonmap-DEM_HILLSHADE.tif nonmap-DEM.tif; \ colormap nonmap-IntersectionErr.tif clean: rm -rf nonmap map *.vwip distclean: rm -rf *cub *~ *.match ================================================ FILE: examples/HiRISE/downloader.sh ================================================ #!/bin/bash # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ phase_prefix=${1:0:3} orbit_prefix=${1:4:4} obsv_prefix=${1:0:15} wget -O $1 http://hirise-pds.lpl.arizona.edu/PDS/EDR/${phase_prefix}/ORB_${orbit_prefix}00_${orbit_prefix}99/$obsv_prefix/$1 ================================================ FILE: examples/HiRISE/stereo.nonmap ================================================ # -*- mode: sh -*- # Pre-Processing / stereo_pprc ################################################################ # Pre-alignment options # # Available choices are (however not all are supported by all sessions): # NONE (Recommended for anything map projected) # EPIPOLAR (Recommended for Pinhole Sessions) # HOMOGRAPHY (Recommended for ISIS wide-angle shots) # AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions) alignment-method affineepipolar # Intensity Normalization force-use-entire-range # Use entire input range # Select a preprocessing filter: # # 0 - None # 1 - Subtracted Mean # 2 - Laplacian of Gaussian (recommended) prefilter-mode 2 # Kernel size (1-sigma) for pre-processing # # Recommend 1.4 px for Laplacian of Gaussian # Recommend 25 px for Subtracted Mean prefilter-kernel-width 1.4 # Integer Correlation / stereo_corr ################################################################ # Select a cost function to use for initialization: # # 0 - absolute difference (fast) # 1 - squared difference (faster .. but usually bad) # 2 - normalized cross correlation (recommended) cost-mode 0 # Initialization step: correlation kernel size corr-kernel 25 25 # Initialization step: correlation window size corr-search -80 -2 20 2 # Subpixel Refinement / stereo_rfne ################################################################ # Subpixel step: subpixel modes # # 0 - disable subpixel correlation (fastest) # 1 - parabola fitting (draft mode - not as accurate) # 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate) subpixel-mode 1 # Subpixel step: correlation kernel size subpixel-kernel 25 25 # Post Filtering / stereo_fltr ################################################################ # Fill in holes up to 100,000 pixels in size with an inpainting method # disable-fill-holes # Automatic "erode" low confidence pixels rm-half-kernel 5 5 rm-min-matches 60 rm-threshold 3 rm-cleanup-passes 1 # Triangulation / stereo_tri ################################################################ # Size max of the universe in meters and altitude off the ground. # Setting both values to zero turns this post-processing step off. near-universe-radius 0.0 far-universe-radius 0.0 ================================================ FILE: examples/K10/Makefile ================================================ # This Makefile performs an example of processing user provided # images. These images are from IRG's K10 Black robot from a testing # session behind the 80x120. RESULTSDIR = results OUT = k10black PREFIX = $(RESULTSDIR)/$(OUT) all: $(PREFIX)-F-H.tif $(PREFIX).ive $(PREFIX)-PC.tif: mkdir -p $(RESULTSDIR) stereo left4.png right4.png black_left.tsai black_right.tsai $(PREFIX) $(PREFIX)-F-H.tif: $(PREFIX)-PC.tif cd $(RESULTSDIR); disparitydebug $(OUT)-F.tif $(PREFIX).ive: $(PREFIX)-PC.tif cd $(RESULTSDIR); point2mesh -s 2 $(OUT)-PC.tif $(OUT)-L.tif clean: rm -rf $(RESULTSDIR) distclean: clean ================================================ FILE: examples/K10/black_left.tsai ================================================ fu = 620.857971191406 fv = 622.298034667969 cu = 526.128784179688 cv = 374.273742675781 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0.0751 -0.065 -0.902 R = 0.000794376506820371 -0.371711462117335 0.928347972420126 0.997550683961614 -0.0646367856775087 -0.0267342264708707 0.0699428473375328 0.92609539188351 0.370749677327501 k1 = -0.331998556852341 k2 = 0.125557452440262 p1 = -0.000432605884270742 p2 = 0.00110327918082476 ================================================ FILE: examples/K10/black_right.tsai ================================================ fu = 623.726867675781 fv = 624.9072265625 cu = 517.064636230469 cv = 355.597991943359 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0.0729035330367489 0.0398897116894373 -0.888699091018144 R = -0.0372906265115714 -0.363782183647855 0.930737305599584 0.997432655705587 -0.0705296800729344 0.012396030046322 0.0611351495170682 0.928810038215139 0.365478325491838 k1 = -0.33689147233963 k2 = 0.138674452900887 p1 = 0.000823005684651434 p2 = 0.00124822638463229 ================================================ FILE: examples/K10/stereo.default ================================================ # -*- mode: sh -*- # Pre-Processing / stereo_pprc ################################################################ # Pre-alignment options # # Available choices are (however not all are supported by all sessions): # NONE (Recommended for anything map projected) # EPIPOLAR (Recommended for Pinhole Sessions) # HOMOGRAPHY (Recommended for ISIS wide-angle shots) # AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions) alignment-method epipolar # Intensity Normalization force-use-entire-range # Use entire input range # Select a preprocessing filter: # # 0 - None # 1 - Subtracted Mean # 2 - Laplacian of Gaussian (recommended) prefilter-mode 2 # Kernel size (1-sigma) for pre-processing # # Recommend 1.4 px for Laplacian of Gaussian # Recommend 25 px for Subtracted Mean prefilter-kernel-width 1.4 # Integer Correlation / stereo_corr ################################################################ # Select a cost function to use for initialization: # # 0 - absolute difference (fast) # 1 - squared difference (faster .. but usually bad) # 2 - normalized cross correlation (recommended) cost-mode 1 # Initialization step: correlation kernel size corr-kernel 19 23 # Initialization step: correlation window size corr-search -80 -2 20 2 # Subpixel Refinement / stereo_rfne ################################################################ # Subpixel step: subpixel modes # # 0 - disable subpixel correlation (fastest) # 1 - parabola fitting (draft mode - not as accurate) # 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate) subpixel-mode 1 # Subpixel step: correlation kernel size subpixel-kernel 25 25 # Post Filtering / stereo_fltr ################################################################ # Fill in holes up to 100,000 pixels in size with an inpainting method disable-fill-holes # Automatic "erode" low confidence pixels rm-half-kernel 5 5 rm-min-matches 60 rm-threshold 3 rm-cleanup-passes 1 # Triangulation / stereo_tri ################################################################ # Size max of the universe in meters and altitude off the ground. # Setting both values to zero turns this post-processing step off. near-universe-radius 0.0 far-universe-radius 0.0 ================================================ FILE: examples/MER/Makefile ================================================ # This Makefile is just a demo of what is possible with MER. # Stereo from the Microscopic imager doesn't work unforunately because # the CAHVOR is not modelling the variable focal length they're using. # User interfaces ############################################### all: stereo mesh # These are the full commands that test more sensors #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 #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 # These commands skip a few instruments to speed up the test stereo: pan01/pan01-PC.tif nav01/nav01-PC.tif mi01/mi01-PC.tif fh01/fh01-PC.tif rh01/rh01-PC.tif mesh: pan01/pan01.ive nav01/nav01.ive mi01/mi01.ive fh01/fh01.ive rh01/rh01.ive # Actual processing ############################################### %.cahvor: %.img mer2camera $< %.cahv: %.img mer2camera $< %.cahvore: %.img mer2camera $< pan01/pan01-PC.tif: 1p270664103esf90csp2566l2m1.img 1p270664103esf90csp2566r2m1.img 1p270664103esf90csp2566l2m1.cahvor 1p270664103esf90csp2566r2m1.cahvor stereo $^ pan01/pan01 nav01/nav01-PC.tif: 1n270487304eff90cip1952l0m1.img 1n270487304eff90cip1952r0m1.img 1n270487304eff90cip1952l0m1.cahvor 1n270487304eff90cip1952r0m1.cahvor stereo $^ nav01/nav01 mi01/mi01-PC.tif: 2m147677487eff8800p2976m2m1.img 2m147677547eff8800p2976m2m1.img 2m147677487eff8800p2976m2m1.cahvor 2m147677547eff8800p2976m2m1.cahvor stereo $^ mi01/mi01 fh01lin/fh01lin-PC.tif: 2f194370083fflap00p1214r0m1.img 2f194370083fflap00p1214l0m1.img 2f194370083fflap00p1214r0m1.cahv 2f194370083fflap00p1214l0m1.cahv stereo $^ fh01lin/fh01lin fh01/fh01-PC.tif: 2f194370083effap00p1214l0m1.img 2f194370083effap00p1214r0m1.img 2f194370083effap00p1214l0m1.cahvore 2f194370083effap00p1214r0m1.cahvore stereo $^ fh01/fh01 fh02/fh02-PC.tif: 2f191703508effanhep1110l0m1.img 2f191703508effanhep1110r0m1.img 2f191703508effanhep1110l0m1.cahvore 2f191703508effanhep1110r0m1.cahvore stereo $^ fh02/fh02 rh01/rh01-PC.tif: 2r195521583effaq00p1301l0m1.img 2r195521583effaq00p1301r0m1.img 2r195521583effaq00p1301l0m1.cahvore 2r195521583effaq00p1301r0m1.cahvore stereo $^ rh01/rh01 pan02/pan02-PC.tif: 1p227709787eff80k7p2389l2c1.img 1p227709787eff80k7p2389r2c1.img 1p227709787eff80k7p2389l2c1.cahvor 1p227709787eff80k7p2389r2c1.cahvor stereo $^ pan02/pan02 pan01/pan01.ive: pan01/pan01-PC.tif point2mesh -s 1 -l $^ pan01/pan01-L.tif nav01/nav01.ive: nav01/nav01-PC.tif point2mesh -s 1 -l $^ nav01/nav01-L.tif mi01/mi01.ive: mi01/mi01-PC.tif point2mesh -s 1 -l $^ mi01/mi01-L.tif fh01lin/fh01lin.ive: fh01lin/fh01lin-PC.tif point2mesh -s 1 -l $^ fh01lin/fh01lin-L.tif fh01/fh01.ive: fh01/fh01-PC.tif point2mesh -s 1 -l $^ fh01/fh01-L.tif fh02/fh02.ive: fh02/fh02-PC.tif point2mesh -s 1 -l $^ fh02/fh02-L.tif rh01/rh01.ive: rh01/rh01-PC.tif point2mesh -s 1 -l $^ rh01/rh01-L.tif pan02/pan02.ive: pan02/pan02-PC.tif point2mesh -s 1 -l $^ pan02/pan02-L.tif # Downloading data ############################################## # PAN01 1p270664103esf90csp2566l2m1.img: wget -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' 1p270664103esf90csp2566r2m1.img: wget -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' # NAV01 1n270487304eff90cip1952l0m1.img: wget -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' 1n270487304eff90cip1952r0m1.img: wget -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' # FH01 2f194370083effap00p1214l0m1.img: wget -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' 2f194370083effap00p1214r0m1.img: wget -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' # FH01 (linearized) 2f194370083fflap00p1214r0m1.img: wget -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' 2f194370083fflap00p1214l0m1.img: wget -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' # RH01 2r195521583effaq00p1301l0m1.img: wget -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' 2r195521583effaq00p1301r0m1.img: wget -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' # FH02 2f191703508effanhep1110l0m1.img: wget -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' 2f191703508effanhep1110r0m1.img: wget -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' # MI01 2m147677487eff8800p2976m2m1.img: wget -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' 2m147677547eff8800p2976m2m1.img: wget -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' # PAN02 1p227709787eff80k7p2389l2c1.img: wget -O $@ 'http://pds-geosciences.wustl.edu/mer/mer1-m-pancam-2-edr-sci-v1/mer1pc_0xxx/data/sol1121/1p227709787eff80k7p2389l2c1.img' 1p227709787eff80k7p2389r2c1.img: wget -O $@ 'http://pds-geosciences.wustl.edu/mer/mer1-m-pancam-2-edr-sci-v1/mer1pc_0xxx/data/sol1121/1p227709787eff80k7p2389r2c1.img' # Clean up functions ############################################## clean: rm -rf *.cahv *.cahvor *.cahvore nav01 pan01 mi01 fh01lin fh01 rh01 fh02 pan02 distclean: clean rm *.img *.IMG *~ ================================================ FILE: examples/MER/stereo.default ================================================ # -*- mode: sh -*- # Pre-Processing / stereo_pprc ################################################################ # Pre-alignment options # # Available choices are (however not all are supported by all sessions): # NONE (Recommended for anything map projected) # EPIPOLAR (Recommended for Pinhole Sessions) # HOMOGRAPHY (Recommended for ISIS wide-angle shots) # AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions) alignment-method epipolar # Intensity Normalization force-use-entire-range # Use entire input range # Select a preprocessing filter: # # 0 - None # 1 - Subtracted Mean # 2 - Laplacian of Gaussian (recommended) prefilter-mode 2 # Kernel size (1-sigma) for pre-processing # # Recommend 1.4 px for Laplacian of Gaussian # Recommend 25 px for Subtracted Mean prefilter-kernel-width 1.4 # Integer Correlation / stereo_corr ################################################################ # Select a cost function to use for initialization: # # 0 - absolute difference (fast) # 1 - squared difference (faster .. but usually bad) # 2 - normalized cross correlation (recommended) cost-mode 0 # Initialization step: correlation kernel size corr-kernel 23 23 # Initialization step: correlation window size #corr-search -100 -100 100 100 # Subpixel Refinement / stereo_rfne ################################################################ # Subpixel step: subpixel modes # # 0 - disable subpixel correlation (fastest) # 1 - parabola fitting (draft mode - not as accurate) # 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate) subpixel-mode 1 # Subpixel step: correlation kernel size subpixel-kernel 25 25 # Post Filtering / stereo_fltr ################################################################ # Fill in holes up to 100,000 pixels in size with an inpainting method disable-fill-holes # Automatic "erode" low confidence pixels rm-half-kernel 3 3 rm-min-matches 60 rm-threshold 3 rm-cleanup-passes 1 # Triangulation / stereo_tri ################################################################ # Size max of the universe in meters and altitude off the ground. # Setting both values to zero turns this post-processing step off. universe-center camera near-universe-radius 0.7 far-universe-radius 80.0 ================================================ FILE: examples/MER/stereo.default.navcam ================================================ # -*- mode: sh -*- # Pre-Processing / stereo_pprc ################################################################ # Pre-alignment options # # Available choices are (however not all are supported by all sessions): # NONE (Recommended for anything map projected) # EPIPOLAR (Recommended for Pinhole Sessions) # HOMOGRAPHY (Recommended for ISIS wide-angle shots) # AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions) alignment-method epipolar # Intensity Normalization force-use-entire-range # Use entire input range # Select a preprocessing filter: # # 0 - None # 1 - Subtracted Mean # 2 - Laplacian of Gaussian (recommended) prefilter-mode 2 # Kernel size (1-sigma) for pre-processing # # Recommend 1.4 px for Laplacian of Gaussian # Recommend 25 px for Subtracted Mean prefilter-kernel-width 1.4 # Integer Correlation / stereo_corr ################################################################ # Select a cost function to use for initialization: # # 0 - absolute difference (fast) # 1 - squared difference (faster .. but usually bad) # 2 - normalized cross correlation (recommended) cost-mode 1 # Initialization step: correlation kernel size corr-kernel 19 23 # Initialization step: correlation window size corr-search -137 -21 -1 1 # Subpixel Refinement / stereo_rfne ################################################################ # Subpixel step: subpixel modes # # 0 - disable subpixel correlation (fastest) # 1 - parabola fitting (draft mode - not as accurate) # 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate) subpixel-mode 1 # Subpixel step: correlation kernel size subpixel-kernel 25 25 # Post Filtering / stereo_fltr ################################################################ # Fill in holes up to 100,000 pixels in size with an inpainting method disable-fill-holes # Automatic "erode" low confidence pixels rm-half-kernel 3 3 rm-min-matches 60 rm-threshold 3 rm-cleanup-passes 1 # Triangulation / stereo_tri ################################################################ # Size max of the universe in meters and altitude off the ground. # Setting both values to zero turns this post-processing step off. near-universe-radius 0.0 far-universe-radius 0.0 ================================================ FILE: examples/MOC/Makefile ================================================ # This Makefile executes the steps detailed in Chapter 3 of the # Stereo Pipeline Users' Guide all: products_map products_nonmap # Pattern rule to create .cub files from .imq files %.cub: %.imq mocproc from= $< to= $@ Mapping= NO jigsaw: M0100115.cub E0201461.cub echo M0100115.cub > cube.lis; \ echo E0201461.cub >> cube.lis; \ jigsaw fromlist=cube.lis radius=yes update=yes twist=no cnet=control.net onet=control_jigsaw.net spsolve=position M0100115.map.cub: jigsaw cam2map from=M0100115.cub to=M0100115.map.cub E0201461.map.cub: jigsaw M0100115.map.cub cam2map from=E0201461.cub to=E0201461.map.cub map=M0100115.map.cub matchmap=true M0100115.map/M0100115.kml: M0100115.map.cub image2qtree -m kml --normalize $< E0201461.map/E0201461.kml: E0201461.map.cub image2qtree -m kml --normalize $< map/map-PC.tif: M0100115.map.cub E0201461.map.cub mkdir -p map; \ if [ ! -e map/map-PC.tif ]; then stereo $^ map/map -s stereo.map; fi map/map-F-H.tif: map/map-PC.tif cd map; disparitydebug map-F.tif map/map.ive: map/map-PC.tif cd map; point2mesh map-PC.tif map-L.tif map/map-DEM.tif: map/map-PC.tif cd map; point2dem -r mars --orthoimage map-L.tif -n --error --nodata -32767 map-PC.tif; map/map-OrthoR.tif: map/map-DEM.tif cd map; mapproject map-DEM.tif ../M0100115.cub map-OrthoR.tif; map/map-OrthoL.tif: map/map-DEM.tif cd map; mapproject map-DEM.tif ../E0201461.cub map-OrthoL.tif; map/map-DEM_CMAP.tif: map/map-DEM.tif cd map; \ hillshade map-DEM.tif; \ colormap -s map-DEM_HILLSHADE.tif map-DEM.tif; \ colormap map-IntersectionErr.tif --colormap-style ../../TriangulationError.lut products_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 nonmap/nonmap-PC.tif: jigsaw mkdir -p nonmap if [ ! -e nomap/nomap-PC.tif ]; then stereo M0100115.cub E0201461.cub nonmap/nonmap -s stereo.nonmap; fi nonmap/nonmap.ive: nonmap/nonmap-PC.tif cd nonmap; point2mesh nonmap-PC.tif nonmap-L.tif nonmap_point2dem: nonmap/nonmap-PC.tif cd nonmap; \ point2dem -r mars --orthoimage nonmap-L.tif nonmap-PC.tif --errorimage --nodata -32767 -n; \ hillshade nonmap-DEM.tif; \ colormap -s nonmap-DEM_HILLSHADE.tif nonmap-DEM.tif; \ colormap nonmap-IntersectionErr.tif products_nonmap: nonmap/nonmap.ive nonmap_point2dem clean: rm -rf map nonmap rm -rf M0100115.map E0201461.map cube.lis control_ba.net *.match bundleout* residuals.csv control_jigsaw.net distclean: clean rm -rf print.prt *.cub *.vwip *.match *~ ================================================ FILE: examples/MOC/stereo.nonmap ================================================ # -*- mode: sh -*- # Pre-Processing / stereo_pprc ################################################################ # Pre-alignment options # # Available choices are (however not all are supported by all sessions): # NONE (Recommended for anything map projected) # EPIPOLAR (Recommended for Pinhole Sessions) # HOMOGRAPHY (Recommended for ISIS and DG Sessions) alignment-method homography # Intensity Normalization force-use-entire-range # Use entire input range # Select a preprocessing filter: # # 0 - None # 1 - Subtracted Mean # 2 - Laplacian of Gaussian (recommended) prefilter-mode 2 # Kernel size (1-sigma) for pre-processing # # Recommend 1.4 px for Laplacian of Gaussian # Recommend 25 px for Subtracted Mean prefilter-kernel-width 1.4 # Integer Correlation / stereo_corr ################################################################ # Select a cost function to use for initialization: # # 0 - absolute difference (fast) # 1 - squared difference (faster .. but usually bad) # 2 - normalized cross correlation (recommended) cost-mode 0 # Initialization step: correlation kernel size corr-kernel 25 25 # Initialization step: correlation window size #corr-search -35 -280 -15 -265 # Subpixel Refinement / stereo_rfne ################################################################ # Subpixel step: subpixel modes # # 0 - disable subpixel correlation (fastest) # 1 - parabola fitting (draft mode - not as accurate) # 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate) subpixel-mode 2 # Subpixel step: correlation kernel size subpixel-kernel 25 25 # Post Filtering / stereo_fltr ################################################################ # Fill in holes up to 100,000 pixels in size with an inpainting method # disable-fill-holes # Automatic "erode" low confidence pixels rm-half-kernel 5 5 rm-min-matches 60 rm-threshold 3 rm-cleanup-passes 1 # Triangulation / stereo_tri ################################################################ # Size max of the universe in meters and altitude off the ground. # Setting both values to zero turns this post-processing step off. near-universe-radius 0.0 far-universe-radius 0.0 ================================================ FILE: examples/TriangulationError.lut ================================================ nv 0 0 0 0 255 255 255 0.1 0 0 255 1 0 255 0 10 255 255 127 100 255 0 0 1000 255 255 255 ================================================ FILE: examples/surf_match.patch ================================================ --- orginal_code/SURF-V1.0.9/match.cpp 2006-12-20 03:28:30.000000000 -0600 +++ match.cpp 2009-03-11 13:26:07.000000000 -0500 @@ -31,7 +31,7 @@ */ #include -#include +#include #include #include #include @@ -39,12 +39,10 @@ #include "ipoint.h" // Define to compile with PGM output -#define GRAPHICS +//#define GRAPHICS -#ifdef GRAPHICS #include "image.h" #include "imload.h" -#endif using namespace std; using namespace surf; @@ -69,6 +67,7 @@ int match = -1; for (unsigned i = 0; i < ipts.size(); i++) { + // Take advantage of Laplacian to speed up matching if (ipts[i].laplace != ip1.laplace) continue; @@ -90,6 +89,30 @@ return -1; } +// Writes the interestpoint match for later reading +inline void write_ip_record(std::ofstream &f, Ipoint const& p){ + float buffer_f = (float)p.x; + f.write((char*)&(buffer_f), sizeof(float)); //x + buffer_f = (float)p.y; + f.write((char*)&(buffer_f), sizeof(float)); //y + int buffer_i = (int)p.x; + f.write((char*)&(buffer_i), sizeof(int)); //ix + buffer_i = (int)p.y; + f.write((char*)&(buffer_i), sizeof(int)); //iy + buffer_f = (float)p.ori; + f.write((char*)&(buffer_f), sizeof(float)); //ori + buffer_f = (float)p.scale; + f.write((char*)&(buffer_f), sizeof(float)); //scale + buffer_f = (float)p.strength; + f.write((char*)&(buffer_f),sizeof(float)); //interest + bool buffer_b = false; + f.write((char*)&(buffer_b),sizeof(bool)); //polarity + f.write((char*)&(buffer_i),sizeof(unsigned)); // octave + f.write((char*)&(buffer_i),sizeof(unsigned)); // scale_lvl + buffer_i = 0; + f.write((char*)&(buffer_i), sizeof(int)); //size of descriptor... nothing... +} + // Find all possible matches between two images vector< int > findMatches(const vector< Ipoint >& ipts1, const vector< Ipoint >& ipts2) { vector< int > matches(ipts1.size()); @@ -98,9 +121,7 @@ int match = findMatch(ipts1[i], ipts2); matches[i] = match; if (match != -1) { - cout << " Matched feature " << i << " in image 1 with feature " - << match << " in image 2." << endl; - c++; + c++; } } cout << " --> Matched " << c << " features of " << ipts1.size() << " in image 1." << endl; @@ -127,10 +148,10 @@ // Load the interest points in Mikolajczyk's format for (unsigned n = 0; n < count; n++) { // circular regions with diameter 5 x scale - float x, y, a, b, c; + float x, y, a, b, c, ori; // Read in region data, though not needed for actual matching - ipfile >> x >> y >> a >> b >> c; + ipfile >> x >> y >> a >> b >> c >> ori; float det = sqrt((a-c)*(a-c) + 4.0*b*b); float e1 = 0.5*(a+c + det); @@ -142,6 +163,7 @@ ipts[n].x = x; ipts[n].y = y; ipts[n].scale = sc/2.5; + ipts[n].ori = ori; // Read in Laplacian ipfile >> ipts[n].laplace; @@ -159,7 +181,7 @@ (y1 >= im->getHeight() && y2 >= im->getHeight())) return; - bool steep = std::abs(y2 - y1) > std::abs(x2 - x1); + bool steep = abs(y2 - y1) > abs(x2 - x1); if (steep) { int t; t = x1; @@ -182,7 +204,7 @@ } int deltax = x2 - x1; - int deltay = std::abs(y2 - y1); + int deltay = abs(y2 - y1); int error = 0; int y = y1; @@ -215,12 +237,14 @@ int main(int argc, char **argv) { Image *im1, *im2; -#ifdef GRAPHICS + ImLoad ImageLoader; vector< Ipoint > ipts1, ipts2; bool drawc = false; -#endif + char ofname[100]; + string matchname; + matchname.clear(); im1 = im2 = NULL; ofname[0] = 0; @@ -232,7 +256,6 @@ loadIpoints(argv[++arg], ipts1); if (! strcmp(argv[arg], "-k2")) loadIpoints(argv[++arg], ipts2); -#ifdef GRAPHICS if (! strcmp(argv[arg], "-im1")) im1 = ImageLoader.readImage(argv[++arg]); if (! strcmp(argv[arg], "-im2")) @@ -241,12 +264,13 @@ strcpy(ofname, argv[++arg]); if (! strcmp(argv[arg], "-c")) drawc = true; -#endif + if (! strcmp(argv[arg], "-m")) + matchname = argv[++arg]; } if (ipts1.size() == 0 || ipts2.size() == 0) { cout << "Usage:" << endl; - cout << " match -k1 out1.surf -k2 out2.surf -im1 img1.pgm -im2 img2.pgm -o out.pgm" << endl << endl; + cout << " match -k1 out1.surf -k2 out2.surf -im1 img1.pgm -im2 img2.pgm -o out.pgm -m output.match" << endl << endl; cout << "For each feature in first descriptor file, find best in second according to " << "nearest neighbor ratio strategy. Display matches in out.pgm, generated " << "from img1.pgm and img2.pgm. Use -c to draw crosses at interest points." << endl; @@ -255,7 +279,33 @@ vector< int > matches = findMatches(ipts1, ipts2); -#ifdef GRAPHICS + // Determining if to save a match file + if (matchname.size()) { + int count = 0; + for (unsigned i = 0; i < matches.size(); ++i){ + if (matches[i] != -1) + ++count; + } + if (count > 0 ) { + std::ofstream outputFile(matchname.c_str(), std::ios::out); + outputFile.write((char*)&count, sizeof(int)); + outputFile.write((char*)&count, sizeof(int)); + //Writing left side.. + for (unsigned i = 0; i < matches.size(); ++i){ + if (matches[i] != -1) { + write_ip_record(outputFile,ipts1[i]); + } + } + //Writing right side.. + for (unsigned i = 0; i < matches.size(); ++i){ + if (matches[i] != -1) { + write_ip_record(outputFile,ipts2[matches[i]]); + } + } + } + } + + if (im1 != NULL && im2 != NULL && ofname[0] != 0) { Image res(max(im1->getWidth(), im2->getWidth()), im1->getHeight() + im2->getHeight()); for (int x = 0; x < im1->getWidth(); x++) @@ -283,7 +333,6 @@ ImageLoader.saveImage(ofname, &res); } -#endif return 0; } ================================================ FILE: plugins/stereo/plugin_list.txt ================================================ # Specify here the external programs (plugins) that ASP can use for # stereo correlation. All paths are relative to the ASP top-level # directory. # If a plugin has library dependencies apart from the libraries # shipped with ASP, the path to them can be specified as well (this is # optional). # Name Executable Path to external library dependencies mgm plugins/stereo/mgm/bin/mgm plugins/stereo/mgm/lib msmw plugins/stereo/msmw/bin/msmw plugins/stereo/msmw/lib msmw2 plugins/stereo/msmw2/bin/msmw2 plugins/stereo/msmw2/lib libelas plugins/stereo/elas/bin/elas plugins/stereo/elas/lib ================================================ FILE: src/CMakeLists.txt ================================================ include(Utilities) # Contains functions # Verify that we have a new enough compiler. if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0") message(FATAL_ERROR "GCC version >= 5.0.0 is required!") endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.1.0") message(FATAL_ERROR "Clang version >= 8.1.0 is required!") endif() else() message(FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}") endif() #=============================================================================== # Project information project (StereoPipeline) # The line below is used by the docs/ so don't change it # without testing the result. Versioning is based on https://semver.org #set(PACKAGE_VERSION "3.6.0") set(PACKAGE_VERSION "3.7.0-alpha") set(PACKAGE_NAME "NASA Ames Stereo Pipeline") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_BUGREPORT "oleg.alexandrov@nasa.gov, scott.t.mcmichael@nasa.gov") # Fetch the Git hash and store in ASP_COMMIT_ID execute_process( COMMAND git log -1 --format=%h WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE ASP_COMMIT_ID OUTPUT_STRIP_TRAILING_WHITESPACE ) # Find the build date in UTC. Will agree with the daily build date. # That because the build is started late at night in PST, which is # next morning in UTC, and by the time it is published it is next day # in PST, but midday or early evening in UTC. string(TIMESTAMP ASP_BUILD_DATE "%Y-%m-%d" UTC) #=============================================================================== # Set the install path if not specified by the user. if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install" CACHE PATH "default install path" FORCE) endif() message("Cmake install directory set to: ${CMAKE_INSTALL_PREFIX}") enable_testing() # Needed for unit tests to work # Add command to build the instructions pdf file add_custom_target(workbook make WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/docs/book") # Add command to build doxygen files add_custom_target(doxygen doxygen COMMAND ln -s ${CMAKE_SOURCE_DIR}/docs/doxygen/index.html ${CMAKE_SOURCE_DIR}/docs/doxygen-output.html WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") # Add external dependencies which still need to be built # Build GTest include_directories(../thirdparty/gtest/include) #include_directories(../thirdparty/gtest/) add_library(gtest ../thirdparty/gtest/src/gtest-all.cc) add_library(gtest_main ../thirdparty/gtest/src/gtest_main.cc) target_link_libraries(gtest_main gtest) target_compile_definitions(gtest PRIVATE GTEST_USE_OWN_TR1_TUPLE=1) target_compile_definitions(gtest_main PRIVATE GTEST_USE_OWN_TR1_TUPLE=1) # Add all of our code add_subdirectory(asp) ================================================ FILE: src/asp/CMakeLists.txt ================================================ # Add path for custom modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}" ) include(Utilities) # Contains functions # Configuration options # Directory paths set(VISIONWORKBENCH_INSTALL_DIR "" CACHE FILEPATH "Path to the user-built and installed VisionWorkbench") set(ASP_DEPS_DIR "" CACHE FILEPATH "Path to the conda environment that has the ASP dependencies") # If VW was not built and installed separately, it should have been # built and installed in ASP_DEPS_DIR. if (NOT VISIONWORKBENCH_INSTALL_DIR) set(VISIONWORKBENCH_INSTALL_DIR ${ASP_DEPS_DIR}) endif() if ("${ASP_DEPS_DIR}" STREQUAL "") message(FATAL_ERROR "You need to set ASP_DEPS_DIR") endif() # Building core ASP only results in fewer third-party dependencies if (CORE_ASP_ONLY) message(STATUS "Building core ASP only.") set(USE_ISIS OFF) set(USE_OPENEXR OFF) endif() # Where to search for dependencies set(CMAKE_PREFIX_PATH "${ASP_DEPS_DIR}") # This needed for some libs represented as -lmylib set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ASP_DEPS_DIR}/lib") find_package(Threads REQUIRED) # Put the search for Boost early on, to ensure that the Conda version # is found before we point to the BB folder. message("Searching for Boost.") set(REQUIRED_BOOST_LIBS program_options system filesystem regex date_time thread iostreams) set(Boost_ROOT "${ASP_DEPS_DIR}") set(Boost_LIBRARYDIR "${ASP_DEPS_DIR}/lib") set(Boost_INCLUDEDIR "${ASP_DEPS_DIR}/include") set(Boost_NO_SYSTEM_PATHS ON) # Do not search anywhere else set(Boost_DEBUG ON) set(Boost_DETAILED_FAILURE_MSG ON) set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON) find_package(Boost CONFIG REQUIRED COMPONENTS ${REQUIRED_BOOST_LIBS}) if (Boost_FOUND) message("Successfully found Boost.") message("Boost libraries = ${Boost_LIBRARIES}") message("Boost dir: ${Boost_DIR}") include_directories(${Boost_INCLUDE_DIR}) endif(Boost_FOUND) # Custom options option(BUILD_SHARED_LIBS "Produce shared libraries." TRUE) # Don't set CMAKE_INSTALL_RPATH_USE_LINK_PATH. On macOS the Apple linker # auto-adds rpaths for @rpath dylibs, causing duplicates with USE_LINK_PATH. # On Linux, $ORIGIN/../lib + explicit paths cover all needed paths. # Make sure installed files can find installed libraries if (APPLE) SET(CMAKE_INSTALL_RPATH "@loader_path/../lib" ${CMAKE_INSTALL_RPATH}) elseif (UNIX) SET(CMAKE_INSTALL_RPATH "$ORIGIN/../lib" ${CMAKE_INSTALL_RPATH}) endif() set(CMAKE_INSTALL_RPATH ${VISIONWORKBENCH_INSTALL_DIR}/lib ${CMAKE_INSTALL_RPATH}) SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_RPATH}) SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} ${ASP_DEPS_DIR}/lib/csmplugins) list(REMOVE_DUPLICATES CMAKE_INSTALL_RPATH) # Enable/disable SSE optimizations if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") set(VW_ENABLE_SSE 0) else() set(VW_ENABLE_SSE 1) endif() if (VW_ENABLE_SSE) set(CXXFLAGS "${CXXFLAGS} -msse4.1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1") message(STATUS "Enabling SSE") else() if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") message(STATUS "SSE optimizations are not available on Mac Arm.") else() # Older Intel CPUs do not support SSE4.1 message(STATUS, "Disabling SSE.") set(CXXFLAGS "${CXXFLAGS} -mno-sse4.1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-sse4.1") endif() endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_BINARY_DIR}/src) # For generated config headers set(ASP_HAVE_PKG_ICEBRIDGE 1) if (APPLE) set(ASP_OSX_BUILD 1) endif() # Use CCache if it is available. find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) #message("Using ccache tool...") #set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) #set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif(CCACHE_FOUND) if (UNIX AND NOT APPLE) execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE ld_version) if ("${ld_version}" MATCHES "GNU gold") message("Using gold linker...") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags") endif() endif() # Find dependencies set(REQUIRED True ) set(NOT_REQUIRED False) set(ext ".so") if (APPLE) set(ext ".dylib") endif() # Set up VisionWorkbench message("Vision Workbench installation directory: ${VISIONWORKBENCH_INSTALL_DIR}") set(VISIONWORKBENCH_INCLUDE_DIR ${VISIONWORKBENCH_INSTALL_DIR}/include) set(VISIONWORKBENCH_LIBRARY_DIR ${VISIONWORKBENCH_INSTALL_DIR}/lib) set(ASP_HAVE_PACKAGE_VW 1) set(VW_LIBNAMES VwBundleAdjustment VwCore VwImage VwMosaic VwCamera VwFileIO VwInterestPoint VwStereo VwCartography VwGeometry VwMath) find_external_library(VISIONWORKBENCH ${VISIONWORKBENCH_INSTALL_DIR} "" "${VW_LIBNAMES}" REQUIRED) message("Searching for Qt.") # QT is complicated to use and should go through find_package set(QT_QMAKE_EXECUTABLE ${ASP_DEPS_DIR}/bin/qmake) set(QT_MOC_EXECUTABLE ${ASP_DEPS_DIR}/bin/moc) set(QT_RCC_EXECUTABLE ${ASP_DEPS_DIR}/bin/rcc) set(QT_UIC_EXECUTABLE ${ASP_DEPS_DIR}/bin/uic) # Qt6: Script, ScriptTools, XmlPatterns were removed. # OpenGLWidgets is new in Qt6 (split from OpenGL). set(REQUIRED_QT_COMPONENTS Core Concurrent Gui Multimedia MultimediaWidgets Network OpenGL OpenGLWidgets PrintSupport Qml Quick Sql Svg Test Widgets Xml Core5Compat) find_package(Qt6 COMPONENTS ${REQUIRED_QT_COMPONENTS} REQUIRED) if(Qt6_FOUND) # We need this to be able to include headers produced by uic in our # code (CMAKE_BINARY_DIR holds a path to the build directory, while # INCLUDE_DIRECTORIES() works just like INCLUDEPATH from qmake) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) set (ASP_HAVE_PKG_QT 1) message("Qt found: ${Qt6Core_INCLUDE_DIRS}") endif(Qt6_FOUND) find_external_library(QWT ${ASP_DEPS_DIR} "" "qwt" REQUIRED) # TODO(oalexan1): Figure out why clang does not find OpenMP # Also try to to understand why OpenMP cannot be found # without all the "set" logic below. if (APPLE) set(OpenMP_C_LIB_NAMES "gomp") set(OPENMP_INCLUDES "${ASP_DEPS_DIR}/include") set(OpenMP_C_FLAGS "-fopenmp") set(OpenMP_gomp_LIBRARY "${ASP_DEPS_DIR}/lib/libgomp${CMAKE_SHARED_LIBRARY_SUFFIX}") set(OpenMP_CXX_FLAGS "-fopenmp") set(OpenMP_CXX_LIB_NAMES "gomp") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_gomp_LIBRARY}") else() find_package(OpenMP REQUIRED) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") endif() set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") find_external_library(LAPACK ${ASP_DEPS_DIR} "" "lapack;blas" REQUIRED) set(VW_HAVE_PKG_FLAPACK 1) # This specifies that it is a Fortran derived version # Required for GLog add_definitions(-DGLOG_USE_GLOG_EXPORT) find_external_library(FLANN ${ASP_DEPS_DIR} "" "flann_cpp" REQUIRED) find_external_library(LZ4 ${ASP_DEPS_DIR} "" "lz4" REQUIRED) find_external_library(Z ${ASP_DEPS_DIR} "" "z" REQUIRED) find_external_library(PROJ ${ASP_DEPS_DIR} "" "proj" REQUIRED) find_external_library(JPEG ${ASP_DEPS_DIR} "" "jpeg" REQUIRED) find_external_library(PNG ${ASP_DEPS_DIR} "" "png;png16" REQUIRED) find_external_library(TIFF ${ASP_DEPS_DIR} "" "tiff" REQUIRED) find_external_library(GEOTIFF ${ASP_DEPS_DIR} "" "geotiff" REQUIRED) find_external_library(GDAL ${ASP_DEPS_DIR} "" "gdal" REQUIRED) if (USE_OPENEXR) set(ILMBASE_LIB_NAMES Half Iex Imath IlmThread) find_external_library(ILMBASE ${ASP_DEPS_DIR} "" "${ILMBASE_LIB_NAMES}" REQUIRED) find_external_library(OPENEXR ${ASP_DEPS_DIR} "OpenEXR" "IlmImf;IlmThread" REQUIRED) else() message(STATUS "OpenEXR will not be used.") endif() find_external_library(XERCESC ${ASP_DEPS_DIR} "" "xerces-c" REQUIRED) find_external_library(PROTOBUF ${ASP_DEPS_DIR} "" "protobuf" REQUIRED) find_external_library(EIGEN ${ASP_DEPS_DIR} "eigen3" "" REQUIRED) find_external_library(CERES ${ASP_DEPS_DIR} "ceres" "ceres" REQUIRED) find_external_library(GFLAGS ${ASP_DEPS_DIR} "gflags" "gflags" REQUIRED) find_external_library(GLOG ${ASP_DEPS_DIR} "glog" "glog" REQUIRED) if (NOT CORE_ASP_ONLY) find_external_library(LIBNABO ${ASP_DEPS_DIR} "nabo" "nabo" REQUIRED) find_external_library(GEOID ${ASP_DEPS_DIR} "" "egm2008" REQUIRED) find_external_library(LIBPOINTMATCHER ${ASP_DEPS_DIR} "" "pointmatcher" REQUIRED) find_external_library(FASTGLOBALREGISTRATION ${ASP_DEPS_DIR} "FastGlobalRegistration" "FastGlobalRegistrationLib" REQUIRED) endif() if (USE_ISIS) find_external_library(SPICE ${ASP_DEPS_DIR} "cspice" "cspice" REQUIRED) find_external_library(ARMADILLO ${ASP_DEPS_DIR} "" "armadillo" REQUIRED) find_external_library(EMBREE ${ASP_DEPS_DIR} "" "embree3" REQUIRED) find_external_library(ISIS ${ASP_DEPS_DIR} "isis" "isis;core" REQUIRED) # Pull the ISIS version. It is on the first line before the first space. file(STRINGS "${ASP_DEPS_DIR}/isis_version.txt" ISIS_VERSION_LINE LIMIT_COUNT 1) # Split by space, save to list string(REPLACE " " ";" ISIS_VERSION_LIST ${ISIS_VERSION_LINE}) # Get the first element list(GET ISIS_VERSION_LIST 0 ISIS_VERSION) message(STATUS "Found ISIS version: ${ISIS_VERSION}") # For now, this is needed only for Linux. When upgrading ISIS on the Mac, # it will be needed also. if (LINUX) #find_external_library(SPICEQL ${ASP_DEPS_DIR} "" "SpiceQL" REQUIRED) endif() # Some ISIS headers include Qt headers in a way that requires the include below include_directories("${ASP_DEPS_DIR}/include/qt6") include_directories("${ASP_DEPS_DIR}/include/qt6/QtCore") include_directories("${ASP_DEPS_DIR}/include/qt6/QtXml") include_directories("${ASP_DEPS_DIR}/include/qt6/QtCore5Compat") set(ASP_HAVE_PKG_ISIS 1) else() message(STATUS "ISIS not found. Some features will be disabled.") set(ASP_HAVE_PKG_ISIS 0) endif() find_external_library(CSM ${ASP_DEPS_DIR} "csm" "csmapi" REQUIRED) # Link to libusgscsm. This makes it disappear from the list of CSM # plugins, presumably because it is found at link time now, # but things still work. This is is necessary since we need to peek into # usgscsm by bypassing the csm interface. # Have to use a global variable to peek in the subdir where this lib is stored. set(LIB_SUBDIR "csmplugins/") find_external_library(USGSCSM ${ASP_DEPS_DIR} "usgscsm" "usgscsm" REQUIRED) set(LIB_SUBDIR "") # No longer needed # ALE find_external_library(ALE ${ASP_DEPS_DIR} "ale" "ale" REQUIRED) # PCL # The PCL include directory is include/pcl-x.xx file(GLOB PCL_DIRS "${ASP_DEPS_DIR}/include/pcl-*") # all matches list(GET PCL_DIRS 0 PCL_DIR) # first entry if (NOT PCL_DIR) # must exist message(FATAL_ERROR "Could not find the PCL include directory.") endif() get_filename_component(PCL_INC_DIR ${PCL_DIR} NAME) # extract pcl-x.xx set(PCL_LIB_NAMES pcl_common pcl_features pcl_filters pcl_io_ply pcl_io pcl_kdtree pcl_keypoints pcl_ml pcl_octree pcl_recognition pcl_registration pcl_sample_consensus pcl_search pcl_segmentation pcl_stereo pcl_surface pcl_tracking) find_external_library(PCL ${ASP_DEPS_DIR} "${PCL_INC_DIR}" "${PCL_LIB_NAMES}" REQUIRED) # OpenCV set(OPENCV_LIB_NAMES opencv_calib3d opencv_reg opencv_core opencv_shape opencv_features2d opencv_stitching opencv_flann opencv_superres opencv_hdf opencv_surface_matching opencv_highgui opencv_videoio opencv_imgcodecs opencv_video opencv_imgproc opencv_xfeatures2d opencv_ml opencv_ximgproc opencv_objdetect opencv_xobjdetect opencv_photo opencv_xphoto opencv_stereo) find_external_library(OPENCV ${ASP_DEPS_DIR} "opencv4" "${OPENCV_LIB_NAMES}" REQUIRED) # PDAL set(PDAL_LIB_NAMES pdal_plugin_kernel_fauxplugin # pdal_plugin_reader_hdf # pdal_plugin_reader_pgpointcloud # pdal_plugin_writer_pgpointcloud #pdal_plugin_reader_tiledb #pdal_plugin_writer_tiledb pdalcpp) find_external_library(PDAL ${ASP_DEPS_DIR} "pdal" "${PDAL_LIB_NAMES}" REQUIRED) set(TBB_LIB_NAMES tbb tbbmalloc tbbmalloc_proxy) find_external_library(TBB ${ASP_DEPS_DIR} "" "${TBB_LIB_NAMES}" REQUIRED) # This is an experiment, to be continued # Use only a small portion of VTK, and only in one stand-alone # tool. That one is a giant library. Thse are installed using # a custom conda package which only has the minimum needed libs. #set(VTK_LIB_NAMES vtkCommonDataModel-9.1 vtkCommonTransforms-9.1 # vtkCommonMath-9.1 vtkkissfft-9.1 # vtkCommonCore-9.1 vtksys-9.1 # vtkCommonMisc-9.1 vtkCommonSystem-9.1 # vtkloguru-9.1) #find_external_library(VTK ${ASP_DEPS_DIR} "vtk-9.1" "${VTK_LIB_NAMES}" REQUIRED) # For convenience, list some libraries that ASP deneds on set(ASP_3RD_PARTY_LIBS ${Z_LIBRARIES} ${OPENCV_LIBRARIES} ${GDAL_LIBRARIES} ${LAPACK_LIBRARIES} ${Boost_LIBRARIES} ${PROJ_LIBRARIES} ${GEOTIFF_LIBRARIES} ${JPEG_LIBRARIES} ${TIFF_LIBRARIES} ${PNG_LIBRARIES} ${FLANN_LIBRARIES} ${LZ4_LIBRARIES} Qt6::Core ${PROTOBUF_LIBRARIES} ${QWT_LIBRARIES} ${PCL_LIBRARIES} ${TBB_LIBRARIES}) if (USE_OPENEXR) list(APPEND ASP_3RD_PARTY_LIBS ${OPENEXR_LIBRARIES} ${ILMBASE_LIBRARIES}) endif() if (USE_ISIS) list(APPEND ASP_3RD_PARTY_LIBS ${ARMADILLO_LIBRARIES} ${EMBREE_LIBRARIES} ${SPICE_LIBRARIES}) if (LINUX) list(APPEND ASP_3RD_PARTY_LIBS ${SPICEQL_LIBRARIES}) endif() endif() # These are needed for rig_calibrator if (NOT CORE_ASP_ONLY) # MVE set(MVE_LIB_NAMES mveUtil mveCore mveDmrecon) find_external_library(MVE ${ASP_DEPS_DIR} "mve" "${MVE_LIB_NAMES}" REQUIRED) # Rayint only has headers, no libraries find_external_library(RAYINT ${ASP_DEPS_DIR} "rayint" "" REQUIRED) # texture reconstruction find_external_library(TEXRECON ${ASP_DEPS_DIR} "" "texture_reconstruction" REQUIRED) endif() # Prioratize including files from the local code base and VW include_directories(BEFORE ${VISIONWORKBENCH_INCLUDE_DIR}) include_directories(BEFORE ../) # Now that we have found all our external dependencies, generate a config.h file include("GenerateConfig.cmake") # Add all the header files at the top level to the install command # Note: This does not install the headers in subdirectories. # Separate code exists in add_library_wrapper() for taking # care of that. get_all_source_files("." MAIN_HEADER_FILES) foreach(f ${MAIN_HEADER_FILES}) INSTALL(FILES ${f} DESTINATION include/asp) endforeach() # Install the generated config headers from build directory install(FILES ${CMAKE_BINARY_DIR}/src/asp/asp_config.h DESTINATION include/asp) install(FILES ${CMAKE_BINARY_DIR}/src/asp/asp_date_config.h DESTINATION include/asp) # CERES and its dependencies set(SOLVER_LIBRARIES ${CERES_LIBRARIES} ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES}) # Define each of the libaries # ASP Core get_all_source_files( "Core" ASP_CORE_SRC_FILES) get_all_source_files( "Core/tests" ASP_CORE_TEST_FILES) set(ASP_CORE_LIB_DEPENDENCIES ${ASP_3RD_PARTY_LIBS} ${VISIONWORKBENCH_LIBRARIES} ${PDAL_LIBRARIES} ${OpenMP_CXX_LIBRARIES} ${CMAKE_DL_LIBS}) # Isis if (USE_ISIS) get_all_source_files( "IsisIO" ASP_ISISIO_SRC_FILES) get_all_source_files( "IsisIO/tests" ASP_ISISIO_TEST_FILES) set(ASP_ISISIO_LIB_DEPENDENCIES AspCore ${ASP_3RD_PARTY_LIBS} ${ISIS_LIBRARIES} ${ASP_3RD_PARTY_LIBS} ${VISIONWORKBENCH_LIBRARIES} Qt6::Core5Compat) endif() # ASP PclIO get_all_source_files("PclIO" ASP_PCLIO_SRC_FILES) get_all_source_files( "PclIO/tests" ASP_PCLIO_TEST_FILES) set(ASP_PCLIO_LIB_DEPENDENCIES pcl_common pcl_io_ply pcl_io ${VISIONWORKBENCH_LIBRARIES} AspCore) # ASP OpenMVG get_all_source_files( "OpenMVG" ASP_OPENMVG_SRC_FILES) get_all_source_files( "OpenMVG/tests" ASP_OPENMVG_TEST_FILES) set(ASP_OPENMVG_LIB_DEPENDENCIES "") # ASP Rig get_all_source_files("Rig" ASP_RIG_SRC_FILES) get_all_source_files("Rig/tests" ASP_RIG_TEST_FILES) if (CORE_ASP_ONLY) # Exclude files that depend on MVE, Rayint, and Texrecon list(FILTER ASP_RIG_SRC_FILES EXCLUDE REGEX "texture") endif() set(ASP_RIG_LIB_DEPENDENCIES AspCore AspOpenMvg AspPclIO tbb ${OPENCV_LIBRARIES} ${SOLVER_LIBRARIES} ${MVE_LIBRARIES} ${RAYINT_LIBRARIES} ${TEXRECON_LIBRARIES}) # ASP Camera get_all_source_files("Camera" ASP_CAMERA_SRC_FILES) get_all_source_files("Camera/tests" ASP_CAMERA_TEST_FILES) set(ASP_CAMERA_LIB_DEPENDENCIES AspCore AspRig ${XERCESC_LIBRARIES} ${CSM_LIBRARIES} ${USGSCSM_LIBRARIES} ${ALE_LIBRARIES}) if (USE_ISIS) set(ASP_CAMERA_LIB_DEPENDENCIES ${ASP_CAMERA_LIB_DEPENDENCIES} AspIsisIO) endif() # ASP SfS get_all_source_files("SfS" ASP_SfS_SRC_FILES) get_all_source_files("SfS/tests" ASP_SfS_TEST_FILES) set(ASP_SfS_LIB_DEPENDENCIES AspCore AspCamera ${SOLVER_LIBRARIES}) # ASP GUI get_all_source_files( "GUI" ASP_GUI_SRC_FILES) get_all_source_files( "GUI/tests" ASP_GUI_TEST_FILES) set(ASP_GUI_LIB_DEPENDENCIES AspCore AspCamera Qt6::Core Qt6::Gui Qt6::Widgets ${QWT_LIBRARIES}) # ASP SfmView get_all_source_files( "SfmView" ASP_SFMVIEW_SRC_FILES) get_all_source_files( "SfmView/tests" ASP_SFMVIEW_TEST_FILES) set(ASP_SFMVIEW_LIB_DEPENDENCIES Qt6::Core Qt6::Gui Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets) # ASP Gotcha get_all_source_files( "Gotcha" ASP_GOTCHA_SRC_FILES) get_all_source_files( "Gotcha/tests" ASP_GOTCHA_TEST_FILES) set(ASP_GOTCHA_LIB_DEPENDENCIES ${VISIONWORKBENCH_LIBRARIES} ${OPENCV_LIBRARIES} ${Boost_LIBRARIES}) if (NOT CORE_ASP_ONLY) # ASP PcAlign get_all_source_files("PcAlign" ASP_PC_ALIGN_SRC_FILES) get_all_source_files("PcAlign/tests" ASP_PC_ALIGN_TEST_FILES) set(ASP_PC_ALIGN_LIB_DEPENDENCIES ${SOLVER_LIBRARIES} ${LIBPOINTMATCHER_LIBRARIES} ${LIBNABO_LIBRARIES} ${FASTGLOBALREGISTRATION_LIBRARIES} AspCore) endif() # ASP Sessions get_all_source_files( "Sessions" ASP_SESSIONS_SRC_FILES) get_all_source_files( "Sessions/tests" ASP_SESSIONS_TEST_FILES) set(ASP_SESSIONS_LIB_DEPENDENCIES AspCore AspCamera) # Add all of the library subdirectories add_subdirectory(Core) if (USE_ISIS) add_subdirectory(IsisIO) endif() if (NOT CORE_ASP_ONLY) add_subdirectory(PcAlign) endif() add_subdirectory(Rig) add_subdirectory(OpenMVG) add_subdirectory(Camera) add_subdirectory(Sessions) add_subdirectory(GUI) add_subdirectory(SfmView) add_subdirectory(Gotcha) add_subdirectory(SfS) add_subdirectory(PclIO) # Add the non-library subdirectories add_subdirectory(Python) add_subdirectory(Tools) add_subdirectory(WVCorrect) add_subdirectory(IceBridge) # On macOS the Apple linker auto-adds rpaths that duplicate the ones CMake # sets via CMAKE_INSTALL_RPATH. Remove duplicates and re-sign after install. if (APPLE) install(CODE " file(GLOB asp_libs \"\${CMAKE_INSTALL_PREFIX}/lib/libAsp*.dylib\") file(GLOB vw_libs \"\${CMAKE_INSTALL_PREFIX}/lib/libVw*.dylib\") list(APPEND libs \${asp_libs} \${vw_libs}) file(GLOB bins \"\${CMAKE_INSTALL_PREFIX}/bin/*\") foreach(f IN LISTS libs bins) execute_process( COMMAND otool -l \${f} OUTPUT_VARIABLE otool_out ERROR_QUIET) string(REGEX MATCHALL \"path [^\n]*[^ ]*conda[^ ]*/envs/[^\n]*/lib \" matches \"\${otool_out}\") list(LENGTH matches count) if (count GREATER 1) string(REGEX MATCH \"[^ ]*conda[^ ]*/envs/[^/]*/lib\" rpath \"\${matches}\") execute_process( COMMAND install_name_tool -delete_rpath \${rpath} \${f} ERROR_QUIET) execute_process( COMMAND codesign --force --sign - \${f} ERROR_QUIET) endif() endforeach() ") endif() ================================================ FILE: src/asp/Camera/ASTER_XML.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include // for ArgumentErr, vw_throw, etc #include // for Quat, Quaternion #include // for Vector, Vector3, Vector4, etc #include // for Datum #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::cartography; using namespace xercesc; using asp::XmlUtils::get_node; using asp::XmlUtils::cast_xmlch; namespace asp { DOMElement* ASTERXML::open_xml_file(std::string const& xml_path) { // Check if the file actually exists and throw a user helpful file. if (!boost::filesystem::exists(xml_path)) vw_throw(ArgumentErr() << "XML file \"" << xml_path << "\" does not exist."); std::string error_prefix = "XML file \"" + xml_path + "\" is invalid.\nException message is: \n"; std::string err_message = ""; // Filled in later on error try{ //std::cout << "Set XML parser\n"; // Set up the XML parser if we have not already done so if (!m_parser.get()) { m_parser.reset(new XercesDOMParser()); m_errHandler.reset(new HandlerBase()); m_parser->setValidationScheme(XercesDOMParser::Val_Always); m_parser->setDoNamespaces(true); m_parser->setErrorHandler(m_errHandler.get()); } //std::cout << "Load XML\n"; // Load the XML file m_parser->parse(xml_path.c_str()); DOMDocument* xmlDoc = m_parser->getDocument(); DOMElement * elementRoot = xmlDoc->getDocumentElement(); return elementRoot; } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); err_message = error_prefix + message; XMLString::release(&message); } catch (const SAXException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const std::exception& e) { err_message = error_prefix + e.what(); } catch (...) { err_message = "Unrecognized error in XML file \"" + xml_path + "\"\n"; } vw_throw(ArgumentErr() << err_message); // Only get here on error return 0; } void ASTERXML::read_xml(std::string const& xml_path) { DOMElement * elementRoot = open_xml_file(xml_path); parse_xml(elementRoot); } void ASTERXML::parse_xml(xercesc::DOMElement* node) { xercesc::DOMElement* lattice_point_node = get_node(node, "LATTICE_POINT"); std::string lattice_point_txt(XMLString::transcode(lattice_point_node->getTextContent())); asp::read_matrix_from_string(lattice_point_txt, m_lattice_mat); xercesc::DOMElement* sight_vector_node = get_node(node, "SIGHT_VECTOR"); std::string sight_vector_txt(XMLString::transcode(sight_vector_node->getTextContent())); asp::read_matrix_from_string(sight_vector_txt, m_sight_mat); if (m_lattice_mat.empty() || m_sight_mat.empty() || m_lattice_mat.size() != m_sight_mat.size() || m_lattice_mat[0].size() != m_sight_mat[0].size()) { vw_throw(ArgumentErr() << "Inconsistent lattice point and sight vector information.\n"); } xercesc::DOMElement* world_sight_vector_node = get_node(node, "WORLD_SIGHT_VECTOR"); std::string world_sight_vector_txt(XMLString::transcode(world_sight_vector_node->getTextContent())); asp::read_matrix_from_string(world_sight_vector_txt, m_world_sight_mat); if (m_lattice_mat.empty() || m_world_sight_mat.empty() || m_lattice_mat.size() != m_world_sight_mat.size() || m_lattice_mat[0].size() != m_world_sight_mat[0].size()) { vw_throw(ArgumentErr() << "Inconsistent lattice point and world sight vector information.\n"); } std::vector> sat_pos_mat; xercesc::DOMElement* sat_pos_node = get_node(node, "SAT_POS"); std::string sat_pos_txt(XMLString::transcode(sat_pos_node->getTextContent())); asp::read_matrix_from_string(sat_pos_txt, sat_pos_mat); m_sat_pos = sat_pos_mat[0]; // Go from matrix with one row to a vector if (m_sat_pos.size() != m_sight_mat.size()) vw_throw(ArgumentErr() << "Inconsistent satellite position and sight vector information.\n"); if (m_sat_pos.size() != m_world_sight_mat.size()) vw_throw(ArgumentErr() << "Inconsistent satellite position and world " << "sight vector information.\n"); xercesc::DOMElement* cols_node = get_node(node, "IMAGE_COLS"); std::string cols_txt(XMLString::transcode(cols_node->getTextContent())); int cols = atoi(cols_txt.c_str()); xercesc::DOMElement* rows_node = get_node(node, "IMAGE_ROWS"); std::string rows_txt(XMLString::transcode(rows_node->getTextContent())); int rows = atoi(rows_txt.c_str()); m_image_size = vw::Vector2i(cols, rows); } } // end namespace asp ================================================ FILE: src/asp/Camera/ASTER_XML.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // These are objects that relate directly to block in XML that we need // to read. They only read and then store the raw values. Other // objects will interpret the results. #ifndef __STEREO_CAMERA_ASTER_XML_H__ #define __STEREO_CAMERA_ASTER_XML_H__ #include #include #include #include #include #include #include #include #include // Special forward declare so we can hide the Xerces headers. #include // Needed for this XERCES macro XERCES_CPP_NAMESPACE_BEGIN class DOMDocument; class DOMElement; class XercesDOMParser; class ErrorHandler; XERCES_CPP_NAMESPACE_END namespace asp { class ASTERXML { public: /// Constructor /// - Sets the fixed reference time. ASTERXML(){} // The reader will populate these fields std::vector< std::vector> m_lattice_mat; std::vector< std::vector> m_sight_mat; std::vector< std::vector> m_world_sight_mat; std::vector m_sat_pos; vw::Vector2i m_image_size; /// Parse an XML file to populate the data void read_xml(std::string const& xml_path); /// Parse an XML tree to populate the data void parse_xml(xercesc::DOMElement* node); private: // The various XML data reading sections /// Just opens the XML file for reading and returns the root node. xercesc::DOMElement* open_xml_file(std::string const& xml_path); boost::shared_ptr m_parser; boost::shared_ptr m_errHandler; }; // End class ASTERXML } //end namespace asp #endif//__STEREO_CAMERA_ASTER_XML_H__ ================================================ FILE: src/asp/Camera/BaParams.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BaParams.cc /// #include #include #include #include #include #include #include #include namespace { // A global random generator, to avoid having this as class member boost::random::mt19937 g_rand_gen; } namespace asp { IntrinsicOptions::IntrinsicOptions(): center_shared(true), focus_shared(true), distortion_shared(true), share_intrinsics_per_sensor(false), num_sensors(0) {} // Control per each group of cameras or for all cameras which intrinsics // should be floated. bool IntrinsicOptions::float_optical_center(int cam_index) const { // When sharing intrinsics per sensor, each sensor's float behavior is independent int sensor_id = 0; if (share_intrinsics_per_sensor) sensor_id = cam2sensor.at(cam_index); return float_center[sensor_id]; } bool IntrinsicOptions::float_focal_length(int cam_index) const { // When sharing intrinsics per sensor, each sensor's float behavior is independent int sensor_id = 0; if (share_intrinsics_per_sensor) sensor_id = cam2sensor.at(cam_index); return float_focus[sensor_id]; } bool IntrinsicOptions::float_distortion_params(int cam_index) const { // When sharing intrinsics per sensor, each sensor's float behavior is independent int sensor_id = 0; if (share_intrinsics_per_sensor) sensor_id = cam2sensor.at(cam_index); return float_distortion[sensor_id]; } // BaParams constructor BaParams::BaParams(int num_points, int num_cameras, // Parameters below here only apply to pinhole models. bool using_intrinsics, int max_num_dist_params, IntrinsicOptions intrinsics_opts): m_num_points (num_points), m_num_cameras (num_cameras), m_params_per_point (PARAMS_PER_POINT), m_num_pose_params (NUM_CAMERA_PARAMS), m_num_shared_intrinsics (0), m_num_intrinsics_per_camera(0), m_max_num_dist_params(max_num_dist_params), m_focus_offset(0), m_distortion_offset(0), m_intrinsics_opts (intrinsics_opts), m_points_vec (num_points * PARAMS_PER_POINT, 0), m_cameras_vec (num_cameras * NUM_CAMERA_PARAMS, 0), m_intrinsics_vec (0), m_outlier_points_vec(num_points, false) { if (!using_intrinsics) return; // If we are not using intrinsics, nothing else to do. // Calculate how many values are stored per-camera, and // what the offset is to a particular intrinsic value. // - The start of the array is always an entry for each intrinsic in case // it is shared. // The logic is very different when intrinsics are shared per sensor, // rather than not shared at all or all shared. // TODO(oalexan1): Integrate this logic. if (!intrinsics_opts.share_intrinsics_per_sensor) { if (!intrinsics_opts.center_shared) m_num_intrinsics_per_camera += NUM_CENTER_PARAMS; if (intrinsics_opts.focus_shared) m_focus_offset = NUM_CENTER_PARAMS; else { m_num_intrinsics_per_camera += NUM_FOCUS_PARAMS; if (!intrinsics_opts.center_shared) m_focus_offset = NUM_CENTER_PARAMS; } if (intrinsics_opts.distortion_shared) m_distortion_offset = NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS; else { m_num_intrinsics_per_camera += max_num_dist_params; if (!intrinsics_opts.center_shared) m_distortion_offset += NUM_CENTER_PARAMS; if (!intrinsics_opts.focus_shared) m_distortion_offset += NUM_FOCUS_PARAMS; } // For simplicity, we always set this to the same size and allocate // the same storage even if none of the parameters are shared. m_num_shared_intrinsics = NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS + max_num_dist_params; m_intrinsics_vec.resize(m_num_shared_intrinsics + num_cameras*m_num_intrinsics_per_camera, 0); // Initialize to 0 } else { m_num_intrinsics_per_camera = NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS + max_num_dist_params; m_intrinsics_vec.resize(intrinsics_opts.num_sensors * m_num_intrinsics_per_camera, 0); // Initialize to 0 } } // Copy constructor BaParams::BaParams(BaParams const& other): m_num_points (other.m_num_points), m_num_cameras (other.m_num_cameras), m_params_per_point (other.m_params_per_point), m_num_pose_params (other.m_num_pose_params), m_num_shared_intrinsics (other.m_num_shared_intrinsics), m_num_intrinsics_per_camera(other.m_num_intrinsics_per_camera), m_max_num_dist_params(other.m_max_num_dist_params), m_focus_offset (other.m_focus_offset), m_distortion_offset (other.m_distortion_offset), m_intrinsics_opts (other.m_intrinsics_opts), m_points_vec (other.m_points_vec.size()), m_cameras_vec (other.m_cameras_vec.size()), m_intrinsics_vec (other.m_intrinsics_vec.size()), m_outlier_points_vec(other.m_outlier_points_vec.size()) { copy_points (other); copy_cameras (other); copy_intrinsics(other); copy_outliers (other); } // Set all camera position and pose values to zero. void BaParams::init_cams_as_zero() { for (int i = 0; i < m_cameras_vec.size(); i++) m_cameras_vec[i] = 0.0; } // When using the copy functions, the sizes must match! /// Copy one set of values from another instance. void BaParams::copy_points(BaParams const& other) { for (size_t i = 0; i < m_points_vec.size(); i++) m_points_vec[i] = other.m_points_vec[i]; } void BaParams::copy_cameras(BaParams const& other) { for (size_t i = 0; i < m_cameras_vec.size(); i++) m_cameras_vec[i] = other.m_cameras_vec[i]; } void BaParams::copy_intrinsics(BaParams const& other) { for (size_t i = 0; i < m_intrinsics_vec.size(); i++) m_intrinsics_vec[i] = other.m_intrinsics_vec[i]; } void BaParams::copy_outliers(BaParams const& other) { for (size_t i = 0; i < m_outlier_points_vec.size(); i++) m_outlier_points_vec[i] = other.m_outlier_points_vec[i]; } // Compute the offset in m_intrinsics_vec to the requested data size_t BaParams::get_center_offset(int cam_index) const { if (!m_intrinsics_opts.share_intrinsics_per_sensor) { // Share all or none of the intrinsics if (m_intrinsics_opts.center_shared) return 0; else return m_num_shared_intrinsics + cam_index*m_num_intrinsics_per_camera; } // Share intrinsics per sensor int sensor_id = m_intrinsics_opts.cam2sensor.at(cam_index); return sensor_id * m_num_intrinsics_per_camera; } size_t BaParams::get_focus_offset(int cam_index) const { if (!m_intrinsics_opts.share_intrinsics_per_sensor) { // Share all or none of the intrinsics if (m_intrinsics_opts.focus_shared) return m_focus_offset; else return m_num_shared_intrinsics + cam_index*m_num_intrinsics_per_camera + m_focus_offset; } // Share intrinsics per sensor int sensor_id = m_intrinsics_opts.cam2sensor.at(cam_index); return sensor_id * m_num_intrinsics_per_camera + NUM_CENTER_PARAMS; } size_t BaParams::get_distortion_offset(int cam_index) const { if (!m_intrinsics_opts.share_intrinsics_per_sensor) { // Share all or none of the intrinsics if (m_intrinsics_opts.distortion_shared) return m_distortion_offset; else return m_num_shared_intrinsics + cam_index*m_num_intrinsics_per_camera + m_distortion_offset; } // Share intrinsics per sensor int sensor_id = m_intrinsics_opts.cam2sensor.at(cam_index); return sensor_id * m_num_intrinsics_per_camera + NUM_CENTER_PARAMS + NUM_FOCUS_PARAMS; } /// Apply a random offset to each camera position. void BaParams::randomize_cameras() { // These are stored as x,y,z, axis_angle. // - We move the position +/- 5 meters. // - Currently we don't adjust the angle. boost::random::uniform_int_distribution<> xyz_dist(0, 10); const size_t NUM_CAMERA_PARAMS = 6; VW_ASSERT((m_cameras_vec.size() % NUM_CAMERA_PARAMS) == 0, vw::LogicErr() << "Camera parameter length is not a multiple of 6!"); const size_t num_cameras = m_cameras_vec.size() / NUM_CAMERA_PARAMS; for (size_t c = 0; c < num_cameras; c++) { double* ptr = get_camera_ptr(c); for (size_t i = 0; i < 3; i++) { int diff = xyz_dist(g_rand_gen) - 5; ptr[i] += diff; } } } /// Randomly scale each intrinsic value. void BaParams::randomize_intrinsics(std::vector const& intrinsic_limits) { // Intrinsic values are stored as multipliers, here we // multiply from 0.5 to 1.5, being careful about shared and constant values. // - If intrinsic limits are specified, use that range instead. boost::random::uniform_int_distribution<> dist(0, 100); const double DENOM = 100.0; const double DEFAULT_MIN = 0.5; const double DEFAULT_MAX = 1.5; const double DEFAULT_RANGE = DEFAULT_MAX - DEFAULT_MIN; const size_t num_intrinsics = intrinsic_limits.size() / 2; float percent, scale, range = 0; // Iterate over cameras for (size_t c = 0; c < num_cameras(); c++) { size_t intrinsics_index = 0; if (m_intrinsics_opts.float_focal_length(c) && !(m_intrinsics_opts.focus_shared && (c>0))) { double* ptr = get_intrinsic_focus_ptr(c); for (int i = 0; i < NUM_FOCUS_PARAMS; i++) { percent = static_cast(dist(g_rand_gen))/DENOM; if (intrinsics_index < num_intrinsics) { range = intrinsic_limits[2*intrinsics_index+1] - intrinsic_limits[2*intrinsics_index]; scale = percent*range + intrinsic_limits[2*intrinsics_index]; } else scale = percent*DEFAULT_RANGE + DEFAULT_MIN; ptr[i] *= scale; ++intrinsics_index; } } // End focus case intrinsics_index = NUM_FOCUS_PARAMS; // In case we did not go through the loop if (m_intrinsics_opts.float_optical_center(c) && !(m_intrinsics_opts.center_shared && (c>0))) { double* ptr = get_intrinsic_center_ptr(c); for (int i = 0; i < NUM_CENTER_PARAMS; i++) { percent = static_cast(dist(g_rand_gen))/DENOM; if (intrinsics_index < num_intrinsics) { range = intrinsic_limits[2*intrinsics_index+1] - intrinsic_limits[2*intrinsics_index]; scale = percent*range + intrinsic_limits[2*intrinsics_index]; } else scale = percent*DEFAULT_RANGE + DEFAULT_MIN; ptr[i] *= scale; ++intrinsics_index; } } // End center case intrinsics_index = NUM_FOCUS_PARAMS+NUM_CENTER_PARAMS; // In case we did not go through the loops if (m_intrinsics_opts.float_distortion_params(c) && !(m_intrinsics_opts.distortion_shared && (c > 0))) { double* ptr = get_intrinsic_distortion_ptr(c); for (int i = 0; i < m_max_num_dist_params; i++) { percent = static_cast(dist(g_rand_gen))/DENOM; if (intrinsics_index < num_intrinsics) { range = intrinsic_limits[2*intrinsics_index+1] - intrinsic_limits[2*intrinsics_index]; scale = percent*range + intrinsic_limits[2*intrinsics_index]; } else scale = percent*DEFAULT_RANGE + DEFAULT_MIN; ptr[i] *= scale; intrinsics_index++; } } // End distortion case } // End camera loop } /// Print stats for optimized ground control points. void BaParams::print_gcp_stats(std::string const& out_prefix, vw::ba::ControlNetwork const& cnet, vw::cartography::Datum const& d) const { std::string gcp_report = out_prefix + "-gcp-report.txt"; vw::vw_out() << "Writing: " << gcp_report << std::endl; std::ofstream gfs(gcp_report.c_str()); gfs.precision(17); gfs << "# Ground control point report\n"; // TODO(oalexan1): Print this to report file! Compare with existing report! gfs << "# input_gcp optimized_gcp diff\n"; int gcp_count = 0; for (int ipt = 0; ipt < num_points(); ipt++) { if (cnet[ipt].type() != vw::ba::ControlPoint::GroundControlPoint) continue; if (get_point_outlier(ipt)) continue; // skip outliers vw::Vector3 input_gcp = cnet[ipt].position(); vw::Vector3 opt_gcp = get_point(ipt); gfs << "GCP count: " << gcp_count << std::endl; gfs << "ECEF: " << input_gcp << ' ' << opt_gcp << ' ' << input_gcp - opt_gcp << std::endl; // Now convert to llh input_gcp = d.cartesian_to_geodetic(input_gcp); opt_gcp = d.cartesian_to_geodetic(opt_gcp); gfs << "Lon-lat-height: " << input_gcp << ' ' << opt_gcp << ' ' << input_gcp - opt_gcp << std::endl; gfs << "\n"; gcp_count++; } gfs.close(); } void BaParams::record_points_to_kml(const std::string &kml_path, const vw::cartography::Datum& datum, size_t skip, const std::string name) { if (datum.name() == asp::UNSPECIFIED_DATUM) { vw::vw_out(vw::WarningMessage) << "No datum specified. Cannot write file: " << kml_path << std::endl; return; } // Open the file vw::vw_out() << "Writing: " << kml_path << std::endl; vw::KMLFile kml(kml_path, name); // Set up a simple point icon with no labels const std::string icon = "http://maps.google.com/mapfiles/kml/shapes/placemark_circle.png"; const bool hide_labels = true; kml.append_style("point", "", 1.0, icon, hide_labels); kml.append_style("point_highlight", "", 1.1, icon, hide_labels); kml.append_stylemap("point_placemark", "point", "point_highlight"); // Loop through the points const bool extrude = true; for (size_t i = 0; i < num_points(); i += skip) { if (get_point_outlier(i)) continue; // skip outliers // Convert the point to GDC coords vw::Vector3 xyz = get_point(i); vw::Vector3 lon_lat_alt = datum.cartesian_to_geodetic(xyz); // Add this to the output file kml.append_placemark(lon_lat_alt.x(), lon_lat_alt.y(), "", "", "point_placemark", lon_lat_alt[2], extrude); } kml.close_kml(); } } // end namespace asp ================================================ FILE: src/asp/Camera/BaParams.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BaParams.h /// #ifndef __ASP_CAMERA_BA_PARAMS_H__ #define __ASP_CAMERA_BA_PARAMS_H__ #include #include namespace vw { namespace cartography { class Datum; } namespace ba { class ControlNetwork; } } #include #include namespace asp { // Shared constants const int PARAMS_PER_POINT = 3; const int NUM_CAMERA_PARAMS = 6; // Position and pose const int NUM_CENTER_PARAMS = 2; // TODO(oalexan1): Use this more widely const int NUM_FOCUS_PARAMS = 1; const int NUM_OPTICAL_BAR_EXTRA_PARAMS = 9; // Stored in the distortion vector /// Structure to fully describe how the intrinsics are being handled. /// - Currently only pinhole cameras support intrinsics in bundle_adjust. struct IntrinsicOptions { // If to share these intrinsics. Can be per group of cameras or for all cameras. bool center_shared; bool focus_shared; bool distortion_shared; // If to float these intrinsics. All, none, or per sensor std::vector float_center, float_focus, float_distortion; bool share_intrinsics_per_sensor; std::vector cam2sensor; // cam index to sensor index, when sharing intrinsics per sensor int num_sensors; // will be nonzero only if sharing intrinsics per sensor is true IntrinsicOptions(); // Control per each group of cameras or for all cameras which intrinsics // should be floated. bool float_optical_center(int cam_index) const; bool float_focal_length(int cam_index) const; bool float_distortion_params(int cam_index) const; }; /// Class to store parameters as they are being bundle adjusted. /// - Currently only supports either one camera or all unique cameras. class BaParams { public: // Constructor BaParams(int num_points, int num_cameras, // Parameters below here only apply to pinhole models. bool using_intrinsics = false, int max_num_dist_params = 0, IntrinsicOptions intrinsics_opts = IntrinsicOptions()); // Copy constructor BaParams(asp::BaParams const& other); // Set all camera position and pose values to zero. void init_cams_as_zero(); // When using the copy functions, the sizes must match! /// Copy one set of values from another instance. void copy_points(asp::BaParams const& other); void copy_cameras(asp::BaParams const& other); void copy_intrinsics(asp::BaParams const& other); void copy_outliers(asp::BaParams const& other); /// Apply a random offset to each camera position. void randomize_cameras(); /// Randomly scale each intrinsic value. void randomize_intrinsics(std::vector const& intrinsic_limits); int num_points () const {return m_num_points; } int num_cameras () const {return m_num_cameras;} int num_intrinsics_per_camera() const {return m_num_intrinsics_per_camera;} int params_per_point () const {return m_params_per_point;} int params_per_camera() const {return m_num_pose_params;} std::vector & get_point_vector() { return m_points_vec; } std::vector & get_camera_vector() { return m_cameras_vec; } std::vector & get_intrinsics_vector() { return m_intrinsics_vec; } double* get_point_ptr(int point_index) { return &(m_points_vec[point_index*m_params_per_point]); } double const* get_point_ptr(int point_index) const { return &(m_points_vec[point_index*m_params_per_point]); } double* get_camera_ptr(int cam_index) { return &(m_cameras_vec[cam_index*m_num_pose_params]); } double const* get_camera_ptr(int cam_index) const { return &(m_cameras_vec[cam_index*m_num_pose_params]); } // These functions are only needed when solving for intrinsics double* get_intrinsic_center_ptr(int cam_index) { if (m_intrinsics_vec.empty()) return 0; return &(m_intrinsics_vec[get_center_offset(cam_index)]); } double const* get_intrinsic_center_ptr(int cam_index) const { if (m_intrinsics_vec.empty()) return 0; return &(m_intrinsics_vec[get_center_offset(cam_index)]); } double* get_intrinsic_focus_ptr(int cam_index) { if (m_intrinsics_vec.empty()) return 0; return &(m_intrinsics_vec[get_focus_offset(cam_index)]); } double const* get_intrinsic_focus_ptr(int cam_index) const{ if (m_intrinsics_vec.empty()) return 0; return &(m_intrinsics_vec[get_focus_offset(cam_index)]); } double* get_intrinsic_distortion_ptr(int cam_index) { if (m_intrinsics_vec.empty()) return 0; return &(m_intrinsics_vec[get_distortion_offset(cam_index)]); } double const* get_intrinsic_distortion_ptr(int cam_index) const{ if (m_intrinsics_vec.empty()) return 0; return &(m_intrinsics_vec[get_distortion_offset(cam_index)]); } // End functions needed when solving for intrinsics void set_point_outlier(int point_index, bool status) { m_outlier_points_vec[point_index] = status; } bool get_point_outlier(int point_index) const { return m_outlier_points_vec[point_index]; } /// Return the number of points flagged as outliers. int get_num_outliers() const { int count = 0; for (size_t i = 0; i < m_num_points; i++) { if (m_outlier_points_vec[i]) ++count; } return count; } /// Get the values for a point vw::Vector3 get_point(int point_index) const{ double const* ptr = get_point_ptr(point_index); vw::Vector3 pt; for (int i = 0; i < 3; i++) pt[i] = ptr[i]; return pt; } /// Update the values for a point void set_point(int point_index, vw::Vector3 const& pt) { double* ptr = get_point_ptr(point_index); for (int i = 0; i < 3; i++) ptr[i] = pt[i]; } /// Print stats for optimized ground control points. void print_gcp_stats(std::string const& out_prefix, vw::ba::ControlNetwork const& cnet, vw::cartography::Datum const& d) const; /// Create a KML file containing the positions of the given points. /// - Points are stored as x,y,z in the points vector up to num_points. /// - Only every skip'th point is recorded to the file. void record_points_to_kml(const std::string &kml_path, const vw::cartography::Datum& datum, size_t skip, const std::string name); /// Compute the offset index in the intrinsics size_t get_center_offset(int cam_index) const; size_t get_focus_offset(int cam_index) const; size_t get_distortion_offset(int cam_index) const; // Not much of a point of having set/get functions for this one int m_max_num_dist_params; private: // Variables int m_num_points, m_num_cameras, m_params_per_point, m_num_pose_params; // m_intrinsics_vec starts out with m_num_shared_intrinsics values which are // shared between all cameras, followed by the per-camera intrinsics for each camera. int m_num_shared_intrinsics, m_num_intrinsics_per_camera; // These store the offset to the focus or distortion data from the start of // either the shared parameters at the start of m_intrinsics_vec or from // the block of intrinsics data for the specified camera. int m_focus_offset, m_distortion_offset; IntrinsicOptions m_intrinsics_opts; // Raw data storage std::vector m_points_vec, m_cameras_vec, m_intrinsics_vec; std::vector m_outlier_points_vec; }; // End class BaParams } // end namespace asp #endif // __ASP_CAMERA_BA_PARAMS_H__ ================================================ FILE: src/asp/Camera/BaseCostFuns.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Cost functions used in bundle adjustment. These need access to the camera // models, so they are stored in the Camera folder. #include namespace asp { // Factory to hide the construction of the CostFunction object from // the client code. ceres::CostFunction* LLHError::Create(vw::Vector3 const& observation_xyz, vw::Vector3 const& sigma, vw::cartography::Datum const& datum) { return (new ceres::NumericDiffCostFunction (new LLHError(observation_xyz, sigma, datum))); } bool LLHError::operator()(const double* point, double* residuals) const { vw::Vector3 observation_llh, point_xyz, point_llh; for (size_t p = 0; p < m_observation_xyz.size(); p++) { point_xyz[p] = double(point[p]); } point_llh = m_datum.cartesian_to_geodetic(point_xyz); observation_llh = m_datum.cartesian_to_geodetic(m_observation_xyz); for (size_t p = 0; p < m_observation_xyz.size(); p++) residuals[p] = (point_llh[p] - observation_llh[p])/m_sigma[p]; // Input units are meters return true; } CamUncertaintyError::CamUncertaintyError(vw::Vector3 const& orig_ctr, double const* orig_adj, vw::Vector2 const& uncertainty, double weight, vw::cartography::Datum const& datum, double camera_position_uncertainty_power): m_orig_ctr(orig_ctr), m_uncertainty(uncertainty), m_weight(weight), m_camera_position_uncertainty_power(camera_position_uncertainty_power) { // m_weight must be positive if (m_weight <= 0) vw::vw_throw(vw::ArgumentErr() << "CamUncertaintyError: Invalid weight: " << m_weight << ". It must be positive.\n"); // The first three parameters are the camera center adjustments. m_orig_adj = vw::Vector3(orig_adj[0], orig_adj[1], orig_adj[2]); // The uncertainty must be positive if (m_uncertainty[0] <= 0 || m_uncertainty[1] <= 0) vw::vw_throw(vw::ArgumentErr() << "CamUncertaintyError: Invalid uncertainty: " << uncertainty << ". All values must be positive.\n"); // The NED coordinate system, for separating horizontal and vertical components vw::Vector3 llh = datum.cartesian_to_geodetic(orig_ctr); vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh); m_EcefToNed = vw::math::inverse(NedToEcef); } // The signed power is a better-behaved version of pow that respects the sign of the input. double signed_power(double val, double power) { if (val < 0) return -pow(-val, power); return pow(val, power); } bool CamUncertaintyError::operator()(const double* cam_adj, double* residuals) const { // The difference between the original and current camera center vw::Vector3 diff; for (size_t p = 0; p < 3; p++) diff[p] = cam_adj[p] - m_orig_adj[p]; // Convert the difference to NED vw::Vector3 NedDir = m_EcefToNed * diff; // Split into horizontal and vertical components vw::Vector2 horiz = subvector(NedDir, 0, 2); double vert = NedDir[2]; // Normalize by uncertainty horiz /= m_uncertainty[0]; vert /= m_uncertainty[1]; double p = m_camera_position_uncertainty_power / 2.0; // Regular sum of squares, by default, which corresponds to p above being 1. // Multiply by sqrt(m_weight), to give the squared residual the correct // weight. This was shown to work to work better than a more abrupt function. if (p == 1.0) { residuals[0] = sqrt(m_weight) * horiz[0]; residuals[1] = sqrt(m_weight) * horiz[1]; residuals[2] = sqrt(m_weight) * vert; } else { // More general power residuals[0] = sqrt(m_weight) * signed_power(horiz[0], p); residuals[1] = sqrt(m_weight) * signed_power(horiz[1], p); residuals[2] = sqrt(m_weight) * signed_power(vert, p); } return true; } } // end namespace asp ================================================ FILE: src/asp/Camera/BaseCostFuns.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as XYZError2represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BaseCostFuns.h // Cost functions shared by bundle adjustment and camera jitter estimation. #ifndef __ASP_CAMERA_BASE_COST_FUNS_H__ #define __ASP_CAMERA_BASE_COST_FUNS_H__ #include #include #include #include #include namespace asp { // A triangulated point with this sigma will be declared fixed. This should be // positive and somewhat reasonable, as it will show up in the cost function, // though, in theory, it should not matter as it shows up as a term like // (x-x0)^2/sigma^2, with x starting as x0 and kept fixed. const double FIXED_GCP_SIGMA = 1e-10; /// A ceres cost function. The residual is the difference between the /// observed 3D point and the current (floating) 3D point, normalized by /// xyz_sigma. struct XYZError { XYZError(vw::Vector3 const& observation, vw::Vector3 const& xyz_sigma): m_observation(observation), m_xyz_sigma(xyz_sigma) { bool is_good = (xyz_sigma[0] > 0 && xyz_sigma[1] > 0 && xyz_sigma[2] > 0); if (!is_good) { // This will also cover NaNs vw::vw_throw(vw::ArgumentErr() << "XYZError: Invalid xyz_sigma: " << xyz_sigma << ". All values must be positive.\n"); } } template bool operator()(const T* point, T* residuals) const { for (size_t p = 0; p < m_observation.size(); p++) residuals[p] = (point[p] - m_observation[p])/m_xyz_sigma[p]; // Units are meters return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(vw::Vector3 const& observation, vw::Vector3 const& xyz_sigma) { return (new ceres::AutoDiffCostFunction (new XYZError(observation, xyz_sigma))); } vw::Vector3 m_observation; vw::Vector3 m_xyz_sigma; }; /// A ceres cost function. The residual is the difference between the /// observed 3D point lon-lat-height, and the current (floating) 3D /// point lon-lat-height, normalized by sigma. Used only for /// ground control points. This has the advantage, unlike /// XYZError, that when the height is not known reliably, /// but lon-lat is, we can, in the GCP file, assign a bigger /// sigma to the latter. struct LLHError { LLHError(vw::Vector3 const& observation_xyz, vw::Vector3 const& sigma, vw::cartography::Datum const& datum): m_observation_xyz(observation_xyz), m_sigma(sigma), m_datum(datum) {} bool operator()(const double* point, double* residuals) const; // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(vw::Vector3 const& observation_xyz, vw::Vector3 const& sigma, vw::cartography::Datum const& datum); vw::Vector3 m_observation_xyz; vw::Vector3 m_sigma; vw::cartography::Datum m_datum; }; /// This cost function imposes a rather hard constraint on camera center /// horizontal and vertical motion. It does so by knowing how many reprojection /// errors exist for this camera and making this cost function big enough to /// overcome then when the motion is going out of bounds. The residual here is /// raised to 4th power and will be squared when added to the cost function. /// Two residuals are computed, for horizontal and vertical motion. struct CamUncertaintyError { CamUncertaintyError(vw::Vector3 const& orig_ctr, double const* orig_adj, vw::Vector2 const& uncertainty, double weight, vw::cartography::Datum const& datum, double camera_position_uncertainty_power); bool operator()(const double* cam_adj, double* residuals) const; // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(vw::Vector3 const& orig_ctr, double const* orig_adj, int param_len, vw::Vector2 const& uncertainty, double weight, vw::cartography::Datum const& datum, double camera_position_uncertainty_power) { // 2 residuals and 3 translation variables. For bundle_adjust must add the // rotation variables, as otherwise CERES says some params have inconsistent // sizes. ceres::RIDDER works better than ceres::CENTRAL for this cost // function, especially when the uncertainty is 0.1 m or less. if (param_len == 3) return (new ceres::NumericDiffCostFunction (new CamUncertaintyError(orig_ctr, orig_adj, uncertainty, weight, datum, camera_position_uncertainty_power))); else if (param_len == 6) return (new ceres::NumericDiffCostFunction (new CamUncertaintyError(orig_ctr, orig_adj, uncertainty, weight, datum, camera_position_uncertainty_power))); else vw::vw_throw(vw::ArgumentErr() << "CamUncertaintyError: Invalid param_len: " << param_len << ". Must be 3 or 6.\n"); } // orig_ctr is the original camera center, orig_cam_ptr is the original // adjustment (resulting in the original center). The uncertainty is // in meters. vw::Vector3 m_orig_ctr; vw::Vector3 m_orig_adj; int m_param_len; vw::Vector2 m_uncertainty; double m_weight; vw::Matrix3x3 m_EcefToNed; double m_camera_position_uncertainty_power; }; } // end namespace asp #endif //__ASP_CAMERA_BASE_COST_FUNS_H__ ================================================ FILE: src/asp/Camera/BundleAdjustCamera.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustCamera.cc /// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::camera; using namespace vw::ba; namespace asp { /// Simple class to manage position/rotation information. /// - This is the data type stored in pc_align output files, /// bundle adjustment files, and the position of pinhole cameras. // Constructors CameraAdjustment::CameraAdjustment() {} CameraAdjustment::CameraAdjustment(double const* array) { this->read_from_array(array); } // Data access vw::Vector3 CameraAdjustment::position() const { return m_position_data; } vw::Quat CameraAdjustment::pose () const { return m_pose_data; } /// Populate from a six element array. void CameraAdjustment::read_from_array(double const* array) { m_position_data = vw::Vector3(array[0], array[1], array[2]); m_pose_data = vw::math::axis_angle_to_quaternion(vw::Vector3(array[3], array[4], array[5])); } /// Populate from an AdjustedCameraModel void CameraAdjustment::copy_from_adjusted_camera (vw::camera::AdjustedCameraModel const& cam) { m_position_data = cam.translation(); m_pose_data = cam.rotation(); } /// Populate from a PinholeModel void CameraAdjustment::copy_from_pinhole(vw::camera::PinholeModel const& cam) { m_position_data = cam.camera_center(); m_pose_data = cam.camera_pose(); } /// Populate from OpticalBarModel void CameraAdjustment::copy_from_optical_bar(vw::camera::OpticalBarModel const& cam) { m_position_data = cam.camera_center(); m_pose_data = cam.camera_pose(); } /// Populate from CSM. Since with CSM we apply adjustments to existing /// cameras, these start as 0. void CameraAdjustment::copy_from_csm(asp::CsmModel const& cam) { // Zero position and identity rotation m_position_data = vw::Vector3(0, 0, 0); vw::Matrix3x3 I; I.set_identity(); m_pose_data = vw::Quat(I); } /// Populate from an adjustment file on disk. void CameraAdjustment::read_from_adjust_file(std::string const& filename) { // Not used, just for the api vw::Vector2 pixel_offset = vw::Vector2(); double scale = 1.0; vw::vw_out() << "Reading camera adjustment: " << filename << std::endl; asp::read_adjustments(filename, m_position_data, m_pose_data, pixel_offset, scale); } /// Pack the data to a six element array. void CameraAdjustment::pack_to_array(double* array) const { vw::Vector3 pose_vec = m_pose_data.axis_angle(); const int VEC_SIZE = 3; for (size_t i = 0; i < VEC_SIZE; i++) { array[i ] = m_position_data[i]; array[i + VEC_SIZE] = pose_vec[i]; } } void pack_pinhole_to_arrays(vw::camera::PinholeModel const& camera, int camera_index, asp::BaParams & param_storage) { double* pos_pose_ptr = param_storage.get_camera_ptr (camera_index); double* center_ptr = param_storage.get_intrinsic_center_ptr (camera_index); double* focus_ptr = param_storage.get_intrinsic_focus_ptr (camera_index); double* distortion_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index); // Handle position and pose CameraAdjustment pos_pose_info; pos_pose_info.copy_from_pinhole(camera); pos_pose_info.pack_to_array(pos_pose_ptr); // We are solving for multipliers to the intrinsic values, so they all start at 1.0. // Center point and focal length center_ptr[0] = 1.0; center_ptr[1] = 1.0; focus_ptr [0] = 1.0; // Lens distortion vw::Vector lens = camera.lens_distortion()->distortion_parameters(); for (size_t i = 0; i < lens.size(); i++) distortion_ptr[i] = 1.0; } void pack_optical_bar_to_arrays(vw::camera::OpticalBarModel const& camera, int camera_index, asp::BaParams & param_storage) { double* pos_pose_ptr = param_storage.get_camera_ptr (camera_index); double* center_ptr = param_storage.get_intrinsic_center_ptr (camera_index); double* focus_ptr = param_storage.get_intrinsic_focus_ptr (camera_index); double* intrinsics_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index); // Handle position and pose CameraAdjustment pos_pose_info; pos_pose_info.copy_from_optical_bar(camera); pos_pose_info.pack_to_array(pos_pose_ptr); // We are solving for multipliers to the intrinsic values, so they all start at 1.0. // Center point and focal length center_ptr[0] = 1.0; center_ptr[1] = 1.0; focus_ptr [0] = 1.0; // Pack the speed, MCF, and scan time into the distortion pointer. for (size_t i = 0; i < asp::NUM_OPTICAL_BAR_EXTRA_PARAMS; i++) intrinsics_ptr[i] = 1.0; } // This does not copy the camera position and orientation void pack_csm_to_arrays(asp::CsmModel const& camera, int camera_index, asp::BaParams & param_storage) { double* pos_pose_ptr = param_storage.get_camera_ptr (camera_index); double* center_ptr = param_storage.get_intrinsic_center_ptr (camera_index); double* focus_ptr = param_storage.get_intrinsic_focus_ptr (camera_index); double* distortion_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index); // Handle position and pose. We start with 0 pose and identity rotation. Nothing // gets copied from camera position and orientation. CameraAdjustment pos_pose_info; pos_pose_info.copy_from_csm(camera); pos_pose_info.pack_to_array(pos_pose_ptr); // We are solving for multipliers to the intrinsic values, so they all start at 1.0. // Center point and focal length center_ptr[0] = 1.0; center_ptr[1] = 1.0; focus_ptr [0] = 1.0; // Distortion for (size_t i = 0; i < camera.distortion().size(); i++) distortion_ptr[i] = 1.0; } /// Given a transform with origin at the planet center, like output by pc_align, /// read the adjustments from param storage, apply this transform on top of /// them, and write the adjustments back to the param storage. Cameras /// do not change. void apply_transform_to_params(vw::Matrix4x4 const& M, asp::BaParams ¶m_storage, std::vector const& cam_ptrs) { for (unsigned i = 0; i < param_storage.num_cameras(); i++) { // Load the current position/pose of this camera. double* cam_ptr = param_storage.get_camera_ptr(i); CameraAdjustment cam_adjust(cam_ptr); // Create the adjusted camera model vw::camera::AdjustedCameraModel cam(cam_ptrs[i], cam_adjust.position(), cam_adjust.pose()); // Apply the transform cam.apply_transform(M); // Copy back the adjustments to the camera array. cam_adjust.copy_from_adjusted_camera(cam); cam_adjust.pack_to_array(cam_ptr); } } // end function apply_transform_to_cameras // This function takes advantage of the fact that when it is called the cam_ptrs // have the same information as is in param_storage! void apply_transform_to_cameras_pinhole(vw::Matrix4x4 const& M, asp::BaParams & param_storage, std::vector const& cam_ptrs) { for (unsigned i = 0; i < param_storage.num_cameras(); i++) { // Apply the transform boost::shared_ptr pin_ptr = boost::dynamic_pointer_cast(cam_ptrs[i]); pin_ptr->apply_transform(M); // Write out to param_storage pack_pinhole_to_arrays(*pin_ptr, i, param_storage); } } // end function apply_transform_to_cameras_pinhole // This function takes advantage of the fact that when it is called the cam_ptrs have the same // information as is in param_storage. void apply_transform_to_cameras_optical_bar(vw::Matrix4x4 const& M, asp::BaParams & param_storage, std::vector const& cam_ptrs) { // Convert the transform format vw::Matrix3x3 R = submatrix(M, 0, 0, 3, 3); vw::Vector3 T; for (int r = 0; r < 3; r++) T[r] = M(r, 3); double scale = pow(det(R), 1.0/3.0); for (size_t r = 0; r < R.rows(); r++) for (size_t c = 0; c < R.cols(); c++) R(r, c) /= scale; for (unsigned i = 0; i < param_storage.num_cameras(); i++) { // Apply the transform boost::shared_ptr bar_ptr = boost::dynamic_pointer_cast(cam_ptrs[i]); bar_ptr->apply_transform(R, T, scale); // Write out to param_storage pack_optical_bar_to_arrays(*bar_ptr, i, param_storage); } } // end function apply_transform_to_cameras_optical_bar // This function takes advantage of the fact that when it is called the cam_ptrs // have the same information as is in param_storage. // This applies the transform to the camera inline, but does not copy // the camera position and orientation to the arrays. void apply_transform_to_cameras_csm(vw::Matrix4x4 const& M, asp::BaParams & param_storage, std::vector const& cam_ptrs) { for (unsigned i = 0; i < param_storage.num_cameras(); i++) { // Apply the transform boost::shared_ptr csm_ptr = boost::dynamic_pointer_cast(cam_ptrs[i]); if (csm_ptr == NULL) vw_throw(ArgumentErr() << "Expecting a CSM camera.\n"); csm_ptr->applyTransform(M); // Write out to param_storage. This does not copy camera position // and orientation. The adjustment stays as 0 pose and identity rotation. // That is why the transform M does not get applied twice. pack_csm_to_arrays(*csm_ptr, i, param_storage); } } // end function apply_transform_to_cameras_csm /// Apply a scale-rotate-translate transform to pinhole cameras and control points void apply_rigid_transform(vw::Matrix3x3 const & rotation, vw::Vector3 const & translation, double scale, std::vector &camera_models, boost::shared_ptr const& cnet) { // Apply the transform to the cameras for (size_t icam = 0; icam < camera_models.size(); icam++) { vw::camera::PinholeModel * pincam = dynamic_cast(camera_models[icam].get()); VW_ASSERT(pincam != NULL, vw::ArgumentErr() << "A pinhole camera expected.\n"); pincam->apply_transform(rotation, translation, scale); } // End loop through cameras // Apply the transform to all of the world points in the ControlNetwork ControlNetwork::iterator iter; for (iter = cnet->begin(); iter != cnet->end(); iter++) { if (iter->type() == ControlPoint::GroundControlPoint) continue; // Don't convert the ground control points! Vector3 position = iter->position(); Vector3 new_position = scale*rotation*position + translation; iter->set_position(new_position); } } // End function ApplyRigidTransform /// Generate a warning if the GCP's are really far from the IP points /// - This is intended to help catch the common lat/lon swap in GCP files. void check_gcp_dists(std::vector const& camera_models, boost::shared_ptr const& cnet_ptr, double forced_triangulation_distance) { // Count the points and triangulate const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias const int num_cnet_points = static_cast(cnet.size()); double gcp_count = 0, ip_count = 0; Vector3 mean_gcp(0, 0, 0); Vector3 mean_ip (0, 0, 0); for (int ipt = 0; ipt < num_cnet_points; ipt++) { if (cnet[ipt].position() == Vector3() || cnet[ipt].size() <= 1) continue; if (cnet[ipt].type() == ControlPoint::GroundControlPoint) { gcp_count += 1.0; mean_gcp += cnet[ipt].position(); } else { // Use triangulation to estimate the position of this control point using // the current set of camera models. ControlPoint cp_new = cnet[ipt]; double minimum_angle = 0; double ans = vw::ba::triangulate_control_point(cp_new, camera_models, minimum_angle, forced_triangulation_distance); if (ans < 0 || cp_new.position() == Vector3()) continue; // Skip points that fail to triangulate ip_count += 1.0; mean_ip += cp_new.position(); } } // End loop through control network points if (ip_count == 0 || gcp_count == 0) return; // Can't do this check if we don't have both point types. // Average the points mean_gcp = mean_gcp / gcp_count; mean_ip = mean_ip / ip_count; double dist = norm_2(mean_ip - mean_gcp); if (dist > 100000) vw_out() << "WARNING: GCPs are over 100 km from the other points. Are your lat/lon GCP coordinates swapped?\n"; } // Initialize the position and orientation of each pinhole camera model using // a least squares error transform to match the provided camera positions. // This function overwrites the camera parameters in-place bool init_pinhole_model_with_camera_positions(boost::shared_ptr const& cnet, std::vector & camera_models, std::vector const& image_files, std::vector const & estimated_camera_gcc) { vw_out() << "Initializing camera positions from input file." << std::endl; // Count the number of matches and check for problems const int num_cameras = image_files.size(); if (int(estimated_camera_gcc.size()) != num_cameras) vw_throw(ArgumentErr() << "No camera matches provided to init function!\n"); vw_out() << "Num cameras: " << num_cameras << std::endl; int num_matches_found = 0; for (int i = 0; i < num_cameras; i++) if (estimated_camera_gcc[i] != Vector3(0,0,0)) ++num_matches_found; vw_out() << "Number of matches found: " << num_matches_found << std::endl; const int MIN_NUM_MATCHES = 3; if (num_matches_found < MIN_NUM_MATCHES) vw_throw(ArgumentErr() << "At least " << MIN_NUM_MATCHES << " camera position matches are required to initialize cameras " << "based on camera positions only.\n"); // Populate matrices containing the current and known camera positions. vw::Matrix points_in(3, num_matches_found), points_out(3, num_matches_found); typedef vw::math::MatrixCol> ColView; int index = 0; for (int i = 0; i < num_cameras; i++) { // Skip cameras with no matching record if (estimated_camera_gcc[i] == Vector3(0,0,0)) continue; // Get the two GCC positions Vector3 gcc_in = camera_models[i]->camera_center(Vector2(0,0)); Vector3 gcc_out = estimated_camera_gcc[i]; // Store in matrices ColView colIn (points_in, index); ColView colOut(points_out, index); colIn = gcc_in; colOut = gcc_out; ++index; } // End matrix populating loop // Call function to compute a 3D affine transform between the two point sets vw::Matrix3x3 rotation; vw::Vector3 translation; double scale; vw::math::find_3D_transform(points_in, points_out, rotation, translation, scale); // Update the camera and point information with the new transform apply_rigid_transform(rotation, translation, scale, camera_models, cnet); return true; } // Given at least two images, each having at least 3 GCP that are not seen in other // images, find and apply a transform to the camera system based on them. void transform_cameras_with_indiv_image_gcp (boost::shared_ptr const& cnet_ptr, std::vector & camera_models) { vw_out() << "Applying transform to cameras given several GCP not shared " << "among the images.\n"; int num_cams = camera_models.size(); // Create pinhole cameras std::vector pinhole_cams; for (int icam = 0; icam < num_cams; icam++) { vw::camera::PinholeModel * pincam = dynamic_cast(camera_models[icam].get()); VW_ASSERT(pincam != NULL, vw::ArgumentErr() << "A pinhole camera expected.\n"); pinhole_cams.push_back(*pincam); } // Extract from the control network each pixel for each camera together // with its xyz. std::vector> xyz; std::vector> pix; xyz.resize(num_cams); pix.resize(num_cams); const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias for (int ipt = 0; ipt < cnet.size(); ipt++) { // Keep only gcp if (cnet[ipt].type() != ControlPoint::GroundControlPoint) continue; for (auto measure = cnet[ipt].begin(); measure != cnet[ipt].end(); measure++) { int cam_it = measure->image_id(); if (cam_it < 0 || cam_it >= num_cams) vw_throw(ArgumentErr() << "Error: cnet index out of range.\n"); Vector2 pixel(measure->position()[0], measure->position()[1]); pix[cam_it].push_back(pixel); xyz[cam_it].push_back(cnet[ipt].position()); } } Matrix3x3 rotation; Vector3 translation; double scale; vw::camera::align_cameras_to_ground(xyz, pix, pinhole_cams, rotation, translation, scale); // Update the camera and point information with the new transform vw_out() << "Applying transform based on GCP:\n"; vw_out() << "Rotation: " << rotation << "\n"; vw_out() << "Translation: " << translation << "\n"; vw_out() << "Scale: " << scale << "\n"; apply_rigid_transform(rotation, translation, scale, camera_models, cnet_ptr); } /// Initialize the position and orientation of each pinhole camera model using /// a least squares error transform to match the provided control points file. /// This function overwrites the camera parameters in-place. It works /// if at least three GCP are seen in no less than two images. void transform_cameras_with_shared_gcp( boost::shared_ptr const& cnet_ptr, std::vector & camera_models) { vw_out() << "Applying transform to cameras given several GCP shared among the images.\n"; const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias // Verify that all cameras are pinhole for (size_t icam = 0; icam < camera_models.size(); icam++) { vw::camera::PinholeModel * pincam = dynamic_cast(camera_models[icam].get()); VW_ASSERT(pincam != NULL, vw::ArgumentErr() << "A pinhole camera expected.\n"); } // Put the good ground control points in a vector. int num_cnet_points = cnet.size(); std::vector in_xyz, out_xyz; int num_gcp = 0; int num_good_gcp = 0; for (int ipt = 0; ipt < num_cnet_points; ipt++) { if (cnet[ipt].type() != ControlPoint::GroundControlPoint) continue; num_gcp++; // Use triangulation to estimate the position of this control point using // the current set of camera models. ControlPoint untrans_cp = cnet[ipt]; double minimum_angle = 1.0e-3; // Likely this is too small for a good GCP, but better than 0. double forced_triangulation_distance = -1.0; double err = vw::ba::triangulate_control_point(untrans_cp, camera_models, minimum_angle, forced_triangulation_distance); if (untrans_cp.position() != Vector3() && cnet[ipt].position() != Vector3() && err >= 0) { // Store the computed and correct position of this point in_xyz.push_back(untrans_cp.position()); out_xyz.push_back(cnet[ipt].position()); num_good_gcp++; // Only count points that triangulate } else { vw_out() << "Discarding GCP that could not be triangulated: " << cnet[ipt] << ".\n"; } } // End good GCP counting // Sanity check const int MIN_GCP_COUNT = 3; if (num_good_gcp < MIN_GCP_COUNT) { vw_out() << "Num GCP = " << num_gcp << std::endl; vw_out() << "Num valid GCP = " << num_good_gcp << std::endl; vw_throw(ArgumentErr() << "Not enough valid GCPs to apply a transform to the cameras. " << "You may need to use --transform-cameras-using-gcp.\n"); } // Copy these points to a matrix as required by the API about to be used. vw::Matrix points_in(3, num_good_gcp), points_out(3, num_good_gcp); typedef vw::math::MatrixCol> ColView; for (size_t ipt = 0; ipt < in_xyz.size(); ipt++) { ColView colIn (points_in, ipt); ColView colOut(points_out, ipt); colIn = in_xyz[ipt]; colOut = out_xyz[ipt]; } // End loop through control network points // Call function to compute a 3D affine transform between the two point sets vw::Matrix3x3 rotation; vw::Vector3 translation; double scale; vw::math::find_3D_transform(points_in, points_out, rotation, translation, scale); // Update the camera and point information with the new transform vw_out() << "Applying transform based on GCP:\n"; vw_out() << "Rotation: " << rotation << "\n"; vw_out() << "Translation: " << translation << "\n"; vw_out() << "Scale: " << scale << "\n"; vw_out() << "This transform can be disabled with --disable-pinhole-gcp-init.\n"; apply_rigid_transform(rotation, translation, scale, camera_models, cnet_ptr); return; } // End function transform_cameras_with_shared_gcp /// Initialize the position and orientation of a pinhole camera model using /// GCP. It invokes OpenCV's PnP functionality. void init_camera_using_gcp(boost::shared_ptr const& cnet_ptr, std::vector & camera_models) { // Sanity check if (camera_models.size() != 1) vw::vw_throw(vw::ArgumentErr() << "Cannot initialize more than a camera at a time using GCP. " << "Consider using --transform-cameras-with-shared-gcp or " << "--transform-cameras-using-gcp.\n"); vw_out() << "Initializing a Pinhole camera using GCP.\n"; int icam = 0; vw::camera::PinholeModel * pincam = dynamic_cast(camera_models[icam].get()); VW_ASSERT(pincam != NULL, vw::ArgumentErr() << "A pinhole camera expected.\n"); std::vector pixel_observations; std::vector ground_points; const ControlNetwork & cnet = *cnet_ptr.get(); // Helper alias for (int ipt = 0; ipt < cnet.size(); ipt++) { // Loop through all the ground control points only if (cnet[ipt].type() != ControlPoint::GroundControlPoint) continue; ground_points.push_back(cnet[ipt].position()); int num_meas = 0; for (ControlPoint::const_iterator measure = cnet[ipt].begin(); measure != cnet[ipt].end(); measure++) { int cam_it = measure->image_id(); if (cam_it != 0) vw_throw(ArgumentErr() << "Error: Expecting GCP for a single camera.\n"); Vector2 pixel(measure->position()[0], measure->position()[1]); num_meas++; if (num_meas > 1) vw::vw_throw(vw::ArgumentErr() << "Expecting a single camera pixel per gcp.\n"); pixel_observations.push_back(pixel); } } // Update the camera pose with given observations and intrinsics asp::findCameraPose(ground_points, pixel_observations, *pincam); return; } // End function init_camera_using_gcp // Given an input pinhole camera and param changes, apply those, returning // the new camera. Note that all intrinsic parameters are stored as multipliers // in asp::BaParams. vw::camera::PinholeModel transformedPinholeCamera(int camera_index, asp::BaParams const& param_storage, vw::camera::PinholeModel const& in_cam) { // Start by making a copy of the camera. Note that this does not make a copy of the // distortion params, as that's a pointer. So will have to make a copy of it further down. vw::camera::PinholeModel out_cam = in_cam; double const* pos_pose_ptr = param_storage.get_camera_ptr(camera_index); double const* center_ptr = param_storage.get_intrinsic_center_ptr (camera_index); double const* focus_ptr = param_storage.get_intrinsic_focus_ptr (camera_index); double const* distortion_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index); // Update position and pose CameraAdjustment pos_pose_info(pos_pose_ptr); out_cam.set_camera_center(pos_pose_info.position()); out_cam.set_camera_pose(pos_pose_info.pose()); // Update the lens distortion parameters. Note how we make a new copy of the // distortion object. boost::shared_ptr distortion = out_cam.lens_distortion()->copy(); vw::Vector lens = distortion->distortion_parameters(); for (size_t i = 0; i < lens.size(); i++) lens[i] *= distortion_ptr[i]; distortion->set_distortion_parameters(lens); out_cam.set_lens_distortion(distortion.get()); // Update the center and focus Vector2 old_center = out_cam.point_offset(); Vector2 old_focus = out_cam.focal_length(); out_cam.set_point_offset(Vector2(center_ptr[0]*old_center[0], center_ptr[1]*old_center[1]), false); // do not update the internals yet double new_focus = old_focus[0]*focus_ptr[0]; // At the last step, recompute the internals given the new values out_cam.set_focal_length(Vector2(new_focus,new_focus), true); return out_cam; } // Given an input optical bar camera and param changes, apply those, returning // the new camera. vw::camera::OpticalBarModel transformedOpticalBarCamera(int camera_index, asp::BaParams const& param_storage, vw::camera::OpticalBarModel const& in_cam) { // Start by making a copy of the camera vw::camera::OpticalBarModel out_cam = in_cam; double const* pos_pose_ptr = param_storage.get_camera_ptr(camera_index); double const* center_ptr = param_storage.get_intrinsic_center_ptr (camera_index); double const* focus_ptr = param_storage.get_intrinsic_focus_ptr (camera_index); double const* intrinsic_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index); // Update position and pose CameraAdjustment pos_pose_info(pos_pose_ptr); out_cam.set_camera_center(pos_pose_info.position()); out_cam.set_camera_pose (pos_pose_info.pose ()); // All intrinsic parameters are stored as multipliers! // Update the other intrinsic parameters. out_cam.set_speed (out_cam.get_speed()*intrinsic_ptr[0]); out_cam.set_motion_compensation(out_cam.get_motion_compensation()*intrinsic_ptr[1]); out_cam.set_scan_time (out_cam.get_scan_time()*intrinsic_ptr[2]); if (out_cam.get_have_velocity_vec()) { vw::Vector3 vel = out_cam.get_velocity(); vw::Vector3 final_pose = out_cam.get_final_pose(); vel[0] *= intrinsic_ptr[3]; vel[1] *= intrinsic_ptr[4]; vel[2] *= intrinsic_ptr[5]; final_pose[0] *= intrinsic_ptr[6]; final_pose[1] *= intrinsic_ptr[7]; final_pose[2] *= intrinsic_ptr[8]; out_cam.set_velocity(vel); out_cam.set_final_pose(final_pose); } // Update the center and focus Vector2 old_center = out_cam.get_optical_center(); float old_focus = out_cam.get_focal_length(); out_cam.set_optical_center(Vector2(center_ptr[0]*old_center[0], center_ptr[1]*old_center[1])); double new_focus = old_focus*focus_ptr[0]; out_cam.set_focal_length(new_focus); return out_cam; } // Given an input CSM camera, intrinsic and extrinsic param changes, apply // those, returning the new camera. boost::shared_ptr transformedCsmCamera(int camera_index, asp::BaParams const& param_storage, asp::CsmModel const& in_cam) { // Get the latest version of the camera parameters double const* pos_pose_ptr = param_storage.get_camera_ptr(camera_index); double const* center_ptr = param_storage.get_intrinsic_center_ptr (camera_index); double const* focus_ptr = param_storage.get_intrinsic_focus_ptr (camera_index); double const* dist_ptr = param_storage.get_intrinsic_distortion_ptr(camera_index); // Read the position and pose CameraAdjustment correction(pos_pose_ptr); // All intrinsic parameters are stored as multipliers vw::Vector2 optical_center = in_cam.optical_center(); double focal_length = in_cam.focal_length(); optical_center[0] = center_ptr[0] * optical_center[0]; optical_center[1] = center_ptr[1] * optical_center[1]; focal_length = focus_ptr [0] * focal_length; // Update the lens distortion parameters in the new camera. // - These values are also optimized as scale factors. std::vector distortion = in_cam.distortion(); for (size_t i = 0; i < distortion.size(); i++) { // Ensure this approach does not fail when the input distortion is 0. // TODO(oalexan1): This is not enough, however. The user must choose // to manually enter some small fake distortion, maybe on the order // of 1e-8. It is hard to tell what numbers to put below. They should // not be as small as 1e-16 but sometimes 1e-8 (for higher order polynomial // coefficients) may be too much. if (distortion[i] == 0.0) distortion[i] = 1e-16; distortion[i] = dist_ptr[i] * distortion[i]; } // Duplicate the input camera model boost::shared_ptr copy; in_cam.deep_copy(copy); // Update the intrinsics of the copied model copy->set_optical_center(optical_center); copy->set_focal_length(focal_length); copy->set_distortion(distortion); // Form the adjusted camera having the updated position and pose AdjustedCameraModel adj_cam(copy, correction.position(), correction.pose()); // Apply the adjustment to the camera vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform(); copy->applyTransform(ecef_transform); // TODO(oalexan1): Test if adj cam and cam with applied adjustment return same // results return copy; } // Mapproject interest points onto a DEM and find the norm of their // disagreement in meters. It is assumed that dem_georef // was created by bilinear interpolation. The cameras must be with // the latest adjustments applied to them. void calcPairMapprojOffsets(int left_cam_index, int right_cam_index, std::vector const& optimized_cams, std::vector const& left_ip, std::vector const& right_ip, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& interp_dem, // Will append below std::vector> & mapprojPoints, std::vector & mapprojOffsets) { // Wipe mapprojOffsets mapprojOffsets.clear(); // Will append to mapprojPoints, so don't wipe it for (size_t ip_it = 0; ip_it < left_ip.size(); ip_it++) { bool treat_nodata_as_zero = false; bool has_intersection = false; double height_error_tol = 0.001; // 1 mm should be enough double max_abs_tol = 1e-14; // abs cost fun change b/w iterations double max_rel_tol = 1e-14; int num_max_iter = 50; // Using many iterations can be very slow Vector3 xyz_guess; Vector2 left_pix(left_ip[ip_it].x, left_ip[ip_it].y); Vector3 left_dem_xyz = vw::cartography::camera_pixel_to_dem_xyz (optimized_cams[left_cam_index]->camera_center(left_pix), optimized_cams[left_cam_index]->pixel_to_vector(left_pix), vw::pixel_cast>(interp_dem), dem_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); if (!has_intersection) continue; // Do the same for right. Use left pixel as initial guess xyz_guess = left_dem_xyz; Vector2 right_pix(right_ip[ip_it].x, right_ip[ip_it].y); Vector3 right_dem_xyz = vw::cartography::camera_pixel_to_dem_xyz (optimized_cams[right_cam_index]->camera_center(right_pix), optimized_cams[right_cam_index]->pixel_to_vector(right_pix), vw::pixel_cast>(interp_dem), dem_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); if (!has_intersection) continue; Vector3 mid_pt = (left_dem_xyz + right_dem_xyz)/2.0; double dist = norm_2(left_dem_xyz - right_dem_xyz); // Keep in the same structure both the midpoint between these two // mapprojected ip, as lon-lat,height, and their distance, as // later the bookkeeping of mapprojOffsets will be different. // Float precision is enough, and will save on memory. Vector point; subvector(point, 0, 3) = dem_georef.datum().cartesian_to_geodetic(mid_pt); point[3] = dist; mapprojPoints.push_back(point); mapprojOffsets.push_back(dist); } return; } // This is called either with original or inlier ip void processMatchPair(size_t left_index, size_t right_index, std::vector const& left_ip, std::vector const& right_ip, std::vector const& optimized_cams, vw::cartography::GeoReference const& mapproj_dem_georef, vw::ImageViewRef> const& interp_mapproj_dem, vw::cartography::Datum const& datum, bool save_mapproj_match_points_offsets, bool propagate_errors, vw::Vector const& horizontal_stddev_vec, // Outputs // Will append to entities below std::vector & convAngles, std::vector> & mapprojPoints, std::vector & mapprojOffsets, std::vector> & mapprojOffsetsPerCam, std::vector & horizVertErrors) { convAngles.push_back(asp::MatchPairStats()); // add an element, then populate it std::vector sorted_angles; asp::convergence_angles(optimized_cams[left_index].get(), optimized_cams[right_index].get(), left_ip, right_ip, sorted_angles); convAngles.back().populate(left_index, right_index, sorted_angles); if (save_mapproj_match_points_offsets) { std::vector localMapprojOffsets; asp::calcPairMapprojOffsets(left_index, right_index, optimized_cams, left_ip, right_ip, mapproj_dem_georef, interp_mapproj_dem, mapprojPoints, // will append here localMapprojOffsets); mapprojOffsets.push_back(asp::MatchPairStats()); // add an elem, then populate it mapprojOffsets.back().populate(left_index, right_index, localMapprojOffsets); for (size_t map_it = 0; map_it < localMapprojOffsets.size(); map_it++) { mapprojOffsetsPerCam[left_index].push_back(localMapprojOffsets[map_it]); mapprojOffsetsPerCam[right_index].push_back(localMapprojOffsets[map_it]); } } if (propagate_errors) { // Ensure her that proper values are passed for the input std devs horizVertErrors.push_back(asp::HorizVertErrorStats()); // add an elem, then populate it asp::propagatedErrorStats(left_index, right_index, optimized_cams[left_index].get(), optimized_cams[right_index].get(), left_ip, right_ip, horizontal_stddev_vec[left_index], horizontal_stddev_vec[right_index], datum, horizVertErrors.back()); } return; } // Calculate convergence angles. Remove the outliers flagged earlier, // if remove_outliers is true. Compute offsets of mapprojected matches, // if a DEM is given. These are done together as they rely on // reloading interest point matches, which is expensive so the matches // are used for both operations. void matchFilesProcessing(vw::ba::ControlNetwork const& cnet, asp::BaBaseOptions const& opt, std::vector const& optimized_cams, bool remove_outliers, std::set const& outliers, std::string const& mapproj_dem, bool propagate_errors, vw::Vector const& horizontal_stddev_vec, bool save_clean_matches, std::map, std::string> const& match_files, bool matches_as_txt) { vw_out() << "Creating reports.\n"; std::vector> mapprojPoints; // all points, not just stats std::vector convAngles, mapprojOffsets; std::vector> mapprojOffsetsPerCam; std::vector horizVertErrors; // Wipe the outputs mapprojPoints.clear(); convAngles.clear(); mapprojOffsets.clear(); mapprojOffsetsPerCam.clear(); horizVertErrors.clear(); bool save_mapproj_match_points_offsets = (!mapproj_dem.empty()); vw::cartography::GeoReference mapproj_dem_georef; ImageViewRef> interp_mapproj_dem; if (save_mapproj_match_points_offsets) asp::create_interp_dem(mapproj_dem, mapproj_dem_georef, interp_mapproj_dem); int num_cameras = opt.image_files.size(); mapprojOffsetsPerCam.resize(num_cameras); // Iterate over the control network, and, for each inlier pair of matches, // remember what pair it is from. Needed only if there is outlier filtering // or matches were read from an isis cnet. // TODO(oalexan1): This uses a lot of memory. Need to keep just indices, // somehow, not quadruplets of floats. // TODO(oalexan1): Make this into a function. typedef std::tuple Quadruplet; std::map, std::set> match_map; if (remove_outliers || !opt.isis_cnet.empty() || !opt.nvm.empty()) { for (int ipt = 0; ipt < cnet.size(); ipt++) { // Skip outliers if (outliers.find(ipt) != outliers.end()) continue; // Skip gcp if (cnet[ipt].type() == ControlPoint::GroundControlPoint) continue; for (auto m1 = cnet[ipt].begin(); m1 != cnet[ipt].end(); m1++) { for (auto m2 = cnet[ipt].begin(); m2 != cnet[ipt].end(); m2++) { int left_index = m1->image_id(); int right_index = m2->image_id(); // Can have left_index > right_index if (left_index == right_index) continue; match_map[std::make_pair(left_index, right_index)].insert (Quadruplet(m1->position()[0], m1->position()[1], m2->position()[0], m2->position()[1])); } } } } // If we read the matches from an ISIS cnet or nvm, there are no match files. // Then create them. std::map, std::string> local_match_files = match_files; if (opt.isis_cnet != "" || opt.nvm != "") { // iterate over match pairs local_match_files.clear(); for (auto const& match_pair: match_map) { int left_index = match_pair.first.first; int right_index = match_pair.first.second; // When creating match files from scratch, let the first index // be less than the second. if (left_index > right_index) continue; std::string match_file = vw::ip::match_filename(opt.out_prefix, opt.image_files[left_index], opt.image_files[right_index], matches_as_txt); local_match_files[std::make_pair(left_index, right_index)] = match_file; } } // Work on individual image pairs for (const auto& match_it: local_match_files) { std::pair cam_pair = match_it.first; std::string match_file = match_it.second; size_t left_index = cam_pair.first; size_t right_index = cam_pair.second; if (left_index == right_index) vw::vw_throw(vw::ArgumentErr() << "Bookkeeping failure. Cannot have interest point " << "matches between an image and itself.\n"); std::vector orig_left_ip, orig_right_ip; if (opt.isis_cnet != "" || opt.nvm != "") { // Must create the matches from the cnet. auto & match_pair = match_map[std::make_pair(left_index, right_index)]; // alias // Iterate over this set of quadruplets, and build matches for (auto const& q: match_pair) { double s = 1.0; // scale orig_left_ip.push_back(vw::ip::InterestPoint(std::get<0>(q), std::get<1>(q), s)); orig_right_ip.push_back(vw::ip::InterestPoint(std::get<2>(q), std::get<3>(q), s)); } // Write the matches formed from the cnet to disk if (opt.output_cnet_type == "match-files") { vw::vw_out() << "Writing: " << match_file << "\n"; vw::ip::write_match_file(match_file, orig_left_ip, orig_right_ip, matches_as_txt); } } else { // Read existing matches. Skip over match files that don't exist. if (!boost::filesystem::exists(match_file)) { vw_out() << "Skipping non-existent match file: " << match_file << "\n"; continue; } // Read the original IP, to ensure later we write to disk only // the subset of the IP from the control network which // are part of these original ones. vw::ip::read_match_file(match_file, orig_left_ip, orig_right_ip, matches_as_txt); } // Create a new convergence angle storage struct asp::MatchPairStats & convAngle = convAngles.back(); // alias if (!remove_outliers) { // Do some processing with orig ip. Otherwise this will be done below // with the inlier ip. processMatchPair(left_index, right_index, orig_left_ip, orig_right_ip, optimized_cams, mapproj_dem_georef, interp_mapproj_dem, opt.datum, save_mapproj_match_points_offsets, propagate_errors, horizontal_stddev_vec, // Will append to entities below convAngles, mapprojPoints, mapprojOffsets, mapprojOffsetsPerCam, horizVertErrors); // Since no outliers are removed, nothing else to do continue; } // Keep only inliers and non-gcp. GCP are used in optimization but are not // part of the originally found interest point matches. std::vector left_ip, right_ip; for (size_t ip_iter = 0; ip_iter < orig_left_ip.size(); ip_iter++) { Quadruplet q(orig_left_ip[ip_iter].x, orig_left_ip[ip_iter].y, orig_right_ip[ip_iter].x, orig_right_ip[ip_iter].y); auto & match_pair = match_map[std::make_pair(left_index, right_index)]; // alias if (match_pair.find(q) == match_pair.end()) continue; // We do not copy descriptors, those take storage left_ip.push_back(ip::InterestPoint(orig_left_ip[ip_iter].x, orig_left_ip[ip_iter].y, orig_left_ip[ip_iter].scale)); right_ip.push_back(ip::InterestPoint(orig_right_ip[ip_iter].x, orig_right_ip[ip_iter].y, orig_right_ip[ip_iter].scale)); } // Filter by disparity // TODO(oalexan1): Note that this does not update the outliers set. Likely this // processing needs to move where other outlier filtering logic is. bool quiet = true; // Otherwise too many messages are printed if (opt.remove_outliers_params[0] > 0 && opt.remove_outliers_params[1] > 0.0) { // The typical value of 75 for opt.remove_outliers_params[1] may be too low. // Adjust it. pct = 75 becomes pct = 90. pct = 100 becomes pct = 100. So, // if starting under 100, it gets closer to 100 but stays under it. double pct = opt.remove_outliers_params[0]; pct = 100.0 * (pct + 150.0) / 250.0; asp::filter_ip_by_disparity(pct, opt.remove_outliers_params[1], quiet, left_ip, right_ip); } if (num_cameras == 2) { // Compute the coverage fraction Vector2i right_image_size = file_image_size(opt.image_files[1]); int right_ip_width = right_image_size[0]* static_cast(100.0 - std::max(opt.ip_edge_buffer_percent, 0))/100.0; Vector2i ip_size(right_ip_width, right_image_size[1]); double ip_coverage = asp::calc_ip_coverage_fraction(right_ip, ip_size); // Careful with the line below, it gets used in process_icebridge_batch.py. vw_out() << "IP coverage fraction after cleaning = " << ip_coverage << "\n"; } // Process the inlier ip processMatchPair(left_index, right_index, left_ip, right_ip, optimized_cams, mapproj_dem_georef, interp_mapproj_dem, opt.datum, save_mapproj_match_points_offsets, propagate_errors, horizontal_stddev_vec, // Will append to entities below convAngles, mapprojPoints, mapprojOffsets, mapprojOffsetsPerCam, horizVertErrors); if (opt.output_cnet_type != "match-files" || !save_clean_matches) continue; // Do not write match files // Make a clean copy of the file std::string clean_match_file = ip::clean_match_filename(match_file, matches_as_txt); if (opt.clean_match_files_prefix != "") { // Ensure "clean" does not show up twice clean_match_file = match_file; // Write the clean match file in the current dir, not where it was read from clean_match_file.replace(0, opt.clean_match_files_prefix.size(), opt.out_prefix); } else if (opt.match_files_prefix != "") { // Write the clean match file in the current dir, not where it was read from clean_match_file.replace(0, opt.match_files_prefix.size(), opt.out_prefix); } vw_out() << "Saving " << left_ip.size() << " filtered interest points.\n"; vw_out() << "Writing: " << clean_match_file << "\n"; vw::ip::write_match_file(clean_match_file, left_ip, right_ip, matches_as_txt); } // End loop through the match files // Save the produced files std::string conv_angles_file = opt.out_prefix + "-convergence_angles.txt"; asp::saveConvergenceAngles(conv_angles_file, convAngles, opt.image_files); if (!opt.mapproj_dem.empty()) asp::saveMapprojOffsets(opt.out_prefix, mapproj_dem_georef, mapprojPoints, mapprojOffsets, mapprojOffsetsPerCam, // will change opt.image_files); if (opt.propagate_errors) { std::string horiz_vert_errors_file = opt.out_prefix + "-triangulation_uncertainty.txt"; asp::saveHorizVertErrors(horiz_vert_errors_file, horizVertErrors, opt.image_files); } return; } // Find stats of propagated errors void propagatedErrorStats(size_t left_cam_index, size_t right_cam_index, vw::camera::CameraModel const * left_cam, vw::camera::CameraModel const * right_cam, std::vector const& left_ip, std::vector const& right_ip, double stddev1, double stddev2, vw::cartography::Datum const& datum, // Output asp::HorizVertErrorStats & stats) { // Create a stereo model, to be used for triangulation double angle_tol = vw::stereo::StereoModel::robust_1_minus_cos (asp::stereo_settings().min_triangulation_angle*M_PI/180); vw::stereo::StereoModel stereo_model(left_cam, right_cam, angle_tol); // Create space for horiz and vert vectors of size num_ip int num_ip = left_ip.size(); std::vector horiz_errors, vert_errors; // Find the triangulated point and propagate the errors for (int ip_it = 0; ip_it < num_ip; ip_it++) { // Compute the error in the horizontal and vertical directions vw::Vector2 left_pix(left_ip[ip_it].x, left_ip[ip_it].y); vw::Vector2 right_pix(right_ip[ip_it].x, right_ip[ip_it].y); Vector3 triVec(0, 0, 0), errorVec(0, 0, 0); vw::Vector2 outStdev; try { triVec = stereo_model(left_pix, right_pix, errorVec); outStdev = asp::propagateCovariance(triVec, datum, stddev1, stddev2, left_cam, right_cam, left_pix, right_pix); } catch (std::exception const& e) { errorVec = Vector3(0, 0, 0); } if (errorVec == Vector3(0, 0, 0)) continue; // this can happen either because triangulation failed or an exception horiz_errors.push_back(outStdev[0]); vert_errors.push_back(outStdev[1]); } // Initialize the output stats = asp::HorizVertErrorStats(); stats.left_cam_index = left_cam_index; stats.right_cam_index = right_cam_index; if (!horiz_errors.empty()) { stats.num_errors = horiz_errors.size(); stats.horiz_error_mean = vw::math::mean(horiz_errors); stats.vert_error_mean = vw::math::mean(vert_errors); if (horiz_errors.size() > 1) { // This divides by num - 1 stats.horiz_error_stddev = vw::math::standard_deviation(horiz_errors, stats.horiz_error_mean); stats.vert_error_stddev = vw::math::standard_deviation(vert_errors, stats.vert_error_mean); } // Leave this for the last stats.horiz_error_median = vw::math::destructive_median(horiz_errors); stats.vert_error_median = vw::math::destructive_median(vert_errors); } return; } // End function propagatedErrorStats } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustCamera.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustCamera.h /// /// Camera logic used in bundle_adjust. It is kept here as it may be /// expected to make use of all cameras supported by ASP. // Code which needs the stereo session should go to // asp/Sessions/CameraUtils.cc. Lower-level code which is not so tied // to data structures and options used in bundle_adjust can go to // BundleAdjustUtils.cc. #ifndef __BUNDLE_ADJUST_CAMERA_H__ #define __BUNDLE_ADJUST_CAMERA_H__ #include #include #include #include #include #include #include #include #include #include #include namespace vw { namespace ip { class InterestPoint; } namespace camera { class PinholeModel; class OpticalBarModel; class AdjustedCameraModel; } } namespace asp { // A structure to hold percentiles of given sorted values. This sorts the inputs. // The input can be float or double. We will keep the result as double. struct MatchPairStats { int left_cam_index, right_cam_index, num_vals; double val25, val50, val75, val85, val95; MatchPairStats(): left_cam_index(0), right_cam_index(0), num_vals(0), val25(0), val50(0), val75(0), val85(0), val95(0) {} template void populate(int left_index, int right_index, std::vector & vals) { std::sort(vals.begin(), vals.end()); left_cam_index = left_index; right_cam_index = right_index; num_vals = vals.size(); if (num_vals > 0) { val25 = vals[0.25*num_vals]; val50 = vals[0.50*num_vals]; val75 = vals[0.75*num_vals]; val85 = vals[0.85*num_vals]; val95 = vals[0.95*num_vals]; } } }; struct HorizVertErrorStats { int left_cam_index, right_cam_index; float horiz_error_median, vert_error_median; float horiz_error_mean, vert_error_mean; float horiz_error_stddev, vert_error_stddev; int num_errors; HorizVertErrorStats(): left_cam_index(0), right_cam_index(0), horiz_error_median(0), vert_error_median(0), horiz_error_mean(0), vert_error_mean(0), horiz_error_stddev(0), vert_error_stddev(0), num_errors(0) {} }; // When distortion params are shared, their number must agree void distortion_sanity_check(std::vector const& num_dist_params, IntrinsicOptions const& intrinsics_opts, std::vector const& intrinsics_limits); // Read image and camera lists. Can have several comma-separated lists // in image_list and camera_list, when sharing intrinsics per sensor. void read_image_cam_lists(std::string const& image_list, std::string const& camera_list, std::vector & images, std::vector & cameras, asp::IntrinsicOptions & intrinsics_opts); /// Load all of the reference disparities specified in the input text file /// and store them in the vectors. Return the number loaded. int loadRefDisp(std::string const& disp_list_filename, std::vector>> & disp_vec, std::vector>> & interp_disp); // Mapproject interest points onto a DEM and find the norm of their // disagreement in meters. It is assumed that dem_georef // was created by bilinear interpolation. The cameras must be with // the latest adjustments applied to them. void calcPairMapprojOffsets(int left_cam_index, int right_cam_index, std::vector const& optimized_cams, std::vector const& left_ip, std::vector const& right_ip, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& interp_dem, // Will append below std::vector> & mapprojPoints, std::vector & mapprojOffsets); /// Simple class to manage position/rotation information. /// - This is the data type stored in pc_align output files, /// bundle adjustment files, and the position of pinhole cameras. class CameraAdjustment { public: // Constructors CameraAdjustment(); CameraAdjustment(double const* array); // Data access vw::Vector3 position() const; vw::Quat pose () const; /// Populate from a six element array. void read_from_array(double const* array); /// Populate from an AdjustedCameraModel void copy_from_adjusted_camera(vw::camera::AdjustedCameraModel const& cam); /// Populate from a PinholeModel void copy_from_pinhole(vw::camera::PinholeModel const& cam); /// Populate from OpticalBarModel void copy_from_optical_bar(vw::camera::OpticalBarModel const& cam); /// Populate from CSM. Since with CSM we apply adjustments to existing /// cameras, these start as 0. void copy_from_csm(asp::CsmModel const& cam); /// Populate from an adjustment file on disk. void read_from_adjust_file(std::string const& filename); /// Pack the data to a six element array. void pack_to_array(double* array) const; private: vw::Vector3 m_position_data; vw::Quat m_pose_data; }; // End class CameraAdjustment /// Packs info from various camera models into the provided arrays. /// - It is up to the caller to make sure the arrays are properly sized. void pack_pinhole_to_arrays(vw::camera::PinholeModel const& camera, int camera_index, asp::BaParams & param_storage); void pack_optical_bar_to_arrays(vw::camera::OpticalBarModel const& camera, int camera_index, asp::BaParams & param_storage); // This does not copy the camera position and orientation void pack_csm_to_arrays(asp::CsmModel const& camera, int camera_index, asp::BaParams & param_storage); // Given an input pinhole camera and param changes, apply those, returning // the new camera. vw::camera::PinholeModel transformedPinholeCamera(int camera_index, asp::BaParams const& param_storage, vw::camera::PinholeModel const& in_cam); // Given an input optical bar camera and param changes, apply those, returning // the new camera. vw::camera::OpticalBarModel transformedOpticalBarCamera(int camera_index, asp::BaParams const& param_storage, vw::camera::OpticalBarModel const& in_cam); // Given an input CSM camera and param changes, apply those, returning // the new camera. boost::shared_ptr transformedCsmCamera(int camera_index, asp::BaParams const& param_storage, asp::CsmModel const& in_cam); /// Given a transform with origin at the planet center, like output by pc_align, /// read the adjustments from param storage, apply this transform on top of /// them, and write the adjustments back to the param storage. Cameras /// do not change. void apply_transform_to_params(vw::Matrix4x4 const& M, asp::BaParams ¶m_storage, std::vector const& cam_ptrs); // This function takes advantage of the fact that when it is called the cam_ptrs have the same // information as is in param_storage! void apply_transform_to_cameras_pinhole(vw::Matrix4x4 const& M, asp::BaParams & param_storage, std::vector const& cam_ptrs); // This function takes advantage of the fact that when it is called the cam_ptrs have the same // information as is in param_storage! void apply_transform_to_cameras_optical_bar(vw::Matrix4x4 const& M, asp::BaParams & param_storage, std::vector const& cam_ptrs); void apply_transform_to_cameras_csm(vw::Matrix4x4 const& M, asp::BaParams & param_storage, std::vector const& cam_ptrs); /// Apply a scale-rotate-translate transform to pinhole cameras and control points void apply_rigid_transform(vw::Matrix3x3 const & rotation, vw::Vector3 const & translation, double scale, std::vector &camera_models, boost::shared_ptr const& cnet); /// Generate a warning if the GCP's are really far from the IP points /// - This is intended to help catch the common lat/lon swap in GCP files. void check_gcp_dists(std::vector const& camera_models, boost::shared_ptr const& cnet_ptr, double forced_triangulation_distance); /// Initialize the position and orientation of each pinhole camera model using /// a least squares error transform to match the provided camera positions. /// - This function overwrites the camera parameters in-place bool init_pinhole_model_with_camera_positions (boost::shared_ptr const& cnet, std::vector & camera_models, std::vector const& image_files, std::vector const & estimated_camera_gcc); /// Initialize the position and orientation of a pinhole camera model using /// GCP. It invokes OpenCV's PnP functionality. void init_camera_using_gcp(boost::shared_ptr const& cnet_ptr, std::vector & camera_models); /// Initialize the position and orientation of each pinhole camera model using /// a least squares error transform to match the provided control points file. /// This function overwrites the camera parameters in-place. It works /// if at least three GCP are seen in no less than two images. void transform_cameras_with_shared_gcp(boost::shared_ptr const& cnet_ptr, std::vector & camera_models); // Given at least two images, each having at least 3 GCP that are not seen in other // images, find and apply a transform to the camera system based on them. void transform_cameras_with_indiv_image_gcp (boost::shared_ptr const& cnet_ptr, std::vector & camera_models); // TODO(oalexan1): Move the asp namespace to encompass the whole header file // Save convergence angle percentiles for each image pair having matches void saveConvergenceAngles(std::string const& conv_angles_file, std::vector const& convAngles, std::vector const& imageFiles); // Save propagated horizontal and vertical errors void saveHorizVertErrors(std::string const& horiz_vert_errors_file, std::vector const& horizVertErrors, std::vector const& imageFiles); // Save mapprojected matches offsets for each image pair having matches void saveMapprojOffsets(std::string const& out_prefix, vw::cartography::GeoReference const& mapproj_dem_georef, std::vector> const& mapprojPoints, std::vector const& mapprojOffsets, std::vector> & mapprojOffsetsPerCam, std::vector const& imageFiles); // Write a pinhole camera file to disk after updating the intrinsics and // extrinsics. Return the path to the saved file. std::string savePinholeCam(asp::BaBaseOptions const& opt, int icam, vw::cartography::Datum const& datum, asp::BaParams const& param_storage); // Write an optical bar camera file to disk after updating the intrinsics and // extrinsics. Return the path to the saved file. std::string saveOpticalBarCam(asp::BaBaseOptions const& opt, int icam, vw::cartography::Datum const& datum, asp::BaParams const& param_storage); // Write a CSM camera file to disk. Assumes that the intrinsics are optimized. std::string saveCsmCamUpdateIntr(asp::BaBaseOptions const& opt, int icam, vw::cartography::Datum const& datum, asp::BaParams const& param_storage); // Write a camera adjustment file to disk, and potentially a camera file with // the adjustments applied to it. Return the path to the saved file. std::string saveAdjustedCam(asp::BaBaseOptions const& opt, int icam, asp::BaParams const& param_storage); // Write updated camera models to disk void saveUpdatedCameras(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage); // Save CSM cameras void saveCsmCameras(std::string const& out_prefix, std::string const& stereo_session, std::vector const& image_files, std::vector const& camera_files, std::vector const& camera_models, bool update_isis_cubes_with_csm_state); // Calculate convergence angles. Remove the outliers flagged earlier, // if remove_outliers is true. Compute offsets of mapprojected matches, // if a DEM is given. These are done together as they rely on // reloading interest point matches, which is expensive so the matches // are used for both operations. void matchFilesProcessing(vw::ba::ControlNetwork const& cnet, asp::BaBaseOptions const& opt, std::vector const& optimized_cams, bool remove_outliers, std::set const& outliers, std::string const& mapproj_dem, bool propagate_errors, vw::Vector const& horizontal_stddev_vec, bool save_clean_matches, std::map, std::string> const& match_files, bool matches_as_txt); /// This is for the BundleAdjustmentModel class where the camera parameters /// are a rotation/offset that is applied on top of the existing camera model. /// First read initial adjustments, if any, and apply perhaps a pc_align transform. /// We assume the initial transform was already read and validated. bool init_cams(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector & new_cam_models); /// Specialization for pinhole cameras. bool init_cams_pinhole(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector & new_cam_models); // TODO: Share more code with the similar pinhole case. /// Specialization for optical bar cameras. bool init_cams_optical_bar(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector &new_cam_models); // TODO: Share more code with the similar pinhole case. /// Specialization for CSM cameras. bool init_cams_csm(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector &new_cam_models); // Save pinhole camera positions and orientations in a single file. // Only works with Pinhole cameras. void saveCameraReport(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage, vw::cartography::Datum const& datum, std::string const& prefix); /// For each option, the string must include a subset of the entries: /// "focal_length, optical_center, distortion_params" /// - Need the extra boolean to handle the case where --intrinsics-to-share /// is provided as "" in order to share none of them. void load_intrinsics_options(bool solve_intrinsics, bool shared_is_specified, std::string intrinsics_to_float_str, // make a copy std::string intrinsics_to_share_str, // make a copy asp::IntrinsicOptions & intrinsics_options); /// Attempt to automatically create the overlap list file estimated /// footprints for each of the input images. /// - Currently this only supports cameras with Worldview style XML files. void auto_build_overlap_list(asp::BaBaseOptions &opt, double lonlat_buffer); // Parse data needed for error propagation. Note that horizontal_stddevs // comes from the user, or is otherwise populated from cameras. void setup_error_propagation(std::string const& session_name, double horizontal_stddev, std::vector const& cameras, vw::Vector & horizontal_stddev_vec); // Find stats of propagated errors void propagatedErrorStats(size_t left_cam_index, size_t right_cam_index, vw::camera::CameraModel const * left_cam, vw::camera::CameraModel const * right_cam, std::vector const& left_ip, std::vector const& right_ip, double stddev1, double stddev2, vw::cartography::Datum const& datum, // Output asp::HorizVertErrorStats & stats); // Find the cameras with the latest adjustments. Note that we do not modify // opt.camera_models, but make copies as needed. void calcOptimizedCameras(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage, std::vector & optimized_cams); // Find the average for the gsd for all pixels whose rays intersect at the given // triangulated point. This is used in jitter solving. void estimateGsdPerTriPoint(std::vector const& images, std::vector const& cameras, asp::CRN const& crn, asp::BaParams const& param_storage, // Output std::vector & gsds); // This is a version of the above used in jitter solving. void estimateGsdPerTriPoint(std::vector const& images, std::vector const& cameras, asp::CRN const& crn, std::set const& outliers, std::vector const& tri_points_vec, // Output std::vector & gsds); // Parse the string of limits and make sure they are all valid pairs. void parse_intrinsics_limits(std::string const& intrinsics_limits_str, std::vector & intrinsics_limits); // This function returns only one camera center per camera void calcCameraCenters(std::vector const& cams, std::vector & cam_positions); // This function returns all camera center samples for linescan cameras void calcCameraCenters(std::string const& stereo_session, std::vector const& cams, std::vector> & cam_positions); // Interface for setting/getting intrinsics for all supported camera models void get_optical_center(vw::camera::CameraModel const* cam, vw::Vector2 & center); void set_optical_center(vw::camera::CameraModel* cam, vw::Vector2 const& center); void get_focal_length(vw::camera::CameraModel const* cam, double & focal); void set_focal_length(vw::camera::CameraModel* cam, double const& focal); void get_distortion(vw::camera::CameraModel const* cam, vw::Vector &dist); void set_distortion(vw::camera::CameraModel* cam, vw::Vector const& dist); // If some cameras share an intrinsic parameter, that parameter must start with // the same value for all cameras sharing it. This is a bugfix. Return // true if the cameras were modified. bool syncUpInitialSharedParams(BACameraType camera_type, asp::BaParams const& param_storage, std::vector& camera_models); // This is needed to allocate enough storage for the distortion parameters. int calcMaxNumDistParams(std::vector const& camera_models, BACameraType camera_type, IntrinsicOptions const& intrinsics_opts, std::vector const& intrinsics_limits); // This is needed to ensure distortion coefficients are not so small // that they don't get optimized. This modifies the camera models in place. void ensureMinDistortion(std::vector & camera_models, BACameraType camera_type, IntrinsicOptions const& intrinsics_opts, std::vector const& fixed_distortion_indices, int max_num_dist_params, double min_distortion); // Sanity check. This does not prevent the user from setting the wrong datum, // but it can catch unreasonable height values for GCP. void checkGcpRadius(vw::cartography::Datum const& datum, vw::ba::ControlNetwork const& cnet); // Some logic for camera position uncertainty, used in bundle_adjust and jitter_solve void handleCameraPositionUncertainty(asp::BaBaseOptions & opt, bool have_datum); } // end namespace asp #endif // __BUNDLE_ADJUST_CAMERA_H__ ================================================ FILE: src/asp/Camera/BundleAdjustCamera2.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustCamera2.cc /// // Move some code here because BundleAdjustCamera.cc is getting too big. // These are all very related functions that are not easy to split into // separate files by functionality. // TODO(oalexan1): Move most of BundleAdjustCamera.h code to here, and put it // all in the asp namespace. #include #include #include #include #include #include #include #include #include #include #include #include #include // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include #endif // ASP_HAVE_PKG_ISIS #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::camera; using namespace vw::ba; namespace asp { // Read previous adjustments and store them in params. The params must be well-formed // by now, but any prior adjustment in them will be overwritten. void put_adjustments_in_params(std::string const& input_prefix, std::vector const& image_files, std::vector const& camera_files, // Output asp::BaParams & param_storage) { const size_t num_cameras = param_storage.num_cameras(); for (size_t icam = 0; icam < num_cameras; icam++) { std::string adjust_file = asp::bundle_adjust_file_name(input_prefix, image_files[icam], camera_files[icam]); double * cam_ptr = param_storage.get_camera_ptr(icam); CameraAdjustment adjustment; adjustment.read_from_adjust_file(adjust_file); adjustment.pack_to_array(cam_ptr); } } // Take input cameras and corrections in param_storage, and create new cameras // incorporating the corrections. void create_corrected_cameras(std::vector const& input_cameras, asp::BaParams const& param_storage, std::vector & out_cameras) { const size_t num_cameras = param_storage.num_cameras(); out_cameras.resize(num_cameras); for (size_t icam = 0; icam < num_cameras; icam++) { CameraAdjustment correction(param_storage.get_camera_ptr(icam)); // The pointer is managed by vw::CamPtr out_cameras[icam] = vw::CamPtr(new camera::AdjustedCameraModel(input_cameras[icam], correction.position(), correction.pose())); } } /// Create the param storage. Collect in it any input adjustments and initial transform. /// Return a copy of the cameras having these adjustments applied to them. bool init_cams(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector & new_cam_models) { bool cameras_changed = false; // Initialize all of the camera adjustments to zero. param_storage.init_cams_as_zero(); const size_t num_cameras = param_storage.num_cameras(); // Sanity check, must have same number of cameras if (num_cameras != opt.camera_models.size()) vw_throw(ArgumentErr() << "Expecting " << num_cameras << " cameras, got " << opt.camera_models.size() << ".\n"); // Read the adjustments from a previous run, if present. Put them in params. if (opt.input_prefix != "") { put_adjustments_in_params(opt.input_prefix, opt.image_files, opt.camera_files, param_storage); // output cameras_changed = true; } // Apply any initial transform to params if (initial_transform_file != "") { if (opt.stereo_session == "csm") { double scale = pow(vw::math::det(initial_transform), 1.0/3.0); if (std::abs(scale - 1.0) > 1e-6) { // TODO(oalexan1): This gives wrong results for now so needs to be sorted out. // Likely the only way to apply a scale to a linescan camera is to multiply // all camera centers by the scale. Using a rotation and translation center // like for AdjustedCameraModel is not enough. vw_throw(ArgumentErr() << "CSM camera models do not support applying a transform with a scale.\n"); } } // Update param_storage with the alignment. This may be on top of any initial adjustment. // from the previous code, already contained in param_storage. Cameras // do not change. apply_transform_to_params(initial_transform, param_storage, opt.camera_models); cameras_changed = true; } // Make a copy of the cameras with given corrections in param_storage, incorporating // any adjustments and initial transform. create_corrected_cameras(opt.camera_models, param_storage, new_cam_models); return cameras_changed; } /// Specialization for pinhole cameras bool init_cams_pinhole(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector & new_cam_models) { bool cameras_changed = false; // Copy the camera parameters from the models to param_storage const size_t num_cameras = param_storage.num_cameras(); for (int icam = 0; icam < num_cameras; icam++) { PinholeModel* pin_ptr = dynamic_cast(opt.camera_models[icam].get()); // Make a deep copy of the camera, including of the lens distortion PinholeModel pin_cam = *pin_ptr; // Read the adjustments from a previous run, if present if (opt.input_prefix != "") { std::string adjust_file = asp::bundle_adjust_file_name(opt.input_prefix, opt.image_files[icam], opt.camera_files[icam]); vw_out() << "Reading input adjustment: " << adjust_file << "\n"; CameraAdjustment adjustment; adjustment.read_from_adjust_file(adjust_file); // Strictly speaking, it is not necessary to call unadjusted_model(), as // in bundle_adjust the input cameras are loaded unadjusted, unlike in stereo. AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]), adjustment.position(), adjustment.pose()); vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform(); pin_cam.apply_transform(ecef_transform); cameras_changed = true; } // Apply any initial transform to the pinhole cameras. This may be on top // of any initial adjustment. if (initial_transform_file != "") { pin_cam.apply_transform(initial_transform); cameras_changed = true; } pack_pinhole_to_arrays(pin_cam, icam, param_storage); } // End loop through cameras // Fill out the new camera model vector new_cam_models.resize(num_cameras); for (size_t icam = 0; icam < num_cameras; icam++) { PinholeModel* in_cam = dynamic_cast(opt.camera_models[icam].get()); // Start with a deep copy of the input camera. Then overwrite its parameters. PinholeModel* out_cam = new PinholeModel(*in_cam); // deep copy, memory managed below *out_cam = transformedPinholeCamera(icam, param_storage, *in_cam); new_cam_models[icam] = vw::CamPtr(out_cam); } return cameras_changed; } // TODO: Share more code with the similar pinhole case. /// Specialization for optical bar cameras. bool init_cams_optical_bar(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector &new_cam_models) { if (opt.input_prefix != "") vw::vw_throw(vw::ArgumentErr() << "Applying initial adjustments to optical bar cameras " << "and --inline-adjustments is not implemented. " << "Remove this option.\n"); bool cameras_changed = false; // Copy the camera parameters from the models to param_storage const size_t num_cameras = param_storage.num_cameras(); for (int icam = 0; icam < num_cameras; icam++) { vw::camera::OpticalBarModel* bar_ptr = dynamic_cast(opt.camera_models[icam].get()); pack_optical_bar_to_arrays(*bar_ptr, icam, param_storage); } // End loop through cameras // Apply any initial transform to the pinhole cameras if (initial_transform_file != "") { apply_transform_to_cameras_optical_bar(initial_transform, param_storage, opt.camera_models); cameras_changed = true; } // Fill out the new camera model vector new_cam_models.resize(num_cameras); for (size_t icam = 0; icam < num_cameras; icam++) { vw::camera::OpticalBarModel* in_cam = dynamic_cast(opt.camera_models[icam].get()); // Start with a copy of the input camera, then overwrite its content. // The pointer is managed below. vw::camera::OpticalBarModel* out_cam = new vw::camera::OpticalBarModel(*in_cam); *out_cam = transformedOpticalBarCamera(icam, param_storage, *in_cam); new_cam_models[icam] = boost::shared_ptr(out_cam); } return cameras_changed; } // TODO: Share more code with the similar pinhole case. /// Specialization for CSM bool init_cams_csm(asp::BaBaseOptions const& opt, asp::BaParams & param_storage, std::string const& initial_transform_file, vw::Matrix const& initial_transform, std::vector &new_cam_models) { bool cameras_changed = false; // Apply any adjustments inline. Copy the camera parameters from the models to // param_storage. Do not copy the adjustments, as they are already applied // to the camera proper. const size_t num_cameras = param_storage.num_cameras(); for (int icam = 0; icam < num_cameras; icam++) { asp::CsmModel* csm_ptr = dynamic_cast(opt.camera_models[icam].get()); // Read the adjustments from a previous run, if present. Apply them // inline to the camera model. if (opt.input_prefix != "") { std::string adjust_file = asp::bundle_adjust_file_name(opt.input_prefix, opt.image_files[icam], opt.camera_files[icam]); vw_out() << "Reading input adjustment: " << adjust_file << "\n"; CameraAdjustment adjustment; adjustment.read_from_adjust_file(adjust_file); // Strictly speaking, it is not necessary to call unadjusted_model(), as // in bundle_adjust the input cameras are loaded unadjusted, unlike in stereo. AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]), adjustment.position(), adjustment.pose()); vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform(); csm_ptr->applyTransform(ecef_transform); cameras_changed = true; } // This does not copy the camera position and orientation, only the intrinsics pack_csm_to_arrays(*csm_ptr, icam, param_storage); } // End loop through cameras // Apply any initial transform to the CSM cameras if (initial_transform_file != "") { // Apply the transform to the cameras inline. This modifies opt.camera_models. // The transform does not get copied to param_storage. Only intrinsics get copied. apply_transform_to_cameras_csm(initial_transform, param_storage, opt.camera_models); cameras_changed = true; } // Fill out the new camera model vector new_cam_models.resize(num_cameras); for (size_t icam = 0; icam < num_cameras; icam++) { asp::CsmModel* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting a CSM camera.\n"); auto out_cam = transformedCsmCamera(icam, param_storage, *in_cam); new_cam_models[icam] = boost::shared_ptr(out_cam); } return cameras_changed; } // When distortion params are shared, their number must agree void distortion_sanity_check(std::vector const& num_dist_params, IntrinsicOptions const& intrinsics_opts, std::vector const& intrinsics_limits) { // If nothing is shared, there is nothing to do // If all distortion params are shared, all sizes must agree if (!intrinsics_opts.share_intrinsics_per_sensor && intrinsics_opts.distortion_shared) { for (size_t it = 1; it < num_dist_params.size(); it++) { if (num_dist_params[it] != num_dist_params[0]) vw_throw(ArgumentErr() << "When sharing distortion parameters, " << "they must have the same size.\n"); } } // If distortion is shared per sensor if (intrinsics_opts.share_intrinsics_per_sensor) { std::vector> dist_sizes(intrinsics_opts.num_sensors); for (size_t cam_it = 0; cam_it < num_dist_params.size(); cam_it++) { int sensor_it = intrinsics_opts.cam2sensor[cam_it]; dist_sizes[sensor_it].insert(num_dist_params[cam_it]); // all found sizes } // Now check that each dist_sizes[sensor_it] has size 1 for (size_t sensor_it = 0; sensor_it < intrinsics_opts.num_sensors; sensor_it++) { if (dist_sizes[sensor_it].size() != 1) vw_throw(ArgumentErr() << "When sharing distortion parameters per sensor, " << "they must have the same size for all cameras of the same sensor.\n"); } } // Intrinsics limits only can be used for now when all distortion vectors have // the same size. This could be fixed but it is a rarely used option // and would require a lot of bookkeeping. if (!intrinsics_limits.empty()) { bool have_same_size = true; for (size_t it = 1; it < num_dist_params.size(); it++) { if (num_dist_params[it] != num_dist_params[0]) { have_same_size = false; break; } } if (!have_same_size) vw_throw(ArgumentErr() << "When using --intrinsics-limits, all cameras " << "must have the same number of distortion coefficients.\n"); } return; } // A little function to replace separators with space. Note that the backslash // is a separator, in case, it used as a continuation line. void replace_separators_with_space(std::string & str) { std::string sep = "\\:;, \t\r\n"; for (size_t it = 0; it < sep.size(); it++) std::replace(str.begin(), str.end(), sep[it], ' '); } // Split a string into a vector of strings with space as separator std::vector split_str_with_space(std::string const& str) { std::istringstream is(str); std::vector ret; std::string val; while (is >> val) ret.push_back(val); return ret; } // Function that tells if a string is a non-negative integer bool is_str_non_neg_integer(std::string const& str) { if (str.empty()) return false; for (size_t it = 0; it < str.size(); it++) { if (!isdigit(str[it])) return false; } return true; } // Parse format: // "1:focal_length,optical_center 2:focal_length,other_intrinsics 3:none" // Applies when optimizing intrinsics per sensor. // The numbers are sensor indices, starting with 1. void fine_grained_parse(bool share_intrinsics_per_sensor, int num_sensors, std::vector const& options, // Outputs std::vector & float_center, std::vector & float_focus, std::vector & float_distortion) { // Sanity checks if (!share_intrinsics_per_sensor) vw_throw(ArgumentErr() << "Intrinsics are not being optimized per sensor. Remove any " << "fields of the form 1:, etc., from the options for floating intrinsics.\n"); if (num_sensors <= 0) vw_throw(ArgumentErr() << "Expecting a positive number of sensors.\n"); if (options.empty()) vw_throw(ArgumentErr() << "Expecting at least one option.\n"); // Wipe the outputs float_center.clear(); float_focus.clear(); float_distortion.clear(); // It is convenient to initialize all to false. 0th element must always exist. for (int i = 0; i < std::max(num_sensors, 1); i++) { float_center.push_back(false); float_focus.push_back(false); float_distortion.push_back(false); } // First entity must be an integer. That is sensor id, starting from 1. if (!is_str_non_neg_integer(options[0])) vw_throw(ArgumentErr() << "Expecting an integer as the first option.\n"); int sensor_id = atoi(options[0].c_str()) - 1; // subtract 1 to make it zero-based // check for duplicate ids std::set seen_ids; // Iterate over options for (size_t it = 0; it < options.size(); it++) { // If it is an integer, update the sensor id, and continue. // Subtract 1 to make it zero-based. if (is_str_non_neg_integer(options[it])) { sensor_id = atoi(options[it].c_str()) - 1; // Sensor id must be in bounds if (sensor_id < 0 || sensor_id >= num_sensors) vw_throw(ArgumentErr() << "Sensor id " << options[it] << " is out of bounds.\n"); // If seen, that's a problem if (seen_ids.find(sensor_id) != seen_ids.end()) vw_throw(ArgumentErr() << "Sensor id " << options[it] << " is repeated.\n"); // Record as seen seen_ids.insert(sensor_id); continue; } // Handle the optical center if (options[it] == "optical_center") { float_center[sensor_id] = true; continue; } // Handle the focal length if (options[it] == "focal_length") { float_focus[sensor_id] = true; continue; } // Handle the distortion (other_intrinsics) if (options[it] == "other_intrinsics" || options[it] == "distortion") { float_distortion[sensor_id] = true; continue; } // For all, populate all fields if (options[it] == "all") { float_center[sensor_id] = true; float_focus[sensor_id] = true; float_distortion[sensor_id] = true; continue; } // For none, just skip if (options[it] == "none") { continue; } vw_throw(ArgumentErr() << "Found unknown option when parsing which " << "sensor intrinsics to float: " << options[it] << ".\n"); } } // Parse format: // "focal_length optical_center other_intrinsics" // Applies to all sensors and when not optimizing intrinsics per sensor. void coarse_grained_parse(int num_sensors, std::vector const& options, // Outputs std::vector & float_center, std::vector & float_focus, std::vector & float_distortion) { // Wipe the outputs float_center.clear(); float_focus.clear(); float_distortion.clear(); if (num_sensors < 0) vw_throw(ArgumentErr() << "Cameras were not parsed correctly.\n"); // It is convenient to initialize all to false. 0th element must always exist. for (int i = 0; i < std::max(num_sensors, 1); i++) { float_center.push_back(false); float_focus.push_back(false); float_distortion.push_back(false); } // For now, populate only for sensor with id 0 int sensor_id = 0; // Iterate over options for (size_t it = 0; it < options.size(); it++) { // Must not have an integer here if (is_str_non_neg_integer(options[0])) vw_throw(ArgumentErr() << "When parsing intrinsics to float, expecting a " << "string, not an integer. Check your inputs.\n"); // Handle the optical center if (options[it] == "optical_center") { float_center[sensor_id] = true; continue; } // Handle the focal length if (options[it] == "focal_length") { float_focus[sensor_id] = true; continue; } // Handle the distortion (other_intrinsics) if (options[it] == "other_intrinsics" || options[it] == "distortion") { float_distortion[sensor_id] = true; continue; } // For all, populate all fields if (options[it] == "all") { float_center[sensor_id] = true; float_focus[sensor_id] = true; float_distortion[sensor_id] = true; continue; } // For none, just skip if (options[it] == "none") { continue; } // We should not arrive here vw_throw(ArgumentErr() << "Found unknown option when parsing which " << "sensor intrinsics to float: " << options[it] << ".\n"); } // Distribute for all sensors. // This will happen only if we share intrinsics per sensor. for (int sensor_id = 0; sensor_id < num_sensors; sensor_id++) { float_center[sensor_id] = float_center[0]; float_focus[sensor_id] = float_focus[0]; float_distortion[sensor_id] = float_distortion[0]; } return; } void print_float(bool do_float) { if (do_float) vw_out() << "floated\n"; else vw_out() << "fixed\n"; } void print_float_vec(std::vector const& intrinsics, std::string const& name) { vw_out() << name << ": "; for (size_t it = 0; it < intrinsics.size(); it++) { if (intrinsics[it]) vw_out() << "floated "; else vw_out() << "fixed "; } vw_out() << "\n"; } void print_shared(bool shared) { if (shared) vw_out() << "shared\n"; else vw_out() << "not shared\n"; } /// For each option, the string must include a subset of the entries: /// "focal_length, optical_center, distortion_params" /// - Need the extra boolean to handle the case where --intrinsics-to-share /// is provided as "" in order to share none of them. void load_intrinsics_options(bool solve_intrinsics, bool shared_is_specified, std::string intrinsics_to_float_str, // make a copy std::string intrinsics_to_share_str, // make a copy asp::IntrinsicOptions & intrinsics_options) { // Share everything unless told otherwise or not solving for intrinsics intrinsics_options.focus_shared = solve_intrinsics; intrinsics_options.center_shared = solve_intrinsics; intrinsics_options.distortion_shared = solve_intrinsics; // We need these to be initialized even when not solving for intrinsics, as // the intrinsics are always added to the cost function when // --inline-adjustments is used. In that case they are just expected to be // kept fixed. intrinsics_options.float_center.resize(1, false); intrinsics_options.float_focus.resize(1, false); intrinsics_options.float_distortion.resize(1, false); if (((intrinsics_to_float_str != "" && intrinsics_to_float_str != "none") || (intrinsics_to_share_str != "" && intrinsics_to_share_str != "none")) && !solve_intrinsics) { vw::vw_throw(vw::ArgumentErr() << "To be able set intrinsics to float or share, " << "the option --solve-intrinsics must be on.\n"); } if (!solve_intrinsics) return; // If the user did not specify which intrinsics to float, float all of them. boost::to_lower(intrinsics_to_float_str); if (intrinsics_to_float_str == "" || intrinsics_to_float_str == "all") intrinsics_to_float_str = "focal_length optical_center other_intrinsics"; // This is the right place in which to turn 'none' to empty string, // which now will mean float nothing. if (intrinsics_to_float_str == "none") intrinsics_to_float_str = ""; // If the user did not specify which intrinsics to share, share all of them. boost::to_lower(intrinsics_to_share_str); if (!shared_is_specified) { intrinsics_to_share_str = "focal_length optical_center other_intrinsics"; } else { // Otherwise, 'all' also means share all of them, 'none' means share none if (intrinsics_to_share_str == "all") intrinsics_to_share_str = "focal_length optical_center other_intrinsics"; if (intrinsics_to_share_str == "none") intrinsics_to_share_str = ""; } if (intrinsics_options.share_intrinsics_per_sensor && shared_is_specified) vw_out() << "When sharing intrinsics per sensor, option " << "--intrinsics-to-share is ignored. The intrinsics will " << "always be shared for a sensor and never across sensors.\n"; // If sharing intrinsics per sensor, the only supported mode is that // the intrinsics are always shared per sensor and never across sensors. if (shared_is_specified && !intrinsics_options.share_intrinsics_per_sensor) { intrinsics_options.focus_shared = false; intrinsics_options.center_shared = false; intrinsics_options.distortion_shared = false; } // Replace any separators (:;, \t\r\n) with spaces. It can be convenient to // use commas and colons as separators when passing in the options from the command line. asp::replace_separators_with_space(intrinsics_to_float_str); asp::replace_separators_with_space(intrinsics_to_share_str); // Parse float options. Supported formats: // "1:focal_length,optical_center 2:focal_length,other_intrinsics 3:none" // "focal_length optical_center other_intrinsics" // In the first case, the numbers are sensor indices, starting with 1. std::vector float_options = asp::split_str_with_space(intrinsics_to_float_str); if (!float_options.empty() && asp::is_str_non_neg_integer(float_options[0])) { asp::fine_grained_parse(intrinsics_options.share_intrinsics_per_sensor, intrinsics_options.num_sensors, float_options, intrinsics_options.float_center, intrinsics_options.float_focus, intrinsics_options.float_distortion); } else { asp::coarse_grained_parse(intrinsics_options.num_sensors, float_options, intrinsics_options.float_center, intrinsics_options.float_focus, intrinsics_options.float_distortion); } // Useful reporting std::string center_name = "Optical center"; std::string focus_name = "Focal length"; std::string dist_name = "Other intrinsics (distortion)"; if (intrinsics_options.share_intrinsics_per_sensor) { vw_out() << "Intrinsics are shared for all cameras with given sensor.\n"; vw_out() << "Number of sensors: " << intrinsics_options.num_sensors << "\n"; vw_out() << "For each sensor:\n"; print_float_vec(intrinsics_options.float_center, center_name); print_float_vec(intrinsics_options.float_focus, focus_name); print_float_vec(intrinsics_options.float_distortion, dist_name); } else { vw_out() << center_name << ": "; print_float(intrinsics_options.float_center[0]); vw_out() << focus_name << ": "; print_float(intrinsics_options.float_focus[0]); vw_out() << dist_name << ": "; print_float(intrinsics_options.float_distortion[0]); } // No parsing is done when sharing intrinsics per sensor, per above std::string val; if (shared_is_specified && !intrinsics_options.share_intrinsics_per_sensor) { std::istringstream is(intrinsics_to_share_str); while (is >> val) { if (val == "focal_length") intrinsics_options.focus_shared = true; else if (val == "optical_center") intrinsics_options.center_shared = true; else if (val == "other_intrinsics" || val == "distortion") intrinsics_options.distortion_shared = true; else vw_throw(ArgumentErr() << "Error: Found unknown intrinsic to share: " << val << ".\n"); } } // Useful info std::string sensor_mode = " (across sensors): "; if (intrinsics_options.share_intrinsics_per_sensor) sensor_mode = " (per sensor): "; // useful clarification vw_out() << center_name << sensor_mode; print_shared(intrinsics_options.center_shared); vw_out() << focus_name << sensor_mode; print_shared(intrinsics_options.focus_shared); vw_out() << dist_name << sensor_mode; print_shared(intrinsics_options.distortion_shared); } // End function load_intrinsics_options /// Parse the string of limits and make sure they are all valid pairs. void parse_intrinsics_limits(std::string const& intrinsics_limits_str, std::vector & intrinsics_limits) { intrinsics_limits.clear(); std::istringstream is(intrinsics_limits_str); double val; int count = 0; while (is >> val) { intrinsics_limits.push_back(val); if (count % 2 == 1) { if (intrinsics_limits[count] < intrinsics_limits[count-1]) vw_throw(vw::ArgumentErr() << "Error: Intrinsic limit pairs must be min before max.\n"); } count++; } if (count % 2 != 0) vw::vw_throw(vw::ArgumentErr() << "Error: Intrinsic limits must always be provided in min max pairs.\n"); } /// Attempt to automatically create the overlap list file estimated /// footprints for each of the input images. /// - Currently this only supports cameras with Worldview style XML files. void auto_build_overlap_list(asp::BaBaseOptions &opt, double lonlat_buffer) { typedef std::pair StringPair; const size_t num_images = opt.camera_files.size(); opt.overlap_list.clear(); vw_out() << "Attempting to automatically estimate image overlaps...\n"; int num_overlaps = 0; bool read_success = false; // Loop through all image pairs for (size_t i = 0; i < num_images - 1; i++) { // Try to get the lonlat bounds for this image std::vector pixel_corners_i, lonlat_corners_i; try { read_success = asp::read_WV_XML_corners(opt.camera_files[i], pixel_corners_i, lonlat_corners_i); } catch(...) { read_success = false; } if (!read_success) { vw_throw(ArgumentErr() << "Unable to get corner estimate from file: " << opt.camera_files[i] << ".\n"); } vw::BBox2 bbox_i; // Convert to BBox for (size_t p = 0; p < lonlat_corners_i.size(); p++) bbox_i.grow(lonlat_corners_i[p]); bbox_i.expand(lonlat_buffer); // Only expand this bounding box by the buffer. for (size_t j = i+1; j < num_images; j++) { std::vector pixel_corners_j, lonlat_corners_j; try { read_success = asp::read_WV_XML_corners(opt.camera_files[j], pixel_corners_j, lonlat_corners_j); } catch(...) { read_success = false; } if (!read_success) { vw_throw(ArgumentErr() << "Unable to get corner estimate from file: " << opt.camera_files[j] << ".\n"); } vw::BBox2 bbox_j; // Convert to BBox for (size_t p = 0; p < lonlat_corners_j.size(); p++) bbox_j.grow(lonlat_corners_j[p]); // Record the files if the bboxes overlap // - TODO: Use polygon intersection instead of bounding boxes! if (bbox_i.intersects(bbox_j)) { vw_out() << "Predicted overlap between images " << opt.image_files[i] << " and " << opt.image_files[j] << "\n"; opt.overlap_list.insert(StringPair(opt.image_files[i], opt.image_files[j])); opt.overlap_list.insert(StringPair(opt.image_files[j], opt.image_files[i])); ++num_overlaps; } } // End inner loop through cameras } // End outer loop through cameras if (num_overlaps == 0) vw_throw(ArgumentErr() << "Failed to automatically detect any overlapping images!"); vw_out() << "Will try to match at " << num_overlaps << " detected overlaps\n."; } // End function auto_build_overlap_list // Parse data needed for error propagation. Note that horizontal_stddevs // comes from the user, or is otherwise populated from cameras. void setup_error_propagation(std::string const& session_name, double horizontal_stddev, std::vector const& cameras, vw::Vector & horizontal_stddev_vec) { // Initialize the output horizontal_stddev_vec.set_size(cameras.size()); horizontal_stddev_vec.set_all(horizontal_stddev); bool message_printed = false; if (horizontal_stddev == 0.0) { // Read from cameras for (size_t icam = 0; icam < cameras.size(); icam++) horizontal_stddev_vec[icam] = asp::horizontalStDevFromCamera(cameras[icam], message_printed); } asp::horizontalStdDevCheck(horizontal_stddev_vec, session_name); } // Find the cameras with the latest adjustments. Note that we do not modify // opt.camera_models, but make copies as needed. The optimizations (adjustments) // may be inline, or external. void calcOptimizedCameras(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage, std::vector & optimized_cams) { optimized_cams.clear(); int num_cameras = opt.image_files.size(); for (int icam = 0; icam < num_cameras; icam++) { // TODO(oalexan1): The logic below may need to be a function and should be called // in a couple other places. switch (opt.camera_type) { case BaCameraType_Pinhole: { vw::camera::PinholeModel const* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting a pinhole camera.\n"); vw::camera::PinholeModel * out_cam = new PinholeModel(); // pointer managed below *out_cam = transformedPinholeCamera(icam, param_storage, *in_cam); optimized_cams.push_back(vw::CamPtr(out_cam)); } break; case BaCameraType_OpticalBar: { vw::camera::OpticalBarModel const* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting an optical bar camera.\n"); vw::camera::OpticalBarModel * out_cam = new OpticalBarModel(); // pointer managed below *out_cam = transformedOpticalBarCamera(icam, param_storage, *in_cam); optimized_cams.push_back(vw::CamPtr(out_cam)); // will manage the memory } break; case BaCameraType_CSM: { asp::CsmModel const* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting a CSM camera.\n"); auto out_cam = transformedCsmCamera(icam, param_storage, *in_cam); optimized_cams.push_back(out_cam); } break; case BaCameraType_Other: { CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam)); // The pointer is managed by the smart pointer vw::CamPtr vw::CamPtr out_cam (new AdjustedCameraModel(vw::camera::unadjusted_model(opt.camera_models[icam]), cam_adjust.position(), cam_adjust.pose())); optimized_cams.push_back(out_cam); } break; default: vw_throw(ArgumentErr() << "Unknown camera type.\n"); } } } // Find the average for the gsd for all pixels whose rays intersect at the given // triangulated point. // TODO(oalexan1): Export points out of param_storage and crn, then use the // other function further down instead. void estimateGsdPerTriPoint(std::vector const& images, std::vector const& cameras, asp::CRN const& crn, asp::BaParams const& param_storage, // Output std::vector & gsds) { // Sanity checks if (crn.size() != images.size()) vw_throw(ArgumentErr() << "Expecting the same number of images and crn points.\n"); if (crn.size() != cameras.size()) vw_throw(ArgumentErr() << "Expecting the same number of images and cameras.\n"); if (crn.size() != param_storage.num_cameras()) vw_throw(ArgumentErr() << "Expecting the same number of images and cameras.\n"); // Image bboxes std::vector bboxes; for (size_t i = 0; i < images.size(); i++) { vw::DiskImageView img(images[i]); bboxes.push_back(bounding_box(img)); } int num_cameras = param_storage.num_cameras(); int num_points = param_storage.num_points(); // Initialize all gsd to 0 gsds.resize(num_points, 0.0); std::vector count(num_points, 0); for (int icam = 0; icam < num_cameras; icam++) { // Camera loop for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // IP loop // The index of the 3D point this IP is for. int ipt = (**fiter).m_point_id; VW_ASSERT(int(icam) < num_cameras, ArgumentErr() << "Out of bounds in the number of cameras."); VW_ASSERT(int(ipt) < num_points, ArgumentErr() << "Out of bounds in the number of points."); if (param_storage.get_point_outlier(ipt)) continue; // skip outliers vw::Vector2 pix = (**fiter).m_location; double const* point = param_storage.get_point_ptr(ipt); Vector3 xyz(point[0], point[1], point[2]); // Estimate the GSD at the given pixel given an estimate of the ground point double gsd = 0.0; try { gsd = vw::camera::estimatedGSD(cameras[icam].get(), bboxes[icam], pix, xyz); } catch (...) { continue; } gsds[ipt] += gsd; count[ipt]++; } } // Find the average gsd for (int ipt = 0; ipt < num_points; ipt++) { if (count[ipt] > 0) gsds[ipt] /= count[ipt]; } return; } // Find the average for the gsd for all pixels whose rays intersect at the given // triangulated point. This is used in jitter solving. Note that tri_points_vec // may have anchor points at the end, but we don't get to those. void estimateGsdPerTriPoint(std::vector const& images, std::vector const& cameras, asp::CRN const& crn, std::set const& outliers, std::vector const& tri_points_vec, // Output std::vector & gsds) { // Sanity checks if (crn.size() != images.size()) vw_throw(ArgumentErr() << "Expecting the same number of images and crn points.\n"); if (crn.size() != cameras.size()) vw_throw(ArgumentErr() << "Expecting the same number of images and cameras.\n"); // Image bboxes std::vector bboxes; for (size_t i = 0; i < images.size(); i++) { vw::DiskImageView img(images[i]); bboxes.push_back(bounding_box(img)); } int num_cameras = cameras.size(); int num_points = tri_points_vec.size()/3; // Initialize all gsd to 0 gsds.resize(num_points, 0.0); std::vector count(num_points, 0); for (int icam = 0; icam < num_cameras; icam++) { // Camera loop for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // IP loop // The index of the 3D point this IP is for. int ipt = (**fiter).m_point_id; VW_ASSERT(int(icam) < num_cameras, ArgumentErr() << "Out of bounds in the number of cameras."); VW_ASSERT(int(ipt) < num_points, ArgumentErr() << "Out of bounds in the number of points."); if (outliers.find(ipt) != outliers.end()) continue; // Skip outliers vw::Vector2 pix = (**fiter).m_location; double const* point = &tri_points_vec[3*ipt]; Vector3 xyz(point[0], point[1], point[2]); // Estimate the GSD at the given pixel given an estimate of the ground point double gsd = 0.0; try { gsd = vw::camera::estimatedGSD(cameras[icam].get(), bboxes[icam], pix, xyz); } catch (...) { continue; } gsds[ipt] += gsd; count[ipt]++; } } // Find the average gsd for (int ipt = 0; ipt < num_points; ipt++) { if (count[ipt] > 0) gsds[ipt] /= count[ipt]; } return; } // This function returns only one camera center per camera. See below // for linescan. void calcCameraCenters(std::vector const& cams, std::vector & cam_positions) { cam_positions.resize(cams.size()); for (size_t icam = 0; icam < cams.size(); icam++) { vw::Vector3 ctr = cams[icam]->camera_center(vw::Vector2()); cam_positions[icam] = ctr; } } // This function returns all camera center samples for linescan cameras. These // cameras may have an external adjustment. Otherwise it returns only the adjusted // camera center at pixel (0,0). void calcCameraCenters(std::string const& stereo_session, std::vector const& camera_models, std::vector> & cam_positions) { cam_positions.resize(camera_models.size()); for (size_t icam = 0; icam < camera_models.size(); icam++) { // Fetch the CSM model without any adjustment asp::CsmModel * csm_cam = NULL; try { csm_cam = asp::csm_model(vw::camera::unadjusted_model(camera_models[icam])); } catch(...) {} if (csm_cam == NULL) { // Not a CSM camera, pull directly the camera center vw::Vector3 ctr = camera_models[icam]->camera_center(vw::Vector2()); cam_positions[icam].push_back(ctr); continue; } csm::RasterGM const* gm = csm_cam->m_gm_model.get(); UsgsAstroLsSensorModel const* ls_model = dynamic_cast(gm); if (ls_model == NULL) { // Not a linescan camera. Return, as before the adjusted camera center vw::Vector3 ctr = camera_models[icam]->camera_center(vw::Vector2()); cam_positions[icam].push_back(ctr); continue; } // Handle the case when the CSM camera has an external adjustment. In that case // need to apply it before can find the camera positions, and update ls_model. vw::camera::AdjustedCameraModel *adj_cam = dynamic_cast(camera_models[icam].get()); asp::CsmModel local_csm; // Ensure it does not go out of scope if (adj_cam != NULL) { vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform(); csm_cam->deep_copy(local_csm); local_csm.applyTransform(ecef_transform); csm::RasterGM const* gm = local_csm.m_gm_model.get(); ls_model = dynamic_cast(gm); if (ls_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting a linescan camera.\n"); } // Get the number of positions int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS; // The positions are in a single vector, ls_model->m_positions // Append them to cam_positions[icam] for (int i = 0; i < numPos; i++) { int j = i * NUM_XYZ_PARAMS; double x = ls_model->m_positions[j+0]; double y = ls_model->m_positions[j+1]; double z = ls_model->m_positions[j+2]; cam_positions[icam].push_back(vw::Vector3(x, y, z)); } } return; } void get_optical_center(vw::camera::CameraModel const* cam, vw::Vector2 & center) { // Cast to pinhole model vw::camera::PinholeModel const* pin_ptr = dynamic_cast(cam); if (pin_ptr != NULL) { center = pin_ptr->point_offset(); return; } // Cast to optical bar model vw::camera::OpticalBarModel const* bar_ptr = dynamic_cast(cam); if (bar_ptr != NULL) { center = bar_ptr->get_optical_center(); return; } // Cast to CSM model asp::CsmModel const* csm_ptr = dynamic_cast(cam); if (csm_ptr != NULL) { center = csm_ptr->optical_center(); return; } // If we get here, the camera type is not recognized vw::vw_throw(vw::ArgumentErr() << "Unknown camera type in get_optical_center().\n"); } void set_optical_center(vw::camera::CameraModel* cam, vw::Vector2 const& center) { // Cast to pinhole model vw::camera::PinholeModel* pin_ptr = dynamic_cast(cam); if (pin_ptr != NULL) { pin_ptr->set_point_offset(center); return; } // Cast to optical bar model vw::camera::OpticalBarModel* bar_ptr = dynamic_cast(cam); if (bar_ptr != NULL) { bar_ptr->set_optical_center(center); return; } // Cast to CSM model asp::CsmModel* csm_ptr = dynamic_cast(cam); if (csm_ptr != NULL) { csm_ptr->set_optical_center(center); return; } // If we get here, the camera type is not recognized vw::vw_throw(vw::ArgumentErr() << "Unknown camera type in set_optical_center().\n"); } // Get the focal length void get_focal_length(vw::camera::CameraModel const* cam, double & focal) { // Cast to pinhole model vw::camera::PinholeModel const* pin_ptr = dynamic_cast(cam); if (pin_ptr != NULL) { focal = pin_ptr->focal_length()[0]; return; } // Cast to optical bar model vw::camera::OpticalBarModel const* bar_ptr = dynamic_cast(cam); if (bar_ptr != NULL) { focal = bar_ptr->get_focal_length(); return; } // Cast to CSM model asp::CsmModel const* csm_ptr = dynamic_cast(cam); if (csm_ptr != NULL) { focal = csm_ptr->focal_length(); return; } // If we get here, the camera type is not recognized vw::vw_throw(vw::ArgumentErr() << "Unknown camera type in get_focal_length().\n"); } // Set the focal length void set_focal_length(vw::camera::CameraModel* cam, double const& focal) { // Cast to pinhole model vw::camera::PinholeModel* pin_ptr = dynamic_cast(cam); if (pin_ptr != NULL) { pin_ptr->set_focal_length(vw::Vector2(focal, focal)); return; } // Cast to optical bar model vw::camera::OpticalBarModel* bar_ptr = dynamic_cast(cam); if (bar_ptr != NULL) { bar_ptr->set_focal_length(focal); return; } // Cast to CSM model asp::CsmModel* csm_ptr = dynamic_cast(cam); if (csm_ptr != NULL) { csm_ptr->set_focal_length(focal); return; } // If we get here, the camera type is not recognized vw::vw_throw(vw::ArgumentErr() << "Unknown camera type in set_focal_length().\n"); } void get_distortion(vw::camera::CameraModel const* cam, vw::Vector &dist) { // Cast to pinhole model vw::camera::PinholeModel const* pin_ptr = dynamic_cast(cam); if (pin_ptr != NULL) { dist = pin_ptr->lens_distortion()->distortion_parameters(); return; } // Cast to optical bar model // TODO(oalexan1): This must be member function and called in a couple of other places. vw::camera::OpticalBarModel const* bar_ptr = dynamic_cast(cam); if (bar_ptr != NULL) { dist.set_size(asp::NUM_OPTICAL_BAR_EXTRA_PARAMS); dist[0] = bar_ptr->get_speed(); dist[1] = bar_ptr->get_motion_compensation(); dist[2] = bar_ptr->get_scan_time(); if (bar_ptr->get_have_velocity_vec()) { vw::Vector3 vel = bar_ptr->get_velocity(); vw::Vector3 final_pose = bar_ptr->get_final_pose(); dist[3] = vel[0]; dist[4] = vel[1]; dist[5] = vel[2]; dist[6] = final_pose[0]; dist[7] = final_pose[1]; dist[8] = final_pose[2]; } else { // Ensure initialization dist[3] = 0.0; dist[4] = 0.0; dist[5] = 0.0; dist[6] = 0.0; dist[7] = 0.0; dist[8] = 0.0; } return; } // Cast to CSM model asp::CsmModel const* csm_ptr = dynamic_cast(cam); if (csm_ptr != NULL) { std::vector csm_dist = csm_ptr->distortion(); dist.set_size(csm_dist.size()); for (size_t i = 0; i < csm_dist.size(); i++) dist[i] = csm_dist[i]; return; } // If we get here, the camera type is not recognized vw::vw_throw(vw::ArgumentErr() << "Unknown camera type in get_distortion().\n"); } // Set the distortion. The underlying model must already have distortion of this size. void set_distortion(vw::camera::CameraModel* cam, vw::Vector const& dist) { // Cast to pinhole model vw::camera::PinholeModel* pin_ptr = dynamic_cast(cam); if (pin_ptr != NULL) { boost::shared_ptr distortion = pin_ptr->lens_distortion()->copy(); if (dist.size() != distortion->distortion_parameters().size()) vw::vw_throw(vw::ArgumentErr() << "Expecting " << distortion->distortion_parameters().size() << " distortion parameters for a pinhole model.\n"); distortion->set_distortion_parameters(dist); pin_ptr->set_lens_distortion(distortion.get()); return; } // Cast to optical bar model // TODO(oalexan1): This must be a member function and called in a couple of other places. vw::camera::OpticalBarModel* bar_ptr = dynamic_cast(cam); if (bar_ptr != NULL) { if (dist.size() != asp::NUM_OPTICAL_BAR_EXTRA_PARAMS) vw::vw_throw(vw::ArgumentErr() << "Expecting " << asp::NUM_OPTICAL_BAR_EXTRA_PARAMS << " distortion parameters for an optical bar model.\n"); bar_ptr->set_speed(dist[0]); bar_ptr->set_motion_compensation(dist[1]); bar_ptr->set_scan_time(dist[2]); if (bar_ptr->get_have_velocity_vec()) { vw::Vector3 vel(dist[3], dist[4], dist[5]); vw::Vector3 final_pose(dist[6], dist[7], dist[8]); bar_ptr->set_velocity(vel); bar_ptr->set_final_pose(final_pose); } return; } // Cast to CSM model asp::CsmModel* csm_ptr = dynamic_cast(cam); if (csm_ptr != NULL) { std::vector csm_dist = csm_ptr->distortion(); if (dist.size() != csm_dist.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting " << csm_dist.size() << " distortion parameters for a CSM model.\n"); csm_dist.clear(); for (size_t i = 0; i < dist.size(); i++) csm_dist.push_back(dist[i]); csm_ptr->set_distortion(csm_dist); return; } // If we get here, the camera type is not recognized vw::vw_throw(vw::ArgumentErr() << "Unknown camera type in set_distortion().\n"); } // If some cameras share an intrinsic parameter, that parameter must start with // the same value for all cameras sharing it. This is a bugfix. // Return true if the cameras were changed. bool syncUpInitialSharedParams(BACameraType camera_type, asp::BaParams const& param_storage, std::vector& camera_models) { bool cameras_changed = false; if (camera_type != BaCameraType_Pinhole && camera_type != BaCameraType_OpticalBar && camera_type != BaCameraType_CSM) return cameras_changed; // Not applicable as not optimizing intrinsics // Create groups of cameras that share focal length, optical center, and distortion. std::map> focal_groups, center_groups, distortion_groups; for (size_t icam = 0; icam < param_storage.num_cameras(); icam++) { int focal_group = param_storage.get_focus_offset(icam); int center_group = param_storage.get_center_offset(icam); int distortion_group = param_storage.get_distortion_offset(icam); focal_groups [focal_group].insert(icam); center_groups [center_group].insert(icam); distortion_groups[distortion_group].insert(icam); } // Iterate over focus groups. Get the focus. Apply it to all cameras in the group. // Print a warning if the focus is not the same for all cameras in the group. bool printed_focal_warning = false; for (auto const& group : focal_groups) { int focus_group = group.first; std::set const& cams = group.second; int first_index = *cams.begin(); double focal_length = -1.0; get_focal_length(camera_models[first_index].get(), focal_length); for (int icam: cams) { double curr_focal_length = -1.0; get_focal_length(camera_models[icam].get(), curr_focal_length); if (curr_focal_length != focal_length) { if (!printed_focal_warning) { vw::vw_out(vw::WarningMessage) << "Found cameras sharing a focal length, but different focal " "lengths. Copying the value from the first camera in each group.\n"; printed_focal_warning = true; cameras_changed = true; } set_focal_length(camera_models[icam].get(), focal_length); } } } // Same for optical center bool printed_center_warning = false; for (auto const& group: center_groups) { int center_group = group.first; std::set const& cams = group.second; int first_index = *cams.begin(); vw::Vector2 optical_center = Vector2(-1, -1); get_optical_center(camera_models[first_index].get(), optical_center); for (int icam: cams) { Vector2 curr_optical_center = Vector2(-1, -1); get_optical_center(camera_models[icam].get(), curr_optical_center); if (curr_optical_center != optical_center) { if (!printed_center_warning) { vw::vw_out(vw::WarningMessage) << "Found cameras sharing an optical center, but different centers. " "Copying the value from the first camera in each group.\n"; printed_center_warning = true; cameras_changed = true; } set_optical_center(camera_models[icam].get(), optical_center); } } } // Same for distortion bool printed_distortion_warning = false; for (auto const& group: distortion_groups) { int distortion_group = group.first; std::set const& cams = group.second; int first_index = *cams.begin(); vw::Vector distortion_params; get_distortion(camera_models[first_index].get(), distortion_params); for (int icam: cams) { vw::Vector curr_distortion_params; get_distortion(camera_models[icam].get(), curr_distortion_params); if (curr_distortion_params != distortion_params) { if (!printed_distortion_warning) { vw::vw_out(vw::WarningMessage) << "Found cameras sharing a distortion model, but different distortion " "parameters. Copying the value from the first camera in each group.\n"; printed_distortion_warning = true; cameras_changed = true; } set_distortion(camera_models[icam].get(), distortion_params); } } } return cameras_changed; } // This is needed to allocate enough storage for the distortion parameters. int calcMaxNumDistParams(std::vector const& camera_models, BACameraType camera_type, IntrinsicOptions const& intrinsics_opts, std::vector const& intrinsics_limits) { int num_cameras = camera_models.size(); std::vector num_dist_params(num_cameras, 0); for (size_t cam_it = 0; cam_it < camera_models.size(); cam_it++) { if (camera_type == BaCameraType_Pinhole) { auto pin_ptr = boost::dynamic_pointer_cast (camera_models[cam_it]); if (!pin_ptr) vw_throw(ArgumentErr() << "Expecting a Pinhole camera.\n"); num_dist_params[cam_it] = pin_ptr->lens_distortion()->distortion_parameters().size(); } else if (camera_type == BaCameraType_OpticalBar) { num_dist_params[cam_it] = asp::NUM_OPTICAL_BAR_EXTRA_PARAMS; } else if (camera_type == BaCameraType_CSM) { auto csm_ptr = boost::dynamic_pointer_cast(camera_models[cam_it]); if (!csm_ptr) vw_throw(ArgumentErr() << "Expecting a CSM camera.\n"); num_dist_params[cam_it] = csm_ptr->distortion().size(); } else if (camera_type == BaCameraType_Other) { num_dist_params[cam_it] = 0; // distortion does not get handled } else { vw_throw(ArgumentErr() << "Unknown camera type.\n"); } // For the case where the camera has zero distortion parameters, use one // dummy parameter just so we don't have to change the parameter block logic // later on. // TODO(oalexan1): Test with a mix of cameras with and without distortion. if (camera_type != BaCameraType_Other && num_dist_params[cam_it] < 1) num_dist_params[cam_it] = 1; } // It is simpler to allocate the same number of distortion params per camera // even if some cameras have fewer. The extra ones won't be used. int max_num_dist_params = *std::max_element(num_dist_params.begin(), num_dist_params.end()); asp::distortion_sanity_check(num_dist_params, intrinsics_opts, intrinsics_limits); return max_num_dist_params; } // This is needed to ensure distortion coefficients are not so small // that they don't get optimized. This modifies the camera models in place. // This does not change indices given by --fixed-distortion-indices. void ensureMinDistortion(std::vector & camera_models, BACameraType camera_type, IntrinsicOptions const& intrinsics_opts, std::vector const& fixed_distortion_indices, int max_num_dist_params, double min_distortion) { int num_cameras = camera_models.size(); bool message_printed = false; // Check that all distortion indices are between 0 and max_num_dist_params-1. for (size_t i = 0; i < fixed_distortion_indices.size(); i++) { if (fixed_distortion_indices[i] < 0 || fixed_distortion_indices[i] >= max_num_dist_params) vw_throw(ArgumentErr() << "The values in --fixed-distortion-indices " << "are out of range given the number of distortion coefficients.\n"); } // Put fixed_distortion_indices in a set for faster searching std::set fixed_dist_set; for (size_t i = 0; i < fixed_distortion_indices.size(); i++) fixed_dist_set.insert(fixed_distortion_indices[i]); for (size_t cam_it = 0; cam_it < camera_models.size(); cam_it++) { // See if this logic is needed if (camera_type == BaCameraType_Pinhole) { auto pin_ptr = boost::dynamic_pointer_cast (camera_models[cam_it]); if (!pin_ptr) vw_throw(ArgumentErr() << "Expecting a Pinhole camera.\n"); } else if (camera_type == BaCameraType_CSM) { auto csm_ptr = boost::dynamic_pointer_cast(camera_models[cam_it]); if (!csm_ptr) vw_throw(ArgumentErr() << "Expecting a CSM camera.\n"); // Non radtan cameras have distortion that is not normalized by focal // length. Better not mess with it. DistortionType dist_type = csm_ptr->distortion_type(); if (dist_type != DistortionType::RADTAN) continue; } else if (camera_type == BaCameraType_OpticalBar) { continue; // likely not needed for optical bar } else if (camera_type == BaCameraType_Other) { continue; // distortion does not get handled } else { vw_throw(ArgumentErr() << "Unknown camera type.\n"); } if (!intrinsics_opts.float_distortion_params(cam_it)) continue; // distortion is not being optimized for this camera // Adjust the distortion parameters, unless they are fixed, via // --fixed-distortion-indices. vw::Vector dist_params; asp::get_distortion(camera_models[cam_it].get(), dist_params); for (size_t i = 0; i < dist_params.size(); i++) { if (std::abs(dist_params[i]) < std::abs(min_distortion) && !fixed_dist_set.count(i)) { dist_params[i] = min_distortion; if (!message_printed) { vw::vw_out(vw::WarningMessage) << "Setting distortion parameters to at least " << min_distortion << " (option --min-distortion) to ensure they are optimized.\n"; message_printed = true; } } } asp::set_distortion(camera_models[cam_it].get(), dist_params); } // end loop through cameras return; } // Sanity check. This does not prevent the user from setting the wrong datum, // but it can catch unreasonable height values for GCP. void checkGcpRadius(vw::cartography::Datum const& datum, vw::ba::ControlNetwork const& cnet) { int num_points = cnet.size(); for (int ipt = 0; ipt < num_points; ipt++) { if (cnet[ipt].type() != ControlPoint::GroundControlPoint) continue; vw::Vector3 observation = cnet[ipt].position(); double thresh = 2e+5; // 200 km if (std::abs(norm_2(observation) - datum.semi_major_axis()) > thresh || std::abs(norm_2(observation) - datum.semi_minor_axis()) > thresh) vw_out(vw::WarningMessage) << "GCP " << ipt << " has ECEF radius differing from the datum by more than " << thresh << " m. Check your GCPs and datum.\n"; } return; } // Some logic for camera position uncertainty, used in bundle_adjust and jitter_solve void handleCameraPositionUncertainty(asp::BaBaseOptions & opt, bool have_datum) { // Create map from image name to index std::map image_name_to_index; for (int i = 0; i < (int)opt.image_files.size(); i++) image_name_to_index[opt.image_files[i]] = i; // Resize opt.camera_position_uncertainty to the number of images opt.camera_position_uncertainty.resize(opt.image_files.size(), vw::Vector2(0, 0)); // Handle the case when uncertainty is two values separated by a comma std::string sep = ","; std::vector vals = vw::str_to_std_vec(opt.camera_position_uncertainty_str, sep); if (vals.size() == 2) { for (int i = 0; i < (int)opt.image_files.size(); i++) opt.camera_position_uncertainty[i] = vw::Vector2(vals[0], vals[1]); } else { // Read the uncertainties per image from file std::string image_name; double horiz = 0, vert = 0; std::ifstream ifs(opt.camera_position_uncertainty_str.c_str()); if (!ifs.good()) vw_throw(ArgumentErr() << "Cannot read camera position uncertainty from: " << opt.camera_position_uncertainty_str << ".\n"); while (ifs >> image_name >> horiz >> vert) { auto it = image_name_to_index.find(image_name); if (it == image_name_to_index.end()) continue; // skip images having uncertainty that are not in the image list int index = it->second; opt.camera_position_uncertainty[index] = Vector2(horiz, vert); } } // This constraint requires the solver to work harder to converge. opt.parameter_tolerance = std::min(opt.parameter_tolerance, 1e-10); // Ensure each horizontal and vertical uncertainty is positive for (int i = 0; i < (int)opt.image_files.size(); i++) { if (opt.camera_position_uncertainty[i][0] <= 0 || opt.camera_position_uncertainty[i][1] <= 0) vw::vw_throw(vw::ArgumentErr() << "The camera uncertainty for each image must be set and be positive.\n"); } // The power must be positive if (opt.camera_position_uncertainty_power <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The value of --camera-position-uncertainty-power must be positive.\n"); // When there is camera position uncertainty, the other camera weights must be 0. if (opt.camera_position_weight > 0) { vw::vw_out() << "Setting --camera-position-weight to 0 as " << "--camera-position-uncertainty is positive.\n"; opt.camera_position_weight = 0; } if (opt.camera_weight > 0) { vw::vw_out() << "Setting --camera-weight to 0 as --camera-position-uncertainty " << "is positive.\n"; opt.camera_weight = 0; } if (!have_datum) vw::vw_throw(vw::ArgumentErr() << "Cannot use camera uncertainties without a datum. Set --datum.\n"); } } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustCostFuns.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Cost functions used in bundle adjustment. These need access to the camera // models, so they are stored in the Camera folder. #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::camera; namespace asp { double g_big_pixel_value = 1000.0; // don't make this too big /// Used to accumulate the number of reprojection errors in bundle adjustment. int g_ba_num_errors = 0; vw::Mutex g_ba_mutex; // Return the size of each parameter block. // These should sum up to equal num_params. // The first block is always the point block (3) and // the second block is always the pose block (6). std::vector BaCamBase::get_block_sizes() const { std::vector result(2); result[0] = num_point_params(); result[1] = num_pose_params(); return result; } // Read in all of the parameters and compute the residuals. vw::Vector2 BaAdjCam::evaluate(std::vector const param_blocks) const { double const* raw_point = param_blocks[0]; double const* raw_pose = param_blocks[1]; // Read the point location and camera information from the raw arrays. Vector3 point(raw_point[0], raw_point[1], raw_point[2]); CameraAdjustment correction(raw_pose); // Create adjusted camera that applies corrections to the underlying camera vw::camera::AdjustedCameraModel cam(m_underlying_camera, correction.position(), correction.pose()); try { // Bathy or not if (asp::hasBathy(m_bathy_data)) return vw::point_to_pixel(&cam, m_bathy_data.bathy_planes[m_camera_index], m_bathy_data.refraction_index, point); else return cam.point_to_pixel(point); } catch(std::exception const& e) { } // We must not allow one bad point to ruin the optimization return vw::Vector2(g_big_pixel_value, g_big_pixel_value); } BaPinholeCam::BaPinholeCam(boost::shared_ptr cam, vw::BathyData const& bathy_data, int camera_index): m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {} // The number of lens distortion parameters. int BaPinholeCam::num_dist_params() const { vw::Vector lens_params = m_underlying_camera->lens_distortion()->distortion_parameters(); return lens_params.size(); } std::vector BaPinholeCam::get_block_sizes() const { std::vector result = BaCamBase::get_block_sizes(); result.push_back(asp::NUM_CENTER_PARAMS); result.push_back(asp::NUM_FOCUS_PARAMS); result.push_back(num_dist_params()); return result; } // Read in all of the parameters and compute the residuals. vw::Vector2 BaPinholeCam::evaluate(std::vector const param_blocks) const { double const* raw_point = param_blocks[0]; double const* raw_pose = param_blocks[1]; double const* raw_center = param_blocks[2]; double const* raw_focus = param_blocks[3]; double const* raw_lens = param_blocks[4]; // TODO: Should these values also be scaled? // Read the point location and camera information from the raw arrays. Vector3 point(raw_point[0], raw_point[1], raw_point[2]); CameraAdjustment correction(raw_pose); // We actually solve for scale factors for intrinsic values, so multiply them // by the original intrinsic values to get the updated values. double center_x = raw_center[0] * m_underlying_camera->point_offset()[0]; double center_y = raw_center[1] * m_underlying_camera->point_offset()[1]; double focus = raw_focus [0] * m_underlying_camera->focal_length()[0]; // Update the lens distortion parameters in the new camera. // - These values are also optimized as scale factors. // TODO: This approach FAILS when the input value is zero!! boost::shared_ptr distortion = m_underlying_camera->lens_distortion()->copy(); vw::Vector lens = distortion->distortion_parameters(); for (size_t i = 0; i < lens.size(); i++) lens[i] *= raw_lens[i]; distortion->set_distortion_parameters(lens); // Duplicate the input camera model with the pose, focus, center, and lens updated. // Respect m_u_direction, m_v_direction, m_w_direction in the original model. vw::camera::PinholeModel cam = *m_underlying_camera; cam.set_camera_center(correction.position()); cam.set_camera_pose(correction.pose().rotation_matrix()); cam.set_focal_length(vw::Vector2(focus, focus)); cam.set_point_offset(vw::Vector2(center_x, center_y)); cam.set_lens_distortion(distortion.get()); cam.set_pixel_pitch(m_underlying_camera->pixel_pitch()); try { // Bathy or not if (asp::hasBathy(m_bathy_data)) return vw::point_to_pixel(&cam, m_bathy_data.bathy_planes[m_camera_index], m_bathy_data.refraction_index, point); else return cam.point_to_pixel_no_check(point); } catch(...) { } // Do not allow one bad pixel value to ruin the whole problem return vw::Vector2(g_big_pixel_value, g_big_pixel_value); } BaOpticalBarCam::BaOpticalBarCam( boost::shared_ptr cam, vw::BathyData const& bathy_data, int camera_index): m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {} int BaOpticalBarCam::num_intrinsic_params() const { return asp::NUM_CENTER_PARAMS + asp::NUM_FOCUS_PARAMS + asp::NUM_OPTICAL_BAR_EXTRA_PARAMS; } std::vector BaOpticalBarCam::get_block_sizes() const { std::vector result = BaCamBase::get_block_sizes(); result.push_back(asp::NUM_CENTER_PARAMS); result.push_back(asp::NUM_FOCUS_PARAMS); result.push_back(asp::NUM_OPTICAL_BAR_EXTRA_PARAMS); return result; } // Read in all of the parameters and compute the residuals. vw::Vector2 BaOpticalBarCam::evaluate(std::vector const param_blocks) const { double const* raw_point = param_blocks[0]; double const* raw_pose = param_blocks[1]; double const* raw_center = param_blocks[2]; double const* raw_focus = param_blocks[3]; double const* raw_intrin = param_blocks[4]; // TODO: Should these values also be scaled? // Read the point location and camera information from the raw arrays. Vector3 point(raw_point[0], raw_point[1], raw_point[2]); CameraAdjustment correction(raw_pose); // We actually solve for scale factors for intrinsic values, so multiply them // by the original intrinsic values to get the updated values. double center_x = raw_center[0] * m_underlying_camera->get_optical_center()[0]; double center_y = raw_center[1] * m_underlying_camera->get_optical_center()[1]; double focus = raw_focus [0] * m_underlying_camera->get_focal_length(); double speed = raw_intrin[0] * m_underlying_camera->get_speed(); double mcf = raw_intrin[1] * m_underlying_camera->get_motion_compensation(); double scan_time = raw_intrin[2] * m_underlying_camera->get_scan_time(); // The velocity is a 3-vector bool have_velocity_vec = m_underlying_camera->get_have_velocity_vec(); vw::Vector3 vel(0, 0, 0); vw::Vector3 final_pose(std::numeric_limits::quiet_NaN(), 0, 0); if (have_velocity_vec) { vel = m_underlying_camera->get_velocity(); final_pose = m_underlying_camera->get_final_pose(); vel[0] *= raw_intrin[3]; vel[1] *= raw_intrin[4]; vel[2] *= raw_intrin[5]; final_pose[0] *= raw_intrin[6]; final_pose[1] *= raw_intrin[7]; final_pose[2] *= raw_intrin[8]; } // Create an optical bar camera with updated pose, focus, center, speed, and MCF vw::camera::OpticalBarModel cam(m_underlying_camera->get_image_size(), vw::Vector2(center_x, center_y), m_underlying_camera->get_pixel_size(), focus, scan_time, m_underlying_camera->get_scan_dir(), m_underlying_camera->get_forward_tilt(), correction.position(), correction.pose().axis_angle(), speed, mcf, have_velocity_vec, vel, final_pose); // Project the point into the camera. try { // Bathy or not if (asp::hasBathy(m_bathy_data)) return vw::point_to_pixel(&cam, m_bathy_data.bathy_planes[m_camera_index], m_bathy_data.refraction_index, point); else return cam.point_to_pixel(point); } catch(std::exception const& e) { } // We must not allow one bad point to ruin the optimization return vw::Vector2(g_big_pixel_value, g_big_pixel_value); } std::vector BaCsmCam::get_block_sizes() const { std::vector result = BaCamBase::get_block_sizes(); result.push_back(asp::NUM_CENTER_PARAMS); result.push_back(asp::NUM_FOCUS_PARAMS); result.push_back(num_dist_params()); return result; } // Read in all of the parameters and compute the residuals. vw::Vector2 BaCsmCam::evaluate(std::vector const param_blocks) const { // TODO(oalexan1): Use here transformedCsmCamera() to avoid code repetition. // But note that that one may set zero distortion to 1e-16 which likely here // we don't need to do. double const* raw_point = param_blocks[0]; double const* raw_pose = param_blocks[1]; double const* raw_center = param_blocks[2]; double const* raw_focus = param_blocks[3]; double const* raw_dist = param_blocks[4]; // TODO: Should these values also be scaled? // Read the point location and camera information from the raw arrays. Vector3 point(raw_point[0], raw_point[1], raw_point[2]); CameraAdjustment correction(raw_pose); // We actually solve for scale factors for intrinsic values, so multiply them // by the original intrinsic values to get the updated values. vw::Vector2 optical_center = m_underlying_camera->optical_center(); double focal_length = m_underlying_camera->focal_length(); optical_center[0] = raw_center[0] * optical_center[0]; optical_center[1] = raw_center[1] * optical_center[1]; focal_length = raw_focus [0] * focal_length; // Update the lens distortion parameters in the new camera. // - These values are also optimized as scale factors. std::vector distortion = m_underlying_camera->distortion(); for (size_t i = 0; i < distortion.size(); i++) distortion[i] = raw_dist[i] * distortion[i]; // Duplicate the input camera model boost::shared_ptr copy; m_underlying_camera->deep_copy(copy); // Update the intrinsics of the copied model copy->set_optical_center(optical_center); copy->set_focal_length(focal_length); copy->set_distortion(distortion); // Form the adjusted camera. Note that unlike for Pinhole and Optical // bar, the parameters being optimized adjust the initial CSM camera, // rather than replacing it altogether. The CSM camera can in fact // be even linescan, when there would be many pose samples, in fact, // so it makes sense to work this way. AdjustedCameraModel adj_cam(copy, correction.position(), correction.pose()); try { // Bathy or not if (asp::hasBathy(m_bathy_data)) return vw::point_to_pixel(&adj_cam, m_bathy_data.bathy_planes[m_camera_index], m_bathy_data.refraction_index, point); else return adj_cam.point_to_pixel(point); } catch(...) { } // Do not allow one bad pixel value to ruin the whole problem return vw::Vector2(g_big_pixel_value, g_big_pixel_value); } // Call to work with ceres::DynamicCostFunctions. // - Takes array of arrays. bool BaReprojErr::operator()(double const * const * parameters, double * residuals) const { try { // Unpack the parameter blocks std::vector param_blocks(m_num_param_blocks); for (size_t i = 0; i < m_num_param_blocks; i++) { param_blocks[i] = parameters[i]; } // Use the adapted camera model to handle all of the parameter blocks. Vector2 prediction = m_ba_cam->evaluate(param_blocks); // The error is the difference between the predicted and observed pixel // position, normalized by sigma. residuals[0] = (prediction[0] - m_observation[0])/m_pixel_sigma[0]; residuals[1] = (prediction[1] - m_observation[1])/m_pixel_sigma[1]; } catch (std::exception const& e) { // TODO: Catch only projection errors? // Failed to compute residuals Mutex::Lock lock(g_ba_mutex); g_ba_num_errors++; if (g_ba_num_errors < 100) { vw_out(ErrorMessage) << e.what() << std::endl; } else if (g_ba_num_errors == 100) { vw_out() << "Will print no more error messages about " << "failing to compute residuals.\n"; } residuals[0] = g_big_pixel_value; residuals[1] = g_big_pixel_value; return false; } return true; } // Factory to hide the construction of the CostFunction object from the client code. ceres::CostFunction* BaReprojErr::Create(Vector2 const& observation, Vector2 const& pixel_sigma, boost::shared_ptr ba_cam) { const int NUM_RESIDUALS = 2; ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction( new BaReprojErr(observation, pixel_sigma, ba_cam)); // The residual size is always the same. cost_function->SetNumResiduals(NUM_RESIDUALS); // The adapted camera model knows all of the block sizes to add. std::vector block_sizes = ba_cam->get_block_sizes(); for (size_t i = 0; i < block_sizes.size(); i++) { cost_function->AddParameterBlock(block_sizes[i]); } return cost_function; } // Adaptor to work with ceres::DynamicCostFunctions. bool BaDispXyzErr::operator()(double const* const* parameters, double* residuals) const { try{ // Split apart the input parameter blocks and hand them to the camera wrappers. std::vector left_param_blocks, right_param_blocks; unpack_residual_pointers(parameters, left_param_blocks, right_param_blocks); // Get pixel projection in both cameras. Vector2 left_prediction = m_left_ba_cam->evaluate (left_param_blocks); Vector2 right_prediction = m_right_ba_cam->evaluate(right_param_blocks); // See how consistent that is with the observed disparity. bool good_ans = true; if (!m_interp_disp.pixel_in_bounds(left_prediction)) { good_ans = false; } else { DispPixelT dispPix = m_interp_disp(left_prediction[0], left_prediction[1]); if (!is_valid(dispPix)) { good_ans = false; } else { Vector2 right_prediction_from_disp = left_prediction + dispPix.child(); residuals[0] = right_prediction_from_disp[0] - right_prediction[0]; residuals[1] = right_prediction_from_disp[1] - right_prediction[1]; for (size_t it = 0; it < 2; it++) residuals[it] *= m_reference_terrain_weight; } } // TODO: Think more of what to do below. The hope is that the robust cost // function will take care of big residuals graciously. if (!good_ans) { // Failed to find the residuals for (size_t it = 0; it < 2; it++) residuals[it] = m_max_disp_error * m_reference_terrain_weight; return true; } } catch (const camera::PointToPixelErr& e) { // Failed to project into the camera for (size_t it = 0; it < 2; it++) residuals[it] = m_max_disp_error * m_reference_terrain_weight; return true; } return true; } // TODO: Should this logic live somewhere else? /// Create the list of residual pointers when solving for intrinsics. /// - Extra logic is needed to avoid duplicate pointers. void BaDispXyzErr::get_residual_pointers(asp::BaParams ¶m_storage, int left_cam_index, int right_cam_index, bool solve_intrinsics, asp::IntrinsicOptions const& intrinsics_opt, std::vector &residual_ptrs) { double* left_cam = param_storage.get_camera_ptr(left_cam_index); double* right_cam = param_storage.get_camera_ptr(right_cam_index); residual_ptrs.clear(); if (solve_intrinsics) { double* left_center = param_storage.get_intrinsic_center_ptr (left_cam_index); double* left_focus = param_storage.get_intrinsic_focus_ptr (left_cam_index); double* left_distortion = param_storage.get_intrinsic_distortion_ptr(left_cam_index); double* right_center = param_storage.get_intrinsic_center_ptr (right_cam_index); double* right_focus = param_storage.get_intrinsic_focus_ptr (right_cam_index); double* right_distortion = param_storage.get_intrinsic_distortion_ptr(right_cam_index); residual_ptrs.push_back(left_cam); residual_ptrs.push_back(left_center); residual_ptrs.push_back(left_focus); residual_ptrs.push_back(left_distortion); residual_ptrs.push_back(right_cam); if (!intrinsics_opt.center_shared) residual_ptrs.push_back(right_center); if (!intrinsics_opt.focus_shared) residual_ptrs.push_back(right_focus); if (!intrinsics_opt.distortion_shared) residual_ptrs.push_back(right_distortion); } else { // This handles the generic camera case. residual_ptrs.push_back(left_cam); residual_ptrs.push_back(right_cam); } return; } void BaDispXyzErr::unpack_residual_pointers(double const* const* parameters, std::vector & left_param_blocks, std::vector & right_param_blocks) const { left_param_blocks.resize (m_num_left_param_blocks); right_param_blocks.resize(m_num_right_param_blocks); double const* raw_point = &(m_reference_xyz[0]); left_param_blocks [0] = raw_point; // The first input is always the point param block. right_param_blocks[0] = raw_point; int index = 0; for (size_t i = 1; i < m_num_left_param_blocks; i++) { left_param_blocks[i] = parameters[index]; index++; } if (!m_solve_intrinsics) { // Unpack everything from the right block in order. for (size_t i = 1; i < m_num_right_param_blocks; i++) { right_param_blocks[i] = parameters[index]; index++; } } else { // Solve for intrinsics. Handle shared intrinsics. right_param_blocks[1] = parameters[index]; // Pose and position index++; if (m_intrinsics_opt.center_shared) right_param_blocks[2] = left_param_blocks[2]; else { right_param_blocks[2] = parameters[index]; index++; } if (m_intrinsics_opt.focus_shared) right_param_blocks[3] = left_param_blocks[3]; else { right_param_blocks[3] = parameters[index]; index++; } if (m_intrinsics_opt.distortion_shared) right_param_blocks[4] = left_param_blocks[4]; else { right_param_blocks[4] = parameters[index]; index++; } } // End pinhole case } // Factory to hide the construction of the CostFunction object from // the client code. ceres::CostFunction* BaDispXyzErr::Create( double max_disp_error, double reference_terrain_weight, Vector3 const& reference_xyz, ImageViewRef const& interp_disp, boost::shared_ptr left_ba_cam, boost::shared_ptr right_ba_cam, bool solve_intrinsics, asp::IntrinsicOptions intrinsics_opt) { const int NUM_RESIDUALS = 2; ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction( new BaDispXyzErr(max_disp_error, reference_terrain_weight, reference_xyz, interp_disp, left_ba_cam, right_ba_cam, solve_intrinsics, intrinsics_opt)); // The residual size is always the same. cost_function->SetNumResiduals(NUM_RESIDUALS); // Add all of the blocks for each camera, except for the first (point) // block which is provided at creation time. std::vector block_sizes = left_ba_cam->get_block_sizes(); for (size_t i = 1; i < block_sizes.size(); i++) { cost_function->AddParameterBlock(block_sizes[i]); } block_sizes = right_ba_cam->get_block_sizes(); if (!solve_intrinsics) { for (size_t i = 1; i < block_sizes.size(); i++) { cost_function->AddParameterBlock(block_sizes[i]); } } else { // Pinhole handling if (block_sizes.size() != 5) vw_throw(LogicErr() << "Error: Pinhole camera model parameter number error!"); cost_function->AddParameterBlock(block_sizes[1]); // The camera position/pose if (!intrinsics_opt.center_shared) cost_function->AddParameterBlock(block_sizes[2]); if (!intrinsics_opt.focus_shared) cost_function->AddParameterBlock(block_sizes[3]); if (!intrinsics_opt.distortion_shared) cost_function->AddParameterBlock(block_sizes[4]); } return cost_function; } // End function Create /// From the input options select the correct Ceres loss function. ceres::LossFunction* get_loss_function(std::string const& cost_function, double th) { ceres::LossFunction* loss_function = NULL; if (cost_function == "l2") loss_function = NULL; else if (cost_function == "trivial") loss_function = new ceres::TrivialLoss(); else if (cost_function == "huber") loss_function = new ceres::HuberLoss(th); else if (cost_function == "cauchy") loss_function = new ceres::CauchyLoss(th); else if (cost_function == "l1") loss_function = new ceres::SoftLOneLoss(th); else { vw::vw_throw(vw::ArgumentErr() << "Unknown cost function: " << cost_function << ".\n"); } return loss_function; } /// Add error source for projecting a 3D point into the camera. void addReprojResidual(vw::Vector2 const& observation, vw::Vector2 const& pixel_sigma, int point_index, int camera_index, asp::BaParams & param_storage, asp::BaOptions const& opt, ceres::SubsetManifold * dist_opts, ceres::Problem & problem) { ceres::LossFunction* loss_function; loss_function = get_loss_function(opt.cost_function, opt.robust_threshold); boost::shared_ptr cam = opt.camera_models[camera_index]; double* camera = param_storage.get_camera_ptr(camera_index); double* point = param_storage.get_point_ptr(point_index); if (opt.camera_type == asp::BaCameraType_Other) { // The generic camera case. This includes pinhole and CSM too, when // the adjustments are external and intrinsics are not solved for. boost::shared_ptr ba_cam(new BaAdjCam(cam, opt.bathy_data, camera_index)); ceres::CostFunction* cost_function = BaReprojErr::Create(observation, pixel_sigma, ba_cam); problem.AddResidualBlock(cost_function, loss_function, point, camera); } else { // Solve for intrinsics for Pinhole, optical bar, or CSM camera double* center = param_storage.get_intrinsic_center_ptr (camera_index); double* focus = param_storage.get_intrinsic_focus_ptr (camera_index); double* distortion = param_storage.get_intrinsic_distortion_ptr(camera_index); boost::shared_ptr ba_cam; if (opt.camera_type == asp::BaCameraType_Pinhole) { boost::shared_ptr pinhole_model = boost::dynamic_pointer_cast(cam); if (pinhole_model.get() == NULL) vw::vw_throw(vw::ArgumentErr() << "Tried to add pinhole block with non-pinhole camera."); ba_cam = boost::make_shared(pinhole_model, opt.bathy_data, camera_index); } else if (opt.camera_type == asp::BaCameraType_OpticalBar) { boost::shared_ptr bar_model = boost::dynamic_pointer_cast(cam); if (bar_model.get() == NULL) vw::vw_throw(vw::ArgumentErr() << "Tried to add optical bar block with " << "non-optical bar camera."); ba_cam = boost::make_shared(bar_model, opt.bathy_data, camera_index); } else if (opt.camera_type == asp::BaCameraType_CSM) { boost::shared_ptr csm_model = boost::dynamic_pointer_cast(cam); if (csm_model.get() == NULL) vw::vw_throw(vw::ArgumentErr() << "Tried to add CSM block with " << "non-CSM camera."); ba_cam = boost::make_shared(csm_model, opt.bathy_data, camera_index); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera type."); } ceres::CostFunction* cost_function = BaReprojErr::Create(observation, pixel_sigma, ba_cam); problem.AddResidualBlock(cost_function, loss_function, point, camera, center, focus, distortion); // Apply the residual limits size_t num_limits = opt.intrinsics_limits.size() / 2; if ((num_limits > 0) && (num_limits > ba_cam->num_intrinsic_params())) vw::vw_throw(vw::ArgumentErr() << "Error: Too many intrinsic limits provided." << " This model has " << ba_cam->num_intrinsic_params() << " intrinsic parameters."); size_t intrinsics_index = 0; // Focal length if (num_limits > 0) { problem.SetParameterLowerBound(focus, 0, opt.intrinsics_limits[0]); problem.SetParameterUpperBound(focus, 0, opt.intrinsics_limits[1]); intrinsics_index++; } // Optical center while ((intrinsics_index < 3) && (intrinsics_index < num_limits)) { problem.SetParameterLowerBound(center, intrinsics_index-1, opt.intrinsics_limits[2*intrinsics_index]); problem.SetParameterUpperBound(center, intrinsics_index-1, opt.intrinsics_limits[2*intrinsics_index + 1]); intrinsics_index++; } // Distortion while (intrinsics_index < num_limits) { problem.SetParameterLowerBound(distortion, intrinsics_index-3, opt.intrinsics_limits[2*intrinsics_index]); problem.SetParameterUpperBound(distortion, intrinsics_index-3, opt.intrinsics_limits[2*intrinsics_index + 1]); intrinsics_index++; } // If we don't want to solve for something, just tell Ceres not to adjust the values. if (!opt.intrinsics_options.float_optical_center(camera_index)) problem.SetParameterBlockConstant(center); if (!opt.intrinsics_options.float_focal_length(camera_index)) problem.SetParameterBlockConstant(focus); if (opt.intrinsics_options.float_distortion_params(camera_index)) { if (!opt.fixed_distortion_indices.empty() && dist_opts != NULL) problem.SetManifold(distortion, dist_opts); } else { problem.SetParameterBlockConstant(distortion); } } // End non-generic camera case. // Fix this camera if requested if (opt.fixed_cameras_indices.find(camera_index) != opt.fixed_cameras_indices.end()) problem.SetParameterBlockConstant(param_storage.get_camera_ptr(camera_index)); } /// Add residual block for the error using reference xyz. void addDispResidual(vw::Vector3 const& reference_xyz, vw::ImageViewRef const& interp_disp, int left_cam_index, int right_cam_index, asp::BaParams & param_storage, asp::BaOptions const& opt, ceres::Problem & problem) { ceres::LossFunction* loss_function = get_loss_function(opt.cost_function, opt.robust_threshold); boost::shared_ptr left_cam = opt.camera_models[left_cam_index ]; boost::shared_ptr right_cam = opt.camera_models[right_cam_index]; const bool inline_adjustments = (opt.camera_type != asp::BaCameraType_Other); // Get the list of residual pointers that will be passed to ceres. std::vector residual_ptrs; BaDispXyzErr::get_residual_pointers(param_storage, left_cam_index, right_cam_index, inline_adjustments, opt.intrinsics_options, residual_ptrs); if (opt.camera_type == asp::BaCameraType_Other) { boost::shared_ptr left_ba_cam (new BaAdjCam(left_cam, opt.bathy_data, left_cam_index)); boost::shared_ptr right_ba_cam(new BaAdjCam(right_cam, opt.bathy_data, right_cam_index)); ceres::CostFunction* cost_function = BaDispXyzErr::Create(opt.max_disp_error, opt.reference_terrain_weight, reference_xyz, interp_disp, left_ba_cam, right_ba_cam, inline_adjustments, opt.intrinsics_options); problem.AddResidualBlock(cost_function, loss_function, residual_ptrs); } else { // Inline adjustments boost::shared_ptr left_ba_cam, right_ba_cam; if (opt.camera_type == asp::BaCameraType_Pinhole) { boost::shared_ptr left_pinhole_model = boost::dynamic_pointer_cast(left_cam); boost::shared_ptr right_pinhole_model = boost::dynamic_pointer_cast(right_cam); left_ba_cam = boost::make_shared(left_pinhole_model, opt.bathy_data, left_cam_index); right_ba_cam = boost::make_shared(right_pinhole_model, opt.bathy_data, right_cam_index); } else if (opt.camera_type == asp::BaCameraType_OpticalBar) { boost::shared_ptr left_bar_model = boost::dynamic_pointer_cast(left_cam); boost::shared_ptr right_bar_model = boost::dynamic_pointer_cast(right_cam); left_ba_cam = boost::make_shared(left_bar_model, opt.bathy_data, left_cam_index); right_ba_cam = boost::make_shared(right_bar_model, opt.bathy_data, right_cam_index); } else if (opt.camera_type == asp::BaCameraType_CSM) { boost::shared_ptr left_csm_model = boost::dynamic_pointer_cast(left_cam); boost::shared_ptr right_csm_model = boost::dynamic_pointer_cast(right_cam); left_ba_cam = boost::make_shared(left_csm_model, opt.bathy_data, left_cam_index); right_ba_cam = boost::make_shared(right_csm_model, opt.bathy_data, right_cam_index); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera type."); } ceres::CostFunction* cost_function = BaDispXyzErr::Create(opt.max_disp_error, opt.reference_terrain_weight, reference_xyz, interp_disp, left_ba_cam, right_ba_cam, inline_adjustments, opt.intrinsics_options); problem.AddResidualBlock(cost_function, loss_function, residual_ptrs); } } // End function addDispResidual // Pixel reprojection error. Note: cam_residual_counts and num_pixels_per_cam // serve different purposes. void addPixelReprojCostFun(asp::BaOptions const& opt, asp::CRN const& crn, std::vector const& count_map, vw::ImageViewRef> const& weight_image, vw::cartography::GeoReference const& weight_image_georef, std::vector const& dem_xyz_vec, bool have_weight_image, bool have_dem, // Outputs vw::ba::ControlNetwork & cnet, asp::BaParams & param_storage, ceres::SubsetManifold * dist_opts, ceres::Problem & problem, std::vector & cam_residual_counts, std::vector & num_pixels_per_cam, std::vector> & pixels_per_cam, std::vector> & tri_points_per_cam, std::vector> & pixel_sigmas) { int num_cameras = param_storage.num_cameras(); int num_points = param_storage.num_points(); if ((int)crn.size() != num_cameras) vw_throw(ArgumentErr() << "Book-keeping error, the size of CameraRelationNetwork " << "must equal the number of images.\n"); cam_residual_counts.resize(num_cameras); num_pixels_per_cam.resize(num_cameras); pixels_per_cam.resize(num_cameras); tri_points_per_cam.resize(num_cameras); pixel_sigmas.resize(num_cameras); for (int icam = 0; icam < num_cameras; icam++) { // Camera loop cam_residual_counts[icam] = 0; num_pixels_per_cam[icam] = 0; for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // IP loop // The index of the 3D point this IP is for. int ipt = (**fiter).m_point_id; if (param_storage.get_point_outlier(ipt)) continue; // skip outliers VW_ASSERT(int(icam) < num_cameras, ArgumentErr() << "Out of bounds in the number of cameras."); VW_ASSERT(int(ipt) < num_points, ArgumentErr() << "Out of bounds in the number of points."); double* point = param_storage.get_point_ptr(ipt); if (point[0] == 0 && point[1] == 0 && point[2] == 0) { // Flag points in the center of the planet as outliers param_storage.set_point_outlier(ipt, true); continue; } // Weight from image, if provided vw::PixelMask img_wt = 1.0; if (have_weight_image) { Vector3 ecef(point[0], point[1], point[2]); img_wt = vw::cartography::closestPixelVal(weight_image, weight_image_georef, ecef); // Flag bad weights as outliers if (!is_valid(img_wt) || std::isnan(img_wt.child()) || img_wt.child() <= 0.0) { param_storage.set_point_outlier(ipt, true); continue; } } // Adjust non-GCP triangulated points based on the DEM, if // provided. bool is_gcp = (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint); if (have_dem && !is_gcp && dem_xyz_vec.at(ipt) != Vector3(0, 0, 0)) { // Update the tri point in param_storage based on the DEM. for (int p = 0; p < 3; p++) point[p] = dem_xyz_vec.at(ipt)[p]; // Set the point type, so we can track it later cnet[ipt].set_type(vw::ba::ControlPoint::PointFromDem); // Update the cnet as well. This will be used later. cnet[ipt].set_position(Vector3(point[0], point[1], point[2])); // Set the uncertainty to the uncertainty of the DEM double s = opt.heights_from_dem_uncertainty; cnet[ipt].set_sigma(Vector3(s, s, s)); } // The observed value for the projection of point with index ipt into // the camera with index icam. Vector2 observation = (**fiter).m_location; Vector2 pixel_sigma = (**fiter).m_scale; // This is a bugfix if (pixel_sigma != pixel_sigma) // nan check pixel_sigma = Vector2(1, 1); if (pixel_sigma[0] <= 0.0 || pixel_sigma[1] <= 0.0) { // Cannot add a cost function term with non-positive pixel sigma param_storage.set_point_outlier(ipt, true); continue; } double p = opt.overlap_exponent; if (p > 0 && count_map[ipt] > 2) { // Give more weight to points that are seen in more images. // This should not be overused. double delta = pow(count_map[ipt] - 1.0, p); pixel_sigma /= delta; } // Apply the weight image if (have_weight_image) pixel_sigma /= img_wt.child(); // Need this for --camera-position-weight if (opt.camera_position_weight > 0) { pixels_per_cam[icam].push_back(observation); tri_points_per_cam[icam].push_back(cnet[ipt].position()); } // For computing pixel reprojection errors pixel_sigmas[icam][ipt] = pixel_sigma; // Call function to add the appropriate Ceres residual block. addReprojResidual(observation, pixel_sigma, ipt, icam, param_storage, opt, dist_opts, problem); cam_residual_counts[icam]++; // Track the number of residual blocks for each camera num_pixels_per_cam[icam]++; // Track the number of pixels for each camera } // end iterating over points } // end iterating over cameras return; } // Add a soft constraint that ties triangulated points close to their initial positions. // This is adjusted for GSD. void addTriConstraint(asp::BaOptions const& opt, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, std::vector const& image_files, std::vector const& orig_cams, double tri_weight, std::string cost_function_str, double tri_robust_threshold, // Outputs asp::BaParams & param_storage, ceres::Problem & problem, int & num_tri_residuals) { // Initialize the output num_tri_residuals = 0; // Tri weight must be positive if (tri_weight <= 0) vw::vw_throw(vw::ArgumentErr() << "The triangulation weight must be positive.\n"); int num_points = param_storage.num_points(); if ((int)cnet.size() != num_points) vw_throw(ArgumentErr() << "Book-keeping error, the size of the control network " "must be the same as the number of triangulated points.\n"); // Add triangulation weight to make each triangulated point not move too far std::vector gsds; asp::estimateGsdPerTriPoint(image_files, orig_cams, crn, param_storage, gsds); for (int ipt = 0; ipt < num_points; ipt++) { if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint || cnet[ipt].type() == vw::ba::ControlPoint::PointFromDem) continue; // Skip GCPs and height-from-dem points which have their own constraint if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // Use as constraint the triangulated point optimized at the previous // iteration. That is on purpose, to ensure that the triangulated point is // more accurate than it was at the start of the optimization. For the // first iteration, that will be what is read from the cnet. Note how the // weight is normalized by the GSD, to make it in pixel coordinates, as // the rest of the residuals. double * point = param_storage.get_point_ptr(ipt); Vector3 observation(point[0], point[1], point[2]); double gsd = gsds[ipt]; if (gsd <= 0 || std::isnan(gsd)) continue; // GSD calculation failed. Do not use a constraint. double s = gsd/tri_weight; Vector3 xyz_sigma(s, s, s); ceres::CostFunction* cost_function = XYZError::Create(observation, xyz_sigma); ceres::LossFunction* loss_function = get_loss_function(cost_function_str, tri_robust_threshold); problem.AddResidualBlock(cost_function, loss_function, point); num_tri_residuals++; } // End loop through xyz } // end adding a triangulation constraint // Add a cost function meant to tie up to known disparity form left to right // image and known ground truth reference terrain (option --reference-terrain). // This was only tested for pinhole cameras. Disparity must be created with // stereo with the option --unalign-disparity. If there are n images, there must // be n-1 disparities, from each image to the next. void addRefTerrainCostFun(asp::BaOptions & opt, asp::BaParams & param_storage, ceres::Problem & problem, std::vector & reference_vec, std::vector> & interp_disp) { size_t num_cameras = param_storage.num_cameras(); // Set up a GeoReference object using the datum, it may get modified later vw::cartography::GeoReference geo; geo.set_datum(opt.datum); // We checked for a datum earlier // Load the reference data std::vector input_reference_vec; std::vector> disp_vec; asp::load_csv_or_dem(opt.csv_format_str, opt.csv_srs, opt.reference_terrain, opt.max_num_reference_points, geo, input_reference_vec); // outputs if (loadRefDisp(opt.disparity_list, disp_vec, interp_disp) != num_cameras-1) vw_throw(ArgumentErr() << "Expecting one less disparity than there are cameras.\n"); // Read the image boxes. They are needed to find the GSD per camera. std::vector image_boxes; for (int icam = 0; icam < num_cameras; icam++) { vw::DiskImageView img(opt.image_files[icam]); vw::BBox2i bbox = vw::bounding_box(img); image_boxes.push_back(bbox); } vw::vw_out() << "Setting up the error to the reference terrain.\n"; vw::TerminalProgressCallback tpc("", "\t--> "); tpc.report_progress(0); double inc_amount = 1.0/double(input_reference_vec.size()); reference_vec.clear(); for (size_t data_col = 0; data_col < input_reference_vec.size(); data_col++) { vw::Vector3 reference_xyz = input_reference_vec[data_col]; // Filter by lonlat box if provided, this is very much recommended // to quickly discard most points in the huge reference terrain. // Let's hope there is no 360 degree offset when computing // the longitude. if (asp::stereo_settings().lon_lat_limit != BBox2(0,0,0,0)) { vw::Vector3 llh = geo.datum().cartesian_to_geodetic(reference_xyz); vw::Vector2 ll = subvector(llh, 0, 2); if (!asp::stereo_settings().lon_lat_limit.contains(ll)) { continue; } } Vector2 left_pred, right_pred; // Iterate over the cameras, add a residual for each point and each camera pair. for (int icam = 0; icam < num_cameras - 1; icam++) { boost::shared_ptr left_cam = opt.camera_models[icam]; boost::shared_ptr right_cam = opt.camera_models[icam+1]; try { left_pred = left_cam->point_to_pixel (reference_xyz); right_pred = right_cam->point_to_pixel(reference_xyz); } catch (const camera::PointToPixelErr& e) { continue; // Skip point if there is a projection issue. } if ((left_pred != left_pred) || (right_pred != right_pred)) continue; // nan check if (!interp_disp[icam].pixel_in_bounds(left_pred)) continue; // Interp check DispPixelT dispPix = interp_disp[icam](left_pred[0], left_pred[1]); if (!is_valid(dispPix)) continue; // Check if the current point projects in the cameras if (!image_boxes[icam ].contains(left_pred) || !image_boxes[icam+1].contains(right_pred)) { continue; } Vector2 right_pix = left_pred + dispPix.child(); if (!image_boxes[icam+1].contains(right_pix)) continue; // Check offset location too if (right_pix != right_pix || norm_2(right_pix - right_pred) > opt.max_disp_error) { // Ignore pixels which are too far from where they should be before optimization continue; } // Only the used reference points are stored here reference_vec.push_back(reference_xyz); // Call function to select the appropriate Ceres residual block to add. addDispResidual(reference_xyz, interp_disp[icam], icam, icam + 1, // left icam and right icam param_storage, opt, problem); } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); vw_out() << "Found " << reference_vec.size() << " reference points in range.\n"; } // Add a soft constraint to keep the cameras near the original position. // Add a combined constraint for all reprojection errors in given camera. void addCamPosCostFun(asp::BaOptions const& opt, asp::BaParams const& orig_parameters, std::vector> const& pixels_per_cam, std::vector> const& tri_points_per_cam, std::vector> const& pixel_sigmas, std::vector const& orig_cams, // Outputs asp::BaParams & param_storage, ceres::Problem & problem, int & num_cam_pos_residuals) { num_cam_pos_residuals = 0; // Image bboxes std::vector bboxes; for (size_t i = 0; i < opt.image_files.size(); i++) { vw::DiskImageView img(opt.image_files[i]); bboxes.push_back(bounding_box(img)); } int num_cameras = param_storage.num_cameras(); for (int icam = 0; icam < num_cameras; icam++) { // There must be as many pixels_per_cam as pixel_sigmas per cam if (pixels_per_cam[icam].size() != pixel_sigmas[icam].size()) vw_throw(ArgumentErr() << "Expecting as many pixels as pixel sigmas per camera.\n"); // Adjustments to initial and current cameras double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam); double * cam_ptr = param_storage.get_camera_ptr(icam); double sum = 0.0; int count = 0; std::vector pos_wts; auto pix_sigma_it = pixel_sigmas[icam].begin(); for (size_t ipix = 0; ipix < pixels_per_cam[icam].size(); ipix++) { vw::Vector2 pixel_obs = pixels_per_cam[icam][ipix]; vw::Vector3 xyz_obs = tri_points_per_cam[icam][ipix]; double pixel_sigma = norm_2(pix_sigma_it->second); if (pix_sigma_it == pixel_sigmas[icam].end()) vw::vw_throw(vw::ArgumentErr() << "Out of bounds for pixel sigmas.\n"); pix_sigma_it++; // Update for the next iteration if (pixel_sigma <= 0.0 || std::isnan(pixel_sigma)) continue; double gsd = 0.0; try { gsd = vw::camera::estimatedGSD(orig_cams[icam].get(), bboxes[icam], pixel_obs, xyz_obs); } catch (...) { continue; } if (gsd <= 0) continue; // Care with computing the weight double position_wt = opt.camera_position_weight / (gsd * pixel_sigma); sum += position_wt; count++; pos_wts.push_back(position_wt); } // Skip for zero count if (count == 0) continue; // The median weight was shown to be more robust to outliers // than the mean weight. double median_wt = vw::math::destructive_median(pos_wts); // Based on the CERES loss function formula, adding N loss functions each // with weight w and robust threshold t is equivalent to adding one loss // function with weight sqrt(N)*w and robust threshold sqrt(N)*t. double combined_wt = sqrt(count * 1.0) * median_wt; double combined_th = sqrt(count * 1.0) * opt.camera_position_robust_threshold; double rotation_wt = 0.0; // This will be handled separately ceres::CostFunction* cost_function = RotTransError::Create(orig_cam_ptr, rotation_wt, combined_wt); ceres::LossFunction* loss_function = get_loss_function(opt.cost_function, combined_th); problem.AddResidualBlock(cost_function, loss_function, cam_ptr); num_cam_pos_residuals++; } } // Add a ground constraint (GCP or height from DEM) void addGcpOrDemConstraint(asp::BaBaseOptions const& opt, std::string const& cost_function_str, bool use_llh_error, bool fix_gcp_xyz, // Outputs vw::ba::ControlNetwork & cnet, int & num_gcp, int & num_gcp_or_dem_residuals, asp::BaParams & param_storage, ceres::Problem & problem) { int num_tri_points = param_storage.num_points(); if (num_tri_points != (int)cnet.size()) vw::vw_throw(vw::ArgumentErr() << "Book-keeping error, the size of the control network " << "must equal the number of points.\n"); num_gcp = 0; num_gcp_or_dem_residuals = 0; for (int ipt = 0; ipt < num_tri_points; ipt++) { if (cnet[ipt].type() != vw::ba::ControlPoint::GroundControlPoint && cnet[ipt].type() != vw::ba::ControlPoint::PointFromDem) continue; // Skip non-GCP's and points which do not need special treatment if (param_storage.get_point_outlier(ipt)) continue; // skip outliers if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint) num_gcp++; vw::Vector3 observation = cnet[ipt].position(); vw::Vector3 xyz_sigma = cnet[ipt].sigma(); ceres::CostFunction* cost_function = NULL; if (!use_llh_error) { cost_function = asp::XYZError::Create(observation, xyz_sigma); } else { vw::Vector3 llh_sigma = xyz_sigma; // make lat, lon into lon, lat std::swap(llh_sigma[0], llh_sigma[1]); cost_function = LLHError::Create(observation, llh_sigma, opt.datum); } // For GCP a robust cost function is not used, as those are assumed to be // accurate. This may need to change for GCP produced with dem2gcp. With the // --heights-from-dem option, a robust cost function is used, with its own // robust threshold. ceres::LossFunction* loss_function = NULL; if (opt.heights_from_dem != "" && opt.heights_from_dem_uncertainty > 0 && opt.heights_from_dem_robust_threshold > 0) { loss_function = get_loss_function(cost_function_str, opt.heights_from_dem_robust_threshold); } else { loss_function = new ceres::TrivialLoss(); } double * tri_point = param_storage.get_point_ptr(ipt); problem.AddResidualBlock(cost_function, loss_function, tri_point); num_gcp_or_dem_residuals++; // Ground xyz whose sigma is asp::FIXED_GCP_SIGMA (a tiny positive value) are set to fixed double s = asp::FIXED_GCP_SIGMA; if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint && (fix_gcp_xyz || xyz_sigma == vw::Vector3(s, s, s))) { cnet[ipt].set_sigma(Vector3(s, s, s)); // will be saved in the ISIS cnet problem.SetParameterBlockConstant(tri_point); } } // End loop through triangulated points } } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustCostFuns.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_CAMERA_BUNDLE_ADJUST_COST_FUNCTIONS_H__ #define __ASP_CAMERA_BUNDLE_ADJUST_COST_FUNCTIONS_H__ // Ceres cost functions used by bundle_adjust. #include #include #include // Turn off warnings from eigen #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include #include #include #pragma GCC diagnostic pop typedef vw::PixelMask> DispPixelT; // Forward declaration namespace vw { namespace camera { class OpticalBarModel; } } namespace asp { struct BaOptions; struct BaParams; } namespace asp { /// Simple base class for unpacking Ceres parameter blocks into /// a camera model which can do point projections. class BaCamBase { public: // These are the same for every camera. int num_point_params() const { return 3; } int num_pose_params () const { return 6; } /// This is for all camera parameters other than the pose parameters. /// - These can be spread out across multiple parameter blocks. virtual int num_intrinsic_params() const = 0; int num_params() const { return num_point_params() + num_pose_params() + num_intrinsic_params(); } /// Return the number of Ceres input parameter blocks. virtual int num_parameter_blocks() const = 0; /// Return the size of each parameter block. /// - These should sum up to equal num_params. /// - The first block is always the point block (3) and /// the second block is always the pose block (6). virtual std::vector get_block_sizes() const; /// Read in all of the parameters and generate an output pixel observation. /// - Throws if the point does not project in to the camera. virtual vw::Vector2 evaluate(std::vector const param_blocks) const = 0; }; // End class BaCamBase /// Simple wrapper for the vw::camera::AdjustedCameraModel class with a /// preconfigured underlying camera. Only uses translation and rotation. /// - Just vary the six camera adjustment parameters which are all in /// a single parameter block. class BaAdjCam: public BaCamBase { public: BaAdjCam(boost::shared_ptr cam, vw::BathyData const& bathy_data, int camera_index): m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {} virtual int num_intrinsic_params() const {return 0;} /// Return the number of Ceres input parameter blocks. /// - (camera), (point) virtual int num_parameter_blocks() const {return 2;} /// Read in all of the parameters and compute the residuals. virtual vw::Vector2 evaluate(std::vector const param_blocks) const; private: /// This camera will be adjusted by the input parameters. boost::shared_ptr m_underlying_camera; vw::BathyData const& m_bathy_data; int m_camera_index; }; // End class BaAdjCam /// "Full service" pinhole model which solves for all desired camera parameters. /// - If the current run does not want to solve for everything, those parameter /// blocks should be set as constant so that Ceres does not change them. class BaPinholeCam: public BaCamBase { public: BaPinholeCam(boost::shared_ptr cam, vw::BathyData const& bathy_data, int camera_index); /// The number of lens distortion parameters. int num_dist_params() const; // Center, focus, and lens distortion virtual int num_intrinsic_params() const { return asp::NUM_CENTER_PARAMS + asp::NUM_FOCUS_PARAMS + num_dist_params(); } /// Return the number of Ceres input parameter blocks. /// - (camera), (point), (center), (focus), (lens distortion) virtual int num_parameter_blocks() const { return 5; } virtual std::vector get_block_sizes() const; /// Read in all of the parameters and compute the residuals. virtual vw::Vector2 evaluate(std::vector const param_blocks) const; private: // TODO: Cache the constructed camera to save time when just the point changes! // TODO: Make const /// This camera is used for all of the intrinsic values. boost::shared_ptr m_underlying_camera; vw::BathyData const& m_bathy_data; int m_camera_index; }; // End class BaPinholeCam /// "Full service" optical bar model which solves for all desired camera parameters. /// - If the current run does not want to solve for everything, those parameter /// blocks should be set as constant so that Ceres does not change them. class BaOpticalBarCam: public BaCamBase { public: BaOpticalBarCam(boost::shared_ptr cam, vw::BathyData const& bathy_data, int camera_index); // Center, focus, and extra optical bar parameters virtual int num_intrinsic_params() const; /// Return the number of Ceres input parameter blocks. /// - (camera), (point), (center), (focus), (other intrinsic parameters) virtual int num_parameter_blocks() const {return 5;} virtual std::vector get_block_sizes() const; /// Read in all of the parameters and compute the residuals. virtual vw::Vector2 evaluate(std::vector const param_blocks) const; private: // TODO: Cache the constructed camera to save time when just the point changes! // TODO: Make const /// This camera is used for all of the intrinsic values. boost::shared_ptr m_underlying_camera; vw::BathyData const& m_bathy_data; int m_camera_index; }; // End class BaOpticalBarCam /// "Full service" CSM model which solves for all desired camera parameters. /// - If the current run does not want to solve for everything, those parameter /// blocks should be set as constant so that Ceres does not change them. class BaCsmCam: public BaCamBase { public: BaCsmCam(boost::shared_ptr cam, vw::BathyData const& bathy_data, int camera_index): m_underlying_camera(cam), m_bathy_data(bathy_data), m_camera_index(camera_index) {} /// The number of lens distortion parameters. int num_dist_params() const { return m_underlying_camera->distortion().size(); } virtual int num_intrinsic_params() const { // Center, focus, and lens distortion return asp::NUM_CENTER_PARAMS + asp::NUM_FOCUS_PARAMS + num_dist_params(); } /// Return the number of Ceres input parameter blocks. /// - (camera), (point), (center), (focus), (lens distortion) virtual int num_parameter_blocks() const {return 5;} virtual std::vector get_block_sizes() const; /// Read in all of the parameters and compute the residuals. virtual vw::Vector2 evaluate(std::vector const param_blocks) const; private: // TODO: Cache the constructed camera to save time when just the point changes! // TODO: Make const /// This camera is used for all of the intrinsic values. boost::shared_ptr m_underlying_camera; vw::BathyData const& m_bathy_data; int m_camera_index; }; // End class BaCsmCam //========================================================================= // Cost functions for Ceres /// A Ceres cost function. We pass in the observation and the model. /// The result is the residual, the difference in the observation /// and the projection of the point into the camera, normalized by pixel_sigma. struct BaReprojErr { BaReprojErr(vw::Vector2 const& observation, vw::Vector2 const& pixel_sigma, boost::shared_ptr ba_cam): m_observation(observation), m_pixel_sigma(pixel_sigma), m_num_param_blocks(ba_cam->num_parameter_blocks()), m_ba_cam(ba_cam) {} // Call to work with ceres::DynamicCostFunctions. // - Takes array of arrays. bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(vw::Vector2 const& observation, vw::Vector2 const& pixel_sigma, boost::shared_ptr ba_cam); private: vw::Vector2 m_observation; ///< The pixel observation for this camera/point pair. vw::Vector2 m_pixel_sigma; size_t m_num_param_blocks; boost::shared_ptr m_ba_cam; ///< Pointer to the camera model object. }; // End class BaReprojErr /// A ceres cost function. Here we float two pinhole camera's /// intrinsic and extrinsic parameters. We take as input a reference /// xyz point and a disparity from left to right image. The /// error metric is the following: The reference xyz point is projected in the /// left image. It is mapped via the disparity to the right /// image. There, the residual error is the difference between that /// pixel and the pixel obtained by projecting the xyz point /// straight into the right image. struct BaDispXyzErr { BaDispXyzErr(double max_disp_error, double reference_terrain_weight, vw::Vector3 const& reference_xyz, vw::ImageViewRef const& interp_disp, boost::shared_ptr left_ba_cam, boost::shared_ptr right_ba_cam, bool solve_intrinsics, // Would like to remove these! asp::IntrinsicOptions intrinsics_opt): m_max_disp_error(max_disp_error), m_reference_terrain_weight(reference_terrain_weight), m_reference_xyz(reference_xyz), m_interp_disp (interp_disp), m_num_left_param_blocks (left_ba_cam->num_parameter_blocks ()), m_num_right_param_blocks(right_ba_cam->num_parameter_blocks()), m_left_ba_cam(left_ba_cam), m_right_ba_cam(right_ba_cam), m_solve_intrinsics(solve_intrinsics), m_intrinsics_opt(intrinsics_opt) {} // Adaptor to work with ceres::DynamicCostFunctions. bool operator()(double const* const* parameters, double* residuals) const; // TODO: Should this logic live somewhere else? /// Create the list of residual pointers when solving for intrinsics. /// - Extra logic is needed to avoid duplicate pointers. static void get_residual_pointers(asp::BaParams ¶m_storage, int left_cam_index, int right_cam_index, bool solve_intrinsics, asp::IntrinsicOptions const& intrinsics_opt, std::vector &residual_ptrs); void unpack_residual_pointers(double const* const* parameters, std::vector & left_param_blocks, std::vector & right_param_blocks) const; // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create( double max_disp_error, double reference_terrain_weight, vw::Vector3 const& reference_xyz, vw::ImageViewRef const& interp_disp, boost::shared_ptr left_ba_cam, boost::shared_ptr right_ba_cam, bool solve_intrinsics, asp::IntrinsicOptions intrinsics_opt); double m_max_disp_error, m_reference_terrain_weight; vw::Vector3 m_reference_xyz; vw::ImageViewRef const& m_interp_disp; size_t m_num_left_param_blocks, m_num_right_param_blocks; // TODO: Make constant! boost::shared_ptr m_left_ba_cam; boost::shared_ptr m_right_ba_cam; // Would like to not have these two! bool m_solve_intrinsics; asp::IntrinsicOptions m_intrinsics_opt; }; /// A ceres cost function. The residual is the difference between the /// original camera center and the current (floating) camera center. /// This cost function prevents the cameras from straying too far from /// their starting point. struct CamError { CamError(double const* orig_cam, double weight): m_orig_cam(DATA_SIZE), m_weight(weight) { for (int i = 0; i < DATA_SIZE; i++) m_orig_cam[i] = orig_cam[i]; } template bool operator()(const T* cam_vec, T* residuals) const { // Position units are meters. Don't lock the camera down too tightly. const double POSITION_WEIGHT = 1e-2; // Rotation units are in radians. const double ROTATION_WEIGHT = 5e1; for (size_t p = 0; p < DATA_SIZE/2; p++) { residuals[p] = POSITION_WEIGHT*m_weight*(cam_vec[p] - m_orig_cam[p]); } for (size_t p = DATA_SIZE/2; p < DATA_SIZE; p++) { residuals[p] = ROTATION_WEIGHT*m_weight*(cam_vec[p] - m_orig_cam[p]); } return true; } // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(const double *const orig_cam, double weight) { return (new ceres::AutoDiffCostFunction (new CamError(orig_cam, weight))); } private: // The camera must be represented by a six element array. static const int DATA_SIZE = 6; std::vector m_orig_cam; double m_weight; }; /// A ceres cost function. The residual is the rotation + translation /// vector difference, each multiplied by a weight. Hence, a larger /// rotation weight will result in less rotation change in the final /// result, etc. This is somewhat different than CamError as there is no /// penalty here for this cost function going very large, the scaling is /// different, and there is finer-grained control. struct RotTransError { RotTransError(double const* orig_cam, double rotation_weight, double translation_weight): m_orig_cam(DATA_SIZE), m_rotation_weight(rotation_weight), m_translation_weight(translation_weight) { for (int i = 0; i < DATA_SIZE; i++) m_orig_cam[i] = orig_cam[i]; } template bool operator()(const T* cam_vec, T* residuals) const { for (size_t p = 0; p < DATA_SIZE/2; p++) { residuals[p] = m_translation_weight*(cam_vec[p] - m_orig_cam[p]); } for (size_t p = DATA_SIZE/2; p < DATA_SIZE; p++) { residuals[p] = m_rotation_weight*(cam_vec[p] - m_orig_cam[p]); } return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(const double *const orig_cam, double rotation_weight, double translation_weight) { return (new ceres::AutoDiffCostFunction (new RotTransError(orig_cam, rotation_weight, translation_weight))); } private: // The camera must be represented by a six element array. static const int DATA_SIZE = 6; std::vector m_orig_cam; double m_rotation_weight, m_translation_weight; }; /// From the input options select the correct Ceres loss function. ceres::LossFunction* get_loss_function(std::string const& cost_function, double th); // Pixel reprojection error. Note: cam_residual_counts and num_pixels_per_cam // serve different purposes. void addPixelReprojCostFun(asp::BaOptions const& opt, asp::CRN const& crn, std::vector const& count_map, vw::ImageViewRef> const& weight_image, vw::cartography::GeoReference const& weight_image_georef, std::vector const& dem_xyz_vec, bool have_weight_image, bool have_dem, // Outputs vw::ba::ControlNetwork & cnet, asp::BaParams & param_storage, ceres::SubsetManifold * dist_opts, ceres::Problem & problem, std::vector & cam_residual_counts, std::vector & num_pixels_per_cam, std::vector> & pixels_per_cam, std::vector> & tri_points_per_cam, std::vector> & pixel_sigmas); // Add a soft constraint that ties triangulated points close to their initial positions. // This is adjusted for GSD. void addTriConstraint(asp::BaOptions const& opt, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, std::vector const& image_files, std::vector const& orig_cams, double tri_weight, std::string cost_function_str, double tri_robust_threshold, // Outputs asp::BaParams & param_storage, ceres::Problem & problem, int & num_tri_residuals); // Add a ground constraint (GCP or height from DEM) void addGcpOrDemConstraint(asp::BaBaseOptions const& opt, std::string const& cost_function_str, bool use_llh_error, bool fix_gcp_xyz, // Outputs vw::ba::ControlNetwork & cnet, int & num_gcp, int & num_gcp_or_dem_residuals, asp::BaParams & param_storage, ceres::Problem & problem); // Add a cost function meant to tie up to known disparity form left to right // image and known ground truth reference terrain (option --reference-terrain). // This was only tested for pinhole cameras. Disparity must be created with // stereo with the option --unalign-disparity. If there are n images, there must // be n-1 disparities, from each image to the next. void addRefTerrainCostFun(asp::BaOptions & opt, asp::BaParams & param_storage, ceres::Problem & problem, std::vector & reference_vec, std::vector> & interp_disp); // Add a soft constraint to keep the cameras near the original position. // Add a combined constraint for all reprojection errors in given camera. void addCamPosCostFun(asp::BaOptions const& opt, asp::BaParams const& orig_parameters, std::vector> const& pixels_per_cam, std::vector> const& tri_points_per_cam, std::vector> const& pixel_sigmas, std::vector const& orig_cams, // Outputs asp::BaParams & param_storage, ceres::Problem & problem, int & num_cam_pos_residuals); } // end namespace asp #endif // __ASP_CAMERA_BUNDLE_ADJUST_COST_FUNCTIONS_H__ ================================================ FILE: src/asp/Camera/BundleAdjustEigen.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustEigen.cc /// #include #include #include #include #include namespace asp { // Export the latest xyz values from param_storage to a vector of Vector3 void exportTriPoints(asp::BaParams const& param_storage, std::vector & tri_vec) { tri_vec.resize(param_storage.num_points()); for (int i = 0; i < param_storage.num_points(); i++) { const double* point = param_storage.get_point_ptr(i); tri_vec[i] = Eigen::Vector3d(point[0], point[1], point[2]); } } // Calculate the optical offsets for each image. For pinhole and csm frame // cameras, read these from the camera model. For other cameras, use half of the // image size. void calcOpticalOffsets(std::vector const& image_files, std::vector const& cams, std::map & optical_offsets) { optical_offsets.clear(); for (size_t i = 0; i < image_files.size(); i++) { vw::camera::PinholeModel * pinhole_model = dynamic_cast(vw::camera::unadjusted_model(cams[i].get())); if (pinhole_model != NULL) { vw::Vector2 offset = pinhole_model->point_offset(); optical_offsets[image_files[i]] = Eigen::Vector2d(offset[0], offset[1]); continue; } asp::CsmModel const* csm_model = dynamic_cast(vw::camera::unadjusted_model(cams[i].get())); if (csm_model != NULL) { // For CSM, for frame can do, for others cannot if (csm_model->isFrameCam()) { vw::Vector2 offset = csm_model->optical_center(); optical_offsets[image_files[i]] = Eigen::Vector2d(offset[0], offset[1]); continue; } } // Fallback to half of the image size vw::DiskImageView img(image_files[i]); optical_offsets[image_files[i]] = Eigen::Vector2d(img.cols()/2.0, img.rows()/2.0); } } // Given a pinhole camera model, find the world-to-camera transform // TODO(oalexan1): Move this out Eigen::Affine3d calcWorldToCam(vw::camera::PinholeModel const& pin) { // The rotation and translation matrices in the pinhole camera vw::Matrix3x3 R = pin.get_rotation_matrix(); vw::Vector3 T = pin.camera_center(); // Eigen rotation Eigen::Matrix3d ER; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) ER(r, c) = R(r, c); // Eigen translation Eigen::Vector3d ET; for (int r = 0; r < 3; r++) ET(r) = T(r); // Populate the rotation + translation matrix Eigen::Matrix4d E; E.setIdentity(); E.block<3,3>(0,0) = ER; E.block<3,1>(0,3) = ET; // This is camera-to-world, so invert it Eigen::Affine3d world_to_cam; world_to_cam.matrix() = E.inverse(); return world_to_cam; } // Given a csm frame camera model, find the world-to-camera transform. Eigen::Affine3d calcWorldToCam(asp::CsmModel const& csm) { // Initialize world-to-camera as the identity matrix Eigen::Matrix4d E; E.setIdentity(); Eigen::Affine3d world_to_cam; world_to_cam.matrix() = E.inverse(); // for consistency with what is below // Find the camera center double x = 0, y = 0, z = 0; double qx = 0, qy = 0, qz = 0, qw = 0; try { csm.frame_position(x, y, z); csm.frame_quaternion(qx, qy, qz, qw); } catch (const std::exception & e) { // Not a frame camera, return the identity matrix return world_to_cam; } E = calcTransform(x, y, z, qx, qy, qz, qw).matrix(); // This is camera-to-world, so invert it world_to_cam.matrix() = E.inverse(); return world_to_cam; } // Based on the current camera models, calculate the world-to-camera transforms. // For pinhole cameras, fetch them directly from the camera models. For adjusted // pinhole cameras, must combine the adjustments with the pose. For others, // return the identity matrix. void calcCameraPoses(bool no_poses_from_nvm, std::vector const& cams, std::vector & world_to_cam) { world_to_cam.resize(cams.size()); for (size_t i = 0; i < cams.size(); i++) { if (no_poses_from_nvm) { // Use the identity matrix for non-pinhole when told to do so world_to_cam[i] = Eigen::Affine3d::Identity(); continue; } // Try pinhole vw::camera::PinholeModel * pinhole_model = dynamic_cast(cams[i].get()); if (pinhole_model != NULL) { world_to_cam[i] = calcWorldToCam(*pinhole_model); continue; } // Try adjusted pinhole vw::camera::AdjustedCameraModel * adj_cam = dynamic_cast(cams[i].get()); vw::camera::PinholeModel const* pin = dynamic_cast(adj_cam->unadjusted_model().get()); if (pin != NULL && adj_cam != NULL) { // Apply the adjustment to the pinhole camera vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform(); // Make a copy of the pinhole camera vw::camera::PinholeModel local_pin = *pin; // Apply the transform local_pin.apply_transform(ecef_transform); world_to_cam[i] = calcWorldToCam(local_pin); continue; } // Try csm, with and without adjustment asp::CsmModel const* csm_model = dynamic_cast(adj_cam->unadjusted_model().get()); if (csm_model != NULL && csm_model->isFrameCam()) { vw::Matrix4x4 ecef_transform = vw::math::identity_matrix<4>(); if (adj_cam != NULL) ecef_transform = adj_cam->ecef_transform(); asp::CsmModel local_csm; csm_model->deep_copy(local_csm); local_csm.applyTransform(ecef_transform); world_to_cam[i] = calcWorldToCam(local_csm); continue; } // Use the identity matrix if no luck world_to_cam[i] = Eigen::Affine3d::Identity(); continue; } } // Once bundle adjustment is done, export the outlier list, camera poses, // triangulated points, and optical offsets. This is needed for saving // an NVM file. void saveNvm(asp::BaBaseOptions const& opt, bool no_poses_from_nvm, vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, std::vector & world_to_cam, std::map & optical_offsets) { std::set outliers; asp::updateOutliers(cnet, param_storage, outliers); std::vector tri_vec; exportTriPoints(param_storage, tri_vec); // Find latest poses (return the identity for non-pinhole cameras) std::vector optimized_cams; asp::calcOptimizedCameras(opt, param_storage, optimized_cams); calcCameraPoses(no_poses_from_nvm, optimized_cams, world_to_cam); // Find the optical centers if not loaded from nvm if (optical_offsets.empty()) calcOpticalOffsets(opt.image_files, optimized_cams, optical_offsets); // Write the nvm std::string nvm_file = opt.out_prefix + ".nvm"; asp::nvmData nvm; asp::cnetToNvm(cnet, optical_offsets, world_to_cam, nvm, tri_vec, outliers); asp::writeNvm(nvm, nvm_file); } // Given pinhole cameras and camera-to-world transforms, update the camera poses // in the pinhole cameras. void updateCameraPoses(std::vector const& world_to_cam, std::vector & cams) { // Must have as many cameras as transforms if (cams.size() != world_to_cam.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting as many cameras as transforms.\n"); // Iterate over the cameras for (size_t i = 0; i < cams.size(); i++) { // Find the camera-to-world transform as a 4x4 matrix. Must invert the world-to-camera. Eigen::Matrix4d E = world_to_cam[i].matrix().inverse(); // Find the rotation as the upper-left 3x3 matrix as Matrix3x3 vw::Matrix3x3 R; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) R(r, c) = E(r, c); // Find the translation as the right-most column as Vector3 vw::Vector3 T; for (int r = 0; r < 3; r++) T(r) = E(r, 3); vw::camera::PinholeModel * pin = dynamic_cast(cams[i].get()); if (pin != NULL) { pin->set_camera_pose(R); pin->set_camera_center(T); continue; } // Try adjusted pinhole camera vw::camera::AdjustedCameraModel * adj_cam = dynamic_cast(cams[i].get()); // If null, we are doing something wrong if (adj_cam != NULL) { // We expect the adjustment to be the identity, as this function is called // before any adjustment is applied. vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform(); if (ecef_transform != vw::math::identity_matrix(4)) vw::vw_throw(vw::ArgumentErr() << "Expecting the adjustment to be the identity.\n"); // Get the unadjusted pinhole camera pin = dynamic_cast(adj_cam->unadjusted_model().get()); if (pin != NULL) { pin->set_camera_pose(R); pin->set_camera_center(T); continue; } } // Try CSM frame asp::CsmModel* csm_model = dynamic_cast(cams[i].get()); if (csm_model != NULL && csm_model->isFrameCam()) { // For CSM, for frame can do, for others cannot csm_model->set_frame_position(T[0], T[1], T[2]); // Convert R to Eigen Eigen::Matrix3d ER; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) ER(r, c) = R(r, c); Eigen::Quaterniond q(ER); csm_model->set_frame_quaternion(q.x(), q.y(), q.z(), q.w()); continue; } if (i == 0) vw::vw_out() << "Ignoring the camera poses in the NVM file.\n"; } } } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustEigen.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustEigen.h /// Functions used in bundle adjustment that use Eigen matrices. /// Keep these separate to make compilation faster. #ifndef __BUNDLE_ADJUST_EIGEN_H__ #define __BUNDLE_ADJUST_EIGEN_H__ #include #include #include #include #include #include namespace asp { // Export the latest xyz values from param_storage to a vector of Vector3 void exportTriPoints(asp::BaParams const& param_storage, std::vector & tri_vec); // Once bundle adjustment is done, export the outlier list, camera poses, // triangulated points, and optical offsets, and write the cnet to an nvm file. void saveNvm(asp::BaBaseOptions const& opt, bool no_poses_from_nvm, vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, std::vector & world_to_cam, std::map & optical_offsets); // Given pinhole cameras and camera-to-world transforms, update the camera poses // in the pinhole cameras. void updateCameraPoses(std::vector const& world_to_cam, std::vector & cams); } // end namespace asp #endif // __BUNDLE_ADJUST_EIGEN_H__ ================================================ FILE: src/asp/Camera/BundleAdjustIO.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustIO.cc /// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include #endif // ASP_HAVE_PKG_ISIS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::camera; using namespace vw::ba; namespace asp { // Save mapprojected matches offsets for each image pair having matches void saveMapprojOffsets( std::string const& out_prefix, vw::cartography::GeoReference const& mapproj_dem_georef, std::vector> const& mapprojPoints, std::vector const& mapprojOffsets, std::vector> & mapprojOffsetsPerCam, std::vector const& imageFiles) { std::string mapproj_offsets_stats_file = out_prefix + "-mapproj_match_offset_stats.txt"; vw_out() << "Writing: " << mapproj_offsets_stats_file << "\n"; std::ofstream ofs (mapproj_offsets_stats_file.c_str()); ofs.precision(8); // 8 digits of precision for errors is enough ofs << "# Percentiles of distances between mapprojected matching pixels in an " << "image and the others.\n"; ofs << "# image_name 25% 50% 75% 85% 95% count\n"; for (size_t image_it = 0; image_it < imageFiles.size(); image_it++) { auto & vals = mapprojOffsetsPerCam[image_it]; // alias int len = vals.size(); float val25 = -1.0, val50 = -1.0, val75 = -1.0, val85 = -1.0, val95 = -1.0, count = 0; if (!vals.empty()) { std::sort(vals.begin(), vals.end()); val25 = vals[0.25 * len]; val50 = vals[0.50 * len]; val75 = vals[0.75 * len]; val85 = vals[0.85 * len]; val95 = vals[0.95 * len]; count = len; } ofs << imageFiles[image_it] << ' ' << val25 << ' ' << val50 << ' ' << val75 << ' ' << val85 << ' ' << val95 << ' ' << count << "\n"; } ofs.close(); std::string mapproj_offsets_pair_stats_file = out_prefix + "-mapproj_match_offset_pair_stats.txt"; vw::vw_out() << "Writing: " << mapproj_offsets_pair_stats_file << "\n"; ofs = std::ofstream(mapproj_offsets_pair_stats_file.c_str()); ofs << "# Percentiles of distances between matching pixels after mapprojecting onto DEM.\n" << "# Per image pair and measured in DEM pixel units.\n"; ofs << "# left_image right_image 25% 50% 75% 85% 95% num_matches_per_pair\n"; ofs.precision(8); // 8 digits of precision for errors is enough for (size_t conv_it = 0; conv_it < mapprojOffsets.size(); conv_it++) { auto const & c = mapprojOffsets[conv_it]; // alias ofs << imageFiles[c.left_cam_index] << ' ' << imageFiles[c.right_cam_index] << ' ' << c.val25 << ' ' << c.val50 << ' ' << c.val75 << ' ' << c.val85 << ' ' << c.val95 << ' ' << c.num_vals << "\n"; } ofs.close(); std::string mapproj_offsets_file = out_prefix + "-mapproj_match_offsets.txt"; vw_out() << "Writing: " << mapproj_offsets_file << "\n"; ofs = std::ofstream(mapproj_offsets_file.c_str()); // 12 digits of precision for errors is enough. // That is 9 digits after decimal period for lon and lat. ofs.precision(12); ofs << "# lon, lat, height_above_datum, mapproj_ip_dist_meters\n"; ofs << "# " << mapproj_dem_georef.datum() << std::endl; // Write all the points to the file for (size_t it = 0; it < mapprojPoints.size(); it++) { Vector3 llh = subvector(mapprojPoints[it], 0, 3); ofs << llh[0] << ", " << llh[1] <<", " << llh[2] << ", " << mapprojPoints[it][3] << std::endl; } ofs.close(); return; } // Save pinhole camera positions and orientations in a single file. // Only works with Pinhole cameras. void saveCameraReport(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage, vw::cartography::Datum const& datum, std::string const& prefix) { std::string output_path = opt.out_prefix + "-" + prefix + "-cameras.csv"; vw_out() << "Writing: " << output_path << std::endl; std::ofstream fh(output_path.c_str()); fh.precision(17); fh << "# input_cam_file, cam_ctr_x, cam_ctr_y, cam_ctr_z (ecef meters), " << "cam2ned rotation rows\n"; int num_cameras = opt.image_files.size(); // TODO(oalexan1): Create here a report file. Write camera name, // camera center, ecef position, ecef quaternion, and ned roll-pitch-yaw. // Use same Euler angles as in numpy. Likely eigen can do it. for (int icam = 0; icam < num_cameras; icam++) { vw::Vector3 cam_ctr; vw::Matrix3x3 cam2ecef; switch(opt.camera_type) { case BaCameraType_Pinhole: { // Get the camera model from the original one with parameters in // param_storage applied to it (which could be original ones or optimized). // Note that we do not modify the original camera. vw::camera::PinholeModel const* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting a pinhole camera.\n"); // Apply current intrinsics and extrinsics to the camera vw::camera::PinholeModel out_cam = transformedPinholeCamera(icam, param_storage, *in_cam); cam_ctr = out_cam.camera_center(vw::Vector2()); cam2ecef = out_cam.get_rotation_matrix(); break; } case BaCameraType_OpticalBar: vw::vw_throw(vw::ArgumentErr() << "Saving a camera report is not implemented " << "for optical bar cameras.\n"); break; case BaCameraType_CSM: vw::vw_throw(vw::ArgumentErr() << "Saving a camera report is not implemented " << "for CSM cameras.\n"); break; default: { // Apply extrinsics adjustments to a pinhole camera // TODO(oalexan1): Make this into a function called adjustedPinholeCamera(). // Use it where needed. CameraAdjustment adjustment(param_storage.get_camera_ptr(icam)); PinholeModel* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting a pinhole camera.\n"); // Make a copy of the camera, and apply the adjustments to the copy. Need to go back // to the original camera to get the adjustments needed to apply. // TODO(oalexan1): This is a little awkward. PinholeModel out_cam = *in_cam; AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]), adjustment.position(), adjustment.pose()); vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform(); out_cam.apply_transform(ecef_transform); cam_ctr = out_cam.camera_center(vw::Vector2()); cam2ecef = out_cam.get_rotation_matrix(); } } fh << opt.camera_files[icam] << ", " << cam_ctr[0] << ", " << cam_ctr[1] << ", " << cam_ctr[2]; // Find the matrix for converting NED to ECEF vw::Vector3 loc_llh = datum.cartesian_to_geodetic(cam_ctr); vw::Matrix3x3 ned2ecef = datum.lonlat_to_ned_matrix(loc_llh); // How a camera moves relative to the world is given by the camera-to-world // matrix. That is a little counter-intuitive. vw::Matrix3x3 cam2ned = inverse(ned2ecef) * cam2ecef; for (int row = 0; row < cam2ned.rows(); row++) { for (int col = 0; col < cam2ned.cols(); col++) { fh << ", " << cam2ned(row, col); } } fh << "\n"; } fh.close(); return; } // Save stats of horizontal and vertical errors propagated from cameras // to triangulation void saveHorizVertErrors(std::string const& horiz_vert_errors_file, std::vector const& horizVertErrors, std::vector const& imageFiles) { vw_out() << "Writing: " << horiz_vert_errors_file << "\n"; std::ofstream ofs (horiz_vert_errors_file.c_str()); ofs.precision(8); ofs << "# Horizontal and vertical propagated triangulation uncertainties (in meters) for each image pair having matches.\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"; for (size_t conv_it = 0; conv_it < horizVertErrors.size(); conv_it++) { auto const & c = horizVertErrors[conv_it]; // alias ofs << imageFiles[c.left_cam_index] << ' ' << imageFiles[c.right_cam_index] << ' ' << c.horiz_error_median << ' ' << c.vert_error_median << ' ' << c.horiz_error_mean << ' ' << c.vert_error_mean << ' ' << c.horiz_error_stddev << ' ' << c.vert_error_stddev << ' ' << c.num_errors << "\n"; } ofs.close(); return; } /// Write a pinhole camera file to disk after updating the intrinsics and /// extrinsics. Return the path to the saved file. std::string savePinholeCam(asp::BaBaseOptions const& opt, int icam, vw::cartography::Datum const& datum, asp::BaParams const& param_storage) { // Get the output file path std::string cam_file = asp::bundle_adjust_file_name(opt.out_prefix, opt.image_files [icam], opt.camera_files[icam]); cam_file = boost::filesystem::path(cam_file).replace_extension("tsai").string(); // Get the camera model from the original one with parameters in // param_storage applied to it (which could be original ones or optimized). // Note that we do not modify the original camera. vw::camera::PinholeModel const* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting a pinhole camera.\n"); vw::camera::PinholeModel out_cam = transformedPinholeCamera(icam, param_storage, *in_cam); #pragma omp critical { // Ensure this text is not messed up when writing in parallel vw::vw_out() << "Writing: " << cam_file << "\n"; bool has_datum = (datum.name() != asp::UNSPECIFIED_DATUM); if (has_datum) vw::vw_out() << std::setprecision(8) << "Camera center for " << cam_file << ": " << datum.cartesian_to_geodetic(out_cam.camera_center()) << " (longitude, latitude, height above datum(m))\n\n"; } out_cam.write(cam_file); return cam_file; } /// Write an optical bar camera file to disk after updating the intrinsics and // extrinsics. Return the path to the saved file. std::string saveOpticalBarCam(asp::BaBaseOptions const& opt, int icam, vw::cartography::Datum const& datum, asp::BaParams const& param_storage) { // Get the output file path std::string cam_file = asp::bundle_adjust_file_name(opt.out_prefix, opt.image_files [icam], opt.camera_files[icam]); cam_file = boost::filesystem::path(cam_file).replace_extension("tsai").string(); // Get the final camera model from the original one with optimized // parameters applied to it. Note that we do not modify the original // camera. vw::camera::OpticalBarModel* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting an optical bar camera.\n"); vw::camera::OpticalBarModel out_cam = transformedOpticalBarCamera(icam, param_storage, *in_cam); #pragma omp critical { // Ensure this text is not messed up when writing in parallel vw::vw_out() << "Writing: " << cam_file << "\n"; bool has_datum = (datum.name() != asp::UNSPECIFIED_DATUM); if (has_datum) vw::vw_out() << std::setprecision(8) << "Camera center for " << cam_file << ": " << datum.cartesian_to_geodetic(out_cam.camera_center()) << " (longitude, latitude, height above datum(m))\n\n"; } out_cam.write(cam_file); return cam_file; } // Write a CSM camera file to disk. Assumes that the intrinsics are optimized. // Return the path to the saved file. std::string saveCsmCamUpdateIntr(asp::BaBaseOptions const& opt, int icam, vw::cartography::Datum const& datum, asp::BaParams const& param_storage) { // Get the output file path std::string cam_file = asp::bundle_adjust_file_name(opt.out_prefix, opt.image_files [icam], opt.camera_files[icam]); cam_file = asp::csmStateFile(cam_file); // Get the final camera model from the original one with optimized // parameters applied to it. Note that we do not modify the original // camera. asp::CsmModel const* in_cam = dynamic_cast(opt.camera_models[icam].get()); if (in_cam == NULL) vw_throw(ArgumentErr() << "Expecting a CSM camera.\n"); boost::shared_ptr out_cam = transformedCsmCamera(icam, param_storage, *in_cam); #pragma omp critical { // Ensure this text is not messed up when writing in parallel bool has_datum = (datum.name() != asp::UNSPECIFIED_DATUM); if (has_datum) vw::vw_out() << std::setprecision(8) << "Camera center for " << cam_file << ": " << datum.cartesian_to_geodetic(out_cam->camera_center(vw::Vector2())) << " (longitude, latitude, height above datum(m))\n"; vw::vw_out() << "Writing: " << cam_file << "\n"; } // Save the updated state out_cam->saveState(cam_file); if (opt.update_isis_cubes_with_csm_state) { // Save the CSM state to the image file. Wipe any spice info. std::string image_name = opt.image_files[icam]; std::string plugin_name = out_cam->plugin_name(); std::string model_name = out_cam->model_name(); std::string model_state = out_cam->model_state(); #pragma omp critical { // Ensure this text is not messed up when writing in parallel vw::vw_out() << "Adding updated CSM state to image file: " << image_name << "\n"; } #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 asp:isis::saveCsmStateToIsisCube(image_name, plugin_name, model_name, model_state); #endif // ASP_HAVE_PKG_ISIS } return cam_file; } // Save convergence angle percentiles for each image pair having matches void saveConvergenceAngles(std::string const& conv_angles_file, std::vector const& convAngles, std::vector const& imageFiles) { vw_out() << "Writing: " << conv_angles_file << "\n"; std::ofstream ofs (conv_angles_file.c_str()); ofs.precision(8); ofs << "# Convergence angle percentiles (in degrees) for each image pair having matches\n"; ofs << "# left_image right_image 25% 50% 75% num_matches\n"; for (size_t conv_it = 0; conv_it < convAngles.size(); conv_it++) { auto const & c = convAngles[conv_it]; // alias ofs << imageFiles[c.left_cam_index] << ' ' << imageFiles[c.right_cam_index] << ' ' << c.val25 << ' ' << c.val50 << ' ' << c.val75 << ' ' << c.num_vals << "\n"; } ofs.close(); return; } // Read image and camera lists. Can have several comma-separated lists // in image_list and camera_list, when sharing intrinsics per sensor. void read_image_cam_lists(std::string const& image_list, std::string const& camera_list, std::vector & images, std::vector & cameras, asp::IntrinsicOptions & intrinsics_opts) { // Wipe the output images.clear(); cameras.clear(); intrinsics_opts.share_intrinsics_per_sensor = false; intrinsics_opts.cam2sensor.clear(); intrinsics_opts.num_sensors = 0; // must be initialized to zero // See if we have a single list or multiple lists if (image_list.find(",") == std::string::npos && camera_list.find(",") == std::string::npos) { // Single list, so just read the lists as usual, and return asp::read_list(image_list, images); // Use the images as cameras if no camera list is provided. Sometimes the // images have camera information. if (!camera_list.empty()) asp::read_list(camera_list, cameras); if (cameras.empty()) cameras = images; // There must be as many images as cameras if (images.size() != cameras.size()) vw_throw(ArgumentErr() << "Expecting the same number of images and cameras.\n"); return; } // This when we have multiple image lists and camera lists, for when // we solve for intrinsics per sensor. vw_out() << "Multiple image lists and camera lists were passed in. " << "Solving for intrinsics per sensor.\n"; // This is a very important bit intrinsics_opts.share_intrinsics_per_sensor = true; std::vector image_lists, camera_lists; boost::split(image_lists, image_list, boost::is_any_of(",")); boost::split(camera_lists, camera_list, boost::is_any_of(",")); if (image_lists.size() != camera_lists.size()) vw_throw(ArgumentErr() << "Expecting the same number of image and camera lists. " << "They must be separated by commas on input.\n"); // Read separately the images and cameras for (size_t sensor_it = 0; sensor_it < image_lists.size(); sensor_it++) { std::vector local_images, local_cameras; asp::read_list(image_lists[sensor_it], local_images); asp::read_list(camera_lists[sensor_it], local_cameras); if (local_images.size() != local_cameras.size() || local_images.empty()) vw_throw(ArgumentErr() << "Expecting the same positive number of images and cameras " << "in lists: '" << image_lists[sensor_it] << "' and '" << camera_lists[sensor_it] << "'.\n"); // Append to the global lists images.insert(images.end(), local_images.begin(), local_images.end()); cameras.insert(cameras.end(), local_cameras.begin(), local_cameras.end()); // Create the map from camera index to sensor index for (size_t cam_it = 0; cam_it < local_cameras.size(); cam_it++) intrinsics_opts.cam2sensor.push_back(sensor_it); } intrinsics_opts.num_sensors = image_lists.size(); vw_out() << "Number of sensors: " << intrinsics_opts.num_sensors << "\n"; // Must have the same number of cameras as images if (images.size() != cameras.size()) vw_throw(ArgumentErr() << "Expecting the same number of images and cameras.\n"); return; } // Write an updated csm camera state file to disk. Assumes no intrinsics are optimized. std::string saveUpdatedCsm(asp::BaBaseOptions const& opt, int icam, std::string const& adjustFile, asp::BaParams const& param_storage) { // Get the unadjusted CSM model and the adjustment as a transform CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam)); AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]), cam_adjust.position(), cam_adjust.pose()); vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform(); std::string csmFile = asp::csmStateFile(adjustFile); asp::CsmModel * csm_model = asp::csm_model(vw::camera::unadjusted_model(opt.camera_models[icam])); // Apply the adjustment and save a transformed copy of the camera model boost::shared_ptr out_cam; csm_model->deep_copy(out_cam); out_cam->applyTransform(ecef_transform); #pragma omp critical { // Ensure this text is not messed up when writing in parallel vw::vw_out() << "Writing: " << csmFile << "\n"; } out_cam->saveState(csmFile); if (opt.update_isis_cubes_with_csm_state) { // Save the CSM state to the image file. Wipe any spice info. std::string image_name = opt.image_files[icam]; std::string plugin_name = out_cam->plugin_name(); std::string model_name = out_cam->model_name(); std::string model_state = out_cam->model_state(); #pragma omp critical { // Ensure this text is not messed up when writing in parallel vw::vw_out() << "Adding updated CSM state to image file: " << image_name << "\n"; } #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 asp:isis::saveCsmStateToIsisCube(image_name, plugin_name, model_name, model_state); #endif // ASP_HAVE_PKG_ISIS } return csmFile; } // Write an updated RPC camera file to disk. Assumes no intrinsics are optimized. std::string saveUpdatedRpc(asp::BaBaseOptions const& opt, int icam, std::string const& adjustFile, asp::BaParams const& param_storage) { std::string imageFile = opt.image_files[icam]; vw::DiskImageView image(imageFile); BBox2 image_box = vw::bounding_box(image); CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam)); AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(opt.camera_models[icam]), cam_adjust.position(), cam_adjust.pose()); vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform(); std::string rpcFile = asp::rpcAdjustedFile(adjustFile); // Get the underlying RPC model vw::CamPtr unadjCam = vw::camera::unadjusted_model(opt.camera_models[icam]); asp::RPCModel * rpc = dynamic_cast(unadjCam.get()); if (rpc == NULL) vw_throw(ArgumentErr() << "Expecting an RPC camera.\n"); #pragma omp critical { // Ensure this text is not messed up when writing in parallel vw::vw_out() << "Saving adjusted RPC model: " << rpcFile << "\n"; } // Produced a transformed copy of the RPC model. This can be slow. double pixel_err = 0.0; asp::RPCModel trans_rpc = asp::transformRpc(*rpc, ecef_transform, image_box, pixel_err); #pragma omp critical { vw::vw_out() << "Discrepancy between the initial RPC model with the external adjustment " << "and the refit model incorporating the adjustment for image: " << imageFile << " is " << pixel_err << " pixels.\n"; if (pixel_err > 1.0) vw::vw_out(vw::WarningMessage) << "The adjusted RPC model is not accurate enough. " << "Use the original RPC model with external adjustments as applied via " << "--bundle-adjust-prefix. Test the original model self-consistency with " << "cam_test with --height-above-datum within valid RPC height range.\n"; } trans_rpc.saveXML(rpcFile); return rpcFile; } // Write a camera adjustment file to disk, and potentially a camera file with // the adjustments applied to it. Return the path to the saved file. std::string saveAdjustedCam(asp::BaBaseOptions const& opt, int icam, asp::BaParams const& param_storage) { std::string adjust_file = asp::bundle_adjust_file_name(opt.out_prefix, opt.image_files[icam], opt.camera_files[icam]); #pragma omp critical { // Ensure this text is not messed up when writing in parallel vw::vw_out() << "Writing: " << adjust_file << "\n"; } // The cam_file will be overwritten below for CSM cameras CameraAdjustment cam_adjust(param_storage.get_camera_ptr(icam)); asp::write_adjustments(adjust_file, cam_adjust.position(), cam_adjust.pose()); std::string cam_file = adjust_file; // For CSM camera models export, in addition, the JSON state with the // adjustment applied to it. This applies when not solving for intrinsics and // using CSM. Do something analogous for RPC. if (asp::isLinescanCsmSession(opt.stereo_session)) cam_file = saveUpdatedCsm(opt, icam, adjust_file, param_storage); else if (opt.stereo_session == "rpc" && opt.save_adjusted_rpc) cam_file = saveUpdatedRpc(opt, icam, adjust_file, param_storage); return cam_file; } // Save the updated camera model to disk. Return the name of the file written. std::string saveUpdatedCamera(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage, int icam) { // Must have a try block, as otherwise OpenMP crashes the program // as the caller seems unable to catch the exception from threads. std::string cam_file; try { switch (opt.camera_type) { case BaCameraType_Pinhole: cam_file = savePinholeCam(opt, icam, opt.datum, param_storage); break; case BaCameraType_OpticalBar: cam_file = saveOpticalBarCam(opt, icam, opt.datum, param_storage); break; case BaCameraType_CSM: // When solving for intrinsics and using CSM cam_file = saveCsmCamUpdateIntr(opt, icam, opt.datum, param_storage); break; case BaCameraType_Other: // This includes the CSM/pinhole/etc cases when not solving for intrinsics cam_file = saveAdjustedCam(opt, icam, param_storage); break; default: vw::vw_throw(vw::ArgumentErr() << "Unknown camera type.\n"); } } catch (const std::exception& e) { vw::vw_out() << e.what() << "\n"; } return cam_file; } // Write updated camera models to disk void saveUpdatedCameras(asp::BaBaseOptions const& opt, asp::BaParams const& param_storage) { int num_cameras = opt.image_files.size(); std::vector cam_files(num_cameras); vw::Stopwatch sw; sw.start(); // For pinhole and nadirpinhole sessions, save the cameras sequentially, as // some info is printed along the way and can get messed up if done in // parallel. if (!opt.single_threaded_cameras && !opt.update_isis_cubes_with_csm_state && opt.stereo_session.find("pinhole") == std::string::npos) { #pragma omp parallel for for (int icam = 0; icam < num_cameras; icam++) cam_files[icam] = saveUpdatedCamera(opt, param_storage, icam); } else { for (int icam = 0; icam < num_cameras; icam++) cam_files[icam] = saveUpdatedCamera(opt, param_storage, icam); } sw.stop(); vw::vw_out() << "Saving cameras elapsed time: " << sw.elapsed_seconds() << " seconds.\n"; // Write the image lists std::string img_list_file = opt.out_prefix + "-image_list.txt"; vw::vw_out() << "Writing: " << img_list_file << "\n"; asp::write_list(img_list_file, opt.image_files); // Write the camera lists std::string cam_list_file = opt.out_prefix + "-camera_list.txt"; vw::vw_out() << "Writing: " << cam_list_file << "\n"; asp::write_list(cam_list_file, cam_files); return; } // Save the CSM cameras. It is assumed there are no external adjustments // applied to them. void saveCsmCameras(std::string const& out_prefix, std::string const& stereo_session, std::vector const& image_files, std::vector const& camera_files, std::vector const& camera_models, bool update_isis_cubes_with_csm_state) { int num_cameras = camera_models.size(); std::vector cam_files(num_cameras); for (int icam = 0; icam < num_cameras; icam++) { std::string adjustFile = asp::bundle_adjust_file_name(out_prefix, image_files[icam], camera_files[icam]); std::string csmFile = asp::csmStateFile(adjustFile); asp::CsmModel * csm_cam = asp::csm_model(camera_models[icam]); vw::vw_out() << "Writing: " << csmFile << "\n"; csm_cam->saveState(csmFile); cam_files[icam] = csmFile; if (update_isis_cubes_with_csm_state) { // Save the CSM state to the image file. Wipe any spice info. std::string image_name = image_files[icam]; std::string plugin_name = csm_cam->plugin_name(); std::string model_name = csm_cam->model_name(); std::string model_state = csm_cam->model_state(); vw::vw_out() << "Adding updated CSM state to image file: " << image_name << "\n"; #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 asp:isis::saveCsmStateToIsisCube(image_name, plugin_name, model_name, model_state); #endif // ASP_HAVE_PKG_ISIS } } // Write the image lists std::string img_list_file = out_prefix + "-image_list.txt"; vw::vw_out() << "Writing: " << img_list_file << std::endl; asp::write_list(img_list_file, image_files); // Write the camera lists std::string cam_list_file = out_prefix + "-camera_list.txt"; vw::vw_out() << "Writing: " << cam_list_file << std::endl; asp::write_list(cam_list_file, cam_files); } /// Load all of the reference disparities specified in the input text file /// and store them in the vectors. Return the number loaded. int loadRefDisp(std::string const& disp_list_filename, std::vector>> & disp_vec, std::vector>> & interp_disp) { // TODO: Disparities can be large, but if small it is better to // read them in memory. std::istringstream is(disp_list_filename); std::string disp_file; while (is >> disp_file) { if (disp_file != "none") { vw::vw_out() << "Reading: " << disp_file << std::endl; disp_vec.push_back(copy(vw::DiskImageView>(disp_file))); } else { // Read in an empty disparity disp_vec.push_back(vw::ImageView>()); } interp_disp.push_back(interpolate(disp_vec.back(), vw::BilinearInterpolation(), vw::ConstantEdgeExtension())); } return static_cast(disp_vec.size()); } } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustIsis.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustIsis.cc // Utilities for handling ISIS's jigsaw control network format. #include #include #include #include // defines ASP_HAVE_PKG_ISIS #include #include #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif // ASP_HAVE_PKG_ISIS #include #include #include // TODO(oalexan1): Must check that number of images agrees with number // of cid in cnet. // Note: The output cnet file must contain the updated control network with the // final coordinates of the control points and residuals for each measurement. // It also must have serial numbers, apriori sigma, apriori surface points, etc. namespace asp { #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 // ISIS cnet measures have an additional 0.5 added to them const double ISIS_CNET_TO_ASP_OFFSET = -0.5; // Read the serial numbers of the images. For non-cub files, // these will be the image names. void readSerialNumbers(std::vector const& image_files, std::vector & serialNumbers) { // Wipe the output serialNumbers.clear(); try { Isis::SerialNumberList serial_list; for (size_t i = 0; i < image_files.size(); i++) { QString fileName = QString::fromStdString(image_files[i]); serial_list.add(fileName); } for (size_t i = 0; i < image_files.size(); i++) { QString serialNumber = serial_list.serialNumber(i); serialNumbers.push_back(serialNumber.toStdString()); } } catch (...) { // The above will fail for non-ISIS images. serialNumbers.clear(); for (size_t i = 0; i < image_files.size(); i++) serialNumbers.push_back(image_files[i]); } } // Set the Isis cnet target based on the image name. If that fails, // as for Earth, set it to the datum name. void setIsisCnetTarget(std::string const& image_name, vw::cartography::Datum const& datum, Isis::ControlNet & icnet) { try { Isis::Pvl cubeLab(QString::fromStdString(image_name)); Isis::Pvl maplab; maplab.addGroup(Isis::PvlGroup("Mapping")); Isis::PvlGroup &mapGroup = maplab.findGroup("Mapping"); mapGroup = Isis::Target::radiiGroup(cubeLab, mapGroup); icnet.SetTarget(maplab); } catch (...) { try { // Set the target to the datum name icnet.SetTarget(QString::fromStdString(datum.name())); } catch (...) { // If really no luck, just use WGS84, as it is more likely to fail for Earth icnet.SetTarget(QString::fromStdString("WGS84")); } } } // Read the cameras This may fail for non-ISIS images. Then use null cameras. void readIsisCameras(std::vector const& image_files, std::vector> & cameras) { // Wipe the output cameras.clear(); for (size_t i = 0; i < image_files.size(); i++) { Isis::Camera *cam = NULL; try { QString fileName = QString::fromStdString(image_files[i]); Isis::Cube cube(Isis::FileName(fileName), "r"); Isis::Camera *cam = Isis::CameraFactory::Create(cube); } catch (...) {} cameras.push_back(boost::shared_ptr(cam)); } } // Add a given control point to the ISIS cnet. Update the outlier counter. void addIsisControlPoint(Isis::ControlNet & icnet, vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, std::vector> const& cameras, std::vector const& serialNumbers, int ipt, int& numOutliers) { // Sanity check for cnet and param_storage if (cnet.size() != param_storage.num_points()) vw_throw(vw::ArgumentErr() << "addIsisControlPoint: cnet and param_storage have different sizes.\n"); if (ipt >= cnet.size() || ipt >= param_storage.num_points()) vw_throw(vw::ArgumentErr() << "addIsisControlPoint: ipt is too large.\n"); Isis::ControlPoint *point = new Isis::ControlPoint(); if (param_storage.get_point_outlier(ipt)) { point->SetIgnored(true); // better set it to ignored as well point->SetRejected(true); numOutliers++; } else { point->SetRejected(false); } // The bundle_adjust convention is that a point is fixed if its sigma is // asp::FIXED_GCP_SIGMA (a very tiny number). Otherwise it is variable but // constrained by sigma. vw::Vector3 sigma = cnet[ipt].sigma(); // point sigma double s = asp::FIXED_GCP_SIGMA; if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint) { if (sigma == vw::Vector3(s, s, s)) { point->SetType(Isis::ControlPoint::Fixed); } else { point->SetType(Isis::ControlPoint::Constrained); } } else { point->SetType(Isis::ControlPoint::Free); } // Set the point id std::ostringstream os; os << "point_" << ipt; point->SetId(QString::fromStdString(os.str())); // Set apriori position from the input cnet Isis::SurfacePoint A; vw::Vector3 a = cnet[ipt].position(); A.SetRectangular(Isis::Displacement(a[0], Isis::Displacement::Meters), Isis::Displacement(a[1], Isis::Displacement::Meters), Isis::Displacement(a[2], Isis::Displacement::Meters), Isis::Distance(sigma[0], Isis::Distance::Meters), Isis::Distance(sigma[1], Isis::Distance::Meters), Isis::Distance(sigma[2], Isis::Distance::Meters)); point->SetAprioriSurfacePoint(A); // Set the optimized (adjusted) position Isis::SurfacePoint P; const double * asp_point = param_storage.get_point_ptr(ipt); // ecef, meters P.SetRectangular(Isis::Displacement(asp_point[0], Isis::Displacement::Meters), Isis::Displacement(asp_point[1], Isis::Displacement::Meters), Isis::Displacement(asp_point[2], Isis::Displacement::Meters), Isis::Distance(sigma[0], Isis::Distance::Meters), Isis::Distance(sigma[1], Isis::Distance::Meters), Isis::Distance(sigma[2], Isis::Distance::Meters)); point->SetAdjustedSurfacePoint(P); // Add the measures, and their sigmas for (auto m_iter = cnet[ipt].begin(); m_iter != cnet[ipt].end(); m_iter++) { int cid = m_iter->image_id(); vw::Vector2 sigma = m_iter->sigma(); // Must add 0.5 to the ASP measure to get the ISIS measure double col = m_iter->position()[0] - ISIS_CNET_TO_ASP_OFFSET; double row = m_iter->position()[1] - ISIS_CNET_TO_ASP_OFFSET; Isis::ControlMeasure *measurement = new Isis::ControlMeasure(); measurement->SetCoordinate(col, row, Isis::ControlMeasure::RegisteredSubPixel); measurement->SetType(Isis::ControlMeasure::RegisteredSubPixel); measurement->SetAprioriSample(col); measurement->SetAprioriLine(row); measurement->SetIgnored(false); measurement->SetRejected(false); measurement->SetSampleSigma(sigma[0]); measurement->SetLineSigma(sigma[1]); measurement->SetResidual(0.0, 0.0); measurement->SetCubeSerialNumber(QString::fromStdString(serialNumbers[cid])); measurement->SetCamera(cameras[cid].get()); point->Add(measurement); } icnet.AddPoint(point); } #endif // ASP_HAVE_PKG_ISIS // Load an ISIS cnet file and copy it to an ASP control network. The ISIS cnet // will be used when saving the updated cnet. Keep these cnets one-to-one, // though later the ASP cnet may also have GCP. void loadIsisCnet(std::string const& isisCnetFile, std::vector const& image_files, // Outputs vw::ba::ControlNetwork & cnet, IsisCnetData & isisCnetData) { #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 // Reset the outputs cnet = vw::ba::ControlNetwork("ASP_control_network"); isisCnetData = IsisCnetData(); // Aliases Isis::ControlNetQsp & icnet = isisCnetData.isisCnet; std::set & isisOutliers = isisCnetData.isisOutliers; // Report any ISIS-related surface points as ECEF (rectangular). Not really used. Isis::SurfacePoint::CoordinateType coord_type = Isis::SurfacePoint::Rectangular; // Read the ISIS control network QString qCnetFile = QString::fromStdString(isisCnetFile); Isis::Progress progress; icnet = Isis::ControlNetQsp(new Isis::ControlNet(qCnetFile, &progress, coord_type)); // We will not reset the points rejected by jigsaw. Keep them rejected. // We won't even bother to read them into ASP. Such a points are tiny // minority, unlikely to have any effect. // Create the map from image serial number to image index std::vector serialNumbers; readSerialNumbers(image_files, serialNumbers); std::map serialNumberToImageIndex; for (size_t i = 0; i < image_files.size(); i++) { serialNumberToImageIndex[serialNumbers[i]] = i; cnet.add_image_name(image_files[i]); } // Ensure we have as many serial numbers as images if (serialNumberToImageIndex.size() != image_files.size()) vw_throw(vw::ArgumentErr() << "Found images with the same serial number. " << "Check your input data.\n"); // Add the control points int numControlPoints = icnet->GetNumPoints(); int numSemiFree = 0, numConstrained = 0, numFixed = 0, numRejected = 0, numIgnored = 0; for (int i = 0; i < numControlPoints; i++) { Isis::ControlPoint *point = icnet->GetPoint(i); bool ignore = false; if (point->IsIgnored()) { numIgnored++; // We do not skip any points, to preserve the one-to-one correspondence. // Add to isisOutliers isisOutliers.insert(i); ignore = true; } if (point->IsRejected()) { numRejected++; // We do not skip any points, to preserve the one-to-one correspondence. // Add to isisOutliers isisOutliers.insert(i); ignore = true; } // Triangulated point and apriori point Isis::SurfacePoint P = point->GetAdjustedSurfacePoint(); Isis::SurfacePoint A = point->GetAprioriSurfacePoint(); // Set the cnet tri point to the prior point. The surface point // will be triangulated by bundle_adjust. // By default, a point is free, and its sigma is nominal and will not be // used. Will adjust below for constrained and fixed points. vw::ba::ControlPoint cpoint(vw::ba::ControlPoint::TiePoint); // free vw::Vector3 a(A.GetX().meters(), A.GetY().meters(), A.GetZ().meters()); cpoint.set_position(a); cpoint.set_ignore(ignore); // Set sigma. This will be used only for constrained points. // Use the sigmas from the adjusted surface points, as they are // more likely to be positive and perhaps up-to-date than the // prior sigmas. double xs = P.GetXSigma().meters(); double ys = P.GetYSigma().meters(); double zs = P.GetZSigma().meters(); cpoint.set_sigma(vw::Vector3(xs, ys, zs)); // The actual surface point will not be used. It will later be initialized // as the a priori point, and then optimized. // vw::Vector3 p(P.GetX().meters(), P.GetY().meters(), P.GetZ().meters()); if (point->GetType() == Isis::ControlPoint::Constrained) { // Treat partially constrained points as unconstrained. int numConstr = int(point->IsCoord1Constrained()) + int(point->IsCoord2Constrained()) + int(point->IsCoord3Constrained()); if (numConstr < 3) { numSemiFree++; } else { // Fully constrained point numConstrained++; if (xs <= 0 || ys <= 0 || zs <= 0) vw_throw(vw::ArgumentErr() << "loadIsisCnet: ISIS constrained point with index " << i << " has a non-positive sigma.\n"); // Set as gcp, but with given sigma, rather than tiny sigma. cpoint.set_type(vw::ba::ControlPoint::GroundControlPoint); // gcp } } else if (point->GetType() == Isis::ControlPoint::Free) { // Nothing to do here. The point and sigma is already set. } else if (point->GetType() == Isis::ControlPoint::Fixed) { numFixed++; cpoint.set_type(vw::ba::ControlPoint::GroundControlPoint); // gcp double s = asp::FIXED_GCP_SIGMA; // Later will keep fixed cpoint.set_sigma(vw::Vector3(s, s, s)); } int numMeasures = point->GetNumMeasures(); for (int j = 0; j < numMeasures; j++) { Isis::ControlMeasure *controlMeasure = point->GetMeasure(j); // Get serial number as std::string. This is unique to each image. QString qCubeSerialNumber = controlMeasure->GetCubeSerialNumber(); std::string cubeSerialNumber = qCubeSerialNumber.toStdString(); // These have 0.5 added to them, which we will remove double sample = controlMeasure->GetSample(); double line = controlMeasure->GetLine(); double col = sample + ISIS_CNET_TO_ASP_OFFSET; double row = line + ISIS_CNET_TO_ASP_OFFSET; // These sigmas can turn out to be negative double sample_sigma = controlMeasure->GetSampleSigma(); double line_sigma = controlMeasure->GetLineSigma(); if (sample_sigma <= 0 || std::isnan(sample_sigma) || std::isinf(sample_sigma)) sample_sigma = 1.0; if (line_sigma <= 0 || std::isnan(line_sigma) || std::isinf(line_sigma)) line_sigma = 1.0; // Find the image index auto it = serialNumberToImageIndex.find(cubeSerialNumber); if (it == serialNumberToImageIndex.end()) vw_throw(vw::ArgumentErr() << "Could not find image with serial number: " << cubeSerialNumber << ".\n"); int image_id = it->second; cpoint.add_measure(vw::ba::ControlMeasure(col, row, sample_sigma, line_sigma, image_id)); } // We do not skip any points, to preserve the one-to-one correspondence. // But points with no measures are flagged as outliers. if (cpoint.size() == 0) { isisOutliers.insert(i); cpoint.set_ignore(true); } cnet.add_control_point(cpoint); } if (numSemiFree > 0) vw::vw_out(vw::WarningMessage) << "loadIsisCnet: Treat " << numSemiFree << " partially constrained points as unconstrained.\n"; if (numConstrained > 0) vw::vw_out() << "loadIsisCnet: Found " << numConstrained << " constrained points. Use as GCP with given sigma.\n"; if (numFixed > 0) vw::vw_out() << "loadIsisCnet: Found " << numFixed << " fixed points. Use as fixed GCP.\n"; if (numRejected > 0) vw::vw_out() << "loadIsisCnet: Found " << numRejected << " rejected points. Flag as outliers.\n"; if (numIgnored > 0) vw::vw_out() << "loadIsisCnet: Found " << numIgnored << " ignored points. Flag as outliers.\n"; vw::vw_out() << "Loaded " << cnet.size() << " control points.\n"; #endif // ASP_HAVE_PKG_ISIS return; } // Update an ISIS cnet with the latest info on triangulated points // and outliers, and write it to disk at .net. // We do not change here if a point is fixed, constrained, or free. void saveUpdatedIsisCnet(std::string const& outputPrefix, vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, IsisCnetData & isisCnetData) { #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 // Sanity check if (param_storage.num_points() != cnet.size()) vw::vw_throw(vw::ArgumentErr() << "saveIsisCnet: number of points in param_storage and cnet do not match.\n"); // Find the serial numbers std::vector image_files = cnet.get_image_list(); std::vector serialNumbers; readSerialNumbers(image_files, serialNumbers); // Read the cameras This may fail for non-ISIS images. Then use null cameras. std::vector> cameras; readIsisCameras(image_files, cameras); // Aliases Isis::ControlNetQsp const& icnet = isisCnetData.isisCnet; // The ASP cnet may have more points than the ISIS cnet, as it may have GCP. int numControlPoints = icnet->GetNumPoints(); if (numControlPoints > param_storage.num_points()) vw_throw(vw::ArgumentErr() << "saveUpdatedIsisCnet: Book-keeping failure. ASP cnet is too small.\n"); // Iterate over the ISIS control points int numOutliers = 0; for (int i = 0; i < numControlPoints; i++) { Isis::ControlPoint *point = icnet->GetPoint(i); if (point->IsIgnored() || point->IsRejected() || param_storage.get_point_outlier(i)) { point->SetIgnored(true); point->SetRejected(true); numOutliers++; // On occasion there is failure below if continuing with bad points continue; } // Update the apriori position from the cnet. Note that this may // have changed if a transform was applied to the cameras. // Get the apriori sigma too. Some bundle adjustment options change // that too, though not by default. vw::Vector3 a = cnet[i].position(); vw::Vector3 sigma = cnet[i].sigma(); // point sigma Isis::SurfacePoint A = point->GetAprioriSurfacePoint(); A.SetRectangular(Isis::Displacement(a[0], Isis::Displacement::Meters), Isis::Displacement(a[1], Isis::Displacement::Meters), Isis::Displacement(a[2], Isis::Displacement::Meters), Isis::Distance(sigma[0], Isis::Distance::Meters), Isis::Distance(sigma[1], Isis::Distance::Meters), Isis::Distance(sigma[2], Isis::Distance::Meters)); point->SetAprioriSurfacePoint(A); // Update the triangulated point. Use same sigmas as above. These // may have been changed by bundle adjustment. const double * asp_point = param_storage.get_point_ptr(i); Isis::SurfacePoint P = point->GetAdjustedSurfacePoint(); P.SetRectangular(Isis::Displacement(asp_point[0], Isis::Displacement::Meters), Isis::Displacement(asp_point[1], Isis::Displacement::Meters), Isis::Displacement(asp_point[2], Isis::Displacement::Meters), Isis::Distance(sigma[0], Isis::Distance::Meters), Isis::Distance(sigma[1], Isis::Distance::Meters), Isis::Distance(sigma[2], Isis::Distance::Meters)); point->SetAdjustedSurfacePoint(P); // Update the sigmas for measures from the ASP cnet int numMeasures = point->GetNumMeasures(); int aspNumMeasures = cnet[i].size(); if (numMeasures != aspNumMeasures) vw_throw(vw::ArgumentErr() << "saveUpdatedIsisCnet: Book-keeping failure in number of measures.\n"); int meas_id = 0; for (auto m_iter = cnet[i].begin(); m_iter != cnet[i].end(); m_iter++) { vw::Vector2 sigma = m_iter->sigma(); Isis::ControlMeasure *measurement = point->GetMeasure(meas_id); measurement->SetSampleSigma(sigma[0]); measurement->SetLineSigma(sigma[1]); meas_id++; } } // Save any GCP that were later added to the ASP cnet. This creates new // points rather than updating existing ones. for (int i = numControlPoints; i < param_storage.num_points(); i++) { vw::ba::ControlPoint const& cpoint = cnet[i]; if (cpoint.type() != vw::ba::ControlPoint::GroundControlPoint) vw_throw(vw::ArgumentErr() << "saveUpdatedIsisCnet: Book-keeping failure. Expected GCP.\n"); addIsisControlPoint(*icnet.get(), cnet, param_storage, cameras, serialNumbers, i, numOutliers); } vw::vw_out() << "Number of points in control network: " << icnet->GetNumPoints() << "\n"; vw::vw_out() << "Number of outliers: " << numOutliers << std::endl; vw::vw_out() << "Target: " << icnet->GetTarget().toStdString() << std::endl; std::string cnetFile = outputPrefix + ".net"; vw::vw_out() << "Writing ISIS control network: " << cnetFile << "\n"; QString qCnetFile = QString::fromStdString(cnetFile); icnet->Write(qCnetFile); #endif // ASP_HAVE_PKG_ISIS return; } // Create from scratch and and save an ISIS cnet from a given control network // and latest param values. void saveIsisCnet(std::string const& outputPrefix, vw::cartography::Datum const& datum, vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage) { #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 // Sanity check if (param_storage.num_points() != cnet.size()) vw::vw_throw(vw::ArgumentErr() << "saveIsisCnet: number of points in param_storage and cnet do not match.\n"); // Find the serial numbers std::vector image_files = cnet.get_image_list(); std::vector serialNumbers; readSerialNumbers(image_files, serialNumbers); // Read the cameras This may fail for non-ISIS images. Then use null cameras. std::vector> cameras; readIsisCameras(image_files, cameras); // Initialize the isis cnet Isis::ControlNet icnet; setIsisCnetTarget(image_files[0], datum, icnet); icnet.SetNetworkId(QString::fromStdString("bundle_adjust")); icnet.SetUserName(QString::fromStdString("bundle_adjust")); icnet.SetDescription(QString::fromStdString("bundle_adjust")); // Add a given control point to the ISIS cnet. Update the outlier counter. int numOutliers = 0; for (int i = 0; i < cnet.size(); i++) addIsisControlPoint(icnet, cnet, param_storage, cameras, serialNumbers, i, numOutliers); vw::vw_out() << "Number of points in control network: " << icnet.GetNumPoints() << "\n"; vw::vw_out() << "Number of outliers: " << numOutliers << std::endl; vw::vw_out() << "Target: " << icnet.GetTarget().toStdString() << std::endl; std::string cnetFile = outputPrefix + ".net"; vw::vw_out() << "Writing ISIS control network: " << cnetFile << "\n"; icnet.Write(QString::fromStdString(cnetFile)); #endif // ASP_HAVE_PKG_ISIS return; } } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustIsis.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustIsis.h /// Utilities for handling ISIS's jigsaw control network format. #ifndef __BUNDLE_ADJUST_ISIS_H__ #define __BUNDLE_ADJUST_ISIS_H__ #include // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include #endif // ASP_HAVE_PKG_ISIS #include #include #include #include namespace vw { namespace ba { class ControlNetwork; } namespace cartography { class Datum; } } namespace asp { struct BaParams; // Use this struct to collect all the data needed to handle an ISIS cnet. struct IsisCnetData { #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 Isis::ControlNetQsp isisCnet; #endif // ASP_HAVE_PKG_ISIS std::set isisOutliers; // rejected or ignored points are flagged as outliers IsisCnetData() { #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 isisCnet = Isis::ControlNetQsp(NULL); #endif // ASP_HAVE_PKG_ISIS isisOutliers.clear(); } }; // Load an ISIS cnet file and copy it to an ASP control network. The ISIS cnet // will be used when saving the updated cnet. Keep these cnets one-to-one, // though later the ASP cnet may also have GCP. void loadIsisCnet(std::string const& isisCnetFile, std::vector const& image_files, // Outputs vw::ba::ControlNetwork& cnet, IsisCnetData & isisCnetData); // Update an ISIS cnet with the latest info on triangulated points and outliers, // and write it to disk at .net. void saveUpdatedIsisCnet(std::string const& outputPrefix, vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, IsisCnetData & isisCnetData); // Create and save an ISIS cnet from a given control network and latest param // values. void saveIsisCnet(std::string const& outputPrefix, vw::cartography::Datum const& datum, vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage); } // end namespace asp #endif // __BUNDLE_ADJUST_ISIS_H__ ================================================ FILE: src/asp/Camera/BundleAdjustOptions.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file BundleAdjustOptions.cc // Options for bundle adjustment. #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { void BaOptions::copy_to_asp_settings() const { asp::stereo_settings().ip_detect_method = ip_detect_method; asp::stereo_settings().epipolar_threshold = epipolar_threshold; asp::stereo_settings().ip_inlier_factor = ip_inlier_factor; asp::stereo_settings().ip_uniqueness_thresh = ip_uniqueness_thresh; asp::stereo_settings().num_scales = num_scales; asp::stereo_settings().nodata_value = nodata_value; asp::stereo_settings().ip_per_tile = ip_per_tile; asp::stereo_settings().ip_per_image = ip_per_image; asp::stereo_settings().matches_per_tile = matches_per_tile; asp::stereo_settings().matches_per_tile_params = matches_per_tile_params; asp::stereo_settings().no_datum = no_datum; // Note that by default rough homography and tri filtering are disabled // as input cameras may be too inaccurate for that. asp::stereo_settings().skip_rough_homography = !enable_rough_homography; asp::stereo_settings().disable_tri_filtering = !enable_tri_filtering; // Do not pass this as it will results in filtering by elevation and lonlat // with unoptimized cameras. We will do that filtering with optimized // cameras later. //asp::stereo_settings().elevation_limit = elevation_limit; //asp::stereo_settings().lon_lat_limit = lon_lat_limit; asp::stereo_settings().individually_normalize = individually_normalize; asp::stereo_settings().force_reuse_match_files = force_reuse_match_files; asp::stereo_settings().min_triangulation_angle = min_triangulation_angle; asp::stereo_settings().ip_triangulation_max_error = ip_triangulation_max_error; asp::stereo_settings().ip_num_ransac_iterations = ip_num_ransac_iterations; asp::stereo_settings().ip_edge_buffer_percent = ip_edge_buffer_percent; asp::stereo_settings().ip_debug_images = ip_debug_images; asp::stereo_settings().ip_normalize_tiles = ip_normalize_tiles; asp::stereo_settings().flann_method = flann_method; asp::stereo_settings().propagate_errors = propagate_errors; asp::stereo_settings().ip_nodata_radius = ip_nodata_radius; // The setting below is not used, but populate it for completeness asp::stereo_settings().horizontal_stddev = vw::Vector2(horizontal_stddev, horizontal_stddev); asp::stereo_settings().validate(); } // Read the mapprojected data, if having the option --mapprojected-data. void setupMapprojectedData(asp::BaOptions & opt, bool need_no_matches, std::vector & map_files, std::string & mapproj_dem) { // Clear the outputs map_files.clear(); mapproj_dem.clear(); if (!need_no_matches) { if (!opt.mapprojected_data_list.empty()) { asp::read_list(opt.mapprojected_data_list, map_files); opt.mapprojected_data = "non-empty"; // put a token value, to make it non-empty } else if (opt.mapprojected_data != "") { std::istringstream is(opt.mapprojected_data); std::string file; while (is >> file) map_files.push_back(file); } if (!opt.mapprojected_data.empty()) { // Read the mapproj DEM from the first image geoheader or as the last element // in the list. if (opt.image_files.size() + 1 != map_files.size() && opt.image_files.size() != map_files.size()) vw::vw_throw(vw::ArgumentErr() << "Error: Expecting as many mapprojected images as " << "cameras and, potentially, a DEM at the end of the mapprojected list.\n"); if (opt.image_files.size() == map_files.size()) { // Read the DEM from first image header std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key; std::string adj_prefix_raw, image_file_raw, cam_type, cam_file_raw, dem_file; asp::read_mapproj_header(map_files.at(0), adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key, adj_prefix_raw, image_file_raw, cam_type, cam_file_raw, mapproj_dem); // read here } else if (opt.image_files.size() + 1 == map_files.size()) { // Pull out the dem from the list mapproj_dem = map_files.back(); map_files.erase(map_files.end() - 1); } } // The mapproj DEM must be non-empty if (!map_files.empty() && mapproj_dem.empty()) vw::vw_throw(vw::ArgumentErr() << "Interest point matching with mapprojected images requires a DEM. " << "None found either on the command line or in a geoheader of any " << "mapprojected image.\n"); } if (!map_files.empty()) { if (!opt.initial_transform_file.empty() || need_no_matches) vw::vw_throw(vw::ArgumentErr() << "Cannot use mapprojected data with initial adjustments, " << "an initial transform, or ISIS cnet or NVM input.\n"); } } /// Looks in the input camera position file to generate a GCC position for /// each input camera. /// - If no match is found, the coordinate is (0,0,0) int loadEstimCameraPositions(asp::BaOptions &opt, std::vector & estimated_camera_gcc) { estimated_camera_gcc.clear(); if (opt.camera_position_file == "") return 0; // Read the input csv file asp::CsvConv conv; conv.parse_csv_format(opt.csv_format_str, opt.csv_srs); std::list pos_records; typedef std::list::const_iterator RecordIter; conv.read_csv_file(opt.camera_position_file, pos_records); // Set up a GeoReference object using the datum vw::cartography::GeoReference geo; geo.set_datum(opt.datum); // We checked for a datum earlier conv.parse_georef(geo); // For each input camera, find the matching position in the record list const int num_cameras = opt.image_files.size(); estimated_camera_gcc.resize(num_cameras); const RecordIter no_match = pos_records.end(); int num_matches_found = 0; for (int i = 0; i < num_cameras; i++) { // Search for this image file in the records std::string file_name = opt.image_files[i]; RecordIter iter; for (iter = pos_records.begin(); iter != pos_records.end(); iter++) { // Match if the string in the file is contained in the input image string. // - May need to play around with this in the future! std::string field = iter->file; if (file_name.find(field) != std::string::npos) { estimated_camera_gcc[i] = conv.csv_to_cartesian(*iter, geo); break; // Match found, stop the iterator here. } } if (iter == no_match) { vw::vw_out(vw::WarningMessage) << "Camera file " << file_name << " not found in camera position file.\n"; estimated_camera_gcc[i] = vw::Vector3(0,0,0); } else { num_matches_found++; } } // End loop to find position record for each camera return num_matches_found; } // Compute statistics for the designated range of images (or mapprojected // images), and perhaps the footprints. Or, compute the ip per image (before // matching). These distinct operations use much shared logic, so are put in the // same function. In parallel_bundle_adjust this function is called separately // for different ranges. void computeStatsOrIp(asp::BaOptions const& opt, std::vector const& files_for_stats, std::string const& dem_file_for_overlap, std::string const& normalization_bounds_file, bool calcIp) { using namespace vw; int num_images = files_for_stats.size(); if (num_images != opt.image_files.size()) vw_throw(ArgumentErr() << "Book-keeping error in number of images.\n"); std::map bounds_map; if (calcIp) asp::readNormalizationBounds(normalization_bounds_file, files_for_stats, bounds_map); // Assign the images which this job should compute statistics for. std::vector image_stats_indices; for (size_t i = opt.job_id; i < num_images; i += opt.num_parallel_jobs) image_stats_indices.push_back(i); for (size_t i = 0; i < image_stats_indices.size(); i++) { size_t index = image_stats_indices[i]; // The stats need to be computed for the mapprojected image, if provided std::string image_path = files_for_stats[index]; // Call a bunch of stuff to get the nodata value boost::shared_ptr rsrc(vw::DiskImageResourcePtr(image_path)); float nodata = -std::numeric_limits::max(); float dummy_nodata = nodata; asp::get_nodata_values(rsrc, rsrc, asp::stereo_settings().nodata_value, nodata, dummy_nodata); // Set up the image view. If the user provided a custom no-data value, // values no more than that are masked. float user_nodata = asp::stereo_settings().nodata_value; DiskImageView image_view(rsrc); ImageViewRef> masked_image; if (!std::isnan(user_nodata)) masked_image = create_mask_less_or_equal(image_view, user_nodata); else masked_image = create_mask(image_view, nodata); // Use caching function call to compute the image statistics. if (!calcIp) asp::gather_stats(masked_image, opt.out_prefix, image_path, asp::stereo_settings().force_reuse_match_files); // Compute and cache the camera footprint polygon and its bbox if (opt.auto_overlap_params != "" && !calcIp) { vw::geometry::dPoly footprint; vw::BBox2 footprint_bbox; asp::camera_footprint(dem_file_for_overlap, opt.image_files[index], // use the original image opt.camera_models[index], opt.out_prefix, footprint, footprint_bbox); // outputs } if (calcIp) { // This closely resembles the logic in normalize_images() and // ip_matching(), but done per image. if (asp::openCvDetectMethod()) { vw::Vector2 bounds = bounds_map[image_path]; masked_image = normalize(masked_image, bounds[0], bounds[1], 0.0, 1.0); } // Detect ip and write them to file. Skip if cached ip newer than image exist. vw::ip::InterestPointList ip; std::string vwip_file = vw::ip::ip_filename(opt.out_prefix, image_path); bool use_cached_ip = false; if (fs::exists(vwip_file) && first_is_newer(vwip_file, image_path)) use_cached_ip = true; asp::detect_ip(ip, apply_mask(masked_image, nodata), asp::stereo_settings().ip_per_image, asp::stereo_settings().ip_per_tile, vwip_file, nodata, use_cached_ip); } } return; } // end function computeStatsOrIp } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustOptions.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_CAMERA_BUNDLE_ADJUST_OPTIONS_H__ #define __ASP_CAMERA_BUNDLE_ADJUST_OPTIONS_H__ #include #include #include #include // Functions that need the BaOptions class. namespace asp { struct BaOptions: public asp::BaBaseOptions { std::string cnet_file, cost_function, mapprojected_data, gcp_from_mapprojected; int ip_per_tile, ip_per_image, matches_per_tile; double overlap_exponent, ip_triangulation_max_error; int num_parallel_jobs, job_id, num_random_passes, ip_num_ransac_iterations; bool save_intermediate_cameras, approximate_pinhole_intrinsics, init_camera_using_gcp, disable_pinhole_gcp_init, transform_cameras_with_shared_gcp, transform_cameras_using_gcp, solve_intrinsics, ip_normalize_tiles, ip_debug_images, stop_after_stats, calc_normalization_bounds, calc_ip, stop_after_matching, skip_matching, apply_initial_transform_only, save_vwip; std::string camera_position_file, initial_transform_file, dem_file_for_overlap; double semi_major, semi_minor, position_filter_dist; std::string remove_outliers_params_str; std::vector intrinsics_limits; boost::shared_ptr cnet; int ip_detect_method, num_scales; double epipolar_threshold; // Max distance from epipolar line to search for IP matches. double ip_inlier_factor, ip_uniqueness_thresh, nodata_value, auto_overlap_buffer, pct_for_overlap, min_distortion, ip_nodata_radius; bool skip_rough_homography, enable_rough_homography, disable_tri_filtering, enable_tri_filtering, no_datum, individually_normalize, force_reuse_match_files, no_poses_from_nvm, query_num_image_pairs; vw::Vector2 elevation_limit; // Expected range of elevation to limit results to. vw::BBox2 lon_lat_limit; // Limit the triangulated interest points to this lonlat range vw::Matrix initial_transform; std::string fixed_cameras_indices_str, flann_method, fixed_distortion_indices_str; std::set fixed_cameras_indices; std::vector fixed_distortion_indices; asp::IntrinsicOptions intrinsics_options; vw::Vector2i matches_per_tile_params; // Make sure all values are initialized, even though they will be // over-written later. BaOptions(): ip_per_tile(0), ip_per_image(0), overlap_exponent(0), save_intermediate_cameras(false), solve_intrinsics(false), semi_major(0), semi_minor(0), position_filter_dist(-1), ip_detect_method(0), num_scales(-1), pct_for_overlap(-1), skip_rough_homography(false), individually_normalize(false), force_reuse_match_files(false), no_poses_from_nvm(false), query_num_image_pairs(false) {} /// Bundle adjustment settings that must be passed to the asp settings void copy_to_asp_settings() const; }; // End class BaOptions // Read the mapprojected data, if having the option --mapprojected-data. void setupMapprojectedData(asp::BaOptions & opt, bool need_no_matches, std::vector & map_files, std::string & mapproj_dem); /// Looks in the input camera position file to generate a GCC position for /// each input camera. /// - If no match is found, the coordinate is (0,0,0) int loadEstimCameraPositions(asp::BaOptions &opt, std::vector & estimated_camera_gcc); // Compute statistics for the designated range of images (or mapprojected // images), and perhaps the footprints. Or, compute the ip per image (before // matching). These distinct operations use much shared logic, so are put in the // same function. In parallel_bundle_adjust this function is called separately // for different ranges. void computeStatsOrIp(asp::BaOptions const& opt, std::vector const& files_for_stats, std::string const& dem_file_for_overlap, std::string const& normalization_bounds_file, bool calcIp); } // end namespace asp #endif // __ASP_CAMERA_BUNDLE_ADJUST_OPTIONS_H__ ================================================ FILE: src/asp/Camera/BundleAdjustOutliers.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file BundleAdjustOutliers.cc // // Logic for handling outliers in bundle adjustment. #include #include #include #include #include #include #include #include // Turn off warnings from eigen #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include #include #pragma GCC diagnostic pop namespace asp { using namespace vw; using namespace vw::camera; using namespace vw::ba; // Update the set of outliers based on param_storage void updateOutliers(vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, std::set & outliers) { outliers.clear(); for (int i = 0; i < param_storage.num_points(); i++) if (param_storage.get_point_outlier(i)) outliers.insert(i); } // Filter matches by projection window. // TODO(oalexan1): Use this in jitter_solve. // TODO(oalexan1): This needs to be done before subsampling the matches void filterOutliersProjWin(asp::BaBaseOptions & opt, asp::BaParams & param_storage, vw::ba::ControlNetwork const& cnet) { // Swap y. Sometimes it is convenient to specify these on input in reverse. if (opt.proj_win.min().y() > opt.proj_win.max().y()) std::swap(opt.proj_win.min().y(), opt.proj_win.max().y()); // Set the projection. The function set_proj4_projection_str() does not set the // datum radii, which is confusing. Use vw::cartography::set_srs_string(). vw::cartography::GeoReference georef; bool have_datum = (opt.datum.name() != asp::UNSPECIFIED_DATUM); vw::cartography::set_srs_string(opt.proj_str, have_datum, opt.datum, georef); int num_points = param_storage.num_points(); for (int i = 0; i < num_points; i++) { if (param_storage.get_point_outlier(i)) continue; double* point = param_storage.get_point_ptr(i); Vector3 xyz(point[0], point[1], point[2]); Vector3 llh = georef.datum().cartesian_to_geodetic(xyz); Vector2 proj_pt = georef.lonlat_to_point(subvector(llh, 0, 2)); if (!opt.proj_win.contains(proj_pt)) param_storage.set_point_outlier(i, true); } } void filterOutliersByConvergenceAngle(asp::BaBaseOptions const& opt, vw::ba::ControlNetwork const& cnet, asp::BaParams & param_storage) { std::vector optimized_cams; std::vector opt_cam_positions; asp::calcOptimizedCameras(opt, param_storage, optimized_cams); asp::calcCameraCenters(optimized_cams, opt_cam_positions); int num_outliers_by_conv_angle = 0; for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) { if (cnet[ipt].type() == ControlPoint::GroundControlPoint) continue; // don't filter out GCP if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // The GCC coordinate of this point const double * point = param_storage.get_point_ptr(ipt); Vector3 xyz(point[0], point[1], point[2]); // Control point auto const& cp = cnet[ipt]; double max_angle = 0; for (size_t j = 0; j < cp.size(); j++) { size_t j_cam_id = cp[j].image_id(); vw::Vector3 P1 = opt_cam_positions[j_cam_id]; vw::Vector3 dir1 = xyz - P1; if (norm_2(dir1) > 1e-8) dir1 = normalize(dir1); for (size_t k = j + 1; k < cp.size(); k++) { size_t k_cam_id = cp[k].image_id(); vw::Vector3 P2 = opt_cam_positions[k_cam_id]; vw::Vector3 dir2 = xyz - P2; if (norm_2(dir2) > 1e-8) dir2 = normalize(dir2); double angle = (180.0 / M_PI) * acos(dot_prod(dir1, dir2)); if (std::isnan(angle) || std::isinf(angle)) continue; max_angle = std::max(max_angle, angle); } } if (max_angle < opt.min_triangulation_angle) { param_storage.set_point_outlier(ipt, true); num_outliers_by_conv_angle++; } if (opt.max_triangulation_angle > 0 && max_angle > opt.max_triangulation_angle) { param_storage.set_point_outlier(ipt, true); num_outliers_by_conv_angle++; } } int num_pts = param_storage.num_points(); vw::vw_out() << std::setprecision(4) << "Removed " << num_outliers_by_conv_angle << " triangulated points out of " << num_pts << " (" << (100.0 * num_outliers_by_conv_angle) / num_pts << "%)" << " by ray convergence angle.\n"; } // Add to the outliers based on the large residuals int add_to_outliers(vw::ba::ControlNetwork & cnet, asp::CRN const& crn, asp::BaParams & param_storage, asp::BaOptions const& opt, std::vector const& cam_residual_counts, std::vector> const& pixel_sigmas, size_t num_gcp_or_dem_residuals, size_t num_uncertainty_residuals, size_t num_tri_residuals, size_t num_cam_pos_residuals, std::vector const& reference_vec, ceres::Problem &problem) { vw_out() << "Removing outliers.\n"; size_t num_points = param_storage.num_points(); size_t num_cameras = param_storage.num_cameras(); // Compute the reprojection error. Adjust for residuals being divided by pixel sigma. // Do not use the attenuated residuals due to the loss function. std::vector residuals; asp::compute_residuals(opt, crn, param_storage, cam_residual_counts, pixel_sigmas, num_gcp_or_dem_residuals, num_uncertainty_residuals, num_tri_residuals, num_cam_pos_residuals, reference_vec, problem, residuals); // output // Compute the mean residual at each xyz, and how many times that residual is seen std::vector mean_residuals; std::vector num_point_observations; asp::compute_mean_residuals_at_xyz(crn, residuals, param_storage, mean_residuals, num_point_observations); // outputs // The number of mean residuals is the same as the number of points, // of which some are outliers. Hence need to collect only the // non-outliers so far to be able to remove new outliers. Need to // follow the same logic as when residuals were formed. And also ignore GCP. std::vector actual_residuals; std::set was_added; for (size_t icam = 0; icam < num_cameras; icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; // skip existing outliers if (param_storage.get_point_outlier(ipt)) continue; // Skip gcp, those are never outliers no matter what. if (cnet[ipt].type() == ControlPoint::GroundControlPoint) continue; // We already encountered this residual in the previous camera if (was_added.find(ipt) != was_added.end()) continue; was_added.insert(ipt); actual_residuals.push_back(mean_residuals[ipt]); //vw_out() << "XYZ residual " << ipt << " = " << mean_residuals[ipt] << std::endl; } } // End double loop through all the observations double pct = 1.0 - opt.remove_outliers_params[0]/100.0; double factor = opt.remove_outliers_params[1]; double max_pix1 = opt.remove_outliers_params[2]; double max_pix2 = opt.remove_outliers_params[3]; double b, e; vw::math::find_outlier_brackets(actual_residuals, pct, factor, b, e); vw_out() << "Percentile-based outlier bounds: b = " << b << ", e = " << e << ".\n"; // If this is too aggressive, the user can tame it. It is // unreasonable to throw out pixel residuals as small as 1 or 2 // pixels. We will not use the b, because the residuals start at 0. // "max_pix2" sets the minimum error that can be thrown out. e = std::min(std::max(e, max_pix1), max_pix2); vw_out() << "Removing as outliers points with mean reprojection error > " << e << ".\n"; // Add to the outliers by reprojection error. Must repeat the same logic as above. // TODO(oalexan1): This removes a 3D point altogether if any reprojection // errors for it are big. Need to only remove bad reprojection errors // and keep a 3D point if it is left with at least two reprojection residuals. int num_outliers_by_reprojection = 0, total = 0; for (size_t icam = 0; icam < num_cameras; icam++) { typedef CameraNode::const_iterator crn_iter; for (crn_iter fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; total++; // skip existing outliers if (param_storage.get_point_outlier(ipt)) continue; // Skip gcp if (cnet[ipt].type() == ControlPoint::GroundControlPoint) continue; if (mean_residuals[ipt] > e) { param_storage.set_point_outlier(ipt, true); num_outliers_by_reprojection++; } } } // End double loop through all the observations vw_out() << "Removed " << num_outliers_by_reprojection << " outliers out of " << total << " interest points by reprojection error. Ratio: " << double(num_outliers_by_reprojection) / double(total) <<".\n"; // Remove outliers by elevation limit int num_outliers_by_elev_or_lonlat = 0; if (opt.elevation_limit[0] < opt.elevation_limit[1] || !opt.lon_lat_limit.empty()) { for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) { if (cnet[ipt].type() == ControlPoint::GroundControlPoint) continue; // don't filter out GCP if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // The GCC coordinate of this point const double * point = param_storage.get_point_ptr(ipt); Vector3 xyz(point[0], point[1], point[2]); Vector3 llh = opt.datum.cartesian_to_geodetic(xyz); if (opt.elevation_limit[0] < opt.elevation_limit[1] && (llh[2] < opt.elevation_limit[0] || llh[2] > opt.elevation_limit[1])) { param_storage.set_point_outlier(ipt, true); num_outliers_by_elev_or_lonlat++; continue; } Vector2 lon_lat = subvector(llh, 0, 2); if (!opt.lon_lat_limit.empty() && !opt.lon_lat_limit.contains(lon_lat)) { param_storage.set_point_outlier(ipt, true); num_outliers_by_elev_or_lonlat++; continue; } } vw_out() << "Removed " << num_outliers_by_elev_or_lonlat << " outliers by elevation range and/or lon-lat range.\n"; } // Remove outliers by convergence angle if (opt.min_triangulation_angle > 0) asp::filterOutliersByConvergenceAngle(opt, cnet, param_storage); // Remove outliers based on spatial extent. Be more generous with // leaving data in than what the input parameters suggest, because // sometimes inliers in space need not be uniformly distributed. double pct_factor = (3.0 + opt.remove_outliers_params[0]/100.0)/4.0; // e.g., 0.9375 double outlier_factor = 2 * opt.remove_outliers_params[1]; // e.g., 6.0. std::vector x_vals, y_vals, z_vals; for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) { if (cnet[ipt].type() == ControlPoint::GroundControlPoint) continue; // don't filter out GCP if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // The GCC coordinate of this point const double * point = param_storage.get_point_ptr(ipt); x_vals.push_back(point[0]); y_vals.push_back(point[1]); z_vals.push_back(point[2]); } vw::BBox3 estim_box; asp::estimate_inliers_bbox(pct_factor, pct_factor, pct_factor, outlier_factor, x_vals, y_vals, z_vals, estim_box); // output int num_box_outliers = 0; for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) { if (cnet[ipt].type() == ControlPoint::GroundControlPoint) continue; // don't filter out GCP if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // The GCC coordinate of this point const double * point = param_storage.get_point_ptr(ipt); Vector3 xyz(point[0], point[1], point[2]); if (!estim_box.contains(xyz)) { param_storage.set_point_outlier(ipt, true); num_box_outliers++; } } vw_out() << "Removed " << num_box_outliers << " " << "outlier(s) based on spatial distribution of triangulated points.\n"; // Remove GCP outliers if (opt.max_gcp_reproj_err > 0) { int num_gcp_outliers = 0; for (size_t ipt = 0; ipt < param_storage.num_points(); ipt++) { if (cnet[ipt].type() != ControlPoint::GroundControlPoint) continue; if (param_storage.get_point_outlier(ipt)) continue; if (mean_residuals[ipt] > opt.max_gcp_reproj_err) { param_storage.set_point_outlier(ipt, true); num_gcp_outliers++; } } vw_out() << "Removed " << num_gcp_outliers << " GCPs with reprojection error > " << opt.max_gcp_reproj_err << " pixels.\n"; } int num_remaining_points = num_points - param_storage.get_num_outliers(); return num_outliers_by_reprojection + num_outliers_by_elev_or_lonlat; } // Filter GCP outliers based on mean reprojection error per triangulated point. // Adds to the existing outlier set (does not clear it). void filterGcpOutliers(vw::ba::ControlNetwork const& cnet, std::vector const& mean_residuals, double max_gcp_reproj_err, std::set & outliers) { if (max_gcp_reproj_err <= 0) return; if (mean_residuals.size() != cnet.size()) vw_throw(ArgumentErr() << "filterGcpOutliers: mean residuals size (" << mean_residuals.size() << ") does not match control network size (" << cnet.size() << ").\n"); int num_gcp_outliers = 0; for (int ipt = 0; ipt < (int)cnet.size(); ipt++) { if (cnet[ipt].type() != ControlPoint::GroundControlPoint) continue; if (outliers.find(ipt) != outliers.end()) continue; if (mean_residuals[ipt] > max_gcp_reproj_err) { outliers.insert(ipt); num_gcp_outliers++; } } vw_out() << "Removed " << num_gcp_outliers << " GCP outliers with mean reprojection error > " << max_gcp_reproj_err << " pixels. " << "These will be excluded from the next pass of optimization.\n"; } } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustOutliers.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustOutliers.h /// // Logic for handling outliers in bundle adjustment. #ifndef __BUNDLE_ADJUST_OUTLIERS_H__ #define __BUNDLE_ADJUST_OUTLIERS_H__ #include #include #include #include namespace ceres { class Problem; } namespace asp { class BaBaseOptions; class BaOptions; class BaParams; // Update the set of outliers based on param_storage void updateOutliers(vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, std::set & outliers); // Filter matches by projection window. // TODO(oalexan1): Use this in jitter_solve. // TODO(oalexan1): This needs to be done before subsampling the matches void filterOutliersProjWin(asp::BaBaseOptions & opt, asp::BaParams & param_storage, vw::ba::ControlNetwork const& cnet); void filterOutliersByConvergenceAngle(asp::BaBaseOptions const& opt, vw::ba::ControlNetwork const& cnet, asp::BaParams & param_storage); /// Add to the outliers based on the large residuals int add_to_outliers(vw::ba::ControlNetwork & cnet, asp::CRN const& crn, asp::BaParams & param_storage, asp::BaOptions const& opt, std::vector const& cam_residual_counts, std::vector> const& pixel_sigmas, size_t num_gcp_or_dem_residuals, size_t num_uncertainty_residuals, size_t num_tri_residuals, size_t num_cam_pos_residuals, std::vector const& reference_vec, ceres::Problem &problem); // Filter GCP outliers based on mean reprojection error per triangulated point. // Adds to the existing outlier set (does not clear it). // Used by jitter_solve where outliers are tracked as std::set. void filterGcpOutliers(vw::ba::ControlNetwork const& cnet, std::vector const& mean_residuals, double max_gcp_reproj_err, std::set & outliers); } // end namespace asp #endif // __BUNDLE_ADJUST_OUTLIERS_H__ ================================================ FILE: src/asp/Camera/BundleAdjustResiduals.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustResiduals.cc /// // Logic for computing residuals for bundle adjustment. #include #include #include #include #include #include using namespace vw; using namespace vw::camera; using namespace vw::ba; namespace asp { // Compute the bundle_adjust residuals. Multiply the pixel residuals // by their sigmas, to get back the pixel reprojection errors. void compute_residuals(asp::BaBaseOptions const& opt, asp::CRN const& crn, asp::BaParams const& param_storage, std::vector const& cam_residual_counts, std::vector> const& pixel_sigmas, size_t num_gcp_or_dem_residuals, size_t num_uncertainty_residuals, size_t num_tri_residuals, size_t num_cam_position_residuals, std::vector const& reference_vec, ceres::Problem & problem, // Output std::vector & residuals) { double cost = 0.0; ceres::Problem::EvaluateOptions eval_options; bool apply_loss_function = false; // must compute the actual residuals eval_options.apply_loss_function = apply_loss_function; if (opt.single_threaded_cameras) eval_options.num_threads = 1; // ISIS must be single threaded! else eval_options.num_threads = opt.num_threads; problem.Evaluate(eval_options, &cost, &residuals, 0, 0); const size_t num_residuals = residuals.size(); // Verify our book-keeping is correct size_t num_expected_residuals = (num_gcp_or_dem_residuals + num_tri_residuals) * param_storage.params_per_point(); size_t total_num_cam_params = param_storage.num_cameras()*param_storage.params_per_camera(); for (size_t i = 0; i < param_storage.num_cameras(); i++) num_expected_residuals += cam_residual_counts[i]*PIXEL_SIZE; if (opt.camera_weight > 0) num_expected_residuals += total_num_cam_params; if (opt.rotation_weight > 0) num_expected_residuals += total_num_cam_params; num_expected_residuals += num_uncertainty_residuals * asp::NUM_XYZ_PARAMS; num_expected_residuals += reference_vec.size() * PIXEL_SIZE; num_expected_residuals += num_cam_position_residuals * param_storage.params_per_camera(); if (num_expected_residuals != num_residuals) vw_throw(LogicErr() << "Expected " << num_expected_residuals << " residuals but instead got " << num_residuals); // Undo the division by pixel_sigma when computing the residuals, to get // the pixel reprojection errors. size_t residual_index = 0; for (size_t icam = 0; icam < param_storage.num_cameras(); icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // Look up the sigma for this point auto sigma_it = pixel_sigmas[icam].find(ipt); // Must have a sigma for each residual added if (sigma_it == pixel_sigmas[icam].end()) vw_throw(LogicErr() << "Could not find sigma for point " << ipt << " in camera " << icam); vw::Vector2 sigma = sigma_it->second; residuals[residual_index+0] *= sigma[0]; residuals[residual_index+1] *= sigma[1]; residual_index += PIXEL_SIZE; } } } /// Compute residual map by averaging all the reprojection error at a given point void compute_mean_residuals_at_xyz(asp::CRN const& crn, std::vector const& residuals, asp::BaParams const& param_storage, // outputs std::vector & mean_residuals, std::vector & num_point_observations) { mean_residuals.resize(param_storage.num_points()); num_point_observations.resize(param_storage.num_points()); // Observation residuals are stored at the beginning of the residual vector in the // same order they were originally added to Ceres. size_t residual_index = 0; // Double loop through cameras and crn entries will give us the correct order for (size_t icam = 0; icam < param_storage.num_cameras(); icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // Get the residual norm for this observation double errorX = residuals[residual_index]; double errorY = residuals[residual_index+1]; double residual_error = norm_2(vw::Vector2(errorX, errorY)); residual_index += PIXEL_SIZE; // Update information for this point num_point_observations[ipt] += 1; mean_residuals [ipt] += residual_error; } } // End double loop through all the observations // Do the averaging for (size_t i = 0; i < param_storage.num_points(); i++) { if (param_storage.get_point_outlier(i)) { // Skip outliers. But initialize to something. mean_residuals [i] = std::numeric_limits::quiet_NaN(); num_point_observations[i] = std::numeric_limits::quiet_NaN(); continue; } mean_residuals[i] /= static_cast(num_point_observations[i]); } } // End function compute_mean_residuals_at_xyz // Write out a .csv file recording the residual error at each location on the ground // TODO(oalexan1): Integrate with write_per_xyz_residuals(). void write_residual_map(std::string const& output_prefix, // Mean residual of each point std::vector const& mean_residuals, // Num non-outlier pixels per point std::vector const& num_point_observations, asp::BaParams const& param_storage, vw::ba::ControlNetwork const& cnet, asp::BaBaseOptions const& opt) { std::string output_path = output_prefix + ".csv"; if (opt.datum.name() == asp::UNSPECIFIED_DATUM) { vw_out(WarningMessage) << "No datum specified, cannot write file: " << output_path << ". " << "Specify: '--datum '.\n"; return; } if (mean_residuals.size() != param_storage.num_points()) vw_throw(LogicErr() << "Point count mismatch in write_residual_map().\n"); if (cnet.size() != param_storage.num_points()) vw_throw(LogicErr() << "The number of stored points " << "does not agree with number of points in cnet.\n"); // Open the output file and write the header vw_out() << "Writing: " << output_path << std::endl; std::ofstream file; file.open(output_path.c_str()); file.precision(17); file << "# lon, lat, height_above_datum, mean_residual, num_observations\n"; // stereo_gui counts on being able to parse the datum from this file, so // do not modify the line below. file << "# " << opt.datum << std::endl; // Now write all the points to the file for (size_t i = 0; i < param_storage.num_points(); i++) { if (param_storage.get_point_outlier(i)) continue; // skip outliers // The final GCC coordinate of this point const double * point = param_storage.get_point_ptr(i); Vector3 xyz(point[0], point[1], point[2]); Vector3 llh = opt.datum.cartesian_to_geodetic(xyz); std::string comment = ""; if (cnet[i].type() == ControlPoint::GroundControlPoint) comment = " # GCP"; else if (cnet[i].type() == ControlPoint::PointFromDem) comment = " # from DEM"; file << llh[0] <<", "<< llh[1] <<", "<< llh[2] <<", "<< mean_residuals[i] <<", " << num_point_observations[i] << comment << std::endl; } file.close(); } // End function write_residual_map // This is used in jitter_solve. There can be more tri points than in cnet, // because we add anchor points. Those do not get processed here. // TODO(oalexan1): Integrate with write_residual_map(). void write_per_xyz_pixel_residuals(vw::ba::ControlNetwork const& cnet, std::string const& residual_prefix, vw::cartography::Datum const& datum, std::set const& outliers, std::vector const& tri_points_vec, std::vector const& mean_pixel_residual_norm, std::vector const& pixel_residual_count) { std::string map_prefix = residual_prefix + "_pointmap"; std::string output_path = map_prefix + ".csv"; int num_tri_points = cnet.size(); // Open the output file and write the header. TODO(oalexan1): See // if it is possible to integrate this with the analogous // bundle_adjust function. vw_out() << "Writing: " << output_path << std::endl; std::ofstream file; file.open(output_path.c_str()); file.precision(17); file << "# lon, lat, height_above_datum, mean_residual, num_observations\n"; file << "# " << datum << std::endl; // Write all the points to the file for (int ipt = 0; ipt < num_tri_points; ipt++) { if (outliers.find(ipt) != outliers.end() || pixel_residual_count[ipt] <= 0) continue; // Skip outliers // The final GCC coordinate of this point const double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS; Vector3 xyz(tri_point[0], tri_point[1], tri_point[2]); Vector3 llh = datum.cartesian_to_geodetic(xyz); std::string comment = ""; if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint) comment = " # GCP"; else if (cnet[ipt].type() == vw::ba::ControlPoint::PointFromDem) comment = " # from DEM"; file << llh[0] << ", " << llh[1] <<", " << llh[2] << ", " << mean_pixel_residual_norm[ipt] << ", " << pixel_residual_count[ipt] << comment << std::endl; } file.close(); } // This is used in jitter_solve void write_anchor_residuals(std::string const& residual_prefix, vw::cartography::Datum const& datum, std::vector const& anchor_xyz, std::vector const& anchor_residual_norm) { std::string map_prefix = residual_prefix + "_anchor_points"; std::string output_path = map_prefix + ".csv"; vw_out() << "Writing: " << output_path << std::endl; std::ofstream file; file.open(output_path.c_str()); file.precision(17); file << "# lon, lat, height_above_datum, anchor_residual_pixel_norm\n"; file << "# " << datum << std::endl; for (size_t anchor_it = 0; anchor_it < anchor_xyz.size(); anchor_it++) { Vector3 llh = datum.cartesian_to_geodetic(anchor_xyz[anchor_it]); file << llh[0] <<", "<< llh[1] << ", " << llh[2] << ", " << anchor_residual_norm[anchor_it] << std::endl; } file.close(); } /// Write log files describing all residual errors. The order of data stored /// in residuals must mirror perfectly the way residuals were created. void write_residual_logs(std::string const& residual_prefix, asp::BaBaseOptions const& opt, asp::BaParams const& param_storage, std::vector const& cam_residual_counts, std::vector> const& pixel_sigmas, size_t num_gcp_or_dem_residuals, size_t num_uncertainty_residuals, size_t num_tri_residuals, size_t num_cam_position_residuals, std::vector const& reference_vec, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, ceres::Problem &problem) { std::vector residuals; asp::compute_residuals(opt, crn, param_storage, cam_residual_counts, pixel_sigmas, num_gcp_or_dem_residuals, num_uncertainty_residuals, num_tri_residuals, num_cam_position_residuals, reference_vec, problem, // Output residuals); const size_t num_residuals = residuals.size(); const std::string residual_path = residual_prefix + "_stats.txt"; const std::string residual_raw_pixels_path = residual_prefix + "_raw_pixels.txt"; const std::string residual_reference_xyz_path = residual_prefix + "_reference_terrain.txt"; // Write a report on residual errors std::ofstream residual_file, residual_file_raw_pixels, residual_file_reference_xyz; vw_out() << "Writing: " << residual_path << std::endl; vw_out() << "Writing: " << residual_raw_pixels_path << std::endl; residual_file.open(residual_path.c_str()); residual_file.precision(17); residual_file_raw_pixels.open(residual_raw_pixels_path.c_str()); residual_file_raw_pixels.precision(17); if (reference_vec.size() > 0) { vw_out() << "Writing: " << residual_reference_xyz_path << std::endl; residual_file_reference_xyz.open(residual_reference_xyz_path.c_str()); residual_file_reference_xyz.precision(17); } size_t index = 0; // For each camera, average together all the point observation residuals residual_file << "# Pixel reprojection error per camera\n"; residual_file << "# Image, mean, median, count\n"; for (size_t c = 0; c < param_storage.num_cameras(); c++) { size_t num_this_cam_residuals = cam_residual_counts[c]; // Write header for the raw file std::string name = opt.image_files[c]; residual_file_raw_pixels << name << ", " << num_this_cam_residuals << std::endl; // All residuals are for inliers, as we do not even add a residual // for an outlier double mean_residual = 0; // Take average of all pixel coord errors std::vector residual_norms; for (size_t i = 0; i < num_this_cam_residuals; i++) { double ex = residuals[index]; index++; double ey = residuals[index]; index++; double residual_norm = std::sqrt(ex * ex + ey * ey); mean_residual += residual_norm; residual_norms.push_back(residual_norm); residual_file_raw_pixels << ex << ", " << ey << std::endl; } // Write line for the summary file mean_residual /= static_cast(num_this_cam_residuals); double median_residual = std::numeric_limits::quiet_NaN(); if (residual_norms.size() > 0) { std::sort(residual_norms.begin(), residual_norms.end()); median_residual = residual_norms[residual_norms.size()/2]; } residual_file << name << ", " << mean_residual << ", " << median_residual << ", " << num_this_cam_residuals << std::endl; } residual_file_raw_pixels.close(); residual_file.close(); // Go through the GCP residuals if (num_gcp_or_dem_residuals > 0) { for (size_t i = 0; i < num_gcp_or_dem_residuals; i++) { double mean_residual = 0; // Take average of XYZ error for each point for (size_t j = 0; j < param_storage.params_per_point(); j++) { mean_residual += fabs(residuals[index]); index++; } mean_residual /= static_cast(param_storage.params_per_point()); } } // List the camera weight residuals int num_passes = int(opt.camera_weight > 0) + int(opt.rotation_weight > 0); for (int pass = 0; pass < num_passes; pass++) { const size_t part_size = param_storage.params_per_camera()/2; for (size_t c = 0; c < param_storage.num_cameras(); c++) { // Separately compute the mean position and rotation error double mean_residual_pos = 0, mean_residual_rot = 0; for (size_t j = 0; j < part_size; j++) { mean_residual_pos += fabs(residuals[index]); index++; } for (size_t j = 0; j < part_size; j++) { mean_residual_rot += fabs(residuals[index]); index++; } mean_residual_pos /= static_cast(part_size); mean_residual_rot /= static_cast(part_size); } } // Keep track of number of camera uncertainty residuals but don't save those index += num_uncertainty_residuals * asp::NUM_XYZ_PARAMS; // List residuals for matching input terrain (lidar) if (reference_vec.size() > 0) { residual_file << "reference terrain residual errors:\n"; residual_file_reference_xyz << "# lon, lat, height_above_datum, pixel_error_norm\n"; for (size_t i = 0; i < reference_vec.size(); i++) { Vector3 llh = opt.datum.cartesian_to_geodetic(reference_vec[i]); double err = norm_2(Vector2(residuals[index], residuals[index + 1])); // Divide back the residual by the multiplier weight if (opt.reference_terrain_weight > 0) err /= opt.reference_terrain_weight; index += PIXEL_SIZE; residual_file_reference_xyz << llh[0] << ", " << llh[1] << ", " << llh[2] << ", " << err << "\n"; residual_file << i << ", " << err << "\n"; } residual_file_reference_xyz.close(); } // Keep track of number of triangulation constraint residuals but don't save those index += asp::PARAMS_PER_POINT * num_tri_residuals; index += param_storage.params_per_camera() * num_cam_position_residuals; if (index != num_residuals) vw_throw( LogicErr() << "Have " << num_residuals << " residuals, but iterated through " << index); // Generate the location based file std::string map_prefix = residual_prefix + "_pointmap"; std::vector mean_residuals; std::vector num_point_observations; compute_mean_residuals_at_xyz(crn, residuals, param_storage, mean_residuals, num_point_observations); write_residual_map(map_prefix, mean_residuals, num_point_observations, param_storage, cnet, opt); } // End function write_residual_logs // Find the offsets between initial and final triangulated points // TODO(oalexan1): Copy the data from param storage, then // use the 2nd function called saveTriOffsetsPerCamera instead // to reduce code duplication. void saveTriOffsetsPerCamera(std::vector const& image_files, asp::BaParams const& orig_params, asp::BaParams const& param_storage, asp::CRN const& crn, std::string const& tri_offsets_file) { // Number of cameras and points int num_cams = param_storage.num_cameras(); int num_points = param_storage.num_points(); // Need to have a vector of vectors, one for each camera std::vector> tri_offsets(num_cams); for (int icam = 0; icam < num_cams; icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; // Sanity check if (ipt < 0 || ipt >= num_points) vw_throw(LogicErr() << "Invalid point index " << ipt << " in saveTriOffsetsPerCamera().\n"); if (param_storage.get_point_outlier(ipt)) continue; // skip outliers // Initial ECEF triangulated point double const* orig_point = orig_params.get_point_ptr(ipt); vw::Vector3 initial_xyz(orig_point[0], orig_point[1], orig_point[2]); // Optimized ECEF triangulated point double const* point = param_storage.get_point_ptr(ipt); vw::Vector3 final_xyz(point[0], point[1], point[2]); // Append the norm of offset tri_offsets[icam].push_back(norm_2(final_xyz - initial_xyz)); } } asp::writeTriOffsetsPerCamera(num_cams, image_files, tri_offsets, tri_offsets_file); } // Analogous version to the above, but keep the original and current triangulated points // in std, for use in jitter_solve. Note that tri_points_vec may have // anchor points later on, but we don't get to them. void saveTriOffsetsPerCamera(std::vector const& image_files, std::set const& outliers, std::vector const& orig_tri_points_vec, std::vector const& tri_points_vec, asp::CRN const& crn, std::string const& tri_offsets_file) { if (orig_tri_points_vec.size() != tri_points_vec.size()) vw_throw(ArgumentErr() << "Expecting the same number of original and current 3D " << "points.\n"); // Number of cameras and points int num_cams = image_files.size(); int num_points = orig_tri_points_vec.size()/3; // Need to have a vector of vectors, one for each camera std::vector> tri_offsets(num_cams); for (int icam = 0; icam < num_cams; icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; // Sanity check if (ipt < 0 || ipt >= num_points) vw::vw_throw(vw::LogicErr() << "Invalid point index " << ipt << " in saveTriOffsetsPerCamera().\n"); if (outliers.find(ipt) != outliers.end()) continue; // Skip outliers // Initial and optimized ECEF triangulated points double const* orig_point = &orig_tri_points_vec[3*ipt]; double const* point = &tri_points_vec[3*ipt]; vw::Vector3 initial_xyz(orig_point[0], orig_point[1], orig_point[2]); vw::Vector3 final_xyz(point[0], point[1], point[2]); // Append the norm of offset tri_offsets[icam].push_back(norm_2(final_xyz - initial_xyz)); } } asp::writeTriOffsetsPerCamera(num_cams, image_files, tri_offsets, tri_offsets_file); } // Write the offsets between initial and final triangulated points void writeTriOffsetsPerCamera(int num_cams, std::vector const& image_files, std::vector> & tri_offsets, std::string const& tri_offsets_file) { // Write to disk with 8 digits of precision vw::vw_out() << "Writing: " << tri_offsets_file << std::endl; std::ofstream ofs(tri_offsets_file.c_str()); ofs.precision(8); ofs << "# Per-image offsets between initial and final triangulated points (meters)\n"; ofs << "# Image mean median count\n"; // Iterate through the cameras double nan = std::numeric_limits::quiet_NaN(); for (int icam = 0; icam < num_cams; icam++) { auto & offsets = tri_offsets[icam]; double mean = nan, median = nan, count = 0; if (!offsets.empty()) { mean = vw::math::mean(offsets); median = vw::math::destructive_median(offsets); count = offsets.size(); } ofs << image_files[icam] << " " << mean << " " << median << " " << count << "\n"; } ofs.close(); } // Compute the horizontal and vertical change in camera positions void saveCameraOffsets(vw::cartography::Datum const& datum, std::vector const& image_files, std::vector const& orig_cam_positions, std::vector const& opt_cam_positions, std::string const& camera_offset_file) { // Sanity check for the sizes if (orig_cam_positions.size() != opt_cam_positions.size()) vw_throw(ArgumentErr() << "Expecting the same number of original and optimized camera positions.\n"); vw::vw_out() << "Writing: " << camera_offset_file << std::endl; std::ofstream ofs(camera_offset_file.c_str()); ofs.precision(8); ofs << "# Per-image absolute horizontal and vertical change in camera center (meters)\n"; // Loop through the cameras and find the change in their centers for (size_t icam = 0; icam < orig_cam_positions.size(); icam++) { vw::Vector3 orig_ctr = orig_cam_positions[icam]; vw::Vector3 opt_ctr = opt_cam_positions [icam]; vw::Vector3 llh = datum.cartesian_to_geodetic(orig_ctr); vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh); vw::Matrix3x3 EcefToNed = vw::math::inverse(NedToEcef); vw::Vector3 NedDir = EcefToNed * (opt_ctr - orig_ctr); // Find horizontal and vertical change double horiz_change = norm_2(subvector(NedDir, 0, 2)); double vert_change = std::abs(NedDir[2]); ofs << image_files[icam] << " " << horiz_change << " " << vert_change << "\n"; } ofs.close(); return; } // Compute the horizontal and vertical change in camera positions. If more than // one camera position, such as for linescan, find the biggest. void saveCameraOffsets(vw::cartography::Datum const& datum, std::vector const& image_files, std::vector> const& orig_cam_positions, std::vector> const& opt_cam_positions, std::string const& camera_offset_file) { vw::vw_out() << "Writing: " << camera_offset_file << "\n"; std::ofstream ofs(camera_offset_file.c_str()); ofs.precision(8); ofs << "# Per-image absolute horizontal and vertical change in camera center (meters)\n"; // Sanity check that the sizes are the same if (orig_cam_positions.size() != opt_cam_positions.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting the same number of original and optimized camera positions.\n"); // Loop through the cameras and find the change in their centers for (size_t icam = 0; icam < orig_cam_positions.size(); icam++) { auto const& orig_ctrs = orig_cam_positions[icam]; auto const& opt_ctrs = opt_cam_positions[icam]; if (orig_ctrs.size() != opt_ctrs.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting the same number of original and optimized camera centers.\n"); // Iterate over the camera centers double horiz_change = 0.0, vert_change = 0.0; for (size_t i = 0; i < orig_ctrs.size(); i++) { vw::Vector3 orig_ctr = orig_ctrs[i]; vw::Vector3 opt_ctr = opt_ctrs[i]; // Convert to geodetic vw::Vector3 llh = datum.cartesian_to_geodetic(orig_ctr); vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh); vw::Matrix3x3 EcefToNed = vw::math::inverse(NedToEcef); vw::Vector3 NedDir = EcefToNed * (opt_ctr - orig_ctr); // Find horizontal and vertical change horiz_change = std::max(horiz_change, norm_2(subvector(NedDir, 0, 2))); vert_change = std::max(vert_change, std::abs(NedDir[2])); } ofs << image_files[icam] << " " << horiz_change << " " << vert_change << "\n"; } ofs.close(); return; } // This is used in jitter_solve void compute_residuals(asp::BaBaseOptions const& opt, ceres::Problem & problem, // Output std::vector & residuals) { double cost = 0.0; ceres::Problem::EvaluateOptions eval_options; eval_options.apply_loss_function = false; if (opt.single_threaded_cameras) eval_options.num_threads = 1; // ISIS must be single threaded! else eval_options.num_threads = opt.num_threads; problem.Evaluate(eval_options, &cost, &residuals, 0, 0); } // Residuals for option --reference-terrain void writeRefTerrainResiduals(std::string const& residual_prefix, vw::cartography::Datum const& datum, std::vector const& residuals, std::vector const& weight_per_residual, std::vector const& reference_vec, std::vector> const& ref_indices) { // Sanity checks if (residuals.size() != weight_per_residual.size()) vw_throw(ArgumentErr() << "There must be as many residuals as weights for them.\n"); if (ref_indices.size() != reference_vec.size()) vw_throw(ArgumentErr() << "Expecting as many indices as reference points.\n"); std::string map_prefix = residual_prefix + "_ref_terrain"; std::string output_path = map_prefix + ".csv"; // Open the output file and write the header. TODO(oalexan1): See // if it is possible to integrate this with the analogous // bundle_adjust function. vw_out() << "Writing: " << output_path << std::endl; std::ofstream file; file.open(output_path.c_str()); file.precision(17); file << "# lon, lat, height_above_datum, mean_residual, num_observations\n"; file << "# " << datum << std::endl; int num_ref_points = reference_vec.size(); // Write all the points to the file for (int ipt = 0; ipt < num_ref_points; ipt++) { // Skip if no indices if (ref_indices[ipt].empty()) continue; double res = 0.0, count = 0.0; // Iterate over the indices for (int i = 0; i < (int)ref_indices[ipt].size(); i++) { int ires = ref_indices[ipt][i]; // ires + 1 must be less than residuals.size() if (ires + 1 >= (int)residuals.size()) vw_throw(ArgumentErr() << "Invalid residual index.\n"); // There are two residuals per point, as this is a pixel residual. Each // residual must be divided by its weight which was added when the // residual was created. double norm = norm_2(Vector2(residuals[ires + 0] / weight_per_residual[ires + 0], residuals[ires + 1] / weight_per_residual[ires + 1])); res += norm; count += 1.0; } // Skip if no residuals if (count == 0.0) continue; // Average the residuals res /= count; // Save lon, lat, height, mean residual, count Vector3 llh = datum.cartesian_to_geodetic(reference_vec[ipt]); file << llh[0] << ", " << llh[1] <<", " << llh[2] << ", " << res << ", " << count << "\n"; } file.close(); return; } // End function writeRefTerrainResiduals() // Save the pixel reprojection error and anchor point residuals for the jitter solver. // Here we count on the fact that they are at the beginning of the residuals vector, // and we go through them in the same order as they were added. void saveJitterResiduals(ceres::Problem & problem, std::string const& residual_prefix, asp::BaBaseOptions const& opt, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, vw::cartography::Datum const& datum, std::vector const& tri_points_vec, std::set const& outliers, std::vector const& weight_per_residual, std::vector> const& pixel_vec, std::vector> const& weight_vec, std::vector> const& isAnchor_vec, std::vector> const& pix2xyz_index, std::vector const& reference_vec, std::vector> const& ref_indices, // Output std::vector & mean_pixel_residuals) { // Compute the residuals at the current solution std::vector residuals; compute_residuals(opt, problem, residuals); if (residuals.size() != weight_per_residual.size()) vw_throw(ArgumentErr() << "There must be as many residuals as weights for them.\n"); // Find the mean of all residuals corresponding to the same xyz point int num_tri_points = cnet.size(); std::vector mean_pixel_residual_norm(num_tri_points, 0.0); std::vector pixel_residual_count(num_tri_points, 0); std::vector xyz_residual_norm; // This is unfinished logic int ires = 0; int num_cams = crn.size(); std::vector> residuals_per_cam(num_cams); for (int icam = 0; icam < crn.size(); icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; if (outliers.find(ipt) != outliers.end()) continue; // Skip outliers // Norm of pixel residual double norm = norm_2(Vector2(residuals[ires + 0] / weight_per_residual[ires + 0], residuals[ires + 1] / weight_per_residual[ires + 1])); mean_pixel_residual_norm[ipt] += norm; pixel_residual_count[ipt]++; // Record the residual for the camera residuals_per_cam[icam].push_back(norm); ires += PIXEL_SIZE; // Update for the next iteration } } // Average all pixel residuals for a given xyz for (int ipt = 0; ipt < num_tri_points; ipt++) { if (outliers.find(ipt) != outliers.end() || pixel_residual_count[ipt] <= 0) continue; // Skip outliers mean_pixel_residual_norm[ipt] /= pixel_residual_count[ipt]; } // Find the mean and median residual for each camera. This a very important // metric. std::string residual_path = residual_prefix + "_stats.txt"; vw::vw_out() << "Writing: " << residual_path << std::endl; std::ofstream residual_file(residual_path.c_str()); residual_file.precision(17); residual_file << "# Pixel reprojection error per camera\n"; residual_file << "# Image, mean, median, count\n"; for (int icam = 0; icam < num_cams; icam++) { std::string name = opt.image_files[icam]; double nan = std::numeric_limits::quiet_NaN(); double mean = nan, median = nan, count = nan; if (!residuals_per_cam[icam].empty()) { mean = vw::math::mean(residuals_per_cam[icam]); median = vw::math::destructive_median(residuals_per_cam[icam]); count = residuals_per_cam[icam].size(); } residual_file << name << ", " << mean << ", " << median << ", " << count << "\n"; } residual_file.close(); // Save the residuals per xyz point write_per_xyz_pixel_residuals(cnet, residual_prefix, datum, outliers, tri_points_vec, mean_pixel_residual_norm, pixel_residual_count); // Add residuals for anchor points. That is pass 1 from // addReprojCamErrs(). We imitate here the same logic for that // pass. We continue to increment the ires counter from above. std::vector anchor_xyz; std::vector anchor_residual_norm; for (int pass = 1; pass < 2; pass++) { for (int icam = 0; icam < (int)crn.size(); icam++) { for (size_t ipix = 0; ipix < pixel_vec[icam].size(); ipix++) { Vector2 observation = pixel_vec[icam][ipix]; double weight = weight_vec[icam][ipix]; bool isAnchor = isAnchor_vec[icam][ipix]; // Pass 0 is without anchor points, while pass 1 uses them. // Here we only do pass 1. if ((int)isAnchor != pass) continue; // Norm of pixel residual double norm = norm_2(Vector2(residuals[ires + 0] / weight_per_residual[ires + 0], residuals[ires + 1] / weight_per_residual[ires + 1])); norm /= weight; // Undo the weight, to recover the pixel norm ires += PIXEL_SIZE; // Update for the next iteration double const* tri_point = &tri_points_vec[3 * pix2xyz_index[icam][ipix]]; Vector3 xyz(tri_point[0], tri_point[1], tri_point[2]); anchor_xyz.push_back(xyz); anchor_residual_norm.push_back(norm); } } } write_anchor_residuals(residual_prefix, datum, anchor_xyz, anchor_residual_norm); // Ensure we did not process more residuals than what we have. // Likely there are more residuals than what we handled now. if (ires > (int)residuals.size()) vw_throw(ArgumentErr() << "More residuals found than expected.\n"); if (opt.reference_terrain != "") writeRefTerrainResiduals(residual_prefix, datum, residuals, weight_per_residual, reference_vec, ref_indices); // Return the mean pixel residual per tri point mean_pixel_residuals = mean_pixel_residual_norm; } } // end namespace asp ================================================ FILE: src/asp/Camera/BundleAdjustResiduals.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustResiduals.h /// // Logic for computing residuals for bundle adjustment. #ifndef __BUNDLE_ADJUST_RESIDUALS_H__ #define __BUNDLE_ADJUST_RESIDUALS_H__ #include #include #include #include #include #include namespace asp { // Compute the bundle_adjust residuals void compute_residuals(asp::BaBaseOptions const& opt, asp::CRN const& crn, asp::BaParams const& param_storage, std::vector const& cam_residual_counts, std::vector> const& pixel_sigmas, size_t num_gcp_or_dem_residuals, size_t num_uncertainty_residuals, size_t num_tri_residuals, size_t num_cam_position_residuals, std::vector const& reference_vec, ceres::Problem & problem, // Output std::vector & residuals); /// Compute residual map by averaging all the reprojection error at a given point void compute_mean_residuals_at_xyz(asp::CRN const& crn, std::vector const& residuals, asp::BaParams const& param_storage, // outputs std::vector & mean_residuals, std::vector & num_point_observations); /// Write out a .csv file recording the residual error at each location on the ground void write_residual_map(std::string const& output_prefix, // Mean residual of each point std::vector const& mean_residuals, // Num non-outlier pixels per point std::vector const& num_point_observations, asp::BaParams const& param_storage, vw::ba::ControlNetwork const& cnet, asp::BaBaseOptions const& opt); /// Write log files describing all residual errors. The order of data stored /// in residuals must mirror perfectly the way residuals were created. void write_residual_logs(std::string const& residual_prefix, asp::BaBaseOptions const& opt, asp::BaParams const& param_storage, std::vector const& cam_residual_counts, std::vector> const& pixel_sigmas, size_t num_gcp_or_dem_residuals, size_t num_uncertainty_residuals, size_t num_tri_residuals, size_t num_cam_position_residuals, std::vector const& reference_vec, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, ceres::Problem &problem); // Find and save the offsets between initial and final triangulated points void saveTriOffsetsPerCamera(std::vector const& image_files, asp::BaParams const& orig_params, asp::BaParams const& param_storage, asp::CRN const& crn, std::string const& tri_offsets_file); // Analogous version to the above, but keep the original and current triangulated points // in std, for use in jitter_solve. void saveTriOffsetsPerCamera(std::vector const& image_files, std::set const& outliers, std::vector const& orig_tri_points_vec, std::vector const& tri_points_vec, asp::CRN const& crn, std::string const& tri_offsets_file); // Write the offsets between initial and final triangulated points void writeTriOffsetsPerCamera(int num_cams, std::vector const& image_files, std::vector> & tri_offsets, std::string const& tri_offsets_file); // Compute the horizontal and vertical change in camera positions void saveCameraOffsets(vw::cartography::Datum const& datum, std::vector const& image_files, std::vector const& orig_cam_positions, std::vector const& opt_cam_positions, std::string const& camera_offset_file); // Compute the horizontal and vertical change in camera positions. If more than // one camera position, such as for linescan, find the biggest. void saveCameraOffsets(vw::cartography::Datum const& datum, std::vector const& image_files, std::vector> const& orig_cam_positions, std::vector> const& opt_cam_positions, std::string const& camera_offset_file); // This is used in jitter_solve void saveJitterResiduals(ceres::Problem & problem, std::string const& residual_prefix, asp::BaBaseOptions const& opt, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, vw::cartography::Datum const& datum, std::vector const& tri_points_vec, std::set const& outliers, std::vector const& weight_per_residual, std::vector> const& pixel_vec, std::vector> const& weight_vec, std::vector> const& isAnchor_vec, std::vector> const& pix2xyz_index, std::vector const& reference_vec, std::vector> const& ref_indices, // Output std::vector & mean_pixel_residuals); // This is used in jitter_solve void compute_residuals(asp::BaBaseOptions const& opt, ceres::Problem & problem, // Output std::vector & residuals); } // end namespace asp #endif // __BUNDLE_ADJUST_RESIDUALS_H__ ================================================ FILE: src/asp/Camera/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspCamera "${ASP_CAMERA_SRC_FILES}" "${ASP_CAMERA_TEST_FILES}" "${ASP_CAMERA_LIB_DEPENDENCIES}") # This is needed for CsmModelFit.cc. Not sure where a better place for it is. target_link_libraries(AspCamera ${SOLVER_LIBRARIES}) ================================================ FILE: src/asp/Camera/CameraErrorPropagation.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraErrorPropagation.cc /// #include #include #include namespace asp { // Read the horizontal error from some camera models double horizontalStDevFromCamera(boost::shared_ptr camera_model, bool & message_printed) { // Try to create horizontal stddev based on the RPC camera file const asp::RPCModel *rpc = dynamic_cast(vw::camera::unadjusted_model(camera_model.get())); if (rpc != NULL) { if (!message_printed) { vw::vw_out() << "Input horizontal stddev values needed for error propagation " << "were not specified. Will create them based on the ERRBIAS " << "and ERRRAND fields from the RPC cameras.\n"; message_printed = true; } double bias = rpc->m_err_bias, rand = rpc->m_err_rand; if (bias > 0 && rand > 0) { return sqrt(bias * bias + rand * rand); } else { vw::vw_throw(vw::ArgumentErr() << "Cannot propagate errors, as no input horizontal " << "stddev values were specified, and some RPC camera models lack " << "the necessary ERRBIAS and ERRRAND fields that could be used " << "instead.\n"); } } // Try to create horizontal stddev based on the Pleiades camera files const asp::PleiadesCameraModel *pleiades = dynamic_cast (vw::camera::unadjusted_model(camera_model.get())); if (pleiades != NULL) { double accuracy = pleiades->m_accuracy_stdv; if (!message_printed) { vw::vw_out() << "Input horizontal stddev values needed for error propagation " << "were not specified. Will create them based on the ACCURACY_STDV " << "field from the Pleiades cameras.\n"; message_printed = true; } if (accuracy > 0) { return accuracy; } else { vw::vw_throw(vw::ArgumentErr() << "Cannot propagate errors, as no input horizontal " << "stddev values were specified, and some Pleiades camera " << "models lack the necessary ACCURACY_STDV field that could " << "be used instead.\n"); } } return 0; } // Some sanity checks and printing of horizontal stddevs void horizontalStdDevCheck(vw::Vector const& stddevs, std::string const& session) { bool isDg = (session == "dg" || session == "dgmaprpc"); // See how many stddevs are positive. Throw an error if some are negative. int numTotal = stddevs.size(); int numPositive = 0; for (int i = 0; i < (int)stddevs.size(); i++) { if (stddevs[i] < 0) vw::vw_throw(vw::ArgumentErr() << "Cannot have negative horizontal stddev.\n"); if (stddevs[i] > 0) numPositive++; } if (numPositive > 0 && numPositive < numTotal) vw::vw_throw(vw::ArgumentErr() << "Cannot have some positive and some zero " "horizontal sttdev.\n"); bool allPositive = (numPositive == numTotal); if (allPositive) { vw::vw_out() << "Horizontal stddev for the cameras: " << stddevs << " (meters).\n"; if (isDg) vw::vw_out() << "Will use these to find the point cloud stddev, rather than " << "satellite position and orientation covariances.\n"; } else { // For DG we will use satellite position and orientation covariances if no luck if (!isDg) vw::vw_throw(vw::ArgumentErr() << "Cannot propagate errors, as no input horizontal " << "stddev values were specified.\n"); } } } // end namespace asp ================================================ FILE: src/asp/Camera/CameraErrorPropagation.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraErrorPropagation.h #ifndef __CAMERA_CAMERAERRORPROPAGATION_H__ #define __CAMERA_CAMERAERRORPROPAGATION_H__ #include namespace asp { // Read the horizontal error from some camera models double horizontalStDevFromCamera(boost::shared_ptr camera_model, bool & message_printed); // Some sanity checks and printing of horizontal stddevs void horizontalStdDevCheck(vw::Vector const& stddevs, std::string const& session); } // end namespace asp #endif // __CAMERA_CAMERAERRORPROPAGATION_H__ ================================================ FILE: src/asp/Camera/CameraResectioning.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraResectioning.cc #include #include #include #include #include using namespace vw; using namespace vw::camera; namespace asp { void RodriguesToRotation(Eigen::Vector3d const& vector, Eigen::Matrix3d & rotation) { double angle = vector.norm(); Eigen::AngleAxisd aa(angle, vector / angle); rotation = aa.matrix(); } /// Use OpenCV to find a Pinhole camera's position and orientation /// based on image pixels and corresponding ground positions void findCameraPose(std::vector const& ground_points, std::vector const& pixel_observations, vw::camera::PinholeModel & cam) { if (ground_points.size() != pixel_observations.size()) vw::vw_throw(vw::ArgumentErr() << "There must be as many ground points as pixel observations.\n"); if (ground_points.size() < 4) vw::vw_throw(vw::ArgumentErr() << "Must have at least four points per camera to be able to " << "find a camera's orientation.\n"); Vector2 focal_length = cam.focal_length(); double pixel_pitch = cam.pixel_pitch(); Vector2 optical_offset = cam.point_offset(); // Intrinsics cv::Mat intrinsics(3, 3, cv::DataType::type, 0.0); intrinsics.at(0, 0) = focal_length[0] / pixel_pitch; intrinsics.at(1, 1) = focal_length[1] / pixel_pitch; intrinsics.at(0, 2) = optical_offset[0] / pixel_pitch; intrinsics.at(1, 2) = optical_offset[1] / pixel_pitch; intrinsics.at(2, 2) = 1.0; // Assume no distortion, as that one is hard to communicate. // This should give a good enough initial camera. Later it will be // refined with bundle adjustment taking into account the distortion. cv::Mat distortion(4, 1, cv::DataType::type, cv::Scalar(0)); // Convert to OpenCV format vw::BBox2 img_box; std::vector cv_pixel_observations; std::vector cv_ground_points; for (size_t it = 0; it < ground_points.size(); it++) { auto & V = ground_points[it]; auto & P = pixel_observations[it]; img_box.grow(P); cv_ground_points.push_back(cv::Point3d(V[0], V[1], V[2])); cv_pixel_observations.push_back(cv::Point2d(P[0], P[1])); } // Call PnP. Because of un-modeled distortion and inaccuracy of picking GCP, // relax the tolerance. But still want to throw out worst outliers, for example, // if the inputs are produced with interest-point matching, which can have a // lot of outliers. bool useExtrinsicGuess = false; int iterationsCount = 1000; // This algorithm is cheap, let it try hard double len = std::max(img_box.width(), img_box.height()); float reprojectionError = std::max(20.0, 0.10 * len); double confidence = 0.75; cv::Mat rvec(3, 1, cv::DataType::type, cv::Scalar(0)); // Rodrigues rotation cv::Mat tvec(3, 1, cv::DataType::type, cv::Scalar(0)); // translation bool result = cv::solvePnPRansac(cv_ground_points, cv_pixel_observations, intrinsics, distortion, rvec, tvec, // outputs useExtrinsicGuess, iterationsCount, reprojectionError, confidence); if (!result) vw::vw_throw(vw::ArgumentErr() << "Failed to find the camera pose using pixel and ground data. " << "The provided inputs may be inaccurate.\n"); // Convert obtained rotation Eigen::Matrix3d rotation; RodriguesToRotation(Eigen::Vector3d(rvec.at(0), rvec.at(1), rvec.at(2)), rotation); // Make world2cam into cam2world Eigen::Matrix3d cam2world = rotation.inverse(); Eigen::Vector3d cam_ctr = -rotation.inverse() * Eigen::Vector3d(tvec.at(0), tvec.at(1), tvec.at(2)); // Convert Eigen matrix and vector to VW vw::Matrix3x3 rot; for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { rot(row, col) = cam2world(row, col); } } vw::Vector3 ctr; for (int row = 0; row < 3; row++) ctr[row] = cam_ctr[row]; // Apply the transform to the camera cam.set_camera_pose(rot); cam.set_camera_center(ctr); return; } } // end namespace asp ================================================ FILE: src/asp/Camera/CameraResectioning.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraResectioning.h /// #ifndef __ASP_CAMERA_CAMERA_RESECTIONING_H__ #define __ASP_CAMERA_CAMERA_RESECTIONING_H__ #include #include namespace asp { /// Use OpenCV to find a Pinhole camera's position and orientation /// based on image pixels and corresponding ground positions void findCameraPose(std::vector const& ground_points, std::vector const& pixel_observations, vw::camera::PinholeModel & cam); } #endif // __ASP_CAMERA_CAMERA_RESECTIONING_H__ ================================================ FILE: src/asp/Camera/Covariance.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Logic for propagation of errors (covariance) through stereo triangulation #include #include #include #include #include #include using namespace vw::camera; namespace asp { // Change in satellite position (measured in meters) and satellite orientation // measured in normalized quaternions, to be used for numerical differencing. // One has to be mindful of the fact that the positions are on the order of // 7.0e6 meters given the distance from satellite to Earth center in ECEF, // so the position delta should not be too tiny. const double deltaPosition = 0.01; // measured in meters const double deltaQuat = 1.0e-6; // given that quaternions are normalized // Given 0 <= num < 15, return a perturbation in satellite position. The // starting one is the zero perturbation, then perturb first // coordinate in the positive and then negative direction, then same // for second and third coordinate. The rest of the perturbations are // 0 as those indices are used to perturb the quaternions. // So, return (0, 0, 0), (deltaPosition, 0, 0), (-deltaPosition, 0, 0) // (0, deltaPosition, 0), (0, -deltaPosition, 0), and so on. vw::Vector positionDelta(int num) { vw::Vector ans; // this is 0 if (num == 0) return ans; // nominal position value, no perturbation if (num > 6) return ans; // nominal position value, will perturb the quaternion then double sign = 1.0; // sign of the perturbation: 1, -1, 1, -1, etc. if (num % 2 == 0) sign = -1.0; int index = (num - 1)/2; // get 0, 1, or 2 ans[index] = sign * deltaPosition; return ans; } // Similar logic as above for the quaternion, for indices 7, ..., 14 (8 of them) vw::Vector quatDelta(int num) { vw::Vector ans; // this is 0 if (num <= 6) return ans; // nominal quat value, will perturb the positions then num = num - 6; // now num = 1, 2, ... 8 if (num > 8) vw::vw_throw(vw::ArgumentErr() << "Out of bounds in quatDelta().\n"); double sign = 1.0; // sign of the perturbation: 1, -1, 1, -1, etc. if (num % 2 == 0) sign = -1.0; int index = (num - 1)/2; // get 0, 1, 2, or 3 ans[index] = sign * deltaQuat; return ans; } // Number of nominal and perturbed cameras when the covariance is computed with DG cameras. int numCamsForCovariance() { // One nominal camera. Then one positive and negative perturbation // for each position (3) and quaternion (4). return 15; } // Given two DG cameras and a pixel in each camera image, consider the // following transform. Go from the perturbed joint vector of // satellite positions and quaternions for this pixel pair to the // perturbed triangulated point. Then, the vector from nominal to // perturbed triangulation point is converted to North-East-Down // relative to the nominal point. Use numerical differentiation to // find the Jacobian of this transform with centered // differences. This will be used to find the covariances of the // triangulated point in NED coordinates given the input satellite // covariances. This works only for Maxar (DigitalGlobe) // cameras. This function may throw exceptions. Do not divide the // numerical derivatives by deltaPosition and deltaQuat, but only by // 2.0 (since these are centered differences). That because the // division makes the partial derivatives in quaternions huge and is // not good for numerical stability. We will compensate for this // when we multiply by the actual covariances, which are huge, so // those will be pre-multiplied by the squares of deltaPosition and // deltaQuat, with the same final result. void scaledDGTriangulationJacobian(vw::cartography::Datum const& datum, vw::camera::CameraModel const* cam1, vw::camera::CameraModel const* cam2, vw::Vector2 const& pix1, vw::Vector2 const& pix2, vw::Matrix & J) { // Handle adjusted cameras bool adjusted_cameras = false; const AdjustedCameraModel *adj_cam1 = dynamic_cast(cam1); const AdjustedCameraModel *adj_cam2 = dynamic_cast(cam2); if ((adj_cam1 == NULL) != (adj_cam2 == NULL)) vw::vw_throw(vw::ArgumentErr() << "The cameras must be either both " << "adjusted or both unadjusted.\n"); vw::Matrix3x3 cam1_rot, cam2_rot; vw::Vector3 cam1_shift, cam2_shift; if (adj_cam1 != NULL && adj_cam2 != NULL) { adjusted_cameras = true; // transforms from unadjusted to adjusted coordinates vw::Matrix4x4 cam1_adj = adj_cam1->ecef_transform(); vw::Matrix4x4 cam2_adj = adj_cam2->ecef_transform(); cam1_rot = submatrix(cam1_adj, 0, 0, 3, 3); cam2_rot = submatrix(cam2_adj, 0, 0, 3, 3); cam1_shift = vw::Vector3(cam1_adj(0, 3), cam1_adj(1, 3), cam1_adj(2, 3)); cam2_shift = vw::Vector3(cam2_adj(0, 3), cam2_adj(1, 3), cam2_adj(2, 3)); } DGCameraModel const* dg_cam1 = dynamic_cast(unadjusted_model(cam1)); DGCameraModel const* dg_cam2 = dynamic_cast(unadjusted_model(cam2)); if (dg_cam1 == NULL || dg_cam2 == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting DG cameras.\n"); // Numerical differences will be used. Camera models with deltaPosition and deltaQuat // perturbations have already been created in LinescanDGModel.cc using the positionDelta() // and quatDelta() functions from above. if (dg_cam1->m_perturbed_cams.empty() || dg_cam2->m_perturbed_cams.empty()) vw::vw_throw(vw::ArgumentErr() << "The perturbed cameras were not set up.\n"); if (dg_cam1->m_perturbed_cams.size() != dg_cam2->m_perturbed_cams.size()) vw::vw_throw(vw::ArgumentErr() << "The number of perturbations in the two cameras do not agree.\n"); // Find the camera center and direction for first unperturbed // camera, and for the perturbed versions. Same for the second // camera. std::vector cam1_dirs, cam1_ctrs, cam2_dirs, cam2_ctrs; cam1_dirs.push_back(dg_cam1->pixel_to_vector(pix1)); cam1_ctrs.push_back(dg_cam1->camera_center(pix1)); cam2_dirs.push_back(dg_cam2->pixel_to_vector(pix2)); cam2_ctrs.push_back(dg_cam2->camera_center(pix2)); for (size_t it = 0; it < dg_cam1->m_perturbed_cams.size(); it++) { cam1_dirs.push_back(dg_cam1->m_perturbed_cams[it]->pixel_to_vector(pix1)); cam1_ctrs.push_back(dg_cam1->m_perturbed_cams[it]->camera_center(pix1)); cam2_dirs.push_back(dg_cam2->m_perturbed_cams[it]->pixel_to_vector(pix2)); cam2_ctrs.push_back(dg_cam2->m_perturbed_cams[it]->camera_center(pix2)); } // Apply adjustments if (adjusted_cameras) { for (size_t it = 0; it < cam1_dirs.size(); it++) { cam1_dirs[it] = cam1_rot * cam1_dirs[it]; cam2_dirs[it] = cam2_rot * cam2_dirs[it]; cam1_ctrs[it] = cam1_rot * cam1_ctrs[it] + cam1_shift; cam2_ctrs[it] = cam2_rot * cam2_ctrs[it] + cam2_shift; } } // Nominal triangulation point vw::Vector3 tri_nominal, err_nominal; // If triangulation fails, it can return NaN tri_nominal = vw::stereo::triangulate_pair(cam1_dirs[0], cam1_ctrs[0], cam2_dirs[0], cam2_ctrs[0], err_nominal); if (tri_nominal != tri_nominal) // NaN vw::vw_throw(vw::ArgumentErr() << "Could not triangulate.\n"); // The matrix to go from the NED coordinate system to ECEF vw::Vector3 llh = datum.cartesian_to_geodetic(tri_nominal); vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh); vw::Matrix3x3 EcefToNed = inverse(NedToEcef); // There are 14 input variables: 3 positions and 4 quaternions for // cam1, and same for cam2. For each of them must compute a centered // difference. The output has 3 variables. As documented above, // the vector from the nominal to perturbed // triangulated point will be converted to North-East-Down // coordinates at the nominal triangulated point. J.set_size(3, 14); J.set_zero(); for (int coord = 0; coord < 14; coord++) { vw::Vector3 cam1_dir_plus, cam1_ctr_plus, cam2_dir_plus, cam2_ctr_plus; vw::Vector3 cam1_dir_minus, cam1_ctr_minus, cam2_dir_minus, cam2_ctr_minus; if (coord < 7) { // The perturbed cameras store positive and negative // perturbations, in alternating order. See positionDelta() and // quatDelta() for the book-keeping. Note that a perturbation in // the satellite quaternion also affects the camera center, // given how one converts from satellite to camera coordinates // when the DG model is created. // Since at position 0 in cam_dirs we store the nominal (unperturbed) // values, add 1 below. cam1_dir_plus = cam1_dirs[2*coord + 1]; cam1_ctr_plus = cam1_ctrs[2*coord + 1]; cam1_dir_minus = cam1_dirs[2*coord + 2]; cam1_ctr_minus = cam1_ctrs[2*coord + 2]; } else { // When variables affecting second camera change, the first one stays at nominal value. cam1_dir_plus = cam1_dirs[0]; cam1_ctr_plus = cam1_ctrs[0]; cam1_dir_minus = cam1_dirs[0]; cam1_ctr_minus = cam1_ctrs[0]; } // For the second camera, the book-keeping is reversed if (coord < 7) { // Second camera values do not change when first camera inputs change cam2_dir_plus = cam2_dirs[0]; cam2_ctr_plus = cam2_ctrs[0]; cam2_dir_minus = cam2_dirs[0]; cam2_ctr_minus = cam2_ctrs[0]; } else { int coord2 = coord - 7; // has values 0, 1, ..., 6 cam2_dir_plus = cam2_dirs[2*coord2 + 1]; cam2_ctr_plus = cam2_ctrs[2*coord2 + 1]; cam2_dir_minus = cam2_dirs[2*coord2 + 2]; cam2_ctr_minus = cam2_ctrs[2*coord2 + 2]; } vw::Vector3 tri_plus, err_plus, tri_minus, err_minus; tri_plus = vw::stereo::triangulate_pair(cam1_dir_plus, cam1_ctr_plus, cam2_dir_plus, cam2_ctr_plus, err_plus); tri_minus = vw::stereo::triangulate_pair(cam1_dir_minus, cam1_ctr_minus, cam2_dir_minus, cam2_ctr_minus, err_minus); // Find the triangulated points in the local NED (horizontal-vertical) // coordinate system. vw::Vector3 ned_plus = EcefToNed * (tri_plus - tri_nominal); vw::Vector3 ned_minus = EcefToNed * (tri_minus - tri_nominal); // Find the numerical partial derivative, but do not divide by the // spacing (deltaPosition or deltaQuat) as that makes the numbers // huge. We will compensate for when use use this Jacobian to // propagate the satellite position and quaternion covariances // (matrix SC), by the formula J * SC * J^T. Then, we will divide SC // by these squared delta quantities, which is the right thing to // do, because the values in SC are tiny, and, in fact, on the // order of the squares of the delta values. vw::Vector3 ned_diff = (ned_plus - ned_minus)/2.0; for (int row = 0; row < 3; row++) J(row, coord) = ned_diff[row]; } return; } // Given upper-right values in a symmetric matrix of given size, find // the lower-left values by reflection, and insert them as a block // starting at the desired row and column. Used to populate the joint // covariance matrix. Per DigitalGlobe's doc, the covariances are // stored as c11, c12, c13, ..., c22, c23, ... void insertBlock(int start, int size, double* inputVals, vw::Matrix & C) { int count = 0; for (int row = 0; row < size; row++) { for (int col = row; col < size; col++) { C(start + row, start + col) = inputVals[count]; C(start + col, start + row) = inputVals[count]; count++; } } } // Based on tabulated satellite position and quaternion covariance // for each DG camera, find the interpolated covariances for cam1 at // pix1 (6 for position, 10 for orientation, as just the upper-right // corner is used), same for cam2 at pix2, autocomplete these to the // full matrices (3x3 and 4x4 for each), create a combined matrix of // covariances (14 x 14), and divide the entries by squares of // deltaPosition and deltaQuat which normalizes them, and which are // compensated by not dividing by these numbers (without the square) // what is found in scaledDGTriangulationJacobian(). Later we will do // J * C * J^T. The same order of variables as in // scaledDGTriangulationJacobian must be used. void scaledDGSatelliteCovariance(vw::camera::CameraModel const* cam1, vw::camera::CameraModel const* cam2, vw::Vector2 const& pix1, vw::Vector2 const& pix2, vw::Matrix & C) { // Initialize the output // 3 positions for cam 1, 4 orientations for cam1, 3 positions for cam2, 4 orientations // for cam2. So, four blocks in total. The resulting matrix must be symmetric. C.set_size(14, 14); C.set_zero(); // Here it is not important that the camera are adjusted or not, as all that is needed // are the input covariances. DGCameraModel const* dg_cam1 = dynamic_cast(unadjusted_model(cam1)); DGCameraModel const* dg_cam2 = dynamic_cast(unadjusted_model(cam2)); if (dg_cam1 == NULL || dg_cam2 == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting DG cameras.\n"); // Find the covariances at given pixel by interpolation in the input table. // Use nearest neighbor interpolation as covariances are known with // just a few digits of precision and are not meant to be smooth. double p_cov1[SAT_POS_COV_SIZE], p_cov2[SAT_POS_COV_SIZE]; double q_cov1[SAT_QUAT_COV_SIZE], q_cov2[SAT_QUAT_COV_SIZE]; dg_cam1->interpSatellitePosCov(pix1, p_cov1); dg_cam1->interpSatelliteQuatCov(pix1, q_cov1); dg_cam2->interpSatellitePosCov(pix2, p_cov2); dg_cam2->interpSatelliteQuatCov(pix2, q_cov2); // This is useful for seeing which input covariance has a bigger effect. // The default value of these factors is 1. double pf = asp::stereo_settings().position_covariance_factor; double qf = asp::stereo_settings().orientation_covariance_factor; // Scale these per scaledDGTriangulationJacobian(). for (int ip = 0; ip < SAT_POS_COV_SIZE; ip++) { p_cov1[ip] = pf * p_cov1[ip] / (deltaPosition * deltaPosition); p_cov2[ip] = pf * p_cov2[ip] / (deltaPosition * deltaPosition); } for (int iq = 0; iq < SAT_QUAT_COV_SIZE; iq++) { q_cov1[iq] = qf * q_cov1[iq] / (deltaQuat * deltaQuat); q_cov2[iq] = qf * q_cov2[iq] / (deltaQuat * deltaQuat); } // Put these in the covariance matrix insertBlock(0, 3, p_cov1, C); insertBlock(3, 4, q_cov1, C); insertBlock(7, 3, p_cov2, C); insertBlock(10, 4, q_cov2, C); #if 0 std::cout << "Produced matrix " << std::endl; for (int row = 0; row < 14; row++) { for (int col = 0; col < 14; col++) { std::cout << C(row, col) << " "; } std::cout << std::endl; } // Debug code. This shows that some quaternion covariances have a // negative determinant. That is because an eigenvalue is very close // to 0 or even negative (but small). This singularity goes away // after the covariances are propagated. std::cout << "determinant1 " << det(submatrix(C, 0, 0, 3, 3)) << std::endl; std::cout << "determinant2 " << det(submatrix(C, 3, 3, 4, 4)) << std::endl; std::cout << "determinant3 " << det(submatrix(C, 7, 7, 3, 3)) << std::endl; std::cout << "determinant4 " << det(submatrix(C, 10, 10, 4, 4)) << std::endl; #endif return; } // Given a North-East-Down coordinate system at a point on a planet surface, // left camera center, the x and y coordinates of where the ray from that // center intersects the plane z = 0, and the same for the right camera, // all in NED coordinates, find where the rays intersect, also in NED. vw::Vector3 nedTri(vw::Vector3 const& cam1_ctr, vw::Vector3 const& cam2_ctr, double x1, double y1, double x2, double y2) { // Find the normalized direction from camera to ground vw::Vector3 ground_pt1(x1, y1, 0.0); vw::Vector3 cam1_dir = ground_pt1 - cam1_ctr; cam1_dir /= norm_2(cam1_dir); vw::Vector3 ground_pt2(x2, y2, 0.0); vw::Vector3 cam2_dir = ground_pt2 - cam2_ctr; cam2_dir /= norm_2(cam2_dir); vw::Vector3 tri, err; tri = vw::stereo::triangulate_pair(cam1_dir, cam1_ctr, cam2_dir, cam2_ctr, err); return tri; } // Given a triangulated point in ECEF, create the local // North-East-Down (NED) coordinate system centered at that // point. Find the Jacobian of the nedTri() function, which will // propagate uncertainties from the North-East horizontal plane // through triangulation, with the result also being in NED. // Bundle-adjusted cameras need no special treatment. void triangulationJacobian(vw::cartography::Datum const& datum, vw::Vector3 const& tri_nominal, vw::camera::CameraModel const* cam1, vw::camera::CameraModel const* cam2, vw::Vector2 const& pix1, vw::Vector2 const& pix2, vw::Matrix & J) { // The matrix to go from the NED coordinate system to ECEF at the // nominal triangulation point vw::Vector3 llh = datum.cartesian_to_geodetic(tri_nominal); vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(llh); vw::Matrix3x3 EcefToNed = inverse(NedToEcef); // Camera centers and directions in ECEF vw::Vector3 cam1_ctr = cam1->camera_center(pix1), cam1_dir = cam1->pixel_to_vector(pix1); vw::Vector3 cam2_ctr = cam2->camera_center(pix2), cam2_dir = cam2->pixel_to_vector(pix2); // Convert to NED vw::Vector3 cam1_ctr_ned = EcefToNed * (cam1_ctr - tri_nominal); vw::Vector3 cam1_dir_ned = EcefToNed * cam1_dir; vw::Vector3 cam2_ctr_ned = EcefToNed * (cam2_ctr - tri_nominal); vw::Vector3 cam2_dir_ned = EcefToNed * cam2_dir; // See where the rays intersect the local horizontal plane Find // alpha1 so that cam1_ctr_ned + alpha1 * cam1_dir_ned has 3rd // coordinate equal to zero double alpha1 = -cam1_ctr_ned.z() / cam1_dir_ned.z(); double x1 = cam1_ctr_ned.x() + alpha1 * cam1_dir_ned.x(); double y1 = cam1_ctr_ned.y() + alpha1 * cam1_dir_ned.y(); double alpha2 = -cam2_ctr_ned.z() / cam2_dir_ned.z(); double x2 = cam2_ctr_ned.x() + alpha2 * cam2_dir_ned.x(); double y2 = cam2_ctr_ned.y() + alpha2 * cam2_dir_ned.y(); // There are 4 input variables: x and y position in the horizontal // plane for the first camera, then for the second one. For each of // them must compute a centered difference. The output has 3 // variables, the NED triangulation point. J.set_size(3, 4); J.set_zero(); for (int coord = 0; coord < 4; coord++) { // Perturb one variable at a time double x1_plus = x1, x1_minus = x1, x2_plus = x2, x2_minus = x2; double y1_plus = y1, y1_minus = y1, y2_plus = y2, y2_minus = y2; if (coord == 0) { x1_minus += -deltaPosition; x1_plus += deltaPosition; } else if (coord == 1) { y1_minus += -deltaPosition; y1_plus += deltaPosition; } else if (coord == 2) { x2_minus += -deltaPosition; x2_plus += deltaPosition; } else if (coord == 3) { y2_minus += -deltaPosition; y2_plus += deltaPosition; } vw::Vector3 xyz_plus = nedTri(cam1_ctr_ned, cam2_ctr_ned, x1_plus, y1_plus, x2_plus, y2_plus); vw::Vector3 xyz_minus = nedTri(cam1_ctr_ned, cam2_ctr_ned, x1_minus, y1_minus, x2_minus, y2_minus); // Centered difference vw::Vector3 partial_deriv = (xyz_plus - xyz_minus) / (2.0 * deltaPosition); for (int row = 0; row < 3; row++) J(row, coord) = partial_deriv[row]; } return; } // Propagate the covariances. Return propagated stddev. See the .h file for more info. vw::Vector2 propagateCovariance(vw::Vector3 const& tri_nominal, vw::cartography::Datum const& datum, double stddev1, double stddev2, vw::camera::CameraModel const* cam1, vw::camera::CameraModel const* cam2, vw::Vector2 const& pix1, vw::Vector2 const& pix2) { // Return right away if triangulation was not successful. The caller will set the result // to (0, 0, 0). if (tri_nominal == vw::Vector3(0, 0, 0) || tri_nominal != tri_nominal) vw::vw_throw(vw::ArgumentErr() << "Could not compute the covariance.\n"); vw::Matrix J, C; // variance is square of stddev vw::Vector2 variance; variance[0] = stddev1 * stddev1; variance[1] = stddev2 * stddev2; if (variance[0] > 0 && variance[1] > 0) { // The user set horizontal stddev triangulationJacobian(datum, tri_nominal, cam1, cam2, pix1, pix2, J); C = vw::math::identity_matrix(4); // The first two covariances are the left camera horizontal square stddev, // and last two are for the right camera. C(0, 0) = variance[0]; C(1, 1) = variance[0]; C(2, 2) = variance[1]; C(3, 3) = variance[1]; } else { // Will arrive here only for DG cameras and if the user did not // set --horizontal-stddev. The Jacobian of the transform from // ephemeris and attitude to the triangulated point in NED // coordinates, multiplied by a scale factor. asp::scaledDGTriangulationJacobian(datum, cam1, cam2, pix1, pix2, J); // The input covariance, divided by the square of the above scale factor. asp::scaledDGSatelliteCovariance(cam1, cam2, pix1, pix2, C); } // Propagate the covariance // Per: https://en.wikipedia.org/wiki/Propagation_of_uncertainty#Non-linear_combinations vw::Matrix JT = transpose(J); vw::Matrix P = J * C * JT; #if 0 // Useful debug code std::cout << "NED covariance " << P << std::endl; vw::Vector> e; vw::math::eigen(P, e); std::cout << "Eigenvalues: " << e << std::endl; #endif // Horizontal component is the square root of the determinant of the // upper-left 2x2 block (horizontal plane component), which is the // same as the square root of the product of eigenvalues of this // matrix. Intuitively, the area of an ellipse is the product of // semi-axes, which is the product of eigenvalues. Then, a circle // with radius which is the square root of the product of semi-axes // has the same area. vw::Matrix2x2 H = submatrix(P, 0, 0, 2, 2); vw::Vector2 ans; ans[0] = sqrt(det(H)); // Vertical component is the z variance ans[1] = P(2, 2); // Check for NaN. Then the caller will return the zero vector, which // signifies that the there is no valid data if (ans != ans) vw::vw_throw(vw::ArgumentErr() << "Could not compute the covariance.\n"); // Take the square root, so return the standard deviation return vw::Vector2(sqrt(ans[0]), sqrt(ans[1])); } } // end namespace asp ================================================ FILE: src/asp/Camera/Covariance.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file Covariance.h // Logic for propagation of errors (covariances) through stereo triangulation #ifndef __ASP_CAMERA_COVARIANCE_H__ #define __ASP_CAMERA_COVARIANCE_H__ #include #include #include namespace vw { namespace cartography { class Datum; } } namespace asp { // Given 0 <= num < 15, return a perturbation in position. The // starting one is the zero perturbation, then perturb first // coordinate in the positive and then negative direction, then same // for second and third coordinate. The rest of the perturbations // are 0 as those indices are used to perturb the quaternions. So, // return (0, 0, 0), (deltaPosition, 0, 0), (-deltaPosition, 0, 0) // (0, deltaPosition, 0), and so on. vw::Vector positionDelta(int num); // Similar logic as above for the quaternion, for indices 7, ..., 14 (8 of them) vw::Vector quatDelta(int num); // Number of nominal and perturbed cameras when the covariance is computed int numCamsForCovariance(); // Propagate horizontal ground plane covariances or DG's satellite // ephemeris and attitude covariances to triangulation in NED // coordinates. Return the square root of horizontal and vertical // components, so the standard deviations. vw::Vector2 propagateCovariance(vw::Vector3 const& tri_nominal, vw::cartography::Datum const& datum, double stddev1, double stddev2, vw::camera::CameraModel const* cam1, vw::camera::CameraModel const* cam2, vw::Vector2 const& pix1, vw::Vector2 const& pix2); } // end namespace asp #endif//__ASP_CAMERA_COVARIANCE_H__ ================================================ FILE: src/asp/Camera/CsmModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include // From the CSM base interface library #include #include #include #include // USGSCSM linescan #include #include #include #include #include #include #include #include #include namespace dll = boost::dll; namespace fs = boost::filesystem; using json = nlohmann::json; using namespace vw; namespace asp { // This was discussed with the USGS folks. To convert from ISIS to ASP // pixels we subtract 1.0. To convert from CSM pixels we have to // subtract only 0.5. const vw::Vector2 ASP_TO_CSM_SHIFT(0.5, 0.5); enum USGSCSM_MODEL_TYPE { USGSCSM_FRAME_MODEL, USGSCSM_LINESCAN_MODEL, USGSCSM_PUSHFRAME_MODEL, USGSCSM_SAR_MODEL }; vw::Mutex csm_init_mutex; // ----------------------------------------------------------------- // Helper functions csm::EcefCoord vectorToEcefCoord(Vector3 v) { csm::EcefCoord c; c.x = v[0]; c.y = v[1]; c.z = v[2]; return c; } csm::ImageCoord vectorToImageCoord(Vector2 v) { csm::ImageCoord c; c.samp = v[0]; c.line = v[1]; return c; } // Auxiliary functions to convert a pixel from ASP conventions to what CSM // expects and vice versa void toCsmPixel(vw::Vector2 const& pix, csm::ImageCoord & csm) { csm.samp = pix[0] + ASP_TO_CSM_SHIFT[0]; csm.line = pix[1] + ASP_TO_CSM_SHIFT[1]; } void fromCsmPixel(vw::Vector2 & pix, csm::ImageCoord const& csm) { pix[0] = csm.samp - ASP_TO_CSM_SHIFT[0]; pix[1] = csm.line - ASP_TO_CSM_SHIFT[1]; } Vector3 ecefCoordToVector(csm::EcefCoord const& c) { Vector3 v; v[0] = c.x; v[1] = c.y; v[2] = c.z; return v; } Vector3 ecefVectorToVector(csm::EcefVector const& c) { Vector3 v; v[0] = c.x; v[1] = c.y; v[2] = c.z; return v; } Vector2 imageCoordToVector(csm::ImageCoord const& c) { Vector2 v; v[0] = c.samp; v[1] = c.line; return v; } // ----------------------------------------------------------------- // Constructor CsmModel::CsmModel():m_semi_major_axis(0.0), m_semi_minor_axis(0.0), m_sun_position(vw::Vector3()), // Do not make the precision lower than 1e-8. CSM can give // junk results when it is too low. m_desired_precision(asp::DEFAULT_CSM_DESIRED_PRECISION), m_maxApproxCamPixErr(-1.0) { } // Call the default constructor to initalize the member variables, then load // from file. CsmModel::CsmModel(std::string const& isd_path): CsmModel() { load_model(isd_path); } // Note: This class copy constructor is shallow. To make a deep copy // use the deep_copy() function. CsmModel::~CsmModel() { // nothing to do. } std::string CsmModel::get_csm_plugin_folder() { // Look up the CSM_PLUGIN_PATH environmental variable. // It is set in the "libexec/libexec-funcs.sh" deploy file. // If the plugin is not found in CSM_PLUGIN_PATH, look at ISISROOT. std::string plugin_path; char * plugin_path_arr = getenv("CSM_PLUGIN_PATH"); char * isis_root = getenv("ISISROOT"); if (isis_root == NULL) vw_throw(vw::ArgumentErr() << "The variable ISISROOT was not set.\n"); if (plugin_path_arr != NULL && std::string(plugin_path_arr) != "") { plugin_path = std::string(plugin_path_arr); } else { // This is for when ASP is installed without the deploy file. // vw_out() << "The environmental variable CSM_PLUGIN_PATH was not set.\n"; fs::path try_path(isis_root); try_path /= "lib"; plugin_path = try_path.string(); //vw_out() << "Looking in " << plugin_path << ".\n"; } if (!fs::exists(plugin_path)) { vw_throw(ArgumentErr() << "Could not find CSM plugin folder: " << plugin_path << ".\n" << "Check the value of the environmental variable CSM_PLUGIN_PATH."); } return plugin_path; } // The original idea here was to look at every library in the plugins // directory and load the valid plugins. For now however there is just // one plugin, usgscsm, and it is stored in 'lib', among thousands // of other inapplicable libraries. Hence just pick that one. One day // we will have a dedicated plugins directory. size_t CsmModel::find_csm_plugins(std::vector &plugins) { plugins.clear(); const std::string folder = get_csm_plugin_folder(); std::string ext; std::vector potential_plugins; std::string platform = std::string(BOOST_PLATFORM); boost::to_lower(platform); if (std::string(platform).find("linux") != std::string::npos) ext = ".so"; else if (std::string(platform).find("mac") != std::string::npos) ext = ".dylib"; else vw_throw(ArgumentErr() << "Unknown operating system: " << BOOST_PLATFORM << "\n"); #if 0 size_t potential_num_dlls = vw::get_files_in_folder(folder, potential_plugins, ext); for (size_t i = 0; i < potential_num_dlls; i++) { if (potential_plugins[i] != "libusgscsm" + ext) { continue; } fs::path p(folder); p /= potential_plugins[i]; plugins.push_back(p.string()); } #endif fs::path p(folder); p /= "libusgscsm" + ext; std::string plugin = p.string(); if (!fs::exists(plugin)) vw_throw(ArgumentErr() << "Cannot find plugin: " < " << (*iter)->getPluginName() << std::endl; size_t num_models = (*iter)->getNumModels(); vw_out() << " - Num models = " << num_models << std::endl; for (size_t i = 0; i < num_models; i++) { vw_out() << " -> " << (*iter)->getModelName(i) << ", family = " << (*iter)->getModelFamily(i) << std::endl; } } } // This function is not kept out of the header file to hide CSM dependencies. /// Look through all of the loaded plugins and find one that is compatible with /// the provided ISD. const csm::Plugin* find_plugin_for_isd(csm::Isd const& support_data, std::string & model_name, std::string & model_family, bool show_warnings) { // Loop through the available plugins. csm::PluginList::iterator iter; csm::PluginList plugins = csm::Plugin::getList(); for (iter = plugins.begin(); iter != plugins.end(); iter++) { const csm::Plugin* csm_plugin = (*iter); // For each plugin, loop through the available models. size_t num_models = csm_plugin->getNumModels(); for (size_t i = 0; i < num_models; i++) { std::string this_model_name = (*iter)->getModelName(i); // Check if we can construct a camera with the ISD and this plugin/model. csm::WarningList warnings; csm::WarningList::const_iterator w_iter; if (csm_plugin->canModelBeConstructedFromISD(support_data, this_model_name, &warnings)) { model_name = this_model_name; model_family = csm_plugin->getModelFamily(i); return csm_plugin; // Found a plugin that will work! } // Optionally print the reasons why we could not load it. if (show_warnings) for (w_iter = warnings.begin(); w_iter != warnings.end(); w_iter++) { vw_out() << "CSM warning: " << w_iter->getMessage() << std::endl; } } // End loop through models } // End loop through plugins // Did not find a match! model_name = ""; model_family = ""; return 0; } // End function find_plugin_for_isd void CsmModel::initialize_plugins() { // Only let one thread at a time in here. vw::Mutex::Lock lock(csm_init_mutex); // If we already have plugins loaded, don't do initialization again. csm::PluginList plugins = csm::Plugin::getList(); if (!plugins.empty()) return; //vw_out() << "Initializing CSM plugins...\n"; // Find all of the available CSM plugin DLL files. std::vector plugin_files; size_t num_plugin_files = find_csm_plugins(plugin_files); //vw_out() << "Found " << num_plugin_files << " CSM plugin files.\n"; // Load all of the plugins. for (size_t i = 0; i < num_plugin_files; i++) { // Get the DLL in memory, causing it to automatically register itself // with the main Plugin interface. vw_out() << "Loading CSM plugin: " << plugin_files[i] << std::endl; boost::dll::shared_library lib_usgs(plugin_files[i]); } //csm::Plugin::setDataDirectory(plugin_folder); // Don't think we need this. print_available_models(); } // Read the semi-major and semi-minor axes void CsmModel::read_ellipsoid_from_isd(std::string const& isd_path) { // Load and parse the json file std::ifstream ifs(isd_path); json json_isd; try { ifs >> json_isd; } catch(...) { vw::vw_throw(vw::ArgumentErr() << "Cannot open file: " << isd_path << "\n"); } // Read the semi-major axis m_semi_major_axis = 0.0; try { m_semi_major_axis = json_isd.at("radii").at("semimajor"); } catch (...) { } // Read the semi-minor axis m_semi_minor_axis = 0.0; try { m_semi_minor_axis = json_isd.at("radii").at("semiminor"); } catch (...) { } // Read the unit std::string unit; try { unit = json_isd.at("radii").at("unit"); } catch (...) { } boost::to_lower(unit); // Convert from km to m if need be if (unit == "km") { m_semi_major_axis *= 1000.0; m_semi_minor_axis *= 1000.0; } else if (unit != "m") { vw::vw_throw(vw::ArgumentErr() << "Unknown unit for the ellipsoid radii in " << isd_path << ". The read value is: " << unit); } // Sanity check if (m_semi_major_axis <= 0.0 || m_semi_minor_axis <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Could not read positive semi-major " << "and semi-minor axies from: " << isd_path << ". The read values are: " << m_semi_major_axis << ' ' << m_semi_minor_axis); } /// Read and cache the sun position. This is an expensive operation. /// TODO(oalexan1): See if one can avoid creating and parsing a string file. /// Maybe by now the Sun position is a public member in each model type. /// This will work for USGSCSM models, but maybe not for others. It is assumed /// here that the sun does not move noticeably in the sky during the brief time /// the picture is taken. /// TODO(oalexan1): This returns a single Sun position per camera. It appears /// that linescan cameras can return a line-dependent Sun position. It is /// not clear if that has any value, given how quickly an image is taken. void readCsmSunPosition(boost::shared_ptr const& gm_model, vw::Vector3 & sun_position) { if (gm_model.get() == NULL) vw::vw_throw(vw::ArgumentErr() << "CsmModel::readCsmSunPosition() failed because " << "the model is not initialized.\n"); std::string modelState = gm_model->getModelState(); nlohmann::json j = stateAsJson(modelState); if (j.find("m_sunPosition") == j.end()) vw::vw_throw(vw::ArgumentErr() << "The Sun position was not found in the CSM model state.\n"); std::vector sun_pos = j["m_sunPosition"].get>(); if (sun_pos.size() < 3) vw::vw_throw(vw::ArgumentErr() << "The Sun position must be a vector of size >= 3.\n"); for (size_t it = 0; it < 3; it++) sun_position[it] = sun_pos[it]; } /// Load the camera model from an ISD file or model state. void CsmModel::load_model(std::string const& isd_path) { std::string line; { // Peek inside the file to see if it is an isd or a model state. // A model state file starts with an easily identifiable string. std::ifstream ifs(isd_path); ifs >> line; } bool is_model_state = (line == UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME || line == UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME || line == UsgsAstroPushFrameSensorModel::_SENSOR_MODEL_NAME || line == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME); if (!is_model_state) CsmModel::load_model_from_isd(isd_path); else CsmModel::loadModelFromStateFile(isd_path); CsmModel::createApproxCam(); } /// Load the model from ISD. Read the ellipsoid, sun position, and /// m_plugin_name. // // See setModelFromStateString() for a different construction method. These must // be kept in sync. void CsmModel::load_model_from_isd(std::string const& isd_path) { // This only happens the first time it is called. initialize_plugins(); // Load ISD data csm::Isd support_data(isd_path); CsmModel::read_ellipsoid_from_isd(isd_path); // Check each available CSM plugin until we find one that can handle the ISD. std::string model_name, model_family; const csm::Plugin* csm_plugin = find_plugin_for_isd(support_data, model_name, model_family, false); // If we did not find a plugin that would work, go through them again and print error // messages for each plugin that fails. if (csm_plugin == 0) { find_plugin_for_isd(support_data, model_name, model_family, true); vw::vw_throw(vw::ArgumentErr() << "Unable to construct a camera model for the ISD file " << isd_path << " using any of the loaded CSM plugins!"); } // Remember the plugin name. It will be needed to add a model state to a cub file. m_plugin_name = csm_plugin->getPluginName(); // This is verbose //vw::vw_out() << "Using plugin: " << this->plugin_name() // << " with model name " << model_name << std::endl; // Now try to construct the camera model csm::WarningList warnings; csm::Model* csm_model = csm_plugin->constructModelFromISD(support_data, model_name, &warnings); // Error checking csm::WarningList::const_iterator w_iter; for (w_iter = warnings.begin(); w_iter != warnings.end(); w_iter++) { vw_out() << "CSM warning: " << w_iter->getMessage() << std::endl; } // Handle load failure if (!csm_model) vw::vw_throw(vw::ArgumentErr() << "Failed to load CSM sensor model from file: " << isd_path); // TODO: Are all sensor models going to be this type (RasterGM)? // Otherwise we can use the result of getModelFamily() to choose the class. // Cast the model we got to the child class with the needed functionality. csm::RasterGM* gm_model = dynamic_cast(csm_model); // Handle load failure if (!gm_model) vw::vw_throw(vw::ArgumentErr() << "Failed to cast CSM sensor model to raster type!"); m_gm_model.reset(gm_model); // The smart pointer will handle memory management // This must happen after gm model is set readCsmSunPosition(m_gm_model, m_sun_position); // This is a bug fix. normalizeLinescanQuaternions(); } /// Load the camera model from a model state written to disk. /// A model state is obtained from an ISD model by pre-processing /// and combining its data in a form ready to be used. void CsmModel::loadModelFromStateFile(std::string const& state_file) { // Read the state as one string std::ifstream ifs(state_file.c_str()); std::string model_state; ifs.seekg(0, std::ios::end); model_state.reserve(ifs.tellg()); ifs.seekg(0, std::ios::beg); model_state.assign((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); ifs.close(); bool recreate_model = true; CsmModel::setModelFromStateString(model_state, recreate_model); } // This should not be used directly. The function setModelFromStateString() // below also reads the semi-axes and the Sun position. template void setModelFromStateStringAux(bool recreate_model, std::string const& model_state, boost::shared_ptr & gm_model) { if (recreate_model) { csm::RasterGM* new_gm_model = NULL; ModelT * specific_model = new ModelT; specific_model->replaceModelState(model_state); new_gm_model = dynamic_cast(specific_model); // Handle load failure if (!new_gm_model) vw::vw_throw(vw::ArgumentErr() << "Failed to cast CSM model to raster type."); // This will wipe any preexisting model. Prior gm_model pointer will become invalid. gm_model.reset(new_gm_model); } else { // Update existing model. This does not destroy gm_model. ModelT * specific_model = static_cast(gm_model.get()); if (specific_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Incorrect model type passed in.\n"); specific_model->replaceModelState(model_state); } return; } // Ensure the linescan model quaternions are always normalized and do not // suddenly flip sign. This is a bug fix. void CsmModel::normalizeLinescanQuaternions() { throw_if_not_init(); UsgsAstroLsSensorModel * ls_model = dynamic_cast(m_gm_model.get()); if (ls_model != NULL) asp::normalizeQuaternions(ls_model); } /// Load the camera model from a model state written to disk. A model state is /// obtained from an ISD model by pre-processing and combining its data in a /// form ready to be used. Use recreate_model = false if desired to just update /// an existing model. /// /// Read the ellipsoid, sun position, and m_plugin_name. /// /// See also load_model_from_isd() for a different construction method. These /// must be kept in sync. void CsmModel::setModelFromStateString(std::string const& model_state, bool recreate_model) { // TODO(oalexan1): Use the usgscsm function // constructModelFromState() after that package pushes a new version // (currently there are compile-time issues with it). // See which model to load, then cast it to RasterGM. This could // have been simpler if the USGSCSM models shared a base class where // all shared functionality would be shared. if (model_state.rfind(UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME, 0) == 0) { setModelFromStateStringAux (recreate_model, model_state, m_gm_model); } else if (model_state.rfind(UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME, 0) == 0) { setModelFromStateStringAux (recreate_model, model_state, m_gm_model); } else if (model_state.rfind(UsgsAstroPushFrameSensorModel::_SENSOR_MODEL_NAME, 0) == 0) { setModelFromStateStringAux (recreate_model, model_state, m_gm_model); } else if (model_state.rfind(UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME, 0) == 0) { setModelFromStateStringAux (recreate_model, model_state, m_gm_model); } else { vw::vw_throw(vw::ArgumentErr() << "Could not create CSM model from state string.\n"); } // Get the plugin name csm::PluginList plugins = csm::Plugin::getList(); if (plugins.size() == 0) vw::vw_throw(vw::ArgumentErr() << "Could not find CSM plugins.\n"); if (plugins.size() > 1) vw::vw_out(vw::WarningMessage) << "Expected to find one CSM plugin, found: " << plugins.size() << ".\n"; for (auto iter = plugins.begin(); iter != plugins.end(); iter++) { const csm::Plugin* csm_plugin = (*iter); m_plugin_name = csm_plugin->getPluginName(); } // Set the semi-axes from json (cannot pull it from the usgs models // as these figure as private in some of them). auto j = stateAsJson(model_state); m_semi_major_axis = j["m_majorAxis"]; m_semi_minor_axis = j["m_minorAxis"]; // Sanity check if (m_semi_major_axis <= 0.0 || m_semi_minor_axis <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Could not read positive semi-major " << "and semi-minor axies from state string."); // This must happen after gm model is set readCsmSunPosition(m_gm_model, m_sun_position); // This is a bug fix. normalizeLinescanQuaternions(); } void CsmModel::throw_if_not_init() const { if (!m_gm_model) vw_throw(ArgumentErr() << "CsmModel: Sensor model has not been initialized."); } // TODO: Check all of the warnings vw::Vector2 CsmModel::get_image_size() const { throw_if_not_init(); csm::ImageVector size = m_gm_model->getImageSize(); return Vector2(size.samp, size.line); } vw::Vector3 CsmModel::target_radii() const { return vw::Vector3(m_semi_major_axis, // x m_semi_major_axis, // y m_semi_minor_axis); // z } Vector2 CsmModel::point_to_pixel(Vector3 const& point) const { throw_if_not_init(); csm::EcefCoord ecef = vectorToEcefCoord(point); double achievedPrecision = -1.0; csm::WarningList warnings; csm::WarningList * warnings_ptr = NULL; // Do not show warnings, it becomes too verbose bool show_warnings = false; if (show_warnings) warnings_ptr = &warnings; csm::ImageCoord imagePt = m_gm_model->groundToImage(ecef, m_desired_precision, &achievedPrecision, warnings_ptr); if (show_warnings) { csm::WarningList::const_iterator w_iter; for (w_iter = warnings.begin(); w_iter != warnings.end(); w_iter++) { vw_out() << "CSM warning: " << w_iter->getMessage() << std::endl; } } vw::Vector2 pix = imageCoordToVector(imagePt) - ASP_TO_CSM_SHIFT; // This is a bugfix for when points far from the field of view project // incorrectly into the camera. if (m_maxApproxCamPixErr > 0) return this->correctWithApproxCam(pix, point); return pix; } vw::Vector3 CsmModel::pixel_to_vector(vw::Vector2 const& pix) const { throw_if_not_init(); csm::ImageCoord imagePt; toCsmPixel(pix, imagePt); double achievedPrecision = -1.0; // will be modified in the function csm::EcefLocus locus = m_gm_model->imageToRemoteImagingLocus(imagePt, m_desired_precision, &achievedPrecision); Vector3 dir = ecefVectorToVector(locus.direction); return dir; #if 0 // This alternative approach gives the same results as above, except // for the SAR model, which has curved rays, and for MSL, whose // location is below the zero datum. // This code is kept in case it is necessary to revisit the SAR model. // Camera center csm::EcefCoord ctr = m_gm_model->getSensorPosition(imagePt); // Ground point. Note how we use the 0 height above datum. // The precise height value matters only for the SAR model, when the rays // are curved, which violates a fundamental assumption in ASP. double groundHeight = 0.0; csm::EcefCoord groundPt = m_gm_model->imageToGround(imagePt, groundHeight, m_desired_precision, &achievedPrecision); // Normalized direction Vector3 dir0 = ecefCoordToVector(groundPt) - ecefCoordToVector(ctr); dir0 = dir0 / norm_2(dir0); return dir0; #endif } Vector3 CsmModel::camera_center(Vector2 const& pix) const { throw_if_not_init(); csm::ImageCoord imagePt = vectorToImageCoord(pix + ASP_TO_CSM_SHIFT); csm::EcefCoord ecef = m_gm_model->getSensorPosition(imagePt); return ecefCoordToVector(ecef); } // Apply a transform to the model state in json format template void applyTransformToState(ModelT const * model, vw::Matrix4x4 const& transform, // Output std::string & modelState) { // Applying a scale is not supported in any usgscsm sensors for now. double scale = pow(det(transform), 1.0/3.0); if (std::abs(scale - 1.0) > 1e-6) vw_throw(ArgumentErr() << "CSM camera models do not support applying a transform with a scale.\n"); // Extract the rotation and convert it to ale::Rotation vw::Matrix3x3 rotation_matrix = submatrix(transform, 0, 0, 3, 3); std::vector rotation_vec; for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { rotation_vec.push_back(rotation_matrix(row, col)); } } ale::Rotation r(rotation_vec); // Extract the translation ale::Vec3d t(transform(0, 3), transform(1, 3), transform(2, 3)); model->applyTransformToState(r, t, modelState); return; } void applyTransformToState(csm::RasterGM const* gm_model, vw::Matrix4x4 const& transform, // Output std::string & modelState) { // Need to consider each model type separately bool success = false; UsgsAstroFrameSensorModel const* frame_model = dynamic_cast(gm_model); if (!success && frame_model != NULL) { applyTransformToState(frame_model, transform, modelState); success = true; } UsgsAstroLsSensorModel const* ls_model = dynamic_cast(gm_model); if (!success && ls_model != NULL) { applyTransformToState(ls_model, transform, modelState); success = true; } UsgsAstroPushFrameSensorModel const* pf_model = dynamic_cast(gm_model); if (!success && pf_model != NULL) { applyTransformToState(pf_model, transform, modelState); success = true; } UsgsAstroSarSensorModel const* sar_model = dynamic_cast(gm_model); if (!success && sar_model != NULL) { applyTransformToState(sar_model, transform, modelState); success = true; } if (!success) vw_throw(vw::ArgumentErr() << "CsmModel::applyTransformedState(): Unknown CSM model type.\n"); } // Save model state void CsmModel::saveState(std::string const& json_state_file) const { throw_if_not_init(); csm::RasterGM const* gm_model = dynamic_cast(this->m_gm_model.get()); std::string modelState = gm_model->getModelState(); std::ofstream ofs(json_state_file.c_str()); ofs << modelState << std::endl; ofs.close(); return; } // Apply a transform to a CSM model void CsmModel::applyTransform(vw::Matrix4x4 const& transform) { throw_if_not_init(); csm::RasterGM const* gm_model = dynamic_cast(this->m_gm_model.get()); std::string modelState = gm_model->getModelState(); applyTransformToState(gm_model, transform, // Output modelState); bool recreate_model = false; // don't want to destroy the model setModelFromStateString(modelState, recreate_model); } std::string CsmModel::plugin_name() const { if (m_plugin_name.empty()) vw_throw(ArgumentErr() << "CsmModel: Plugin name has not been set yet."); return m_plugin_name; } std::string CsmModel::model_name() const { throw_if_not_init(); return m_gm_model->getModelName(); } std::string CsmModel::model_state() const { throw_if_not_init(); return m_gm_model->getModelState(); } // Convert -0 to 0. The -0 seems to be a quick. Have to return a copy // due to these being json fields. std::vector stripSign(std::vector const & vals) { std::vector out_vals = vals; for (size_t i = 0; i < vals.size(); i++) if (std::abs(vals[i]) < 1e-16) out_vals[i] = 0.0; return out_vals; } // Create a CSM frame camera model. This requires a lot of bookkeeping. Use // cam_test to compare such model with ASP's Pinhole model with same data. That // is created as: vw::camera::PinholeModel pin(C, R, focal_length, // focal_length, cx, cy); void CsmModel::createFrameModel(int cols, int rows, // in pixels double cx, double cy, // col and row of optical center, in units of pixel pitch double focal_length, // in units of pixel pitch double semi_major_axis, double semi_minor_axis, // in meters vw::Vector3 const& C, // camera center vw::Matrix3x3 const& R, // camera to world rotation matrix std::string const& distortionType, std::vector const& distortion, double ephem_time, vw::Vector3 const& sun_position, std::string const& serial_number, std::string const& target_name, double pixel_pitch) { // Make a copy of R as an Eigen matrix, and convert to quaternion Eigen::Matrix3d R_copy; for (int r = 0; r < 3; r++) { for (int c = 0; c < 3; c++) R_copy(r, c) = R(r, c); } Eigen::Quaterniond q(R_copy); // Creating a frame model requires populating a json file UsgsAstroFrameSensorModel cam; cam.reset(); std::string state = cam.getModelState(); nlohmann::json j = stateAsJson(state); j["m_sensorName"] = "csm"; j["m_platformName"] = "csm"; j["m_majorAxis"] = semi_major_axis; j["m_minorAxis"] = semi_minor_axis; j["m_minElevation"] = -10000.0; // -10 km j["m_maxElevation"] = 10000.0; // 10 km // Here a particular choice is assumed for converting from sensor plane // coordinates to pixels, which is compatible with the ASP Pinhole model. j["m_iTransL"] = std::vector({0.0, 0.0, 1.0 / pixel_pitch}); j["m_iTransS"] = std::vector({0.0, 1.0 / pixel_pitch, 0.0}); j["m_focalLength"] = focal_length; // Note the order (row, col), and how we must divide by pixel pitch j["m_ccdCenter"] = std::vector({cy / pixel_pitch, cx / pixel_pitch}); j["m_pixelPitch"] = pixel_pitch; j["m_nLines"] = rows; j["m_nSamples"] = cols; // Set the distortion. if (distortionType.empty()) { // Let default distortion be radial, with zero distortion. Avoid transverse // distortion, as that needs a lot of care in setting the coefficients. j["m_distortionType"] = DistortionType::RADIAL; j["m_opticalDistCoeffs"] = std::vector(3, 0.0); } else if (distortionType == "radial") { if (distortion.size() != 3) vw::vw_throw(ArgumentErr() << "Distortion coefficients for the radial distortion " << "model must be of size 3, in the order k1, k2, k3. " << "Got the size: " << distortion.size() << "\n"); j["m_distortionType"] = DistortionType::RADIAL; j["m_opticalDistCoeffs"] = distortion; } else if (distortionType == "radtan") { if (distortion.size() != 5) vw::vw_throw(ArgumentErr() << "Distortion coefficients for the radtan distortion " << "model must be of size 5, in the order k1, k2, p1, p2, k3. " << "Got the size: " << distortion.size() << "\n"); j["m_distortionType"] = DistortionType::RADTAN; j["m_opticalDistCoeffs"] = distortion; } else if (distortionType == "transverse") { j["m_distortionType"] = DistortionType::TRANSVERSE; if (distortion.size() != 20) vw::vw_throw(ArgumentErr() << "Distortion coefficients for the transverse distortion " << "model must be of size 20. Thse are the coefficients of a " << "polynomial of degree 3 in x and y. " << "Got the size: " << distortion.size() << "\n"); j["m_opticalDistCoeffs"] = distortion; } else { vw_throw(ArgumentErr() << "Unknown distortion type: " << distortionType << ".\n"); } // Need to apply this offset to make CSM agree with ASP's Pinhole j["m_startingDetectorLine"] = -0.5; j["m_startingDetectorSample"] = -0.5; // Part of the API j["m_focalLengthEpsilon"] = 1.0; // Copied from UsgsAstroFrameSensorModel.cpp double det = j["m_iTransL"][1].get() * j["m_iTransS"][2].get() - j["m_iTransL"][2].get() * j["m_iTransS"][1].get(); j["m_transX"][1] = j["m_iTransL"][1].get() / det; j["m_transX"][2] = -j["m_iTransS"][1].get() / det; j["m_transX"][0] = -(j["m_transX"][1].get() * j["m_iTransL"][0].get() + j["m_transX"][2].get() * j["m_iTransS"][0].get()); j["m_transY"][1] = -j["m_iTransL"][2].get() / det; j["m_transY"][2] = j["m_iTransS"][2].get() / det; j["m_transY"][0] = -(j["m_transY"][1].get() * j["m_iTransL"][0].get() + j["m_transY"][2].get() * j["m_iTransS"][0].get()); // Fix a quirk with -0. Cannot modify in-place the json fields, hence the copy. j["m_transX"] = stripSign(j["m_transX"]); j["m_transY"] = stripSign(j["m_transY"]); // Set the translation and quaternion. The quaternion is stored as x, y, z, w. j["m_currentParameterValue"] = std::vector({C[0], C[1], C[2], q.x(), q.y(), q.z(), q.w()}); j["m_ephemerisTime"] = ephem_time; j["m_sunPosition"] = std::vector({sun_position[0], sun_position[1], sun_position[2]}); j["m_imageIdentifier"] = serial_number; // Set the target name in the json j["m_targetName"] = target_name; // Update the state string and create the CSM model state = cam.getModelName() + "\n" + j.dump(2); bool recreate_model = true; setModelFromStateString(state, recreate_model); // This is a temporary fix for the function replaceModelState() // in UsgsAstroFrameSensorModel forgetting the target name. // Pull request submitted. set_target_name(target_name); } // Create a CSM frame camera model from pinhole camera model. void CsmModel::createFrameModel(vw::camera::PinholeModel const& pin_model, int cols, int rows, // in pixels double semi_major_axis, double semi_minor_axis, // in meters std::string const& distortionType, std::vector const& distortion, double ephem_time, vw::Vector3 const& sun_position, std::string const& serial_number, std::string const& target_name) { // These are all in units of pixel pitch vw::Vector2 focal_length = pin_model.focal_length(); vw::Vector2 opt_ctr = pin_model.point_offset(); double pixel_pitch = pin_model.pixel_pitch(); // Find the average focal length double f = (focal_length[0] + focal_length[1])/2.0; this->createFrameModel(cols, rows, opt_ctr[0], opt_ctr[1], f, semi_major_axis, semi_minor_axis, pin_model.camera_center(), pin_model.get_rotation_matrix(), distortionType, distortion, ephem_time, sun_position, serial_number, target_name, pixel_pitch); } // Approximate conversion to a pinhole model. Will be exact only for the radtan // lens distortion and no unusual line or sample adjustments in CSM. Compare // these with cam_test. // TODO(oalexan1): This code is not used and not tested. vw::camera::PinholeModel CsmModel::pinhole() const { // Camera center double x = 0, y = 0, z = 0; this->frame_position(x, y, z); vw::Vector3 cam_ctr(x, y, z); // Camera orientation double qx = 0, qy = 0, qz = 0, qw = 0; this->frame_quaternion(qx, qy, qz, qw); Eigen::Quaterniond q(qw, qx, qy, qz); Eigen::Matrix3d R = q.toRotationMatrix(); vw::Matrix3x3 cam_rot; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) cam_rot(r, c) = R(r, c); // Focal length, in units of pixel pitch double f = this->focal_length(); // CSM optical center is always in pixels. Have to convert to pixel pitch units. vw::Vector2 optical_center = this->optical_center() * this->frame_pixel_pitch(); // Create a pinhole model with zero distortion vw::camera::PinholeModel pin(cam_ctr, cam_rot, f, f, optical_center[0], optical_center[1], NULL, this->frame_pixel_pitch()); // Distortion DistortionType dist_type = this->distortion_type(); if (dist_type == DistortionType::RADTAN) { // Must have 5 coefficients std::vector dist = this->distortion(); if (dist.size() != 5) vw_throw(ArgumentErr() << "Expected 5 distortion coefficients for radtan model.\n"); // Copy to VW vector vw::Vector coeffs; coeffs.set_size(dist.size()); for (size_t i = 0; i < dist.size(); i++) coeffs[i] = dist[i]; vw::camera::TsaiLensDistortion distModel(coeffs); pin.set_lens_distortion(&distModel); } return pin; } // Must have some macros here to avoid a lot of boilerplate code #define CSM_FRAME_GET(PARAM, NAME, VAL) \ /* Try frame */ \ success = false; \ csm::RasterGM const* gm_model \ = dynamic_cast(this->m_gm_model.get()); \ { \ UsgsAstroFrameSensorModel const* frame_model \ = dynamic_cast(gm_model); \ if (!success && frame_model != NULL) { \ VAL = frame_model->PARAM; \ success = true; \ } \ } #define CSM_FRAME_SET(PARAM, NAME, VAL) \ success = false; \ csm::RasterGM * gm_model \ = dynamic_cast(this->m_gm_model.get()); \ /* Try frame */ \ { \ UsgsAstroFrameSensorModel * frame_model \ = dynamic_cast(gm_model); \ if (!success && frame_model != NULL) { \ frame_model->PARAM = VAL; \ success = true; \ } \ } #define CSM_LINESCAN_GET(PARAM, NAME, VAL) \ /* Try linescan */ \ success = false; \ { \ UsgsAstroLsSensorModel const* ls_model \ = dynamic_cast(gm_model); \ if (!success && ls_model != NULL) { \ VAL = ls_model->PARAM; \ success = true; \ } \ } \ /* Fail otherwise. There's no chance we will need this */ \ /* with SAR or pushbroom models */ \ if (!success) \ vw_throw(vw::ArgumentErr() \ << "CSM model " << NAME << " can be handled only " \ << "for linescan and frame cameras.\n"); #define CSM_LINESCAN_SET(PARAM, NAME, VAL) \ /* Try linescan */ \ success = false; \ { \ UsgsAstroLsSensorModel * ls_model \ = dynamic_cast(gm_model); \ if (!success && ls_model != NULL) { \ ls_model->PARAM = VAL; \ success = true; \ } \ } \ /* Fail otherwise. There's no chance we will need this */ \ /* with SAR or pushbroom models. */ \ if (!success) \ vw_throw(vw::ArgumentErr() \ << "CSM model " << NAME << " can be handled only " \ << "for linescan and frame cameras.\n"); // Get distortion std::vector CsmModel::distortion() const { std::vector dist; bool success = false; CSM_FRAME_GET(m_opticalDistCoeffs, "distortion", dist) if (success) return dist; CSM_LINESCAN_GET(m_opticalDistCoeffs, "distortion", dist) return dist; } // Get distortion type DistortionType CsmModel::distortion_type() const { DistortionType dist_type; bool success = false; CSM_FRAME_GET(m_distortionType, "distortion type", dist_type) if (success) return dist_type; CSM_LINESCAN_GET(m_distortionType, "distortion type", dist_type) return dist_type; } // Set distortion type void CsmModel::set_distortion_type(DistortionType dist_type) { bool success = false; CSM_FRAME_SET(m_distortionType, "distortion type", dist_type) if (success) return; CSM_LINESCAN_SET(m_distortionType, "distortion type", dist_type) return; } // Set camera position in ECEF (only for frame cameras) void CsmModel::set_frame_position(double x, double y, double z) { throw_if_not_init(); UsgsAstroFrameSensorModel * frame_model = dynamic_cast(m_gm_model.get()); if (frame_model == NULL) vw_throw(ArgumentErr() << "CsmModel: Cannot set camera position for non-frame camera.\n"); frame_model->m_currentParameterValue[0] = x; frame_model->m_currentParameterValue[1] = y; frame_model->m_currentParameterValue[2] = z; return; } // Get the camera position in ECEF (only for frame cameras) void CsmModel::frame_position(double & x, double & y, double & z) const { throw_if_not_init(); UsgsAstroFrameSensorModel const* frame_model = dynamic_cast(m_gm_model.get()); if (frame_model == NULL) vw_throw(ArgumentErr() << "CsmModel: Cannot get camera position for non-frame camera.\n"); x = frame_model->m_currentParameterValue[0]; y = frame_model->m_currentParameterValue[1]; z = frame_model->m_currentParameterValue[2]; return; } // Set the camera quaternion (only for frame cameras) void CsmModel::set_frame_quaternion(double qx, double qy, double qz, double qw) { throw_if_not_init(); UsgsAstroFrameSensorModel * frame_model = dynamic_cast(m_gm_model.get()); if (frame_model == NULL) vw_throw(ArgumentErr() << "CsmModel: Cannot set camera quaternion for non-frame camera.\n"); frame_model->m_currentParameterValue[3] = qx; frame_model->m_currentParameterValue[4] = qy; frame_model->m_currentParameterValue[5] = qz; frame_model->m_currentParameterValue[6] = qw; return; } // Get the camera quaternion (only for frame cameras) void CsmModel::frame_quaternion(double & qx, double & qy, double & qz, double & qw) const { throw_if_not_init(); UsgsAstroFrameSensorModel const* frame_model = dynamic_cast(m_gm_model.get()); if (frame_model == NULL) vw_throw(ArgumentErr() << "CsmModel: Cannot get camera quaternion for non-frame camera.\n"); qx = frame_model->m_currentParameterValue[3]; qy = frame_model->m_currentParameterValue[4]; qz = frame_model->m_currentParameterValue[5]; qw = frame_model->m_currentParameterValue[6]; return; } // Get the camera position in ECEF (only for frame cameras) double CsmModel::frame_pixel_pitch() const { throw_if_not_init(); UsgsAstroFrameSensorModel const* frame_model = dynamic_cast(m_gm_model.get()); if (frame_model == NULL) vw_throw(ArgumentErr() << "CsmModel: Cannot get pixel pitch for non-frame camera.\n"); // Check that m_iTransL and m_iTransS are set as in createFrameModel() if (frame_model->m_iTransL[0] != 0.0 || frame_model->m_iTransL[1] != 0.0) vw_throw(ArgumentErr() << "CsmModel: m_iTransL must have first two elements equal to zero.\n"); if (frame_model->m_iTransS[0] != 0.0 || frame_model->m_iTransS[2] != 0.0) vw_throw(ArgumentErr() << "CsmModel: m_iTransS must have first and third elements equal to zero.\n"); if (frame_model->m_iTransL[2] <= 0.0 || frame_model->m_iTransS[1] <= 0.0 || frame_model->m_iTransL[2] != frame_model->m_iTransS[1]) { vw_throw(ArgumentErr() << "CsmModel: m_iTransL[2] and m_iTransS[1] must be positive and equal.\n"); } return (1.0/frame_model->m_iTransL[2] + 1.0/frame_model->m_iTransS[1]) / 2.0; } // Set quaternions (only for linescan cameras) void CsmModel::set_linescan_quaternions(std::vector const& quaternions) { throw_if_not_init(); csm::RasterGM * gm_model = dynamic_cast(this->m_gm_model.get()); int num_quaternions = quaternions.size(); // total number of coefficients bool success = false; CSM_LINESCAN_SET(m_numQuaternions, "num quaternions", num_quaternions) CSM_LINESCAN_SET(m_quaternions, "quaternions", quaternions) } // Set the distortion. Need to consider each model type separately. void CsmModel::set_distortion(std::vector const& dist) { bool success = false; CSM_FRAME_SET(m_opticalDistCoeffs, "distortion", dist) if (success) return; CSM_LINESCAN_SET(m_opticalDistCoeffs, "distortion", dist) return; } // Get the focal length double CsmModel::focal_length() const { double focal_length = 0.0; bool success = false; CSM_FRAME_GET(m_focalLength, "focal length", focal_length) if (success) return focal_length; CSM_LINESCAN_GET(m_focalLength, "focal length", focal_length) return focal_length; } // Set the focal length void CsmModel::set_focal_length(double focal_length) { bool success = false; CSM_FRAME_SET(m_focalLength, "focal length", focal_length) if (success) return; CSM_LINESCAN_SET(m_focalLength, "focal length", focal_length) return; } // Get the optical center as sample, line. Different logic is needed for frame // and linescan cameras. Will return (m_ccdCenter[1], m_ccdCenter[0]) for frame, // and (m_detectorSampleOrigin, m_detectorLineOrigin) for linescan. // This is always in units of pixels, not mm. vw::Vector2 CsmModel::optical_center() const { vw::Vector2 optical_center; std::vector ccd_center; bool success = false; CSM_FRAME_GET(m_ccdCenter, "optical center", ccd_center) if (success) return vw::Vector2(ccd_center[1], ccd_center[0]); // note the order (sample, line) CSM_LINESCAN_GET(m_detectorSampleOrigin, "detector sample", optical_center[0]) CSM_LINESCAN_GET(m_detectorLineOrigin, "detector line", optical_center[1]) return optical_center; } // Set the optical center as sample, line. Different logic is needed for frame // and linescan cameras. void CsmModel::set_optical_center(vw::Vector2 const& optical_center) { bool success = false; auto ccd_center = std::vector({optical_center[1], optical_center[0]}); CSM_FRAME_SET(m_ccdCenter, "optical center", ccd_center) if (success) return; CSM_LINESCAN_SET(m_detectorSampleOrigin, "detector sample", optical_center[0]) CSM_LINESCAN_SET(m_detectorLineOrigin, "detector line", optical_center[1]) return; } // Get quaternions (only for linescan cameras) std::vector CsmModel::linescan_quaternions() const { throw_if_not_init(); csm::RasterGM * gm_model = dynamic_cast(this->m_gm_model.get()); std::vector quaternions; bool success = false; CSM_LINESCAN_GET(m_quaternions, "quaternions", quaternions) return quaternions; } // Set target name (only for frame cameras) void CsmModel::set_target_name(std::string const& target_name) { throw_if_not_init(); UsgsAstroFrameSensorModel * frame_model = dynamic_cast(m_gm_model.get()); if (frame_model != NULL) frame_model->m_targetName = target_name; return; } // Get target name (only for frame cameras) std::string CsmModel::target_name() const { throw_if_not_init(); UsgsAstroFrameSensorModel const* frame_model = dynamic_cast(m_gm_model.get()); if (frame_model != NULL) return frame_model->m_targetName; // Fallback measure return ""; } // Create a deep copy of the model, so don't just copy the shared pointer. void CsmModel::deep_copy(boost::shared_ptr & copy) const { // Initialize the output copy = boost::make_shared(); // Then make a deep copy this->deep_copy(*copy.get()); } void CsmModel::deep_copy(CsmModel & copy) const { throw_if_not_init(); // Start with a shallow copy. Then make a deep copy of m_gm_model. copy = *this; // Frame case UsgsAstroFrameSensorModel const* frame_model = dynamic_cast(m_gm_model.get()); if (frame_model != NULL) { UsgsAstroFrameSensorModel * new_frame_model = new UsgsAstroFrameSensorModel(*frame_model); copy.m_gm_model.reset(new_frame_model); return; } // Linescan case UsgsAstroLsSensorModel const* ls_model = dynamic_cast(m_gm_model.get()); if (ls_model != NULL) { UsgsAstroLsSensorModel * new_ls_model = new UsgsAstroLsSensorModel(*ls_model); copy.m_gm_model.reset(new_ls_model); return; } // Pushframe case UsgsAstroPushFrameSensorModel const* pf_model = dynamic_cast(m_gm_model.get()); if (pf_model != NULL) { UsgsAstroPushFrameSensorModel * new_pf_model = new UsgsAstroPushFrameSensorModel(*pf_model); copy.m_gm_model.reset(new_pf_model); return; } // SAR case UsgsAstroSarSensorModel const* sar_model = dynamic_cast(m_gm_model.get()); if (sar_model != NULL) { UsgsAstroSarSensorModel * new_sar_model = new UsgsAstroSarSensorModel(*sar_model); copy.m_gm_model.reset(new_sar_model); return; } // Throw an error vw_throw(ArgumentErr() << "CsmModel::deep_copy(): Unknown CSM model type.\n"); } vw::Vector3 CsmModel::sun_position() const { if (m_sun_position == vw::Vector3()) vw::vw_throw(vw::ArgumentErr() << "CsmModel::sun_position() returns the Sun position as being " << "at the planet center. This is a programmer error.\n"); return m_sun_position; } bool CsmModel::isFrameCam() const { throw_if_not_init(); csm::RasterGM const* gm_model = dynamic_cast(this->m_gm_model.get()); if (gm_model == NULL) return false; UsgsAstroFrameSensorModel const* frame_model = dynamic_cast(gm_model); if (frame_model == NULL) return false; return true; } // Get the datum from the CSM model. It is suggested to use if possible // the function StereoSessionCsm::get_datum() which calls this one, as // that one also knows about the image and can find the datum name. // If the spheroid name is not known, use "unknown". vw::cartography::Datum CsmModel::get_datum_csm(std::string spheroid_name, bool use_sphere_for_non_earth) const { std::string datum_name = "D_" + spheroid_name; // may be refined later // Read the ellipsoid radii vw::Vector3 radii = this->target_radii(); double radius1 = (radii[0] + radii[1]) / 2; // average the x and y axes (semi-major) double radius2 = radius1; // Auto-guess the datum if not available vw::cartography::Datum wgs84("WGS84"); vw::cartography::Datum moon("D_MOON"); vw::cartography::Datum mars("D_MARS"); bool is_wgs84 = (std::abs(wgs84.semi_major_axis() - radius1) < 1e-7 && std::abs(wgs84.semi_minor_axis() - radii[2]) < 1e-7); bool is_moon = (std::abs(moon.semi_major_axis() - radius1) < 1e-7 && std::abs(moon.semi_minor_axis() - radii[2]) < 1e-7); bool is_mars = (std::abs(mars.semi_major_axis() - radius1) < 1e-7 && std::abs(mars.semi_minor_axis() - radii[2]) < 1e-7); if (boost::to_lower_copy(spheroid_name).find("unknown") != std::string::npos || spheroid_name.empty()) { // Unknown datum. Try to fill in the name from above. if (is_wgs84) return wgs84; if (is_moon) return moon; if (is_mars) return mars; } // For Earth always use two radii. The logic below should distinguish Venus. bool has_earth_radius = (std::abs(radius1/wgs84.semi_major_axis() - 1.0) < 0.05); if (!use_sphere_for_non_earth || has_earth_radius) radius2 = radii[2]; // let the semi-minor axis be distinct from the semi-major axis vw::cartography::Datum datum(datum_name, spheroid_name, "Reference Meridian", radius1, radius2, 0); return datum; } // Create a projective approximation of the camera, if linescan and having // radtan distortion. This helps project into the camera ground points very // far from the field of view. See the .h file for more info. Code adapted from // UsgsAstroLsSensorModel.cc. // It may work better to compare the linescan model with distortion with the one // without distortion. This may be slower though. void CsmModel::createApproxCam() { throw_if_not_init(); UsgsAstroLsSensorModel * ls_model = dynamic_cast(m_gm_model.get()); if (ls_model == NULL) return; if (ls_model->m_distortionType != DistortionType::RADTAN) return; csm::EcefCoord refPt = m_gm_model->getReferencePoint(); double desired_precision = 1e-3; double height = computeEllipsoidElevation(refPt.x, refPt.y, refPt.z, m_semi_major_axis, m_semi_minor_axis, desired_precision); if (std::isnan(height)) return; vw::Vector2 imageSize = CsmModel::get_image_size(); double numCols = imageSize[0]; double numRows = imageSize[1]; // Use 10 samples along each row and column int numSamples = 10.0; // Sample at two heights (these get added to the ellipsoid height from above). std::vector height_delta = {-100.0, 100.0}; std::vector imagePixels; std::vector groundPts; // Iterate over height_delta for (size_t ht_iter = 0; ht_iter < height_delta.size(); ht_iter++) { double curr_height = height + height_delta[ht_iter]; // Iterate over the samples for given height for (int col_samp = 0; col_samp < numSamples; col_samp++) { for (int row_samp = 0; row_samp < numSamples; row_samp++) { vw::Vector2 pix((numCols - 1.0) * (double(col_samp) / (numSamples - 1.0)), (numRows - 1.0) * (double(row_samp) / (numSamples - 1.0))); vw::Vector3 xyz = vw::cartography::datum_intersection(m_semi_major_axis + curr_height, m_semi_minor_axis + curr_height, this->camera_center(pix), this->pixel_to_vector(pix)); // Print a warning and quit if (xyz == vw::Vector3()) { vw::vw_out(vw::WarningMessage) << "Failed to create an approximate camera model that may help " << "with projecting into the camera pixels far from the field of view."; return; } imagePixels.push_back(pix); groundPts.push_back(xyz); } // end iterate over rows } // end iterate over columns } // end iterate over height deltas asp::calcProjTrans(imagePixels, groundPts, m_approxCamCoeffs); // Test. Iterate over xyz, find pixel, compare. m_maxApproxCamPixErr = 0.0; for (size_t i = 0; i < imagePixels.size(); i++) { vw::Vector2 pix = imagePixels[i]; vw::Vector3 xyz = groundPts[i]; vw::Vector2 pix2 = asp::applyProjTrans(xyz, m_approxCamCoeffs); double err = vw::math::norm_2(pix - pix2); m_maxApproxCamPixErr = std::max(m_maxApproxCamPixErr, err); } m_maxApproxCamPixErr = std::max(m_maxApproxCamPixErr, 10.0); // ensure it is not small } // This is a bugfix for when points far from the field of view project // incorrectly into the camera. vw::Vector2 CsmModel::correctWithApproxCam(vw::Vector2 const& pix, vw::Vector3 const& xyz) const { // Find the approximate projection based on a projective transform vw::Vector2 apix = asp::applyProjTrans(xyz, m_approxCamCoeffs); // If the exact pixel is in the image box, and the approx one is out of the // box, need a closer study. vw::Vector2 imageSize = this->get_image_size(); bool pixIn = (0 <= pix[0] && pix[0] < imageSize[0] && 0 <= pix[1] && pix[1] < imageSize[1]); bool apixIn = (0 <= apix[0] && apix[0] < imageSize[0] && 0 <= apix[1] && apix[1] < imageSize[1]); if (pixIn && !apixIn) { // Likely the exact projection is not accurate double dist = vw::math::norm_2(pix - apix); if (m_maxApproxCamPixErr > 0 && dist > 1.5 * m_maxApproxCamPixErr) { double gsd = 0.0; UsgsAstroLsSensorModel * ls_model = dynamic_cast(m_gm_model.get()); if (ls_model != NULL) gsd = ls_model->m_gsd; if (gsd > 0) { // Do a geometric check. Project from the camera to the ground and see // if we get close enough to the input xyz. double dist_to_ground = vw::math::norm_2(xyz - this->camera_center(pix)); vw::Vector3 xyz2 = this->camera_center(pix) + this->pixel_to_vector(pix) * dist_to_ground; if (vw::math::norm_2(xyz - xyz2) > 10 * gsd) return apix; // Return the approximate pixel } } } // Return the exact pixel return pix; } } // end namespace asp ================================================ FILE: src/asp/Camera/CsmModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CsmModel.h /// /// Wrapper for Community Sensor Model implementations. /// /// #ifndef __STEREO_CAMERA_CSM_MODEL_H__ #define __STEREO_CAMERA_CSM_MODEL_H__ #include #include #include #include namespace vw { namespace camera { class PinholeModel; } } namespace csm { // Forward declarations class RasterGM; class ImageCoord; class EcefVector; class EcefCoord; } namespace asp { // Do not set this lower than 1e-8, as then UsgsAstroLsSensorModel can return // junk because of numerical precision issues for high focal length. const double DEFAULT_CSM_DESIRED_PRECISION = 1.0e-8; /// Class to load any cameras described by the Community Sensor Model (CSM) class CsmModel : public vw::camera::CameraModel { public: //------------------------------------------------------------------ // Constructors / Destructors //------------------------------------------------------------------ CsmModel(); CsmModel(std::string const& isd_path); ///< Construct from ISD file // Note: This class copy constructor is shallow. Use deep_copy() to // create a deep copy. virtual ~CsmModel(); virtual std::string type() const { return "CSM"; } /// Load the camera model from an ISD file or model state. void load_model(std::string const& isd_path); /// Return the size of the associated image. vw::Vector2 get_image_size() const; virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const; virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const; virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const; virtual vw::Quaternion camera_pose(vw::Vector2 const& pix) const { vw_throw(vw::NoImplErr() << "CsmModel: Cannot retrieve camera_pose!"); return vw::Quaternion(); } /// Return the path to the folder where we will look for CSM plugin DLLs. static std::string get_csm_plugin_folder(); /// Get a list of all of the CSM plugin DLLs in the CSM plugin folder. static size_t find_csm_plugins(std::vector &plugins); /// Print the CSM models that have been loaded into the main CSM plugin. static void print_available_models(); /// Get the semi-axes of the datum. vw::Vector3 target_radii() const; // Save the model state void saveState(std::string const& json_state_file) const; // Apply a transform to a CSM model void applyTransform(vw::Matrix4x4 const& transform); // Create a CSM frame camera model. Assumes that focal length and optical // center are in pixels, the pixel pitch is 1. void createFrameModel(int cols, int rows, // in pixels double cx, double cy, // col and row of optical center, in units of pixel pitch double focal_length, // in units of pixel pitch double semi_major_axis, double semi_minor_axis, // in meters vw::Vector3 const& C, // camera center vw::Matrix3x3 const& R, // camera to world rotation matrix std::string const& distortionType = "", std::vector const& distortion = std::vector(), double ephem_time = 0.0, vw::Vector3 const& sun_position = vw::Vector3(0,0,0), std::string const& serial_number = "", std::string const& target_name = "", double pixel_pitch = 1.0); // Create a CSM frame camera model from pinhole camera model. // The distortion model must be set separately, as ASP pinhole // and CSM use different distortion models. void createFrameModel(vw::camera::PinholeModel const& pin_model, int cols, int rows, // in pixels double semi_major_axis, double semi_minor_axis, // in meters std::string const& distortionType = "", std::vector const& distortion = std::vector(), double ephem_time = 0.0, vw::Vector3 const& sun_position = vw::Vector3(0,0,0), std::string const& serial_number = "", std::string const& target_name = ""); // Approximate conversion to a pinhole model. Will be exact only for the rad-tan // lens distortion and no unusual line or sample adjustments in CSM. Compare // these with cam_test. vw::camera::PinholeModel pinhole() const; // Sun position in ECEF vw::Vector3 sun_position() const; // For bundle adjustment need a higher precision as CERES needs to do accurate // numerical differences. void setDesiredPrecision(double desired_precision) { m_desired_precision = desired_precision; } /// Create the model from a state string. Use recreate_model = false, /// if desired to adjust an existing model. void setModelFromStateString(std::string const& model_state, bool recreate_model); /// Get intrinsic parameters std::vector distortion() const; DistortionType distortion_type() const; double focal_length() const; vw::Vector2 optical_center() const; // return sample and line // Set intrinsics void set_distortion_type(DistortionType dist_type); void set_distortion(std::vector const& distortion); void set_focal_length(double focal_length); void set_optical_center(vw::Vector2 const& optical_center); // sample and line // Set / get the position (camera center) in ECEF. Only for frame cameras. void set_frame_position(double x, double y, double z); void frame_position(double & x, double & y, double & z) const; // Set / get the rotation matrix from camera to world. Only for frame cameras. void set_frame_quaternion(double qx, double qy, double qz, double qw); void frame_quaternion(double & qx, double & qy, double & qz, double & qw) const; // Set / get quaternions (only for linescan cameras) void set_linescan_quaternions(std::vector const& quaternions); std::vector linescan_quaternions() const; double frame_pixel_pitch() const; // pixel pitch for frame camera // Target name std::string target_name() const; void set_target_name(std::string const& target_name); boost::shared_ptr m_gm_model; double m_desired_precision; // These are read from the json camera file double m_semi_major_axis, m_semi_minor_axis; // Create a deep copy of the model, so don't just copy the shared pointer. void deep_copy(boost::shared_ptr & copy) const; void deep_copy(CsmModel & copy) const; std::string plugin_name() const; std::string model_name () const; std::string model_state() const; bool isFrameCam() const; // Ensure the linescan model quaternions are always normalized and do not // suddenly flip sign void normalizeLinescanQuaternions(); // Get the datum from the CSM model. It is suggested to use if possible // the function StereoSessionCsm::get_datum() which calls this one, as // that one also knows about the image and can find the datum name. // If the spheroid name is not known, use "unknown". vw::cartography::Datum get_datum_csm(std::string spheroid_name, bool use_sphere_for_non_earth) const; protected: // Read the ellipsoid (datum) axes from the isd json file // (does not work for reading it from a json state file). void read_ellipsoid_from_isd(std::string const& isd_path); /// Load the camera model from an ISD file. void load_model_from_isd(std::string const& isd_path); /// Load the camera model from a model state written to disk. /// A model state is obtained from an ISD model by pre-processing /// and combining its data in a form ready to be used. void loadModelFromStateFile(std::string const& state_file); /// Find and load any available CSM plugin libraries from disk. /// - This does nothing after the first time it finds any plugins. void initialize_plugins(); /// Throw an exception if we have not loaded the model yet. void throw_if_not_init() const; vw::Vector3 m_sun_position; std::string m_plugin_name; // Store here the projective approximation of the camera. This helps catch // issues for projecting ground points very far rom the camera field of view // when there is strong lens distortion. std::vector m_approxCamCoeffs; // How far the pixels computed with the approximate camera are expected to // be from the true pixel location. double m_maxApproxCamPixErr; // Create the approximate camera void createApproxCam(); // Heuristics to correct point-to-pixel with the approximate camera vw::Vector2 correctWithApproxCam(vw::Vector2 const& pix, vw::Vector3 const& xyz) const; }; // End class CsmModel // Auxiliary non-member functions to convert a pixel from ASP // conventions to what CSM expects and vice versa void toCsmPixel(vw::Vector2 const& pix, csm::ImageCoord & csm); void fromCsmPixel(vw::Vector2 & pix, csm::ImageCoord const& csm); vw::Vector3 ecefVectorToVector(csm::EcefVector const& c); vw::Vector3 ecefCoordToVector(csm::EcefCoord const& c); vw::Vector2 imageCoordToVector(csm::ImageCoord const& c); } // end namespace asp #endif //__STEREO_CAMERA_CSM_MODEL_H__ ================================================ FILE: src/asp/Camera/CsmModelFit.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include namespace asp { // Find the rotation matrices, focal length, and optical center, // that best fit a 2D matrix of sight vectors. Used for ASTER. // Write a function having the block above void linescanFitSaveResiduals(ceres::Problem & problem, std::string const& resFile) { double total_cost = 0.0; ceres::Problem::EvaluateOptions eval_options; eval_options.num_threads = 1; // Use one thread to ensure a unique solution eval_options.apply_loss_function = false; // want raw residuals std::vector residuals; problem.Evaluate(eval_options, &total_cost, &residuals, NULL, NULL); // Save the residuals vw::vw_out() << "Writing residual norms to: " << resFile << std::endl; std::ofstream ofs(resFile.c_str()); for (int i = 0; i < residuals.size()/3; i++) { int j = 3*i; ofs << norm_2(vw::Vector3(residuals[j], residuals[j+1], residuals[j+2])) << std::endl; } ofs.close(); } // Convert axis angle to quaternion, in the format CSM expects void axisAngleToCsmQuatVec(int num_poses, const double * axis_angle_vec, std::vector & quat_vec) { quat_vec.resize(4*num_poses); auto const & rot = axis_angle_vec; for (int i = 0; i < num_poses; i++) { vw::Vector3 axis_angle(rot[3*i+0], rot[3*i+1], rot[3*i+2]); vw::Quat q = vw::math::axis_angle_to_quaternion(axis_angle); // CSM wants the quaternion order to be (x, y, z, w) int j = 4*i; quat_vec[j+0] = q.x(); quat_vec[j+1] = q.y(); quat_vec[j+2] = q.z(); quat_vec[j+3] = q.w(); } } // Convert CSM quaternions to axis angle format void csmQuatVecToAxisAngle(int num_poses, const double* quat_vec, std::vector & axis_angle_vec) { auto & rot = axis_angle_vec; rot.resize(3*num_poses); for (int i = 0; i < num_poses; i++) { int j = 4*i; // Note how we switch from (x,y,z,w) to (w,x,y,z) order vw::Quat q(quat_vec[j+3], quat_vec[j+0], quat_vec[j+1], quat_vec[j+2]); vw::Vector3 axis_angle = q.axis_angle(); rot[3*i+0] = axis_angle[0]; rot[3*i+1] = axis_angle[1]; rot[3*i+2] = axis_angle[2]; } } // The error between sight vectors and the camera directions struct SightMatError { SightMatError(SightMatT const& world_sight_mat, int row, int col, int min_col, int d_col): m_world_sight_mat(world_sight_mat), m_row(row), m_col(col), m_min_col(min_col), m_d_col(d_col) {} // Error operator bool operator()(double const* const* parameters, double* residuals) const { const double* rotation = parameters[0]; const double* optical_center = parameters[1]; const double* focal_length = parameters[2]; // Current sight vector vw::Vector3 sight = m_world_sight_mat[m_row][m_col]; // Find axis angle and then the rotation from the sensor to the world vw::Vector3 axis_angle(rotation[0], rotation[1], rotation[2]); vw::Matrix3x3 rot = vw::math::axis_angle_to_quaternion(axis_angle).rotation_matrix(); // sight vec in sensor coordinates. Here likely the row index and min_row is // not needed. Those are taken into account when the pixel is created later. vw::Vector3 in(m_min_col + m_col * m_d_col - optical_center[0], -optical_center[1], focal_length[0]); // Normalize in = in/norm_2(in); // rotate to world coordinates in = rot*in; // The sight vector we try to fit vw::Vector3 out = m_world_sight_mat[m_row][m_col]; out = out/norm_2(out); for (size_t p = 0; p < 3; p++) residuals[p] = in[p] - out[p]; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(SightMatT const& world_sight_mat, int row, int col, int min_col, int d_col) { // The numbers below are for residual, rotation, optical center, focal length ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new SightMatError(world_sight_mat, row, col, min_col, d_col)); cost_function->SetNumResiduals(3); cost_function->AddParameterBlock(3); // rotation cost_function->AddParameterBlock(2); // optical center cost_function->AddParameterBlock(1); // focal length return cost_function; } // The sight matrix has samples of directions in the world coordinates SightMatT const& m_world_sight_mat; // alias int m_row, m_col; int m_min_col, m_d_col; // to go from index in sight mat to image column }; // See the .h file for the documentation void fitBestRotationsIntrinsics(SightMatT const& world_sight_mat, vw::Vector2i const& image_size, int min_col, int d_col, // Outputs double & focal_length, vw::Vector2 & optical_center, std::vector> & rotation_vec) { // Wipe the outputs rotation_vec.clear(); int num_rows = world_sight_mat.size(); int num_cols = world_sight_mat[0].size(); // First and last sight vectors for first row vw::Vector3 beg_v = world_sight_mat[0][0]; vw::Vector3 end_v = world_sight_mat[0][num_cols-1]; // Find the angle, in radians, between the two vectors double fov = acos(dot_prod(beg_v, end_v)/(norm_2(beg_v)*norm_2(end_v))); // Find initial focal length based on fov and image width focal_length = image_size[0]/(2.0*tan(fov/2.0)); // Initial optical center (column and row) optical_center = vw::Vector2(image_size[0]/2.0, 0); // Find the initial rotation matrix for each row of world_sight_mat // make a vector of matrices, one for each row for (int row = 0; row < world_sight_mat.size(); row++) { // Find input-output pair correspondences std::vector in_vec, out_vec; for (int col = 0; col < world_sight_mat[0].size(); col++) { vw::Vector3 in(min_col + col * d_col - optical_center[0], -optical_center[1], focal_length); vw::Vector3 out = world_sight_mat[0][col]; // Normalize and push back in = in/norm_2(in); out = out/norm_2(out); in_vec.push_back(in); out_vec.push_back(out); } // Find the rotation matrix that fits best the input-output pairs std::string transform_type = "rigid"; vw::Matrix rotation; vw::Vector3 translation; double scale = 1.0; vw::math::find_3D_transform_no_outliers(in_vec, out_vec, rotation, translation, scale, transform_type); // append the rotation to the vec rotation_vec.push_back(rotation); } // Convert rotations to axis angle format std::vector axis_angle_vec(num_rows); for (int row = 0; row < num_rows; row++) { vw::Quat q(rotation_vec[row]); vw::Vector3 axis_angle = q.axis_angle(); axis_angle_vec[row] = axis_angle; } // Set up an optimization problem. Inputs is world_sight_mat. // Find best-fitting rotation matrices for each row of world_sight_mat, // and the overall best focal length and optical center. ceres::Problem problem; for (int row = 0; row < num_rows; row++) { for (int col = 0; col < num_cols; col++) { ceres::CostFunction* cost_function = SightMatError::Create(world_sight_mat, row, col, min_col, d_col); // ceres::LossFunction* loss_function = NULL; // Prioritize for now the center of the image where the distortion // is less. ceres::LossFunction* loss_function = new ceres::CauchyLoss(1e-6); problem.AddResidualBlock(cost_function, loss_function, &axis_angle_vec[row][0], &optical_center[0], &focal_length); } } // linescanFitSaveResiduals(problem, "residuals1_before.txt"); // for debugging // Solve the problem ceres::Solver::Options options; options.linear_solver_type = ceres::ITERATIVE_SCHUR; options.num_threads = 1; options.max_num_iterations = 50; // 50 iterations is enough options.minimizer_progress_to_stdout = false; ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); // Copy back from axis_angle_vec to rotation_vec for (int row = 0; row < num_rows; row++) rotation_vec[row] = vw::math::axis_angle_to_quaternion(axis_angle_vec[row]).rotation_matrix(); #if 0 // for debugging vw::vw_out() << summary.FullReport() << "\n"; vw::vw_out() << "Starting average reprojection error: " << summary.initial_cost << "\n"; vw::vw_out() << "Final average reprojection error: " << summary.final_cost << "\n"; #endif // linescanFitSaveResiduals(problem, "residuals1_after.txt"); // for debugging return; } // The error between sight vectors and a linescan CSM model that incorporates // distortion. The satellite positions are assumed fixed. struct SightMatLinescanError { SightMatLinescanError(SightMatT const& world_sight_mat, asp::CsmModel const& csm_model, int min_col, int min_row, int d_col, int d_row, int num_poses, DistortionType dist_type, int num_dist_params): m_world_sight_mat(world_sight_mat), m_csm_model(csm_model), m_min_col(min_col), m_min_row(min_row), m_d_col(d_col), m_d_row(d_row), m_num_poses(num_poses), m_dist_type(dist_type), m_num_dist_params(num_dist_params) {} // Members // The sight matrix has samples of directions in the world coordinates SightMatT const& m_world_sight_mat; // alias asp::CsmModel const& m_csm_model; // alias int m_min_col, m_min_row, m_d_col, m_d_row, m_num_poses; DistortionType m_dist_type; int m_num_dist_params; // Error operator bool operator()(double const* const* parameters, double* residuals) const { const double* rotations = parameters[0]; const double* optical_center = parameters[1]; const double* focal_length = parameters[2]; const double* distortion = parameters[3]; // Make a local model copy asp::CsmModel local_model; m_csm_model.deep_copy(local_model); // Set distortion local_model.set_distortion_type(m_dist_type); std::vector dist_vec(m_num_dist_params); for (int i = 0; i < m_num_dist_params; i++) dist_vec[i] = distortion[i]; local_model.set_distortion(dist_vec); // Set focal length and optical center local_model.set_focal_length(focal_length[0]); local_model.set_optical_center(vw::Vector2(optical_center[0], optical_center[1])); // Copy the rotations from axis angle format to quaternions, then set in model std::vector quaternions(4*m_num_poses); axisAngleToCsmQuatVec(m_num_poses, rotations, quaternions); local_model.set_linescan_quaternions(quaternions); // Find the residuals with the local model int num_rows = m_world_sight_mat.size(); int num_cols = m_world_sight_mat[0].size(); int count = 0; for (int row = 0; row < num_rows; row++) { for (int col = 0; col < num_cols; col++) { vw::Vector3 dir1 = m_world_sight_mat[row][col]; dir1 = dir1/norm_2(dir1); // Vector in sensor coordinates. Convert to double // early on to avoid integer overflow. vw::Vector2 pix(double(m_min_col) + double(col) * m_d_col, double(m_min_row) + double(row) * m_d_row); vw::Vector3 dir2 = local_model.pixel_to_vector(pix); int j = 3 * count; for (int k = 0; k < 3; k++) residuals[j+k] = dir1[k] - dir2[k]; count++; } } return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(SightMatT const& world_sight_mat, asp::CsmModel const& csm_model, int min_col, int min_row, int d_col, int d_row, int num_poses, DistortionType dist_type, int num_dist_params) { ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new SightMatLinescanError(world_sight_mat, csm_model, min_col, min_row, d_col, d_row, num_poses, dist_type, num_dist_params)); int num_rows = world_sight_mat.size(); int num_cols = world_sight_mat[0].size(); cost_function->AddParameterBlock(3 * num_poses); // rotations cost_function->AddParameterBlock(2); // optical center cost_function->AddParameterBlock(1); // focal length cost_function->AddParameterBlock(num_dist_params); // distortion cost_function->SetNumResiduals(3 * num_rows * num_cols); return cost_function; } }; // See the .h file for the documentation void refineCsmLinescanFit(SightMatT const& world_sight_mat, int min_col, int min_row, int d_col, int d_row, // This model will be modified asp::CsmModel & csm_model, bool fix_rotations, int distortion_type) { // Read data from the model double focal_length = csm_model.focal_length(); vw::Vector2 optical_center = csm_model.optical_center(); std::vector quaternions = csm_model.linescan_quaternions(); // Sanity check int num_poses = quaternions.size()/4; if (num_poses == 0) vw::vw_throw(vw::ArgumentErr() << "refineCsmLinescanFit: No poses found.\n"); // Create rotations from quaternions std::vector rotations; csmQuatVecToAxisAngle(num_poses, &quaternions[0], rotations); // Choose distortion model. Default (-1) uses RADTAN. DistortionType dist_type; std::vector distortion; if (distortion_type == TRANSVERSE) { dist_type = TRANSVERSE; distortion.resize(20, 1e-6); // Identity for linear terms, small nonzero for rest so Ceres sees gradient distortion[0] = 0.0; // x constant (no offset) distortion[1] = 1.0; // x coeff for ux (identity) distortion[10] = 0.0; // y constant distortion[12] = 1.0; // y coeff for uy (identity) } else { dist_type = RADTAN; distortion.assign(5, 1e-8); } // Set up an optimization problem to refine the CSM model. ceres::Problem problem; ceres::CostFunction* cost_function = SightMatLinescanError::Create(world_sight_mat, csm_model, min_col, min_row, d_col, d_row, num_poses, dist_type, distortion.size()); // Minimize all residuals equally ceres::LossFunction* loss_function = NULL; problem.AddResidualBlock(cost_function, loss_function, &rotations[0], &optical_center[0], &focal_length, &distortion[0]); // Positions are not optimized by this solver. Fix rotations too when // vendor extrinsics are known (SPOT5), so only intrinsics are fitted. if (fix_rotations) problem.SetParameterBlockConstant(&rotations[0]); // linescanFitSaveResiduals(problem, "residuals2_before.txt"); // for debugging // Set up the solver options ceres::Solver::Options options; options.linear_solver_type = ceres::ITERATIVE_SCHUR; options.num_threads = 1; // Use one thread for unique solution options.max_num_iterations = 50; // 50 iterations is enough options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.parameter_tolerance = 1e-12; // should be enough options.minimizer_progress_to_stdout = false; // Solve the problem ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); // linescanFitSaveResiduals(problem, "residuals2_after.txt"); // for debugging // Copy back rotations vec to quaternions axisAngleToCsmQuatVec(rotations.size()/3, &rotations[0], quaternions); // Update the model quaternions, focal length, optical center, and distortion csm_model.set_linescan_quaternions(quaternions); csm_model.set_focal_length(focal_length); csm_model.set_optical_center(optical_center); csm_model.set_distortion_type(dist_type); csm_model.set_distortion(distortion); return; } // Fit a CSM sensor with distortion to given tabulated sight directions. This // assumes the scan lines are horizontal, so the satellite moves vertically. // There are as many rows in world_sight_mat as there are satellite positions. // At each position there several sight vectors, along the scanline. // We want: world_sight_mat[row][col] = csm_model.pixel_to_vector(col, row). void fitCsmLinescan(std::string const& sensor_id, vw::cartography::Datum const& datum, vw::Vector2i const& image_size, std::vector const& sat_pos, SightMatT const& world_sight_mat, int min_col, int min_row, int d_col, int d_row, bool fit_distortion, // This model will be modified asp::CsmModel & csm_model) { // Sanity check if (sat_pos.size() != world_sight_mat.size()) vw::vw_throw(vw::ArgumentErr() << "fitCsmLinescan: The number of satellite positions does not " << "agree with the number of rows in the sight matrix.\n"); // Sanity check int last_sampled_row = min_row + d_row * (world_sight_mat.size() - 1); if (last_sampled_row < image_size[1] - 1) vw::vw_out(vw::WarningMessage) << "Warning: The last image row with a sight matrix sample is " << last_sampled_row << ", which is less than the last image pixel line of " << image_size[1] - 1 << ". This may lead to problems with the best-fit CSM model.\n"; // Find the rotation matrices, focal length, and optical center, // that best fit a 2D matrix of sight vectors. For now, assume // no distortion. double focal_length = 0.0; vw::Vector2 optical_center; std::vector> cam2world_vec; fitBestRotationsIntrinsics(world_sight_mat, image_size, min_col, d_col, focal_length, optical_center, cam2world_vec); // Assume it takes one unit of time to scan one image line double first_line_time = 0; // time of the first scanned line double last_line_time = image_size[1] - 1; double dt_line = (last_line_time - first_line_time) / (image_size[1] - 1.0); // The image line for the first pose determines its time. The spacing // between poses determines dt_ephem. Note that min_row is negative, // because the first pose is measured before data starts being recorded. double t0_ephem = min_row * dt_line; double dt_ephem = d_row * dt_line; double t0_quat = t0_ephem; double dt_quat = dt_ephem; // We have no velocities in this context, so set them to 0 std::vector velocities(sat_pos.size(), vw::Vector3(0, 0, 0)); // Initialize the CSM model asp::populateCsmLinescan(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat, focal_length, optical_center, image_size, datum, sensor_id, sat_pos, velocities, cam2world_vec, csm_model); // output // Refine the CSM model by also floating the distortion if (fit_distortion) asp::refineCsmLinescanFit(world_sight_mat, min_col, min_row, d_col, d_row, csm_model); return; } // Create pixel samples. Make sure to sample the pixel at (width - 1, height - 1). void createPixelSamples(int width, int height, int num_pixel_samples, std::vector & pix_samples) { // Sanity checks if (num_pixel_samples <= 0) vw::vw_throw(vw::ArgumentErr() << "The number of pixel samples must be positive.\n"); if (width <= 1 || height <= 1) vw::vw_throw(vw::ArgumentErr() << "The image dimensions must be at least 2 pixels.\n"); // Wipe the output pix_samples.clear(); // Find how many samples we need for width and height double area = double(width) * double(height); // avoid int32 overflow double len = sqrt(area / double(num_pixel_samples)); int num_x = std::max(round((width - 1.0) / len) + 1, 2.0); int num_y = std::max(round((height - 1.0) / len) + 1, 2.0); // Take creat care to include the last pixel, which is (width - 1, height - // 1). double x_step = (width - 1.0) / double(num_x - 1); double y_step = (height - 1.0) / double(num_y - 1); // iterate with num_x samples with spacing x_step, and the same for y for (int ix = 0; ix < num_x; ix++) { for (int iy = 0; iy < num_y; iy++) { double x = ix * x_step; double y = iy * y_step; x = std::min(x, double(width - 1)); y = std::min(y, double(height - 1)); vw::Vector2 pix(x, y); pix_samples.push_back(pix); } } return; } void parseRefineIntrinsicsStr(std::string const& refine_intrinsics, bool & fix_focal_length, bool & fix_optical_center, bool & fix_other_intrinsics) { // Initialize all to true fix_focal_length = true; fix_optical_center = true; fix_other_intrinsics = true; // Make a local copy of the string and convert it to lower case std::string local_refine_intrinsics = refine_intrinsics; boost::to_lower(local_refine_intrinsics); // Ensure that this was set to something, rather than "", which may be ambiguous. if (local_refine_intrinsics == "") vw::vw_throw(vw::ArgumentErr() << "Error: refine intrinsics string is empty.\n"); // Replace none with "". if (local_refine_intrinsics == "none") local_refine_intrinsics = ""; // Replace "all" with all if (local_refine_intrinsics == "all") local_refine_intrinsics = "focal_length, optical_center, other_intrinsics"; // Replace commas with spaces boost::replace_all(local_refine_intrinsics, ",", " "); std::istringstream is(local_refine_intrinsics); std::string val; while (is >> val) { if (val == "focal_length") fix_focal_length = false; else if (val == "optical_center") fix_optical_center = false; else if (val == "other_intrinsics" || val == "distortion") fix_other_intrinsics = false; else vw::vw_throw(vw::ArgumentErr() << "Error: Found unknown intrinsic to float: " << val << ".\n"); } vw::vw_out() << "Refine focal length: " << !fix_focal_length << "\n"; vw::vw_out() << "Refine optical center: " << !fix_optical_center << "\n"; vw::vw_out() << "Refine other intrinsics (distortion): " << !fix_other_intrinsics << "\n"; } // The error between projections of ground points in camera and known pixels. // Optimize the intrinsics, including distortion. The satellite positions and // orientations are optimized as well. struct FrameCamReprojErr { FrameCamReprojErr(std::vector const& pixels, std::vector const& xyz, int num_distortion_params, asp::CsmModel const& csm_model): m_pixels(pixels), m_xyz(xyz), m_num_dist_params(num_distortion_params), m_csm_model(csm_model) { // There must be as many pixels as xyz if (m_pixels.size() != m_xyz.size()) vw::vw_throw(vw::ArgumentErr() << "Error: The number of pixels and ground points must be same.\n"); } // Members std::vector const& m_pixels; // alias std::vector const& m_xyz; // alias int m_num_dist_params; asp::CsmModel const& m_csm_model; // alias // Error operator bool operator()(double const* const* parameters, double* residuals) const { const double* position = parameters[0]; const double* rotation = parameters[1]; const double* optical_center = parameters[2]; const double* focal_length = parameters[3]; const double* distortion = parameters[4]; // Make a local model copy asp::CsmModel local_model; m_csm_model.deep_copy(local_model); // Set the position local_model.set_frame_position(position[0], position[1], position[2]); // Copy the rotation from axis angle format to quaternions, then set in model int num_poses = 1; std::vector q(4*num_poses); axisAngleToCsmQuatVec(num_poses, rotation, q); local_model.set_frame_quaternion(q[0], q[1], q[2], q[3]); // Set optical center and focal length local_model.set_optical_center(vw::Vector2(optical_center[0], optical_center[1])); local_model.set_focal_length(focal_length[0]); // Set distortion std::vector dist_vec(m_num_dist_params); for (int i = 0; i < m_num_dist_params; i++) dist_vec[i] = distortion[i]; local_model.set_distortion(dist_vec); // Find the residuals with the local model int num_samples = m_pixels.size(); for (int count = 0; count < num_samples; count++) { vw::Vector2 pix1 = m_pixels[count]; vw::Vector2 pix2 = local_model.point_to_pixel(m_xyz[count]); int j = 2 * count; for (int k = 0; k < 2; k++) residuals[j+k] = pix1[k] - pix2[k]; } return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(std::vector const& pixels, std::vector const& xyz, int num_distortion_params, asp::CsmModel const& csm_model) { ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new FrameCamReprojErr(pixels, xyz, num_distortion_params, csm_model)); cost_function->AddParameterBlock(3); // position cost_function->AddParameterBlock(3); // rotation (axis angle) cost_function->AddParameterBlock(2); // optical center cost_function->AddParameterBlock(1); // focal length cost_function->AddParameterBlock(num_distortion_params); // distortion cost_function->SetNumResiduals(2 * pixels.size()); // 2 residuals per pixel return cost_function; } }; // See how well the optimized model fits the ground points void computeCamStats(std::vector const& pixels, std::vector const& xyz, asp::CsmModel const& csm_model) { // Iterate over xyz and project into the camera std::vector errors; for (size_t i = 0; i < xyz.size(); i++) { vw::Vector2 pix = csm_model.point_to_pixel(xyz[i]); errors.push_back(norm_2(pix - pixels[i])); } // Sort the errors std::sort(errors.begin(), errors.end()); double mean = vw::math::mean(errors); double stdev = vw::math::standard_deviation(errors, mean); vw::vw_out() << "Errors of pixel projection in the camera with refined intrinsics:\n"; vw::vw_out() << "Min: " << errors[0] << "\n"; vw::vw_out() << "Median: " << vw::math::destructive_median(errors) << "\n"; vw::vw_out() << "Mean: " << mean << "\n"; vw::vw_out() << "StDev: " << stdev << "\n"; vw::vw_out() << "Max: " << errors.back() << "\n"; vw::vw_out() << "Num samples: " << errors.size() << "\n"; } // Refine a CSM frame camera model using a a set of ground points projecting at given pixels void refineCsmFrameFit(std::vector const& pixels, std::vector const& xyz, std::string const& refine_intrinsics, asp::CsmModel & csm_model) { // output vw::vw_out() << "Refining camera intrinsics and pose.\n"; // See which intrinsics to fix bool fix_focal_length = true, fix_optical_center = true, fix_other_intrinsics = true; parseRefineIntrinsicsStr(refine_intrinsics, fix_focal_length, fix_optical_center, fix_other_intrinsics); // Read data from the model double x, y, z; csm_model.frame_position(x, y, z); double qx, qy, qz, qw; csm_model.frame_quaternion(qx, qy, qz, qw); double focal_length = csm_model.focal_length(); vw::Vector2 optical_center = csm_model.optical_center(); std::vector distortion = csm_model.distortion(); #if 0 // This does not work and may not be needed // Find the longest distance from optical center to each pixel if (!fix_other_intrinsics) { double r = 0; for (size_t i = 0; i < pixels.size(); i++) r = std::max(r, norm_2(pixels[i] - optical_center)); if (r == 0) vw::vw_throw(vw::ArgumentErr() << "Error: Not enough samples.\n"); // Give CERES a hint to not perturb the high order distortion terms too much // TODO(oalexan1): This should depend on image dimensions. // k2 gets multiplied by r^5, k3 gets multiplied by r^7. if (distortion[1] == 0) distortion[1] = 1e-7 / pow(r, 5); // k2 if (distortion[4] == 0) distortion[4] = 1e-7 / pow(r, 7); // k3 } #endif // The position vector std::vector position = {x, y, z}; // Create rotation from quaternions std::vector rotation; int num_poses = 1; std::vector q = {qx, qy, qz, qw}; csmQuatVecToAxisAngle(num_poses, &q[0], rotation); // Set up an optimization problem to refine the CSM model. ceres::Problem problem; ceres::CostFunction* cost_function = FrameCamReprojErr::Create(pixels, xyz, distortion.size(), csm_model); // Minimize all residuals equally ceres::LossFunction* loss_function = NULL; problem.AddResidualBlock(cost_function, loss_function, &position[0], &rotation[0], &optical_center[0], &focal_length, &distortion[0]); // Set up the solver options ceres::Solver::Options options; options.linear_solver_type = ceres::ITERATIVE_SCHUR; options.num_threads = 1; // Use one thread for unique solution options.max_num_iterations = 50; // 50 iterations is enough options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.parameter_tolerance = 1e-12; // should be enough options.minimizer_progress_to_stdout = false; // true for debugging if (fix_focal_length) problem.SetParameterBlockConstant(&focal_length); if (fix_optical_center) problem.SetParameterBlockConstant(&optical_center[0]); if (fix_other_intrinsics) problem.SetParameterBlockConstant(&distortion[0]); // Solve the problem ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); //vw::vw_out() << summary.FullReport() << "\n"; // Copy back csm_model.set_frame_position(position[0], position[1], position[2]); axisAngleToCsmQuatVec(num_poses, &rotation[0], q); csm_model.set_frame_quaternion(q[0], q[1], q[2], q[3]); csm_model.set_focal_length(focal_length); csm_model.set_optical_center(optical_center); csm_model.set_distortion(distortion); computeCamStats(pixels, xyz, csm_model); return; } // Fit a CSM camera to an optical bar camera. Optical bar cameras assumes the // scan lines are vertical, as for KH-9, which differs with how a CSM model is // fit, so below we will do some conversions. Additionally, the image file // needs to be rotated 90 degrees counter-clockwise to match the CSM camera. void fitCsmLinescanToOpticalBar(std::string const& camFile, vw::Vector2i const& OpticalBarimageColsRows, vw::cartography::Datum const& datum, asp::CsmModel & csm) { // See above for why OpticalBar rows become CSM columns, and vise versa. int num_csm_rows = OpticalBarimageColsRows[0]; int num_csm_cols = OpticalBarimageColsRows[1]; // This should be fine enough int num_lines_per_pose = 100; // Use at least 1000 samples, but no more than 10000. int num_row_samples = round(double(num_csm_rows) / double(num_lines_per_pose)) + 1; num_row_samples = std::max(1000, std::min(num_row_samples, 10000)); // Spacing between row samples int d_row = round(double(num_csm_rows) / double(num_row_samples - 1)); d_row = std::max(d_row, 1); // at least one pixel per sample // Add at least 10 row samples before first line and after last line, which // help with pose interpolation when solving for jitter. int min_row = -10 * d_row; // start at least 10 pixels before the first line int max_row = num_csm_rows + 10 * d_row; // end at least 10 pixels after the last line num_row_samples = ceil(double(max_row - min_row) / double(d_row)) + 1; // Along each row, likely 20 column samples should be enough, as those will result // in a single rotation matrix. int num_col_samples = 20; int d_col = ceil(double(num_csm_cols) / double(num_col_samples - 1)); // max_col should be at least num_csm_cols - 1 to sample fully the last column. // Otherwise throw a warning. int min_col = 0; // start at the first column int max_col = min_col + (num_col_samples - 1) * d_col; if (max_col < num_csm_cols - 1) vw::vw_out(vw::WarningMessage) << "Warning: The last column with a sight matrix sample is " << max_col << ", which is less than the last image pixel column of " << num_csm_cols - 1 << ". This may lead to problems with the best-fit CSM model.\n"; // Open the Optical bar file vw::camera::OpticalBarModel optical_bar_cam(camFile); vw::Vector2 optical_center = optical_bar_cam.get_optical_center(); vw::Vector2 image_size = optical_bar_cam.get_image_size(); // Image size must be what was set earlier if (image_size != OpticalBarimageColsRows) vw::vw_throw(vw::ArgumentErr() << "Error: The image size set in the optical bar camera model does not match " << "the actual image size.\n"); // Sample the camera poses along the track std::vector sat_pos(num_row_samples); for (int i = 0; i < num_row_samples; i++) { double csm_row = min_row + i * d_row; // Convert to optical bar pixels. The optical bar column is csm row. // The optical bar row is the row coordinate of the optical center. vw::Vector2 optical_bar_pix(csm_row, optical_center[1]); sat_pos[i] = optical_bar_cam.camera_center(optical_bar_pix); } // Create the world sight matrix (camera directions in world coordinates) SightMatT world_sight_mat(num_row_samples, std::vector(num_col_samples)); for (int irow = 0; irow < num_row_samples; irow++) { for (int icol = 0; icol < num_col_samples; icol++) { double csm_col = min_col + icol * d_col; double csm_row = min_row + irow * d_row; // In-sensor rotation that interchanges rows and cols vw::Vector2 optical_bar_pix(csm_row, num_csm_cols - 1 - csm_col); world_sight_mat[irow][icol] = optical_bar_cam.pixel_to_vector(optical_bar_pix); } } // Fit the CSM model std::string sensor_id = "OpticalBar"; bool fit_distortion = false; fitCsmLinescan(sensor_id, datum, vw::Vector2(num_csm_cols, num_csm_rows), sat_pos, world_sight_mat, min_col, min_row, d_col, d_row, fit_distortion, csm); } } // end namespace asp ================================================ FILE: src/asp/Camera/CsmModelFit.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CsmModelFit.h #ifndef __ASP_CAMERA_CSM_MODEL_FIT_H__ #define __ASP_CAMERA_CSM_MODEL_FIT_H__ #include #include // Forward declaration namespace vw { namespace cartography { class Datum; } } namespace asp { class CsmModel; typedef std::vector> SightMatT; // Refine a CSM linescan model by floating optical center, focal length, // and distortion to match given world sight vectors. Rotations can // optionally be fixed (for SPOT5 where extrinsics come from vendor). void refineCsmLinescanFit(SightMatT const& world_sight_mat, int min_col, int min_row, int d_col, int d_row, asp::CsmModel & csm_model, bool fix_rotations = false, int distortion_type = -1); // Fit a CSM sensor with distortion to given tabulated sight directions. // This is specific to ASTER. void fitCsmLinescan( std::string const& sensor_id, vw::cartography::Datum const& datum, vw::Vector2i const& image_size, std::vector const& sat_pos, SightMatT const& world_sight_mat, int min_col, int min_row, int d_col, int d_row, bool fit_distortion, // This model will be modified asp::CsmModel & csm_model); // Create pixel samples. Make sure to sample the pixel at (width - 1, height - 1). void createPixelSamples(int width, int height, int num_pixel_samples, std::vector & pix_samples); // Refine a CSM frame camera model using a a set of ground points projecting at given pixels void refineCsmFrameFit(std::vector const& pixels, std::vector const& directions, std::string const& refine_intrinsics, asp::CsmModel & csm_model); // output // Fit a CSM camera to an optical bar camera. The .cc file has more details. void fitCsmLinescanToOpticalBar(std::string const& camFile, vw::Vector2i const& imageFize, vw::cartography::Datum const& datum, asp::CsmModel & csm); } // end namespace asp #endif // __ASP_CAMERA_CSM_MODEL_FIT_H__ ================================================ FILE: src/asp/Camera/CsmUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Functions used for handling CSM camera models. #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // Ensure that quaternions don't suddenly change sign. This is a bugfix. void fixQuaternionSigns(UsgsAstroLsSensorModel * ls_model) { // Find the largest magnitude quaternion coefficient and its coordinate int numQuats = ls_model->m_numQuaternions / NUM_QUAT_PARAMS; double max_q = 0.0; int max_j = 0; for (int i = 0; i < numQuats; i++) { double * quat = &ls_model->m_quaternions[NUM_QUAT_PARAMS * i]; for (int j = 0; j < 4; j++) { if (std::abs(quat[j]) > std::abs(max_q)) { max_q = quat[j]; max_j = j; } } } // Ensure the signs are consistent for (int i = 0; i < numQuats; i++) { double * quat = &ls_model->m_quaternions[NUM_QUAT_PARAMS * i]; if (quat[max_j] * max_q < 0) { for (int j = 0; j < 4; j++) { quat[j] *= -1.0; } } } } // Normalize quaternions in UsgsAstroLsSensorModel. void normalizeQuaternions(UsgsAstroLsSensorModel * ls_model) { for (int qit = 0; qit < ls_model->m_numQuaternions / 4; qit++) { double norm = 0.0; for (int coord = 0; coord < 4; coord++) norm += ls_model->m_quaternions[4 * qit + coord] * ls_model->m_quaternions[4 * qit + coord]; norm = sqrt(norm); if (norm == 0) continue; for (int coord = 0; coord < 4; coord++) ls_model->m_quaternions[4 * qit + coord] /= norm; } // Fix any sign issues. This is a bugfix. asp::fixQuaternionSigns(ls_model); return; } // Normalize quaternions in UsgsAstroFrameSensorModel. void normalizeQuaternions(UsgsAstroFrameSensorModel * frame_model) { // Fetch the quaternions. In the model, the positions are stored first, then // the quaternions. double q[4]; double norm = 0.0; for (size_t i = 0; i < 4; i++) { q[i] = frame_model->getParameterValue(i + 3); norm += q[i]*q[i]; } norm = sqrt(norm); if (norm == 0) return; // Normalize the quaternions. Put them back in the model. for (size_t i = 0; i < 4; i++) { q[i] /= norm; frame_model->setParameterValue(i + 3, q[i]); } return; } // Get quaternions. This duplicates the UsgsAstroLsSensorModel function as that one is private void interpQuaternions(UsgsAstroLsSensorModel const* ls_model, double time, double q[4]) { int nOrder = 8; if (ls_model->m_platformFlag == 0) nOrder = 4; int nOrderQuat = nOrder; if (ls_model->m_numQuaternions/4 < 6 && nOrder == 8) nOrderQuat = 4; lagrangeInterp(ls_model->m_numQuaternions / 4, &ls_model->m_quaternions[0], ls_model->m_t0Quat, ls_model->m_dtQuat, time, 4, nOrderQuat, q); } // Get positions. Based on the UsgsAstroLsSensorModel code. void interpPositions(std::vector const& positions, double t0Ephem, double dtEphem, int platformFlag, double time, double pos[3]) { int nOrder = 8; if (platformFlag == 0) nOrder = 4; // This seems to handle gracefully when the number of positions is very small. lagrangeInterp(positions.size() / 3, &positions[0], t0Ephem, dtEphem, time, 3, nOrder, pos); } // Get positions. Based on the UsgsAstroLsSensorModel code. void interpPositions(UsgsAstroLsSensorModel const* ls_model, double time, double pos[3]) { // Call the above wrapper interpPositions(ls_model->m_positions, ls_model->m_t0Ephem, ls_model->m_dtEphem, ls_model->m_platformFlag, time, pos); } // Get positions. Based on the UsgsAstroLsSensorModel code. // TODO(oalexan1): Move this to a new CsmModelUtils.cc file and void interpVelocities(UsgsAstroLsSensorModel const* ls_model, double time, double vel[3]) { int nOrder = 8; if (ls_model->m_platformFlag == 0) nOrder = 4; double sensPosNom[3]; lagrangeInterp(ls_model->m_numPositions / 3, &ls_model->m_velocities[0], ls_model->m_t0Ephem, ls_model->m_dtEphem, time, 3, nOrder, vel); } // Nearest neighbor interpolation into a sequence of vectors of length // vectorLength, stored one after another in valueArray. The result // goes in valueVector. Analogous to lagrangeInterp() in CSM. void nearestNeibInterp(const int &numTimes, const double *valueArray, const double &startTime, const double &delTime, const double &time, const int &vectorLength, double *valueVector) { if (numTimes < 1) vw::vw_throw(vw::ArgumentErr() << "Cannot interpolate into a vector of zero length.\n"); // Compute index int index = round((time - startTime) / delTime); if (index < 0) index = 0; if (index >= numTimes) index = numTimes - 1; int start = index * vectorLength; for (int i = 0; i < vectorLength; i++) valueVector[i] = valueArray[start + i]; return; } // Given two values, double t1, t2, and to points, vw::Vector3 P1, P2, at those // values, find the value at t using linear interpolation. vw::Vector3 linearInterp(double t1, double t2, vw::Vector3 const& P1, vw::Vector3 const& P2, double t) { if (t1 == t2) vw::vw_throw(vw::ArgumentErr() << "Expecting t1 != t2 in interpolation.\n"); double alpha = (t - t1)/(t2 - t1); return P1 + alpha*(P2 - P1); } // - Given a vector of positions with starting time and spacing, and a new // starting time, spacing, and number of points, interpolate the positions at // the new locations. If outside the range, use linear extrapolation. For // that, assume the points are in ECEF, giving an orbit, so first convert to // projected coordinates to make the extrapolated trajectory still go around // the planet rather than go on a tangent. // - Will return the original value at points at which the new time is the same as old // time (within 1e-8 time tolerance). void orbitInterpExtrap(double t0_in, double dt_in, int platformFlag, std::vector const& positions_in, vw::cartography::GeoReference const& geo, double t0_out, double dt_out, int num_out, std::vector & positions_out) { // Wipe the output positions_out.clear(); // Sanity checks if (positions_in.size() < 2 || num_out < 2) vw::vw_throw(vw::ArgumentErr() << "Expecting at least two positions in interpolation.\n"); if (dt_in <= 0.0 || dt_out <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Expecting positive time step in interpolation.\n"); // May need to create new orbital points for interpolation/extrapolation. Start // by putting the existing ones in a map. std::map time_to_pos; for (size_t i = 0; i < positions_in.size()/NUM_XYZ_PARAMS; i++) { double t = t0_in + i * dt_in; int start = i * NUM_XYZ_PARAMS; vw::Vector3 pos(positions_in[start + 0], positions_in[start + 1], positions_in[start + 2]); time_to_pos[t] = pos; } // Add left extrapolated points. Use first two positions for linear extrapolation. // Extrapolation is done in projected coordinates, to stay in orbit, // and then converted back to ECEF. Add at least 8 points to help with Lagrange // interpolation later. auto it = time_to_pos.begin(); vw::Vector3 P0 = it->second; it++; vw::Vector3 P1 = it->second; vw::Vector3 proj0 = vw::cartography::ecefToProj(geo, P0); vw::Vector3 proj1 = vw::cartography::ecefToProj(geo, P1); double t = t0_in; while (t + 8 * dt_in >= t0_out) { t -= dt_in; vw::Vector3 proj = linearInterp(t0_in, t0_in + dt_in, proj0, proj1, t); vw::Vector3 P = vw::cartography::projToEcef(geo, proj); time_to_pos[t] = P; } // Now do the same at the end. Use (t1, P1) for the last point, and (t0, P0) for // the second to last point. Extrapolate to the right of t1. it = time_to_pos.end(); it--; P1 = it->second; double t1 = it->first; it--; double t0 = it->first; P0 = it->second; proj0 = vw::cartography::ecefToProj(geo, P0); proj1 = vw::cartography::ecefToProj(geo, P1); // Add right extrapolated points. Need to have at least 8 to be able to // interpolate using Lagrange. double t_out_end = t0_out + (num_out - 1) * dt_out; t = t1; while (t - 8 * dt_in <= t_out_end) { t += dt_in; vw::Vector3 proj = linearInterp(t0, t1, proj0, proj1, t); vw::Vector3 P = vw::cartography::projToEcef(geo, proj); time_to_pos[t] = P; } // Put all the produced values in the same vector, in order of time int num_extra = time_to_pos.size(); double t0_extra = time_to_pos.begin()->first; double dt_extra = dt_in; std::vector extra_positions(num_extra * NUM_XYZ_PARAMS); int count = 0; for (auto it = time_to_pos.begin(); it != time_to_pos.end(); it++) { vw::Vector3 P = it->second; extra_positions[count*NUM_XYZ_PARAMS + 0] = P[0]; extra_positions[count*NUM_XYZ_PARAMS + 1] = P[1]; extra_positions[count*NUM_XYZ_PARAMS + 2] = P[2]; count++; } // Now we have enough positions to interpolate at positions_out.resize(num_out * NUM_XYZ_PARAMS); for (int i = 0; i < num_out; i++) { double t = t0_out + i * dt_out; // If this is in the input data, just copy the value double i_in_float = (t - t0_in)/dt_in; int i_in = round(i_in_float); // TODO(oalexan1): The check below is sensitive to large t values // and to dt being on the order of 1e-8, which does not happen in practice, // but should be improved, somehow. if (i_in >= 0 && i_in < positions_in.size()/NUM_XYZ_PARAMS && std::abs(t - (t0_in + i_in*dt_in)) < 1e-8) { positions_out[i*NUM_XYZ_PARAMS + 0] = positions_in[i_in*NUM_XYZ_PARAMS + 0]; positions_out[i*NUM_XYZ_PARAMS + 1] = positions_in[i_in*NUM_XYZ_PARAMS + 1]; positions_out[i*NUM_XYZ_PARAMS + 2] = positions_in[i_in*NUM_XYZ_PARAMS + 2]; continue; } double P[3]; interpPositions(extra_positions, t0_extra, dt_extra, platformFlag, t, P); positions_out[i*NUM_XYZ_PARAMS + 0] = P[0]; positions_out[i*NUM_XYZ_PARAMS + 1] = P[1]; positions_out[i*NUM_XYZ_PARAMS + 2] = P[2]; } return; } // Find interpolated/extrapolated positions at all camera pose times. // See the function being called below for more details. void orbitInterpExtrap(UsgsAstroLsSensorModel const * ls_model, vw::cartography::GeoReference const& geo, std::vector & positions_out) { orbitInterpExtrap(ls_model->m_t0Ephem, ls_model->m_dtEphem, ls_model->m_platformFlag, ls_model->m_positions, geo, ls_model->m_t0Quat, ls_model->m_dtQuat, ls_model->m_quaternions.size()/NUM_QUAT_PARAMS, positions_out); // output } // See documentation in CsmUtils.h void populateCsmLinescan(double first_line_time, double dt_line, double t0_ephem, double dt_ephem, double t0_quat, double dt_quat, double focal_length, vw::Vector2 const & optical_center, vw::Vector2i const & image_size, vw::cartography::Datum const & datum, std::string const & sensor_id, std::vector const & positions, std::vector const & velocities, std::vector const & cam2world, // Outputs asp::CsmModel & model) { // Sanity checks if (positions.size() != cam2world.size()) vw_throw(vw::ArgumentErr() << "Expecting as many positions as orientations.\n"); if (velocities.size() != positions.size()) vw_throw(vw::ArgumentErr() << "Expecting as many velocities as positions.\n"); // Do not use a precision below 1.0e-8 as then the linescan model will return junk. model.m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; model.m_semi_major_axis = datum.semi_major_axis(); model.m_semi_minor_axis = datum.semi_minor_axis(); // Create the linescan model. Memory is managed by m_gm_model. model.m_gm_model = boost::make_shared(); UsgsAstroLsSensorModel* ls_model = dynamic_cast(model.m_gm_model.get()); if (ls_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Invalid initialization of the linescan model.\n"); // This performs many initializations apart from the above ls_model->reset(); // Override some initializations ls_model->m_nSamples = image_size[0]; ls_model->m_nLines = image_size[1]; ls_model->m_platformFlag = 1; // Use 1, for order 8 Lagrange interpolation ls_model->m_minElevation = -10000.0; // -10 km ls_model->m_maxElevation = 10000.0; // 10 km ls_model->m_focalLength = focal_length; ls_model->m_zDirection = 1.0; ls_model->m_halfSwath = 1.0; ls_model->m_sensorIdentifier = sensor_id; ls_model->m_majorAxis = model.m_semi_major_axis; ls_model->m_minorAxis = model.m_semi_minor_axis; // The choices below are copied from the DigitalGlobe CSM linescan model. // Better to keep same convention than dig deep inside UsAstroLsSensorModel. // Also keep in mind that a CSM pixel has extra 0.5 added to it. ls_model->m_iTransL[0] = 0.0; ls_model->m_iTransL[1] = 0.0; ls_model->m_iTransL[2] = 1.0; ls_model->m_iTransS[0] = 0.0; ls_model->m_iTransS[1] = 1.0; ls_model->m_iTransS[2] = 0.0; ls_model->m_detectorLineSumming = 1.0; ls_model->m_detectorSampleSumming = 1.0; // Keep these as is. Modify instead m_detectorLineOrigin and // m_detectorSampleOrigin. The effect is same as all USGSCSM code uses // m_detectorLineOrigin - m_startingDetectorLine, and the same for the sample. ls_model->m_startingDetectorLine = 0.0; ls_model->m_startingDetectorSample = 0.0; // Optical center. There is an inconsistency below, but this is what works. ls_model->m_detectorLineOrigin = optical_center[1]; ls_model->m_detectorSampleOrigin = optical_center[0] + 0.5; // Set the time ls_model->m_intTimeLines.push_back(1.0); // to offset CSM's quirky 0.5 additions in places ls_model->m_intTimeStartTimes.push_back(first_line_time); ls_model->m_intTimes.push_back(dt_line); // time between lines // Copy positions and velocities ls_model->m_t0Ephem = t0_ephem; ls_model->m_dtEphem = dt_ephem; ls_model->m_numPositions = 3 * positions.size(); // concatenate all coordinates ls_model->m_positions.resize(ls_model->m_numPositions); ls_model->m_velocities.resize(ls_model->m_numPositions); for (size_t index = 0; index < positions.size(); index++) { vw::Vector3 ctr = positions[index]; vw::Vector3 vel = velocities[index]; for (int coord = 0; coord < 3; coord++) { ls_model->m_positions [3*index + coord] = ctr[coord]; ls_model->m_velocities[3*index + coord] = vel[coord]; } } // Copy orientations ls_model->m_numQuaternions = 4 * cam2world.size(); ls_model->m_t0Quat = t0_quat; ls_model->m_dtQuat = dt_quat; ls_model->m_quaternions.resize(ls_model->m_numQuaternions); for (size_t index = 0; index < cam2world.size(); index++) { auto c2w = cam2world[index]; double x, y, z, w; asp::matrixToQuaternion(c2w, x, y, z, w); // Note how we store the quaternions in the order x, y, z, w, not w, x, y, z. int coord = 0; ls_model->m_quaternions[4*index + coord] = x; coord++; ls_model->m_quaternions[4*index + coord] = y; coord++; ls_model->m_quaternions[4*index + coord] = z; coord++; ls_model->m_quaternions[4*index + coord] = w; coord++; } // Quaternions must always be normalized and not change suddenly in sign. asp::normalizeQuaternions(ls_model); // Use the radtan distortion model with zero distortion ls_model->m_distortionType = RADTAN; ls_model->m_opticalDistCoeffs.resize(5, 0.0); // Re-creating the model from the state forces some operations to // take place which are inaccessible otherwise. std::string modelState = ls_model->getModelState(); ls_model->replaceModelState(modelState); } // Apply the given adjustment to the given CSM camera. // The camera is passed twice, once as a CSM model, and once as a // CamPtr, as the latter may have the CSM model as a member or // as a base class, depending on the implementation. // TODO(oalexan1): This needs to be made uniform. void applyAdjustmentToCsmCamera(std::string const& image_file, std::string const& camera_file, std::string const& adjust_prefix, vw::CamPtr const& cam, asp::CsmModel * csm_cam) { std::string adjust_file = asp::bundle_adjust_file_name(adjust_prefix, image_file, camera_file); vw::vw_out() << "Reading input adjustment: " << adjust_file << std::endl; vw::camera::AdjustedCameraModel adj_cam(vw::camera::unadjusted_model(cam)); adj_cam.read(adjust_file); vw::Matrix4x4 ecef_transform = adj_cam.ecef_transform(); csm_cam->applyTransform(ecef_transform); } // Calc the time of first image line, last image line, elapsed time // between these lines, and elapsed time per line. This assumes a // linear relationship between lines and time. // TODO(oalexan1): This is fragile. Maybe it can be avoided. void calcTimes(UsgsAstroLsSensorModel const* ls_model, double & earlier_line_time, double & later_line_time, double & elapsed_time, double & dt_per_line) { int numLines = ls_model->m_nLines; csm::ImageCoord imagePt; asp::toCsmPixel(vw::Vector2(0, 0), imagePt); earlier_line_time = ls_model->getImageTime(imagePt); asp::toCsmPixel(vw::Vector2(0, numLines - 1), imagePt); later_line_time = ls_model->getImageTime(imagePt); // See note in resampleModel(). if (earlier_line_time > later_line_time) std::swap(earlier_line_time, later_line_time); elapsed_time = later_line_time - earlier_line_time; dt_per_line = elapsed_time / (numLines - 1.0); if (later_line_time <= earlier_line_time) vw::vw_throw(vw::ArgumentErr() << "The time of the last line (in scanning order) must be larger than " << "first line time.\n"); return; } // Calculate the line index for first and last tabulated position. // We always expect these to be less than first line index (0), and no less // than last valid image line index (numLines - 1), respectively. // TODO(oalexan1): This assumes a linear relationship between time and lines, // which is fragile. At least need to check that this assumption is satisfied. void calcFirstLastPositionLines(UsgsAstroLsSensorModel const* ls_model, double & beg_position_line, double & end_position_line) { double earlier_line_time = -1.0, later_line_time = -1.0, elapsed_time = -1.0, dt_per_line = -1.0; calcTimes(ls_model, earlier_line_time, later_line_time, elapsed_time, dt_per_line); // Find time of first and last tabulated position. double bt = ls_model->m_t0Ephem; double et = bt + (ls_model->m_positions.size()/NUM_XYZ_PARAMS - 1) * ls_model->m_dtEphem; // Use the equation: time = earlier_line_time + line * dt_per_line. // See note in resampleModel() about scan direction. beg_position_line = (bt - earlier_line_time) / dt_per_line; end_position_line = (et - earlier_line_time) / dt_per_line; // Sanity checks if (beg_position_line > 1e-3) // allow for rounding errors vw::vw_throw(vw::ArgumentErr() << "Line of first tabulated position is " << beg_position_line << ", which is after first image line, which is " << 0 << ".\n"); int numLines = ls_model->m_nLines; if (end_position_line < numLines - 1 - 1e-3) // allow for rounding errors vw::vw_throw(vw::ArgumentErr() << "Line of last tabulated position is " << end_position_line << ", which is before last image line, which is " << numLines - 1 << ".\n"); } // Calculate the line index for first and last tabulated orientation. // We always expect these to be less than first line index (0), and no less // than last valid image line index (numLines - 1), respectively. void calcFirstLastOrientationLines(UsgsAstroLsSensorModel const* ls_model, double & beg_orientation_line, double & end_orientation_line) { double earlier_line_time = -1.0, later_line_time = -1.0, elapsed_time = -1.0, dt_per_line = -1.0; calcTimes(ls_model, earlier_line_time, later_line_time, elapsed_time, dt_per_line); // Find time of first and last tabulated orientation. double bt = ls_model->m_t0Quat; double et = bt + (ls_model->m_quaternions.size()/NUM_QUAT_PARAMS - 1) * ls_model->m_dtQuat; // Use the equation: time = earlier_line_time + line * dt_per_line. beg_orientation_line = (bt - earlier_line_time) / dt_per_line; end_orientation_line = (et - earlier_line_time) / dt_per_line; // Sanity checks if (beg_orientation_line > 1e-3) // allow for rounding errors vw::vw_throw(vw::ArgumentErr() << "Line of first tabulated orientation is " << beg_orientation_line << ", which is after first image line, which is " << 0 << ".\n"); int numLines = ls_model->m_nLines; if (end_orientation_line < numLines - 1 - 1e-3) // allow for rounding errors vw::vw_throw(vw::ArgumentErr() << "Line of last tabulated orientation is " << end_orientation_line << ", which is before last image line, which is " << numLines - 1 << ".\n"); } // Resample Vector3 data to a denser uniform grid using Lagrange interpolation. // Order = number of interpolation points (4 for cubic, 8 for degree 7). // Factor = output density multiplier: output has (n_in - 1) * factor + 1 points. void resampleVec3Lagrange(std::vector const& in_times, std::vector const& in_vals, int order, int factor, std::vector& out_times, std::vector& out_vals) { int n_in = in_times.size(); int n_out = (n_in - 1) * factor + 1; double t_start = in_times.front(); double t_end = in_times.back(); int radius = order / 2; vw::LagrangianInterpolationVarTime interp(in_vals, in_times, radius); out_times.resize(n_out); out_vals.resize(n_out); for (int i = 0; i < n_out; i++) { out_times[i] = t_start + i * (t_end - t_start) / (n_out - 1.0); out_vals[i] = interp(out_times[i]); } } // Resample quaternion data to a denser uniform grid using Lagrange // interpolation on the quaternion components. The result is normalized. void resampleQuatLagrange(std::vector const& in_times, std::vector> const& in_vals, int order, int factor, std::vector& out_times, std::vector>& out_vals) { int n_in = in_times.size(); int n_out = (n_in - 1) * factor + 1; double t_start = in_times.front(); double t_end = in_times.back(); int radius = order / 2; vw::QuatLagrangianInterpolationVarTime interp(in_vals, in_times, radius); out_times.resize(n_out); out_vals.resize(n_out); for (int i = 0; i < n_out; i++) { out_times[i] = t_start + i * (t_end - t_start) / (n_out - 1.0); out_vals[i] = interp(out_times[i]); } } // Resample quaternion data to a denser uniform grid using SLERP // (spherical linear interpolation between adjacent samples). void resampleQuatSlerp(std::vector const& in_times, std::vector> const& in_vals, int factor, std::vector& out_times, std::vector>& out_vals) { int n_in = in_times.size(); int n_out = (n_in - 1) * factor + 1; double t_start = in_times.front(); double t_end = in_times.back(); double dt_in = (t_end - t_start) / (n_in - 1.0); // Create the same SLERP interpolator used by the old VW linescan paths vw::SLERPPoseInterpolation slerp(in_vals, t_start, dt_in); out_times.resize(n_out); out_vals.resize(n_out); for (int i = 0; i < n_out; i++) { out_times[i] = t_start + i * (t_end - t_start) / (n_out - 1.0); out_vals[i] = slerp(out_times[i]); } } // The provided tabulated positions, velocities and quaternions may be too few, // so resample them with --num-lines-per-position and --num-lines-per-orientation, // if those are set. Throughout this function the lines are indexed in the order // they are acquired, which can be the reverse of the order they are eventually // stored in the file if the scan direction is reverse. // This function assumes the quaternions have been normalized. void resampleModel(int num_lines_per_position, int num_lines_per_orientation, UsgsAstroLsSensorModel * ls_model) { // The positions and quaternions can go way beyond the valid range of image lines, // so need to estimate how many of them are within the range. int numLines = ls_model->m_nLines; vw::vw_out() << "Number of lines: " << numLines << ".\n"; double earlier_line_time = -1.0, later_line_time = -1.0, elapsed_time = -1.0, dt_per_line = -1.0; calcTimes(ls_model, earlier_line_time, later_line_time, elapsed_time, dt_per_line); // Line index of first and last tabulated position double beg_position_line = -1.0, end_position_line = -1.0; calcFirstLastPositionLines(ls_model, beg_position_line, end_position_line); vw::vw_out() << std::setprecision (17) << "Line of first and last tabulated position: " << beg_position_line << ' ' << end_position_line << "\n"; // Line index of first and last tabulated orientation double beg_orientation_line = -1.0, end_orientation_line = -1.0; calcFirstLastOrientationLines(ls_model, beg_orientation_line, end_orientation_line); vw::vw_out() << std::setprecision (17) << "Line of first and last tabulated orientation: " << beg_orientation_line << ' ' << end_orientation_line << "\n"; double numInputLinesPerPosition = (numLines - 1) * ls_model->m_dtEphem / elapsed_time; double numInputLinesPerOrientation = (numLines - 1) * ls_model->m_dtQuat / elapsed_time; vw::vw_out() << "Number of image lines per input position: " << round(numInputLinesPerPosition) << "\n"; vw::vw_out() << "Number of image lines per input orientation: " << round(numInputLinesPerOrientation) << "\n"; if (num_lines_per_position > 0) { // Resample in such a way that first and last samples are preserved. This is tricky. double posFactor = double(numInputLinesPerPosition) / double(num_lines_per_position); if (posFactor <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Invalid image.\n"); int numOldMeas = ls_model->m_numPositions / NUM_XYZ_PARAMS; int numNewMeas = round(posFactor * (numOldMeas - 1.0)) + 1; // careful here numNewMeas = std::max(numNewMeas, 2); posFactor = double(numNewMeas - 1.0) / double(numOldMeas - 1.0); double currDtEphem = ls_model->m_dtEphem / posFactor; double numLinesPerPosition = (numLines - 1.0) * currDtEphem / elapsed_time; vw::vw_out() << "Resampled number of lines per position: " << numLinesPerPosition << "\n"; std::vector positions(NUM_XYZ_PARAMS * numNewMeas, 0); std::vector velocities(NUM_XYZ_PARAMS * numNewMeas, 0); for (int ipos = 0; ipos < numNewMeas; ipos++) { double time = ls_model->m_t0Ephem + ipos * currDtEphem; asp::interpPositions(ls_model, time, &positions[NUM_XYZ_PARAMS * ipos]); asp::interpVelocities(ls_model, time, &velocities[NUM_XYZ_PARAMS * ipos]); } // Overwrite in the model. Time of first tabulated position does not change. ls_model->m_dtEphem = currDtEphem; ls_model->m_numPositions = positions.size(); ls_model->m_positions = positions; ls_model->m_velocities = velocities; // Sanity check double new_beg_position_line = -1.0, new_end_position_line = -1.0; calcFirstLastPositionLines(ls_model, new_beg_position_line, new_end_position_line); if (std::abs(beg_position_line - new_beg_position_line) > 1.0e-3 || std::abs(end_position_line - new_end_position_line) > 1.0e-3) vw::vw_throw(vw::ArgumentErr() << "Bookkeeping failure. Resampling was done " << "without preserving first and last tabulated position time.\n"); } if (num_lines_per_orientation > 0) { // Resample in such a way that first and last samples are preserved. This is tricky. double posFactor = double(numInputLinesPerOrientation) / double(num_lines_per_orientation); if (posFactor <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Invalid image.\n"); int numOldMeas = ls_model->m_numQuaternions / NUM_QUAT_PARAMS; int numNewMeas = round(posFactor * (numOldMeas - 1.0)) + 1; // careful here numNewMeas = std::max(numNewMeas, 2); posFactor = double(numNewMeas - 1.0) / double(numOldMeas - 1.0); double currDtQuat = ls_model->m_dtQuat / posFactor; double numLinesPerOrientation = (numLines - 1.0) * currDtQuat / elapsed_time; vw::vw_out() << "Resampled number of lines per orientation: " << numLinesPerOrientation << "\n"; std::vector quaternions(NUM_QUAT_PARAMS * numNewMeas, 0); for (int ipos = 0; ipos < numNewMeas; ipos++) { double time = ls_model->m_t0Quat + ipos * currDtQuat; asp::interpQuaternions(ls_model, time, &quaternions[NUM_QUAT_PARAMS * ipos]); } // Overwrite in the model. Time of first tabulated orientation does not change. ls_model->m_dtQuat = currDtQuat; ls_model->m_numQuaternions = quaternions.size(); ls_model->m_quaternions = quaternions; // Sanity check double new_beg_orientation_line = -1.0, new_end_orientation_line = -1.0; calcFirstLastOrientationLines(ls_model, new_beg_orientation_line, new_end_orientation_line); if (std::abs(beg_orientation_line - new_beg_orientation_line) > 1.0e-3 || std::abs(end_orientation_line - new_end_orientation_line) > 1.0e-3) vw::vw_throw(vw::ArgumentErr() << "Bookkeeping failure. Resampling was done " << "without preserving first and last tabulated orientation time.\n"); } return; } // Get the time at a given line. double get_time_at_line(double line, UsgsAstroLsSensorModel const* ls_model) { csm::ImageCoord csm_pix; vw::Vector2 pix(0, line); asp::toCsmPixel(pix, csm_pix); return ls_model->getImageTime(csm_pix); } // Get the line number at a given time. This assumes a linear relationship // between them (rather than piecewise linear). double get_line_at_time(double time, UsgsAstroLsSensorModel const* ls_model) { // All dt values in m_ls_model->m_intTimes must be equal, or else // the model is not linear in time. for (size_t i = 1; i < ls_model->m_intTimeLines.size(); i++) { if (std::abs(ls_model->m_intTimes[i] - ls_model->m_intTimes[0]) > 1e-10) vw::vw_throw(vw::ArgumentErr() << "Expecting a linear relation between time and image lines.\n"); } int line0 = 0; int line1 = ls_model->m_nLines - 1; double time0 = get_time_at_line(line0, ls_model); double time1 = get_time_at_line(line1, ls_model); return line0 + (line1 - line0) * (time - time0) / (time1 - time0); } // Get camera center at a given time vw::Vector3 get_camera_center_at_time(double time, UsgsAstroLsSensorModel const* ls_model) { csm::EcefCoord ecef = ls_model->getSensorPosition(time); return vw::Vector3(ecef.x, ecef.y, ecef.z); } // Get camera velocity at a given time vw::Vector3 get_camera_velocity_at_time(double time, UsgsAstroLsSensorModel const* ls_model) { csm::EcefVector ecef = ls_model->getSensorVelocity(time); return vw::Vector3(ecef.x, ecef.y, ecef.z); } // Re implementation of the CSM wrapper around the USGS function for going from // a pixel to a ray. Need it because cannot access the CSM model given the ls model. vw::Vector3 pixel_to_vector(vw::Vector2 const& pix, UsgsAstroLsSensorModel const* ls_model, double desired_precision) { csm::ImageCoord csm_pix; asp::toCsmPixel(pix, csm_pix); double achievedPrecision = -1.0; // will be modified in the function csm::EcefLocus locus = ls_model->imageToRemoteImagingLocus(csm_pix, desired_precision, &achievedPrecision); vw::Vector3 dir = ecefVectorToVector(locus.direction); return dir; } // Adjust the linescan model to correct for velocity aberration and/or // atmospheric refraction. void orbitalCorrections(asp::CsmModel * csm_model, bool correct_velocity_aberration, bool correct_atmospheric_refraction, double local_earth_radius, double mean_ground_elevation) { UsgsAstroLsSensorModel *ls_model = dynamic_cast(csm_model->m_gm_model.get()); if (ls_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Invalid initialization of the linescan model.\n"); // Collect the updated quaternions in a separate vector, to not interfere // with using the current ones during the correction process. std::vector updated_quats(ls_model->m_quaternions.size()); auto & qv = ls_model->m_quaternions; // shorthand for (int pos_it = 0; pos_it < ls_model->m_numQuaternions / 4; pos_it++) { double t = ls_model->m_t0Quat + pos_it * ls_model->m_dtQuat; vw::Vector3 cam_ctr = asp::get_camera_center_at_time(t, ls_model); vw::Vector3 vel = asp::get_camera_velocity_at_time(t, ls_model); // Get back to VW quaternion format vw::Quat q(qv[4*pos_it + 3], qv[4*pos_it + 0], qv[4*pos_it + 1], qv[4*pos_it + 2]); // Find the line at the given time based on a linear fit double line = asp::get_line_at_time(t, ls_model); // Find the cam_direction at the center of the line vw::Vector2 pix(ls_model->m_nSamples/2.0, line); vw::Vector3 cam_dir = csm_model->pixel_to_vector(pix); vw::Quaternion corr_rot; if (correct_atmospheric_refraction) { // Find and apply the atmospheric refraction correction cam_dir = vw::camera::apply_atmospheric_refraction_correction (cam_ctr, local_earth_radius, mean_ground_elevation, cam_dir, corr_rot); // output q = corr_rot * q; } if (correct_velocity_aberration) { // Find and apply the velocity aberration correction cam_dir = vw::camera::apply_velocity_aberration_correction (cam_ctr, vel, local_earth_radius, cam_dir, corr_rot); // output q = corr_rot * q; } // Create the updated quaternions. ASP stores the quaternions as (w, x, y, // z). CSM wants them as x, y, z, w. updated_quats[4*pos_it + 0] = q.x(); updated_quats[4*pos_it + 1] = q.y(); updated_quats[4*pos_it + 2] = q.z(); updated_quats[4*pos_it + 3] = q.w(); } // Replace with the updated quaternions ls_model->m_quaternions = updated_quats; } } // end namespace asp ================================================ FILE: src/asp/Camera/CsmUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CsmUtils.h // Functions used for handling CSM camera models. #ifndef __ASP_CAMERA_CSM_UTILS_H__ #define __ASP_CAMERA_CSM_UTILS_H__ #include #include #include #include #include #include #include class UsgsAstroFrameSensorModel; class UsgsAstroLsSensorModel; namespace vw { namespace cartography { class Datum; class GeoReference; } } namespace asp { class CsmModel; // Normalize quaternions in UsgsAstroLsSensorModel. void normalizeQuaternions(UsgsAstroLsSensorModel * ls_model); // Normalize quaternions in UsgsAstroFrameSensorModel. void normalizeQuaternions(UsgsAstroFrameSensorModel * frame_model); // Get quaternions. This duplicates the UsgsAstroLsSensorModel function as that one is private void interpQuaternions(UsgsAstroLsSensorModel const* ls_model, double time, double q[4]); // Get positions. Based on the UsgsAstroLsSensorModel code. void interpPositions(UsgsAstroLsSensorModel const* ls_model, double time, double pos[3]); // Get velocities. Based on the UsgsAstroLsSensorModel code. void interpVelocities(UsgsAstroLsSensorModel const* ls_model, double time, double vel[3]); // Nearest neighbor interpolation into a sequence of vectors of length // vectorLength, stored one after another in valueArray. The result // goes in valueVector. Analogous to lagrangeInterp() in CSM. void nearestNeibInterp(const int &numTimes, const double *valueArray, const double &startTime, const double &delTime, const double &time, const int &vectorLength, double *valueVector); // Find interpolated/extrapolated positions at all camera pose times. // See the implementation for more details. void orbitInterpExtrap(UsgsAstroLsSensorModel const * ls_model, vw::cartography::GeoReference const& geo, std::vector & positions_out); // Populate the CSM model with the given camera positions and orientations. // TODO(oalexan1): Use this in LinescanDGModel.cc. void populateCsmLinescan(double first_line_time, double dt_line, double t0_ephem, double dt_ephem, double t0_quat, double dt_quat, double focal_length, vw::Vector2 const & optical_center, vw::Vector2i const & image_size, vw::cartography::Datum const & datum, std::string const & sensor_id, std::vector const & positions, std::vector const & velocities, std::vector const & cam2world, // Outputs asp::CsmModel & model); // Apply the given adjustment to the given CSM camera. // The camera is passed twice, once as a CSM model, and once as a // CamPtr, as the latter may have the CSM model as a member or // as a base class, depending on the implementation. // TODO(oalexan1): This needs to be made uniform. void applyAdjustmentToCsmCamera(std::string const& image_file, std::string const& camera_file, std::string const& adjust_prefix, vw::CamPtr const& cam, asp::CsmModel * csm_cam); // Resample Vector3 data (positions or velocities) to a denser uniform grid // using Lagrange interpolation. Order = number of interpolation points // (e.g., 4 for cubic, 8 for degree 7). Factor = output density multiplier: // output has (n_in - 1) * factor + 1 points. void resampleVec3Lagrange(std::vector const& in_times, std::vector const& in_vals, int order, int factor, std::vector& out_times, std::vector& out_vals); // Resample quaternion data to a denser uniform grid using Lagrange // interpolation on the quaternion components. Order and factor are as above. void resampleQuatLagrange(std::vector const& in_times, std::vector> const& in_vals, int order, int factor, std::vector& out_times, std::vector>& out_vals); // Resample quaternion data to a denser uniform grid using SLERP // (spherical linear interpolation between adjacent samples). // Factor = output density multiplier. void resampleQuatSlerp(std::vector const& in_times, std::vector> const& in_vals, int factor, std::vector& out_times, std::vector>& out_vals); // Resample a model using Lagrange interpolation. void resampleModel(int num_lines_per_position, int num_lines_per_orientation, UsgsAstroLsSensorModel * ls_model); // Get the time at a given line. double get_time_at_line(double line, UsgsAstroLsSensorModel const* ls_model); // Get the line number at a given time. This assumes a linear relationship // between them (rather than piecewise linear). double get_line_at_time(double time, UsgsAstroLsSensorModel const* ls_model); // Get camera center at a given time vw::Vector3 get_camera_center_at_time(double time, UsgsAstroLsSensorModel const* ls_model); // Get camera velocity at a given time vw::Vector3 get_camera_velocity_at_time(double time, UsgsAstroLsSensorModel const* ls_model); // Adjust the linescan model to correct for velocity aberration and/or // atmospheric refraction. void orbitalCorrections(asp::CsmModel * csm_model, bool correct_velocity_aberration, bool correct_atmospheric_refraction, double local_earth_radius, double mean_ground_elevation); } // end namespace asp #endif//__ASP_CAMERA_CSM_UTILS_H__ ================================================ FILE: src/asp/Camera/JitterSolveCostFuns.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Cost functions used in solving for jitter. These need access to the camera models, // so they are stored in the Camera folder. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // An error function minimizing the error of projecting an xyz point // into a given CSM linescan camera pixel. The variables of optimization are a // portion of the position and quaternion variables affected by this, and the // triangulation point. struct LsPixelReprojErr { LsPixelReprojErr(vw::Vector2 const& observation, double weight, UsgsAstroLsSensorModel* ls_model, int begQuatIndex, int endQuatIndex, int begPosIndex, int endPosIndex): m_observation(observation), m_weight(weight), m_begQuatIndex(begQuatIndex), m_endQuatIndex(endQuatIndex), m_begPosIndex(begPosIndex), m_endPosIndex(endPosIndex), m_ls_model(ls_model) {} // The implementation is further down bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(vw::Vector2 const& observation, double weight, UsgsAstroLsSensorModel* ls_model, int begQuatIndex, int endQuatIndex, int begPosIndex, int endPosIndex) { // TODO(oalexan1): Try using here the analytical cost function ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new LsPixelReprojErr(observation, weight, ls_model, begQuatIndex, endQuatIndex, begPosIndex, endPosIndex)); // The residual size is always the same. cost_function->SetNumResiduals(PIXEL_SIZE); // Add a parameter block for each quaternion and each position for (int it = begQuatIndex; it < endQuatIndex; it++) cost_function->AddParameterBlock(NUM_QUAT_PARAMS); for (int it = begPosIndex; it < endPosIndex; it++) cost_function->AddParameterBlock(NUM_XYZ_PARAMS); // Add a parameter block for the xyz point cost_function->AddParameterBlock(NUM_XYZ_PARAMS); return cost_function; } private: vw::Vector2 m_observation; // The pixel observation for this camera/point pair double m_weight; UsgsAstroLsSensorModel* m_ls_model; int m_begQuatIndex, m_endQuatIndex; int m_begPosIndex, m_endPosIndex; }; // End class LsPixelReprojErr // An error function minimizing the error of projecting an xyz point // into a given CSM Frame camera pixel. The variables of optimization are // the camera position, quaternion, and triangulation point. struct FramePixelReprojErr { FramePixelReprojErr(vw::Vector2 const& observation, double weight, UsgsAstroFrameSensorModel* frame_model): m_observation(observation), m_weight(weight), m_frame_model(frame_model) {} // The implementation is further down bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(vw::Vector2 const& observation, double weight, UsgsAstroFrameSensorModel* frame_model) { // TODO(oalexan1): Try using here the analytical cost function ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new FramePixelReprojErr(observation, weight, frame_model)); // The residual size is always the same. cost_function->SetNumResiduals(PIXEL_SIZE); // Add a parameter block for each position and quaternion, in this order cost_function->AddParameterBlock(NUM_XYZ_PARAMS); cost_function->AddParameterBlock(NUM_QUAT_PARAMS); // Add a parameter block for the xyz point cost_function->AddParameterBlock(NUM_XYZ_PARAMS); return cost_function; } private: vw::Vector2 m_observation; // The pixel observation for this camera/point pair double m_weight; UsgsAstroFrameSensorModel* m_frame_model; }; // End class FramePixelReprojErr // Update the linescan model with the latest optimized values of the position // and quaternion parameters. Also update the triangulated point. void updateLsModelTriPt(double const * const * parameters, int begQuatIndex, int endQuatIndex, int begPosIndex, int endPosIndex, int & param_shift, UsgsAstroLsSensorModel & cam, csm::EcefCoord & P) { // Start at the first param param_shift = 0; // Update the relevant quaternions in the local copy for (int qi = begQuatIndex; qi < endQuatIndex; qi++) { for (int coord = 0; coord < NUM_QUAT_PARAMS; coord++) { cam.m_quaternions[NUM_QUAT_PARAMS * qi + coord] = parameters[qi + param_shift - begQuatIndex][coord]; } } // Same for the positions. Note how we move forward in the parameters array, // as this is after the quaternions param_shift += (endQuatIndex - begQuatIndex); for (int pi = begPosIndex; pi < endPosIndex; pi++) { for (int coord = 0; coord < NUM_XYZ_PARAMS; coord++) { cam.m_positions[NUM_XYZ_PARAMS * pi + coord] = parameters[pi + param_shift - begPosIndex][coord]; } } // Move forward in the array of parameters, then recover the triangulated point param_shift += (endPosIndex - begPosIndex); P.x = parameters[param_shift][0]; P.y = parameters[param_shift][1]; P.z = parameters[param_shift][2]; } // See the documentation higher up in the file. bool LsPixelReprojErr::operator()(double const * const * parameters, double * residuals) const { try { // Make a copy of the model, as we will update quaternion and position // values that are being modified now. This may be expensive. // Update the shift too. UsgsAstroLsSensorModel cam = *m_ls_model; int shift = 0; csm::EcefCoord P; updateLsModelTriPt(parameters, m_begQuatIndex, m_endQuatIndex, m_begPosIndex, m_endPosIndex, shift, cam, P); // Project in the camera with high precision. Do not use here // anything lower than 1e-8, as the linescan model will then // return junk. double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; csm::ImageCoord imagePt = cam.groundToImage(P, desired_precision); // Convert to what ASP expects vw::Vector2 pix; asp::fromCsmPixel(pix, imagePt); residuals[0] = m_weight*(pix[0] - m_observation[0]); residuals[1] = m_weight*(pix[1] - m_observation[1]); } catch (std::exception const& e) { residuals[0] = g_big_pixel_value; residuals[1] = g_big_pixel_value; return true; // accept the solution anyway } return true; } // See the .h file for the documentation. bool FramePixelReprojErr::operator()(double const * const * parameters, double * residuals) const { try { // Make a copy of the model, as we will update position and quaternion // values that are being modified now. Use the same order as in // UsgsAstroFrameSensorModel::m_currentParameterValue. UsgsAstroFrameSensorModel cam = *m_frame_model; // The latest position is in parameters[0]. for (int coord = 0; coord < NUM_XYZ_PARAMS; coord++) cam.setParameterValue(coord, parameters[0][coord]); // The latest quaternion is in parameters[1]. Note how we below // move forward when invoking cam.setParameterValue(). for (int coord = 0; coord < NUM_QUAT_PARAMS; coord++) cam.setParameterValue(coord + NUM_XYZ_PARAMS, parameters[1][coord]); // The triangulation parameter is after the position and orientation csm::EcefCoord P; P.x = parameters[2][0]; P.y = parameters[2][1]; P.z = parameters[2][2]; // Project in the camera with high precision. Do not use here // anything lower than 1e-8, as the linescan model will then // return junk. double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; csm::ImageCoord imagePt = cam.groundToImage(P, desired_precision); // Convert to what ASP expects vw::Vector2 pix; asp::fromCsmPixel(pix, imagePt); residuals[0] = m_weight*(pix[0] - m_observation[0]); residuals[1] = m_weight*(pix[1] - m_observation[1]); } catch (std::exception const& e) { residuals[0] = g_big_pixel_value; residuals[1] = g_big_pixel_value; return true; // accept the solution anyway } return true; } // A Ceres cost function. The residual is the roll and/or yaw component of the camera // rotation, as measured relative to the initial along-track direction. We assume // that all positions are along the same segment in projected coordinates, or at // least that the current position and its nearest neighbors are roughly on // such a segment. That one is used to measure the roll/yaw from. This is consistent // with how sat_sim creates the cameras. struct weightedRollYawError { weightedRollYawError(std::vector const& positions, std::vector const& quaternions, vw::cartography::GeoReference const& georef, int cur_pos, double rollWeight, double yawWeight, bool initial_camera_constraint); // Compute the weighted roll/yaw error between the current position and along-track // direction. Recall that quaternion = cam2world = sat2World * rollPitchYaw * rotXY. // rollPitchYaw is variable and can have jitter. Extract from it roll, pitch, bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(std::vector const& positions, std::vector const& quaternions, vw::cartography::GeoReference const& georef, int cur_pos, double rollWeight, double yawWeight, bool initial_camera_constraint) { ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new weightedRollYawError(positions, quaternions, georef, cur_pos, rollWeight, yawWeight, initial_camera_constraint)); cost_function->SetNumResiduals(2); // for roll and yaw cost_function->AddParameterBlock(NUM_QUAT_PARAMS); return cost_function; } double m_rollWeight, m_yawWeight; vw::Matrix3x3 m_rotXY, m_sat2World, m_initCam2World; bool m_initial_camera_constraint; }; // Constructor for weightedRollYawError. See the .h file for the documentation. weightedRollYawError::weightedRollYawError (std::vector const& positions, std::vector const& quaternions, vw::cartography::GeoReference const& georef, int cur_pos, double rollWeight, double yawWeight, bool initial_camera_constraint): m_rollWeight(rollWeight), m_yawWeight(yawWeight), m_initial_camera_constraint(initial_camera_constraint) { int num_pos = positions.size()/NUM_XYZ_PARAMS; int num_quat = quaternions.size()/NUM_QUAT_PARAMS; if (num_pos != num_quat) vw::vw_throw(vw::ArgumentErr() << "weightedRollYawError: Expecting the same number of positions and quaternions.\n"); if (cur_pos < 0 || cur_pos >= num_pos) vw::vw_throw(vw::ArgumentErr() << "weightedRollYawError: Expecting position index in range.\n"); // Find the nearest neighbors of the current position int beg_pos = std::max(0, cur_pos - 1); int end_pos = std::min(num_pos - 1, cur_pos + 1); if (beg_pos >= end_pos) vw::vw_throw(vw::ArgumentErr() << "weightedRollYawError: Expecting at least 2 camera positions.\n"); // Find the segment along which the cameras are located, in projected coordinates // Here we mirror the logic from SatSim.cc int b = beg_pos * NUM_XYZ_PARAMS; int c = cur_pos * NUM_XYZ_PARAMS; int e = end_pos * NUM_XYZ_PARAMS; vw::Vector3 beg_pt(positions[b], positions[b+1], positions[b+2]); vw::Vector3 cur_pt(positions[c], positions[c+1], positions[c+2]); vw::Vector3 end_pt(positions[e], positions[e+1], positions[e+2]); // Orbital points before the current one, the current one, and after the // current one, in projected coordinates vw::Vector3 beg_proj = vw::cartography::ecefToProj(georef, beg_pt); vw::Vector3 cur_proj = vw::cartography::ecefToProj(georef, cur_pt); vw::Vector3 end_proj = vw::cartography::ecefToProj(georef, end_pt); // Find satellite along and across track directions in projected coordinates vw::Vector3 proj_along, proj_across; asp::calcProjAlongAcross(beg_proj, end_proj, proj_along, proj_across); // Find along and across in ECEF vw::Vector3 along, across; asp::calcEcefAlongAcross(georef, asp::satSimDelta(), proj_along, proj_across, cur_proj, along, across); // outputs // Find the z vector as perpendicular to both along and across vw::Vector3 down = vw::math::cross_prod(along, across); down = down / norm_2(down); // Find the rotation matrix from satellite to world coordinates, and 90 // degree in-camera rotation. It is assumed, as in sat_sim, that: // cam2world = sat2World * rollPitchYaw * rotXY. asp::assembleCam2WorldMatrix(along, across, down, m_sat2World); m_rotXY = asp::rotationXY(); // Initial camera rotation matrix, before we optimize it m_initCam2World = asp::quaternionToMatrix(&quaternions[cur_pos*NUM_QUAT_PARAMS]); } // See the .h file for the documentation. bool weightedRollYawError::operator()(double const * const * parameters, double * residuals) const { // Convert to rotation matrix. Order of quaternion is x, y, z, w. vw::Matrix3x3 cam2world = asp::quaternionToMatrix(parameters[0]); if (m_initial_camera_constraint) { // Find the new camera orientation relative to the initial camera, not // relative to the satellite along-track direction. Then find the roll and // yaw from it. This is experimental. vw::Matrix3x3 cam2cam = vw::math::inverse(cam2world) * m_initCam2World; double roll = 0.0, pitch = 0.0, yaw = 0.0; rollPitchYawFromRotationMatrix(cam2cam, roll, pitch, yaw); // Fix for roll / yaw being determined with +/- 180 degree ambiguity. roll = roll - 180.0 * round(roll / 180.0); pitch = pitch - 180.0 * round(pitch / 180.0); yaw = yaw - 180.0 * round(yaw / 180.0); // Roll, pitch, yaw in camera coordinates are pitch, roll, yaw in satellite // coordinates. So adjust below accordingly. // CERES is very tolerant if one of the weights used below is 0. So there is // no need to use a special cost function for such cases. residuals[0] = pitch * m_rollWeight; // per above, swap roll and pitch residuals[1] = yaw * m_yawWeight; return true; } vw::Matrix3x3 rollPitchYaw = vw::math::inverse(m_sat2World) * cam2world * vw::math::inverse(m_rotXY); double roll = 0.0, pitch = 0.0, yaw = 0.0; rollPitchYawFromRotationMatrix(rollPitchYaw, roll, pitch, yaw); // Fix for roll / yaw being determined with +/- 180 degree ambiguity. roll = roll - 180.0 * round(roll / 180.0); pitch = pitch - 180.0 * round(pitch / 180.0); yaw = yaw - 180.0 * round(yaw / 180.0); // CERES is very tolerant if one of the weights used below is 0. So there is // no need to use a special cost function for such cases. residuals[0] = roll * m_rollWeight; residuals[1] = yaw * m_yawWeight; return true; } // Calc the range of indices in the samples needed to interpolate between time1 and time2. // Based on lagrangeInterp() in usgscsm. void calcIndexBounds(double time1, double time2, double t0, double dt, int numVals, // Outputs int & begIndex, int & endIndex) { // Order of Lagrange interpolation int numInterpSamples = 8; // Starting and ending index (ending is exclusive). int index1 = static_cast((time1 - t0) / dt); int index2 = static_cast((time2 - t0) / dt); // TODO(oalexan1): Maybe the indices should be more generous, so not adding 1 // to begIndex, even though what is here seems correct according to // lagrangeInterp(). begIndex = std::min(index1, index2) - numInterpSamples / 2 + 1; endIndex = std::max(index1, index2) + numInterpSamples / 2 + 1; // Keep in bounds begIndex = std::max(0, begIndex); endIndex = std::min(endIndex, numVals); // This can happen with wildly out-of-range anchor points. if (begIndex >= endIndex) vw::vw_throw(vw::ArgumentErr() << "Out-of-range interpolation indices.\n"); return; } // Find the positions and orientations in the current linescan model // that can affect the given pixel. void calcPosQuatIndexBounds(double line_extra, UsgsAstroLsSensorModel * ls_model, vw::Vector2 const& observation, // Outputs int & begPosIndex, int & endPosIndex, int & begQuatIndex, int & endQuatIndex) { // Initialize the outputs begPosIndex = -1; endPosIndex = -1; begQuatIndex = -1; endQuatIndex = -1; csm::ImageCoord imagePt1, imagePt2; asp::toCsmPixel(observation - vw::Vector2(0.0, line_extra), imagePt1); asp::toCsmPixel(observation + vw::Vector2(0.0, line_extra), imagePt2); double time1 = ls_model->getImageTime(imagePt1); double time2 = ls_model->getImageTime(imagePt2); // Positions int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS; double posT0 = ls_model->m_t0Ephem; double posDt = ls_model->m_dtEphem; calcIndexBounds(time1, time2, posT0, posDt, numPos, begPosIndex, endPosIndex); // outputs // Quaternions int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; double quatT0 = ls_model->m_t0Quat; double quatDt = ls_model->m_dtQuat; calcIndexBounds(time1, time2, quatT0, quatDt, numQuat, begQuatIndex, endQuatIndex); // outputs return; } // Add the linescan model reprojection error to the cost function void addLsReprojectionErr(asp::BaBaseOptions const& opt, UsgsAstroLsSensorModel * ls_model, vw::Vector2 const& observation, double * tri_point, double weight, ceres::Problem & problem) { // Find all positions and quaternions that can affect the current pixel. Must // grow the number of quaternions and positions a bit because during // optimization the 3D point and corresponding pixel may move somewhat. double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case int begPosIndex = -1, endPosIndex = -1; int begQuatIndex = -1, endQuatIndex = -1; calcPosQuatIndexBounds(line_extra, ls_model, observation, begPosIndex, endPosIndex, begQuatIndex, endQuatIndex); // outputs ceres::CostFunction* pixel_cost_function = LsPixelReprojErr::Create(observation, weight, ls_model, begQuatIndex, endQuatIndex, begPosIndex, endPosIndex); ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold); // The variable of optimization are camera quaternions and positions stored in the // camera models, and the triangulated point. std::vector vars; for (int it = begQuatIndex; it < endQuatIndex; it++) vars.push_back(&ls_model->m_quaternions[it * NUM_QUAT_PARAMS]); for (int it = begPosIndex; it < endPosIndex; it++) vars.push_back(&ls_model->m_positions[it * NUM_XYZ_PARAMS]); vars.push_back(tri_point); problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars); return; } // Add the frame camera model reprojection error to the cost function void addFrameReprojectionErr(asp::BaBaseOptions const & opt, UsgsAstroFrameSensorModel * frame_model, vw::Vector2 const & observation, double * frame_params, double * tri_point, double weight, ceres::Problem & problem) { ceres::CostFunction* pixel_cost_function = FramePixelReprojErr::Create(observation, weight, frame_model); ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold); // The variable of optimization are camera positions and quaternion stored // in frame_cam_params, in this order, and the triangulated point. // This is different from the linescan model, where we can directly access // these quantities inside the model, so they need not be stored separately. std::vector vars; vars.push_back(&frame_params[0]); // positions start here vars.push_back(&frame_params[NUM_XYZ_PARAMS]); // quaternions start here vars.push_back(tri_point); problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars); return; } // Add the ls or frame camera model reprojection error to the cost function void addLsOrFrameReprojectionErr(asp::BaBaseOptions const & opt, int icam, UsgsAstroLsSensorModel * ls_model, UsgsAstroFrameSensorModel * frame_model, std::vector & frame_params, vw::Vector2 const & pix_obs, double pix_wt, double * tri_point, ceres::Problem & problem) { // Note how for the frame model we pass the frame_params for the current camera. // For the linescan cameras the params are changed inside the model. if (ls_model != NULL) addLsReprojectionErr(opt, ls_model, pix_obs, tri_point, pix_wt, problem); else if (frame_model != NULL) addFrameReprojectionErr(opt, frame_model, pix_obs, &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)], tri_point, pix_wt, problem); else vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } /// A ceres cost function. The residual is the difference between the observed /// 3D point and the current (floating) 3D point, multiplied by given weight. struct weightedXyzError { weightedXyzError(vw::Vector3 const& observation, double weight): m_observation(observation), m_weight(weight) {} template bool operator()(const T* point, T* residuals) const { for (size_t p = 0; p < m_observation.size(); p++) residuals[p] = m_weight * (point[p] - m_observation[p]); return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(vw::Vector3 const& observation, double const& weight) { return (new ceres::AutoDiffCostFunction (new weightedXyzError(observation, weight))); } vw::Vector3 m_observation; double m_weight; }; /// A Ceres cost function. The residual is the difference between the /// initial quaternion and optimized quaternion, multiplied by given weight. struct weightedRotationError { weightedRotationError(const double * init_quat, double weight): m_weight(weight) { // Make a copy, as later the value at the pointer will change m_init_quat.resize(NUM_QUAT_PARAMS); for (int it = 0; it < NUM_QUAT_PARAMS; it++) m_init_quat[it] = init_quat[it]; } template bool operator()(const T* quat, T* residuals) const { for (size_t p = 0; p < m_init_quat.size(); p++) residuals[p] = m_weight * (quat[p] - m_init_quat[p]); return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(const double * init_quat, double weight) { return (new ceres::AutoDiffCostFunction (new weightedRotationError(init_quat, weight))); } std::vector m_init_quat; double m_weight; }; /// A Ceres cost function. The residual is the difference between the /// initial position and optimized position, multiplied by given weight. struct weightedTranslationError { weightedTranslationError(const double * init_position, double weight): m_weight(weight) { // Make a copy, as later the value at the pointer will change m_init_position.resize(NUM_XYZ_PARAMS); for (int it = 0; it < NUM_XYZ_PARAMS; it++) m_init_position[it] = init_position[it]; } template bool operator()(const T* position, T* residuals) const { for (size_t p = 0; p < m_init_position.size(); p++) residuals[p] = m_weight * (position[p] - m_init_position[p]); return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(const double * init_position, double weight) { return (new ceres::AutoDiffCostFunction (new weightedTranslationError(init_position, weight))); } std::vector m_init_position; double m_weight; }; /// A Ceres cost function. The residual is the weighted difference between 1 and /// norm of quaternion. struct weightedQuatNormError { weightedQuatNormError(double weight): m_weight(weight) {} template bool operator()(const T* quat, T* residuals) const { residuals[0] = T(0.0); for (size_t p = 0; p < NUM_QUAT_PARAMS; p++) residuals[0] += quat[p] * quat[p]; residuals[0] = m_weight * (residuals[0] - 1.0); return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double weight) { return (new ceres::AutoDiffCostFunction (new weightedQuatNormError(weight))); } double m_weight; }; // Add reprojection errors. Collect data that will be used to add camera // constraints that scale with the number of reprojection errors and GSD. void addReprojCamErrs(asp::BaBaseOptions const & opt, asp::CRN const & crn, std::vector> const & pixel_vec, std::vector> const & weight_vec, std::vector> const & isAnchor_vec, std::vector> const & pix2xyz_index, std::vector const & csm_models, bool have_rig, rig::RigSet const & rig, std::vector const & rig_cam_info, std::map const & cam2group, TimestampMap const & timestamp_map, bool fix_rig_translations, bool fix_rig_rotations, // Outputs std::vector & tri_points_vec, std::vector & frame_params, std::vector & weight_per_residual, std::vector> & weight_per_cam, std::vector> & count_per_cam, std::vector & ref_to_curr_sensor_vec, ceres::Problem & problem) { // Do here two passes, first for non-anchor points and then for anchor ones. // This way it is easier to do the bookkeeping when saving the residuals. // Note: The same motions as here are repeated in saveJitterResiduals(). weight_per_cam.resize(2); count_per_cam.resize(2); for (int pass = 0; pass < 2; pass++) { weight_per_cam[pass].resize((int)crn.size(), 0.0); count_per_cam[pass].resize((int)crn.size(), 0.0); for (int icam = 0; icam < (int)crn.size(); icam++) { vw::DiskImageView img(opt.image_files[icam]); vw::BBox2 image_box = bounding_box(img); std::vector this_cam_weights; for (size_t ipix = 0; ipix < pixel_vec[icam].size(); ipix++) { vw::Vector2 pix_obs = pixel_vec[icam][ipix]; double * tri_point = &tri_points_vec[3 * pix2xyz_index[icam][ipix]]; double pix_wt = weight_vec[icam][ipix]; bool isAnchor = isAnchor_vec[icam][ipix]; // Pass 0 is without anchor points, while pass 1 uses them if ((int)isAnchor != pass) continue; csm::RasterGM * csm = csm_models[icam]->m_gm_model.get(); UsgsAstroLsSensorModel * ls_model = dynamic_cast(csm); UsgsAstroFrameSensorModel * frame_model = dynamic_cast(csm); // Skip points whose pixel falls outside the camera ephemeris range. // This can happen with --num-anchor-points-extra-lines. try { if (!have_rig) { // No rig addLsOrFrameReprojectionErr(opt, icam, ls_model, frame_model, frame_params, pix_obs, pix_wt, tri_point, problem); } else { // Have rig asp::RigCamInfo rig_info = rig_cam_info[icam]; int ref_cam = rig_info.ref_cam_index; int sensor_id = rig_info.sensor_id; double* ref_to_curr_sensor_trans = &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]; // We can have linescan or frame cameras for ref and curr cameras csm::RasterGM * ref_csm = csm_models[ref_cam]->m_gm_model.get(); UsgsAstroLsSensorModel * ref_ls_model = dynamic_cast(ref_csm); UsgsAstroFrameSensorModel * ref_frame_model = dynamic_cast(ref_csm); if (rig.isRefSensor(sensor_id)) // Do not need the rig addLsOrFrameReprojectionErr(opt, icam, ls_model, frame_model, frame_params, pix_obs, pix_wt, tri_point, problem); else // Use the rig asp::addRigLsOrFrameReprojectionErr(opt, icam, ref_ls_model, ref_frame_model, ls_model, frame_model, frame_params, csm_models, cam2group, timestamp_map, pix_obs, pix_wt, tri_point, ref_to_curr_sensor_trans, rig_info, fix_rig_translations, fix_rig_rotations, problem); } // end condition for having a rig } catch (...) { continue; } // Two residuals were added. Save the corresponding weights. for (int c = 0; c < asp::PIXEL_SIZE; c++) weight_per_residual.push_back(pix_wt); // Anchor points are fixed by definition. They try to prevent // the cameras from moving too much from original poses. if (isAnchor) problem.SetParameterBlockConstant(tri_point); // Find the weight to use with the camera constraint vw::Vector3 xyz_obs(tri_point[0], tri_point[1], tri_point[2]); double gsd = 0.0; try { gsd = vw::camera::estimatedGSD(opt.camera_models[icam].get(), image_box, pix_obs, xyz_obs); } catch (...) { continue; } if (gsd <= 0) continue; // The camera position weight depends on the input multiplier, pixel weight, and gsd double position_wt = opt.camera_position_weight * pix_wt / gsd; this_cam_weights.push_back(position_wt); } // end iteration through pixels // Find the median weight and count. The median is more robust to outliers. count_per_cam[pass][icam] = this_cam_weights.size(); if (count_per_cam[pass][icam] > 0) weight_per_cam[pass][icam] = vw::math::destructive_median(this_cam_weights); else weight_per_cam[pass][icam] = 0.0; } // end iteration through cameras } // end iteration through passes return; } // Add the constraint based on DEM void addDemConstraint(asp::BaBaseOptions const& opt, std::vector const& dem_xyz_vec, std::set const& outliers, vw::ba::ControlNetwork const& cnet, // Outputs std::vector & tri_points_vec, std::vector & weight_per_residual, // append ceres::Problem & problem) { double xyz_weight = -1.0, xyz_threshold = -1.0; if (!opt.heights_from_dem.empty()) { xyz_weight = 1.0/opt.heights_from_dem_uncertainty; xyz_threshold = opt.heights_from_dem_robust_threshold; } else { vw::vw_throw(vw::ArgumentErr() << "No input DEM was provided.\n"); } if (dem_xyz_vec.size() != cnet.size()) vw::vw_throw(vw::ArgumentErr() << "Must have as many xyz computed from DEM as xyz " << "triangulated from match files.\n"); if (xyz_weight <= 0 || xyz_threshold <= 0) vw::vw_throw(vw::ArgumentErr() << "Detected invalid robust threshold or weights.\n"); int num_tri_points = cnet.size(); // The tri_points_vec must have at least as many points as cnet. It can have anchor points // as well. if ((int)tri_points_vec.size() < num_tri_points * NUM_XYZ_PARAMS) vw::vw_throw(vw::ArgumentErr() << "Too few triangulated points.\n"); for (int ipt = 0; ipt < num_tri_points; ipt++) { if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint) continue; // Skip GCPs // Note that we get tri points from dem_xyz_vec, based on the input DEM vw::Vector3 observation = dem_xyz_vec.at(ipt); if (outliers.find(ipt) != outliers.end() || observation == vw::Vector3(0, 0, 0)) continue; // outlier ceres::CostFunction* xyz_cost_function = weightedXyzError::Create(observation, xyz_weight); ceres::LossFunction* xyz_loss_function = new ceres::CauchyLoss(xyz_threshold); double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS; // Add cost function problem.AddResidualBlock(xyz_cost_function, xyz_loss_function, tri_point); for (int c = 0; c < NUM_XYZ_PARAMS; c++) weight_per_residual.push_back(xyz_weight); } } // Add the constraint to keep triangulated points close to initial values // This does not need a DEM or alignment void addTriConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, // Outputs std::vector & tri_points_vec, std::vector & weight_per_residual, // append ceres::Problem & problem) { // Estimate the GSD for each triangulated point std::vector gsds; asp::estimateGsdPerTriPoint(opt.image_files, opt.camera_models, crn, outliers, tri_points_vec, gsds); int num_tri_points = cnet.size(); for (int ipt = 0; ipt < num_tri_points; ipt++) { if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint || cnet[ipt].type() == vw::ba::ControlPoint::PointFromDem) continue; // Skip GCPs and height-from-dem points which have their own constraint if (outliers.find(ipt) != outliers.end()) continue; // skip outliers double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS; // The weight must be inversely proportional to the GSD, to ensure // this is in pixel units double gsd = gsds[ipt]; if (gsd <= 0) continue; // GSD calculation failed. Do not use a constraint. double weight = opt.tri_weight / gsd; // Use as constraint the initially triangulated point vw::Vector3 observation(tri_point[0], tri_point[1], tri_point[2]); ceres::CostFunction* cost_function = weightedXyzError::Create(observation, weight); ceres::LossFunction* loss_function = new ceres::CauchyLoss(opt.tri_robust_threshold); problem.AddResidualBlock(cost_function, loss_function, tri_point); for (int c = 0; c < NUM_XYZ_PARAMS; c++) weight_per_residual.push_back(opt.tri_weight); } // End loop through xyz } // Add the GCP constraint void addGcpConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, bool use_llh_error, bool fix_gcp_xyz, // Outputs vw::ba::ControlNetwork & cnet, std::vector & tri_points_vec, std::vector & weight_per_residual, // append ceres::Problem & problem) { int num_tri_points = cnet.size(); for (int ipt = 0; ipt < num_tri_points; ipt++) { if (cnet[ipt].type() != vw::ba::ControlPoint::GroundControlPoint) continue; // Applies only to GCPs if (outliers.find(ipt) != outliers.end()) continue; // skip outliers vw::Vector3 observation = cnet[ipt].position(); vw::Vector3 xyz_sigma = cnet[ipt].sigma(); // Use same cost function as for bundle adjustment ceres::CostFunction* cost_function = NULL; if (!use_llh_error) { cost_function = XYZError::Create(observation, xyz_sigma); } else { vw::Vector3 llh_sigma = xyz_sigma; // make lat, lon into lon, lat std::swap(llh_sigma[0], llh_sigma[1]); cost_function = LLHError::Create(observation, llh_sigma, opt.datum); } // No soft cost function for GCP. These are assumed to be accurate. ceres::LossFunction* loss_function = new ceres::TrivialLoss(); double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS; problem.AddResidualBlock(cost_function, loss_function, tri_point); // Ground xyz whose sigma is asp::FIXED_GCP_SIGMA (a tiny positive value) are set to fixed double s = asp::FIXED_GCP_SIGMA; if (fix_gcp_xyz || xyz_sigma == vw::Vector3(s, s, s)) { cnet[ipt].set_sigma(vw::Vector3(s, s, s)); // will be saved in the ISIS cnet problem.SetParameterBlockConstant(tri_point); } for (int c = 0; c < NUM_XYZ_PARAMS; c++) weight_per_residual.push_back(1.0 / xyz_sigma[c]); } // End loop over triangulated points } // Add hard camera constraints. Be generous with the uncertainty. void addHardCamPositionConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, asp::CRN const& crn, std::vector const& csm_models, std::vector> const& count_per_cam, double anchor_weight, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, // Outputs std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem) { // Do not do a second pass for anchor points. A constraint for interest points // only seems to be enough. for (int pass = 0; pass < 1; pass++) { for (int icam = 0; icam < (int)crn.size(); icam++) { // With a rig, only the ref sensor has rotation constraints if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id)) continue; double count = count_per_cam[pass][icam]; if (count <= 0) continue; // no reprojection errors for this camera int param_len = NUM_XYZ_PARAMS; UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (ls_model != NULL) { // There are multiple position parameters per camera. Divide the // constraint between them. This was very carefully tested. int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS; double weight = 1.0 / std::max(double(numPos), 1.0); for (int pos_it = 0; pos_it < numPos; pos_it++) { // Must have both a pointer and the vector, as dictated by the API double * cam_ptr = &ls_model->m_positions[pos_it * NUM_XYZ_PARAMS]; vw::Vector3 orig_cam(cam_ptr[0], cam_ptr[1], cam_ptr[2]); ceres::CostFunction* cost_function = CamUncertaintyError::Create(orig_cam, cam_ptr, param_len, opt.camera_position_uncertainty[icam], weight, opt.datum, opt.camera_position_uncertainty_power); // This is a hard constraint, so we use a trivial loss function ceres::LossFunction* loss_function = new ceres::TrivialLoss(); problem.AddResidualBlock(cost_function, loss_function, cam_ptr); for (int c = 0; c < NUM_XYZ_PARAMS; c++) weight_per_residual.push_back(weight); // To ensure correct bookkeeping } } else if (frame_model != NULL) { // Same logic as for bundle_adjust // There is only one position per camera // Must have both a pointer and the vector, as dictated by the API double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; vw::Vector3 orig_cam(curr_params[0], curr_params[1], curr_params[2]); double weight = 1.0; ceres::CostFunction* cost_function = CamUncertaintyError::Create(orig_cam, curr_params, param_len, opt.camera_position_uncertainty[icam], weight, opt.datum, opt.camera_position_uncertainty_power); // This is a hard constraint, so we use a trivial loss function ceres::LossFunction* loss_function = new ceres::TrivialLoss(); problem.AddResidualBlock(cost_function, loss_function, &curr_params[0]); for (int c = 0; c < NUM_XYZ_PARAMS; c++) weight_per_residual.push_back(weight); // To ensure correct bookkeeping } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } } // end loop through cameras } // end loop through passes return; } // Add camera constraints that are proportional to the number of reprojection errors. // This requires going through some of the same motions as in addReprojCamErrs(). // Use instead addHardCamPositionConstraint(). void addSoftCamPositionConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, asp::CRN const& crn, std::vector const& csm_models, std::vector> const& weight_per_cam, std::vector> const& count_per_cam, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, // Outputs std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem) { // First pass is for interest point matches, and second pass is for anchor points for (int pass = 0; pass < 2; pass++) { for (int icam = 0; icam < (int)crn.size(); icam++) { // With a rig, only the ref sensor has rotation constraints if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id)) continue; double median_wt = weight_per_cam[pass][icam]; double count = count_per_cam[pass][icam]; if (count <= 0) continue; // no reprojection errors for this camera // We know the median weight to use, and how many residuals were added. // Based on the CERES loss function formula, adding N loss functions each // with weight w and robust threshold t is equivalent to adding one loss // function with weight sqrt(N)*w and robust threshold sqrt(N)*t. // For linescan cameras, then need to subdivide this for individual // positions for that camera. double combined_wt = sqrt(count * 1.0) * median_wt; double combined_th = sqrt(count * 1.0) * opt.camera_position_robust_threshold; UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (ls_model != NULL) { // There are multiple position parameters per camera. They divide among // them the job of minimizing the reprojection error. So need to divide // the weight among them. // Divide the weight among the positions int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS; double wt = combined_wt / sqrt(numPos * 1.0); double th = combined_th / sqrt(numPos * 1.0); for (int ip = 0; ip < numPos; ip++) { ceres::CostFunction* cost_function = weightedTranslationError::Create(&ls_model->m_positions[ip * NUM_XYZ_PARAMS], wt); ceres::LossFunction* loss_function = new ceres::CauchyLoss(th); problem.AddResidualBlock(cost_function, loss_function, &ls_model->m_positions[ip * NUM_XYZ_PARAMS]); for (int c = 0; c < NUM_XYZ_PARAMS; c++) weight_per_residual.push_back(wt); } } else if (frame_model != NULL) { // Same logic as for bundle_adjust // There is only one position per camera double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; // we will copy from curr_params the initial position ceres::CostFunction* cost_function = weightedTranslationError::Create(&curr_params[0], combined_wt); ceres::LossFunction* loss_function = new ceres::CauchyLoss(combined_th); problem.AddResidualBlock(cost_function, loss_function, &curr_params[0]); // translation starts here for (int c = 0; c < NUM_XYZ_PARAMS; c++) weight_per_residual.push_back(combined_wt); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } } } return; } void addQuatNormRotationConstraints( asp::BaBaseOptions const& opt, std::set const& outliers, asp::CRN const& crn, std::vector const& csm_models, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, double quat_norm_weight, // Outputs std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem) { // Constrain the rotations // TODO(oalexan1): Make this a standalone function if (opt.rotation_weight > 0.0) { for (int icam = 0; icam < (int)crn.size(); icam++) { // With a rig, only the ref sensor has rotation constraints if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id)) continue; UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (ls_model != NULL) { // There are multiple quaternion parameters per camera int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; for (int iq = 0; iq < numQuat; iq++) { ceres::CostFunction* rotation_cost_function = weightedRotationError::Create(&ls_model->m_quaternions[iq * NUM_QUAT_PARAMS], opt.rotation_weight); // We use no loss function, as the quaternions have no outliers ceres::LossFunction* rotation_loss_function = NULL; problem.AddResidualBlock(rotation_cost_function, rotation_loss_function, &ls_model->m_quaternions[iq * NUM_QUAT_PARAMS]); for (int c = 0; c < NUM_QUAT_PARAMS; c++) weight_per_residual.push_back(opt.rotation_weight); } } else if (frame_model != NULL) { // There is one quaternion per camera, stored after the translation double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; // Copy from curr_params the initial quaternion ceres::CostFunction* rotation_cost_function = weightedRotationError::Create(&curr_params[NUM_XYZ_PARAMS], // quat starts here opt.rotation_weight); // Pass the quaternion to optimize to the problem // We use no loss function, as the quaternions have no outliers ceres::LossFunction* rotation_loss_function = NULL; problem.AddResidualBlock(rotation_cost_function, rotation_loss_function, &curr_params[NUM_XYZ_PARAMS]); // quat starts here for (int c = 0; c < NUM_QUAT_PARAMS; c++) weight_per_residual.push_back(opt.rotation_weight); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } } // end loop through cameras } // Try to make the norm of quaternions be close to 1 // TODO(oalexan1): Make this a standalone function if (quat_norm_weight > 0.0) { for (int icam = 0; icam < (int)crn.size(); icam++) { UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (ls_model != NULL) { int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; for (int iq = 0; iq < numQuat; iq++) { ceres::CostFunction* quat_norm_cost_function = weightedQuatNormError::Create(quat_norm_weight); // We use no loss function, as the quaternions have no outliers ceres::LossFunction* quat_norm_loss_function = NULL; problem.AddResidualBlock(quat_norm_cost_function, quat_norm_loss_function, &ls_model->m_quaternions[iq * NUM_QUAT_PARAMS]); weight_per_residual.push_back(quat_norm_weight); // 1 single residual } } else if (frame_model != NULL) { // There is one quaternion per camera, stored after the translation double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; ceres::CostFunction* quat_norm_cost_function = weightedQuatNormError::Create(quat_norm_weight); // We use no loss function, as the quaternions have no outliers ceres::LossFunction* quat_norm_loss_function = NULL; problem.AddResidualBlock(quat_norm_cost_function, quat_norm_loss_function, &curr_params[NUM_XYZ_PARAMS]); // quat starts here weight_per_residual.push_back(quat_norm_weight); // 1 single residual } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } } } } // Add roll / yaw constraints. For linescan, use the whole set of samples for given // camera model. For frame cameras, use the trajectory of all cameras in the same orbital // group as the current camera. void addRollYawConstraint(asp::BaBaseOptions const& opt, asp::CRN const& crn, std::vector const& csm_models, vw::cartography::GeoReference const& georef, std::map const& cam2group, bool initial_camera_constraint, double roll_weight, double yaw_weight, // Outputs (append to residual) std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem) { if (roll_weight <= 0.0 && yaw_weight <= 0.0) vw::vw_throw(vw::ArgumentErr() << "addRollYawConstraint: The roll or yaw weight must be positive.\n"); int num_cams = crn.size(); // Frame cameras can be grouped by orbital portion. Ensure that all cameras // belong to a group. if (num_cams != int(cam2group.size())) vw::vw_throw(vw::ArgumentErr() << "addRollYawConstraint: Failed to add each input camera to an orbital group.\n"); // Create the orbital trajectory for each group of frame cameras std::map> orbital_group_positions; std::map> orbital_group_quaternions; formPositionQuatVecPerGroup(cam2group, csm_models, orbital_group_positions, orbital_group_quaternions); // outputs for (int icam = 0; icam < num_cams; icam++) { UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (ls_model != NULL) { // Linescan cameras. Use the full sequence of cameras in the model // to enforce the roll/yaw constraint for each camera in the sequence. int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; // Make positions one-to-one with quaternions std::vector interp_positions; asp::orbitInterpExtrap(ls_model, georef, interp_positions); for (int iq = 0; iq < numQuat; iq++) { ceres::CostFunction* roll_yaw_cost_function = weightedRollYawError::Create(interp_positions, ls_model->m_quaternions, georef, iq, roll_weight, yaw_weight, initial_camera_constraint); // We use no loss function, as the quaternions have no outliers ceres::LossFunction* roll_yaw_loss_function = NULL; problem.AddResidualBlock(roll_yaw_cost_function, roll_yaw_loss_function, &ls_model->m_quaternions[iq * NUM_QUAT_PARAMS]); // The recorded weight should not be 0 as we will divide by it weight_per_residual.push_back(roll_weight || 1.0); weight_per_residual.push_back(yaw_weight || 1.0); } // end loop through quaternions for given camera } else if (frame_model != NULL) { // Frame cameras. Use the positions and quaternions of the cameras // in the same orbital group to enforce the roll/yaw constraint for // each camera in the group. auto it = cam2group.find(icam); if (it == cam2group.end()) vw::vw_throw(vw::ArgumentErr() << "addRollYawConstraint: Failed to find orbital group for camera.\n"); int group_id = it->second; int index_in_group = indexInGroup(icam, cam2group); std::vector positions = orbital_group_positions[group_id]; std::vector quaternions = orbital_group_quaternions[group_id]; if (positions.size() / NUM_XYZ_PARAMS < 2) { // It can happen that we have just one frame camera, but then we just // can't add this constraint vw::vw_out(vw::WarningMessage) << "Cannot add roll and/or yaw constraint for " << "for an orbital group consisting of only one frame camera.\n"; continue; } ceres::CostFunction* roll_yaw_cost_function = weightedRollYawError::Create(positions, quaternions, georef, index_in_group, roll_weight, yaw_weight, initial_camera_constraint); // We use no loss function, as the quaternions have no outliers ceres::LossFunction* roll_yaw_loss_function = NULL; // Note how we set the quaternions to be optimized from frame_params. // Above, we only cared for initial positions and quaternions. double * curr_params = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; problem.AddResidualBlock(roll_yaw_cost_function, roll_yaw_loss_function, &curr_params[NUM_XYZ_PARAMS]); // quat starts here // The recorded weight should not be 0 as we will divide by it weight_per_residual.push_back(roll_weight || 1.0); weight_per_residual.push_back(yaw_weight || 1.0); } else { vw::vw_throw(vw::ArgumentErr() << "addRollYawConstraint: Expecting CSM linescan or frame cameras.\n"); } } // end loop through cameras return; } // TODO(oalexan1): This file is getting big. Move the code below to // jitterSolveRefCostFun.cc. // The disparity-based error measured by --reference-terrain. It is the // difference between left_pix + disp and right_pix, given the current ground // pixel and camera models. bool calcDispBasedError(UsgsAstroLsSensorModel *left_ls, UsgsAstroLsSensorModel *right_ls, vw::TransformPtr left_tx, vw::TransformPtr right_tx, DispPtr disp, csm::EcefCoord const& P, vw::Vector2 & error) { // Project into the images double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; csm::ImageCoord left_csm_pix = left_ls->groundToImage(P, desired_precision); csm::ImageCoord right_csm_pix = right_ls->groundToImage(P, desired_precision); // Covert to ASP pixels vw::Vector2 left_raw_pix, right_raw_pix; asp::fromCsmPixel(left_raw_pix, left_csm_pix); asp::fromCsmPixel(right_raw_pix, right_csm_pix); // Convert to aligned pixel vw::Vector2 left_trans_pix; try { left_trans_pix = left_tx->forward(left_raw_pix); } catch (...) { return false; } // Typedefs to avoid long lines typedef vw::ValueEdgeExtension> NoDataType; typedef vw::DiskImageView> DispDiskView; // Compute the interpolated aligned disparity. Use no-data when out of bounds. vw::PixelMask no_data; no_data.invalidate(); NoDataType no_data_ext(no_data); vw::InterpolationView, vw::BicubicInterpolation> interp_disp = interpolate(*disp.get(), vw::BicubicInterpolation(), no_data_ext); vw::PixelMask disp_pix = interp_disp(left_trans_pix[0], left_trans_pix[1]); // Flag invalid pixels if (!is_valid(disp_pix)) return false; // Discrepancy between right pixel and left pixel + disparity vw::Vector2 right_trans_pix = left_trans_pix + disp_pix.child(); vw::Vector2 right_raw_derived_pix; try { right_raw_derived_pix = right_tx->reverse(right_trans_pix); } catch (...) { return false; } error = right_raw_derived_pix - right_raw_pix; return true; } // Fallback error value for --reference-terrain. Do not make this big, as when // the calculation succeeds, the errors are small. double g_ref_terrain_pix_val = 5.0; // Reference terrain error. See calcDispBasedError() for the implementation. struct RefTerrainReprojErr { RefTerrainReprojErr(UsgsAstroLsSensorModel *left_ls, UsgsAstroLsSensorModel *right_ls, vw::TransformPtr left_tx, vw::TransformPtr right_tx, DispPtr disp, csm::EcefCoord const& P, double weight, int begLeftPosIndex, int endLeftPosIndex, int begLeftQuatIndex, int endLeftQuatIndex, int begRightPosIndex, int endRightPosIndex, int begRightQuatIndex, int endRightQuatIndex): m_left_ls(left_ls), m_right_ls(right_ls), m_left_tx(left_tx), m_right_tx(right_tx), m_disp(disp), m_P(P), m_weight(weight), m_begLeftPosIndex(begLeftPosIndex), m_endLeftPosIndex(endLeftPosIndex), m_begLeftQuatIndex(begLeftQuatIndex), m_endLeftQuatIndex(endLeftQuatIndex), m_begRightPosIndex(begRightPosIndex), m_endRightPosIndex(endRightPosIndex), m_begRightQuatIndex(begRightQuatIndex), m_endRightQuatIndex(endRightQuatIndex) {} // The implementation is further down bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create( UsgsAstroLsSensorModel *left_ls, UsgsAstroLsSensorModel *right_ls, vw::TransformPtr left_tx, vw::TransformPtr right_tx, DispPtr disp, csm::EcefCoord const& P, double weight, int begLeftPosIndex, int endLeftPosIndex, int begLeftQuatIndex, int endLeftQuatIndex, int begRightPosIndex, int endRightPosIndex, int begRightQuatIndex, int endRightQuatIndex) { ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new RefTerrainReprojErr(left_ls, right_ls, left_tx, right_tx, disp, P, weight, begLeftPosIndex, endLeftPosIndex, begLeftQuatIndex, endLeftQuatIndex, begRightPosIndex, endRightPosIndex, begRightQuatIndex, endRightQuatIndex)); // The residual size is the pixel size cost_function->SetNumResiduals(PIXEL_SIZE); // Add a parameter block for each position and quaternion for (int it = begLeftPosIndex; it < endLeftPosIndex; it++) cost_function->AddParameterBlock(NUM_XYZ_PARAMS); for (int it = begLeftQuatIndex; it < endLeftQuatIndex; it++) cost_function->AddParameterBlock(NUM_QUAT_PARAMS); for (int it = begRightPosIndex; it < endRightPosIndex; it++) cost_function->AddParameterBlock(NUM_XYZ_PARAMS); for (int it = begRightQuatIndex; it < endRightQuatIndex; it++) cost_function->AddParameterBlock(NUM_QUAT_PARAMS); return cost_function; } private: UsgsAstroLsSensorModel *m_left_ls, *m_right_ls; vw::TransformPtr m_left_tx, m_right_tx; DispPtr m_disp; csm::EcefCoord m_P; double m_weight; int m_begLeftPosIndex, m_endLeftPosIndex; int m_begLeftQuatIndex, m_endLeftQuatIndex; int m_begRightPosIndex, m_endRightPosIndex; int m_begRightQuatIndex, m_endRightQuatIndex; }; // End class RefTerrainReprojErr // See the documentation higher up in the file. bool RefTerrainReprojErr::operator()(double const * const * parameters, double * residuals) const { try { // Make a copy of the models UsgsAstroLsSensorModel local_left_ls = *m_left_ls; UsgsAstroLsSensorModel local_right_ls = *m_right_ls; // Update position and quaternion parameters with the current values int param_count = 0; for (int it = m_begLeftPosIndex; it < m_endLeftPosIndex; it++) { for (int c = 0; c < NUM_XYZ_PARAMS; c++) local_left_ls.m_positions[it * NUM_XYZ_PARAMS + c] = parameters[param_count][c]; param_count++; } for (int it = m_begLeftQuatIndex; it < m_endLeftQuatIndex; it++) { for (int c = 0; c < NUM_QUAT_PARAMS; c++) local_left_ls.m_quaternions[it * NUM_QUAT_PARAMS + c] = parameters[param_count][c]; param_count++; } // Same for the right camera for (int it = m_begRightPosIndex; it < m_endRightPosIndex; it++) { for (int c = 0; c < NUM_XYZ_PARAMS; c++) local_right_ls.m_positions[it * NUM_XYZ_PARAMS + c] = parameters[param_count][c]; param_count++; } for (int it = m_begRightQuatIndex; it < m_endRightQuatIndex; it++) { for (int c = 0; c < NUM_QUAT_PARAMS; c++) local_right_ls.m_quaternions[it * NUM_QUAT_PARAMS + c] = parameters[param_count][c]; param_count++; } vw::TransformPtr local_left_tx = m_left_tx; vw::TransformPtr local_right_tx = m_right_tx; vw::Vector2 error; bool success = calcDispBasedError(&local_left_ls, &local_right_ls, local_left_tx, local_right_tx, m_disp, m_P, error); if (success) { residuals[0] = m_weight * error[0]; residuals[1] = m_weight * error[1]; } else { residuals[0] = m_weight * g_ref_terrain_pix_val; residuals[1] = m_weight * g_ref_terrain_pix_val; } // Accept the solution in either case, as it is too late to back out, // because that will mess up the bookkeeping. return true; } catch (...) { residuals[0] = m_weight * g_ref_terrain_pix_val; residuals[1] = m_weight * g_ref_terrain_pix_val; return true; // accept the solution anyway } return true; } bool addRefTerrainReprojectionErr(asp::BaBaseOptions const& opt, UsgsAstroLsSensorModel *left_ls, UsgsAstroLsSensorModel *right_ls, vw::TransformPtr left_tx, vw::TransformPtr right_tx, vw::BBox2i const& left_bbox, vw::BBox2i const& right_bbox, DispPtr disp, csm::EcefCoord const& P, double weight, ceres::Problem & problem) { double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; // Find all positions and quaternions that can affect the current pixel. csm::ImageCoord left_csm_pix = left_ls->groundToImage(P, desired_precision); vw::Vector2 left_pix; asp::fromCsmPixel(left_pix, left_csm_pix); if (!left_bbox.contains(left_pix)) return false; // the pixel is outside the left image int leftBegPosIndex = -1, leftEndPosIndex = -1; int leftBegQuatIndex = -1, leftEndQuatIndex = -1; calcPosQuatIndexBounds(line_extra, left_ls, left_pix, // Outputs leftBegPosIndex, leftEndPosIndex, leftBegQuatIndex, leftEndQuatIndex); // Same for the right camera csm::ImageCoord right_csm_pix = right_ls->groundToImage(P, desired_precision); vw::Vector2 right_pix; asp::fromCsmPixel(right_pix, right_csm_pix); if (!right_bbox.contains(right_pix)) return false; // the pixel is outside the right image int rightBegPosIndex = -1, rightEndPosIndex = -1; int rightBegQuatIndex = -1, rightEndQuatIndex = -1; calcPosQuatIndexBounds(line_extra, right_ls, right_pix, // Outputs rightBegPosIndex, rightEndPosIndex, rightBegQuatIndex, rightEndQuatIndex); ceres::CostFunction* pixel_cost_function = RefTerrainReprojErr::Create(left_ls, right_ls, left_tx, right_tx, disp, P, weight, leftBegPosIndex, leftEndPosIndex, leftBegQuatIndex, leftEndQuatIndex, rightBegPosIndex, rightEndPosIndex, rightBegQuatIndex, rightEndQuatIndex); ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.reference_terrain_robust_threshold); // The variable of optimization are the relevant camera positions and quaternions. std::vector vars; for (int it = leftBegPosIndex; it < leftEndPosIndex; it++) vars.push_back(&left_ls->m_positions[it * NUM_XYZ_PARAMS]); for (int it = leftBegQuatIndex; it < leftEndQuatIndex; it++) vars.push_back(&left_ls->m_quaternions[it * NUM_QUAT_PARAMS]); // Same for the right camera for (int it = rightBegPosIndex; it < rightEndPosIndex; it++) vars.push_back(&right_ls->m_positions[it * NUM_XYZ_PARAMS]); for (int it = rightBegQuatIndex; it < rightEndQuatIndex; it++) vars.push_back(&right_ls->m_quaternions[it * NUM_QUAT_PARAMS]); problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars); return true; } // Read the reference terrain. Ensure enough reference points are loaded that // project in the camera boxes. Do two attempts. // TODO(oalexan1): This will need adjustment if there is more than one stereo pair. void loadReferenceTerrain(asp::BaBaseOptions const& opt, std::vector const& csm_models, std::vector const& left_indices, std::vector const& right_indices, std::vector const& left_trans, std::vector const& right_trans, std::vector const& image_boxes, // Output std::vector & reference_vec) { vw::vw_out() << "Loading reference terrain points and then filtering them.\n"; // Set up a GeoReference object using the datum, it may get modified later vw::cartography::GeoReference geo; geo.set_datum(opt.datum); // We checked for a datum earlier // Ensure the read georef lives on the same planet bool warn_only = false; vw::checkDatumConsistency(opt.datum, geo.datum(), warn_only); for (size_t i = 0; i < left_indices.size(); i++) { auto * left_cam = csm_models[left_indices[i]]; auto * right_cam = csm_models[right_indices[i]]; auto left_bbox = image_boxes[left_indices[i]]; auto right_bbox = image_boxes[right_indices[i]]; int num_try_load = 5 * opt.max_num_reference_points; for (int attempt = 0; attempt < 2; attempt++) { reference_vec.clear(); std::vector local_reference_vec; asp::load_csv_or_dem(opt.csv_format_str, opt.csv_srs, opt.reference_terrain, num_try_load, // Outputs geo, local_reference_vec); // TODO(oalexan1): For non-ISIS cameras this could be done in parallel. for (size_t data_col = 0; data_col < local_reference_vec.size(); data_col++) { vw::Vector3 reference_xyz = local_reference_vec[data_col]; vw::Vector2 left_pix, right_pix; try { left_pix = left_cam->point_to_pixel(reference_xyz); right_pix = right_cam->point_to_pixel(reference_xyz); } catch (...) { continue; } if (!left_bbox.contains(left_pix) || !right_bbox.contains(right_pix)) continue; reference_vec.push_back(reference_xyz); } int num_loaded = reference_vec.size(); double ratio = double(num_loaded) / opt.max_num_reference_points; if (ratio >= 1.0) break; // loaded enough points // Try again num_try_load = 1.5 * num_try_load / std::max(ratio, 1e-3); // avoid division by 0 vw::vw_out() << "Loaded too few points after filtering. Try again.\n"; } // end attempt loop // If there are too few points, print a warning if (reference_vec.size() < opt.max_num_reference_points) vw::vw_out(vw::WarningMessage) << "Loaded only " << reference_vec.size() << " reference terrain points after filtering by projection into camera.\n"; // If they are too many, pick a subset if (reference_vec.size() > opt.max_num_reference_points) { // Deterministic shuffle unsigned seed = 0; std::mt19937 gen(seed); std::shuffle(reference_vec.begin(), reference_vec.end(), gen); reference_vec.resize(opt.max_num_reference_points); } vw::vw_out() << "Read " << reference_vec.size() << " reference terrain points (after filtering by projection into camera).\n"; } // end loop through stereo pairs } // end function loadReferenceTerrain() // Option --reference-terrain // TODO(oalexan1): Must add the uncertainty logic. // TODO(oalexan1): Filter out points outside the box and load more if needed. void addRefTerrainCostFun(asp::BaBaseOptions const& opt, std::vector const& csm_models, std::vector const& left_indices, std::vector const& right_indices, std::vector const& left_trans, std::vector const& right_trans, std::vector const& disp_files, // Outputs ceres::Problem & problem, std::vector & disp_vec, vw::ImageView & mapproj_dem, std::vector & weight_per_residual, std::vector & reference_vec, std::vector> & ref_indices) { // For now, only one stereo pair is supported, so size of left_indices must be 1 if (left_indices.size() != 1) vw::vw_throw(vw::ArgumentErr() << "Expecting only one stereo pair.\n"); // Read the image boxes std::vector image_boxes; for (size_t icam = 0; icam < opt.image_files.size(); icam++) { vw::DiskImageView img(opt.image_files[icam]); vw::BBox2i bbox = vw::bounding_box(img); image_boxes.push_back(bbox); } // Read the reference terrain. Ensure enough reference points are loaded that // project in the camera boxes. loadReferenceTerrain(opt, csm_models, left_indices, right_indices, left_trans, right_trans, image_boxes, reference_vec); // output // Load the disparity files. Keep a pointer to DiskImageView to avoid loading // them fully in memory, as they can be huge. disp_vec.resize(disp_files.size()); for (size_t i = 0; i < disp_files.size(); i++) { vw::vw_out() << "Reading disparity file: " << disp_files[i] << "\n"; disp_vec[i].reset(new vw::DiskImageView>(disp_files[i])); } // Record the indices of the residuals of the reference points ref_indices.clear(); ref_indices.resize(reference_vec.size()); int num_kept_ref_points = 0; vw::vw_out() << "Setting up the error to the reference terrain.\n"; // For Map2CamTrans, must turn off caching to ensure thread safety, and read // the DEM in memory. for (size_t i = 0; i < left_indices.size(); i++) { auto & left_tx = left_trans[i]; auto & right_tx = right_trans[i]; vw::cartography::Map2CamTrans* left_map2cam = dynamic_cast(left_tx.get()); vw::cartography::Map2CamTrans* right_map2cam = dynamic_cast(right_tx.get()); // Either both must be null or both must be non-null. if ((left_map2cam == NULL) != (right_map2cam == NULL)) vw::vw_throw(vw::ArgumentErr() << "Both images in a stereo pair must be " << "mapprojected, or neither of them.\n"); if (left_map2cam == NULL || right_map2cam == NULL) continue; // nothing to do // Both must be projected onto the same DEM if (left_map2cam->m_dem_file != right_map2cam->m_dem_file) vw::vw_throw(vw::ArgumentErr() << "The two images in a stereo pair must be " << "projected onto the same DEM.\n"); // Print a warning if the left_map2cam->m_dem width and height are no less than // 5000 pixels, as that would be slow to load. int k = 5000; if (left_map2cam->m_dem.cols() >= k || left_map2cam->m_dem.rows() >= k) vw::vw_out(vw::WarningMessage) << "The mapprojection DEM " << left_map2cam->m_dem_file << " is very large, it may take a long time to load. Dimensions: " << left_map2cam->m_dem.cols() << " x " << left_map2cam->m_dem.rows() << " pixels.\n"; // Load the DEM in memory and set it for each transform. This is a fix // for very slow performance. Note that the disparity is still loaded // on demand only, as that can be large. mapproj_dem = copy(left_map2cam->m_dem); // TODO(oalexan1): This must be a member function. It uses very detailed // info from the class. left_map2cam->set_use_cache(false); left_map2cam->m_masked_dem = vw::create_mask(mapproj_dem, left_map2cam->m_nodata); left_map2cam->m_interp_dem = vw::interpolate(left_map2cam->m_masked_dem, vw::BicubicInterpolation(), vw::ZeroEdgeExtension()); right_map2cam->set_use_cache(false); right_map2cam->m_masked_dem = vw::create_mask(mapproj_dem, right_map2cam->m_nodata); right_map2cam->m_interp_dem = vw::interpolate(right_map2cam->m_masked_dem, vw::BicubicInterpolation(), vw::ZeroEdgeExtension()); } // end loop through stereo pairs // Need a progress bar as this can be slow vw::TerminalProgressCallback tpc("asp", "Filter ref points with disparity: --> "); // Find the spacing for progress. Avoid int32 overflow. double total = double(reference_vec.size()) * double(left_indices.size()); double hundred = 100.0; long long spacing = std::max(round(total / hundred), 1.0); long long data_count = 0; // Loop through the reference points for (size_t data_col = 0; data_col < reference_vec.size(); data_col++) { vw::Vector3 reference_xyz = reference_vec[data_col]; // Iterate over left indices for (size_t i = 0; i < left_indices.size(); i++) { data_count++; if (data_count % spacing == 0) tpc.report_incremental_progress(1.0/hundred); auto & left_tx = left_trans[i]; auto & right_tx = right_trans[i]; int left_index = left_indices[i]; int right_index = right_indices[i]; vw::BBox2i left_bbox = image_boxes[left_index]; vw::BBox2i right_bbox = image_boxes[right_index]; // Get the underlying linescan models csm::RasterGM * left_csm = csm_models[left_index]->m_gm_model.get(); UsgsAstroLsSensorModel * left_ls = dynamic_cast(left_csm); csm::RasterGM * right_csm = csm_models[right_index]->m_gm_model.get(); UsgsAstroLsSensorModel * right_ls = dynamic_cast(right_csm); if (left_ls == NULL || right_ls == NULL) vw::vw_throw(vw::ArgumentErr() << "The option --reference-terrain works only " << "with linescan cameras.\n"); // Convert to CSM points csm::EcefCoord P(reference_xyz[0], reference_xyz[1], reference_xyz[2]); // If the error cannot be measured even with nominal values of the parameters, // there is no point in adding the error. vw::Vector2 error; bool success = calcDispBasedError(left_ls, right_ls, left_tx, right_tx, disp_vec[i], P, error); // output if (!success) continue; // skip this point // Find the weight to use with the camera constraint double gsd = 0.0; try { vw::Vector2 pix_obs = csm_models[left_index]->point_to_pixel(reference_xyz); gsd = vw::camera::estimatedGSD(csm_models[left_index], image_boxes[left_index], pix_obs, reference_xyz); } catch (...) { continue; } if (gsd <= 0.0) continue; // Bigger uncertainty means a smaller weight for the residual. Also // convert from meters to pixels. double weight = gsd / opt.reference_terrain_uncertainty; // Add the error cost function for this point. Skip points whose pixel // falls outside the camera ephemeris range. try { success = addRefTerrainReprojectionErr(opt, left_ls, right_ls, left_tx, right_tx, left_bbox, right_bbox, disp_vec[i], P, weight, problem); } catch (...) { success = false; } if (!success) continue; // skip this point // Record where the residuals for this point are stored ref_indices[data_col].push_back(weight_per_residual.size()); // Two residuals were added. Save the corresponding weights. The saved residuals // will be divided back by the weight. for (int c = 0; c < asp::PIXEL_SIZE; c++) weight_per_residual.push_back(weight); } // end loop through stereo pairs // See if this point is kept if (ref_indices[data_col].size() > 0) num_kept_ref_points++; } tpc.report_finished(); vw::vw_out() << "Read " << num_kept_ref_points << " reference terrain points (after filtering by disparity).\n"; } // Given the quaternions in a camera model, calculate the curvature for each // coordinate. This cannot be done at the starting and ending coordinate, as we // use a centered difference. Make each curvature be at least the median // curvature. This will ensure that even flat areas are allowed to have some // curvature when being optimized. void estimCurvature(UsgsAstroLsSensorModel * ls_model, std::vector & curvature) { // There will be as many curvature terms as overall quaternion coefficients. int numQuats = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; curvature.resize(numQuats * NUM_QUAT_PARAMS, 0.0); // Throw an error if less than 3 quaternions if (numQuats < 3) vw::vw_throw(vw::ArgumentErr() << "Need at least 3 quaternions to calculate curvature. Set the smoothness " << "weight to 0.\n"); // Start iterating from the second quaternion, as we need the previous one // shorthand double *q = &ls_model->m_quaternions[0]; for (int it = 1; it < numQuats - 1; it++) { for (int c = 0; c < NUM_QUAT_PARAMS; c++) { double val = q[(it - 1) * NUM_QUAT_PARAMS + c] - 2.0 * q[it * NUM_QUAT_PARAMS + c] + q[(it + 1) * NUM_QUAT_PARAMS + c]; // Take the absolute value curvature[it * NUM_QUAT_PARAMS + c] = std::abs(val); } } // Find the median curvature. Ignore the first and last curvatures as those are 0. std::vector median_curvature(4); for (int c = 0; c < NUM_QUAT_PARAMS; c++) { std::vector vals; for (int it = 1; it < numQuats - 1; it++) vals.push_back(curvature[it * NUM_QUAT_PARAMS + c]); median_curvature[c] = vw::math::destructive_median(vals); } // For synthetic cameras, the median initial curvature is 0. That is not good. // Ensure a decent lower bound for the median curvature by finding the average // of median curvatures and using 10% of that at least for each component. double avg = 0.0; for (int c = 0; c < NUM_QUAT_PARAMS; c++) avg += median_curvature[c]; avg /= NUM_QUAT_PARAMS; for (int c = 0; c < NUM_QUAT_PARAMS; c++) median_curvature[c] = std::max(median_curvature[c], 0.1 * avg); // Make each curvature, even the ones at endpoints, be at least the median curvature for (int it = 0; it < numQuats; it++) { for (int c = 0; c < NUM_QUAT_PARAMS; c++) { if (curvature[it * NUM_QUAT_PARAMS + c] < median_curvature[c]) curvature[it * NUM_QUAT_PARAMS + c] = median_curvature[c]; } } return; } // Add the quaternion smoothness constraint. This prevents high-frequency // oscillations in the camera orientation. struct QuatSmoothnessErr { QuatSmoothnessErr(double const* smoothnessWeight) { // Make a local copy of the smoothness weight, so it does not go out of scope. m_smoothnessWeight.resize(NUM_QUAT_PARAMS); for (int it = 0; it < NUM_QUAT_PARAMS; it++) m_smoothnessWeight[it] = smoothnessWeight[it]; } // The implementation is further down bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(double const* smoothnessWeight, int begQuatIndex, int endQuatIndex) { // TODO(oalexan1): Try using here the analytical cost function ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new QuatSmoothnessErr(smoothnessWeight)); // The residual size is NUM_QUAT_PARAMS: the curvature per each component cost_function->SetNumResiduals(NUM_QUAT_PARAMS); // Add a parameter block for each quaternion and each position for (int it = begQuatIndex; it <= endQuatIndex; it++) cost_function->AddParameterBlock(NUM_QUAT_PARAMS); return cost_function; } private: std::vector m_smoothnessWeight; }; // End class QuatSmoothnessErr // A function that first increases slowly, then very fast, but without being // numerically unstable for very small or very large values of the input. double signed_exp(double val) { double ans = val * (exp(abs(val)) - 1.0); return ans; } // See the documentation higher up in the file. bool QuatSmoothnessErr::operator()(double const * const * parameters, double * residuals) const { // parameters[0] has has q[index-1], with four components (x, y, z, w) // parameters[1] has has q[index] // parameters[2] has has q[index+1] for (int it = 0; it < NUM_QUAT_PARAMS; it++) { double curvature = parameters[0][it] - 2.0 * parameters[1][it] + parameters[2][it]; // Use a power of 8 so that this kicks in only when the curvature becomes // big, but then it does so big time. Note that smoothnessWeight // takes into account the initial curvature, so this residual is normalized. //residuals[it] = m_smoothnessWeight[it] * curvature; residuals[it] = asp::signed_exp(m_smoothnessWeight[it] * curvature); } return true; } void addQuatSmoothnessErr(UsgsAstroLsSensorModel * ls_model, int quatIndex, double const* smoothnessWeight, std::vector & weight_per_residual, ceres::Problem & problem) { // For a smoothness constraint need the current quaternion and its neighbors. int begQuatIndex = quatIndex - 1, endQuatIndex = quatIndex + 1; // Sanity check int numQuats = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; if (begQuatIndex < 0 || endQuatIndex >= numQuats) vw::vw_throw(vw::ArgumentErr() << "Quat index out of bounds in the smoothness constraint.\n"); ceres::CostFunction* pixel_cost_function = QuatSmoothnessErr::Create(smoothnessWeight, begQuatIndex, endQuatIndex); ceres::LossFunction* pixel_loss_function = NULL; // no attenuation // The variable of optimization are camera quaternions. Notice how the // quaternion indices are in the [begQuatIndex, endQuatIndex] range, so // inclusive at both ends. std::vector vars; for (int it = begQuatIndex; it <= endQuatIndex; it++) vars.push_back(&ls_model->m_quaternions[it * NUM_QUAT_PARAMS]); problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars); // Need this for bookkeeping. Won't be used as do do not save the residuals // for this cost function. If we ever do, need to take into account the internal // raising to the power and the smoothness weight. for (int it = 0; it < NUM_QUAT_PARAMS; it++) weight_per_residual.push_back(1.0); return; } // Add a constraint that the curvature of the sequence of poses does not become // a lot more than the initial one. void addSmoothnessConstraint(asp::BaBaseOptions const& opt, std::vector const& csm_models, double smoothness_weight, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, // Outputs std::vector & weight_per_residual, std::vector> & orig_curvatures, ceres::Problem & problem) { if (smoothness_weight < 0.0 || !std::isfinite(smoothness_weight)) vw::vw_throw(vw::ArgumentErr() << "The smoothness weight must be non-negative.\n"); // orig_curvatures must be either empty or of size num_cams int num_cams = csm_models.size(); if (orig_curvatures.size() != 0 && orig_curvatures.size() != num_cams) vw::vw_throw(vw::ArgumentErr() << "The orig_curvatures vector must be empty or of size equal " << "to the number of cameras.\n"); if (orig_curvatures.empty()) orig_curvatures.resize(num_cams); for (int icam = 0; icam < num_cams; icam++) { // With a rig, only the ref sensor has rotation constraints if (have_rig && !rig.isRefSensor(rig_cam_info[icam].sensor_id)) continue; // Get the underlying linescan models csm::RasterGM * csm = csm_models[icam]->m_gm_model.get(); UsgsAstroLsSensorModel * ls_model = dynamic_cast(csm); if (ls_model == NULL) continue; // not a linescan camera // Estimate the curvature of the quaternion sequence. Do this only once, // with the original cameras, to keep the same constraint for all passes. if (orig_curvatures[icam].empty()) estimCurvature(ls_model, orig_curvatures[icam]); // Let the weight be inversely proportional to the curvature. This way the // current curvature is normalized by the initial curvature. The multiplier // below ensures the optimized curvature can be no more than a factor the // initial curvature. This was carefully tested with real and synthetic data. std::vector weights(orig_curvatures[icam].size()); for (size_t it = 0; it < orig_curvatures[icam].size(); it++) weights[it] = 0.001 * smoothness_weight / orig_curvatures[icam][it]; // Add the smoothness constraint for the quaternions. Cannot have such // a constraint for the first and last quaternion, as need neighbors. int numQuats = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; for (int it = 1; it < numQuats - 1; it++) addQuatSmoothnessErr(ls_model, it, &weights[it * NUM_QUAT_PARAMS], weight_per_residual, problem); } // end loop through cameras return; } } // end namespace asp ================================================ FILE: src/asp/Camera/JitterSolveCostFuns.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file JitterSolveCostFuns.h // Cost functions used in solving for jitter. These need access to the camera // models, so they are stored in the Camera folder. The bigger functions defined // here are implemented in the .cc file. #ifndef __ASP_CAMERA_JITTER_SOLVE_COST_FUNS_H__ #define __ASP_CAMERA_JITTER_SOLVE_COST_FUNS_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { const double g_big_pixel_value = 1000.0; // don't make this too big struct BaBaseOptions; // Calc the range of indices in the samples needed to interpolate between time1 and time2. // Based on lagrangeInterp() in usgscsm. void calcIndexBounds(double time1, double time2, double t0, double dt, int numVals, // Outputs int & begIndex, int & endIndex); // Update the linescan model with the latest optimized values of the position // and quaternion parameters. Also update the triangulated point. void updateLsModelTriPt(double const * const * parameters, int begQuatIndex, int endQuatIndex, int begPosIndex, int endPosIndex, int & param_shift, UsgsAstroLsSensorModel & cam, csm::EcefCoord & P); // Add reprojection errors. Collect data that will be used to add camera // constraints that scale with the number of reprojection errors and GSD. void addReprojCamErrs(asp::BaBaseOptions const & opt, asp::CRN const & crn, std::vector> const & pixel_vec, std::vector> const & weight_vec, std::vector> const & isAnchor_vec, std::vector> const & pix2xyz_index, std::vector const & csm_models, bool have_rig, rig::RigSet const & rig, std::vector const & rig_cam_info, std::map const & cam2group, TimestampMap const & timestamp_map, bool fix_rig_translations, bool fix_rig_rotations, // Outputs std::vector & tri_points_vec, std::vector & frame_params, std::vector & weight_per_residual, std::vector> & weight_per_cam, std::vector> & count_per_cam, std::vector & ref_to_curr_sensor_vec, ceres::Problem & problem); // Add the constraint based on DEM void addDemConstraint(asp::BaBaseOptions const& opt, std::vector const& dem_xyz_vec, std::set const& outliers, vw::ba::ControlNetwork const& cnet, // Outputs std::vector & tri_points_vec, std::vector & weight_per_residual, // append ceres::Problem & problem); // Add the constraint to keep triangulated points close to initial values // This does not need a DEM or alignment void addTriConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, // Outputs std::vector & tri_points_vec, std::vector & weight_per_residual, // append ceres::Problem & problem); // Add the GCP constraint void addGcpConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, bool use_llh_error, bool fix_gcp_xyz, // Outputs vw::ba::ControlNetwork & cnet, std::vector & tri_points_vec, std::vector & weight_per_residual, // append ceres::Problem & problem); // Add hard camera constraints. Be generous with the uncertainty. void addHardCamPositionConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, asp::CRN const& crn, std::vector const& csm_models, std::vector> const& count_per_cam, double anchor_weight, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, // Outputs std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem); // Add soft camera constraints that are proportional to the number of reprojection errors. // This requires going through some of the same motions as in addReprojCamErrs(). // This was not fully understood. Use instead addHardCamPositionConstraint(). void addSoftCamPositionConstraint(asp::BaBaseOptions const& opt, std::set const& outliers, asp::CRN const& crn, std::vector const& csm_models, std::vector> const& weight_per_cam, std::vector> const& count_per_cam, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, // Outputs std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem); void addQuatNormRotationConstraints( asp::BaBaseOptions const& opt, std::set const& outliers, asp::CRN const& crn, std::vector const& csm_models, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, double quat_norm_weight, // Outputs std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem); // Option --reference-terrain typedef boost::shared_ptr>> DispPtr; void addRefTerrainCostFun(asp::BaBaseOptions const& opt, std::vector const& csm_models, std::vector const& left_indices, std::vector const& right_indices, std::vector const& left_trans, std::vector const& right_trans, std::vector const& disp_files, // Outputs ceres::Problem & problem, std::vector & disp_vec, vw::ImageView & mapproj_dem, std::vector & weight_per_residual, std::vector & reference_vec, std::vector> & ref_indices); // Add roll / yaw constraints. For linescan, use the whole set of samples for given // camera model. For frame cameras, use the trajectory of all cameras in the same orbital // group as the current camera. void addRollYawConstraint(asp::BaBaseOptions const& opt, asp::CRN const& crn, std::vector const& csm_models, vw::cartography::GeoReference const& georef, std::map const& cam2group, bool initial_camera_constraint, double roll_weight, double yaw_weight, // Outputs (append to residual) std::vector & frame_params, std::vector & weight_per_residual, ceres::Problem & problem); // Add a constraint that the curvature of the sequence of poses does not become // a lot more than the initial one. void addSmoothnessConstraint(asp::BaBaseOptions const& opt, std::vector const& csm_models, double smoothness_weight, bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, // Outputs std::vector & weight_per_residual, std::vector> & orig_curvatures, ceres::Problem & problem); } // end namespace asp #endif //__ASP_CAMERA_JITTER_SOLVE_COST_FUNS_H__ ================================================ FILE: src/asp/Camera/JitterSolveRigCostFuns.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Cost functions used in solving for jitter. These need access to the camera models, // so they are stored in the Camera folder. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // An error function minimizing the error of projecting an xyz point into a // given CSM frame camera pixel that is on a rig with a linescan camera ref // sensor. The variables of optimization are a portion of the position and // quaternion variables affected by this, the triangulation point, and the // transform from the ref linescan sensor to the current linescan/frame sensor. struct RigLsPixelReprojErr { RigLsPixelReprojErr(vw::Vector2 const& curr_pix, double weight, asp::RigCamInfo const& rig_cam_info, UsgsAstroLsSensorModel* ref_ls_model, UsgsAstroFrameSensorModel * curr_frame_model, UsgsAstroLsSensorModel * curr_ls_model, int begRefQuatIndex, int endRefQuatIndex, int begRefPosIndex, int endRefPosIndex, int begCurrQuatIndex, int endCurrQuatIndex, int begCurrPosIndex, int endCurrPosIndex): m_curr_pix(curr_pix), m_weight(weight), m_rig_cam_info(rig_cam_info), m_begRefQuatIndex(begRefQuatIndex), m_endRefQuatIndex(endRefQuatIndex), m_begRefPosIndex(begRefPosIndex), m_endRefPosIndex(endRefPosIndex), m_begCurrQuatIndex(begCurrQuatIndex), m_endCurrQuatIndex(endCurrQuatIndex), m_begCurrPosIndex(begCurrPosIndex), m_endCurrPosIndex(endCurrPosIndex), m_ref_ls_model(ref_ls_model), m_curr_frame_model(curr_frame_model), m_curr_ls_model(curr_ls_model) {} // The implementation is further down bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(vw::Vector2 const& curr_pix, double weight, asp::RigCamInfo const& rig_cam_info, UsgsAstroLsSensorModel* ref_ls_model, UsgsAstroFrameSensorModel* curr_frame_model, UsgsAstroLsSensorModel* curr_ls_model, int begRefQuatIndex, int endRefQuatIndex, int begRefPosIndex, int endRefPosIndex, int begCurrQuatIndex, int endCurrQuatIndex, int begCurrPosIndex, int endCurrPosIndex) { // TODO(oalexan1): Try using here the analytical cost function ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new RigLsPixelReprojErr(curr_pix, weight, rig_cam_info, ref_ls_model, curr_frame_model, curr_ls_model, begRefQuatIndex, endRefQuatIndex, begRefPosIndex, endRefPosIndex, begCurrQuatIndex, endCurrQuatIndex, begCurrPosIndex, endCurrPosIndex)); // The residual size is always the same. cost_function->SetNumResiduals(PIXEL_SIZE); // Add a parameter block for each quaternion and each position for (int it = begRefQuatIndex; it < endRefQuatIndex; it++) cost_function->AddParameterBlock(NUM_QUAT_PARAMS); for (int it = begRefPosIndex; it < endRefPosIndex; it++) cost_function->AddParameterBlock(NUM_XYZ_PARAMS); // Add a parameter block for the xyz point cost_function->AddParameterBlock(NUM_XYZ_PARAMS); // Add a parameter block for the ref to curr sensor rig transform cost_function->AddParameterBlock(rig::NUM_RIGID_PARAMS); return cost_function; } private: vw::Vector2 m_curr_pix; // The pixel on the current camera (rather than ref camera) double m_weight; asp::RigCamInfo m_rig_cam_info; UsgsAstroLsSensorModel* m_ref_ls_model; UsgsAstroFrameSensorModel* m_curr_frame_model; UsgsAstroLsSensorModel* m_curr_ls_model; int m_begRefQuatIndex, m_endRefQuatIndex; int m_begRefPosIndex, m_endRefPosIndex; int m_begCurrQuatIndex, m_endCurrQuatIndex; int m_begCurrPosIndex, m_endCurrPosIndex; }; // End class RigLsPixelReprojErr // The implementation of operator() for RigLsPixelReprojErr bool RigLsPixelReprojErr::operator()(double const * const * parameters, double * residuals) const { try { // Make a copy of the model, as we will update quaternion and position // values that are being modified now. This may be expensive. // Update the shift too. UsgsAstroLsSensorModel ref_ls_cam = *m_ref_ls_model; int shift = 0; csm::EcefCoord P; updateLsModelTriPt(parameters, m_begRefQuatIndex, m_endRefQuatIndex, m_begRefPosIndex, m_endRefPosIndex, shift, ref_ls_cam, P); // Move forward in the array of parameters, then recover the ref to curr transform shift += 1; double const* ref_to_curr_trans = parameters[shift]; std::vector cam2world_vec(rig::NUM_RIGID_PARAMS); // Project in the camera with high precision. Do not use here anything lower // than 1e-8, as the CSM model can return junk. Convert to ASP pixel. double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; csm::ImageCoord imagePt; if (m_curr_frame_model != NULL) { // Current camera to world transform based on the ref cam and the rig asp::linescanToCurrSensorTrans(ref_ls_cam, m_rig_cam_info.beg_pose_time, ref_to_curr_trans, &cam2world_vec[0]); // output // Make a copy of the frame camera and set the latest position and orientation UsgsAstroFrameSensorModel curr_frame_cam = *m_curr_frame_model; for (int coord = 0; coord < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; coord++) curr_frame_cam.setParameterValue(coord, cam2world_vec[coord]); // Project the point into the frame camera imagePt = curr_frame_cam.groundToImage(P, desired_precision); } else if (m_curr_ls_model != NULL) { // Make a copy of the current linescan camera UsgsAstroLsSensorModel curr_ls_cam = *m_curr_ls_model; // Update the relevant quaternions in the local copy by interpolating // in the ref camera model and applying the rig transform. asp::updateLinescanWithRig(ref_ls_cam, ref_to_curr_trans, curr_ls_cam, // update this m_begCurrQuatIndex, m_endCurrQuatIndex, m_begCurrPosIndex, m_endCurrPosIndex); // Project the point into the frame camera imagePt = curr_ls_cam.groundToImage(P, desired_precision); } else { vw::vw_throw(vw::ArgumentErr() << "Expecting either a frame or a linescan model.\n"); } vw::Vector2 pix; asp::fromCsmPixel(pix, imagePt); // Compute the residuals residuals[0] = m_weight*(pix[0] - m_curr_pix[0]); residuals[1] = m_weight*(pix[1] - m_curr_pix[1]); } catch (std::exception const& e) { residuals[0] = g_big_pixel_value; residuals[1] = g_big_pixel_value; return true; // accept the solution anyway } return true; } // Reprojection error with ls ref sensor and frame curr sensor void addRigLsFrameReprojectionErr(asp::BaBaseOptions const & opt, asp::RigCamInfo const & rig_cam_info, vw::Vector2 const & curr_pix, double weight, UsgsAstroLsSensorModel * ref_ls_model, UsgsAstroFrameSensorModel * curr_frame_model, double * ref_to_curr_trans, double * tri_point, bool fix_rig_translations, bool fix_rig_rotations, ceres::SubsetManifold * constant_transform_manifold, ceres::Problem & problem) { // The time when the frame camera pixel was observed double frame_time = rig_cam_info.beg_pose_time; if (frame_time != rig_cam_info.end_pose_time) vw::vw_throw(vw::ArgumentErr() << "For a frame sensor beg and end pose time must be same.\n"); // The solver needs to see beyond the current time as later the poses will // change relative to the observations. Here using linescan pixels, // not the frame pixel in the input. double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case csm::ImageCoord imagePt1, imagePt2; asp::toCsmPixel(vw::Vector2(0.0, 0.0), imagePt1); asp::toCsmPixel(vw::Vector2(0.0, line_extra), imagePt2); double ans1 = ref_ls_model->getImageTime(imagePt1); double ans2 = ref_ls_model->getImageTime(imagePt2); double delta = std::abs(ans2 - ans1); double time1 = frame_time - delta; double time2 = frame_time + delta; // Find the range of indices that can affect the current pixel int numRefQuat = ref_ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; double refQuatT0 = ref_ls_model->m_t0Quat; double refQuatDt = ref_ls_model->m_dtQuat; int begRefQuatIndex = -1, endRefQuatIndex = -1; calcIndexBounds(time1, time2, refQuatT0, refQuatDt, numRefQuat, begRefQuatIndex, endRefQuatIndex); // outputs // Same for positions int numRefPos = ref_ls_model->m_positions.size() / NUM_XYZ_PARAMS; double refPosT0 = ref_ls_model->m_t0Ephem; double refPosDt = ref_ls_model->m_dtEphem; int begRefPosIndex = -1, endRefPosIndex = -1; calcIndexBounds(time1, time2, refPosT0, refPosDt, numRefPos, begRefPosIndex, endRefPosIndex); // outputs // This should not be strictly necessary, but an investigation to validate // this is not yet done. Expand, just in case. begRefQuatIndex--; endRefQuatIndex++; begRefPosIndex--; endRefPosIndex++; // Keep in bounds begRefQuatIndex = std::max(0, begRefQuatIndex); begRefPosIndex = std::max(0, begRefPosIndex); endRefQuatIndex = std::min(endRefQuatIndex, numRefQuat); endRefPosIndex = std::min(endRefPosIndex, numRefPos); // Quantities not applicable here UsgsAstroLsSensorModel * curr_ls_model = NULL; int begCurrQuatIndex = -1, endCurrQuatIndex = -1; int begCurrPosIndex = -1, endCurrPosIndex = -1; ceres::CostFunction* pixel_cost_function = RigLsPixelReprojErr::Create(curr_pix, weight, rig_cam_info, ref_ls_model, curr_frame_model, curr_ls_model, begRefQuatIndex, endRefQuatIndex, begRefPosIndex, endRefPosIndex, begCurrQuatIndex, endCurrQuatIndex, begCurrPosIndex, endCurrPosIndex); ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold); // The variable of optimization are camera quaternions and positions stored in the // camera models, the triangulated point, and the rig transform. std::vector vars; for (int it = begRefQuatIndex; it < endRefQuatIndex; it++) vars.push_back(&ref_ls_model->m_quaternions[it * NUM_QUAT_PARAMS]); for (int it = begRefPosIndex; it < endRefPosIndex; it++) vars.push_back(&ref_ls_model->m_positions[it * NUM_XYZ_PARAMS]); vars.push_back(tri_point); vars.push_back(ref_to_curr_trans); // transform from ref to curr sensor on the rig problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars); if (fix_rig_translations || fix_rig_rotations) problem.SetManifold(ref_to_curr_trans, constant_transform_manifold); } // Reprojection error with ref ls ref sensor and curr ls sensor // TODO(oalexan1): Find ways of integrating with the frame void addRigLsLsReprojectionErr(asp::BaBaseOptions const & opt, asp::RigCamInfo const & rig_cam_info, vw::Vector2 const & curr_pix, double weight, UsgsAstroLsSensorModel * ref_ls_model, UsgsAstroLsSensorModel * curr_ls_model, double * ref_to_curr_trans, double * tri_point, bool fix_rig_translations, bool fix_rig_rotations, ceres::SubsetManifold * constant_transform_manifold, ceres::Problem & problem) { // Find the positions and orientations in the current linescan model // that can affect the given pixel. Then, expand on this, as an even // bigger range in the reference sensor will affect these. double line_extra = opt.max_init_reproj_error + 5.0; // add some more just in case csm::ImageCoord imagePt1, imagePt2; asp::toCsmPixel(curr_pix - vw::Vector2(0.0, line_extra), imagePt1); asp::toCsmPixel(curr_pix + vw::Vector2(0.0, line_extra), imagePt2); double time1 = curr_ls_model->getImageTime(imagePt1); double time2 = curr_ls_model->getImageTime(imagePt2); // Find the range of indices that can affect the current pixel int numCurrQuat = curr_ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; double currQuatT0 = curr_ls_model->m_t0Quat; double currQuatDt = curr_ls_model->m_dtQuat; int begCurrQuatIndex = -1, endCurrQuatIndex = -1; calcIndexBounds(time1, time2, currQuatT0, currQuatDt, numCurrQuat, begCurrQuatIndex, endCurrQuatIndex); // outputs // Same for positions int numCurrPos = curr_ls_model->m_positions.size() / NUM_XYZ_PARAMS; double currPosT0 = curr_ls_model->m_t0Ephem; double currPosDt = curr_ls_model->m_dtEphem; int begCurrPosIndex = -1, endCurrPosIndex = -1; calcIndexBounds(time1, time2, currPosT0, currPosDt, numCurrPos, begCurrPosIndex, endCurrPosIndex); // outputs // This should not be strictly necessary, but an investigation to validate // this is not yet done. Expand, just in case. begCurrQuatIndex--; endCurrQuatIndex++; begCurrPosIndex--; endCurrPosIndex++; // Keep in bounds begCurrQuatIndex = std::max(0, begCurrQuatIndex); begCurrPosIndex = std::max(0, begCurrPosIndex); endCurrQuatIndex = std::min(endCurrQuatIndex, numCurrQuat); endCurrPosIndex = std::min(endCurrPosIndex, numCurrPos); // Expand these to see the effect of the reference sensor time1 = std::min(currQuatT0 + begCurrQuatIndex * currQuatDt, currPosT0 + begCurrPosIndex * currPosDt); time2 = std::max(currQuatT0 + endCurrQuatIndex * currQuatDt, currPosT0 + endCurrPosIndex * currPosDt); // Ref quaternions int numRefQuat = ref_ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; double refQuatT0 = ref_ls_model->m_t0Quat; double refQuatDt = ref_ls_model->m_dtQuat; int begRefQuatIndex = -1, endRefQuatIndex = -1; calcIndexBounds(time1, time2, refQuatT0, refQuatDt, numRefQuat, begRefQuatIndex, endRefQuatIndex); // outputs // Ref positions int numRefPos = ref_ls_model->m_positions.size() / NUM_XYZ_PARAMS; double refPosT0 = ref_ls_model->m_t0Ephem; double refPosDt = ref_ls_model->m_dtEphem; int begRefPosIndex = -1, endRefPosIndex = -1; calcIndexBounds(time1, time2, refPosT0, refPosDt, numRefPos, begRefPosIndex, endRefPosIndex); // outputs // Quantities not applicable here UsgsAstroFrameSensorModel * curr_frame_model = NULL; ceres::CostFunction* pixel_cost_function = RigLsPixelReprojErr::Create(curr_pix, weight, rig_cam_info, ref_ls_model, curr_frame_model, curr_ls_model, begRefQuatIndex, endRefQuatIndex, begRefPosIndex, endRefPosIndex, begCurrQuatIndex, endCurrQuatIndex, begCurrPosIndex, endCurrPosIndex); ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold); // The variable of optimization are camera quaternions and positions stored in the // camera models, the triangulated point, and the rig transform. std::vector vars; for (int it = begRefQuatIndex; it < endRefQuatIndex; it++) vars.push_back(&ref_ls_model->m_quaternions[it * NUM_QUAT_PARAMS]); for (int it = begRefPosIndex; it < endRefPosIndex; it++) vars.push_back(&ref_ls_model->m_positions[it * NUM_XYZ_PARAMS]); vars.push_back(tri_point); vars.push_back(ref_to_curr_trans); // transform from ref to curr sensor on the rig problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars); if (fix_rig_translations || fix_rig_rotations) problem.SetManifold(ref_to_curr_trans, constant_transform_manifold); } // An error function minimizing the error of projecting an xyz point into a // given CSM frame camera pixel that is on a rig with a frame camera ref // sensor. The variables of optimization are the ref cam bracketing // positions and orientations, the triangulation point, and the // transform from the ref frame sensor to the current frame sensor. struct RigFramePixelReprojErr { RigFramePixelReprojErr(vw::Vector2 const& curr_pix, double weight, asp::RigCamInfo const& rig_cam_info, UsgsAstroFrameSensorModel * curr_frame_model, double beg_ref_time, double end_ref_time): m_curr_pix(curr_pix), m_weight(weight), m_rig_cam_info(rig_cam_info), m_curr_frame_model(curr_frame_model), m_beg_ref_time(beg_ref_time), m_end_ref_time(end_ref_time) {} // The implementation is further down bool operator()(double const * const * parameters, double * residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(vw::Vector2 const& curr_pix, double weight, asp::RigCamInfo const& rig_cam_info, UsgsAstroFrameSensorModel* curr_frame_model, double beg_ref_time, double end_ref_time) { // TODO(oalexan1): Try using here the analytical cost function ceres::DynamicNumericDiffCostFunction* cost_function = new ceres::DynamicNumericDiffCostFunction (new RigFramePixelReprojErr(curr_pix, weight, rig_cam_info, curr_frame_model, beg_ref_time, end_ref_time)); // Add a parameter block for beg and end positions cost_function->AddParameterBlock(NUM_XYZ_PARAMS); cost_function->AddParameterBlock(NUM_XYZ_PARAMS); // Add a parameter block for beg and end quaternions cost_function->AddParameterBlock(NUM_QUAT_PARAMS); cost_function->AddParameterBlock(NUM_QUAT_PARAMS); // Add a parameter block for the ref to curr sensor rig transform cost_function->AddParameterBlock(rig::NUM_RIGID_PARAMS); // Add a parameter block for the xyz point cost_function->AddParameterBlock(NUM_XYZ_PARAMS); // The residual size the pixel size cost_function->SetNumResiduals(PIXEL_SIZE); return cost_function; } private: vw::Vector2 m_curr_pix; // The pixel on the current camera (rather than ref camera) double m_weight; asp::RigCamInfo m_rig_cam_info; UsgsAstroFrameSensorModel* m_curr_frame_model; double m_beg_ref_time, m_end_ref_time; }; // End class RigFramePixelReprojErr // The implementation of operator() for RigFramePixelReprojErr bool RigFramePixelReprojErr::operator()(double const * const * parameters, double * residuals) const { try { double const* beg_frame_xyz_arr = parameters[0]; double const* end_frame_xyz_arr = parameters[1]; double const* beg_frame_quat_arr = parameters[2]; double const* end_frame_quat_arr = parameters[3]; double const* ref_to_curr_trans = parameters[4]; double const* tri_point = parameters[5]; double frame_time = m_rig_cam_info.beg_pose_time; // Must concatenate the position and orientation arrays double beg_frame_arr[rig::NUM_RIGID_PARAMS]; double end_frame_arr[rig::NUM_RIGID_PARAMS]; for (int i = 0; i < NUM_XYZ_PARAMS; i++) { beg_frame_arr[i] = beg_frame_xyz_arr[i]; end_frame_arr[i] = end_frame_xyz_arr[i]; } for (int i = 0; i < NUM_QUAT_PARAMS; i++) { beg_frame_arr[NUM_XYZ_PARAMS + i] = beg_frame_quat_arr[i]; end_frame_arr[NUM_XYZ_PARAMS + i] = end_frame_quat_arr[i]; } // Find the interpolated current cam2world transform double cam2world_arr[rig::NUM_RIGID_PARAMS]; asp::interpCurrPose(m_beg_ref_time, m_end_ref_time, frame_time, beg_frame_arr, end_frame_arr, ref_to_curr_trans, cam2world_arr); // Make a copy of the model, and set the latest position and orientation. UsgsAstroFrameSensorModel curr_frame_cam = *m_curr_frame_model; for (int coord = 0; coord < rig::NUM_RIGID_PARAMS; coord++) curr_frame_cam.setParameterValue(coord, cam2world_arr[coord]); // Convert the 3D point to a CSM object csm::EcefCoord P; P.x = tri_point[0]; P.y = tri_point[1]; P.z = tri_point[2]; // Project in the camera with high precision. Do not use here anything lower // than 1e-8, as the CSM model can return junk. double desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; csm::ImageCoord imagePt = curr_frame_cam.groundToImage(P, desired_precision); // Convert to ASP pixel vw::Vector2 pix; asp::fromCsmPixel(pix, imagePt); // Compute the residuals residuals[0] = m_weight*(pix[0] - m_curr_pix[0]); residuals[1] = m_weight*(pix[1] - m_curr_pix[1]); } catch (std::exception const& e) { residuals[0] = g_big_pixel_value; residuals[1] = g_big_pixel_value; return true; // accept the solution anyway } return true; } // Reprojection error with ls ref sensor and frame curr sensor void addRigFrameFrameReprojectionErr(asp::BaBaseOptions const & opt, asp::RigCamInfo const & rig_cam_info, std::vector const& csm_models, std::map const & cam2group, TimestampMap const & timestamp_map, vw::Vector2 const & curr_pix, double weight, UsgsAstroFrameSensorModel * curr_frame_model, std::vector & frame_params, double * ref_to_curr_trans, double * tri_point, bool fix_rig_translations, bool fix_rig_rotations, ceres::SubsetManifold * constant_transform_manifold, ceres::Problem & problem) { double beg_ref_time = 0.0, end_ref_time = 0.0; int beg_ref_index = 0, end_ref_index = 0; bool success = timestampBrackets(rig_cam_info, cam2group, timestamp_map, // Outputs beg_ref_time, end_ref_time, beg_ref_index, end_ref_index); if (!success) return; double * beg_frame_arr = &frame_params[beg_ref_index * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; double * end_frame_arr = &frame_params[end_ref_index * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; ceres::CostFunction* pixel_cost_function = RigFramePixelReprojErr::Create(curr_pix, weight, rig_cam_info, curr_frame_model, beg_ref_time, end_ref_time); ceres::LossFunction* pixel_loss_function = new ceres::CauchyLoss(opt.robust_threshold); // The variable of optimization are bracketing ref camera poses, stored // separately as position and orientation, the rig transform, and the // triangulated point. std::vector vars; vars.push_back(&beg_frame_arr[0]); vars.push_back(&end_frame_arr[0]); vars.push_back(&beg_frame_arr[NUM_XYZ_PARAMS]); vars.push_back(&end_frame_arr[NUM_XYZ_PARAMS]); vars.push_back(ref_to_curr_trans); vars.push_back(tri_point); problem.AddResidualBlock(pixel_cost_function, pixel_loss_function, vars); if (fix_rig_translations || fix_rig_rotations) problem.SetManifold(ref_to_curr_trans, constant_transform_manifold); } // Add the ls or frame camera model reprojection error to the cost function void addRigLsOrFrameReprojectionErr(asp::BaBaseOptions const & opt, int icam, UsgsAstroLsSensorModel * ref_ls_model, UsgsAstroFrameSensorModel * ref_frame_model, UsgsAstroLsSensorModel * ls_model, UsgsAstroFrameSensorModel * frame_model, std::vector & frame_params, std::vector const& csm_models, std::map const& cam2group, TimestampMap const & timestamp_map, vw::Vector2 const & pix_obs, double pix_wt, double * tri_point, double * ref_to_curr_sensor_trans, asp::RigCamInfo const & rig_info, bool fix_rig_translations, bool fix_rig_rotations, ceres::Problem & problem) { // Prepare for the case of fixed rig translations and/or rotations ceres::SubsetManifold* constant_transform_manifold = nullptr; bool no_rig = false; rig::setUpFixRigOptions(no_rig, fix_rig_translations, fix_rig_rotations, constant_transform_manifold); if (ref_ls_model != NULL) { // Sanity check: the current pixel time must be in bounds double curr_time = -1.0; if (frame_model != NULL) { curr_time = rig_info.beg_pose_time; } else if (ls_model != NULL) { csm::ImageCoord imagePt; asp::toCsmPixel(pix_obs, imagePt); curr_time = ls_model->getImageTime(imagePt); } double beg_ref_time = -1.0, end_ref_time = -1.0; asp::linescanTimeBounds(ref_ls_model, beg_ref_time, end_ref_time); if (curr_time < beg_ref_time || curr_time > end_ref_time) vw::vw_throw(vw::ArgumentErr() << std::setprecision(17) << "Time " << curr_time << " is outside the time range of the reference sensor, which is: " << beg_ref_time << ' ' << end_ref_time << ".\n" << "This may also be due to mixup of image and camera order, or because of " << "anchor points far out of range. Offending pixel: " << pix_obs << ".\n"); // Ref sensor is linescan if (frame_model != NULL) addRigLsFrameReprojectionErr(opt, rig_info, pix_obs, pix_wt, ref_ls_model, frame_model, ref_to_curr_sensor_trans, tri_point, fix_rig_translations, fix_rig_rotations, constant_transform_manifold, problem); else if (ls_model != NULL) addRigLsLsReprojectionErr(opt, rig_info, pix_obs, pix_wt, ref_ls_model, ls_model, ref_to_curr_sensor_trans, tri_point, fix_rig_translations, fix_rig_rotations, constant_transform_manifold, problem); else vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } else if (ref_frame_model != NULL) { // The check for time being in bounds will be done when attempting to interpolate if (frame_model != NULL) addRigFrameFrameReprojectionErr(opt, rig_info, csm_models, cam2group, timestamp_map, pix_obs, pix_wt, frame_model, frame_params, ref_to_curr_sensor_trans, tri_point, fix_rig_translations, fix_rig_rotations, constant_transform_manifold, problem); else if (ls_model != NULL) vw::vw_throw(vw::ArgumentErr() << "When the reference sensor is frame, " << "the other sensors must also be frame.\n"); else vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } } } // end namespace asp ================================================ FILE: src/asp/Camera/JitterSolveRigCostFuns.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file JitterSolveCostFuns.h // Cost functions used in solving for jitter. These need access to the camera // models, so they are stored in the Camera folder. The bigger functions defined // here are implemented in the .cc file. #ifndef __ASP_CAMERA_JITTER_SOLVE_RIG_COST_FUNS_H__ #define __ASP_CAMERA_JITTER_SOLVE_RIG_COST_FUNS_H__ #include #include #include #include #include class UsgsAstroLsSensorModel; class UsgsAstroFrameSensorModel; namespace asp { struct BaBaseOptions; // Add the ls or frame camera model reprojection error to the cost function void addRigLsOrFrameReprojectionErr(asp::BaBaseOptions const & opt, int icam, UsgsAstroLsSensorModel * ref_ls_model, UsgsAstroFrameSensorModel * ref_frame_model, UsgsAstroLsSensorModel * ls_model, UsgsAstroFrameSensorModel * frame_model, std::vector & frame_params, std::vector const& csm_models, std::map const & cam2group, TimestampMap const & timestamp_map, vw::Vector2 const & pix_obs, double pix_wt, double * tri_point, double * ref_to_curr_sensor_trans, asp::RigCamInfo const & rig_info, bool fix_rig_translations, bool fix_rig_rotations, ceres::Problem & problem); } // end namespace asp #endif //__ASP_CAMERA_JITTER_SOLVE_RIG_COST_FUNS_H__ ================================================ FILE: src/asp/Camera/JitterSolveRigUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Functions invoked in jitter_solve.cc that use a rig. #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // Constructor for class RigCamInfo. Initialize all fields to NaN to ensure full // initialization later. That is important, because initialization happens over // many stages and we want to catch any errors. RigCamInfo::RigCamInfo() { double nan = std::numeric_limits::quiet_NaN(); sensor_id = nan; sensor_type = RIG_LINESCAN_SENSOR; mid_group_time = nan; beg_pose_time = nan; end_pose_time = nan; cam_index = nan; ref_cam_index = nan; } // Find the time bounds for a linescan sensor void linescanTimeBounds(UsgsAstroLsSensorModel const* ls_model, // Outputs double & beg_time, double & end_time) { int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS; double beg_pos_time = ls_model->m_t0Ephem; double pos_dt = ls_model->m_dtEphem; double end_pos_time = beg_pos_time + (numPos - 1) * pos_dt; int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; double beg_quat_time = ls_model->m_t0Quat; double quat_dt = ls_model->m_dtQuat; double end_quat_time = beg_quat_time + (numQuat - 1) * quat_dt; beg_time = std::max(beg_pos_time, beg_quat_time); end_time = std::min(end_pos_time, end_quat_time); } // First pass at collecting info about relationships between cameras and the rig void populateInitRigCamInfo(rig::RigSet const& rig, std::vector const& image_files, std::vector const& camera_files, std::vector const& csm_models, // Outputs std::vector & rig_cam_info) { int num_images = csm_models.size(); rig_cam_info.resize(num_images); // Sanity check if (num_images != (int)image_files.size() || num_images != (int)camera_files.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting the number of cameras to match the number of images.\n"); for (int i = 0; i < num_images; i++) { auto & rig_info = rig_cam_info[i]; // alias // Each camera must know where it belongs, and other info rig_info.cam_index = i; rig_info.image_file = image_files[i]; rig_info.camera_file = camera_files[i]; // Get the underlying linescan model or frame model asp::CsmModel * csm_cam = csm_models[i]; UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_cam->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_cam->m_gm_model).get()); int sensor_id = -1; std::string group; if (frame_model != NULL) { double timestamp = -1.0; rig::findCamTypeAndTimestamp(camera_files[i], rig.cam_names, sensor_id, timestamp, group); // outputs rig_info.sensor_type = RIG_FRAME_SENSOR; rig_info.sensor_id = sensor_id; rig_info.rig_group = group; // The mid_group_time will be the mid time for the frame group, to be filled later. rig_info.beg_pose_time = timestamp; rig_info.end_pose_time = timestamp; // Image files must have the same convention as camera files. rig::findCamTypeAndTimestamp(image_files[i], rig.cam_names, sensor_id, timestamp, group); // outputs if (sensor_id != rig_info.sensor_id || timestamp != rig_info.beg_pose_time || group != rig_info.rig_group) vw::vw_throw(vw::ArgumentErr() << "Mismatch between image and camera name. " << "Image: " << image_files[i] << ", camera: " << camera_files[i] << "\n"); } else if (ls_model != NULL) { rig::findCamTypeAndGroup(camera_files[i], rig.cam_names, sensor_id, group); // outputs // Each pose has a timestamp. The mid group time is a compromise between // the timestamps of the poses in each group. int numLines = ls_model->m_nLines; csm::ImageCoord imagePt; asp::toCsmPixel(vw::Vector2(0, numLines/2.0), imagePt); rig_info.sensor_type = RIG_LINESCAN_SENSOR; rig_info.sensor_id = sensor_id; rig_info.rig_group = group; rig_info.mid_group_time = ls_model->getImageTime(imagePt); // Find the time bounds for the linescan sensor linescanTimeBounds(ls_model, rig_info.beg_pose_time, rig_info.end_pose_time); // Image files must have the same convention as camera files. rig::findCamTypeAndGroup(image_files[i], rig.cam_names, sensor_id, group); // outputs if (sensor_id != rig_info.sensor_id || group != rig_info.rig_group) vw::vw_throw(vw::ArgumentErr() << "Mismatch between image and camera name. " << "Image: " << image_files[i] << ", camera: " << camera_files[i] << "\n"); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } } } // For each group of frame cameras, find the map from each timestamp to the index // of the camera in the full array of cameras. void populateTimestampMap(std::map const& cam2group, std::vector const& rig_cam_info, TimestampMap & timestamp_map) { timestamp_map.clear(); for (int icam = 0; icam < (int)rig_cam_info.size(); icam++) { auto const& info = rig_cam_info[icam]; // alias if (info.sensor_type != RIG_FRAME_SENSOR) continue; int group = rig::mapVal(cam2group, icam); timestamp_map[group][info.beg_pose_time] = icam; } } // Each frame camera will have a timestamp. Find the median timestamp for each group // of such cameras. void populateFrameGroupMidTimestamp(std::vector const& csm_models, std::map const& cam2group, TimestampMap const& timestamp_map, // Outputs std::vector & rig_cam_info) { int num_cams = csm_models.size(); for (int icam = 0; icam < num_cams; icam++) { UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (frame_model == NULL) continue; // Skip non-frame cameras int group_id = rig::mapVal(cam2group, icam); auto g_it = timestamp_map.find(group_id); if (g_it == timestamp_map.end()) vw::vw_throw(vw::ArgumentErr() << "Failed to find group in timestamps.\n"); // Put the keys in a vector auto map = g_it->second; std::vector timestamps; for (auto const& p: map) timestamps.push_back(p.first); // Find the median double median = vw::math::destructive_median(timestamps); rig_cam_info[icam].mid_group_time = median; } } // For each camera, find the camera closest in time that was acquired with the // reference sensor on the same rig as the current camera. The complexity of // this is total number of cameras times the number of cameras acquired with // a reference sensor. Something more clever did not work, and this may be // good enough. // TODO(oalexan1): Decrease the complexity of this function. Use binary search. // Also process each rig group separately. void findClosestRefCamera(rig::RigSet const& rig, std::vector const& csm_models, std::vector & rig_cam_info) { // Find the cameras acquired with the reference sensor on a rig int num_cams = csm_models.size(); std::vector ref_sensor_cams; for (int icam = 0; icam < num_cams; icam++) { auto const& info = rig_cam_info[icam]; // alias if (!rig.isRefSensor(info.sensor_id)) continue; ref_sensor_cams.push_back(icam); } for (int icam = 0; icam < num_cams; icam++) { auto const& info = rig_cam_info[icam]; // alias int sensor_id = info.sensor_id; int ref_sensor_id = rig.refSensorId(info.sensor_id); // Iterate over ref cameras double max_time = std::numeric_limits::max(); for (int ref_cam_index: ref_sensor_cams) { auto const& ref_info = rig_cam_info[ref_cam_index]; // alias // The rig group must be non-empty if (info.rig_group.empty() || ref_info.rig_group.empty()) vw::vw_throw(vw::ArgumentErr() << "Empty rig group.\n"); // Both must be in the same rig group if (ref_info.rig_group != info.rig_group) continue; int ref_sensor_id2 = rig.refSensorId(ref_info.sensor_id); // This must be a ref sensor if (ref_sensor_id2 != ref_info.sensor_id) vw::vw_throw(vw::ArgumentErr() << "Expecting a ref sensor.\n"); if (ref_sensor_id2 != ref_sensor_id) continue; // Not the same ref sensor // See if it is closer than the current best double dt = std::abs(ref_info.mid_group_time - info.mid_group_time); if (dt >= max_time) continue; max_time = dt; rig_cam_info[icam].ref_cam_index = ref_info.cam_index; } // end iterating over ref sensor cameras } // end iterating over cameras } // Find the times and indices bracketing a given time bool timestampBrackets(double time, std::map const& timestamps, // Outputs double & time1, double & time2, int & index1, int & index2) { // Initialize the outputs to something time1 = 0.0; time2 = 0.0; index1 = 0; index2 = 0; double first_time = timestamps.begin()->first; double last_time = timestamps.rbegin()->first; // This is a very important check. We cannot extrapolate in time. // TODO(oalexan1): Offending cameras better be filtered out before this point. if (time < first_time || time > last_time) LOG(FATAL) << "Found a timestamp for a frame sensor that is not within the " << "range of timestamps for the reference sensor. Such data must be manually " << "excluded. Offending time: " << std::setprecision(17) << time << "\n"; // Find the time no earlier than time auto it = timestamps.lower_bound(time); if (it == timestamps.end()) { return false; // out of bounds } time2 = it->first; index2 = it->second; // Must have index1 < index2, as later we need two independent poses // at end points when we optimize them. if (it == timestamps.begin()) { if (timestamps.size() == 1) LOG(FATAL) << "Too few timestamps.\n"; time1 = it->first; index1 = it->second; it++; time2 = it->first; index2 = it->second; } else { it--; time1 = it->first; index1 = it->second; } // Very important checks if (index1 == index2) LOG(FATAL) << "Bookkeeping failure in timestamps: equal indices.\n"; if (time1 == time2) LOG(FATAL) << "Bookkeeping failure in timestamps: equal times.\n"; if (time < time1 || time > time2) LOG(FATAL) << "Bookkeeping failure in timestamps: time out of bounds.\n"; return true; } // Find the timestamps bracketing the camera with the given rig_cam_info. // This is a wrapper around the above function. bool timestampBrackets(asp::RigCamInfo const & rig_cam_info, std::map const & cam2group, TimestampMap const & timestamp_map, // Outputs double & beg_ref_time, double & end_ref_time, int & beg_ref_index, int & end_ref_index) { // Initialize the outputs beg_ref_time = -1.0; end_ref_time = -1.0; beg_ref_index = -1; end_ref_index = -1; double frame_time = rig_cam_info.beg_pose_time; if (frame_time != rig_cam_info.end_pose_time) vw::vw_throw(vw::ArgumentErr() << "For a frame sensor beg and end pose time must be same.\n"); int icam = rig_cam_info.cam_index; int ref_icam = rig_cam_info.ref_cam_index; int ref_group = rig::mapVal(cam2group, ref_icam); auto const& ref_timestamps = rig::mapVal(timestamp_map, ref_group); bool success = timestampBrackets(frame_time, ref_timestamps, // Outputs beg_ref_time, end_ref_time, beg_ref_index, end_ref_index); return success; } // Given two poses, each as x, y, z, qx, qy, qz, qw, linearly interpolate between them. void interpPose(double time1, double time2, double const* pose1, double const* pose2, double time, // Output double* pose) { double alpha = (time - time1)/(time2 - time1); if (time1 == time2) alpha = 0.0; // Corner case for (int i = 0; i < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; i++) pose[i] = pose1[i] + alpha*(pose2[i] - pose1[i]); // Normalize the quaternion double * q = pose + NUM_XYZ_PARAMS; double norm = sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]); for (int i = 0; i < NUM_QUAT_PARAMS; i++) q[i] /= norm; } // Given reference poses at time1 and time2, a time in between, and the transform // from the rig from the reference to the current sensor, find the current sensor // pose (camera-to-world) at the given time. void interpCurrPose(double time1, double time2, double time, double const* pose1, double const* pose2, double const* ref_to_curr_trans, // Output double * cam2world_arr) { // Interpolate the reference poses, and convert to a transform double r[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS]; interpPose(time1, time2, pose1, pose2, time, r); Eigen::Affine3d ref_cam2world = asp::calcTransform(r[0], r[1], r[2], r[3], r[4], r[5], r[6]); // Convert the reference to current transform array to a transform Eigen::Affine3d ref_to_curr_trans_aff; rig::array_to_rigid_transform(ref_to_curr_trans_aff, ref_to_curr_trans); // Apply the rig constraint Eigen::Affine3d cam2world = ref_cam2world * ref_to_curr_trans_aff.inverse(); // Convert to an array rig::rigid_transform_to_array(cam2world, cam2world_arr); } // Given a map from timestamps to frame camera indices in csm_models, do linear // interpolation in time. Return false if out of bounds. // TODO(oalexan1): Must allow some slack at end points, so do a little extrapolation. bool interpFramePose(std::vector const& csm_models, std::map const& timestamps, double time, // Output Eigen::Affine3d & cam2world) { double time1 = 0.0, time2 = 0.0; int index1 = 0, index2 = 0; bool success = timestampBrackets(time, timestamps, time1, time2, index1, index2); if (!success) return false; // Position and orientation at time1 double a[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS]; csm_models[index1]->frame_position(a[0], a[1], a[2]); csm_models[index1]->frame_quaternion(a[3], a[4], a[5], a[6]); // Position and orientation at time2 double b[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS]; csm_models[index2]->frame_position(b[0], b[1], b[2]); csm_models[index2]->frame_quaternion(b[3], b[4], b[5], b[6]); double c[NUM_XYZ_PARAMS + NUM_QUAT_PARAMS]; interpPose(time1, time2, a, b, time, c); // Convert to a transform cam2world = asp::calcTransform(c[0], c[1], c[2], c[3], c[4], c[5], c[6]); return true; } bool calcInterpRefCamToWorld(std::vector const& csm_models, std::vector const& rig_cam_info, // all cam info RigCamInfo const& rig_info, // current cam info UsgsAstroFrameSensorModel * ref_frame_model, UsgsAstroLsSensorModel * ref_ls_model, std::map const& cam2group, TimestampMap const& timestamp_map, int ref_icam, double time, // Output Eigen::Affine3d & ref_cam2world) { if (ref_frame_model != NULL) { // Find the interpolated ref cam at the current time. int ref_group = rig::mapVal(cam2group, ref_icam); std::map const& ref_timestamps = rig::mapVal(timestamp_map, ref_group); bool success = interpFramePose(csm_models, ref_timestamps, time, ref_cam2world); if (!success) return false; } else if (ref_ls_model != NULL) { // Ensure we stay in bounds if (time < rig_info.beg_pose_time || time < rig_cam_info[ref_icam].beg_pose_time || time > rig_info.end_pose_time || time > rig_cam_info[ref_icam].end_pose_time) return false; double ref_pos[3], ref_q[4]; asp::interpPositions(ref_ls_model, time, ref_pos); asp::interpQuaternions(ref_ls_model, time, ref_q); ref_cam2world = asp::calcTransform(ref_pos[0], ref_pos[1], ref_pos[2], ref_q[0], ref_q[1], ref_q[2], ref_q[3]); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown camera model.\n"); } return true; } // Given all camera-to-world transforms, find the median rig transforms. // This is robust to outliers. Must handle both frame and linescan cameras // for both the ref and curr sensor, which is 4 cases. void calcRigTransforms(rig::RigSet const& rig, std::vector const& csm_models, std::vector const& rig_cam_info, std::map const& cam2group, TimestampMap const& timestamp_map, bool use_initial_rig_transforms, // Outputs std::vector & ref_to_curr_sensor_vec) { int num_rig_sensors = rig.cam_names.size(); ref_to_curr_sensor_vec.resize(rig::NUM_RIGID_PARAMS * num_rig_sensors, 0.0); if (use_initial_rig_transforms) { // Pack the initial rig transforms into the output vector for (int sensor_id = 0; sensor_id < num_rig_sensors; sensor_id++) rig::rigid_transform_to_array(rig.ref_to_cam_trans[sensor_id], &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]); return; } std::map> transforms_map; for (int icam = 0; icam < (int)csm_models.size(); icam++) { auto const& rig_info = rig_cam_info[icam]; // alias Eigen::Affine3d ref_to_curr; // Get the underlying linescan model or frame model asp::CsmModel * csm_cam = csm_models[icam]; UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_cam->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_cam->m_gm_model).get()); // Find the ref camera int ref_cam_index = rig_info.ref_cam_index; UsgsAstroLsSensorModel * ref_ls_model = dynamic_cast(csm_models[ref_cam_index]->m_gm_model.get()); UsgsAstroFrameSensorModel * ref_frame_model = dynamic_cast(csm_models[ref_cam_index]->m_gm_model.get()); int sensor_id = rig_info.sensor_id; if (rig.isRefSensor(sensor_id)) { // The transform from a reference sensor to itself is the identity ref_to_curr.setIdentity(); transforms_map[sensor_id].push_back(ref_to_curr.matrix()); continue; } int ref_icam = rig_info.ref_cam_index; // Assume the ref sensor is a linescan sensor if (ls_model != NULL) { // Iterate over pose samples, and find the transform from the reference // sensor to the current sensor at each sample time. int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS; double beg_pos_time = ls_model->m_t0Ephem; double pos_dt = ls_model->m_dtEphem; for (int i = 0; i < numPos; i++) { double time = beg_pos_time + i * pos_dt; // Current camera position and orientation double pos[3], q[4]; asp::interpPositions(ls_model, time, pos); asp::interpQuaternions(ls_model, time, q); Eigen::Affine3d cam2world = asp::calcTransform(pos[0], pos[1], pos[2], q[0], q[1], q[2], q[3]); // Ref camera position and orientation Eigen::Affine3d ref_cam2world; bool success = calcInterpRefCamToWorld(csm_models, rig_cam_info, rig_info, ref_frame_model, ref_ls_model, cam2group, timestamp_map, ref_icam, time, // Output ref_cam2world); if (!success) continue; ref_to_curr = cam2world.inverse() * ref_cam2world; transforms_map[sensor_id].push_back(ref_to_curr.matrix()); } } else if (frame_model != NULL) { // This is the precise acquisition time double time = rig_info.beg_pose_time; // Find current frame cam position and orientation double x, y, z, qx, qy, qz, qw; csm_models[icam]->frame_position(x, y, z); csm_models[icam]->frame_quaternion(qx, qy, qz, qw); Eigen::Affine3d cam2world = asp::calcTransform(x, y, z, qx, qy, qz, qw); // Find reference linescan cam position and orientation Eigen::Affine3d ref_cam2world; bool success = calcInterpRefCamToWorld(csm_models, rig_cam_info, rig_info, ref_frame_model, ref_ls_model, cam2group, timestamp_map, ref_icam, time, // Output ref_cam2world); if (!success) continue; ref_to_curr = cam2world.inverse() * ref_cam2world; transforms_map[sensor_id].push_back(ref_to_curr.matrix()); } } // End loop through cameras // Find the median, for robustness. for (auto it = transforms_map.begin(); it != transforms_map.end(); it++) { int sensor_id = it->first; auto & transforms = it->second; if (transforms.empty()) LOG(FATAL) << "No poses were found for rig sensor with id: " << sensor_id << "\n"; Eigen::Affine3d median_trans; median_trans.matrix() = rig::median_matrix(transforms); // Normalize the linear component of median_trans median_trans.linear() /= pow(median_trans.linear().determinant(), 1.0 / 3.0); // Pack the median transform into the output vector rig::rigid_transform_to_array(median_trans, &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]); } return; } // Update the rig with the optimized transforms void updateRig(std::vector const& ref_to_curr_sensor_vec, rig::RigSet & rig) { int num_rig_sensors = rig.cam_names.size(); for (int sensor_id = 0; sensor_id < num_rig_sensors; sensor_id++) { rig::array_to_rigid_transform (rig.ref_to_cam_trans[sensor_id], &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]); } } // Find the relationship between the cameras relative to the rig void populateRigCamInfo(rig::RigSet const& rig, std::vector const& image_files, std::vector const& camera_files, std::vector const& csm_models, std::map const& cam2group, bool use_initial_rig_transforms, // Outputs std::vector & rig_cam_info, std::vector & ref_to_curr_sensor_vec, TimestampMap & timestamp_map) { // Print a message, as this can take time vw::vw_out() << "Determining the rig relationships between the cameras.\n"; // Initialize the rig cam info after a first pass through the cameras populateInitRigCamInfo(rig, image_files, camera_files, csm_models, rig_cam_info); // Find a map that from each group to timestamps and indices in that group populateTimestampMap(cam2group, rig_cam_info, timestamp_map); // Find the mid time for each frame group as the median of the group timestamps populateFrameGroupMidTimestamp(csm_models, cam2group, timestamp_map, rig_cam_info); // For each camera find the closest camera within the rig and group // that is acquired with the reference sensor findClosestRefCamera(rig, csm_models, rig_cam_info); // Find the initial guess rig transforms based on all camera-to-world transforms calcRigTransforms(rig, csm_models, rig_cam_info, cam2group, timestamp_map, use_initial_rig_transforms, ref_to_curr_sensor_vec); } // Given a reference linescan camera and the transform from it to the current // camera, find the current camera to world transform as an array. void linescanToCurrSensorTrans(UsgsAstroLsSensorModel const& ref_ls_cam, double curr_time, double const* ref_to_curr_trans, // Output double * cam2world_arr) { Eigen::Affine3d ref_to_curr_trans_aff; rig::array_to_rigid_transform(ref_to_curr_trans_aff, ref_to_curr_trans); // The transform from the reference camera to the world. We assume // the linescan and frame cameras use the same clock. double ref_pos[3], ref_q[4]; asp::interpPositions(&ref_ls_cam, curr_time, ref_pos); asp::interpQuaternions(&ref_ls_cam, curr_time, ref_q); Eigen::Affine3d ref_cam2world = asp::calcTransform(ref_pos[0], ref_pos[1], ref_pos[2], ref_q[0], ref_q[1], ref_q[2], ref_q[3]); // Apply the rig constraint Eigen::Affine3d cam2world = ref_cam2world * ref_to_curr_trans_aff.inverse(); // Convert to an array rig::rigid_transform_to_array(cam2world, cam2world_arr); } // Given a frame linescan camera and the transform from it to the current // camera, find the current camera to world transform as an array. void frameToCurrSensorTrans(std::vector const& frame_params, asp::RigCamInfo const& rig_cam_info, std::map const& cam2group, TimestampMap const& timestamp_map, double const* ref_to_curr_trans, // Output double * cam2world_arr) { double beg_ref_time = 0.0, end_ref_time = 0.0; int beg_ref_index = 0, end_ref_index = 0; bool success = timestampBrackets(rig_cam_info, cam2group, timestamp_map, // Outputs beg_ref_time, end_ref_time, beg_ref_index, end_ref_index); if (!success) vw::vw_throw(vw::ArgumentErr() << "Failed to find the bracketing times.\n"); // The pointers to the bracketing frame camera parameters double const* beg_frame_arr = &frame_params[beg_ref_index * rig::NUM_RIGID_PARAMS]; double const* end_frame_arr = &frame_params[end_ref_index * rig::NUM_RIGID_PARAMS]; // Find the interpolated current cam2world transform double frame_time = rig_cam_info.beg_pose_time; asp::interpCurrPose(beg_ref_time, end_ref_time, frame_time, beg_frame_arr, end_frame_arr, ref_to_curr_trans, cam2world_arr); } // Given a reference linescan camera and the transform from it to the current // linescan camera, update the the current camera poses within the given range. void updateLinescanWithRig(UsgsAstroLsSensorModel const& ref_ls_cam, double const* ref_to_curr_trans, UsgsAstroLsSensorModel & curr_ls_cam, // update this // Range of quat and position indices to update. // The default is to update all. int beg_quat_index, int end_quat_index, int beg_pos_index, int end_pos_index) { // See if have to update the whole range of quats and positions if (beg_quat_index < 0 || end_quat_index < 0) { beg_quat_index = 0; end_quat_index = curr_ls_cam.m_quaternions.size() / NUM_QUAT_PARAMS; } if (beg_pos_index < 0 || end_pos_index < 0) { beg_pos_index = 0; end_pos_index = curr_ls_cam.m_positions.size() / NUM_XYZ_PARAMS; } std::vector cam2world_vec(rig::NUM_RIGID_PARAMS); double currQuatT0 = curr_ls_cam.m_t0Quat; double currQuatDt = curr_ls_cam.m_dtQuat; double currPosT0 = curr_ls_cam.m_t0Ephem; double currPosDt = curr_ls_cam.m_dtEphem; // Update the quaternions for (int qi = beg_quat_index; qi < end_quat_index; qi++) { double t = currQuatT0 + qi * currQuatDt; asp::linescanToCurrSensorTrans(ref_ls_cam, t, ref_to_curr_trans, &cam2world_vec[0]); // output for (int coord = 0; coord < NUM_QUAT_PARAMS; coord++) curr_ls_cam.m_quaternions[qi * NUM_QUAT_PARAMS + coord] = cam2world_vec[coord + NUM_XYZ_PARAMS]; } // Update the positions for (int pi = beg_pos_index; pi < end_pos_index; pi++) { double t = currPosT0 + pi * currPosDt; asp::linescanToCurrSensorTrans(ref_ls_cam, t, ref_to_curr_trans, &cam2world_vec[0]); // output for (int coord = 0; coord < NUM_XYZ_PARAMS; coord++) curr_ls_cam.m_positions[pi * NUM_XYZ_PARAMS + coord] = cam2world_vec[coord]; } } } // end namespace asp ================================================ FILE: src/asp/Camera/JitterSolveRigUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file JitterSolveRigUtils.h // Functions invoked in jitter_solve.cc that need a rig. #ifndef __ASP_CAMERA_JITTER_SOLVE_RIG_UTILS_H__ #define __ASP_CAMERA_JITTER_SOLVE_RIG_UTILS_H__ #include #include #include #include class UsgsAstroLsSensorModel; class UsgsAstroFrameSensorModel; namespace rig { class RigSet; } namespace asp { typedef std::map> TimestampMap; // Create enum for senor type, which can be frame or linescan enum RigSensorType {RIG_LINESCAN_SENSOR, RIG_FRAME_SENSOR}; // For each camera this will info info that will tie it to the rig struct RigCamInfo { int sensor_id; // The sensor id in the rig set RigSensorType sensor_type; // frame or linescan // The time at the image center for linescan and mid group for frame. Here the // group is formed of all camera images acquired within a contigious time with // the same frame sensor. double mid_group_time; // For linescan: the starting and ending time for positions/orientations. // For frame: both are the current pose time. double beg_pose_time, end_pose_time; // The index of the camera in opt.camera_models int cam_index; // The index of the reference camera in opt.camera_models. The reference // camera is assumed to be linescan. int ref_cam_index; std::string image_file, camera_file; // The group name for the all cameras acquired with all sensors on a rig // within a contigious time interval. Acquisitions at at a different time // intervals and/or a different rig must have different group names. std::string rig_group; // Declare the constructor RigCamInfo(); }; // Find the time bounds for a linescan sensor void linescanTimeBounds(UsgsAstroLsSensorModel const* ls_model, // Outputs double & beg_time, double & end_time); // Book-keeping needed to tie each camera to the rig void populateRigCamInfo(rig::RigSet const& rig, std::vector const& image_files, std::vector const& camera_files, std::vector const& csm_models, std::map const& cam2group, bool use_initial_rig_transforms, // Outputs std::vector & rig_cam_info, std::vector & ref_to_curr_sensor_vec, TimestampMap & timestamp_map); // Given a reference linescan camera and the transform from it to the current // camera, find the current camera to world transform as an array. void linescanToCurrSensorTrans( UsgsAstroLsSensorModel const & ref_ls_cam, double curr_time, double const* ref_to_curr_trans, // Output double * cam2world_arr); // Given a frame linescan camera and the transform from it to the current // camera, find the current camera to world transform as an array. void frameToCurrSensorTrans(std::vector const& frame_params, asp::RigCamInfo const& rig_cam_info, std::map const& cam2group, TimestampMap const& timestamp_map, double const* ref_to_curr_trans, // Output double * cam2world_arr); // Given a reference linescan camera and the transform from it to the current // linescan camera, update the the current camera poses within the given range. void updateLinescanWithRig( UsgsAstroLsSensorModel const & ref_ls_cam, double const* ref_to_curr_trans, UsgsAstroLsSensorModel & curr_ls_cam, // update this // Range of quat and position indices to update. // The default is to update all. int beg_quat_index = -1, int end_quat_index = -1, int beg_pos_index = -1, int end_pos_index = -1); // Update the rig with the optimized transforms void updateRig(std::vector const& ref_to_curr_sensor_vec, rig::RigSet & rig); // Find the times and indices bracketing a given time bool timestampBrackets(double time, std::map const& timestamps, // Outputs double & time1, double & time2, int & index1, int & index2); // Find the timestamps bracketing the camera with the given rig_cam_info. // This is a wrapper around the above function. bool timestampBrackets(asp::RigCamInfo const & rig_cam_info, std::map const & cam2group, TimestampMap const & timestamp_map, // Outputs double & beg_ref_time, double & end_ref_time, int & beg_ref_index, int & end_ref_index); // Given two poses, each as x, y, z, qx, qy, qz, qw, linearly interpolate between them. void interpPose(double time1, double time2, double const* pose1, double const* pose2, double time, // Output double* pose); // Given reference poses at time1 and time2, a time in between, and the transform // from the rig from the reference to the current sensor, find the current sensor // pose (camera-to-world) at the given time. void interpCurrPose(double time1, double time2, double time, double const* pose1, double const* pose2, double const* ref_to_curr_trans, // Output double * cam2world_arr); } // end namespace asp #endif //__ASP_CAMERA_JITTER_SOLVE_RIG_UTILS_H__ ================================================ FILE: src/asp/Camera/JitterSolveUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Low-level functions used in jitter_solve.cc. #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { // If several images are acquired in quick succession along the same orbit and // stored in the same list, record this structure by grouping them together. // Each element in the input vector below is either a standalone image, then it // is in a group of its own, or it is a list of images, all going to the same // group. Here we ignore the cameras. Matching cameras to images will be done // outside of this function. void readGroupStructure(std::vector const & image_lists, std::map & cam2group) { // Wipe the output cam2group.clear(); int group_count = 0, image_count = 0; for (size_t i = 0; i < image_lists.size(); i++) { // The case when we have a standalone image if (vw::has_image_extension(image_lists[i])) { cam2group[image_count] = group_count; group_count++; image_count++; continue; } // Check if we have a list, ending in .txt. Here we skip over the cameras. std::string ext = vw::get_extension(image_lists[i]); if (ext != ".txt") continue; // Read the list std::vector image_names; asp::read_list(image_lists[i], image_names); // Add a new group, and let all images in the list be in that group bool has_images = false; for (size_t j = 0; j < image_names.size(); j++) { if (!vw::has_image_extension(image_names[j])) continue; if (!fs::exists(image_names[j])) // additional robustness check continue; has_images = true; cam2group[image_count] = group_count; image_count++; } if (has_images) group_count++; } return; } // Given a set of integers in increasing order, with each assigned to a group, // return the index of the current integer in its group. int indexInGroup(int icam, std::map const& cam2group) { auto it = cam2group.find(icam); if (it == cam2group.end()) vw::vw_throw(vw::ArgumentErr() << "indexInGroup: Camera not found.\n"); int group_id = it->second; // Now iterate over all the integers in the group having icam, // and the index of icam in its group. int pos_in_group = -1; for (auto it = cam2group.begin(); it != cam2group.end(); it++) { if (it->second != group_id) continue; // not the same group pos_in_group++; if (it->first == icam) return pos_in_group; } // Throw an error, as we could not find the integer in the group vw::vw_throw(vw::ArgumentErr() << "indexInGroup: Could not find camera in group.\n"); return -1; } // For frame cameras that belong to the same orbital group, collect together // the initial positions in a single vector, and same for quaternions. Linescan // cameras are skipped as their positions/quaternions are already in one vector. void formPositionQuatVecPerGroup(std::map const& cam2group, std::vector const& csm_models, // Outputs std::map> & orbital_group_positions, std::map> & orbital_group_quaternions) { // Wipe the outputs orbital_group_positions.clear(); orbital_group_quaternions.clear(); int num_cams = csm_models.size(); for (int icam = 0; icam < num_cams; icam++) { auto it = cam2group.find(icam); if (it == cam2group.end()) vw::vw_throw(vw::ArgumentErr() << "addRollYawConstraint: Failed to find orbital group for camera.\n"); int group_id = it->second; UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (frame_model == NULL) continue; // Skip non-frame cameras // Append the positions for (int c = 0; c < NUM_XYZ_PARAMS; c++) orbital_group_positions[group_id].push_back(frame_model->getParameterValue(c)); // Append the quaternions for (int c = NUM_XYZ_PARAMS; c < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; c++) orbital_group_quaternions[group_id].push_back(frame_model->getParameterValue(c)); } // TODO(oalexan1): Must normalize the quaternions per group here and ensure // the same sign for the dominant coefficient. return; } // For the cameras that are of frame type, copy the initial values of camera position // and orientation to the vector of variables that we will optimize. Have to keep this // vector separate since UsgsAstroFrameSensorModel does not have a way to access the // underlying array of variables directly. void initFrameCameraParams(std::vector const& csm_models, std::vector & frame_params) { // output // Note how we allocate storage for all cameras, for simplicity. frame_params.resize((NUM_XYZ_PARAMS + NUM_QUAT_PARAMS) * csm_models.size(), 0.0); for (size_t icam = 0; icam < csm_models.size(); icam++) { UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); if (frame_model == NULL) continue; // The UsgsAstroFrameSensorModel stores first 3 position parameters, then 4 // quaternion parameters. double * vals = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; for (size_t i = 0; i < NUM_XYZ_PARAMS + NUM_QUAT_PARAMS; i++) vals[i] = frame_model->getParameterValue(i); } } // Update the cameras given the optimized parameters. Without a rig, // the linescan cameras are optimized in-place but the frame cameras still // have external parameters. void updateCameras(bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, std::map const& cam2group, TimestampMap const& timestamp_map, std::vector const& ref_to_curr_sensor_vec, std::vector & csm_models, std::vector & frame_params) { // Sanity check. The allocated space is for all cameras, for simplicity. if (frame_params.size() != (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS) * csm_models.size()) vw::vw_throw(vw::ArgumentErr() << "Invalid number of frame camera parameters."); for (size_t icam = 0; icam < csm_models.size(); icam++) { UsgsAstroLsSensorModel * ls_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast((csm_models[icam]->m_gm_model).get()); // Current frame cam parameters. Will be updated for rig. double * frame_arr = &frame_params[icam * (NUM_XYZ_PARAMS + NUM_QUAT_PARAMS)]; if (have_rig) { auto rig_info = rig_cam_info[icam]; int ref_cam = rig_info.ref_cam_index; int sensor_id = rig_info.sensor_id; double const* ref_to_curr_sensor_trans = &ref_to_curr_sensor_vec[rig::NUM_RIGID_PARAMS * sensor_id]; // For now, the reference sensor must be linescan UsgsAstroLsSensorModel * ref_ls_model = dynamic_cast((csm_models[ref_cam]->m_gm_model).get()); UsgsAstroFrameSensorModel * ref_frame_model = dynamic_cast((csm_models[ref_cam]->m_gm_model).get()); if (ref_ls_model != NULL) { if (ls_model != NULL) { // Update the ls model in place asp::updateLinescanWithRig(*ref_ls_model, ref_to_curr_sensor_trans, *ls_model); // output } else if (frame_model != NULL) { // Update the frame camera params asp::linescanToCurrSensorTrans(*ref_ls_model, rig_info.beg_pose_time, ref_to_curr_sensor_trans, frame_arr); // output } } else if (ref_frame_model != NULL) { // Update the frame camera params asp::frameToCurrSensorTrans(frame_params, rig_info, cam2group, timestamp_map, ref_to_curr_sensor_trans, frame_arr); // output } } if (frame_model != NULL) { // Update the frame camera model based on frame camera params for (size_t i = 0; i < rig::NUM_RIGID_PARAMS; i++) frame_model->setParameterValue(i, frame_arr[i]); } } // End loop over cameras return; } } // end namespace asp ================================================ FILE: src/asp/Camera/JitterSolveUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file JitterSolveUtils.h // Low-level functions used in jitter_solve.cc. #ifndef __ASP_CAMERA_JITTER_SOLVE_UTILS_H__ #define __ASP_CAMERA_JITTER_SOLVE_UTILS_H__ #include #include #include #include #include #include namespace rig { class RigSet; } namespace asp { class RigCamInfo; // If several images are acquired in quick succession along the same orbit and // stored in the same list, record this structure by grouping them together. // Each element in the input vector below is either a standalone image, then it // is in a group of its own, or it is a list of images, all going to the same // group. Here we ignore the cameras. Matching cameras to images will be done // outside of this function. void readGroupStructure(std::vector const & image_lists, std::map & cam2group); // Given a set of integers in increasing order, with each assigned to a group, // return the index of the current integer in its group. int indexInGroup(int icam, std::map const& cam2group); // For frame cameras that belong to the same orbital group, collect together // the initial positions in a single vector, and same for quaternions. Linescan // cameras are skipped as their positions/quaternions are already in one vector. void formPositionQuatVecPerGroup(std::map const& cam2group, std::vector const& csm_models, // Outputs std::map> & orbital_group_positions, std::map> & orbital_group_quaternions); // For the cameras that are of frame type, copy the initial values of camera position // and orientation to the vector of variables that we will optimize. Have to keep this // vector separate since UsgsAstroFrameSensorModel does not have a way to access the // underlying array of variables directly. void initFrameCameraParams(std::vector const& csm_models, std::vector & frame_params); // output // Update the cameras given the optimized parameters void updateCameras(bool have_rig, rig::RigSet const& rig, std::vector const& rig_cam_info, std::map const& cam2group, TimestampMap const& timestamp_map, std::vector const& ref_to_curr_sensor_vec, std::vector & csm_models, std::vector & frame_params); } // end namespace asp #endif //__ASP_CAMERA_JITTER_SOLVE_UTILS_H__ ================================================ FILE: src/asp/Camera/LinescanASTERModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include namespace asp { ASTERCameraModel::ASTERCameraModel( std::vector> const& lattice_mat, std::vector> const& sight_mat, std::vector> const& world_sight_mat, std::vector const& sat_pos, vw::Vector2i const& image_size) { if (lattice_mat.empty() || lattice_mat[0].empty()) vw::vw_throw(vw::ArgumentErr() << "Empty matrix of lattice points.\n"); int min_col = lattice_mat.front().front().x(); int min_row = lattice_mat.front().front().y(); int max_col = lattice_mat.back().back().x(); int max_row = lattice_mat.back().back().y(); int num_rows = lattice_mat.size(); int num_cols = lattice_mat.front().size(); // The spacing between rows must be integer double tol = 1e-10; double d_row = double(max_row - min_row)/(num_rows - 1.0); if (std::abs(d_row - round(d_row)) > tol) vw::vw_throw(vw::ArgumentErr() << "The spacing between lattice points must be integer.\n"); d_row = round(d_row); // The spacing between columns must be integer double d_col = double(max_col - min_col)/(num_cols - 1.0); if (std::abs(d_col - round(d_col)) > tol) vw::vw_throw(vw::ArgumentErr() << "The spacing between lattice points must be integer.\n"); d_col = round(d_col); if ((int)sat_pos.size() != num_rows) vw::vw_throw(vw::ArgumentErr() << "The number of rows of lattice points does not " << "agree with the number of satellite positions.\n"); if (num_rows != (int)world_sight_mat.size() || num_cols != (int)world_sight_mat[0].size()) vw::vw_throw(vw::ArgumentErr() << "The number of rows or columns of lattice points does not " << "agree with the number of sight vectors.\n"); // CSM fitting assumes the detector starts at column 0 if (min_col != 0) vw::vw_throw(vw::ArgumentErr() << "Cannot use the CSM model with ASTER cameras " << "if the first column index of the lattice matrix is not 0.\n"); vw::cartography::Datum datum("WGS84"); // ASTER is for Earth std::string sensor_id = "ASTER"; vw::vw_out() << "Using the CSM model with " << sensor_id << " cameras.\n"; // Fit a CSM sensor with distortion to given tabulated sight directions bool fit_distortion = true; fitCsmLinescan(sensor_id, datum, image_size, sat_pos, world_sight_mat, min_col, min_row, d_col, d_row, fit_distortion, *this); } boost::shared_ptr load_ASTER_camera_model_from_xml(std::string const& path) { // XYZ coordinates are in the ITRF coordinate frame which means GCC coordinates. // - The velocities are in the same coordinate frame, not in some local frame. vw::vw_out(vw::DebugMessage, "asp") << "Loading ASTER camera file: " << path << "\n"; // Parse the ASTER XML file ASTERXML xml_reader; xml_reader.read_xml(path); // Feed everything into a new camera model. return boost::shared_ptr (new ASTERCameraModel(xml_reader.m_lattice_mat, xml_reader.m_sight_mat, xml_reader.m_world_sight_mat, xml_reader.m_sat_pos, xml_reader.m_image_size)); } } // end namespace asp ================================================ FILE: src/asp/Camera/LinescanASTERModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file LinescanASTERModel.h /// /// Linescan model for ASTER. Fits a CSM linescan model to the ASTER /// lattice of sight vectors and satellite positions. /// #ifndef __STEREO_CAMERA_LINESCAN_ASTER_MODEL_H__ #define __STEREO_CAMERA_LINESCAN_ASTER_MODEL_H__ #include #include namespace asp { // References: // ----------- // ASTER User Handbook Version 2 // https://asterweb.jpl.nasa.gov/content/03_data/04_Documents/aster_user_guide_v2.pdf // https://lpdaac.usgs.gov/documents/175/ASTER_L1_Product_Specifications.pdf // The following paper has a blurb on the ASTER linescan camera. // Quantifying ice loss in the eastern Himalayas since 1974 using // declassified spy satellite imagery // Joshua M. Maurer, Summer B. Rupper, Joerg M. Schaefer /// CSM-based linescan camera model for ASTER satellites. /// Inherits from CsmModel, following the same pattern as Pleiades, /// DG, SPOT, and PeruSat. class ASTERCameraModel : public asp::CsmModel { public: ASTERCameraModel(std::vector> const& lattice_mat, std::vector> const& sight_mat, std::vector> const& world_sight_mat, std::vector const& sat_pos, vw::Vector2i const& image_size); virtual ~ASTERCameraModel() {} virtual std::string type() const { return "LinescanASTER"; } }; // End class ASTERCameraModel /// Load a ASTER camera model from an XML file. /// - This function does not take care of Xerces XML init/de-init, the caller must /// make sure this is done before/after this function is called! boost::shared_ptr load_ASTER_camera_model_from_xml(std::string const& path); } // end namespace asp #endif//__STEREO_CAMERA_LINESCAN_ASTER_MODEL_H__ ================================================ FILE: src/asp/Camera/LinescanDGModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // TODO(oalexan1): Make this inherit from CsmModel. #include #include #include #include #include #include #include #include using namespace vw; namespace asp { // ----------------------------------------------------------------- // LinescanDGModel supporting functions boost::posix_time::ptime parse_dg_time(std::string str) { try{ return boost::posix_time::time_from_string(str); }catch(...){ // This is a useful error, it tells the user an XML camera file is // trying to be interpreted as a DG camera file. vw::vw_throw(vw::ArgumentErr() << "Failed to parse time from string: " << str << ". " << "If you are not using Digital Globe images, you may need to " << "specify the session type, such as -t rpc, -t rpcmaprpc, -t aster, etc.\n"); } return boost::posix_time::time_from_string(str); // Never reached! } vw::CamPtr load_dg_camera_model_from_xml(std::string const& path) { // Parse the Digital Globe XML file GeometricXML geo; AttitudeXML att; EphemerisXML eph; ImageXML img; RPCXML rpc; // Check that cameras end in .xml. std::string ext = boost::filesystem::path(path).extension().string(); boost::algorithm::to_lower(ext); if (ext != ".xml") vw::vw_throw(vw::ArgumentErr() << "Digital Globe camera files must end in .xml. Likely need to specify " << "another session type than -t dg.\n"); try { read_xml(path, geo, att, eph, img, rpc); } catch (...) { // The XML parser may throw exceptions other than std::exception. Catch them // all here. vw::vw_throw(vw::ArgumentErr() << "Invalid Digital Globe XML file: " << path << ". " << "If you are not using Digital Globe cameras, you may " << "need to specify the appropriate session type, such as -t rpc, " << "-t rpcmaprpc, -t aster, etc.\n"); } // For WV, only Stereo1B and Basic1B products are supported. Users // often say wrong results are produced with other products. std::string sat_id = img.sat_id; boost::algorithm::to_lower(sat_id); std::string image_descriptor = img.image_descriptor; boost::algorithm::to_lower(image_descriptor); if (sat_id.size() >= 2 && sat_id.substr(0, 2) == "wv" && image_descriptor != "stereo1b" && image_descriptor != "basic1b") { vw::vw_throw(vw::ArgumentErr() << "For WorldView images, only Stereo1B and Basic1B products are supported.\n"); } // Get an estimate of the surface elevation from the corners specified in the // file. Not every file has this information, in which case we will just use // zero. Also estimate the local Earth radius. We assume the WGS84 ellipsoid. // These will be used to apply velocity aberration and atmospheric refraction // corrections. double local_earth_radius = vw::DEFAULT_EARTH_RADIUS; double mean_ground_elevation = vw::DEFAULT_SURFACE_ELEVATION; vw::BBox3 bbox = rpc.get_lon_lat_height_box(); if (!bbox.empty()) { mean_ground_elevation = (bbox.min()[2] + bbox.max()[2]) / 2.0; double lon = (bbox.min()[0] + bbox.max()[0])/2.0; double lat = (bbox.min()[1] + bbox.max()[1])/2.0; vw::cartography::Datum datum("WGS84"); vw::Vector3 xyz = datum.geodetic_to_cartesian(vw::Vector3(lon, lat, 0)); local_earth_radius = norm_2(xyz); } // Convert measurements in millimeters to pixels. geo.principal_distance /= geo.detector_pixel_pitch; geo.detector_origin /= geo.detector_pixel_pitch; // Convert all time measurements to something that boost::date_time can read. boost::replace_all(eph.start_time, "T", " "); boost::replace_all(img.tlc_start_time, "T", " "); boost::replace_all(img.first_line_start_time, "T", " "); boost::replace_all(att.start_time, "T", " "); // Convert UTC time measurements to line measurements. Ephemeris // start time will be our reference frame to calculate seconds against. SecondsFromRef convert(parse_dg_time(eph.start_time)); // It is assumed that EPH and ATT are sampled at the same rate and time. VW_ASSERT(eph.satellite_position_vec.size() == att.satellite_quat_vec.size(), vw::MathErr() << "Ephemeris and attitude don't have the same number of samples."); VW_ASSERT(eph.start_time == att.start_time && eph.time_interval == att.time_interval, vw::MathErr() << "Ephemeris and attitude don't seem to use the same t0 or dt."); // Load up the time interpolation class. If the TLCList only has // one entry, then we have to manually drop in the slope and offset. if (img.tlc_vec.size() == 1) { double direction = 1; if (boost::to_lower_copy(img.scan_direction) != "forward") { direction = -1; } img.tlc_vec.push_back(std::make_pair(img.tlc_vec.front().first + img.avg_line_rate, direction)); } // Sanity check: first line time should agree with TLC time at line 0. double tlc_start_time = convert(parse_dg_time(img.tlc_start_time)); double tlc_time_at_0 = img.tlc_vec[0].second + tlc_start_time; double first_line_time = convert(parse_dg_time(img.first_line_start_time)); double tol = std::abs(1.0 / (10.0 * img.avg_line_rate)); VW_ASSERT(std::abs(first_line_time - tlc_time_at_0) < tol, vw::ArgumentErr() << "First line time does not agree with TLC time for file: " << path << ".\n" << "This suggests that your camera file is incorrect. To make this error go away, " << "edit the camera file and make the value of equal to the value of " << ". Use the produced cameras with caution.\n" << "Or consider using the RPC camera model (option -t rpc).\n" << "First line time is: " << first_line_time << ".\n" << "TLC time is: " << tlc_time_at_0 << ".\n"); double et0 = convert(parse_dg_time(eph.start_time)); double at0 = convert(parse_dg_time(att.start_time)); double edt = eph.time_interval; double adt = att.time_interval; vw::Quat sensor_rotation = vw::math::euler_xyz_to_quaternion (vw::Vector3(0,0,geo.detector_rotation - M_PI/2)); // explained earlier vw::Quat sensor_to_body = geo.camera_attitude * sensor_rotation; vw::Vector2 final_detector_origin = subvector(inverse(sensor_rotation).rotate(vw::Vector3(geo.detector_origin[0], geo.detector_origin[1], 0)), 0, 2); // We will create one camera model in regular use, and 14 more of // them with slight perturbations if needed for error propagation // (covariance computation). This approach results in avoiding // writing a lot of new code which would be in some places similar // and in others different than existing one. See Covariance.h for // more details. vw::CamPtr nominal_cam; std::vector perturbed_cams; int num_cams = 1; if (asp::stereo_settings().propagate_errors) num_cams = numCamsForCovariance(); for (int cam_it = 0; cam_it < num_cams; cam_it++) { vw::Vector dp = asp::positionDelta(cam_it); vw::Vector dq = asp::quatDelta(cam_it); // Convert ephemeris from satellite to camera position. Change // attitude to be the rotation from camera frame to world // frame. We also add an additional 90 degree rotation to the // camera frame so X is the horizontal direction to the picture // and +Y points down the image (in the direction of flight). Must // apply any perturbations when still in satellite coordinates, to // be consistent with input covariances. std::vector camera_position_vec(eph.satellite_position_vec.size()); std::vector camera_quat_vec(att.satellite_quat_vec.size()); for (size_t i = 0; i < eph.satellite_position_vec.size(); i++) { Vector p = eph.satellite_position_vec[i] + dp; // add the perturbation Vector q = att.satellite_quat_vec[i]; // The dq perturbations are chosen under the assumption that q is normalized double len_q = norm_2(q); if (len_q > 0 && asp::stereo_settings().propagate_errors) q = q / len_q; // Normalization is not needed without covariance logic q = q + dq; vw::Quat qt(q[3], q[0], q[1], q[2]); // Note the swap. The order is now w, x, y, z. camera_position_vec[i] = p + qt.rotate(geo.perspective_center); camera_quat_vec[i] = qt * sensor_to_body; } vw::CamPtr cam_ptr (new DGCameraModel(camera_position_vec, eph.velocity_vec, et0, edt, camera_quat_vec, at0, adt, img.tlc_vec, convert(parse_dg_time(img.tlc_start_time)), img.image_size, final_detector_origin, geo.principal_distance, mean_ground_elevation, local_earth_radius)); if (cam_it == 0) nominal_cam = cam_ptr; else perturbed_cams.push_back(cam_ptr); } DGCameraModel * cam = (DGCameraModel*)nominal_cam.get(); // Store the starting time and spacing for the satellite, in case later some resampling // happens to the cameras when those would use a different spacing. // TODO(oalexan1): This code needs to be deleted, as there is no longer any // resampling of the cameras. cam->m_satellite_pos_t0 = et0; cam->m_satellite_pos_dt = edt; cam->m_satellite_quat_t0 = at0; cam->m_satellite_quat_dt = adt; if (asp::stereo_settings().propagate_errors) { cam->m_perturbed_cams = perturbed_cams; cam->m_satellite_pos_cov = eph.satellite_pos_cov; cam->m_satellite_quat_cov = att.satellite_quat_cov; } return nominal_cam; } // End function load_dg_camera_model() // Constructor DGCameraModel::DGCameraModel (std::vector const& positions, std::vector const& velocities, double pos_t0, double pos_dt, std::vector const& quaternions, double quat_t0, double quat_dt, std::vector> const& tlc, double time_offset, vw::Vector2i const& image_size, vw::Vector2 const& detector_origin, double focal_length, double mean_ground_elevation, double local_earth_radius): m_positions(positions), m_velocities(velocities), m_pos_t0(pos_t0), m_pos_dt(pos_dt), m_quaternions(quaternions), m_quat_t0(quat_t0), m_quat_dt(quat_dt), m_tlc(tlc), m_time_offset(time_offset), m_image_size(image_size), m_detector_origin(detector_origin), m_focal_length(focal_length), m_mean_ground_elevation(mean_ground_elevation), m_local_earth_radius(local_earth_radius) { // Populate the underlying CSM model populateCsmModel(); } // This is a lengthy function that does many initializations // TODO(oalexan1): Replace this with a call to populateCsmLinescan() // from CsmUtils.cc, but that will need some refactoring first to handle // this case. void DGCameraModel::populateCsmModel() { // Using a desired precision of 1e-8 will result in about this much // agreement between image to ground and back. Pushing this to // something lower will result in the CSM ground-to-image // computation failing due to numerical precision issues, which can // be traced to the DG camera using a focal length (in pixels) of // 2,002,252.25. // This sensor is used for Earth only vw::cartography::Datum datum("WGS84"); this->m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; this->m_semi_major_axis = datum.semi_major_axis(); this->m_semi_minor_axis = datum.semi_minor_axis(); // Create a linescan model as a smart pointer, and do smart pointer // casting. Follow the CSM API. The type of m_gm_model is // csm::RasterGM, which is a base class. UsgsAstroLsSensorModel is // derived from it. A smart pointer to m_gm_model is held by // this model. this->m_gm_model = boost::make_shared(); m_ls_model = boost::dynamic_pointer_cast (this->m_gm_model); if (m_ls_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Invalid initialization of the linescan model.\n"); // This performs many initializations apart from the above. Note that this is // not a boost::shared_ptr reset, it is UsgsAstroLsSensorModel reset. m_ls_model->reset(); m_ls_model->m_nSamples = m_image_size[0]; m_ls_model->m_nLines = m_image_size[1]; m_ls_model->m_platformFlag = 1; // For order 8 Lagrange interpolation m_ls_model->m_maxElevation = 10000.0; // 10 km m_ls_model->m_minElevation = -10000.0; // -10 km m_ls_model->m_focalLength = m_focal_length; m_ls_model->m_zDirection = 1.0; m_ls_model->m_halfSwath = 1.0; m_ls_model->m_sensorIdentifier = "DigitalGlobeLinescan"; m_ls_model->m_majorAxis = this->m_semi_major_axis; m_ls_model->m_minorAxis = this->m_semi_minor_axis; // The choices below are because of how DigitalGlobe's // get_local_pixel_vector() interacts with the // UsgsAstroLsSensorModel function // computeDistortedFocalPlaneCoordinates(). For Pleiades // get_local_pixel_vector() is computed differently, and hence // different choices here as well. Also keep in mind that a CSM // pixel has extra 0.5 added to it. m_ls_model->m_iTransL[0] = 0.0; m_ls_model->m_iTransL[1] = 0.0; m_ls_model->m_iTransL[2] = 1.0; m_ls_model->m_iTransS[0] = 0.0; m_ls_model->m_iTransS[1] = 1.0; m_ls_model->m_iTransS[2] = 0.0; m_ls_model->m_detectorLineSumming = 1.0; m_ls_model->m_detectorSampleSumming = 1.0; // Keep these as is. Modify instead m_detectorLineOrigin and // m_detectorSampleOrigin. The effect is same as all USGSCSM code uses // m_detectorLineOrigin - m_startingDetectorLine, and the same for the sample. m_ls_model->m_startingDetectorLine = 0.0; m_ls_model->m_startingDetectorSample = 0.0; // Optical center m_ls_model->m_detectorLineOrigin = -m_detector_origin[1]; m_ls_model->m_detectorSampleOrigin = -m_detector_origin[0] + 0.5; // Time auto const& tlc = m_tlc; double time_offset = m_time_offset; if (tlc.size() < 2) vw::vw_throw(vw::ArgumentErr() << "Expecting at least two line and time sample pairs.\n"); m_ls_model->m_intTimeLines.clear(); // not needed, but best for clarity m_ls_model->m_intTimeStartTimes.clear(); m_ls_model->m_intTimes.clear(); for (size_t i = 0; i < tlc.size(); i++) { // The 1.0 below is what is needed to make CSM agree with the older ASP linescan // implementation. Part of it is a 0.5 pixel offset in the line. // TODO(oalexan1): This needs more thinking. m_ls_model->m_intTimeLines.push_back(tlc[i].first + 1.0); // line m_ls_model->m_intTimeStartTimes.push_back(tlc[i].second + time_offset); // time // Slope if (i + 1 < tlc.size()) { // Compute the slope between this time instance and the next double slope = (tlc[i+1].second - tlc[i].second) / (tlc[i+1].first - tlc[i].first); m_ls_model->m_intTimes.push_back(slope); } else{ // Cannot have a slope for the last value, as there's no next one to use, // but for consistency, borrow the last slope. This is consistent // with lines out of range using the slopes closest to them. double slope = m_ls_model->m_intTimes.back(); m_ls_model->m_intTimes.push_back(slope); } } // Pass to CSM the positions and velocities. CSM uses Lagrange interpolation. m_ls_model->m_numPositions = 3 * m_positions.size(); m_ls_model->m_t0Ephem = m_pos_t0; m_ls_model->m_dtEphem = m_pos_dt; m_ls_model->m_positions.resize(m_ls_model->m_numPositions); m_ls_model->m_velocities.resize(m_ls_model->m_numPositions); for (size_t pos_it = 0; pos_it < m_positions.size(); pos_it++) { vw::Vector3 P = m_positions[pos_it]; vw::Vector3 V = m_velocities[pos_it]; for (int coord = 0; coord < 3; coord++) { m_ls_model->m_positions [3*pos_it + coord] = P[coord]; m_ls_model->m_velocities[3*pos_it + coord] = V[coord]; } } // Quaternions. CSM uses Lagrange interpolation. int num_quat = m_quaternions.size(); m_ls_model->m_numQuaternions = 4 * num_quat; // concatenate all coordinates m_ls_model->m_t0Quat = m_quat_t0; m_ls_model->m_dtQuat = m_quat_dt; m_ls_model->m_quaternions.resize(m_ls_model->m_numQuaternions); for (int pos_it = 0; pos_it < m_ls_model->m_numQuaternions / 4; pos_it++) { vw::Quat q = m_quaternions[pos_it]; // ASP stores the quaternions as (w, x, y, z). CSM wants them as // x, y, z, w. int coord = 0; m_ls_model->m_quaternions[4*pos_it + coord] = q.x(); coord++; m_ls_model->m_quaternions[4*pos_it + coord] = q.y(); coord++; m_ls_model->m_quaternions[4*pos_it + coord] = q.z(); coord++; m_ls_model->m_quaternions[4*pos_it + coord] = q.w(); coord++; } // Quaternions must always be normalized and not change suddenly in sign. asp::normalizeQuaternions(m_ls_model.get()); // Re-creating the model from the state forces some operations to // take place which are inaccessible otherwise. std::string modelState = m_ls_model->getModelState(); m_ls_model->replaceModelState(modelState); // Adjust the CSM model to correct for velocity aberration and atmospheric // refraction. This can only happen after the model is fully initialized, as // need to create rays from the camera center to the ground. bool correct_velocity_aberration = true; bool correct_atmospheric_refraction = true; asp::orbitalCorrections(this, correct_velocity_aberration, correct_atmospheric_refraction, m_local_earth_radius, m_mean_ground_elevation); return; } // Interpolate the satellite position covariance at given pixel void DGCameraModel::interpSatellitePosCov(vw::Vector2 const& pix, double p_cov[SAT_POS_COV_SIZE]) const { double time = asp::get_time_at_line(pix.y(), m_ls_model.get()); int numCov = m_satellite_pos_cov.size() / SAT_POS_COV_SIZE; int nOrder = 8; if (m_ls_model->m_platformFlag == 0) nOrder = 4; lagrangeInterp(numCov, &m_satellite_pos_cov[0], m_satellite_pos_t0, m_satellite_pos_dt, time, SAT_POS_COV_SIZE, nOrder, p_cov); //asp::nearestNeibInterp(numCov, &m_satellite_pos_cov[0], m_satellite_pos_t0, // m_satellite_pos_dt, time, SAT_POS_COV_SIZE, p_cov); } // Interpolate the satellite quaternion covariance at given pixel void DGCameraModel::interpSatelliteQuatCov(vw::Vector2 const& pix, double q_cov[SAT_QUAT_COV_SIZE]) const { double time = asp::get_time_at_line(pix.y(), m_ls_model.get()); int numCov = m_satellite_quat_cov.size() / SAT_QUAT_COV_SIZE; int nOrder = 8; if (m_ls_model->m_platformFlag == 0) nOrder = 4; int nOrderQuat = nOrder; if (numCov < 6 && nOrder == 8) nOrderQuat = 4; // The covariances are not guaranteed to be smooth, so use nearest neighbor. // Interpolation may even create matrices with negative eigenvalues. //lagrangeInterp(numCov, &m_satellite_quat_cov[0], m_satellite_quat_t0, m_satellite_quat_dt, // time, SAT_QUAT_COV_SIZE, nOrderQuat, q_cov); asp::nearestNeibInterp(numCov, &m_satellite_quat_cov[0], m_satellite_quat_t0, m_satellite_quat_dt, time, SAT_QUAT_COV_SIZE, q_cov); } } // end namespace asp ================================================ FILE: src/asp/Camera/LinescanDGModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // TODO(oalexan1): See if using proper earth radius and proper surface // elevation improves the results! There is already some logic // for extracting surface elevation from the RPC model. // \file LinescanDGModel.h // This class inherits from the CSM model. #ifndef __STEREO_CAMERA_LINESCAN_DG_MODEL_H__ #define __STEREO_CAMERA_LINESCAN_DG_MODEL_H__ #include #include #include #include #include // Forward declaration class UsgsAstroLsSensorModel; namespace asp { // Upper-right portion of the 3x3 satellite position covariance // matrix and 4x4 satellite quaternion matrix. const int SAT_POS_COV_SIZE = 6, SAT_QUAT_COV_SIZE = 10; // This is the standard DG implementation. In PositionInterp.cc and QuatInterp.cc there are other // ways of performing position and pose interpolation as well. TODO(oalexan1): // Eliminate all these VW functions use directly the inputs from the XML file. class DGCameraModel: public asp::CsmModel { public: DGCameraModel (std::vector const& positions, std::vector const& velocities, double pos_t0, double pos_dt, std::vector const& quaternions, double quat_t0, double quat_dt, std::vector> const& tlc, double time_offset, vw::Vector2i const& image_size, vw::Vector2 const& detector_origin, double focal_length, double mean_ground_elevation, double local_earth_radius); virtual ~DGCameraModel() {} virtual std::string type() const { return "LinescanDG"; } // This is a pointer to the underlying linescan model boost::shared_ptr m_ls_model; // For error propagation std::vector m_perturbed_cams; std::vector m_satellite_pos_cov, m_satellite_quat_cov; double m_satellite_pos_t0, m_satellite_pos_dt; double m_satellite_quat_t0, m_satellite_quat_dt; // Interpolate the satellite position covariance at given pixel void interpSatellitePosCov(vw::Vector2 const& pix, double p_cov[SAT_POS_COV_SIZE]) const; // Interpolate the satellite quaternion covariance at given pixel void interpSatelliteQuatCov(vw::Vector2 const& pix, double q_cov[SAT_QUAT_COV_SIZE]) const; private: // Function to interpolate quaternions with the CSM model. This is used // for validation of the CSM model but not in production. void getQuaternions(const double& time, double q[4]) const; void populateCsmModel(); // Extrinsics - uniformly sampled data copied into CSM model std::vector m_positions, m_velocities; double m_pos_t0, m_pos_dt; std::vector m_quaternions; double m_quat_t0, m_quat_dt; std::vector> m_tlc; // line->time pairs double m_time_offset; // Intrinsics /// Location of (0,0) coordinate of the detector relative to the center of /// the origin of the camera coordinate system. /// - Stored internally in pixels. vw::Vector2 m_detector_origin; double m_focal_length; ///< The focal length, also stored in pixels. /// Image size in pixels vw::Vector2i m_image_size; // Mean ground elevation and local Earth radius. double m_mean_ground_elevation, m_local_earth_radius; }; /// Load a DG camera model from an XML file. This function does not /// take care of Xerces XML init/de-init, the caller must make sure /// this is done before/after this function is called. vw::CamPtr load_dg_camera_model_from_xml(std::string const& path); } //end namespace asp #endif//__STEREO_CAMERA_LINESCAN_DG_MODEL_H__ ================================================ FILE: src/asp/Camera/LinescanPeruSatModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include namespace asp { using vw::Vector3; // CSM-based PeruSat camera model constructor PeruSatCsmCameraModel:: PeruSatCsmCameraModel(double time_t0, double time_dt, std::vector const& positions, std::vector const& velocities, double pos_t0, double pos_dt, std::vector> const& quaternions, double quat_t0, double quat_dt, vw::Vector2 const& tan_psi_x, vw::Vector2 const& tan_psi_y, vw::Quaternion const& instrument_biases, vw::Vector2i const& image_size, double min_time, double max_time): m_time_t0(time_t0), m_time_dt(time_dt), m_positions(positions), m_velocities(velocities), m_pos_t0(pos_t0), m_pos_dt(pos_dt), m_quaternions(quaternions), m_quat_t0(quat_t0), m_quat_dt(quat_dt), m_tan_psi_x(tan_psi_x), m_tan_psi_y(tan_psi_y), m_instrument_biases(instrument_biases), m_image_size(image_size), m_min_time(min_time), m_max_time(max_time) { populateCsmModel(); } // Populate the CSM linescan model from the raw PeruSat data. // This follows the same pattern as PleiadesCameraModel::populateCsmModel(). void PeruSatCsmCameraModel::populateCsmModel() { // Populate CsmModel class members m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; vw::cartography::Datum datum("WGS84"); m_semi_major_axis = datum.semi_major_axis(); m_semi_minor_axis = datum.semi_minor_axis(); // Create the linescan model m_gm_model = boost::make_shared(); m_ls_model = dynamic_cast(m_gm_model.get()); if (m_ls_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Invalid initialization of the linescan model.\n"); // This performs many initializations apart from the above m_ls_model->reset(); // Override some initializations m_ls_model->m_nSamples = m_image_size[0]; m_ls_model->m_nLines = m_image_size[1]; m_ls_model->m_platformFlag = 1; // order 8 Lagrange, consistent with all other CSM sensors m_ls_model->m_maxElevation = 10000.0; // 10 km m_ls_model->m_minElevation = -10000.0; // -10 km m_ls_model->m_focalLength = 1.0; m_ls_model->m_zDirection = 1.0; m_ls_model->m_halfSwath = 1.0; m_ls_model->m_sensorIdentifier = "PeruSat"; m_ls_model->m_majorAxis = m_semi_major_axis; m_ls_model->m_minorAxis = m_semi_minor_axis; m_ls_model->m_iTransL[0] = 0.0; m_ls_model->m_iTransL[1] = 1.0; // no scale m_ls_model->m_iTransL[2] = 0.0; // no skew m_ls_model->m_iTransS[0] = 0.0; m_ls_model->m_iTransS[1] = 0.0; // no skew m_ls_model->m_iTransS[2] = 1.0; // no scale m_ls_model->m_startingDetectorLine = 0.0; m_ls_model->m_startingDetectorSample = 0.0; // PeruSat look angle formula: // psi_x = tan_psi_x[0] * col + tan_psi_x[1] // psi_y = tan_psi_y[0] * col + tan_psi_y[1] // look = (tan(psi_y), -tan(psi_x), 1) // // In CSM, the linear detector model produces psi (the angle), and the // tan() is replaced by a transverse distortion polynomial from usgscsm. // The coefficients encode atan() as a 3rd-order Taylor polynomial: u - u^3/3. // For PeruSat angles (~0.01 rad), the approximation error is ~1e-12. // // The instrument biases quaternion is folded into each attitude quaternion. // Set detector params to give psi directly (the angle, not tangent). // // CSM image-to-ground computes (with identity iTransL/iTransS): // detSample = (col+0.5) * sampleSumming + startingSample // distortedY = detSample - sampleOrigin // distortedX = 0 - lineOrigin = -lineOrigin (constant, detLine=0 for linescan) // removeDistortion(distortedX, distortedY) -> (undistortedX, undistortedY) // Look direction is proportional to (undistortedX, undistortedY, 1). // // We need: look = (tan(psi_y), -tan(psi_x), 1). // So: undistortedX = tan(psi_y), undistortedY = -tan(psi_x). // With transverse atan() distortion (odd function): // distortedX = psi_y, distortedY = -psi_x // // For distortedY = -psi_x = -(tan_psi_x[0]*col + tan_psi_x[1]): // distortedY = (col+0.5)*sampleSumming - sampleOrigin // = -tan_psi_x[0]*col - tan_psi_x[1] // sampleSumming = -tan_psi_x[0] // sampleOrigin = 0.5*(-tan_psi_x[0]) + tan_psi_x[1] // = tan_psi_x[1] - 0.5*tan_psi_x[0] m_ls_model->m_detectorSampleSumming = -m_tan_psi_x[0]; m_ls_model->m_detectorSampleOrigin = m_tan_psi_x[1] - 0.5 * m_tan_psi_x[0]; // For distortedX = psi_y = tan_psi_y[1] (constant, slope is zero): // -lineOrigin = tan_psi_y[1], so lineOrigin = -tan_psi_y[1] m_ls_model->m_detectorLineSumming = 1.0; m_ls_model->m_detectorLineOrigin = -m_tan_psi_y[1]; // Transverse distortion: 20 coefficients (first 10 for x, last 10 for y). // Monomials: [1, ux, uy, ux^2, ux*uy, uy^2, ux^3, ux^2*uy, ux*uy^2, uy^3] // For x: dx = ux - ux^3/3 (atan(ux) Taylor approximation) // For y: dy = uy - uy^3/3 m_ls_model->m_distortionType = DistortionType::TRANSVERSE; m_ls_model->m_opticalDistCoeffs.resize(20, 0.0); // x coefficients: [0, 1, 0, 0, 0, 0, -1/3, 0, 0, 0] m_ls_model->m_opticalDistCoeffs[1] = 1.0; m_ls_model->m_opticalDistCoeffs[6] = -1.0 / 3.0; // y coefficients: [0, 0, 1, 0, 0, 0, 0, 0, 0, -1/3] m_ls_model->m_opticalDistCoeffs[12] = 1.0; m_ls_model->m_opticalDistCoeffs[19] = -1.0 / 3.0; // Time m_ls_model->m_intTimeLines.push_back(1.0); // offset CSM's quirky 0.5 additions m_ls_model->m_intTimeStartTimes.push_back(m_time_t0); m_ls_model->m_intTimes.push_back(m_time_dt); int num_pos = m_positions.size(); if ((size_t)num_pos != m_velocities.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting as many positions as velocities.\n"); // Positions and velocities m_ls_model->m_numPositions = 3 * num_pos; m_ls_model->m_t0Ephem = m_pos_t0; m_ls_model->m_dtEphem = m_pos_dt; m_ls_model->m_positions.resize(m_ls_model->m_numPositions); m_ls_model->m_velocities.resize(m_ls_model->m_numPositions); for (int pos_it = 0; pos_it < num_pos; pos_it++) { for (int coord = 0; coord < 3; coord++) { m_ls_model->m_positions [3*pos_it + coord] = m_positions[pos_it][coord]; m_ls_model->m_velocities[3*pos_it + coord] = m_velocities[pos_it][coord]; } } // Quaternions. PeruSat provides tabulated quaternions at uniform time steps. // Fold the instrument biases into each quaternion so CSM sees the combined // rotation (body-to-sensor including biases). int num_quats = m_quaternions.size(); m_ls_model->m_numQuaternions = 4 * num_quats; m_ls_model->m_t0Quat = m_quat_t0; m_ls_model->m_dtQuat = m_quat_dt; m_ls_model->m_quaternions.resize(m_ls_model->m_numQuaternions); vw::Quaternion inv_biases = inverse(m_instrument_biases); for (int qi = 0; qi < num_quats; qi++) { // Compose: apply instrument biases to convert from sensor to body, // then the attitude quaternion from body to ECEF. // The old code does: result = inv_biases.rotate(look), then // pose.rotate(result). This is equivalent to (pose * inv_biases)(look). // CSM applies the quaternion to the look vector directly, so store // the composed quaternion. vw::Quat q = m_quaternions[qi] * inv_biases; q = normalize(q); // ASP stores (w, x, y, z). CSM wants (x, y, z, w). m_ls_model->m_quaternions[4*qi + 0] = q.x(); m_ls_model->m_quaternions[4*qi + 1] = q.y(); m_ls_model->m_quaternions[4*qi + 2] = q.z(); m_ls_model->m_quaternions[4*qi + 3] = q.w(); } // Normalize and fix sign flips asp::normalizeQuaternions(m_ls_model); // Re-creating the model from the state forces some operations to // take place which are inaccessible otherwise. std::string modelState = m_ls_model->getModelState(); m_ls_model->replaceModelState(modelState); // Adjust the CSM model for velocity aberration and atmospheric // refraction if desired. double local_earth_radius = vw::DEFAULT_EARTH_RADIUS; double mean_ground_elevation = vw::DEFAULT_SURFACE_ELEVATION; asp::orbitalCorrections(this, asp::stereo_settings().enable_velocity_aberration_correction, asp::stereo_settings().enable_atmospheric_refraction_correction, local_earth_radius, mean_ground_elevation); } // CSM-delegating virtual functions (same pattern as Pleiades) vw::Vector3 PeruSatCsmCameraModel::camera_center(vw::Vector2 const& pix) const { csm::ImageCoord csm_pix; asp::toCsmPixel(pix, csm_pix); double time = m_ls_model->getImageTime(csm_pix); csm::EcefCoord ecef = m_ls_model->getSensorPosition(time); return vw::Vector3(ecef.x, ecef.y, ecef.z); } vw::Vector3 PeruSatCsmCameraModel::pixel_to_vector(vw::Vector2 const& pix) const { csm::ImageCoord csm_pix; asp::toCsmPixel(pix, csm_pix); csm::EcefLocus locus = m_ls_model->imageToRemoteImagingLocus(csm_pix); return vw::Vector3(locus.direction.x, locus.direction.y, locus.direction.z); } vw::Vector2 PeruSatCsmCameraModel::point_to_pixel(vw::Vector3 const& point) const { csm::EcefCoord ecef(point[0], point[1], point[2]); double achievedPrecision = -1.0; csm::WarningList * warnings_ptr = NULL; csm::ImageCoord csm_pix = m_ls_model->groundToImage(ecef, m_desired_precision, &achievedPrecision, warnings_ptr); vw::Vector2 asp_pix; asp::fromCsmPixel(asp_pix, csm_pix); return asp_pix; } // Load PeruSat camera as a CSM linescan model. // Resampling is done here (not in PeruSatXML) so the XML class returns raw data. // Positions/velocities: Lagrange order 4 (degree 3). // Quaternions: SLERP. boost::shared_ptr load_perusat_camera_model_from_xml(std::string const& path) { vw_out(vw::DebugMessage, "asp") << "Loading PeruSat camera file: " << path << "\n"; PeruSatXML xml_reader; xml_reader.read_xml(path); // Extract raw (unresampled) data from the XML double time_t0 = 0, time_dt = 0; std::vector raw_positions, raw_velocities; double raw_pos_t0 = 0, raw_pos_dt = 0; std::vector> raw_quaternions; double raw_quat_t0 = 0, raw_quat_dt = 0; double min_time = 0, max_time = 0; xml_reader.extractRawData(time_t0, time_dt, raw_positions, raw_velocities, raw_pos_t0, raw_pos_dt, raw_quaternions, raw_quat_t0, raw_quat_dt, min_time, max_time); // Resample to a denser grid so CSM's Lagrange interpolation // closely reproduces VW's interpolation on the sparse raw data. int factor = 10; // resample to 10x denser grid int order = 4; // Lagrange interpolation order (4 points, degree 3) // Resample positions and velocities with Lagrange (same as old VW path) std::vector pos_times_raw, vel_times_raw; for (size_t i = 0; i < raw_positions.size(); i++) pos_times_raw.push_back(raw_pos_t0 + i * raw_pos_dt); for (size_t i = 0; i < raw_velocities.size(); i++) vel_times_raw.push_back(raw_pos_t0 + i * raw_pos_dt); std::vector pos_out_times, vel_out_times; std::vector positions, velocities; asp::resampleVec3Lagrange(pos_times_raw, raw_positions, order, factor, pos_out_times, positions); asp::resampleVec3Lagrange(vel_times_raw, raw_velocities, order, factor, vel_out_times, velocities); double pos_t0 = pos_out_times.front(); double pos_dt = (pos_out_times.back() - pos_out_times.front()) / (pos_out_times.size() - 1.0); // Resample quaternions with SLERP (same as old VW path) std::vector quat_times_raw; for (size_t i = 0; i < raw_quaternions.size(); i++) quat_times_raw.push_back(raw_quat_t0 + i * raw_quat_dt); std::vector quat_out_times; std::vector> quaternions; asp::resampleQuatSlerp(quat_times_raw, raw_quaternions, factor, quat_out_times, quaternions); double quat_t0 = quat_out_times.front(); double quat_dt = (quat_out_times.back() - quat_out_times.front()) / (quat_out_times.size() - 1.0); // Update min/max time based on resampled data min_time = std::max(pos_out_times.front(), std::max(vel_out_times.front(), quat_out_times.front())); max_time = std::min(pos_out_times.back(), std::min(vel_out_times.back(), quat_out_times.back())); boost::shared_ptr cam (new PeruSatCsmCameraModel(time_t0, time_dt, positions, velocities, pos_t0, pos_dt, quaternions, quat_t0, quat_dt, xml_reader.m_tan_psi_x, xml_reader.m_tan_psi_y, xml_reader.m_instrument_biases, xml_reader.m_image_size, min_time, max_time)); return cam; } } // end namespace asp ================================================ FILE: src/asp/Camera/LinescanPeruSatModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file LinescanPeruSatModel.h /// /// CSM linescan camera model for PeruSat-1. Populates a UsgsAstroLsSensorModel /// directly from the PeruSat XML metadata, using transverse distortion from /// usgscsm to handle the tan(psi) look angle computation. #ifndef __STEREO_CAMERA_LINESCAN_PERUSAT_MODEL_H__ #define __STEREO_CAMERA_LINESCAN_PERUSAT_MODEL_H__ #include #include #include // Forward declaration class UsgsAstroLsSensorModel; namespace asp { // CSM-based PeruSat camera model, following the Pleiades pattern. // Populates a UsgsAstroLsSensorModel directly, bypassing VW interpolation. class PeruSatCsmCameraModel: public asp::CsmModel { public: PeruSatCsmCameraModel(double time_t0, double time_dt, std::vector const& positions, std::vector const& velocities, double pos_t0, double pos_dt, std::vector> const& quaternions, double quat_t0, double quat_dt, vw::Vector2 const& tan_psi_x, vw::Vector2 const& tan_psi_y, vw::Quaternion const& instrument_biases, vw::Vector2i const& image_size, double min_time, double max_time); virtual ~PeruSatCsmCameraModel() {} virtual std::string type() const { return "LinescanPeruSat"; } // These delegate to the CSM model virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const; virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const; virtual vw::Vector2 point_to_pixel(vw::Vector3 const& point) const; virtual vw::Quaternion camera_pose(vw::Vector2 const& pix) const { vw_throw(vw::NoImplErr() << "PeruSatCsmCameraModel: Cannot retrieve camera_pose!"); return vw::Quaternion(); } private: void populateCsmModel(); double m_time_t0, m_time_dt; std::vector m_positions, m_velocities; double m_pos_t0, m_pos_dt; std::vector> m_quaternions; double m_quat_t0, m_quat_dt; vw::Vector2 m_tan_psi_x, m_tan_psi_y; vw::Quaternion m_instrument_biases; vw::Vector2i m_image_size; double m_min_time, m_max_time; // Pointer to linescan sensor. Managed by CsmModel::m_gm_model. UsgsAstroLsSensorModel * m_ls_model; }; // End class PeruSatCsmCameraModel /// Load a PeruSat camera model from an XML file. boost::shared_ptr load_perusat_camera_model_from_xml(std::string const& path); } // end namespace asp #endif//__STEREO_CAMERA_LINESCAN_PERUSAT_MODEL_H__ ================================================ FILE: src/asp/Camera/LinescanPleiadesModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include // This class implements the Pleiades linescan model // based on the CSM model. // TODO(oalexan1): Need to think more about the desired precision of the CSM // model. Need high accuracy for bundle adjustment, but may get away // with less for mapprojection. For now, err towards more accuracy. namespace asp { // Constructor PleiadesCameraModel:: PleiadesCameraModel(double time_t0, double time_dt, std::vector const& positions, std::vector const& velocities, double pos_t0, double pos_dt, bool isNeoOrSpot67, double t0Quat, double dtQuat, double quat_offset_time, double quat_scale, std::vector> const& quaternion_coeffs, vw::Vector2 const& coeff_psi_x, vw::Vector2 const& coeff_psi_y, vw::Vector2i const& image_size, double min_time, double max_time, int ref_col, int ref_row, double accuracy_stdv): m_positions(positions), m_velocities(velocities), m_pos_t0(pos_t0), m_pos_dt(pos_dt), m_isNeoOrSpot67(isNeoOrSpot67), m_t0Quat(t0Quat), m_dtQuat(dtQuat), m_quat_offset_time(quat_offset_time), m_quat_scale(quat_scale), m_quaternion_coeffs(quaternion_coeffs), m_time_t0(time_t0), m_time_dt(time_dt), m_coeff_psi_x(coeff_psi_x), m_coeff_psi_y(coeff_psi_y), m_min_time(min_time), m_max_time(max_time), m_ref_col(ref_col), m_ref_row(ref_row), m_image_size(image_size), m_accuracy_stdv(accuracy_stdv) { populateCsmModel(); } void PleiadesCameraModel::populateCsmModel() { // Populate CsmModel class members // Do not use a precision below 1.0-e8 as then the linescan model will return junk. m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; vw::cartography::Datum datum("WGS84"); // this sensor is used for Earth only m_semi_major_axis = datum.semi_major_axis(); m_semi_minor_axis = datum.semi_minor_axis(); // Create the linescan model m_gm_model = boost::make_shared(); // m_gm_model will manage the deallocation m_ls_model = dynamic_cast(m_gm_model.get()); // pointer to ls model if (m_ls_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Invalid initialization of the linescan model.\n"); // This performs many initializations apart from the above m_ls_model->reset(); // Override some initializations m_ls_model->m_nSamples = m_image_size[0]; m_ls_model->m_nLines = m_image_size[1]; m_ls_model->m_platformFlag = 1; // explicitly set to 1, to have order 8 Lagrange interpolation m_ls_model->m_maxElevation = 10000.0; // 10 km m_ls_model->m_minElevation = -10000.0; // -10 km m_ls_model->m_focalLength = 1.0; m_ls_model->m_zDirection = 1.0; m_ls_model->m_halfSwath = 1.0; m_ls_model->m_sensorIdentifier = "Pleiades"; m_ls_model->m_majorAxis = m_semi_major_axis; m_ls_model->m_minorAxis = m_semi_minor_axis; m_ls_model->m_iTransL[0] = 0.0; m_ls_model->m_iTransL[1] = 1.0; // no scale m_ls_model->m_iTransL[2] = 0.0; // no skew m_ls_model->m_iTransS[0] = 0.0; m_ls_model->m_iTransS[1] = 0.0; // no skew m_ls_model->m_iTransS[2] = 1.0; // no scale // Quantities needed to find the ray direction in the sensor plane. // This needs to be consistent with usgscsm functions // computeDistortedFocalPlaneCoordinates() and // createCameraLookVector(), which requires a lot of care. // Need to emulate this // double x = m_coeff_psi_x[0] + m_coeff_psi_x[1] * (col + m_ref_col); // double y = m_coeff_psi_y[0] + m_coeff_psi_y[1] * (col + m_ref_col); // Using this: // double detSample = (col + 0.5) * sampleSumming + startingSample; // double detLine = line * lineSumming + startingLine; // but it will use line = 0 m_ls_model->m_detectorLineSumming = 1.0; m_ls_model->m_detectorSampleSumming = -m_coeff_psi_x[1]; // Keep entries below at 0. Modify instead the detector line and sample // origin. The effect is same as all USGSCSM code uses m_detectorLineOrigin - // m_startingDetectorLine, and the same for the sample. m_ls_model->m_startingDetectorLine = 0.0; m_ls_model->m_startingDetectorSample = 0.0; // Optical center m_ls_model->m_detectorLineOrigin = -m_coeff_psi_y[0]; // note: m_coeff_psi_y[1] = 0 m_ls_model->m_detectorSampleOrigin = m_coeff_psi_x[0] + m_coeff_psi_x[1] * (m_ref_col - 0.5); // Time m_ls_model->m_intTimeLines.push_back(1.0); // to offset CSM's quirky 0.5 additions m_ls_model->m_intTimeStartTimes.push_back(m_time_t0); m_ls_model->m_intTimes.push_back(m_time_dt); int num_pos = m_positions.size(); if ((size_t)num_pos != m_velocities.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting as many positions as velocities.\n"); // Positions and velocities m_ls_model->m_numPositions = 3 * num_pos; // concatenate all coordinates m_ls_model->m_t0Ephem = m_pos_t0; m_ls_model->m_dtEphem = m_pos_dt; m_ls_model->m_positions.resize(m_ls_model->m_numPositions); m_ls_model->m_velocities.resize(m_ls_model->m_numPositions); for (int pos_it = 0; pos_it < num_pos; pos_it++) { for (int coord = 0; coord < 3; coord++) { m_ls_model->m_positions [3*pos_it + coord] = m_positions[pos_it][coord]; m_ls_model->m_velocities[3*pos_it + coord] = m_velocities[pos_it][coord]; } } // Quaternions. For NEO these are tabulated, while for 1A/1B they come // from sampling a polynomial. In the latter case, // quaternions are sampled over the range of times for which the position // and velocity are available, which a way longer range than the time spent // acquiring image lines. // TODO(oalexan1): What is the right factor (inverse of sampling rate)? if (m_isNeoOrSpot67) { m_ls_model->m_numQuaternions = 4 * m_quaternion_coeffs.size(); m_ls_model->m_t0Quat = m_t0Quat; m_ls_model->m_dtQuat = m_dtQuat; } else { int factor = 100; // quaternion t0, borrow from position t0 m_ls_model->m_t0Quat = m_ls_model->m_t0Ephem; // quaternion dt, borrow from position dt m_ls_model->m_dtQuat = m_ls_model->m_dtEphem / factor; // Great care is needed here. Number of samples is obtained // by dividing the range of times by the sampling rate, and // then adding one. double beg_time = m_ls_model->m_t0Ephem; double end_time = beg_time + m_ls_model->m_dtEphem * (num_pos - 1); int num_new_pos = (int)round((end_time - beg_time) / m_ls_model->m_dtQuat) + 1; m_ls_model->m_numQuaternions = 4 * num_new_pos; } m_ls_model->m_quaternions.resize(m_ls_model->m_numQuaternions); for (int pos_it = 0; pos_it < m_ls_model->m_numQuaternions / 4; pos_it++) { vw::Quat q; if (m_isNeoOrSpot67) { vw::Vector const& v = m_quaternion_coeffs[pos_it]; // alias q = vw::Quat(v[0], v[1], v[2], v[3]); // order is w, x, y, z } else { // Sample the polynomial double t = m_ls_model->m_t0Quat + pos_it * m_ls_model->m_dtQuat; q = get_camera_pose_at_time(t); } // ASP stores the quaternions as (w, x, y, z). CSM wants them as // x, y, z, w. int coord = 0; m_ls_model->m_quaternions[4*pos_it + coord] = q.x(); coord++; m_ls_model->m_quaternions[4*pos_it + coord] = q.y(); coord++; m_ls_model->m_quaternions[4*pos_it + coord] = q.z(); coord++; m_ls_model->m_quaternions[4*pos_it + coord] = q.w(); coord++; } // Quaternions must always be normalized and not change suddenly in sign. asp::normalizeQuaternions(m_ls_model); // Re-creating the model from the state forces some operations to // take place which are inaccessible otherwise. std::string modelState = m_ls_model->getModelState(); m_ls_model->replaceModelState(modelState); // Adjust the CSM model to correct for velocity aberration and atmospheric // refraction, if desired. This can only happen after the model is fully initialized, as // need to create rays from the camera center to the ground. // TODO(oalexan1): Use more precise values below. double local_earth_radius = vw::DEFAULT_EARTH_RADIUS; double mean_ground_elevation = vw::DEFAULT_SURFACE_ELEVATION; asp::orbitalCorrections(this, asp::stereo_settings().enable_velocity_aberration_correction, asp::stereo_settings().enable_atmospheric_refraction_correction, local_earth_radius, mean_ground_elevation); } vw::Vector3 PleiadesCameraModel::camera_center(vw::Vector2 const& pix) const { csm::ImageCoord csm_pix; asp::toCsmPixel(pix, csm_pix); double time = m_ls_model->getImageTime(csm_pix); csm::EcefCoord ecef = m_ls_model->getSensorPosition(time); return vw::Vector3(ecef.x, ecef.y, ecef.z); } vw::Vector3 PleiadesCameraModel::pixel_to_vector(vw::Vector2 const& pix) const { csm::ImageCoord csm_pix; asp::toCsmPixel(pix, csm_pix); csm::EcefLocus locus = m_ls_model->imageToRemoteImagingLocus(csm_pix); return vw::Vector3(locus.direction.x, locus.direction.y, locus.direction.z); } vw::Vector2 PleiadesCameraModel::point_to_pixel(vw::Vector3 const& point) const { csm::EcefCoord ecef(point[0], point[1], point[2]); // Do not show warnings, it becomes too verbose double achievedPrecision = -1.0; csm::WarningList warnings; csm::WarningList * warnings_ptr = NULL; bool show_warnings = false; csm::ImageCoord csm_pix = m_ls_model->groundToImage(ecef, m_desired_precision, &achievedPrecision, warnings_ptr); vw::Vector2 asp_pix; asp::fromCsmPixel(asp_pix, csm_pix); return asp_pix; } // This function is tricky to implement vw::Quaternion PleiadesCameraModel::camera_pose(vw::Vector2 const& pix) const { // This is not implemented for now for the CSM model vw_throw(vw::NoImplErr() << "LinescanPleiadesModel: Cannot retrieve camera_pose!"); return vw::Quaternion(); } // Allow finding the time at any line, even negative ones. Here a // simple slope-intercept formula is used rather than a table so one // cannot run out of bounds. Page 76 in the doc. double PleiadesCameraModel::get_time_at_line(double line) const { csm::ImageCoord csm_pix; asp::toCsmPixel(vw::Vector2(0, line), csm_pix); return m_ls_model->getImageTime(csm_pix); } // Throw an exception if the input time is outside the given // bounds. The valid range is much bigger than the range of times // at which image lines are recorded. It is rather the range at // which positions, velocities, and quaternions are tabulated. void PleiadesCameraModel::check_time(double time, std::string const& location) const { if ((time < m_min_time) || (time > m_max_time)) vw::vw_throw(vw::ArgumentErr() << "PleiadesCameraModel::"< "<getSensorPosition(time); return vw::Vector3(ecef.x, ecef.y, ecef.z); } vw::Vector3 PleiadesCameraModel::get_camera_velocity_at_time(double time) const { // TODO(oalexan1): This needs testing. csm::EcefVector ecef = m_ls_model->getSensorVelocity(time); return vw::Vector3(ecef.x, ecef.y, ecef.z); } // Compute the quaternion at given time using the polynomial // expression (doc page 77). This should work whether or not the CSM // model is used. This applies only to L1A/B products, and not to the NEO // product, when the quaternions are tabulated instead. vw::Quat PleiadesCameraModel::get_camera_pose_at_time(double time) const { if (m_isNeoOrSpot67) vw::vw_throw(vw::NoImplErr() << "PleiadesCameraModel: Cannot compute camera pose " << "from polynomial for NEO products. This is a programmer error.\n"); double scaled_t = (time - m_quat_offset_time) / m_quat_scale; if (m_quaternion_coeffs.size() != 4) vw::vw_throw(vw::ArgumentErr() << "Expecting four quaternions.\n"); vw::Vector v(0, 0, 0, 0); // future quaternion double tn = 1.0; // scaled_t to the power of n for (size_t it = 0; it < 4; it++) { for (size_t coord = 0; coord < 4; coord++) v[coord] += m_quaternion_coeffs[coord][it] * tn; tn *= scaled_t; } return vw::Quaternion(v[0], v[1], v[2], v[3]); // order is w, x, y, z } // The pointing vector in sensor coordinates. This function is now not used, // because CSM does the work. // Page 76 in the doc. vw::Vector3 PleiadesCameraModel::get_local_pixel_vector(vw::Vector2 const& pix) const { double col = pix[0]; double row = pix[1]; // The doc says to subtract m_ref_col, while it was found // experimentally that one needs to add it. double x = m_coeff_psi_x[0] + m_coeff_psi_x[1] * (col + m_ref_col); // Note how below col (and not row) is used, per the Pleiades doc. // Note that m_coeff_psi_y[1] is 0. double y = m_coeff_psi_y[0] + m_coeff_psi_y[1] * (col + m_ref_col); vw::Vector3 result = vw::Vector3(y, -x, 1.0); // Make the direction have unit length result = normalize(result); return result; } // Shared implementation for loading Pleiades/NEO/SPOT 6/7 camera models. // The sensor model and XML structure are the same for all these sensors. boost::shared_ptr load_pleiades_family_camera_model(PleiadesXML & xml_reader) { // Time at line = time_t0 + time_dt * line double time_t0 = 0, time_dt = 0; xml_reader.setup_time_func(time_t0, time_dt); // Position and velocity samples with uniform time grid std::vector positions, velocities; double pos_t0 = 0, pos_dt = 0, pos_tend = 0; double vel_t0 = 0, vel_dt = 0, vel_tend = 0; xml_reader.setup_position_func(time_t0, time_dt, positions, pos_t0, pos_dt, pos_tend); xml_reader.setup_velocity_func(time_t0, time_dt, velocities, vel_t0, vel_dt, vel_tend); // Set up the quaternions for NEO. This will create xml_reader m_t0Quat, // m_dtQuat, m_quaternion_coeffs. if (xml_reader.m_isNeoOrSpot67) xml_reader.setup_pose_func(time_t0, time_dt); // Find the range of times for which we can solve for position and pose double min_time = std::max(pos_t0, vel_t0); double max_time = std::min(pos_tend, vel_tend); // Create the model. This can throw an exception. boost::shared_ptr cam (new PleiadesCameraModel(time_t0, time_dt, positions, velocities, pos_t0, pos_dt, xml_reader.m_isNeoOrSpot67, xml_reader.m_t0Quat, xml_reader.m_dtQuat, xml_reader.m_quat_offset_time, xml_reader.m_quat_scale, xml_reader.m_quaternion_coeffs, xml_reader.m_coeff_psi_x, xml_reader.m_coeff_psi_y, xml_reader.m_image_size, min_time, max_time, xml_reader.m_ref_col, xml_reader.m_ref_row, xml_reader.m_accuracy_stdv)); return cam; } boost::shared_ptr load_pleiades_camera_model_from_xml(std::string const& path) { PleiadesXML xml_reader; xml_reader.read_xml(path); // Only accept Pleiades sensors, not SPOT 6/7 if (xml_reader.m_sensor_name != "PHR_SENSOR" && xml_reader.m_sensor_name != "PNEO_SENSOR") vw::vw_throw(vw::ArgumentErr() << "Expected a Pleiades sensor, got: " << xml_reader.m_sensor_name << ".\n"); return load_pleiades_family_camera_model(xml_reader); } boost::shared_ptr load_spot_camera_model_from_xml(std::string const& path) { PleiadesXML xml_reader; xml_reader.read_xml(path); // Only accept SPOT 6/7 sensors if (xml_reader.m_sensor_name != "S6_SENSOR" && xml_reader.m_sensor_name != "S7_SENSOR") vw::vw_throw(vw::ArgumentErr() << "Expected a SPOT 6/7 sensor, got: " << xml_reader.m_sensor_name << ".\n"); return load_pleiades_family_camera_model(xml_reader); } // End function load_spot_camera_model() } // end namespace asp ================================================ FILE: src/asp/Camera/LinescanPleiadesModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file LinescanPleiadesModel.h /// /// Linescan camera model for Pleiades. Implemented based on /// Pleiades Imagery User Guide /// https://www.intelligence-airbusds.com/automne/api/docs/v1.0/document/download/ZG9jdXRoZXF1ZS1kb2N1bWVudC01NTY0Mw==/ZG9jdXRoZXF1ZS1maWxlLTU1NjQy/airbus-pleiades-imagery-user-guide-15042021.pdf /// #ifndef __STEREO_CAMERA_LINESCAN_PLEIADES_MODEL_H__ #define __STEREO_CAMERA_LINESCAN_PLEIADES_MODEL_H__ #include #include #include #include // Forward declaration class UsgsAstroLsSensorModel; namespace asp { // Adaptation of CsmModel for handling Pleiades metatdata class PleiadesCameraModel: public asp::CsmModel { public: //------------------------------------------------------------------ // Constructors / Destructors //------------------------------------------------------------------ PleiadesCameraModel(double time_t0, double time_dt, std::vector const& positions, std::vector const& velocities, double pos_t0, double pos_dt, bool isNeoOrSpot67, double m_t0Quat, double m_dtQuat, double quat_offset_time, double quat_scale, std::vector> const& quaternion_coeffs, vw::Vector2 const& coeff_psi_x, vw::Vector2 const& coeff_psi_y, vw::Vector2i const& image_size, double min_time, double max_time, int ref_col, int ref_row, double accuracy_stdv); virtual ~PleiadesCameraModel() {} virtual std::string type() const { return "LinescanPleiades"; } // This set of functions implements virtual functions from LinescanModel.h // Implement the functions from the LinescanModel class using functors virtual vw::Vector3 get_camera_center_at_time (double time) const; virtual vw::Vector3 get_camera_velocity_at_time(double time) const; virtual vw::Quat get_camera_pose_at_time (double time) const; virtual double get_time_at_line (double line) const; // Camera pose virtual vw::Quaternion camera_pose(vw::Vector2 const& pix) const; // Gives a pointing vector in the world coordinates. virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const; /// Gives the camera position in world coordinates. virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const; /// As pixel_to_vector, but in the local camera frame. virtual vw::Vector3 get_local_pixel_vector(vw::Vector2 const& pix) const; virtual vw::Vector2 point_to_pixel(vw::Vector3 const& point) const; // Horizontal accuracy standard deviation double m_accuracy_stdv; private: void populateCsmModel(); double m_time_t0, m_time_dt; ///< Time at line = m_time_t0 + m_time_dt * line std::vector m_positions; ///< Position samples std::vector m_velocities; ///< Velocity samples double m_pos_t0, m_pos_dt; ///< Position/velocity time grid // These are used to find the look direction in camera coordinates at a given line vw::Vector2 m_coeff_psi_x, m_coeff_psi_y; /// These are the limits of when he have position data available. double m_min_time, m_max_time; // These will be used to fit the quaternions bool m_isNeoOrSpot67; double m_t0Quat, m_dtQuat; double m_quat_offset_time, m_quat_scale; std::vector> m_quaternion_coeffs; // Relative column and row (here indices start from 0, not from 1 as in the doc) int m_ref_row, m_ref_col; // Throw an exception if the input time is outside the given // bounds. The valid range is much bigger than the range of times // at which image lines are recorded. It is rather the range at // which positions, velocities, and quaternions are tabulated. void check_time(double time, std::string const& location) const; // Pointer to linescan sensor. It will be managed by CsmModel::m_gm_model UsgsAstroLsSensorModel * m_ls_model; vw::Vector2i m_image_size; }; // End class PleiadesCameraModel // Non-class functions /// Load a Pleiades camera model from an XML file. /// - This function does not take care of Xerces XML init/de-init, the caller must /// make sure this is done before/after this function is called! boost::shared_ptr load_pleiades_camera_model_from_xml(std::string const& path); /// Load a SPOT 6/7 camera model from a DIMAP V2 XML file. /// Uses the same camera model as Pleiades NEO. boost::shared_ptr load_spot_camera_model_from_xml(std::string const& path); } // end namespace asp #endif//__STEREO_CAMERA_LINESCAN_PLEIADES_MODEL_H__ ================================================ FILE: src/asp/Camera/LinescanSpotModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include namespace asp { using vw::Vector3; using vw::Matrix3x3; // Compute the local orbital frame from satellite position and velocity. // From the SPOT 123-4-5 Geometry Handbook (GAEL-P135-DOC-001), Eq. 7a-c. // Z2 = normalize(pos), X2 = normalize(vel x Z2), Y2 = Z2 x X2 // Returns the matrix [X2 | Y2 | Z2] that converts from orbital to GCC. Matrix3x3 get_local_orbital_frame(Vector3 const& position, Vector3 const& velocity) { Vector3 Z2 = vw::math::normalize(position); Vector3 X2 = vw::math::normalize(vw::math::cross_prod(velocity, Z2)); Vector3 Y2 = vw::math::cross_prod(Z2, X2); Matrix3x3 out; for (int r = 0; r < 3; r++) { out(r,0) = X2[r]; out(r,1) = Y2[r]; out(r,2) = Z2[r]; } return out; } // Compute the look rotation matrix Mp*Mr*My from yaw, pitch, roll. // From the SPOT 123-4-5 Geometry Handbook (GAEL-P135-DOC-001), Eq. 11a-e. // Converts a look vector from the navigation frame (O1) to the orbital frame (O2). Matrix3x3 get_look_rotation_matrix(double yaw, double pitch, double roll) { double cp = cos(pitch); double sp = sin(pitch); double cr = cos(roll); double sr = sin(roll); double cy = cos(yaw); double sy = sin(yaw); Matrix3x3 M; M(0,0) = (cr*cy); M(0,1) = (-cr*sy); M(0,2) = (-sr); M(1,0) = (cp*sy+sp*sr*cy); M(1,1) = (cp*cy-sp*sr*sy); M(1,2) = (sp*cr); M(2,0) = (-sp*sy+cp*sr*cy); M(2,1) = (-sp*cy-cp*sr*sy); M(2,2) = cp*cr; return M; } // Load a SPOT5 CSM camera model. Populates CSM with vendor extrinsics // directly (positions, velocities, quaternions from XML), then fits // only intrinsics (focal length, optical center, distortion) to match // the vendor's per-column look angle table. boost::shared_ptr load_spot5_csm_camera_model_from_xml(std::string const& path) { // Parse the SPOT5 XML file SpotXML xml_reader; xml_reader.read_xml(path); // Get the interpolation functors for position/velocity (for quaternion conversion) vw::LagrangianInterpolation position_func = xml_reader.setup_position_func(); vw::LagrangianInterpolation velocity_func = xml_reader.setup_velocity_func(); vw::LinearTimeInterpolation time_func = xml_reader.setup_time_func(); // Extract raw position/velocity data with times std::vector positions, velocities; std::vector pos_times; for (auto iter = xml_reader.position_logs.begin(); iter != xml_reader.position_logs.end(); iter++) { double t = xml_reader.convert_time(iter->first); pos_times.push_back(t); positions.push_back(iter->second); } for (auto iter = xml_reader.velocity_logs.begin(); iter != xml_reader.velocity_logs.end(); iter++) velocities.push_back(iter->second); // Compute uniform ephemeris time grid double t0_ephem = pos_times.front(); double dt_ephem = (pos_times.back() - pos_times.front()) / (pos_times.size() - 1.0); // Warn if ephemeris time grid is not uniform (1e-3 relative tolerance) for (size_t i = 1; i < pos_times.size(); i++) { double dt_i = pos_times[i] - pos_times[i-1]; if (std::abs(dt_i - dt_ephem) > 1e-3 * std::abs(dt_ephem)) vw::vw_out(vw::WarningMessage) << "SPOT5: non-uniform ephemeris spacing at " << "sample " << i << ": dt = " << dt_i << " vs expected " << dt_ephem << "\n"; } // Extract raw pose data and convert yaw/pitch/roll to GCC quaternions. vw::LinearPiecewisePositionInterpolation spot_pose_func = xml_reader.setup_pose_func(time_func); // Get pose sample times std::vector pose_times; for (auto iter = xml_reader.pose_logs.begin(); iter != xml_reader.pose_logs.end(); iter++) { double t = xml_reader.convert_time(iter->first); pose_times.push_back(t); } // Warn if attitude time grid is not uniform (1e-3 relative tolerance) if (pose_times.size() > 1) { double dt_pose = (pose_times.back() - pose_times.front()) / (pose_times.size() - 1.0); for (size_t i = 1; i < pose_times.size(); i++) { double dt_i = pose_times[i] - pose_times[i-1]; if (std::abs(dt_i - dt_pose) > 1e-3 * std::abs(dt_pose)) vw::vw_out(vw::WarningMessage) << "SPOT5: non-uniform attitude spacing at " << "sample " << i << ": dt = " << dt_i << " vs expected " << dt_pose << "\n"; } } // Pad pose times to match what setup_pose_func does (it pads at boundaries) double t0_quat = spot_pose_func.get_t0(); double dt_quat = spot_pose_func.get_dt(); double tend_quat = spot_pose_func.get_tend(); size_t num_quat = static_cast(round((tend_quat - t0_quat) / dt_quat)); // Axis reorientation matrix: R = diag(-1, 1, -1) // Converts from vendor's navigation frame to the frame used by CSM. Matrix3x3 R; R(0,0) = -1.0; R(0,1) = 0.0; R(0,2) = 0.0; R(1,0) = 0.0; R(1,1) = 1.0; R(1,2) = 0.0; R(2,0) = 0.0; R(2,1) = 0.0; R(2,2) = -1.0; // Convert each pose sample to a GCC rotation matrix std::vector> cam2world_vec(num_quat); for (size_t i = 0; i < num_quat; i++) { double time = t0_quat + dt_quat * static_cast(i); Vector3 position = position_func(time); Vector3 velocity = velocity_func(time); Vector3 yaw_pitch_roll = spot_pose_func(time); Matrix3x3 lo_frame = get_local_orbital_frame(position, velocity); Matrix3x3 look_rotation = get_look_rotation_matrix( yaw_pitch_roll[0], yaw_pitch_roll[1], yaw_pitch_roll[2]); cam2world_vec[i] = lo_frame * look_rotation * R; } // Compute intrinsics from the look angle table using the PeruSat approach: // focal_length = 1.0, detector params in angle units. // // The local look vector is: normalize(tan(PSI_Y), tan(PSI_X), 1.0) // CSM's look vector is: normalize(undist_x, undist_y, focal_length) // With f=1.0: look = normalize(undist_x, undist_y, 1.0) // So we need: undist_x = tan(PSI_Y(col)), undist_y = tan(PSI_X(col)) // // The detector model computes: // distortedY = col * sampleSumming - sampleOrigin (across-track) // distortedX = 0 * lineSumming - lineOrigin (along-track) // // Fit a linear model to tan(PSI_Y) vs column. The nonlinear residual // (degree 3+ curvature) is captured later by TRANSVERSE distortion. // tan(PSI_Y(col)) ~ slope_y * col + intercept_y // Then: sampleSumming = slope_y, sampleOrigin = -intercept_y // // For PSI_X (nearly constant): lineOrigin = -tan(PSI_X_center) auto const& look_angles = xml_reader.look_angles; int num_cols = xml_reader.image_size[0]; // Linear fit to tan(PSI_Y) vs column index (0-based) double sum_c = 0, sum_ty = 0, sum_c2 = 0, sum_cty = 0; for (int c = 0; c < num_cols; c++) { double ty = tan(look_angles[c].second[1]); sum_c += c; sum_ty += ty; sum_c2 += c * (double)c; sum_cty += c * ty; } double n_cols = num_cols; double slope_y = (n_cols * sum_cty - sum_c * sum_ty) / (n_cols * sum_c2 - sum_c * sum_c); double intercept_y = (sum_ty - slope_y * sum_c) / n_cols; // PSI_X is nearly constant - use center value int mid_col = num_cols / 2; double psi_x_center = look_angles[mid_col].second[0]; double focal_length = 1.0; // optical_center is not used directly - detector origin encodes it vw::Vector2 optical_center(0.0, 0.0); // Line dating double first_line_time = time_func(0); double dt_line = xml_reader.line_period; vw::cartography::Datum datum("WGS84"); std::string sensor_id = "SPOT5"; // Populate CSM model fields directly. We do this instead of calling // populateCsmLinescan() because positions (12 pts at 30s) and quaternions // (515 pts at 0.125s) have different counts and time grids. boost::shared_ptr csm_model(new CsmModel()); csm_model->m_desired_precision = asp::DEFAULT_CSM_DESIRED_PRECISION; csm_model->m_semi_major_axis = datum.semi_major_axis(); csm_model->m_semi_minor_axis = datum.semi_minor_axis(); csm_model->m_gm_model = boost::make_shared(); UsgsAstroLsSensorModel* ls = dynamic_cast(csm_model->m_gm_model.get()); ls->reset(); ls->m_nSamples = xml_reader.image_size[0]; ls->m_nLines = xml_reader.image_size[1]; ls->m_platformFlag = 1; // order 8 Lagrange (matches vendor prescription) ls->m_minElevation = -10000.0; ls->m_maxElevation = 10000.0; ls->m_focalLength = focal_length; ls->m_zDirection = 1.0; ls->m_halfSwath = 1.0; ls->m_sensorIdentifier = sensor_id; ls->m_majorAxis = datum.semi_major_axis(); ls->m_minorAxis = datum.semi_minor_axis(); // Detector model: PeruSat-style, mapping pixels to angle-like values. // distortedY = col * sampleSumming - sampleOrigin = slope_y * col + intercept_y // distortedX = 0 - lineOrigin = tan(PSI_X_center) ls->m_iTransL[0] = 0.0; ls->m_iTransL[1] = 0.0; ls->m_iTransL[2] = 1.0; ls->m_iTransS[0] = 0.0; ls->m_iTransS[1] = 1.0; ls->m_iTransS[2] = 0.0; ls->m_detectorSampleSumming = slope_y; ls->m_detectorSampleOrigin = -intercept_y + 0.5 * slope_y; ls->m_detectorLineSumming = 1.0; ls->m_detectorLineOrigin = -tan(psi_x_center); ls->m_startingDetectorLine = 0.0; ls->m_startingDetectorSample = 0.0; // Line timing ls->m_intTimeLines.push_back(1.0); ls->m_intTimeStartTimes.push_back(first_line_time); ls->m_intTimes.push_back(dt_line); // Positions and velocities (12 pts at 30s) ls->m_t0Ephem = t0_ephem; ls->m_dtEphem = dt_ephem; ls->m_numPositions = 3 * positions.size(); ls->m_positions.resize(ls->m_numPositions); ls->m_velocities.resize(ls->m_numPositions); for (size_t i = 0; i < positions.size(); i++) for (int c = 0; c < 3; c++) { ls->m_positions [3*i + c] = positions[i][c]; ls->m_velocities[3*i + c] = velocities[i][c]; } // Convert rotation matrices to VW quaternions (w, x, y, z order) std::vector> in_quats(cam2world_vec.size()); std::vector in_quat_times(cam2world_vec.size()); for (size_t i = 0; i < cam2world_vec.size(); i++) { double x, y, z, w; asp::matrixToQuaternion(cam2world_vec[i], x, y, z, w); in_quats[i] = vw::Quaternion(w, x, y, z); in_quat_times[i] = t0_quat + dt_quat * static_cast(i); } // SLERP resample 5x to honor vendor's linear interpolation prescription. // CSM uses order-8 Lagrange on quaternion components, but the vendor // prescribes linear interpolation of attitude. A 5x denser grid makes // Lagrange converge to linear behavior between the original samples. int quat_resample_factor = 5; std::vector out_quat_times; std::vector> out_quats; asp::resampleQuatSlerp(in_quat_times, in_quats, quat_resample_factor, out_quat_times, out_quats); double quat_t0_out = out_quat_times.front(); double quat_dt_out = (out_quat_times.back() - out_quat_times.front()) / (out_quat_times.size() - 1.0); // Populate CSM quaternions (USGSCSM stores as x, y, z, w) ls->m_t0Quat = quat_t0_out; ls->m_dtQuat = quat_dt_out; ls->m_numQuaternions = 4 * out_quats.size(); ls->m_quaternions.resize(ls->m_numQuaternions); for (size_t i = 0; i < out_quats.size(); i++) { ls->m_quaternions[4*i + 0] = out_quats[i].x(); ls->m_quaternions[4*i + 1] = out_quats[i].y(); ls->m_quaternions[4*i + 2] = out_quats[i].z(); ls->m_quaternions[4*i + 3] = out_quats[i].w(); } asp::normalizeQuaternions(ls); // TRANSVERSE distortion starting at identity ls->m_distortionType = TRANSVERSE; ls->m_opticalDistCoeffs.resize(20, 0.0); ls->m_opticalDistCoeffs[1] = 1.0; // x: identity for ux ls->m_opticalDistCoeffs[12] = 1.0; // y: identity for uy // Re-create from state to finalize internal bookkeeping std::string modelState = ls->getModelState(); ls->replaceModelState(modelState); // Fit intrinsics (focal_length, optical_center, distortion) to match // the vendor's per-column look angle table. Rotations are pinned constant // since extrinsics come from the vendor. Generate world sight vectors // directly from the look angle table and SLERP'd quaternions. { // SLERP interpolator on the resampled quaternions (same data as CSM has) vw::SLERPPoseInterpolation slerp_interp(out_quats, quat_t0_out, quat_dt_out); int num_rows = xml_reader.image_size[1]; int d_col_fit = std::max(1, num_cols / 500); // ~500 column samples int d_row_fit = std::max(1, num_rows / 3); // ~3 rows (intrinsics same per row) std::vector col_idx, row_idx; for (int c = 0; c < num_cols; c += d_col_fit) col_idx.push_back(c); if (col_idx.back() != num_cols - 1) col_idx.push_back(num_cols - 1); for (int r = 0; r < num_rows; r += d_row_fit) row_idx.push_back(r); if (row_idx.back() != num_rows - 1) row_idx.push_back(num_rows - 1); // Vendor look direction (Eq. 5a) is u1 = normalize(-tan(PSI_Y), tan(PSI_X), -1). // The rotation matrices already include the R=diag(-1,1,-1) axis flip, // so the local look vector in the rotated frame is: // u_local = normalize(tan(PSI_Y), tan(PSI_X), 1.0) SightMatT world_sight_mat(row_idx.size()); for (size_t ri = 0; ri < row_idx.size(); ri++) { world_sight_mat[ri].resize(col_idx.size()); double time = first_line_time + dt_line * row_idx[ri]; vw::Quaternion q = slerp_interp(time); vw::Matrix3x3 rot = q.rotation_matrix(); for (size_t ci = 0; ci < col_idx.size(); ci++) { int c = col_idx[ci]; double psi_x = look_angles[c].second[0]; double psi_y = look_angles[c].second[1]; vw::Vector3 local_look = normalize(vw::Vector3(tan(psi_y), tan(psi_x), 1.0)); world_sight_mat[ri][ci] = rot * local_look; } } int min_col = col_idx.front(); int min_row = row_idx.front(); bool fix_rotations = true; asp::refineCsmLinescanFit(world_sight_mat, min_col, min_row, d_col_fit, d_row_fit, *csm_model, fix_rotations, TRANSVERSE); } return csm_model; } } // end namespace asp ================================================ FILE: src/asp/Camera/LinescanSpotModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file LinescanSpotModel.h /// /// SPOT 5 CSM camera model loader. #ifndef __STEREO_CAMERA_LINESCAN_SPOT_MODEL_H__ #define __STEREO_CAMERA_LINESCAN_SPOT_MODEL_H__ #include #include namespace asp { class CsmModel; /// Load a SPOT5 CSM camera model from an XML file. /// Populates CSM with vendor extrinsics (positions, velocities, quaternions) /// and fits intrinsics (focal length, optical center, TRANSVERSE distortion) /// to the vendor's per-column look angle table. boost::shared_ptr load_spot5_csm_camera_model_from_xml(std::string const& path); } // namespace asp #endif//__STEREO_CAMERA_LINESCAN_SPOT_MODEL_H__ ================================================ FILE: src/asp/Camera/LinescanUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Functions that know about the many kinds of linescan cameras #include #include namespace asp { // Whether the session uses a CSM linescan model. bool isLinescanCsmSession(std::string const& session) { return (session == "csm" || session == "dg" || session == "pleiades" || session == "spot" || session == "perusat" || session == "aster" || session == "spot5"); } // Find the underlying CSM camera. Applies to all linescan CSM sessions. // All linescan CSM models (Pleiades, DG, PeruSat, Spot, ASTER) inherit // directly from CsmModel, so a simple dynamic_cast suffices. asp::CsmModel * csm_model(boost::shared_ptr cam) { // In some places the camera models have an external adjustment. // If that is the case, this function only works if the adjustment // is the identity, as it does not know how to apply it. vw::camera::AdjustedCameraModel *adj_cam = dynamic_cast(cam.get()); if (adj_cam != NULL) { vw::Matrix4x4 ecef_transform = adj_cam->ecef_transform(); // must be the identity if (ecef_transform != vw::math::identity_matrix<4>()) vw::vw_throw(vw::ArgumentErr() << "A CSM camera with an adjustment such as coming from " << "--bundle-adjust-prefix detected. Not supported in this workflow.\n"); } asp::CsmModel * csm_model = dynamic_cast(vw::camera::unadjusted_model(cam.get())); if (csm_model == NULL) vw::vw_throw(vw::ArgumentErr() << "Expected a CSM camera model."); return csm_model; } } // end namespace asp ================================================ FILE: src/asp/Camera/LinescanUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file LinescanUtils.h // Functions that know about the many kinds of linescan cameras #ifndef __ASP_CAMERA_LINESCAN_UTILS_H__ #define __ASP_CAMERA_LINESCAN_UTILS_H__ #include namespace asp { // Whether the session uses a CSM linescan model (directly or via a wrapper). // This is true for csm, dg, pleiades, spot, perusat, and aster. bool isLinescanCsmSession(std::string const& session); // Find the underlying CSM camera. Applies to all linescan CSM sessions. class CsmModel; CsmModel * csm_model(boost::shared_ptr cam); } // end namespace asp #endif //__ASP_CAMERA_LINESCAN_UTILS_H__ ================================================ FILE: src/asp/Camera/MapprojectImage.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file MapprojectImage.cc /// Algorithms specific to mapprojecting images. // Much templated logic here that is very slow to compile. // It is best to avoid adding more code here. #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { using namespace vw; using namespace vw::cartography; template void write_parallel_cond(std::string const& filename, ImageViewBase const& image, GeoReference const& georef, bool has_nodata, double nodata_val, asp::MapprojOptions const& opt, TerminalProgressCallback const& tpc) { // Write names of the bundle adjust prefix, input image file, camera file, // dem, and session type. Those will be used in StereoSession to load the // mapprojected image. // There is no difference between pinhole and nadirpinhole when it comes // to how mapprojection happens, that becomes important only in stereo. std::string session_type = opt.stereo_session; if (session_type == "isismapisis") session_type = "isis"; if (session_type == "rpcmaprpc") session_type = "rpc"; if (session_type == "pinholemappinhole" || session_type == "nadirpinhole") session_type = "pinhole"; // Save some keywords that we will check later when using the mapprojected file std::map keywords; if (!opt.noGeoHeaderInfo) { std::string prefix = asp::stereo_settings().bundle_adjust_prefix;; if (prefix == "") prefix = "NONE"; // to save the field, need to make it non-empty keywords["BUNDLE_ADJUST_PREFIX" ] = prefix; keywords["CAMERA_MODEL_TYPE" ] = session_type; keywords["INPUT_IMAGE_FILE" ] = opt.image_file; keywords["CAMERA_FILE" ] = opt.camera_file; // Save the camera adjustment. That is an important record // for how the image got mapprojected and is good to keep. Vector3 t(0, 0, 0); vw::Quaternion q(1, 0, 0, 0); vw::camera::AdjustedCameraModel * adj_cam = dynamic_cast(opt.camera_model.get()); if (adj_cam != NULL) { q = adj_cam->rotation(); t = adj_cam->translation(); } std::ostringstream osq; osq.precision(17); osq << q.w() << "," << q.x() << "," << q.y() << "," << q.z(); keywords["ADJUSTMENT_QUATERNION"] = osq.str(); std::ostringstream ost; ost.precision(17); ost << t.x() << "," << t.y() << "," << t.z(); keywords["ADJUSTMENT_TRANSLATION"] = ost.str(); keywords["DEM_FILE"] = opt.dem_file; // Parse keywords from the --mo option. asp::parse_append_metadata(opt.metadata, keywords); } bool has_georef = true; // ISIS is not thread safe so we must switch out based on what the session is. vw_out() << "Writing: " << filename << "\n"; if (opt.multithreaded_model) { vw::cartography::block_write_gdal_image(filename, image.impl(), has_georef, georef, has_nodata, nodata_val, opt, tpc, keywords); } else { vw::cartography::write_gdal_image(filename, image.impl(), has_georef, georef, has_nodata, nodata_val, opt, tpc, keywords); } } // If the output type is some type of int, round and clamp to this // type, both the pixels and the nodata-value. Else write as it is. template void write_parallel_type(std::string const& filename, ImageT const& image, GeoReference const& georef, bool has_nodata, double nodata_val, asp::MapprojOptions const& opt, TerminalProgressCallback const& tpc) { typedef typename ImageT::pixel_type InputType; if (opt.output_type == "Float32") write_parallel_cond(filename, image, georef, has_nodata, nodata_val, opt, tpc); else if (opt.output_type == "Byte") write_parallel_cond(filename, per_pixel_filter(image, RoundAndClamp()), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "UInt16") write_parallel_cond(filename, per_pixel_filter(image, RoundAndClamp()), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "Int16") write_parallel_cond(filename, per_pixel_filter(image, RoundAndClamp()), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "UInt32") write_parallel_cond(filename, per_pixel_filter(image, RoundAndClamp()), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "Int32") write_parallel_cond(filename, per_pixel_filter(image, RoundAndClamp()), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else vw_throw( NoImplErr() << "Unsupported output type: " << opt.output_type << ".\n" ); } // Like write_parallel_type, but for compound pixel types (e.g., PixelRGBA). // Uses channel_cast_round_and_clamp to convert each channel independently, // preserving the multi-channel pixel structure. template void write_parallel_type_multichannel(std::string const& filename, ImageT const& image, GeoReference const& georef, bool has_nodata, double nodata_val, asp::MapprojOptions const& opt, TerminalProgressCallback const& tpc) { if (opt.output_type == "Float32") write_parallel_cond(filename, image, georef, has_nodata, nodata_val, opt, tpc); else if (opt.output_type == "Byte") write_parallel_cond(filename, channel_cast_round_and_clamp(image), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "UInt16") write_parallel_cond(filename, channel_cast_round_and_clamp(image), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "Int16") write_parallel_cond(filename, channel_cast_round_and_clamp(image), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "UInt32") write_parallel_cond(filename, channel_cast_round_and_clamp(image), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else if (opt.output_type == "Int32") write_parallel_cond(filename, channel_cast_round_and_clamp(image), georef, has_nodata, vw::round_and_clamp(nodata_val), opt, tpc); else vw_throw(NoImplErr() << "Unsupported output type: " << opt.output_type << ".\n"); } /// Mapproject the image with a nodata value. Used for single channel images. /// Input is always read as float (no template on pixel type needed since the /// only caller uses float). template void project_image_nodata(asp::MapprojOptions & opt, GeoReference const& croppedGeoRef, Vector2i const& virtual_image_size, BBox2i const& croppedImageBB, Map2CamTransT const& transform) { typedef PixelMask ImageMaskPixelT; // Create handle to input image to be projected on to the map boost::shared_ptr img_rsrc = vw::DiskImageResourcePtr(opt.image_file); // Disable rescaling so integer pixels (uint8, uint16, etc.) are not // normalized to [0,1] when read as float. In practice, rescaling does // not appear to happen in the GDAL read path even without this call, // but set it explicitly as a safeguard. img_rsrc->set_rescale(false); // Update the nodata value from the input file if it is present. if (img_rsrc->has_nodata_read()) opt.nodata_value = img_rsrc->nodata_read(); // Read as single-plane float. Multi-band images (e.g., THEMIS IR) are // exposed as multiple planes by VW's GDAL reader; only the first band // is used in this path (the RGB path handles multi-channel images). ImageViewRef disk_img = DiskImageView(img_rsrc); if (disk_img.planes() > 1) disk_img = select_plane(disk_img, 0); // Create masked image from input ImageViewRef masked_input = create_mask(disk_img, opt.nodata_value); // For ISIS .cub files, also mask special pixels (LIS, LRS, HIS, HRS) // that are not covered by the single nodata value if (fs::path(opt.image_file).extension() == ".cub") asp::adjustIsisImage(opt.image_file, opt.nodata_value, masked_input); bool has_img_nodata = true; ImageMaskPixelT nodata_mask = ImageMaskPixelT(); // invalid value for a PixelMask if (opt.nearest_neighbor) { write_parallel_type (opt.output_file, crop(apply_mask (transform_nodata(masked_input, transform, virtual_image_size[0], virtual_image_size[1], ValueEdgeExtension(nodata_mask), NearestPixelInterpolation(), nodata_mask), opt.nodata_value), croppedImageBB), croppedGeoRef, has_img_nodata, opt.nodata_value, opt, TerminalProgressCallback("","")); } else { write_parallel_type (opt.output_file, crop(apply_mask (transform_nodata(masked_input, transform, virtual_image_size[0], virtual_image_size[1], ValueEdgeExtension(nodata_mask), BicubicInterpolation(), nodata_mask), opt.nodata_value), croppedImageBB), croppedGeoRef, has_img_nodata, opt.nodata_value, opt, TerminalProgressCallback("","")); } } /// Map project the image with an alpha channel. Used for multi-channel images. /// The input image is read as its native type, then channel_cast to float32 /// (preserving values, e.g., uint8 255 becomes 255.0f). Processing happens /// entirely in float32. On write, channel_cast_round_and_clamp converts back /// to the original integer type when appropriate. template void project_image_alpha(asp::MapprojOptions & opt, ImageViewRef> const& input_image, GeoReference const& croppedGeoRef, Vector2i const& virtual_image_size, BBox2i const& croppedImageBB, Map2CamTransT const& transform) { const bool has_img_nodata = false; const PixelRGBA transparent_pixel = PixelRGBA(); if (opt.nearest_neighbor) { write_parallel_type_multichannel (opt.output_file, crop(transform_nodata(input_image, transform, virtual_image_size[0], virtual_image_size[1], ConstantEdgeExtension(), NearestPixelInterpolation(), transparent_pixel), croppedImageBB), croppedGeoRef, has_img_nodata, opt.nodata_value, opt, TerminalProgressCallback("","")); } else { write_parallel_type_multichannel (opt.output_file, crop(transform_nodata(input_image, transform, virtual_image_size[0], virtual_image_size[1], ConstantEdgeExtension(), BicubicInterpolation(), transparent_pixel), croppedImageBB), croppedGeoRef, has_img_nodata, opt.nodata_value, opt, TerminalProgressCallback("","")); } } // The two "pick" functions below select between the Map2CamTrans and Datum2CamTrans // transform classes which will be passed to the image projection function. // - TODO: Is there a good reason for the transform classes to be CRTP instead of virtual? void project_image_nodata_pick_transform(asp::MapprojOptions & opt, GeoReference const& dem_georef, GeoReference const& target_georef, GeoReference const& croppedGeoRef, Vector2i const& image_size, Vector2i const& virtual_image_size, BBox2i const& croppedImageBB, boost::shared_ptr const& camera_model) { const bool call_from_mapproject = true; if (fs::path(opt.dem_file).extension() != "") { // A DEM file was provided return project_image_nodata(opt, croppedGeoRef, virtual_image_size, croppedImageBB, Map2CamTrans(camera_model.get(), target_georef, dem_georef, opt.dem_file, image_size, call_from_mapproject, opt.nearest_neighbor)); } else { // A constant datum elevation was provided return project_image_nodata(opt, croppedGeoRef, virtual_image_size, croppedImageBB, Datum2CamTrans(camera_model.get(), target_georef, dem_georef, opt.datum_offset, image_size, call_from_mapproject, opt.nearest_neighbor)); } } void project_image_alpha_pick_transform(asp::MapprojOptions & opt, ImageViewRef> const& input_image, GeoReference const& dem_georef, GeoReference const& target_georef, GeoReference const& croppedGeoRef, Vector2i const& image_size, Vector2i const& virtual_image_size, BBox2i const& croppedImageBB, boost::shared_ptr const& camera_model) { const bool call_from_mapproject = true; if (fs::path(opt.dem_file).extension() != "") { // A DEM file was provided return project_image_alpha(opt, input_image, croppedGeoRef, virtual_image_size, croppedImageBB, Map2CamTrans(camera_model.get(), target_georef, dem_georef, opt.dem_file, image_size, call_from_mapproject, opt.nearest_neighbor)); } else { // A constant datum elevation was provided return project_image_alpha(opt, input_image, croppedGeoRef, virtual_image_size, croppedImageBB, Datum2CamTrans(camera_model.get(), target_georef, dem_georef, opt.datum_offset, image_size, call_from_mapproject, opt.nearest_neighbor)); } } // Project the image depending on image format. void project_image(asp::MapprojOptions & opt, GeoReference const& dem_georef, GeoReference const& target_georef, GeoReference const& croppedGeoRef, Vector2i const& image_size, int virtual_image_width, int virtual_image_height, BBox2i const& croppedImageBB) { // Prepare output directory vw::create_out_dir(opt.output_file); // Determine the pixel type of the input image boost::shared_ptr image_rsrc = vw::DiskImageResourcePtr(opt.image_file); ImageFormat image_fmt = image_rsrc->format(); const int num_input_channels = num_channels(image_fmt.pixel_format); // Redirect to the correctly typed function to perform the actual map projection. if (image_fmt.pixel_format == VW_PIXEL_RGB) { // RGB processing strategy: read as native type, channel_cast to float32 // (preserving values: uint8 255 becomes 255.0f, not 1.0f), process entirely // in float32, then write_parallel_type applies RoundAndClamp to convert back // to the original integer type. This avoids heavy template instantiation for // each input channel type - only the lightweight read+cast is type-specific. ImageViewRef> float_image; switch (image_fmt.channel_type) { case VW_CHANNEL_UINT8: float_image = channel_cast(DiskImageView>(image_rsrc)); opt.output_type = "Byte"; break; case VW_CHANNEL_INT16: float_image = channel_cast(DiskImageView>(image_rsrc)); opt.output_type = "Int16"; break; case VW_CHANNEL_UINT16: float_image = channel_cast(DiskImageView>(image_rsrc)); opt.output_type = "UInt16"; break; default: float_image = DiskImageView>(image_rsrc); opt.output_type = "Float32"; break; } project_image_alpha_pick_transform(opt, float_image, dem_georef, target_georef, croppedGeoRef, image_size, Vector2i(virtual_image_width, virtual_image_height), croppedImageBB, opt.camera_model); } else { // If the input image is not RGB, only single channel images are supported. if (num_input_channels != 1 || image_fmt.planes != 1) //vw_throw( ArgumentErr() << "Input images must be single channel or RGB!\n" ); vw_out() << "Detected multi-band image. Only the first band will be used. The pixels will be interpreted as float.\n"; // Read as float with rescaling disabled, so integer values are preserved. project_image_nodata_pick_transform(opt, dem_georef, target_georef, croppedGeoRef, image_size, Vector2i(virtual_image_width, virtual_image_height), croppedImageBB, opt.camera_model); } // Done map projecting } } // end namespace asp ================================================ FILE: src/asp/Camera/MapprojectImage.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file MapprojectImage.h /// Algorithms specific to mapprojecting images. #ifndef __MAPPROJECT_IMAGE_H__ #define __MAPPROJECT_IMAGE_H__ #include #include #include #include #include namespace asp { struct MapprojOptions: vw::GdalWriteOptions { // Input std::string dem_file, image_file, camera_file, output_file, stereo_session, bundle_adjust_prefix, ref_map; bool query_projection, write_wkt, noGeoHeaderInfo, nearest_neighbor, parseOptions, gdal_tap; bool multithreaded_model; // This is set based on the session type // Keep a copy of the model here to not have to pass it around separately boost::shared_ptr camera_model; // Settings std::string target_srs_string, output_type, metadata; double nodata_value, tr, mpp, ppd, datum_offset; vw::BBox2 target_projwin, target_pixelwin; vw::Vector2 query_pixel; }; // Project the image depending on image format. void project_image(asp::MapprojOptions & opt, vw::cartography::GeoReference const& dem_georef, vw::cartography::GeoReference const& target_georef, vw::cartography::GeoReference const& croppedGeoRef, vw::Vector2i const& image_size, int virtual_image_width, int virtual_image_height, vw::BBox2i const& croppedImageBB); } // end namespace asp #endif // __MAPPROJECT_IMAGE_H__ ================================================ FILE: src/asp/Camera/PRISM_XML.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Utilties for parsing PRISM .DIMA files in XML format. #include // for ArgumentErr, vw_throw, etc #include // for Quat, Quaternion #include // for Vector, Vector3, Vector4, etc #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace xercesc; using asp::XmlUtils::get_node; using asp::XmlUtils::cast_xmlch; namespace asp { using namespace xercesc; using asp::XmlUtils::get_node; using asp::XmlUtils::cast_xmlch; // Parse the prifle (satellite id) void parse_profile(DOMElement* root, std::string & profile) { DOMElement* id_node = get_node(root, "Metadata_Id"); DOMElement* profile_node = get_node(id_node, "METADATA_PROFILE"); cast_xmlch(profile_node->getTextContent(), profile); } // Read the first and last image line times void read_first_last_line_times(xercesc::DOMElement * data_node, double & first_line_time, double & last_line_time) { DOMElement* time_node = get_node(data_node, "Satellite_Time"); // First line time DOMElement* first_line_time_node = get_node(time_node, "TIME_FIRST_LINE"); std::string first_line_time_str, last_line_time_str; cast_xmlch(first_line_time_node->getTextContent(), first_line_time_str); // Last line time DOMElement* last_line_time_node = get_node(time_node, "TIME_LAST_LINE"); cast_xmlch(last_line_time_node->getTextContent(), last_line_time_str); first_line_time = asp::to_seconds(asp::parse_time(first_line_time_str)); last_line_time = asp::to_seconds(asp::parse_time(last_line_time_str)); } // This function simplifies the logic when we know the info we need is surely in // the first child. DOMElement* getFirstChildByTagName(DOMElement* node, const std::string & tag) { DOMNodeList* children = node->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { DOMNode* child = children->item(i); std::string curr_tag(XMLString::transcode(child->getNodeName())); if (curr_tag == tag) return dynamic_cast(child); } return NULL; } // Read the dimensions of each of the raw image blocks. void read_sources_info(xercesc::DOMElement * root, int & ncols, int & nrows, std::string & view) { // Iinitialize the output variables ncols = -1; nrows = -1; view = ""; DOMElement* dataset_sources = get_node(root, "Dataset_Sources"); // There must be at least one child DOMNodeList* children = dataset_sources->getChildNodes(); if (children->getLength() < 1) vw::vw_throw(vw::ArgumentErr() << "Expecting at least one child in the Dataset_Sources node.\n"); // Iterate over the children for (XMLSize_t i = 0; i < children->getLength(); i++) { DOMNode* child = children->item(i); // Get the name if this child std::string tag(XMLString::transcode(child->getNodeName())); if (tag != "Source_Information") continue; DOMElement* source_info = dynamic_cast(child); DOMElement* scene_source = get_node(source_info, "Scene_Source"); if (scene_source == NULL) continue; // Get the view (PRISM forward, etc.) DOMElement* instrument = get_node(scene_source, "INSTRUMENT"); cast_xmlch(instrument->getTextContent(), view); // Get the Image_Interpretation subnode DOMElement* image_interpretation = get_node(scene_source, "Image_Interpretation"); if (image_interpretation == NULL) continue; // Get the Spectral_Band_Info subnode DOMElement* spectral_band_info = getFirstChildByTagName(image_interpretation, "Spectral_Band_Info"); if (spectral_band_info == NULL) continue; std::string cols_str, rows_str; cast_xmlch(get_node(spectral_band_info, "NCOLS")->getTextContent(), cols_str); cast_xmlch(get_node(spectral_band_info, "NROWS")->getTextContent(), rows_str); ncols = atoi(cols_str.c_str()); nrows = atoi(rows_str.c_str()); // Found the cols and rows break; } // Check cols and rows are positive. Otherwise they were not read correctly. if (ncols <= 0 || nrows <= 0) vw::vw_throw(vw::ArgumentErr() << "Failed to read the CCD blocl dimensions from the XML file.\n"); } // Read the camera position and velocities (ephemeris) void read_ephemeris(xercesc::DOMElement * data_node, std::vector & positions, std::vector & velocities, std::vector & position_times) { // Wipe the output vectors positions.clear(); velocities.clear(); position_times.clear(); xercesc::DOMElement* ephemeris = get_node(data_node, "Ephemeris"); xercesc::DOMElement* point_list = get_node(ephemeris, "Points"); DOMNodeList* children = point_list->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* child = children->item(i); if (child->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node name DOMElement* curr_element = dynamic_cast(child); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Point") == std::string::npos) continue; // Get the three sub-nodes std::string time_str, xs, ys, zs; vw::Vector3 position, velocity; cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), time_str); double time = asp::to_seconds(asp::parse_time(time_str)); xercesc::DOMElement* location_node = get_node(curr_element, "Location"); cast_xmlch(get_node(location_node, "X")->getTextContent(), xs); cast_xmlch(get_node(location_node, "Y")->getTextContent(), ys); cast_xmlch(get_node(location_node, "Z")->getTextContent(), zs); position = vw::Vector3(atof(xs.c_str()), atof(ys.c_str()), atof(zs.c_str())); // same for velocity xercesc::DOMElement* velocity_node = get_node(curr_element, "Velocity"); cast_xmlch(get_node(velocity_node, "X")->getTextContent(), xs); cast_xmlch(get_node(velocity_node, "Y")->getTextContent(), ys); cast_xmlch(get_node(velocity_node, "Z")->getTextContent(), zs); velocity = vw::Vector3(atof(xs.c_str()), atof(ys.c_str()), atof(zs.c_str())); positions.push_back(position); velocities.push_back(velocity); position_times.push_back(time); } // End loop through points // Expecting at least two ephemeris samples if (positions.size() < 2) vw::vw_throw(vw::ArgumentErr() << "Expecting at least two ephemeris samples.\n"); } // Read the angles (roll, pitch, yaw) of the camera void read_rpy(xercesc::DOMElement * data_node, std::vector & rpy, std::vector & rpy_times) { // Wipe the output vectors rpy.clear(); rpy_times.clear(); xercesc::DOMElement* sat_att = get_node(data_node, "Satellite_Attitudes"); xercesc::DOMElement* angles_list = get_node(sat_att, "Angles_List"); DOMNodeList* children = angles_list->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* child = children->item(i); if (child->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node name DOMElement* curr_element = dynamic_cast(child); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Angles") == std::string::npos) continue; // Get the three sub-nodes std::string time_str, roll, pitch, yaw; vw::Vector3 vals; cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), time_str); double time = asp::to_seconds(asp::parse_time(time_str)); // Find the angle subnode xercesc::DOMElement* angle_node = get_node(curr_element, "Angle"); cast_xmlch(get_node(angle_node, "ROLL")->getTextContent(), roll); cast_xmlch(get_node(angle_node, "PITCH")->getTextContent(), pitch); cast_xmlch(get_node(angle_node, "YAW")->getTextContent(), yaw); vals = vw::Vector3(atof(roll.c_str()), atof(pitch.c_str()), atof(yaw.c_str())); rpy.push_back(vals); rpy_times.push_back(time); } // End loop through points // Must have at least two samples if (rpy.size() < 2) vw::vw_throw(vw::ArgumentErr() << "Expecting at least two roll-pitch-yaw samples.\n"); } void parsePrismXml(std::string const& dim_file, int & ncols, int & nrows, std::string & view, double & first_line_time, double & last_line_time, std::vector & positions, std::vector & velocities, std::vector & position_times, std::vector & rpy, std::vector & rpy_times) { // Mandatory initialization for Xerces. Must be done once per process. xercesc::XMLPlatformUtils::Initialize(); // Put all xml logic in an extra scope, per // https://xerces.apache.org/xerces-c/faq-parse-3.html to ensure all // objects we create below go out of scope before we terminate Xerces. { // Initalize the output variables ncols = -1; nrows = -1; first_line_time = -1.0; last_line_time = -1.0; positions.clear(); velocities.clear(); position_times.clear(); rpy.clear(); rpy_times.clear(); boost::shared_ptr parser(new XercesDOMParser()); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); boost::shared_ptr errHandler(new HandlerBase()); parser->setErrorHandler(errHandler.get()); DOMDocument* xmlDoc = NULL; DOMElement* root = NULL; try { parser->parse(dim_file.c_str()); xmlDoc = parser->getDocument(); root = xmlDoc->getDocumentElement(); } catch(...) { vw::vw_throw(vw::ArgumentErr() << "Faile to parse XML file: " << dim_file << "\n"); } // Parse the satellite type std::string profile; parse_profile(root, profile); if (profile != "ALOS") vw::vw_throw(vw::ArgumentErr() << "Expecting the value of METADATA_PROFILE to be ALOS.\n"); // Parse the number of cols and rows in each raw ccd block read_sources_info(root, ncols, nrows, view); // Parse the first and last line times DOMElement* data_node = get_node(root, "Data_Strip"); read_first_last_line_times(data_node, first_line_time, last_line_time); // Parse the camera position and velocities (ephemeris) read_ephemeris(data_node, positions, velocities, position_times); // Read roll-pitch-yaw angles read_rpy(data_node, rpy, rpy_times); } // Mandatory termination for Xerces, once all other XML objects go out of scope xercesc::XMLPlatformUtils::Terminate(); return; } } // end namespace asp ================================================ FILE: src/asp/Camera/PRISM_XML.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Utilities for parsing PRISM .DIMA files in XML format. #ifndef __STEREO_CAMERA_PRISM_XML_H__ #define __STEREO_CAMERA_PRISM_XML_H__ #include #include #include namespace asp { void parsePrismXml(std::string const& dim_file, int & ncols, int & nrows, std::string & view, double & first_line_time, double & last_line_time, std::vector & positions, std::vector & velocities, std::vector & position_times, std::vector & rpy, std::vector & rpy_times); } //end namespace asp #endif//__STEREO_CAMERA_PRISM_XML_H__ ================================================ FILE: src/asp/Camera/PeruSatXML.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include // for ArgumentErr, vw_throw, etc #include // for Quat, Quaternion #include // for Vector, Vector3, Vector4, etc #include // for Datum #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::cartography; using namespace xercesc; using asp::XmlUtils::get_node; using asp::XmlUtils::cast_xmlch; namespace asp { DOMElement* PeruSatXML::open_xml_file(std::string const& xml_path) { // Check if the file actually exists and throw a user helpful file. if (!boost::filesystem::exists(xml_path)) vw_throw(ArgumentErr() << "XML file \"" << xml_path << "\" does not exist."); std::string error_prefix = "XML file \"" + xml_path + "\" is invalid.\nException message is: \n"; std::string err_message = ""; // Filled in later on error try{ // Set up the XML parser if we have not already done so if (!m_parser.get()) { m_parser.reset(new XercesDOMParser()); m_err_handler.reset(new HandlerBase()); m_parser->setValidationScheme(XercesDOMParser::Val_Always); m_parser->setDoNamespaces(true); m_parser->setErrorHandler(m_err_handler.get()); } // Load the XML file m_parser->parse(xml_path.c_str()); DOMDocument* doc = m_parser->getDocument(); DOMElement * root = doc->getDocumentElement(); return root; } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); err_message = error_prefix + message; XMLString::release(&message); } catch (const SAXException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const std::exception& e) { err_message = error_prefix + e.what(); } catch (...) { err_message = "Unrecognized error in XML file \"" + xml_path + "\"\n"; } vw_throw(ArgumentErr() << err_message); // Only get here on error return 0; } void PeruSatXML::read_xml(std::string const& xml_path) { DOMElement * root = open_xml_file(xml_path); parse_xml(root); } void PeruSatXML::parse_xml(xercesc::DOMElement* root) { xercesc::DOMElement* metadata_id = get_node(root, "Metadata_Identification"); xercesc::DOMElement* metadata_profile = get_node(metadata_id, "METADATA_PROFILE"); std::string sensor_name(XMLString::transcode(metadata_profile->getTextContent())); std::string expected_name = "PER1_SENSOR"; if (sensor_name != expected_name) vw_throw(ArgumentErr() << "Incorrect sensor name. Expected: " << expected_name << " but got: " << sensor_name << ".\n"); xercesc::DOMElement* raster_data = get_node(root, "Raster_Data"); read_image_size(raster_data); // Dig some levels down xercesc::DOMElement* geometric_data = get_node(root, "Geometric_Data"); xercesc::DOMElement* refined_model = get_node(geometric_data, "Refined_Model"); xercesc::DOMElement* time = get_node(refined_model, "Time"); read_times(time); xercesc::DOMElement* ephemeris = get_node(refined_model, "Ephemeris"); read_ephemeris(ephemeris); xercesc::DOMElement* attitudes = get_node(refined_model, "Attitudes"); read_attitudes(attitudes); xercesc::DOMElement* geom_calib = get_node(refined_model, "Geometric_Calibration"); xercesc::DOMElement* instr_calib = get_node(geom_calib, "Instrument_Calibration"); xercesc::DOMElement* band_calib = get_node(instr_calib, "Band_Calibration"); xercesc::DOMElement* look_angles = get_node(band_calib, "Polynomial_Look_Angles"); read_look_angles(look_angles); xercesc::DOMElement* instr_biases = get_node(instr_calib, "Instrument_Biases"); read_instr_biases(instr_biases); xercesc::DOMElement* use_area = get_node(geometric_data, "Use_Area"); xercesc::DOMElement* geom_values = get_node(use_area, "Located_Geometric_Values"); read_center_data(geom_values); } void PeruSatXML::read_image_size(xercesc::DOMElement* raster_data_node) { xercesc::DOMElement* raster_dims_node = get_node(raster_data_node, "Raster_Dimensions"); cast_xmlch(get_node(raster_dims_node, "NROWS")->getTextContent(), m_image_size[1]); cast_xmlch(get_node(raster_dims_node, "NCOLS")->getTextContent(), m_image_size[0]); } void PeruSatXML::read_times(xercesc::DOMElement* time) { xercesc::DOMElement* time_range = get_node(time, "Time_Range"); std::string start_time_str; cast_xmlch(get_node(time_range, "START")->getTextContent(), start_time_str); bool is_start_time = true; m_start_time = PeruSatXML::convert_time(start_time_str, is_start_time); xercesc::DOMElement* time_stamp = get_node(time, "Time_Stamp"); cast_xmlch(get_node(time_stamp, "LINE_PERIOD")->getTextContent(), m_line_period); } void PeruSatXML::read_ephemeris(xercesc::DOMElement* ephemeris) { // Reset data storage m_positions.clear(); m_velocities.clear(); xercesc::DOMElement* point_list = get_node(ephemeris, "Point_List"); // Pick out the "Point" nodes DOMNodeList* children = point_list->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* child = children->item(i); if (child->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node name DOMElement* curr_element = dynamic_cast(child); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Point") == std::string::npos) continue; // Get the three sub-nodes std::string time_str, position_str, velocity_str; Vector3 position_vec, velocity_vec; cast_xmlch(get_node(curr_element, "LOCATION_XYZ")->getTextContent(), position_str); cast_xmlch(get_node(curr_element, "VELOCITY_XYZ")->getTextContent(), velocity_str); cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), time_str); bool is_start_time = false; double time = PeruSatXML::convert_time(time_str, is_start_time); std::string delimiters(",\t "); position_vec = str_to_vec(position_str, delimiters); velocity_vec = str_to_vec(velocity_str, delimiters); m_positions.push_back(std::pair(time, position_vec)); m_velocities.push_back(std::pair(time, velocity_vec)); } // End loop through points } void PeruSatXML::read_attitudes(xercesc::DOMElement* attitudes) { // Reset data storage m_poses.clear(); xercesc::DOMElement* quaternion_list = get_node(attitudes, "Quaternion_List"); // Pick out the "Quaternion" nodes DOMNodeList* children = quaternion_list->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* child = children->item(i); if (child->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node time DOMElement* curr_element = dynamic_cast(child); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Quaternion") == std::string::npos) continue; // Parse the time and std::pair> data; std::string time_str; cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), time_str); bool is_start_time = false; data.first = PeruSatXML::convert_time(time_str, is_start_time); double w, x, y, z; cast_xmlch(get_node(curr_element, "Q0")->getTextContent(), w); cast_xmlch(get_node(curr_element, "Q1")->getTextContent(), x); cast_xmlch(get_node(curr_element, "Q2")->getTextContent(), y); cast_xmlch(get_node(curr_element, "Q3")->getTextContent(), z); data.second = vw::Quaternion(w, x, y, z); // Normalize the quaternions to remove any inaccuracy due to the // limited precision used to save them on disk. data.second = normalize(data.second); m_poses.push_back(data); } // End loop through attitudes } void PeruSatXML::read_look_angles(xercesc::DOMElement* look_angles) { std::string delimiters(",\t "); std::string tan_psi_x_str; cast_xmlch(get_node(look_angles, "LINE_OF_SIGHT_TANPSIX")->getTextContent(), tan_psi_x_str); m_tan_psi_x = str_to_vec(tan_psi_x_str, delimiters); std::string tan_psi_y_str; cast_xmlch(get_node(look_angles, "LINE_OF_SIGHT_TANPSIY")->getTextContent(), tan_psi_y_str); m_tan_psi_y = str_to_vec(tan_psi_y_str, delimiters); } void PeruSatXML::read_instr_biases(xercesc::DOMElement* instr_biases) { double w, x, y, z; cast_xmlch(get_node(instr_biases, "Q0")->getTextContent(), w); cast_xmlch(get_node(instr_biases, "Q1")->getTextContent(), x); cast_xmlch(get_node(instr_biases, "Q2")->getTextContent(), y); cast_xmlch(get_node(instr_biases, "Q3")->getTextContent(), z); m_instrument_biases = vw::Quaternion(w, x, y, z); } void PeruSatXML::read_center_data(xercesc::DOMElement* geom_values) { std::string center_time_str; cast_xmlch(get_node(geom_values, "TIME")->getTextContent(), center_time_str); cast_xmlch(get_node(geom_values, "COL")->getTextContent(), m_center_col); cast_xmlch(get_node(geom_values, "ROW")->getTextContent(), m_center_row); bool is_start_time = false; center_time = PeruSatXML::convert_time(center_time_str, is_start_time); // Convert from 1-based to 0-based indices. m_center_col -= 1.0; m_center_row -= 1.0; } // Converts a time from string to double precision value measured in seconds // relative to the start time. // Input strings look like this: 2008-03-04T12:31:03.08191Z. double PeruSatXML::convert_time(std::string const& s, bool is_start_time) { if (!is_start_time && !m_start_time_is_set) vw::vw_throw(vw::ArgumentErr() << "Must set the start time before doing time conversions.\n"); try{ boost::posix_time::ptime time = asp::parse_time(s); if (is_start_time) { m_start_time_is_set = true; m_start_time_stamp = time; } boost::posix_time::time_duration delta(time - m_start_time_stamp); return delta.total_microseconds() / 1.0e+6; }catch(...){ vw::vw_throw(vw::ArgumentErr() << "Failed to parse time from string: " << s << "\n"); } return -1.0; // Never reached } // Extract raw data from the parsed XML for direct CSM population. // No resampling is done here. The raw positions, velocities, and quaternions // are returned as-is from the XML file, with their uniform time grids. void PeruSatXML::extractRawData( double & time_t0, double & time_dt, std::vector & positions, std::vector & velocities, double & pos_t0, double & pos_dt, std::vector> & quaternions, double & quat_t0, double & quat_dt, double & min_time, double & max_time) const { // Time function: time at line = m_start_time + m_line_period * line time_t0 = m_start_time; time_dt = m_line_period; // Extract raw positions and velocities with their times std::vector pos_times, vel_times; positions.clear(); velocities.clear(); for (auto iter = m_positions.begin(); iter != m_positions.end(); iter++) { pos_times.push_back(iter->first); positions.push_back(iter->second); } for (auto iter = m_velocities.begin(); iter != m_velocities.end(); iter++) { vel_times.push_back(iter->first); velocities.push_back(iter->second); } // Position/velocity time grid (uniform from XML) pos_t0 = pos_times.front(); pos_dt = (pos_times.back() - pos_times.front()) / (pos_times.size() - 1.0); // Extract raw quaternions with their times std::vector quat_times; quaternions.clear(); for (auto iter = m_poses.begin(); iter != m_poses.end(); iter++) { quat_times.push_back(iter->first); quaternions.push_back(iter->second); } // Quaternion time grid (uniform from XML) quat_t0 = quat_times.front(); quat_dt = (quat_times.back() - quat_times.front()) / (quat_times.size() - 1.0); // Time range for which we have data min_time = std::max(pos_times.front(), std::max(vel_times.front(), quat_times.front())); max_time = std::min(pos_times.back(), std::min(vel_times.back(), quat_times.back())); } } // end namespace asp ================================================ FILE: src/asp/Camera/PeruSatXML.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // These are objects that relate directly to block in XML that we need // to read. They only read and then store the raw values. Other // objects will interpret the results. #ifndef __STEREO_CAMERA_PERUSAT_XML_H__ #define __STEREO_CAMERA_PERUSAT_XML_H__ #include #include #include #include #include #include #include #include #include #include // Special forward declare so we can hide the Xerces headers. #include // Needed for this XERCES macro XERCES_CPP_NAMESPACE_BEGIN class DOMDocument; class DOMElement; class XercesDOMParser; class ErrorHandler; XERCES_CPP_NAMESPACE_END namespace asp { class PeruSatXML { public: /// Constructor PeruSatXML(): m_start_time_is_set(false){} vw::Vector2i m_image_size; vw::Quaternion m_instrument_biases; vw::Vector2 m_tan_psi_x, m_tan_psi_y; /// Parse an XML file to populate the data void read_xml(std::string const& xml_path); /// Parse an XML tree to populate the data void parse_xml(xercesc::DOMElement* node); // Extract raw data for direct CSM population (no interpolation). // Outputs: positions, velocities with uniform time grid (pos_t0, pos_dt), // quaternions with uniform time grid (quat_t0, quat_dt), and time function // parameters (time_t0, time_dt). void extractRawData( // Outputs double & time_t0, double & time_dt, std::vector & positions, std::vector & velocities, double & pos_t0, double & pos_dt, std::vector> & quaternions, double & quat_t0, double & quat_dt, double & min_time, double & max_time) const; private: // The various XML data reading sections /// Just opens the XML file for reading and returns the root node. xercesc::DOMElement* open_xml_file(std::string const& xml_path); void read_image_size (xercesc::DOMElement* raster_data); void read_times (xercesc::DOMElement* time); void read_ephemeris (xercesc::DOMElement* ephemeris); void read_attitudes (xercesc::DOMElement* attitudes); void read_look_angles (xercesc::DOMElement* look_angles); void read_instr_biases(xercesc::DOMElement* instr_biases); void read_center_data (xercesc::DOMElement* geom_values); /// Converts a time from string to double precision in seconds. /// All times are in seconds relative to the start time. /// When the start time is passed in, use is_start_time = true. double convert_time(std::string const& s, bool is_start_time); // All times represented as doubles will be in seconds relative to m_start_time_stamp boost::posix_time::ptime m_start_time_stamp; bool m_start_time_is_set; double m_start_time; double center_time; double m_line_period; double m_center_col; double m_center_row; std::list> m_positions; // (time, X/Y/Z) std::list> m_velocities; // (time, dX/dY/dZ) std::list>> m_poses; // (time, quaternion) boost::shared_ptr m_parser; boost::shared_ptr m_err_handler; }; // End class PeruSatXML } //end namespace asp #endif//__STEREO_CAMERA_PERUSAT_XML_H__ ================================================ FILE: src/asp/Camera/PleiadesXML.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Pleiades camera model. The documentation used: // 1A/1B: airbus-pleiades-imagery-user-guide-15042021.pdf. // NEO: 2022.03_PleiadesNeo_UserGuide_20220322.pdf #include #include #include #include #include #include #include // for ArgumentErr, vw_throw, etc #include // for Vector, Vector3, Vector4, etc #include // for Datum #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::cartography; using namespace xercesc; using asp::XmlUtils::get_node; using asp::XmlUtils::cast_xmlch; namespace asp { DOMElement* PleiadesXML::open_xml_file(std::string const& xml_path) { // Check if the file actually exists and throw a user helpful file. if (!boost::filesystem::exists(xml_path)) vw_throw(ArgumentErr() << "XML file: " << xml_path << " does not exist."); std::string error_prefix = "XML file: " + xml_path + " is invalid.\n" "Exception message is: \n"; std::string err_message = ""; // Filled in later on error try { // Set up the XML parser if we have not already done so if (!m_parser.get()) { m_parser.reset(new XercesDOMParser()); m_err_handler.reset(new HandlerBase()); m_parser->setValidationScheme(XercesDOMParser::Val_Always); m_parser->setDoNamespaces(true); m_parser->setErrorHandler(m_err_handler.get()); } // Load the XML file m_parser->parse(xml_path.c_str()); DOMDocument* doc = m_parser->getDocument(); DOMElement * root = doc->getDocumentElement(); return root; } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); err_message = error_prefix + message; XMLString::release(&message); } catch (const SAXException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const std::exception& e) { err_message = error_prefix + e.what(); } catch (...) { err_message = "Unrecognized error in XML file \"" + xml_path + "\"\n"; } vw_throw(ArgumentErr() << err_message); // Only get here on error return 0; } void PleiadesXML::read_xml(std::string const& xml_path) { DOMElement * root = open_xml_file(xml_path); parse_xml(root); } void PleiadesXML::parse_xml(xercesc::DOMElement* root) { xercesc::DOMElement* metadata_id = get_node(root, "Metadata_Identification"); xercesc::DOMElement* metadata_profile = get_node(metadata_id, "METADATA_PROFILE"); m_sensor_name = XMLString::transcode(metadata_profile->getTextContent()); m_isNeoOrSpot67 = false; if (m_sensor_name == "PHR_SENSOR") m_isNeoOrSpot67 = false; else if (m_sensor_name == "PNEO_SENSOR" || m_sensor_name == "S6_SENSOR" || m_sensor_name == "S7_SENSOR") m_isNeoOrSpot67 = true; else vw_throw(ArgumentErr() << "Incorrect sensor name. Expected: PHR, PNEO, S6, or S7 sensor, " << "but got: " << m_sensor_name << ". Only primary (non-ortho) images can be used.\n"); vw_out() << "Sensor profile: " << m_sensor_name << "\n"; xercesc::DOMElement* raster_data = get_node(root, "Raster_Data"); read_image_size(raster_data); // Dig some levels down xercesc::DOMElement* geometric_data = get_node(root, "Geometric_Data"); xercesc::DOMElement* refined_model = get_node(geometric_data, "Refined_Model"); xercesc::DOMElement* time = get_node(refined_model, "Time"); read_times(time); xercesc::DOMElement* ephemeris = get_node(refined_model, "Ephemeris"); read_ephemeris(ephemeris); // Quaternions are stored differently for Neo and 1A/1B xercesc::DOMElement* attitudes = get_node(refined_model, "Attitudes"); if (m_isNeoOrSpot67) read_attitudes_Neo(attitudes); else read_attitudes_1A1B(attitudes); xercesc::DOMElement* geom_calib = get_node(refined_model, "Geometric_Calibration"); xercesc::DOMElement* instr_calib = get_node(geom_calib, "Instrument_Calibration"); if (!m_isNeoOrSpot67) { xercesc::DOMElement* swath_range = get_node(instr_calib, "Swath_Range"); read_ref_col_row(swath_range); } else { // 2022.03_PleiadesNeo_UserGuide_20220322.pdf. Page 66. There the ref col and row are // 1, but we subtract 1 since our lines and columns start from 0. m_ref_col = 0; m_ref_row = 0; } xercesc::DOMElement* look_angles = NULL; if (!m_isNeoOrSpot67) { look_angles = get_node(instr_calib, "Polynomial_Look_Angles"); } else { xercesc::DOMElement* band_list = get_node(instr_calib, "Band_Calibration_List"); xercesc::DOMElement* band = get_node(band_list, "Band_Calibration"); look_angles = get_node(band, "Polynomial_Look_Angles"); } read_look_angles(look_angles); PleiadesXML::parse_accuracy_stdv(root); // SPOT 6/7 data can have non-uniform time spacing for positions, // velocities, and quaternions. Resample to a uniform grid so the // downstream code (which assumes uniform spacing) works correctly. // After this, the data looks the same as Pleiades. bool is_spot67 = (m_sensor_name == "S6_SENSOR" || m_sensor_name == "S7_SENSOR"); if (is_spot67) { int order = 8; // Lagrange interpolation order (8 points, degree 7) int factor = 5; // resample to 5x denser grid // Resample positions std::vector pos_times, pos_out_times; std::vector pos_vals, pos_out_vals; for (auto it = m_positions.begin(); it != m_positions.end(); it++) { pos_times.push_back(it->first); pos_vals.push_back(it->second); } asp::resampleVec3Lagrange(pos_times, pos_vals, order, factor, pos_out_times, pos_out_vals); m_positions.clear(); for (size_t i = 0; i < pos_out_times.size(); i++) m_positions.push_back(std::make_pair(pos_out_times[i], pos_out_vals[i])); // Resample velocities std::vector vel_times, vel_out_times; std::vector vel_vals, vel_out_vals; for (auto it = m_velocities.begin(); it != m_velocities.end(); it++) { vel_times.push_back(it->first); vel_vals.push_back(it->second); } asp::resampleVec3Lagrange(vel_times, vel_vals, order, factor, vel_out_times, vel_out_vals); m_velocities.clear(); for (size_t i = 0; i < vel_out_times.size(); i++) m_velocities.push_back(std::make_pair(vel_out_times[i], vel_out_vals[i])); // Resample quaternions std::vector quat_times, quat_out_times; std::vector> quat_vals, quat_out_vals; for (auto it = m_poses.begin(); it != m_poses.end(); it++) { quat_times.push_back(it->first); quat_vals.push_back(it->second); } asp::resampleQuatLagrange(quat_times, quat_vals, order, factor, quat_out_times, quat_out_vals); m_poses.clear(); for (size_t i = 0; i < quat_out_times.size(); i++) m_poses.push_back(std::make_pair(quat_out_times[i], quat_out_vals[i])); } return; } void PleiadesXML::read_image_size(xercesc::DOMElement* raster_data_node) { xercesc::DOMElement* raster_dims_node = get_node(raster_data_node, "Raster_Dimensions"); cast_xmlch(get_node(raster_dims_node, "NROWS")->getTextContent(), m_image_size[1]); cast_xmlch(get_node(raster_dims_node, "NCOLS")->getTextContent(), m_image_size[0]); } void PleiadesXML::read_times(xercesc::DOMElement* time) { xercesc::DOMElement* time_range = get_node(time, "Time_Range"); // In addition to the relative start time stored in m_start_time, we will store // the start time string as well, in m_start_time_str, to be used later cast_xmlch(get_node(time_range, "START")->getTextContent(), m_start_time_str); bool is_start_time = true; m_start_time = PleiadesXML::convert_time(m_start_time_str, is_start_time); std::string end_time_str; cast_xmlch(get_node(time_range, "END")->getTextContent(), end_time_str); is_start_time = false; m_end_time = PleiadesXML::convert_time(end_time_str, is_start_time); xercesc::DOMElement* time_stamp = get_node(time, "Time_Stamp"); cast_xmlch(get_node(time_stamp, "LINE_PERIOD")->getTextContent(), m_line_period); if (m_isNeoOrSpot67) { // Convert from microseconds to seconds m_line_period /= 1.0e+6; } else { // Convert from milliseconds to seconds m_line_period /= 1.0e+3; } } void PleiadesXML::read_ephemeris(xercesc::DOMElement* ephemeris) { // Reset data storage m_positions.clear(); m_velocities.clear(); xercesc::DOMElement* ephemeris_used = get_node(ephemeris, "EPHEMERIS_USED"); xercesc::DOMElement* point_list = get_node(ephemeris, "Point_List"); // Pick out the "Point" nodes DOMNodeList* children = point_list->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* child = children->item(i); if (child->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node name DOMElement* curr_element = dynamic_cast(child); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Point") == std::string::npos) continue; // Get the three sub-nodes std::string time_str, position_str, velocity_str; Vector3 position_vec, velocity_vec; // Parse the position and velocity cast_xmlch(get_node(curr_element, "LOCATION_XYZ")->getTextContent(), position_str); cast_xmlch(get_node(curr_element, "VELOCITY_XYZ")->getTextContent(), velocity_str); // Parse the time cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), time_str); bool is_start_time = false; double time = PleiadesXML::convert_time(time_str, is_start_time); std::string delimiters(",\t "); position_vec = str_to_vec(position_str, delimiters); velocity_vec = str_to_vec(velocity_str, delimiters); m_positions.push_back(std::pair(time, position_vec)); m_velocities.push_back(std::pair(time, velocity_vec)); } // End loop through points // Sanity check if (m_positions.size() < 2) vw_throw(ArgumentErr() << "Expecting to read at least two positions from the xml .\n"); } // Given a calendar time, find the midnight time. Just put zeros for hours, minutes, and seconds. // An input time looks like: 2022-04-13T22:46:31.4540000 void calc_midnight_time(std::string const& start_time, std::string& midnight_time) { size_t hour_pos = start_time.find("T"); if (hour_pos == std::string::npos) vw::vw_throw(vw::ArgumentErr() << "Could not parse time string: " << start_time << ".\n"); hour_pos += 1; // move past the "T" midnight_time = start_time; for (size_t it = hour_pos; it < midnight_time.size(); it++) { if (midnight_time[it] >= '0' && midnight_time[it] <= '9') { midnight_time.replace(it, 1, "0"); } } return; } // Read attitudes for NEO. Unlike for L1A/L1B, here we read the tabulated quaternions. void PleiadesXML::read_attitudes_Neo(xercesc::DOMElement* attitudes) { xercesc::DOMElement* quaternion_list = get_node(attitudes, "Quaternion_List"); // Reset data storage m_poses.clear(); DOMNodeList* children = quaternion_list->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* child = children->item(i); if (child->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node time DOMElement* curr_element = dynamic_cast(child); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Quaternion") == std::string::npos) continue; // Parse the quaternion std::pair> data; double w, x, y, z; cast_xmlch(get_node(curr_element, "Q0")->getTextContent(), w); cast_xmlch(get_node(curr_element, "Q1")->getTextContent(), x); cast_xmlch(get_node(curr_element, "Q2")->getTextContent(), y); cast_xmlch(get_node(curr_element, "Q3")->getTextContent(), z); vw::Quaternion q = vw::Quaternion(w, x, y, z); // Normalize the quaternions to remove any inaccuracy due to the // limited precision used to save them on disk. Save as a vector, not a quaternion, // given the existing API. Note that w gets saved first. q = normalize(q); data.second = q; // Parse the quaternion time std::string time_str; cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), time_str); bool is_start_time = false; double time = PleiadesXML::convert_time(time_str, is_start_time); data.first = time; m_poses.push_back(data); } // End loop through attitudes return; } // Read quaternions for L1A and L1B. In this case, what is given is a quaternion // polynomial, which is evaluated at a given time. void PleiadesXML::read_attitudes_1A1B(xercesc::DOMElement* attitudes) { xercesc::DOMElement* quaternion_root = get_node(attitudes, "Polynomial_Quaternions"); // Read the quaternion offset field std::string offset_str; cast_xmlch(get_node(quaternion_root, "OFFSET")->getTextContent(), offset_str); // Per the documentation, this offset is from midnight. Need to transform it to be relative // to the start time. std::string midnight_time_str; calc_midnight_time(m_start_time_str, midnight_time_str); bool is_start_time = false; double midnight_time = PleiadesXML::convert_time(midnight_time_str, is_start_time); m_quat_offset_time = midnight_time + atof(offset_str.c_str()); #if 0 // Turning this off as it is fails on a real test case. // Untested adjustments for the case when the midnight is computed // for the wrong day. Not sure if this will ever happen. Try to // ensure that m_start_time <= m_quat_offset_time <= m_end_time. double full_day = 3600.0 * 24.0; if (m_quat_offset_time < m_start_time) m_quat_offset_time += full_day; if (m_quat_offset_time > m_end_time) m_quat_offset_time -= full_day; if (m_quat_offset_time < m_start_time || m_quat_offset_time > m_end_time) vw_throw(ArgumentErr() << "Failed to compute the quaternion offset. " << "Check the start time, end time, and the quaternion OFFSET field, " << "which is meant to be in seconds since midnight.\n"); #endif if (m_quat_offset_time < m_start_time) // This never happened vw_out(WarningMessage) << "Quaternion offset time is less than start time (difference: " << m_quat_offset_time - m_start_time << " seconds). " << "Some caution may be advised.\n"; if (m_quat_offset_time > m_end_time) // This was observed to happen vw_out(WarningMessage) << "Quaternion offset time in seconds (" << m_quat_offset_time - m_start_time << ") " << "is greater than end time (" << m_end_time - m_start_time << "). A discrepancy of a few seconds is likely acceptable.\n"; // Read the quaternion scale field std::string scale_str; cast_xmlch(get_node(quaternion_root, "SCALE")->getTextContent(), scale_str); m_quat_scale = atof(scale_str.c_str()); // Read the quaternion coefficients that will be used with the quaternion // polynomial to find the quaternions at any time (page 77) m_quaternion_coeffs.clear(); std::vector tags = {"Q0", "Q1", "Q2", "Q3"}; for (size_t it = 0; it < tags.size(); it++) { xercesc::DOMElement* qi = get_node(quaternion_root, tags[it]); int deg = 0; cast_xmlch(get_node(qi, "DEGREE")->getTextContent(), deg); if (deg != 3) vw_throw(ArgumentErr() << "Expecting the degree of the quaternion polynomial to be 3.\n"); std::string quat_str; cast_xmlch(get_node(qi, "COEFFICIENTS")->getTextContent(), quat_str); vw::Vector v = vw::str_to_vec>(quat_str); m_quaternion_coeffs.push_back(v); } return; } void PleiadesXML::read_ref_col_row(xercesc::DOMElement* swath_range) { m_ref_row = 1; // page 76 in the doc std::string ref_col; cast_xmlch(get_node(swath_range, "FIRST_COL")->getTextContent(), ref_col); m_ref_col = atoi(ref_col.c_str()); // subtract 1, as we prefer to start rows and columns from 0 m_ref_row -= 1; m_ref_col -= 1; } void PleiadesXML::read_look_angles(xercesc::DOMElement* look_angles) { // Pages 75 and 100 in the doc m_coeff_psi_x = vw::Vector2(0, 0); std::string xlos_0; cast_xmlch(get_node(look_angles, "XLOS_0")->getTextContent(), xlos_0); m_coeff_psi_x[0] = atof(xlos_0.c_str()); std::string xlos_1; cast_xmlch(get_node(look_angles, "XLOS_1")->getTextContent(), xlos_1); m_coeff_psi_x[1] = atof(xlos_1.c_str()); // For 1A/1B, there's only one coeff_psi_y value. Set the second to 0. m_coeff_psi_y = vw::Vector2(0, 0); std::string ylos_0; cast_xmlch(get_node(look_angles, "YLOS_0")->getTextContent(), ylos_0); m_coeff_psi_y[0] = atof(ylos_0.c_str()); // But for NEO, as for PeruSat, there are two values. if (m_isNeoOrSpot67) { std::string ylos_1; cast_xmlch(get_node(look_angles, "YLOS_1")->getTextContent(), ylos_1); m_coeff_psi_y[1] = atof(ylos_1.c_str()); } } // Converts a time from string to double precision value measured in seconds // relative to the start time. First time it is called for the start time. // Input strings look like this: 2022-04-13T22:46:31.4540000Z double PleiadesXML::convert_time(std::string const& s, bool is_start_time) { if (!is_start_time && !m_start_time_is_set) vw::vw_throw(vw::ArgumentErr() << "Must set the start time before doing time conversions.\n"); try{ boost::posix_time::ptime time = asp::parse_time(s); // If this is the first invocation, find the start time first if (is_start_time) { m_start_time_is_set = true; m_start_time_stamp = time; } // Now find the relative start time boost::posix_time::time_duration delta(time - m_start_time_stamp); // Go from microseconds to seconds return delta.total_microseconds() / 1.0e+6; }catch(...){ vw::vw_throw(vw::ArgumentErr() << "Failed to parse time from string: " << s << "\n"); } return -1.0; // Never reached } // This is an optional field, used only for error propagation void PleiadesXML::parse_accuracy_stdv(xercesc::DOMElement* root) { m_accuracy_stdv = 0.0; try { xercesc::DOMElement* quality_assessment = get_node(root, "Quality_Assessment"); xercesc::DOMElement* planimetric_accuracy_measurement = get_node(quality_assessment, "Planimetric_Accuracy_Measurement"); xercesc::DOMElement* quality_values = get_node(planimetric_accuracy_measurement, "Quality_Values"); std::string accuracy_stdv; cast_xmlch(get_node(quality_values, "ACCURACY_STDV")->getTextContent(), accuracy_stdv); m_accuracy_stdv = atof(accuracy_stdv.c_str()); } catch (...) { m_accuracy_stdv = 0.0; } return; } // Find the time at each line. According to the doc (page 76), // reference line is the first line. In ASP, line count starts from 0. // We will use the convention that all times are relative to time // at line 0, so time at line 0 is 0. There can be negative times, // as the positions and velocities are tabulated at times both // before the first line and after the last time. void PleiadesXML::setup_time_func(double & time_t0, double & time_dt) const { time_t0 = m_start_time; time_dt = m_line_period; } // Insert one more value at the start of the list, based on extrapolated first two // values, at time based on extrapolating from first time. void extrapolateAtStartTime(double delta_time, std::list> & vals) { auto it = vals.begin(); double time1 = it->first; vw::Vector3 val1 = it->second; it++; double time2 = it->first; vw::Vector3 val2 = it->second; double time0 = time1 - delta_time; vw::Vector3 val0 = 2 * val1 - val2; // Insert this at the start of the list vals.push_front(std::make_pair(time0, val0)); } // Same for quaternion. Ensure inputs and outputs are normalized. void extrapolateAtStartTime(double delta_time, std::list>> & vals) { std::list>>::iterator it = vals.begin(); double time1 = it->first; auto q1 = it->second; q1 = normalize(q1); vw::Vector val1(q1.w(), q1.x(), q1.y(), q1.z()); it++; double time2 = it->first; auto q2 = it->second; q2 = normalize(q2); vw::Vector val2(q2.w(), q2.x(), q2.y(), q2.z()); double time0 = time1 - delta_time; vw::Vector val0 = 2.0 * val1 - val2; vw::Quaternion q0(val0[0], val0[1], val0[2], val0[3]); q0 = normalize(q0); // Insert this at the start of the list vals.push_front(std::make_pair(time0, q0)); } // Insert one more value at the end of the list, based on extrapolated last two // values, at time based on extrapolating from last time. void extrapolateAtEndTime(double delta_time, std::list> & vals) { auto it = vals.rbegin(); double time1 = it->first; vw::Vector3 val1 = it->second; it++; // this goes backward in time from the end double time2 = it->first; vw::Vector3 val2 = it->second; double time0 = time1 + delta_time; vw::Vector3 val0 = 2 * val1 - val2; // Insert this at the end of the list vals.push_back(std::make_pair(time0, val0)); } // Same for quaternion. Ensure inputs and outputs are normalized. void extrapolateAtEndTime(double delta_time, std::list>> & vals) { std::list>>::reverse_iterator it = vals.rbegin(); double time1 = it->first; auto q1 = it->second; q1 = normalize(q1); vw::Vector val1(q1.w(), q1.x(), q1.y(), q1.z()); it++; // this goes backward in time from the end double time2 = it->first; auto q2 = it->second; q2 = normalize(q2); vw::Vector val2(q2.w(), q2.x(), q2.y(), q2.z()); double time0 = time1 + delta_time; vw::Vector val0 = 2.0 * val1 - val2; vw::Quaternion q0(val0[0], val0[1], val0[2], val0[3]); q0 = normalize(q0); // Insert this at the end of the list vals.push_back(std::make_pair(time0, q0)); } // The position is already in GCC, so just pack into a function. // Currently this is identical to the velocity function, but this may change later. void PleiadesXML::setup_position_func (double time_t0, double time_dt, std::vector & positions, double & pos_t0, double & pos_dt, double & pos_tend) { // Sanity check, we should be able to find the position for each image line size_t num_lines = m_image_size[1]; double first_line_time = time_t0; double last_line_time = time_t0 + time_dt * (num_lines - 1.0); double num_positions = m_positions.size(); double position_start_time = m_positions.front().first; double position_stop_time = m_positions.back().first; double position_delta_t = (position_stop_time - position_start_time) / (num_positions - 1.0); // This is a persistent problem with Pleiades NEO data. Try to fix it. for (int attempt = 0; attempt < 4; attempt++) { if (position_start_time > first_line_time) { vw_out() << "Warning: The first tabulated position time is " << "after the first line time. Will do linear extrapolation.\n"; if (attempt > 0) vw_out() << "This is a repeated attempt.\n"; extrapolateAtStartTime(position_delta_t, m_positions); } if (position_stop_time < last_line_time) { vw_out() << "Warning: The last tabulated position time is before " << "the last line time. Will do linear extrapolation.\n"; if (attempt > 0) vw_out() << "This is a repeated attempt.\n"; extrapolateAtEndTime(position_delta_t, m_positions); } // Update these values num_positions = m_positions.size(); position_start_time = m_positions.front().first; position_stop_time = m_positions.back().first; } // Check again if (position_start_time > first_line_time || position_stop_time < last_line_time) vw::vw_throw(ArgumentErr() << "Extrapolation was not enough. The position " << "timestamps do not fully span the range of times for the image lines."); std::vector time_vec; std::vector position_vec; // Loop through the positions and extract values int index = 0; for (auto iter = m_positions.begin(); iter != m_positions.end(); iter++) { time_vec.push_back(iter->first); position_vec.push_back(iter->second); // Sanity check. The times at which the positions are given must // be uniformly distributed. if (index > 0) { double err = std::abs(time_vec[index] - time_vec[index - 1] - position_delta_t) / position_delta_t; if (err > 1e-2) vw_throw(ArgumentErr() << "The position timestamps are not uniformly distributed."); } index++; } // Return the uniformly-sampled data positions = position_vec; pos_t0 = position_start_time; pos_dt = position_delta_t; pos_tend = position_stop_time; } // Velocities are the sum of inertial velocities and the instantaneous // Earth rotation. // The velocity is already in GCC, so just pack into a function. void PleiadesXML::setup_velocity_func (double time_t0, double time_dt, std::vector & velocities, double & vel_t0, double & vel_dt, double & vel_tend) { // Sanity check, we should be able to find the velocity for each image line size_t num_lines = m_image_size[1]; double first_line_time = time_t0; double last_line_time = time_t0 + time_dt * (num_lines - 1.0); double num_velocities = m_velocities.size(); double velocity_start_time = m_velocities.front().first; double velocity_stop_time = m_velocities.back().first; double velocity_delta_t = (velocity_stop_time - velocity_start_time) / (num_velocities - 1.0); // This is a persistent problem with Pleiades NEOdata. Try to fix it. for (int attempt = 0; attempt < 4; attempt++) { if (velocity_start_time > first_line_time) { vw_out() << "Warning: The first tabulated velocity time is " << "after the first line time. Will do linear extrapolation.\n"; if (attempt > 0) vw_out() << "This is a repeated attempt.\n"; extrapolateAtStartTime(velocity_delta_t, m_velocities); } if (velocity_stop_time < last_line_time) { vw_out() << "Warning: The last tabulated velocity time is before " << "the last line time. Will do linear extrapolation.\n"; if (attempt > 0) vw_out() << "This is a repeated attempt.\n"; extrapolateAtEndTime(velocity_delta_t, m_velocities); } // Update these values num_velocities = m_velocities.size(); velocity_start_time = m_velocities.front().first; velocity_stop_time = m_velocities.back().first; } // Check again if (velocity_start_time > first_line_time || velocity_stop_time < last_line_time) vw::vw_throw(ArgumentErr() << "Extrapolation was not enough. The velocity " << "timestamps do not fully span the range of times for the image lines."); std::vector time_vec; std::vector velocity_vec; // Loop through the velocities and extract values int index = 0; for (auto iter = m_velocities.begin(); iter != m_velocities.end(); iter++) { time_vec.push_back(iter->first); velocity_vec.push_back(iter->second); // Sanity check. The times at which the velocities are given must // be uniformly distributed. if (index > 0) { double err = std::abs(time_vec[index] - time_vec[index - 1] - velocity_delta_t) / velocity_delta_t; if (err > 1e-2) vw_throw(ArgumentErr() << "The velocity timestamps are not uniformly distributed."); } index++; } // Return the uniformly-sampled data velocities = velocity_vec; vel_t0 = velocity_start_time; vel_dt = velocity_delta_t; vel_tend = velocity_stop_time; } // Set up the quaternions for NEO. This will create m_t0Quat, // m_dtQuat, m_quaternion_coeffs. void PleiadesXML::setup_pose_func(double time_t0, double time_dt) { size_t num_lines = m_image_size[1]; double first_line_time = time_t0; double last_line_time = time_t0 + time_dt * (num_lines - 1.0); double num_poses = m_poses.size(); double pose_start_time = m_poses.front().first; double pose_stop_time = m_poses.back().first; double pose_delta_t = (pose_stop_time - pose_start_time) / (num_poses - 1.0); // This is a persistent problem with the Pleiades NEO data. Try to fix it. for (int attempt = 0; attempt < 4; attempt++) { if (pose_start_time > first_line_time) { vw_out() << "Warning: The first tabulated quaternion time is " << "after the first line time. Will do linear extrapolation.\n"; extrapolateAtStartTime(pose_delta_t, m_poses); } if (pose_stop_time < last_line_time) { vw_out() << "Warning: The last tabulated quaternion time is before " << "the last line time. Will do linear extrapolation.\n"; extrapolateAtEndTime(pose_delta_t, m_poses); } // Update these values num_poses = m_poses.size(); pose_start_time = m_poses.front().first; pose_stop_time = m_poses.back().first; } // Check again if (pose_start_time > first_line_time || pose_stop_time < last_line_time) vw::vw_throw(ArgumentErr() << "Extrapolation was not enough. The quaternion " << "timestamps do not fully span the range of times for the image lines."); // Populate the fields that we will be passed to the linescan model m_quaternion_coeffs.clear(); std::vector time_vec(m_poses.size()); int index = 0; for (auto iter = m_poses.begin(); iter != m_poses.end(); iter++) { time_vec[index] = iter->first; auto q = iter->second; vw::Vector v(q.w(), q.x(), q.y(), q.z()); m_quaternion_coeffs.push_back(v); // Sanity check. The times at which the quaternions are given must // be uniformly distributed. The quaternions are sampled more // densely than the positions and velocities, so we tolerate // a bit more divergence from uniform sampling. if (index > 0) { double err = std::abs(time_vec[index] - time_vec[index - 1] - pose_delta_t) / pose_delta_t; if (err > 1e-2) vw_throw(ArgumentErr() << "The quaternion timestamps are not uniformly distributed."); } index++; } // Calc the values that will be passed to Pleiades linescan model m_t0Quat = m_poses.front().first; m_dtQuat = pose_delta_t; return; } } // end namespace asp ================================================ FILE: src/asp/Camera/PleiadesXML.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Pleiades camera model. The documentation used is airbus-pleiades-imagery-user-guide-15042021.pdf. // These are objects that relate directly to block in XML that we need // to read. They only read and then store the raw values. Other // objects will interpret the results. #ifndef __STEREO_CAMERA_PLEIADES_XML_H__ #define __STEREO_CAMERA_PLEIADES_XML_H__ #include #include #include #include #include #include #include #include #include // Special forward declare so we can hide the Xerces headers. #include // Needed for this XERCES macro XERCES_CPP_NAMESPACE_BEGIN class DOMDocument; class DOMElement; class XercesDOMParser; class ErrorHandler; XERCES_CPP_NAMESPACE_END namespace asp { class PleiadesXML { public: /// Constructor 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) {} vw::Vector2i m_image_size; vw::Vector2 m_coeff_psi_x, m_coeff_psi_y; int m_ref_row, m_ref_col; // These will be used to fit the quaternions for L1A and L1B data double m_quat_offset_time, m_quat_scale; std::vector> m_quaternion_coeffs; // For NEO and SPOT 6/7 (tabulated quaternions) bool m_isNeoOrSpot67; std::string m_sensor_name; // PHR_SENSOR, PNEO_SENSOR, S6_SENSOR, S7_SENSOR double m_t0Quat, m_dtQuat; double m_accuracy_stdv; /// Parse an XML file to populate the data void read_xml(std::string const& xml_path); /// Parse an XML tree to populate the data void parse_xml(xercesc::DOMElement* node); // Functions to extract the raw input data from the XML fields. void setup_time_func(double & time_t0, double & time_dt) const; void setup_position_func(double time_t0, double time_dt, std::vector & positions, double & pos_t0, double & pos_dt, double & pos_tend); void setup_velocity_func(double time_t0, double time_dt, std::vector & velocities, double & vel_t0, double & vel_dt, double & vel_tend); void setup_pose_func(double time_t0, double time_dt); private: // The various XML data reading sections /// Opens the XML file for reading and returns the root node. xercesc::DOMElement* open_xml_file(std::string const& xml_path); void read_image_size (xercesc::DOMElement* raster_data); void read_times (xercesc::DOMElement* time); void read_ephemeris (xercesc::DOMElement* ephemeris); void read_attitudes (xercesc::DOMElement* attitudes); void read_attitudes_1A1B(xercesc::DOMElement* attitudes); void read_attitudes_Neo(xercesc::DOMElement* attitudes); void read_ref_col_row (xercesc::DOMElement* swath_range); void read_look_angles (xercesc::DOMElement* look_angles); void parse_accuracy_stdv(xercesc::DOMElement* root); /// Converts a time from string to double precision in seconds. /// All times are in seconds relative to the start time. /// When the start time is passed in, use is_start_time = true. double convert_time(std::string const& s, bool is_start_time); std::string m_start_time_str; boost::posix_time::ptime m_start_time_stamp; // All times represented as doubles will be in seconds relative to m_start_time_stamp bool m_start_time_is_set; double m_start_time, m_end_time; double m_line_period; std::list> m_positions; // time, X/Y/Z) std::list> m_velocities; // time, dX/dY/dZ) std::list>> m_poses; // time, quat, for NEO and SPOT 6/7 boost::shared_ptr m_parser; boost::shared_ptr m_err_handler; }; // End class PleiadesXML } //end namespace asp #endif//__STEREO_CAMERA_PLEIADES_XML_H__ ================================================ FILE: src/asp/Camera/RPCModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; namespace asp { void RPCModel::initialize(DiskImageResourceGDAL* resource) { // Extract the datum (by means of georeference) cartography::GeoReference georef; cartography::read_georeference(georef, *resource); m_datum = georef.datum(); // Initialize to 0 m_err_bias = 0.0; m_err_rand = 0.0; m_terrain_height = std::numeric_limits::quiet_NaN(); // Extract RPC Info boost::shared_ptr dataset = resource->get_dataset_ptr(); if (!dataset) vw_throw(NotFoundErr() << "RPCModel: Could not read data. No file has been opened."); GDALRPCInfo gdal_rpc; if (!GDALExtractRPCInfo(dataset->GetMetadata("RPC"), &gdal_rpc)) vw_throw(NotFoundErr() << "RPCModel: GDAL resource appears not to have RPC metadata."); // Copy information over to our data structures. m_lonlatheight_offset = Vector3(gdal_rpc.dfLONG_OFF, gdal_rpc.dfLAT_OFF, gdal_rpc.dfHEIGHT_OFF); m_lonlatheight_scale = Vector3(gdal_rpc.dfLONG_SCALE, gdal_rpc.dfLAT_SCALE, gdal_rpc.dfHEIGHT_SCALE); m_xy_offset = Vector2(gdal_rpc.dfSAMP_OFF, gdal_rpc.dfLINE_OFF); m_xy_scale = Vector2(gdal_rpc.dfSAMP_SCALE, gdal_rpc.dfLINE_SCALE); m_line_num_coeff = CoeffVec(gdal_rpc.adfLINE_NUM_COEFF); m_line_den_coeff = CoeffVec(gdal_rpc.adfLINE_DEN_COEFF); m_sample_num_coeff = CoeffVec(gdal_rpc.adfSAMP_NUM_COEFF); m_sample_den_coeff = CoeffVec(gdal_rpc.adfSAMP_DEN_COEFF); m_err_bias = gdal_rpc.dfERR_BIAS; m_err_rand = gdal_rpc.dfERR_RAND; m_terrain_height = std::numeric_limits::quiet_NaN(); } RPCModel::RPCModel(std::string const& filename) { // Initialize to 0 m_err_bias = 0.0; m_err_rand = 0.0; m_terrain_height = std::numeric_limits::quiet_NaN(); std::string ext = vw::get_extension(filename); if (ext == ".rpb") { load_rpb_file(filename); return; } // Must have this check, otherwise GDAL prints an error. if (vw::has_image_extension(filename)) { boost::shared_ptr s_ptr(new DiskImageResourceGDAL(filename)); initialize(s_ptr.get()); } else { // Throw an error. It will be caught, but it will get printed // only if no other approaches turn out to work later on. vw_throw(ArgumentErr() << "Not an image file: " << filename); } } RPCModel::RPCModel(DiskImageResourceGDAL* resource) { initialize(resource); } // The constructor just copies all of the input data RPCModel::RPCModel(cartography::Datum const& datum, Vector const& line_num_coeff, Vector const& line_den_coeff, Vector const& samp_num_coeff, Vector const& samp_den_coeff, Vector2 const& xy_offset, Vector2 const& xy_scale, Vector3 const& lonlatheight_offset, Vector3 const& lonlatheight_scale, double err_bias, double err_rand, double terrain_height): m_datum(datum), m_line_num_coeff(line_num_coeff), m_line_den_coeff(line_den_coeff), m_sample_num_coeff(samp_num_coeff), m_sample_den_coeff(samp_den_coeff), m_xy_offset(xy_offset), m_xy_scale(xy_scale), m_lonlatheight_offset(lonlatheight_offset), m_lonlatheight_scale(lonlatheight_scale), m_err_bias(err_bias), m_err_rand(err_rand), m_terrain_height(terrain_height) {} void RPCModel::load_rpb_file(std::string const& filename) { //vw_out() << "Reading RPC model from RPB file, defaulting to WGS84 datum.\n"; m_datum.set_well_known_datum("WGS84"); std::ifstream f(filename.c_str()); // Initialize to 0 m_err_bias = 0.0; m_err_rand = 0.0; // Initialize to NaN m_terrain_height = std::numeric_limits::quiet_NaN(); std::string line; std::vector tokens; bool lineNumCoeffs = false, lineDenCoeffs = false, sampNumCoeffs = false, sampDenCoeffs = false; int coeff_index = 0, max_coeff_index = 0; // Read through each line in the file while (std::getline(f, line)) { try { // Break up the line boost::split(tokens, line, boost::is_any_of("=,;")); // Parse keywords if (line.find("lineOffset") != std::string::npos) m_xy_offset[1] = atof(tokens[1].c_str()); if (line.find("sampOffset") != std::string::npos) m_xy_offset[0] = atof(tokens[1].c_str()); if (line.find("latOffset") != std::string::npos) m_lonlatheight_offset[1] = atof(tokens[1].c_str()); if (line.find("longOffset") != std::string::npos) m_lonlatheight_offset[0] = atof(tokens[1].c_str()); if (line.find("heightOffset") != std::string::npos) m_lonlatheight_offset[2] = atof(tokens[1].c_str()); if (line.find("lineScale") != std::string::npos) m_xy_scale[1] = atof(tokens[1].c_str()); if (line.find("sampScale") != std::string::npos) m_xy_scale[0] = atof(tokens[1].c_str()); if (line.find("latScale") != std::string::npos) m_lonlatheight_scale[1] = atof(tokens[1].c_str()); if (line.find("longScale") != std::string::npos) m_lonlatheight_scale[0] = atof(tokens[1].c_str()); if (line.find("heightScale") != std::string::npos) m_lonlatheight_scale[2] = atof(tokens[1].c_str()); if (line.find("errBias") != std::string::npos) m_err_bias = atof(tokens[1].c_str()); if (line.find("errRand") != std::string::npos) m_err_rand = atof(tokens[1].c_str()); // Start of a coefficient sequence if (line.find("lineNumCoef") != std::string::npos) { lineNumCoeffs = true; continue; } else if (line.find("lineDenCoef") != std::string::npos) { lineDenCoeffs = true; continue; } else if (line.find("sampNumCoef") != std::string::npos) { sampNumCoeffs = true; continue; } else if (line.find("sampDenCoef") != std::string::npos) { sampDenCoeffs = true; continue; } // Handle the RPC coefficients if (lineNumCoeffs) { m_line_num_coeff[coeff_index] = atof(tokens[0].c_str()); coeff_index++; } if (lineDenCoeffs) { m_line_den_coeff[coeff_index] = atof(tokens[0].c_str()); coeff_index++; } if (sampNumCoeffs) { m_sample_num_coeff[coeff_index] = atof(tokens[0].c_str()); coeff_index++; } if (sampDenCoeffs) { m_sample_den_coeff[coeff_index] = atof(tokens[0].c_str()); coeff_index++; } // Done reading a coefficient sequence if (line.find(")") != std::string::npos) { lineNumCoeffs = false; lineDenCoeffs = false; sampNumCoeffs = false; sampDenCoeffs = false; if (coeff_index > max_coeff_index) max_coeff_index = coeff_index; coeff_index = 0; } } catch(...) { vw_throw(ArgumentErr() << "Error reading file " << filename << ", line = " << line); } } // End loop through lines. f.close(); // Basic error check if (max_coeff_index != 20) vw_throw(ArgumentErr() << "Error reading file " << filename << ", loaded wrong number of coefficients."); } // All of these implementations are largely inspired by the GDAL // code. We don't use the GDAL code unfortunately because they don't // make that part of the API available. However I believe this is a // safe reinterpretation that is safe to distribute. Vector2 RPCModel::point_to_pixel(Vector3 const& point) const { return geodetic_to_pixel(m_datum.cartesian_to_geodetic(point)); } Vector2 RPCModel::geodetic_to_pixel(Vector3 const& geodetic) const { // Should we verify that the input geodetic is in the box? Vector3 normalized_geodetic = elem_quot(geodetic - m_lonlatheight_offset, m_lonlatheight_scale); Vector2 normalized_pixel = normalizedLlhToPix(normalized_geodetic); return elem_prod(normalized_pixel, m_xy_scale) + m_xy_offset; } Vector2 RPCModel::normalizedLlhToPix(Vector3 const& normalized_geodetic, RPCModel::CoeffVec const& line_num_coeff, RPCModel::CoeffVec const& line_den_coeff, RPCModel::CoeffVec const& sample_num_coeff, RPCModel::CoeffVec const& sample_den_coeff) { CoeffVec term = calculate_terms(normalized_geodetic); Vector2 normalized_pixel(dot_prod(term,sample_num_coeff) / dot_prod(term,sample_den_coeff), dot_prod(term,line_num_coeff) / dot_prod(term,line_den_coeff)); return normalized_pixel; } Vector2 RPCModel::normalizedLlhToPix(Vector3 const& normalized_geodetic) const { return normalizedLlhToPix(normalized_geodetic, m_line_num_coeff, m_line_den_coeff, m_sample_num_coeff, m_sample_den_coeff); } RPCModel::CoeffVec RPCModel::calculate_terms(vw::Vector3 const& normalized_geodetic) { double x = normalized_geodetic.x(); // normalized lon double y = normalized_geodetic.y(); // normalized lat double z = normalized_geodetic.z(); // normalized height CoeffVec result; result[ 0] = 1.0; result[ 1] = x; result[ 2] = y; result[ 3] = z; result[ 4] = x*y; result[ 5] = x*z; result[ 6] = y*z; result[ 7] = x*x; result[ 8] = y*y; result[ 9] = z*z; result[10] = x*y*z; result[11] = x*x*x; result[12] = x*y*y; result[13] = x*z*z; result[14] = x*x*y; result[15] = y*y*y; result[16] = y*z*z; result[17] = x*x*z; result[18] = y*y*z; result[19] = z*z*z; return result; } vw::Vector RPCModel::get_coeff_order() { vw::Vector result; for (int i = 0; i < 3; i++) result[i] = 1; for (int i = 3; i < 10; i++) result[i] = 2; for (int i = 10; i < 20; i++) result[i] = 3; return result; } vw::Matrix RPCModel::terms_Jacobian2(vw::Vector3 const& normalized_geodetic) { // Partial derivatives of the terms returned by the // calculate_terms() function in respect to the first two // variables only (unlike the terms_Jacobian3() function). vw::Matrix M; double x = normalized_geodetic.x(); // normalized lon double y = normalized_geodetic.y(); // normalized lat double z = normalized_geodetic.z(); // normalized height // df/dx df/dy // f M[ 0][0] = 0.0; M[ 0][1] = 0.0; // 1 M[ 1][0] = 1.0; M[ 1][1] = 0.0; // x M[ 2][0] = 0.0; M[ 2][1] = 1.0; // y M[ 3][0] = 0.0; M[ 3][1] = 0.0; // z M[ 4][0] = y; M[ 4][1] = x; // xy M[ 5][0] = z; M[ 5][1] = 0.0; // xz M[ 6][0] = 0.0; M[ 6][1] = z; // yz M[ 7][0] = 2.0*x; M[ 7][1] = 0.0; // xx M[ 8][0] = 0.0; M[ 8][1] = 2.0*y; // yy M[ 9][0] = 0.0; M[ 9][1] = 0.0; // zz M[10][0] = y*z; M[10][1] = x*z; // xyz M[11][0] = 3.0*x*x; M[11][1] = 0.0; // xxx M[12][0] = y*y; M[12][1] = 2.0*x*y; // xyy M[13][0] = z*z; M[13][1] = 0.0; // xzz M[14][0] = 2.0*x*y; M[14][1] = x*x; // xxy M[15][0] = 0.0; M[15][1] = 3.0*y*y; // yyy M[16][0] = 0.0; M[16][1] = z*z; // yzz M[17][0] = 2.0*x*z; M[17][1] = 0.0; // xxz M[18][0] = 0.0; M[18][1] = 2.0*y*z; // yyz M[19][0] = 0.0; M[19][1] = 0.0; // zzz return M; } vw::Matrix RPCModel::terms_Jacobian3(vw::Vector3 const& normalized_geodetic) { // Partial derivatives of the terms returned by the // calculate_terms() function in respect to all three // variables only (unlike the terms_Jacobian2() function). vw::Matrix M; double x = normalized_geodetic.x(); // normalized lon double y = normalized_geodetic.y(); // normalized lat double z = normalized_geodetic.z(); // normalized height // df/dx df/dy df/dz // f M[ 0][0] = 0.0; M[ 0][1] = 0.0; M[ 0][2] = 0.0; // 1 M[ 1][0] = 1.0; M[ 1][1] = 0.0; M[ 1][2] = 0.0; // x M[ 2][0] = 0.0; M[ 2][1] = 1.0; M[ 2][2] = 0.0; // y M[ 3][0] = 0.0; M[ 3][1] = 0.0; M[ 3][2] = 1.0; // z M[ 4][0] = y; M[ 4][1] = x; M[ 4][2] = 0.0; // xy M[ 5][0] = z; M[ 5][1] = 0.0; M[ 5][2] = x; // xz M[ 6][0] = 0.0; M[ 6][1] = z; M[ 6][2] = y; // yz M[ 7][0] = 2.0*x; M[ 7][1] = 0.0; M[ 7][2] = 0.0; // xx M[ 8][0] = 0.0; M[ 8][1] = 2.0*y; M[ 8][2] = 0.0; // yy M[ 9][0] = 0.0; M[ 9][1] = 0.0; M[ 9][2] = 2.0*z; // zz M[10][0] = y*z; M[10][1] = x*z; M[10][2] = x*y; // xyz M[11][0] = 3.0*x*x; M[11][1] = 0.0; M[11][2] = 0.0; // xxx M[12][0] = y*y; M[12][1] = 2.0*x*y; M[12][2] = 0.0; // xyy M[13][0] = z*z; M[13][1] = 0.0; M[13][2] = 2.0*x*z; // xzz M[14][0] = 2.0*x*y; M[14][1] = x*x; M[14][2] = 0.0; // xxy M[15][0] = 0.0; M[15][1] = 3.0*y*y; M[15][2] = 0.0; // yyy M[16][0] = 0.0; M[16][1] = z*z; M[16][2] = 2.0*y*z; // yzz M[17][0] = 2.0*x*z; M[17][1] = 0.0; M[17][2] = x*x; // xxz M[18][0] = 0.0; M[18][1] = 2.0*y*z; M[18][2] = y*y; // yyz M[19][0] = 0.0; M[19][1] = 0.0; M[19][2] = 3.0*z*z; // zzz return M; } RPCModel::CoeffVec RPCModel::quotient_Jacobian(RPCModel::CoeffVec const& c, RPCModel::CoeffVec const& d, RPCModel::CoeffVec const& u) { // Return the Jacobian of dot_prod(c, u) / dot_prod(d, u) // as a vector with 20 elements. double cu = dot_prod(c, u); double du = dot_prod(d, u); double den = du*du; return elem_quot(du * c - cu * d, den); } // Return the Jacobian of the function // f(x1, x2, x3) = ((x1 - c1)/q1, (x2 - c2)/q2, (x3 - c3)/q3) vw::Matrix3x3 RPCModel::normalization_Jacobian(Vector3 const& q) { vw::Matrix3x3 M; M[0][0] = 1.0/q[0]; M[0][1] = 0.0; M[0][2] = 0.0; M[1][0] = 0.0; M[1][1] = 1.0/q[1]; M[1][2] = 0.0; M[2][0] = 0.0; M[2][1] = 0.0; M[2][2] = 1.0/q[2]; return M; } Matrix RPCModel::geodetic_to_pixel_Jacobian(Vector3 const& geodetic) const { Vector3 normalized_geodetic = elem_quot(geodetic - m_lonlatheight_offset, m_lonlatheight_scale); CoeffVec term = calculate_terms(normalized_geodetic); CoeffVec Qs = quotient_Jacobian(sample_num_coeff(), sample_den_coeff(), term); CoeffVec Ql = quotient_Jacobian(line_num_coeff(), line_den_coeff(), term); Matrix MN = terms_Jacobian3(normalized_geodetic) * normalization_Jacobian(m_lonlatheight_scale); Matrix J; select_row(J, 0) = m_xy_scale[0] * transpose(Qs) * MN; select_row(J, 1) = m_xy_scale[1] * transpose(Ql) * MN; return J; } // This function is different from geodetic_to_pixel_Jacobian() in several // respects: // 1. The input is the normalized geodetic, and the derivatives // are in respect to the normalized geodetic as well. // 2. The derivatives are taken only in respect to the first two // variables (normalized lon and lat, no height). // 3. The output is in normalized pixels (see m_xy_scale and m_xy_offset). vw::Vector RPCModel::normalizedLlhToPixJac(Vector3 const& normalized_geodetic) const { CoeffVec term = calculate_terms(normalized_geodetic); CoeffVec Qs = quotient_Jacobian(sample_num_coeff(), sample_den_coeff(), term); CoeffVec Ql = quotient_Jacobian(line_num_coeff(), line_den_coeff(), term); Matrix Jt = terms_Jacobian2(normalized_geodetic); Vector J(4); for (int i = 0; i < 4; i++) J[i] = 0; // Compute J = [Qs^T, Ql^T] * Jt for (int i = 0; i < 20; i++) { J[0] += Qs[i] * Jt[i][0]; J[1] += Qs[i] * Jt[i][1]; J[2] += Ql[i] * Jt[i][0]; J[3] += Ql[i] * Jt[i][1]; } return J; } // Find the Jacobian of geodetic_to_pixel using numerical // differentiation. This is used for testing purposes. Matrix RPCModel::geodetic_to_pixel_numerical_Jacobian(Vector3 const& geodetic, double tol) const { Matrix J; Vector2 B = geodetic_to_pixel(geodetic); Vector2 B0 = (geodetic_to_pixel(geodetic + Vector3(tol, 0, 0)) - B)/tol; Vector2 B1 = (geodetic_to_pixel(geodetic + Vector3(0, tol, 0)) - B)/tol; Vector2 B2 = (geodetic_to_pixel(geodetic + Vector3(0, 0, tol)) - B)/tol; select_col(J, 0) = B0; select_col(J, 1) = B1; select_col(J, 2) = B2; return J; } // A class that computes the normalized pixel and Jacobian via two versions of // operator(), in a way suitable to pass to the NewtonRaphson solver. struct RpcFunJac { RpcFunJac(RPCModel const& rpc, double height): m_rpc(rpc) { m_normalized_height = (height - m_rpc.m_lonlatheight_offset[2]) / m_rpc.m_lonlatheight_scale[2]; } // The input is the normalized lon-lat. The output is the normalized pixel. vw::Vector2 operator()(vw::Vector2 const& normalized_lonlat) { return m_rpc.normalizedLlhToPix(Vector3(normalized_lonlat[0], normalized_lonlat[1], m_normalized_height)); } // The input is the normalized lon-lat. The output is the Jacobian // of the normalized pixel in respect to the normalized lon-lat. vw::Vector operator()(vw::Vector2 const& normalized_lonlat, double step) { return m_rpc.normalizedLlhToPixJac(Vector3(normalized_lonlat[0], normalized_lonlat[1], m_normalized_height)); } RPCModel const& m_rpc; double m_normalized_height; }; // Intersect the ray from the given pixel with surface at this // height above the datum. Use Newton's method. The obtained // intersection point must project back into the pixel. // TODO(oalexan1): Replace the solver here with the logic in // vw/Math/NewtonRaphson.h. Vector2 RPCModel::image_to_ground(Vector2 const& pixel, double height, Vector2 lonlat_guess) const { // Ensure the tolerance is rather tight, as later will trace rays // through pairs of such ground points for triangulation. double tol = 1e-10; Vector2 normalized_pixel = elem_quot(pixel - m_xy_offset, m_xy_scale); // The initial guess for the normalized lon-lat. vw::Vector2 ll_off = subvector(m_lonlatheight_offset, 0, 2); vw::Vector2 ll_scale = subvector(m_lonlatheight_scale, 0, 2); if (lonlat_guess == Vector2(0.0, 0.0)) lonlat_guess = ll_off; // initial guess vw::Vector2 normalized_lonlat = elem_quot(lonlat_guess - ll_off, ll_scale); // Set up Newton-Raphson. The RpcFunJac class computes both the function // and its Jacobian via two versions of operator(). RpcFunJac rpc_fun_jac(*this, height); vw::math::NewtonRaphson nr(rpc_fun_jac, rpc_fun_jac); vw::Vector2 guess = normalized_lonlat; double step = 1e-6; // Not used with analytic Jacobian, but part of the API. // Find with normalized_lonlat such that // normalized_pixel = rpc_fun_jac(normalized_lonlat). normalized_lonlat = nr.solve(guess, normalized_pixel, step, tol); // Undo the normalization Vector2 lonlat = elem_prod(normalized_lonlat, ll_scale) + ll_off; return lonlat; } void RPCModel::point_and_dir(Vector2 const& pix, Vector3 & P, Vector3 & dir) const { // For an RPC model there is no defined origin so it and the ray need to be computed. // Try to have the ray end points not too far from the center of the valid region. // This can make a difference if the region is tall and the rays are curved. const double VERT_SCALE_FACTOR = 0.9; // - The virtual center should be above the terrain double delta = m_lonlatheight_scale[2]*VERT_SCALE_FACTOR; // measured in meters delta = std::min(delta, 50.0); delta = std::max(delta, 0.1); // Center of valid region to bottom of valid region (normalized) double height_up = m_lonlatheight_offset[2] + delta; double height_dn = m_lonlatheight_offset[2] - delta; // Given the pixel and elevation, estimate lon-lat. // Use m_lonlatheight_offset as initial guess for lonlat_up, // and then use lonlat_up as initial guess for lonlat_dn. vw::Vector2 ll_off = subvector(m_lonlatheight_offset, 0, 2); Vector2 lonlat_up = image_to_ground(pix, height_up, ll_off); Vector2 lonlat_dn = image_to_ground(pix, height_dn, lonlat_up); Vector3 geo_up = Vector3(lonlat_up[0], lonlat_up[1], height_up); Vector3 geo_dn = Vector3(lonlat_dn[0], lonlat_dn[1], height_dn); Vector3 P_up = m_datum.geodetic_to_cartesian(geo_up); Vector3 P_dn = m_datum.geodetic_to_cartesian(geo_dn); dir = normalize(P_dn - P_up); // Set the origin location very far in the opposite direction of the pointing vector, // to put it high above the terrain. Normally the precise position along the ray // should not make any difference, except perhaps in error propagation // (see Covariance.cc). // TODO(oalexan1): Use the logic from cam_gen.cc to shoot rays from the ground // up and estimate where they intersect. That will give a better idea of the true // elevation of the camera above the ground. const double LONG_SCALE_UP = 100000.0; // 100 km above ground P = P_up - dir*LONG_SCALE_UP; } Vector3 RPCModel::camera_center(Vector2 const& pix) const{ // Return an arbitrarily chosen point on the ray back-projected // through the camera from the current pixel. Vector3 P; Vector3 dir; point_and_dir(pix, P, dir); return P; } Vector3 RPCModel::pixel_to_vector(Vector2 const& pix) const { // Find the normalized direction of the ray back-projected through // the camera from the current pixel. Vector3 P; Vector3 dir; point_and_dir(pix, P, dir); return dir; } std::ostream& operator<<(std::ostream& os, const RPCModel& rpc) { os << "RPC Model:" << std::endl << "Line Numerator: " << rpc.line_num_coeff() << std::endl << "Line Denominator: " << rpc.line_den_coeff() << std::endl << "Samp Numerator: " << rpc.sample_num_coeff() << std::endl << "Samp Denominator: " << rpc.sample_den_coeff() << std::endl << "XY Offset: " << rpc.xy_offset() << std::endl << "XY Scale: " << rpc.xy_scale() << std::endl << "Geodetic Offset: " << rpc.lonlatheight_offset() << std::endl << "Geodetic Scale: " << rpc.lonlatheight_scale(); return os; } // Save the RPC model to an XML file. This is similar to the WorldView format. // GDAL can read it. void RPCModel::saveXML(std::string const& filename) const { std::string lineoffset = vw::num_to_str(xy_offset().y()); std::string sampoffset = vw::num_to_str(xy_offset().x()); std::string latoffset = vw::num_to_str(lonlatheight_offset().y()); std::string longoffset = vw::num_to_str(lonlatheight_offset().x()); std::string heightoffset = vw::num_to_str(lonlatheight_offset().z()); std::string linescale = vw::num_to_str(xy_scale().y()); std::string sampscale = vw::num_to_str(xy_scale().x()); std::string latscale = vw::num_to_str(lonlatheight_scale().y()); std::string longscale = vw::num_to_str(lonlatheight_scale().x()); std::string heightscale = vw::num_to_str(lonlatheight_scale().z()); std::string linenumcoef = vw::vec_to_str(line_num_coeff()); std::string linedencoef = vw::vec_to_str(line_den_coeff()); std::string sampnumcoef = vw::vec_to_str(sample_num_coeff()); std::string sampdencoef = vw::vec_to_str(sample_den_coeff()); std::string datum_wkt = m_datum.get_wkt(); std::ofstream ofs(filename.c_str()); ofs.precision(17); ofs << "\n"; ofs << "\n"; ofs << " \n"; ofs << " \n"; ofs << " " << datum_wkt << "\n"; ofs << " " << m_err_bias << "\n"; ofs << " " << m_err_rand << "\n"; ofs << " " << lineoffset << "\n"; ofs << " " << sampoffset << "\n"; ofs << " " << latoffset << "\n"; ofs << " " << longoffset << "\n"; ofs << " " << heightoffset << "\n"; ofs << " " << linescale << "\n"; ofs << " " << sampscale << "\n"; ofs << " " << latscale << "\n"; ofs << " " << longscale << "\n"; ofs << " " << heightscale << "\n"; ofs << " \n"; ofs << " " << linenumcoef << "\n"; ofs << " \n"; ofs << " \n"; ofs << " " << linedencoef << "\n"; ofs << " \n"; ofs << " \n"; ofs << " " << sampnumcoef << "\n"; ofs << " \n"; ofs << " \n"; ofs << " " << sampdencoef << "\n"; ofs << " \n"; ofs << " \n"; ofs << " \n"; ofs << "\n"; ofs.close(); } } // end namespace asp ================================================ FILE: src/asp/Camera/RPCModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// RPC model and triangulation. Following the paper: /// Jacek Grodecki, Gene Dial and James Lutes, "Mathematical Model for /// 3D Feature Extraction from Multiple Satellite Images Described by /// RPCs." Proceedings of ASPRS 2004 Conference, Denver, Colorado, May, /// 2004. /// Digital Globe images (and others) often include an RPC camera model /// definition. The RPC model is less complicated than the full Digital /// Globe camera model. #ifndef __STEREO_CAMERA_RPC_MODEL_H__ #define __STEREO_CAMERA_RPC_MODEL_H__ #include #include #include #include #include #include namespace vw { class DiskImageResourceGDAL; } namespace asp { class RPCModel : public vw::camera::CameraModel { public: // These integers show up in a lot of RPC code static const int GEODETIC_COORD_SIZE = 3; static const int IMAGE_COORD_SIZE = 2; static const int NUM_RPC_COEFFS = 78; // Total number of RPC coefficients typedef vw::Vector CoeffVec; /// Construct from a GDAL image or an .RPB file. RPCModel(std::string const& filename); RPCModel(vw::DiskImageResourceGDAL* resource); RPCModel(vw::cartography::Datum const& datum, CoeffVec const& line_num_coeff, CoeffVec const& line_den_coeff, CoeffVec const& samp_num_coeff, CoeffVec const& samp_den_coeff, vw::Vector2 const& xy_offset, vw::Vector2 const& xy_scale, vw::Vector3 const& lonlatheight_offset, vw::Vector3 const& lonlatheight_scale, double err_bias = 0.0, double err_rand = 0.0, double terrain_height = std::numeric_limits::quiet_NaN()); virtual std::string type() const { return "RPC"; } virtual ~RPCModel() {} // Save the RPC model to an XML file. This is similar to the WorldView format. // GDAL can read it. void saveXML(std::string const& filename) const; /// Populate this object from a .RPB file. void load_rpb_file(std::string const& filename); // Standard Access Methods. The concept of camera_center does not // apply well to RPC, we just return an arbitrary point on the ray. virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const; virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const; virtual vw::Vector3 camera_center (vw::Vector2 const& pix) const; // Apply a transform to an RPC model void applyTransform(vw::Matrix4x4 const& transform); static vw::Vector2 normalizedLlhToPix (vw::Vector3 const& normalized_geodetic, CoeffVec const& line_num_coeff, CoeffVec const& line_den_coeff, CoeffVec const& sample_num_coeff, CoeffVec const& sample_den_coeff); // Normalized lon-lat-height to normalized pixel vw::Vector2 normalizedLlhToPix(vw::Vector3 const& normalized_geodetic) const; vw::Vector2 geodetic_to_pixel(vw::Vector3 const& geodetic) const; // Access to constants vw::cartography::Datum const& datum () const { return m_datum; } CoeffVec const& line_num_coeff () const { return m_line_num_coeff; } CoeffVec const& line_den_coeff () const { return m_line_den_coeff; } CoeffVec const& sample_num_coeff () const { return m_sample_num_coeff; } CoeffVec const& sample_den_coeff () const { return m_sample_den_coeff; } vw::Vector2 const& xy_offset () const { return m_xy_offset; } vw::Vector2 const& xy_scale () const { return m_xy_scale; } vw::Vector3 const& lonlatheight_offset() const { return m_lonlatheight_offset; } vw::Vector3 const& lonlatheight_scale () const { return m_lonlatheight_scale; } /// Returns a vector containing the order of each of the terms a CoeffVec applies to. static vw::Vector get_coeff_order(); // Helper methods used for triangulation and projection static CoeffVec calculate_terms(vw::Vector3 const& normalized_geodetic); static vw::Matrix terms_Jacobian2(vw::Vector3 const& normalized_geodetic); static vw::Matrix terms_Jacobian3(vw::Vector3 const& normalized_geodetic); static CoeffVec quotient_Jacobian(CoeffVec const& c, CoeffVec const& d, CoeffVec const& u); static vw::Matrix3x3 normalization_Jacobian(vw::Vector3 const& q); vw::Matrix geodetic_to_pixel_Jacobian (vw::Vector3 const& geodetic) const; vw::Matrix geodetic_to_pixel_numerical_Jacobian (vw::Vector3 const& geodetic, double tol) const; vw::Vector normalizedLlhToPixJac(vw::Vector3 const& normalized_geodetic) const; /// Given a pixel (the projection of a point in 3D space onto the camera image) /// and the value of the height of the point, find the lonlat of the point /// using Newton's method. The user may provide a guess for the lonlat. vw::Vector2 image_to_ground(vw::Vector2 const& pixel, double height, vw::Vector2 lonlat_guess = vw::Vector2(0.0, 0.0)) const; /// Find a point which gets projected onto the current pixel, /// and the direction of the ray going through that point. void point_and_dir(vw::Vector2 const& pix, vw::Vector3 & P, vw::Vector3 & dir) const; // Will be read only for DG RPC camera models and set to 0 for the rest double m_err_bias, m_err_rand; // The height used for ortho images (for Maxar and Pleiades) double m_terrain_height; // Quantities used to normalize lon-lat-height before applying the RPC model vw::Vector3 m_lonlatheight_offset; vw::Vector3 m_lonlatheight_scale; private: vw::cartography::Datum m_datum; // Scaling parameters CoeffVec m_line_num_coeff, m_line_den_coeff, m_sample_num_coeff, m_sample_den_coeff; vw::Vector2 m_xy_offset; vw::Vector2 m_xy_scale; void initialize(vw::DiskImageResourceGDAL* resource); }; std::ostream& operator<<(std::ostream& os, const RPCModel& rpc); } #endif //__STEREO_CAMERA_RPC_MODEL_H__ ================================================ FILE: src/asp/Camera/RPCModelGen.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include using namespace vw; namespace asp { // There are 20 polynomial coefficients for each of lineNum, // lineDen, sampNum, sampDen, as the RPC polynomials are of degree // 3 in x and y. However, the 0 degree coeffs for both // denominators is 1, so only 78 coefficients vary. Extract the // variable coefficients from a vector. void unpackCoeffs(Vector const& C, RPCModel::CoeffVec& lineNum, RPCModel::CoeffVec& lineDen, RPCModel::CoeffVec& sampNum, RPCModel::CoeffVec& sampDen) { VW_ASSERT(C.size() == 78, ArgumentErr() << "Must have 78 coefficients.\n"); int start = 0; // Line subvector(lineNum, 0, 20) = subvector(C, start, 20); start += 20; lineDen[0] = 1; subvector(lineDen, 1, 19) = subvector(C, start, 19); start += 19; // Sample subvector(sampNum, 0, 20) = subvector(C, start, 20); start += 20; sampDen[0] = 1; subvector(sampDen, 1, 19) = subvector(C, start, 19); start += 19; VW_ASSERT(start == 78, ArgumentErr() << "Book-keeping error.\n"); return; } // This function does the reverse of unpackCoeffs(). void packCoeffs(RPCModel::CoeffVec const& lineNum, RPCModel::CoeffVec const& lineDen, RPCModel::CoeffVec const& sampNum, RPCModel::CoeffVec const& sampDen, Vector & C) { C.set_size(78); int start = 0; subvector(C, start, 20) = subvector(lineNum, 0, 20); start += 20; subvector(C, start, 19) = subvector(lineDen, 1, 19); start += 19; subvector(C, start, 20) = subvector(sampNum, 0, 20); start += 20; subvector(C, start, 19) = subvector(sampDen, 1, 19); start += 19; return; } // Given a set of RPC coefficients, compute the projected pixels. The input is // the RPC coefficients, packed in a vector. For each normalized geodetic, // compute the normalized pixel value. This will be the output. Add the // penalization terms to the output. See the note later in the code. RpcSolveLMA::result_type RpcSolveLMA::operator()(RpcSolveLMA::domain_type const& C) const { // Unpack all the RPC model coefficients from the input vector C RPCModel::CoeffVec lineNum, lineDen, sampNum, sampDen; unpackCoeffs(C, lineNum, lineDen, sampNum, sampDen); // Initialize the output vector int numPts = m_normalizedGeodetics.size()/RPCModel::GEODETIC_COORD_SIZE; result_type result; result.set_size(m_normalizedPixels.size()); // Loop through each test point for (int i = 0; i < numPts; i++){ // Unpack the normalized geodetic coordinates vw::Vector3 G = subvector(m_normalizedGeodetics, RPCModel::GEODETIC_COORD_SIZE*i, RPCModel::GEODETIC_COORD_SIZE); // Project the normalized geodetic coordinate into the RPC camera to get a normalized pixel vw::Vector2 pxn = RPCModel::normalizedLlhToPix(G, lineNum, lineDen, sampNum, sampDen); // Pack the normalized pixel into the output result vector subvector(result, RPCModel::IMAGE_COORD_SIZE*i, RPCModel::IMAGE_COORD_SIZE) = pxn; } // There are 4*20 - 2 = 78 coefficients we optimize. Of those, 2 // are 0-th degree, 4*3 = 12 are 1st degree, and the rest, 78 - 12 // - 2 = 64 are higher degree. Per Hartley, we'll add for each // such coefficient c, a term K*c in the cost function vector, // where K is a large number. This will penalize large values in // the higher degree coefficients. // - These values are attached to the end of the output vector int count = RPCModel::IMAGE_COORD_SIZE*numPts; vw::Vector coeff_order = RPCModel::get_coeff_order(); // This ranges from 1 to 3 for (int i = 4; i < (int)lineNum.size(); i++) result[count++] = m_wt*lineNum[i] * (coeff_order[i]-1); for (int i = 4; i < (int)lineDen.size(); i++) result[count++] = m_wt*lineDen[i] * (coeff_order[i]-1); for (int i = 4; i < (int)sampNum.size(); i++) result[count++] = m_wt*sampNum[i] * (coeff_order[i]-1); for (int i = 4; i < (int)sampDen.size(); i++) result[count++] = m_wt*sampDen[i] * (coeff_order[i]-1); VW_ASSERT((int)result.size() == count, vw::ArgumentErr() << "Book-keeping error.\n"); return result; } // Print out a name followed by the vector of values void print_vec(std::string const& name, Vector const& vals) { std::cout.precision(16); std::cout << name << ","; int len = vals.size(); for (int i = 0; i < len - 1; i++) std::cout << vals[i] << ","; if (len > 0) std::cout << vals[len-1]; std::cout << "\n"; } // Dump a vector to a text file, one value per row. void print_vec_to_file(std::string const& path, Vector const& vals) { std::ofstream outFile(path.c_str()); outFile.precision(16); int len = vals.size(); for (int i = 0; i < len - 1; i++) outFile << vals[i] << "\n"; if (len > 0) outFile << vals[len-1]; outFile.close(); } // Computes a system solution from a seed and returns the final error number. int find_solution_from_seed(RpcSolveLMA const& lma_model, Vector const& seed_params, Vector const& actual_observations, Vector & final_params, double & norm_error) { // Initialize a zero vector of RPC model coefficients int status; // Use the L-M solver to optimize the RPC model coefficient values. double abs_tolerance = 1e-10; double rel_tolerance = 1e-10; int max_iterations = 1000; final_params = math::levenberg_marquardt(lma_model, seed_params, actual_observations, status, abs_tolerance, rel_tolerance, max_iterations); if (status < 1) { // This means the solver failed to converge VW_OUT(DebugMessage, "asp") << "rpc_gen: WARNING --> Levenberg-Marquardt solver status = " << status << "\n"; } // Otherwise the solver converged, return the final error number. Vector final_projected = lma_model(final_params); Vector final_error = lma_model.difference(final_projected, actual_observations); norm_error = norm_2(final_error); return status; } // Find the best-fit affine transform, that will serve as initial guess for RPC void initRpcAsAffine(// Inputs Vector const& normalized_geodetics, Vector const& normalized_pixels, // Outputs RPCModel::CoeffVec & line_num, RPCModel::CoeffVec & line_den, RPCModel::CoeffVec & samp_num, RPCModel::CoeffVec & samp_den) { int numPts = normalized_geodetics.size()/RPCModel::GEODETIC_COORD_SIZE; int numPts2 = (normalized_pixels.size() - asp::RpcSolveLMA::NUM_PENALTY_TERMS) / RPCModel::IMAGE_COORD_SIZE; if (numPts != numPts2) vw_throw( ArgumentErr() << "Error in " << __FILE__ << ". Number of inputs and outputs do not agree.\n"); std::vector> in(numPts), out(numPts); for (int p = 0; p < numPts; p++) { Vector P; for (int q = 0; q < RPCModel::GEODETIC_COORD_SIZE; q++) P[q] = normalized_geodetics[p*RPCModel::GEODETIC_COORD_SIZE + q]; // P[0], P[1], P[2] P[RPCModel::GEODETIC_COORD_SIZE] = 1; // P[3] in[p] = P; for (int q = 0; q < RPCModel::IMAGE_COORD_SIZE; q++) P[q] = normalized_pixels[p*RPCModel::IMAGE_COORD_SIZE + q]; // P[0], P[1] P[RPCModel::IMAGE_COORD_SIZE] = 0; // P[2] P[RPCModel::IMAGE_COORD_SIZE+1] = 1; // P[3] out[p] = P; } Matrix4x4 T = math::AffineFittingFunctorN()(in, out); // Put this matrix in the format acceptable for the RPC solver for (int p = 0; p < int(line_num.size()); p++) { samp_num[p] = 0; samp_den[p] = 0; // first coordinate of output is sample line_num[p] = 0; line_den[p] = 0; // second coordinate of output is line } // The first coordinate of the output samp_num[0] = T(0, 3); // the d value, the translation, in a*x + b*y + c*z + d samp_num[1] = T(0, 0); samp_num[2] = T(0, 1); samp_num[3] = T(0, 2); // linear part, a, b, c // The second coordinate of the output line_num[0] = T(1, 3); // the d value, the translation, in a*x + b*y + c*z + d line_num[1] = T(1, 0); line_num[2] = T(1, 1); line_num[3] = T(1, 2); // linear part, a, b, c // The denominator is just 1 to start samp_den[0] = 1.0; line_den[0] = 1.0; } // Form the normalized llh and pixel arrays that will be as inputs to the RPC solver // Form the normalized llh and pixel arrays that will be as inputs to the RPC solver void normalizeLlhPix(std::vector const& llh_vec, std::vector const& pix_vec, vw::Vector3 const& llh_offset, vw::Vector3 const& llh_scale, vw::Vector2 const& pixel_offset, vw::Vector2 const& pixel_scale, // Outputs vw::Vector & normalized_llh, vw::Vector & normalized_pixels) { // Allocate the inputs, including with space for the penalty terms in the // normalized pixels, that are zero for now. int num_total_pts = llh_vec.size(); normalized_llh.set_size(asp::RPCModel::GEODETIC_COORD_SIZE*num_total_pts); normalized_pixels.set_size(asp::RPCModel::IMAGE_COORD_SIZE*num_total_pts + asp::RpcSolveLMA::NUM_PENALTY_TERMS); for (size_t i = 0; i < normalized_pixels.size(); i++) normalized_pixels[i] = 0.0; // Form the arrays of normalized pixels and normalized llh for (int pt = 0; pt < num_total_pts; pt++) { // Normalize the pixel to the [-1, 1] range vw::Vector3 llh_n = elem_quot(llh_vec[pt] - llh_offset, llh_scale); vw::Vector2 pixel_n = elem_quot(pix_vec[pt] - pixel_offset, pixel_scale); vw::math::subvector(normalized_llh, asp::RPCModel::GEODETIC_COORD_SIZE*pt, asp::RPCModel::GEODETIC_COORD_SIZE) = llh_n; vw::math::subvector(normalized_pixels, asp::RPCModel::IMAGE_COORD_SIZE*pt, asp::RPCModel::IMAGE_COORD_SIZE) = pixel_n; } } // Find the best-fit RPC given the normalized geodetic and pixel values void gen_rpc(// Inputs double penalty_weight, Vector const& normalized_geodetics, Vector const& normalized_pixels, bool refine_only, // Outputs RPCModel::CoeffVec & line_num, RPCModel::CoeffVec & line_den, RPCModel::CoeffVec & samp_num, RPCModel::CoeffVec & samp_den) { VW_ASSERT(penalty_weight >= 0, ArgumentErr() << "The RPC penalty weight must be non-negative.\n" ); // The percentage of the error that the penalty weights should represent double penalty_weight_fraction = penalty_weight; // Fraction with no adjustment double native_penalty_fraction = (double)RpcSolveLMA::NUM_PENALTY_TERMS / (double)normalized_pixels.size(); double penalty_adjustment = penalty_weight_fraction / native_penalty_fraction; // Initialize the RPC model with an affine transform, unless asked to refine only if (!refine_only) initRpcAsAffine(normalized_geodetics, normalized_pixels, line_num, line_den, samp_num, samp_den); // Initialize the model Vector startGuess; startGuess.set_size(RPCModel::NUM_RPC_COEFFS); packCoeffs(line_num, line_den, samp_num, samp_den, startGuess); Vector solution; double norm_error = -1.0; // Initialize a specialized least squares solver object and load the input data RpcSolveLMA lma_model(normalized_geodetics, normalized_pixels, penalty_adjustment); // Use the L-M solver to optimize the RPC model coefficient values. int status = find_solution_from_seed(lma_model, startGuess, normalized_pixels, solution, norm_error); VW_OUT(DebugMessage, "asp") << "Solved RPC coeffs: " << solution << "\n"; VW_OUT(DebugMessage, "asp") << "rpc_gen: norm_error = " << norm_error << "\n"; // If we ever want to improve our results further we should // experiment with multiple starting seeds unpackCoeffs(solution, line_num, line_den, samp_num, samp_den); } // Extract the 3x3 rotation matrix R and 3D translation vector T from a 4x4 ECEF // transformation matrix. void extractRotTrans(vw::Matrix4x4 const& ecef_transform, vw::Matrix3x3& R, vw::Vector3& T) { // Extract the 3x3 rotation submatrix R = submatrix(ecef_transform, 0, 0, 3, 3); // Extract the translation vector from the last column T[0] = ecef_transform(0, 3); T[1] = ecef_transform(1, 3); T[2] = ecef_transform(2, 3); } // Transform a vector of lon-lat-height coordinates in place using a rotation matrix and translation vector void transformLlhVec(std::vector const& llh, vw::Matrix3x3 const& R, vw::Vector3 const& T, vw::cartography::Datum const& datum, std::vector & trans_llh) { // Resize the output trans_llh.resize(llh.size()); // Iterate in i over llh for (size_t i = 0; i < llh.size(); i++) { // Convert from LLH to ECEF XYZ Vector3 xyz = datum.geodetic_to_cartesian(llh[i]); // Apply rotation and translation Vector3 transformed_xyz = R * xyz + T; // Convert back to LLH and store in trans_llh trans_llh[i] = datum.cartesian_to_geodetic(transformed_xyz); } } // Apply a transform to a box in lon-lat-height coordinates void transformLlhBox(vw::Vector3 const& llh_offset_in, Vector3 const& llh_scale_in, vw::Matrix3x3 const& R, vw::Vector3 const& T, vw::cartography::Datum const& datum, // Outputs vw::Vector3& llh_offset_out, vw::Vector3& llh_scale_out) { // First reconstruct the min/max bounds from offset and scale Vector3 llh_min = llh_offset_in - llh_scale_in; Vector3 llh_max = llh_offset_in + llh_scale_in; // Convert min/max to cartesian Vector3 xyz_min = datum.geodetic_to_cartesian(llh_min); Vector3 xyz_max = datum.geodetic_to_cartesian(llh_max); // Apply transform to both points Vector3 xyz_min_trans = R * xyz_min + T; Vector3 xyz_max_trans = R * xyz_max + T; // Convert transformed points back to llh Vector3 llh_min_trans = datum.cartesian_to_geodetic(xyz_min_trans); Vector3 llh_max_trans = datum.cartesian_to_geodetic(xyz_max_trans); // Calculate new offset and scale from transformed min/max llh_offset_out = (llh_max_trans + llh_min_trans) / 2.0; llh_scale_out = (llh_max_trans - llh_min_trans) / 2.0; } // Produce a transformed RPC model asp::RPCModel transformRpc(asp::RPCModel const& rpc_model, vw::Matrix4x4 const& transform, vw::BBox2 const& image_box, double & pixel_err) { // Initialize the output pixel error pixel_err = 0.0; vw::Vector3 llh_offset = rpc_model.lonlatheight_offset(); vw::Vector3 llh_scale = rpc_model.lonlatheight_scale(); vw::Vector2 pixel_offset = rpc_model.xy_offset(); vw::Vector2 pixel_scale = rpc_model.xy_scale(); vw::cartography::Datum datum = rpc_model.datum(); vw::BBox2 lon_lat_range; lon_lat_range.min() = subvector(llh_offset - llh_scale, 0, 2); lon_lat_range.max() = subvector(llh_offset + llh_scale, 0, 2); vw::Vector2 height_range; height_range[0] = llh_offset[2] - llh_scale[2]; height_range[1] = llh_offset[2] + llh_scale[2]; // Generate point pairs and add pixels along image perimeter and diagonals std::vector llh_vec; std::vector pix_vec; vw::CamPtr cam(new asp::RPCModel(rpc_model)); // a copy as required by the api int num_samples = 20; // TODO(oalexan1): Think about this asp::sample_llh_pix_bbox(lon_lat_range, height_range, num_samples, datum, cam, image_box, llh_vec, pix_vec); // outputs asp::add_perimeter_diag_points(image_box, datum, cam, lon_lat_range, height_range, llh_vec, pix_vec); // outputs // Apply the transform to the llh vector and extent vw::Matrix3x3 R; vw::Vector3 T; extractRotTrans(transform, R, T); std::vector llh_vec_trans; transformLlhVec(llh_vec, R, T, datum, llh_vec_trans); vw::Vector3 llh_offset_trans, llh_scale_trans; transformLlhBox(llh_offset, llh_scale, R, T, datum, llh_offset_trans, llh_scale_trans); // outputs // This penalty weight is rather small. In practice it was not a problem. The // input camera should be sampled well and then an overfit should not be a // concern. double penalty_weight = 1e-4; // Form the vectors of transformed normalized llh and pixel values Vector normalized_llh_trans; Vector normalized_pixels; asp::normalizeLlhPix(llh_vec_trans, pix_vec, llh_offset_trans, llh_scale_trans, pixel_offset, pixel_scale, normalized_llh_trans, normalized_pixels); // outputs // Form the transformed RPC model by fitting to the transformed normalized llh asp::RPCModel::CoeffVec line_num, line_den, samp_num, samp_den; line_num = rpc_model.line_num_coeff(); line_den = rpc_model.line_den_coeff(); samp_num = rpc_model.sample_num_coeff(); samp_den = rpc_model.sample_den_coeff(); bool refine_only = true; asp::gen_rpc(penalty_weight, normalized_llh_trans, normalized_pixels, refine_only, line_num, line_den, samp_num, samp_den); // outputs asp::RPCModel rpc_trans(datum, line_num, line_den, samp_num, samp_den, pixel_offset, pixel_scale, llh_offset_trans, llh_scale_trans, rpc_model.m_err_bias, rpc_model.m_err_rand); // Find the error of applying the adjustments inline as opposed to externally for (size_t i = 0; i < llh_vec.size(); i++) { Vector3 llh = llh_vec[i]; Vector3 xyz = datum.geodetic_to_cartesian(llh); Vector3 llh_trans = llh_vec_trans[i]; Vector3 xyz_trans = datum.geodetic_to_cartesian(llh_trans); Vector2 cam_pix1, cam_pix2; try { cam_pix1 = rpc_model.point_to_pixel(xyz); cam_pix2 = rpc_trans.point_to_pixel(xyz_trans); } catch (...) { continue; } pixel_err = std::max(pixel_err, norm_2(cam_pix1 - cam_pix2)); } return rpc_trans; } } // end namespace asp ================================================ FILE: src/asp/Camera/RPCModelGen.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // RPC model generation. See rpc_gen.cc for details. #ifndef __STEREO_CAMERA_RPC_MODEL_GEN_H__ #define __STEREO_CAMERA_RPC_MODEL_GEN_H__ #include #include #include namespace asp { /// Unpack the 78 RPC coefficients from one long vector into four separate vectors. void unpackCoeffs(vw::Vector const& C, RPCModel::CoeffVec& lineNum, RPCModel::CoeffVec& lineDen, RPCModel::CoeffVec& sampNum, RPCModel::CoeffVec& sampDen); /// Pack the 78 RPC coefficients from four separate vectors into one long vector. void packCoeffs(RPCModel::CoeffVec const& lineNum, RPCModel::CoeffVec const& lineDen, RPCModel::CoeffVec const& sampNum, RPCModel::CoeffVec const& sampDen, vw::Vector & C); /// Find the best-fitting RPC coefficients for the camera transform /// mapping a set of normalized geodetics to a set of normalized pixel values. class RpcSolveLMA: public vw::math::LeastSquaresModelBase { /// The normalized values are in the -1 to 1 range. vw::Vector m_normalizedGeodetics; vw::Vector m_normalizedPixels; // Contains the extra penalty terms double m_wt; // The penalty weight, k in the reference paper. public: // For applying penalty weighting per the Hartley paper. static const int NUM_PENALTY_TERMS = 64; typedef vw::Vector result_type; // normalized pixels typedef result_type domain_type; // RPC coefficients typedef vw::Matrix jacobian_type; /// Instantiate the solver with a set of GDC <--> Pixel pairs. RpcSolveLMA(const vw::Vector& normalizedGeodetics, const vw::Vector& normalizedPixels, double penaltyWeight): m_normalizedGeodetics(normalizedGeodetics), m_normalizedPixels(normalizedPixels), m_wt(penaltyWeight) {} // Given a set of RPC coefficients, compute the projected pixels. result_type operator()(domain_type const& C) const; }; /// Print out a name followed by the vector of values void print_vec(std::string const& name, vw::Vector const& vals); /// Dump a vector to a text file, one value per row. void print_vec_to_file(std::string const& path, vw::Vector const& vals); // Form the normalized llh and pixel arrays that will be as inputs to the RPC solver void normalizeLlhPix(std::vector const& all_llh, std::vector const& all_pixels, vw::Vector3 const& llh_offset, vw::Vector3 const& llh_scale, vw::Vector2 const& pixel_offset, vw::Vector2 const& pixel_scale, // Outputs vw::Vector & normalized_llh, vw::Vector & normalized_pixels); int find_solution_from_seed(RpcSolveLMA const& lma_model, vw::Vector const& seed_params, vw::Vector const& actual_observations, vw::Vector & final_params, double & norm_error); // Find the best-fit RPC given the normalized geodetic and pixel values void gen_rpc(// Inputs double penalty_weight, vw::Vector const& normalized_geodetics, vw::Vector const& normalized_pixels, bool refine_only, // Outputs RPCModel::CoeffVec & line_num, RPCModel::CoeffVec & line_den, RPCModel::CoeffVec & samp_num, RPCModel::CoeffVec & samp_den); // Produce a transformed RPC model RPCModel transformRpc(RPCModel const& rpc_model, vw::Matrix4x4 const& transform, vw::BBox2 const& image_box, double & pixel_err); } // end namespace asp #endif //__STEREO_CAMERA_RPC_MODEL_GEN_H__ ================================================ FILE: src/asp/Camera/RPCStereoModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include // TODO(oalexan1): See if to wipe all this code as it is no longer in use. using namespace vw; namespace asp { Vector3 RPCStereoModel::operator()(std::vector const& pixVec, Vector3& errorVec) const { // Note: This is a re-implementation of StereoModel::operator(). int num_cams = m_cameras.size(); VW_ASSERT((int)pixVec.size() == num_cams, vw::ArgumentErr() << "the number of rays must match " << "the number of cameras.\n"); errorVec = Vector3(); try { std::vector camDirs(num_cams), camCtrs(num_cams); std::vector rpc_cams(num_cams); camDirs.clear(); camCtrs.clear(); rpc_cams.clear(); // Pick the valid rays for (int p = 0; p < num_cams; p++){ // Get the RPC pointer so we can call RPC specific functions on it const RPCModel *rpc_cam = dynamic_cast(vw::camera::unadjusted_model(m_cameras[p])); VW_ASSERT(rpc_cam != NULL, vw::ArgumentErr() << "Camera models are not RPC.\n"); rpc_cams.push_back(rpc_cam); Vector2 pix = pixVec[p]; if (pix != pix || // i.e., NaN pix == camera::CameraModel::invalid_pixel() ) continue; // The base class function would call point_and_dir twice, but we only need to call it once! Vector3 ctr, dir; rpc_cam->point_and_dir(pix, ctr, dir); camDirs.push_back(dir); camCtrs.push_back(ctr); } // Not enough valid rays if (camDirs.size() < 2) return Vector3(); if (are_nearly_parallel(m_angle_tol, camDirs)) return Vector3(); // Determine range by triangulation Vector3 result = triangulate_point(camDirs, camCtrs, errorVec); // Reflect points that fall behind one of the two cameras bool reflect = false; for (int p = 0; p < (int)camCtrs.size(); p++) if (dot_prod(result - camCtrs[p], camDirs[p]) < 0 ) reflect = true; if (reflect) result = -result + 2*camCtrs[0]; return result; } catch (const camera::PixelToRayErr& /*e*/) {} return Vector3(); } Vector3 RPCStereoModel::operator()(vw::Vector2 const& pix1, vw::Vector2 const& pix2, double& error ) const { return StereoModel::operator()(pix1, pix2, error); } } // namespace asp ================================================ FILE: src/asp/Camera/RPCStereoModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_CAMERA_RPCSTEREOMODEL_H__ #define __ASP_CAMERA_RPCSTEREOMODEL_H__ #include #include // TODO: Why not just include the file in the .h file? // forward declaration namespace vw { namespace camera { class CameraModel; } } namespace asp { /// Derived StereoModel class implementing the RPC camera model. /// - Using a separate class allows us to get a speed improvement in ray generation. class RPCStereoModel: public vw::stereo::StereoModel { public: //------------------------------------------------------------------ // Constructors / Destructors //------------------------------------------------------------------ RPCStereoModel(std::vector const& cameras, double angle_tol = 0.0): vw::stereo::StereoModel(cameras, angle_tol){} RPCStereoModel(vw::camera::CameraModel const* camera_model1, vw::camera::CameraModel const* camera_model2, double angle_tol = 0.0): vw::stereo::StereoModel(camera_model1, camera_model2, angle_tol){} virtual ~RPCStereoModel() {} //------------------------------------------------------------------ // Public Methods //------------------------------------------------------------------ // Note: This is a re-implementation of StereoModel::operator(). virtual vw::Vector3 operator()(std::vector const& pixVec, vw::Vector3& errorVec ) const; virtual vw::Vector3 operator()(vw::Vector2 const& pix1, vw::Vector2 const& pix2, double& error) const; }; } // namespace asp #endif // __ASP_CAMERA_RPCSTEREOMODEL_H__ ================================================ FILE: src/asp/Camera/RPC_XML.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include // for ArgumentErr, vw_throw, etc #include // for Quat, Quaternion #include // for Vector, Vector3, Vector4, etc #include // for Datum #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::cartography; using namespace xercesc; namespace fs=boost::filesystem; using asp::XmlUtils::get_node; using asp::XmlUtils::cast_xmlch; using asp::XmlUtils::parseDoublesFromXmlBlock; //======================================================================== // ImageXML class void asp::ImageXML::parse_meta(xercesc::DOMElement* node) { // Note: dg_mosaic wipes most image tags. If it is desired to parse // more tags here, ensure they are not wiped by dg_mosaic and use // sensible values when creating them for the combined mosaics. cast_xmlch(get_node(node, "SATID")->getTextContent(), sat_id); cast_xmlch(get_node(node, "SCANDIRECTION")->getTextContent(), scan_direction); cast_xmlch(get_node(node, "TLCTIME")->getTextContent(), tlc_start_time); cast_xmlch(get_node(node, "FIRSTLINETIME")->getTextContent(), first_line_start_time); cast_xmlch(get_node(node, "AVGLINERATE")->getTextContent(), avg_line_rate); size_t num_tlc; cast_xmlch(get_node(node, "NUMTLC")->getTextContent(), num_tlc); tlc_vec.resize(num_tlc); } void asp::ImageXML::parse_band_tdi(xercesc::DOMElement* node, int & out_tdi) { cast_xmlch(get_node(node, "TDILEVEL")->getTextContent(), out_tdi); } void asp::ImageXML::parse_tlc_list(xercesc::DOMElement* node) { DOMNodeList* children = node->getChildNodes(); size_t count = 0; for (XMLSize_t i = 0; i < children->getLength(); i++) { if (children->item(i)->getNodeType() == DOMNode::ELEMENT_NODE) { DOMElement* element = dynamic_cast(children->item(i)); std::string buffer; cast_xmlch(element->getTextContent(), buffer); std::istringstream istr(buffer); istr >> tlc_vec[count].first >> tlc_vec[count].second; count++; } } VW_ASSERT(count == tlc_vec.size(), IOErr() << "Read incorrect number of TLC."); } // A local auxiliary function to parse an XML tag with given prefix // and index. Note that the indices starts from 0, while the tags // start from 1, so an offset is necessary. namespace { void parse_index(DOMElement* model, std::string const& prefix, size_t index, Vector &vals) { if (index >= vals.size()) vw_throw(ArgumentErr() << "Out of range when parsing XML file."); std::ostringstream os; os << prefix << index + 1; std::string field = os.str(); cast_xmlch(get_node(model, field.c_str())->getTextContent(), vals[index]); } } void asp::ImageXML::parse_image_size(xercesc::DOMElement* node) { cast_xmlch(get_node(node, "NUMROWS")->getTextContent(), image_size[1]); cast_xmlch(get_node(node, "NUMCOLUMNS")->getTextContent(), image_size[0]); } asp::ImageXML::ImageXML() : BitChecker(4) {} void asp::ImageXML::parse(xercesc::DOMElement* node) { DOMElement* image = get_node(node, "IMAGE"); parse_meta(image); check_argument(0); cast_xmlch(get_node(node, "BANDID")->getTextContent(), band_id); generation_time = ""; try { cast_xmlch(get_node(node, "GENERATIONTIME")->getTextContent(), generation_time); } catch (...) { // generation_time may not exist } image_descriptor = ""; try { cast_xmlch(get_node(node, "IMAGEDESCRIPTOR")->getTextContent(), image_descriptor); } catch (...) { // image_descriptor may not exist } // Multispectral or panchromatic, or maybe MS1 or something else //if (band_id != "P" && band_id != "Multi" && band_id != "MS1") // vw_throw(ArgumentErr() << "Expecting BANDID in the XML file to be 'P', 'Multi', or 'MS1'.\n"); tdi = 0; try { if (band_id == "P") { DOMElement* band = get_node(node, "BAND_P"); parse_band_tdi(band, tdi); } else if (band_id == "Multi") { // Multispectral const int num_bands = 8; const char * bands[num_bands] = {"BAND_C", "BAND_B", "BAND_G", "BAND_Y", "BAND_R", "BAND_RE", "BAND_N", "BAND_N2"}; tdi_multi.resize(num_bands); for (int it = 0; it < num_bands; it++) { DOMElement* band = get_node(node, bands[it]); parse_band_tdi(band, tdi_multi[it]); } } } catch(...) { // An XML file after being processed by dg_mosaic may not have the tdi field. } check_argument(1); parse_tlc_list(get_node(image, "TLCLISTList")); check_argument(2); parse_image_size(node); check_argument(3); } //======================================================================== // GeometricXML class void asp::GeometricXML::parse_principal_distance(xercesc::DOMElement* node) { cast_xmlch(get_node(node, "PD")->getTextContent(), principal_distance); } void asp::GeometricXML::parse_optical_distortion(xercesc::DOMElement* node) { cast_xmlch(get_node(node, "POLYORDER")->getTextContent(), optical_polyorder); // If the optical polyorder is >= 1 and some of the polynomial // coefficients are non-zero, then throw an error as we did not // implement optical distortion. if (optical_polyorder <= 0) return; // it actually can be negative std::string list_list_types[] = {"ALISTList", "BLISTList"}; for (unsigned ls = 0; ls < sizeof(list_list_types)/sizeof(std::string); ls++) { std::string list_list_type = list_list_types[ls]; DOMElement* list_list = get_node(node, list_list_type); if (list_list == NULL) return; DOMNodeList* children = list_list->getChildNodes(); if (children == NULL) return; for (XMLSize_t i = 0; i < children->getLength(); i++) { DOMNode* current = children->item(i); if (current->getNodeType() != DOMNode::ELEMENT_NODE) continue; DOMElement* element = dynamic_cast< xercesc::DOMElement* >(current); std::string buffer; cast_xmlch(element->getTextContent(), buffer); std::istringstream istr(buffer); double val; while (istr >> val) { if (val != 0) vw_throw(NoImplErr() << "Optical distortion is not implemented.\n"); } } } } void asp::GeometricXML::parse_perspective_center(xercesc::DOMElement* node) { cast_xmlch(get_node(node, "CX")->getTextContent(), perspective_center[0]); cast_xmlch(get_node(node, "CY")->getTextContent(), perspective_center[1]); cast_xmlch(get_node(node, "CZ")->getTextContent(), perspective_center[2]); } void asp::GeometricXML::parse_camera_attitude(xercesc::DOMElement* node) { Vector4 buffer; // We buffer since Q will want to constantly renormalize itself. cast_xmlch(get_node(node, "QCS4")->getTextContent(), buffer[0]); cast_xmlch(get_node(node, "QCS1")->getTextContent(), buffer[1]); cast_xmlch(get_node(node, "QCS2")->getTextContent(), buffer[2]); cast_xmlch(get_node(node, "QCS3")->getTextContent(), buffer[3]); camera_attitude = Quat(buffer[0],buffer[1],buffer[2],buffer[3]); } void asp::GeometricXML::parse_detector_mounting(xercesc::DOMElement* node) { DOMNodeList* children = node->getChildNodes(); // Read through all the bands, storing their data std::vector bandVec; for (XMLSize_t i = 0; i < children->getLength(); i++) { DOMNode* current = children->item(i); if (current->getNodeType() == DOMNode::ELEMENT_NODE) { DOMElement* element = dynamic_cast< DOMElement* > (current); std::string tag(XMLString::transcode(element->getTagName())); if (boost::starts_with(tag, "BAND_")) { Vector4 data; DOMElement* detector = get_node(element, "DETECTOR_ARRAY"); cast_xmlch(get_node(detector,"DETORIGINX")->getTextContent(), data[0]); cast_xmlch(get_node(detector,"DETORIGINY")->getTextContent(), data[1]); cast_xmlch(get_node(detector,"DETROTANGLE")->getTextContent(), data[2]); cast_xmlch(get_node(detector,"DETPITCH")->getTextContent(), data[3]); bandVec.push_back(data); } } } if (bandVec.empty()) { vw_throw(ArgumentErr() << "Could not find any bands in the " << "DETECTOR_MOUNTING section of the XML file.\n"); } // If there are multiple bands, they must have the same values for (int i = 1; i < (int)bandVec.size(); i++) { if (bandVec[0] != bandVec[i]) { vw_throw(ArgumentErr() << "XML files with multiple and " << "distinct detector arrays in the DETECTOR_MOUNTING " << "section of the XML file are not supported.\n"); } } Vector4 data = bandVec[0]; detector_origin[0] = data[0]; detector_origin[1] = data[1]; detector_rotation = data[2]; detector_pixel_pitch = data[3]; } asp::GeometricXML::GeometricXML() : BitChecker(5) {} void asp::GeometricXML::parse(xercesc::DOMElement* node) { DOMNodeList* children = node->getChildNodes(); const XMLSize_t nodeCount = children->getLength(); for (XMLSize_t i = 0; i < nodeCount; i++) { DOMNode* current = children->item(i); if (current->getNodeType() == DOMNode::ELEMENT_NODE) { DOMElement* element = dynamic_cast< xercesc::DOMElement* >(current); std::string tag(XMLString::transcode(element->getTagName())); if (tag == "PRINCIPAL_DISTANCE") { parse_principal_distance(element); check_argument(0); } else if (tag == "OPTICAL_DISTORTION") { parse_optical_distortion(element); check_argument(1); } else if (tag == "PERSPECTIVE_CENTER") { parse_perspective_center(element); check_argument(2); } else if (tag == "CAMERA_ATTITUDE") { parse_camera_attitude(element); check_argument(3); } else if (tag == "DETECTOR_MOUNTING") { parse_detector_mounting(element); check_argument(4); } } } } void asp::GeometricXML::printDebugInfo() const { vw_out() << "GeometricXML DEBUG INFO" << std::endl; vw_out() << "principle distance = " << principal_distance << std::endl; vw_out() << "optical polyorder = " << optical_polyorder << std::endl; vw_out() << "optical_a = " << optical_a << std::endl; vw_out() << "optical_b = " << optical_b << std::endl; vw_out() << "perspective_center = " << perspective_center << std::endl; vw_out() << "camera_attitude = " << camera_attitude << std::endl; vw_out() << "detector origin = " << detector_origin << std::endl; vw_out() << "detector rotation = " << detector_rotation << std::endl; vw_out() << "detector pixel pitch = " << detector_pixel_pitch << std::endl; } //======================================================================== // EphemerisXML class void asp::EphemerisXML::parse_meta(xercesc::DOMElement* node) { cast_xmlch(get_node(node, "STARTTIME")->getTextContent(), start_time); cast_xmlch(get_node(node, "TIMEINTERVAL")->getTextContent(), time_interval); size_t num_points; cast_xmlch(get_node(node, "NUMPOINTS")->getTextContent(), num_points); satellite_position_vec.resize(num_points); velocity_vec.resize(num_points); satellite_pos_cov.resize(6 * num_points); // see RPC_XML.h } void asp::EphemerisXML::parse_eph_list(std::string const& rawXml) { // Each EPHEMLIST entry has 13 doubles: index, pos[3], vel[3], cov[6] std::vector values; parseDoublesFromXmlBlock(rawXml, "", "", values); size_t numExpected = satellite_position_vec.size(); size_t valsPerEntry = 13; if (values.size() != numExpected * valsPerEntry) vw_throw(IOErr() << "Expected " << numExpected * valsPerEntry << " ephemeris values, got " << values.size() << ".\n"); for (size_t i = 0; i < numExpected; i++) { const double* v = &values[i * valsPerEntry]; size_t index = size_t(v[0] + 0.5) - 1; satellite_position_vec[index][0] = v[1]; satellite_position_vec[index][1] = v[2]; satellite_position_vec[index][2] = v[3]; velocity_vec[index][0] = v[4]; velocity_vec[index][1] = v[5]; velocity_vec[index][2] = v[6]; for (int j = 0; j < 6; j++) satellite_pos_cov[6 * index + j] = v[7 + j]; } } asp::EphemerisXML::EphemerisXML() : BitChecker(2) {} void asp::EphemerisXML::parse(xercesc::DOMElement* node, std::string const& rawXml) { parse_meta(node); check_argument(0); parse_eph_list(rawXml); check_argument(1); } //======================================================================== // AttitudeXML class void asp::AttitudeXML::parse_meta(xercesc::DOMElement* node) { cast_xmlch(get_node(node, "STARTTIME")->getTextContent(), start_time); cast_xmlch(get_node(node, "TIMEINTERVAL")->getTextContent(), time_interval); size_t num_points; cast_xmlch(get_node(node, "NUMPOINTS")->getTextContent(), num_points); satellite_quat_vec.resize(num_points); satellite_quat_cov.resize(10 * num_points); // see RPC_XML.h } void asp::AttitudeXML::parse_att_list(std::string const& rawXml) { // Each ATTLIST entry has 15 doubles: index, quat[4], cov[10] std::vector values; parseDoublesFromXmlBlock(rawXml, "", "", values); size_t numExpected = satellite_quat_vec.size(); size_t valsPerEntry = 15; if (values.size() != numExpected * valsPerEntry) vw_throw(IOErr() << "Expected " << numExpected * valsPerEntry << " attitude values, got " << values.size() << ".\n"); for (size_t i = 0; i < numExpected; i++) { const double* v = &values[i * valsPerEntry]; size_t index = size_t(v[0] + 0.5) - 1; for (int j = 0; j < 4; j++) satellite_quat_vec[index][j] = v[1 + j]; for (int j = 0; j < 10; j++) satellite_quat_cov[10 * index + j] = v[5 + j]; } } asp::AttitudeXML::AttitudeXML() : BitChecker(2) {} void asp::AttitudeXML::parse(xercesc::DOMElement* node, std::string const& rawXml) { parse_meta(node); check_argument(0); parse_att_list(rawXml); check_argument(1); } //======================================================================== // RPCXML class void asp::RPCXML::parse_vector(xercesc::DOMElement* node, Vector& vec) { std::string buffer; cast_xmlch(node->getTextContent(), buffer); std::istringstream istr(buffer); istr >> vec[0] >> vec[1] >> vec[2] >> vec[3] >> vec[4] >> vec[5] >> vec[6] >> vec[7] >> vec[8] >> vec[9] >> vec[10] >> vec[11] >> vec[12] >> vec[13] >> vec[14] >> vec[15] >> vec[16] >> vec[17] >> vec[18] >> vec[19]; } asp::RPCXML::RPCXML() : BitChecker(2) {} void asp::RPCXML::read_from_file(std::string const& name) { boost::shared_ptr parser(new XercesDOMParser()); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); boost::shared_ptr errHandler(new HandlerBase()); parser->setErrorHandler(errHandler.get()); DOMDocument* xmlDoc; DOMElement* elementRoot; try { parser->parse(name.c_str()); xmlDoc = parser->getDocument(); elementRoot = xmlDoc->getDocumentElement(); } catch (...) { vw_throw(ArgumentErr() << "XML file: " << name << " is invalid.\n"); } // Try to parse the bounding box but keep going if we fail. try { parse_bbox(elementRoot); } catch (...) { } try { parse_rpb(elementRoot); return; } catch (vw::IOErr const& e) { // Possibly RPB doesn't exist } try { // Pleiades/Astrium/SPOT 6/7 RPC DOMElement* model = get_node(elementRoot, "Rational_Function_Model"); // Check the sensor name to determine pixel origin convention. // SPOT 6/7 RPCs use 0-based offsets, Pleiades uses 1-based. bool is_spot67 = false; try { DOMElement* metadata_id = get_node(elementRoot, "Metadata_Identification"); DOMElement* profile = get_node(metadata_id, "METADATA_PROFILE"); std::string sensor = XMLString::transcode(profile->getTextContent()); is_spot67 = (sensor == "S6_SENSOR" || sensor == "S7_SENSOR"); } catch (...) {} parse_rational_function_model(model, is_spot67); return; } catch (vw::IOErr const& e) { // Possibly Rational_Function_Model doesn't work } try { // Perusat 1 RPC parse_perusat_model(elementRoot); return; } catch (vw::IOErr const& e) { // No luck } vw_throw(vw::NotFoundErr() << "Couldn't find RPB or Rational_Function_Model tag inside XML file."); } void asp::RPCXML::parse_bbox(xercesc::DOMElement* root_node) { // Now read the bounding box DOMElement* imd_node = get_node(root_node, "IMD"); DOMElement* bbox_node; try { bbox_node = get_node(imd_node, "BAND_P"); } catch (...) { // Try one more channel if we can't find BAND_P bbox_node = get_node(imd_node, "BAND_R"); } // Start by initializing the box with the first point Vector3 point; cast_xmlch(get_node(bbox_node, "ULLON")->getTextContent(), point.x()); cast_xmlch(get_node(bbox_node, "ULLAT")->getTextContent(), point.y()); cast_xmlch(get_node(bbox_node, "ULHAE")->getTextContent(), point.z()); m_lat_lon_height_box.min() = point; m_lat_lon_height_box.max() = point; //VW_OUT(vw::DebugMessage, "asp") << "RPCXML: point = " << point<< std::endl; // Expand to contain the other points cast_xmlch(get_node(bbox_node, "URLON")->getTextContent(), point.x()); cast_xmlch(get_node(bbox_node, "URLAT")->getTextContent(), point.y()); cast_xmlch(get_node(bbox_node, "URHAE")->getTextContent(), point.z()); m_lat_lon_height_box.grow(point); //VW_OUT(vw::DebugMessage, "asp") << "RPCXML: point = " << point<< std::endl; cast_xmlch(get_node(bbox_node, "LLLON")->getTextContent(), point.x()); cast_xmlch(get_node(bbox_node, "LLLAT")->getTextContent(), point.y()); cast_xmlch(get_node(bbox_node, "LLHAE")->getTextContent(), point.z()); m_lat_lon_height_box.grow(point); //VW_OUT(vw::DebugMessage, "asp") << "RPCXML: point = " << point<< std::endl; cast_xmlch(get_node(bbox_node, "LRLON")->getTextContent(), point.x()); cast_xmlch(get_node(bbox_node, "LRLAT")->getTextContent(), point.y()); cast_xmlch(get_node(bbox_node, "LRHAE")->getTextContent(), point.z()); m_lat_lon_height_box.grow(point); //VW_OUT(vw::DebugMessage, "asp") << "RPCXML: point = " << point<< std::endl; } double asp::RPCXML::parse_terrain_height(xercesc::DOMElement* root_node) { double terrain_height = std::numeric_limits::quiet_NaN(); DOMElement* imd_node = get_node(root_node, "IMD"); std::string image_descriptor; try { cast_xmlch(get_node(imd_node, "IMAGEDESCRIPTOR")->getTextContent(), image_descriptor); } catch (...) { // image_descriptor may not exist return terrain_height; } // Descriptor must equal "ORStandard2A" for the terrain height to be valid if (boost::to_lower_copy(image_descriptor) != boost::to_lower_copy(std::string("ORStandard2A"))) return terrain_height; // Get the MAP_PROJECTED_PRODUCT node DOMElement* map_projected_product_node = NULL; try { map_projected_product_node = get_node(imd_node, "MAP_PROJECTED_PRODUCT"); // Get the TERRAINHAE field cast_xmlch(get_node(map_projected_product_node, "TERRAINHAE")->getTextContent(), terrain_height); } catch (...) { // MAP_PROJECTED_PRODUCT may not exist return terrain_height; } return terrain_height; } // Parse the RPB node. Used for DG XML files. void asp::RPCXML::parse_rpb(xercesc::DOMElement* root) { // Try to parse the terrain height, but keep going if we fail. double terrain_height = std::numeric_limits::quiet_NaN(); try { terrain_height = parse_terrain_height(root); } catch (...) { } // Parse rpb DOMElement* rpb = get_node(root, "RPB"); DOMElement* image = get_node(rpb, "IMAGE"); // Pieces that will go into the RPC Model Vector line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff; Vector2 xy_offset, xy_scale; Vector3 geodetic_offset, geodetic_scale; std::string rpc_datum_wkt; // Painfully extract from the XML cast_xmlch(get_node(image, "SAMPOFFSET")->getTextContent(), xy_offset.x()); cast_xmlch(get_node(image, "LINEOFFSET")->getTextContent(), xy_offset.y()); cast_xmlch(get_node(image, "SAMPSCALE")->getTextContent(), xy_scale.x()); cast_xmlch(get_node(image, "LINESCALE")->getTextContent(), xy_scale.y()); cast_xmlch(get_node(image, "LONGOFFSET")->getTextContent(), geodetic_offset.x()); cast_xmlch(get_node(image, "LATOFFSET")->getTextContent(), geodetic_offset.y()); cast_xmlch(get_node(image, "HEIGHTOFFSET")->getTextContent(), geodetic_offset.z()); cast_xmlch(get_node(image, "LONGSCALE")->getTextContent(), geodetic_scale.x()); cast_xmlch(get_node(image, "LATSCALE")->getTextContent(), geodetic_scale.y()); cast_xmlch(get_node(image, "HEIGHTSCALE")->getTextContent(), geodetic_scale.z()); check_argument(0); parse_vector(get_node(get_node(image, "LINENUMCOEFList"), "LINENUMCOEF"), line_num_coeff); parse_vector(get_node(get_node(image, "LINEDENCOEFList"), "LINEDENCOEF"), line_den_coeff); parse_vector(get_node(get_node(image, "SAMPNUMCOEFList"), "SAMPNUMCOEF"), samp_num_coeff); parse_vector(get_node(get_node(image, "SAMPDENCOEFList"), "SAMPDENCOEF"), samp_den_coeff); check_argument(1); // These are only used for covariance propagation double err_bias = 0.0; try { cast_xmlch(get_node(image, "ERRBIAS")->getTextContent(), err_bias); } catch(...) { err_bias = 0.0; } double err_rand = 0.0; try { cast_xmlch(get_node(image, "ERRRAND")->getTextContent(), err_rand); } catch(...) { err_rand = 0.0; } // The RPC_DATUM field is only written by cam2rpc try { // For backward compatibility cast_xmlch(get_node(image, "CAM2RPC_DATUM")->getTextContent(), rpc_datum_wkt); } catch(...) { } try { // Latest convention cast_xmlch(get_node(image, "RPC_DATUM")->getTextContent(), rpc_datum_wkt); } catch(...) { } // Push into the RPC Model so that it is easier to work with. // // The choice of using the WGS_1984 datum comes from Digital Globe's // QuickBird Imagery Products Guide. Section 11.1 makes a blanket // statement that all heights are meters against this ellipsoid. // If the RPC model was generated with cam2rpc, use the datum that // tool set. vw::cartography::Datum datum; if (rpc_datum_wkt == "") { datum = vw::cartography::Datum("WGS_1984"); } else { vw::cartography::GeoReference georef; georef.set_wkt(rpc_datum_wkt); datum = georef.datum(); } m_rpc = boost::make_shared(datum, line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff, xy_offset, xy_scale, geodetic_offset, geodetic_scale, err_bias, err_rand, terrain_height); } // Pleiades/Astrium RPC void asp::RPCXML::parse_rational_function_model(xercesc::DOMElement* node, bool is_spot67) { DOMElement* inverse_model; try { inverse_model = get_node(node, "Inverse_Model"); } catch (...) { // For some models, need to get Global_RFM first DOMElement* global_model = get_node(node, "Global_RFM"); inverse_model = get_node(global_model, "Inverse_Model"); } // Get the RFM validity node DOMElement* rfm_validity; try { rfm_validity = get_node(node, "RFM_Validity"); } catch (...) { // For some models, need to get Global_RFM first DOMElement* global_model = get_node(node, "Global_RFM"); rfm_validity = get_node(global_model, "RFM_Validity"); } // Pieces that will go into the RPC Model Vector line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff; Vector2 xy_offset, xy_scale; Vector3 geodetic_offset, geodetic_scale; // Parse 80 numbers that are the RPC coefficients for (size_t i = 0; i < samp_num_coeff.size(); i++) parse_index(inverse_model, "SAMP_NUM_COEFF_", i, samp_num_coeff); for (size_t i = 0; i < samp_den_coeff.size(); i++) parse_index(inverse_model, "SAMP_DEN_COEFF_", i, samp_den_coeff); for (size_t i = 0; i < line_num_coeff.size(); i++) parse_index(inverse_model, "LINE_NUM_COEFF_", i, line_num_coeff); for (size_t i = 0; i < line_den_coeff.size(); i++) parse_index(inverse_model, "LINE_DEN_COEFF_", i, line_den_coeff); cast_xmlch(get_node(rfm_validity, "LONG_SCALE")->getTextContent(), geodetic_scale.x()); cast_xmlch(get_node(rfm_validity, "LAT_SCALE")->getTextContent(), geodetic_scale.y()); cast_xmlch(get_node(rfm_validity, "HEIGHT_SCALE")->getTextContent(), geodetic_scale.z()); cast_xmlch(get_node(rfm_validity, "LONG_OFF")->getTextContent(), geodetic_offset.x()); cast_xmlch(get_node(rfm_validity, "LAT_OFF")->getTextContent(), geodetic_offset.y()); cast_xmlch(get_node(rfm_validity, "HEIGHT_OFF")->getTextContent(), geodetic_offset.z()); cast_xmlch(get_node(rfm_validity, "SAMP_SCALE")->getTextContent(), xy_scale.x()); cast_xmlch(get_node(rfm_validity, "LINE_SCALE")->getTextContent(), xy_scale.y()); cast_xmlch(get_node(rfm_validity, "SAMP_OFF")->getTextContent(), xy_offset.x()); cast_xmlch(get_node(rfm_validity, "LINE_OFF")->getTextContent(), xy_offset.y()); // Pleiades RPCs use 1-based pixel offsets (SAMP_OFF = (N+1)/2), so // subtract (1,1) to convert to 0-based. SPOT 6/7 RPCs already use // 0-based offsets (SAMP_OFF = N/2), so no subtraction is needed. // See the SPOT 6/7 user guide (Appendix C.2.1, "first column index is 0") // and the Pleiades user guide (page 76, ref col/row = 1). if (!is_spot67) xy_offset -= Vector2i(1, 1); // No Earth example is known where the datum is anything but WGS_1984. m_rpc = boost::make_shared(cartography::Datum("WGS_1984"), line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff, xy_offset, xy_scale, geodetic_offset, geodetic_scale); } void asp::RPCXML::parse_perusat_model(xercesc::DOMElement* node) { DOMElement* inverse_model = get_node(node, "Inverse_Model"); // Inverse model // takes ground to image. DOMElement* validity = get_node(node, "Validity"); // Pieces that will go into the RPC Model Vector line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff; Vector2 xy_offset, xy_scale; Vector3 geodetic_offset, geodetic_scale; // Parse 80 numbers that are the RPC coefficients for (size_t i = 0; i < samp_num_coeff.size(); i++) parse_index(inverse_model, "COL_NUM_COEFF_", i, samp_num_coeff); for (size_t i = 0; i < samp_den_coeff.size(); i++) parse_index(inverse_model, "COL_DEN_COEFF_", i, samp_den_coeff); for (size_t i = 0; i < line_num_coeff.size(); i++) parse_index(inverse_model, "ROW_NUM_COEFF_", i, line_num_coeff); for (size_t i = 0; i < line_den_coeff.size(); i++) parse_index(inverse_model, "ROW_DEN_COEFF_", i, line_den_coeff); cast_xmlch(get_node(validity, "LON_SCALE")->getTextContent(), geodetic_scale.x()); cast_xmlch(get_node(validity, "LAT_SCALE")->getTextContent(), geodetic_scale.y()); cast_xmlch(get_node(validity, "HEIGHT_SCALE")->getTextContent(), geodetic_scale.z()); cast_xmlch(get_node(validity, "LON_OFF")->getTextContent(), geodetic_offset.x()); cast_xmlch(get_node(validity, "LAT_OFF")->getTextContent(), geodetic_offset.y()); cast_xmlch(get_node(validity, "HEIGHT_OFF")->getTextContent(), geodetic_offset.z()); cast_xmlch(get_node(validity, "COL_SCALE")->getTextContent(), xy_scale.x()); cast_xmlch(get_node(validity, "ROW_SCALE")->getTextContent(), xy_scale.y()); cast_xmlch(get_node(validity, "COL_OFF")->getTextContent(), xy_offset.x()); cast_xmlch(get_node(validity, "ROW_OFF")->getTextContent(), xy_offset.y()); // The PeruSAT RPC docs do not say anywhere if the columns and rows // start from 1 or from 0. Note however, that in the RPC XML file // one has: // 10280 // 10280 // and that there are 20560 = 2 * 10280 columns. Since per their // doc, normalization is done as: // (col - COL_OFF) / COL_SCALE // it seems to make sense that their columns and rows start from 1, // so the scaled last column is 1.0. // Also, in their doc for the exact model it says: // "colref es la columna de referencia que para el satellite // PeruSAT-1 adopta un valor de 1", which seems to confirm that, // though that is in a different context. // Since in ASP columns and rows start from 0, here subtract 1. // In practice subtracting 1 or not makes very little difference // in the resulting DEM or intersection error. // Their RPC file also has: // 0 // 20560 // and one of these must be wrong given the total number of columns. xy_offset -= Vector2i(1,1); // Per "PP137 AO1-P04: Modelamiento Geometrico Orbital para // imagenes PeruSAT-1", the datum is WGS_1984. m_rpc = boost::make_shared(cartography::Datum("WGS_1984"), line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff, xy_offset, xy_scale, geodetic_offset, geodetic_scale); } // Helper functions to allow us to fill the objects void asp::read_xml(std::string const& filename, GeometricXML& geo, AttitudeXML& att, EphemerisXML& eph, ImageXML& img, RPCXML& rpc) { // Check if the file actually exists and throw a user helpful file. if (!fs::exists(filename)) vw_throw(ArgumentErr() << "XML file \"" << filename << "\" does not exist."); // Read entire file into a string for fast ephemeris/attitude parsing std::string rawXml; { std::ifstream ifs(filename.c_str(), std::ios::binary | std::ios::ate); if (!ifs) vw_throw(ArgumentErr() << "Cannot open XML file: " << filename << "\n"); std::streamsize size = ifs.tellg(); ifs.seekg(0, std::ios::beg); rawXml.resize(size); ifs.read(&rawXml[0], size); } try { boost::shared_ptr parser(new XercesDOMParser()); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); boost::shared_ptr errHandler(new HandlerBase()); parser->setErrorHandler(errHandler.get()); parser->parse(filename.c_str()); DOMDocument* xmlDoc = parser->getDocument(); DOMElement* elementRoot = xmlDoc->getDocumentElement(); try { // This is optional information, not present in all XML files. rpc.parse_bbox(elementRoot); // Load the bounding box information. } catch(...) {} DOMNodeList* children = elementRoot->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { DOMNode* curr_node = children->item(i); if (curr_node->getNodeType() == DOMNode::ELEMENT_NODE) { DOMElement* curr_element = dynamic_cast(curr_node); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag == "GEO") geo.parse(curr_element); else if (tag == "EPH") eph.parse(curr_element, rawXml); else if (tag == "ATT") att.parse(curr_element, rawXml); else if (tag == "IMD") img.parse(curr_element); else if (tag == "RPB") rpc.parse(elementRoot); // must go to the parent } } } catch (const std::exception& e) { vw_throw(ArgumentErr() << e.what() << " XML file:" << filename << " is invalid.\n"); } } vw::Vector2i asp::xml_image_size(std::string const& filename) { GeometricXML geo; AttitudeXML att; EphemerisXML eph; ImageXML img; RPCXML rpc; read_xml(filename, geo, att, eph, img, rpc); return img.image_size; } asp::RPCModel* asp::RPCXML::rpc_ptr() const { VW_ASSERT(m_rpc.get(), LogicErr() << "read_from_file or parse needs to be called first before an RPCModel is ready"); return m_rpc.get(); } vw::BBox3 asp::RPCXML::get_lon_lat_height_box() const { return m_lat_lon_height_box; } bool asp::read_WV_XML_corners(std::string const& xml_path, std::vector &pixel_corners, std::vector &lonlat_corners) { // Open and initialize the document boost::shared_ptr parser(new XercesDOMParser()); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); boost::shared_ptr errHandler(new HandlerBase()); parser->setErrorHandler(errHandler.get()); parser->parse(xml_path.c_str()); DOMDocument* xmlDoc = parser->getDocument(); DOMElement * elementRoot = xmlDoc->getDocumentElement(); const size_t NUM_CORNERS = 4; const size_t TOP_LEFT = 0; const size_t TOP_RIGHT = 1; const size_t BOT_RIGHT = 2; const size_t BOT_LEFT = 3; pixel_corners.resize(NUM_CORNERS); lonlat_corners.resize(NUM_CORNERS); // Find the IMD node DOMElement *imd_node = XmlUtils::get_node(elementRoot, "IMD"); if (!imd_node) return false; // Get the image size double num_rows, num_cols; XmlUtils::cast_xmlch(XmlUtils::get_node(imd_node, "NUMROWS")->getTextContent(), num_rows); XmlUtils::cast_xmlch(XmlUtils::get_node(imd_node, "NUMCOLUMNS")->getTextContent(), num_cols); // Set the pixel corners pixel_corners[TOP_LEFT ].x() = 0.5; pixel_corners[TOP_LEFT ].y() = 0.5; pixel_corners[TOP_RIGHT].x() = num_cols - 0.5; pixel_corners[TOP_RIGHT].y() = 0.5; pixel_corners[BOT_RIGHT].x() = num_cols - 0.5; pixel_corners[BOT_RIGHT].y() = num_rows - 0.5; pixel_corners[BOT_LEFT ].x() = 0.5; pixel_corners[BOT_LEFT ].y() = num_rows - 0.5; // Look through its children for a band name DOMNodeList* children = imd_node->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* curr_node = children->item(i); if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Look for the BAND_X node DOMElement* curr_element = dynamic_cast(curr_node); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("BAND_") == std::string::npos) continue; // We found the band node, now parse the child nodes XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "ULLON")->getTextContent(), lonlat_corners[TOP_LEFT ].x()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "ULLAT")->getTextContent(), lonlat_corners[TOP_LEFT ].y()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "URLON")->getTextContent(), lonlat_corners[TOP_RIGHT].x()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "URLAT")->getTextContent(), lonlat_corners[TOP_RIGHT].y()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "LRLON")->getTextContent(), lonlat_corners[BOT_RIGHT].x()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "LRLAT")->getTextContent(), lonlat_corners[BOT_RIGHT].y()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "LLLON")->getTextContent(), lonlat_corners[BOT_LEFT ].x()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "LLLAT")->getTextContent(), lonlat_corners[BOT_LEFT ].y()); return true; // Finished! } // End loop through top level children // Only make it here if we failed to find the corner information! return false; } bool asp::approximate_wv_georeference(std::string const& wv_xml_path, GeoReference & approx_georef) { // Find the four corners in the XML file std::vector pixel_corners, lonlat_corners; if (!asp::read_WV_XML_corners(wv_xml_path, pixel_corners, lonlat_corners)) return false; // Convert the corners into homogenous coordinates so that the fitter will accept them. const size_t NUM_CORNERS = 4; std::vector pixel_corners3 (NUM_CORNERS), lonlat_corners3(NUM_CORNERS); for (size_t i = 0; i < NUM_CORNERS; i++) { pixel_corners3[i].x() = pixel_corners[i].x(); pixel_corners3[i].y() = pixel_corners[i].y(); pixel_corners3[i].z() = 1.0; lonlat_corners3[i].x() = lonlat_corners[i].x(); lonlat_corners3[i].y() = lonlat_corners[i].y(); lonlat_corners3[i].z() = 1.0; } // Compute the perspective transform // - To bad this does not give an indication of fit quality vw::math::HomographyFittingFunctor fitter; Matrix transform = fitter(pixel_corners3, lonlat_corners3); // Construct the approximated GeoReference approx_georef.set_geographic(); // Set to 'lonlat' projection approx_georef.set_transform(transform); vw::vw_out() << "Computed approximate transform: \n" << transform << "\n"; return true; } bool asp::read_wv_georeference(GeoReference &georef, std::string const &image_path, std::string const &xml_path) { // Try to read the georeference from the image file DiskImageResourceGDAL rsrc(image_path); if (read_georeference(georef, rsrc)) return true; vw::vw_out() << "Read georeference from xml file: " << xml_path << "\n"; // TODO: Should this verify that the image size is correct? // If that failed, try approximating from the XML file. xercesc::XMLPlatformUtils::Initialize(); bool result = approximate_wv_georeference(xml_path, georef); xercesc::XMLPlatformUtils::Terminate(); return result; } ================================================ FILE: src/asp/Camera/RPC_XML.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // These are objects that relate directly to block in XML that we need // to read. They only read and then store the raw values. Other // objects will interpret the results. #ifndef __STEREO_CAMERA_RPC_XML_H__ #define __STEREO_CAMERA_RPC_XML_H__ #include #include #include #include #include #include #include #include #include #include #include // Special forward declare so we can hide the Xerces headers. #include // Needed for this XERCES macro XERCES_CPP_NAMESPACE_BEGIN class DOMDocument; class DOMElement; XERCES_CPP_NAMESPACE_END namespace asp { // Forward declaration so we don't need to include this class's header class RPCModel; /// Objects that represent read data from XML. These also provide a /// storage structure for modification later on. class ImageXML : public BitChecker { void parse_meta (xercesc::DOMElement* node); void parse_band_tdi (xercesc::DOMElement* node, int & out_tdi); void parse_tlc_list (xercesc::DOMElement* node); void parse_image_size(xercesc::DOMElement* node); public: ImageXML(); void parse(xercesc::DOMElement* node); std::string tlc_start_time; std::string first_line_start_time; std::vector > tlc_vec; // Line -> time offset pairings std::string sat_id, band_id; std::string scan_direction; int tdi; std::vector tdi_multi; // for multi-spectral images double avg_line_rate; vw::Vector2i image_size; std::string generation_time; // e.g., 2013-10-12T10:48:48.000000Z std::string image_descriptor; // e.g., "Stereo1B" }; /// class GeometricXML : public BitChecker { void parse_principal_distance(xercesc::DOMElement* node); void parse_optical_distortion(xercesc::DOMElement* node); void parse_perspective_center(xercesc::DOMElement* node); void parse_camera_attitude (xercesc::DOMElement* node); void parse_detector_mounting (xercesc::DOMElement* node); public: GeometricXML(); void parse(xercesc::DOMElement* node); double principal_distance; // mm vw::int32 optical_polyorder; vw::Vector optical_a, optical_b; // Don't currently support these vw::Vector3 perspective_center; // meters in satellite frame vw::Quat camera_attitude; vw::Vector2 detector_origin; // mm double detector_rotation; // degrees about Z+ in camera frame double detector_pixel_pitch; // mm void printDebugInfo() const; ///< Debug string }; /// class EphemerisXML : public BitChecker { void parse_meta (xercesc::DOMElement* node); void parse_eph_list(std::string const& rawXml); public: EphemerisXML(); void parse(xercesc::DOMElement* node, std::string const& rawXml); std::string start_time; // UTC double time_interval; // seconds // Satellite position vector (ECEF). This will be used later to // find the camera positions. We will need this even then, if // propagating covariances, as those are for the satellite // positions and not the camera positions. See another note in // AttitudeXML. std::vector satellite_position_vec; // Satellite covariances. Only the region at and above the main // diagonal is saved, as this matrix is symmetric. // Concatenate all of them in the same vector, will be easier to // interpolate later. std::vector satellite_pos_cov; std::vector velocity_vec; // ECEF }; /// class AttitudeXML : public BitChecker { void parse_meta(xercesc::DOMElement* node); void parse_att_list(std::string const& rawXml); public: AttitudeXML(); void parse(xercesc::DOMElement* node, std::string const& rawXml); std::string start_time; double time_interval; // The satellite_quat_vec keeps the quaternions with original // values and original order. Later, those will be used to // manufacture the camera orientation vector, which will result in // some swapping around of these values and some rotations. We // need to keep even later satellite_quat_vec if we want to // compute covariances, as they are one-to-one correspondence with // satellite_quat_cov. See also note in the // EphemerisXML class. std::vector> satellite_quat_vec; // This has entries at and above main diagonal (4x4 matrix, 10 entries). // Keep them concatenated into a single vector, for easy of interpolation later. std::vector satellite_quat_cov; }; /// Reads from Digital Globe XML format class RPCXML: public BitChecker { boost::shared_ptr m_rpc; vw::BBox3 m_lat_lon_height_box; void parse_vector(xercesc::DOMElement* node, vw::Vector & vec); void parse_rpb(xercesc::DOMElement* root); ///< Digital Globe XML void parse_rational_function_model(xercesc::DOMElement* node, bool is_spot67 = false); void parse_perusat_model(xercesc::DOMElement* node); ///< PeruSat-1 public: RPCXML(); void read_from_file(std::string const& name); void parse(xercesc::DOMElement* node) { parse_rpb(node); } // TODO: Why is this function in this class? void parse_bbox(xercesc::DOMElement* node); ///< Read the valid sensor model bounds // Parse the terrain height (only for ortho-ready images) double parse_terrain_height(xercesc::DOMElement* node); /// Return a pointer to the loaded RPC model. RPCModel* rpc_ptr() const; /// Get the GDC bounding box that the RPC model is valid for. vw::BBox3 get_lon_lat_height_box() const; }; // Helper functions to allow us to fill the objects. This doesn't // really help with code reuse but I think it makes it easer to read. void read_xml(std::string const& filename, GeometricXML& geo, AttitudeXML & att, EphemerisXML& eph, ImageXML & img, RPCXML & rpc); vw::Vector2i xml_image_size(std::string const& filename); /// Function to extract the four corners from the first band /// of a Worldview XML file. /// - The order is [TOP_LEFT, TOP_RIGHT, BOT_RIGHT, BOT_LEFT] bool read_WV_XML_corners(std::string const& xml_path, std::vector &pixel_corners, std::vector &lonlat_corners); /// Attempts to approximate a georeference for a WorldView image using the /// four corner points in the XML file. /// - This only works for unprojected WV images with four lonlat GCPs at the corner pixels. /// - The approximation is limited to using a perspective transform. bool approximate_wv_georeference(std::string const& wv_xml_path, vw::cartography::GeoReference & approx_georef); /// Reads a georeference from the WorldView file. /// - If the image is not georegistered but there are /// corner coordinates in xml_path, an approximate /// georef file will be created. bool read_wv_georeference(vw::cartography::GeoReference &georef, std::string const &image_path, std::string const &xml_path=""); } //end namespace asp #endif//__STEREO_CAMERA_RPC_XML_H__ ================================================ FILE: src/asp/Camera/RpcUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // RPC model utilities #include #include #include namespace asp { // Sample the llh box and shoot the 3D points into the camera. // Filter by image box. void sample_llh_pix_bbox(vw::BBox2 const& ll_box, vw::Vector2 const& h_range, int num_samples, vw::cartography::Datum const& datum, vw::CamPtr cam, vw::BBox2 const& image_box, // Outputs std::vector & all_llh, std::vector & all_pixels) { // Wipe the outputs all_llh.clear(); all_pixels.clear(); double delta_lon = (ll_box.max()[0] - ll_box.min()[0])/double(num_samples); double delta_lat = (ll_box.max()[1] - ll_box.min()[1])/double(num_samples); double delta_ht = (h_range[1] - h_range[0])/double(num_samples); for (double lon = ll_box.min()[0]; lon <= ll_box.max()[0]; lon += delta_lon) { for (double lat = ll_box.min()[1]; lat <= ll_box.max()[1]; lat += delta_lat) { for (double ht = h_range[0]; ht <= h_range[1]; ht += delta_ht) { vw::Vector3 llh(lon, lat, ht); vw::Vector3 xyz = datum.geodetic_to_cartesian(llh); // Go back to llh. This is a bugfix for the 360 deg offset problem. llh = datum.cartesian_to_geodetic(xyz); vw::Vector2 cam_pix; try { // The point_to_pixel function can be capricious cam_pix = cam->point_to_pixel(xyz); } catch(...) { continue; } if (image_box.contains(cam_pix)) { all_llh.push_back(llh); all_pixels.push_back(cam_pix); } } } } return; } // Add pixel and llh samples along the perimeter and diagonals of image_box. // Constrain by the ll box. void add_perimeter_diag_points(vw::BBox2 const& image_box, vw::cartography::Datum const& datum, vw::CamPtr cam, vw::BBox2 const& ll, // lon-lat box vw::Vector2 const& H, // height range // Outputs (append to these) std::vector & all_llh, std::vector & all_pixels) { // Reduce the max by 1, as sample_float_box() assumes the max is not exclusive vw::BBox2 b = image_box; b.max() -= vw::Vector2(1, 1); // Calc samples on box perimeter and diagonals // Add on the perimeter a non-small portion of points we added so far throughout int num_steps = std::max(100, int(all_llh.size()/10)); std::vector points; vw::cartography::sample_float_box(b, points, num_steps); // Use only the min and max heights for (size_t i = 0; i < H.size(); i++) { double h = H[i]; for (size_t j = 0; j < points.size(); j++) { vw::Vector2 pix = points[j]; double semi_major = datum.semi_major_axis() + h; double semi_minor = datum.semi_minor_axis() + h; vw::Vector3 intersection; try { intersection = vw::cartography::datum_intersection(semi_major, semi_minor, cam->camera_center(pix), cam->pixel_to_vector(pix)); if (intersection == vw::Vector3()) continue; } catch (...) { continue; } vw::Vector3 llh = datum.cartesian_to_geodetic(intersection); // Must be contained in the lon-lat box if (!ll.contains(vw::Vector2(llh[0], llh[1]))) continue; all_llh.push_back(llh); all_pixels.push_back(pix); } } return; } } // end namespace asp ================================================ FILE: src/asp/Camera/RpcUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file RpcUtils.h // RPC model utilities #ifndef __ASP_CAMERA_RPC_UTILS_H__ #define __ASP_CAMERA_RPC_UTILS_H__ #include #include #include #include #include namespace vw { namespace cartography { class Datum; class GeoReference; } } namespace asp { // Sample the llh box and shoot the 3D points into the camera. // Filter by image box. void sample_llh_pix_bbox(vw::BBox2 const& ll_box, vw::Vector2 const& h_range, int num_samples, vw::cartography::Datum const& datum, vw::CamPtr cam, vw::BBox2 const& image_box, // Outputs std::vector & all_llh, std::vector & all_pixels); // Add pixel and llh samples along the perimeter and diagonals of image_box. // Constrain by the ll box. void add_perimeter_diag_points(vw::BBox2 const& image_box, vw::cartography::Datum const& datum, vw::CamPtr cam, vw::BBox2 const& ll, // lon-lat box vw::Vector2 const& H, // height range // Outputs (append to these) std::vector & all_llh, std::vector & all_pixels); } // end namespace asp #endif //__ASP_CAMERA_RPC_UTILS_H__ ================================================ FILE: src/asp/Camera/SPOT_XML.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include // for ArgumentErr, vw_throw, etc #include // for Quat, Quaternion #include // for Vector, Vector3, Vector4, etc #include // for Datum #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::cartography; using namespace xercesc; using asp::XmlUtils::get_node; using asp::XmlUtils::cast_xmlch; using asp::XmlUtils::parseDoublesFromXmlBlock; namespace asp { DOMElement* SpotXML::open_xml_file(std::string const& xml_path) { // Check if the file actually exists and throw a user helpful file. if (!boost::filesystem::exists(xml_path)) vw_throw(ArgumentErr() << "XML file \"" << xml_path << "\" does not exist."); std::string error_prefix = "XML file \"" + xml_path + "\" is invalid.\nException message is: \n"; std::string err_message = ""; // Filled in later on error try{ //std::cout << "Set XML parser\n"; // Set up the XML parser if we have not already done so if (!m_parser.get()) { m_parser.reset(new XercesDOMParser()); m_errHandler.reset(new HandlerBase()); m_parser->setValidationScheme(XercesDOMParser::Val_Always); m_parser->setDoNamespaces(true); m_parser->setErrorHandler(m_errHandler.get()); } //std::cout << "Load XML\n"; // Load the XML file m_parser->parse(xml_path.c_str()); DOMDocument* xmlDoc = m_parser->getDocument(); DOMElement * elementRoot = xmlDoc->getDocumentElement(); return elementRoot; } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); err_message = error_prefix + message; XMLString::release(&message); } catch (const SAXException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); err_message = error_prefix + message; XMLString::release(&message); } catch (const std::exception& e) { err_message = error_prefix + e.what(); } catch (...) { err_message = "Unrecognized error in XML file \"" + xml_path + "\"\n"; } vw_throw(ArgumentErr() << err_message); // Only get here on error return 0; } void SpotXML::read_xml(std::string const& xml_path) { DOMElement * elementRoot = open_xml_file(xml_path); // Read the raw XML for fast parsing of large numeric blocks std::ifstream ifs(xml_path); std::string rawXml((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); parse_xml(elementRoot, rawXml); } std::vector SpotXML::get_lonlat_corners(std::string const& xml_path) { SpotXML xml_reader; DOMElement * root = xml_reader.open_xml_file(xml_path); // Just get this one node we need to find the four corners DOMElement* raster_dims_node = get_node(root, "Dataset_Frame"); xml_reader.read_corners(raster_dims_node); return xml_reader.lonlat_corners; } void SpotXML::parse_xml(xercesc::DOMElement* node, std::string const& rawXml) { xercesc::DOMElement* dataset_frame_node = get_node(node, "Dataset_Frame"); xercesc::DOMElement* raster_dims_node = get_node(node, "Raster_Dimensions"); xercesc::DOMElement* ephemeris_node = get_node(node, "Ephemeris"); xercesc::DOMElement* corrected_attitudes_node = get_node(node, "Corrected_Attitudes"); xercesc::DOMElement* sensor_config_node = get_node(node, "Sensor_Configuration"); read_corners(dataset_frame_node); read_ephemeris(ephemeris_node); read_image_size(raster_dims_node); read_attitude(corrected_attitudes_node); read_look_angles(rawXml); read_line_times(sensor_config_node); // Set up the base time // - The position log starts before the image does, so the first // time there should be a good reference time. boost::posix_time::ptime earliest_time = boost::posix_time::time_from_string("2016-05-04 00:00:00.00"); std::list >::const_iterator iter; for (iter = position_logs.begin(); iter != position_logs.end(); iter++) { std::string s = iter->first; boost::replace_all(s, "T", " "); boost::posix_time::ptime this_time = boost::posix_time::time_from_string(s); if (this_time < earliest_time) { earliest_time = this_time; //std::cout << "Using reference time " << iter->first << std::endl; } } m_time_ref_functor.set_base_time(earliest_time); //std::cout << "Done parsing XML.\n"; } void SpotXML::read_look_angles(std::string const& rawXml) { const size_t num_cols = image_size.x(); if (num_cols == 0) vw_throw(ArgumentErr() << "Did not load image size from SPOT XML file!\n"); look_angles.resize(num_cols); // Fast path: extract all doubles from the Look_Angles_List block // Each entry has 3 values: DETECTOR_ID, PSI_X, PSI_Y std::vector values; parseDoublesFromXmlBlock(rawXml, "", "", values); size_t valsPerEntry = 3; if (values.size() != num_cols * valsPerEntry) vw_throw(ArgumentErr() << "Expected " << num_cols * valsPerEntry << " look angle values, got " << values.size() << ".\n"); for (size_t i = 0; i < num_cols; i++) { const double* v = &values[i * valsPerEntry]; look_angles[i].first = static_cast(v[0]); look_angles[i].second.x() = v[1]; look_angles[i].second.y() = v[2]; } } void SpotXML::read_ephemeris(xercesc::DOMElement* ephemeris_node) { position_logs.clear(); // Reset data storage velocity_logs.clear(); // Dig one level down xercesc::DOMElement* points_node = get_node(ephemeris_node, "Points"); // Pick out the "Point" nodes DOMNodeList* children = points_node->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* curr_node = children->item(i); if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node name DOMElement* curr_element = dynamic_cast(curr_node); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Point") == std::string::npos) continue; // Get the three sub-nodes xercesc::DOMElement* location_node = get_node(curr_element, "Location"); xercesc::DOMElement* velocity_node = get_node(curr_element, "Velocity"); // Read in both sets of values std::string time; Vector3 position, velocity; cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), time); cast_xmlch(get_node(location_node, "X")->getTextContent(), position.x()); cast_xmlch(get_node(location_node, "Y")->getTextContent(), position.y()); cast_xmlch(get_node(location_node, "Z")->getTextContent(), position.z()); cast_xmlch(get_node(velocity_node, "X")->getTextContent(), velocity.x()); cast_xmlch(get_node(velocity_node, "Y")->getTextContent(), velocity.y()); cast_xmlch(get_node(velocity_node, "Z")->getTextContent(), velocity.z()); position_logs.push_back(std::pair(time, position)); velocity_logs.push_back(std::pair(time, velocity)); } // End loop through corrected attitudes } void SpotXML::read_attitude(xercesc::DOMElement* corrected_attitudes_node) { pose_logs.clear(); // Reset data storage // Dig one level down xercesc::DOMElement* corrected_attitude_node = get_node(corrected_attitudes_node, "Corrected_Attitude"); // Pick out the "Angles" nodes DOMNodeList* children = corrected_attitude_node->getChildNodes(); for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* curr_node = children->item(i); if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node time DOMElement* curr_element = dynamic_cast(curr_node); std::string tag(XMLString::transcode(curr_element->getTagName())); if (tag.find("Angles") == std::string::npos) continue; std::pair data; cast_xmlch(get_node(curr_element, "YAW")->getTextContent(), data.second.x()); cast_xmlch(get_node(curr_element, "PITCH")->getTextContent(), data.second.y()); cast_xmlch(get_node(curr_element, "ROLL")->getTextContent(), data.second.z()); cast_xmlch(get_node(curr_element, "TIME")->getTextContent(), data.first); pose_logs.push_back(data); } // End loop through corrected attitudes } void SpotXML::read_corners(xercesc::DOMElement* dataset_frame_node) { // Set up storage const size_t NUM_CORNERS = 4; lonlat_corners.resize(NUM_CORNERS); pixel_corners.resize(NUM_CORNERS); // Look through the four vertex nodes // - Currently we assume they are always in the same order! DOMNodeList* children = dataset_frame_node->getChildNodes(); size_t count = 0; for (XMLSize_t i = 0; i < children->getLength(); i++) { // Check child node type DOMNode* curr_node = children->item(i); if (curr_node->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Check the node time DOMElement* curr_element = dynamic_cast(curr_node); // There should only be four vertex nodes here. // Parse the values. XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "FRAME_LON")->getTextContent(), lonlat_corners[count].x()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "FRAME_LAT")->getTextContent(), lonlat_corners[count].y()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "FRAME_ROW")->getTextContent(), pixel_corners[count].y()); XmlUtils::cast_xmlch(XmlUtils::get_node(curr_element, "FRAME_COL")->getTextContent(), pixel_corners[count].x()); ++count; if (count == NUM_CORNERS) return; } // End loop through the vertex nodes } void SpotXML::read_image_size(xercesc::DOMElement* raster_dims_node) { cast_xmlch(get_node(raster_dims_node, "NROWS")->getTextContent(), image_size[1]); cast_xmlch(get_node(raster_dims_node, "NCOLS")->getTextContent(), image_size[0]); } void SpotXML::read_line_times(xercesc::DOMElement* sensor_config_node) { cast_xmlch(get_node(sensor_config_node, "LINE_PERIOD")->getTextContent(), line_period); cast_xmlch(get_node(sensor_config_node, "SCENE_CENTER_TIME")->getTextContent(), center_time); cast_xmlch(get_node(sensor_config_node, "SCENE_CENTER_LINE")->getTextContent(), center_line); cast_xmlch(get_node(sensor_config_node, "SCENE_CENTER_COL")->getTextContent(), center_col); center_line -= 1; center_col -= 1; // Convert from 1-based to 0-based indices. } // ----- These functions help convert the input data to a useable format ------ // Input strings look like this: 2008-03-04T12:31:03.081912 double SpotXML::convert_time(std::string const& s) const { try{ // Replace the T with a space so the default Boost function can parse the time. std::string s2 = s; boost::replace_all(s2, "T", " "); boost::posix_time::ptime time = boost::posix_time::time_from_string(s2); return this->m_time_ref_functor(time); } catch(...) { vw::vw_throw(vw::ArgumentErr() << "Failed to parse time from string: " << s << "\n"); } return -1; // Never reached! } // This is pretty simple, SPOT5 has a constant time for each line. vw::LinearTimeInterpolation SpotXML::setup_time_func() const { // The metadata tells us the time of the middle line, so find the time for the first line. double center_time_d = convert_time(this->center_time); double min_line_diff = static_cast(0 - this->center_line); double min_line_time = center_time_d + this->line_period*min_line_diff; //std::cout << "Setup time functor: " << std::setprecision(12) << min_line_time << ", " << this->line_period << std::endl; //std::cout << std::setprecision(12) << "Center time: " << center_time_d << std::endl; return vw::LinearTimeInterpolation(min_line_time, this->line_period); } // Velocities are the sum of inertial velocities and the instantaneous // Earth rotation. // The velocity is already in GCC, so just pack into a function. vw::LagrangianInterpolation SpotXML::setup_velocity_func() const { const int INTERP_RADII = 4; // Reccomended in the docs std::vector time; std::vector velocity; // Loop through the velocity logs and extract values std::list >::const_iterator iter; for (iter = velocity_logs.begin(); iter != velocity_logs.end(); iter++) { time.push_back(convert_time(iter->first)); velocity.push_back(iter->second); //std::cout << "Adding velocity point: " << iter->first // << " --> " << iter->second << std::endl; } // More generic method for variable time intervals //return vw::LagrangianInterpolationVarTime(velocity, time, INTERP_RADII); // A faster method for when we know the time delta is constant double min_time = time[0]; double max_time = time[time.size()-1]; double time_delta = (max_time - min_time) / (time.size()-1); return vw::LagrangianInterpolation(velocity, min_time, time_delta, max_time, INTERP_RADII); } // The position is already in GCC, so just pack into a function. // - Currently this is identical to the velocity function, but this may change later. vw::LagrangianInterpolation SpotXML::setup_position_func() const { const int INTERP_RADII = 4; // Reccomended in the docs std::vector time; std::vector position; // Loop through the velocity logs and extract values std::list >::const_iterator iter; for (iter = position_logs.begin(); iter != position_logs.end(); iter++) { time.push_back(convert_time(iter->first)); position.push_back(iter->second); //std::cout << "Adding position point: " << convert_time(iter->first) // << " --> " << iter->second << std::endl; } // More generic method for variable time intervals //return vw::LagrangianInterpolationVarTime(position, time, INTERP_RADII); // A faster method for when we know the time delta is constant double min_time = time[0]; double max_time = time[time.size()-1]; double time_delta = (max_time - min_time) / (time.size()-1); return vw::LagrangianInterpolation(position, min_time, time_delta, max_time, INTERP_RADII); } vw::LinearPiecewisePositionInterpolation SpotXML::setup_pose_func( vw::LinearTimeInterpolation const& time_func) const { // This function returns a functor that returns just the yaw/pitch/roll angles. // - The time interval between lines is not constant but it is extremely close. // For some reason the corrected pose angles do not start early enough to cover // the time span for all of the input lines! // - In order to handle this, we repeat the earliest pose value so that it starts // before the first line. // - The raw pose angles do start before the lines, but their values differ noticably // from the corrected values. // Compute how many padded pose entries are needed to cover all of the lines. size_t num_lines = this->image_size[1]; double num_corrected_poses = static_cast(pose_logs.size()); double first_line_time = time_func(0); double last_line_time = time_func(num_lines - 1.0); double pose_start_time = convert_time(pose_logs.front().first); double pose_stop_time = convert_time(pose_logs.back().first); double pose_delta_t = (pose_stop_time - pose_start_time) / (num_corrected_poses - 1.0); int num_prefill_poses = static_cast(ceil((pose_start_time - first_line_time) / pose_delta_t)); int num_postfill_poses = static_cast(ceil((last_line_time - pose_stop_time) / pose_delta_t)); //std::cout << "First line time: " << first_line_time << std::endl; //std::cout << "Last line time: " << last_line_time << std::endl; //std::cout << "Pose start: " << pose_start_time << std::endl; //std::cout << "Pose stop: " << pose_stop_time << std::endl; num_postfill_poses += 1; // Stick another bit of padding on the back. // This is so our interpolation algorithms have enough room to interpolate. if (num_prefill_poses < 1) num_prefill_poses = 0; if (num_postfill_poses < 1) num_postfill_poses = 0; size_t num_total_poses = pose_logs.size() + static_cast(num_prefill_poses) + static_cast(num_postfill_poses); std::vector pose(num_total_poses); std::vector time(num_total_poses); // Fill in the pre-padding poses size_t index = 0; for (int i = 0; i < num_prefill_poses; i++) { double time_offset = pose_delta_t*static_cast(num_prefill_poses-i); time[index] = convert_time(pose_logs.front().first) - time_offset; pose[index] = pose_logs.front().second; //std::cout << "PREFILL: " << time[index] << std::endl; ++index; } // Now fill in the real poses std::list >::const_iterator iter; for (iter = pose_logs.begin(); iter != pose_logs.end(); iter++) { time[index] = convert_time(iter->first); pose[index] = iter->second; ++index; } // Fill in the post-padding poses for (int i = 0; i < num_postfill_poses; i++) { double time_offset = pose_delta_t*(i+1); time[index] = convert_time(pose_logs.back().first) + time_offset; pose[index] = pose_logs.back().second; //std::cout << "POSTFILL: " << time[index] << std::endl; ++index; } //double max_time = time.back(); double min_time = time.front(); //std::cout << std::setprecision(12) << "Adding pose info: " << min_time << ", " // << max_time << " -> " << pose_delta_t << std::endl; return vw::LinearPiecewisePositionInterpolation(pose, min_time, pose_delta_t); } } // end namespace asp ================================================ FILE: src/asp/Camera/SPOT_XML.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // These are objects that relate directly to block in XML that we need // to read. They only read and then store the raw values. Other // objects will interpret the results. #ifndef __STEREO_CAMERA_SPOT_XML_H__ #define __STEREO_CAMERA_SPOT_XML_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include // Special forward declare so we can hide the Xerces headers. #include // Needed for this XERCES macro XERCES_CPP_NAMESPACE_BEGIN class DOMDocument; class DOMElement; class XercesDOMParser; class ErrorHandler; XERCES_CPP_NAMESPACE_END namespace asp { class SpotXML { public: /// Constructor /// - Sets the fixed reference time. SpotXML(): m_time_ref_functor(boost::posix_time::time_from_string("2002-05-04 00:00:00.00")) {} // The reader will populate these fields std::vector lonlat_corners; std::vector pixel_corners; std::vector > look_angles; // (column, psi_x/psi_y) std::list > pose_logs; // (time, yaw/pitch/roll) std::list > position_logs; // (time, X/Y/Z) std::list > velocity_logs; // (time, dX/dY/dZ) vw::Vector2i image_size; double line_period; std::string center_time; int center_line; int center_col; /// Parse an XML file to populate the data void read_xml(std::string const& xml_path); /// Parse an XML tree to populate the data void parse_xml(xercesc::DOMElement* node, std::string const& rawXml); /// Load the estimated image lonlat corners from the XML file /// - Corners are returned in clockwise order. static std::vector get_lonlat_corners(std::string const& xml_path); // Functions to setup functors which manage the raw input data. vw::LagrangianInterpolation setup_position_func() const; vw::LagrangianInterpolation setup_velocity_func() const; vw::LinearTimeInterpolation setup_time_func () const; vw::LinearPiecewisePositionInterpolation setup_pose_func( vw::LinearTimeInterpolation const& time_func) const; // (yaw/pitch/roll) /// Converts a time from string to numeric format. /// - All times are in seconds relative to the earliest ephemeris time. double convert_time(std::string const& s) const; private: // The various XML data reading sections /// Just opens the XML file for reading and returns the root node. xercesc::DOMElement* open_xml_file(std::string const& xml_path); void read_look_angles(std::string const& rawXml); void read_ephemeris (xercesc::DOMElement* ephemeris_node); void read_attitude (xercesc::DOMElement* corrected_attitudes_node); void read_corners (xercesc::DOMElement* dataset_frame_node); void read_image_size (xercesc::DOMElement* raster_dims_node); void read_line_times (xercesc::DOMElement* sensor_config_node); boost::shared_ptr m_parser; boost::shared_ptr m_errHandler; SecondsFromRef m_time_ref_functor; }; // End class SpotXML } //end namespace asp #endif//__STEREO_CAMERA_SPOT_XML_H__ ================================================ FILE: src/asp/Camera/SatSim.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Functions used for the sat_sim.cc tool that are not general enough to put // somewhere else. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw::cartography; using namespace vw::math; using namespace vw::geometry; namespace fs = boost::filesystem; namespace asp { // Compute satellite position, and along / across track normalized vectors in // ECEF coordinates, given the first and last proj points and a value t giving // the position along this line. Produced along and across vectors are // normalized and perpendicular to each other. void calcEcefTrajPtAlongAcross(vw::Vector3 const& curr_proj, vw::cartography::GeoReference const& dem_georef, double delta, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, // Outputs vw::Vector3 & P, vw::Vector3 & along, vw::Vector3 & across) { // Compute the point on the trajectory, in projected coordinates asp::calcEcefAlongAcross(dem_georef, delta, proj_along, proj_across, curr_proj, // Outputs, as vectors in ECEF along, across); // Convert the point along trajectory to ECEF P = vw::cartography::projToEcef(dem_georef, curr_proj); } // This is used to signify when the algorithm below fails to find a solution const double g_big_val = 1e+100; // Calc the camera center, orientation, and ground point for the given projected // orbit position, roll, pitch, and yaw. The camera center is in ECEF. // The guess for the xyz ground point will be updated if the solver converges. bool calcCamPoseAndGroundPt(SatSimOptions const& opt, vw::Vector3 const& curr_proj, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double delta, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, double roll, double pitch, double yaw, double height_guess, // Outputs vw::Matrix3x3 & cam2world, vw::Vector3 & cam_ctr, vw::Vector3 & xyz, vw::Vector3 & xyz_guess) { vw::Vector3 along, across; calcEcefTrajPtAlongAcross(curr_proj, dem_georef, delta, proj_along, proj_across, // Outputs, perpendicular and normal vectors cam_ctr, along, across); // Find the z vector as perpendicular to both along and across vw::Vector3 down = vw::math::cross_prod(along, across); down = down / norm_2(down); // The camera to world rotation asp::assembleCam2WorldMatrix(along, across, down, cam2world); // Apply the roll-pitch-yaw rotation vw::Matrix3x3 R = asp::rollPitchYaw(roll, pitch, yaw); cam2world = cam2world * R * asp::rotationXY(); // Ray from camera to ground going through image center // TODO(oalexan1): This must go through the optical center, not the image center. vw::Vector3 cam_dir = cam2world * vw::Vector3(0, 0, 1); // Find the intersection of this ray with the ground bool treat_nodata_as_zero = false; bool has_intersection = false; double max_abs_tol = std::min(opt.dem_height_error_tol, 1e-14); double max_rel_tol = max_abs_tol; int num_max_iter = 100; xyz = vw::cartography::camera_pixel_to_dem_xyz (cam_ctr, cam_dir, dem, dem_georef, treat_nodata_as_zero, has_intersection, // Below we use a prudent approach. Try to make the solver work // hard. It is not clear if this is needed. std::min(opt.dem_height_error_tol, 1e-8), max_abs_tol, max_rel_tol, num_max_iter, xyz_guess, height_guess); // Update the guess if we found a solution if (has_intersection) xyz_guess = xyz; return has_intersection; } // Given an orbit given by the first and last camera center positions in // projected coordinates, a real number t describing the position along this // line, roll, pitch, and yaw for the camera (relative to nadir), find the z // direction for the camera (camera look), intersect it with the ground, find // the DEM pixel location, and return the distance from this location to a given // pixel location. double demPixelErr(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, double t, double delta, // a small number to move along track double roll, double pitch, double yaw, vw::Vector2 const& pixel_loc, double height_guess, vw::Vector3 & xyz_guess) { // Calc position along the trajectory and normalized along and across vectors // in ECEF vw::Vector3 curr_proj = first_proj * (1.0 - t) + last_proj * t; vw::Matrix3x3 cam2world; vw::Vector3 cam_ctr, xyz; bool success = calcCamPoseAndGroundPt(opt, curr_proj, dem_georef, dem, delta, proj_along, proj_across, roll, pitch, yaw, height_guess, cam2world, cam_ctr, xyz, xyz_guess); if (!success) return g_big_val; // Convert to llh vw::Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz); // Find pixel location vw::Vector2 pixel_loc2 = dem_georef.lonlat_to_pixel(subvector(llh, 0, 2)); // If the pixel is outside the DEM, return a big value if (!vw::bounding_box(dem).contains(pixel_loc2)) return g_big_val; return norm_2(pixel_loc - pixel_loc2); } // A model with the error given by demPixelErr(). The variable will be t, // which will give the position along the trajectory. class RayDemPixelLMA : public vw::math::LeastSquaresModelBase { SatSimOptions const& m_opt; vw::cartography::GeoReference const& m_dem_georef; vw::ImageViewRef> m_dem; double m_height_guess; vw::Vector3 m_first_proj; vw::Vector3 m_last_proj; vw::Vector3 m_proj_along; vw::Vector3 m_proj_across; double m_delta, m_param_scale_factor; double m_roll, m_pitch, m_yaw; vw::Vector2 m_pixel_loc; mutable vw::Vector3 m_xyz_guess; // used to speed up the solver, not thread-safe public: typedef vw::Vector result_type; typedef vw::Vector domain_type; typedef vw::Matrix jacobian_type; ///< Jacobian form. Auto. /// Constructor RayDemPixelLMA(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, double delta, // a small number to move along track double param_scale_factor, // to go from optimizer units to t in [0, 1] double roll, double pitch, double yaw, vw::Vector2 const& pixel_loc): m_opt(opt), m_dem_georef(dem_georef), m_dem(dem), m_height_guess(height_guess), m_first_proj(first_proj), m_last_proj(last_proj), m_proj_along(proj_along), m_proj_across(proj_across), m_delta(delta), m_param_scale_factor(param_scale_factor), m_roll(roll), m_pitch(pitch), m_yaw(yaw), m_pixel_loc(pixel_loc), m_xyz_guess(vw::Vector3(0, 0, 0)) {} // Evaluator operator. The goal is described earlier. inline result_type operator()(domain_type const& len) const { // See note where param_scale_factor is defined. double t = len[0] * m_param_scale_factor; double err = demPixelErr(m_opt, m_dem_georef, m_dem, m_first_proj, m_last_proj, m_proj_along, m_proj_across, t, m_delta, m_roll, m_pitch, m_yaw, m_pixel_loc, m_height_guess, m_xyz_guess); // will change result_type result; result[0] = err; // vw::vw_out() << "t = " << t << ", err = " << err << "\n"; return result; } }; // Find the location of camera center along the trajectory, in projected // coordinates, so that the ray from the camera center to the ground goes // closest to given ground point. This assumes roll and yaw of 0, as // we move only along the orbit. void findBestProjCamLocation(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, double delta, double roll, double pitch, double yaw, vw::Vector2 const& pixel_loc, // Outputs vw::Vector3 & best_proj) { // For now this is a limitation of the code. if (!std::isnan(opt.roll) && opt.roll != 0) vw::vw_throw(vw::ArgumentErr() << "When having both ground and orbital constraints, " << "the roll must be zero.\n"); if (!std::isnan(opt.yaw) && opt.yaw != 0) vw::vw_throw(vw::ArgumentErr() << "When having both ground and orbital constraints, " << "the yaw must be zero.\n"); // Note(oalexan1): This algorithm had issues with convergence. Let eps = 1e-7. // This is used in LevenbergMarquardt.h for numerical differentiation. Need to // ensure model(len) and model(len + eps) are sufficiently different. For // that, ensure that len and len + eps correspond to points in orbit separated // by about 1 meter. That is why, we start with t in [0, 1], which // parametrizes the orbital segment between first_proj and last_proj, and // parametrize using value len, with t = len * param_scale_factor. double eps = 1e-7; vw::Vector3 P1 = vw::cartography::projToEcef(dem_georef, first_proj); // t = 0 vw::Vector3 P2 = vw::cartography::projToEcef(dem_georef, last_proj); // t = 1 double d = norm_2(P2 - P1); if (d < 1.0) vw::vw_throw(vw::ArgumentErr() << "Ensure that the input orbit end points are at least 1 m apart.\n"); double param_scale_factor = 1.0 / (eps * d); #if 0 // Verification that param_scale_factor is correct { double l1 = 0, l2 = eps; double t1 = param_scale_factor * l1; double t2 = param_scale_factor * l2; P1 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t1) + last_proj * t1); P2 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t2) + last_proj * t2); vw::vw_out() << "Param scale factor is " << param_scale_factor << "\n"; vw::vw_out() << "Distance must be 1 meter: " << norm_2(P1 - P2) << "\n"; } #endif // Find a spacing in t that corresponds to 1 km movement in orbit. // We will use this to find a good initial guess. // This is very fragile code. // TODO(oalexan1): Find a robust way of finding an initial guess. Sometimes this fails. double dt = 1e-3; double t1 = -dt, t2 = dt; P1 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t1) + last_proj * t1); P2 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t2) + last_proj * t2); double slope = norm_2(P2 - P1) / (2*dt); double spacing = 1000.0 / slope; #if 0 // Verification that spacing is correct vw::vw_out() << "Spacing is " << spacing << "\n"; { double t1 = 0, t2 = spacing; P1 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t1) + last_proj * t1); P2 = vw::cartography::projToEcef(dem_georef, first_proj * (1.0 - t2) + last_proj * t2); vw::vw_out() << "Distance must be 100 meters: " << norm_2(P2 - P1) << "\n"; } #endif // Set up the LMA problem RayDemPixelLMA model(opt, dem_georef, dem, height_guess, first_proj, last_proj, proj_along, proj_across, delta, param_scale_factor, roll, pitch, yaw, pixel_loc); vw::Vector best_len; best_len[0] = 0; // initial guess // First need to search around for a good initial guess. This is a bug fix. // Number of attempts times spacing in m is 1e+8 m, which is 100,000 km. // Enough for any orbit length. // vw::vw_out() << "Searching for a good initial guess.\n"; int attempts = int(1e+8); double best_val = g_big_val; double best_i = 0; for (int i = 0; i < attempts; i++) { // Move towards the positive direction then the negative one double curr_best_val = best_val; for (int j = -1; j <= 1; j += 2) { double t = spacing * i * j; vw::Vector curr_len; curr_len[0] = t / param_scale_factor; double val = model(curr_len)[0]; //vw::vw_out() << "len, val = " << curr_len[0] << ' ' << val << "\n"; if (val < best_val) { best_val = val; best_len = curr_len; best_i = i * j; // take into account the sign } } if (curr_best_val == best_val && curr_best_val < g_big_val) { // We are not improving anymore, so so stop here, as otherwise // we may be going too far. break; } } // end doing attempts // Do local refinement. This is necessary as the initial guess may be far from // the minimum and the function may be noisy. Will do i with increments of 1, // then 0.1, etc., around current best_i. Start with increment of 1 to peek // ahead beyond the values where we stopped before, while revisiting some of // the values of i as well. This was tested on a bug, so do not modify here // lightly. attempts = 8; for (int attempt = 0; attempt < attempts; attempt++) { double delta = 1.0 / pow(10.0, attempt); double best_i_init = best_i; // So that loop end points do not change mid-loop for (double i = best_i_init - 50*delta; i <= best_i_init + 50*delta; i += delta) { double t = spacing * i; vw::Vector curr_len; curr_len[0] = t / param_scale_factor; double val = model(curr_len)[0]; //vw::vw_out() << "len, val = " << curr_len[0] << ' ' << val << "\n"; if (val < best_val) { best_val = val; best_len = curr_len; best_i = i; } } } // Run the optimization with the just-found initial guess // vw::vw_out() << "Running the solver.\n"; int status = -1; double max_abs_tol = 1e-14; double max_rel_tol = max_abs_tol; int num_max_iter = 100; vw::Vector observation; observation[0] = 0; // because we want to minimize the error best_len = vw::math::levenberg_marquardt(model, best_len, observation, status, max_abs_tol, max_rel_tol, num_max_iter); // Note: The status is ignored here. We will just take whatever the solver // outputs, as it may not converge within tolerance. double val = model(best_len)[0]; #if 0 // Turning this off, as the minimum cost function may be far from zero. // May need to add some other check here. if (std::abs(model(best_len)[0]) > 1.0) { vw::vw_out() << "Abs of model value is " << std::abs(model(best_len)[0]) << "\n"; // vw::vw_throw(vw::ArgumentErr() << "Error: The solver for finding correct ends of " // << "orbital segment did not converge to a good solution. Check your DEM, " // << "roll, pitch, yaw, and ground path endpoints.\n"); } #endif // Compute the best location given the just-found position on the segment double t = best_len[0] * param_scale_factor; best_proj = first_proj * (1.0 - t) + last_proj * t; } // A function to compute orbit length in ECEF given its endpoints in projected // coordinates. 1e+5 points are used to approximate the orbit length. Should be // enough. This gets slow when using 1e+6 points. // TODO(oalexan1): This may not be accurate enough for very long orbit segments. // TODO(oalexan1): The number of samples better depend on orbit length. double calcOrbitLength(vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::cartography::GeoReference const& dem_georef) { int num = 1.0e+5; // Start of each segment vw::Vector3 beg = vw::cartography::projToEcef(dem_georef, first_proj); // End of each segment vw::Vector3 end = beg; double orbitLength = 0.0; for (int i = 1; i < num; i++) { // note we start at 1 double t = double(i) / double(num - 1); // Find the projected position of the current point vw::Vector3 curr_proj = first_proj + t * (last_proj - first_proj); // Find the ECEF position of the current point end = vw::cartography::projToEcef(dem_georef, curr_proj); // Add the length of the segment orbitLength += norm_2(end - beg); // Move to the next segment beg = end; } return orbitLength; } // The camera will be constrained by the ground, but not by the roll/pitch/yaw, // then the orientation will change along the trajectory. Then adjust the along // and across directions to reflect this. This will adjust the camera direction // as well. void cameraAdjustment(vw::Vector2 const& first_ground_pos, vw::Vector2 const& last_ground_pos, double t, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, vw::Vector3 const& P, // camera center // Outputs vw::Vector3 & along, vw::Vector3 & across) { // Create interpolated DEM with bilinear interpolation with invalid pixel // edge extension vw::PixelMask nodata_mask = vw::PixelMask(); // invalid value nodata_mask.invalidate(); auto interp_dem = vw::interpolate(dem, vw::BilinearInterpolation(), vw::ValueEdgeExtension>(nodata_mask)); // The camera will be constrained by the ground, but not by the roll/pitch/yaw, // then the orientation will change along the trajectory. vw::Vector2 ground_pix = first_ground_pos * (1.0 - t) + last_ground_pos * t; // Find the projected position along the ground path vw::Vector3 ground_proj_pos; subvector(ground_proj_pos, 0, 2) = dem_georef.pixel_to_point(ground_pix); // x and y auto val = interp_dem(ground_pix[0], ground_pix[1]); if (!is_valid(val)) vw::vw_throw(vw::ArgumentErr() << "Could not interpolate into the DEM along the ground path.\n"); ground_proj_pos[2] = val.child(); // z // Convert the ground point to ECEF vw::Vector3 G = vw::cartography::projToEcef(dem_georef, ground_proj_pos); // Find the ground direction vw::Vector3 ground_dir = G - P; if (norm_2(ground_dir) < 1e-6) vw::vw_throw(vw::ArgumentErr() << "The ground position is too close to the camera.\n"); // Normalize along = along / norm_2(along); ground_dir = ground_dir / norm_2(ground_dir); // Adjust the along-track direction to make it perpendicular to ground dir along = along - dot_prod(ground_dir, along) * ground_dir; // Find 'across' as y direction, given that 'along' is x, and 'ground_dir' is z across = -vw::math::cross_prod(along, ground_dir); // Make these vectors have norm 1, and make across perpendicular to along // Should already be that way by now, but do it just in case asp::normalizeOrthogonalizeAlongAcross(along, across); } // Adjust the orbit end point and set the number of cameras given the frame rate // This is a bit tricky because need to sample finely the orbit void adjustForFrameRate(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef, vw::Vector3 const& first_proj, // Outputs vw::Vector3 & last_proj, // in/out int & num_cameras) { // Initialize the outputs, this value will change num_cameras = 0; // Orbit length in meters. Throw an error if getting an orbit of length 0, // as that suggests there was a failure in finding in orbit end points. double orbit_len = calcOrbitLength(first_proj, last_proj, dem_georef); if (orbit_len <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Failure in computing orbit end points.\n"); double period = opt.velocity / opt.frame_rate; // It is important to let the user know this vw::vw_out() << std::setprecision(17) << "Distance between successive cameras = velocity / frame_rate = " << period << " meters.\n"; // Number of cameras. Add 1 because we need to include the last camera. num_cameras = int(orbit_len / period) + 1; // Cannot have one camera sample for linescan regardless of what the user wants bool is_linescan = (opt.sensor_type.find("linescan") != std::string::npos); // Sanity checks. It is fine to have one single camera, but that is not usual. if (num_cameras < 1) vw::vw_throw(vw::ArgumentErr() << "The number of cameras must be at least 1.\n"); if (num_cameras == 1) { if (is_linescan) { vw::vw_out(vw::WarningMessage) << "For linescan cameras, must have at least " "two camera samples. Adding a second one.\n"; num_cameras = 2; } else { vw::vw_out(vw::WarningMessage) << "Creating only one frame camera sample.\n"; } } // Update the orbit length. Handle gracefully the case of one camera. orbit_len = period * std::max(num_cameras - 1.0, 1.0); // Sanity check, important for the work below. It is fine for first and last // proj to be in the same location, but that is not usual. if (norm_2(last_proj - first_proj) < 1e-6) vw::vw_out(vw::WarningMessage) << "Warning: The first and last camera positions are " <<"too close. Check your inputs.\n"; // Travel along the orbit in very small increments. Return the last point // before exceeding the orbit length. int num = 1000000; // one million samples along the orbit should be enough // TODO(oalexan1): Something more clever and faster should be done. vw::Vector3 beg = vw::cartography::projToEcef(dem_georef, first_proj); vw::Vector3 end = beg; vw::Vector3 out_proj = first_proj; // will keep the result here double curr_len = 0.0; int i = 1; while (1) { // Find the projected position of the current point double t = double(i) / double(num - 1); vw::Vector3 curr_proj = first_proj + t * (last_proj - first_proj); // Find the ECEF position of the current point and distance from previous end = vw::cartography::projToEcef(dem_georef, curr_proj); double curr_dist = norm_2(end - beg); if (curr_len + curr_dist > orbit_len) break; // done, exceeded orbit length, will keep the previous point in out_proj curr_len += curr_dist; beg = end; i++; out_proj = curr_proj; // Sanity check if (i >= 100 * num) { vw::vw_out() << "Warning: Could not find the last camera along the orbit. Perhaps the frame rate is too low.\n"; break; } } // Update the last orbit point, in projected coords. Handle gracefully // the case of one camera. if (norm_2(last_proj - first_proj) > 1e-6) last_proj = out_proj; } // Given the direction going from first_proj to last_proj, and knowing // that we are at curr_proj, find if we are before or after ref_proj. // Return 1 if after, -1 if before, 0 if at that point. double findDirectionAlongOrbit(vw::Vector3 const& ref_proj, vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::Vector3 const& curr_proj) { double sign = 0.0; vw::Vector3 dir1 = last_proj - first_proj; double len1 = norm_2(dir1); if (len1 != 0) dir1 = dir1 / len1; // Handle the case when we are at ref_proj vw::Vector3 dir2 = curr_proj - ref_proj; double len2 = norm_2(dir2); if (len2 == 0) return 0; dir2 = dir2 / len2; if (norm_2(dir1 - dir2) <= norm_2(dir1 + dir2)) sign = 1.0; // curr_proj is after ref_proj else sign = -1.0; // curr_proj is before ref_proj return sign; } // Given the direction in orbit from first_proj to last_proj (these determine // the orbit geometry), find the signed distance along the orbit (in ECEF) from // ref_proj to curr_proj. double signedOrbitDistance(vw::Vector3 const& curr_proj, vw::Vector3 const& ref_proj, vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::cartography::GeoReference const& dem_georef) { double dist = calcOrbitLength(ref_proj, curr_proj, dem_georef); double sign = findDirectionAlongOrbit(ref_proj, first_proj, last_proj, curr_proj); return sign * dist; } // Calc the jitter amplitude at a given location along the orbit. We will // accumulate over all frequencies. The signed distance is from the reference // orbit point. Use a different amplitude and phase shift for roll, pitch, and // yaw. But all these share the same set of frequencies. vw::Vector3 calcJitterAmplitude(SatSimOptions const& opt, vw::Vector3 const& curr_proj, // curr proj camera pos double signed_dist) { // distance from ref_proj // Seed the random number generator. This will be reproducible each time the // program is run, but will be different for each set of input cameras. if (opt.random_pose_perturbation) srand(vw::math::norm_2(curr_proj)); double height_above_datum = curr_proj[2]; // curr satellite height vw::Vector3 amp(0, 0, 0); for (size_t freq_iter = 0; freq_iter < opt.jitter_frequency.size(); freq_iter++) { double f = opt.jitter_frequency[freq_iter]; double v = opt.velocity; double T = v / f; // period in meters // Iterate over roll, pitch, and yaw for (int c = 0; c < 3; c++) { int index = 3 * freq_iter + c; double a = 0.0; // We have either horizontal uncertainty or jitter amplitude. if (!opt.horizontal_uncertainty.empty()) { // jitter amplitude as angular uncertainty given ground uncertainty a = atan(opt.horizontal_uncertainty[c] / height_above_datum); // Covert to degrees a = a * 180.0 / M_PI; } else { // Amplitude in micro radians a = opt.jitter_amplitude[index]; // Convert to radians a = a * 1e-6; // Convert to degrees a = a * 180.0 / M_PI; } // Compute the jitter, in degrees. Add the phase. For a random perturbation // make it between -a and a. if (!opt.random_pose_perturbation) amp[c] += a * sin(signed_dist * 2.0 * M_PI / T + opt.jitter_phase[index]); else amp[c] += a * (2 * double(rand())/double(RAND_MAX) - 1.0); } } // End loop through frequencies return amp; } // Parse --rig-sensor-ground-offsets. void parseSensorGroundOffsets(std::string const& offsets_str, int num_sensors, std::vector & offsets) { std::string sep = ", \t\n"; // separators: comma, space, tab, newline offsets = vw::str_to_std_vec(offsets_str, sep); // If empty, set to 0. if (offsets.empty()) offsets.resize(4 * num_sensors, 0.0); // Must have 4 offsets (2 sensor and 2 ground) per sensor if (offsets.size() != 4 * num_sensors) vw::vw_throw(vw::ArgumentErr() << "Expecting " << 4 * num_sensors << " offsets, got " << offsets.size() << ".\n"); } // Parse --rig-sensor-rotation-angles. void parseSensorRotationAngles(std::string const& angles_str, int num_sensors, std::vector & angles) { std::string sep = ", \t\n"; // separators: comma, space, tab, newline angles = vw::str_to_std_vec(angles_str, sep); // If empty, set to 0. if (angles.empty()) angles.resize(num_sensors, 0.0); // Must have 1 angle per sensor if (angles.size() != num_sensors) vw::vw_throw(vw::ArgumentErr() << "Expecting " << num_sensors << " angles, got " << angles.size() << ".\n"); } // Change the rig to have desired offsets in the sensor plane and ground plane. // These will determine the orientations. The offsets are in meters. void adjustRigForOffsets(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::Vector3 const& ref_proj, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, double delta, rig::RigSet & rig) { int num_rig_sensors = rig.cam_names.size(); std::vector offsets, angles; parseSensorGroundOffsets(opt.rig_sensor_ground_offsets, num_rig_sensors, offsets); // output parseSensorRotationAngles(opt.rig_sensor_rotation_angles, num_rig_sensors, angles); // output // Find the transform from the sensor to the ground at nadir, and the ground point vw::Matrix3x3 cam2world; vw::Vector3 cam_ctr; double roll = 0, pitch = 0, yaw = 0; vw::Vector3 xyz = vw::Vector3(0, 0, 0), xyz_guess = vw::Vector3(0, 0, 0); bool success = calcCamPoseAndGroundPt(opt, ref_proj, dem_georef, dem, delta, proj_along, proj_across, roll, pitch, yaw, height_guess, cam2world, cam_ctr, xyz, xyz_guess); if (!success) vw::vw_throw(vw::ArgumentErr() << "Could not compute the ground point at nadir.\n"); // Convert the ground point to camera coordinates xyz = inverse(cam2world) * (xyz - cam_ctr); // Iterate over sensors. For each sensor compute desired sensor center // and orientation for (int s = 0; s < num_rig_sensors; s++) { int offset_index = 4 * s; double sensor_offset_x = offsets[offset_index + 0]; double sensor_offset_y = offsets[offset_index + 1]; double ground_offset_x = offsets[offset_index + 2]; double ground_offset_y = offsets[offset_index + 3]; vw::Vector3 sensor_ctr = vw::Vector3(sensor_offset_x, sensor_offset_y, 0); vw::Vector3 ground_pt = xyz + vw::Vector3(ground_offset_x, ground_offset_y, 0); // Must offset the ground point relative to the sensor center // to have it in sensor coordinates. ground_pt = ground_pt - sensor_ctr; // Need a rotation for the sensor to reflect the direction from sensor to ground vw::Vector3 z = normalize(ground_pt); // This is a minor bugfix. For the sensor that has the trivial orientation, // eliminate the numerical noise in the z axis. This way, the results with // no rig and with a trivial rig are the same. if (sensor_offset_x == 0 && sensor_offset_y == 0 && ground_offset_x == 0 && ground_offset_y == 0 || norm_2(z - vw::Vector3(0, 0, 1.0)) < 1e-10) z = vw::Vector3(0, 0, 1.0); // Adjust x to be perpendicular to z vw::Vector3 x(1, 0, 0); x = x - dot_prod(x, z) * z; x = normalize(x); // y must be perpendicular to x and z vw::Vector3 y = cross_prod(z, x); // Compute the rotation due to offsets Eigen::Matrix offset_mat = Eigen::Matrix::Identity(); for (int r = 0; r < 3; r++) { offset_mat(r, 0) = x[r]; offset_mat(r, 1) = y[r]; offset_mat(r, 2) = z[r]; offset_mat(r, 3) = sensor_ctr[r]; } // Compute the rotation due to angles Eigen::Matrix rot_mat = Eigen::Matrix::Identity(); if (!angles.empty()) { double th = angles[s]; // Convert to radians th = th * M_PI / 180.0; // Create a rotation by th around the z axis Eigen::Matrix3d R; R(0, 0) = cos(th); R(0, 1) = -sin(th); R(0, 2) = 0; R(1, 0) = sin(th); R(1, 1) = cos(th); R(1, 2) = 0; R(2, 0) = 0; R(2, 1) = 0; R(2, 2) = 1; rot_mat.block<3, 3>(0, 0) = R; } // Update the rig. Rotations get applied first. rig.ref_to_cam_trans[s].matrix() = offset_mat * rot_mat; } } // A function that will take as input the endpoints and will compute the // positions and orientations in ECEF. The key observation is that the positions // will form a straight edge in projected coordinates. In some usage modes we // will adjust the end points of the produced path. The rig may get adjusted // if --rig-sensor-ground-offsets is set. void genCamPoses(SatSimOptions & opt, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, bool have_rig, // Outputs int & first_pos, double & first_line_time, double & orbit_len, std::vector & positions, std::vector & cam2world, std::vector & cam2world_no_jitter, std::vector & ref_cam2world, std::vector & cam_times, rig::RigSet & rig) { // Initialize the outputs. They may change later. first_pos = 0; orbit_len = 0.0; first_line_time = 0.0; positions.clear(); cam2world.clear(); cam2world_no_jitter.clear(); ref_cam2world.clear(); cam_times.clear(); // Convert the first and last camera center positions to projected coordinates vw::Vector3 first_proj, last_proj; subvector(first_proj, 0, 2) = dem_georef.pixel_to_point (vw::math::subvector(opt.first, 0, 2)); // x and y first_proj[2] = opt.first[2]; // z subvector(last_proj, 0, 2) = dem_georef.pixel_to_point (vw::math::subvector(opt.last, 0, 2)); // x and y last_proj[2] = opt.last[2]; // z // Direction along the edge in proj coords (along track direction), // and then the across track direction vw::Vector3 proj_along, proj_across; asp::calcProjAlongAcross(first_proj, last_proj, proj_along, proj_across); // A small number to help convert directions from being in projected space to // ECEF (the transform between these is nonlinear). Do not use a small value, // as in ECEF these will be large numbers and we may have precision issues. // The value 0.01 was tested well. double delta = asp::satSimDelta(); // in meters bool have_ground_pos = !std::isnan(norm_2(opt.first_ground_pos)) && !std::isnan(norm_2(opt.last_ground_pos)); bool have_roll_pitch_yaw = !std::isnan(opt.roll) && !std::isnan(opt.pitch) && !std::isnan(opt.yaw); // Projected orbital location when looking straight down at the first ground point. // This is the reference location for measuring time and jitter from. vw::Vector3 ref_proj = first_proj; // will change if (have_ground_pos) findBestProjCamLocation(opt, dem_georef, dem, height_guess, first_proj, last_proj, proj_along, proj_across, delta, 0, 0, 0, // roll, pitch, yaw opt.first_ground_pos, ref_proj); // output // Adjust the rig given --rig-sensor-ground-offsets if (have_rig && (!opt.rig_sensor_ground_offsets.empty() || !opt.rig_sensor_rotation_angles.empty())) adjustRigForOffsets(opt, dem_georef, dem, height_guess, ref_proj, proj_along, proj_across, delta, rig); if (have_ground_pos && have_roll_pitch_yaw) { // Find best starting and ending points for the orbit given desired // ground locations and roll/pitch/yaw angles. // Print a message as this step can take a while vw::vw_out() << "Estimating orbital segment endpoints given ground constraints.\n"; vw::Vector3 first_best_cam_loc_proj; vw::Stopwatch sw1; sw1.start(); findBestProjCamLocation(opt, dem_georef, dem, height_guess, first_proj, last_proj, proj_along, proj_across, delta, opt.roll, opt.pitch, opt.yaw, opt.first_ground_pos, first_best_cam_loc_proj); sw1.stop(); vw::vw_out() << "Elapsed time for starting endpoint: " << sw1.elapsed_seconds() << " s.\n"; // Same thing for the last camera vw::Stopwatch sw2; sw2.start(); vw::Vector3 last_best_cam_loc_proj; findBestProjCamLocation(opt, dem_georef, dem, height_guess, first_proj, last_proj, proj_along, proj_across, delta, opt.roll, opt.pitch, opt.yaw, opt.last_ground_pos, last_best_cam_loc_proj); sw2.stop(); vw::vw_out() << "Elapsed time for ending endpoint: " << sw2.elapsed_seconds() << " s.\n"; // Overwrite the first and last camera locations in projected coordinates // with the best ones first_proj = first_best_cam_loc_proj; last_proj = last_best_cam_loc_proj; } if (!std::isnan(opt.frame_rate)) { // Adjust the orbit end point and set the number of cameras given the frame rate adjustForFrameRate(opt, dem_georef, first_proj, // outputs last_proj, opt.num_cameras); } orbit_len = calcOrbitLength(first_proj, last_proj, dem_georef); // Good to print these vw::vw_out() << "Orbit length between the first and last inclination-adjusted cameras: " << orbit_len << " meters.\n"; vw::vw_out() << "Number of camera samples: " << opt.num_cameras << "." << "\n"; // We did a sanity check to ensure that when opt.jitter_frequency is set, // opt.velocity and and opt.horizontal_uncertainty are also set and not NaN. bool model_jitter = (!std::isnan(opt.jitter_frequency[0])); // Find the trajectory, as well as points in the along track and across track // directions in the projected space vw::vw_out() << "Computing the camera poses.\n"; // For linescan cameras we want to go beyond the positions and orientations // needed for the first and last image line, to have room for interpolation // and jitter. For Pinhole cameras we do not need this. first_pos = 0; int last_pos = opt.num_cameras; // stop before last if (opt.sensor_type == "linescan") { // Double the number of cameras, half of extra ones going beyond image lines if (opt.num_cameras < 2) vw::vw_throw(vw::ArgumentErr() << "For linescan cameras, must have at least " "two camera samples.\n"); first_pos = -opt.num_cameras/2; last_pos = 2 * opt.num_cameras + first_pos; } int total = last_pos - first_pos; positions.resize(total); cam2world.resize(total); cam2world_no_jitter.resize(total); ref_cam2world.resize(total); cam_times.resize(total, 0.0); // Print progress vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / double(total); tpc.report_progress(0); // The signed distance from ref_proj to first_proj. Later will add to it the // distance from first_proj to the current point. This allows measuring // distance and time from ref_proj. Based on this, set the first line time. double ref_to_first_signed_dist = signedOrbitDistance(first_proj, ref_proj, first_proj, last_proj, dem_georef); if (opt.model_time) first_line_time = opt.ref_time + ref_to_first_signed_dist / opt.velocity; for (int i = 0; i < total; i++) { // Parametrize the orbital segment double t = double(i + first_pos) / std::max(double(opt.num_cameras - 1.0), 1.0); // Current satellite postion in projected coordinates vw::Vector3 curr_proj = first_proj * (1.0 - t) + last_proj * t; // Signed distance from ref_proj to curr_proj. double signed_dist = ref_to_first_signed_dist + t * orbit_len; // Record the time at which the camera is at this position. Must // be kept consistent with logic in genLinearCameras(). cam_times[i] = first_line_time + t * orbit_len / opt.velocity; // Time better be positive, otherwise it may be tricky to interpret the timestamp // with a dash in front. if (opt.model_time) { if (cam_times[i] <= 0) vw::vw_throw(vw::ArgumentErr() << "Time must be positive. Check --reference-time.\n"); if (cam_times[i] >= 1e+6) vw::vw_throw(vw::ArgumentErr() << "Time must be less than 1e+6. Check " << "--reference-time.\n"); } // Calc position along the trajectory and normalized along and across vectors // in ECEF. Produced along and across vectors are normalized and perpendicular // to each other. vw::Vector3 P, along, across; calcEcefTrajPtAlongAcross(curr_proj, dem_georef, delta, proj_along, proj_across, // Outputs, in ECEF P, along, across); // Adjust the camera if constrained by the ground but not by roll/pitch/yaw if (have_ground_pos && !have_roll_pitch_yaw) cameraAdjustment(opt.first_ground_pos, opt.last_ground_pos, t, dem_georef, dem, P, // outputs, will be normalized and perpendicular to each other along, across); // Find the z vector as perpendicular to both along and across vw::Vector3 down = vw::math::cross_prod(along, across); down = down / norm_2(down); // Camera position in ECEF positions[i] = P; // The camera to world rotation has these vectors as the columns. // For now the camera is pointing down. asp::assembleCam2WorldMatrix(along, across, down, cam2world[i]); // Save this before applying adjustments as below. These two // have some important differences, as can be seen below. ref_cam2world[i] = cam2world[i]; cam2world_no_jitter[i] = cam2world[i]; vw::Vector3 jitter_amp(0, 0, 0); if (model_jitter) jitter_amp = calcJitterAmplitude(opt, curr_proj, signed_dist); // If to apply a roll, pitch, yaw rotation if (have_roll_pitch_yaw) { vw::Matrix3x3 R = asp::rollPitchYaw(opt.roll + jitter_amp[0], opt.pitch + jitter_amp[1], opt.yaw + jitter_amp[2]); cam2world[i] = cam2world[i] * R; } // The rotation without jitter vw::Matrix3x3 R0 = vw::math::identity_matrix<3>(); if (have_roll_pitch_yaw) R0 = asp::rollPitchYaw(opt.roll, opt.pitch, opt.yaw); cam2world_no_jitter[i] = cam2world_no_jitter[i] * R0; // In either case apply the in-plane rotation from camera to satellite frame cam2world[i] = cam2world[i] * asp::rotationXY(); cam2world_no_jitter[i] = cam2world_no_jitter[i] * asp::rotationXY(); tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); return; } // Generate a prefix for produced image and camera names. std::string camPrefix(SatSimOptions const& opt, int iFrame, double timestamp, bool isRef, bool isFrame, std::string const& suffix) { std::string ref = ""; if (isRef) ref = "-ref"; // Prepare the timestamp string. If modeling time, will do sprintf with 7 // digits before dot and 9 after (with the dot, there will be 17 characters in // total). This is to ensure that the time is unique. Use fixed precision. Use // leading zeros to ensure that the string is always the same length and will // be sorted correctly. char time[256]; if (!isFrame) { time[0] = '\0'; // empty string } else { if (!opt.model_time) snprintf(time, sizeof(time), "-%d", 10000 + iFrame); // 5 characters, starts with 1 else snprintf(time, sizeof(time), "-%017.9f", timestamp); // 17 characters, 9 after dot } return opt.out_prefix + time + suffix + ref; } // A function to read Pinhole cameras from disk void readPinholeCameras(SatSimOptions const& opt, std::vector & cam_names, std::vector & cams) { // Read the camera names vw::vw_out() << "Reading: " << opt.camera_list << "\n"; asp::read_list(opt.camera_list, cam_names); // Sanity check if (cam_names.empty()) vw::vw_throw(vw::ArgumentErr() << "No cameras were found.\n"); cams.resize(cam_names.size()); for (int i = 0; i < int(cam_names.size()); i++) cams[i] = vw::CamPtr(new vw::camera::PinholeModel(cam_names[i])); // managed pointer return; } // A function to perturb the cameras. A lot of logic is in asp::genCamPoses(). void perturbCameras(SatSimOptions const& opt, std::string const& suffix, vw::cartography::GeoReference const& georef, std::vector const& cam_names, std::vector & cams) { // Must have as many cam names as cameras if (cam_names.size() != cams.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting as many camera names as cameras.\n"); std::vector out_cam_names(cam_names.size()); // Previous and current projected camera centers vw::Vector3 prev_proj_ctr(0, 0, 0), curr_proj_ctr(0, 0, 0); // Length along orbit from first to current camera double orbitLen = 0.0; for (int i = 0; i < int(cam_names.size()); i++) { // Camera must be pinhole vw::camera::PinholeModel * pin = dynamic_cast(cams[i].get()); if (pin == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting a Pinhole camera for: " << cam_names[i] << "\n"); vw::Vector3 cam_ctr = pin->camera_center(vw::Vector2()); vw::Matrix cam2world = pin->get_rotation_matrix(); vw::Vector3 llh = georef.datum().cartesian_to_geodetic(cam_ctr); // It is assume that the satellite points nadir. The camera is attached // to the satellite body at potentially an angle. vw::Matrix3x3 sat2world = georef.datum().lonlat_to_ned_matrix(llh); vw::Matrix3x3 cam2sat = inverse(sat2world) * cam2world; // The camera center in projected coordinates subvector(curr_proj_ctr, 0, 2) = georef.lonlat_to_point(subvector(llh, 0, 2)); curr_proj_ctr[2] = llh[2]; // The orbit length from the first to the current camera if (i > 0) orbitLen += calcOrbitLength(prev_proj_ctr, curr_proj_ctr, georef); // Jitter amplitude at the current location vw::Vector3 jitter_amp(0, 0, 0); if (std::isnan(opt.random_position_perturbation)) jitter_amp = calcJitterAmplitude(opt, curr_proj_ctr, orbitLen); // The jitter vibration is applied to the camera in the satellite frame vw::Matrix3x3 R_rpy = asp::rollPitchYaw(jitter_amp[0], jitter_amp[1], jitter_amp[2]); cam2world = sat2world * R_rpy * cam2sat; // Replace the camera rotation pin->set_camera_pose(cam2world); if (!std::isnan(opt.random_position_perturbation)) { // Seed the random number generator to ensure being in a different location // in orbit results in a different perturbation for same camera index. srand(vw::math::norm_2(curr_proj_ctr)); vw::Vector3 perturbation; for (int c = 0; c < 3; c++) perturbation[c] = (2 * double(rand())/double(RAND_MAX) - 1.0) * opt.random_position_perturbation; pin->set_camera_center(cam_ctr + perturbation); } // Will save the camera with the output prefix std::string camName = opt.out_prefix + "-" + fs::path(cam_names[i]).filename().string(); if (!opt.save_as_csm) { // Save the camera as pinhole vw::vw_out() << "Writing: " << camName << "\n"; pin->write(camName); } else { // Save as CSM cams[i] = boost::make_shared(); auto const& d = georef.datum(); // alias auto csmPtr = boost::dynamic_pointer_cast(cams[i]); csmPtr->createFrameModel(*pin, opt.image_size[0], opt.image_size[1], d.semi_major_axis(), d.semi_minor_axis()); // Replace extension with .json camName = fs::path(camName).replace_extension(".json").string(); vw::vw_out() << "Writing: " << camName << "\n"; csmPtr->saveState(camName); } out_cam_names[i] = camName; // The current camera becomes the previous one for next time prev_proj_ctr = curr_proj_ctr; } // Write the list std::string cam_list = opt.out_prefix + "-cameras" + suffix + ".txt"; vw::vw_out() << "Writing: " << cam_list << "\n"; asp::write_list(cam_list, out_cam_names); return; } // Check if we do a range bool skipCamera(int i, SatSimOptions const& opt) { if (opt.first_index >= 0 && opt.last_index >= 0 && (i < opt.first_index || i >= opt.last_index)) return true; return false; } // Given a transform from ref sensor to world, the ref sensor to current sensor, // create the transform from current sensor to world. Do it in-place. void applyRigTransform(Eigen::Affine3d const & ref_to_sensor, vw::Vector3 & ctr, vw::Matrix3x3 & cam2world) { // Create 4x4 transform matrix Eigen::Matrix cam2world4x4 = Eigen::Matrix::Identity(); for (int r = 0; r < 3; r++) { for (int c = 0; c < 3; c++) { cam2world4x4(r, c) = cam2world(r, c); } } for (int r = 0; r < 3; r++) cam2world4x4(r, 3) = ctr[r]; // Apply the rig transform cam2world4x4 = cam2world4x4 * ref_to_sensor.matrix().inverse(); // Extract the rotation and translation for (int r = 0; r < 3; r++) { for (int c = 0; c < 3; c++) { cam2world(r, c) = cam2world4x4(r, c); } ctr[r] = cam2world4x4(r, 3); } } // A function to create and save Pinhole cameras. Assume no distortion, and pixel // pitch = 1. void genPinholeCameras(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef, std::vector const& positions, std::vector const& cam2world, std::vector const& ref_cam2world, std::vector const& cam_times, bool have_rig, Eigen::Affine3d const& ref2sensor, std::string const& suffix, // Outputs std::vector & cam_names, std::vector & cams) { // Ensure we have as many camera positions as we have camera orientations if (positions.size() != cam2world.size() || positions.size() != ref_cam2world.size() || positions.size() != cam_times.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting as many camera positions as camera orientations.\n"); cams.resize(positions.size()); cam_names.resize(positions.size()); for (int i = 0; i < int(positions.size()); i++) { vw::Vector3 P = positions[i]; vw::Matrix3x3 R = cam2world[i]; vw::Vector3 P0 = positions[i]; vw::Matrix3x3 R0 = ref_cam2world[i]; if (have_rig) { // Must adjust for the rig applyRigTransform(ref2sensor, P, R); applyRigTransform(ref2sensor, P0, R0); } // Always create the cameras, but only save them if we are not skipping vw::cartography::Datum d = dem_georef.datum(); if (opt.save_as_csm) { cams[i] = boost::make_shared(); auto csmPtr = boost::dynamic_pointer_cast(cams[i]); csmPtr->createFrameModel(opt.image_size[0], opt.image_size[1], opt.optical_center[0], opt.optical_center[1], opt.focal_length, d.semi_major_axis(), d.semi_minor_axis(), P, R); } else { cams[i] = boost::make_shared (P, R, opt.focal_length, opt.focal_length, opt.optical_center[0], opt.optical_center[1]); } // This is useful for understanding things in the satellite frame vw::camera::PinholeModel pinRefCam; asp::CsmModel csmRefCam; if (opt.save_ref_cams) { if (opt.save_as_csm) csmRefCam.createFrameModel(opt.image_size[0], opt.image_size[1], opt.optical_center[0], opt.optical_center[1], opt.focal_length, d.semi_major_axis(), d.semi_minor_axis(), P0, R0); else pinRefCam = vw::camera::PinholeModel(P0, R0, opt.focal_length, opt.focal_length, opt.optical_center[0], opt.optical_center[1]); } std::string ext; if (opt.save_as_csm) ext = ".json"; else ext = ".tsai"; // The suffix is used with the rig bool isRef = false, isFrame = true; std::string camName = camPrefix(opt, i, cam_times[i], isRef, isFrame, suffix) + ext; cam_names[i] = camName; // Check if we do a range if (skipCamera(i, opt)) continue; vw::vw_out() << "Writing: " << camName << "\n"; if (opt.save_as_csm) { auto csmPtr = boost::dynamic_pointer_cast(cams[i]); csmPtr->saveState(camName); } else { auto pinPtr = boost::dynamic_pointer_cast(cams[i]); pinPtr->write(camName); } if (opt.save_ref_cams) { bool isRef = true; std::string refCamName = camPrefix(opt, i, cam_times[i], isRef, isFrame, suffix) + ext; vw::vw_out() << "Writing: " << refCamName << "\n"; if (opt.save_as_csm) csmRefCam.saveState(refCamName); else pinRefCam.write(refCamName); } } // Write the list of cameras only if we are not skipping the first camera // Otherwise the same file may be written by multiple processes. if (!skipCamera(0, opt)) { std::string cam_list = opt.out_prefix + "-cameras" + suffix + ".txt"; vw::vw_out() << "Writing: " << cam_list << "\n"; asp::write_list(cam_list, cam_names); } else { // Print a warning message that the list won't be saved vw::vw_out(vw::WarningMessage) << "The camera list is saved only when " << "--first-index is 0, to avoid a race condition.\n"; } return; } // Bring crops in memory. It greatly helps with multi-threading speed. // This function is used only for small tiles, to avoid running out of memory // (which did happen). void setupCroppedDemAndOrtho(vw::Vector2 const& image_size, vw::CamPtr const& cam, vw::ImageViewRef> const& dem, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& ortho, vw::cartography::GeoReference const& ortho_georef, double blur_sigma, // Outputs vw::ImageView> & crop_dem, vw::cartography::GeoReference & crop_dem_georef, vw::ImageView> & crop_ortho, vw::cartography::GeoReference & crop_ortho_georef) { // Find the bounding box of the dem and ortho portions seen in the camera, // in projected coordinates float mean_gsd = 0.0; bool quick = true; // Assumes a big DEM fully containing the image vw::BBox2 dem_box; try { // This is a bugfix. The camera_bbox function can fail if we want an // extent that does not fit fully with the input DEM/orthoimage. // We could use above quick = false, but then we'd get only partial // synthetic images, which isn't good. dem_box = vw::cartography::camera_bbox(dem, dem_georef, dem_georef, cam, image_size[0], image_size[1], mean_gsd, quick); } catch (const vw::Exception& e) { vw::vw_throw(vw::ArgumentErr() << "sat_sim: Failed to compute a synthetic image. " << "The most likely cause is that the desired image is out of bounds given " << "the input DEM and orthoimage.\n"); } vw::cartography::GeoTransform d2o(dem_georef, ortho_georef); vw::BBox2 ortho_box = d2o.point_to_point_bbox(dem_box); // Find the DEM pixel box and expand it in case there was some inaccuracies // in finding the box vw::BBox2i dem_pixel_box = dem_georef.point_to_pixel_bbox(dem_box); int expand = 50; dem_pixel_box.expand(expand); dem_pixel_box.crop(vw::bounding_box(dem)); // Same for the ortho vw::BBox2i ortho_pixel_box = ortho_georef.point_to_pixel_bbox(ortho_box); ortho_pixel_box.expand(expand); // Adjust for any blur int kernel_size = 0; if (blur_sigma > 0) { kernel_size = vw::compute_kernel_size(blur_sigma); ortho_pixel_box.expand(kernel_size); // to avoid edge effects } ortho_pixel_box.crop(vw::bounding_box(ortho)); // Crop crop_dem = vw::crop(dem, dem_pixel_box); crop_dem_georef = crop(dem_georef, dem_pixel_box); if (blur_sigma > 0) crop_ortho = vw::crop(vw::gaussian_filter(ortho, blur_sigma), ortho_pixel_box); else crop_ortho = vw::crop(ortho, ortho_pixel_box); crop_ortho_georef = crop(ortho_georef, ortho_pixel_box); } // Create a synthetic image with multiple threads typedef vw::ImageView> ImageT; class SynImageView: public vw::ImageViewBase { typedef typename ImageT::pixel_type PixelT; SatSimOptions const& m_opt; vw::CamPtr m_cam; vw::cartography::GeoReference m_dem_georef; // make a copy to be thread-safe vw::ImageViewRef> m_dem; double m_height_guess; vw::cartography::GeoReference m_ortho_georef; // make a copy to be thread-safe vw::ImageViewRef> m_ortho; float m_ortho_nodata_val; public: SynImageView(SatSimOptions const& opt, vw::CamPtr const& cam, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::cartography::GeoReference const& ortho_georef, vw::ImageViewRef> ortho, float ortho_nodata_val): m_opt(opt), m_cam(cam), m_dem_georef(dem_georef), m_dem(dem), m_height_guess(height_guess), m_ortho_georef(ortho_georef), m_ortho(ortho), m_ortho_nodata_val(ortho_nodata_val) {} typedef PixelT pixel_type; typedef PixelT result_type; typedef vw::ProceduralPixelAccessor pixel_accessor; inline vw::int32 cols() const { return m_opt.image_size[0]; } inline vw::int32 rows() const { return m_opt.image_size[1]; } inline vw::int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()( double/*i*/, double/*j*/, vw::int32/*p*/ = 0 ) const { vw::vw_throw(vw::NoImplErr() << "SynImageView::operator()(...) is not implemented"); return pixel_type(); } typedef vw::CropView> prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const { // Expand the box a bit, to help with interpolation in the ortho image later vw::BBox2i extra_bbox = bbox; extra_bbox.expand(10); extra_bbox.crop(vw::BBox2i(0, 0, cols(), rows())); vw::Vector2 crop_start = extra_bbox.min(); vw::Vector2 crop_image_size = extra_bbox.max() - extra_bbox.min(); // Must adjust the camera to be able work with the current box, which // does not necessarily start at (0,0). We only adjust the starting // position, and not any other params vw::Vector3 translation(0, 0, 0); vw::Quat rotation(vw::math::identity_matrix<3>()); vw::Vector2 pixel_offset = crop_start; double scale = 1.0; vw::CamPtr crop_cam(new vw::camera::AdjustedCameraModel(m_cam, translation, rotation, pixel_offset, scale)); // Bring crops in memory. It greatly helps with multi-threading speed. vw::cartography::GeoReference crop_dem_georef; // make a copy to be thread-safe vw::ImageView> crop_dem; vw::cartography::GeoReference crop_ortho_georef; // make a copy to be thread-safe vw::ImageView> crop_ortho; setupCroppedDemAndOrtho(crop_image_size, crop_cam, m_dem, m_dem_georef, m_ortho, m_ortho_georef, m_opt.blur_sigma, // Outputs crop_dem, crop_dem_georef, crop_ortho, crop_ortho_georef); // Create interpolated image with bicubic interpolation with invalid pixel // edge extension vw::PixelMask nodata_mask = vw::PixelMask(); // invalid value nodata_mask.invalidate(); auto interp_ortho = vw::interpolate(crop_ortho, vw::BicubicInterpolation(), vw::ValueEdgeExtension>(nodata_mask)); // The location where the ray intersects the ground. We will use each obtained // location as initial guess for the next ray. This may not be always a great // guess, but it is better than starting nowhere. It should work decently // if the camera is high, and with a small footprint on the ground. vw::Vector3 xyz_guess(0, 0, 0); vw::ImageView tile(bbox.width(), bbox.height()); for (int col = bbox.min().x(); col < bbox.max().x(); col++) { for (int row = bbox.min().y(); row < bbox.max().y(); row++) { // These will use to index into the tile int c = col - bbox.min().x(); int r = row - bbox.min().y(); // Start with an invalid pixel tile(c, r) = vw::PixelMask(); tile(c, r).invalidate(); // Here use the full image pixel indices vw::Vector2 pix(col, row); // Also use original camera vw::Vector3 cam_ctr = m_cam->camera_center(pix); vw::Vector3 cam_dir = m_cam->pixel_to_vector(pix); // Intersect the ray going from the given camera pixel with a DEM // Use xyz_guess as initial guess and overwrite it with the new value bool treat_nodata_as_zero = false; bool has_intersection = false; double max_abs_tol = std::min(m_opt.dem_height_error_tol, 1e-14); double max_rel_tol = max_abs_tol; int num_max_iter = 100; vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz (cam_ctr, cam_dir, crop_dem, crop_dem_georef, treat_nodata_as_zero, has_intersection, m_opt.dem_height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess, m_height_guess); if (!has_intersection) continue; // will result in nodata pixels // Update the guess for nex time, now that we have a valid intersection point xyz_guess = xyz; // Find the texture value at the intersection point by interpolation. // This will result in an invalid value if if out of range or if the // image itself has invalid pixels. vw::Vector3 llh = crop_dem_georef.datum().cartesian_to_geodetic(xyz); vw::Vector2 ortho_pix = crop_ortho_georef.lonlat_to_pixel (vw::Vector2(llh[0], llh[1])); tile(c, r) = interp_ortho(ortho_pix[0], ortho_pix[1]); } } return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } template inline void rasterize(DestT const& dest, vw::BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // Generate images by projecting rays from the sensor to the ground void genImages(SatSimOptions const& opt, bool external_cameras, std::vector const& cam_names, std::vector const& cams, std::string const& suffix, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::cartography::GeoReference const& ortho_georef, vw::ImageViewRef> ortho, float ortho_nodata_val) { vw::vw_out() << "Generating images.\n"; // Generate image names from camera names by replacing the extension std::vector image_names; image_names.resize(cam_names.size()); for (int i = 0; i < int(cam_names.size()); i++) { if (external_cameras) image_names[i] = opt.out_prefix + "-" + fs::path(cam_names[i]).filename().replace_extension(".tif").string(); else // just replace the extension image_names[i] = fs::path(cam_names[i]).replace_extension(".tif").string(); } for (size_t i = 0; i < cams.size(); i++) { // Check if we do a range if (skipCamera(i, opt)) continue; // Save the image using the block write function with multiple threads // Increase the tile size, as otherwise this code becomes very slow // since a time-consuming camera box calculation happens in each tile. // TODO(oalexan1): Figure out why the slowdown. vw::vw_out() << "Writing: " << image_names[i] << "\n"; bool has_georef = false; // the produced image is raw, it has no georef bool has_nodata = true; SatSimOptions local_opt = opt; local_opt.raster_tile_size = vw::Vector2i(512, 512); block_write_gdal_image(image_names[i], vw::apply_mask(SynImageView(opt, cams[i], dem_georef, dem, height_guess, ortho_georef, ortho, ortho_nodata_val), ortho_nodata_val), has_georef, ortho_georef, has_nodata, ortho_nodata_val, local_opt, vw::TerminalProgressCallback("", "\t--> ")); } // Write the list of images only if we are not skipping the first camera // Otherwise the same file may be written by multiple processes. Also // do this only for pinhole cameras, as for linescan there is only one // image/camera rather than a set. if (opt.sensor_type == "pinhole") { if (!skipCamera(0, opt)) { std::string image_list = opt.out_prefix + "-images" + suffix + ".txt"; vw::vw_out() << "Writing: " << image_list << "\n"; asp::write_list(image_list, image_names); } else { // Print a warning message that the list won't be saved vw::vw_out(vw::WarningMessage) << "The image list is saved only when " << "--first-index is 0, to avoid a race condition.\n"; } } return; } // If sensor type is one value, make a vector of that value with // as many entries as sensor names. Otherwise split by comma, // and there must be as many entries as sensors. void handleSensorType(int num_sensors, std::string const& sensor_type, std::vector & sensor_types) { boost::split(sensor_types, sensor_type, boost::is_any_of(",")); // If only one, fill to make num_sensors if (sensor_types.size() == 1) { std::string val = sensor_types[0]; sensor_types.clear(); for (int i = 0; i < num_sensors; i++) sensor_types.push_back(val); } // There must be as many as sensors if (int(sensor_types.size()) != num_sensors) vw::vw_throw(vw::ArgumentErr() << "Expecting as many sensor types as sensors.\n"); // Each must be linescan or pinhole for (int i = 0; i < int(sensor_types.size()); i++) { if (sensor_types[i] == "frame") sensor_types[i] = "pinhole"; // frame is synonymous with pinhole if (sensor_types[i] != "linescan" && sensor_types[i] != "pinhole") vw::vw_throw(vw::ArgumentErr() << "Expecting sensor type to be linescan " << "or pinhole/frame.\n"); } } // Generate cameras and images for a sensor void genCamerasImages(float ortho_nodata_val, bool have_rig, int rig_sensor_index, vw::ImageViewRef> dem, double height_guess, vw::cartography::GeoReference const& ortho_georef, vw::ImageViewRef> ortho, SatSimOptions & opt, rig::RigSet & rig, vw::cartography::GeoReference const& dem_georef, std::string const& suffix) { std::vector positions; std::vector cam2world, cam2world_no_jitter, ref_cam2world; std::vector cam_times; int first_pos = 0; // used with linescan poses, which start before first image line double orbit_len = 0.0, first_line_time = 0.0; // will change // Compute the camera poses. Some logic here is different for linescan and frame // cameras, that's why this logic is called individually for each rig sensor, // even though if all sensors are of the same time it would be enough to call // it once. asp::genCamPoses(opt, dem_georef, dem, height_guess, have_rig, // Outputs first_pos, first_line_time, orbit_len, positions, cam2world, cam2world_no_jitter, ref_cam2world, cam_times, rig); // In genCamPoses() the rig may have been updated. Fetch the latest. Eigen::Affine3d ref2sensor = Eigen::Affine3d::Identity(); if (have_rig) ref2sensor = rig.ref_to_cam_trans[rig_sensor_index]; // Sequence of camera names and cameras for one sensor std::vector cam_names; std::vector cams; // The suffix is needed to distinguish the cameras and images for each rig sensor if (opt.sensor_type == "pinhole") asp::genPinholeCameras(opt, dem_georef, positions, cam2world, ref_cam2world, cam_times, have_rig, ref2sensor, suffix, cam_names, cams); else asp::genLinescanCameras(first_line_time, orbit_len, dem_georef, dem, first_pos, positions, cam2world, cam2world_no_jitter, ref_cam2world, cam_times, height_guess, have_rig, ref2sensor, suffix, opt, cam_names, cams); bool external_cameras = false; if (!opt.no_images) asp::genImages(opt, external_cameras, cam_names, cams, suffix, dem_georef, dem, height_guess, ortho_georef, ortho, ortho_nodata_val); } // Generate the cameras and images for a rig void genRigCamerasImages(SatSimOptions & opt, rig::RigSet & rig, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::cartography::GeoReference const& ortho_georef, vw::ImageViewRef> ortho, float ortho_nodata_val) { // Sanity checks if (opt.rig_config == "") vw::vw_throw(vw::ArgumentErr() << "The rig configuration file must be set.\n"); // Handle sensor types std::vector sensor_types; handleSensorType(rig.cam_names.size(), opt.sensor_type, sensor_types); std::vector sensor_names; if (opt.sensor_name == "all") sensor_names = rig.cam_names; else boost::split(sensor_names, opt.sensor_name, boost::is_any_of(",")); // Map from each sensor in rig.cam_names to index std::map sensor_name2index; for (int i = 0; i < int(rig.cam_names.size()); i++) sensor_name2index[rig.cam_names[i]] = i; // Iterate over sensor_names. Check if it is sensor_name2index for (size_t sensor_it = 0; sensor_it < sensor_names.size(); sensor_it++) { auto it = sensor_name2index.find(sensor_names[sensor_it]); if (it == sensor_name2index.end()) vw::vw_throw(vw::ArgumentErr() << "Sensor: " << sensor_names[sensor_it] << " not found in the rig.\n"); // Pass the intrinsics to a local copy of the options SatSimOptions local_opt = opt; int sensor_index = it->second; auto params = rig.cam_params[sensor_index]; local_opt.focal_length = params.GetFocalLength(); local_opt.optical_center[0] = params.GetOpticalOffset()[0]; local_opt.optical_center[1] = params.GetOpticalOffset()[1]; local_opt.image_size[0] = params.GetDistortedSize()[0]; local_opt.image_size[1] = params.GetDistortedSize()[1]; local_opt.sensor_type = sensor_types[sensor_index]; // The transform from the reference sensor to the current sensor Eigen::Affine3d ref2sensor = rig.ref_to_cam_trans[sensor_index]; std::string suffix = "-" + rig.cam_names[sensor_index]; bool have_rig = true; genCamerasImages(ortho_nodata_val, have_rig, sensor_index, dem, height_guess, ortho_georef, ortho, local_opt, rig, dem_georef, suffix); } } // Modify the rig that was used to produce the images to make the sensor transforms // relative to the first sensor.or. void writeRelRig(std::string const& out_prefix, rig::RigSet const& rig) { rig::RigSet ref_rig = rig; for (size_t i = 0; i < rig.ref_to_cam_trans.size(); i++) ref_rig.ref_to_cam_trans[i] = rig.ref_to_cam_trans[i] * rig.ref_to_cam_trans[0].inverse(); // Ensure the first transform is identity. Now it may not be precisely it // because of numerical errors. ref_rig.ref_to_cam_trans[0] = Eigen::Affine3d::Identity(); std::string ref_rig_config = out_prefix + "-rig_config.txt"; bool have_rig = true; rig::writeRigConfig(ref_rig_config, have_rig, ref_rig); } } // end namespace asp ================================================ FILE: src/asp/Camera/SatSim.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file SatSim.h // Functions used for the sat_sim.cc tool that are not general enough to put // somewhere else. #ifndef __ASP_CAMERA_SATSIM_H__ #define __ASP_CAMERA_SATSIM_H__ #include #include #include #include #include #include #include #include #include #include namespace rig { class RigSet; } namespace asp { struct SatSimOptions: vw::GdalWriteOptions { std::string dem_file, ortho_file, out_prefix, camera_list, sensor_type, rig_sensor_ground_offsets, rig_sensor_rotation_angles; vw::Vector3 first, last; // dem pixel and height above dem datum int num_cameras, first_index, last_index; vw::Vector2 optical_center, image_size, first_ground_pos, last_ground_pos; double focal_length, dem_height_error_tol, blur_sigma; double roll, pitch, yaw, velocity, frame_rate, ref_time, random_position_perturbation; std::vector jitter_frequency, jitter_amplitude, jitter_phase, horizontal_uncertainty; std::string jitter_frequency_str, jitter_amplitude_str, jitter_phase_str, horizontal_uncertainty_str, rig_config, sensor_name; bool no_images, save_ref_cams, non_square_pixels, save_as_csm, model_time, perturb_cameras, random_pose_perturbation; SatSimOptions() {} }; // A function to read the cameras from a file void readPinholeCameras(SatSimOptions const& opt, std::vector & cam_names, std::vector & cams); // A function to perturb the cameras void perturbCameras(SatSimOptions const& opt, std::string const& suffix, vw::cartography::GeoReference const& georef, std::vector const& cam_names, std::vector & cams); // Generate a prefix for produced image and camera names. std::string camPrefix(SatSimOptions const& opt, int iFrame, double timestamp, bool isRef, bool isFrame, std::string const& suffix); // A function to create and save the cameras. Assume no distortion, and pixel // pitch = 1. void genPinholeCameras(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef, std::vector const& positions, std::vector const& cam2world, std::vector const& ref_cam2world, std::vector const& cam_times, bool have_rig, Eigen::Affine3d const& ref2sensor, std::string const& suffix, // Outputs std::vector & cam_names, std::vector & cams); // Generate images by projecting rays from the sensor to the ground void genImages(SatSimOptions const& opt, bool external_cameras, std::vector const& cam_names, std::vector const& cams, std::string const& suffix, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::cartography::GeoReference const& ortho_georef, vw::ImageViewRef> ortho, float ortho_nodata_val); // Generate cameras and images for a sensor void genCamerasImages(float ortho_nodata_val, bool have_rig, int rig_sensor_index, vw::ImageViewRef> dem, double height_guess, vw::cartography::GeoReference const& ortho_georef, vw::ImageViewRef> ortho, SatSimOptions & opt, rig::RigSet & rig, vw::cartography::GeoReference const& dem_georef, std::string const& suffix); // Generate the cameras and images for a rig void genRigCamerasImages(SatSimOptions & opt, rig::RigSet & rig, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> dem, double height_guess, vw::cartography::GeoReference const& ortho_georef, vw::ImageViewRef> ortho, float ortho_nodata_val); // Given a transform from ref sensor to world, the ref sensor to current sensor, // create the transform from current sensor to world. Do it in-place. void applyRigTransform(Eigen::Affine3d const & ref_to_sensor, vw::Vector3 & ctr, vw::Matrix3x3 & cam2world); // Write the rig used by this program and the rig in which each sensor // is relative to the first sensor. void writeRelRig(std::string const& out_prefix, rig::RigSet const& rig); // A little function to avoid repetitive code in many places. // Get the value of a map key if known to exist. template A mapVal(std::map const& m, B const& key) { auto it = m.find(key); if (it == m.end()) vw::vw_throw(vw::ArgumentErr() << "Could not find key " << key << " in map.\n"); return it->second; } } // end namespace asp #endif//__ASP_CAMERA_SATSIM_H__ ================================================ FILE: src/asp/Camera/SyntheticLinescan.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // Allow finding the time at any line, even negative ones. Here a // simple slope-intercept formula is used rather than a table. // This was a temporary function used for debugging // double get_time_at_line(double line) const { // csm::ImageCoord csm_pix; // asp::toCsmPixel(vw::Vector2(0, line), csm_pix); // return ls_model->getImageTime(csm_pix); // } // The pointing vector in sensor coordinates, before applying cam2world. This // is for testing purposes. Normally CSM takes care of this internally. // This was a temporary function used for debugging // vw::Vector3 get_local_pixel_to_vector(vw::Vector2 const& pix) const { // vw::Vector3 result(pix[0] + detector_origin[0], // detector_origin[1], // ls_model->m_focalLength); // // Make the direction have unit length // result = normalize(result); // return result; // } // Compare the camera center and direction with pinhole. A very useful // test. void PinLinescanTest(SatSimOptions const & opt, asp::CsmModel const & ls_cam, std::map const & positions, std::map const & cam2world) { for (int i = 0; i < int(positions.size()); i++) { auto pin_cam = vw::camera::PinholeModel(asp::mapVal(positions, i), asp::mapVal(cam2world, i), opt.focal_length, opt.focal_length, opt.optical_center[0], opt.optical_center[1]); double line = (opt.image_size[1] - 1.0) * i / std::max((positions.size() - 1.0), 1.0); // Need care here. ls_pix is on the line. vw::Vector2 pin_pix(opt.optical_center[0], opt.optical_center[1]); vw::Vector2 ls_pix (opt.optical_center[0], line); // The differences below must be 0 vw::Vector3 ls_ctr = ls_cam.camera_center(ls_pix); vw::Vector3 pin_ctr = pin_cam.camera_center(pin_pix); std::cout << "ls ctr and and pin - ls ctr diff: " << ls_ctr << " " << norm_2(pin_ctr - ls_ctr) << std::endl; vw::Vector3 ls_dir = ls_cam.pixel_to_vector(ls_pix); vw::Vector3 pin_dir = pin_cam.pixel_to_vector(pin_pix); std::cout << "ls dir and pin - ls dir diff: " << ls_dir << " " << norm_2(pin_dir - ls_dir) << std::endl; } } // Wrapper for logic to intersect DEM with ground. The xyz provided on input serves // as initial guess and gets updated on output if the intersection succeeds. Return // true on success. bool intersectDemWithRay(SatSimOptions const& opt, vw::cartography::GeoReference const& dem_georef,vw::ImageViewRef> dem, vw::Vector3 const& cam_ctr, vw::Vector3 const& cam_dir, double height_guess, // Output vw::Vector3 & xyz) { // Find the intersection of this ray with the ground bool treat_nodata_as_zero = false; bool has_intersection = false; double max_abs_tol = std::min(opt.dem_height_error_tol, 1e-14); double max_rel_tol = max_abs_tol; int num_max_iter = 100; vw::Vector3 local_xyz = vw::cartography::camera_pixel_to_dem_xyz (cam_ctr, cam_dir, dem, dem_georef, treat_nodata_as_zero, has_intersection, // Below we use a prudent approach. Try to make the solver work // hard. It is not clear if this is needed. std::min(opt.dem_height_error_tol, 1e-8), max_abs_tol, max_rel_tol, num_max_iter, xyz, height_guess); if (!has_intersection) return false; // Update xyz with produced value if we succeeded xyz = local_xyz; return true; } // Estimate pixel aspect ratio (width / height) of a pixel on the ground double pixelAspectRatio(SatSimOptions const & opt, vw::cartography::GeoReference const & dem_georef, asp::CsmModel const & ls_cam, vw::ImageViewRef> dem, double height_guess) { // Put here a stop watch //vw::Stopwatch sw; //sw.start(); // We checked that the image width and height is at least 2 pixels. That is // needed to properly create the CSM model. Now do some samples to see how the // pixel width and height are on the ground. Use a small set of samples. Should be good // enough. Note how we go a little beyond each sample, while still not exceeding // the designed image size. double samp_x = (opt.image_size[0] - 1.0) / 10.0; double samp_y = (opt.image_size[1] - 1.0) / 10.0; std::vector ratios; vw::Vector3 xyz(0, 0, 0); // intersection with DEM, will be updated below for (double x = 0; x < opt.image_size[0] - 1.0; x += samp_x) { for (double y = 0; y < opt.image_size[1] - 1.0; y += samp_y) { // Find the intersection of the ray from this pixel with the ground vw::Vector2 pix(x, y); vw::Vector3 ctr = ls_cam.camera_center(pix); vw::Vector3 dir = ls_cam.pixel_to_vector(pix); bool ans = intersectDemWithRay(opt, dem_georef, dem, ctr, dir, height_guess, xyz); if (!ans) continue; vw::Vector3 P0 = xyz; // Add a little to the pixel, but stay within the image bounds double dx = std::min(samp_x, 0.5); double dy = std::min(samp_y, 0.5); // See pixel width on the ground pix = vw::Vector2(x + dx, y); ctr = ls_cam.camera_center(pix); dir = ls_cam.pixel_to_vector(pix); ans = intersectDemWithRay(opt, dem_georef, dem, ctr, dir, height_guess, xyz); if (!ans) continue; vw::Vector3 Px = xyz; // See pixel height on the ground pix = vw::Vector2(x, y + dy); ctr = ls_cam.camera_center(pix); dir = ls_cam.pixel_to_vector(pix); ans = intersectDemWithRay(opt, dem_georef, dem, ctr, dir, height_guess, xyz); if (!ans) continue; vw::Vector3 Py = xyz; double ratio = norm_2(Px - P0) / norm_2(Py - P0); if (std::isnan(ratio) || std::isinf(ratio) || ratio <= 0.0) continue; ratios.push_back(ratio); } } if (ratios.empty()) vw::vw_throw(vw::ArgumentErr() << "No valid samples found to compute " << "the pixel width and height on the ground.\n"); double ratio = vw::math::destructive_median(ratios); //sw.stop(); //std::cout << "Time to compute pixel aspect ratio: " << sw.elapsed_seconds() << std::endl; return ratio; } // Form a linescan camera taking into account the reference sensor to current // rig sensor transform. void populateCsmLinescanRig(double first_line_time, double dt_line, double t0_ephem, double dt_ephem, double t0_quat, double dt_quat, double focal_length, vw::Vector2 const & optical_center, vw::Vector2i const & image_size, vw::cartography::Datum const & datum, std::string const & sensor_id, std::vector const & positions, std::vector const & velocities, std::vector const & cam2world, bool have_rig, Eigen::Affine3d const & ref2sensor, // Outputs asp::CsmModel & model) { // If there is a rig, must apply the proper transforms to positions and orientations if (!have_rig) { populateCsmLinescan(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat, focal_length, optical_center, image_size, datum, sensor_id, positions, velocities, cam2world, model); } else { std::vector trans_positions(positions.size()); std::vector trans_cam2world(cam2world.size()); for (size_t i = 0; i < positions.size(); i++) { vw::Vector3 P = positions[i]; vw::Matrix3x3 R = cam2world[i]; applyRigTransform(ref2sensor, P, R); trans_positions[i] = P; trans_cam2world[i] = R; } populateCsmLinescan(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat, focal_length, optical_center, image_size, datum, sensor_id, trans_positions, velocities, trans_cam2world, model); } } // Create and save a linescan camera with given camera positions and orientations. // There will be just one of them, as all poses are part of the same linescan camera. void genLinescanCameras(double first_line_time, double orbit_len, vw::cartography::GeoReference const & dem_georef, vw::ImageViewRef> dem, int first_pos, std::vector const & positions, std::vector const & cam2world, std::vector const & cam2world_no_jitter, std::vector const & ref_cam2world, std::vector const & cam_times, double height_guess, bool have_rig, Eigen::Affine3d const & ref2sensor, std::string const & suffix, // Outputs SatSimOptions & opt, std::vector & cam_names, std::vector & cams) { // Sanity checks if (cam2world.size() != positions.size() || cam2world_no_jitter.size() != positions.size() || ref_cam2world.size() != positions.size() || cam_times.size() != positions.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting as many camera orientations as positions.\n"); // Initialize the outputs cam_names.clear(); cams.clear(); // Measure time based on the length of the segment between 1st and last line. // Must be consistent with genCamPoses(). double orbit_segment_time = orbit_len / opt.velocity; double dt_line = orbit_segment_time / (opt.image_size[1] - 1.0); // Positions and orientations use the same starting time and spacing. Note // that opt.num_cameras is the number of cameras within the desired orbital // segment of length orbit_len, and also the number of cameras for which we // have image lines. We will have extra cameras beyond that segment to make it // easy to interpolate the camera position and orientation at any time and // also to solve for jitter. Here we adjust things so that the camera at first // image line has time 0. if (first_pos > 0) vw::vw_throw(vw::ArgumentErr() << "First position index must be non-positive.\n"); double dt_ephem = orbit_segment_time / (opt.num_cameras - 1.0); double dt_quat = dt_ephem; double t0_ephem = first_line_time + first_pos * dt_ephem; double t0_quat = t0_ephem; // Sanity check. The linescan time logic here must agree with the logic in // genCamPoses(), including for frame cameras. for (size_t i = 0; i < positions.size(); i++) { if (opt.model_time && std::abs(t0_ephem + dt_ephem * i - cam_times[i]) > 1e-8) vw::vw_throw(vw::ArgumentErr() << "Time mismatch. Use a smaller --reference-time.\n"); } // We have no velocities in this context, so set them to 0 std::vector velocities(positions.size(), vw::Vector3(0, 0, 0)); // Create the camera. Will be later owned by a smart pointer. asp::CsmModel * ls_cam = new asp::CsmModel; std::string sensor_id = "SyntheticLinescan"; // We assume no optical offset in y for this synthetic camera vw::Vector2 local_optical_center(opt.optical_center[0], 0.0); // If creating square pixels, must use the camera without jitter to estimate // the image height. Otherwise the image height produced from the camera with // jitter will be inconsistent with the one without jitter. This is a bugfix. if (!opt.non_square_pixels) populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat, opt.focal_length, local_optical_center, opt.image_size, dem_georef.datum(), sensor_id, positions, velocities, cam2world_no_jitter, have_rig, ref2sensor, *ls_cam); // output else populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat, opt.focal_length, local_optical_center, opt.image_size, dem_georef.datum(), sensor_id, positions, velocities, cam2world, have_rig, ref2sensor, *ls_cam); // output // Sanity check (very useful) // PinLinescanTest(opt, *ls_cam, positions, cam2world); if (!opt.non_square_pixels) { // Find the pixel aspect ratio on the ground (x/y) vw::vw_out() << "Adjusting the linescan image height from " << opt.image_size[1] << " to "; double ratio = pixelAspectRatio(opt, dem_georef, *ls_cam, dem, height_guess); // Adjust the image height to make the pixels square opt.image_size[1] = std::max(round(opt.image_size[1] / ratio), 2.0); // Must adjust the time spacing to match the new image height dt_line = orbit_segment_time / (opt.image_size[1] - 1.0); vw::vw_out() << opt.image_size[1] << " pixels, to make the ground " << "projection of an image pixel be roughly square.\n"; // Recreate the camera with this aspect ratio. This time potentially use the // camera with jitter. populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat, opt.focal_length, local_optical_center, opt.image_size, dem_georef.datum(), sensor_id, positions, velocities, cam2world, have_rig, ref2sensor, *ls_cam); // output // Sanity check (very useful for testing, the new ratio must be close to 1.0) // ratio = pixelAspectRatio(opt, dem_georef, *ls_cam, dem, height_guess); } double timestamp = std::numeric_limits::quiet_NaN(); int iFrame = -1; // No frame index for linescan cameras bool isRef = false; bool isFrame = false; std::string ref= ""; std::string filename = camPrefix(opt, iFrame, timestamp, isRef, isFrame, suffix) + ".json"; vw::vw_out() << "Writing: " << filename << "\n"; ls_cam->saveState(filename); if (opt.save_ref_cams) { asp::CsmModel ref_cam; populateCsmLinescanRig(first_line_time, dt_line, t0_ephem, dt_ephem, t0_quat, dt_quat, opt.focal_length, local_optical_center, opt.image_size, dem_georef.datum(), sensor_id, positions, velocities, ref_cam2world, have_rig, ref2sensor, ref_cam); // output isRef = true; std::string ref_filename = camPrefix(opt, iFrame, timestamp, isRef, isFrame, suffix) + ".json"; vw::vw_out() << "Writing: " << ref_filename << "\n"; ref_cam.saveState(ref_filename); } // Save the camera name and smart pointer to camera cam_names.push_back(filename); cams.push_back(vw::CamPtr(ls_cam)); return; } // A function to read Linescan cameras from disk. There will // be just one of them, but same convention is kept as for Pinhole // where there is many of them. Note that the camera is created as of CSM type, // rather than asp::CsmModel type. This is not important as we will // abstract it right away to the base class. void readLinescanCameras(SatSimOptions const& opt, std::vector & cam_names, std::vector & cams) { // Read the camera names vw::vw_out() << "Reading: " << opt.camera_list << std::endl; asp::read_list(opt.camera_list, cam_names); // Sanity checks if (cam_names.empty()) vw::vw_throw(vw::ArgumentErr() << "No cameras were found.\n"); if (cam_names.size() != 1) vw::vw_throw(vw::ArgumentErr() << "Only one linescan camera is expected.\n"); cams.resize(cam_names.size()); for (int i = 0; i < int(cam_names.size()); i++) cams[i] = vw::CamPtr(new asp::CsmModel(cam_names[i])); return; } } // end namespace asp ================================================ FILE: src/asp/Camera/SyntheticLinescan.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file SyntheticLinescan.h /// /// A synthetic linescan model as a wrapper around CSM. #ifndef __STEREO_CAMERA_SYNTHETIC_LINESCAN_H__ #define __STEREO_CAMERA_SYNTHETIC_LINESCAN_H__ #include #include #include namespace vw { namespace cartography { class GeoReference; } } namespace asp { struct SatSimOptions; class RigSet; // Create and save a linescan camera with given camera positions and orientations. // There will be just one of them, as all poses are part of the same linescan camera. // See the .cc file for more details. void genLinescanCameras(double first_line_time, double orbit_len, vw::cartography::GeoReference const & dem_georef, vw::ImageViewRef> dem, int first_pos, std::vector const & positions, std::vector const & cam2world, std::vector const & cam2world_no_jitter, std::vector const & ref_cam2world, std::vector const & cam_times, double height_guess, bool have_rig, Eigen::Affine3d const & ref2sensor, std::string const & suffix, // Outputs SatSimOptions & opt, std::vector & cam_names, std::vector & cams); // A function to read Linescan cameras from disk in CSM format. There will // be just one of them. void readLinescanCameras(SatSimOptions const& opt, std::vector & cam_names, std::vector & cams); } // end namespace asp #endif//__STEREO_CAMERA_SYNTHETIC_LINESCAN_H__ ================================================ FILE: src/asp/Camera/TimeProcessing.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include namespace asp { // Boost does not like a time string such as "2017-12-07 15:36:40.90795Z" // because it expects precisely 6 digits after the dot. Fix that. std::string fix_millisecond(std::string const& in_str) { std::string out_str = ""; bool found_dot = false; int num_digits_after_dot = 0; for (size_t it = 0; it < in_str.size(); it++) { if (it + 1 < in_str.size()) { // Not yet at the last character if (in_str[it] == '.') { // Found the dot found_dot = true; out_str += in_str[it]; continue; } if (!found_dot) { // Not at the dot yet out_str += in_str[it]; continue; } // After the dot if (num_digits_after_dot < 6) { out_str += in_str[it]; num_digits_after_dot++; } continue; } // At the last character if (in_str[it] >= '0' && in_str[it] <= '9') { // The last character is a digit, just append it if (num_digits_after_dot < 6) { out_str += in_str[it]; num_digits_after_dot++; } // See if to append more while (found_dot && num_digits_after_dot < 6) { out_str += "0"; num_digits_after_dot++; } } else { // The last character is not a digit, it is likely a "Z" while (found_dot && num_digits_after_dot < 6) { // Append zeros out_str += "0"; num_digits_after_dot++; } // Append the last character, whatever it is out_str += in_str[it]; } } // End iterating over characters return out_str; } boost::posix_time::ptime parse_time(std::string const& s) { // Replace the T with a space so the default Boost function can // parse the time. std::string s2 = s; boost::replace_all(s2, "T", " "); // Ensure there are exactly 6 digits for the millisecond or else // Boost will complain. s2 = asp::fix_millisecond(s2); boost::posix_time::ptime time = boost::posix_time::time_from_string(s2); return time; } // Return the time in seconds since January 1, 2000, down to the microsecond. // Avoid starting at the epoch (1970) as that may create some loss in precision. double to_seconds(const boost::posix_time::ptime& pt) { boost::posix_time::ptime epoch(boost::gregorian::date(2000, 1, 1)); boost::posix_time::time_duration diff = pt - epoch; return diff.total_microseconds() / 1.0e+6; } } // end namespace asp ================================================ FILE: src/asp/Camera/TimeProcessing.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include namespace asp { /// A functor that returns the difference in seconds from a reference time. /// Uses boost::posix_time. class SecondsFromRef { boost::posix_time::ptime m_reference; public: inline SecondsFromRef() {} inline SecondsFromRef(boost::posix_time::ptime const& ref_time) : m_reference(ref_time) {} inline void set_base_time(boost::posix_time::ptime const& ref_time) {m_reference = ref_time;} inline double operator()(boost::posix_time::ptime const& time) const { return double((time - m_reference).total_microseconds()) / 1.0e6; } }; // Boost does not like a time string such as "2017-12-07 15:36:40.90795Z" // because it expects precisely 6 digits after the dot (hence for the millisecond). // Fix that. PeruSat has this problem. std::string fix_millisecond(std::string const& in_str); // Parse a time string such as "2017-12-07 15:36:40.90795Z" boost::posix_time::ptime parse_time(std::string const& s); // Return the time in seconds since the January 1, 2000, down to the microsecond double to_seconds(const boost::posix_time::ptime& pt); } // end namespace asp ================================================ FILE: src/asp/Camera/XMLBase.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include // strtod #include using namespace vw; void asp::XmlUtils::parseDoublesFromXmlBlock( std::string const& rawXml, std::string const& openTag, std::string const& closeTag, std::vector& values) { values.clear(); // Find the block boundaries size_t blockStart = rawXml.find(openTag); if (blockStart == std::string::npos) vw_throw(ArgumentErr() << "Tag not found: " << openTag << "\n"); blockStart += openTag.size(); size_t blockEnd = rawXml.find(closeTag, blockStart); if (blockEnd == std::string::npos) vw_throw(ArgumentErr() << "Closing tag not found: " << closeTag << "\n"); const char* p = rawXml.c_str() + blockStart; const char* end = rawXml.c_str() + blockEnd; while (p < end) { // Skip XML tags if (*p == '<') { while (p < end && *p != '>') p++; if (p < end) p++; continue; } // Skip whitespace if (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') { p++; continue; } // Parse a number char* next = nullptr; double val = strtod(p, &next); if (next > p) { values.push_back(val); p = next; } else { p++; // skip unexpected char } } } ================================================ FILE: src/asp/Camera/XMLBase.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // This header should not be included by other headers since it // brings in xercesc headers. This limits the spread of those // headers and objects. #ifndef __STEREO_SESSION_XMLBASE_H__ #define __STEREO_SESSION_XMLBASE_H__ #include #include #include #include // Can't do much about warnings in boost except to hide them #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include #pragma GCC diagnostic pop #include #include #include #include #include namespace asp { namespace XmlUtils { /// Helper function to convert XML text to a binary value. template void cast_xmlch(const XMLCh* ch, T& dst) { char* text = xercesc::XMLString::transcode(ch); try { dst = boost::lexical_cast(text); } catch (boost::bad_lexical_cast const& e) { vw_throw(vw::ArgumentErr() << "Failed to parse string: " << text << "\n"); } xercesc::XMLString::release(&text); } /// Helper function to retrieve a node via string and verify that only one exists. template T* get_node(xercesc::DOMElement* element, std::string const& tag) { XMLCh* tag_c = xercesc::XMLString::transcode(tag.c_str()); xercesc::DOMNodeList* list = element->getElementsByTagName(tag_c); VW_ASSERT(list->getLength() != 0, vw::IOErr() << "Could not find \"" << tag << "\" tag."); VW_ASSERT(list->getLength() == 1, vw::IOErr() << "Found multiple \"" << tag << "\" tags."); xercesc::XMLString::release(&tag_c); return dynamic_cast(list->item(0)); } /// Parse all doubles from a named XML block in raw text using strtod. /// Finds the text between openTag and closeTag, skips any XML tags /// inside, and extracts all floating-point numbers. Much faster than /// xercesc DOM traversal for large blocks of numeric data. void parseDoublesFromXmlBlock(std::string const& rawXml, std::string const& openTag, std::string const& closeTag, std::vector& values); } // End namespace XmlUtils } // end namespace asp #endif//__STEREO_SESSION_XMLBASE_H__ ================================================ FILE: src/asp/Camera/tests/TestCsmCameraModel.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include using namespace vw; using namespace asp; TEST(CSM_camera, basic_check) { // TODO: Add a sample file to the repo for ASP to load! // Load up the sample ISD file. std::string sample_isd = "/home/smcmich1/data/csm/ctx_pair/J03_045994_1986_XN_18N282W.json"; CsmModel csm; csm.load_model(sample_isd); std::cout << "Size = " << csm.get_image_size() << std::endl; // Do some simple model tests const double eps = 0.005; for (int i = 0; i < 4; i++) { std::cout << "i = " << i << std::endl; Vector2 pix(i*100,i*100); std::cout << "pix = " << pix << std::endl; Vector3 center = csm.camera_center(pix); std::cout << "center = " << center << std::endl; Vector3 vec = csm.pixel_to_vector(pix); std::cout << "vec = " << vec << std::endl; Vector3 pt = center + vec * 10000; std::cout << " pt = " << pt << std::endl; Vector2 pixel; try { pixel = csm.point_to_pixel(pt); } catch(...) {continue;} std::cout << " pixel = " << pixel << std::endl; EXPECT_VECTOR_NEAR(pix, pixel, eps); std::cout << std::endl; } EXPECT_TRUE(false); } ================================================ FILE: src/asp/Camera/tests/TestDGCameraModel.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include using namespace vw; using namespace asp; using namespace xercesc; using namespace vw::test; TEST(StereoSessionDG, XMLReading) { XMLPlatformUtils::Initialize(); GeometricXML geo; AttitudeXML att; EphemerisXML eph; ImageXML img; RPCXML rpc; EXPECT_FALSE( geo.is_good() ); EXPECT_FALSE( att.is_good() ); EXPECT_FALSE( eph.is_good() ); EXPECT_FALSE( img.is_good() ); EXPECT_FALSE( rpc.is_good() ); read_xml( "dg_example1.xml", geo, att, eph, img, rpc ); EXPECT_TRUE( geo.is_good() ); EXPECT_TRUE( att.is_good() ); EXPECT_TRUE( eph.is_good() ); EXPECT_TRUE( img.is_good() ); EXPECT_TRUE( rpc.is_good() ); // Checking GEO EXPECT_NEAR( 7949.165, geo.principal_distance, 1e-6 ); EXPECT_EQ( 0, geo.optical_polyorder ); EXPECT_VECTOR_NEAR( Vector3(), geo.perspective_center, 1e-6 ); EXPECT_NEAR( 0, geo.camera_attitude.x(), 1e-6 ); EXPECT_NEAR( 1, geo.camera_attitude.w(), 1e-6 ); EXPECT_VECTOR_NEAR( Vector2(.05372,140.71193), geo.detector_origin, 1e-6 ); EXPECT_NEAR( 0, geo.detector_rotation, 1e-6 ); EXPECT_NEAR( .008, geo.detector_pixel_pitch, 1e-6 ); // Checking ATT EXPECT_FALSE( att.start_time.empty() ); EXPECT_NEAR( .02, att.time_interval, 1e-6 ); // TODO(oalexan1): If the test below fails, just tweak it so it passes. // Some logic changed which was not reflected in these tests but // was validated in a different way. EXPECT_EQ( 840, att.satellite_quat_vec.size() ); // There are 10 covariances for each position (4x4 matrix, upper-right corner) EXPECT_EQ( 840 * 10, att.satellite_quat_covariance_vec.size() ); for ( size_t i = 0; i < 840; i++ ) { EXPECT_NE( 0, att.satellite_quat_vec[i][3] ); EXPECT_NE( 0, att.satellite_quat_covariance_vec[i]); } //EXPECT_VECTOR_NEAR( Vector3(3.72e-12, 3.51e-12, 1.12e-13), // subvector(att.satellite_quat_covariance_vec[0],0,3), 1e-20 ); // Checking EPH EXPECT_FALSE( eph.start_time.empty() ); EXPECT_NEAR( .02, eph.time_interval, 1e-6 ); EXPECT_EQ( 840, eph.position_vec.size() ); EXPECT_EQ( 840, eph.velocity_vec.size() ); EXPECT_EQ( 840 * 10, eph.satellite_quat_covariance_vec.size() ); for ( size_t i = 0; i < 840; i++ ) { EXPECT_NE( 0, eph.position_vec[i].x() ) << i; EXPECT_NE( 0, eph.velocity_vec[i].x() ); EXPECT_NE( 0, eph.satellite_quat_covariance_vec[i] ); } EXPECT_VECTOR_NEAR( Vector3(-1.150529111070304e+06, -4.900037170821411e+06, 4.673402253879593e+06), eph.position_vec[0], 1e-6 ); // Checking IMG EXPECT_FALSE( img.tlc_start_time.empty() ); EXPECT_FALSE( img.first_line_start_time.empty() ); EXPECT_EQ( 2, img.tlc_vec.size() ); EXPECT_NEAR( 0, img.tlc_vec[0].first, 1e-8 ); EXPECT_NEAR( 0, img.tlc_vec[0].second, 1e-8 ); EXPECT_NEAR( 23708, img.tlc_vec[1].first, 1e-8 ); EXPECT_NEAR( 1.975667, img.tlc_vec[1].second, 1e-8 ); EXPECT_EQ( 23708, img.image_size.y() ); EXPECT_EQ( 35170, img.image_size.x() ); XMLPlatformUtils::Terminate(); } TEST(DGCameraModel, CreateCamera) { xercesc::XMLPlatformUtils::Initialize(); vw::CamPtr cam1, cam2, cam3; cam1 = vw::CamPtr(load_dg_camera_model_from_xml("dg_example1.xml")); cam2 = vw::CamPtr(load_dg_camera_model_from_xml("dg_example2.xml")); ASSERT_TRUE( cam1.get() != 0 ); ASSERT_TRUE( cam2.get() != 0 ); Vector2 m1(13864, 5351), m2(15045, 5183); m1 *= 2; m2 *= 2; stereo::StereoModel sm(cam1.get(), cam2.get()); double error; Vector3 pos = sm(m1,m2,error); EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters. EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera. // Verify that projection back into the camera hits the right // spot. It will slightly be wrong due to the above triangulation error. #if __GNUC__ #if __x86_64__ || __ppc64__ EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 ); #else EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 ); #endif #endif // A more accurate test is just to project out and back into the same camera for ( size_t i = 0; i < 30000; i += 500 ) { for ( size_t j = 0; j < 24000; j += 500 ) { EXPECT_VECTOR_NEAR( Vector2(i,j), cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) + 2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ), 1e-1 /*pixels*/); } } // Create a camera that only has a single TLC entry. It will throw // an error in the event that first line time and TLC entry lookup // don't agree. That should be good enough for a test. EXPECT_NO_THROW( cam3=load_dg_camera_model_from_xml("dg_example3.xml"); ); XMLPlatformUtils::Terminate(); } ================================================ FILE: src/asp/Camera/tests/TestRPCStereoModel.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NASA Vision Workbench is licensed under the Apache License, // Version 2.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // TestRPCStereoModel.h // This also contains the RPCModel tests so they should be separated out some time. #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::stereo; using namespace vw::camera; using namespace vw::math; using namespace asp; /// Load an RPC camera file /// - TODO: Remove this once we have a nice RPC load function outside the Loader class. boost::shared_ptr load_rpc_camera_model(std::string const& path) { // Try the default loading method RPCModel* rpc_model = NULL; try { RPCXML rpc_xml; // This is for reading XML files rpc_xml.read_from_file(path); rpc_model = new RPCModel(*rpc_xml.rpc_ptr()); // Copy the value } catch (...) {} // We don't catch an error here because the user will need to // know of a failure at this point. return boost::shared_ptr(rpc_model); } void test_stereo_models(const std::string &path1, const std::string &path2) { // Load the camera models boost::shared_ptr camPtr1, camPtr2; // Object to handle camera model loading camPtr1 = load_rpc_camera_model(path1); camPtr2 = load_rpc_camera_model(path2); // Set up the stereo models vw::stereo::StereoModel plainStereoModel(camPtr1.get(), camPtr2.get()); asp::RPCStereoModel rpcStereoModel (camPtr1.get(), camPtr2.get()); // Generate a bunch of pixel pairs const int NUM_PIXELS = 10; Vector2 pixelBase(10000, 10000); std::vector pixels1(NUM_PIXELS), pixels2(NUM_PIXELS); for (int i = 0; i < NUM_PIXELS; i++) { pixels1[i] = pixelBase + Vector2(i, 0); pixels2[i] = pixelBase; } // Try out a bunch of pixel pairs double errorPlain, errorRpc; for (int i = 0; i < NUM_PIXELS; i++) { // Use both stereo models to find the ray intersection Vector3 xyzPlain = plainStereoModel(pixels1[i], pixels2[i], errorPlain); Vector3 xyzRpc = rpcStereoModel (pixels1[i], pixels2[i], errorRpc); // The results should be identical EXPECT_VECTOR_NEAR(xyzPlain, xyzRpc, 1e-4); //EXPECT_LT(abs(errorPlain - errorRpc), 1e-4); } } TEST(RPCModel, rpb) { #if 0 // This one is failing. Need to study. RPCModel m("sample.RPB"); // Read and check the values from this file. EXPECT_NEAR(m.line_num_coeff()[3], -3.071606965e-01, 1e-8); EXPECT_NEAR(m.lonlatheight_offset()[0], -122.373300, 1e-4); EXPECT_NEAR(m.xy_scale()[1], 531.0, 1e-1); #endif } TEST(RPCXML, ReadRPC) { xercesc::XMLPlatformUtils::Initialize(); RPCXML xml; EXPECT_FALSE(xml.is_good()); xml.read_from_file("dg_example1.xml"); EXPECT_TRUE(xml.is_good()); EXPECT_VECTOR_NEAR(Vector2(17564,11856), xml.rpc_ptr()->xy_offset(), 1e-6); EXPECT_VECTOR_NEAR(Vector2(17927,12384), xml.rpc_ptr()->xy_scale(), 1e-6); EXPECT_VECTOR_NEAR(Vector3(-105.2903,39.7454,2281), xml.rpc_ptr()->lonlatheight_offset(), 1e-6); EXPECT_VECTOR_NEAR(Vector3(.1345,.1003,637), xml.rpc_ptr()->lonlatheight_scale(), 1e-6); EXPECT_NEAR(4.683662e-3, xml.rpc_ptr()->line_num_coeff()[0], 1e-6); EXPECT_NEAR(4.395393e-6, xml.rpc_ptr()->line_num_coeff()[19], 1e-6); EXPECT_NEAR(1, xml.rpc_ptr()->line_den_coeff()[0], 1e-6); EXPECT_NEAR(-3.71156e-8, xml.rpc_ptr()->line_den_coeff()[19], 1e-6); EXPECT_NEAR(-7.306375e-3, xml.rpc_ptr()->sample_num_coeff()[0], 1e-6); EXPECT_NEAR(-1.585929e-6, xml.rpc_ptr()->sample_num_coeff()[19], 1e-6); EXPECT_NEAR(1, xml.rpc_ptr()->sample_den_coeff()[0], 1e-6); EXPECT_NEAR(-1.211995e-7, xml.rpc_ptr()->sample_den_coeff()[19], 1e-6); xercesc::XMLPlatformUtils::Terminate(); } TEST(RPCStereoModel, mvpMatchTest) { xercesc::XMLPlatformUtils::Initialize(); test_stereo_models("wv_mvp_1.xml", "wv_mvp_2.xml"); xercesc::XMLPlatformUtils::Terminate(); } TEST(RPCStereoModel, greenlandMatchTest) { xercesc::XMLPlatformUtils::Initialize(); test_stereo_models("wv_test1.xml", "wv_test2.xml"); xercesc::XMLPlatformUtils::Terminate(); } TEST(StereoSessionRPC, InstantiateTest) { xercesc::XMLPlatformUtils::Initialize(); // Create an RPC Model RPCXML xml; xml.read_from_file("dg_example1.xml"); RPCModel model(*xml.rpc_ptr()); // Verify some of the values EXPECT_NEAR(4.683662e-3, model.line_num_coeff()[0], 1e-6); EXPECT_NEAR(1, model.line_den_coeff()[0], 1e-6); EXPECT_NEAR(-7.306375e-3, model.sample_num_coeff()[0], 1e-6); EXPECT_NEAR(1, model.sample_den_coeff()[0], 1e-6); EXPECT_VECTOR_NEAR(Vector2(17564,11856), model.xy_offset(), 1e-3); EXPECT_VECTOR_NEAR(Vector2(17927,12384), model.xy_scale(), 1e-3); // Verify the Jacobian numerically Vector3 location(-105.29,39.745,2281); double tol = 1e-4; Matrix Je = model.geodetic_to_pixel_Jacobian(location); Matrix Jn = model.geodetic_to_pixel_numerical_Jacobian(location, tol); double relErr = max(abs(Je-Jn))/max(abs(Je)); EXPECT_LT(relErr, 1e-5); // Verify that if we go from pixel to lonlat and back, then we // arrive at the starting point. Vector2 pix(0, 0); double h = 10.0; Vector2 lonlat = model.image_to_ground(pix, h); Vector2 pix_out = model.geodetic_to_pixel(Vector3(lonlat[0], lonlat[1], h)); EXPECT_LT(norm_2(pix - pix_out), 1.0e-9); // Verify that nothing segfaults or has a run time error. EXPECT_NO_THROW(model.calculate_terms(location)); EXPECT_NO_THROW(model.terms_Jacobian3(location)); EXPECT_NO_THROW(model.normalization_Jacobian(location)); EXPECT_NO_THROW(model.geodetic_to_pixel_Jacobian(location)); EXPECT_NO_THROW(model.geodetic_to_pixel(location)); EXPECT_NO_THROW(model.pixel_to_vector(Vector2())); EXPECT_NO_THROW(model.camera_center(Vector2())); xercesc::XMLPlatformUtils::Terminate(); } TEST(StereoSessionRPC, CheckStereo) { xercesc::XMLPlatformUtils::Initialize(); RPCXML xml1, xml2; xml1.read_from_file("dg_example1.xml"); xml2.read_from_file("dg_example4.xml"); RPCModel model1(*xml1.rpc_ptr()); RPCModel model2(*xml2.rpc_ptr()); std::cout << std::endl; RPCStereoModel RPC_stereo(&model1, &model2); double error; RPC_stereo(Vector2(), Vector2(), error); //EXPECT_NEAR( error, 54682.96251543280232, 1e-3 ); EXPECT_NEAR(error, 54705.95473285091, 1e-3); xercesc::XMLPlatformUtils::Terminate(); } /// Make sure that the AdjustedCameraModel class handles cropping with RPC models TEST(StereoSessionRPC, CheckRpcCrop) { xercesc::XMLPlatformUtils::Initialize(); // Load the camera model as DG and RPC boost::shared_ptr rpcModel = load_rpc_camera_model("dg_example1.xml"); boost::shared_ptr dgModel = load_dg_camera_model_from_xml("dg_example1.xml"); // Verify that the RPC and DG models are similar Vector2 testPix(100, 200); Vector3 rpcVector = rpcModel->pixel_to_vector(testPix); Vector3 dgVector = dgModel->pixel_to_vector(testPix); EXPECT_LT(norm_2(rpcVector - dgVector), 1.0e-4); // Now try the same thing with a cropped image Vector2 pixel_offset(40, 80); Vector3 position_correction; Quaternion pose_correction = Quat(math::identity_matrix<3>()); boost::shared_ptr croppedRpc( new vw::camera::AdjustedCameraModel(rpcModel, position_correction, pose_correction, pixel_offset)); boost::shared_ptr croppedDg( new vw::camera::AdjustedCameraModel(dgModel, position_correction, pose_correction, pixel_offset)); rpcVector = croppedRpc->pixel_to_vector(testPix); dgVector = croppedDg->pixel_to_vector(testPix); EXPECT_LT(norm_2(rpcVector - dgVector), 1.0e-4); xercesc::XMLPlatformUtils::Terminate(); } ================================================ FILE: src/asp/Camera/tests/TestSpotCameraModel.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include using namespace vw; using namespace asp; using namespace xercesc; using namespace vw::test; // This test is split to a separate function so that the SpotXML destructor is called // before the Xerces platform terminate function is called. void xml_reading_test() { SpotXML xml_reader; xml_reader.read_xml("spot_example1.xml"); EXPECT_EQ(300, xml_reader.image_size[0]); // Cols, a real file is much larger. EXPECT_EQ(96168, xml_reader.image_size[1]); // Rows const double EPS = 1e-8; EXPECT_EQ(4, xml_reader.lonlat_corners.size()); EXPECT_EQ(4, xml_reader.pixel_corners.size()); EXPECT_NEAR(-75.519946, xml_reader.lonlat_corners[0].x(), EPS); EXPECT_NEAR(-76.636309, xml_reader.lonlat_corners[0].y(), EPS); EXPECT_EQ(1, xml_reader.pixel_corners[0].x()); EXPECT_EQ(1, xml_reader.pixel_corners[0].y()); EXPECT_NEAR(-71.924271, xml_reader.lonlat_corners[1].x(), EPS); EXPECT_NEAR(-77.389028, xml_reader.lonlat_corners[1].y(), EPS); EXPECT_EQ(300, xml_reader.pixel_corners[1].x()); EXPECT_EQ(1, xml_reader.pixel_corners[1].y()); EXPECT_NEAR(-88.569672, xml_reader.lonlat_corners[2].x(), EPS); EXPECT_NEAR(-80.241112, xml_reader.lonlat_corners[2].y(), EPS); EXPECT_EQ(300, xml_reader.pixel_corners[2].x()); EXPECT_EQ(96168, xml_reader.pixel_corners[2].y()); EXPECT_NEAR(-91.818476, xml_reader.lonlat_corners[3].x(), EPS); EXPECT_NEAR(-79.298919, xml_reader.lonlat_corners[3].y(), EPS); EXPECT_EQ(1, xml_reader.pixel_corners[3].x()); EXPECT_EQ(96168, xml_reader.pixel_corners[3].y()); EXPECT_NEAR(7.5199705115e-04, xml_reader.line_period, EPS); EXPECT_EQ("2008-03-04T12:31:39.349737", xml_reader.center_time); EXPECT_EQ(48084, xml_reader.center_line); EXPECT_EQ(6000, xml_reader.center_col); EXPECT_EQ(10, xml_reader.look_angles[9].first); EXPECT_NEAR(3.4977741700e-01, xml_reader.look_angles[9].second.x(), EPS); EXPECT_NEAR(-7.1264930800e-02, xml_reader.look_angles[9].second.y(), EPS); EXPECT_EQ("2008-03-04T12:31:03.206912", xml_reader.pose_logs.front().first); EXPECT_NEAR(1.1621635280e-03, xml_reader.pose_logs.front().second.x(), EPS); EXPECT_NEAR(-9.5496029568e-04, xml_reader.pose_logs.front().second.y(), EPS); EXPECT_NEAR(-1.7549389832e-05, xml_reader.pose_logs.front().second.z(), EPS); EXPECT_EQ("2008-03-04T12:32:15.331747", xml_reader.pose_logs.back().first); EXPECT_NEAR(1.2001004714e-03, xml_reader.pose_logs.back().second.x(), EPS); EXPECT_NEAR(-9.5696493468e-04, xml_reader.pose_logs.back().second.y(), EPS); EXPECT_NEAR(-2.4331461036e-05, xml_reader.pose_logs.back().second.z(), EPS); EXPECT_EQ("2008-03-04T12:28:27.000000", xml_reader.position_logs.front().first); EXPECT_NEAR(1.7495691231e+06, xml_reader.position_logs.front().second.x(), EPS); EXPECT_NEAR(-2.2672541162e+06, xml_reader.position_logs.front().second.y(), EPS); EXPECT_NEAR(-6.6183333707e+06, xml_reader.position_logs.front().second.z(), EPS); EXPECT_EQ("2008-03-04T12:28:27.000000", xml_reader.velocity_logs.front().first); EXPECT_NEAR(-6.2538959540e+03, xml_reader.velocity_logs.front().second.x(), EPS); EXPECT_NEAR(3.1331303950e+03, xml_reader.velocity_logs.front().second.y(), EPS); EXPECT_NEAR(-2.7272519760e+03, xml_reader.velocity_logs.front().second.z(), EPS); } TEST(SPOT_camera, XMLReading) { XMLPlatformUtils::Initialize(); xml_reading_test(); XMLPlatformUtils::Terminate(); } ================================================ FILE: src/asp/Camera/tests/ctx.json ================================================ {"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}} ================================================ FILE: src/asp/Camera/tests/dg_example1.xml ================================================ AA P 23708 35170 Corrected 16 None GeoTIFF Imaginary1 FullSwath Forward 1959-11-25T17:39:48.740958Z 2 0.000000000000000e+00 0.000000000000000e+00 2.370800000000000e+04 1.975667000000000e+00 1959-11-25T17:39:48.740958Z 1.200000000000000e+04 2.666670000000000e-03 7.290000000000000e-01 7.320000000000000e-01 7.310000000000000e-01 6.720000000000000e-01 6.720000000000000e-01 6.720000000000000e-01 7.010000000000000e-01 5.732000000000000e+01 3.417000000000000e+01 1.619000000000000e+02 1.620000000000000e+02 1.619000000000000e+02 2.750000000000000e+01 2.770000000000000e+01 2.760000000000000e+01 2.660000000000000e+01 2.720000000000000e+01 2.690000000000000e+01 5.200000000000000e+01 5.320000000000000e+01 5.260000000000000e+01 3.240000000000000e+01 3.270000000000000e+01 3.260000000000000e+01 1.170000000000000e+01 1.210000000000000e+01 1.190000000000000e+01 3.440000000000000e+01 3.440000000000000e+01 3.440000000000000e+01 4.200000000000000e+00 0.000000000000000e+00 CC 32 R R Imaginary1 1959-11-25T19:05:33.862633Z 1959-11-25T17:39:40.987511Z 840 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Imaginary1 1959-11-30T00:18:13.000000Z 1959-11-25T17:39:40.987511Z 840 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 monkey 1959-09-18T00:00:00.000000Z 1959-12-16T00:00:00.000000Z Imaginary1 1959-12-05T00:00:00.000000Z 7.949165000000000e+03 1958-01-01T00:00:00.000000Z 0 0.000000000000000e+00 0.000000000000000e+00 1958-01-01T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1959-06-08T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 1959-12-16T00:00:00.000000Z P 1 5.372000000000000e-02 1.407119300000000e+02 0.000000000000000e+00 8.000000000000000e-03 IMAGINE01 P RPC00Y 11856 17564 3.974540000000000e+01 -1.052903000000000e+02 2281 12384 17927 1.003000000000000e-01 1.345000000000000e-01 637 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 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 -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 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 ================================================ FILE: src/asp/Camera/tests/dg_example2.xml ================================================ P None 27576 35170 Stereo 1B Stereo 2 Corrected 16 None GeoTIFF Imaginary1 FullSwath Forward 1432-11-25T17:40:29.834958Z 2 0.000000000000000e+00 0.000000000000000e+00 2.789200000000000e+04 2.324333000000000e+00 1432-11-25T17:40:29.834958Z 1.200000000000000e+04 2.666670000000000e-03 5.080000000000000e-01 5.080000000000000e-01 5.080000000000000e-01 5.240000000000000e-01 5.250000000000000e-01 5.250000000000000e-01 5.160000000000000e-01 1.600000000000000e+01 3.055000000000000e+01 1.621000000000000e+02 1.621000000000000e+02 1.621000000000000e+02 2.760000000000000e+01 2.770000000000000e+01 2.760000000000000e+01 7.400000000000000e+01 8.270000000000000e+01 7.830000000000000e+01 7.750000000000000e+01 7.820000000000000e+01 7.790000000000001e+01 4.000000000000000e+00 4.300000000000000e+00 4.100000000000000e+00 1.030000000000000e+01 1.070000000000000e+01 1.050000000000000e+01 1.130000000000000e+01 1.130000000000000e+01 1.130000000000000e+01 4.600000000000000e+00 0.000000000000000e+00 CC 32 R R Imaginary1 1432-11-25T19:05:33.862633Z 1432-11-25T17:40:21.387413Z 931 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Imaginary1 1432-11-30T00:18:13.000000Z 1432-11-25T17:40:21.387413Z 931 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 P 1 35170 27576 Pixels 3545 07NOV25174027-P1BS_R1C1-005728210010_01_P001.TIF 0 0 35169 0 35169 27575 0 27575 -1.053955881000000e+02 3.980947709000000e+01 -1.051834485800000e+02 3.981066533000000e+01 -1.051836261900000e+02 3.968439626000000e+01 -1.053955469800000e+02 3.968329551000000e+01 1432-09-18T00:00:00.000000Z 1432-12-16T00:00:00.000000Z Imaginary1 LV1B 1432-12-05T00:00:00.000000Z 7.949165000000000e+03 2000-01-01T00:00:00.000000Z 0 0.000000000000000e+00 0.000000000000000e+00 2000-01-01T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1432-06-08T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 1432-12-16T00:00:00.000000Z P 1 5.372000000000000e-02 1.407119300000000e+02 0.000000000000000e+00 8.000000000000000e-03 ================================================ FILE: src/asp/Camera/tests/dg_example3.xml ================================================ Monkey P 54272 35840 16 JPEG2000 NITF21NCDRD WV01 FullSwath Forward 1959-11-15T22:24:14.209479Z 1 1.010200000000000e+05 0.000000000000000e+00 1959-11-15T22:24:10.000312Z 2.400000000000000e+04 1.333330000000000e-03 5.820000000000000e-01 5.830000000000000e-01 5.820000000000000e-01 6.760000000000000e-01 6.820000000000001e-01 6.790000000000000e-01 6.290000000000000e-01 5.860000000000000e-01 6.770000000000000e-01 6.300000000000000e-01 3.294000000000000e+01 7.561000000000000e+01 1.870000000000000e+02 1.871000000000000e+02 1.871000000000000e+02 4.390000000000000e+01 4.410000000000000e+01 4.400000000000000e+01 2.570000000000000e+02 2.595000000000000e+02 2.582000000000000e+02 5.860000000000000e+01 5.950000000000000e+01 5.910000000000000e+01 -1.780000000000000e+01 -1.650000000000000e+01 -1.710000000000000e+01 -2.370000000000000e+01 -2.230000000000000e+01 -2.300000000000000e+01 2.830000000000000e+01 2.830000000000000e+01 2.830000000000000e+01 4.700000000000000e+00 2.000000000000000e-02 CC R R 26387 Imaginary1 1959-11-15T23:10:47.429131Z 1959-11-15T22:23:59.803099Z 1031 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Imaginary1 1959-11-15T23:10:43.000000Z 1959-11-15T22:23:59.803099Z 1031 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Today I learned 1960-03-18T00:00:00.000000Z 1958-12-16T00:00:00.000000Z Imaginary1 1958-12-05T00:00:00.000000Z 7.949165000000000e+03 1958-01-01T00:00:00.000000Z 0 0.000000000000000e+00 0.000000000000000e+00 1956-01-01T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1958-06-08T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 1958-12-16T00:00:00.000000Z P 1 5.372000000000000e-02 1.407119300000001e+02 0.000000000000000e+00 8.000000000000000e-03 Imaginary1 P RPC00B 2.248000000000000e+01 1.700000000000000e-01 26709 17600 6.936799999999999e+01 -1.503627000000000e+02 171 26801 18028 1.452000000000000e-01 3.025000000000000e-01 500 -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 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 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 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 ================================================ FILE: src/asp/Camera/tests/dg_example4.xml ================================================ AA P 23708 35170 Corrected 16 None GeoTIFF Imaginary1 FullSwath Forward 1959-11-25T17:39:48.740958Z 2 0.000000000000000e+00 0.000000000000000e+00 2.370800000000000e+04 1.975667000000000e+00 1959-11-25T17:39:48.740958Z 1.200000000000000e+04 2.666670000000000e-03 7.290000000000000e-01 7.320000000000000e-01 7.310000000000000e-01 6.720000000000000e-01 6.720000000000000e-01 6.720000000000000e-01 7.010000000000000e-01 5.732000000000000e+01 3.417000000000000e+01 1.619000000000000e+02 1.620000000000000e+02 1.619000000000000e+02 2.750000000000000e+01 2.770000000000000e+01 2.760000000000000e+01 2.660000000000000e+01 2.720000000000000e+01 2.690000000000000e+01 5.200000000000000e+01 5.320000000000000e+01 5.260000000000000e+01 3.240000000000000e+01 3.270000000000000e+01 3.260000000000000e+01 1.170000000000000e+01 1.210000000000000e+01 1.190000000000000e+01 3.440000000000000e+01 3.440000000000000e+01 3.440000000000000e+01 4.200000000000000e+00 0.000000000000000e+00 CC 32 R R Imaginary1 1959-11-25T19:05:33.862633Z 1959-11-25T17:39:40.987511Z 840 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Imaginary1 1959-11-30T00:18:13.000000Z 1959-11-25T17:39:40.987511Z 840 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 monkey 1959-09-18T00:00:00.000000Z 1959-12-16T00:00:00.000000Z Imaginary1 1959-12-05T00:00:00.000000Z 7.949165000000000e+03 1958-01-01T00:00:00.000000Z 0 0.000000000000000e+00 0.000000000000000e+00 1958-01-01T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1959-06-08T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 1959-12-16T00:00:00.000000Z P 1 5.372000000000000e-02 1.407119300000000e+02 0.000000000000000e+00 8.000000000000000e-03 IMAGINE01 P RPC00Y 11856 17564 3.774540000000000e+01 -1.032903000000000e+02 2287 12383 17929 1.003050000000000e-01 1.345060000000000e-01 638 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 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 -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 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 ================================================ FILE: src/asp/Camera/tests/sample.RPB ================================================ satId = "sc00110"; bandId = "c1_PAN"; SpecId = "RPC00B"; BEGIN_GROUP = IMAGE errBias = 0.02; errRand = 0.03; lineOffset = 531.0; sampOffset = 1278.0; latOffset = 37.619800; longOffset = -122.373300; heightOffset = -40.00; lineScale = 531.0; sampScale = 1278.0; latScale = 0.011500; longScale = 0.020600; heightScale = 580.00; lineNumCoef = ( 9.318045017e-03, -5.508823053e-01, -2.364340703e+00, -3.071606965e-01, 1.478389904e+00, 8.440748673e-01, 3.078921569e+00, 2.900906367e-01, 4.718241664e-01, 3.749347695e-01, 6.910711609e+00, 1.915340522e+00, 1.509441224e+01, 7.709535170e-01, 1.088127807e+01, 1.687799834e+01, -2.301142036e-01, 2.434723000e+00, -2.434911706e-01, 1.342808018e-02); lineDenCoef = ( 1.000000000e+00, -5.935009269e-01, -2.274207258e-01, -1.272214359e+00, -4.740295946e+00, -2.560207845e+00, 9.959442978e-01, -3.511033902e+00, -7.145089853e+00, -2.516117870e-02, 2.969571273e-03, 5.605685421e-03, 8.803055003e-03, 2.476267065e-03, 5.738761395e-03, -3.606373386e-03, -2.219523225e-03, 8.317793510e-03, 9.416783177e-03, -5.677814480e-03); sampNumCoef = ( -2.929216508e-03, 1.392781931e+00, -2.321862543e-01, 1.374836054e-01, -2.453196168e-01, -2.041146900e-01, -1.433836694e-02, -8.727822488e-01, 8.902139391e-02, -1.147072498e-02, -2.991008172e+00, -4.924477511e+00, -8.839292317e+00, -3.956845118e-01, -5.587423001e+00, 1.661046811e+00, -2.233445422e-01, -2.208923683e+00, -5.346737767e-01, -2.114068368e-02); sampDenCoef = ( 1.000000000e+00, -6.345567885e-01, -2.907310635e-01, -8.791516709e-02, -4.611410138e+00, -1.237998272e+00, -1.902775739e+00, -3.540698264e+00, -7.128017431e+00, -1.619988714e-01, 3.039575996e-03, -1.368501979e-03, -1.054400076e-02, 1.501293403e-03, -8.119659279e-03, -1.199720923e-02, 2.254479075e-03, 3.858787500e-03, 5.672344142e-03, -1.950670407e-03); END_GROUP = IMAGE END; ================================================ FILE: src/asp/Camera/tests/spot_example1.xml ================================================ DIMAP SPOTSEGMENT_1A SEGMENT S5 S 1 S 08/03/04 12:31:03.1 COPYRIGHT CNES 04 03 2008 12 H 31 MN 03 S JPEG JPEG -75.519946 -76.636309 1 1 -71.924271 -77.389028 1 300 -88.569672 -80.241112 96168 300 -91.818476 -79.298919 96168 1 -81.063053 -78.506964 48085 150 49.713950 EPSG epsg:4326 GEOGRAPHIC WGS 84 POINT 1 -75.519946 -76.636309 0.000000 1.000000 1.000000 -71.924271 -77.389028 0.000000 12000.000000 1.000000 -88.569672 -80.241112 0.000000 12000.000000 96168.000000 -91.818476 -79.298919 0.000000 1.000000 96168.000000 -7.5560649386e+01 -1.2976212651e-04 2.8600829541e-04 -2.9284213207e-10 -4.1257262919e-10 1.6484672095e-09 -7.6635614572e+01 -3.2338993789e-05 -6.4084400701e-05 -1.6460209928e-10 4.8069271919e-11 1.2624430549e-10 -3199166.022880 -43137.711806 -20966.303248 -267.539086 -44.693625 21.174976 299074.641282 1205.106966 12639.635136 113.900926 1.371322 14.125565 1 1 1 255 SATURATED 1 1 1 0 NODATA 0 0 0 331017101 SQASSV20 Spot SYSTEM SEGMENT level 1A SPOT_IMAGE 2009-03-20T14:33:23.448000 CAP_T SPOT5_V07_03P4 SLS_TOULOUSE SEGMENT S5S1S0803041231031 SEGMENT HRS1 S 2008-03-04 12:31:39 SPOT 5 HRS 1 S 0 -22.885488 0.000000 77.673760 9.100812 157 DCT MX FULL 300 96168 1 8 I 0 BIL NONE UNSIGNED BAND_COMPOSITE RAW BIL 1A RAW SYSTEM 1 1 255 QIA+C 0 1950-01-01T00:00:00.000000 DCT_COMPRESSION_CORRECTION DCT_COMPRESSION_CORRECTION N PAN equivalent radiance (W.m-2.Sr-1.um-1) 0.000000 1.282918 2000-03-01T00:00:00.000000 1 S5S1S0803041231031 21247 45064.160035 4201790976 3.9062410727e-03 4201790976 33 853502.971972 -76.520028 -71.790643 1.7495691231e+06 -2.2672541162e+06 -6.6183333707e+06 -6.2538959540e+03 3.1331303950e+03 -2.7272519760e+03 1.5613605504e+06 -2.1717893254e+06 -6.6969776103e+06 -6.2922791080e+03 3.2307123710e+03 -2.5152848660e+03 1.3720962960e+06 -2.0734405370e+06 -6.7692267226e+06 -6.3242716390e+03 3.3253773500e+03 -2.3009438260e+03 1.1819683237e+06 -1.9722970102e+06 -6.8350125303e+06 -6.3498582640e+03 3.4170091580e+03 -2.0844318930e+03 9.9116895999e+05 -1.8684514484e+06 -6.8942729756e+06 -6.3690301090e+03 3.5054943780e+03 -1.8659539520e+03 7.9989070129e+05 -1.7619999146e+06 -6.9469521725e+06 -6.3817846990e+03 3.5907224880e+03 -1.6457165640e+03 6.0832602248e+05 -1.6530417422e+06 -6.9930004548e+06 -6.3881259460e+03 3.6725859930e+03 -1.4239277650e+03 4.1666718582e+05 -1.5416794427e+06 -7.0323744171e+06 -6.3880641040e+03 3.7509805410e+03 -1.2007968730e+03 2.2510605159e+05 -1.4280186094e+06 -7.0650369501e+06 -6.3816157100e+03 3.8258050340e+03 -9.7653430460e+02 3.3833890323e+04 -1.3121678187e+06 -7.0909572719e+06 -6.3688035330e+03 3.8969617210e+03 -7.5135141360e+02 -1.5695880356e+05 -1.1942385283e+06 -7.1101109530e+06 -6.3496565420e+03 3.9643562960e+03 -5.2546034740e+02 -3.4708249746e+05 -1.0743449716e+06 -7.1224799386e+06 -6.3242098850e+03 4.0278980180e+03 -2.9907388240e+02 -5.3634880554e+05 -9.5260404934e+05 -7.1280525641e+06 -6.2925048610e+03 4.0874998320e+03 -7.2405237150e+01 Y 8.6369144000e+07 -1.7977672500e+08 -6.9301268900e+08 -6.3782470000e+06 3.5626830000e+06 -1.7193120000e+06 1.0000000000e+01 7.9989070000e+07 -1.7619999100e+08 -6.9469521700e+08 -6.3817850000e+06 3.5907240000e+06 -1.6457170000e+06 1.1000000000e+01 7.3605814000e+07 -1.7259540400e+08 -6.9630406400e+08 -6.3846110000e+06 3.6183910000e+06 -1.5719490000e+06 1.1000000000e+01 6.7220087000e+07 -1.6896333800e+08 -6.9783906000e+08 -6.3867250000e+06 3.6456800000e+06 -1.4980170000e+06 1.1000000000e+01 6.0832602000e+07 -1.6530417500e+08 -6.9930004500e+08 -6.3881260000e+06 3.6725870000e+06 -1.4239280000e+06 1.2000000000e+01 5.4444073000e+07 -1.6161829500e+08 -7.0068686600e+08 -6.3888170000e+06 3.6991090000e+06 -1.3496900000e+06 1.2000000000e+01 4.8055208000e+07 -1.5790608800e+08 -7.0199937800e+08 -6.3887960000e+06 3.7252420000e+06 -1.2753100000e+06 1.2000000000e+01 4.1666717000e+07 -1.5416794400e+08 -7.0323744200e+08 -6.3880650000e+06 3.7509820000e+06 -1.2007970000e+06 1.2000000000e+01 21245 80579.999999 7.2004926200e+06 4.1950000000e-05 1.1452500000e-03 1.7224965660e+00 2.3705628420e+00 1.0317291540e+00 8.6383808093e-17 0.0000000000e+00 2.6179199219e+00 6.0000610352e-01 -4.7999999710e-06 3.1999999225e-06 -3.1999999225e-06 N -4.7999999710e-06 4.0000000340e-06 -3.1999999225e-06 N -4.7999999710e-06 4.0000000340e-06 -3.1999999225e-06 N -5.6000000825e-06 3.1999999225e-06 -2.3999999855e-06 N -5.6000000825e-06 3.1999999225e-06 -1.5999999961e-06 N -5.6000000825e-06 2.3999999855e-06 -1.5999999961e-06 N -5.6000000825e-06 2.3999999855e-06 -1.5999999961e-06 N -5.6000000825e-06 2.3999999855e-06 -1.5999999961e-06 N -5.6000000825e-06 2.3999999855e-06 -1.5999999961e-06 N -5.6000000825e-06 2.3999999855e-06 -1.5999999961e-06 N -4.7999999710e-06 2.3999999855e-06 -2.3999999855e-06 N -4.7999999710e-06 2.3999999855e-06 -2.3999999855e-06 N -4.7999999710e-06 3.1999999225e-06 -3.1999999225e-06 N -4.7999999710e-06 3.1999999225e-06 -3.1999999225e-06 N -4.7999999710e-06 3.1999999225e-06 -3.1999999225e-06 N -4.7999999710e-06 2.3999999855e-06 -3.1999999225e-06 N -4.0000000340e-06 1.5999999961e-06 -3.1999999225e-06 N -4.7999999710e-06 1.5999999961e-06 -3.1999999225e-06 N -4.7999999710e-06 1.5999999961e-06 -3.1999999225e-06 N -5.6000000825e-06 1.5999999961e-06 -2.3999999855e-06 N -5.6000000825e-06 2.3999999855e-06 -1.5999999961e-06 N -4.7999999710e-06 2.3999999855e-06 -1.5999999961e-06 N -4.7999999710e-06 3.1999999225e-06 -1.5999999961e-06 N -4.7999999710e-06 3.1999999225e-06 -1.5999999961e-06 N -4.7999999710e-06 3.1999999225e-06 -1.5999999961e-06 N -4.7999999710e-06 3.1999999225e-06 -2.3999999855e-06 N -4.7999999710e-06 2.3999999855e-06 -2.3999999855e-06 N -4.7999999710e-06 2.3999999855e-06 -3.1999999225e-06 N -4.7999999710e-06 1.5999999961e-06 -3.1999999225e-06 N -4.7999999710e-06 8.0000000680e-07 -3.1999999225e-06 N -4.7999999710e-06 0.0000000000e+00 -3.1999999225e-06 N -4.7999999710e-06 -8.0000000680e-07 -3.1999999225e-06 N -4.7999999710e-06 -1.5999999961e-06 -3.1999999225e-06 N -4.7999999710e-06 -2.3999999855e-06 -3.1999999225e-06 N -4.7999999710e-06 -2.3999999855e-06 -3.1999999225e-06 N -4.7999999710e-06 -4.0000000340e-06 -2.3999999855e-06 N -5.6000000825e-06 -4.7999999710e-06 -1.5999999961e-06 N -5.6000000825e-06 -5.6000000825e-06 -8.0000000680e-07 N -4.7999999710e-06 -5.6000000825e-06 -8.0000000680e-07 N -4.7999999710e-06 -5.6000000825e-06 -8.0000000680e-07 N -4.7999999710e-06 -6.4000000195e-06 -8.0000000680e-07 N -5.6000000825e-06 -7.1999999565e-06 -1.5999999961e-06 N -5.6000000825e-06 -7.1999999565e-06 -2.3999999855e-06 N -4.7999999710e-06 -5.6000000825e-06 -2.3999999855e-06 N -4.7999999710e-06 -4.0000000340e-06 -3.1999999225e-06 N -4.0000000340e-06 -3.1999999225e-06 -3.1999999225e-06 N -4.0000000340e-06 -2.3999999855e-06 -3.1999999225e-06 N -4.7999999710e-06 -3.1999999225e-06 -3.1999999225e-06 N -4.7999999710e-06 -4.0000000340e-06 -3.1999999225e-06 N -4.7999999710e-06 -4.7999999710e-06 -3.1999999225e-06 N -4.7999999710e-06 -4.7999999710e-06 -3.1999999225e-06 N -4.7999999710e-06 -4.7999999710e-06 -2.3999999855e-06 N -5.6000000825e-06 -5.6000000825e-06 -1.5999999961e-06 N -5.6000000825e-06 -5.6000000825e-06 -1.5999999961e-06 N -4.7999999710e-06 -5.6000000825e-06 -1.5999999961e-06 N -5.6000000825e-06 -4.7999999710e-06 -1.5999999961e-06 N -5.6000000825e-06 -4.7999999710e-06 -1.5999999961e-06 N -4.7999999710e-06 -4.7999999710e-06 -2.3999999855e-06 N -4.7999999710e-06 -4.7999999710e-06 -2.3999999855e-06 N -4.7999999710e-06 -4.7999999710e-06 -2.3999999855e-06 N -4.7999999710e-06 -5.6000000825e-06 -3.1999999225e-06 N -4.7999999710e-06 -5.6000000825e-06 -3.1999999225e-06 N -4.7999999710e-06 -5.6000000825e-06 -3.1999999225e-06 N -4.7999999710e-06 -6.4000000195e-06 -3.1999999225e-06 N -4.7999999710e-06 -7.1999999565e-06 -3.1999999225e-06 N -4.7999999710e-06 -7.1999999565e-06 -4.0000000340e-06 N -4.0000000340e-06 -5.6000000825e-06 -3.1999999225e-06 N -4.7999999710e-06 -3.1999999225e-06 -2.3999999855e-06 N -4.7999999710e-06 -3.1999999225e-06 -1.5999999961e-06 N -5.6000000825e-06 -3.1999999225e-06 -1.5999999961e-06 N -4.7999999710e-06 -4.0000000340e-06 -8.0000000680e-07 N -5.6000000825e-06 -4.7999999710e-06 -1.5999999961e-06 N 6.9999920310e-07 6.9999920310e-07 -2.0000076964e-07 N 2.0000076964e-07 0.0000000000e+00 2.9999940914e-07 N 0.0000000000e+00 1.1999993819e-06 -6.9999920310e-07 N 2.9999940914e-07 8.9999997274e-07 2.0000076964e-07 N -3.9999979396e-07 6.0000056360e-07 -1.0000003576e-07 N -1.0000003576e-07 2.9999940914e-07 -6.0000056360e-07 N 6.9999920310e-07 6.0000056360e-07 -1.0000003576e-07 N -1.0000003576e-07 2.9999940914e-07 -6.0000056360e-07 N -5.0000017878e-07 -2.9999940914e-07 7.9999958792e-07 N 2.9999940914e-07 8.9999997274e-07 2.9999940914e-07 N 5.0000017878e-07 7.9999958792e-07 -8.9999997274e-07 N 2.0000076964e-07 0.0000000000e+00 3.9999979396e-07 N 2.9999940914e-07 8.9999997274e-07 2.9999940914e-07 N -5.0000017878e-07 -2.9999940914e-07 7.9999958792e-07 N 2.0000076964e-07 0.0000000000e+00 3.9999979396e-07 N 6.9999920310e-07 -1.4000001515e-06 1.1999993819e-06 N 2.0000076964e-07 0.0000000000e+00 5.0000017878e-07 N -5.0000017878e-07 -2.9999940914e-07 7.9999958792e-07 N -8.9999997274e-07 -8.9999997274e-07 1.4000001515e-06 N -5.0000017878e-07 -2.9999940914e-07 8.9999997274e-07 N 2.0000076964e-07 0.0000000000e+00 5.0000017878e-07 N -5.0000017878e-07 -2.9999940914e-07 8.9999997274e-07 N -5.0000017878e-07 -2.9999940914e-07 8.9999997274e-07 N -1.0000003576e-07 2.9999940914e-07 -3.9999979396e-07 N -7.9999958792e-07 0.0000000000e+00 1.4000001515e-06 N -5.0000017878e-07 -2.9999940914e-07 8.9999997274e-07 N 1.0000003576e-07 0.0000000000e+00 5.0000017878e-07 N -5.0000017878e-07 -2.9999940914e-07 8.9999997274e-07 N 0.0000000000e+00 -7.9999958792e-07 6.9999920310e-07 N -8.9999997274e-07 0.0000000000e+00 0.0000000000e+00 N 5.0000017878e-07 -1.0000003576e-07 1.0000003576e-07 N 2.9999940914e-07 -1.0000003576e-06 2.9999940914e-07 N 2.9999940914e-07 -1.0000003576e-06 2.9999940914e-07 N 0.0000000000e+00 -6.9999920310e-07 -6.0000056360e-07 N 3.9999979396e-07 -1.0000003576e-07 2.0000076964e-07 N 6.9999920310e-07 -2.9999940914e-07 3.9999979396e-07 N 3.9999979396e-07 -1.0000003576e-07 2.0000076964e-07 N 0.0000000000e+00 -6.9999920310e-07 -6.0000056360e-07 N 1.1999993819e-06 2.0000076964e-07 -1.0000003576e-07 N 0.0000000000e+00 -6.9999920310e-07 -6.0000056360e-07 N 0.0000000000e+00 -6.9999920310e-07 -6.0000056360e-07 N 3.9999979396e-07 -1.0000003576e-07 2.0000076964e-07 N 6.0000056360e-07 -2.9999940914e-07 -8.9999997274e-07 N 1.0000003576e-07 1.0000003576e-07 -6.9999920310e-07 N 3.9999979396e-07 -1.0000003576e-07 2.9999940914e-07 N 5.0000017878e-07 7.9999958792e-07 -6.0000056360e-07 N 3.9999979396e-07 -1.0000003576e-07 2.9999940914e-07 N -2.0000076964e-07 2.9999940914e-07 -2.0000076964e-07 N 1.0000003576e-07 1.0000003576e-07 -6.0000056360e-07 N 1.0000003576e-07 0.0000000000e+00 7.9999958792e-07 N 8.9999997274e-07 1.4000001515e-06 -1.1000007424e-06 N 7.9999958792e-07 3.9999979396e-07 3.9999979396e-07 N 3.9999979396e-07 -1.0000003576e-07 2.9999940914e-07 N -2.0000076964e-07 2.9999940914e-07 -1.0000003576e-07 N 3.9999979396e-07 -1.0000003576e-07 3.9999979396e-07 N 0.0000000000e+00 1.0000003576e-07 -6.0000056360e-07 N 2.0000076964e-07 -1.0000003576e-06 5.0000017878e-07 N 3.9999979396e-07 7.9999958792e-07 -5.0000017878e-07 N 0.0000000000e+00 1.0000003576e-07 -5.0000017878e-07 N -7.9999958792e-07 7.9999958792e-07 1.0000003576e-07 N -6.9999920310e-07 -1.0000003576e-07 -1.0000003576e-06 N 7.9999958792e-07 5.0000017878e-07 -8.9999997274e-07 N 0.0000000000e+00 1.0000003576e-07 -5.0000017878e-07 N -8.9999997274e-07 0.0000000000e+00 2.0000076964e-07 N 0.0000000000e+00 1.0000003576e-07 -5.0000017878e-07 N 7.9999958792e-07 5.0000017878e-07 -8.9999997274e-07 N -2.0000076964e-07 2.9999940914e-07 0.0000000000e+00 N 0.0000000000e+00 1.0000003576e-07 -5.0000017878e-07 N 6.9999920310e-07 5.0000017878e-07 -7.9999958792e-07 N 6.9999920310e-07 5.0000017878e-07 -7.9999958792e-07 N 3.9999979396e-07 -1.0000003576e-07 5.0000017878e-07 N 7.9999958792e-07 3.9999979396e-07 6.0000056360e-07 N 8.9999997274e-07 -6.0000056360e-07 -1.1000007424e-06 N 0.0000000000e+00 0.0000000000e+00 1.0000003576e-06 N 0.0000000000e+00 1.0000003576e-07 -3.9999979396e-07 N 6.9999920310e-07 5.0000017878e-07 -7.9999958792e-07 N 6.9999920310e-07 5.0000017878e-07 -7.9999958792e-07 N 3.9999979396e-07 -1.0000003576e-07 6.0000056360e-07 N 6.0000056360e-07 -2.9999940914e-07 -6.0000056360e-07 N 0.0000000000e+00 1.0000003576e-07 -3.9999979396e-07 N -2.9999940914e-07 3.9999979396e-07 -1.4000001515e-06 N 8.9999997274e-07 1.4000001515e-06 -7.9999958792e-07 N -2.0000076964e-07 2.9999940914e-07 0.0000000000e+00 N 6.9999920310e-07 5.0000017878e-07 -6.9999920310e-07 N 0.0000000000e+00 1.0000003576e-07 -2.9999940914e-07 N 7.9999958792e-07 3.9999979396e-07 6.9999920310e-07 N 0.0000000000e+00 1.0000003576e-07 -2.9999940914e-07 N 6.9999920310e-07 5.0000017878e-07 -6.9999920310e-07 N 0.0000000000e+00 1.0000003576e-07 -2.9999940914e-07 N 6.9999920310e-07 5.0000017878e-07 -6.0000056360e-07 N 0.0000000000e+00 0.0000000000e+00 1.1000007424e-06 N 1.0000003576e-07 1.0000003576e-06 -3.9999979396e-07 N 6.9999920310e-07 5.0000017878e-07 -6.0000056360e-07 N -1.0000003576e-07 -6.9999920310e-07 -1.0000003576e-07 N -2.9999940914e-07 3.9999979396e-07 -1.2999997667e-06 N 6.9999920310e-07 5.0000017878e-07 -6.0000056360e-07 N 2.0000076964e-07 -1.0000003576e-06 8.9999997274e-07 N 6.9999920310e-07 5.0000017878e-07 -6.0000056360e-07 N -6.0000056360e-07 6.9999920310e-07 -7.9999958792e-07 N 0.0000000000e+00 1.0000003576e-07 -2.0000076964e-07 N 0.0000000000e+00 1.0000003576e-07 -2.0000076964e-07 N 6.9999920310e-07 5.0000017878e-07 -5.0000017878e-07 N 0.0000000000e+00 1.0000003576e-07 -2.0000076964e-07 N -1.0000003576e-07 -6.9999920310e-07 0.0000000000e+00 N 6.9999920310e-07 5.0000017878e-07 -5.0000017878e-07 N 0.0000000000e+00 1.0000003576e-07 -1.0000003576e-07 N 0.0000000000e+00 1.0000003576e-07 -1.0000003576e-07 N 5.0000017878e-07 -2.9999940914e-07 -3.9999979396e-07 N -2.9999940914e-07 2.9999940914e-07 2.9999940914e-07 N 0.0000000000e+00 1.0000003576e-07 -1.0000003576e-07 N 7.9999958792e-07 -6.0000056360e-07 -7.9999958792e-07 N 0.0000000000e+00 1.0000003576e-07 -1.0000003576e-07 N 5.0000017878e-07 -2.9999940914e-07 -2.9999940914e-07 N 2.9999940914e-07 -1.0000003576e-07 8.9999997274e-07 N -1.0000003576e-07 -6.9999920310e-07 0.0000000000e+00 N -2.9999940914e-07 2.9999940914e-07 2.9999940914e-07 N 6.9999920310e-07 5.0000017878e-07 -3.9999979396e-07 N 0.0000000000e+00 1.0000003576e-07 0.0000000000e+00 N -5.0000017878e-07 -3.9999979396e-07 -8.9999997274e-07 N 1.0000003576e-07 -1.0000003576e-06 -2.9999940914e-07 N -1.0000003576e-07 -6.9999920310e-07 0.0000000000e+00 N 1.1999993819e-06 -8.9999997274e-07 2.9999940914e-07 N 0.0000000000e+00 1.0000003576e-07 0.0000000000e+00 N -5.0000017878e-07 -5.0000017878e-07 5.0000017878e-07 N 1.1999993819e-06 -8.9999997274e-07 2.9999940914e-07 N 0.0000000000e+00 1.0000003576e-07 0.0000000000e+00 N -1.0000003576e-07 -6.9999920310e-07 1.0000003576e-07 N 7.9999958792e-07 -6.0000056360e-07 -6.0000056360e-07 N -1.0000003576e-07 -6.9999920310e-07 1.0000003576e-07 N -3.9999979396e-07 3.9999979396e-07 -8.9999997274e-07 N -2.0000076964e-07 -6.9999920310e-07 1.0000003576e-07 N 6.0000056360e-07 5.0000017878e-07 -2.9999940914e-07 N 0.0000000000e+00 1.0000003576e-07 0.0000000000e+00 N 6.0000056360e-07 5.0000017878e-07 -2.9999940914e-07 N -5.0000017878e-07 -3.9999979396e-07 -7.9999958792e-07 N -2.0000076964e-07 -6.9999920310e-07 2.0000076964e-07 N -3.9999979396e-07 3.9999979396e-07 -8.9999997274e-07 N 0.0000000000e+00 1.0000003576e-07 1.0000003576e-07 N 6.0000056360e-07 5.0000017878e-07 -2.0000076964e-07 N 0.0000000000e+00 1.0000003576e-07 1.0000003576e-07 N 0.0000000000e+00 1.0000003576e-07 1.0000003576e-07 N 6.0000056360e-07 5.0000017878e-07 -2.0000076964e-07 N 0.0000000000e+00 0.0000000000e+00 1.5999991758e-06 N -2.0000076964e-07 -6.9999920310e-07 2.0000076964e-07 N 0.0000000000e+00 1.0000003576e-07 1.0000003576e-07 N 0.0000000000e+00 0.0000000000e+00 1.5999991758e-06 N 0.0000000000e+00 0.0000000000e+00 1.5999991758e-06 N -3.9999979396e-07 2.9999940914e-07 6.0000056360e-07 N -8.9999997274e-07 7.9999958792e-07 8.9999997274e-07 N 7.9999958792e-07 -6.0000056360e-07 1.0000003576e-06 N -1.1000007424e-06 0.0000000000e+00 1.0000003576e-06 N -2.0000076964e-07 1.1999993819e-06 5.0000017878e-07 N -1.1000007424e-06 0.0000000000e+00 1.0000003576e-06 N -3.9999979396e-07 2.9999940914e-07 6.9999920310e-07 N 0.0000000000e+00 1.0000003576e-07 2.0000076964e-07 N -3.9999979396e-07 2.9999940914e-07 6.9999920310e-07 N -1.0000003576e-07 1.0000003576e-07 2.0000076964e-07 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N -3.9999979396e-07 2.9999940914e-07 6.9999920310e-07 N 2.0000076964e-07 -1.0000003576e-07 -1.0000003576e-07 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N -3.9999979396e-07 2.9999940914e-07 7.9999958792e-07 N 1.5999991758e-06 6.9999920310e-07 -7.9999958792e-07 N 2.0000076964e-07 -2.0000076964e-07 1.4000001515e-06 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N 6.9999920310e-07 1.4000001515e-06 -1.0000003576e-07 N 2.0000076964e-07 7.9999958792e-07 -1.0000003576e-06 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N -3.9999979396e-07 3.9999979396e-07 -6.0000056360e-07 N 6.0000056360e-07 5.0000017878e-07 0.0000000000e+00 N -6.0000056360e-07 1.5999991758e-06 -2.0000076964e-07 N -1.0000003576e-07 1.0000003576e-07 3.9999979396e-07 N 2.0000076964e-07 7.9999958792e-07 -8.9999997274e-07 N -1.0000003576e-07 1.0000003576e-07 3.9999979396e-07 N 5.0000017878e-07 5.0000017878e-07 0.0000000000e+00 N 5.0000017878e-07 5.0000017878e-07 1.0000003576e-07 N 5.0000017878e-07 5.0000017878e-07 1.0000003576e-07 N -1.0000003576e-07 1.0000003576e-07 5.0000017878e-07 N 3.9999979396e-07 -2.9999940914e-07 2.0000076964e-07 N 1.0000003576e-07 -1.0000003576e-07 0.0000000000e+00 N 2.0000076964e-07 7.9999958792e-07 -7.9999958792e-07 N 5.0000017878e-07 5.0000017878e-07 1.0000003576e-07 N -2.9999940914e-07 -6.9999920310e-07 6.0000056360e-07 N -2.9999940914e-07 -6.9999920310e-07 -6.9999920310e-07 N 5.0000017878e-07 5.0000017878e-07 1.0000003576e-07 N -6.0000056360e-07 -3.9999979396e-07 -2.9999940914e-07 N -5.0000017878e-07 3.9999979396e-07 -3.9999979396e-07 N -1.0000003576e-06 -1.0000003576e-07 -1.2999997667e-06 N -2.0000076964e-07 1.0000003576e-07 -7.9999958792e-07 N -6.0000056360e-07 -3.9999979396e-07 -2.0000076964e-07 N -1.0000003576e-07 1.0000003576e-07 6.0000056360e-07 N 2.9999940914e-07 -2.0000076964e-07 -1.1000007424e-06 N -6.0000056360e-07 -3.9999979396e-07 -2.0000076964e-07 N 7.9999958792e-07 2.0000076964e-07 -1.0000003576e-07 N 0.0000000000e+00 0.0000000000e+00 -6.0000056360e-07 N 7.9999958792e-07 2.0000076964e-07 -1.0000003576e-07 N 6.9999920310e-07 -6.0000056360e-07 0.0000000000e+00 N -2.9999940914e-07 -6.9999920310e-07 -6.0000056360e-07 N 5.0000017878e-07 5.0000017878e-07 2.9999940914e-07 N 6.9999920310e-07 -6.0000056360e-07 0.0000000000e+00 N 2.9999940914e-07 -2.0000076964e-07 -1.0000003576e-06 N 1.0000003576e-07 7.9999958792e-07 -6.0000056360e-07 N 7.9999958792e-07 2.0000076964e-07 -1.0000003576e-07 N -2.9999940914e-07 -6.9999920310e-07 -6.0000056360e-07 N 1.0000003576e-07 7.9999958792e-07 -6.0000056360e-07 N 2.9999940914e-07 -2.0000076964e-07 -8.9999997274e-07 N -2.9999940914e-07 -6.9999920310e-07 -5.0000017878e-07 N 1.0000003576e-07 7.9999958792e-07 -6.0000056360e-07 N 6.9999920310e-07 -6.0000056360e-07 0.0000000000e+00 N 3.9999979396e-07 6.0000056360e-07 -1.0000003576e-06 N 2.9999940914e-07 -2.0000076964e-07 -8.9999997274e-07 N 2.9999940914e-07 -2.9999940914e-07 5.0000017878e-07 N -3.9999979396e-07 -6.9999920310e-07 -5.0000017878e-07 N 5.0000017878e-07 -1.5000005363e-06 2.0000076964e-07 N 2.9999940914e-07 -2.0000076964e-07 -7.9999958792e-07 N 2.0000076964e-07 -1.1999993819e-06 0.0000000000e+00 N 0.0000000000e+00 0.0000000000e+00 -3.9999979396e-07 N -3.9999979396e-07 -6.9999920310e-07 -3.9999979396e-07 N 6.0000056360e-07 -6.0000056360e-07 1.0000003576e-07 N 3.9999979396e-07 -1.4000001515e-06 -1.1000007424e-06 N -5.0000017878e-07 -1.5999991758e-06 -2.9999940914e-07 N -6.9999920310e-07 -2.9999940914e-07 -1.4000001515e-06 N -6.9999920310e-07 -3.9999979396e-07 0.0000000000e+00 N 0.0000000000e+00 -1.0000003576e-06 5.0000017878e-07 N 2.9999940914e-07 -2.0000076964e-07 -7.9999958792e-07 N -2.9999940914e-07 -6.9999920310e-07 1.0000003576e-06 N -1.0000003576e-07 -8.9999997274e-07 -7.9999958792e-07 N 5.0000017878e-07 -1.5000005363e-06 2.9999940914e-07 N 2.9999940914e-07 -2.0000076964e-07 -6.9999920310e-07 N -2.0000076964e-07 -1.9000003303e-06 6.9999920310e-07 N 6.0000056360e-07 -6.0000056360e-07 2.0000076964e-07 N 1.0000003576e-06 -8.9999997274e-07 1.2999997667e-06 N 2.0000076964e-07 -2.0000076964e-07 -6.9999920310e-07 N -2.0000076964e-07 -1.9000003303e-06 7.9999958792e-07 N 2.9999940914e-07 -2.9999940914e-07 6.9999920310e-07 N 2.0000076964e-07 -2.0000076964e-07 -6.9999920310e-07 N 0.0000000000e+00 -1.0000003576e-06 6.9999920310e-07 N 2.0000076964e-07 -2.0000076964e-07 -6.0000056360e-07 N -3.9999979396e-07 -6.9999920310e-07 -2.0000076964e-07 N -2.0000076964e-07 -1.9000003303e-06 7.9999958792e-07 N 2.0000076964e-07 -2.0000076964e-07 -6.0000056360e-07 N 0.0000000000e+00 -1.0000003576e-06 6.9999920310e-07 N 0.0000000000e+00 0.0000000000e+00 -1.0000003576e-07 N 5.0000017878e-07 -5.0000017878e-07 -1.0000003576e-06 N -3.9999979396e-07 -6.9999920310e-07 -2.0000076964e-07 N 3.9999979396e-07 -1.5000005363e-06 5.0000017878e-07 N 2.0000076964e-07 -2.0000076964e-07 -6.0000056360e-07 N 0.0000000000e+00 -1.0000003576e-06 7.9999958792e-07 N 2.0000076964e-07 -2.0000076964e-07 -5.0000017878e-07 N -6.0000056360e-07 -1.5999991758e-06 0.0000000000e+00 N 2.0000076964e-07 -2.0000076964e-07 -5.0000017878e-07 N 3.9999979396e-07 -1.5000005363e-06 6.0000056360e-07 N -1.0000003576e-07 -8.9999997274e-07 -6.0000056360e-07 N 2.0000076964e-07 -2.0000076964e-07 -5.0000017878e-07 N 2.0000076964e-07 -2.0000076964e-07 -5.0000017878e-07 N -3.9999979396e-07 -6.9999920310e-07 -1.0000003576e-07 N 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00 N 6.0000056360e-07 -6.0000056360e-07 5.0000017878e-07 N -1.0000003576e-07 -8.9999997274e-07 -5.0000017878e-07 N 8.9999997274e-07 1.0000003576e-07 -7.9999958792e-07 N -1.0000003576e-07 -1.0000003576e-06 8.9999997274e-07 N 0.0000000000e+00 -1.1000007424e-06 -2.9999940914e-07 N 6.9999920310e-07 2.0000076964e-07 3.9999979396e-07 N 8.9999997274e-07 1.0000003576e-07 -7.9999958792e-07 N 6.9999920310e-07 2.0000076964e-07 3.9999979396e-07 N 6.0000056360e-07 -6.0000056360e-07 5.0000017878e-07 N -3.9999979396e-07 -6.9999920310e-07 0.0000000000e+00 N 2.0000076964e-07 -2.9999940914e-07 1.0000003576e-06 N -1.0000003576e-07 -1.0000003576e-06 1.0000003576e-06 N -7.9999958792e-07 -3.9999979396e-07 3.9999979396e-07 N 5.0000017878e-07 -6.0000056360e-07 6.0000056360e-07 N -1.0000003576e-07 -1.0000003576e-06 1.0000003576e-06 N -6.0000056360e-07 -1.5999991758e-06 1.5999991758e-06 N -5.0000017878e-07 -6.9999920310e-07 0.0000000000e+00 N -7.9999958792e-07 -3.9999979396e-07 3.9999979396e-07 N -2.0000076964e-07 -1.9000003303e-06 1.1000007424e-06 N -5.0000017878e-07 -6.9999920310e-07 0.0000000000e+00 N -2.0000076964e-07 -1.9000003303e-06 1.1999993819e-06 N -7.9999958792e-07 -3.9999979396e-07 5.0000017878e-07 N -5.0000017878e-07 -6.9999920310e-07 0.0000000000e+00 N -3.9999979396e-07 -6.9999920310e-07 1.5000005363e-06 N -6.0000056360e-07 -1.5999991758e-06 2.0000076964e-07 N -1.0000003576e-07 -1.0000003576e-06 1.1000007424e-06 N -7.9999958792e-07 -3.9999979396e-07 5.0000017878e-07 N -2.9999940914e-07 -1.9000003303e-06 1.1999993819e-06 N 5.0000017878e-07 -6.0000056360e-07 6.9999920310e-07 N 6.0000056360e-07 -6.0000056360e-07 2.2000049754e-06 N -5.0000017878e-07 -6.9999920310e-07 1.0000003576e-07 N 5.0000017878e-07 -6.0000056360e-07 7.9999958792e-07 N -5.0000017878e-07 -6.9999920310e-07 1.0000003576e-07 N -1.0000003576e-07 0.0000000000e+00 2.0000076964e-07 N 1.0000003576e-07 -1.2999997667e-06 6.9999920310e-07 N -1.0000003576e-07 0.0000000000e+00 2.0000076964e-07 N 1.0000003576e-07 -2.0000076964e-07 -1.0000003576e-07 N 6.0000056360e-07 2.9999940914e-07 -6.9999920310e-07 N 8.9999997274e-07 0.0000000000e+00 8.9999997274e-07 N -2.0000076964e-07 -8.9999997274e-07 -2.0000076964e-07 N 8.9999997274e-07 1.0000003576e-07 -5.0000017878e-07 N 6.0000056360e-07 2.0000076964e-07 6.9999920310e-07 N 1.0000003576e-07 -2.0000076964e-07 -1.0000003576e-07 N 2.9999940914e-07 6.0000056360e-07 -2.0000076964e-07 N 1.0000003576e-07 -2.0000076964e-07 -1.0000003576e-07 N 1.0000003576e-06 1.0000003576e-06 -6.0000056360e-07 N -7.9999958792e-07 -3.9999979396e-07 6.9999920310e-07 N 1.0000003576e-06 1.0000003576e-06 -5.0000017878e-07 N 3.9999979396e-07 -5.0000017878e-07 -5.0000017878e-07 N 1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N -5.0000017878e-07 -6.9999920310e-07 2.9999940914e-07 N 1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N 0.0000000000e+00 8.9999997274e-07 -1.1000007424e-06 N 1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N 1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N -8.9999997274e-07 -2.9999940914e-07 -6.0000056360e-07 N 1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N 1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N 2.9999940914e-07 -1.4000001515e-06 -2.9999940914e-07 N -6.9999920310e-07 -1.5999991758e-06 5.0000017878e-07 N 3.9999979396e-07 -5.0000017878e-07 -3.9999979396e-07 N -2.0000076964e-07 0.0000000000e+00 -8.9999997274e-07 N 2.9999940914e-07 -1.4000001515e-06 -2.0000076964e-07 N -2.0000076964e-07 0.0000000000e+00 -8.9999997274e-07 N -3.9999979396e-07 -1.7999929642e-06 1.0000003576e-07 N 0.0000000000e+00 -1.1000007424e-06 -1.1999993819e-06 N -2.0000076964e-07 0.0000000000e+00 -8.9999997274e-07 N -6.0000056360e-07 -6.0000056360e-07 -1.0000003576e-06 N -5.0000017878e-07 2.9999940914e-07 -1.9000003303e-06 N 1.0000003576e-07 -2.0000076964e-07 1.0000003576e-07 N 0.0000000000e+00 8.9999997274e-07 -1.0000003576e-06 N -1.2999997667e-06 0.0000000000e+00 -1.5000005363e-06 N 6.0000056360e-07 1.2999997667e-06 -1.2999997667e-06 N 2.0000076964e-07 6.0000056360e-07 0.0000000000e+00 N 1.0000003576e-06 1.0000003576e-06 -2.9999940914e-07 N 2.0000076964e-07 6.0000056360e-07 0.0000000000e+00 N 6.0000056360e-07 1.2999997667e-06 -1.2999997667e-06 N 1.1000007424e-06 1.9000003303e-06 -3.9999979396e-07 N 1.0000003576e-06 1.0000003576e-06 -2.9999940914e-07 N 7.9999958792e-07 2.0999976093e-06 0.0000000000e+00 N 3.9999979396e-07 1.4000001515e-06 0.0000000000e+00 N 1.0000003576e-06 1.0000003576e-06 -2.0000076964e-07 N 1.5000005363e-06 2.5999995334e-06 -1.7999929642e-06 N 0.0000000000e+00 7.9999958792e-07 5.0000017878e-07 N 1.1000007424e-06 1.9000003303e-06 -2.9999940914e-07 N 6.0000056360e-07 1.2999997667e-06 -1.1999993819e-06 N 7.9999958792e-07 2.0999976093e-06 0.0000000000e+00 N 3.9999979396e-07 1.4000001515e-06 0.0000000000e+00 N -2.0000076964e-07 2.0000076964e-06 -5.0000017878e-07 N 6.0000056360e-07 1.2999997667e-06 -1.1999993819e-06 N -1.0000003576e-07 8.9999997274e-07 -7.9999958792e-07 N 8.9999997274e-07 1.0000003576e-06 -1.0000003576e-07 N -2.0000076964e-07 2.0000076964e-06 -5.0000017878e-07 N 1.1000007424e-06 1.9000003303e-06 -2.9999940914e-07 N -3.9999979396e-07 1.1000007424e-06 -2.9999940914e-07 N 2.0000076964e-07 6.0000056360e-07 2.0000076964e-07 N 8.9999997274e-07 1.0000003576e-06 -1.0000003576e-07 N 0.0000000000e+00 1.7999929642e-06 -8.9999997274e-07 N 6.0000056360e-07 1.1999993819e-06 2.9999940914e-07 N 0.0000000000e+00 -2.0000076964e-07 2.9999940914e-07 N 2.0000076964e-07 6.0000056360e-07 2.0000076964e-07 N -3.9999979396e-07 1.1000007424e-06 -2.9999940914e-07 N -1.0000003576e-07 8.9999997274e-07 -6.9999920310e-07 N -3.9999979396e-07 1.0000003576e-07 6.0000056360e-07 N 3.9999979396e-07 3.9999979396e-07 -8.9999997274e-07 N -6.0000056360e-07 -6.9999920310e-07 7.9999958792e-07 N -2.0000076964e-07 0.0000000000e+00 -5.0000017878e-07 N 0.0000000000e+00 -2.0000076964e-07 3.9999979396e-07 N 2.9999940914e-07 -5.0000017878e-07 0.0000000000e+00 N -6.0000056360e-07 -6.9999920310e-07 7.9999958792e-07 N -2.0000076964e-07 0.0000000000e+00 -5.0000017878e-07 N 2.0000076964e-07 -1.4000001515e-06 1.0000003576e-07 N 2.9999940914e-07 -5.0000017878e-07 0.0000000000e+00 N -3.9999979396e-07 -7.9999958792e-07 -2.9999940914e-07 N -3.9999979396e-07 -1.7999929642e-06 5.0000017878e-07 N 2.9999940914e-07 -5.0000017878e-07 0.0000000000e+00 N 0.0000000000e+00 -1.1000007424e-06 6.0000056360e-07 N 0.0000000000e+00 -2.0000076964e-07 -8.9999997274e-07 N -1.0000003576e-06 -2.9999940914e-07 0.0000000000e+00 N 8.9999997274e-07 -1.0000003576e-06 -1.0000003576e-07 N -6.0000056360e-07 -6.9999920310e-07 8.9999997274e-07 N -1.0000003576e-07 -1.1000007424e-06 -6.9999920310e-07 N -2.9999940914e-07 0.0000000000e+00 -3.9999979396e-07 N 0.0000000000e+00 -2.0000076964e-07 -7.9999958792e-07 N -2.9999940914e-07 0.0000000000e+00 -3.9999979396e-07 N 0.0000000000e+00 -2.0000076964e-07 6.0000056360e-07 N 2.9999940914e-07 -5.0000017878e-07 1.0000003576e-07 N -2.9999940914e-07 0.0000000000e+00 -2.9999940914e-07 N -1.0000003576e-07 8.9999997274e-07 -5.0000017878e-07 N 6.9999920310e-07 1.0000003576e-07 -1.1999993819e-06 N 2.9999940914e-07 -5.0000017878e-07 2.0000076964e-07 N 1.1000007424e-06 -1.0000003576e-07 1.2999997667e-06 N 6.9999920310e-07 1.0000003576e-07 -1.1000007424e-06 N 2.9999940914e-07 -5.0000017878e-07 2.0000076964e-07 N 6.9999920310e-07 1.0000003576e-07 2.9999940914e-07 N 2.9999940914e-07 -5.0000017878e-07 2.0000076964e-07 N 2.0000076964e-07 -1.4000001515e-06 3.9999979396e-07 N 8.9999997274e-07 1.0000003576e-06 2.0000076964e-07 N -1.0000003576e-06 -2.9999940914e-07 0.0000000000e+00 N 1.0000003576e-06 -1.0000003576e-07 0.0000000000e+00 N 2.9999940914e-07 -6.0000056360e-07 1.6999995607e-06 N -2.9999940914e-07 0.0000000000e+00 -2.0000076964e-07 N -1.0000003576e-06 -3.9999979396e-07 1.5999991758e-06 N -5.0000017878e-07 1.0000003576e-07 1.0000003576e-06 N 0.0000000000e+00 -2.0000076964e-07 6.9999920310e-07 N -1.0000003576e-07 8.9999997274e-07 -2.9999940914e-07 N -2.0000076964e-07 0.0000000000e+00 1.1999993819e-06 N -2.9999940914e-07 -8.9999997274e-07 6.9999920310e-07 N 2.9999940914e-07 -6.0000056360e-07 1.7999929642e-06 N -2.9999940914e-07 0.0000000000e+00 1.1999993819e-06 N 2.9999940914e-07 -5.0000017878e-07 2.9999940914e-07 N -2.0000076964e-07 8.9999997274e-07 -2.9999940914e-07 N -1.0000003576e-06 -3.9999979396e-07 1.5999991758e-06 N 0.0000000000e+00 -2.0000076964e-07 -6.0000056360e-07 N 0.0000000000e+00 -2.0000076964e-07 7.9999958792e-07 N 1.0000003576e-06 -1.0000003576e-07 0.0000000000e+00 N 0.0000000000e+00 -2.0000076964e-07 -5.0000017878e-07 N -5.0000017878e-07 -7.9999958792e-07 0.0000000000e+00 N 3.9999979396e-07 2.9999940914e-07 2.9999940914e-07 N -2.9999940914e-07 0.0000000000e+00 -1.0000003576e-07 N 6.0000056360e-07 1.0000003576e-07 -8.9999997274e-07 N 0.0000000000e+00 -2.0000076964e-07 8.9999997274e-07 N 0.0000000000e+00 -2.0000076964e-07 -5.0000017878e-07 N -2.9999940914e-07 0.0000000000e+00 0.0000000000e+00 N 7.9999958792e-07 1.0000003576e-06 3.9999979396e-07 N 0.0000000000e+00 -2.0000076964e-07 -3.9999979396e-07 N -2.0000076964e-07 8.9999997274e-07 -1.0000003576e-07 N 2.9999940914e-07 3.9999979396e-07 -3.9999979396e-07 N -2.0000076964e-07 8.9999997274e-07 -1.0000003576e-07 N 1.1000007424e-06 6.9999920310e-07 0.0000000000e+00 N 0.0000000000e+00 -2.0000076964e-07 1.0000003576e-06 N 7.9999958792e-07 1.0000003576e-06 -8.9999997274e-07 N 2.9999940914e-07 3.9999979396e-07 -2.9999940914e-07 N 1.0000003576e-07 5.0000017878e-07 8.9999997274e-07 N 0.0000000000e+00 -2.0000076964e-07 -3.9999979396e-07 N 2.9999940914e-07 3.9999979396e-07 -2.9999940914e-07 N 2.0000076964e-07 -5.0000017878e-07 6.0000056360e-07 N 6.0000056360e-07 1.0000003576e-07 -6.9999920310e-07 N -7.9999958792e-07 -6.0000056360e-07 0.0000000000e+00 N 0.0000000000e+00 6.9999920310e-07 -1.2999997667e-06 N 2.0000076964e-07 -5.0000017878e-07 6.0000056360e-07 N 0.0000000000e+00 -2.0000076964e-07 -2.9999940914e-07 N 2.9999940914e-07 3.9999979396e-07 -2.0000076964e-07 N -1.1000007424e-06 -2.9999940914e-07 -8.9999997274e-07 N 2.9999940914e-07 3.9999979396e-07 -2.0000076964e-07 N -3.9999979396e-07 0.0000000000e+00 -1.2999997667e-06 N 0.0000000000e+00 6.0000056360e-07 -3.9999979396e-07 N 2.9999940914e-07 3.9999979396e-07 -2.0000076964e-07 N -3.9999979396e-07 0.0000000000e+00 -1.2999997667e-06 N 6.9999920310e-07 1.0000003576e-06 -6.9999920310e-07 N 6.0000056360e-07 1.0000003576e-07 7.9999958792e-07 N 0.0000000000e+00 6.0000056360e-07 -2.9999940914e-07 N 6.0000056360e-07 1.0000003576e-07 -6.0000056360e-07 N 6.0000056360e-07 1.0000003576e-07 -6.0000056360e-07 N 6.0000056360e-07 1.0000003576e-07 -6.0000056360e-07 N 1.1000007424e-06 6.9999920310e-07 2.0000076964e-07 N 6.0000056360e-07 1.0000003576e-07 -5.0000017878e-07 N 8.9999997274e-07 -1.0000003576e-07 3.9999979396e-07 N -2.0000076964e-07 8.9999997274e-07 1.0000003576e-07 N 6.0000056360e-07 1.0000003576e-07 -5.0000017878e-07 N 6.0000056360e-07 1.0000003576e-07 -5.0000017878e-07 N 2.0000076964e-07 5.0000017878e-07 -1.5000005363e-06 N 6.9999920310e-07 1.0000003576e-06 -6.0000056360e-07 N -3.9999979396e-07 0.0000000000e+00 2.0000076964e-07 N 2.0000076964e-07 -5.0000017878e-07 7.9999958792e-07 N 6.0000056360e-07 1.0000003576e-07 -5.0000017878e-07 N 3.9999979396e-07 1.4000001515e-06 -1.5999991758e-06 N 6.0000056360e-07 1.0000003576e-07 -3.9999979396e-07 N -1.0000003576e-07 -2.0000076964e-07 -1.0000003576e-07 N -5.0000017878e-07 -7.9999958792e-07 3.9999979396e-07 N 8.9999997274e-07 0.0000000000e+00 -8.9999997274e-07 N 3.9999979396e-07 -6.9999920310e-07 -2.9999940914e-07 N -1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N 0.0000000000e+00 -1.2999997667e-06 -2.9999940914e-07 N 2.0000076964e-07 5.0000017878e-07 -1.4000001515e-06 N -1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N -2.0000076964e-07 -1.1000007424e-06 0.0000000000e+00 N 6.0000056360e-07 1.0000003576e-07 -3.9999979396e-07 N -3.9999979396e-07 0.0000000000e+00 -1.0000003576e-06 N -2.0000076964e-07 -1.1000007424e-06 1.0000003576e-07 N 5.0000017878e-07 1.0000003576e-07 -2.9999940914e-07 N -2.9999940914e-07 8.9999997274e-07 2.9999940914e-07 N 5.0000017878e-07 1.0000003576e-07 -2.9999940914e-07 N 5.0000017878e-07 1.0000003576e-07 -2.9999940914e-07 N -1.0000003576e-07 -2.0000076964e-07 0.0000000000e+00 N -3.9999979396e-07 0.0000000000e+00 3.9999979396e-07 N 6.9999920310e-07 1.0000003576e-06 -3.9999979396e-07 N 0.0000000000e+00 -1.4000001515e-06 1.1999993819e-06 N 5.0000017878e-07 1.0000003576e-07 -2.9999940914e-07 N 6.9999920310e-07 1.0000003576e-06 -3.9999979396e-07 N 3.9999979396e-07 -6.9999920310e-07 -1.0000003576e-07 N 0.0000000000e+00 5.0000017878e-07 1.4000001515e-06 N 8.9999997274e-07 -1.0000003576e-07 6.9999920310e-07 N -1.0000003576e-07 -2.0000076964e-07 1.0000003576e-07 N 0.0000000000e+00 -2.9999940914e-07 -1.1000007424e-06 N -1.0000003576e-07 -2.0000076964e-07 1.0000003576e-07 N 6.9999920310e-07 -1.0000003576e-06 8.9999997274e-07 N 1.0000003576e-07 -5.0000017878e-07 -2.0000076964e-07 N 3.9999979396e-07 -6.9999920310e-07 0.0000000000e+00 N -1.0000003576e-07 -2.0000076964e-07 1.0000003576e-07 N 0.0000000000e+00 -1.2999997667e-06 -1.0000003576e-07 N -6.0000056360e-07 -7.9999958792e-07 -6.9999920310e-07 N 6.9999920310e-07 -8.9999997274e-07 -3.9999979396e-07 N -3.9999979396e-07 -2.0000076964e-06 3.9999979396e-07 N 0.0000000000e+00 -1.2999997667e-06 0.0000000000e+00 N 0.0000000000e+00 -1.2999997667e-06 0.0000000000e+00 N 0.0000000000e+00 -2.9999940914e-07 -1.0000003576e-06 N -2.9999940914e-07 -1.0000003576e-06 -1.1000007424e-06 N -2.9999940914e-07 -1.1000007424e-06 2.9999940914e-07 N 2.9999940914e-07 -6.0000056360e-07 -1.4000001515e-06 N -5.0000017878e-07 0.0000000000e+00 -6.9999920310e-07 N -5.0000017878e-07 0.0000000000e+00 -6.9999920310e-07 N -1.0000003576e-07 -2.0000076964e-07 2.0000076964e-07 N -6.0000056360e-07 -7.9999958792e-07 -6.0000056360e-07 N -2.9999940914e-07 8.9999997274e-07 -7.9999958792e-07 N -1.0000003576e-07 6.9999920310e-07 -6.0000056360e-07 N 5.0000017878e-07 1.0000003576e-07 0.0000000000e+00 N -2.9999940914e-07 8.9999997274e-07 -7.9999958792e-07 N 6.0000056360e-07 1.0000003576e-06 -1.0000003576e-07 N 1.1000007424e-06 1.6999995607e-06 0.0000000000e+00 N 5.0000017878e-07 1.0000003576e-07 0.0000000000e+00 N 2.9999940914e-07 1.2999997667e-06 2.9999940914e-07 N 7.9999958792e-07 1.9000003303e-06 -2.0000076964e-07 N 2.9999940914e-07 1.2999997667e-06 2.9999940914e-07 N 7.9999958792e-07 1.9000003303e-06 1.1999993819e-06 N 7.9999958792e-07 1.9000003303e-06 1.1999993819e-06 N 1.0000003576e-07 2.4000022544e-06 6.0000056360e-07 N 2.9999940914e-07 1.2999997667e-06 2.9999940914e-07 N -5.0000017878e-07 2.0000076964e-06 1.0000003576e-06 N -2.0000076964e-07 1.7999929642e-06 6.0000056360e-07 N -1.0000003576e-07 2.7000068995e-06 1.1000007424e-06 N 0.0000000000e+00 2.7000068995e-06 5.0000017878e-07 N -5.0000017878e-07 2.0000076964e-06 1.1000007424e-06 N -6.0000056360e-07 1.1000007424e-06 1.1999993819e-06 N 5.0000017878e-07 2.2000049754e-06 2.9999940914e-07 N -6.0000056360e-07 1.1000007424e-06 1.1999993819e-06 N 0.0000000000e+00 5.0000017878e-07 1.7999929642e-06 N -2.9999940914e-07 8.9999997274e-07 7.9999958792e-07 N 6.9999920310e-07 1.0000003576e-06 1.5000005363e-06 N -2.0000076964e-07 -2.0000076964e-07 5.0000017878e-07 N 2.9999940914e-07 1.2999997667e-06 3.9999979396e-07 N -1.0000003576e-07 -2.9999940914e-07 2.0000076964e-06 N -3.9999979396e-07 8.9999997274e-07 -5.0000017878e-07 N 5.0000017878e-07 1.0000003576e-07 1.0000003576e-07 N 5.0000017878e-07 1.0000003576e-07 2.0000076964e-07 N -8.9999997274e-07 2.9999940914e-07 0.0000000000e+00 N -3.9999979396e-07 8.9999997274e-07 -5.0000017878e-07 N 1.0000003576e-07 5.0000017878e-07 -7.9999958792e-07 N -2.9999940914e-07 -1.1000007424e-06 6.9999920310e-07 N 7.9999958792e-07 0.0000000000e+00 -1.0000003576e-07 N -6.9999920310e-07 -7.9999958792e-07 -2.0000076964e-07 N 3.9999979396e-07 2.0000076964e-07 -1.1999993819e-06 N 2.9999940914e-07 -6.9999920310e-07 3.9999979396e-07 N 1.0000003576e-06 -1.1999993819e-06 8.9999997274e-07 N 0.0000000000e+00 -1.2999997667e-06 2.9999940914e-07 N 6.0000056360e-07 -8.9999997274e-07 0.0000000000e+00 N 2.9999940914e-07 -6.9999920310e-07 3.9999979396e-07 N -2.0000076964e-07 -1.0000003576e-07 -6.9999920310e-07 N 2.9999940914e-07 -6.9999920310e-07 3.9999979396e-07 N -6.0000056360e-07 0.0000000000e+00 -2.9999940914e-07 N 0.0000000000e+00 -1.2999997667e-06 3.9999979396e-07 N 0.0000000000e+00 -2.9999940914e-07 -5.0000017878e-07 N -3.9999979396e-07 -1.0000003576e-06 -6.0000056360e-07 N 3.9999979396e-07 2.0000076964e-07 -1.1000007424e-06 N -6.9999920310e-07 -7.9999958792e-07 -1.0000003576e-07 N 6.0000056360e-07 -8.9999997274e-07 0.0000000000e+00 N -3.9999979396e-07 -1.0000003576e-06 -5.0000017878e-07 N 2.0000076964e-07 -6.0000056360e-07 -8.9999997274e-07 N -3.9999979396e-07 -1.1000007424e-06 8.9999997274e-07 N 6.0000056360e-07 -8.9999997274e-07 1.0000003576e-07 N 3.9999979396e-07 2.0000076964e-07 -1.0000003576e-06 N 2.9999940914e-07 -6.9999920310e-07 5.0000017878e-07 N -3.9999979396e-07 -1.0000003576e-06 -5.0000017878e-07 N 6.0000056360e-07 -8.9999997274e-07 1.0000003576e-07 N -3.9999979396e-07 -1.0000003576e-06 -3.9999979396e-07 N -2.0000076964e-07 7.9999958792e-07 -1.5000005363e-06 N 2.0000076964e-07 -6.0000056360e-07 -7.9999958792e-07 N -2.0000076964e-07 -2.0000076964e-07 7.9999958792e-07 N -0.335640 -0.000001 0.000002 2008-03-04T12:31:03.206912 3 1.3065856695e-01 8.9903533459e-01 4.1715109348e-01 -2.5486033410e-02 2008-03-04T12:31:03.331912 3 1.3060051203e-01 8.9904558659e-01 4.1714566946e-01 -2.5511495769e-02 2008-03-04T12:31:03.456912 3 1.3054236770e-01 8.9905583858e-01 4.1714018583e-01 -2.5537047535e-02 2008-03-04T12:31:03.581911 3 1.3048419356e-01 8.9906609058e-01 4.1713476181e-01 -2.5562528521e-02 2008-03-04T12:31:03.706911 3 1.3042607903e-01 8.9907634258e-01 4.1712933779e-01 -2.5588031858e-02 2008-03-04T12:31:03.831911 3 1.3036796451e-01 8.9908659458e-01 4.1712385416e-01 -2.5613553822e-02 2008-03-04T12:31:03.956910 3 1.3030982018e-01 8.9909684658e-01 4.1711837053e-01 -2.5639049709e-02 2008-03-04T12:31:04.081910 3 1.3025170565e-01 8.9910697937e-01 4.1711294651e-01 -2.5664567947e-02 2008-03-04T12:31:04.206910 3 1.3019362092e-01 8.9911723137e-01 4.1710752249e-01 -2.5689993054e-02 2008-03-04T12:31:04.331910 3 1.3013544679e-01 8.9912748337e-01 4.1710209847e-01 -2.5715474039e-02 2008-03-04T12:31:04.456909 3 1.3007730246e-01 8.9913761616e-01 4.1709655523e-01 -2.5741018355e-02 2008-03-04T12:31:04.581909 3 1.3001918793e-01 8.9914786816e-01 4.1709113121e-01 -2.5766469538e-02 2008-03-04T12:31:04.706909 3 1.2996104360e-01 8.9915812016e-01 4.1708564758e-01 -2.5791950524e-02 2008-03-04T12:31:04.831908 3 1.2990292907e-01 8.9916825294e-01 4.1708022356e-01 -2.5817371905e-02 2008-03-04T12:31:04.956908 3 1.2984478474e-01 8.9917850494e-01 4.1707473993e-01 -2.5842823088e-02 2008-03-04T12:31:05.081908 3 1.2978672981e-01 8.9918863773e-01 4.1706925631e-01 -2.5868188590e-02 2008-03-04T12:31:05.206908 3 1.2972861528e-01 8.9919888973e-01 4.1706377268e-01 -2.5893639773e-02 2008-03-04T12:31:05.331907 3 1.2967050076e-01 8.9920902252e-01 4.1705834866e-01 -2.5919046253e-02 2008-03-04T12:31:05.456907 3 1.2961241603e-01 8.9921915531e-01 4.1705292463e-01 -2.5944422930e-02 2008-03-04T12:31:05.581907 3 1.2955430150e-01 8.9922940731e-01 4.1704750061e-01 -2.5969844311e-02 2008-03-04T12:31:05.706906 3 1.2949618697e-01 8.9923954010e-01 4.1704201698e-01 -2.5995295495e-02 2008-03-04T12:31:05.831906 3 1.2943807244e-01 8.9924967289e-01 4.1703659296e-01 -2.6020716876e-02 2008-03-04T12:31:05.956906 3 1.2937995791e-01 8.9925980568e-01 4.1703116894e-01 -2.6046141982e-02 2008-03-04T12:31:06.081906 3 1.2932184339e-01 8.9927005768e-01 4.1702568531e-01 -2.6071660221e-02 2008-03-04T12:31:06.206905 3 1.2926369905e-01 8.9928019047e-01 4.1702026129e-01 -2.6097066700e-02 2008-03-04T12:31:06.331905 3 1.2920555472e-01 8.9929032326e-01 4.1701477766e-01 -2.6122450829e-02 2008-03-04T12:31:06.456905 3 1.2914741039e-01 8.9930045605e-01 4.1700929403e-01 -2.6147902012e-02 2008-03-04T12:31:06.581904 3 1.2908929586e-01 8.9931058884e-01 4.1700387001e-01 -2.6173323393e-02 2008-03-04T12:31:06.706904 3 1.2903121114e-01 8.9932072163e-01 4.1699838638e-01 -2.6198741049e-02 2008-03-04T12:31:06.831904 3 1.2897312641e-01 8.9933085442e-01 4.1699296236e-01 -2.6224233210e-02 2008-03-04T12:31:06.956904 3 1.2891501188e-01 8.9934098721e-01 4.1698741913e-01 -2.6249695569e-02 2008-03-04T12:31:07.081903 3 1.2885695696e-01 8.9935112000e-01 4.1698193550e-01 -2.6275131851e-02 2008-03-04T12:31:07.206903 3 1.2879890203e-01 8.9936125278e-01 4.1697639227e-01 -2.6300564408e-02 2008-03-04T12:31:07.331903 3 1.2874075770e-01 8.9937138557e-01 4.1697090864e-01 -2.6326075196e-02 2008-03-04T12:31:07.456902 3 1.2868264318e-01 8.9938151836e-01 4.1696536541e-01 -2.6351537555e-02 2008-03-04T12:31:07.581902 3 1.2862455845e-01 8.9939165115e-01 4.1695982218e-01 -2.6376985013e-02 2008-03-04T12:31:07.706902 3 1.2856644392e-01 8.9940178394e-01 4.1695427895e-01 -2.6402447373e-02 2008-03-04T12:31:07.831902 3 1.2850838900e-01 8.9941179752e-01 4.1694879532e-01 -2.6427950710e-02 2008-03-04T12:31:07.956901 3 1.2845027447e-01 8.9942204952e-01 4.1694319248e-01 -2.6453439146e-02 2008-03-04T12:31:08.081901 3 1.2839221954e-01 8.9943206310e-01 4.1693770885e-01 -2.6478942484e-02 2008-03-04T12:31:08.206901 3 1.2833416462e-01 8.9944219589e-01 4.1693216562e-01 -2.6504445821e-02 2008-03-04T12:31:08.331900 3 1.2827599049e-01 8.9945232868e-01 4.1692662239e-01 -2.6529930532e-02 2008-03-04T12:31:08.456900 3 1.2821793556e-01 8.9946234226e-01 4.1692107916e-01 -2.6555459946e-02 2008-03-04T12:31:08.581900 3 1.2815982103e-01 8.9947247505e-01 4.1691553593e-01 -2.6580993086e-02 2008-03-04T12:31:08.706900 3 1.2810170650e-01 8.9948260784e-01 4.1690999269e-01 -2.6606455445e-02 2008-03-04T12:31:08.831899 3 1.2804359198e-01 8.9949262142e-01 4.1690444946e-01 -2.6631996036e-02 2008-03-04T12:31:08.956899 3 1.2798547745e-01 8.9950275421e-01 4.1689890623e-01 -2.6657458395e-02 2008-03-04T12:31:09.081899 3 1.2792733312e-01 8.9951288700e-01 4.1689336300e-01 -2.6682972908e-02 2008-03-04T12:31:09.206898 3 1.2786921859e-01 8.9952290058e-01 4.1688781977e-01 -2.6708506048e-02 2008-03-04T12:31:09.331898 3 1.2781107426e-01 8.9953303337e-01 4.1688227653e-01 -2.6733968407e-02 2008-03-04T12:31:09.456898 3 1.2775290012e-01 8.9954304695e-01 4.1687667370e-01 -2.6759557426e-02 2008-03-04T12:31:09.581898 3 1.2769475579e-01 8.9955317974e-01 4.1687113047e-01 -2.6785030961e-02 2008-03-04T12:31:09.706897 3 1.2763664126e-01 8.9956319332e-01 4.1686558723e-01 -2.6810489595e-02 2008-03-04T12:31:09.831897 3 1.2757849693e-01 8.9957332611e-01 4.1686004400e-01 -2.6836004108e-02 2008-03-04T12:31:09.956897 3 1.2752038240e-01 8.9958333969e-01 4.1685450077e-01 -2.6861466467e-02 2008-03-04T12:31:10.081896 3 1.2746226788e-01 8.9959335327e-01 4.1684895754e-01 -2.6886999607e-02 2008-03-04T12:31:10.206896 3 1.2740421295e-01 8.9960336685e-01 4.1684335470e-01 -2.6912428439e-02 Y 1.1621635280e-03 -9.5496029568e-04 -1.7549389832e-05 N 1.1622064463e-03 -9.5506049908e-04 -1.7576724833e-05 N 1.1623283868e-03 -9.5492219975e-04 -1.7704390877e-05 N 1.1623599330e-03 -9.5479158109e-04 -1.7663227190e-05 N 1.1623883717e-03 -9.5475042923e-04 -1.7710977149e-05 N 1.1625188884e-03 -9.5469064290e-04 -1.7806616409e-05 N 1.1626545043e-03 -9.5459808519e-04 -1.7829313571e-05 N 1.1625788800e-03 -9.5457555994e-04 -1.7906614047e-05 N 1.1626282423e-03 -9.5465344165e-04 -1.7834187971e-05 N 1.1626582054e-03 -9.5452392088e-04 -1.7786295427e-05 N 1.1627879668e-03 -9.5441882245e-04 -1.7913184938e-05 N 1.1628282479e-03 -9.5442137030e-04 -1.7859322391e-05 N 1.1629661769e-03 -9.5434235940e-04 -1.7848465579e-05 N 1.1629143170e-03 -9.5439980422e-04 -1.7744953881e-05 N 1.1630594764e-03 -9.5434573648e-04 -1.7678268548e-05 N 1.1631318018e-03 -9.5455497224e-04 -1.7537405236e-05 N 1.1632779821e-03 -9.5455449439e-04 -1.7493368719e-05 N 1.1632289399e-03 -9.5462440511e-04 -1.7358584401e-05 N 1.1631888328e-03 -9.5477383355e-04 -1.7194053060e-05 N 1.1632347586e-03 -9.5480143174e-04 -1.7077614958e-05 N 1.1632805370e-03 -9.5483085992e-04 -1.7035268368e-05 N 1.1632265082e-03 -9.5488935381e-04 -1.6922814269e-05 N 1.1631712529e-03 -9.5494473636e-04 -1.6815942911e-05 N 1.1632982771e-03 -9.5488830010e-04 -1.6884533236e-05 N 1.1632458381e-03 -9.5490467691e-04 -1.6717006744e-05 N 1.1633060396e-03 -9.5493764501e-04 -1.6523600176e-05 N 1.1633486496e-03 -9.5491454731e-04 -1.6449605772e-05 N 1.1632931190e-03 -9.5497205178e-04 -1.6330429867e-05 N 1.1633469851e-03 -9.5508414396e-04 -1.6243753490e-05 N 1.1632741664e-03 -9.5513709328e-04 -1.6274516846e-05 N 1.1634216431e-03 -9.5515510407e-04 -1.6256402866e-05 N 1.1634715795e-03 -9.5530419197e-04 -1.6224731032e-05 N 1.1636293668e-03 -9.5545428136e-04 -1.6200598705e-05 N 1.1636548436e-03 -9.5538139546e-04 -1.6225875574e-05 N 1.1638013938e-03 -9.5539839747e-04 -1.6203200450e-05 N 1.1639530299e-03 -9.5548247149e-04 -1.6177526747e-05 N 1.1640990117e-03 -9.5550051632e-04 -1.6152587010e-05 N 1.1640307341e-03 -9.5562527182e-04 -1.6241027875e-05 N 1.1643762219e-03 -9.5558670656e-04 -1.6269659114e-05 N 1.1643074715e-03 -9.5571146486e-04 -1.6355847898e-05 N 1.1644451139e-03 -9.5580244860e-04 -1.6449866282e-05 N 1.1645810480e-03 -9.5569365924e-04 -1.6409588112e-05 N 1.1646121246e-03 -9.5579343608e-04 -1.6554577808e-05 N 1.1647382546e-03 -9.5575237376e-04 -1.6648944856e-05 N 1.1648822841e-03 -9.5577049467e-04 -1.6614912268e-05 N 1.1649067017e-03 -9.5575272967e-04 -1.6726767373e-05 N 1.1650502413e-03 -9.5577087160e-04 -1.6690463553e-05 N 1.1651785977e-03 -9.5569185144e-04 -1.6721884748e-05 N 1.1652042161e-03 -9.5568031784e-04 -1.6816956845e-05 N 1.1653454260e-03 -9.5564491836e-04 -1.6752332975e-05 N 1.1654602699e-03 -9.5547732654e-04 -1.6911045519e-05 N 1.1655981341e-03 -9.5543261194e-04 -1.6864241900e-05 N 1.1656418285e-03 -9.5548335830e-04 -1.6820824239e-05 N 1.1657687364e-03 -9.5540442697e-04 -1.6845435541e-05 N 1.1658109170e-03 -9.5545309817e-04 -1.6806472293e-05 N 1.1658348760e-03 -9.5544158149e-04 -1.6893645538e-05 N 1.1659955583e-03 -9.5562223221e-04 -1.6857138954e-05 N 1.1661085080e-03 -9.5545241407e-04 -1.6932691482e-05 N 1.1661326408e-03 -9.5544505909e-04 -1.7009793043e-05 N 1.1660489938e-03 -9.5534206842e-04 -1.7000680505e-05 N 1.1660685796e-03 -9.5536964007e-04 -1.7140643261e-05 N 1.1661916829e-03 -9.5533415817e-04 -1.7283122139e-05 N 1.1662149563e-03 -9.5532580021e-04 -1.7355712433e-05 N 1.1662492808e-03 -9.5535583977e-04 -1.7346799588e-05 N 1.1662720129e-03 -9.5534853019e-04 -1.7417155120e-05 N 1.1663938033e-03 -9.5521521928e-04 -1.7485194211e-05 N 1.1664182993e-03 -9.5516575529e-04 -1.7501576473e-05 N 1.1665475823e-03 -9.5515521894e-04 -1.7583660042e-05 N 1.1666700263e-03 -9.5512289990e-04 -1.7711504424e-05 N 1.1667906913e-03 -9.5503596214e-04 -1.7813292604e-05 N 1.1669372042e-03 -9.5508460065e-04 -1.7764663355e-05 N 1.1670773891e-03 -9.5501670973e-04 -1.7685186338e-05 N 1.1672138278e-03 -9.5513095880e-04 -1.7853102969e-05 N 1.1672686837e-03 -9.5518740533e-04 -1.7633765037e-05 N 1.1673956315e-03 -9.5512644400e-04 -1.7676281688e-05 N 1.1676237117e-03 -9.5509091421e-04 -1.7811217146e-05 N 1.1676433825e-03 -9.5503414031e-04 -1.7911610048e-05 N 1.1677881907e-03 -9.5508284246e-04 -1.7855006523e-05 N 1.1679174733e-03 -9.5512913903e-04 -1.7942773756e-05 N 1.1679438970e-03 -9.5509829563e-04 -1.7986188063e-05 N 1.1680523722e-03 -9.5502773453e-04 -1.8180783773e-05 N 1.1683903532e-03 -9.5495404182e-04 -1.8258763918e-05 N 1.1683109241e-03 -9.5488534912e-04 -1.8232071249e-05 N 1.1685372549e-03 -9.5484888345e-04 -1.8357843130e-05 N 1.1685625222e-03 -9.5481804867e-04 -1.8395600369e-05 N 1.1685999577e-03 -9.5478028792e-04 -1.8306816969e-05 N 1.1687257418e-03 -9.5477310520e-04 -1.8360591482e-05 N 1.1688501614e-03 -9.5471303159e-04 -1.8463529253e-05 N 1.1688761419e-03 -9.5473581420e-04 -1.8521670034e-05 N 1.1688918243e-03 -9.5467697883e-04 -1.8614099812e-05 N 1.1690349356e-03 -9.5463319786e-04 -1.8459392549e-05 N 1.1690494264e-03 -9.5452388237e-04 -1.8517968034e-05 N 1.1691726284e-03 -9.5446484882e-04 -1.8615250312e-05 N 1.1692065699e-03 -9.5456617329e-04 -1.8639033865e-05 N 1.1692135011e-03 -9.5452883941e-04 -1.8817726684e-05 N 1.1693369603e-03 -9.5447293036e-04 -1.8904906226e-05 N 1.1694942725e-03 -9.5462694752e-04 -1.8819575386e-05 N 1.1694953426e-03 -9.5447618559e-04 -1.8958495290e-05 N 1.1695033766e-03 -9.5439875214e-04 -1.9080990805e-05 N 1.1695259814e-03 -9.5439481729e-04 -1.9114278733e-05 N 1.1696556465e-03 -9.5438753684e-04 -1.9161319258e-05 N 1.1697778061e-03 -9.5433064491e-04 -1.9241675056e-05 N 1.1697003935e-03 -9.5435647901e-04 -1.9278300765e-05 N 1.1698394016e-03 -9.5443084133e-04 -1.9286508535e-05 N 1.1699608748e-03 -9.5437397184e-04 -1.9363461489e-05 N 1.1699721471e-03 -9.5426478768e-04 -1.9406258186e-05 N 1.1700002710e-03 -9.5426043260e-04 -1.9440790348e-05 N 1.1701309280e-03 -9.5430994750e-04 -1.9498073148e-05 N 1.1701544649e-03 -9.5426703509e-04 -1.9462785174e-05 N 1.1701818928e-03 -9.5426267511e-04 -1.9493931408e-05 N 1.1704171424e-03 -9.5435002063e-04 -1.9614319429e-05 N 1.1703368774e-03 -9.5434801758e-04 -1.9628382527e-05 N 1.1705746158e-03 -9.5439731835e-04 -1.9688078076e-05 N 1.1707100767e-03 -9.5427597942e-04 -1.9545132229e-05 N 1.1706389644e-03 -9.5438034903e-04 -1.9539546033e-05 N 1.1706688404e-03 -9.5436370082e-04 -1.9517936401e-05 N 1.1707866355e-03 -9.5428120861e-04 -1.9568842774e-05 N 1.1708131292e-03 -9.5427996593e-04 -1.9584246543e-05 N 1.1708327098e-03 -9.5435072737e-04 -1.9722023882e-05 N 1.1708657604e-03 -9.5449288880e-04 -1.9777282862e-05 N 1.1709023411e-03 -9.5462379309e-04 -1.9785451063e-05 N 1.1712475154e-03 -9.5455749816e-04 -1.9740451594e-05 N 1.1712729243e-03 -9.5455523966e-04 -1.9750185526e-05 N 1.1712026054e-03 -9.5462158814e-04 -1.9676085219e-05 N 1.1713511515e-03 -9.5474404633e-04 -1.9635067409e-05 N 1.1714751457e-03 -9.5471239117e-04 -1.9634552473e-05 N 1.1714092521e-03 -9.5484281821e-04 -1.9637057695e-05 N 1.1717480251e-03 -9.5490328743e-04 -1.9733554855e-05 N 1.1716825914e-03 -9.5503681132e-04 -1.9727097577e-05 N 1.1715798334e-03 -9.5494901753e-04 -1.9835894124e-05 N 1.1717205543e-03 -9.5504973387e-04 -1.9834980472e-05 N 1.1718438575e-03 -9.5499652969e-04 -1.9883724040e-05 N 1.1718669465e-03 -9.5499435064e-04 -1.9882168124e-05 N 1.1719897942e-03 -9.5494116479e-04 -1.9928639938e-05 N 1.1720048643e-03 -9.5498628480e-04 -2.0035914784e-05 N 1.1719378220e-03 -9.5511979134e-04 -2.0021600563e-05 N 1.1719435277e-03 -9.5506167689e-04 -2.0136224961e-05 N 1.1718662271e-03 -9.5504242132e-04 -2.0097699575e-05 N 1.1720944170e-03 -9.5495898447e-04 -2.0140688613e-05 N 1.1721168082e-03 -9.5496000288e-04 -2.0124536601e-05 N 1.1721451863e-03 -9.5495786432e-04 -2.0123095293e-05 N 1.1722662174e-03 -9.5490475455e-04 -2.0160498936e-05 N 1.1723062150e-03 -9.5489791699e-04 -1.9949434018e-05 N 1.1723438546e-03 -9.5500008999e-04 -1.9928266040e-05 N 1.1724705635e-03 -9.5496879373e-04 -1.9915325016e-05 N 1.1725224864e-03 -9.5497948122e-04 -1.9669749184e-05 N 1.1725606322e-03 -9.5496856165e-04 -1.9460853549e-05 N 1.1725901611e-03 -9.5492832497e-04 -1.9393096826e-05 N 1.1725094503e-03 -9.5483483253e-04 -1.9291495137e-05 N 1.1726548821e-03 -9.5491944704e-04 -1.9163646932e-05 N 1.1725836401e-03 -9.5493028569e-04 -1.9043459254e-05 N 1.1726023208e-03 -9.5478470476e-04 -1.8987529828e-05 N 1.1724240773e-03 -9.5480320416e-04 -1.8843897590e-05 N 1.1725551157e-03 -9.5469544744e-04 -1.8779133544e-05 N 1.1725810893e-03 -9.5469642557e-04 -1.8755197645e-05 N 1.1725013453e-03 -9.5465972156e-04 -1.8663937286e-05 N 1.1725268505e-03 -9.5466070927e-04 -1.8637753122e-05 N 1.1727506789e-03 -9.5457647310e-04 -1.8659062409e-05 N 1.1728758693e-03 -9.5452535715e-04 -1.8679594224e-05 N 1.1729025426e-03 -9.5448515700e-04 -1.8598308697e-05 N 1.1729244555e-03 -9.5449953909e-04 -1.8606844837e-05 N 1.1731581557e-03 -9.5442739232e-04 -1.8605867292e-05 N 1.1732824357e-03 -9.5437629023e-04 -1.8621844457e-05 N 1.1734064899e-03 -9.5432519366e-04 -1.8636681549e-05 N 1.1734320628e-03 -9.5428400019e-04 -1.8549718960e-05 N 1.1736531063e-03 -9.5419516435e-04 -1.8650485605e-05 N 1.1737990205e-03 -9.5422181449e-04 -1.8494228067e-05 N 1.1739222292e-03 -9.5416971981e-04 -1.8504489477e-05 N 1.1740352908e-03 -9.5398958922e-04 -1.8510832451e-05 N 1.1741273831e-03 -9.5380912571e-04 -1.8727731469e-05 N 1.1742507572e-03 -9.5376120522e-04 -1.8727883385e-05 N 1.1742639429e-03 -9.5372745760e-04 -1.8833657805e-05 N 1.1743859807e-03 -9.5365272344e-04 -1.8819101554e-05 N 1.1742841385e-03 -9.5348010238e-04 -1.8866207606e-05 N 1.1744120730e-03 -9.5344984153e-04 -1.8821561848e-05 N 1.1745172645e-03 -9.5334291334e-04 -1.8943479935e-05 N 1.1744389689e-03 -9.5334912164e-04 -1.8882685936e-05 N 1.1745374722e-03 -9.5305440681e-04 -1.8915302262e-05 N 1.1745581044e-03 -9.5300429731e-04 -1.8907820318e-05 N 1.1747859397e-03 -9.5292605885e-04 -1.8899652478e-05 N 1.1748132143e-03 -9.5292556953e-04 -1.8855394302e-05 N 1.1748439116e-03 -9.5298392801e-04 -1.8821444241e-05 N 1.1749681559e-03 -9.5299604429e-04 -1.8819414417e-05 N 1.1749723880e-03 -9.5291785603e-04 -1.8939468828e-05 N 1.1750998839e-03 -9.5286827737e-04 -1.8932803384e-05 N 1.1752297488e-03 -9.5278255017e-04 -1.8784681372e-05 N 1.1752476595e-03 -9.5289645994e-04 -1.8908855578e-05 N 1.1752670853e-03 -9.5285051242e-04 -1.8884498571e-05 N 1.1752863931e-03 -9.5289844345e-04 -1.8935563266e-05 N 1.1752964650e-03 -9.5284515203e-04 -1.8995178089e-05 N 1.1751918435e-03 -9.5286554447e-04 -1.9169644919e-05 N 1.1751997355e-03 -9.5285351174e-04 -1.9278713045e-05 N 1.1751189856e-03 -9.5292996360e-04 -1.9332548965e-05 N 1.1750430159e-03 -9.5291058101e-04 -1.9167435398e-05 N 1.1751594731e-03 -9.5294859726e-04 -1.9312223761e-05 N 1.1751772634e-03 -9.5299658985e-04 -1.9355408159e-05 N 1.1753003540e-03 -9.5298830271e-04 -1.9386828718e-05 N 1.1754179177e-03 -9.5298510726e-04 -1.9476503027e-05 N 1.1755396646e-03 -9.5295000167e-04 -1.9493210984e-05 N 1.1755728097e-03 -9.5307447065e-04 -1.9512126860e-05 N 1.1756951243e-03 -9.5316113110e-04 -1.9615546239e-05 N 1.1758223179e-03 -9.5305287803e-04 -1.9505311934e-05 N 1.1759530751e-03 -9.5312215032e-04 -1.9501060072e-05 N 1.1759684442e-03 -9.5318859441e-04 -1.9642931599e-05 N 1.1760755678e-03 -9.5308319857e-04 -1.9734310212e-05 N 1.1763031950e-03 -9.5304448265e-04 -1.9757192629e-05 N 1.1762185869e-03 -9.5316527342e-04 -1.9840254887e-05 N 1.1763241910e-03 -9.5305681184e-04 -1.9934931346e-05 N 1.1764468284e-03 -9.5312267759e-04 -2.0078562776e-05 N 1.1764570978e-03 -9.5310786872e-04 -2.0101161810e-05 N 1.1764628970e-03 -9.5302769022e-04 -2.0199809909e-05 N 1.1766999294e-03 -9.5309752474e-04 -2.0192719587e-05 N 1.1768110429e-03 -9.5305490414e-04 -2.0354898444e-05 N 1.1769235461e-03 -9.5306840487e-04 -2.0458891401e-05 N 1.1769541348e-03 -9.5312580862e-04 -2.0396680516e-05 N 1.1769749814e-03 -9.5324397551e-04 -2.0483706390e-05 N 1.1770133290e-03 -9.5344698813e-04 -2.0454516161e-05 N 1.1770115416e-03 -9.5336881472e-04 -2.0611357153e-05 N 1.1771524183e-03 -9.5355361296e-04 -2.0627531533e-05 N 1.1772661246e-03 -9.5353010288e-04 -2.0666307744e-05 N 1.1772859850e-03 -9.5364727601e-04 -2.0747658905e-05 N 1.1773124400e-03 -9.5371912938e-04 -2.0716794539e-05 N 1.1774394410e-03 -9.5392856795e-04 -2.0886480482e-05 N 1.1774684208e-03 -9.5412741383e-04 -2.0928888103e-05 N 1.1773706349e-03 -9.5418782481e-04 -2.1128278112e-05 N 1.1773925089e-03 -9.5415232312e-04 -2.1043189830e-05 N 1.1774276178e-03 -9.5430585769e-04 -2.0971125629e-05 N 1.1775454480e-03 -9.5434391358e-04 -2.1080692729e-05 N 1.1775799385e-03 -9.5442625471e-04 -2.0948949426e-05 N 1.1774952329e-03 -9.5458383062e-04 -2.1073619019e-05 N 1.1776397032e-03 -9.5478942125e-04 -2.1029130736e-05 N 1.1777566215e-03 -9.5482854119e-04 -2.1134159181e-05 N 1.1777983758e-03 -9.5505758361e-04 -2.1033161127e-05 N 1.1779353894e-03 -9.5516436919e-04 -2.1063423851e-05 N 1.1781896499e-03 -9.5528369274e-04 -2.0924915577e-05 N 1.1783057163e-03 -9.5532285376e-04 -2.1025370142e-05 N 1.1782491683e-03 -9.5558603415e-04 -2.0913931091e-05 N 1.1783812198e-03 -9.5561197713e-04 -2.0827163565e-05 N 1.1784966459e-03 -9.5565118139e-04 -2.0924201996e-05 N 1.1785370895e-03 -9.5580519977e-04 -2.0839717651e-05 N 1.1786520940e-03 -9.5584443225e-04 -2.0934476973e-05 N 1.1786754332e-03 -9.5586718197e-04 -2.0917835779e-05 N 1.1786157961e-03 -9.5612416733e-04 -2.0813050329e-05 N 1.1788393591e-03 -9.5616586322e-04 -2.0904861947e-05 N 1.1787695689e-03 -9.5631643820e-04 -2.0814235584e-05 N 1.1787850243e-03 -9.5631537330e-04 -2.0846784907e-05 N 1.1790046484e-03 -9.5639217970e-04 -2.1000281168e-05 N 1.1790259948e-03 -9.5648410001e-04 -2.1040974553e-05 N 1.1790664157e-03 -9.5669080367e-04 -2.0971112462e-05 N 1.1790835411e-03 -9.5667532375e-04 -2.0959856517e-05 N 1.1791198191e-03 -9.5682314835e-04 -2.0876325113e-05 N 1.1793408212e-03 -9.5683708649e-04 -2.0946536486e-05 N 1.1791642831e-03 -9.5706590537e-04 -2.0958935876e-05 N 1.1792839568e-03 -9.5710233407e-04 -2.1047944494e-05 N 1.1794221024e-03 -9.5728247365e-04 -2.0963643658e-05 N 1.1794486268e-03 -9.5743848257e-04 -2.1068416578e-05 N 1.1794619346e-03 -9.5748496852e-04 -2.1126777739e-05 N 1.1795857715e-03 -9.5749255297e-04 -2.1132677847e-05 N 1.1796065804e-03 -9.5758972364e-04 -2.1147472907e-05 N 1.1796190714e-03 -9.5758874534e-04 -2.1164171917e-05 N 1.1797535560e-03 -9.5766046790e-04 -2.1098512520e-05 N 1.1797704053e-03 -9.5779378722e-04 -2.1175043656e-05 N 1.1799896438e-03 -9.5777992451e-04 -2.1295399757e-05 N 1.1799256974e-03 -9.5796157612e-04 -2.1191392425e-05 N 1.1800545605e-03 -9.5810970218e-04 -2.1237981725e-05 N 1.1802767668e-03 -9.5794512111e-04 -2.1187394663e-05 N 1.1804951151e-03 -9.5793231002e-04 -2.1303165105e-05 N 1.1806183352e-03 -9.5789868989e-04 -2.1245951511e-05 N 1.1807510818e-03 -9.5797048982e-04 -2.1171136780e-05 N 1.1807762284e-03 -9.5808514946e-04 -2.1208312044e-05 N 1.1808042606e-03 -9.5812575824e-04 -2.1052393317e-05 N 1.1808433541e-03 -9.5827046895e-04 -2.0954041986e-05 N 1.1807635713e-03 -9.5835391299e-04 -2.0909014008e-05 N 1.1811040916e-03 -9.5837251480e-04 -2.0883732181e-05 N 1.1812433149e-03 -9.5849607834e-04 -2.0760767328e-05 N 1.1811869536e-03 -9.5871499513e-04 -2.0562611083e-05 N 1.1811038404e-03 -9.5881289827e-04 -2.0552343468e-05 N 1.1810211819e-03 -9.5889118456e-04 -2.0515124716e-05 N 1.1810701572e-03 -9.5914751140e-04 -2.0378941808e-05 N 1.1809863963e-03 -9.5924542667e-04 -2.0365311380e-05 N 1.1810349225e-03 -9.5950175716e-04 -2.0226865049e-05 N 1.1810557278e-03 -9.5944806055e-04 -2.0123268905e-05 N 1.1810770431e-03 -9.5953690227e-04 -2.0133328462e-05 N 1.1811099627e-03 -9.5962839525e-04 -1.9921382702e-05 N 1.1810424778e-03 -9.5987674287e-04 -1.9932951440e-05 N 1.1810791748e-03 -9.6000081886e-04 -1.9792899455e-05 N 1.1809953390e-03 -9.6005748107e-04 -1.9719713132e-05 N 1.1810422860e-03 -9.6031384949e-04 -1.9573338128e-05 N 1.1811790198e-03 -9.6040918954e-04 -1.9497190141e-05 N 1.1812373227e-03 -9.6054581775e-04 -1.9113892258e-05 N 1.1812569649e-03 -9.6063369237e-04 -1.9114885385e-05 N 1.1813937400e-03 -9.6070839410e-04 -1.9009464685e-05 N 1.1814145803e-03 -9.6080352827e-04 -1.8994769002e-05 N 1.1813298897e-03 -9.6083172480e-04 -1.8976437818e-05 N 1.1814706486e-03 -9.6099323835e-04 -1.8891409123e-05 N 1.1814862092e-03 -9.6100160446e-04 -1.8849509021e-05 N 1.1816059677e-03 -9.6104114081e-04 -1.8885120425e-05 N 1.1818388817e-03 -9.6107366515e-04 -1.8866944572e-05 N 1.1820753129e-03 -9.6105145787e-04 -1.8756654342e-05 N 1.1819942138e-03 -9.6121499811e-04 -1.8793618836e-05 N 1.1822146856e-03 -9.6120409494e-04 -1.8866015726e-05 N 1.1823378924e-03 -9.6116725568e-04 -1.8779084893e-05 N 1.1823580608e-03 -9.6121316084e-04 -1.8789920979e-05 N 1.1824666665e-03 -9.6114735286e-04 -1.8834018556e-05 N 1.1824874860e-03 -9.6121909222e-04 -1.8854985688e-05 N 1.1828104373e-03 -9.6109781962e-04 -1.8885460059e-05 N 1.1827306705e-03 -9.6117873107e-04 -1.8811129318e-05 N 1.1829400204e-03 -9.6106247530e-04 -1.8891981668e-05 N 1.1830651148e-03 -9.6114571040e-04 -1.8961124716e-05 N 1.1831812078e-03 -9.6115854413e-04 -1.8969453225e-05 N 1.1830992333e-03 -9.6128080432e-04 -1.8942293321e-05 N 1.1832251589e-03 -9.6132168786e-04 -1.8956311555e-05 N 1.1832178138e-03 -9.6122698826e-04 -1.9119048456e-05 N 1.1832259167e-03 -9.6117570402e-04 -1.9045322228e-05 N 1.1833512341e-03 -9.6121659743e-04 -1.9055921841e-05 N 1.1832531591e-03 -9.6128305204e-04 -1.9144043549e-05 N 1.1832704663e-03 -9.6132899435e-04 -1.9138999727e-05 N 1.1833934336e-03 -9.6136471920e-04 -1.9159632346e-05 N 1.1834187476e-03 -9.6155640238e-04 -1.9187483544e-05 N 1.1834521424e-03 -9.6178014857e-04 -1.9147037507e-05 N 1.1835748338e-03 -9.6186342468e-04 -1.9202499414e-05 N 1.1836877128e-03 -9.6184024613e-04 -1.9273318467e-05 N 1.1837104818e-03 -9.6202679483e-04 -1.9310071984e-05 N 1.1837198871e-03 -9.6203958546e-04 -1.9439407683e-05 N 1.1837499321e-03 -9.6227783574e-04 -1.9432560451e-05 N 1.1837581924e-03 -9.6243442033e-04 -1.9599234603e-05 N 1.1837670306e-03 -9.6244719339e-04 -1.9725176037e-05 N 1.1837718289e-03 -9.6252421261e-04 -1.9852376841e-05 N 1.1837562020e-03 -9.6247823516e-04 -2.0101420447e-05 N 1.1838840282e-03 -9.6257791347e-04 -2.0181457551e-05 N 1.1839814546e-03 -9.6245866092e-04 -2.0311283611e-05 N 1.1837653078e-03 -9.6246918708e-04 -2.0498038176e-05 N 1.1839633518e-03 -9.6232005204e-04 -2.0692606858e-05 N 1.1840741385e-03 -9.6222979569e-04 -2.0685683535e-05 N 1.1842856475e-03 -9.6211067208e-04 -2.0744621465e-05 N 1.1842981168e-03 -9.6207279021e-04 -2.0755943169e-05 N 1.1843884280e-03 -9.6190813272e-04 -2.0906841884e-05 N 1.1845647534e-03 -9.6147479131e-04 -2.1078087832e-05 N 1.1846764995e-03 -9.6138217086e-04 -2.1140589004e-05 N 1.1848803760e-03 -9.6112148555e-04 -2.1145177038e-05 N 1.1849801055e-03 -9.6092588828e-04 -2.1146784122e-05 N 1.1850918968e-03 -9.6081259195e-04 -2.1180008716e-05 N 1.1853773470e-03 -9.6047548573e-04 -2.1421766174e-05 N 1.1853910905e-03 -9.6040349696e-04 -2.1358871605e-05 N 1.1856975447e-03 -9.6014807402e-04 -2.1423629601e-05 N 1.1856649682e-03 -9.5983419874e-04 -2.1670648488e-05 N 1.1858674677e-03 -9.5957360730e-04 -2.1667190302e-05 N 1.1858668375e-03 -9.5940446705e-04 -2.1669012153e-05 N 1.1859600141e-03 -9.5913404549e-04 -2.1752129009e-05 N 1.1860565501e-03 -9.5899078283e-04 -2.1909553271e-05 N 1.1860512188e-03 -9.5889815482e-04 -2.2024790953e-05 N 1.1862600544e-03 -9.5875859039e-04 -2.2038352884e-05 N 1.1863524759e-03 -9.5848818666e-04 -2.2116909417e-05 N 1.1866714188e-03 -9.5825190943e-04 -2.2126481170e-05 N 1.1866655251e-03 -9.5809108080e-04 -2.2173077895e-05 N 1.1867821890e-03 -9.5802950021e-04 -2.2148941329e-05 N 1.1868894984e-03 -9.5790900889e-04 -2.2178446427e-05 N 1.1869813811e-03 -9.5768618327e-04 -2.2289538783e-05 N 1.1870921131e-03 -9.5755845944e-04 -2.2264048738e-05 N 1.1872149501e-03 -9.5756927362e-04 -2.2219821493e-05 N 1.1873306814e-03 -9.5750670299e-04 -2.2189954426e-05 N 1.1874322007e-03 -9.5730044116e-04 -2.2189993349e-05 N 1.1874321693e-03 -9.5720303766e-04 -2.2300568569e-05 N 1.1874456480e-03 -9.5719013295e-04 -2.2226302805e-05 N 1.1875478956e-03 -9.5712659149e-04 -2.2337660428e-05 N 1.1874715779e-03 -9.5724628725e-04 -2.2252901517e-05 N 1.1875793707e-03 -9.5722825505e-04 -2.2334061043e-05 N 1.1876043828e-03 -9.5729726968e-04 -2.2287985786e-05 N 1.1877242260e-03 -9.5734954893e-04 -2.2285171005e-05 N 1.1876385032e-03 -9.5739068495e-04 -2.2224863948e-05 N 1.1876466451e-03 -9.5739769430e-04 -2.2309808450e-05 N 1.1876782006e-03 -9.5758766604e-04 -2.2281927477e-05 N 1.1877982919e-03 -9.5766688323e-04 -2.2286954649e-05 N 1.1878170394e-03 -9.5778658166e-04 -2.2338494123e-05 N 1.1877463820e-03 -9.5802521048e-04 -2.2266284085e-05 N 1.1878734962e-03 -9.5809934635e-04 -2.2276847421e-05 N 1.1880051887e-03 -9.5824891504e-04 -2.2195606398e-05 N 1.1880038861e-03 -9.5822495186e-04 -2.2339822900e-05 N 1.1879103527e-03 -9.5828890760e-04 -2.2361383280e-05 N 1.1880404028e-03 -9.5842302860e-04 -2.2378733401e-05 N 1.1880686449e-03 -9.5853858266e-04 -2.2289986385e-05 N 1.1880837297e-03 -9.5867178283e-04 -2.2371721742e-05 N 1.1880895123e-03 -9.5867987661e-04 -2.2443074567e-05 N 1.1880945440e-03 -9.5870866802e-04 -2.2539137700e-05 N 1.1882076344e-03 -9.5871152899e-04 -2.2621123415e-05 N 1.1882209956e-03 -9.5868237751e-04 -2.2557775128e-05 N 1.1883475888e-03 -9.5876275804e-04 -2.2542333430e-05 N 1.1882535055e-03 -9.5879667600e-04 -2.2616473689e-05 N 1.1882491783e-03 -9.5867763921e-04 -2.2671763431e-05 N 1.1884608241e-03 -9.5864632907e-04 -2.2828157765e-05 N 1.1885866506e-03 -9.5872673166e-04 -2.2808144481e-05 N 1.1887220435e-03 -9.5877503171e-04 -2.2642224258e-05 N 1.1889331337e-03 -9.5874374351e-04 -2.2795155482e-05 N 1.1890327076e-03 -9.5865673580e-04 -2.2922737098e-05 N 1.1890540629e-03 -9.5867599347e-04 -2.2882890256e-05 N 1.1891789830e-03 -9.5875541237e-04 -2.2857131338e-05 N 1.1893132311e-03 -9.5894133995e-04 -2.2813641460e-05 N 1.1895293237e-03 -9.5881902679e-04 -2.2804717719e-05 N 1.1894412537e-03 -9.5888289747e-04 -2.2799168376e-05 N 1.1895567847e-03 -9.5888482818e-04 -2.2797832732e-05 N 1.1895988230e-03 -9.5901153103e-04 -2.2588754356e-05 N 1.1895953317e-03 -9.5891711468e-04 -2.2716794115e-05 N 1.1896208345e-03 -9.5896980064e-04 -2.2525490074e-05 N 1.1895354341e-03 -9.5895812832e-04 -2.2397509970e-05 N 1.1895611855e-03 -9.5900215467e-04 -2.2292520022e-05 N 1.1896612191e-03 -9.5887907900e-04 -2.2341279787e-05 N 1.1896870956e-03 -9.5890241530e-04 -2.2208175952e-05 N 1.1896094048e-03 -9.5903761637e-04 -2.2110763325e-05 N 1.1896486813e-03 -9.5913741851e-04 -2.1880213606e-05 N 1.1896659825e-03 -9.5899216078e-04 -2.1682787748e-05 N 1.1898943866e-03 -9.5904163308e-04 -2.1640247028e-05 N 1.1898942841e-03 -9.5894513936e-04 -2.1690781509e-05 N 1.1898192961e-03 -9.5900274787e-04 -2.1470902479e-05 N 1.1898273516e-03 -9.5905313416e-04 -2.1554246758e-05 N 1.1898494722e-03 -9.5909099893e-04 -2.1451356145e-05 N 1.1900798123e-03 -9.5911615161e-04 -2.1452347459e-05 N 1.1900873789e-03 -9.5916552894e-04 -2.1532266781e-05 N 1.1900994512e-03 -9.5923453496e-04 -2.1570720664e-05 N 1.1902178428e-03 -9.5920403213e-04 -2.1544250442e-05 N 1.1902263749e-03 -9.5919133981e-04 -2.1543245650e-05 N 1.1904410184e-03 -9.5918145080e-04 -2.1685357565e-05 N 1.1903644756e-03 -9.5925087208e-04 -2.1569714695e-05 N 1.1904774349e-03 -9.5927010270e-04 -2.1643087981e-05 N 1.1904847122e-03 -9.5927814955e-04 -2.1663378253e-05 N 1.1905987123e-03 -9.5916699373e-04 -2.1592878899e-05 N 1.1908118686e-03 -9.5910953342e-04 -2.1691011512e-05 N 1.1908167290e-03 -9.5900613582e-04 -2.1733435854e-05 N 1.1909239436e-03 -9.5893852591e-04 -2.1777367310e-05 N 1.1909222337e-03 -9.5884838941e-04 -2.1795162473e-05 N 1.1910404305e-03 -9.5876643233e-04 -2.1792994126e-05 N 1.1911687102e-03 -9.5880525697e-04 -2.1671027286e-05 N 1.1913707329e-03 -9.5866307280e-04 -2.1804726615e-05 N 1.1913792531e-03 -9.5864758383e-04 -2.1864055626e-05 N 1.1914942510e-03 -9.5856858084e-04 -2.1782183048e-05 N 1.1914000602e-03 -9.5862365770e-04 -2.1824555933e-05 N 1.1915146022e-03 -9.5857688937e-04 -2.1880651543e-05 N 1.1916395895e-03 -9.5863133401e-04 -2.1791115939e-05 N 1.1917513113e-03 -9.5861875535e-04 -2.1910034706e-05 N 1.1916637495e-03 -9.5872552263e-04 -2.1906471032e-05 N 1.1917541687e-03 -9.5862304689e-04 -2.2083589000e-05 N 1.1918872873e-03 -9.5869718708e-04 -2.2010767453e-05 N 1.1918910358e-03 -9.5866932911e-04 -2.2086775160e-05 N 1.1918966394e-03 -9.5862695873e-04 -2.2122360853e-05 N 1.1917925234e-03 -9.5867183334e-04 -2.2247669705e-05 N 1.1919055104e-03 -9.5862404084e-04 -2.2293477052e-05 N 1.1919013782e-03 -9.5861285130e-04 -2.2470439155e-05 N 1.1920108222e-03 -9.5855370716e-04 -2.2540876831e-05 N 1.1920145036e-03 -9.5848343245e-04 -2.2558397172e-05 N 1.1920125221e-03 -9.5850536679e-04 -2.2730891581e-05 N 1.1922169234e-03 -9.5830323636e-04 -2.2828080930e-05 N 1.1923443466e-03 -9.5831842317e-04 -2.2732515152e-05 N 1.1924518678e-03 -9.5823136839e-04 -2.2784834561e-05 N 1.1925624500e-03 -9.5822606596e-04 -2.2873175584e-05 N 1.1926717539e-03 -9.5819386749e-04 -2.2947985290e-05 N 1.1927820567e-03 -9.5818755549e-04 -2.3034022459e-05 N 1.1930046913e-03 -9.5810737455e-04 -2.3001082553e-05 N 1.1931134619e-03 -9.5807520542e-04 -2.3072447160e-05 N 1.1933399334e-03 -9.5803432764e-04 -2.3022671588e-05 N 1.1933420540e-03 -9.5794345636e-04 -2.3001819498e-05 N 1.1933514689e-03 -9.5793610363e-04 -2.3078643874e-05 N 1.1935672112e-03 -9.5789952327e-04 -2.3157810296e-05 N 1.1936623445e-03 -9.5783756484e-04 -2.3356900693e-05 N 1.1937720757e-03 -9.5775335604e-04 -2.3458267035e-05 N 1.1937800834e-03 -9.5773597133e-04 -2.3416143668e-05 N 1.1938087119e-03 -9.5780909955e-04 -2.3312371116e-05 N 1.1940240738e-03 -9.5775082344e-04 -2.3359930062e-05 N 1.1940099752e-03 -9.5760915797e-04 -2.3578922992e-05 N 1.1942260375e-03 -9.5757884362e-04 -2.3636571382e-05 N 1.1942412357e-03 -9.5762213049e-04 -2.3661695328e-05 N 1.1941588449e-03 -9.5773498201e-04 -2.3605031294e-05 N 1.1943719847e-03 -9.5773995499e-04 -2.3724359423e-05 N 1.1944980481e-03 -9.5783980568e-04 -2.3769694731e-05 N 1.1945125300e-03 -9.5788310229e-04 -2.3790264922e-05 N 1.1947374494e-03 -9.5793764718e-04 -2.3798488306e-05 N 1.1947315326e-03 -9.5790151338e-04 -2.3991707377e-05 N 1.1948547241e-03 -9.5794652209e-04 -2.4007681101e-05 N 1.1948779285e-03 -9.5809636776e-04 -2.4007023284e-05 N 1.1948846054e-03 -9.5806833089e-04 -2.4037516798e-05 N 1.1948852786e-03 -9.5808389626e-04 -2.4184753759e-05 N 1.1949068940e-03 -9.5820582500e-04 -2.4168297477e-05 N 1.1950218750e-03 -9.5820021092e-04 -2.4220010338e-05 N 1.1950157839e-03 -9.5794452678e-04 -2.4173836891e-05 N 1.1952381904e-03 -9.5793337275e-04 -2.4235479288e-05 N 1.1953526423e-03 -9.5792777355e-04 -2.4283751366e-05 N 1.1953637886e-03 -9.5794527849e-04 -2.4278292696e-05 N 1.1952794296e-03 -9.5797886718e-04 -2.4228006554e-05 N 1.1953827991e-03 -9.5783984298e-04 -2.4277156619e-05 N 1.1955269826e-03 -9.5804714576e-04 -2.4141602746e-05 N 1.1956378849e-03 -9.5800848223e-04 -2.4185233340e-05 N 1.1954988568e-03 -9.5768767841e-04 -2.4473315450e-05 N 1.1956215656e-03 -9.5778763586e-04 -2.4496894409e-05 N 1.1956379616e-03 -9.5772015939e-04 -2.4313933305e-05 N 1.1957738462e-03 -9.5776938655e-04 -2.4226220245e-05 N 1.1958911499e-03 -9.5778141167e-04 -2.4222671488e-05 N 1.1959006989e-03 -9.5785001247e-04 -2.4371892526e-05 N 1.1959113760e-03 -9.5787384109e-04 -2.4340470268e-05 N 1.1960545559e-03 -9.5802132778e-04 -2.4244915246e-05 N 1.1960550079e-03 -9.5804951537e-04 -2.4343634844e-05 N 1.1961841122e-03 -9.5814233230e-04 -2.4366920728e-05 N 1.1963002746e-03 -9.5815547023e-04 -2.4356511036e-05 N 1.1963278140e-03 -9.5834496025e-04 -2.4375594886e-05 N 1.1962356493e-03 -9.5846982518e-04 -2.4463291959e-05 N 1.1963633140e-03 -9.5860409584e-04 -2.4533665824e-05 N 1.1962912984e-03 -9.5885603005e-04 -2.4482334767e-05 N 1.1963180678e-03 -9.5904655636e-04 -2.4496883238e-05 N 1.1965382404e-03 -9.5902209556e-04 -2.4492768246e-05 N 1.1965457767e-03 -9.5909073976e-04 -2.4628332402e-05 N 1.1965581660e-03 -9.5924530581e-04 -2.4786415559e-05 N 1.1965849676e-03 -9.5939439988e-04 -2.4744732791e-05 N 1.1965901489e-03 -9.5947761217e-04 -2.4916183900e-05 N 1.1965936644e-03 -9.5946450031e-04 -2.5010072214e-05 N 1.1964993583e-03 -9.5950340125e-04 -2.5124426570e-05 N 1.1965148541e-03 -9.5952008693e-04 -2.5082548233e-05 N 1.1965193002e-03 -9.5951420837e-04 -2.5159590759e-05 N 1.1965126913e-03 -9.5939561639e-04 -2.5265670083e-05 N 1.1966177452e-03 -9.5931273893e-04 -2.5368078582e-05 N 1.1967346326e-03 -9.5927936171e-04 -2.5361655013e-05 N 1.1966288022e-03 -9.5918477527e-04 -2.5473575163e-05 N 1.1967355479e-03 -9.5906662875e-04 -2.5507428656e-05 N 1.1970436322e-03 -9.5883296226e-04 -2.5519185435e-05 N 1.1970622578e-03 -9.5885047248e-04 -2.5529814656e-05 N 1.1970472119e-03 -9.5859115901e-04 -2.5579533947e-05 N 1.1972519110e-03 -9.5834216371e-04 -2.5611648553e-05 N 1.1973599633e-03 -9.5818878274e-04 -2.5574637107e-05 N 1.1975784884e-03 -9.5795297139e-04 -2.5431608874e-05 N 1.1975902834e-03 -9.5774670683e-04 -2.5284803563e-05 N 1.1976890024e-03 -9.5744635921e-04 -2.5209420467e-05 N 1.1977951591e-03 -9.5726609332e-04 -2.5155453559e-05 N 1.1978008282e-03 -9.5701330565e-04 -2.5033240902e-05 N 1.1977978408e-03 -9.5670091884e-04 -2.4837015170e-05 N 1.1977965936e-03 -9.5635600926e-04 -2.4702362500e-05 N 1.1978903122e-03 -9.5601539356e-04 -2.4635821944e-05 N 1.1977885568e-03 -9.5579522351e-04 -2.4509576960e-05 N 1.1978026430e-03 -9.5564896582e-04 -2.4364974106e-05 N 1.1978980668e-03 -9.5536326874e-04 -2.4319770972e-05 N 1.1979133293e-03 -9.5522216983e-04 -2.4159420616e-05 N 1.1979395562e-03 -9.5517305682e-04 -2.3941905654e-05 N 1.1979555266e-03 -9.5505990693e-04 -2.3791664218e-05 N 1.1981822768e-03 -9.5493590894e-04 -2.3602344523e-05 N 1.1982033994e-03 -9.5497814583e-04 -2.3537495357e-05 N 1.1982084458e-03 -9.5482171738e-04 -2.3478079467e-05 N 1.1982431204e-03 -9.5487813279e-04 -2.3238119186e-05 N 1.1982410432e-03 -9.5475817643e-04 -2.3307774867e-05 N 1.1983621340e-03 -9.5474406154e-04 -2.3291671000e-05 N 1.1984830512e-03 -9.5472994890e-04 -2.3274417397e-05 N 1.1983856690e-03 -9.5469112567e-04 -2.3233521746e-05 N 1.1983813771e-03 -9.5456604941e-04 -2.3312109796e-05 N 1.1984896986e-03 -9.5452323620e-04 -2.3424977700e-05 N 1.1984199586e-03 -9.5469460068e-04 -2.3342572632e-05 N 1.1985383206e-03 -9.5469404843e-04 -2.3358891253e-05 N 1.1985548472e-03 -9.5481316655e-04 -2.3398318143e-05 N 1.1986592890e-03 -9.5477876577e-04 -2.3559370820e-05 N 1.1986896504e-03 -9.5489269274e-04 -2.3525655116e-05 N 1.1989262197e-03 -9.5497942604e-04 -2.3493072417e-05 N 1.1989523448e-03 -9.5514187674e-04 -2.3433671711e-05 N 1.1989815439e-03 -9.5529831484e-04 -2.3448197449e-05 N 1.1991098754e-03 -9.5538878783e-04 -2.3400420741e-05 N 1.1992218563e-03 -9.5541229812e-04 -2.3499625920e-05 N 1.1992499259e-03 -9.5550030457e-04 -2.3446694522e-05 N 1.1991557581e-03 -9.5550945487e-04 -2.3489750515e-05 N 1.1992898074e-03 -9.5569416807e-04 -2.3447561608e-05 N 1.1992925274e-03 -9.5567706959e-04 -2.3620139889e-05 N 1.1992054690e-03 -9.5580735324e-04 -2.3682341666e-05 N 1.1994173218e-03 -9.5577348761e-04 -2.3827843466e-05 N 1.1993316726e-03 -9.5588921828e-04 -2.3848480347e-05 N 1.1994670034e-03 -9.5604088288e-04 -2.3863256838e-05 N 1.1993793697e-03 -9.5617015887e-04 -2.3920916738e-05 N 1.1995999213e-03 -9.5624290827e-04 -2.4045046153e-05 N 1.1995255127e-03 -9.5638736779e-04 -2.3927583496e-05 N 1.1996563392e-03 -9.5647898961e-04 -2.3926509843e-05 N 1.1997684423e-03 -9.5646846799e-04 -2.4073518265e-05 N 1.1997957566e-03 -9.5656266959e-04 -2.3992300173e-05 N 1.1998160650e-03 -9.5671516603e-04 -2.4067133081e-05 N 1.1999489445e-03 -9.5683887702e-04 -2.4060348741e-05 N 1.1999689308e-03 -9.5699138769e-04 -2.4132896883e-05 N 1.1999598499e-03 -9.5688958098e-04 -2.4332153788e-05 N 1.2000805925e-03 -9.5696489115e-04 -2.4429682049e-05 N 1.2001004714e-03 -9.5696493468e-04 -2.4331461036e-05 N 7.5199705115e-04 2008-03-04T12:31:39.349737 48085 6001 0.000000 0.000000 2000-03-01T00:00:00.000000 1 1 3.4977750140e-01 -7.1371362400e-02 2 3.4977749200e-01 -7.1359536900e-02 3 3.4977748260e-01 -7.1347711200e-02 4 3.4977747330e-01 -7.1335885600e-02 5 3.4977746390e-01 -7.1324059900e-02 6 3.4977745450e-01 -7.1312234100e-02 7 3.4977744510e-01 -7.1300408400e-02 8 3.4977743570e-01 -7.1288582500e-02 9 3.4977742640e-01 -7.1276756700e-02 10 3.4977741700e-01 -7.1264930800e-02 11 3.4977740760e-01 -7.1253104900e-02 12 3.4977739820e-01 -7.1241279000e-02 13 3.4977738890e-01 -7.1229453000e-02 14 3.4977737950e-01 -7.1217627000e-02 15 3.4977737010e-01 -7.1205800900e-02 16 3.4977736070e-01 -7.1193974800e-02 17 3.4977735130e-01 -7.1182148700e-02 18 3.4977734200e-01 -7.1170322600e-02 19 3.4977733260e-01 -7.1158496400e-02 20 3.4977732320e-01 -7.1146670200e-02 21 3.4977731380e-01 -7.1134843900e-02 22 3.4977730450e-01 -7.1123017600e-02 23 3.4977729510e-01 -7.1111191300e-02 24 3.4977728570e-01 -7.1099364900e-02 25 3.4977727630e-01 -7.1087538500e-02 26 3.4977726690e-01 -7.1075712100e-02 27 3.4977725760e-01 -7.1063885600e-02 28 3.4977724820e-01 -7.1052059100e-02 29 3.4977723880e-01 -7.1040232500e-02 30 3.4977722940e-01 -7.1028406000e-02 31 3.4977722010e-01 -7.1016579400e-02 32 3.4977721070e-01 -7.1004752700e-02 33 3.4977720130e-01 -7.0992926000e-02 34 3.4977719190e-01 -7.0981099300e-02 35 3.4977718250e-01 -7.0969272600e-02 36 3.4977717320e-01 -7.0957445800e-02 37 3.4977716380e-01 -7.0945619000e-02 38 3.4977715440e-01 -7.0933792100e-02 39 3.4977714500e-01 -7.0921965200e-02 40 3.4977713570e-01 -7.0910138300e-02 41 3.4977712630e-01 -7.0898311300e-02 42 3.4977711690e-01 -7.0886484300e-02 43 3.4977710750e-01 -7.0874657300e-02 44 3.4977709810e-01 -7.0862830200e-02 45 3.4977708880e-01 -7.0851003100e-02 46 3.4977707940e-01 -7.0839176000e-02 47 3.4977707000e-01 -7.0827348800e-02 48 3.4977706060e-01 -7.0815521600e-02 49 3.4977705130e-01 -7.0803694400e-02 50 3.4977704190e-01 -7.0791867100e-02 51 3.4977703250e-01 -7.0780039800e-02 52 3.4977702310e-01 -7.0768212500e-02 53 3.4977701380e-01 -7.0756385100e-02 54 3.4977700440e-01 -7.0744557700e-02 55 3.4977699500e-01 -7.0732730200e-02 56 3.4977698560e-01 -7.0720902800e-02 57 3.4977697630e-01 -7.0709075200e-02 58 3.4977696690e-01 -7.0697247700e-02 59 3.4977695750e-01 -7.0685420100e-02 60 3.4977694810e-01 -7.0673592500e-02 61 3.4977693870e-01 -7.0661764800e-02 62 3.4977692940e-01 -7.0649937100e-02 63 3.4977692000e-01 -7.0638109400e-02 64 3.4977691060e-01 -7.0626281600e-02 65 3.4977690120e-01 -7.0614453800e-02 66 3.4977689190e-01 -7.0602626000e-02 67 3.4977688250e-01 -7.0590798100e-02 68 3.4977687310e-01 -7.0578970200e-02 69 3.4977686370e-01 -7.0567142300e-02 70 3.4977685440e-01 -7.0555314300e-02 71 3.4977684500e-01 -7.0543486300e-02 72 3.4977683560e-01 -7.0531658300e-02 73 3.4977682620e-01 -7.0519830200e-02 74 3.4977681690e-01 -7.0508002100e-02 75 3.4977680750e-01 -7.0496174000e-02 76 3.4977679810e-01 -7.0484345800e-02 77 3.4977678870e-01 -7.0472517600e-02 78 3.4977677940e-01 -7.0460689300e-02 79 3.4977677000e-01 -7.0448861000e-02 80 3.4977676060e-01 -7.0437032700e-02 81 3.4977675120e-01 -7.0425204400e-02 82 3.4977674180e-01 -7.0413376000e-02 83 3.4977673250e-01 -7.0401547600e-02 84 3.4977672310e-01 -7.0389719100e-02 85 3.4977671370e-01 -7.0377890600e-02 86 3.4977670430e-01 -7.0366062100e-02 87 3.4977669500e-01 -7.0354233500e-02 88 3.4977668560e-01 -7.0342404900e-02 89 3.4977667620e-01 -7.0330576300e-02 90 3.4977666680e-01 -7.0318747600e-02 91 3.4977665750e-01 -7.0306918900e-02 92 3.4977664810e-01 -7.0295090200e-02 93 3.4977663870e-01 -7.0283261400e-02 94 3.4977662930e-01 -7.0271432600e-02 95 3.4977662000e-01 -7.0259603800e-02 96 3.4977661060e-01 -7.0247774900e-02 97 3.4977660120e-01 -7.0235946000e-02 98 3.4977659180e-01 -7.0224117100e-02 99 3.4977658250e-01 -7.0212288100e-02 100 3.4977657310e-01 -7.0200459100e-02 101 3.4977656370e-01 -7.0188630000e-02 102 3.4977655430e-01 -7.0176801000e-02 103 3.4977654500e-01 -7.0164971800e-02 104 3.4977653560e-01 -7.0153142700e-02 105 3.4977652620e-01 -7.0141313500e-02 106 3.4977651680e-01 -7.0129484300e-02 107 3.4977650750e-01 -7.0117655000e-02 108 3.4977649810e-01 -7.0105825700e-02 109 3.4977648870e-01 -7.0093996400e-02 110 3.4977647930e-01 -7.0082167100e-02 111 3.4977647000e-01 -7.0070337700e-02 112 3.4977646060e-01 -7.0058508200e-02 113 3.4977645120e-01 -7.0046678800e-02 114 3.4977644180e-01 -7.0034849300e-02 115 3.4977643250e-01 -7.0023019800e-02 116 3.4977642310e-01 -7.0011190200e-02 117 3.4977641370e-01 -6.9999360600e-02 118 3.4977640430e-01 -6.9987531000e-02 119 3.4977639500e-01 -6.9975701300e-02 120 3.4977638560e-01 -6.9963871600e-02 121 3.4977637620e-01 -6.9952041800e-02 122 3.4977636680e-01 -6.9940212100e-02 123 3.4977635750e-01 -6.9928382300e-02 124 3.4977634810e-01 -6.9916552400e-02 125 3.4977633870e-01 -6.9904722600e-02 126 3.4977632930e-01 -6.9892892600e-02 127 3.4977632000e-01 -6.9881062700e-02 128 3.4977631060e-01 -6.9869232700e-02 129 3.4977630120e-01 -6.9857402700e-02 130 3.4977629190e-01 -6.9845572700e-02 131 3.4977628250e-01 -6.9833742600e-02 132 3.4977627310e-01 -6.9821912500e-02 133 3.4977626370e-01 -6.9810082300e-02 134 3.4977625440e-01 -6.9798252100e-02 135 3.4977624500e-01 -6.9786421900e-02 136 3.4977623560e-01 -6.9774591600e-02 137 3.4977622620e-01 -6.9762761400e-02 138 3.4977621690e-01 -6.9750931000e-02 139 3.4977620750e-01 -6.9739100700e-02 140 3.4977619810e-01 -6.9727270300e-02 141 3.4977618870e-01 -6.9715439900e-02 142 3.4977617940e-01 -6.9703609400e-02 143 3.4977617000e-01 -6.9691778900e-02 144 3.4977616060e-01 -6.9679948400e-02 145 3.4977615120e-01 -6.9668117800e-02 146 3.4977614190e-01 -6.9656287200e-02 147 3.4977613250e-01 -6.9644456600e-02 148 3.4977612310e-01 -6.9632625900e-02 149 3.4977611370e-01 -6.9620795200e-02 150 3.4977610440e-01 -6.9608964500e-02 151 3.4977609500e-01 -6.9597133700e-02 152 3.4977608560e-01 -6.9585302900e-02 153 3.4977607630e-01 -6.9573472000e-02 154 3.4977606690e-01 -6.9561641200e-02 155 3.4977605750e-01 -6.9549810300e-02 156 3.4977604810e-01 -6.9537979300e-02 157 3.4977603880e-01 -6.9526148300e-02 158 3.4977602940e-01 -6.9514317300e-02 159 3.4977602000e-01 -6.9502486300e-02 160 3.4977601060e-01 -6.9490655200e-02 161 3.4977600130e-01 -6.9478824100e-02 162 3.4977599190e-01 -6.9466992900e-02 163 3.4977598250e-01 -6.9455161800e-02 164 3.4977597320e-01 -6.9443330500e-02 165 3.4977596380e-01 -6.9431499300e-02 166 3.4977595440e-01 -6.9419668000e-02 167 3.4977594500e-01 -6.9407836700e-02 168 3.4977593570e-01 -6.9396005300e-02 169 3.4977592630e-01 -6.9384173900e-02 170 3.4977591690e-01 -6.9372342500e-02 171 3.4977590750e-01 -6.9360511100e-02 172 3.4977589820e-01 -6.9348679600e-02 173 3.4977588880e-01 -6.9336848000e-02 174 3.4977587940e-01 -6.9325016500e-02 175 3.4977587010e-01 -6.9313184900e-02 176 3.4977586070e-01 -6.9301353300e-02 177 3.4977585130e-01 -6.9289521600e-02 178 3.4977584190e-01 -6.9277689900e-02 179 3.4977583260e-01 -6.9265858200e-02 180 3.4977582320e-01 -6.9254026400e-02 181 3.4977581380e-01 -6.9242194600e-02 182 3.4977580440e-01 -6.9230362800e-02 183 3.4977579510e-01 -6.9218530900e-02 184 3.4977578570e-01 -6.9206699000e-02 185 3.4977577630e-01 -6.9194867000e-02 186 3.4977576700e-01 -6.9183035100e-02 187 3.4977575760e-01 -6.9171203100e-02 188 3.4977574820e-01 -6.9159371000e-02 189 3.4977573880e-01 -6.9147539000e-02 190 3.4977572950e-01 -6.9135706800e-02 191 3.4977572010e-01 -6.9123874700e-02 192 3.4977571070e-01 -6.9112042500e-02 193 3.4977570130e-01 -6.9100210300e-02 194 3.4977569200e-01 -6.9088378100e-02 195 3.4977568260e-01 -6.9076545800e-02 196 3.4977567320e-01 -6.9064713500e-02 197 3.4977566390e-01 -6.9052881100e-02 198 3.4977565450e-01 -6.9041048800e-02 199 3.4977564510e-01 -6.9029216300e-02 200 3.4977563570e-01 -6.9017383900e-02 201 3.4977562640e-01 -6.9005551400e-02 202 3.4977561700e-01 -6.8993718900e-02 203 3.4977560760e-01 -6.8981886300e-02 204 3.4977559830e-01 -6.8970053700e-02 205 3.4977558890e-01 -6.8958221100e-02 206 3.4977557950e-01 -6.8946388500e-02 207 3.4977557010e-01 -6.8934555800e-02 208 3.4977556080e-01 -6.8922723100e-02 209 3.4977555140e-01 -6.8910890300e-02 210 3.4977554200e-01 -6.8899057500e-02 211 3.4977553270e-01 -6.8887224700e-02 212 3.4977552330e-01 -6.8875391800e-02 213 3.4977551390e-01 -6.8863558900e-02 214 3.4977550450e-01 -6.8851726000e-02 215 3.4977549520e-01 -6.8839893000e-02 216 3.4977548580e-01 -6.8828060000e-02 217 3.4977547640e-01 -6.8816227000e-02 218 3.4977546710e-01 -6.8804394000e-02 219 3.4977545770e-01 -6.8792560900e-02 220 3.4977544830e-01 -6.8780727700e-02 221 3.4977543890e-01 -6.8768894600e-02 222 3.4977542960e-01 -6.8757061400e-02 223 3.4977542020e-01 -6.8745228100e-02 224 3.4977541080e-01 -6.8733394900e-02 225 3.4977540150e-01 -6.8721561600e-02 226 3.4977539210e-01 -6.8709728200e-02 227 3.4977538270e-01 -6.8697894800e-02 228 3.4977537330e-01 -6.8686061400e-02 229 3.4977536400e-01 -6.8674228000e-02 230 3.4977535460e-01 -6.8662394500e-02 231 3.4977534520e-01 -6.8650561000e-02 232 3.4977533590e-01 -6.8638727500e-02 233 3.4977532650e-01 -6.8626893900e-02 234 3.4977531710e-01 -6.8615060300e-02 235 3.4977530780e-01 -6.8603226700e-02 236 3.4977529840e-01 -6.8591393000e-02 237 3.4977528900e-01 -6.8579559300e-02 238 3.4977527960e-01 -6.8567725500e-02 239 3.4977527030e-01 -6.8555891800e-02 240 3.4977526090e-01 -6.8544057900e-02 241 3.4977525150e-01 -6.8532224100e-02 242 3.4977524220e-01 -6.8520390200e-02 243 3.4977523280e-01 -6.8508556300e-02 244 3.4977522340e-01 -6.8496722400e-02 245 3.4977521400e-01 -6.8484888400e-02 246 3.4977520470e-01 -6.8473054400e-02 247 3.4977519530e-01 -6.8461220300e-02 248 3.4977518590e-01 -6.8449386200e-02 249 3.4977517660e-01 -6.8437552100e-02 250 3.4977516720e-01 -6.8425718000e-02 251 3.4977515780e-01 -6.8413883800e-02 252 3.4977514850e-01 -6.8402049600e-02 253 3.4977513910e-01 -6.8390215300e-02 254 3.4977512970e-01 -6.8378381000e-02 255 3.4977512030e-01 -6.8366546700e-02 256 3.4977511100e-01 -6.8354712300e-02 257 3.4977510160e-01 -6.8342878000e-02 258 3.4977509220e-01 -6.8331043500e-02 259 3.4977508290e-01 -6.8319209100e-02 260 3.4977507350e-01 -6.8307374600e-02 261 3.4977506410e-01 -6.8295540100e-02 262 3.4977505480e-01 -6.8283705500e-02 263 3.4977504540e-01 -6.8271870900e-02 264 3.4977503600e-01 -6.8260036300e-02 265 3.4977502670e-01 -6.8248201600e-02 266 3.4977501730e-01 -6.8236366900e-02 267 3.4977500790e-01 -6.8224532200e-02 268 3.4977499850e-01 -6.8212697400e-02 269 3.4977498920e-01 -6.8200862700e-02 270 3.4977497980e-01 -6.8189027800e-02 271 3.4977497040e-01 -6.8177193000e-02 272 3.4977496110e-01 -6.8165358100e-02 273 3.4977495170e-01 -6.8153523100e-02 274 3.4977494230e-01 -6.8141688200e-02 275 3.4977493300e-01 -6.8129853200e-02 276 3.4977492360e-01 -6.8118018100e-02 277 3.4977491420e-01 -6.8106183100e-02 278 3.4977490480e-01 -6.8094348000e-02 279 3.4977489550e-01 -6.8082512900e-02 280 3.4977488610e-01 -6.8070677700e-02 281 3.4977487670e-01 -6.8058842500e-02 282 3.4977486740e-01 -6.8047007300e-02 283 3.4977485800e-01 -6.8035172000e-02 284 3.4977484860e-01 -6.8023336700e-02 285 3.4977483930e-01 -6.8011501400e-02 286 3.4977482990e-01 -6.7999666000e-02 287 3.4977482050e-01 -6.7987830600e-02 288 3.4977481120e-01 -6.7975995100e-02 289 3.4977480180e-01 -6.7964159700e-02 290 3.4977479240e-01 -6.7952324200e-02 291 3.4977478310e-01 -6.7940488600e-02 292 3.4977477370e-01 -6.7928653100e-02 293 3.4977476430e-01 -6.7916817500e-02 294 3.4977475490e-01 -6.7904981800e-02 295 3.4977474560e-01 -6.7893146200e-02 296 3.4977473620e-01 -6.7881310400e-02 297 3.4977472680e-01 -6.7869474700e-02 298 3.4977471750e-01 -6.7857638900e-02 299 3.4977470810e-01 -6.7845803100e-02 300 3.4977469870e-01 -6.7833967300e-02 31 31 12051 1 1 0 0 NOINFO 1 4 1.419000 2000-03-01T00:00:00.000000 2007-12-17T00:00:00.000000 1.010489 2.267000 1.012669 2.345000 1.015983 2.246000 1.012968 2.340000 1.005883 2.297000 1.008890 2.202000 0.998299 2.320000 1.009489 2.214000 0.999796 2.362000 1.004994 2.211000 1.001792 2.312000 1.008291 2.240000 0.990815 2.315000 1.006193 2.236000 0.993809 2.357000 1.001497 2.226000 0.996802 2.367000 1.006692 2.221000 1.003488 2.319000 1.002796 2.214000 1.000395 2.314000 1.007991 2.207000 0.994108 2.289000 1.006792 2.218000 0.998599 2.305000 1.002097 2.223000 1.003488 2.308000 1.005993 2.219000 0.998698 2.305000 1.001997 2.197000 0.996403 2.311000 1.005893 2.213000 0.996802 2.322000 1.004295 2.200000 1.004486 2.306000 1.003595 2.203000 0.999696 2.313000 1.006093 2.226000 0.991014 2.342000 1.004594 2.210000 0.998299 2.285000 1.005194 2.200000 1.003688 2.289000 2007-12-17T00:00:00.000000 1 4.000000e-07 1.000000e-08 2000-03-01T00:00:00.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.004800 0.037000 0.183400 0.510700 0.624300 0.662800 0.748900 0.781100 0.786900 0.807200 0.827200 0.826600 0.840800 0.856000 0.880500 0.884800 0.928700 0.966400 0.970800 1.000000 0.943300 0.559100 0.123500 0.023500 0.002300 0.000000 0.000000 1 1739 ================================================ FILE: src/asp/Camera/tests/spot_style.xsl ================================================ dimap

qcroi ROI

Type

Layer

Format

Raster



General Information


Map Name



Geometric Processing Level



Radiometric Processing Level






Image dimensions


Number of columns

Number of rows

Number of spectral bands




Dataset framing


Vertice

Longitude (DEG)

Latitude (DEG)

Row

Col

#

Scene extracts

Region Of Interest

Upper Left

Lower Right

#

Row: , Col:

Row: , Col:




Dataset sources


javascript:details("div")

div
ID
K_J
SAT
DATE
TIME
INSTRUMENT
SENSOR
INCIDENCE_ANGLE ()
VIEWING_ANGLE ()
SUN_AZIMUTH ()
SUN_ELEVATION ()
BAND DESCRIPTION BAND
Type :
Unit :
Gain :
Bias :



Coordinate Reference System


Horizontal Coordinate System

Geocoding tables identification

()

Horizontal Coordinate System type

Horizontal coordinate system identification name

Geographic Coordinate System

Geographic Coordinate System




Geoposition


Upper - Left Map X Coordinate

Upper - Left Map Y Coordinate

Image sampling

x




Production


Production Date

Job identification


Product type identification


Dataset Producer Identification

Producer link




Quicklook


roi ROI ROI

================================================ FILE: src/asp/Camera/tests/wv_mvp_1.xml ================================================ 24.06 2014-06-25T14:20:17.000000Z 053644866010_01_P001 A03001011C7F3F00 210001011C7F4600 Stereo1B P None 27968 32837 Stereo 1B Stereo 2 Corrected 16 None GeoTIFF -1.162554465500000e+02 3.525504589000000e+01 6.763099999999999e+02 -1.160751748600000e+02 3.525505030000000e+01 2.530800000000000e+02 -1.160752699600000e+02 3.512911635000000e+01 2.535400000000000e+02 -1.162554614000000e+02 3.512883153000000e+01 3.159700000000000e+02 5.678345000000000e-02 2.846000000000000e-01 32 WV02 FullSwath Forward 1030010033C4AA00 2014-06-19T18:52:50.787577Z 2 0.000000000000000e+00 0.000000000000000e+00 3.804000000000000e+04 2.037800000000000e+00 2014-06-19T18:52:50.787577Z 1.866719000000000e+04 1.714240000000000e-03 4.660000000000000e-01 4.670000000000000e-01 4.660000000000000e-01 4.650000000000000e-01 4.650000000000000e-01 4.650000000000000e-01 4.660000000000000e-01 5.020000000000000e-01 5.000000000000000e-01 5.010000000000000e-01 2.610000000000000e+01 3.569000000000000e+01 1.313000000000000e+02 1.316000000000000e+02 1.315000000000000e+02 7.359999999999999e+01 7.370000000000000e+01 7.359999999999999e+01 1.330000000000000e+01 1.330000000000000e+01 1.330000000000000e+01 8.430000000000000e+01 8.520000000000000e+01 8.470000000000000e+01 4.700000000000000e+00 5.000000000000000e+00 4.800000000000000e+00 1.000000000000000e-01 3.000000000000000e-01 2.000000000000000e-01 4.700000000000000e+00 5.000000000000000e+00 4.900000000000000e+00 5.000000000000000e+00 0.000000000000000e+00 MTF R R 24638 WV02 24638 33C4AA R A 2014-06-19T19:36:03.928341Z 2014-06-19T18:52:38.618188Z 1318 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 WV02 24638 33C4AA R A 2014-06-19T19:50:03.000000Z 2014-06-19T18:52:38.618188Z 1318 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 P 1 32837 27968 Pixels 0 14JUN19185250-P1BS_R1C1-053644866010_01_P001.TIF 0 0 32836 0 32836 27967 0 27967 -1.162554465500000e+02 3.525504589000000e+01 -1.160751748600000e+02 3.525505030000000e+01 -1.160752699600000e+02 3.512911635000000e+01 -1.162554614000000e+02 3.512883153000000e+01 2009-10-08T00:00:00.000000Z 2010-10-26T00:00:00.000000Z WV02 LV1B 2010-01-28T00:00:00.000000Z 1.324613900000000e+04 2009-09-10T00:00:00.000000Z -1 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 2010-10-26T00:00:00.000000Z P 1 -2.590000000000001e-01 1.407274054017886e+02 0.000000000000000e+00 8.570629999999999e-03 1 14JUN19185250-P1BS_R1C1-053644866010_01_P001.TIF 14JUN19185358-P1BS_R1C1-053644866010_01_P001.TIF 7.850000000000000e-01 3.525505000000000e+01 -1.162554470000000e+02 3.508343700000000e+01 -1.160751750000000e+02 3.545000000000000e+01 3.532000000000000e+01 1.243000000000000e+01 1.198000000000000e+01 7.756999999999999e+01 7.802000000000000e+01 WV02 P RPC00B 1.454000000000000e+01 1.300000000000000e-01 13983 16418 3.519210000000000e+01 -1.161654000000000e+02 594 13984 16418 6.360000000000000e-02 9.030000000000001e-02 501 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 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 -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 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 ================================================ FILE: src/asp/Camera/tests/wv_mvp_2.xml ================================================ 24.06 2014-06-25T14:15:35.000000Z 053644866010_01_P001 A03001011C7F3F00 210001011C7F3E00 Stereo1B P None 23640 35180 Stereo 1B Stereo 2 Corrected 16 None GeoTIFF -1.162691402400000e+02 3.525804882000000e+01 6.306200000000000e+02 -1.160623710800000e+02 3.527244732000000e+01 2.667400000000000e+02 -1.160630790400000e+02 3.514412735000000e+01 2.531900000000000e+02 -1.162684863300000e+02 3.513157338000000e+01 2.994700000000000e+02 5.678345000000000e-02 2.846000000000000e-01 32 WV02 FullSwath Forward 1030010032134D00 2014-06-19T18:53:58.287975Z 2 0.000000000000000e+00 0.000000000000000e+00 3.546400000000000e+04 1.773200000000000e+00 2014-06-19T18:53:58.287975Z 2.000000000000000e+04 1.600000000000000e-03 5.990000000000000e-01 6.050000000000000e-01 6.020000000000000e-01 5.320000000000000e-01 5.330000000000000e-01 5.320000000000000e-01 5.659999999999999e-01 6.050000000000000e-01 5.340000000000000e-01 5.690000000000000e-01 5.634000000000000e+01 4.238000000000000e+01 1.320000000000000e+02 1.324000000000000e+02 1.322000000000000e+02 7.380000000000000e+01 7.380000000000000e+01 7.380000000000000e+01 1.936000000000000e+02 1.936000000000000e+02 1.936000000000000e+02 5.960000000000000e+01 6.010000000000000e+01 5.980000000000000e+01 -2.660000000000000e+01 -2.630000000000000e+01 -2.640000000000000e+01 -1.700000000000000e+00 -1.500000000000000e+00 -1.600000000000000e+00 2.630000000000000e+01 2.660000000000000e+01 2.650000000000000e+01 4.800000000000000e+00 0.000000000000000e+00 MTF R R 24638 WV02 24638 32134D R A 2014-06-19T19:36:03.928341Z 2014-06-19T18:53:46.118937Z 1305 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 WV02 24638 32134D R A 2014-06-19T19:50:25.000000Z 2014-06-19T18:53:46.118937Z 1305 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 P 1 35180 23640 Pixels 0 14JUN19185358-P1BS_R1C1-053644866010_01_P001.TIF 0 0 35179 0 35179 23639 0 23639 -1.162691402400000e+02 3.525804882000000e+01 -1.160623710800000e+02 3.527244732000000e+01 -1.160630790400000e+02 3.514412735000000e+01 -1.162684863300000e+02 3.513157338000000e+01 2009-10-08T00:00:00.000000Z 2010-10-26T00:00:00.000000Z WV02 LV1B 2010-01-28T00:00:00.000000Z 1.324613900000000e+04 2009-09-10T00:00:00.000000Z -1 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 2010-10-26T00:00:00.000000Z P 1 -2.590000000000001e-01 1.407276907149051e+02 0.000000000000000e+00 8.000000000000000e-03 1 14JUN19185250-P1BS_R1C1-053644866010_01_P001.TIF 14JUN19185358-P1BS_R1C1-053644866010_01_P001.TIF 7.850000000000000e-01 3.525505000000000e+01 -1.162554470000000e+02 3.508343700000000e+01 -1.160751750000000e+02 3.545000000000000e+01 3.532000000000000e+01 1.243000000000000e+01 1.198000000000000e+01 7.756999999999999e+01 7.802000000000000e+01 WV02 P RPC00B 1.778000000000000e+01 2.300000000000000e-01 11819 17589 3.520040000000000e+01 -1.161660000000000e+02 593 11820 17590 7.290000000000001e-02 1.039000000000000e-01 501 -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 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 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 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 ================================================ FILE: src/asp/Camera/tests/wv_test1.xml ================================================ 23.11 2013-05-08T01:29:34.000000Z 500063426010_01_P001 A030011E64C1AA00 2100011E64C1A900 Stereo1B P None 22528 35840 Stereo 1B Stereo 2 Corrected 16 JPEG2000 nga_npje_pan_vl NITF21NCDRD -3.814998154000000e+01 7.255587169000000e+01 3.231410000000000e+03 -3.868863101000000e+01 7.254679814000001e+01 3.205210000000000e+03 -3.869039556000000e+01 7.264473667000000e+01 3.222820000000000e+03 -3.814707665000000e+01 7.265401095999999e+01 3.245980000000000e+03 3.788831000000000e-02 2.846000000000000e-01 48 WV02 FullSwath Forward 1030010021309100 2013-05-08T00:03:30.536775Z 2 0.000000000000000e+00 0.000000000000000e+00 2.175600000000000e+04 1.087800000000000e+00 2013-05-08T00:03:30.536775Z 2.000000000000000e+04 2.400000000000000e-03 5.030000000000000e-01 5.050000000000000e-01 5.040000000000000e-01 5.140000000000000e-01 5.160000000000000e-01 5.150000000000000e-01 5.090000000000000e-01 5.080000000000000e-01 5.170000000000000e-01 5.120000000000000e-01 3.610000000000000e+01 4.465000000000000e+01 3.252000000000000e+02 3.252000000000000e+02 3.252000000000000e+02 2.800000000000000e+00 2.900000000000000e+00 2.800000000000000e+00 2.309000000000000e+02 2.326000000000000e+02 2.318000000000000e+02 7.000000000000000e+01 7.009999999999999e+01 7.009999999999999e+01 4.800000000000000e+00 5.000000000000000e+00 4.900000000000000e+00 1.680000000000000e+01 1.710000000000000e+01 1.700000000000000e+01 1.760000000000000e+01 1.760000000000000e+01 1.760000000000000e+01 5.000000000000000e+00 9.900000000000000e-02 CC R R 18779 WV02 18779 213091 R A 2013-05-08T00:59:56.843858Z 2013-05-08T00:03:18.178844Z 1291 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 WV02 18779 213091 R A 2013-05-08T01:09:17.000000Z 2013-05-08T00:03:18.178844Z 1291 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 P 1 35180 21756 Pixels 0 13MAY08000330-P1BS-500063426010_01_P001.NTF 0 0 35839 0 35839 22527 0 22527 -3.814998154000000e+01 7.255587169000000e+01 -3.868863101000000e+01 7.254679814000001e+01 -3.869039556000000e+01 7.264473667000000e+01 -3.814707665000000e+01 7.265401095999999e+01 2009-10-08T00:00:00.000000Z 2010-10-26T00:00:00.000000Z WV02 LV1B 2010-01-28T00:00:00.000000Z 1.324613900000000e+04 2009-09-10T00:00:00.000000Z -1 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 2010-10-26T00:00:00.000000Z P 1 -2.590000000000001e-01 1.407276907149051e+02 0.000000000000000e+00 8.000000000000000e-03 1 13MAY08000330-P1BS-500063426010_01_P001.NTF 13MAY08000439-P1BS-500063426010_01_P001.NTF 7.120000000000000e-01 7.265003600000000e+01 -3.869039600000000e+01 7.255045800000001e+01 -3.814754700000000e+01 3.433000000000000e+01 3.426000000000000e+01 1.228000000000000e+01 1.203000000000000e+01 6.745000000000000e+01 6.731000000000000e+01 WV02 P RPC00B 1.657000000000000e+01 1.300000000000000e-01 10877 17589 7.260039999999999e+01 -3.841850000000000e+01 3226 10878 17590 5.470000000000000e-02 2.761000000000000e-01 501 -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 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 -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 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 ================================================ FILE: src/asp/Camera/tests/wv_test2.xml ================================================ 23.11 2013-05-08T01:30:28.000000Z 500063426010_01_P001 A030011E64C1AA00 2100011E64C1AB00 Stereo1B P None 20480 35840 Stereo 1B Stereo 2 Corrected 16 JPEG2000 nga_npje_pan_vl NITF21NCDRD -3.808772277000000e+01 7.253032611000000e+01 3.228280000000000e+03 -3.875234323000000e+01 7.256520433999999e+01 3.205400000000000e+03 -3.875435021000000e+01 7.266925209999999e+01 3.221790000000000e+03 -3.808531310000000e+01 7.263491770000000e+01 3.244690000000000e+03 3.788831000000000e-02 2.846000000000000e-01 48 WV02 FullSwath Forward 1030010022D83700 2013-05-08T00:04:39.554575Z 2 0.000000000000000e+00 0.000000000000000e+00 1.987200000000000e+04 9.936000000000000e-01 2013-05-08T00:04:39.554575Z 2.000000000000000e+04 2.400000000000000e-03 5.850000000000000e-01 5.880000000000000e-01 5.870000000000000e-01 6.430000000000000e-01 6.440000000000000e-01 6.430000000000000e-01 6.140000000000000e-01 5.910000000000000e-01 6.460000000000000e-01 6.180000000000000e-01 5.301000000000000e+01 7.365000000000001e+01 3.255000000000000e+02 3.255000000000000e+02 3.255000000000000e+02 2.700000000000000e+00 2.800000000000000e+00 2.800000000000000e+00 3.061000000000000e+02 3.065000000000000e+02 3.063000000000000e+02 5.530000000000000e+01 5.570000000000000e+01 5.550000000000000e+01 -2.550000000000000e+01 -2.520000000000000e+01 -2.540000000000000e+01 1.720000000000000e+01 1.750000000000000e+01 1.730000000000000e+01 3.040000000000000e+01 3.040000000000000e+01 3.040000000000000e+01 4.700000000000000e+00 1.250000000000000e-01 CC R R 18779 WV02 18779 22D837 R A 2013-05-08T00:59:56.843858Z 2013-05-08T00:04:27.130007Z 1293 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 WV02 18779 22D837 R A 2013-05-08T01:09:53.000000Z 2013-05-08T00:04:27.130007Z 1293 2.000000000000000e-02 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 P 1 35180 19872 Pixels 0 13MAY08000439-P1BS-500063426010_01_P001.NTF 0 0 35839 0 35839 20479 0 20479 -3.808772277000000e+01 7.253032611000000e+01 -3.875234323000000e+01 7.256520433999999e+01 -3.875435021000000e+01 7.266925209999999e+01 -3.808531310000000e+01 7.263491770000000e+01 2009-10-08T00:00:00.000000Z 2010-10-26T00:00:00.000000Z WV02 LV1B 2010-01-28T00:00:00.000000Z 1.324613900000000e+04 2009-09-10T00:00:00.000000Z -1 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 2009-09-10T00:00:00.000000Z 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 2010-10-26T00:00:00.000000Z P 1 -2.590000000000001e-01 1.407276907149051e+02 0.000000000000000e+00 8.000000000000000e-03 1 13MAY08000330-P1BS-500063426010_01_P001.NTF 13MAY08000439-P1BS-500063426010_01_P001.NTF 7.120000000000000e-01 7.265003600000000e+01 -3.869039600000000e+01 7.255045800000001e+01 -3.814754700000000e+01 3.433000000000000e+01 3.426000000000000e+01 1.228000000000000e+01 1.203000000000000e+01 6.745000000000000e+01 6.731000000000000e+01 WV02 P RPC00B 2.419000000000000e+01 1.500000000000000e-01 9935 17589 7.259970000000000e+01 -3.841950000000000e+01 3221 9936 17590 7.130000000000000e-02 3.431000000000000e-01 501 -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 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 -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 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 ================================================ FILE: src/asp/Core/AffineEpipolar.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include // Slow-to-compile header #include // Lightweight header #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::math; namespace asp { // Solves for Affine Fundamental Matrix as per instructions in // Multiple View Geometry. Outlier elimination happens later. Matrix linear_affine_fundamental_matrix(std::vector const& ip1, std::vector const& ip2) { // (i) Compute the centroid of X and delta X Matrix delta_x(ip1.size(), 4); Vector4 mean_x; for (size_t i = 0; i < ip1.size(); i++) { delta_x(i, 0) = ip2[i].x; delta_x(i, 1) = ip2[i].y; delta_x(i, 2) = ip1[i].x; delta_x(i, 3) = ip1[i].y; mean_x += select_row(delta_x, i) / double(ip1.size()); } for (size_t i = 0; i < ip1.size(); i++) select_row(delta_x,i) -= mean_x; Matrix U, VT; Vector S; svd(transpose(delta_x), U, S, VT); Vector N = select_col(U, 3); double e = -transpose(N) * mean_x; Matrix f(3,3); f(0,2) = N(0); f(1,2) = N(1); f(2,2) = e; f(2,0) = N(2); f(2,1) = N(3); return f; } void solve_y_scaling(std::vector const & ip1, std::vector const & ip2, Matrix & affine_left, Matrix & affine_right) { Matrix a(ip1.size(), 2); Vector b(ip1.size()); for (size_t i = 0; i < ip1.size(); i++) { select_row(a, i) = subvector(affine_right*Vector3(ip2[i].x, ip2[i].y, 1), 1, 2); b[i] = (affine_left*Vector3(ip1[i].x, ip1[i].y, 1))(1); } Vector scaling = least_squares(a, b); submatrix(affine_right,0,0,2,2) *= scaling[0]; affine_right(1,2) = scaling[1]; } void solve_x_shear(std::vector const & ip1, std::vector const & ip2, Matrix & affine_left, Matrix & affine_right) { Matrix a(ip1.size(), 3); Vector b(ip1.size()); for (size_t i = 0; i < ip1.size(); i++) { select_row(a, i) = affine_right * Vector3(ip2[i].x, ip2[i].y, 1); b[i] = (affine_left * Vector3(ip1[i].x, ip1[i].y, 1))(0); } Vector shear = least_squares(a, b); Matrix interm = math::identity_matrix<3>(); interm(0, 1) = -shear[1] / 2.0; affine_left = interm * affine_left; interm = math::identity_matrix<3>(); interm(0, 0) = shear[0]; interm(0, 1) = shear[1] / 2.0; interm(0, 2) = shear[2]; affine_right = interm * affine_right; } // A functor which returns the best fit left and right 3x3 matrices // for epipolar alignment. Store them as a single 3x7 matrix. The // last column will have the upper-right corner of the intersections // of the domains of the left and right images with the resulting // transformed applied to them. struct BestFitEpipolarAlignment { Vector2i m_ldims, m_rdims; bool m_crop_to_shared_area; BestFitEpipolarAlignment(Vector2i const& left_image_dims, Vector2i const& right_image_dims, bool crop_to_shared_area): m_ldims(left_image_dims), m_rdims(right_image_dims), m_crop_to_shared_area(crop_to_shared_area) {} typedef vw::Matrix result_type; /// The fundamental matrix needs 8 points. // TODO(oalexan1): Should a bigger minimum be used for robustness? template size_t min_elements_needed_for_fit(InterestPointT const& /*example*/) const { return 8; } /// This function can match points in any container that supports /// the size() and operator[] methods. The container is usually a /// vw::Vector<>, but you could substitute other classes here as /// well. template vw::Matrix operator()(std::vector const& ip1, std::vector const& ip2, vw::Matrix const& /*seed_input*/ = vw::Matrix() ) const { // check consistency VW_ASSERT( ip1.size() == ip2.size(), vw::ArgumentErr() << "Cannot compute fundamental matrix. " << "ip1 and ip2 are not the same size." ); VW_ASSERT( !ip1.empty() && ip1.size() >= min_elements_needed_for_fit(ip1[0]), vw::ArgumentErr() << "Cannot compute fundamental matrix. " << "Need at at least 8 points, but got: " << ip1.size() << ".\n"); // Compute the affine fundamental matrix Matrix fund = linear_affine_fundamental_matrix(ip1, ip2); // Solve for rotation matrices double Hl = sqrt(fund(2, 0)*fund(2, 0) + fund(2, 1)*fund(2, 1)); double Hr = sqrt(fund(0, 2)*fund(0, 2) + fund(1, 2)*fund(1, 2)); Vector2 epipole(-fund(2, 1), fund(2, 0)), epipole_prime(-fund(1, 2), fund(0, 2)); if (epipole.x() < 0) epipole = -epipole; if (epipole_prime.x() < 0) epipole_prime = -epipole_prime; epipole.y() = -epipole.y(); epipole_prime.y() = -epipole_prime.y(); Matrix left_matrix = math::identity_matrix<3>(); Matrix right_matrix = math::identity_matrix<3>(); left_matrix(0, 0) = epipole[0]/Hl; left_matrix(0, 1) = -epipole[1]/Hl; left_matrix(1, 0) = epipole[1]/Hl; left_matrix(1, 1) = epipole[0]/Hl; right_matrix(0, 0) = epipole_prime[0]/Hr; right_matrix(0, 1) = -epipole_prime[1]/Hr; right_matrix(1, 0) = epipole_prime[1]/Hr; right_matrix(1, 1) = epipole_prime[0]/Hr; // Solve for ideal scaling and translation solve_y_scaling(ip1, ip2, left_matrix, right_matrix); // Solve for ideal shear, scale, and translation of X axis solve_x_shear(ip1, ip2, left_matrix, right_matrix); // Work out the ideal render size BBox2i left_bbox, right_bbox; left_bbox.grow(subvector(left_matrix * Vector3(0, 0, 1), 0, 2)); left_bbox.grow(subvector(left_matrix * Vector3(m_ldims.x(), 0, 1), 0, 2)); left_bbox.grow(subvector(left_matrix * Vector3(m_ldims.x(), m_ldims.y(), 1), 0, 2)); left_bbox.grow(subvector(left_matrix * Vector3(0, m_ldims.y(), 1), 0, 2)); right_bbox.grow(subvector(right_matrix * Vector3(0, 0, 1), 0, 2)); right_bbox.grow(subvector(right_matrix * Vector3(m_rdims.x(), 0, 1), 0, 2)); right_bbox.grow(subvector(right_matrix * Vector3(m_rdims.x(), m_rdims.y(), 1), 0, 2)); right_bbox.grow(subvector(right_matrix * Vector3(0, m_rdims.y(), 1), 0, 2)); // TODO(oalexan1): There is room for improvement below, // but the attempts tried below (commented out) need // a lot more testing. Also, the current outlier filtering // is apparently not foolproof yet. // Ensure that the transforms map the interest points to points // with positive x and y, we will need that when later the // transformed images are computed. if (m_crop_to_shared_area) left_bbox.crop(right_bbox); // Note how we subtract left_bbox.min() from both left_matrix // and right_matrix. By subtracting the same thing we // maintain the property that a row in the left image is // matched to the same row in the right image after the // left_matrix and right_matrix transforms are applied. left_matrix (0, 2) -= left_bbox.min().x(); left_matrix (1, 2) -= left_bbox.min().y(); right_matrix(0, 2) -= left_bbox.min().x(); right_matrix(1, 2) -= left_bbox.min().y(); // Concatenate these into the answer result_type T; submatrix(T, 0, 0, 3, 3) = left_matrix; submatrix(T, 0, 3, 3, 3) = right_matrix; // Implicit in the logic below is the fact that left_bbox should now also // have left_bbox.min() subtracted from it, after which it becomes the // box with lower-left corner being (0, 0) and upper-right corner // being (left_bbox.width(), left_bbox.height()) which is // what we save here as the upper bound after the transform. T(0, 6) = left_bbox.width(); T(1, 6) = left_bbox.height(); return T; } }; // Find the absolute difference of the y components of the given // interest point pair after applying to those points the given // epipolar alignment matrices. If these matrices are correct, // and the interest point pair is not an outlier, this // absolute difference should be close to 0. struct EpipolarAlignmentError { template double operator() (TransformT const& T, InterestPointT const& ip1, InterestPointT const& ip2) const { Matrix left_matrix = submatrix(T, 0, 0, 3, 3); Matrix right_matrix = submatrix(T, 0, 3, 3, 3); Vector3 L = left_matrix * Vector3(ip1.x, ip1.y, 1); Vector3 R = right_matrix * Vector3(ip2.x, ip2.y, 1); double diff = L[1] - R[1]; return std::abs(diff); } }; // Helper function to instantiate a RANSAC class object and immediately call it template typename FittingFuncT::result_type ransac(std::vector const& p1, std::vector const& p2, FittingFuncT const& fitting_func, ErrorFuncT const& error_func, int num_iterations, double inlier_threshold, int min_num_output_inliers, bool reduce_min_num_output_inliers_if_no_fit = false ) { RandomSampleConsensus ransac_instance(fitting_func, error_func, num_iterations, inlier_threshold, min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit ); return ransac_instance(p1,p2); } // Main function that other parts of ASP should use Vector2i affine_epipolar_rectification(Vector2i const& left_image_dims, Vector2i const& right_image_dims, double inlier_threshold, int num_ransac_iterations, std::vector const& ip1, std::vector const& ip2, bool crop_to_shared_area, Matrix& left_matrix, Matrix& right_matrix, // optionally return the inliers std::vector * inliers_ptr) { int min_num_output_inliers = ip1.size() / 2; bool reduce_min_num_output_inliers_if_no_fit = true; vw::Matrix T; Stopwatch sw; sw.start(); vw_out() << "Computing the epipolar rectification " << "using RANSAC with " << num_ransac_iterations << " iterations and inlier threshold " << inlier_threshold << ".\n"; // If RANSAC fails, it will throw an exception BestFitEpipolarAlignment func(left_image_dims, right_image_dims, crop_to_shared_area); EpipolarAlignmentError error_metric; std::vector inlier_indices; RandomSampleConsensus ransac(func, error_metric, num_ransac_iterations, inlier_threshold, min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit); try { T = ransac(ip1, ip2); } catch (std::exception const& e) { vw_throw(ArgumentErr() << "Failed compute the epipolar rectification.\n" << "Check if your left and right images are similar enough. " << "Consider deleting the output directory and restarting with " << "a larger --ip-per-tile value.\n" << "RANSAC error: " << e.what() << "\n"); } inlier_indices = ransac.inlier_indices(T, ip1, ip2); vw_out() << "Found " << inlier_indices.size() << " / " << ip1.size() << " inliers.\n"; sw.stop(); vw_out() << "Elapsed time in computing rectification matrices: " << sw.elapsed_seconds() << " seconds.\n"; // Extract the matrices and the cropped transformed box from the computed transform left_matrix = submatrix(T, 0, 0, 3, 3); right_matrix = submatrix(T, 0, 3, 3, 3); Vector2i trans_crop_box(T(0, 6), T(1, 6)); // Find the maximum error for inliers double max_err = 0.0; for (size_t it = 0; it < inlier_indices.size(); it++) { int i = inlier_indices[it]; max_err = std::max(max_err, error_metric(T, ip1[i], ip2[i])); } vw_out() << "Maximum absolute difference of y components of " << "aligned inlier interest points is " << max_err << " pixels." << std::endl; // This needs more testing if (false && !crop_to_shared_area) { // The bounds of the transforms have been a bit too generous. Tighten them to the bounding // box of the IP. // TODO(oalexan1): Remove outliers here! // Apply local alignment to inlier ip and estimate the search range vw::HomographyTransform left_local_trans (left_matrix); vw::HomographyTransform right_local_trans(right_matrix); // Find the transformed IP std::vector left_trans_local_ip; std::vector right_trans_local_ip; for (size_t it = 0; it < inlier_indices.size(); it++) { int i = inlier_indices[it]; Vector2 left_pt (ip1[i].x, ip1[i].y); Vector2 right_pt(ip2[i].x, ip2[i].y); left_pt = left_local_trans.forward(left_pt); right_pt = right_local_trans.forward(right_pt); // First copy all the data from the input ip, then apply the transform left_trans_local_ip.push_back(ip1[i]); right_trans_local_ip.push_back(ip2[i]); left_trans_local_ip.back().x = left_pt.x(); left_trans_local_ip.back().y = left_pt.y(); right_trans_local_ip.back().x = right_pt.x(); right_trans_local_ip.back().y = right_pt.y(); } // Filter outliers Vector2 params = stereo_settings().outlier_removal_params; bool quiet = false; if (params[0] < 100.0) asp::filter_ip_by_disparity(params[0], params[1], quiet, left_trans_local_ip, right_trans_local_ip); vw::BBox2i left_bbox, right_bbox; for (size_t i = 0; i < left_trans_local_ip.size(); i++) { Vector2 left_pt (left_trans_local_ip[i].x, left_trans_local_ip[i].y); Vector2 right_pt(right_trans_local_ip[i].x, right_trans_local_ip[i].y); left_bbox.grow(left_pt); right_bbox.grow(right_pt); } // TODO(oalexan1): Run a large scale test to see if this is necessary. left_bbox.expand(50); right_bbox.expand(50); // The way the transforms were created, there is no good reason // for transformed ip to have negative values. left_bbox.min().x() = std::max(left_bbox.min().x(), 0); left_bbox.min().y() = std::max(left_bbox.min().y(), 0); right_bbox.min().x() = std::max(right_bbox.min().x(), 0); right_bbox.min().y() = std::max(right_bbox.min().y(), 0); // Adjust the domains of the transforms to the bounding boxes of // the interest points. left_matrix (0, 2) -= left_bbox.min().x(); left_matrix (1, 2) -= left_bbox.min().y(); right_matrix(0, 2) -= right_bbox.min().x(); right_matrix(1, 2) -= right_bbox.min().y(); trans_crop_box[0] = std::max(left_bbox.width(), right_bbox.width()); trans_crop_box[1] = std::max(left_bbox.height(), right_bbox.height()); } // Optionally return the inliers if (inliers_ptr != NULL) *inliers_ptr = inlier_indices; return trans_crop_box; } } // end namespace asp ================================================ FILE: src/asp/Core/AffineEpipolar.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_CORE_AFFINEEPIPOLAR_H__ #define __ASP_CORE_AFFINEEPIPOLAR_H__ #include #include namespace vw { namespace ip { struct InterestPoint; } } namespace asp { // Takes matched interest points and returns ideal rectifcation // transforms in left_matrix and right_matrix. This function returns // the ideal image size. (It reduces the image sizes to only the // intersect of the two images.) vw::Vector2i affine_epipolar_rectification(vw::Vector2i const& left_size, vw::Vector2i const& right_size, double inlier_threshold, int num_ransac_iterations, std::vector const& left, std::vector const& right, bool crop_to_shared_area, vw::Matrix& left_matrix, vw::Matrix& right_matrix, // optionally return the inliers std::vector * inliers_ptr = NULL); } #endif//__ASP_CORE_AFFINEEPIPOLAR_H__ ================================================ FILE: src/asp/Core/AlignmentUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file AlignmentUtils.cc #include #include #include namespace fs = boost::filesystem; namespace asp { std::string leftAlignFile(std::string const& out_prefix) { return out_prefix + "-align-L.txt"; } std::string rightAlignFile(std::string const& out_prefix) { return out_prefix + "-align-R.txt"; } // These are kept for backward compatibility and will be removed // in the future. std::string leftAlignExrFile(std::string const& out_prefix) { return out_prefix + "-align-L.exr"; } std::string rightAlignExrFile(std::string const& out_prefix) { return out_prefix + "-align-R.exr"; } // Read the left or right alignment matrix from the file vw::Matrix alignmentMatrix(std::string const& out_prefix, std::string const& alignment_method, std::string const& side) { std::string align_file, align_file_exr; if (side == "left") { align_file = leftAlignFile(out_prefix); align_file_exr = leftAlignExrFile(out_prefix); } else if (side == "right") { align_file = rightAlignFile(out_prefix); align_file_exr = rightAlignExrFile(out_prefix); } else { vw::vw_throw(vw::ArgumentErr() << "Invalid side: " << side << "\n"); } // Initalize with the identity matrix vw::Matrix align_matrix = vw::math::identity_matrix<3>(); if (alignment_method == "homography" || alignment_method == "affineepipolar" || alignment_method == "local_epipolar") { if (fs::exists(align_file)) // read alignment matrix from text file vw::read_matrix_as_txt(align_file, align_matrix); else if (fs::exists(align_file_exr)) // read exr, for backward compatibility vw::read_matrix(align_matrix, align_file_exr); else vw::vw_throw(vw::IOErr() << "Could not read alignment matrix from: " << align_file << " or " << align_file_exr << "\n"); } return align_matrix; } } // namespace asp ================================================ FILE: src/asp/Core/AlignmentUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file AlignmentUtils.h #ifndef __ALIGNMENT_UTILS_H__ #define __ALIGNMENT_UTILS_H__ #include #include namespace asp { std::string leftAlignFile(std::string const& out_prefix); std::string rightAlignFile(std::string const& out_prefix); // These are kept for backward compatibility and will be removed // in the future. std::string leftAlignExrFile(std::string const& out_prefix); std::string rightAlignExrFile(std::string const& out_prefix); // Read the left or right alignment matrix from the file vw::Matrix alignmentMatrix(std::string const& out_prefix, std::string const& alignment_method, std::string const& side); } // end namespace asp #endif // __ALIGNMENT_UTILS_H__ ================================================ FILE: src/asp/Core/AspLog.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; std::string asp::current_posix_time_string() { return boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time()); } void asp::run_cmd_app_to_file(std::string cmd, std::string file){ std::string full_cmd; full_cmd = "echo '" + cmd + "' >> " + file; // echo the command to run int code = system(full_cmd.c_str()); full_cmd = cmd + " >> " + file + " 2>&1"; code = system(full_cmd.c_str()); full_cmd = "echo '' >> " + file; // append a newline code = system(full_cmd.c_str()); } std::string asp::extract_prog_name(std::string const& prog_str){ // Get program name without path and leading 'lt-'. std::string prog_name = fs::path(prog_str).stem().string(); std::string pref = "lt-"; size_t lp = pref.size(); if (prog_name.size() >= lp && prog_name.substr(0, lp) == pref) prog_name = prog_name.substr(lp, prog_name.size() - lp); return prog_name; } void asp::log_to_file(int argc, char *argv[], std::string stereo_default_filename, std::string out_prefix){ // Log some system info to a file, then copy the vw log // info to that file as well. if (out_prefix == "") vw::vw_throw(vw::ArgumentErr() << "Output prefix was not set.\n"); // Create the output directory if not present vw::create_out_dir(out_prefix); std::string prog_name = extract_prog_name(argv[0]); // Create the log file and open it in write mode std::ostringstream os; int pid = getpid(); std::string timestamp = boost::posix_time::to_iso_string(boost::posix_time::second_clock::local_time()); std::string clean_timestamp = timestamp.substr(4, 9); // Trim off the year clean_timestamp.replace(4, 1, 1, '-'); // Replace T with - clean_timestamp.insert (2, 1, '-'); // Insert - between month and day os << out_prefix << "-log-" << prog_name << "-" << clean_timestamp << "-" << pid << ".txt"; std::string log_file = os.str(); vw::vw_out() << "Writing log: " << log_file << std::endl; std::ofstream lg(log_file.c_str()); // Write the version lg << "ASP " << ASP_VERSION << "\n"; #if defined(ASP_COMMIT_ID) lg << "Build ID: " << ASP_COMMIT_ID << "\n"; #endif #if defined(ASP_BUILD_DATE) lg << "Build date: " << ASP_BUILD_DATE << "\n"; #endif lg << "\n"; // leave some separation // Write the program name and its arguments for (int s = 0; s < argc; s++) { std::string token = std::string(argv[s]); // Skip adding empty spaces if (token == " ") continue; // Use quotes if there are spaces if (token.find(" ") != std::string::npos || token.find("\t") != std::string::npos) token = '"' + token + '"'; lg << token + " "; } lg << std::endl << std::endl; // Must ensure to close the file handle before further appending to // it below. lg.close(); // System calls. Not all will succeed on all machines. asp::run_cmd_app_to_file("uname -a", log_file); if (fs::exists("/proc/meminfo")) asp::run_cmd_app_to_file("cat /proc/meminfo 2>/dev/null | grep MemTotal", log_file); if (fs::exists("/proc/cpuinfo")) asp::run_cmd_app_to_file("cat /proc/cpuinfo 2>/dev/null | tail -n 25", log_file); // The line below is for MacOSX 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); if (stereo_default_filename != "" && fs::exists(stereo_default_filename)) { std::string cmd = "cat " + stereo_default_filename + " 2>/dev/null"; asp::run_cmd_app_to_file(cmd, log_file); } // Save the current .vwrc char * home_ptr = getenv("HOME"); if (home_ptr) { std::string home = home_ptr; std::string vwrc = home + "/.vwrc"; if (fs::exists(vwrc)) { std::string cmd = "cat " + vwrc + " 2>/dev/null"; asp::run_cmd_app_to_file(cmd, log_file); } } // Copy all the info going to the console to log_file as well, // except the progress bar. boost::shared_ptr current_log(new vw::LogInstance(log_file)); current_log->rule_set() = vw::vw_log().console_log().rule_set(); current_log->rule_set().add_rule(0, "*.progress"); vw::vw_log().add(current_log); } ================================================ FILE: src/asp/Core/AspLog.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file AspLog.h /// /// Logging utilities for ASP tools (no boost::program_options dependency). #ifndef __ASP_CORE_ASP_LOG_H__ #define __ASP_CORE_ASP_LOG_H__ #include namespace asp { /// Print time function std::string current_posix_time_string(); /// Run a system command and append the output to a given file void run_cmd_app_to_file(std::string cmd, std::string file); /// Get program name without path and leading 'lt-'. std::string extract_prog_name(std::string const& prog_str); /// Write logs to a file void log_to_file(int argc, char *argv[], std::string stereo_default_filename, std::string output_prefix); } // end namespace asp #endif // __ASP_CORE_ASP_LOG_H__ ================================================ FILE: src/asp/Core/AspProgramOptions.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include // defines ASP_HAVE_PKG_ISIS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; namespace po = boost::program_options; namespace fs = boost::filesystem; // User should only put the arguments to their application in the // usage_comment argument. We'll finish filling in the repeated information. po::variables_map asp::check_command_line(int argc, char *argv[], vw::GdalWriteOptions& opt, po::options_description const& public_options, po::options_description const& all_public_options, po::options_description const& positional_options, po::positional_options_description const& positional_desc, std::string & usage_comment, bool allow_unregistered, std::vector & unregistered) { unregistered.clear(); // Ensure that opt gets all needed fields from vw::GdalWriteOptionsDescription(). // This is needed not only for stereo, but for all tools using vw::GdalWriteOptions. asp::stereo_settings().initialize(opt); // Finish filling in the usage_comment. std::ostringstream ostr; ostr << "Usage: " << argv[0] << " " << usage_comment << "\n\n"; ostr << " [ASP " << ASP_VERSION << "]\n"; #if defined(ASP_BUILD_DATE) ostr << " Build date: " << ASP_BUILD_DATE << "\n"; #endif ostr << "\n"; usage_comment = ostr.str(); // Set a handful of of env vars for ISIS, GDAL, PROJ asp::set_asp_env_vars(); // We distinguish between all_public_options, which is all the // options we must parse, even if we don't need some of them, and // public_options, which are the options specifically used by the // current tool, and for which we also print the help message. po::variables_map vm; try { po::options_description all_options; all_options.add(all_public_options).add(positional_options); if (allow_unregistered) { po::parsed_options parsed = po::command_line_parser(argc, argv).options(all_options).allow_unregistered() .style(po::command_line_style::unix_style).run(); unregistered = collect_unrecognized(parsed.options, po::include_positional); po::store(parsed, vm); } else { po::parsed_options parsed = po::command_line_parser(argc, argv).options(all_options).positional(positional_desc) .style(po::command_line_style::unix_style).run(); po::store(parsed, vm); } po::notify(vm); } catch (po::error const& e) { vw::vw_throw(vw::ArgumentErr() << "Error parsing input:\n" << e.what() << "\n" << usage_comment << public_options); } // We really don't want to use BIGTIFF unless we have to. It's // hard to find viewers for bigtiff. if (vm.count("no-bigtiff")) { opt.gdal_options["BIGTIFF"] = "NO"; } else { opt.gdal_options["BIGTIFF"] = "IF_SAFER"; } if (vm.count("help")) { vw::vw_out() << usage_comment << public_options << "\n"; exit(0); } if (vm.count("version")) { std::ostringstream ostr; ostr << ASP_PACKAGE_STRING << "\n"; #if defined(ASP_COMMIT_ID) ostr << " Build ID: " << ASP_COMMIT_ID << "\n"; #endif #if defined(ASP_BUILD_DATE) ostr << " Build date: " << ASP_BUILD_DATE << "\n"; #endif ostr << "\nBuilt against:\n " << VW_PACKAGE_STRING << "\n"; #if defined(VW_COMMIT_ID) ostr << " Build ID: " << VW_COMMIT_ID << "\n"; #endif #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 ostr << " USGS ISIS " << ASP_ISIS_VERSION << "\n"; #endif ostr << " Boost C++ Libraries " << ASP_BOOST_VERSION << "\n"; ostr << " GDAL " << GDAL_RELEASE_NAME << " | " << GDAL_RELEASE_DATE << "\n"; vw::vw_out() << ostr.str() << "\n"; exit(0); } opt.setVwSettingsFromOpt(); return vm; } namespace boost { namespace program_options { // Custom value semantics, these explain how many tokens should be ingested. // 2 values typed_2_value* value(vw::Vector2i* v) { typed_2_value* r = new typed_2_value(v); return r; } typed_2_value* value(vw::Vector2* v) { typed_2_value* r = new typed_2_value(v); return r; } // 3 values typed_3_value* value(vw::Vector3i* v) { typed_3_value* r = new typed_3_value(v); return r; } typed_3_value* value(vw::Vector3* v) { typed_3_value* r = new typed_3_value(v); return r; } // 4 values typed_4_value* value(vw::BBox2i* v) { typed_4_value* r = new typed_4_value(v); return r; } typed_4_value* value(vw::BBox2* v) { typed_4_value* r = new typed_4_value(v); return r; } // 6 values typed_6_value* value(vw::BBox3* v) { typed_6_value* r = new typed_6_value(v); return r; } // Custom validators which describe how text is turned into values // Validator for Vector2i template <> void validate(boost::any& v, const std::vector& values, vw::Vector2i*, long) { validators::check_first_occurrence(v); // Concatenate and then split again, so that the user can mix // comma and space delimited values. std::string joined = boost::algorithm::join(values, " "); std::vector cvalues; boost::split(cvalues, joined, is_any_of(", "), boost::token_compress_on); if (cvalues.size() != 2) boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter)); try { Vector2i output(boost::lexical_cast(cvalues[0]), boost::lexical_cast(cvalues[1])); v = output; } catch (boost::bad_lexical_cast const& e) { boost::throw_exception(validation_error(validation_error::invalid_option_value)); } } // Validator for Vector2 template <> void validate(boost::any& v, const std::vector& values, vw::Vector2*, long) { validators::check_first_occurrence(v); // Concatenate and then split again, so that the user can mix // comma and space delimited values. std::string joined = boost::algorithm::join(values, " "); std::vector cvalues; boost::split(cvalues, joined, is_any_of(", "), boost::token_compress_on); if (cvalues.size() != 2) boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter)); try { Vector2 output(boost::lexical_cast(cvalues[0]), boost::lexical_cast(cvalues[1])); v = output; } catch (boost::bad_lexical_cast const& e) { boost::throw_exception(validation_error(validation_error::invalid_option_value)); } } // Validator for Vector3i template <> void validate(boost::any& v, const std::vector& values, vw::Vector3i*, long) { validators::check_first_occurrence(v); // Concatenate and then split again, so that the user can mix // comma and space delimited values. std::string joined = boost::algorithm::join(values, " "); std::vector cvalues; boost::split(cvalues, joined, is_any_of(", "), boost::token_compress_on); if (cvalues.size() != 3) boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter)); try { Vector3i output(boost::lexical_cast(cvalues[0]), boost::lexical_cast(cvalues[1]), boost::lexical_cast(cvalues[2])); v = output; } catch (boost::bad_lexical_cast const& e) { boost::throw_exception(validation_error(validation_error::invalid_option_value)); } } // Validator for Vector3 template <> void validate(boost::any& v, const std::vector& values, vw::Vector3*, long) { validators::check_first_occurrence(v); // Concatenate and then split again, so that the user can mix // comma and space delimited values. std::string joined = boost::algorithm::join(values, " "); std::vector cvalues; boost::split(cvalues, joined, is_any_of(", "), boost::token_compress_on); if (cvalues.size() != 3) boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter)); try { Vector3 output(boost::lexical_cast(cvalues[0]), boost::lexical_cast(cvalues[1]), boost::lexical_cast(cvalues[2])); v = output; } catch (boost::bad_lexical_cast const& e) { boost::throw_exception(validation_error(validation_error::invalid_option_value)); } } // Validator for BBox2i template <> void validate(boost::any& v, const std::vector& values, vw::BBox2i*, long) { validators::check_first_occurrence(v); // Concatenate and then split again, so that the user can mix // comma and space delimited values. std::string joined = boost::algorithm::join(values, " "); std::vector cvalues; boost::split(cvalues, joined, is_any_of(", "), boost::token_compress_on); if (cvalues.size() != 4) boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter)); try { BBox2i output(Vector2i(boost::lexical_cast(cvalues[0]), boost::lexical_cast(cvalues[1])), Vector2i(boost::lexical_cast(cvalues[2]), boost::lexical_cast(cvalues[3]))); v = output; } catch (boost::bad_lexical_cast const& e) { boost::throw_exception(validation_error(validation_error::invalid_option_value)); } } // Validator for BBox2 template <> void validate(boost::any& v, const std::vector& values, vw::BBox2*, long) { validators::check_first_occurrence(v); // Concatenate and then split again, so that the user can mix // comma and space delimited values. std::string joined = boost::algorithm::join(values, " "); std::vector cvalues; boost::split(cvalues, joined, is_any_of(", "), boost::token_compress_on); if (cvalues.size() != 4) boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter)); try { BBox2 output(Vector2(boost::lexical_cast(cvalues[0]), boost::lexical_cast(cvalues[1])), Vector2(boost::lexical_cast(cvalues[2]), boost::lexical_cast(cvalues[3]))); v = output; } catch (boost::bad_lexical_cast const& e) { boost::throw_exception(validation_error(validation_error::invalid_option_value)); } } // Validator for BBox3 template <> void validate(boost::any& v, const std::vector& values, vw::BBox3*, long) { validators::check_first_occurrence(v); // Concatenate and then split again, so that the user can mix // comma and space delimited values. std::string joined = boost::algorithm::join(values, " "); std::vector cvalues; boost::split(cvalues, joined, is_any_of(", "), boost::token_compress_on); if (cvalues.size() != 6) boost::throw_exception(invalid_syntax(invalid_syntax::missing_parameter)); try { BBox3 output(Vector3(boost::lexical_cast(cvalues[0]), boost::lexical_cast(cvalues[1]), boost::lexical_cast(cvalues[2])), Vector3(boost::lexical_cast(cvalues[3]), boost::lexical_cast(cvalues[4]), boost::lexical_cast(cvalues[5]))); v = output; } catch (boost::bad_lexical_cast const& e) { boost::throw_exception(validation_error(validation_error::invalid_option_value)); } } }} ================================================ FILE: src/asp/Core/AspProgramOptions.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file AspProgramOptions.h /// #ifndef __ASP_CORE_PROGRAM_OPTIONS_H__ #define __ASP_CORE_PROGRAM_OPTIONS_H__ // These header files must be here as they define a lot of macros // used in many tools, such as ASP_HAVE_PKG_ISIS. #include // must come before asp_config.h, defines VW_BOOST_VERSION #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace vw { struct GdalWriteOptions; } namespace asp { class ASPGlobalOptions; // forward declaration boost::program_options::variables_map check_command_line(int argc, char *argv[], vw::GdalWriteOptions& opt, boost::program_options::options_description const& public_options, boost::program_options::options_description const& all_public_options, boost::program_options::options_description const& positional_options, boost::program_options::positional_options_description const& positional_desc, std::string & usage_comment, bool allow_unregistered, std::vector & unregistered); } // end namespace asp // Custom Boost Program Options validators for VW/ASP types namespace boost { namespace program_options { // Custom value semantics, these explain how many tokens should be ingested. // 2 params template class typed_2_value : public typed_value { public: typed_2_value(T* store_to) : typed_value(store_to) { this->multitoken(); } unsigned min_tokens() const { return 2; } unsigned max_tokens() const { return 2; } }; // 3 params template class typed_3_value : public typed_value { public: typed_3_value(T* store_to) : typed_value(store_to) { this->multitoken(); } unsigned min_tokens() const { return 3; } unsigned max_tokens() const { return 3; } }; // 4 params template class typed_4_value : public typed_value { public: typed_4_value(T* store_to) : typed_value(store_to) { this->multitoken(); } unsigned min_tokens() const { return 4; } unsigned max_tokens() const { return 4; } }; // 6 params template class typed_6_value : public typed_value { public: typed_6_value(T* store_to) : typed_value(store_to) { this->multitoken(); } unsigned min_tokens() const { return 6; } unsigned max_tokens() const { return 6; } }; typed_2_value* value(vw::Vector2i* v); typed_2_value* value(vw::Vector2* v); typed_3_value* value(vw::Vector3i* v); typed_3_value* value(vw::Vector3* v); typed_4_value* value(vw::BBox2i* v); typed_4_value* value(vw::BBox2* v); typed_6_value* value(vw::BBox3* v); // Custom validators which describe how text is turned into a value // 2 params template <> void validate(boost::any& v, const std::vector& values, vw::Vector2i*, long); template <> void validate(boost::any& v, const std::vector& values, vw::Vector2*, long); // 3 params template <> void validate(boost::any& v, const std::vector& values, vw::Vector3i*, long); template <> void validate(boost::any& v, const std::vector& values, vw::Vector3*, long); // 4 params template <> void validate(boost::any& v, const std::vector& values, vw::BBox2i*, long); template <> void validate(boost::any& v, const std::vector& values, vw::BBox2*, long); // 6 params template <> void validate(boost::any& v, const std::vector& values, vw::BBox3*, long); } // end namespace program_options } // end namespace boost #endif//__ASP_CORE_PROGRAM_OPTIONS_H__ ================================================ FILE: src/asp/Core/AspStringUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// Low-level string utilities. // TODO(oalexan1): Move more logic here from Common.cc which is too big. #include #include #include #include #include namespace asp { // Given the string dgmaprpc, extract the parts 'dg' and 'rpc'. void parseCamTypes(std::string const& session_name, // Outputs std::string & tri_cam_type, std::string & mapproj_cam_type) { std::string sep = "map"; std::size_t it = session_name.find(sep); if (it == std::string::npos) vw::vw_throw(vw::ArgumentErr() << "Could not find the string \"" << sep << "\" in the session name: \"" << session_name << "\".\n"); tri_cam_type = session_name.substr(0, it); it += sep.size(); mapproj_cam_type = session_name.substr(it, session_name.size()); } // Given a file having keys like "run:", followed by values, extract // the keys and values in a map from keys to vectors of strings. void parseKeysVals(std::string const& file, std::map> & keys_vals) { std::ifstream ifs(file.c_str()); if (!ifs.good()) vw::vw_throw(vw::ArgumentErr() << "Could not open file: " << file << "\n"); // Wipe the output map keys_vals.clear(); // Read the file line by line std::string line; while (getline(ifs, line)) { boost::trim(line); if (line.empty()) continue; if (line[0] == '#') continue; // Skip comments // Split the line into key and value std::vector parts; boost::split(parts, line, boost::is_any_of(" \t"), boost::token_compress_on); if (parts.empty()) continue; // Add the key and value to the map std::string key = parts[0]; parts.erase(parts.begin()); keys_vals[key] = parts; } } /// Parse 'VAR1=VAL1 VAR2=VAL2' into a map. Note that we append to the map, /// so it may have some items there beforehand. // TODO(oalexan1): This will fail if VAL1 has equal signs. void parse_append_metadata(std::string const& metadata, std::map & keywords) { std::istringstream is(metadata); std::string meta, var, val; while (is >> meta){ // TODO(oalexan1): Replace only first equal, to allow for equal signs in values. boost::replace_all(meta, "=", " "); // replace equal with space std::istringstream is2(meta); if (!(is2 >> var >> val)) vw::vw_throw(vw::ArgumentErr() << "Could not parse: " << meta << "\n"); keywords[var] = val; } } } // end namespace asp ================================================ FILE: src/asp/Core/AspStringUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file AspStringUtils.h /// Low-level string utilities. #ifndef __ASP_CORE_ASP_STRING_UTILS_H__ #define __ASP_CORE_ASP_STRING_UTILS_H__ #include #include #include namespace asp { // Given the string dgmaprpc, extract the parts 'dg' and 'rpc'. void parseCamTypes(std::string const& session_name, // Outputs std::string & tri_cam_type, std::string & mapproj_cam_type); // Given a file having keys like "run:", and values like what follows, extract // the keys and values in a map from keys to vectors of strings. void parseKeysVals(std::string const& file, std::map> & keys_vals); // Parse 'VAR1=VAL1 VAR2=VAL2' into a map. Note that we append to the map, // so it may have some items there beforehand. void parse_append_metadata(std::string const& metadata, std::map & keywords); } // end namespace asp #endif //__ASP_CORE_ASP_STRING_UTILS_H__ ================================================ FILE: src/asp/Core/AsterProc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { namespace { // Internal helper functions for HDF extraction // Find a subdataset by pattern matching in the HDF metadata. std::string findSubdataset(char** subdatasets, std::string const& pattern) { for (int i = 0; subdatasets[i] != NULL; i++) { std::string line(subdatasets[i]); if (line.find("_NAME=") != std::string::npos && line.find(pattern) != std::string::npos) { // Extract the subdataset path after the "=" std::size_t pos = line.find("="); return line.substr(pos + 1); } } return ""; // Not found } // Extract a single ASTER band image from HDF subdatasets to a TIF file. void extractBandImage(char** subdatasets, std::string const& band_name, std::string const& tmp_dir) { // Find the ImageData subdataset for this band std::string search_pattern = band_name + ":ImageData"; std::string band_subdataset = findSubdataset(subdatasets, search_pattern); if (band_subdataset.empty()) vw::vw_throw(vw::ArgumentErr() << "Could not find " << band_name << " in the HDF file.\n"); // Open the subdataset GDALDataset* band_ds = (GDALDataset*)GDALOpen(band_subdataset.c_str(), GA_ReadOnly); if (!band_ds) vw::vw_throw(vw::ArgumentErr() << "Failed to open " << band_name << " subdataset.\n"); // Write to output TIF std::string out_file = tmp_dir + "/AST_L1A_" + band_name + ".ImageData.tif"; vw::vw_out() << "Extracting " << band_name << " to: " << out_file << "\n"; GDALDriver* gtiff_driver = GetGDALDriverManager()->GetDriverByName("GTiff"); GDALDataset* out_ds = gtiff_driver->CreateCopy(out_file.c_str(), band_ds, FALSE, NULL, NULL, NULL); if (!out_ds) vw::vw_throw(vw::ArgumentErr() << "Failed to write " << band_name << " to TIF.\n"); GDALClose(out_ds); GDALClose(band_ds); } // Extract metadata array from HDF subdataset to text file. // Writes 3D arrays as space-separated values per line. void extractMetadataArray(char** subdatasets, std::string const& band_name, std::string const& metadata_type, std::string const& tmp_dir) { // Find the metadata subdataset std::string search_pattern = band_name + ":" + metadata_type; std::string subdataset_path = findSubdataset(subdatasets, search_pattern); if (subdataset_path.empty()) vw::vw_throw(vw::ArgumentErr() << "Could not find " << search_pattern << " in the HDF file.\n"); // Open the subdataset GDALDataset* ds = (GDALDataset*)GDALOpen(subdataset_path.c_str(), GA_ReadOnly); if (!ds) vw::vw_throw(vw::ArgumentErr() << "Failed to open " << search_pattern << " subdataset.\n"); // Get dimensions int cols = ds->GetRasterXSize(); int rows = ds->GetRasterYSize(); int bands = ds->GetRasterCount(); // Read data from all bands std::vector data(rows * cols * bands); for (int band = 1; band <= bands; band++) { GDALRasterBand* raster_band = ds->GetRasterBand(band); CPLErr err = raster_band->RasterIO(GF_Read, 0, 0, cols, rows, data.data() + (band - 1) * rows * cols, cols, rows, GDT_Float64, 0, 0); if (err != CE_None) vw::vw_throw(vw::ArgumentErr() << "Failed to read " << search_pattern << " data.\n"); } GDALClose(ds); // Write to text file std::string out_file = tmp_dir + "/AST_L1A_" + band_name + "." + metadata_type + ".txt"; std::ofstream ofs(out_file); if (!ofs) vw::vw_throw(vw::ArgumentErr() << "Failed to open output file: " << out_file << "\n"); // Set high precision for output ofs << std::setprecision(17); // Handle different array structures: // - If bands == 1 (like SatellitePosition [12x3x1]): rows=time, cols=XYZ // Write: time1: X Y Z \n time2: X Y Z \n ... // - If bands > 1 (like SightVector [11x3x16]): rows=spatial, cols=XYZ, bands=time // Write in time blocks, each with spatial rows of XYZ values if (bands == 1) { // Simple format: each row (time) has all columns (XYZ) on one line for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { int idx = row * cols + col; ofs << data[idx]; if (col < cols - 1) ofs << " "; } ofs << "\n"; } } else { // Complex format: write data grouped by band (time step) // For each time step (band), write all spatial rows with XYZ columns for (int band = 1; band <= bands; band++) { int band_offset = (band - 1) * rows * cols; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { int idx = band_offset + row * cols + col; ofs << data[idx]; if (col < cols - 1) ofs << " "; } ofs << "\n"; } // Add blank line between time steps (except after last one) if (band < bands) ofs << "\n"; } } ofs.close(); } // Compute latitude and longitude for lattice points from orbital geometry. V004 // HDF format does not include Lat/Lon datasets - they must be computed from // SatellitePosition, SatelliteVelocity, and SightVector using ray-ellipsoid // intersection. void computeLatLonLattice(char** subdatasets, std::string const& band_name, std::string const& tmp_dir) { // Find required subdatasets std::string pos_path = findSubdataset(subdatasets, band_name + ":SatellitePosition"); std::string vel_path = findSubdataset(subdatasets, band_name + ":SatelliteVelocity"); std::string sight_vec_path = findSubdataset(subdatasets, band_name + ":SightVector"); if (pos_path.empty() || vel_path.empty() || sight_vec_path.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing required geometry datasets for " << band_name << "\n"); // Open datasets GDALDataset* pos_ds = (GDALDataset*)GDALOpen(pos_path.c_str(), GA_ReadOnly); GDALDataset* vel_ds = (GDALDataset*)GDALOpen(vel_path.c_str(), GA_ReadOnly); GDALDataset* sight_ds = (GDALDataset*)GDALOpen(sight_vec_path.c_str(), GA_ReadOnly); if (!pos_ds || !vel_ds || !sight_ds) vw::vw_throw(vw::ArgumentErr() << "Failed to open geometry subdatasets for " << band_name << "\n"); // Get dimensions // SightVector has shape: RasterCount=time_steps, YSize=lattice_cols, XSize=3 (XYZ) int num_time_steps = sight_ds->GetRasterCount(); int num_lattice_cols = sight_ds->GetRasterYSize(); // Read all data std::vector sat_pos_data(pos_ds->GetRasterXSize() * pos_ds->GetRasterYSize()); std::vector sat_vel_data(vel_ds->GetRasterXSize() * vel_ds->GetRasterYSize()); std::vector sight_vec_data(sight_ds->GetRasterXSize() * sight_ds->GetRasterYSize() * sight_ds->GetRasterCount()); CPLErr err = pos_ds->GetRasterBand(1)->RasterIO(GF_Read, 0, 0, pos_ds->GetRasterXSize(), pos_ds->GetRasterYSize(), sat_pos_data.data(), pos_ds->GetRasterXSize(), pos_ds->GetRasterYSize(), GDT_Float64, 0, 0); if (err != CE_None) vw::vw_throw(vw::IOErr() << "Failed to read satellite position data.\n"); err = vel_ds->GetRasterBand(1)->RasterIO(GF_Read, 0, 0, vel_ds->GetRasterXSize(), vel_ds->GetRasterYSize(), sat_vel_data.data(), vel_ds->GetRasterXSize(), vel_ds->GetRasterYSize(), GDT_Float64, 0, 0); if (err != CE_None) vw::vw_throw(vw::IOErr() << "Failed to read satellite velocity data.\n"); for (int band = 1; band <= num_time_steps; band++) { err = sight_ds->GetRasterBand(band)->RasterIO(GF_Read, 0, 0, 3, num_lattice_cols, sight_vec_data.data() + (band - 1) * num_lattice_cols * 3, 3, num_lattice_cols, GDT_Float64, 0, 0); if (err != CE_None) vw::vw_throw(vw::IOErr() << "Failed to read sight vector data for band " << band << ".\n"); } GDALClose(pos_ds); GDALClose(vel_ds); GDALClose(sight_ds); // Compute lat/lon for each lattice point using WGS84 datum vw::cartography::Datum wgs84; wgs84.set_well_known_datum("WGS84"); std::vector lat_lattice(num_time_steps * num_lattice_cols); std::vector lon_lattice(num_time_steps * num_lattice_cols); // For each time step for (int t = 0; t < num_time_steps; t++) { // Get satellite position and velocity for this time step as vectors vw::Vector3 sat_pos(sat_pos_data[t * 3 + 0], sat_pos_data[t * 3 + 1], sat_pos_data[t * 3 + 2]); vw::Vector3 sat_vel(sat_vel_data[t * 3 + 0], sat_vel_data[t * 3 + 1], sat_vel_data[t * 3 + 2]); // Build orbital frame rotation matrix using VW vector utilities // z_orb = -normalized(sat_pos) [geocentric nadir direction] vw::Vector3 z_orb = -normalize(sat_pos); // orbit_normal = sat_pos x sat_vel vw::Vector3 orbit_normal = cross_prod(sat_pos, sat_vel); // y_orb = -normalized(orbit_normal) [cross-track direction] vw::Vector3 y_orb = -normalize(orbit_normal); // x_orb = y_orb x z_orb [along-track direction] vw::Vector3 x_orb = cross_prod(y_orb, z_orb); // Build rotation matrix R = [x_orb | y_orb | z_orb] vw::Matrix R_orb_to_ecef; select_col(R_orb_to_ecef, 0) = x_orb; select_col(R_orb_to_ecef, 1) = y_orb; select_col(R_orb_to_ecef, 2) = z_orb; // For each lattice column for (int c = 0; c < num_lattice_cols; c++) { // Get sight vector in orbital frame int idx = t * num_lattice_cols * 3 + c * 3; vw::Vector3 sv_orb(sight_vec_data[idx + 0], sight_vec_data[idx + 1], sight_vec_data[idx + 2]); // Check for zero vector if (norm_2(sv_orb) < 1e-10) { lat_lattice[t * num_lattice_cols + c] = 0.0; lon_lattice[t * num_lattice_cols + c] = 0.0; continue; } // Transform sight vector from orbital frame to ECEF vw::Vector3 sv_ecef = R_orb_to_ecef * sv_orb; // Ray-datum intersection using VW's proven implementation vw::Vector3 ground_pt = vw::cartography::datum_intersection(wgs84, sat_pos, sv_ecef); // Check for failed intersection (returns zero vector) if (ground_pt == vw::Vector3()) { lat_lattice[t * num_lattice_cols + c] = 0.0; lon_lattice[t * num_lattice_cols + c] = 0.0; continue; } // Convert ECEF ground point to geocentric lat/lon // NOTE: We intentionally use geocentric (not geodetic) coordinates here // to match the V003 format convention. The conversion from geocentric to // geodetic happens later in aster2asp.cc for both V003 and V004 data, // ensuring consistent downstream processing. double p = std::sqrt(ground_pt.x() * ground_pt.x() + ground_pt.y() * ground_pt.y()); lon_lattice[t * num_lattice_cols + c] = std::atan2(ground_pt.y(), ground_pt.x()) * 180.0 / M_PI; lat_lattice[t * num_lattice_cols + c] = std::atan2(ground_pt.z(), p) * 180.0 / M_PI; } } // Write latitude file std::string lat_file = tmp_dir + "/AST_L1A_" + band_name + ".Latitude.txt"; vw::vw_out() << "Writing: " << lat_file << "\n"; std::ofstream lat_ofs(lat_file); if (!lat_ofs) vw::vw_throw(vw::ArgumentErr() << "Failed to open output file: " << lat_file << "\n"); lat_ofs << std::setprecision(17); for (int t = 0; t < num_time_steps; t++) { for (int c = 0; c < num_lattice_cols; c++) { lat_ofs << lat_lattice[t * num_lattice_cols + c]; if (c < num_lattice_cols - 1) lat_ofs << " "; } lat_ofs << "\n"; } lat_ofs.close(); // Write longitude file std::string lon_file = tmp_dir + "/AST_L1A_" + band_name + ".Longitude.txt"; vw::vw_out() << "Writing: " << lon_file << "\n"; std::ofstream lon_ofs(lon_file); if (!lon_ofs) vw::vw_throw(vw::ArgumentErr() << "Failed to open output file: " << lon_file << "\n"); lon_ofs << std::setprecision(17); for (int t = 0; t < num_time_steps; t++) { for (int c = 0; c < num_lattice_cols; c++) { lon_ofs << lon_lattice[t * num_lattice_cols + c]; if (c < num_lattice_cols - 1) lon_ofs << " "; } lon_ofs << "\n"; } lon_ofs.close(); } // Internal implementation detail for radiometric corrections class RadioCorrectView: public vw::ImageViewBase { vw::DiskImageView m_img; std::vector const &m_corr; bool m_has_nodata; double m_nodata; public: RadioCorrectView(vw::DiskImageView const &img, std::vector const &corr, bool has_nodata, double nodata): m_img(img), m_corr(corr), m_has_nodata(has_nodata), m_nodata(nodata) {} typedef float pixel_type; typedef float result_type; typedef vw::ProceduralPixelAccessor pixel_accessor; inline vw::int32 cols() const { return m_img.cols(); } inline vw::int32 rows() const { return m_img.rows(); } inline vw::int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double /*i*/, double /*j*/, vw::int32 /*p*/ = 0) const { vw::vw_throw(vw::NoImplErr() << "RadioCorrectView::operator()(...) is not implemented"); return pixel_type(); } typedef vw::CropView> prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i const &bbox) const { vw::ImageView input_tile = vw::crop(m_img, bbox); vw::ImageView tile(bbox.width(), bbox.height()); for (std::int64_t col = bbox.min().x(); col < bbox.max().x(); col++) { vw::Vector3 C = m_corr[col]; for (std::int64_t row = bbox.min().y(); row < bbox.max().y(); row++) { float val = input_tile(col - bbox.min().x(), row - bbox.min().y()); if (m_has_nodata && val == m_nodata) tile(col - bbox.min().x(), row - bbox.min().y()) = val; else tile(col - bbox.min().x(), row - bbox.min().y()) = C[1] * val / C[2] + C[0]; } } return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } template inline void rasterize(DestT const &dest, vw::BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // Helper function to create RadioCorrectView RadioCorrectView radioCorrect(vw::DiskImageView const &img, std::vector const &corr, bool has_nodata, double nodata) { return RadioCorrectView(img, corr, has_nodata, nodata); } } // anonymous namespace // Public API functions // Generate a temporary directory for HDF extraction. If the output_prefix has a parent // path (e.g., "run/out"), create "run/tmp". Otherwise, create a unique directory. // Otherwise, if it has no parent path (e.g., just "out"), we must create a // unique directory in the current directory to avoid conflicts when multiple // instances run. std::string genTmpDir(std::string const &output_prefix) { fs::path prefix_path(output_prefix); std::string tmp_dir; if (prefix_path.has_parent_path()) { // output_prefix is like "run/out", make tmp dir "run/tmp" tmp_dir = prefix_path.parent_path().string() + "/tmp"; } else { // output_prefix is just "out", make tmp dir unique like "tmp_aster_12345" // Use process ID to ensure uniqueness tmp_dir = "tmp_aster_" + vw::num_to_str(getpid()); } fs::create_directories(tmp_dir); return tmp_dir; } // Extract data from HDF file to temporary directory. void extractHdfData(std::string const& hdf_file, std::string const& hdfOutDir) { // Open HDF file with GDAL GDALAllRegister(); GDALDataset* hdf_ds = (GDALDataset*)GDALOpen(hdf_file.c_str(), GA_ReadOnly); if (!hdf_ds) vw::vw_throw(vw::ArgumentErr() << "Failed to open HDF file: " << hdf_file << "\n"); // Get subdatasets char** subdatasets = hdf_ds->GetMetadata("SUBDATASETS"); if (!subdatasets) vw::vw_throw(vw::ArgumentErr() << "No subdatasets found in HDF file.\n"); // In the HDF4_EOS format, each VNIR band has its own subdatasets: // VNIR_Band3N:ImageData, VNIR_Band3N:SatellitePosition, etc. // VNIR_Band3B:ImageData, VNIR_Band3B:SatellitePosition, etc. // Extract both band images extractBandImage(subdatasets, "VNIR_Band3N", hdfOutDir); extractBandImage(subdatasets, "VNIR_Band3B", hdfOutDir); // Extract satellite position metadata for both bands extractMetadataArray(subdatasets, "VNIR_Band3N", "SatellitePosition", hdfOutDir); extractMetadataArray(subdatasets, "VNIR_Band3B", "SatellitePosition", hdfOutDir); // Extract sight vector metadata for both bands extractMetadataArray(subdatasets, "VNIR_Band3N", "SightVector", hdfOutDir); extractMetadataArray(subdatasets, "VNIR_Band3B", "SightVector", hdfOutDir); // Extract lattice point metadata for both bands extractMetadataArray(subdatasets, "VNIR_Band3N", "LatticePoint", hdfOutDir); extractMetadataArray(subdatasets, "VNIR_Band3B", "LatticePoint", hdfOutDir); // Extract radiometric correction table for both bands extractMetadataArray(subdatasets, "VNIR_Band3N", "RadiometricCorrTable", hdfOutDir); extractMetadataArray(subdatasets, "VNIR_Band3B", "RadiometricCorrTable", hdfOutDir); // Compute latitude/longitude from orbital geometry // V004 HDF does not include these as subdatasets - they must be computed from // SatellitePosition, SatelliteVelocity, and SightVector computeLatLonLattice(subdatasets, "VNIR_Band3N", hdfOutDir); computeLatLonLattice(subdatasets, "VNIR_Band3B", hdfOutDir); GDALClose(hdf_ds); } // ASTER L1A images come with radiometric corrections appended, but not applied. // There is one correction per image column. void applyRadiometricCorrections(std::string const& input_image, std::string const& corr_table, std::string const& out_image, vw::GdalWriteOptions const& opt) { // Extract the corrections std::vector corr; asp::read_3d_points(corr_table, corr); vw::DiskImageView input_img(input_image); // Sanity check if (input_img.cols() != int(corr.size())) vw::vw_throw(vw::ArgumentErr() << "Expecting as many corrections in " << corr_table << " as image columns in " << input_image << "\n"); // Read nodata value from the image boost::shared_ptr img_rsrc( new vw::DiskImageResourceGDAL(input_image)); bool has_nodata = img_rsrc->has_nodata_read(); double nodata = has_nodata ? img_rsrc->nodata_read() : -std::numeric_limits::max(); // No georef, this being L1A imagery vw::cartography::GeoReference georef; bool has_georef = vw::cartography::read_georeference(georef, input_image); if (has_georef) vw::vw_throw(vw::ArgumentErr() << "ASTER L1A images are not supposed to be georeferenced.\n"); // Apply radiometric corrections and write output vw::vw_out() << "Writing: " << out_image << std::endl; vw::TerminalProgressCallback tpc("asp", "\t-->: "); vw::ImageViewRef corrected_img = radioCorrect(input_img, corr, has_nodata, nodata); vw::cartography::block_write_gdal_image(out_image, corrected_img, has_georef, georef, has_nodata, nodata, opt, tpc); } } // namespace asp ================================================ FILE: src/asp/Core/AsterProc.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file AsterProc.h /// /// Utilities for processing ASTER Level 1A data, including HDF extraction /// and radiometric corrections. See aster2asp for usage and references. #ifndef __ASP_CORE_ASTERPROC_H__ #define __ASP_CORE_ASTERPROC_H__ #include // Forward declarations namespace vw { class GdalWriteOptions; } namespace asp { // Generate a temporary directory for HDF extraction std::string genTmpDir(std::string const& output_prefix); // Extract data from HDF file to temporary directory void extractHdfData(std::string const& hdf_file, std::string const& hdfOutDir); // Apply radiometric corrections to ASTER imagery void applyRadiometricCorrections(std::string const& input_image, std::string const& corr_table, std::string const& out_image, vw::GdalWriteOptions const& opt); } // namespace asp #endif // __ASP_CORE_ASTERPROC_H__ ================================================ FILE: src/asp/Core/BaBaseOptions.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BaBaseOptions.h /// /// Base options structure shared by bundle_adjust, jitter_solve, and rig_calibrator. #ifndef __ASP_CORE_BA_BASE_OPTIONS_H__ #define __ASP_CORE_BA_BASE_OPTIONS_H__ #include #include #include #include #include #include #include #include #include #include namespace asp { // This must be const or else there's a crash const std::string UNSPECIFIED_DATUM = "unspecified_datum"; /// These are the different camera modes that bundle_adjust supports. enum BACameraType {BaCameraType_Pinhole = 0, BaCameraType_OpticalBar = 1, BaCameraType_CSM = 2, BaCameraType_Other = 3}; // Options shared by bundle_adjust, jitter_solve, and rig_calibrator struct BaBaseOptions: public vw::GdalWriteOptions { std::string out_prefix, stereo_session, input_prefix, match_files_prefix, clean_match_files_prefix, heights_from_dem, reference_terrain, mapproj_dem, weight_image, isis_cnet, nvm, nvm_no_shift, output_cnet_type, image_list, camera_list, mapprojected_data_list, fixed_image_list_str, camera_position_uncertainty_str; int overlap_limit, min_matches, max_pairwise_matches, num_iterations, ip_edge_buffer_percent, max_num_reference_points, num_passes; std::set> overlap_list; std::string overlap_list_file, auto_overlap_params, datum_str, proj_str, csv_format_str, csv_srs, csv_proj4_str, disparity_list, stereo_prefix_list; bool have_overlap_list, propagate_errors, match_first_to_last, single_threaded_cameras, update_isis_cubes_with_csm_state, save_adjusted_rpc, fix_gcp_xyz, use_llh_error, save_cnet_as_gcp; double forced_triangulation_distance, min_triangulation_angle, max_triangulation_angle, max_init_reproj_error, robust_threshold, parameter_tolerance; double heights_from_dem_uncertainty, reference_terrain_weight, reference_terrain_uncertainty, reference_terrain_robust_threshold, heights_from_dem_robust_threshold, camera_weight, rotation_weight, camera_position_weight, camera_position_robust_threshold, tri_weight, tri_robust_threshold, camera_position_uncertainty_power, max_disp_error, max_gcp_reproj_err; std::vector camera_position_uncertainty; vw::Vector remove_outliers_params; BACameraType camera_type; std::vector image_files, camera_files, gcp_files; std::vector camera_models; std::map, std::string> match_files; vw::cartography::Datum datum; vw::BBox2 proj_win; // Limit input triangulated points to this projwin double horizontal_stddev; vw::Vector horizontal_stddev_vec; // may come from cameras or user vw::BathyData bathy_data; BaBaseOptions(): forced_triangulation_distance(-1), min_triangulation_angle(0.01), camera_position_weight(0.0), camera_position_robust_threshold(0.0), camera_weight(-1.0), rotation_weight(0.0), tri_weight(0.1), tri_robust_threshold(0.1), robust_threshold(0.5), min_matches(0), num_iterations(0), num_passes(0), overlap_limit(0), have_overlap_list(false), propagate_errors(false), match_first_to_last(false), single_threaded_cameras(false), update_isis_cubes_with_csm_state(false), fix_gcp_xyz(false), use_llh_error(false), save_cnet_as_gcp(false), max_gcp_reproj_err(-1.0), camera_type(BaCameraType_Other), max_num_reference_points(-1), datum(vw::cartography::Datum(asp::UNSPECIFIED_DATUM, "User Specified Spheroid", "Reference Meridian", 1, 1, 0)) {} }; } // namespace asp #endif // __ASP_CORE_BA_BASE_OPTIONS_H__ ================================================ FILE: src/asp/Core/BaseCameraUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { using namespace vw; // Convert dir1/image1.cub or dir1/image1.xml to out-prefix-image1.adjust std::string bundle_adjust_file_name(std::string const& prefix, std::string const& input_img, std::string const& input_cam) { // Create the adjusted camera file name from the original camera filename, // unless it is empty, and then use the image file name. std::string file = input_cam; if (file == "") file = input_img; // Find the basename using boost file = fs::path(file).filename().string(); // Find the last dot in the file name. If not found, set it to the length of // the string. size_t dot = file.rfind("."); if (dot == std::string::npos) dot = file.size(); // Find the substring until the dot file = file.substr(0, dot); return prefix + "-" + file + ".adjust"; } // If we have adjusted camera models, load them. The adjustment may be in the // rotation matrix, camera center, or pixel offset. Otherwise return unadjusted // cameras. vw::CamPtr load_adjusted_model(vw::CamPtr cam, std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 const& pixel_offset) { // Any tool using adjusted camera models must pre-populate the // prefix at which to find them. if (ba_prefix == "" && pixel_offset == vw::Vector2()) return cam; // Return the unadjusted cameras if there is no adjustment Vector3 position_correction; Quat pose_correction; // These must start initialized. Note that we may have a pixel // offset passed in from outside, or a pixel offset and scale // that we read from an adjust file. We will throw an error // below if both scenarios happen. Vector2 local_pixel_offset = pixel_offset; double local_scale = 1.0; // Ensure these vectors are populated even when there are no corrections to read, // as we may still have pixel offset. position_correction = Vector3(); pose_correction = Quat(math::identity_matrix<3>()); if (ba_prefix != "") { // If a bundle adjustment file was specified // Get full BA file path std::string adjust_file = asp::bundle_adjust_file_name(ba_prefix, image_file, camera_file); // This is a fix for when what is passed in is a mapprojected image. Need to // peek and find the raw image and camera file names in the provided image // geoheader. if (!boost::filesystem::exists(adjust_file)) { std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key; std::string adj_prefix_raw, image_file_raw, cam_type, cam_file_raw, dem_file; asp::read_mapproj_header(image_file, adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key, adj_prefix_raw, image_file_raw, cam_type, cam_file_raw, dem_file); if (image_file_raw != "") adjust_file = asp::bundle_adjust_file_name(ba_prefix, image_file_raw, cam_file_raw); } if (!boost::filesystem::exists(adjust_file)) vw_throw(InputErr() << "Missing adjusted camera model: " << adjust_file << ".\n"); vw_out() << "Using adjusted camera model: " << adjust_file << std::endl; asp::read_adjustments(adjust_file, position_correction, pose_correction, local_pixel_offset, local_scale); // these will change if (local_pixel_offset != Vector2() || local_scale != 1.0) { // We read a custom scale and pixel offset passed by the user. But then // the pixel offset passed in by the caller is not valid. Instead of // sorting things out simply refuse to allow this scenario. if (pixel_offset != Vector2()) { vw_throw(InputErr() << "Cannot use crop win functionality with custom " << "scale and pixel offset in .adjust files.\n"); } }else{ // In this case we have local_pixel_offset == (0, 0) local_scale == 1.0. // So use the pixel_offset passed in by the caller. Scale will stay at 1.0. local_pixel_offset = pixel_offset; } } // End case for parsing bundle adjustment file // Create the adjusted camera model object with the info we loaded return vw::CamPtr (new vw::camera::AdjustedCameraModel(cam, position_correction, pose_correction, local_pixel_offset, local_scale)); } // Read adjustments // TODO(oalexan1): Integrate with the VW function for that void read_adjustments(std::string const& filename, vw::Vector3 & position_correction, Quat & pose_correction, Vector2 & pixel_offset, double & scale) { // Initialize the outputs pixel_offset = Vector2(); scale = 1.0; Vector3 pos; Vector4 q_buf; std::ifstream istr(filename.c_str()); // Read the adjustments if (!(istr >> pos[0] >> pos[1] >> pos[2] >> q_buf[0] >> q_buf[1] >> q_buf[2] >> q_buf[3])) vw::vw_throw(vw::ArgumentErr() << "Failed to read adjustments from: " << filename << ".\n"); // The adjustments may have an offset and a scale double a, b, c; if (istr >> a >> b >> c){ pixel_offset = Vector2(a, b); scale = c; } position_correction = pos; pose_correction = Quat(q_buf); } void write_adjustments(std::string const& filename, Vector3 const& position_correction, Quat const& pose_correction) { std::ofstream ostr(filename.c_str()); ostr.precision(17); ostr << position_correction[0] << " " << position_correction[1] << " " << position_correction[2] << "\n"; ostr << pose_correction.w() << " " << pose_correction.x() << " " << pose_correction.y() << " " << pose_correction.z() << " " << "\n"; ostr.close(); } // Return the camera pixel offset, if having --left-image-crop-win and same for right. vw::Vector2 camera_pixel_offset(bool isMapProjected, std::string const& left_image_file, std::string const& right_image_file, std::string const& curr_image_file) { // For map-projected images we don't apply a pixel offset. // When we need to do stereo on cropped images, we just // crop the images together with their georeferences. if (isMapProjected) return Vector2(0, 0); bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); if (!crop_left && !crop_right) return Vector2(0, 0); // No offset needed vw::Vector2 left_pixel_offset(0, 0), right_pixel_offset(0, 0); if (crop_left) left_pixel_offset = stereo_settings().left_image_crop_win.min(); if (crop_right) right_pixel_offset = stereo_settings().right_image_crop_win.min(); if (curr_image_file == left_image_file) return left_pixel_offset; else if (curr_image_file == right_image_file) return right_pixel_offset; else // If the image files were not specified, no offset and no error. if ((left_image_file != "") || (right_image_file != "")) vw_throw(ArgumentErr() << "Supplied image file does not match left or right image file."); return Vector2(0, 0); } } //end namespace asp ================================================ FILE: src/asp/Core/BaseCameraUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Low-level camera utilities #ifndef __CORE_BASE_CAMERA_UTILS_H__ #define __CORE_BASE_CAMERA_UTILS_H__ #include namespace asp { // Create the adjusted camera file name from the original camera filename, // unless it is empty, and then use the image file name. // - Convert dir1/image1.cub to out-prefix-image1.adjust std::string bundle_adjust_file_name(std::string const& prefix, std::string const& input_img, std::string const& input_cam); // Read an .adjust file void read_adjustments(std::string const& filename, vw::Vector3 & position_correction, vw::Quat & pose_correction, vw::Vector2 & pixel_offset, double & scale); /// Write global adjustments // TODO(oalexan1): This should be unified with analogous logic in VW void write_adjustments(std::string const& filename, vw::Vector3 const& position_correction, vw::Quat const& pose_correction); // If we have adjusted camera models, load them. The adjustment may be in the // rotation matrix, camera center, or pixel offset. Otherwise return unadjusted // cameras. vw::CamPtr load_adjusted_model(vw::CamPtr cam, std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 const& pixel_offset); // If both left-image-crop-win and right-image-crop win are specified, // we crop the images to these boxes, and hence the need to keep // the upper-left corners of the crop windows to handle the cameras correctly. vw::Vector2 camera_pixel_offset(bool isMapProjected, std::string const& left_image_file, std::string const& right_image_file, std::string const& curr_image_file); } //end namespace asp #endif//__CORE_BASE_CAMERA_UTILS_H__ ================================================ FILE: src/asp/Core/BathyPlaneCalc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // Given a set of polygons stored in dPoly, create a single polygon with all those vertices void formSinglePoly(vw::geometry::dPoly const& inPoly, vw::geometry::dPoly & outPoly) { int num_pts = inPoly.get_totalNumVerts(); const double * xv = inPoly.get_xv(); const double * yv = inPoly.get_yv(); bool isPolyClosed = true; std::string layer = ""; std::string poly_color = "green"; outPoly.setPolygon(num_pts, xv, yv, isPolyClosed, poly_color, layer); } // Add a polygon made up of just one point to given set of polygons. // Later that set will be saved as a shapefile made up of points. void addPointToPoly(vw::geometry::dPoly & poly, vw::Vector2 const& p) { std::vector vx, vy; vx.push_back(p.x()); vy.push_back(p.y()); bool isPolyClosed = true; std::string poly_color = "green"; std::string layer = ""; poly.appendPolygon(vx.size(), vw::geometry::vecPtr(vx), vw::geometry::vecPtr(vy), isPolyClosed, poly_color, layer); } // Add a point to the ecef_vec, llh_vec, and shape_xy_vec if it is valid void addPoint(vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& interp_dem, vw::Vector2 const& lonlat, vw::Vector2 const& shape_xy, // Append std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec) { // Convert to DEM pixel vw::Vector2 pix = dem_georef.lonlat_to_pixel(lonlat); if (!vw::bounding_box(interp_dem).contains(pix)) return; vw::PixelMask h = interp_dem(pix.x(), pix.y()); if (!is_valid(h)) return; vw::Vector3 llh; llh[0] = lonlat[0]; llh[1] = lonlat[1]; llh[2] = h.child(); vw::Vector3 ecef = dem_georef.datum().geodetic_to_cartesian(llh); Eigen::Vector3d eigen_ecef; for (size_t coord = 0; coord < 3; coord++) eigen_ecef[coord] = ecef[coord]; ecef_vec.push_back(eigen_ecef); shape_xy_vec.push_back(shape_xy); llh_vec.push_back(llh); } // Estimate the projection and convert llh_vec to projected coordinates void find_projection(// Inputs vw::cartography::GeoReference const& dem_georef, std::vector const& llh_vec, // Outputs double & proj_lat, double & proj_lon, vw::cartography::GeoReference & stereographic_georef, std::vector & proj_vec) { // Must have positive number of points if (llh_vec.size() == 0) vw::vw_throw(vw::ArgumentErr() << "Cannot find projection with zero input points.\n"); // Initialize the outputs proj_lat = -1.0; proj_lon = -1.0; proj_vec.clear(); // Find the mean water height vw::Vector3 mean_llh; for (size_t it = 0; it < llh_vec.size(); it++) mean_llh += llh_vec[it]; mean_llh /= llh_vec.size(); stereographic_georef.set_datum(dem_georef.datum()); double scale = 1.0; proj_lat = mean_llh[1]; proj_lon = mean_llh[0]; stereographic_georef.set_stereographic(proj_lat, proj_lon, scale); // Convert the points to projected coordinates with this georeference for (size_t it = 0; it < llh_vec.size(); it++) { vw::Vector3 point = stereographic_georef.geodetic_to_point(llh_vec[it]); Eigen::Vector3d eigen_point; for (size_t coord = 0; coord < 3; coord++) eigen_point[coord] = point[coord]; proj_vec.push_back(eigen_point); } } // A function that will find the mean of a std::vector mid_pts vw::Vector2 meanOfPoints(std::vector const& points) { // Check that must have at least one input if (points.size() == 0) vw::vw_throw(vw::ArgumentErr() << "Cannot find mean of zero input points.\n"); vw::Vector2 mean_point(0.0, 0.0); for (size_t it = 0; it < points.size(); it++) mean_point += points[it]; mean_point /= points.size(); return mean_point; } // Attempts to find the sub-pixel boundary interface for a specific pixel. // Returns true if a boundary point was calculated, false otherwise. bool calcSubpixBdPoint(vw::ImageViewRef const& mask, float mask_thresh, int col, int row, vw::Vector2 & pix) { std::vector mid_pts; // The four neighbors const int col_vals[4] = {-1, 0, 0, 1}; const int row_vals[4] = {0, -1, 1, 0}; for (int it = 0; it < 4; it++) { int icol = col + col_vals[it]; int irow = row + row_vals[it]; // Check image bounds if (icol < 0 || irow < 0 || icol >= mask.cols() || irow >= mask.rows()) continue; // Check if neighbor is on the other side of threshold if (mask(icol, irow) <= mask_thresh) mid_pts.push_back(vw::Vector2(0.5 * (col + icol), 0.5 * (row + irow))); } if (mid_pts.empty()) return false; pix = meanOfPoints(mid_pts); return true; } // This is not used for now, it could be used to make the logic // of processing mask boundary points multi-threaded. class MaskBoundaryTask: public vw::Task, private boost::noncopyable { vw::BBox2i m_bbox; // Region of image we're working in vw::ImageViewRef m_mask; float m_mask_nodata_val; vw::CamPtr m_camera_model; vw::cartography::GeoReference m_shape_georef; vw::cartography::GeoReference m_dem_georef; vw::ImageViewRef> m_masked_dem; // Note how all of these are aliases vw::Mutex & m_mutex; std::vector & m_ecef_vec; std::vector & m_llh_vec; std::vector & m_shape_xy_vec; public: MaskBoundaryTask(vw::BBox2i bbox, vw::ImageViewRef mask, float mask_nodata_val, vw::CamPtr camera_model, vw::cartography::GeoReference const & shape_georef, vw::cartography::GeoReference const & dem_georef, vw::ImageViewRef> masked_dem, vw::Mutex & mutex, std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec): m_bbox(bbox), m_mask(mask), m_mask_nodata_val(mask_nodata_val), m_camera_model(camera_model), m_shape_georef(shape_georef), m_dem_georef(dem_georef), m_masked_dem(masked_dem), m_mutex(mutex), m_ecef_vec(ecef_vec), m_llh_vec(llh_vec), m_shape_xy_vec(shape_xy_vec) {} void operator()() { // Grow the box by 1 pixel as we need to look at the immediate neighbors vw::BBox2i extra_box = m_bbox; extra_box.expand(1); extra_box.crop(vw::bounding_box(m_mask)); // Make a local copy of the tile vw::ImageView mask_tile = vw::crop(m_mask, extra_box); for (int col = 0; col < mask_tile.cols(); col++) { for (int row = 0; row < mask_tile.rows(); row++) { // Look at pixels above threshold which have neighbors <= threshold if (mask_tile(col, row) <= m_mask_nodata_val) continue; // Estimate the sub-pixel boundary point vw::Vector2 local_pix; if (!calcSubpixBdPoint(mask_tile, m_mask_nodata_val, col, row, local_pix)) continue; // Create the pixel in the full image coordinates vw::Vector2 pix = local_pix + extra_box.min(); // Only work on pixels in the current box (earlier had a // bigger box to be able to examine neighbors). if (!m_bbox.contains(pix)) continue; // The ray going to the ground // Here we assume that the camera model is thread-safe, which is // true for all cameras except ISIS, and this code will be used // on Earth only. vw::Vector3 cam_ctr = m_camera_model->camera_center(pix); vw::Vector3 cam_dir = m_camera_model->pixel_to_vector(pix); // Intersect the ray going from the given camera pixel with a DEM. bool treat_nodata_as_zero = false; bool has_intersection = false; double height_error_tol = 0.001; // in meters double max_abs_tol = 1e-14; double max_rel_tol = 1e-14; int num_max_iter = 100; vw::Vector3 xyz_guess(0, 0, 0); vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz (cam_ctr, cam_dir, m_masked_dem, m_dem_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); if (!has_intersection) continue; vw::Vector3 llh = m_dem_georef.datum().cartesian_to_geodetic(xyz); Eigen::Vector3d eigen_xyz; for (size_t coord = 0; coord < 3; coord++) eigen_xyz[coord] = xyz[coord]; // TODO(oalexan1): This is fragile due to the 360 degree // uncertainty in latitude vw::Vector2 shape_xy = m_shape_georef.lonlat_to_point(vw::Vector2(llh[0], llh[1])); { // Need to make sure to lock the shared resource vw::Mutex::Lock lock(m_mutex); m_ecef_vec.push_back(eigen_xyz); m_shape_xy_vec.push_back(shape_xy); m_llh_vec.push_back(llh); } } } } }; // Sample the mask boundary (points where the points in the mask have neighbors // not in the mask), shoot points from there onto the DEM, and return the // obtained points. void sampleMaskBd(vw::ImageViewRef mask, float mask_nodata_val, vw::CamPtr camera_model, vw::cartography::GeoReference const& shape_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> masked_dem, int num_samples, std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec) { // num_samples must be positive if (num_samples <= 0) vw::vw_throw(vw::ArgumentErr() << "The value of --num-samples must be positive.\n"); // We assume the WGS_1984 datum in the shape. For the DEM we checked already. if (shape_georef.datum().name() != "WGS_1984") vw::vw_throw(vw::ArgumentErr() << "The input shape must be relative to the " << "WGS_1984 datum.\n" << "Got: " << dem_georef.datum().name() << ".\n"); // Ensure that the outputs are initialized ecef_vec.clear(); llh_vec.clear(); shape_xy_vec.clear(); #if 0 // For some reason parallel processing is slower than serial processing. // Likely it is because the DEM is shared. Need extra heuristics to cut // that one as appropriate for each task. // TODO(oalexan1): Must review now that the lock issue got fixed // Subdivide the box for parallel processing int block_size = vw::vw_settings().default_tile_size(); FifoWorkQueue queue(vw_settings().default_num_threads()); std::vector bboxes = subdivide_bbox(mask, block_size, block_size); for (size_t it = 0; it < bboxes.size(); it++) { std::cout << "Box is " << bboxes[it] << "\n"; } Mutex mutex; for (size_t it = 0; it < bboxes.size(); it++) { boost::shared_ptr task(new MaskBoundaryTask(bboxes[it], mask, mask_nodata_val, camera_model, shape_georef, dem_georef, masked_dem, mutex, ecef_vec, llh_vec, shape_xy_vec)); queue.add_task(task); } queue.join_all(); #else // Let the mask boundary be the mask pixels whose value is above threshold and // which border pixels whose values is not above threshold. vw::vw_out() << "Processing points at mask boundary.\n"; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / mask.cols(); tpc.report_progress(0); for (int col = 0; col < mask.cols(); col++) { for (int row = 0; row < mask.rows(); row++) { // Look at pixels above threshold which have neighbors <= threshold if (mask(col, row) <= mask_nodata_val) continue; // Estimate the location of the interface vw::Vector2 pix; if (!calcSubpixBdPoint(mask, mask_nodata_val, col, row, pix)) continue; // The ray going to the ground vw::Vector3 cam_ctr = camera_model->camera_center(pix); vw::Vector3 cam_dir = camera_model->pixel_to_vector(pix); // Intersect the ray going from the given camera pixel with a DEM. bool treat_nodata_as_zero = false; bool has_intersection = false; double height_error_tol = 0.001; // in meters double max_abs_tol = 1e-14; double max_rel_tol = 1e-14; int num_max_iter = 100; vw::Vector3 xyz_guess(0, 0, 0); vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz (cam_ctr, cam_dir, masked_dem, dem_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); if (!has_intersection) continue; vw::Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz); Eigen::Vector3d eigen_xyz; for (size_t coord = 0; coord < 3; coord++) eigen_xyz[coord] = xyz[coord]; vw::Vector2 shape_xy = shape_georef.lonlat_to_point(vw::Vector2(llh[0], llh[1])); ecef_vec.push_back(eigen_xyz); shape_xy_vec.push_back(shape_xy); llh_vec.push_back(llh); } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); #endif int num_pts = ecef_vec.size(); if (num_pts > num_samples) { vw::vw_out() << "Found " << num_pts << " samples at mask boundary, points but only " << num_samples << " samples are desired. Picking a random subset " << "of this size.\n"; // Select a subset std::vector w; vw::math::pick_random_indices_in_range(num_pts, num_samples, w); std::vector big_ecef_vec = ecef_vec; ecef_vec.clear(); std::vector big_llh_vec = llh_vec; llh_vec.clear(); std::vector big_shape_xy_vec = shape_xy_vec; shape_xy_vec.clear(); for (size_t it = 0; it < w.size(); it++) { int random_index = w[it]; ecef_vec.push_back(big_ecef_vec[random_index]); llh_vec.push_back(big_llh_vec[random_index]); shape_xy_vec.push_back(big_shape_xy_vec[random_index]); } } return; } // Find the mask boundary (points where the points in the mask have // neighbors not in the mask), and look up the height in the DEM. void sampleOrthoMaskBd(std::string const& mask_file, vw::cartography::GeoReference const& mask_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> interp_dem, int num_samples, std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec) { // We assume the WGS_1984 datum in the mask. For the DEM we checked already. if (mask_georef.datum().name() != "WGS_1984") vw::vw_throw(vw::ArgumentErr() << "The input mask must be relative to the " << "WGS_1984 datum.\n" << "Got: " << dem_georef.datum().name() << ".\n"); // Use read_bathy_mask() which invalidates both nodata and non-positive // pixels. Then apply_mask() converts to a plain float image with 0 for // water, so the existing threshold logic works with threshold = 0. vw::vw_out() << "Reading the ortho mask: " << mask_file << "\n"; float mask_thresh = 0.0f; { float file_nodata = -std::numeric_limits::max(); if (vw::read_nodata_val(mask_file, file_nodata)) vw::vw_out() << "Read ortho mask nodata value: " << file_nodata << ".\n"; } auto masked_mask = vw::read_bathy_mask(mask_file, mask_thresh); auto mask = vw::apply_mask(masked_mask, 0.0f); mask_thresh = 0.0f; vw::vw_out() << "Non-positive or nodata pixels are classified as water.\n"; // num_samples must be positive if (num_samples <= 0) vw::vw_throw(vw::ArgumentErr() << "The value of --num-samples must be positive.\n"); // Ensure that the outputs are initialized ecef_vec.clear(); llh_vec.clear(); shape_xy_vec.clear(); vw::vw_out() << "Processing points at ortho mask boundary.\n"; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / mask.cols(); tpc.report_progress(0); for (int col = 0; col < mask.cols(); col++) { for (int row = 0; row < mask.rows(); row++) { // Look at pixels above threshold which have neighbors <= threshold if (mask(col, row) <= mask_thresh) continue; // Estimate the location of the interface vw::Vector2 pix; if (!calcSubpixBdPoint(mask, mask_thresh, col, row, pix)) continue; vw::Vector2 shape_xy = mask_georef.pixel_to_point(pix); vw::Vector2 lonlat = mask_georef.point_to_lonlat(shape_xy); addPoint(dem_georef, interp_dem, lonlat, shape_xy, ecef_vec, llh_vec, shape_xy_vec); } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); int num_pts = ecef_vec.size(); if (num_pts > num_samples) { vw::vw_out() << "Found " << num_pts << " samples at mask boundary, points but only " << num_samples << " samples are desired. Picking a random subset " << "of this size.\n"; // Select a subset std::vector w; vw::math::pick_random_indices_in_range(num_pts, num_samples, w); std::vector big_ecef_vec = ecef_vec; ecef_vec.clear(); std::vector big_llh_vec = llh_vec; llh_vec.clear(); std::vector big_shape_xy_vec = shape_xy_vec; shape_xy_vec.clear(); for (size_t it = 0; it < w.size(); it++) { int random_index = w[it]; ecef_vec.push_back(big_ecef_vec[random_index]); llh_vec.push_back(big_llh_vec[random_index]); shape_xy_vec.push_back(big_shape_xy_vec[random_index]); } } return; } // Compute the 3D locations at the shape corners based on interpolating // into the DEM and converting to ECEF and to local projected // stereographic coordinates. // Compute the stereographic georeference with the projection center // being the mean lon and lat, and make the 3D locations in reference // to this projection. void find_points_at_shape_corners(std::vector const& polyVec, vw::cartography::GeoReference const& shape_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> interp_dem, std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec) { // Ensure that the outputs are initialized ecef_vec.clear(); llh_vec.clear(); shape_xy_vec.clear(); int total_num_pts = 0; for (size_t p = 0; p < polyVec.size(); p++) { vw::geometry::dPoly const& poly = polyVec[p]; const double * xv = poly.get_xv(); const double * yv = poly.get_yv(); const int * numVerts = poly.get_numVerts(); int numPolys = poly.get_numPolys(); int start = 0; for (int pIter = 0; pIter < numPolys; pIter++) { if (pIter > 0) start += numVerts[pIter - 1]; int numV = numVerts[pIter]; for (int vIter = 0; vIter < numV; vIter++) { total_num_pts++; vw::Vector2 shape_xy(xv[start + vIter], yv[start + vIter]); // Convert from projected coordinates to lonlat vw::Vector2 lonlat = shape_georef.point_to_lonlat(shape_xy); addPoint(dem_georef, interp_dem, lonlat, shape_xy, ecef_vec, llh_vec, shape_xy_vec); } } } vw::vw_out() << "Read " << total_num_pts << " vertices, with " << llh_vec.size() << " of them having a valid DEM height value." << "\n"; } // Read a set of measurements in CSV format, to use later to fit the water surface void find_points_from_meas_csv(std::string const& water_height_measurements, std::string const& csv_format_str, vw::cartography::GeoReference const& shape_georef, // Outputs std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec) { // Wipe the outputs ecef_vec.clear(); llh_vec.clear(); shape_xy_vec.clear(); // Read the CSV file asp::CsvConv csv_conv; std::string csv_srs = ""; // not needed try { csv_conv.parse_csv_format(csv_format_str, csv_srs); } catch (...) { // Give a more specific error message vw::vw_throw(vw::ArgumentErr() << "Could not parse --csv-format. Was given: " << csv_format_str << ".\n"); } std::list pos_records; csv_conv.read_csv_file(water_height_measurements, pos_records); // Create llh and vertices for (auto iter = pos_records.begin(); iter != pos_records.end(); iter++) { vw::Vector3 llh = csv_conv.csv_to_geodetic(*iter, shape_georef); llh_vec.push_back(llh); vw::Vector2 shape_xy = shape_georef.lonlat_to_point(vw::Vector2(llh[0], llh[1])); shape_xy_vec.push_back(shape_xy); vw::Vector3 ecef = shape_georef.datum().geodetic_to_cartesian(llh); Eigen::Vector3d eigen_ecef; for (size_t coord = 0; coord < 3; coord++) eigen_ecef[coord] = ecef[coord]; ecef_vec.push_back(eigen_ecef); } return; } // Read a set of lon-lat measurements in CSV format, then interpolate into the DEM // with bilinear interpolation to find the height. void find_points_from_lon_lat_csv(std::string const& lon_lat_measurements, std::string const& csv_format_str, vw::cartography::GeoReference const& shape_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> interp_dem, // Outputs std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec) { // Wipe the outputs ecef_vec.clear(); llh_vec.clear(); shape_xy_vec.clear(); // Read the CSV file asp::CsvConv csv_conv; std::string csv_srs = ""; // not needed try { int min_num_fields = 2; // only lon and lat are needed csv_conv.parse_csv_format(csv_format_str, csv_srs, min_num_fields); } catch (...) { // Give a more specific error message vw::vw_throw(vw::ArgumentErr() << "Could not parse --csv-format. Was given: " << csv_format_str << ".\n"); } std::list pos_records; csv_conv.read_csv_file(lon_lat_measurements, pos_records); // Create llh and vertices int total_num_pts = 0; for (auto iter = pos_records.begin(); iter != pos_records.end(); iter++) { total_num_pts++; vw::Vector2 lonlat = csv_conv.csv_to_lonlat(*iter, shape_georef); vw::Vector2 shape_xy = shape_georef.lonlat_to_point(lonlat); addPoint(dem_georef, interp_dem, lonlat, shape_xy, ecef_vec, llh_vec, shape_xy_vec); } vw::vw_out() << "Read " << total_num_pts << " vertices from CSV, with " << llh_vec.size() << " of them having a valid DEM height value." << "\n"; return; } // Save the points as a shapefile void saveShape(std::vector const& ecef_vec, std::string const& mask_boundary_shapefile) { vw::cartography::GeoReference llh_georef; // create a new explicit longlat WGS84 georef llh_georef.set_geographic(); vw::cartography::Datum datum("WGS_1984"); llh_georef.set_datum(datum); vw::geometry::dPoly samplePoly; for (size_t ptIter = 0; ptIter < ecef_vec.size(); ptIter++) { vw::Vector3 xyz; // convert Eigen:Vector3 to vw::Vector3 for (int c = 0; c < 3; c++) xyz[c] = ecef_vec[ptIter][c]; vw::Vector3 llh = llh_georef.datum().cartesian_to_geodetic(xyz); addPointToPoly(samplePoly, vw::math::subvector(llh, 0, 2)); } std::vector samplePolyVec; samplePolyVec.push_back(samplePoly); vw::vw_out() << "Writing shapefile of samples at mask boundary: " << mask_boundary_shapefile << "\n"; bool has_llh_georef = true; vw::geometry::write_shapefile(mask_boundary_shapefile, has_llh_georef, llh_georef, samplePolyVec); } // Best fit plane without outlier removal. The input points are in 3D coordinates. // In practice the points are in a local projected coordinate system, but the // math works without this assumption. std::pair best_plane_from_points(const std::vector & c) { // Copy coordinates to a matrix in Eigen format size_t num_points = c.size(); Eigen::Matrix coord(3, num_points); for (size_t i = 0; i < num_points; i++) coord.col(i) = c[i]; // calculate centroid Eigen::Vector3d centroid(coord.row(0).mean(), coord.row(1).mean(), coord.row(2).mean()); // subtract centroid for (size_t i = 0; i < 3; i++) coord.row(i).array() -= centroid(i); // We only need the left-singular matrix here // http://math.stackexchange.com/questions/99299/best-fitting-plane-given-a-set-of-points auto svd = coord.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV); Eigen::Vector3d plane_normal = svd.matrixU().rightCols<1>(); return std::make_pair(centroid, plane_normal); } // A functor which returns the best fit plane a*x + b*y + c*z + d = 0 // as the vector (a, b, c, d) with a*a + b*b + c*c = 1 to be used // with RANSAC to remove outliers. struct BestFitPlaneFunctor { BestFitPlaneFunctor() {} typedef vw::Matrix result_type; /// A best fit plane requires pairs of data points to make a fit. template size_t min_elements_needed_for_fit(ContainerT const& /*example*/) const { return 3; } /// This function can match points in any container that supports /// the size() and operator[] methods. The container is usually a /// vw::Vector<>, but you could substitute other classes here as /// well. template vw::Matrix operator()(std::vector const& p1, std::vector const& p2, vw::Matrix const& /*seed_input*/ = vw::Matrix()) const { // check consistency VW_ASSERT(p1.size() == p2.size(), vw::ArgumentErr() << "Cannot compute best fit plane. " << "p1 and p2 are not the same size."); VW_ASSERT(!p1.empty() && p1.size() >= min_elements_needed_for_fit(p1[0]), vw::ArgumentErr() << "Cannot compute best fit plane. " << "Insufficient data.\n"); std::pair plane = best_plane_from_points(p1); Eigen::Vector3d & centroid = plane.first; Eigen::Vector3d & normal = plane.second; vw::Matrix result(1, 4); for (int col = 0; col < 3; col++) result(0, col) = normal[col]; result(0, 3) = -normal.dot(centroid); // Make the z coefficient positive, which will make the normal // point "up" in the projected coordinate system. if (result(0, 2) < 0) { for (int col = 0; col < 4; col++) result(0, col) *= -1.0; } return result; } }; // Given a 1x4 matrix named 'plane', with values (a, b, c, d), // determining the plane a * x + b * y + c * z + d = 0, find the // distance to this plane from a given point. template double dist_to_plane(vw::Matrix const& plane, Vec3 const& point) { double ans = 0.0; for (unsigned col = 0; col < 3; col++) { ans += plane(0, col) * point[col]; } ans += plane(0, 3); return std::abs(ans); } // The value p2 is needed by the interface but we don't use it struct BestFitPlaneErrorMetric { template double operator()(RelationT const& plane, ContainerT const& p1, ContainerT const& p2) const { return dist_to_plane(plane, p1); } }; // Calculate a few properties of the plane fitted to the given points and print them out void calcPlaneProperties(std::vector const& proj_vec, std::vector const& inlier_indices, vw::cartography::GeoReference & dem_georef, vw::Matrix const& plane) { double max_error = - 1.0, max_inlier_error = -1.0; for (size_t it = 0; it < proj_vec.size(); it++) max_error = std::max(max_error, dist_to_plane(plane, proj_vec[it])); // Do estimates for the mean height and angle of the plane vw::Vector3 mean_point(0, 0, 0); double mean_height = 0.0; int num = 0; for (size_t it = 0; it < inlier_indices.size(); it++) { Eigen::Vector3d p = proj_vec[inlier_indices[it]]; vw::Vector3 point(p[0], p[1], p[2]); max_inlier_error = std::max(max_inlier_error, dist_to_plane(plane, point)); // the point is in the stereographic projection mean_height += point[2]; num++; } mean_height /= num; vw::vw_out() << "Max distance to the plane (meters): " << max_error << "\n"; vw::vw_out() << "Max inlier distance to the plane (meters): " << max_inlier_error << "\n"; vw::vw_out() << "Mean plane height above datum (meters): " << mean_height << "\n"; } // Save the bathy plane and the projection parameters if needed void saveBathyPlane(double proj_lat, double proj_lon, vw::Matrix const& plane, std::string const& plane_file) { vw::vw_out() << "Writing: " << plane_file << "\n"; vw::create_out_dir(plane_file); std::ofstream bp(plane_file.c_str()); bp.precision(17); for (int col = 0; col < plane.cols(); col++) { bp << plane(0, col); if (col < plane.cols() - 1) bp << " "; else bp << "\n"; } bp << "# Latitude and longitude of the local stereographic projection with the WGS_1984 datum:\n"; bp << proj_lat << " " << proj_lon << "\n"; bp.close(); } // Given a DEM surface and a planar surface (with potentially some // inclination) subtract from each DEM height the height at that // plane. The height of the plane is obtained by considering the // current DEM grid point, and another point at same lon-lat but with // a height 100 meters less, converting these to the given projection, // tracing a ray through them, seeing where it intersects the plane, // converting that point to geodetic, and taking the height difference. class DemMinusPlaneView: public vw::ImageViewBase{ vw::ImageViewRef m_dem; vw::cartography::GeoReference m_dem_georef; vw::Matrix m_plane; double m_dem_nodata_val; vw::cartography::GeoReference m_stereographic_georef; typedef float PixelT; public: DemMinusPlaneView(vw::ImageViewRef const& dem, vw::cartography::GeoReference const& dem_georef, vw::Matrix const& plane, double dem_nodata_val, vw::cartography::GeoReference const& stereographic_georef): m_dem(dem), m_dem_georef(dem_georef), m_plane(plane), m_dem_nodata_val(dem_nodata_val), m_stereographic_georef(stereographic_georef) {} typedef PixelT pixel_type; typedef PixelT result_type; typedef vw::ProceduralPixelAccessor pixel_accessor; inline vw::int32 cols() const { return m_dem.cols(); } inline vw::int32 rows() const { return m_dem.rows(); } inline vw::int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double/*i*/, double/*j*/, vw::int32/*p*/ = 0) const { vw::vw_throw(vw::NoImplErr() << "DemMinusPlaneView::operator()(...) is not implemented"); return pixel_type(); } typedef vw::CropView< vw::ImageView > prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const { // Bring this portion in memory vw::ImageView cropped_dem = vw::crop(m_dem, bbox); vw::ImageView tile(bbox.width(), bbox.height()); for (int col = 0; col < bbox.width(); col++) { for (int row = 0; row < bbox.height(); row++) { // Handle the case when the DEM is not valid if (cropped_dem(col, row) == m_dem_nodata_val) { tile(col, row) = m_dem_nodata_val; continue; } vw::Vector2 pix(col + bbox.min().x(), row + bbox.min().y()); vw::Vector2 lon_lat = m_dem_georef.pixel_to_lonlat(pix); vw::Vector3 llh; vw::math::subvector(llh, 0, 2) = lon_lat; llh[2] = cropped_dem(col, row); // Find the DEM point in local projection or ECEF. // Find another point on the same ray. vw::Vector3 point1, point2; point1 = m_stereographic_georef.geodetic_to_point(llh); llh[2] -= 100.0; point2 = m_stereographic_georef.geodetic_to_point(llh); // The ray is P = point1 + t * (point2 - point1), where t is real. // The plane is a*x + b*y + c*z + d = 0, where plane = (a, b, c, d). // Then, dot(P, plane_normal) + plane_intercept = 0. // Use that to find t. vw::Vector3 plane_normal(m_plane(0, 0), m_plane(0, 1), m_plane(0, 2)); double plane_intercept = m_plane(0, 3); double t = -(vw::math::dot_prod(point1, plane_normal) + plane_intercept) / vw::math::dot_prod(point2 - point1, plane_normal); vw::Vector3 P = point1 + t * (point2 - point1); // Go back to llh llh = m_stereographic_georef.point_to_geodetic(P); tile(col, row) = cropped_dem(col, row) - llh[2]; } } return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } template inline void rasterize(DestT const& dest, vw::BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; vw::ImageViewRef demMinusPlane(vw::ImageViewRef const& dem, vw::cartography::GeoReference const& dem_georef, vw::Matrix plane, double dem_nodata_val, vw::cartography::GeoReference const& stereographic_georef) { return DemMinusPlaneView(dem, dem_georef, plane, dem_nodata_val, stereographic_georef); } // Use RANSAC to find the best plane void calcBathyPlane(int num_ransac_iterations, double inlier_threshold, std::vector const& proj_vec, vw::Matrix & plane, std::vector & inlier_indices) { std::vector dummy_vec(proj_vec.size()); // Required by the interface int min_num_output_inliers = std::max(proj_vec.size()/2, size_t(3)); bool reduce_min_num_output_inliers_if_no_fit = true; vw::vw_out() << "Starting RANSAC.\n"; try { // Must first create the functor and metric, then pass these to ransac. If // created as inline arguments to ransac, these may go go out // of scope prematurely, which will result in incorrect behavior. BestFitPlaneFunctor func; BestFitPlaneErrorMetric error_metric; vw::math::RandomSampleConsensus ransac(func, error_metric, num_ransac_iterations, inlier_threshold, min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit); plane = ransac(proj_vec, dummy_vec); inlier_indices = ransac.inlier_indices(plane, proj_vec, dummy_vec); } catch (const vw::math::RANSACErr& e) { vw::vw_out() << "RANSAC failed: " << e.what() << "\n"; } vw::vw_out() << "Found " << inlier_indices.size() << " / " << proj_vec.size() << " inliers.\n"; } } // end namespace asp ================================================ FILE: src/asp/Core/BathyPlaneCalc.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BathyPlaneCalc.h #ifndef __ASP_CORE_BATHYPLANECALC_H__ #define __ASP_CORE_BATHYPLANECALC_H__ #include #include #include #include #include #include #include #include #include #include namespace asp { // Given a set of polygons stored in dPoly, create a single polygon with all those vertices void formSinglePoly(vw::geometry::dPoly const& inPoly, vw::geometry::dPoly & outPoly); // Add a polygon made up of just one point to given set of polygons. // Later that set will be saved as a shapefile made up of points. void addPointToPoly(vw::geometry::dPoly & poly, vw::Vector2 const& p); // Add a point to the ecef_vec, llh_vec, and shape_xy_vec if it is valid void addPoint(vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& interp_dem, vw::Vector2 const& lonlat, vw::Vector2 const& shape_xy, // Append std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec); // Estimate the projection and convert llh_vec to projected coordinates void find_projection(// Inputs vw::cartography::GeoReference const& dem_georef, std::vector const& llh_vec, // Outputs double & proj_lat, double & proj_lon, vw::cartography::GeoReference & stereographic_georef, std::vector & proj_vec); // Sample the mask boundary (points where the points in the mask have neighbors // not in the mask), shoot points from there onto the DEM, and return the // obtained points. void sampleMaskBd(vw::ImageViewRef mask, float mask_nodata_val, vw::CamPtr camera_model, vw::cartography::GeoReference const& shape_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> masked_dem, int num_samples, std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec); // Find the mask boundary (points where the points in the mask have // neighbors not in the mask), and look up the height in the DEM. void sampleOrthoMaskBd(std::string const& mask_file, vw::cartography::GeoReference const& mask_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> interp_dem, int num_samples, std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec); // Compute the 3D locations at the shape corners based on interpolating // into the DEM and converting to ECEF and to local projected // stereographic coordinates. // Compute the stereographic georeference with the projection center // being the mean lon and lat, and make the 3D locations in reference // to this projection. void find_points_at_shape_corners(std::vector const& polyVec, vw::cartography::GeoReference const& shape_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> interp_dem, std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec); // Read a set of measurements in CSV format, to use later to fit the water surface void find_points_from_meas_csv(std::string const& water_height_measurements, std::string const& csv_format_str, vw::cartography::GeoReference const& shape_georef, // Outputs std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec); // Read a set of lon-lat measurements in CSV format, then interpolate into the DEM // with bilinear interpolation to find the height. void find_points_from_lon_lat_csv(std::string const& lon_lat_measurements, std::string const& csv_format_str, vw::cartography::GeoReference const& shape_georef, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> interp_dem, // Outputs std::vector & ecef_vec, std::vector & llh_vec, std::vector & shape_xy_vec); // Save the points as a shapefile void saveShape(std::vector const& ecef_vec, std::string const& mask_boundary_shapefile); // Calculate a few properties of the plane fitted to the given points and print them out void calcPlaneProperties(std::vector const& proj_vec, std::vector const& inlier_indices, vw::cartography::GeoReference & dem_georef, vw::Matrix const& plane); // Save the bathy plane and the projection parameters if needed void saveBathyPlane(double proj_lat, double proj_lon, vw::Matrix const& plane, std::string const& plane_file); vw::ImageViewRef demMinusPlane(vw::ImageViewRef const& dem, vw::cartography::GeoReference const& dem_georef, vw::Matrix plane, double dem_nodata_val, vw::cartography::GeoReference const& stereographic_georef); // Use RANSAC to find the best plane void calcBathyPlane(int num_ransac_iterations, double inlier_threshold, std::vector const& proj_vec, vw::Matrix & plane, std::vector & inlier_indices); } // end namespace asp #endif // __ASP_CORE_BATHYPLANECALC_H__ ================================================ FILE: src/asp/Core/Bathymetry.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // Helper function to read bathy planes from either a direct string or a list file. // Returns space-separated string of plane files suitable for vw::readBathyPlanes(). std::string readBathyPlanesStrOrList(std::string const& bathy_plane_files, std::string const& bathy_plane_list) { bool have_plane_files = (bathy_plane_files != ""); bool have_plane_list = (bathy_plane_list != ""); if (have_plane_files && have_plane_list) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --bathy-plane and --bathy-plane-list.\n"); std::string planes_to_load; if (have_plane_list) { std::vector plane_files; asp::read_list(bathy_plane_list, plane_files); // Join vector into space-separated string for (size_t i = 0; i < plane_files.size(); i++) { if (i > 0) planes_to_load += " "; planes_to_load += plane_files[i]; } } else { planes_to_load = bathy_plane_files; } return planes_to_load; } // Read all bathy data void readBathyData(int num_images, std::string const& bathy_mask_list, std::string const& bathy_plane_files, std::string const& bathy_plane_list, float refraction_index, vw::BathyData & bathy_data) { std::vector bathy_mask_files; if (bathy_mask_list != "") asp::read_list(bathy_mask_list, bathy_mask_files); if (int(bathy_mask_files.size()) != num_images) vw::vw_throw(vw::ArgumentErr() << "The number of bathy masks must agree with " << "the number of images.\n"); std::string planes_to_load = readBathyPlanesStrOrList(bathy_plane_files, bathy_plane_list); vw::readBathyPlanes(planes_to_load, num_images, bathy_data.bathy_planes); vw::read_bathy_masks(bathy_mask_files, bathy_data.bathy_masks); bathy_data.refraction_index = refraction_index; // Validate consistency validateBathyData(bathy_data, num_images); } // For stereo will use left and right bathy masks. For bundle adjustment and // jitter_solve will use a list of masks. Only checks if bathy settings strings // are non-empty. Full consistency validation (all-or-nothing, sizes, // refraction_index) is done by validateBathyData() which is called // automatically in readBathyData(). bool doBathy(asp::StereoSettings const& stereo_settings) { return (stereo_settings.left_bathy_mask != "" || stereo_settings.right_bathy_mask != "" || stereo_settings.bathy_mask_list != ""); } // Validate loaded bathymetry data for internal consistency. // This is a data consistency validator that checks the loaded BathyData structure // for all-or-nothing configuration and size consistency. // Called after readBathyData() loads masks and planes into BathyData. // Used by: bundle_adjust, jitter_solve. void validateBathyData(vw::BathyData const& bathy_data, int num_images) { bool has_planes = !bathy_data.bathy_planes.empty(); bool has_masks = !bathy_data.bathy_masks.empty(); bool has_refr = (bathy_data.refraction_index > 1.0); // All or nothing if (has_planes || has_masks || has_refr) { if (!has_planes) vw::vw_throw(vw::ArgumentErr() << "Bathy masks/refraction set but no planes.\n"); if (!has_masks) vw::vw_throw(vw::ArgumentErr() << "Bathy planes/refraction set but no masks.\n"); if (!has_refr) vw::vw_throw(vw::ArgumentErr() << "Bathy planes/masks set but refraction_index <= 1.0.\n"); // Size checks if (bathy_data.bathy_planes.size() != (size_t)num_images) vw::vw_throw(vw::ArgumentErr() << "Bathy planes count does not match number of images.\n"); if (bathy_data.bathy_masks.size() != (size_t)num_images) vw::vw_throw(vw::ArgumentErr() << "Bathy masks count does not match number of images.\n"); } } // Lightweight check. The fully checking is done on loading. bool hasBathy(vw::BathyData const& bathy_data) { return !bathy_data.bathy_planes.empty(); } // Validate bathymetry policy and tool compatibility. // This is a policy/compatibility validator that checks command-line options // against tool-specific constraints before loading any data. // Checks: tool compatibility (ISIS, alignment methods), option presence, and basic values. // Called early by: stereo, bundle_adjust, jitter_solve. void bathyChecks(std::string const& session_name, asp::StereoSettings const& stereo_settings, int num_images) { if (doBathy(stereo_settings)) { // If only the topo cloud needs computing, will use only the info from the // left and right bathy masks, so does not need the refraction index and // the bathy plane. if (stereo_settings.output_cloud_type != "topo") { if (stereo_settings.refraction_index <= 1.0) vw::vw_throw(vw::ArgumentErr() << "The water index of refraction to be used in " << "bathymetry correction must be bigger than 1.\n"); if (stereo_settings.bathy_plane == "" && stereo_settings.bathy_plane_list == "") vw::vw_throw(vw::ArgumentErr() << "Either --bathy-plane or --bathy-plane-list must be specified.\n"); // Check mutual exclusion if (stereo_settings.bathy_plane != "" && stereo_settings.bathy_plane_list != "") vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --bathy-plane and --bathy-plane-list.\n"); // Sanity check reading the bathy plane std::string planes_to_check = readBathyPlanesStrOrList(stereo_settings.bathy_plane, stereo_settings.bathy_plane_list); std::vector bathy_plane_vec; vw::readBathyPlanes(planes_to_check, num_images, bathy_plane_vec); } if (session_name.find("isis") != std::string::npos) vw::vw_throw(vw::ArgumentErr() << "Bathymetry correction does not work with ISIS cameras.\n"); if (stereo_settings.alignment_method != "homography" && stereo_settings.alignment_method != "affineepipolar" && stereo_settings.alignment_method != "local_epipolar" && stereo_settings.alignment_method != "none") vw::vw_throw(vw::ArgumentErr() << "Bathymetry correction only works with alignment methods " << "homography, affineepipolar, local_epipolar, and none.\n"); if (stereo_settings.propagate_errors) vw::vw_throw(vw::ArgumentErr() << "Error propagation is not implemented when " << "bathymetry is modeled.\n"); } // Ensure that either both or none of these settings are specified if ((stereo_settings.refraction_index > 1.0 || stereo_settings.bathy_plane != "" || stereo_settings.bathy_plane_list != "") && !doBathy(stereo_settings)) vw::vw_throw(vw::ArgumentErr() << "When bathymetry correction is not on, it is not necessary to " << "specify the water refraction index or the bathy plane.\n"); } } // end namespace asp ================================================ FILE: src/asp/Core/Bathymetry.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file Bathymetry.h /// #ifndef __ASP_CORE_BATHYMETRY_H__ #define __ASP_CORE_BATHYMETRY_H__ #include #include #include #include #include #include namespace asp { class StereoSettings; // Check that all settings are consistent for doing or not doing bathymetry correction void bathyChecks(std::string const& session_name, asp::StereoSettings const& stereo_settings, int num_images); // If to apply bathy correction bool doBathy(asp::StereoSettings const& stereo_settings); // Helper function to read bathy planes from either a direct string or a list file. // Returns space-separated string of plane files suitable for vw::readBathyPlanes(). std::string readBathyPlanesStrOrList(std::string const& bathy_plane_files, std::string const& bathy_plane_list); // Read all bathy data void readBathyData(int num_images, std::string const& bathy_mask_list, std::string const& bathy_plane_files, std::string const& bathy_plane_list, float refraction_index, vw::BathyData & bathy_data); // Validate loaded bathy data for internal consistency. Checks that either all // bathy components are present or none are, and that sizes match num_images. // Call after readBathyData(). void validateBathyData(vw::BathyData const& bathy_data, int num_images); // Check if bathymetry correction should be applied. Returns true if bathy data // is loaded and valid. Note: Full validation is done at load time by // validateBathyData(). bool hasBathy(vw::BathyData const& bathy_data); } // end namespace asp #endif //__ASP_CORE_BATHYMETRY_H__ ================================================ FILE: src/asp/Core/BitChecker.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include void asp::BitChecker::check_argument(vw::uint8 arg) { // Turn on the arg'th bit in m_checksum m_checksum.set(arg); } asp::BitChecker::BitChecker(vw::uint8 num_arguments): m_checksum(0) { VW_ASSERT(num_arguments != 0, vw::ArgumentErr() << "There must be at least one thing you read.\n"); VW_ASSERT(num_arguments <= 32, vw::ArgumentErr() << "You can only have up to 32 checks.\n"); // Turn on the first num_arguments bits in m_good m_good.reset(); m_checksum.reset(); for (vw::uint8 i = 0; i < num_arguments; i++) m_good.set(i); } bool asp::BitChecker::is_good() const { // Make sure all expected bits in m_checksum have been turned on. return (m_good == m_checksum); } ================================================ FILE: src/asp/Core/BitChecker.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BitChecker.h /// #ifndef __ASP_CORE_BIT_CHECKER_H__ #define __ASP_CORE_BIT_CHECKER_H__ #include #include namespace asp { // TODO: Replace with something else! /// Convenience class for setting flags and later on /// making sure that we set all of them. /// - Designed to be inherited from. class BitChecker { std::bitset<32> m_checksum; ///< Store current bits std::bitset<32> m_good; ///< Store target bits protected: /// Used to check off that one of the arguments has been read. void check_argument(vw::uint8 arg); public: /// Pass in the number of expected arguments, max 32 BitChecker(vw::uint8 num_arguments); bool is_good() const; ///< Return true if all arguments have been checked. }; // End class BitChecker } // end namespace asp #endif//__ASP_CORE_BIT_CHECKER_H__ ================================================ FILE: src/asp/Core/BundleAdjustUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustUtils.cc /// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::camera; using namespace vw::stereo; using namespace vw::ba; namespace fs = boost::filesystem; namespace asp { // See the .h file for documentation void camera_footprint(std::string const& dem_file, std::string const& image_file, vw::CamPtr const& camera_model, std::string const& out_prefix, // Outputs vw::geometry::dPoly & footprint, vw::BBox2 & footprint_bbox) { vw_out() << "Computing ground footprint bounding box of: " + image_file << std::endl; // Initialize outputs footprint = vw::geometry::dPoly(); footprint_bbox = vw::BBox2(); std::string stem = fs::path(image_file).stem().string(); std::string box_path = out_prefix + '-' + stem + "-bbox.txt"; if (fs::exists(box_path)) { double min_x, min_y, max_x, max_y; std::ifstream ifs(box_path); if (ifs >> min_x >> min_y >> max_x >> max_y) { footprint_bbox.min() = vw::Vector2(min_x, min_y); footprint_bbox.max() = vw::Vector2(max_x, max_y); vw_out() << "Read cached ground footprint bbox from: " << box_path << ":\n" << footprint_bbox << "\n"; return; } } // Read the DEM and supporting data vw::cartography::GeoReference dem_georef; DiskImageView dem_disk_image(dem_file); ImageViewRef> dem; boost::shared_ptr dem_rsrc(DiskImageResourcePtr(dem_file)); if (dem_rsrc->has_nodata_read()) dem = create_mask(dem_disk_image, dem_rsrc->nodata_read()); else dem = pixel_cast>(dem_disk_image); // all pixels are valid bool has_georef = vw::cartography::read_georeference(dem_georef, dem_file); if (!has_georef) vw_throw(ArgumentErr() << "There is no georeference information in: " << dem_file << ".\n"); try { DiskImageView img(image_file); bool quick = false; // Do a thorough job float mean_gsd = 0.0; int num_samples = 100; // should be enough std::vector coords; footprint_bbox = vw::cartography::camera_bbox(dem, dem_georef, dem_georef, camera_model, img.cols(), img.rows(), mean_gsd, quick, &coords, num_samples); // Convert the coordinates from ECEF to points in the DEM projection for (size_t i = 0; i < coords.size(); i++) { coords[i] = dem_georef.datum().cartesian_to_geodetic(coords[i]); coords[i] = dem_georef.geodetic_to_point(coords[i]); } // Compute the convex hull of the projected coordinates, for easier // intersection operations later vw::geometry::convexHull(coords, footprint); } catch (std::exception const& e) { vw_throw(ArgumentErr() << e.what() << "\n" << "Failed to compute the footprint of camera image: " << image_file << " onto DEM: " << dem_file << ".\n"); } vw_out() << "Writing: " << box_path << "\n"; std::ofstream ofs(box_path.c_str()); ofs.precision(17); ofs << footprint_bbox.min().x() << " " << footprint_bbox.min().y() << " " << footprint_bbox.max().x() << " " << footprint_bbox.max().y() << "\n"; ofs.close(); } // See the .h file for the documentation. void buildOverlapList(std::string const& out_prefix, std::string const& dem_file, double pct_for_overlap, int overlap_limit, bool match_first_to_last, std::vector const& image_files, std::vector const& camera_models, std::set> & overlap_list) { // Wipe the output overlap_list.clear(); // Sanity check if (image_files.size() != camera_models.size()) vw_throw(ArgumentErr() << "Expecting as many images as cameras.\n"); int num_images = image_files.size(); std::vector boxes(num_images); std::vector footprints(num_images); for (int it = 0; it < num_images; it++) { // By this stage the camera bboxes are already computed and cached, // they just need to be loaded. asp::camera_footprint(dem_file, image_files[it], camera_models[it], out_prefix, footprints[it], boxes[it]); // Expand the box by the given factor expand_box_by_pct(boxes[it], pct_for_overlap); } // See which boxes overlap. While this is an O(N^2) computation, likely N is // at most a thousand or two, which should be manageable. A 2D tree of box // corners could be used, and two boxes would then overlap if corners from one // box are contained in a second box. That would be a O(N * log(N)) lookup. If // match_first_to_last is true, need to look past num_images, so wrap around // and look at earlier images. // TODO(oalexan1): Use a tree structure. for (int it1 = 0; it1 < num_images; it1++) { int num_added = 0; int end2 = num_images; if (match_first_to_last) end2 = num_images + overlap_limit; for (int it2 = it1 + 1; it2 < end2; it2++) { // Wrap around if needed int local_it2 = it2 % num_images; BBox2 box = boxes[it1]; // deep copy box.crop(boxes[local_it2]); if (!box.empty() && num_added < overlap_limit) { auto pair1 = std::make_pair(image_files[it1], image_files[local_it2]); auto pair2 = std::make_pair(image_files[local_it2], image_files[it1]); if (overlap_list.find(pair1) != overlap_list.end() || overlap_list.find(pair2) != overlap_list.end()) continue; // already added // Can't have matches to itself if (it1 == local_it2) continue; // Add the pair with first index less than the second std::pair pair; if (it1 < local_it2) pair = std::make_pair(image_files[it1], image_files[local_it2]); else pair = std::make_pair(image_files[local_it2], image_files[it1]); overlap_list.insert(pair); num_added++; } // Stop when added enough if (num_added >= overlap_limit) break; } } return; } /// Ensure that the basename (without extension) of all images, camera files, or /// adjustment names are different. Later these will be used for match files, /// and we want match files corresponding to different images to be different. void check_for_duplicates(std::vector const& image_files, std::vector const& camera_files, std::string const& out_prefix) { if (image_files.size() != camera_files.size()) vw_throw(vw::ArgumentErr() << "Expecting as many images as cameras.\n"); std::set img_set, cam_set, adj_set; for (size_t i = 0; i < camera_files.size(); i++) { std::string img = vw::ip::strip_path("", image_files[i]); std::string cam = vw::ip::strip_path("", camera_files[i]); std::string ba_name = asp::bundle_adjust_file_name(out_prefix, image_files[i], camera_files[i]); std::string adj_base = vw::ip::strip_path(out_prefix, ba_name); if (img_set.find(img) != img_set.end()) vw_throw(vw::ArgumentErr() << "Found duplicate image: " << img << "\n"); if (cam != "" && cam_set.find(cam) != cam_set.end()) vw_throw(vw::ArgumentErr() << "Found duplicate camera: " << cam << "\n"); if (adj_set.find(adj_base) != adj_set.end()) vw_throw(vw::ArgumentErr() << "Found duplicate adjustment name: " << adj_base << "\n"); img_set.insert(img); if (cam != "") cam_set.insert(cam); // camera file can be empty adj_set.insert(adj_base); } } // Given an xyz point in ECEF coordinates, update its height above datum by // interpolating into a DEM. The input must already be prepared for // interpolation. The user must check the return status. bool updatePointHeightFromDem(vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& interp_dem, // Output vw::Vector3 & xyz) { // Points at planet center are outliers if (xyz == Vector3(0, 0, 0)) return false; Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz); Vector2 ll = subvector(llh, 0, 2); Vector2 pix = dem_georef.lonlat_to_pixel(ll); if (!interp_dem.pixel_in_bounds(pix)) { xyz = Vector3(0, 0, 0); return false; } PixelMask height = interp_dem(pix[0], pix[1]); if (!is_valid(height)) { xyz = Vector3(0, 0, 0); return false; } llh[2] = height.child(); // NaN check if (llh[2] != llh[2]) { xyz = Vector3(0, 0, 0); return false; } // Overwrite the input xyz = dem_georef.datum().geodetic_to_cartesian(llh); return true; } // Shoot rays from all matching interest points. Intersect those with a DEM. Find // their average. Project it vertically onto the DEM. Invalid or uncomputable // xyz are set to the zero vector. // TODO(oalexan1): This code can be slow, but using multiple threads makes it // even slower, likely because of having to share the masked_dem image. To speed // it up one could break the loop over features into several parts. Each would // load and have its own masked_dem image. Even then there may be some global // cache for all images, which would slow things down. // There is a function with the same name and logic for rig_calibrator. void updateTriPtsFromDem(vw::ba::ControlNetwork const& cnet, std::set const& outliers, std::vector const& camera_models, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& masked_dem, // Output std::vector & dem_xyz_vec) { // Put this note as this part can take a long time vw::vw_out() << "Updating triangulated points with DEM height.\n"; int num_tri_points = cnet.size(); dem_xyz_vec.resize(num_tri_points, vw::Vector3(0, 0, 0)); // Project vertically onto the DEM. This needs interpolation into the DEM vw::PixelMask invalid_val; vw::ImageViewRef> interp_dem = vw::interpolate(masked_dem, vw::BilinearInterpolation(), vw::ValueEdgeExtension>(invalid_val)); // Prepare for measuring progress and elapsed time vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / std::max(1, num_tri_points); tpc.report_progress(0); vw::Stopwatch sw; sw.start(); for (int ipt = 0; ipt < num_tri_points; ipt++) { tpc.report_incremental_progress(inc_amount); if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint) continue; // GCP do not get modified if (outliers.find(ipt) != outliers.end()) continue; // Skip outliers // The initial triangulated point Vector3 xyz_guess = cnet[ipt].position(); // Points at planet center are outliers. This check is likely redundant, // but good to have. if (xyz_guess == Vector3(0, 0, 0)) continue; Vector3 accumulated_xyz(0,0,0); int num_intersections = 0; for (size_t m = 0; m < cnet[ipt].size(); m++) { // The observed value for the projection of point with index ipt into // the camera with index icam. Vector2 observation = cnet[ipt][m].position(); // Intersect ray with DEM bool treat_nodata_as_zero = false; bool has_intersection = false; double height_error_tol = 0.001; // 1 mm should be enough double max_abs_tol = 1e-14; // abs cost fun change b/w iterations double max_rel_tol = 1e-14; int num_max_iter = 25; // Using many iterations can be very slow int icam = cnet[ipt][m].image_id(); Vector3 dem_xyz = vw::cartography::camera_pixel_to_dem_xyz (camera_models[icam]->camera_center(observation), camera_models[icam]->pixel_to_vector(observation), vw::pixel_cast>(masked_dem), dem_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); if (!has_intersection) continue; accumulated_xyz += dem_xyz; num_intersections++; } // Average the successful intersections. if (num_intersections > 0) dem_xyz_vec[ipt] = accumulated_xyz / double(num_intersections); else dem_xyz_vec[ipt] = Vector3(); if (dem_xyz_vec[ipt] == Vector3()) continue; // Skip invalid points Vector3 observation = dem_xyz_vec[ipt]; if (updatePointHeightFromDem(dem_georef, interp_dem, observation)) dem_xyz_vec[ipt] = observation; } // end iterating over points tpc.report_finished(); sw.stop(); vw::vw_out() << "Elapsed time in updating triangulated points from DEM: " << sw.elapsed_seconds() << " seconds.\n"; return; } // Flag outliers by reprojection error with input cameras. This assumes that // the input cameras are pretty accurate. void flag_initial_outliers(vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, std::vector const& camera_models, double max_init_reproj_error, // Output std::set & outliers) { // Wipe the output outliers.clear(); int num_cameras = camera_models.size(); int num_tri_points = cnet.size(); for (int icam = 0; icam < (int)crn.size(); icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the triangulated point int ipt = (**fiter).m_point_id; VW_ASSERT(icam < num_cameras, ArgumentErr() << "Out of bounds in the number of cameras."); VW_ASSERT(ipt < num_tri_points, ArgumentErr() << "Out of bounds in the number of points."); if (outliers.find(ipt) != outliers.end()) { // Is an outlier continue; } // The observed value for the projection of point with index ipt into // the camera with index icam. Vector2 observation = (**fiter).m_location; Vector3 const& tri_point = cnet[ipt].position(); // alias // Flag outliers produced when building or triangulating the control network if (cnet[ipt].ignore()) { outliers.insert(ipt); continue; } if (tri_point == Vector3(0, 0, 0)) { // Points at planet center are outliers outliers.insert(ipt); continue; } vw::Vector2 pix; try { pix = camera_models[icam]->point_to_pixel(tri_point); bool is_good = (norm_2(pix - observation) <= max_init_reproj_error); if (cnet[ipt].type() == ControlPoint::GroundControlPoint) is_good = true; // GCP are not filtered with max_init_reproj_error if (!is_good) { // this checks for NaN too outliers.insert(ipt); continue; } } catch (...) { outliers.insert(ipt); continue; } } } // end iterating over cameras return; } // Manufacture a CSM state file from an adjust file std::string csmStateFile(std::string const& adjustFile) { std::string csmFile = adjustFile; // If the suffix we want to add is already present, remove it first std::string suff = ".adjusted_state"; auto it = csmFile.find(suff); if (it != std::string::npos) csmFile.replace(it, suff.size(), ""); csmFile = boost::filesystem::path(csmFile).replace_extension(suff + ".json").string(); return csmFile; } // Manufacture an RPC state file from an adjust file. Use the .xml extension // for the output file. std::string rpcAdjustedFile(std::string const& adjustFile) { std::string rpcFile = adjustFile; // If the suffix we want to add is already present, remove it first std::string suff = ".adjusted_rpc"; auto it = rpcFile.find(suff); if (it != std::string::npos) rpcFile.replace(it, suff.size(), ""); rpcFile = boost::filesystem::path(rpcFile).replace_extension(suff + ".xml").string(); return rpcFile; } // Put the triangulated points in a vector. Update the cnet from the DEM, // if we have one. void formTriVec(std::vector const& dem_xyz_vec, bool have_dem, double heights_from_dem_uncertainty, // Outputs vw::ba::ControlNetwork & cnet, std::vector & orig_tri_points_vec, std::vector & tri_points_vec) { int num_tri_points = cnet.size(); if (num_tri_points == 0) vw::vw_throw(ArgumentErr() << "No triangulated ground points were found.\n"); orig_tri_points_vec.resize(num_tri_points*NUM_XYZ_PARAMS, 0.0); tri_points_vec.resize(num_tri_points*NUM_XYZ_PARAMS, 0.0); for (int ipt = 0; ipt < num_tri_points; ipt++) { // We overwrite the triangulated point when we have an input DEM. // It is instructive to examine the pointmap residual file to see // what effect that has on residuals. This point will likely try // to move back somewhat to its triangulated position during // optimization, depending on the strength of the weight which // tries to keep it back in place. Vector3 tri_point = cnet[ipt].position(); // The original triangulated point, before the override or optimization for (int q = 0; q < NUM_XYZ_PARAMS; q++) orig_tri_points_vec[ipt*NUM_XYZ_PARAMS + q] = tri_point[q]; bool is_gcp = (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint); if (have_dem && dem_xyz_vec.at(ipt) != Vector3(0, 0, 0) && !is_gcp) { tri_point = dem_xyz_vec.at(ipt); // Update in the cnet too cnet[ipt].set_position(Vector3(tri_point[0], tri_point[1], tri_point[2])); // Ensure we can track it later cnet[ipt].set_type(vw::ba::ControlPoint::PointFromDem); // Set the uncertainty to the DEM uncertainty double s = heights_from_dem_uncertainty; if (s > 0) cnet[ipt].set_sigma(Vector3(s, s, s)); } for (int q = 0; q < NUM_XYZ_PARAMS; q++) tri_points_vec[ipt*NUM_XYZ_PARAMS + q] = tri_point[q]; } return; } // A function to do a moving average. The input vector can have nan where there // are no values. Have an option to to do this average only if needed to fill in. // TODO(oalexan1): If the logic in residualsPerRow() and supporting functionality // here is not useful, it may need to be wiped. void movingAverage(std::vector & vec, int window_size, bool fill_only, bool & changed) { changed = false; int n = vec.size(); // Window must be odd and positive if (window_size <= 0 || window_size % 2 == 0) vw::vw_throw(vw::ArgumentErr() << "Expecting a positive odd number for the moving average window size.\n"); int half_len = window_size / 2; // Make a copy of the input std::vector vec_copy = vec; // deep copy double nan = std::numeric_limits::quiet_NaN(); for (int i = 0; i < n; i++) { if (fill_only && !std::isnan(vec[i])) continue; // no need to change this value changed = true; // Iterate over the window double sum = 0.0, count = 0.0; for (int win = -half_len; win <= half_len; win++) { int ind = i + win; if (ind < 0 || ind >= n) continue; // out of bounds if (std::isnan(vec_copy[ind])) continue; // skip nan sum += vec_copy[ind]; count++; } if (count > 0) vec[i] = sum / count; else vec[i] = nan; } return; } // A function to strip all leading nan from vector. Do it in place. void stripLeadingNan(std::vector & vec) { int n = vec.size(); int first_good = 0; for (int i = 0; i < n; i++) { if (!std::isnan(vec[i])) { first_good = i; break; } } if (first_good > 0) { // Shift the vector for (int i = first_good; i < n; i++) vec[i - first_good] = vec[i]; // Resize vec.resize(n - first_good); } return; } // Strip trailing nan from vector. Do it in place. void stripTrailingNan(std::vector & vec) { int n = vec.size(); int last_good = n - 1; for (int i = n - 1; i >= 0; i--) { if (!std::isnan(vec[i])) { last_good = i; break; } } if (last_good < n - 1) { // Resize vec.resize(last_good + 1); } return; } // Average all y pixel residuals per row then fill in from neighbors. This is // useful for producing a jitter residual per image row, from which one may try // to study its power spectrum and dominant frequencies. void residualsPerRow(vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, std::set const& outliers, std::vector const& image_files, std::vector const& camera_models, // Output std::vector> & residuals) { int numImages = image_files.size(); // Sanity check if ((int)camera_models.size() != numImages || (int)crn.size() != numImages) vw_throw(ArgumentErr() << "Number of imgages, of cameras, and control network sizes do not match.\n"); // Wipe the output residuals.clear(); residuals.resize(numImages); for (int icam = 0; icam < (int)crn.size(); icam++) { vw::Vector2 dims = vw::file_image_size(image_files[icam]); int numLines = dims[1]; residuals[icam].resize(numLines, 0.0); std::vector count(numLines, 0.0); double nan = std::numeric_limits::quiet_NaN(); for (auto const& feature_ptr: crn[icam]) { // The index of the 3D point int ipt = feature_ptr->m_point_id; if (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint) continue; // Skip GCP if (outliers.find(ipt) != outliers.end()) continue; // Skip outliers // The observed value for the projection of point with index ipt into // the camera with index icam. Vector2 observation = feature_ptr->m_location; // Ideally this point projects back to the pixel observation, so use the // triangulated position as initial guess. Vector3 xyz = cnet[ipt].position(); if (xyz == Vector3(0, 0, 0)) continue; // Skip outliers // Project into the camera vw::Vector2 pix = camera_models[icam]->point_to_pixel(xyz); // Image row int row = round(observation[1]); if (row < 0 || row > numLines - 1) continue; // out of bounds // Accumulate the residual residuals[icam][row] += (pix[1] - observation[1]); count[row] += 1.0; } // end loop over features // Average the residuals. Put naN where there is no data for (int row = 0; row < numLines; row++) { if (count[row] > 0) residuals[icam][row] /= count[row]; else residuals[icam][row] = nan; } // Do a moving average with a length of 11 bool fill_only = false; bool changed = false; int window_size = 11; movingAverage(residuals[icam], window_size, fill_only, changed); // Strip leading and trailing nan. There can be plenty because of // lack of features there. stripLeadingNan(residuals[icam]); stripTrailingNan(residuals[icam]); // Now continue doing this only to fill in missing values fill_only = true; int attempts = 0; while (changed) { movingAverage(residuals[icam], window_size, fill_only, changed); attempts++; // Throw an error after 10 attempts if (attempts > 10) { vw::vw_out() << "No luck after attempts: " << icam << " " << attempts << "\n"; break; } } } // end loop over cameras return; } // end function residualsPerRow // Save the control network in GCP format using optimized positions from // param_storage, filtering outliers. For GCP, use the original position // from the cnet. For other points, use the optimized position from // param_storage. Includes GCP. For bundle_adjust. void saveCnetAsGcp(vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, vw::cartography::Datum const& datum, std::vector const& image_files, std::string const& filename) { std::vector gcp_vec; for (int ipt = 0; ipt < (int)cnet.size(); ipt++) { if (param_storage.get_point_outlier(ipt)) continue; asp::Gcp gcp; gcp.cp = cnet[ipt]; bool is_gcp = (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint); vw::Vector3 xyz = is_gcp ? cnet[ipt].position() : param_storage.get_point(ipt); gcp.llh = datum.cartesian_to_geodetic(xyz); gcp.sigma = cnet[ipt].sigma(); gcp_vec.push_back(gcp); } vw::cartography::GeoReference georef(datum); bool ignore_pixel_sigma = false; asp::writeGcp(filename, georef, gcp_vec, image_files, ignore_pixel_sigma); } // Save the control network in GCP format using optimized positions from // tri_points_vec, filtering outliers. For GCP, use the original position // from the cnet. For other points, use the optimized position from // tri_points_vec. Includes GCP. For jitter_solve. void saveCnetAsGcp(vw::ba::ControlNetwork const& cnet, std::vector const& tri_points_vec, std::set const& outliers, vw::cartography::Datum const& datum, std::vector const& image_files, std::string const& filename) { int num_points = (int)cnet.size(); if ((int)tri_points_vec.size() < num_points * NUM_XYZ_PARAMS) vw_throw(ArgumentErr() << "saveCnetAsGcp: tri_points_vec too small for cnet.\n"); std::vector gcp_vec; for (int ipt = 0; ipt < num_points; ipt++) { if (outliers.find(ipt) != outliers.end()) continue; asp::Gcp gcp; gcp.cp = cnet[ipt]; bool is_gcp = (cnet[ipt].type() == vw::ba::ControlPoint::GroundControlPoint); vw::Vector3 xyz; if (is_gcp) { xyz = cnet[ipt].position(); } else { for (int k = 0; k < NUM_XYZ_PARAMS; k++) xyz[k] = tri_points_vec[ipt * NUM_XYZ_PARAMS + k]; } gcp.llh = datum.cartesian_to_geodetic(xyz); gcp.sigma = cnet[ipt].sigma(); gcp_vec.push_back(gcp); } vw::cartography::GeoReference georef(datum); bool ignore_pixel_sigma = false; asp::writeGcp(filename, georef, gcp_vec, image_files, ignore_pixel_sigma); } } // end namespace asp ================================================ FILE: src/asp/Core/BundleAdjustUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file BundleAdjustUtils.h /// #ifndef __BUNDLE_ADJUST_UTILS_H__ #define __BUNDLE_ADJUST_UTILS_H__ #include #include #include #include #include #include #include #include #include #include // Forward declarations namespace vw { namespace cartography { class Datum; class GeoReference; } namespace geometry { class dPoly; } template class ImageViewRef; template class PixelMask; } namespace asp { class BaParams; const int NUM_XYZ_PARAMS = 3; const int NUM_QUAT_PARAMS = 4; const int PIXEL_SIZE = 2; typedef vw::ba::CameraRelationNetwork CRN; // Compute the camera footprint polygon shape and its bounding box. Used a // cached result if available. Cache the current result if computed. void camera_footprint(std::string const& dem_file, std::string const& image_file, vw::CamPtr const& camera_model, std::string const& out_prefix, // Outputs vw::geometry::dPoly & footprint, vw::BBox2 & footprint_bbox); // Determine which camera images overlap by finding the lon-lat // bounding boxes of their footprints given the specified DEM, expand // them by a given percentage, and see if those intersect. A higher // percentage should be used when there is more uncertainty in input // camera poses. Specify as: 'dem.tif 15'. void buildOverlapList(std::string const& out_prefix, std::string const& dem_file, double pct_for_overlap, int overlap_limit, bool match_first_to_last, std::vector const& image_files, std::vector const& camera_models, std::set> & overlap_list); /// Ensure that no images, camera files, or adjustment names are duplicate. /// That will cause the output files to overwrite each other! void check_for_duplicates(std::vector const& image_files, std::vector const& camera_files, std::string const& out_prefix); // Shoot rays from all matching interest points. Intersect those with a DEM. Find // their average. Project it vertically onto the DEM. Invalid or uncomputable // xyz are set to the zero vector. void updateTriPtsFromDem(vw::ba::ControlNetwork const& cnet, std::set const& outliers, std::vector const& camera_models, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& masked_dem, // Output std::vector & dem_xyz_vec); // Given an xyz point in ECEF coordinates, update its height above datum by // interpolating into a DEM. The input must already be prepared for // interpolation. The user must check the return status. bool updatePointHeightFromDem(vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef> const& interp_dem, // Output vw::Vector3 & xyz); // Flag outliers by reprojection error with input cameras. This assumes that // the input cameras are pretty accurate. void flag_initial_outliers(vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, std::vector const& camera_models, double max_init_reproj_error, // Output std::set & outliers); // Manufacture a CSM state file from an adjust file std::string csmStateFile(std::string const& adjustFile); // Manufacture an RPC state file from an adjust file std::string rpcAdjustedFile(std::string const& adjustFile); // Put the triangulated points in a vector. Update the cnet from the DEM, // if we have one. Set the sigma for DEM-constrained points. void formTriVec(std::vector const& dem_xyz_vec, bool have_dem, double heights_from_dem_uncertainty, // Outputs vw::ba::ControlNetwork & cnet, std::vector & orig_tri_points_vec, std::vector & tri_points_vec); // Average all y pixel residuals per row then fill in from neighbors void residualsPerRow(vw::ba::ControlNetwork const& cnet, asp::CRN const& crn, std::set const& outliers, std::vector const& image_files, std::vector const& camera_models, // Output std::vector> & residuals); // Save the control network in GCP format using optimized positions from // param_storage, filtering outliers. Includes GCP. For bundle_adjust. void saveCnetAsGcp(vw::ba::ControlNetwork const& cnet, asp::BaParams const& param_storage, vw::cartography::Datum const& datum, std::vector const& image_files, std::string const& filename); // Save the control network in GCP format using optimized positions from // tri_points_vec, filtering outliers. Includes GCP. For jitter_solve. void saveCnetAsGcp(vw::ba::ControlNetwork const& cnet, std::vector const& tri_points_vec, std::set const& outliers, vw::cartography::Datum const& datum, std::vector const& image_files, std::string const& filename); } // end namespace asp #endif // __BUNDLE_ADJUST_UTILS_H__ ================================================ FILE: src/asp/Core/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspCore "${ASP_CORE_SRC_FILES}" "${ASP_CORE_TEST_FILES}" "${ASP_CORE_LIB_DEPENDENCIES}") ================================================ FILE: src/asp/Core/CamPoseUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Very low-level functions used in sat_sim.cc and jitter_solve.cc. #include #include #include #include using namespace vw::cartography; namespace asp { // A small number to help convert directions from being in projected space to // ECEF (the transform between these is nonlinear). Do not use a small value, // as in ECEF these will be large numbers and we may have precision issues. // The value 0.01 was tested well. Measured in meters. double satSimDelta() { return 0.01; } // Assemble the cam2world matrix from the along track, across track, and down vectors // Note how we swap the first two columns and flip one sign. We went the along // direction to be the camera y direction void assembleCam2WorldMatrix(vw::Vector3 const& along, vw::Vector3 const& across, vw::Vector3 const& down, // Output vw::Matrix3x3 & cam2world) { for (int row = 0; row < 3; row++) { cam2world(row, 0) = along[row]; cam2world(row, 1) = across[row]; cam2world(row, 2) = down[row]; } return; } // Given two end points in projected coordinates determining a satellite // trajectory, find the along and across vectors in projected coordinates. void calcProjAlongAcross(vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::Vector3 & proj_along, vw::Vector3 & proj_across) { proj_along = last_proj - first_proj; // Sanity check. if (proj_along == vw::Vector3()) vw::vw_throw(vw::ArgumentErr() << "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"); // Normalize proj_along = proj_along / norm_2(proj_along); // Find the across-track direction, parallel to the ground, in projected coords proj_across = vw::math::cross_prod(proj_along, vw::Vector3(0, 0, 1)); proj_across = proj_across / norm_2(proj_across); } // Make these vectors have norm 1, and make across perpendicular to along void normalizeOrthogonalizeAlongAcross(vw::Vector3 & along, vw::Vector3 & across) { // Normalize along = along / norm_2(along); across = across / norm_2(across); // Ensure that across is perpendicular to along across = across - dot_prod(along, across) * along; // Normalize again across = across / norm_2(across); } // Find normalized along and across directions in ECEF given these values in // projected coordinates. Use centered difference to compute the along and // across track points This achieves higher quality results. void calcEcefAlongAcross(vw::cartography::GeoReference const& dem_georef, double delta, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, vw::Vector3 const& proj_pt, // Outputs vw::Vector3 & along, vw::Vector3 & across) { // Check if proj_along and proj_across are perpendicular and have norm 1 double dot = dot_prod(proj_along, proj_across); if (std::abs(dot) > 1e-6) vw::vw_throw(vw::ArgumentErr() << "calcEcefAlongAcross: proj_along and proj_across are not perpendicular.\n"); if (std::abs(norm_2(proj_along) - 1.0) > 1e-6 || std::abs(norm_2(proj_across) - 1.0) > 1e-6) vw::vw_throw(vw::ArgumentErr() << "calcEcefAlongAcross: either proj_along or proj_across does not have norm 1.\n"); vw::Vector3 L1 = proj_pt - delta * proj_along; // along track point vw::Vector3 C1 = proj_pt - delta * proj_across; // across track point vw::Vector3 L2 = proj_pt + delta * proj_along; // along track point vw::Vector3 C2 = proj_pt + delta * proj_across; // across track point // Convert to cartesian L1 = vw::cartography::projToEcef(dem_georef, L1); C1 = vw::cartography::projToEcef(dem_georef, C1); L2 = vw::cartography::projToEcef(dem_georef, L2); C2 = vw::cartography::projToEcef(dem_georef, C2); // Create the along track and across track vectors along = L2 - L1; across = C2 - C1; // Make these vector have norm 1, and make across perpendicular to along asp::normalizeOrthogonalizeAlongAcross(along, across); } } // end namespace asp ================================================ FILE: src/asp/Core/CamPoseUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CamPoseUtils.h // Very low-level functions used in sat_sim.cc and jitter_solve.cc. #ifndef __ASP_CORE_CAM_POSE_UTILS_H__ #define __ASP_CORE_CAM_POSE_UTILS_H__ #include #include namespace vw { namespace cartography { class GeoReference; }} namespace asp { // A small number to help convert directions from being in projected space to // ECEF (the transform between these is nonlinear). Do not use a small value, // as in ECEF these will be large numbers and we may have precision issues. // The value 0.01 was tested well. Measured in meters. double satSimDelta(); // Assemble the cam2world matrix from the along track, across track, and down vectors // Note how we swap the first two columns and flip one sign. We went the along // direction to be the camera y direction void assembleCam2WorldMatrix(vw::Vector3 const& along, vw::Vector3 const& across, vw::Vector3 const& down, // Output vw::Matrix3x3 & cam2world); // Make these vectors have norm 1, and make across perpendicular to along void normalizeOrthogonalizeAlongAcross(vw::Vector3 & along, vw::Vector3 & across); // Given two end points in projected coordinates determining a satellite // trajectory, find the along and across vectors in projected coordinates. void calcProjAlongAcross(vw::Vector3 const& first_proj, vw::Vector3 const& last_proj, vw::Vector3 & proj_along, vw::Vector3 & proj_across); // Find normalized along and across directions in ECEF given these values in // projected coordinates. Use centered difference to compute the along and // across track points This achieves higher quality results. void calcEcefAlongAcross(vw::cartography::GeoReference const& dem_georef, double delta, vw::Vector3 const& proj_along, vw::Vector3 const& proj_across, vw::Vector3 const& proj_pt, // Outputs vw::Vector3 & along, vw::Vector3 & across); } // end namespace asp #endif//__ASP_CORE_CAM_POSE_UTILS_H__ ================================================ FILE: src/asp/Core/CameraTransforms.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraTransforms.cc #include #include #include namespace asp { // Return the matrix of rotation in the xy plane, from camera to satellite body vw::Matrix3x3 rotationXY() { vw::Matrix3x3 T; // Set all elements to zero for (int row = 0; row < 3; row++) for (int col = 0; col < 3; col++) T(row, col) = 0.0; T(0, 1) = -1; T(1, 0) = 1; T(2, 2) = 1; return T; } // A function to convert a 3x3 VW matrix to Eigen Eigen::Matrix3d vwToEigenMat(vw::Matrix3x3 const& m) { Eigen::Matrix3d result; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) result(r, c) = m(r, c); return result; } // Convert an Eigen 3x3 matrix to a VW 3x3 matrix vw::Matrix3x3 eigenToVwMat(Eigen::Matrix3d const& m) { vw::Matrix3x3 result; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) result(r, c) = m(r, c); return result; } // A function to go from a VW matrix to a quaternion, represented // as four values, x, y, z, w. Care with the order of values. It is not // w, x, y, z as in the Eigen convention. void matrixToQuaternion(vw::Matrix3x3 const& R, // Outputs double & x, double & y, double & z, double & w) { // Convert to Eigen3 Eigen::Matrix3d M = vwToEigenMat(R); // Convert to quaternion Eigen::Quaterniond q(M); // Convert to x, y, z, w x = q.x(); y = q.y(); z = q.z(); w = q.w(); } // A function to convert a quaternion given by 4 numbers to a VW matrix. It is // very important to note that were we assume the order of the quaternion // numbers is (x, y, z, w) and not (w, x, y, z). vw::Matrix3x3 quaternionToMatrix(double const* q) { Eigen::Quaterniond eq; eq.x() = q[0]; eq.y() = q[1]; eq.z() = q[2]; eq.w() = q[3]; // Normalize it eq.normalize(); Eigen::Matrix3d m = eq.toRotationMatrix(); // Convert to vw::Matrix3x3 return eigenToVwMat(m); } // Find the roll-pitch-yaw rotation in ZYX order. The inputs are in // degrees. vw::Matrix3x3 rollPitchYaw(double roll, double pitch, double yaw) { // Factor to convert from degrees to radians const double DEG_TO_RAD = M_PI/180.0; Eigen::AngleAxisd rollAngle (DEG_TO_RAD * roll, Eigen::Vector3d::UnitX()); Eigen::AngleAxisd pitchAngle(DEG_TO_RAD * pitch, Eigen::Vector3d::UnitY()); Eigen::AngleAxisd yawAngle (DEG_TO_RAD * yaw, Eigen::Vector3d::UnitZ()); // Multiply these returning an Eigen Matrix3d Eigen::Quaterniond q = yawAngle * pitchAngle * rollAngle; // Convert to Eigen3 Eigen::Matrix3d M = q.matrix(); // Convert to vw::Matrix3x3 vw::Matrix3x3 R = eigenToVwMat(M); return R; } // Given a matrix obtained by multiplying roll, pitch, and yaw rotations, by applying // then in this order from right to left, find the roll, pitch, and yaw angles in degrees. // This can return 180 +/- x, if x was the original angle, so it is not a true inverse. void rollPitchYawFromRotationMatrix(vw::Matrix3x3 const& R, // Outputs double & roll, double & pitch, double & yaw) { // Convert to Eigen3 and then find the Euler angles in radians Eigen::Matrix3d M = vwToEigenMat(R); Eigen::Vector3d euler = M.eulerAngles(2, 1, 0); // Convert to degrees roll = euler[2]*180.0/M_PI; pitch = euler[1]*180.0/M_PI; yaw = euler[0]*180.0/M_PI; } } //end namespace asp ================================================ FILE: src/asp/Core/CameraTransforms.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __CORE_CAMERA_TRANSFORMS_H__ #define __CORE_CAMERA_TRANSFORMS_H__ #include // TODO(oalexan1): Rename this to EigenCameraTransforms.h. // Do not include Eigen headers here, as that will slow down the compilation. // A set of routines for handling camera transformations. It is best to not // include here any Eigen headers, as that will slow down the compilation. namespace asp { // Return the matrix of rotation in the xy plane, from camera to satellite body vw::Matrix3x3 rotationXY(); // Find the roll-pitch-yaw rotation in ZYX order. The inputs are in // degrees. vw::Matrix3x3 rollPitchYaw(double roll, double pitch, double yaw); // A function to go from a VW matrix to a quaternion, represented // as four values, x, y, z, w. Care with the order of values. It is not // w, x, y, z as in the Eigen convention. void matrixToQuaternion(vw::Matrix3x3 const& R, // Outputs double & x, double & y, double & z, double & w); // Given a matrix obtained by multiplying roll, pitch, and yaw rotations, by applying // then in this order from right to left, find the roll, pitch, and yaw angles in degrees. // This can return 180 +/- x, if x was the original angle, so it is not a true inverse. void rollPitchYawFromRotationMatrix(vw::Matrix3x3 const& R, // Outputs double & roll, double & pitch, double & yaw); // A function to convert a quaternion given by 4 numbers in x, y, z, w order // to a VW matrix. vw::Matrix3x3 quaternionToMatrix(double const* q); } //end namespace asp #endif//__CORE_CAMERA_TRANSFORMS_H__ ================================================ FILE: src/asp/Core/CartographyUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include namespace asp { // Auto-compute a local projection. It is assumed that the datum is known. // For Earth, use UTM or polar stereographic. For other datums, use // local stereographic. void setAutoProj(double lat, double lon, vw::cartography::GeoReference & output_georef) { vw::cartography::Datum datum = output_georef.datum(); if (datum.name().find("WGS_1984") != std::string::npos) { vw::cartography::Datum user_datum = output_georef.datum(); if (lat > 84) 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"); else if (lat < -80) 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"); else output_georef.set_UTM(vw::cartography::getUTMZone(lat, lon)); } else { output_georef.set_stereographic(lat, lon, 1, 0, 0); } return; } // Snap the coordinates of a BBox2 to a grid spacing. Use floor for min // and ceil for max, so the box always covers at least the original extent. void snapBBox2ToGrid(vw::BBox2 &bbox, double spacing) { bbox.min() = spacing * floor(bbox.min() / spacing); bbox.max() = spacing * ceil(bbox.max() / spacing); } // Same as above but for BBox3. The z component is also snapped. void snapBBox3ToGrid(vw::BBox3 &bbox, double spacing) { bbox.min() = spacing * floor(bbox.min() / spacing); bbox.max() = spacing * ceil(bbox.max() / spacing); } } //end namespace asp ================================================ FILE: src/asp/Core/CartographyUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __CORE_CARTOGRAPHY_UTILS_H__ #define __CORE_CARTOGRAPHY_UTILS_H__ #include #include #include namespace asp { // Auto-compute a local projection. It is assumed that the datum is known. // For Earth, use UTM or polar stereographic. For other datums, use // local stereographic. void setAutoProj(double lat, double lon, vw::cartography::GeoReference & output_georef); // Snap a BBox2 to a grid: floor on min, ceil on max. This ensures the box // covers at least the original extent with corners at integer multiples of // the grid spacing. void snapBBox2ToGrid(vw::BBox2 &bbox, double spacing); // Same as snapBBox2ToGrid but for BBox3. The z component is also snapped. void snapBBox3ToGrid(vw::BBox3 &bbox, double spacing); } //end namespace asp #endif // __CORE_CARTOGRAPHY_UTILS_H__ ================================================ FILE: src/asp/Core/DataLoader.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DataLoader.cc /// #include #include #include using namespace vw; namespace asp { void load_csv_or_dem(std::string const& csv_format_str, std::string const& csv_srs_str, std::string const& reference_terrain, int max_num_reference_points, vw::cartography::GeoReference & geo, // may change // Outputs std::vector & ref_data) { // Wipe the output ref_data.clear(); asp::CsvConv csv_conv; csv_conv.parse_csv_format(csv_format_str, csv_srs_str); csv_conv.parse_georef(geo); vw::BBox2 lonlat_box; // not used bool calc_shift = false; Vector3 shift; // must be set to 0 bool is_lola_rdr_format; double mean_longitude; bool verbose = true; Eigen::MatrixXd data; // Read the reference terrain vw_out() << "Loading at most " << max_num_reference_points << " points from " << reference_terrain << std::endl; std::string file_type = asp::get_cloud_type(reference_terrain); if (file_type == "DEM") asp::load_dem(reference_terrain, max_num_reference_points, lonlat_box, calc_shift, shift, verbose, data); else if (file_type == "CSV") asp::load_csv(reference_terrain, max_num_reference_points, lonlat_box, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, mean_longitude, verbose, data); else vw_throw(ArgumentErr() << "Unsupported file: " << reference_terrain << " of type " << file_type << ".\n"); int num_cols = data.cols(); ref_data.clear(); for (int data_col = 0; data_col < num_cols; data_col++) { vw::Vector3 reference_xyz; for (int row = 0; row < asp::DIM; row++) reference_xyz[row] = data(row, data_col); ref_data.push_back(reference_xyz); } } } // end namespace asp ================================================ FILE: src/asp/Core/DataLoader.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DataLoader.h /// // Keep here some logic for handling data which depends on Eigen // to speed up compilation of bundle_adjust. #ifndef __ASP_CORE_DATA_LOADER_H__ #define __ASP_CORE_DATA_LOADER_H__ #include #include #include namespace vw { namespace cartography { class GeoReference; } } namespace asp { void load_csv_or_dem(std::string const& csv_format_str, std::string const& csv_srs, std::string const& reference_terrain, int max_num_reference_points, vw::cartography::GeoReference & geo, // may change // Outputs std::vector & ref_data); } #endif // __ASP_CORE_DATA_LOADER_H__ ================================================ FILE: src/asp/Core/DemDisparity.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file DEMDisparity.cc // Estimate the low-resolution disparity based on cameras and a DEM. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; using namespace vw; using namespace vw::cartography; namespace asp { // Take a low-res pixel. Make it full res. Undo the transform. Intersect with the DEM. // Return true on success. This is used twice. It is templated so that it can be called // for both ImageViewRef and ImageView. template inline bool lowResPixToDemXyz(Vector2 const& left_lowres_pix, vw::Vector2f const& downsample_scale, vw::TransformPtr tx_left, vw::CamPtr left_camera_model, double dem_error, GeoReference const& dem_georef, DEMImageT & dem, double height_guess, // Outputs vw::Vector3 & left_camera_vec, Vector3 & prev_xyz, Vector3 & xyz) { // Calc the full-res pixel Vector2 left_fullres_pix = elem_quot(left_lowres_pix, downsample_scale); left_fullres_pix = tx_left->reverse(left_fullres_pix); bool has_intersection = false; Vector3 left_camera_ctr; try { left_camera_ctr = left_camera_model->camera_center(left_fullres_pix); left_camera_vec = left_camera_model->pixel_to_vector(left_fullres_pix); } catch (...) { return false; } double height_error_tol = 1e-3; // abs height error double max_abs_tol = 1e-14; // abs cost function change double max_rel_tol = 1e-14; // rel cost function change int num_max_iter = 50; bool treat_nodata_as_zero = false; xyz = camera_pixel_to_dem_xyz(left_camera_ctr, left_camera_vec, dem, dem_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, prev_xyz, height_guess); if (!has_intersection || xyz == Vector3()) return false; // Update the previous guess prev_xyz = xyz; return true; } typedef ImageViewRef> ImgRefT; class DemDisparity: public ImageViewBase { ImgRefT m_left_image; double m_dem_error; GeoReference m_dem_georef; ImageViewRef> m_dem; Vector2f m_downsample_scale; vw::TransformPtr m_tx_left, m_tx_right; boost::shared_ptr m_left_camera_model; boost::shared_ptr m_right_camera_model; int m_pixel_sample; ImageView> & m_disp_spread; double m_height_guess; public: DemDisparity(ImgRefT const& left_image, double dem_error, GeoReference dem_georef, ImageViewRef> const& dem, Vector2f const& downsample_scale, vw::TransformPtr tx_left, vw::TransformPtr tx_right, boost::shared_ptr left_camera_model, boost::shared_ptr right_camera_model, int pixel_sample, ImageView> & disp_spread): m_left_image(left_image.impl()), m_dem_error(dem_error), m_dem_georef(dem_georef), m_dem(dem), m_downsample_scale(downsample_scale), m_tx_left(tx_left), m_tx_right(tx_right), m_left_camera_model(left_camera_model), m_right_camera_model(right_camera_model), m_pixel_sample(pixel_sample), m_disp_spread(disp_spread) { // This can speed up and make more reliable the intersection of rays with the DEM m_height_guess = vw::cartography::demHeightGuess(m_dem); } // ImageView interface typedef PixelMask pixel_type; typedef pixel_type result_type; typedef ProceduralPixelAccessor pixel_accessor; inline int32 cols () const { return m_left_image.cols(); } inline int32 rows () const { return m_left_image.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const { vw_throw(NoImplErr() << "DemDisparity::operator()(...) is not implemented.\n"); return pixel_type(); } typedef CropView> prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { prerasterize_type lowres_disparity = prerasterize_type(ImageView(bbox.width(), bbox.height()), -bbox.min().x(), -bbox.min().y(), cols(), rows()); for (int row = bbox.min().y(); row < bbox.max().y(); row++) { for (int col = bbox.min().x(); col < bbox.max().x(); col++) { lowres_disparity(col, row) = PixelMask(); lowres_disparity(col, row).invalidate(); m_disp_spread(col, row) = PixelMask(); m_disp_spread(col, row).invalidate(); } } // Sample the box on the diagonal and perimeter std::vector points; vw::cartography::sample_int_box(bbox, points); // Make local copies of Map2Camp transforms, as those are not thread-safe vw::TransformPtr local_tx_left; if (dynamic_cast(m_tx_left.get()) != NULL) { local_tx_left = vw::cartography::mapproj_trans_copy(m_tx_left); // Do not cache the transform portion for this tile. That is good when lots // of points are queried from the tile. Here we need a low-resolution // subset, and caching greatly slows things down. #if 0 vw::BBox2 full_res_box; for (int i = 0; i < points.size(); i++) { vw::Vector2 low_res_pix = points[i]; vw::Vector2 full_res_pix = elem_quot(low_res_pix, m_downsample_scale); full_res_box.grow(full_res_pix); } full_res_box.expand(1); // just in case local_tx_left->reverse_bbox(full_res_box); // This will cache what is needed #endif } else { local_tx_left = m_tx_left; } // For the right transform we won't use the "reverse" function, so no need for caching. vw::TransformPtr local_tx_right; if (dynamic_cast(m_tx_right.get()) != NULL) local_tx_right = vw::cartography::mapproj_trans_copy(m_tx_right); else local_tx_right = m_tx_right; // Find the pixel values on a small set of points of the diagonals of // the current tile. // TODO(oalexan1): Use here instead the points computed earlier. // But this would be a lot of points. std::vector diagonals; int wid = bbox.width() - 1, hgt = bbox.height() - 1; int dim = std::max(1, std::max(wid, hgt)/10); for (int i = 0; i <= dim; i++) diagonals.push_back(bbox.min() + Vector2(double(i)*wid/dim, double(i)*hgt/dim)); for (int i = 0; i <= dim; i++) diagonals.push_back(bbox.min() + Vector2(double(i)*wid/dim, hgt - double(i)*hgt/dim)); // Estimate the DEM region we expect to use and crop it into an // ImageView. This will make the algorithm much faster than // accessing individual DEM pixels from disk. BBox2i dem_box; Vector3 prev_xyz; // for storing ray-to-dem intersection from the previous iteration for (unsigned k = 0; k < diagonals.size(); k++) { Vector2 left_lowres_pix = diagonals[k]; vw::Vector3 left_camera_vec, xyz; bool success = lowResPixToDemXyz(left_lowres_pix, m_downsample_scale, local_tx_left, m_left_camera_model, m_dem_error, m_dem_georef, m_dem, m_height_guess, left_camera_vec, prev_xyz, xyz); // outputs if (!success) continue; Vector3 llh = m_dem_georef.datum().cartesian_to_geodetic(xyz); Vector2 pix = round(m_dem_georef.lonlat_to_pixel(subvector(llh, 0, 2))); dem_box.grow(pix); } // Expand the DEM box just in case as the above calculation is // not fool-proof if the DEM has a lot of no-data regions. int expand = std::max(100, (int)(0.1*std::max(dem_box.width(), dem_box.height()))); dem_box.expand(expand); dem_box.crop(bounding_box(m_dem)); // Crop the georef, read the DEM region in memory GeoReference georef_crop = crop(m_dem_georef, dem_box); ImageView> dem_crop = crop(m_dem, dem_box); // Compute the DEM disparity. Use one in every 'm_pixel_sample' pixels. for (int row = bbox.min().y(); row < bbox.max().y(); row++) { if (row % m_pixel_sample != 0) continue; // Must wipe the previous guess since we are now too far from it prev_xyz = Vector3(); for (int col = bbox.min().x(); col < bbox.max().x(); col++) { if (col % m_pixel_sample != 0) continue; Vector2 left_lowres_pix = Vector2(col, row); vw::Vector3 left_camera_vec, xyz; bool success = lowResPixToDemXyz(left_lowres_pix, m_downsample_scale, local_tx_left, m_left_camera_model, m_dem_error, georef_crop, dem_crop, m_height_guess, left_camera_vec, prev_xyz, xyz); // outputs if (!success) continue; // Since our DEM is only known approximately, the true // intersection point of the ray coming from the left camera // with the DEM could be anywhere within m_dem_error from // xyz. Use that to get an estimate of the disparity // error. ImageView> curr_disp(3, 1); double bias[] = {-1.0, 1.0, 0.0}; int success_arr[] = {0, 0, 0}; for (int k = 0; k < curr_disp.cols(); k++) { curr_disp(k, 0).invalidate(); Vector2 right_fullres_pix; try { // TODO(oalexan1): Should the off-nadir angle affect the bias? vw::Vector3 biased_xyz = xyz + bias[k] * m_dem_error * left_camera_vec; // Raw camera pixel right_fullres_pix = m_right_camera_model->point_to_pixel(biased_xyz); // Transformed (mapprojected) camera pixel right_fullres_pix = local_tx_right->forward(right_fullres_pix); } catch (...) { continue; } Vector2 right_lowres_pix = elem_prod(right_fullres_pix, m_downsample_scale); curr_disp(k, 0) = right_lowres_pix - left_lowres_pix; curr_disp(k, 0).validate(); success_arr[k] = 1; // If the disparities at the endpoints of the range were successful, // don't bother with the middle estimate. if (k == 1 && success_arr[0] && success_arr[1]) break; } // Continue if none of the disparities were successful if (!success_arr[0] && !success_arr[1] && !success_arr[2]) continue; // Accumulate the values for which there is success BBox2f search_range; for (int k = 0; k < curr_disp.cols(); k++) { if (success_arr[k] && is_valid(curr_disp(k, 0))) search_range.grow(curr_disp(k, 0).child()); } // These quantities are kept as float, as they can be tiny for large images lowres_disparity(col, row) = (search_range.min() + search_range.max())/2.0; lowres_disparity(col, row).validate(); // Divide by 2 here as later we will expand by this value in both directions m_disp_spread(col, row) = (search_range.max() - search_range.min())/2.0; m_disp_spread(col, row).validate(); } } return lowres_disparity; } template inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class DemDisparity void produce_dem_disparity(ASPGlobalOptions & opt, vw::TransformPtr tx_left, vw::TransformPtr tx_right, boost::shared_ptr left_camera_model, boost::shared_ptr right_camera_model, std::string const& session_name) { if (stereo_settings().is_search_defined()) vw_out(WarningMessage) << "Computing low-resolution disparity from DEM. " << "Will ignore corr-search value: " << stereo_settings().search_range << ".\n"; // Skip pixels to speed things up, particularly for ISIS and DG. int pixel_sample = asp::stereo_settings().disparity_estimation_sample_rate; pixel_sample = std::max(1, pixel_sample); vw::vw_out() << "Low-res disparity estimation sample rate: " << pixel_sample << "\n"; DiskImageView> left_image(opt.out_prefix+"-L.tif"); DiskImageView> left_image_sub(opt.out_prefix+"-L_sub.tif"); // The DEM to use to estimate the disparity std::string dem_file = stereo_settings().disparity_estimation_dem; if (dem_file == "") vw::vw_throw(vw::ArgumentErr() << "dem_disparity: No value was provided for " << "disparity-estimation-dem.\n"); double dem_error = stereo_settings().disparity_estimation_dem_error; if (dem_error < 0.0) vw::vw_throw(vw::ArgumentErr() << "dem_disparity: Invalid value for " << "disparity-estimation-dem-error: " << dem_error << ".\n"); GeoReference dem_georef; bool has_georef = cartography::read_georeference(dem_georef, dem_file); if (!has_georef) vw::vw_throw(vw::ArgumentErr() << "There is no georeference information in: " << dem_file << ".\n"); // Create a masked DEM, by using the no-data value, if present DiskImageView dem_disk_image(dem_file); ImageViewRef> dem = pixel_cast>(dem_disk_image); boost::shared_ptr rsrc(DiskImageResourcePtr(dem_file)); if (rsrc->has_nodata_read()) { double nodata_value = rsrc->nodata_read(); if (!std::isnan(nodata_value)) dem = create_mask(dem_disk_image, nodata_value); } Vector2f downsample_scale(float(left_image_sub.cols()) / float(left_image.cols()), float(left_image_sub.rows()) / float(left_image.rows())); // Smaller tiles is better, as then more threads can run at once Vector2 orig_tile_size = opt.raster_tile_size; opt.raster_tile_size = Vector2i(64, 64); // This image is small enough that we can keep it in memory. It will be created // alongside the low-res disparity image. ImageView> disp_spread(left_image_sub.cols(), left_image_sub.rows()); vw::Stopwatch sw; sw.start(); // Compute and write the low-resolution disparity ImageViewRef> lowres_disparity = DemDisparity(left_image_sub, dem_error, dem_georef, dem, downsample_scale, tx_left, tx_right, left_camera_model, right_camera_model, pixel_sample, disp_spread); std::string disparity_file = opt.out_prefix + "-D_sub.tif"; vw_out() << "Writing low-resolution disparity: " << disparity_file << "\n"; auto tpc1 = TerminalProgressCallback("asp", "\t--> Low-resolution disparity:"); if (session_name.find("isis") != std::string::npos) { // ISIS does not support multi-threading auto drsrc = vw::cartography::build_gdal_rsrc(disparity_file, lowres_disparity, opt); vw::write_image(*drsrc, lowres_disparity, tpc1); } else { vw::cartography::block_write_gdal_image(disparity_file, lowres_disparity, opt, tpc1); } // The disparity spread is in memory by now, so can be written with multiple threads std::string disp_spread_file = opt.out_prefix + "-D_sub_spread.tif"; vw_out() << "Writing low-resolution disparity spread: " << disp_spread_file << "\n"; auto tpc2 = TerminalProgressCallback("asp", "\t--> Low-resolution disparity spread:"); vw::cartography::block_write_gdal_image(disp_spread_file, disp_spread, opt, tpc2); sw.stop(); vw_out() << "Low-res disparity elapsed time: " << sw.elapsed_seconds() << " s.\n"; // Go back to the original tile size opt.raster_tile_size = orig_tile_size; return; } // end produce_dem_disparity() } // end namespace asp ================================================ FILE: src/asp/Core/DemDisparity.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DEMDisparity.h /// #ifndef __DEM_DISPARITY_H__ #define __DEM_DISPARITY_H__ #include #include // Forward declaration namespace asp { struct ASPGlobalOptions; } namespace vw { namespace camera { class CameraModel; } } namespace asp { /// Use a DEM to get the low-res disparity void produce_dem_disparity(ASPGlobalOptions & opt, vw::TransformPtr tx_left, vw::TransformPtr tx_right, boost::shared_ptr left_camera_model, boost::shared_ptr right_camera_model, std::string const& session_name); } #endif ================================================ FILE: src/asp/Core/DemMosaic.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include // Low-level functions for DEM mosaicking namespace asp { // Blur the weights. To try to make the weights not drop much at the // boundary, expand the weights with zero, blur, crop back to the // original region. // It is highly important to note that blurring can increase the weights // at the boundary, even with the extension done above. Erosion before // blurring does not help with that, as for weights with complicated // boundary erosion can wipe things in a non-uniform way leaving // huge holes. To get smooth weights, if really desired one should // use the weights-exponent option. void blurWeights(vw::ImageView & weights, double sigma) { if (sigma <= 0) return; int half_kernel = vw::compute_kernel_size(sigma)/2; int extra = half_kernel + 1; // to guarantee we stay zero at boundary int cols = weights.cols(), rows = weights.rows(); vw::ImageView extra_wts(cols + 2*extra, rows + 2*extra); vw::fill(extra_wts, 0); for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { if (weights(col,row) > 0) extra_wts(col + extra, row + extra) = weights(col, row); else extra_wts(col + extra, row + extra) = 0; } } vw::ImageView blurred_wts = vw::gaussian_filter(extra_wts, sigma); // Copy back. The weights must not grow. In particular, where the // original weights were zero, the new weights must also be zero, as // at those points there is no DEM data. for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { if (weights(col, row) > 0) { weights(col, row) = blurred_wts(col + extra, row + extra); } //weights(col, row) = std::min(weights(col, row), blurred_wts(col + extra, row + extra)); } } } void applyExternalWeights(std::string const& weight_file, double min_weight, bool invert_weights, vw::BBox2i const& in_box, vw::ImageView& local_wts) { vw::DiskImageResourceGDAL rsrc(weight_file); vw::DiskImageView disk_weight(rsrc); vw::ImageView external_weight = vw::crop(disk_weight, in_box); // Must have the same size as the local weights if (local_wts.cols() != external_weight.cols() || local_wts.rows() != external_weight.rows()) vw::vw_throw(vw::ArgumentErr() << "The external weights must have the same size as the DEM.\n"); // Read the no-data value. Any no-data weights will be ignored. double weight_nodata = -std::numeric_limits::max(); if (rsrc.has_nodata_read()) weight_nodata = rsrc.nodata_read(); // Limit from below if (min_weight > 0) { for (int col = 0; col < external_weight.cols(); col++) { for (int row = 0; row < external_weight.rows(); row++) { bool good = (external_weight(col, row) != weight_nodata); if (!good) continue; external_weight(col, row) = std::max(external_weight(col, row), min_weight); } } } // See if to invert the weight if (invert_weights) { for (int col = 0; col < external_weight.cols(); col++) { for (int row = 0; row < external_weight.rows(); row++) { bool good = (external_weight(col, row) != weight_nodata); if (!good) continue; if (external_weight(col, row) > 0) external_weight(col, row) = 1.0 / external_weight(col, row); } } } // Multiply the local weights by the external weights for (int col = 0; col < local_wts.cols(); col++) { for (int row = 0; row < local_wts.rows(); row++) { bool good = (external_weight(col, row) != weight_nodata); if (!good) continue; local_wts(col, row) *= external_weight(col, row); } } return; } // Compute a weight that is zero, then rises, plateaus, and then falls. // hCenterLine contains the center column at each row/col // hMaxDistArray contains the width of the column at each row/col // TODO(oalexan1): Move this to VW, and see about overwriting // the other weight functions. The other one uses normalization, which is bad. double computePlateauedWeights(vw::Vector2 const& pix, bool horizontal, std::vector const& centers, std::vector const& widths, double max_weight_val) { int primary_axis = 0, secondary_axis = 1; // Vertical if (horizontal) { primary_axis = 1; secondary_axis = 0; } // We round below, to avoid issues when we are within numerical value // to an integer value for row/col. // To do: Need to do interpolation here. int pos = (int)round(pix[primary_axis]); // The row or column if (pos < 0 || pos >= (int)widths.size() || pos >= (int)centers.size()) return 0; double max_dist = widths[pos]/2.0; // Half column width double center = centers[pos]; double dist = fabs(pix[secondary_axis]-center); // Pixel distance from center column if (max_dist <= 0 || dist < 0) return 0; // We want to make sure the weight is positive (even if small) at // the first/last valid pixel. double tol = 1e-8*max_dist; // The weight is not normalized. This is a bugfix. Normalized weights result // in higher weights in narrow regions, which is not what we want. double weight = std::max(0.0, max_dist - dist + tol); weight = std::min(max_weight_val, weight); return weight; } // Compute centerline weights using plateaued weight function (not normalized, // unlike VW's version). Distinguishes interior holes from border pixels and // assigns them different values for DEM mosaicking. void centerlineWeightsWithHoles(vw::ImageView> const& img, vw::ImageView & weights, double max_weight_val) { int numRows = img.rows(); int numCols = img.cols(); // Arrays to be returned out of this function std::vector hCenterLine (numRows, 0); std::vector hMaxDistArray(numRows, 0); std::vector vCenterLine (numCols, 0); std::vector vMaxDistArray(numCols, 0); std::vector minValInRow(numRows, 0); std::vector maxValInRow(numRows, 0); std::vector minValInCol(numCols, 0); std::vector maxValInCol(numCols, 0); for (int k = 0; k < numRows; k++) { minValInRow[k] = numCols; maxValInRow[k] = 0; } for (int col = 0; col < numCols; col++) { minValInCol[col] = numRows; maxValInCol[col] = 0; } // Note that we do just a single pass through the image to compute // both the horizontal and vertical min/max values. for (int row = 0 ; row < numRows; row++) { for (int col = 0; col < numCols; col++) { if (!is_valid(img(col,row))) continue; // Record the first and last valid column in each row if (col < minValInRow[row]) minValInRow[row] = col; if (col > maxValInRow[row]) maxValInRow[row] = col; // Record the first and last valid row in each column if (row < minValInCol[col]) minValInCol[col] = row; if (row > maxValInCol[col]) maxValInCol[col] = row; } } // For each row, record central column and the column width for (int row = 0; row < numRows; row++) { hCenterLine [row] = (minValInRow[row] + maxValInRow[row])/2.0; hMaxDistArray [row] = maxValInRow[row] - minValInRow[row]; if (hMaxDistArray[row] < 0) hMaxDistArray[row]=0; } // For each row, record central column and the column width for (int col = 0 ; col < numCols; col++) { vCenterLine [col] = (minValInCol[col] + maxValInCol[col])/2.0; vMaxDistArray [col] = maxValInCol[col] - minValInCol[col]; if (vMaxDistArray[col] < 0) vMaxDistArray[col]=0; } // Process the entire image vw::BBox2i output_bbox = vw::bounding_box(img); // Compute the weighting for each pixel in the image weights.set_size(output_bbox.width(), output_bbox.height()); vw::fill(weights, 0); for (int row = output_bbox.min().y(); row < output_bbox.max().y(); row++) { for (int col = output_bbox.min().x(); col < output_bbox.max().x(); col++) { bool inner_row = ((row >= minValInCol[col]) && (row <= maxValInCol[col])); bool inner_col = ((col >= minValInRow[row]) && (col <= maxValInRow[row])); bool inner_pixel = inner_row && inner_col; vw::Vector2 pix(col, row); double new_weight = 0; // Invalid pixels usually get zero weight if (is_valid(img(col,row))) { double weight_h = computePlateauedWeights(pix, true, hCenterLine, hMaxDistArray, max_weight_val); double weight_v = computePlateauedWeights(pix, false, vCenterLine, vMaxDistArray, max_weight_val); new_weight = weight_h*weight_v; } else { // Invalid pixel new_weight = 0; } weights(col-output_bbox.min().x(), row-output_bbox.min().y()) = new_weight; } } } // Smooth step function using error function. Returns 0 at x=0, M at x=M, // with smooth S-curve transition. Higher L gives flatter ends and steeper middle. double erfSmoothStep(double x, double M, double L) { if (x <= 0) return 0; if (x >= M) return M; return 0.5*M*(1 + boost::math::erf (0.5*sqrt(M_PI) * (2*x*L/M - L))); } // Convert a projected-space bounding box to pixel coordinates with snapping. // Transforms all 4 corners, rounds near-integer values (within tol) to integers, // then floors/ceils to ensure integer pixel boundaries. vw::BBox2 pointToPixelBboxSnapped(vw::cartography::GeoReference const& georef, vw::BBox2 const& point_bbox, double tol) { vw::BBox2 pix_box; vw::Vector2 corners[] = {point_bbox.min(), point_bbox.max(), vw::Vector2(point_bbox.min().x(), point_bbox.max().y()), vw::Vector2(point_bbox.max().x(), point_bbox.min().y())}; for (int i = 0; i < 4; i++) pix_box.grow(georef.point_to_pixel(corners[i])); // Round values that are likely due to numerical error if (norm_2(pix_box.min() - round(pix_box.min())) < tol) pix_box.min() = round(pix_box.min()); if (norm_2(pix_box.max() - round(pix_box.max())) < tol) pix_box.max() = round(pix_box.max()); // Grow the box until the corners are integer pix_box.min() = floor(pix_box.min()); pix_box.max() = ceil (pix_box.max()); return pix_box; } // Read a georeference from a file and throw if not found. vw::cartography::GeoReference readGeorefOrThrow(std::string const& file) { vw::cartography::GeoReference geo; bool is_good = vw::cartography::read_georeference(geo, file); if (!is_good) vw::vw_throw(vw::ArgumentErr() << "No georeference found in " << file << ".\n"); return geo; } // A helper function to do interpolation. Will not interpolate when // exactly on the grid. This does not interpolate when the weight is 0, // as that suggests the DEM is no-data there. // TODO(oalexan1): This is awkward. Better use a masked DEM throughout. DoubleGrayA interpDem(double x, double y, vw::ImageView const& dem, vw::ImageViewRef const& interp_dem, double tol, bool propagate_nodata) { DoubleGrayA pval; // Round to nearest integer location int i0 = round(x), j0 = round(y); if ((fabs(x-i0) < tol) && (fabs(y-j0) < tol) && ((i0 >= 0) && (i0 <= dem.cols()-1) && (j0 >= 0) && (j0 <= dem.rows()-1))) { // A lot of care is needed here. We are at an integer // pixel, save for numerical error. Just borrow pixel's // value, and don't interpolate. Interpolation can result // in invalid pixels if the current pixel is valid but its // neighbors are not. It can also make it appear is if the // current indices are out of bounds while in fact they // are barely so. pval = dem(i0, j0); } else { // We are not right on an integer pixel and we need to interpolate // Below must use x <= cols()-1 as x is double bool is_good = ((x >= 0) && (x <= dem.cols()-1) && (y >= 0) && (y <= dem.rows()-1)); if (!is_good) { pval.a() = 0; // Flag as nodata return pval; // Outside the loaded DEM bounds, skip to the next pixel } // If we have weights of 0, that means there are invalid pixels, so skip this point. int i0 = (int)floor(x), j0 = (int)floor(y); int i1 = (int)ceil(x), j1 = (int)ceil(y); bool nodata = ((dem(i0, j0).a() == 0) || (dem(i1, j0).a() == 0) || (dem(i0, j1).a() == 0) || (dem(i1, j1).a() == 0)); bool border = ((dem(i0, j0).a() < 0) || (dem(i1, j0).a() < 0) || (dem(i0, j1).a() < 0) || (dem(i1, j1).a() < 0)); if (nodata || border) { pval.v() = 0; pval.a() = -1; // Flag as border if (propagate_nodata && !border) pval.a() = 0; // Flag as nodata } else pval = interp_dem(x, y); // Things checked out, do the interpolation. } return pval; } // Pixel and weight manipulation utilities void invalidateByThreshold(double threshold, double nodata_value, vw::ImageView & dem) { for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (dem(col, row)[0] <= threshold) dem(col, row)[0] = nodata_value; } } } void invalidateNaN(double nodata_value, vw::ImageView & dem) { for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (std::isnan(dem(col, row)[0])) dem(col, row)[0] = nodata_value; } } } void setNoDataByWeight(double out_nodata_value, vw::ImageView & tile, vw::ImageView & weight) { for (int col = 0; col < weight.cols(); col++) { for (int row = 0; row < weight.rows(); row++) { if (weight(col, row) <= 0) tile(col, row) = out_nodata_value; } } } void clampWeights(double bias, vw::ImageView & weight) { for (int col = 0; col < weight.cols(); col++) { for (int row = 0; row < weight.rows(); row++) { weight(col, row) = std::min(weight(col, row), double(bias)); } } } void raiseToPower(double exponent, vw::ImageView & weight) { for (int col = 0; col < weight.cols(); col++) { for (int row = 0; row < weight.rows(); row++) { weight(col, row) = pow(weight(col, row), exponent); } } } void setWeightsAsAlphaChannel(vw::ImageView const& weights, vw::ImageView& dem) { for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { dem(col, row).a() = weights(col, row); } } } void divideByWeight(vw::ImageView & tile, vw::ImageView const& weights) { for (int c = 0; c < tile.cols(); c++) { for (int r = 0; r < tile.rows(); r++) { if (weights(c, r) > 0) tile(c, r) /= weights(c, r); } } } void demMosaicDatumCheck(std::vector const& georefs, vw::cartography::GeoReference const& out_georef) { double out_major_axis = out_georef.datum().semi_major_axis(); double out_minor_axis = out_georef.datum().semi_minor_axis(); for (int i = 0; i < (int)georefs.size(); i++) { double this_major_axis = georefs[i].datum().semi_major_axis(); double this_minor_axis = georefs[i].datum().semi_minor_axis(); if (std::abs(this_major_axis - out_major_axis) > 0.1 || std::abs(this_minor_axis - out_minor_axis) > 0.1 || georefs[i].datum().meridian_offset() != out_georef.datum().meridian_offset()) { vw::vw_throw(vw::NoImplErr() << "Mosaicking of DEMs with differing datum radii " << " or meridian offsets is not implemented. Datums encountered:\n" << georefs[i].datum() << "\n" << out_georef.datum() << "\n"); } if (georefs[i].datum().name() != out_georef.datum().name() && this_major_axis == out_major_axis && this_minor_axis == out_minor_axis && georefs[i].datum().meridian_offset() == out_georef.datum().meridian_offset()) { vw::vw_out(vw::WarningMessage) << "Found DEMs with the same radii and meridian offsets, " << "but different names: " << georefs[i].datum().name() << " and " << out_georef.datum().name() << "\n"; } } } void accumWeightedTiles(double out_nodata_value, int save_dem_weight, int dem_index, vw::ImageView const& tile_clip, vw::ImageView const& weight_clip, // Outputs vw::ImageView & tile, vw::ImageView & weights, vw::ImageView & saved_weight) { for (int col = 0; col < weight_clip.cols(); col++) { for (int row = 0; row < weight_clip.rows(); row++) { double wt = weight_clip(col, row); if (wt <= 0) continue; // nothing to do // Initialize the tile if (tile(col, row) == out_nodata_value) tile(col, row) = 0; tile(col, row) += wt*tile_clip(col, row); weights(col, row) += wt; if (dem_index == save_dem_weight) saved_weight(col, row) = wt; } } } void computeWeightedAverage(int save_dem_weight, vw::ImageView & tile, vw::ImageView & weights, vw::ImageView & saved_weight) { for (int col = 0; col < tile.cols(); col++) { for (int row = 0; row < weights.rows(); row++) { if (weights(col, row) > 0) tile(col, row) /= weights(col, row); if (save_dem_weight >= 0 && weights(col, row) > 0) saved_weight(col, row) /= weights(col, row); } } } void saveTileWeight(int dem_iter, vw::BBox2i const& bbox, vw::ImageView const& local_wts, vw::cartography::GeoReference const& georef) { std::ostringstream os; os << "weights_" << dem_iter << "_" << bbox.min().x() << "_" << bbox.min().y() << ".tif"; vw::vw_out() << "Writing: " << os.str() << "\n"; bool has_georef = true, has_nodata = true; vw::cartography::block_write_gdal_image(os.str(), local_wts, has_georef, georef, has_nodata, -100, vw::GdalWriteOptions(), vw::TerminalProgressCallback("asp", "")); } } // end namespace asp ================================================ FILE: src/asp/Core/DemMosaic.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DemMosaic.h /// Utility functions for dem_mosaic #ifndef __ASP_CORE_DEM_MOSAIC_H__ #define __ASP_CORE_DEM_MOSAIC_H__ #include #include #include #include #include #include // Forward declarations namespace vw { namespace cartography { class GeoReference; } } namespace asp { void blurWeights(vw::ImageView & weights, double sigma); void applyExternalWeights(std::string const& weight_file, double min_weight, bool invert_weights, vw::BBox2i const& in_box, vw::ImageView& local_wts); double computePlateauedWeights(vw::Vector2 const& pix, bool horizontal, std::vector const& centers, std::vector const& widths, double max_weight_val); // Compute centerline weights using plateaued weight function. Distinguishes // between interior holes (assigned hole_fill_value) and border pixels (-1). void centerlineWeightsWithHoles(vw::ImageView> const& img, vw::ImageView & weights, double max_weight_val); double erfSmoothStep(double x, double M, double L); // Convert a projected-space bounding box to pixel coordinates with snapping. // Transforms all 4 corners, rounds near-integer values (within tol) to integers, // then floors/ceils to ensure integer pixel boundaries. vw::BBox2 pointToPixelBboxSnapped(vw::cartography::GeoReference const& georef, vw::BBox2 const& point_bbox, double tol); // Read a georeference from a file and throw if not found. vw::cartography::GeoReference readGeorefOrThrow(std::string const& file); typedef vw::PixelGrayA DoubleGrayA; DoubleGrayA interpDem(double x, double y, vw::ImageView const& dem, vw::ImageViewRef const& interp_dem, double tol, bool propagate_nodata); // Pixel and weight manipulation utilities void invalidateByThreshold(double threshold, double nodata_value, vw::ImageView & dem); void invalidateNaN(double nodata_value, vw::ImageView & dem); void setNoDataByWeight(double out_nodata_value, vw::ImageView & tile, vw::ImageView & weight); void clampWeights(double bias, vw::ImageView & weight); void raiseToPower(double exponent, vw::ImageView & weight); void setWeightsAsAlphaChannel(vw::ImageView const& weights, vw::ImageView& dem); // Tile processing utilities void divideByWeight(vw::ImageView & tile, vw::ImageView const& weights); void demMosaicDatumCheck(std::vector const& georefs, vw::cartography::GeoReference const& out_georef); void accumWeightedTiles(double out_nodata_value, int save_dem_weight, int dem_index, vw::ImageView const& tile_clip, vw::ImageView const& weight_clip, // Outputs vw::ImageView & tile, vw::ImageView & weights, vw::ImageView & saved_weight); void computeWeightedAverage(int save_dem_weight, vw::ImageView & tile, vw::ImageView & weights, vw::ImageView & saved_weight); void saveTileWeight(int dem_iter, vw::BBox2i const& bbox, vw::ImageView const& local_wts, vw::cartography::GeoReference const& georef); } // end namespace asp #endif //__ASP_CORE_DEM_MOSAIC_H__ ================================================ FILE: src/asp/Core/DemMosaicOptions.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DemMosaicOptions.h /// Options structure for dem_mosaic #ifndef __ASP_CORE_DEM_MOSAIC_OPTIONS_H__ #define __ASP_CORE_DEM_MOSAIC_OPTIONS_H__ #include #include #include #include #include #include namespace asp { struct DemMosaicOptions: vw::GdalWriteOptions { std::string dem_list, out_prefix, target_srs_string, output_type, tile_list_str, weight_list, dem_list_file; std::vector dem_files, weight_files; double tr, geo_tile_size; bool has_out_nodata, force_projwin; double out_nodata_value; int tile_size, tile_index, erode_len, priority_blending_len, extra_crop_len, hole_fill_len, block_size, save_dem_weight, fill_num_passes; double weights_exp, weights_blur_sigma, dem_blur_sigma; double nodata_threshold, fill_search_radius, fill_power, fill_percent, min_weight; bool first, last, min, max, block_max, mean, stddev, median, nmad, count, tap, gdal_tap, save_index_map, use_centerline_weights, propagate_nodata, no_border_blend, invert_weights; std::set tile_list; vw::BBox2 projwin; DemMosaicOptions(): tr(0), geo_tile_size(0), has_out_nodata(false), force_projwin(false), tile_index(-1), erode_len(0), priority_blending_len(0), extra_crop_len(0), hole_fill_len(0), block_size(0), save_dem_weight(-1), fill_search_radius(0), fill_power(0), fill_percent(0), fill_num_passes(0), weights_exp(0), weights_blur_sigma(0.0), dem_blur_sigma(0.0), nodata_threshold(std::numeric_limits::quiet_NaN()), first(false), last(false), min(false), max(false), block_max(false), mean(false), stddev(false), median(false), nmad(false), count(false), save_index_map(false), tap(false), gdal_tap(false), use_centerline_weights(false), projwin(vw::BBox2()), invert_weights(false) {} }; // Return the number of no-blending options selected inline int numNoBlendOptions(DemMosaicOptions const& opt) { return int(opt.first) + int(opt.last) + int(opt.min) + int(opt.max) + int(opt.mean) + int(opt.stddev) + int(opt.median) + int(opt.nmad) + int(opt.count) + int(opt.block_max); } } // end namespace asp #endif //__ASP_CORE_DEM_MOSAIC_OPTIONS_H__ ================================================ FILE: src/asp/Core/DemMosaicParse.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DemMosaicParse.cc /// Parse and validate dem_mosaic options #include #include #include #include #include #include #include #include #include namespace po = boost::program_options; namespace fs = boost::filesystem; namespace asp { void handleDemMosaicArgs(int argc, char *argv[], asp::DemMosaicOptions& opt) { double nan = std::numeric_limits::quiet_NaN(); po::options_description general_options("Options"); general_options.add_options() ("dem-list,l", po::value(&opt.dem_list), "A text file listing the DEM files to mosaic, one per line.") ("output-prefix,o", po::value(&opt.out_prefix), "Specify the output prefix. One or more tiles will be written with this prefix. " "Alternatively, an exact output file can be specified, with a .tif extension.") ("tile-size", po::value(&opt.tile_size)->default_value(1000000), "The maximum size of output DEM tile files to write, in pixels.") ("tile-index", po::value(&opt.tile_index), "The index of the tile to save (starting from zero). When this program is invoked, " "it will print out how many tiles are there. Default: save all tiles.") ("tile-list", po::value(&opt.tile_list_str)->default_value(""), "List of tile indices (in quotes) to save. A tile index starts from 0.") ("priority-blending-length", po::value(&opt.priority_blending_len)->default_value(0), "If positive, keep unmodified values from the earliest available DEM except a band " "this wide measured in pixels inward of its boundary where blending with subsequent " "DEMs will happen.") ("no-border-blend", po::bool_switch(&opt.no_border_blend)->default_value(false), "Only apply blending around holes, don't blend at image borders. Not compatible with " "centerline weights.") ("tr", po::value(&opt.tr), "Output grid size, that is, the DEM resolution in target georeferenced units per " "pixel. Default: use the same resolution as the first DEM to be mosaicked.") ("t_srs", po::value(&opt.target_srs_string)->default_value(""), "Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). " "If not provided, use the one from the first DEM to be mosaicked.") ("t_projwin", po::value(&opt.projwin), "Limit the mosaic to this region, with the corners given in georeferenced " "coordinates (xmin ymin xmax ymax). Max is exclusive. See the --gdal-tap and --tap " "options if desired to apply addition adjustments to this extent.") ("gdal-tap", po::bool_switch(&opt.gdal_tap)->default_value(false), "Ensure that the output mosaic bounds (as printed by gdalinfo) are integer multiples " "of the grid size (as set with --tr). When --t_projwin is set and its entries are " "integer multiples of the grid size, that precise extent will be produced on output. " "This functions as the GDAL -tap option.") ("tap", po::bool_switch(&opt.tap)->default_value(false), "Let the output grid be at integer multiples of the grid size (like the default " "behavior of point2dem and mapproject. Then the mosaic extent is biased by an " "additional half a pixel. If this option is not set, the input grids determine the " "output grid. See also --gdal-tap.") ("first", po::bool_switch(&opt.first)->default_value(false), "Keep the first encountered DEM value (in the input order).") ("last", po::bool_switch(&opt.last)->default_value(false), "Keep the last encountered DEM value (in the input order).") ("min", po::bool_switch(&opt.min)->default_value(false), "Keep the smallest encountered DEM value.") ("max", po::bool_switch(&opt.max)->default_value(false), "Keep the largest encountered DEM value.") ("mean", po::bool_switch(&opt.mean)->default_value(false), "Find the mean DEM value.") ("stddev", po::bool_switch(&opt.stddev)->default_value(false), "Find the standard deviation of the DEM values.") ("median", po::bool_switch(&opt.median)->default_value(false), "Find the median DEM value (this can be memory-intensive, fewer threads are " "suggested).") ("nmad", po::bool_switch(&opt.nmad)->default_value(false), "Find the normalized median absolute deviation DEM value (this can be " "memory-intensive, fewer threads are suggested).") ("count", po::bool_switch(&opt.count)->default_value(false), "Each pixel is set to the number of valid DEM heights at that pixel.") ("weight-list", po::value(&opt.weight_list), "A text file having a list of external weight files to use in blending, one per " "line. These are multiplied by the internal weights to ensure seamless blending. The " "weights must be in one-to-one correspondence with the DEMs to be mosaicked.") ("invert-weights", po::bool_switch(&opt.invert_weights)->default_value(false), "Use 1/weight instead of weight in blending, with --weight-list.") ("min-weight", po::value(&opt.min_weight)->default_value(0.0), "Limit from below with this value the weights provided with --weight-list.") ("hole-fill-length", po::value(&opt.hole_fill_len)->default_value(0), "Maximum dimensions of a hole in the DEM to fill, in pixels. See also " "--fill-search-radius.") ("fill-search-radius", po::value(&opt.fill_search_radius)->default_value(0.0), "Fill an invalid pixel with a weighted average of pixel values within this radius in " "pixels. The weight is 1/(factor * dist^power + 1), where the distance is measured " "in pixels. See an example in the doc. See also --fill-power, --fill-percent and " "--fill-num-passes.") ("fill-power", po::value(&opt.fill_power)->default_value(8.0), "Power exponent to use when filling nodata values with --fill-search-radius.") ("fill-percent", po::value(&opt.fill_percent)->default_value(10.0), "Fill an invalid pixel using weighted values of neighbors only if the percentage of " "valid pixels within the radius given by --fill-search-radius is at least this") ("fill-num-passes", po::value(&opt.fill_num_passes)->default_value(0), "Fill invalid values using --fill-search-radius this many times.") ("erode-length", po::value(&opt.erode_len)->default_value(0), "Erode the DEM by this many pixels at boundary.") ("block-max", po::bool_switch(&opt.block_max)->default_value(false), "For each block of size --block-size, keep the DEM with the largest sum of values in " "the block.") ("georef-tile-size", po::value(&opt.geo_tile_size), "Set the tile size in georeferenced (projected) units (e.g., degrees or meters).") ("output-nodata-value", po::value(&opt.out_nodata_value), "No-data value to use on output. Default: use the one from the first DEM to be " "mosaicked.") ("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.") ("weights-blur-sigma", po::value(&opt.weights_blur_sigma)->default_value(5.0), "The standard deviation of the Gaussian used to blur the weights. Higher value " "results in smoother weights and blending. Set to 0 to not use blurring.") ("weights-exponent", po::value(&opt.weights_exp)->default_value(2.0), "The weights used to blend the DEMs should increase away from the boundary as a " "power with this exponent. Higher values will result in smoother but faster-growing " "weights.") ("use-centerline-weights", po::bool_switch(&opt.use_centerline_weights)->default_value(false), "Compute weights based on a DEM centerline algorithm. Produces smoother weights if " "the input DEMs don't have holes or complicated boundary.") ("dem-blur-sigma", po::value(&opt.dem_blur_sigma)->default_value(0.0), "Blur the DEM using a Gaussian with this value of sigma. A larger value will blur " "more. Default: No blur.") ("nodata-threshold", po::value(&opt.nodata_threshold)->default_value(nan), "Values no larger than this number will be interpreted as no-data.") ("propagate-nodata", po::bool_switch(&opt.propagate_nodata)->default_value(false), "Set a pixel to nodata if any input DEM is also nodata at that location.") ("extra-crop-length", po::value(&opt.extra_crop_len)->default_value(200), "Crop the DEMs this far from the current tile (measured in pixels) before blending " "them (a small value may result in artifacts). This value also helps determine how " "to plateau the blending weights inwards, away from the DEM boundary.") ("block-size", po::value(&opt.block_size)->default_value(0), "Process the mosaic with this value of the block size. A large value can result in " "increased memory usage. Later, the mosaic will be saved with blocks given by " "--tif-tile-size. This is an advanced internal parameter.") ("save-dem-weight", po::value(&opt.save_dem_weight), "Save the weight image that tracks how much the input DEM with given index " "contributed to the output mosaic at each pixel (smallest index is 0).") ("force-projwin", po::bool_switch(&opt.force_projwin)->default_value(false), "Make the output mosaic fill precisely the specified projwin, by padding it if " "necessary and aligning the output grid to the region.") ("save-index-map", po::bool_switch(&opt.save_index_map)->default_value(false), "For each output pixel, save the index of the input DEM it came from (applicable " "only for --first, --last, --min, --max, --median, and --nmad). A text file with the " "index assigned to each input DEM is saved as well.") ("dem-list-file", po::value(&opt.dem_list_file), "Alias for --dem-list, kept for backward compatibility.") ; // Use in GdalWriteOptions '--tif-tile-size' rather than '--tile-size', to not conflict // with the '--tile-size' definition used by this tool. bool adjust_tile_size_opt = true; general_options.add(vw::GdalWriteOptionsDescription(opt, adjust_tile_size_opt)); // The input DEM files are either specified as positional arguments or in a list, // via --dem-list. po::options_description positional(""); positional.add_options() ("dem-files", po::value>(), "Input DEM files"); po::positional_options_description positional_desc; positional_desc.add("dem-files", -1); std::string usage("[options] -o output.tif"); bool allow_unregistered = false; std::vector unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); opt.dem_files.clear(); if (vm.count("dem-files") != 0) opt.dem_files = vm["dem-files"].as>(); // Error checking if (opt.out_prefix == "") vw::vw_throw(vw::ArgumentErr() << "No output prefix was specified.\n" << usage << general_options); if (opt.num_threads == 0) vw::vw_throw(vw::ArgumentErr() << "The number of threads must be set and positive.\n" << usage << general_options); if (opt.erode_len < 0) vw::vw_throw(vw::ArgumentErr() << "The erode length must not be negative.\n" << usage << general_options); if (opt.extra_crop_len < 0) vw::vw_throw(vw::ArgumentErr() << "The blending length must not be negative.\n" << usage << general_options); if (opt.hole_fill_len < 0) vw::vw_throw(vw::ArgumentErr() << "The hole fill length must not be negative.\n" << usage << general_options); if (opt.fill_search_radius < 0.0) vw::vw_throw(vw::ArgumentErr() << "The fill search radius must be non-negative.\n" << usage << general_options); if (opt.fill_power < 0.0) vw::vw_throw(vw::ArgumentErr() << "The fill factor must be non-negative.\n" << usage << general_options); if (opt.fill_percent <= 0.0 || opt.fill_percent > 100.0) vw::vw_throw(vw::ArgumentErr() << "The fill percent must be in the range (0, 100].\n" << usage << general_options); if (opt.fill_num_passes < 0) vw::vw_throw(vw::ArgumentErr() << "The number of fill passes must not be negative.\n" << usage << general_options); if (opt.tile_size <= 0) vw::vw_throw(vw::ArgumentErr() << "The size of a tile in pixels must be positive.\n" << usage << general_options); if (opt.priority_blending_len < 0) vw::vw_throw(vw::ArgumentErr() << "The priority blending length must not be negative.\n" << usage << general_options); // This is a bug fix. The user by mistake passed in an empty projection string. if (!vm["t_srs"].defaulted() && opt.target_srs_string.empty()) vw::vw_throw(vw::ArgumentErr() << "The value of --t_srs is empty. Then it must not be set at all.\n"); // If priority blending is used, need to adjust extra_crop_len accordingly opt.extra_crop_len = std::max(opt.extra_crop_len, 3*opt.priority_blending_len); // Make sure no more than one of these options is enabled. int noblend = numNoBlendOptions(opt); if (noblend > 1) vw::vw_throw(vw::ArgumentErr() << "At most one of the options --first, --last, " << "--min, --max, -mean, --stddev, --median, --nmad, --count can be specified.\n" << usage << general_options); if (opt.geo_tile_size < 0) vw::vw_throw(vw::ArgumentErr() << "The size of a tile in georeferenced units must not be negative.\n" << usage << general_options); if (noblend && opt.priority_blending_len > 0) { vw::vw_throw(vw::ArgumentErr() << "Priority blending cannot happen if any of the statistics DEMs are computed.\n" << usage << general_options); } if (opt.priority_blending_len > 0 && opt.weights_exp == 2) { vw::vw_out() << "Increasing --weights-exponent to 3 for smoother blending.\n"; opt.weights_exp = 3; } if (noblend && !opt.first && !opt.last && !opt.min && !opt.max && !opt.mean && opt.save_dem_weight >= 0) { vw::vw_throw(vw::ArgumentErr() << "Cannot save the weights unless blending is on or one of " << "--first, --last, --min, --max, --mean is invoked.\n" << usage << general_options); } if (opt.save_index_map && !opt.first && !opt.last && !opt.min && !opt.max && !opt.median && !opt.nmad) vw::vw_throw(vw::ArgumentErr() << "Cannot save an index map unless one of " << "--first, --last, --min, --max, --median, --nmad is invoked.\n" << usage << general_options); if (opt.save_dem_weight >= 0 && opt.save_index_map) vw::vw_throw(vw::ArgumentErr() << "Cannot save both the index map and the DEM weights at the same time.\n" << usage << general_options); // For compatibility with the GDAL tools, allow the min and max to be reversed. if (opt.projwin != vw::BBox2()) { if (opt.projwin.min().x() > opt.projwin.max().x()) std::swap(opt.projwin.min().x(), opt.projwin.max().x()); if (opt.projwin.min().y() > opt.projwin.max().y()) std::swap(opt.projwin.min().y(), opt.projwin.max().y()); } if (opt.weights_blur_sigma < 0.0) vw::vw_throw(vw::ArgumentErr() << "The value --weights-blur-sigma must be non-negative.\n" << usage << general_options); if (opt.dem_blur_sigma < 0.0) vw::vw_throw(vw::ArgumentErr() << "The value --dem-blur-sigma must be non-negative.\n" << usage << general_options); if (opt.weights_exp <= 0) vw::vw_throw(vw::ArgumentErr() << "The weights exponent must be positive.\n" << usage << general_options); if (opt.priority_blending_len > 0 && opt.use_centerline_weights) vw::vw_throw(vw::ArgumentErr() << "The --priority-blending-length and --use-centerline-weights options " << "cannot be used together, as the latter expects no holes in the DEM, " << "but the priority blending length works by internally hollowing out " << "the non-priority DEMs before blending.\n"); // Cannot have both --dem-list and --dem-list-file. The latter is for backward // compatibility. if (opt.dem_list != "" && opt.dem_list_file != "") vw::vw_throw(vw::ArgumentErr() << "Cannot have both --dem-list and --dem-list-file.\n"); if (opt.dem_list_file != "") { opt.dem_list = opt.dem_list_file; opt.dem_list_file = ""; } // Read the DEMs if (opt.dem_list != "") { // Get them from a list if (!opt.dem_files.empty()) { // Concatenate all the options into a single string std::string extra_list = ""; for (size_t s = 0; s < opt.dem_files.size(); s++) extra_list += opt.dem_files[s]; vw::vw_throw(vw::ArgumentErr() << "The DEMs were specified via a list. There were however " << "extraneous files or options passed in: " << extra_list << ".\n"); } asp::read_list(opt.dem_list, opt.dem_files); if (opt.dem_files.empty()) vw::vw_throw(vw::ArgumentErr() << "No DEM files to mosaic.\n"); } else { // Get them from the command line if (opt.dem_files.empty()) vw::vw_throw(vw::ArgumentErr() << "No input DEMs were specified.\n"); } if (int(opt.dem_files.size()) <= opt.save_dem_weight) vw::vw_throw(vw::ArgumentErr() << "Cannot save weights for given index as it is out of bounds.\n"); // When too many things should be done at the same time it is tricky // to have them work correctly. So prohibit that. Let the user run // one operation at a time. int num_ops = (opt.dem_blur_sigma > 0) + (opt.hole_fill_len > 0) + (opt.fill_search_radius > 0) + (opt.erode_len > 0); if (num_ops > 1) vw::vw_throw(vw::ArgumentErr() << "Cannot fill holes (based on size or search radius), blur, " << "and erode the input DEM at the same time.\n"); if (num_ops > 0 && (opt.target_srs_string != "" || opt.tr > 0 || opt.dem_files.size() > 1 || opt.priority_blending_len > 0)) vw::vw_throw(vw::ArgumentErr() << "Cannot fill holes (based on size or search radius), " << "blur, or erode, if there is more than one input DEM, or reprojection, " << "or priority blending is desired. These operations should be done " << "one at a time as there may be issues due to the fact each input DEM has " << "its own grid size and also the order of operations.\n"); if (opt.priority_blending_len > 0 && (opt.tap || opt.gdal_tap || opt.force_projwin || !opt.projwin.empty() || !opt.weight_list.empty() || opt.invert_weights || opt.min_weight > 0 || opt.propagate_nodata)) vw::vw_throw(vw::ArgumentErr() << "The option --priority-blending-length should not be mixed with other " << "options. Do each operation individually.\n"); if (opt.tap && opt.gdal_tap) vw::vw_throw(vw::ArgumentErr() << "The options --tap and --gdal-tap cannot be used together.\n"); // print warning usign vw warning message if (opt.fill_search_radius > 30) vw::vw_out(vw::WarningMessage) << "The fill search radius is large. " << "This may result in slow execution time.\n"; // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); if (!vm.count("output-nodata-value")) { // Set a default out_nodata_value, but remember that this is // set internally, not by the user. opt.has_out_nodata = false; opt.out_nodata_value = -std::numeric_limits::max(); } else { opt.has_out_nodata = true; } // Cast this to float. All our nodata are float. opt.nodata_threshold = float(opt.nodata_threshold); if (!std::isnan(opt.nodata_threshold) && noblend) vw::vw_throw(vw::ArgumentErr() << "The option --nodata-threshold cannot be used together with " << "some other invoked options.\n"); // Parse the list of tiles to save. First replace commas and semicolons by a space. std::replace(opt.tile_list_str.begin(), opt.tile_list_str.end(), ',', ' '); std::replace(opt.tile_list_str.begin(), opt.tile_list_str.end(), ';', ' '); opt.tile_list.clear(); std::istringstream os(opt.tile_list_str); int val; while (os >> val) opt.tile_list.insert(val); // The block size must be a multiple of 16. Handle this early. if (opt.block_size % 16 != 0) vw::vw_throw(vw::ArgumentErr() << "The block size must be a multiple of 16.\n"); // Handle the option --weight-list. if (opt.weight_list != "") { if (noblend || opt.priority_blending_len > 0 || !std::isnan(opt.nodata_threshold)) vw::vw_throw(vw::ArgumentErr() << "Cannot do anything except regular blending with the option " << "--weight-list.\n"); asp::read_list(opt.weight_list, opt.weight_files); // Must have the same number of weights as DEMs if (opt.weight_files.size() != opt.dem_files.size()) vw::vw_throw(vw::ArgumentErr() << "The number of weights in the file " << opt.weight_list << " must match the number of DEMs.\n"); // Read each DEM temporarily and each weight to get their sizes and georefs. Those // must agree. for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++) { vw::DiskImageView dem(opt.dem_files[dem_iter]); vw::DiskImageView weight(opt.weight_files[dem_iter]); // Check cols and rows if (dem.cols() != weight.cols() || dem.rows() != weight.rows()) vw::vw_throw(vw::ArgumentErr() << "The DEM " << opt.dem_files[dem_iter] << " and its weight " << opt.weight_files[dem_iter] << " have different dimensions.\n"); vw::cartography::GeoReference dem_georef, weight_georef; bool has_dem_georef = vw::cartography::read_georeference(dem_georef, opt.dem_files[dem_iter]); bool has_weight_georef = vw::cartography::read_georeference(weight_georef, opt.weight_files[dem_iter]); if (!has_dem_georef) vw::vw_throw(vw::ArgumentErr() << "The DEM " << opt.dem_files[dem_iter] << " has no georeference.\n"); if (!has_weight_georef) vw::vw_throw(vw::ArgumentErr() << "The weight " << opt.weight_files[dem_iter] << " has no georeference.\n"); // Must have the same wkt string if (dem_georef.get_wkt() != weight_georef.get_wkt()) vw::vw_throw(vw::ArgumentErr() << "The DEM " << opt.dem_files[dem_iter] << " and its weight " << opt.weight_files[dem_iter] << " have different georeferences.\n"); } // end for each DEM } // end if weight list } // End function handleDemMosaicArgs } // end namespace asp ================================================ FILE: src/asp/Core/DemMosaicParse.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DemMosaicParse.h /// Parse and validate dem_mosaic options #ifndef __ASP_CORE_DEM_MOSAIC_PARSE_H__ #define __ASP_CORE_DEM_MOSAIC_PARSE_H__ #include namespace asp { // Process the dem_mosaic options and sanity checks void handleDemMosaicArgs(int argc, char *argv[], asp::DemMosaicOptions& opt); } // end namespace asp #endif // __ASP_CORE_DEM_MOSAIC_PARSE_H__ ================================================ FILE: src/asp/Core/DemUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { // Given an image pixel, trace a ray to the ground and find the intersection. void queryPixel(std::string const& dem_file, vw::CamPtr camera_model, vw::Vector2 const& query_pixel) { // The DEM file must be provided if (dem_file.empty()) vw::vw_throw(vw::ArgumentErr() << "The DEM file must be provided to be able to query a pixel.\n"); // Read the georef. It must exist. vw::cartography::GeoReference dem_georef; bool has_georef = vw::cartography::read_georeference(dem_georef, dem_file); if (!has_georef) vw::vw_throw(vw::ArgumentErr() << "The DEM file must have a georeference.\n"); // Read the no-data double nodata_val = -std::numeric_limits::max(); // note we use a float nodata vw::read_nodata_val(dem_file, nodata_val); // ignore the success status // Create the masked DEM vw::ImageViewRef> masked_dem = vw::create_mask(vw::DiskImageView(dem_file), nodata_val); vw::Vector3 cam_ctr = camera_model->camera_center(query_pixel); vw::Vector3 cam_dir = camera_model->pixel_to_vector(query_pixel); double height_guess = vw::cartography::demHeightGuess(masked_dem); // Intersect the ray going from the given camera pixel with a DEM // Use xyz_guess as initial guess and overwrite it with the new value bool treat_nodata_as_zero = false; bool has_intersection = false; double dem_height_error_tol = 1e-3; // 1 mm double max_abs_tol = std::min(dem_height_error_tol, 1e-14); double max_rel_tol = max_abs_tol; int num_max_iter = 100; vw::Vector3 xyz_guess(0, 0, 0); vw::Vector3 xyz = vw::cartography::camera_pixel_to_dem_xyz (cam_ctr, cam_dir, masked_dem, dem_georef, treat_nodata_as_zero, has_intersection, dem_height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess, height_guess); double nan = std::numeric_limits::quiet_NaN(); vw::Vector3 llh(nan, nan, nan); vw::Vector2 dem_pix(nan, nan); if (has_intersection) { llh = dem_georef.datum().cartesian_to_geodetic(xyz); dem_pix = dem_georef.lonlat_to_pixel(vw::Vector2(llh[0], llh[1])); } vw::vw_out() << std::setprecision(17) << "DEM intersection point (lon, lat, height): " << llh[0] << ' ' << llh[1] << ' ' << llh[2] << "\n" << "DEM intersection pixel (column, row, height): " << dem_pix[0] << ' ' << dem_pix[1] << ' ' << llh[2] << "\n"; } // Prepare a DEM file that encompasses a given image and with a given height. void setupDem(vw::ImageViewRef img, vw::cartography::GeoReference const& image_georef, std::string const& tag, std::string const& out_prefix, double dem_height, // Outputs std::string & dem_path, double & dem_nodata, vw::cartography::GeoReference & dem_georef, vw::ImageView & dem) { dem_path = out_prefix + "-" + tag + "-ortho-dem.tif"; dem_nodata = -1e+6; // projection box vw::BBox2 img_bbox = vw::bounding_box(img); vw::BBox2 img_proj_box = image_georef.pixel_to_point_bbox(img_bbox); // Number of pixels and grid size of the DEM. The DEM need not be big. Its // has constant height anyway. dem_georef = image_georef; double num = 100.0; double proj_width = img_proj_box.width(); double proj_height = img_proj_box.height(); double tr = std::max(proj_width/num, proj_height/num); // Set up the transform vw::Matrix3x3 T = dem_georef.transform(); if (T(0,0) <= 0.0 || T(1, 1) >= 0.0) vw::vw_throw(vw::ArgumentErr() << "Nonstandard orthoimage encountered. The " << "pixel size must be positive in x and negative in y."); T(0, 0) = tr; T(1, 1) = -tr; dem_georef.set_transform(T); // The DEM box will be a bit bigger to ensure it fully covers the image double s = 5.0; vw::BBox2 dem_proj_box = img_proj_box; dem_proj_box.min() = tr * (floor(dem_proj_box.min()/tr) - vw::Vector2(s, s)); dem_proj_box.max() = tr * (ceil(dem_proj_box.max()/tr) + vw::Vector2(s, s)); // This crop will make the upper-left DEM pixel agree with dem_proj_box, and // also ensure that the pixel interpretation (PixelAsArea or PixelAsPoint) // is respected. vw::Vector2 pix1 = dem_georef.point_to_pixel(dem_proj_box.min()); vw::Vector2 pix2 = dem_georef.point_to_pixel(dem_proj_box.max()); vw::BBox2 dem_pix_box; dem_pix_box.grow(pix1); dem_pix_box.grow(pix2); dem_georef = vw::cartography::crop(dem_georef, dem_pix_box); // Recompute the corner pixels after the crop pix1 = dem_georef.point_to_pixel(dem_proj_box.min()); pix2 = dem_georef.point_to_pixel(dem_proj_box.max()); dem_pix_box = vw::BBox2(); dem_pix_box.grow(pix1); dem_pix_box.grow(pix2); // Create the DEM with given corner pixels and set all values to the given // height dem = vw::ImageView(dem_pix_box.width(), dem_pix_box.height()); for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { dem(col, row) = dem_height; } } // Sanity check dem_proj_box = dem_georef.pixel_to_point_bbox(vw::bounding_box(dem)); if (!dem_proj_box.contains(img_proj_box)) vw::vw_throw(vw::ArgumentErr() << "The DEM box does not fully cover the image box."); } // Prepare a DEM file that encompasses a given image and with a given height, // or reuse the one already available if agrees with what is intended. void setupOrCheckDem(vw::GdalWriteOptions const& options, vw::ImageViewRef img, vw::cartography::GeoReference const& image_georef, std::string const& tag, std::string const& out_prefix, double dem_height, // Outputs std::string & dem_path) { // Using a DEM in double precision is better than float, as otherwise heights // such as 20.1 are not saved accurately enough as floats (stray digits show // up at the end). vw::ImageView dem; double dem_nodata = -std::numeric_limits::max(); // will change vw::cartography::GeoReference dem_georef; // Set it up, but don't write to to disk yet setupDem(img, image_georef, tag, out_prefix, dem_height, dem_path, dem_nodata, dem_georef, dem); // See how it agrees with what is on disk bool good_already = false; if (fs::exists(dem_path)) { vw::DiskImageView disk_dem(dem_path); vw::cartography::GeoReference disk_dem_georef; bool has_georef = read_georeference(disk_dem_georef, dem_path); bool has_same_values = true; for (int col = 0; col < disk_dem.cols(); col++) { for (int row = 0; row < disk_dem.rows(); row++) { if (std::abs(disk_dem(col, row) - dem_height) > 1e-6) { has_same_values = false; break; } } if (!has_same_values) break; } if (has_georef && has_same_values && dem_georef.get_wkt() == disk_dem_georef.get_wkt()) good_already = true; // The DEM on disk should not be smaller in extent than the one we want to // write. It is not clear if when tiles are run in parallel the images // are cropped, but in that case the DEM on disk could be bigger, and we // don't want to overwrite the DEM in parallel. vw::BBox2 disk_box = vw::bounding_box(disk_dem); vw::BBox2 disk_proj_box = disk_dem_georef.pixel_to_point_bbox(disk_box); vw::BBox2 curr_bbox = vw::bounding_box(dem); vw::BBox2 curr_proj_box = dem_georef.pixel_to_point_bbox(curr_bbox); if (!disk_proj_box.contains(curr_proj_box)) good_already = false; } if (!good_already) { vw::vw_out() << "Writing mapprojection DEM for " << tag << " image: " << dem_path << "\n"; bool has_georef = true, has_nodata = true; vw::TerminalProgressCallback tpc("asp", ": "); vw::cartography::block_write_gdal_image(dem_path, dem, has_georef, dem_georef, has_nodata, dem_nodata, options, tpc); } else { vw::vw_out() << "Mapprojection DEM for " << tag << " image: " << dem_path << "\n"; } } // Function to convert a masked geodetic vector to a masked altitude vector. // This returns the 3rd component of the input vector while taking into // account the mask. class MGeodeticToMAltitude: public vw::ReturnFixedType> { public: vw::PixelMask operator()(vw::PixelMask const& v) const { if (!vw::is_valid(v)) return vw::PixelMask(); return vw::PixelMask(v.child()[2]); } }; // Function to mask NaN pixels class MaskNaN: public vw::ReturnFixedType> { public: vw::PixelMask operator()(vw::PixelMask const& v) const { if (!vw::is_valid(v) || std::isnan(v.child())) return vw::PixelMask(); return v; } }; // Given two DEMs, warp the second one to the first one's georef, and crop // to a pixel box in first DEM's coordinates. vw::ImageViewRef> warpCrop(vw::ImageViewRef dem2, double dem2_nodata, vw::cartography::GeoReference const& dem2_georef, vw::cartography::GeoReference const& dem1_georef, vw::BBox2i const& dem1_crop_box, std::string const& interp_type) { if (dem1_crop_box.empty()) vw::vw_throw(vw::ArgumentErr() << "The two DEMs do not have a common area.\n"); auto masked_dem2 = vw::create_mask(dem2, dem2_nodata); // Prepare the image for applying the geotransform // TODO(oalexan1): Why go from elevations to geodetic and then back? auto dem2_geo = vw::cartography::dem_to_geodetic(masked_dem2, dem2_georef); auto dem2_alt = vw::per_pixel_filter(dem2_geo, MGeodeticToMAltitude()); auto ext = vw::ValueEdgeExtension>(vw::PixelMask()); vw::ImageViewRef> warped_dem2; if (interp_type == "bilinear") warped_dem2 = vw::cartography::geo_transform(dem2_alt, dem2_georef, dem1_georef, ext, vw::BilinearInterpolation()); else if (interp_type == "bicubic") warped_dem2 = vw::cartography::geo_transform(dem2_alt, dem2_georef, dem1_georef, ext, vw::BicubicInterpolation()); else vw::vw_throw(vw::ArgumentErr() << "Unknown interpolation type: " << interp_type << ".\n"); vw::ImageViewRef> dem2_trans = vw::per_pixel_filter(vw::crop(warped_dem2, dem1_crop_box), MaskNaN()); return dem2_trans; } // Given a DEM, estimate the median grid size in x and in y in meters. // Given that the DEM heights are in meters as well, having these grid sizes // will make it possible to handle heights and grids in same units. void calcGsd(vw::ImageViewRef const& dem, vw::cartography::GeoReference const& geo, double nodata_val, int sample_col_rate, int sample_row_rate, double & gridx, double & gridy) { // Initialize the outputs gridx = 0; gridy = 0; // Estimate the median height std::vector heights; for (int col = 0; col < dem.cols(); col += sample_col_rate) { for (int row = 0; row < dem.rows(); row += sample_row_rate) { double h = dem(col, row); if (h == nodata_val) continue; heights.push_back(h); } } double median_height = 0.0; int len = heights.size(); if (len > 0) { std::sort(heights.begin(), heights.end()); median_height = 0.5*(heights[(len-1)/2] + heights[len/2]); } // Find the grid sizes by estimating the Euclidean distances // between points of a DEM at constant height. std::vector gridx_vec, gridy_vec; for (int col = 0; col < dem.cols() - 1; col += sample_col_rate) { for (int row = 0; row < dem.rows() - 1; row += sample_row_rate) { // The xyz position at the center grid point vw::Vector2 lonlat = geo.pixel_to_lonlat(vw::Vector2(col, row)); vw::Vector3 lonlat3 = vw::Vector3(lonlat(0), lonlat(1), median_height); vw::Vector3 base = geo.datum().geodetic_to_cartesian(lonlat3); // The xyz position at the right grid point lonlat = geo.pixel_to_lonlat(vw::Vector2(col+1, row)); lonlat3 = vw::Vector3(lonlat(0), lonlat(1), median_height); vw::Vector3 right = geo.datum().geodetic_to_cartesian(lonlat3); // The xyz position at the bottom grid point lonlat = geo.pixel_to_lonlat(vw::Vector2(col, row+1)); lonlat3 = vw::Vector3(lonlat(0), lonlat(1), median_height); vw::Vector3 bottom = geo.datum().geodetic_to_cartesian(lonlat3); gridx_vec.push_back(vw::math::norm_2(right-base)); gridy_vec.push_back(vw::math::norm_2(bottom-base)); } } // Median grid size if (!gridx_vec.empty()) gridx = vw::math::destructive_median(gridx_vec); if (!gridy_vec.empty()) gridy = vw::math::destructive_median(gridy_vec); return; } } //end namespace asp ================================================ FILE: src/asp/Core/DemUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __CORE_DEM_UTILS_H__ #define __CORE_DEM_UTILS_H__ #include #include #include #include #include #include // Forward declarations namespace vw { namespace cartography { class GeoReference; } class GdalWriteOptions; } namespace asp { // Given an image pixel, trace a ray to the ground and find the intersection. void queryPixel(std::string const& dem_file, vw::CamPtr camera_model, vw::Vector2 const& query_pixel); // Prepare a DEM file that encompasses a given image and with a given height, // or reuse the one already available if agrees with what is intended. void setupOrCheckDem(vw::GdalWriteOptions const& options, vw::ImageViewRef img, vw::cartography::GeoReference const& image_georef, std::string const& tag, std::string const& out_prefix, double dem_height, // Outputs std::string & dem_path); // Given two DEMs, warp the second one to the first one's georef, and crop // to a pixel box in first DEM's coordinates. vw::ImageViewRef> warpCrop(vw::ImageViewRef dem2, double dem2_nodata, vw::cartography::GeoReference const& dem2_georef, vw::cartography::GeoReference const& dem1_georef, vw::BBox2i const& dem1_crop_box, std::string const& interp_type); // Estimate the GSD of a DEM in meters void calcGsd(vw::ImageViewRef const& dem, vw::cartography::GeoReference const& geo, double nodata_val, int sample_col_rate, int sample_row_rate, double & gridx, double & gridy); } //end namespace asp #endif//__CORE_DEM_UTILS_H__ ================================================ FILE: src/asp/Core/DisparityProcessing.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::cartography; namespace asp { /// Load the D_sub file fully in memory bool load_D_sub(std::string const& d_sub_file, ImageView> & sub_disp) { if (!boost::filesystem::exists(d_sub_file)) return false; // Check the data type of the file. boost::shared_ptr rsrc(DiskImageResourcePtr(d_sub_file)); ChannelTypeEnum disp_data_type = rsrc->channel_type(); if (disp_data_type == VW_CHANNEL_INT32) // Cast the integer file to float sub_disp = copy(pixel_cast>(DiskImageView>(d_sub_file))); else // File on disk is float sub_disp = copy(DiskImageView>(d_sub_file)); return true; } // Load the low-res disparity and the scale needed to convert it to full-res void load_D_sub_and_scale(std::string const & out_prefix, std::string const & d_sub_file, vw::ImageView> & sub_disp, vw::Vector2 & upsample_scale) { DiskImageView L(out_prefix + "-L.tif"); if (!load_D_sub(d_sub_file, sub_disp)) { std::string msg = "Could not read low-res disparity: " + d_sub_file + ". " + "Check your run. See if --skip-low-res-disparity-comp is on."; vw_throw(ArgumentErr() << msg << "\n"); } upsample_scale = Vector2(double(L.cols()) / double(sub_disp.cols()), double(L.rows()) / double(sub_disp.rows())); } // Filter D_sub. All alignment methods are supported. void filter_D_sub(ASPGlobalOptions const& opt, vw::TransformPtr tx_left, vw::TransformPtr tx_right, boost::shared_ptr left_camera_model, boost::shared_ptr right_camera_model, vw::cartography::Datum const& datum, std::string const& d_sub_file, Vector2 const& outlier_removal_params) { if (outlier_removal_params[0] >= 100.0) return; // The user chose to skip outlier filtering vw_out() << "Filtering outliers in D_sub based on --outlier-removal-params.\n"; double pct = outlier_removal_params[0]; double factor = outlier_removal_params[1]; double pct_fraction = 1.0 - pct/100.0; vw::ImageView> sub_disp; vw::Vector2 upsample_scale; asp::load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale); // Will save the sub PC file, since we compute these anyway // for the purpose of filtering. vw::ImageView> sub_pc(sub_disp.cols(), sub_disp.rows()); for (int col = 0; col < sub_pc.cols(); col++) { for (int row = 0; row < sub_pc.rows(); row++) { for (int coord = 0; coord < 4; coord++) { sub_pc(col, row)[coord] = 0; } } } // Find the disparity values in x and y std::vector dx, dy; for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { vw::PixelMask disp = sub_disp(col, row); if (!is_valid(disp)) continue; Vector2 left_pix(col, row); Vector2 right_pix = left_pix + disp.child(); double diffX = right_pix.x() - left_pix.x(); double diffY = right_pix.y() - left_pix.y(); dx.push_back(diffX); dy.push_back(diffY); } } // This can happen on occasion with very bad data. Just skip the filtering. if (dx.empty()) { vw::vw_out(vw::WarningMessage) << "Filtering did not succeed, skipping.\n"; return; } // Find the outlier brackets based on values in x and y double bx = -1.0, ex = -1.0; vw::math::find_outlier_brackets(dx, pct_fraction, factor, bx, ex); vw_out() <<"Inlier range based on x coordinate of disparity: " << bx << ' ' << ex <<".\n"; double by = -1.0, ey = -1.0; vw::math::find_outlier_brackets(dy, pct_fraction, factor, by, ey); vw_out() <<"Inlier range based on y coordinate of disparity: " << by << ' ' << ey <<".\n"; int count = 0; for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { vw::PixelMask disp = sub_disp(col, row); if (!is_valid(disp)) continue; Vector2 left_pix(col, row); Vector2 right_pix = left_pix + disp.child(); double diffX = right_pix.x() - left_pix.x(); double diffY = right_pix.y() - left_pix.y(); if (diffX < bx || diffX > ex || diffY < by || diffY > ey) { sub_disp(col, row).invalidate(); count++; } } } vw_out() << "Number (and fraction) of removed outliers by disparity values in x and y: " << count << " (" << double(count)/(sub_disp.cols() * sub_disp.rows()) << ").\n"; // Set up the stereo model for doing triangulation double angle_tol = vw::stereo::StereoModel ::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180); stereo::StereoModel model(left_camera_model.get(), right_camera_model.get(), angle_tol); float HIGH_ERROR = std::numeric_limits::max(); ImageView tri_err(sub_disp.cols(), sub_disp.rows()); ImageView height(sub_disp.cols(), sub_disp.rows()); for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { vw::PixelMask disp = sub_disp(col, row); if (!is_valid(disp)) { tri_err(col, row) = HIGH_ERROR; height(col, row) = HIGH_ERROR; continue; } Vector2 left_pix(col, row); Vector2 right_pix = left_pix + disp.child(); // Scale to full resolution left_pix = elem_prod(left_pix, upsample_scale); right_pix = elem_prod(right_pix, upsample_scale); // Undo the alignment transform left_pix = tx_left->reverse(left_pix); right_pix = tx_right->reverse(right_pix); double err; Vector3 xyz; try { xyz = model(left_pix, right_pix, err); } catch (...) { xyz = Vector3(); } // The call returns the zero error and zero xyz to indicate a // failed ray intersection so replace it in those cases with a // very high error. if (err == 0 || xyz == Vector3()) { tri_err(col, row) = HIGH_ERROR; height(col, row) = HIGH_ERROR; continue; } tri_err(col, row) = err; // Save the triangulated point Vector P; subvector(P, 0, 3) = xyz; P[3] = err; sub_pc(col, row) = P; Vector3 llh = datum.cartesian_to_geodetic(xyz); height(col, row) = llh[2]; } } // Put the valid heights in a vector std::vector vals; // Careful below to avoid integer overflow vals.reserve(std::int64_t(sub_disp.cols()) * std::int64_t(sub_disp.rows())); vals.clear(); for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { if (height(col, row) >= HIGH_ERROR) continue; // already invalid vals.push_back(height(col, row)); } } // Print a warning if no valid points were found. Maybe the cameras // are too similar. if (vals.empty()) { vw::vw_out(vw::WarningMessage) << "No valid points found during triangulation. " << "Skipping any further outlier removal. Check the stereo convergence " << "angle or consider reducing the value of --min-triangulation-angle.\n"; return; } // Find the outlier brackets double b = -1.0, e = -1.0; vw::math::find_outlier_brackets(vals, pct_fraction, factor, b, e); vw_out() <<"Height above datum inlier range: " << b << ' ' << e <<".\n"; // Apply the outlier threshold count = 0; for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { if (height(col, row) >= HIGH_ERROR) continue; // already invalid if (height(col, row) < b || height(col, row) > e) { height(col, row) = HIGH_ERROR; tri_err(col, row) = HIGH_ERROR; count++; } } } vw_out() << "Number (and fraction) of removed outliers by the height check: " << count << " (" << double(count)/(sub_disp.cols() * sub_disp.rows()) << ").\n"; // Put the tri errors in a vector vals.clear(); for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { if (tri_err(col, row) >= HIGH_ERROR) continue; // already invalid vals.push_back(tri_err(col, row)); } } // Find the outlier brackets. Since the triangulation errors, unlike // the heights, are usually rather uniform, adjust pct from 95 to // 90. double pct2 = std::max((90.0/95.0) * outlier_removal_params[0], 0.5); double pct_fraction2 = 1.0 - pct2/100.0; // Show some lenience below as due to jitter some errors could be somewhat bigger double factor2 = 2.0 * factor; b = -1.0; e = -1.0; vw::math::find_outlier_brackets(vals, pct_fraction2, factor2, b, e); vw_out() <<"Triangulation error inlier range: " << b << ' ' << e <<".\n"; // Apply the outlier threshold count = 0; for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { if (tri_err(col, row) >= HIGH_ERROR) continue; // already invalid // We will ignore b, as the triangulation errors are non-negative. if (tri_err(col, row) > e) { height(col, row) = HIGH_ERROR; tri_err(col, row) = HIGH_ERROR; count++; } } } vw_out() << "Number (and fraction) of removed outliers by the triangulation error check: " << count << " (" << double(count)/(sub_disp.cols() * sub_disp.rows()) << ").\n"; // TODO(oalexan1): Filter by user-given height range and max tri error. // Invalidate the D_sub entries that are outliers for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { if (tri_err(col, row) >= HIGH_ERROR || height(col, row) >= HIGH_ERROR) { sub_disp(col, row).invalidate(); // Invalidate the point in the cloud subvector(sub_pc(col, row), 0, 3) = Vector3(0.0, 0.0, 0.0); sub_pc(col, row)[3] = 0.0; } } } // See how many valid disparity pixels are left int num_valid = 0; for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { if (is_valid(sub_disp(col, row))) num_valid++; } } // If no luck, print a warning and return if (num_valid == 0) { vw::vw_out(vw::WarningMessage) << "No valid disparity values left after filtering. " << "Skipping this step.\n"; return; } vw_out() << "Writing filtered D_sub: " << d_sub_file << std::endl; block_write_gdal_image(d_sub_file, sub_disp, opt, TerminalProgressCallback("asp","\t D_sub: ")); std::string pc_sub_file = opt.out_prefix + "-PC_sub.tif"; vw_out() << "Writing triangulated point cloud based on D_sub: " << pc_sub_file << std::endl; block_write_gdal_image(pc_sub_file, sub_pc, opt, TerminalProgressCallback("asp","\t PC_sub: ")); } // Filter D_sub by reducing its spread around the median. Return the count of // removed pixels. int dispSpreadFilter(vw::ImageView> & sub_disp, double max_disp_spread, vw::Vector2 const& upsample_scale) { if (max_disp_spread <= 0.0) return 0; vw_out() << "Filtering outliers in D_sub based on --max-disp-spread.\n"; std::vector dx, dy; for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { vw::PixelMask disp = sub_disp(col, row); if (!is_valid(disp)) continue; Vector2 left_pix(col, row); Vector2 right_pix = left_pix + disp.child(); // Scale to full resolution left_pix = elem_prod(left_pix, upsample_scale); right_pix = elem_prod(right_pix, upsample_scale); double diffX = right_pix.x() - left_pix.x(); double diffY = right_pix.y() - left_pix.y(); dx.push_back(diffX); dy.push_back(diffY); } } // Do not throw an error, as sometimes the disparity is empty because // some other filtering may have removed all points in degenerate cases. // Just continue with the run and hope for the best. if (dx.empty()) { vw::vw_out(vw::WarningMessage) << "Empty disparity. Will not continue with filtering.\n"; return 0; } std::sort(dx.begin(), dx.end()); std::sort(dy.begin(), dy.end()); double mid_x = dx[dx.size()/2]; // median double mid_y = dy[dy.size()/2]; double half = max_disp_spread / 2.0; BBox2 spread_box(mid_x - half, mid_y - half, max_disp_spread, max_disp_spread); // Wipe offending disparities int count = 0; for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { vw::PixelMask disp = sub_disp(col, row); if (!is_valid(disp)) continue; Vector2 left_pix(col, row); Vector2 right_pix = left_pix + disp.child(); // Scale to full resolution left_pix = elem_prod(left_pix, upsample_scale); right_pix = elem_prod(right_pix, upsample_scale); double diffX = right_pix.x() - left_pix.x(); double diffY = right_pix.y() - left_pix.y(); Vector2 d(diffX, diffY); if (!spread_box.contains(d)) { count++; sub_disp(col, row).invalidate(); } } } return count; } // Filter D_sub by reducing its spread around the median. Read from disk, filter, // and write back to disk. void dispSpreadFilterIO(ASPGlobalOptions const& opt, std::string const& d_sub_file, double max_disp_spread) { if (max_disp_spread <= 0.0) return; vw::ImageView> sub_disp; vw::Vector2 upsample_scale; asp::load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale); int filteredCount = dispSpreadFilter(sub_disp, max_disp_spread, upsample_scale); double ratio = double(filteredCount) / (sub_disp.cols() * sub_disp.rows()); vw_out() << "Number (and fraction) of removed outliers by the disp spread check: " << filteredCount << " (" << ratio << ").\n"; vw_out() << "Writing filtered D_sub: " << d_sub_file << std::endl; block_write_gdal_image(d_sub_file, sub_disp, opt, TerminalProgressCallback("asp","\t D_sub: ")); } // Compute an unaligned disparity image from the input disparity image // and the image transforms. // Note that the output image size is not the same as the input disparity image. class UnalignDisparityView: public ImageViewBase{ DispImageType const& m_disparity; vw::TransformPtr const& m_left_transform; vw::TransformPtr const& m_right_transform; ASPGlobalOptions const& m_opt; int m_num_cols, m_num_rows; bool m_is_map_projected; std::map , Vector2> m_unaligned_trans; public: UnalignDisparityView(bool is_map_projected, DispImageType const& disparity, vw::TransformPtr const& left_transform, vw::TransformPtr const& right_transform, ASPGlobalOptions const& opt): m_is_map_projected(is_map_projected), m_disparity(disparity), m_left_transform(left_transform), m_right_transform(right_transform), m_opt(opt), m_num_cols(0), m_num_rows(0) { // Compute the output image size if (!m_is_map_projected) { // The left image passed as input is the original // unprojected/unaligned one, hence use its size. std::string left_file = m_opt.in_file1; DiskImageView left_img(left_file); m_num_cols = left_img.cols(); m_num_rows = left_img.rows(); } else { // Map projected, need to check all the pixel coordinates. // This is going to be slow for large images! BBox2i img_box; // Use sampling as this operation is very slow. int sample_len = 10; int num_min_samples = 100; int col_sample = std::max(1, std::min(sample_len, m_disparity.cols()/num_min_samples)); int row_sample = std::max(1, std::min(sample_len, m_disparity.rows()/num_min_samples)); vw_out() << "\nEstimating the unaligned disparity dimensions.\n"; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = col_sample / std::max(double(m_disparity.cols()), 1.0); tpc.report_progress(0); for (int col = 0; col < m_disparity.cols(); col++) { // Ensure that the last column is picked if (col % col_sample != 0 && col != m_disparity.cols() - 1) continue; for (int row = 0; row < m_disparity.rows(); row++) { // Ensure that the last row is picked if (row % row_sample != 0 && row != m_disparity.rows() - 1) continue; // This is quite important to avoid an incorrectly computed img_box. typename DispImageType::pixel_type dpix = m_disparity(col, row); if (!is_valid(dpix)) continue; // Unalign the left pixel Vector2 left_pix; try { left_pix = m_left_transform->reverse(Vector2(col, row)); } catch (...) { continue; } img_box.grow(left_pix); // Save this lookup map for the future m_unaligned_trans[std::make_pair(col, row)] = left_pix; } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); // Grow the box to account for the fact that we did a sub-sampling // and may have missed some points. Vector2 diff = img_box.max() - img_box.min(); if (!img_box.empty()) { img_box.grow(img_box.min() - 0.1*diff); img_box.grow(img_box.max() + 0.1*diff); } m_num_cols = img_box.max().x(); m_num_rows = img_box.max().y(); vw_out() << "Dimensions are: " << m_num_cols << ' ' << m_num_rows << ".\n"; } // Done computing the input image size } // End constructor // ImageView interface typedef PixelMask pixel_type; typedef pixel_type result_type; typedef ProceduralPixelAccessor pixel_accessor; inline int32 cols () const { return m_num_cols; } inline int32 rows () const { return m_num_rows; } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const { vw_throw(vw::NoImplErr() << "UnalignDisparityView::operator()(...) is not implemented"); return pixel_type(); } typedef CropView > prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { vw::TransformPtr local_left_transform; vw::TransformPtr local_right_transform; // For map-projected images the transforms are not thread-safe, // hence need to make a copy of them. if (!m_is_map_projected) { local_left_transform = m_left_transform; local_right_transform = m_right_transform; }else{ local_left_transform = vw::cartography::mapproj_trans_copy(m_left_transform); local_right_transform = vw::cartography::mapproj_trans_copy(m_right_transform); } // We will do some averaging int KERNEL_SIZE = 1; BBox2i curr_bbox = bbox; curr_bbox.expand(2*KERNEL_SIZE); curr_bbox.crop(BBox2i(0, 0, cols(), rows())); // Initialize the unaligned disparity values for this tile. ImageView unaligned_disp(curr_bbox.width(), curr_bbox.height()); ImageView count(curr_bbox.width(), curr_bbox.height()); for (int col = 0; col < curr_bbox.width(); col++) { for (int row = 0; row < curr_bbox.height(); row++) { unaligned_disp(col, row) = pixel_type(); unaligned_disp(col, row).invalidate(); count(col, row) = 0; } } // Find the bounding box of pixels we will need from the disparity image. // For mapprojected images the forward() function is not always accurate, // and it is also very slow, hence avoid it. BBox2i disp_bbox; if (!m_is_map_projected) { BBox2i full_disp_bbox = bounding_box(m_disparity); for (int col = 0; col < unaligned_disp.cols(); col++) { for (int row = 0; row < unaligned_disp.rows(); row++) { // Get the pixel coordinate in the output image (left unaligned pixel), // Then get the pixel coordinate in the left input image. Vector2 output_pixel(col + curr_bbox.min()[0], row + curr_bbox.min()[1]); Vector2 left_aligned_pixel; try { left_aligned_pixel = local_left_transform->forward(output_pixel); } catch(...) { // This can fail since we may apply it to pixels outside of range continue; } if (!full_disp_bbox.contains(left_aligned_pixel)) continue; disp_bbox.grow(left_aligned_pixel); } } }else{ for (int col = 0; col < m_disparity.cols(); col++) { for (int row = 0; row < m_disparity.rows(); row++) { std::pair pix = std::make_pair(col, row); auto it = m_unaligned_trans.find(pix); if (it == m_unaligned_trans.end()) continue; Vector2 rev = it->second; if (curr_bbox.contains(rev)) { disp_bbox.grow(Vector2(col, row)); } } } // Grow the box to account for the fact that we did a sub-sampling // and may have missed some points. Vector2 diff = disp_bbox.max() - disp_bbox.min(); if (!disp_bbox.empty()) { disp_bbox.grow(disp_bbox.min() - 0.1*diff); disp_bbox.grow(disp_bbox.max() + 0.1*diff); } } // Expand to take into account the sampling to be used below disp_bbox.expand(2*KERNEL_SIZE); // Crop to its maximum extent disp_bbox.crop(bounding_box(m_disparity)); // Rasterize the section of the disparity image that we need for this tile typedef typename DispImageType::pixel_type DispPixelT; ImageView disp = crop(m_disparity, disp_bbox); for (int col = 0; col < disp.cols(); col++) { for (int row = 0; row < disp.rows(); row++) { DispPixelT dpix = disp(col, row); if (!is_valid(dpix)) continue; // Go from position in the cropped disparity to the // position in the full disparity. int ucol = col + disp_bbox.min().x(); int urow = row + disp_bbox.min().y(); // De-warp left and right pixels to be in the camera coordinate system Vector2 left_pix, right_pix; try{ left_pix = local_left_transform->reverse (Vector2(ucol, urow)); right_pix = local_right_transform->reverse(Vector2(ucol, urow) + stereo::DispHelper(dpix)); } catch(...) { continue; } Vector2 dir = right_pix - left_pix; // disparity value // This averaging is useful in filling tiny holes and avoiding staircasing. // TODO: Use some weights. The closer contribution should have more weight. for (int icol = -KERNEL_SIZE; icol <= KERNEL_SIZE; icol++) { for (int irow = -KERNEL_SIZE; irow <= KERNEL_SIZE; irow++) { int lcol = round(left_pix[0]) + icol; int lrow = round(left_pix[1]) + irow; // shift to be in the domain of the cropped image lcol -= curr_bbox.min()[0]; lrow -= curr_bbox.min()[1]; if (lcol < 0 || lcol >= curr_bbox.width()) continue; if (lrow < 0 || lrow >= curr_bbox.height()) continue; if (!is_valid(unaligned_disp(lcol, lrow))) unaligned_disp(lcol, lrow).validate(); unaligned_disp(lcol, lrow).child() += dir; count(lcol, lrow)++; } } } } for (int col = 0; col < unaligned_disp.cols(); col++) { for (int row = 0; row < unaligned_disp.rows(); row++) { if (count(col, row) == 0) unaligned_disp(col, row).invalidate(); else unaligned_disp(col, row) /= double(count(col, row)); } } // Use the crop trick to fake that the support region is the same size as // the entire image. return prerasterize_type(unaligned_disp, -curr_bbox.min().x(), -curr_bbox.min().y(), cols(), rows()); } template inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class UnalignDisparityView // Take a given disparity and make it between the original unaligned images void unalign_disparity(bool is_map_projected, DispImageType const& disparity, vw::TransformPtr const& left_trans, vw::TransformPtr const& right_trans, ASPGlobalOptions const& opt, std::string const& disp_file) { Stopwatch sw; sw.start(); cartography::GeoReference left_georef; bool has_left_georef = false; bool has_nodata = false; double nodata = -32768.0; vw_out() << "Unaligning the disparity.\n"; vw_out() << "Writing: " << disp_file << "\n"; vw::cartography::block_write_gdal_image (disp_file, UnalignDisparityView(is_map_projected, disparity, left_trans, right_trans, opt), has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Undist disp:")); sw.stop(); vw_out() << "Unaligning disparity elapsed time: " << sw.elapsed_seconds() << " s.\n"; } // A class whose operator() takes as input a pixel in the left aligned image, // and returns a pixel in the right aligned image, via interpolation into the // disparity. It supports internal sampling to speed up the computation // of its inverse via Newton-Raphson. struct DispMap { DispImageType m_disp; vw::ImageViewRef>> m_interp_disp; // Sampled inverse map. Has one value per patch, so it is coarse. // It is used to find an initial guess for the inverse. vw::ImageView m_inv_map; int m_map_row_bin_len, m_map_col_bin_len; // Extent of values of operator(). It is the size of the right raw image. vw::BBox2i m_map_val_box; typedef typename DispImageType::pixel_type DispPixelT; // Constructor DispMap(DispImageType const& disp): m_disp(disp) { DispPixelT invalid_disp; invalid_disp.invalidate(); vw::ValueEdgeExtension invalid_ext(invalid_disp); m_interp_disp = interpolate(disp, vw::BilinearInterpolation(), invalid_ext); mapSetup(); } int cols() const { return m_disp.cols(); } int rows() const { return m_disp.rows(); } // The map that we want to invert: it maps aligned left pixels to unaligned // (raw) right pixels. // This will throw an exception if it cannot compute the right pixel. vw::Vector2 operator()(vw::Vector2 const& trans_left_pix) const { // Interpolated disparity DispPixelT dpix = m_interp_disp(trans_left_pix[0], trans_left_pix[1]); if (!is_valid(dpix)) vw::vw_throw(vw::ArgumentErr() << "Invalid disparity encountered.\n"); vw::Vector2 trans_right_pix = trans_left_pix + stereo::DispHelper(dpix); // Need to catch this before it goes to GDAL as it does not play nice with NaN. if (trans_right_pix != trans_right_pix) vw::vw_throw(vw::ArgumentErr() << "NaN encountered.\n"); return trans_right_pix; } // Find the bounding box of map values, that is, of operator(). Then find an // approximate tabulated inverse map. // TODO(oalexan1): This could be made generic and moved out. Expose the table // size. It can be empty if not desired. void mapSetup() { // A table that for a right pixel gives an estimate for the left pixel that // maps to it. Its size cannot be big as this is slow. Init as NaN. m_inv_map.set_size(100, 100); double nan = std::numeric_limits::quiet_NaN(); for (int col = 0; col < m_inv_map.cols(); col++) { for (int row = 0; row < m_inv_map.rows(); row++) { m_inv_map(col, row) = vw::Vector2(nan, nan); } } // Cache the values of operator() as we wil need them twice. Init as NaN. vw::ImageView fwd_map_cache(m_inv_map.cols(), m_inv_map.rows()); for (int col = 0; col < m_inv_map.cols(); col++) { for (int row = 0; row < m_inv_map.rows(); row++) { fwd_map_cache(col, row) = vw::Vector2(nan, nan); } } int col_step = std::max(1, int(m_disp.cols() / m_inv_map.cols())); int row_step = std::max(1, int(m_disp.rows() / m_inv_map.rows())); // Estimate the bounding box of map values m_map_val_box = vw::BBox2i(); vw_out() << "Sampling the disparity.\n"; vw::Stopwatch sw; sw.start(); vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / (m_disp.cols() / double(col_step)); tpc.report_progress(0); for (int col = 0; col < m_disp.cols(); col += col_step) { for (int row = 0; row < m_disp.rows(); row += row_step) { try { vw::Vector2 map_val = operator()(vw::Vector2(col, row)); m_map_val_box.grow(map_val); // Cache the values int col_sub = col / col_step; int row_sub = row / row_step; if (col_sub < 0 || col_sub >= m_inv_map.cols() || row_sub < 0 || row_sub >= m_inv_map.rows()) continue; fwd_map_cache(col_sub, row_sub) = map_val; } catch(...) { continue; } } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); sw.stop(); vw::vw_out() << "Sampling elapsed time: " << sw.elapsed_seconds() << " s.\n"; // The box must be non-empty if (m_map_val_box.empty()) vw::vw_throw(vw::ArgumentErr() << "Empty bounding box of function values.\n"); // Tabulate the inverse map. m_map_col_bin_len = std::max(m_map_val_box.width() / m_inv_map.cols(), 1); m_map_row_bin_len = std::max(m_map_val_box.height() / m_inv_map.rows(), 1); for (int col = 0; col < m_disp.cols(); col += col_step) { for (int row = 0; row < m_disp.rows(); row += row_step) { try { vw::Vector2 map_input(col, row); int col_sub = col / col_step; int row_sub = row / row_step; if (col_sub < 0 || col_sub >= m_inv_map.cols() || row_sub < 0 || row_sub >= m_inv_map.rows()) continue; vw::Vector2 map_val = fwd_map_cache(col_sub, row_sub); // Must not be nan if (std::isnan(map_val[0]) || std::isnan(map_val[1])) continue; // Find the bin vw::Vector2i bin = findBin(map_val); m_inv_map(bin[0], bin[1]) = map_input; } catch(...) { continue; } } } return; } // Find the bin. // TODO(oalexan1): Make notation more general. Use X for input space, // Y for output space. Remove the "right" and "disp" from the names. vw::Vector2i findBin(vw::Vector2 const& right_pix) const { int bin_col = round((right_pix[0] - m_map_val_box.min().x()) / double(m_map_col_bin_len)); int bin_row = round((right_pix[1] - m_map_val_box.min().y()) / double(m_map_row_bin_len)); if (bin_col < 0) bin_col = 0; if (bin_row < 0) bin_row = 0; if (bin_col >= m_inv_map.cols()) bin_col = m_inv_map.cols() - 1; if (bin_row >= m_inv_map.rows()) bin_row = m_inv_map.rows() - 1; return vw::Vector2(bin_col, bin_row); } // The approximate inverse based on tabulated values. It can return nan. vw::Vector2 approxInverse(vw::Vector2 const& right_pix) const { vw::Vector2i bin = findBin(right_pix); // Find the closest non-nan value, starting at the current bin and expanding double nan = std::numeric_limits::quiet_NaN(); vw::Vector2 val(nan, nan); int max_dist = 3; // how far to look for (int dist = 0; dist <= max_dist; dist++) { for (int col = bin[0] - dist; col <= bin[0] + dist; col++) { for (int row = bin[1] - dist; row <= bin[1] + dist; row++) { if (col < 0 || col >= m_inv_map.cols() || row < 0 || row >= m_inv_map.rows()) continue; val = m_inv_map(col, row); if (!std::isnan(val[0]) && !std::isnan(val[1])) return val; } } } // This will return nan if no valid value was found return val; } }; // Auxiliary function to compute matches from disparity. A multiplier // bigger than 1 will be passed in if too few matches are found. void noTripletsMatches(ASPGlobalOptions const& opt, DispImageType const& disp, vw::TransformPtr const& left_trans, vw::TransformPtr const& right_trans, int max_num_matches, double multiplier, // Output std::vector & left_ip, std::vector & right_ip) { // Clear the outputs left_ip.clear(); right_ip.clear(); // Use doubles to avoid integer overflow double num_pixels = double(disp.cols()) * double(disp.rows()); double den = std::min(double(max_num_matches), num_pixels) * multiplier; double bin_len = sqrt(num_pixels/den); bin_len = std::max(1.0, bin_len); int lenx = round(disp.cols()/bin_len); lenx = std::max(1, lenx); int leny = round(disp.rows()/bin_len); leny = std::max(1, leny); // Iterate over bins. vw_out() << "Computing interest point matches based on disparity.\n"; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / double(lenx); tpc.report_progress(0); for (int binx = 0; binx < lenx; binx++) { // Pick the disparity at the center of the bin int posx = round((binx+0.5)*bin_len); for (int biny = 0; biny < leny; biny++) { int posy = round((biny+0.5)*bin_len); if (posx >= disp.cols() || posy >= disp.rows()) continue; // Not interpolating into disparity here as we are at an integer pixel. typedef typename DispImageType::pixel_type DispPixelT; DispPixelT dpix = disp(posx, posy); if (!is_valid(dpix)) continue; // De-warp left and right pixels to be in the camera coordinate system Vector2 left_pix = left_trans->reverse (Vector2(posx, posy)); Vector2 right_pix = right_trans->reverse(Vector2(posx, posy) + stereo::DispHelper(dpix)); left_ip.push_back(ip::InterestPoint(left_pix.x(), left_pix.y())); right_ip.push_back(ip::InterestPoint(right_pix.x(), right_pix.y())); } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); vw_out() << "Computed " << left_ip.size() << " matches.\n"; } // Create ip with left_ip being at integer multiple of bin size in the left // raw image. Then do the same for right_ip in right raw image. This way // there is a symmetry and predictable location for ip. So if three images // overlap, a feature can often be seen in many of them whether a given // image is left in some pairs or right in some others. // TODO(oalexan1): Break this up into two parts: l-r and r-l. void tripletsMatches(ASPGlobalOptions const& opt, DispMap const& dmap, std::string const& left_raw_image, std::string const& right_raw_image, vw::TransformPtr const& left_trans, vw::TransformPtr const& right_trans, int max_num_matches, bool append, // Output std::vector & left_ip, std::vector & right_ip) { if (!append) { // Clear the outputs left_ip.clear(); right_ip.clear(); } // Turn off caching for Map2CamTrans. When the samples are far apart the // caching does not help, and only introduces extra overhead. vw::cartography::Map2CamTrans* left_map2cam = dynamic_cast(left_trans.get()); if (left_map2cam != NULL) left_map2cam->set_use_cache(false); vw::cartography::Map2CamTrans* right_map2cam = dynamic_cast(right_trans.get()); if (right_map2cam != NULL) right_map2cam->set_use_cache(false); // Quantities for inverting the disparity with the Newton-Raphson method. The // step size is a bit large as the disparity may not be smooth. double step = 3.0; // 3 pixels double tol = 0.1; // 0.1 pixels // Load the left and right unaligned image DiskImageView left_img(left_raw_image); DiskImageView right_img(right_raw_image); // Start with the left vw::Stopwatch sw1; sw1.start(); { // Use doubles to avoid integer overflow double num_pixels = double(left_img.cols()) * double(left_img.rows()); // Multiply by 0.5 as this should yield only half of the total double den = 0.5 * std::min(double(max_num_matches), num_pixels); double bin_len = round(sqrt(num_pixels/den)); bin_len = std::max(1.0, bin_len); int lenx = round(left_img.cols()/bin_len); lenx = std::max(1, lenx); int leny = round(left_img.rows()/bin_len); leny = std::max(1, leny); int lr_count = 0; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / double(lenx + 1.0); vw_out() << "Finding left-to-right matches based on disparity.\n"; tpc.report_progress(0); for (int binx = 0; binx <= lenx; binx++) { int posx = binx*bin_len; // integer multiple of bin length for (int biny = 0; biny <= leny; biny++) { int posy = biny * bin_len; // integer multiple of bin length if (posx >= left_img.cols() || posy >= left_img.rows()) continue; // Raw and trans left image pixel Vector2 left_pix(posx, posy); Vector2 trans_left_pix; try { trans_left_pix = left_trans->forward(left_pix); } catch(...) { continue; } if (trans_left_pix[0] < 0 || trans_left_pix[0] >= dmap.cols()) continue; if (trans_left_pix[1] < 0 || trans_left_pix[1] >= dmap.rows()) continue; // TODO(oalexan1): For triplet code, the two cases must be merged // into a single function, as very little differs. vw::Vector2 trans_right_pix; try { trans_right_pix = dmap(trans_left_pix); } catch(...) { continue; } // Skip nan if (std::isnan(trans_right_pix[0]) || std::isnan(trans_right_pix[1])) continue; // Right raw (unaligned) pixel vw::Vector2 right_pix = right_trans->reverse(trans_right_pix); // Must fit within image box if (right_pix[0] < 0 || right_pix[0] > right_img.cols() - 1) continue; if (right_pix[1] < 0 || right_pix[1] > right_img.rows() - 1) continue; // Store the match pair ip::InterestPoint lip(left_pix.x(), left_pix.y()); ip::InterestPoint rip(right_pix.x(), right_pix.y()); left_ip.push_back(lip); right_ip.push_back(rip); lr_count++; } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); vw::vw_out() << "Found " << lr_count << " left-to-right matches.\n"; } sw1.stop(); vw_out() << "Left-to-right matches elapsed time: " << sw1.elapsed_seconds() << " s.\n"; // Now create ip in predictable locations for the right image. Need to // invert the disparity with a solver. vw::Stopwatch sw2; sw2.start(); { double num_pixels = double(right_img.cols()) * double(right_img.rows()); // Multiply by 0.5 as this should yield only half of the total double den = 0.5 * std::min(double(max_num_matches), num_pixels); double bin_len = round(sqrt(num_pixels/den)); bin_len = std::max(1.0, bin_len); int lenx = round(right_img.cols()/bin_len); lenx = std::max(1, lenx); int leny = round(right_img.rows()/bin_len); leny = std::max(1, leny); int rl_count = 0; vw_out() << "Finding right-to-left matches based on disparity.\n"; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / double(lenx + 1.0); tpc.report_progress(0); for (int binx = 0; binx <= lenx; binx++) { int posx = binx * bin_len; // integer multiple of bin length for (int biny = 0; biny <= leny; biny++) { int posy = biny*bin_len; // integer multiple of bin length if (posx >= right_img.cols() || posy >= right_img.rows()) continue; // Raw and trans right image pixel Vector2 right_pix(posx, posy); vw::Vector2 trans_right_pix; try { trans_right_pix = right_trans->forward(right_pix); } catch(...) { continue; } // Find the left aligned pixel that maps to this right pixel. // Skip if nan. vw::Vector2 left_guess = dmap.approxInverse(trans_right_pix); if (std::isnan(left_guess[0]) || std::isnan(left_guess[1])) continue; // Refine the guess with Newton-Raphson vw::math::NewtonRaphson nr(dmap); vw::Vector2 trans_left_pix = nr.solve(left_guess, trans_right_pix, step, tol); if (std::isnan(trans_left_pix[0]) || std::isnan(trans_left_pix[1])) continue; // Check if the solution is good enough vw::Vector2 check_right_pix; try { check_right_pix = dmap(trans_left_pix); if (norm_2(check_right_pix - trans_right_pix) > tol) continue; } catch(...) { continue; } // Left raw (unaligned) pixel vw::Vector2 left_pix = left_trans->reverse(trans_left_pix); // Must be in left raw image bounds if (left_pix[0] < 0 || left_pix[0] > left_img.cols() - 1) continue; if (left_pix[1] < 0 || left_pix[1] > left_img.rows() - 1) continue; // Store the match pair vw::ip::InterestPoint lip(left_pix.x(), left_pix.y()); vw::ip::InterestPoint rip(right_pix.x(), right_pix.y()); left_ip.push_back(lip); right_ip.push_back(rip); rl_count++; } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); vw::vw_out() << "Found " << rl_count << " right-to-left matches.\n"; } // end considering right-to-left matches sw2.stop(); vw::vw_out() << "Right-to-left matches elapsed time: " << sw2.elapsed_seconds() << " s.\n"; vw_out() << "Computed " << left_ip.size() << " total matches.\n"; // TODO(oalexan1): How to ensure a lot more triplets are kept? } /// Bin the disparities, and from each bin get a disparity value. /// This will create a correspondence from the left to right image, /// which we save in the match format. /// When gen_triplets is true, and there are many overlapping images, /// try hard to have many IP with the property that each such IP is seen /// in more than two images. This helps with bundle adjustment. void matchesFromDisp(ASPGlobalOptions const& opt, DispImageType const& disp, std::string const& left_raw_image, std::string const& right_raw_image, vw::TransformPtr const& left_trans, vw::TransformPtr const& right_trans, std::string const& match_file, int max_num_matches, bool gen_triplets, bool is_map_projected, bool matches_as_txt) { std::vector left_ip, right_ip; if (gen_triplets) { // Construct the DispMap object. This will do some sampling that will take time. DispMap dmap(disp); // Try to get more matches than expected. All image pairs need to use the // same logic consistently, that is why this is not dynamically adjusted // for the current image pair. double factor = 1.3; int num_matches_extra = factor * max_num_matches; vw::vw_out() << "Internally multiplying the number of matches by " << factor << " to compensate for their usually less than expected number.\n"; bool append = false; tripletsMatches(opt, dmap, left_raw_image, right_raw_image, left_trans, right_trans, num_matches_extra, append, left_ip, right_ip); // If not enough matches, add more. Must compare with the original expected // number of matches. Do not remove the existing matches, as the goal is to // get matches in the same locations for another image pair sharing an image // with this one. if (left_ip.size() < 0.9 * max_num_matches) { vw::vw_out(vw::WarningMessage) << "The number of matches is way less than expected. Will add more matches. " << "The additional ones will not result in triplets. To ensure that, " << "rerun this step for all image pairs with a larger requested number " << "of matches.\n"; // This number was carefully chosen to get a good number of matches, // taking into account the ratio between what we exepcted and what we got // before. double ratio = std::max(0.01, double(left_ip.size())/double(num_matches_extra)); int num_matches_extra2 = round((max_num_matches - left_ip.size())/ratio); // Ensure we do not pass the same number as before as that would duplicate // the matches. double ratio2 = num_matches_extra2 / double(num_matches_extra); if (std::abs(ratio2 - 1.0) < 0.1) num_matches_extra2 *= 1.1; append = true; tripletsMatches(opt, dmap, left_raw_image, right_raw_image, left_trans, right_trans, num_matches_extra2, append, left_ip, right_ip); } } else { // First try naively to get the requested number of matches. double multiplier = 1.0; noTripletsMatches(opt, disp, left_trans, right_trans, max_num_matches, multiplier, left_ip, right_ip); // If too few matches are found, try again with a larger multiplier, // replacing the earlier matches. double ratio = double(left_ip.size())/double(max_num_matches); ratio = std::max(0.01, ratio); if (ratio < 0.9) { vw_out() << "The number of matches is way less than requested. " << "Trying again.\n"; multiplier = 1.0/ratio; noTripletsMatches(opt, disp, left_trans, right_trans, max_num_matches, multiplier, left_ip, right_ip); } } vw_out() << "Writing: " << match_file << "\n"; ip::write_match_file(match_file, left_ip, right_ip, matches_as_txt); } } // end namespace asp ================================================ FILE: src/asp/Core/DisparityProcessing.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_CORE_DISPARITY_PROCESSING_H__ #define __ASP_CORE_DISPARITY_PROCESSING_H__ #include #include #include #include #include namespace asp { typedef vw::ImageViewRef> DispImageType; // Forward declarations class ASPGlobalOptions; /// Load the D_sub file in a consistent format. /// - Returns false if the file does not exist. bool load_D_sub(std::string const& d_sub_file, vw::ImageView> & sub_disp); // Load the low-res disparity and the scale needed to convert it to full-res void load_D_sub_and_scale(std::string const & out_prefix, std::string const & d_sub_file, vw::ImageView> & sub_disp, vw::Vector2 & upsample_scale); // Filter D_sub. All alignment methods are supported. void filter_D_sub(ASPGlobalOptions const& opt, vw::TransformPtr tx_left, vw::TransformPtr tx_right, boost::shared_ptr left_camera_model, boost::shared_ptr right_camera_model, vw::cartography::Datum const& datum, std::string const& d_sub_file, vw::Vector2 const& outlier_removal_params); // Filter D_sub by reducing its spread around the median. Return the count of // removed pixels. int dispSpreadFilter(vw::ImageView> & sub_disp, double max_disp_spread, vw::Vector2 const& upsample_scale); // Filter D_sub by reducing its spread around the median. Read from disk, // filter, write back to disk. void dispSpreadFilterIO(ASPGlobalOptions const& opt, std::string const& d_sub_file, double max_disp_spread); // Take a given disparity and make it between the original unaligned images void unalign_disparity(bool is_map_projected, DispImageType const& disparity, vw::TransformPtr const& left_trans, vw::TransformPtr const& right_trans, ASPGlobalOptions const& opt, std::string const& disp_file); /// Bin the disparities, and from each bin get a disparity value. /// This will create a correspondence from the left to right image, /// which we save in the match format. /// When gen_triplets is true, and there are many overlapping images, /// try hard to have many IP with the property that each such IP is seen /// in more than two images. This helps with bundle adjustment. void matchesFromDisp(ASPGlobalOptions const& opt, DispImageType const& disp, std::string const& left_raw_image, std::string const& right_raw_image, vw::TransformPtr const& left_trans, vw::TransformPtr const& right_trans, std::string const& match_file, int max_num_matches, bool gen_triplets, bool is_map_projected, bool matches_as_txt); } // End namespace asp #endif//__ASP_CORE_DISPARITY_PROCESSING_H__ ================================================ FILE: src/asp/Core/EigenTransformUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file EigenTransformUtils.cc /// #include namespace asp { // Calculate an affine transform given position and quaternions (in order x, y, z, w). Eigen::Affine3d calcTransform(double x, double y, double z, double qx, double qy, double qz, double qw) { Eigen::Vector3d ET(x, y, z); Eigen::Quaterniond q(qw, qx, qy, qz); Eigen::Matrix3d ER = q.toRotationMatrix(); Eigen::Matrix4d E; E.setIdentity(); E.block<3,3>(0,0) = ER; E.block<3,1>(0,3) = ET; Eigen::Affine3d cam_to_world; cam_to_world.matrix() = E; return cam_to_world; } } ================================================ FILE: src/asp/Core/EigenTransformUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __CORE_EIGEN_TRANSFORM_UTILS_H__ #define __CORE_EIGEN_TRANSFORM_UTILS_H__ #include #include // Very low level transform utilities namespace asp { // Calculate an affine transform given position and quaternions (in order x, y, z, w). Eigen::Affine3d calcTransform(double x, double y, double z, double qx, double qy, double qz, double qw); } //end namespace asp #endif//__CORE_EIGEN_TRANSFORM_UTILS_H__ ================================================ FILE: src/asp/Core/EigenUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file EigenUtils.cc /// #include #include #include #include #include using namespace vw; using namespace vw::cartography; namespace asp { vw::Vector3 cartesian_to_geodetic_adj(vw::cartography::GeoReference const& geo, vw::Vector3 xyz){ // cartesian_to_geodetic() returns longitude between -180 and 180. // Sometimes this is 360 degrees less than what desired, // so here we do an adjustment. // To do: This may not be perfectly fool-proof. vw::Vector3 G = geo.datum().cartesian_to_geodetic(xyz); vw::Vector2 ll = geo.pixel_to_lonlat(vw::Vector2(0, 0)); G(0) += 360*round((ll[0] - G(0))/360.0); return G; } void null_check(const char* token, std::string const& line){ if (token == NULL) vw_throw( vw::IOErr() << "Failed to read line: " << line << "\n" ); } // Out of the elements 0, 1,..., n - 1, pick m unique // random elements and sort them in increasing order. // TODO(oalexan1): See the newly added pick_random_subset() function in VW, // but note that that one does not sort the elements. void pick_at_most_m_unique_elems_from_n_elems(std::int64_t m, std::int64_t n, std::vector& elems){ elems.clear(); if (m < 1 || n < 1) return; if (m > n) m = n; std::vector all(n); for (std::int64_t i = 0; i < n; i++) all[i] = i; // Swap a randomly selected element from index 0 to j with the one // at index j. Then decrement j. Done after m elements are // processed. for (std::int64_t j = n-1; j >= n-m; j--){ std::int64_t r = rand()%(j+1); // 0 <= r <= j std::swap(all[r], all[j]); } elems.resize(m); for (std::int64_t i = 0; i < m; i++) elems[i] = all[n-m+i]; std::sort(elems.begin(), elems.end()); } // Return at most m random points out of the input point cloud. void random_pc_subsample(std::int64_t m, Eigen::MatrixXd& points){ std::int64_t n = points.cols(); std::vector elems; pick_at_most_m_unique_elems_from_n_elems(m, n, elems); m = elems.size(); for (std::int64_t col = 0; col < m; col++){ for (std::int64_t row = 0; row < DIM; row++) points(row, col) = points(row, elems[col]); } points.conservativeResize(Eigen::NoChange, m); } std::int64_t load_csv_aux(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, bool & is_lola_rdr_format, double & median_longitude, bool verbose, Eigen::MatrixXd & data) { // Note: The input CsvConv object is responsible for parsing out the // type of information contained in the CSV file. is_lola_rdr_format = false; std::int64_t num_total_points = csv_file_size(file_name); std::string sep_str = csv_separator(); const char* sep = sep_str.c_str(); const std::int64_t bufSize = 1024; char temp[bufSize]; std::ifstream file( file_name.c_str() ); if (!file) vw_throw(vw::IOErr() << "Unable to open file: " << file_name << "\n"); // We will randomly pick or not a point with probability load_ratio double load_ratio = (double)num_points_to_load/std::max(1.0, (double)num_total_points); data.conservativeResize(DIM+1, std::min(num_points_to_load, num_total_points)); // Peek at the first valid line and see how many elements it has std::string line; while ( getline(file, line, '\n') ) { if (is_valid_csv_line(line)) break; } file.clear(); file.seekg(0, std::ios_base::beg); // go back to start of file strncpy(temp, line.c_str(), bufSize); const char* token = strtok (temp, sep); std::int64_t numTokens = 0; while (token != NULL){ numTokens++; token = strtok (NULL, sep); } if (numTokens < 3) vw::vw_throw(vw::IOErr() << "Expecting at least three fields on each " << "line of file: " << file_name << "\n"); // This is a fatal error if (!csv_conv.is_configured()) vw::vw_throw(vw::ArgumentErr() << "Must set option --csv-format.\n"); // TODO(oalexan1): We parse these guessed file types manually but we should // use a CsvConv object to do it! if (is_lola_rdr_format && geo.datum().semi_major_axis() != geo.datum().semi_minor_axis() ){ vw_throw( vw::ArgumentErr() << "The CSV file was detected to be in the" << " LOLA RDR format, yet the datum semi-axes are not equal " << "as expected for the Moon.\n" ); } bool shift_was_calc = false; bool is_first_line = true; std::int64_t points_count = 0; std::vector longitudes; line = ""; while (getline(file, line, '\n')) { if (!is_first_line && !line.empty() && line[0] == '#' && verbose) { vw::vw_out() << "Ignoring line starting with comment: " << line << std::endl; continue; } if (points_count >= num_points_to_load) break; if (!is_valid_csv_line(line)) continue; // Randomly skip a percentage of points double r = (double)std::rand()/(double)RAND_MAX; if (r > load_ratio) continue; // We went with C-style file reading instead of C++ in this instance // because we found it to be significantly faster on large files. vw::Vector3 xyz; double lon = 0.0, lat = 0.0; if (csv_conv.is_configured()){ // Parse custom CSV file with given format string bool success; CsvConv::CsvRecord vals = csv_conv.parse_csv_line(is_first_line, success, line); if (!success) continue; xyz = csv_conv.csv_to_cartesian(vals, geo); // Decide if the point is in the box. Also save for the future // the longitude of the point, we'll use it to compute the mean longitude. vw::Vector2 lonlat = csv_conv.csv_to_lonlat(vals, geo); lon = lonlat[0]; // Needed for mean calculation below lat = lonlat[1]; // TODO: We really need a lonlat bbox function that handles wraparound!!!!!! // Skip points outside the given box if (!lonlat_box.empty() && !lonlat_box.contains(lonlat) && !lonlat_box.contains(lonlat+vw::Vector2(360,0)) && !lonlat_box.contains(lonlat-vw::Vector2(360,0))) { continue; } } else if (!is_lola_rdr_format) { // lat,lon,height format double height; strncpy(temp, line.c_str(), bufSize); const char* token = strtok(temp, sep); null_check(token, line); std::int64_t ret = sscanf(token, "%lg", &lat); token = strtok(NULL, sep); null_check(token, line); ret += sscanf(token, "%lg", &lon); token = strtok(NULL, sep); null_check(token, line); ret += sscanf(token, "%lg", &height); // Be prepared for the fact that the first line may be the header. if (ret != 3){ if (!is_first_line){ vw_throw( vw::IOErr() << "Failed to read line: " << line << "\n" ); }else{ is_first_line = false; continue; } } is_first_line = false; // Skip points outside the given box if (!lonlat_box.empty() && !lonlat_box.contains(vw::Vector2(lon, lat))) continue; vw::Vector3 llh( lon, lat, height ); xyz = geo.datum().geodetic_to_cartesian( llh ); if ( xyz == vw::Vector3() || !(xyz == xyz) ) continue; // invalid and NaN check }else{ // Load a RDR_*PointPerRow_csv_table.csv file used for LOLA. Code // copied from Ara Nefian's lidar2dem tool. // We will ignore lines which do not start with year (or a value that // cannot be converted into an integer greater than zero, specifically). std::int64_t year, month, day, hour, min; double lat, rad, sec, is_invalid; strncpy(temp, line.c_str(), bufSize); const char* token = strtok(temp, sep); null_check(token, line); std::int64_t ret = sscanf(token, "%lld-%lld-%lldT%lld:%lld:%lg", &year, &month, &day, &hour, &min, &sec); if( year <= 0 ) continue; token = strtok(NULL, sep); null_check(token, line); ret += sscanf(token, "%lg", &lon); token = strtok(NULL, sep); null_check(token, line); ret += sscanf(token, "%lg", &lat); token = strtok(NULL, sep); null_check(token, line); ret += sscanf(token, "%lg", &rad); rad *= 1000; // km to m // Scan 7 more fields, until we get to the is_invalid flag. for (std::int64_t i = 0; i < 7; i++) token = strtok(NULL, sep); null_check(token, line); ret += sscanf(token, "%lg", &is_invalid); // Be prepared for the fact that the first line may be the header. if (ret != 10){ if (!is_first_line){ vw_throw( vw::IOErr() << "Failed to read line: " << line << "\n" ); }else{ is_first_line = false; continue; } } is_first_line = false; if (is_invalid) continue; // Skip points outside the given box if (!lonlat_box.empty() && !lonlat_box.contains(vw::Vector2(lon, lat))) continue; vw::Vector3 lonlatrad( lon, lat, 0 ); xyz = geo.datum().geodetic_to_cartesian( lonlatrad ); if ( xyz == vw::Vector3() || !(xyz == xyz) ) continue; // invalid and NaN check // Adjust the point so that it is at the right distance from // planet center. xyz = rad*(xyz/norm_2(xyz)); } if (calc_shift && !shift_was_calc){ shift = xyz; shift_was_calc = true; } for (std::int64_t row = 0; row < DIM; row++) data(row, points_count) = xyz[row] - shift[row]; data(DIM, points_count) = 1; points_count++; longitudes.push_back(lon); // Throw an error if the lon and lat are not within bounds. // Note that we allow some slack for lon, perhaps the point // cloud is say from 350 to 370 degrees. if (std::abs(lat) > 90.0) vw_throw(vw::ArgumentErr() << "Invalid latitude value: " << lat << " in " << file_name << "\n"); if (lon < -360.0 || lon > 2*360.0) vw_throw(vw::ArgumentErr() << "Invalid longitude value: " << lon << " in " << file_name << "\n"); } data.conservativeResize(Eigen::NoChange, points_count); median_longitude = 0.0; std::sort(longitudes.begin(), longitudes.end()); if (longitudes.size() > 0) median_longitude = longitudes[longitudes.size()/2]; return num_total_points; } // Load a csv file void load_csv(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, bool & is_lola_rdr_format, double & median_longitude, bool verbose, Eigen::MatrixXd & data){ std::int64_t num_total_points = load_csv_aux(file_name, num_points_to_load, lonlat_box, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, median_longitude, verbose, data); std::int64_t num_loaded_points = data.cols(); if (!lonlat_box.empty() && num_loaded_points < num_points_to_load && num_loaded_points < num_total_points){ // We loaded too few points. Just load them all, as CSV files are // not too large, we will drop extraneous points later. load_csv_aux(file_name, num_total_points, lonlat_box, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, median_longitude, false, // Skip repeating same messages data); } return; } // Load a DEM template void load_dem_pixel_type(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, bool verbose, Eigen::MatrixXd & data){ data.conservativeResize(DIM+1, num_points_to_load); vw::cartography::GeoReference dem_geo; bool has_georef = vw::cartography::read_georeference( dem_geo, file_name ); if (!has_georef) vw_throw(vw::ArgumentErr() << "DEM: " << file_name << " does not have a georeference.\n"); vw::DiskImageView dem(file_name); DemPixelType nodata = std::numeric_limits::quiet_NaN(); { boost::shared_ptr dem_rsrc( new vw::DiskImageResourceGDAL(file_name) ); if (dem_rsrc->has_nodata_read()) nodata = dem_rsrc->nodata_read(); } // Load only points within lonlat_box vw::BBox2i pix_box; if (!lonlat_box.empty()){ // Need a lot of catch statements, as lonlat_to_pixel() can throw things try { pix_box.grow(dem_geo.lonlat_to_pixel(lonlat_box.min())); } catch(...){} try { pix_box.grow(dem_geo.lonlat_to_pixel(lonlat_box.max())); } catch(...){} try { pix_box.grow(dem_geo.lonlat_to_pixel(vw::Vector2(lonlat_box.min().x(), lonlat_box.max().y()))); }catch(...){} try{ pix_box.grow(dem_geo.lonlat_to_pixel(vw::Vector2(lonlat_box.max().x(), lonlat_box.min().y()))); }catch(...){} pix_box.expand(1); // to counteract casting to int pix_box.crop(bounding_box(dem)); } if (pix_box.empty()) pix_box = bounding_box(dem); // We will randomly pick or not a point with probability load_ratio. // Use int64_t to avoid integer overflow std::int64_t num_points = std::int64_t(pix_box.width()) * std::int64_t(pix_box.height()); double load_ratio = (double)num_points_to_load/std::max(1.0, (double)num_points); bool shift_was_calc = false; std::int64_t points_count = 0; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / double(pix_box.width() ); if (verbose) tpc.report_progress(0); for (std::int64_t i = pix_box.min().x(); i < pix_box.max().x(); i++ ) { for (std::int64_t j = pix_box.min().y(); j < pix_box.max().y(); j++ ) { if (points_count >= num_points_to_load) break; double r = (double)std::rand()/(double)RAND_MAX; if (r > load_ratio) continue; DemPixelType h = dem(i, j); if ( h == nodata || std::isnan(h) || std::isinf(h) ) continue; vw::Vector2 lonlat = dem_geo.pixel_to_lonlat( vw::Vector2(i,j) ); // Skip points outside the given box if (!lonlat_box.empty() && !lonlat_box.contains(lonlat)) continue; vw::Vector3 llh( lonlat.x(), lonlat.y(), h ); vw::Vector3 xyz = dem_geo.datum().geodetic_to_cartesian( llh ); if ( xyz == vw::Vector3() || !(xyz == xyz) ) continue; // invalid and NaN check if (calc_shift && !shift_was_calc){ shift = xyz; shift_was_calc = true; } for (std::int64_t row = 0; row < DIM; row++) data(row, points_count) = xyz[row] - shift[row]; data(DIM, points_count) = 1; // Extend to be a homogenous coordinate points_count++; } // end y loop if (verbose) tpc.report_incremental_progress( inc_amount ); } // end x loop if (verbose) tpc.report_finished(); data.conservativeResize(Eigen::NoChange, points_count); } // Load a DEM void load_dem(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, bool verbose, Eigen::MatrixXd & data){ boost::shared_ptr dem_rsrc( new vw::DiskImageResourceGDAL(file_name) ); vw::ImageFormat image_fmt = dem_rsrc->format(); if (image_fmt.channel_type == vw::VW_CHANNEL_FLOAT64) { // We could have loaded this DEM as float, the difference in the // final transform is very minor if we do so, but it is better to // use the full input accuracy. load_dem_pixel_type(file_name, num_points_to_load, lonlat_box, calc_shift, shift, verbose, data); }else{ load_dem_pixel_type(file_name, num_points_to_load, lonlat_box, calc_shift, shift, verbose, data); } } vw::int64 load_pc_aux(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, bool verbose, Eigen::MatrixXd & data){ data.conservativeResize(DIM+1, num_points_to_load); // To do: Is it faster to to do for_each? vw::ImageViewRef point_cloud = read_asp_point_cloud_3(file_name); // We will randomly pick or not a point with probability load_ratio // Use std::int64_t to avoid integer overflow. vw::int64 num_total_points = std::int64_t(point_cloud.cols()) * std::int64_t(point_cloud.rows()); double load_ratio = (double)num_points_to_load/std::max(1.0, (double)num_total_points); bool shift_was_calc = false; vw::int64 points_count = 0; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / double(point_cloud.rows() ); if (verbose) tpc.report_progress(0); for (std::int64_t j = 0; j < point_cloud.rows(); j++ ) { for ( std::int64_t i = 0; i < point_cloud.cols(); i++ ) { if (points_count >= num_points_to_load) break; double r = (double)std::rand()/(double)RAND_MAX; if (r > load_ratio) continue; vw::Vector3 xyz = point_cloud(i, j); if ( xyz == vw::Vector3() || !(xyz == xyz) ) continue; // invalid and NaN check if (calc_shift && !shift_was_calc){ shift = xyz; shift_was_calc = true; } // Skip points outside the given box if (!lonlat_box.empty()){ vw::Vector3 llh = geo.datum().cartesian_to_geodetic(xyz); if ( !lonlat_box.contains(subvector(llh, 0, 2))) continue; } for (std::int64_t row = 0; row < DIM; row++) data(row, points_count) = xyz[row] - shift[row]; data(DIM, points_count) = 1; points_count++; } if (verbose) tpc.report_incremental_progress( inc_amount ); } if (verbose) tpc.report_finished(); data.conservativeResize(Eigen::NoChange, points_count); return num_total_points; } void load_pc(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, bool verbose, Eigen::MatrixXd & data){ vw::int64 num_total_points = load_pc_aux(file_name, num_points_to_load, lonlat_box, calc_shift, shift, geo, verbose, data); std::int64_t num_loaded_points = data.cols(); if (!lonlat_box.empty() && num_loaded_points < num_points_to_load && num_loaded_points < num_total_points){ // We loaded too few points. Try harder. Need some care here as to not run // out of memory. num_points_to_load = std::max(4*num_points_to_load, std::int64_t(10000000)); if (verbose) vw::vw_out() << "Too few points were loaded. Trying again." << std::endl; load_pc_aux(file_name, num_points_to_load, lonlat_box, calc_shift, shift, geo, verbose, data); } } // Find the best-fitting plane to a set of points. It will throw an // error if called with less than 3 points. void bestFitPlane(const std::vector& points, Eigen::Vector3d& centroid, Eigen::Vector3d& plane_normal) { std::int64_t num_points = points.size(); if (num_points < std::int64_t(3)) vw_throw( ArgumentErr() << "Need 3 points to fit a plane.\n"); // Copy coordinates to matrix in Eigen format Eigen::Matrix coord(3, num_points); for (std::int64_t i = 0; i < num_points; i++) coord.col(i) = points[i]; // calculate centroid centroid = Eigen::Vector3d(coord.row(0).mean(), coord.row(1).mean(), coord.row(2).mean()); // subtract centroid for (std::int64_t it = 0; it < 3; it++) coord.row(it).array() -= centroid(it); // We only need the left-singular matrix here // https://math.stackexchange.com/questions/99299/best-fitting-plane-given-a-set-of-points auto svd = coord.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV); plane_normal = svd.matrixU().rightCols<1>(); } // Compute a rigid transform between n point correspondences. // There exists another version of this using vw matrices // in VisionWorkbench called find_3D_transform(). void computeRigidTransform(const std::vector& src, const std::vector& dst, Eigen::Matrix3d & rot, Eigen::Vector3d & trans){ // Initialize the outputs rot = Eigen::Matrix3d::Zero(3, 3); trans = Eigen::Vector3d::Zero(3, 1); assert(src.size() == dst.size()); std::int64_t pairSize = src.size(); Eigen::Vector3d center_src(0, 0, 0), center_dst(0, 0, 0); for (std::int64_t i=0; i svd; Eigen::MatrixXd H_(3, 3); for (std::int64_t i=0; i<3; ++i) for (std::int64_t j=0; j<3; ++j) H_(i, j) = H(i, j); svd.compute(H_, Eigen::ComputeThinU | Eigen::ComputeThinV ); if (!svd.computeU() || !svd.computeV()) { // Nothing to do, return the identity transform return; } Eigen::Matrix3d Vt = svd.matrixV().transpose(); rot = svd.matrixU()*Vt; trans = center_dst - rot*center_src; } /// Read a 4x4 rotation + translation + scale transform from disk. void read_transform(Eigen::MatrixXd & T, std::string const& transFile){ T = Eigen::MatrixXd::Zero(4, 4); vw::vw_out() << "Reading: " << transFile << std::endl; std::ifstream is(transFile.c_str()); for (std::int64_t row = 0; row < T.rows(); row++){ for (std::int64_t col = 0; col < T.cols(); col++){ double a; if (! (is >> a) ) vw_throw( vw::IOErr() << "Failed to read initial transform from: " << transFile << "\n" ); T(row, col) = a; } } if (T(3, 3) != 1) { vw_throw( vw::ArgumentErr() << "The transform must have a 1 in the lower-right corner.\n"); } } /// Write a 4x4 rotation + translation + scale transform to disk. void write_transform(Eigen::MatrixXd const& T, std::string const& transFile){ if (T(3, 3) != 1) { vw_throw( vw::ArgumentErr() << "The initial transform must have a 1 in the lower-right corner.\n"); } std::ofstream tf(transFile.c_str()); tf.precision(17); tf << T << "\n"; tf.close(); } // Apply a rotation + translation transform to a vector3 vw::Vector3 apply_transform_to_vec(Eigen::MatrixXd const& transform, vw::Vector3 const& p){ Eigen::Vector4d P; for (size_t it = 0; it < 3; it++) P[it] = p[it]; P[3] = 1; P = transform * P; vw::Vector3 q; for (size_t it = 0; it < 3; it++) q[it] = P[it]; return q; } } ================================================ FILE: src/asp/Core/EigenUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __CORE_EIGEN_UTILS_H__ #define __CORE_EIGEN_UTILS_H__ #include #include #include #include #include #include #include // A set of routines kept here because they use Eigen, and a set of routine // auxiliary to the routines using Eigen. namespace asp { class CsvConv; // Forward declaration // Note: Just changing 3 to 2 below won't be enough to make the code // work with 2D point clouds. There are some Vector3's all over the place. const int DIM = 3; // Return at most m random points out of the input point cloud. void random_pc_subsample(std::int64_t m, Eigen::MatrixXd& points); // Load a csv file, perhaps sub-sampling it along the way void load_csv(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, asp::CsvConv const& csv_conv, bool & is_lola_rdr_format, double & median_longitude, bool verbose, Eigen::MatrixXd & data); // Load a DEM, perhaps subsampling it along the way void load_dem(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, bool verbose, Eigen::MatrixXd & data); // Load an ASP point cloud, perhaps subsampling it along the way void load_pc(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, bool verbose, Eigen::MatrixXd & data); // Find the best-fitting plane to a set of points. It will throw an // error if called with less than 3 points. void bestFitPlane(const std::vector& points, Eigen::Vector3d& centroid, Eigen::Vector3d& plane_normal); // Compute a rigid transform between n point correspondences. // There exists another version of this using vw matrices // in VisionWorkbench called find_3D_transform(). void computeRigidTransform(const std::vector& src, const std::vector& dst, Eigen::Matrix3d & rot, Eigen::Vector3d & trans); /// Read a 4x4 rotation + translation + scale transform from disk. void read_transform(Eigen::MatrixXd & T, std::string const& transFile); /// Write a 4x4 rotation + translation + scale transform to disk. void write_transform(Eigen::MatrixXd const& T, std::string const& transFile); // Apply a rotation + translation transform to a Vector3 vw::Vector3 apply_transform_to_vec(Eigen::MatrixXd const& T, vw::Vector3 const& p); } //end namespace asp #endif//__CORE_EIGEN_UTILS_H__ ================================================ FILE: src/asp/Core/EnvUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include // must come before asp_config.h, defines VW_BOOST_VERSION #include // defines ASP_HAVE_PKG_ISIS #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { // Set an env var and check for success. Use the setenv() function, // which is not problematic, as putenv(). void setEnvVar(std::string const& var, std::string const& val) { bool overwrite = true; if (setenv(var.c_str(), val.c_str(), overwrite) != 0) vw::vw_throw(vw::ArgumentErr() << "Failed to set environment variable: " << var << " to value: " << val << ".\n"); } // A function to set the environmental variables ISISROOT, QT_PLUGIN_PATH, // GDAL_DATA, and PROJ_LIB. In packaged build mode, set these with the help of // the base directory of the distribution. These are needed especially for the // conda build, when the ASP executables don't have a wrapper around them. For // the tarball build, some of this logic is duplicated in the script in // BinaryBuilder/dist-add/libexec/libexec-funcs.sh which is then called by the // wrapper. void set_asp_env_vars() { // Find the path to the base of the package and see if it works. std::string base_dir = boost::dll::program_location().parent_path().parent_path().string(); #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 // Set ISISROOT and check for IsisPreferences if (!fs::exists(base_dir + "/IsisPreferences")) { base_dir = ASP_DEPS_DIR; // This is defined at compile time if (!fs::exists(base_dir + "/IsisPreferences")) { // If nothing works, try the ASP_DEPS_DIR env variable char * ptr = getenv("ASP_DEPS_DIR"); if (ptr) base_dir = ptr; if (ptr == NULL || !fs::exists(base_dir + "/IsisPreferences")) { vw::vw_throw(vw::ArgumentErr() << "Cannot find the directory having IsisPreferences. " << "Try setting it as the environmental variable ASP_DEPS_DIR."); } } } asp::setEnvVar("ISISROOT", base_dir); if (!fs::exists(std::string(getenv("ISISROOT")) + "/IsisPreferences")) vw::vw_throw(vw::ArgumentErr() << "Cannot find IsisPreferences in " << getenv("ISISROOT")); #endif // ASP_HAVE_PKG_ISIS // Set QT_PLUGIN_PATH as the path to /plugins asp::setEnvVar("QT_PLUGIN_PATH", base_dir + "/plugins"); if (!fs::exists(std::string(getenv("QT_PLUGIN_PATH")))) { base_dir = ASP_DEPS_DIR; // This is defined at compile time asp::setEnvVar("QT_PLUGIN_PATH", base_dir + "/plugins"); } if (!fs::exists(std::string(getenv("QT_PLUGIN_PATH")))) vw::vw_throw(vw::ArgumentErr() << "Cannot find Qt plugins in " << getenv("QT_PLUGIN_PATH")); // Set GDAL_DATA and check for share/gdal asp::setEnvVar("GDAL_DATA", base_dir + "/share/gdal"); if (!fs::exists(std::string(getenv("GDAL_DATA")))) vw::vw_throw(vw::ArgumentErr() << "Cannot find GDAL data in " << getenv("GDAL_DATA")); // Set GDAL_DRIVER_PATH and check for share/gdal. There are two locations, because // BinaryBuilder moves the plugins from lib/gdalplugins to lib. // TODO(oalexan1): Figure out why this happens. asp::setEnvVar("GDAL_DRIVER_PATH", base_dir + "/lib/gdalplugins:" + base_dir + "/lib"); // Older proj api // Set PROJ_LIB and check for share/proj asp::setEnvVar("PROJ_LIB", base_dir + "/share/proj"); if (!fs::exists(std::string(getenv("PROJ_LIB")))) vw::vw_throw(vw::ArgumentErr() << "Cannot find PROJ data in " << getenv("PROJ_LIB")); // Newer proj api // Set PROJ_DATA and check for share/proj asp::setEnvVar("PROJ_DATA", base_dir + "/share/proj"); if (!fs::exists(std::string(getenv("PROJ_DATA")))) vw::vw_throw(vw::ArgumentErr() << "Cannot find PROJ data in " << getenv("PROJ_DATA")); // Force the US English locale as long as ASP is running to avoid // ISIS choking on a decimal separator which shows up as a comma for // some reason. asp::setEnvVar("LC_ALL", "en_US.UTF-8"); asp::setEnvVar("LANG", "en_US.UTF-8"); } } // end namespace asp ================================================ FILE: src/asp/Core/EnvUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __CORE_ENV_UTILS_H__ #define __CORE_ENV_UTILS_H__ #include namespace asp { // Set an env var and check for success. Use the setenv() function, // which is not problematic, as putenv(). void setEnvVar(std::string const& var, std::string const& val); // Set some env vars needed by all ASP programs. See the .cc for details. void set_asp_env_vars(); } //end namespace asp #endif//__CORE_ENV_UTILS_H__ ================================================ FILE: src/asp/Core/FileUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { // Return true if the first file exists and is newer than all of the other files. bool first_is_newer(std::string const& test_file, std::vector const& other_files) { if (!boost::filesystem::exists(test_file)) return false; std::time_t test_time = boost::filesystem::last_write_time(test_file); for (size_t i = 0; i < other_files.size(); i++) { if (other_files[i] == "") // Ignore blank files that were passed in. continue; if (!boost::filesystem::exists(other_files[i])) return false; std::time_t t = boost::filesystem::last_write_time(other_files[i]); if (test_time < t) return false; } return true; } bool first_is_newer(std::string const& test_file, std::string const& f1) { std::vector vec(1); vec[0] = f1; return first_is_newer(test_file, vec); } bool first_is_newer(std::string const& test_file, std::string const& f1, std::string const& f2) { std::vector vec(2); vec[0] = f1; vec[1] = f2; return first_is_newer(test_file, vec); } bool first_is_newer(std::string const& test_file, std::string const& f1, std::string const& f2, std::string const& f3, std::string const& f4) { std::vector vec(4); vec[0] = f1; vec[1] = f2; vec[2] = f2; vec[3] = f4; return first_is_newer(test_file, vec); } // Read a vector of doubles from a file void read_vec(std::string const& filename, std::vector & vals) { vals.clear(); std::ifstream ifs(filename.c_str()); if (!ifs.good()) vw::vw_throw(vw::ArgumentErr() << "Could not open file: " << filename); double val; while (ifs >> val) vals.push_back(val); ifs.close(); } void read_2d_points(std::string const& file, std::vector & points) { std::ifstream ifs(file.c_str()); if (!ifs.good()) vw::vw_throw(vw::ArgumentErr() << "Could not open file for reading: " << file << "\n"); double a, b; points.clear(); while (ifs >> a >> b){ vw::Vector2 p(a, b); points.push_back(p); } } void read_3d_points(std::string const& file, std::vector & points) { std::ifstream ifs(file.c_str()); if (!ifs.good()) vw::vw_throw(vw::ArgumentErr() << "Could not open file for reading: " << file << "\n"); double a, b, c; points.clear(); while (ifs >> a >> b >> c) { vw::Vector3 p(a, b, c); points.push_back(p); } } // Write a vector of strings from a file, one per line. void write_list(std::string const& file, std::vector const & list) { std::ofstream fh(file.c_str()); for (size_t i = 0; i < list.size(); i++) fh << list[i] << std::endl; fh.close(); } // Read a vector of strings from a file, with spaces and newlines acting as separators. // Throw an exception if the list is empty. void read_list(std::string const& file, std::vector & list) { list.clear(); std::ifstream fh(file); std::string val; while (fh >> val) list.push_back(val); if (list.empty()) vw::vw_throw(vw::ArgumentErr() << "Could not read any entries from: " << file << ".\n"); fh.close(); } // Read the target name (planet name) from the plain text portion of an ISIS cub // file or from a CSM file. Will return "UNKNOWN" if the target name cannot be // found. std::string read_target_name(std::string const& filename) { std::string target = "UNKNOWN"; std::ifstream handle; handle.open(filename.c_str()); if (handle.fail()) return target; // No luck std::string line; int count = 0; while (getline(handle, line, '\n')) { if (line == "End") return target; // No luck, reached the end of the text part of the cub // If the input file is a .tif rather than a .cub, it could have several // GB and not have this info anyway, so exist early. count++; if (count > 1000) break; // Find the line having TargetName boost::to_lower(line); if (line.find("targetname") == std::string::npos) continue; // Replace the equal sign with a space and read the second // non-space entry from this line boost::replace_all(line, "=", " "); std::istringstream iss(line); std::string val; if (! (iss >> val >> target)) continue; // Wipe any commas, quotes, or spaces (this is for CSM files) boost::replace_all(target, ",", ""); boost::replace_all(target, "\"", ""); boost::replace_all(target, " ", ""); boost::to_upper(target); // If empty, return UNKNOWN if (target == "") target = "UNKNOWN"; // Found a target, no need to go on return target; } return target; } // Given a vector of files, with each file being an image, camera, // or a text file having images or cameras, return the list of // all found images and cameras. This is a local auxiliary // function not exposed in the header file. void readImagesCamsOrLists(std::vector const & in, std::vector & out) { // Wipe the output out.clear(); for (size_t i = 0; i < in.size(); i++) { if (vw::has_image_extension(in[i]) || vw::has_cam_extension(in[i])) { // Simply append the image or camera to the list out.push_back(in[i]); } else { // Read the list, append all entries from it std::string ext = vw::get_extension(in[i]); if (ext == ".txt") { std::vector list; asp::read_list(in[i], list); for (size_t j = 0; j < list.size(); j++) out.push_back(list[j]); } else if (boost::iends_with(in[i], ".adjust")) { vw::vw_throw(vw::ArgumentErr() << "The file " << in[i] << " is an adjustment. " << "Use the original cameras and the option " << "--bundle-adjust-prefix.\n"); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown file type passed on input: " << in[i] << ".\n"); } } } return; } // Given a list of images/cameras and/or lists of such things, put the images // and the cameras in separate vectors. void separate_images_from_cameras(std::vector const& inputs, std::vector & images, std::vector & cameras, bool ensure_equal_sizes) { // There are N images and possibly N camera paths. // There are several situations: // 1. img1.cub ... imgN.cub for ISIS with non-proj images // 2. img1.tif ... imgN.tif img1.cub ... imgN.cub for ISIS with proj images // 3. img1.tif ... imgN.tif for RPC with embedded RPC in the tif files // 4. img1.tif ... imgN.tif cam1 .... camN for all other cases. // Consider the case when some of the inputs are lists of images/cameras std::vector inputs2; readImagesCamsOrLists(inputs, inputs2); // Check that all files exist for (size_t i = 0; i < inputs2.size(); i++) { if (!fs::exists(inputs2[i])) { vw::vw_throw(vw::ArgumentErr() << "Cannot find the file: " << inputs2[i] << ".\n"); return; } } // Images and cameras may be interleaved. Separate them. images.clear(); cameras.clear(); for (size_t i = 0; i < inputs2.size(); i++) { if (vw::has_image_extension(inputs2[i])) images.push_back(inputs2[i]); else if (vw::has_cam_extension(inputs2[i])) cameras.push_back(inputs2[i]); else if (boost::iends_with(inputs2[i], ".adjust")) vw::vw_throw(vw::ArgumentErr() << "The file " << inputs2[i] << " is an adjustment. " << "Use the original cameras and the option " << "--bundle-adjust-prefix.\n"); else vw::vw_throw(vw::ArgumentErr() << "Unknown file type passed on input: " << inputs2[i] << ".\n"); } // Then concatenate them again, but with the images first and the cameras // second. inputs2.clear(); for (size_t i = 0; i < images.size(); i++) inputs2.push_back(images[i]); for (size_t i = 0; i < cameras.size(); i++) inputs2.push_back(cameras[i]); images.clear(); cameras.clear(); // See if we have cub files and/or camera files (.cub files are also cameras) bool has_cub = false; bool has_nocub = false; bool has_cam = false; for (size_t i = 0; i < inputs2.size(); i++) { std::string ext = vw::get_extension(inputs2[i]); if (ext == ".cub") has_cub = true; if (ext != ".cub") has_nocub = true; if (vw::has_cam_extension(inputs2[i])) has_cam = true; } // Let the first half of the data be images, and the second half be cameras. // Unless we have only .cub files, when all the data are images. // Special case: if all are .cub and we have an even number >= 4, check if // the first half are map-projected (have georef). This handles cam2map // asp_map output where map-projected .cub + camera .cub are all .cub. bool all_cub_mapproj = false; if (has_cub && !has_nocub && inputs2.size() >= 4 && inputs2.size() % 2 == 0) { int half = inputs2.size() / 2; bool first_half_has_georef = true; for (int i = 0; i < half; i++) { vw::cartography::GeoReference georef; bool has_geo = false; try { has_geo = vw::cartography::read_georeference(georef, inputs2[i]); } catch (...) {} if (!has_geo) { first_half_has_georef = false; break; } } if (first_half_has_georef) { all_cub_mapproj = true; vw::vw_out() << "Detected map-projected .cub inputs with camera .cub files.\n"; } } if (((has_cub && !has_nocub) && !all_cub_mapproj) || (!has_cam)) { // Only cubes (non-mapprojected), or only non-cameras, cases 1 and 3 above for (size_t i = 0; i < inputs2.size(); i++) images.push_back(inputs2[i]); } else { // Images and cameras (cameras could be cubes) if (inputs2.size() % 2 != 0) vw::vw_throw(vw::ArgumentErr() << "Expecting as many images as cameras.\n"); int half = inputs2.size()/2; for (int i = 0; i < half; i++) images.push_back(inputs2[i]); for (int i = half; i < 2*half; i++) cameras.push_back(inputs2[i]); } // Verification for images for (size_t i = 0; i < images.size(); i++) { if (!vw::has_image_extension(images[i])) { vw::vw_throw(vw::ArgumentErr() << "Expecting an image, got: " << images[i] << ".\n"); } } // Verification for cameras for (size_t i = 0; i < cameras.size(); i++) { if (!vw::has_cam_extension(cameras[i])) { vw::vw_throw(vw::ArgumentErr() << "Expecting a camera, got: " << cameras[i] << ".\n"); } } if (images.size() != cameras.size() && !cameras.empty()) { vw::vw_throw(vw::ArgumentErr() << "Expecting the number of images and cameras to agree.\n"); } if (ensure_equal_sizes) { while (cameras.size() < images.size()) cameras.push_back(""); } return; } // Parse a matrix of fixed-size vectors from a stream. Each line has vec_size // doubles. Empty lines (or lines starting with a space) separate matrix rows. void read_matrix_from_stream(std::string const& source, std::istream & str, int vec_size, // Output std::vector>> & mat) { mat.clear(); bool first_row = true; int num_cols = 0; std::vector> row; char line[2048]; while (str.getline(line, 2048)) { // An empty line or one starting with a space is a separator if ((line[0] == '\0' || line[0] == ' ') && !row.empty()) { if (first_row) { num_cols = row.size(); first_row = false; } if (num_cols != int(row.size())) vw::vw_throw(vw::ArgumentErr() << "Failed parsing a matrix from: " << source << ". Not all rows have the same size.\n"); mat.push_back(row); row.clear(); continue; } if (line[0] == '\0' || line[0] == ' ') continue; // Read elements std::istringstream is(line); std::vector v(vec_size, 0.0); for (int p = 0; p < vec_size; p++) { if (!(is >> v[p])) vw::vw_throw(vw::ArgumentErr() << "Failed parsing " << vec_size << " elements from line " << std::string(line) << " in file " << source << "\n"); } row.push_back(v); } // Last row if (!row.empty()) mat.push_back(row); } // Convert a raw double matrix to a matrix of Vector2 void convertToVec2(std::vector>> const& raw, std::vector> & mat) { mat.resize(raw.size()); for (size_t r = 0; r < raw.size(); r++) { mat[r].resize(raw[r].size()); for (size_t c = 0; c < raw[r].size(); c++) mat[r][c] = vw::Vector2(raw[r][c][0], raw[r][c][1]); } } // Convert a raw double matrix to a matrix of Vector3 void convertToVec3(std::vector>> const& raw, std::vector> & mat) { mat.resize(raw.size()); for (size_t r = 0; r < raw.size(); r++) { mat[r].resize(raw[r].size()); for (size_t c = 0; c < raw[r].size(); c++) mat[r][c] = vw::Vector3(raw[r][c][0], raw[r][c][1], raw[r][c][2]); } } void read_matrix_from_file(std::string const& file, std::vector> & mat) { std::ifstream ifs(file.c_str()); std::vector>> raw; read_matrix_from_stream(file, ifs, 2, raw); convertToVec2(raw, mat); } void read_matrix_from_file(std::string const& file, std::vector> & mat) { std::ifstream ifs(file.c_str()); std::vector>> raw; read_matrix_from_stream(file, ifs, 3, raw); convertToVec3(raw, mat); } void read_matrix_from_string(std::string const& str, std::vector> & mat) { std::istringstream iss(str); std::vector>> raw; read_matrix_from_stream(str, iss, 2, raw); convertToVec2(raw, mat); } void read_matrix_from_string(std::string const& str, std::vector> & mat) { std::istringstream iss(str); std::vector>> raw; read_matrix_from_stream(str, iss, 3, raw); convertToVec3(raw, mat); } // Create symlinks to the input images for skip_image_normalization mode. // The symlinks are relative to the output directory. void createSymLinks(std::string const& left_input_file, std::string const& right_input_file, std::string const& out_prefix, std::string & left_output_file, std::string & right_output_file) { namespace fs = boost::filesystem; left_output_file = out_prefix + "-L.tif"; right_output_file = out_prefix + "-R.tif"; if (!fs::exists(left_output_file)) { fs::path out_dir = fs::path(out_prefix).parent_path(); fs::path left_rel = out_dir.empty() ? fs::path(left_input_file) : vw::make_file_relative_to_dir(fs::path(left_input_file), out_dir); fs::create_symlink(left_rel, left_output_file); vw::vw_out() << "Created symlink: " << left_output_file << " -> " << left_rel << "\n"; } if (!fs::exists(right_output_file)) { fs::path out_dir = fs::path(out_prefix).parent_path(); fs::path right_rel = out_dir.empty() ? fs::path(right_input_file) : vw::make_file_relative_to_dir(fs::path(right_input_file), out_dir); fs::create_symlink(right_rel, right_output_file); vw::vw_out() << "Created symlink: " << right_output_file << " -> " << right_rel << "\n"; } } } // end namespace asp ================================================ FILE: src/asp/Core/FileUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __CORE_FILE_UTILS_H__ #define __CORE_FILE_UTILS_H__ #include #include #include namespace asp { /// Return true if the first file exists and is newer than all of the other files. /// - Also returns false if any files are missing. /// - If a blank "" file is passed in it is ignored. bool first_is_newer(std::string const& test_file, std::vector const& other_files); // Convenience wrappers. bool first_is_newer(std::string const& test_file, std::string const& f1); bool first_is_newer(std::string const& test_file, std::string const& f1, std::string const& f2); bool first_is_newer(std::string const& test_file, std::string const& f1, std::string const& f2, std::string const& f3, std::string const& f4); /// Read a vector of doubles from a file void read_vec(std::string const& filename, std::vector & vals); void read_2d_points(std::string const& file, std::vector & points); void read_3d_points(std::string const& file, std::vector & points); /// Write a vector of strings from a file, one per line. void write_list(std::string const& file, std::vector const & list); /// Read a vector of strings from a file, with spaces and newlines acting as separators. /// Throw an exception if the list is empty. void read_list(std::string const& file, std::vector & list); /// Read the target name (planet name) from the plain text portion of an ISIS cub file std::string read_target_name(std::string const& filename); // Given a vector of files, with each file being an image, camera, // or a text file having images or cameras, return the list of // all found images and cameras. This is a local auxiliary // function not exposed in the header file. void readImagesCamsOrLists(std::vector const & in, std::vector & out); /// Given a list of images/cameras and/or lists of such things, put the images /// and the cameras in separate vectors. void separate_images_from_cameras(std::vector const& inputs, std::vector & images, std::vector & cameras, bool ensure_equal_sizes); // Read a matrix of vectors from a file or string. Each line has n elements // (2 for Vector2, 3 for Vector3). Empty lines separate matrix rows. void read_matrix_from_file(std::string const& file, std::vector> & mat); void read_matrix_from_file(std::string const& file, std::vector> & mat); void read_matrix_from_string(std::string const& str, std::vector> & mat); void read_matrix_from_string(std::string const& str, std::vector> & mat); // Create symlinks to the input images for skip_image_normalization mode. // The symlinks are relative to the output directory. void createSymLinks(std::string const& left_input_file, std::string const& right_input_file, std::string const& out_prefix, std::string & left_output_file, std::string & right_output_file); } //end namespace asp #endif//__CORE_FILE_UTILS_H__ ================================================ FILE: src/asp/Core/GCP.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include namespace asp { // Write GCP to a file. If ignore_pixel_sigma is true, or if a measure's // pixel sigma is non-positive, use a pixel sigma of 1. void writeGcp(std::string const& gcpFile, vw::cartography::GeoReference const& geo, std::vector const& gcp_vec, std::vector const& image_files, bool ignore_pixel_sigma) { vw::vw_out() << "Writing: " << gcpFile << "\n"; std::ofstream ofs(gcpFile.c_str()); ofs.precision(17); // full precision // It is important to keep track of the datum and projection, because the // elevations are relative to it ofs << "# WKT: " << geo.get_wkt() << "\n"; ofs << "# id lat lon height_above_datum sigma_x sigma_y sigma_z image_name " << "pixel_x pixel_y sigma_x sigma_y, etc.\n"; // Iterate over the gcp_vec for (size_t gcp_id = 0; gcp_id < gcp_vec.size(); gcp_id++) { auto const& gcp = gcp_vec[gcp_id]; // alias auto const& cp = gcp.cp; // alias auto const& llh = gcp.llh; // alias auto const& sigma = gcp.sigma; // alias // Write the id, lat, lon, height, sigmas ofs << gcp_id << " " << llh.y() << " " << llh.x() << " " << llh.z() << " " << sigma[0] << " " << sigma[1] << " " << sigma[2] << " "; for (int im = 0; im < cp.size(); im++) { auto const& cm = cp[im]; // measure // Use the measure's pixel sigma, or fall back to 1 double col_sigma = 1.0, row_sigma = 1.0; if (!ignore_pixel_sigma) { vw::Vector2 ms = cm.sigma(); if (ms[0] > 0) col_sigma = ms[0]; if (ms[1] > 0) row_sigma = ms[1]; } ofs << image_files[cm.image_id()] << " " << cm.position()[0] << " " << cm.position()[1] << " " << col_sigma << " " << row_sigma; // Have a space between measures, except after the last one if (im < int(cp.size()) - 1) ofs << " "; } ofs << "\n"; } ofs.close(); } // Produce and write a GCP file. Can throw exceptions. TODO(oalexan1): Consider // moving this to WV, together with the logic for reading GCPs. Support reading // and writing a georef, not a datum. TODO(oalexan1): Add the GUI option // --gcp-srs. The default should be WGS84 with stereographic projection at // lon=0, lat=0 unless there exists a DEM, when the default should be the // long-lat projection for that DEM. --gcp-srs can be used with rig_calibrator // for local Cartesian coordinates. void genWriteGcp(std::vector const& image_files, std::string const& gcp_file, std::string const& dem_file, asp::MatchList const& matchlist, double xyz_sigma) { // Must have at lest two images to write a GCP file if (image_files.size() < 2) vw::vw_throw(vw::ArgumentErr() << "At least two images are needed to write a GCP file.\n"); // Load a georeference to use for the GCPs from the last image vw::cartography::GeoReference image_georef; const size_t georef_index = image_files.size() - 1; const std::string image_georef_file = image_files[georef_index]; bool has_georef = vw::cartography::read_georeference(image_georef, image_georef_file); if (!has_georef) vw::vw_throw(vw::ArgumentErr() << "Could not load a valid georeference to use for " << "ground control points in file: " << image_georef_file << ".\n"); // Init the DEM to use for height interpolation vw::ImageViewRef> interp_dem; vw::cartography::GeoReference dem_georef; asp::create_interp_dem(dem_file, dem_georef, interp_dem); vw::BBox2 dem_bbox = vw::bounding_box(interp_dem); // A basic sanity check. The orthoimage and DEM datums should be similar. double tol = 1.0; // 1 m auto const& img_d = image_georef.datum(); auto const& dem_d = dem_georef.datum(); // Throw if the datums are too different if (img_d.semi_major_axis() - dem_d.semi_major_axis() > tol || img_d.semi_minor_axis() - dem_d.semi_minor_axis() > tol) vw::vw_throw(vw::ArgumentErr() << "The orthoimage and DEM datums differ by more than " << tol << " meters. This is not supported.\n"); // Populate the GCPs std::vector gcp_vec; size_t num_pts_skipped = 0; const size_t num_ips = matchlist.getNumPoints(); for (size_t p = 0; p < num_ips; p++) { // Loop through IPs // Compute the GDC coordinate of the point vw::ip::InterestPoint ip = matchlist.getPoint(georef_index, p); vw::Vector2 lonlat = image_georef.pixel_to_lonlat(vw::Vector2(ip.x, ip.y)); vw::Vector2 dem_pixel = dem_georef.lonlat_to_pixel(lonlat); vw::PixelMask height = interp_dem(dem_pixel[0], dem_pixel[1])[0]; // Bounding box check. if ((!dem_bbox.contains(dem_pixel)) || (!vw::is_valid(height))) { vw::vw_out() << "Warning: Skipped IP # " << p << " because it does not fall on the DEM.\n"; num_pts_skipped++; continue; // Skip locations which do not fall on the DEM } asp::Gcp gcp; gcp.llh = vw::Vector3(lonlat[0], lonlat[1], height[0]); gcp.sigma = vw::Vector3(xyz_sigma, xyz_sigma, xyz_sigma); // The last image is the reference image, so we skip it when saving GCPs size_t num_images = image_files.size(); size_t num_images_to_save = num_images - 1; for (size_t i = 0; i < num_images_to_save; i++) { // Add this IP to the current line vw::ip::InterestPoint ip = matchlist.getPoint(i, p); vw::ba::ControlMeasure cm; cm.set_image_id(i); cm.set_position(vw::Vector2(ip.x, ip.y)); cm.set_sigma(vw::Vector2(1, 1)); gcp.cp.add_measure(cm); } gcp_vec.push_back(gcp); } // Write the GCPs to file. Use pixel sigma of 1. TODO(oalexan1): Revisit. bool ignore_pixel_sigma = true; asp::writeGcp(gcp_file, image_georef, gcp_vec, image_files, ignore_pixel_sigma); return; } } // namespace asp ================================================ FILE: src/asp/Core/GCP.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file GCP.h /// /// GCP logic /// #ifndef __ASP_CORE_GCP_H__ #define __ASP_CORE_GCP_H__ #include #include #include namespace asp { class MatchList; // A structure for storing a GCP struct Gcp { vw::ba::ControlPoint cp; vw::Vector3 llh; vw::Vector3 sigma; }; // Write GCP to a file. If ignore_pixel_sigma is true, or if a measure's // pixel sigma is non-positive, use a pixel sigma of 1. void writeGcp(std::string const& gcpFile, vw::cartography::GeoReference const& geo, std::vector const& gcp_vec, std::vector const& image_files, bool ignore_pixel_sigma); // Produce and write a GCP file. Can throw exceptions. void genWriteGcp(std::vector const& image_files, std::string const& gcp_file, std::string const& dem_file, asp::MatchList const& matchlist, double xyz_sigma); } // namespace asp #endif // __ASP_CORE_GCP_H__ ================================================ FILE: src/asp/Core/GdalUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file GdalUtils.cc /// #include using namespace vw; using namespace vw::cartography; // Unless user-specified, compute the rounding error for a given // planet (a point on whose surface is given by 'shift'). Return an // inverse power of 2, 1/2^10 for Earth and proportionally less for // smaller bodies. double asp::get_rounding_error(vw::Vector3 const& shift, double rounding_error) { // Do nothing if the user specified it. if (rounding_error > 0.0) return rounding_error; double len = norm_2(shift); VW_ASSERT(len > 0, vw::ArgumentErr() << "Expecting positive length in get_rounding_error()."); rounding_error = 1.5e-10*len; rounding_error = pow(2.0, round(log(rounding_error)/log(2.0))); return rounding_error; } ================================================ FILE: src/asp/Core/GdalUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file GdalUtils.h // Utilities for writing images #ifndef __ASP_CORE_GDAL_UTILS_H__ #define __ASP_CORE_GDAL_UTILS_H__ #include #include #include #include namespace asp { /// String we use in ASP written point cloud files to indicate that an offset /// has been subtracted out from the points. // Note: We use this constant in the python code as well const std::string ASP_POINT_OFFSET_TAG_STR = "POINT_OFFSET"; // Specialized functions for reading/writing images with a shift. // The shift is meant to bring the pixel values closer to origin, // with goal of saving the pixels as float instead of double. /// Subtract a given shift from first 3 components of given vector image. /// Skip pixels for which the first 3 components are (0, 0, 0). template struct SubtractShift: public vw::ReturnFixedType { vw::Vector3 m_shift; SubtractShift(vw::Vector3 const& shift):m_shift(shift){} VecT operator() (VecT const& pt) const { VecT lpt = pt; int len = std::min(3, (int)lpt.size()); if (subvector(lpt, 0, len) != subvector(vw::Vector3(), 0, len)) subvector(lpt, 0, len) -= subvector(m_shift, 0, len); return lpt; } }; template vw::UnaryPerPixelView> inline subtract_shift(vw::ImageViewBase const& image, vw::Vector3 const& shift) { return vw::UnaryPerPixelView> (image.impl(), SubtractShift(shift)); } // Compile-intensive via read_channels (12 instantiations). // Prefer the wrappers in PointCloudRead.h. template vw::ImageViewRef> read_asp_point_cloud(std::string const& filename) { vw::Vector3 shift; std::string shift_str; boost::shared_ptr rsrc (new vw::DiskImageResourceGDAL(filename)); bool success = vw::cartography::read_header_string(*rsrc.get(), asp::ASP_POINT_OFFSET_TAG_STR, shift_str); if (success) shift = vw::str_to_vec(shift_str); // Read the first m channels vw::ImageViewRef> out_image = vw::read_channels(filename, 0); // Add the shift back to the first several channels. if (shift != vw::Vector3()) out_image = subtract_shift(out_image, -shift); return out_image; } /// Don't round pixels in point2dem for bodies of radius smaller than /// this in meters. Do it though in stereo_tri, see get_rounding_error(). const double MIN_RADIUS_FOR_ROUNDING = 1e+6; // 1000 km /// Unless user-specified, compute the rounding error for a given /// planet (a point on whose surface is given by 'shift'). Return an /// inverse power of 2, 1/2^10 for Earth and proportionally less for smaller bodies. double get_rounding_error(vw::Vector3 const& shift, double rounding_error); /// Round pixels in given image to multiple of given rounding_error. template struct RoundImagePixels: public vw::ReturnFixedType { double m_rounding_error; RoundImagePixels(double rounding_error):m_rounding_error(rounding_error){ VW_ASSERT(m_rounding_error > 0.0, vw::ArgumentErr() << "Rounding error must be positive."); } VecT operator() (VecT const& pt) const { return m_rounding_error*round(pt/m_rounding_error); } }; template vw::UnaryPerPixelView > inline round_image_pixels(vw::ImageViewBase const& image, double rounding_error) { return vw::UnaryPerPixelView > (image.impl(), RoundImagePixels(rounding_error)); } // Save with temporarily big blocks if this helps with efficiency, such as if // the blocks need internal padding taken into account. template void saveWithTempBigBlocks(int bigBlockSize, const std::string &filename, vw::ImageViewBase const& img, bool hasGeoref, vw::cartography::GeoReference const& georef, bool hasNodata, double nodata, vw::GdalWriteOptions const& opt, vw::ProgressCallback const& tpc) { // Check if block size needs changing vw::Vector2 origBlockSize = opt.raster_tile_size; vw::Vector2 newBlockSize = vw::Vector2(bigBlockSize, bigBlockSize); // If block size matches, just write once with original options if (newBlockSize == origBlockSize) { block_write_gdal_image(filename, img, hasGeoref, georef, hasNodata, nodata, opt, tpc); return; } // Block size differs - write temp with big blocks, then rewrite with correct blocks vw::GdalWriteOptions localOpt = opt; localOpt.raster_tile_size = newBlockSize; localOpt.cog = false; // Disable COG for temporary write block_write_gdal_image(filename, img, hasGeoref, georef, hasNodata, nodata, localOpt, tpc); std::string tmpFile = boost::filesystem::path(filename).replace_extension(".tmp.tif").string(); boost::filesystem::rename(filename, tmpFile); vw::DiskImageView tmpImg(tmpFile); localOpt.raster_tile_size = origBlockSize; localOpt.cog = opt.cog; // Restore COG setting for final write vw::vw_out() << "Re-writing with blocks of size: " << localOpt.raster_tile_size[0] << " x " << localOpt.raster_tile_size[1] << ".\n"; vw::cartography::block_write_gdal_image(filename, tmpImg, hasGeoref, georef, hasNodata, nodata, localOpt, tpc); boost::filesystem::remove(tmpFile); return; } /// Block write image while subtracting a given value from all pixels /// and casting the result to float, while rounding to nearest mm. template void block_write_approx_gdal_image(const std::string &filename, vw::Vector3 const& shift, double rounding_error, vw::ImageViewBase const& image, bool has_georef, vw::cartography::GeoReference const& georef, bool has_nodata, double nodata, vw::GdalWriteOptions const& opt, vw::ProgressCallback const& progress_callback = vw::ProgressCallback::dummy_instance(), std::map const& keywords = std::map()) { if (norm_2(shift) > 0) { // Add the point shift to keywords std::map local_keywords = keywords; local_keywords[ASP_POINT_OFFSET_TAG_STR] = vw::vec_to_str(shift); block_write_gdal_image(filename, vw::channel_cast (round_image_pixels(subtract_shift(image.impl(), shift), get_rounding_error(shift, rounding_error))), has_georef, georef, has_nodata, nodata, opt, progress_callback, local_keywords); }else{ block_write_gdal_image(filename, image, has_georef, georef, has_nodata, nodata, opt, progress_callback, keywords); } } /// Single-threaded write image while subtracting a given value from /// all pixels and casting the result to float. template void write_approx_gdal_image(const std::string &filename, vw::Vector3 const& shift, double rounding_error, vw::ImageViewBase const& image, bool has_georef, vw::cartography::GeoReference const& georef, bool has_nodata, double nodata, vw::GdalWriteOptions const& opt, vw::ProgressCallback const& progress_callback = vw::ProgressCallback::dummy_instance(), std::map const& keywords = std::map()) { if (norm_2(shift) > 0){ // Add the point shift to keywords std::map local_keywords = keywords; local_keywords[ASP_POINT_OFFSET_TAG_STR] = vw::vec_to_str(shift); write_gdal_image(filename, vw::channel_cast (round_image_pixels(subtract_shift(image.impl(), shift), get_rounding_error(shift, rounding_error))), has_georef, georef, has_nodata, nodata, opt, progress_callback, local_keywords); }else{ write_gdal_image(filename, image, has_georef, georef, has_nodata, nodata, opt, progress_callback, keywords); } } } // End namespace asp #endif//__ASP_CORE_GDAL_UTILS_H__ ================================================ FILE: src/asp/Core/ImageNormalization.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include using namespace vw; namespace fs = boost::filesystem; namespace asp { /// Returns the correct nodata value from the input images or the input options. /// The user_nodata value overrides the image no-data values if it is not NaN. void get_nodata_values(boost::shared_ptr left_rsrc, boost::shared_ptr right_rsrc, float user_nodata, float & left_nodata_value, float & right_nodata_value){ // The no-data value read from options overrides the value present in the image files. left_nodata_value = std::numeric_limits::quiet_NaN(); right_nodata_value = std::numeric_limits::quiet_NaN(); if (left_rsrc->has_nodata_read ()) left_nodata_value = left_rsrc->nodata_read(); if (right_rsrc->has_nodata_read()) right_nodata_value = right_rsrc->nodata_read(); if (!std::isnan(user_nodata)) { if (user_nodata < left_nodata_value) vw_out(WarningMessage) << "It appears that the user-supplied no-data value is less than " << "the no-data value of left image. This may not be what was " << "intended.\n"; if (user_nodata < right_nodata_value) vw_out(WarningMessage) << "It appears that the user-supplied no-data value is less than " << "the no-data value of right image. This may not be what was " << "intended.\n"; left_nodata_value = user_nodata; right_nodata_value = user_nodata; } return; } // For OpenCV image detectors some things are a bit different. Used in a few places. bool openCvDetectMethod() { return (asp::stereo_settings().ip_detect_method != DETECT_IP_METHOD_INTEGRAL); } // If it is allowed to exceed the min and max values when normalizing images. // TODO(oalexan1): This now returns false. This must be switched to true, and // must integrate the logic for ISIS cub files where it is always true. bool doNotExceedMinMax() { return false; } // Calculate the min and max for all images to normalize, while respecting // given options. void calcImageSeqMinMax(bool force_use_entire_range, bool individually_normalize, bool use_percentile_stretch, bool do_not_exceed_min_max, std::vector> const& image_stats, // Outputs std::vector & min_vals, std::vector & max_vals) { // TODO(oalexan1): Find global min and max in either case // and do not exceed these in either case. There's nothing // to gain by exceeding those for all images. // Some of these will need a global min and max double global_min = std::numeric_limits::max(); double global_max = -std::numeric_limits::min(); min_vals.resize(image_stats.size(), global_min); max_vals.resize(image_stats.size(), global_max); // Iterate through the images bool warning_printed = false; for (size_t i = 0; i < image_stats.size(); i++) { // Sanity check if (image_stats[i].size() != 6) vw::vw_throw(vw::ArgumentErr() << "Expecting an image stats vector of size 6 in normalize_images().\n"); if (force_use_entire_range) { if (individually_normalize) { // Use min and max values for each image min_vals[i] = image_stats[i][0]; max_vals[i] = image_stats[i][1]; } else { // Normalize all using the same min and max global_min = std::min(global_min, (double)image_stats[i][0]); global_max = std::max(global_max, (double)image_stats[i][1]); } } else { // Don't force the entire range if (use_percentile_stretch) { // Percentile stretch min_vals[i] = image_stats[i][4]; max_vals[i] = image_stats[i][5]; } else { // Two standard deviation stretch // Standard deviation must be positive if (image_stats[i][3] == 0) { // This can happen if the image is completely blank. It is better to // give a warning than fail. vw::vw_out(vw::WarningMessage) << "The image stats do not have a positive stddev. " << "Try using the option --force-use-entire-range.\n"; } // This is an important check for when images come from different // sensors and have vastly different standard deviations. if (!individually_normalize && i > 0 && !warning_printed) { double min_std = std::min(image_stats[i][3], image_stats[i-1][3]); double max_std = std::max(image_stats[i][3], image_stats[i-1][3]); double std_ratio = min_std / std::max(max_std, 1e-10); if (std_ratio < 0.2) { vw::vw_out(vw::WarningMessage) << "The standard deviations of some images are very different. " << "Consider using the option --individually-normalize.\n"; warning_printed = true; } } // Use mean +/- 2 standard deviations. This is done in a few places in ASP. min_vals[i] = image_stats[i][2] - 2*image_stats[i][3]; max_vals[i] = image_stats[i][2] + 2*image_stats[i][3]; } if (!individually_normalize) { // Normalize all using the same min and max global_min = std::min(global_min, min_vals[i]); global_max = std::max(global_max, max_vals[i]); } } // end if (!force_use_entire_range) } // end for loop if (!individually_normalize) { // All get the same global min and max. for (size_t i = 0; i < image_stats.size(); i++) { min_vals[i] = global_min; max_vals[i] = global_max; } } if (do_not_exceed_min_max) { // This is important for ISIS which may have special pixels beyond the min and max for (size_t i = 0; i < image_stats.size(); i++) { min_vals[i] = std::max(min_vals[i], (double)image_stats[i][0]); max_vals[i] = std::min(max_vals[i], (double)image_stats[i][1]); } } return; } /// Normalize the intensity of two images based on input statistics void normalize_images(bool force_use_entire_range, bool individually_normalize, bool use_percentile_stretch, bool do_not_exceed_min_max, vw::Vector const& left_stats, vw::Vector const& right_stats, vw::ImageViewRef> & left_img, vw::ImageViewRef> & right_img) { // Get the min and max values for the two images std::vector min_vals, max_vals; std::vector> image_stats = {left_stats, right_stats}; calcImageSeqMinMax(force_use_entire_range, individually_normalize, use_percentile_stretch, do_not_exceed_min_max, image_stats, // Outputs min_vals, max_vals); if (individually_normalize > 0) vw::vw_out() << "\t--> Individually normalize images.\n"; else // Normalize using the same stats vw::vw_out() << "\t--> Normalize images globally.\n"; vw::vw_out() << "Left image value bounds: [" << min_vals[0] << " " << max_vals[0] << "]\n"; vw::vw_out() << "Right image value bounds: [" << min_vals[1] << " " << max_vals[1] << "]\n"; left_img = normalize(left_img, min_vals[0], max_vals[0], 0.0, 1.0); right_img = normalize(right_img, min_vals[1], max_vals[1], 0.0, 1.0); return; } // Normalize a single image to [0, 1] using mean and stddev-derived bounds. // Do not exceed the min and max values present in the image stats. This may // need to be the default. void normalizeImage(std::string const& image_file, vw::ImageViewRef> & image) { // Read the nodata value float nodata_val = -32768.0; vw::read_nodata_val(image_file, nodata_val); // Open the file and apply the mask image = vw::create_mask(vw::DiskImageView(image_file), nodata_val); // Gather stats std::string prefix = ""; bool reuse_cache = false; vw::Vector6f stats = asp::gather_stats(image, prefix, image_file, reuse_cache); // Use mean +/- 2 standard deviations. This is done in a few places in ASP. float mean = stats[2]; float stddev = stats[3]; double min_val = std::max(stats[0], mean - 2*stddev); double max_val = std::min(stats[1], mean + 2*stddev); image = normalize(image, min_val, max_val, 0.0, 1.0); } // This is called by parallel_bundle_adjust just once to accumulate all stats that // were done by individual processes. void calcNormalizationBounds(std::string const& out_prefix, std::vector const& image_files, std::string const& boundsFile) { int num_images = image_files.size(); std::vector> image_stats(num_images); // Assign the images which this instance should compute statistics for. for (int i = 0; i < num_images; i++) { std::string image_path = image_files[i]; std::string stats_path = out_prefix + '-' + fs::path(image_path).stem().string() + "-stats.tif"; // Read the stats vw::read_vector(image_stats[i], stats_path); // Sanity check if (image_stats[i].size() != 6) vw::vw_throw(vw::ArgumentErr() << "Expecting an image stats vector of size 6.\n"); } std::vector min_vals, max_vals; asp::calcImageSeqMinMax(asp::stereo_settings().force_use_entire_range, asp::stereo_settings().individually_normalize, asp::openCvDetectMethod(), asp::doNotExceedMinMax(), image_stats, // Outputs min_vals, max_vals); vw::vw_out() << "Writing: " << boundsFile << "\n"; std::ofstream out(boundsFile.c_str()); out.precision(17); for (int i = 0; i < num_images; i++) out << image_files[i] << " " << min_vals[i] << " " << max_vals[i] << "\n"; } // end function calcNormalizationBounds() // Read normalization bounds into std::map void readNormalizationBounds(std::string const& boundsFile, std::vector const& image_files, std::map & bounds_map) { std::ifstream in(boundsFile.c_str()); if (!in) { vw::vw_throw(vw::IOErr() << "Unable to open normalization bounds file: " << boundsFile << "\n"); } std::string image_file; double min_val, max_val; while (in >> image_file >> min_val >> max_val) { vw::Vector2 bounds(min_val, max_val); bounds_map[image_file] = bounds; } // Check that data for all images was read for (size_t i = 0; i < image_files.size(); i++) { std::string image_file = image_files[i]; if (bounds_map.find(image_file) == bounds_map.end()) { vw::vw_throw(vw::IOErr() << "Normalization bounds not found for image: " << image_file << "\n"); } } } // end function readNormalizationBounds() } // end namespace asp ================================================ FILE: src/asp/Core/ImageNormalization.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file ImageNormalization.h /// #ifndef __IMAGE_NORMALIZATION_H__ #define __IMAGE_NORMALIZATION_H__ #include #include #include namespace vw { class DiskImageResource; } namespace asp { typedef vw::Vector Vector6f; /// Returns the correct nodata value from the input images or the input options. /// The user_nodata value overrides the image no-data values if it is not NaN. void get_nodata_values(boost::shared_ptr left_rsrc, boost::shared_ptr right_rsrc, float user_nodata, float & left_nodata_value, float & right_nodata_value); // For OpenCV image detectors some things are a bit different. Used in a few places. bool openCvDetectMethod(); // If it is allowed to exceed the min and max values when normalizing images. // TODO(oalexan1): This now returns false. This must be switched to true, and // must integrate the logic for ISIS cub files where it is always true. bool doNotExceedMinMax(); // Calculate the min and max for all images to normalize, while respecting // given options. void calcImageSeqMinMax(bool force_use_entire_range, bool individually_normalize, bool use_percentile_stretch, bool do_not_exceed_min_max, std::vector> const& image_stats, // Outputs std::vector & min_vals, std::vector & max_vals); /// Normalize the intensity of two images based on input statistics void normalize_images(bool force_use_entire_range, bool individually_normalize, bool use_percentile_stretch, bool do_not_exceed_min_max, vw::Vector const& left_stats, vw::Vector const& right_stats, vw::ImageViewRef> & left_img, vw::ImageViewRef> & right_img); // Normalize a single image to [0, 1] using mean and stddev-derived bounds. // Do not exceed the min and max values present in the image stats. This may // need to be the default. void normalizeImage(std::string const& image_file, vw::ImageViewRef> & image); // This is called by parallel_bundle_adjust just once to accumulate all stats that // were done by individual processes. void calcNormalizationBounds(std::string const& out_prefix, std::vector const& image_files, std::string const& boundsFile); // Read normalization bounds into std::map void readNormalizationBounds(std::string const& boundsFile, std::vector const& image_files, std::map & bounds_map); } // end namespace asp #endif // __IMAGE_NORMALIZATION_H__ ================================================ FILE: src/asp/Core/ImageUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; namespace fs = boost::filesystem; namespace asp { /// Load an input image, georef, and nodata value void load_image(std::string const& image_file, vw::ImageViewRef & image, double & nodata, bool & has_georef, vw::cartography::GeoReference & georef) { // Ensure the output variables are initialized nodata = -std::numeric_limits::max(); has_georef = false; image = vw::load_image_as_double(image_file); // Read nodata-value from disk DiskImageResourceGDAL in_rsrc(image_file); bool has_nodata = in_rsrc.has_nodata_read(); if (has_nodata) { nodata = in_rsrc.nodata_read(); //vw_out() << "Read no-data value for image " << image_file << ": " << nodata << ".\n"; } else { nodata = vw::get_default_nodata(in_rsrc.channel_type()); } has_georef = vw::cartography::read_georeference(georef, image_file); } /// Create a masked DEM void create_masked_dem(std::string const& dem_file, vw::cartography::GeoReference & dem_georef, vw::ImageViewRef> & masked_dem) { vw_out() << "Loading DEM: " << dem_file << "\n"; // Read the no-data double nodata_val = -std::numeric_limits::max(); // note we use a float nodata if (vw::read_nodata_val(dem_file, nodata_val)) vw_out() << "Found DEM nodata value: " << nodata_val << "\n"; // Create the interpolated DEM. Values out of bounds will be invalid. vw::PixelMask invalid_val; invalid_val[0] = nodata_val; invalid_val.invalidate(); masked_dem = create_mask(DiskImageView(dem_file), nodata_val); // Read the georef. It must exist. bool is_good = vw::cartography::read_georeference(dem_georef, dem_file); if (!is_good) { vw_throw(ArgumentErr() << "Error: Cannot read a georeference from DEM: " << dem_file << ".\n"); } } /// Create a DEM ready to use for interpolation void create_interp_dem(std::string const& dem_file, vw::cartography::GeoReference & dem_georef, ImageViewRef> & interp_dem) { vw::ImageViewRef> masked_dem; asp::create_masked_dem(dem_file, dem_georef, masked_dem); vw::PixelMask invalid_val; interp_dem = interpolate(masked_dem, BilinearInterpolation(), vw::ValueEdgeExtension>(invalid_val)); } /// Take an interest point from a map projected image and convert it /// to the corresponding IP in the original non-map-projected image. /// - Return false if the pixel could not be converted. bool projected_ip_to_raw_ip(vw::ip::InterestPoint &P, vw::ImageViewRef> const& interp_dem, vw::CamPtr camera_model, vw::cartography::GeoReference const& georef, vw::cartography::GeoReference const& dem_georef) { // Get IP coordinate in the DEM Vector2 pix(P.x, P.y); Vector2 ll = georef.pixel_to_lonlat(pix); Vector2 dem_pix = dem_georef.lonlat_to_pixel(ll); if (!interp_dem.pixel_in_bounds(dem_pix)) return false; // Load the elevation from the DEM PixelMask dem_val = interp_dem(dem_pix[0], dem_pix[1]); if (!is_valid(dem_val)) return false; Vector3 llh(ll[0], ll[1], dem_val.child()); Vector3 xyz = dem_georef.datum().geodetic_to_cartesian(llh); // Project into the camera Vector2 cam_pix; try { cam_pix = camera_model->point_to_pixel(xyz); } catch(...) { return false; // Don't update the point. } P.x = cam_pix.x(); P.y = cam_pix.y(); P.ix = P.x; P.iy = P.y; return true; } // For ISIS .cub files from cam2map asp_map, the metadata is in the PVL // AspMapproject group, not in GDAL metadata tags. Read it via the // json:ISIS3 metadata domain. void read_cam2map_pvl(std::string const& map_file, std::string const& adj_key, std::string const& img_file_key, std::string const& cam_type_key, std::string const& cam_file_key, std::string const& dem_file_key, // Outputs std::string & adj_prefix, std::string & image_file, std::string & cam_type, std::string & cam_file, std::string & dem_file) { GDALAllRegister(); GDALDataset *ds = (GDALDataset*)GDALOpen(map_file.c_str(), GA_ReadOnly); if (!ds) return; char **md = ds->GetMetadata("json:ISIS3"); if (md && md[0]) { try { auto j = nlohmann::json::parse(md[0]); auto aspGrp = j.value("IsisCube", nlohmann::json::object()) .value("AspMapproject", nlohmann::json::object()); if (!aspGrp.empty()) { adj_prefix = aspGrp.value(adj_key, ""); image_file = aspGrp.value(img_file_key, ""); cam_type = aspGrp.value(cam_type_key, ""); cam_file = aspGrp.value(cam_file_key, ""); dem_file = aspGrp.value(dem_file_key, ""); } } catch (...) {} } GDALClose(ds); } // Read keywords that describe how the images were map-projected. void read_mapproj_header(std::string const& map_file, // Outputs std::string & adj_key, std::string & img_file_key, std::string & cam_type_key, std::string & cam_file_key, std::string & dem_file_key, std::string & adj_prefix, std::string & image_file, std::string & cam_type, std::string & cam_file, std::string & dem_file) { // Initialize all outputs to empty adj_prefix = ""; image_file = ""; cam_type = ""; cam_file = ""; dem_file = ""; boost::shared_ptr rsrc(new vw::DiskImageResourceGDAL(map_file)); adj_key = "BUNDLE_ADJUST_PREFIX"; img_file_key = "INPUT_IMAGE_FILE"; cam_type_key = "CAMERA_MODEL_TYPE", cam_file_key = "CAMERA_FILE"; dem_file_key = "DEM_FILE"; vw::cartography::read_header_string(*rsrc.get(), adj_key, adj_prefix); vw::cartography::read_header_string(*rsrc.get(), img_file_key, image_file); vw::cartography::read_header_string(*rsrc.get(), cam_type_key, cam_type); vw::cartography::read_header_string(*rsrc.get(), cam_file_key, cam_file); vw::cartography::read_header_string(*rsrc.get(), dem_file_key, dem_file); // Fall back to reading cam2map asp_map PVL metadata from .cub files. if (dem_file.empty()) read_cam2map_pvl(map_file, adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key, adj_prefix, image_file, cam_type, cam_file, dem_file); // This is important. When writing, have to write something, so use NONE, // but on reading, if the string is NONE, make it empty. if (adj_prefix == "NONE") adj_prefix = ""; } /// Function to apply a functor to each pixel of an input image. /// Traverse the image row by row. template void for_each_pixel_rowwise(const vw::ImageViewBase &view_, FuncT &func, vw::TerminalProgressCallback const& progress) { const ViewT& view = view_.impl(); typedef typename ViewT::pixel_accessor pixel_accessor; pixel_accessor plane_acc = view.origin(); for (int32 plane = view.planes(); plane; plane--) { // Loop through planes pixel_accessor row_acc = plane_acc; for (int32 row = 0; row void for_each_pixel_columnwise(const vw::ImageViewBase &view_, FuncT &func, vw::TerminalProgressCallback const& progress) { const ViewT& view = view_.impl(); typedef typename ViewT::pixel_accessor pixel_accessor; pixel_accessor plane_acc = view.origin(); for (int32 plane = view.planes(); plane; plane--) { // Loop through planes pixel_accessor col_acc = plane_acc; for (int32 col = 0; col < view.cols(); col++) { // Loop through cols progress.report_fractional_progress(col, view.cols()); pixel_accessor row_acc = col_acc; for (int32 row = view.rows(); row; row--) { // Loop along cols func(*row_acc); // Apply the functor to this pixel value row_acc.next_row(); } col_acc.next_col(); } plane_acc.next_plane(); } progress.report_finished(); return; } // Compute the min, max, mean, and standard deviation of an image object and // write them to a log. If prefix and image_path is set, will cache the results // to a file. For efficiency, the image must be traversed either rowwise or // columnwise, depending on how it is stored on disk. // TODO(oalexan1): This function must take into account ISIS special // pixels from StereoSessionIsis::preprocessing_hook(). Then, must eliminate // that function in favor of a single preprocessing_hook() in the base class. vw::Vector gather_stats(vw::ImageViewRef> image, std::string const& out_prefix, std::string const& image_path, bool force_reuse_cache, bool adjust_min_max_with_std) { vw_out() << "Computing statistics for " + image_path << "\n"; Vector6f result; const bool use_cache = ((out_prefix != "") && (image_path != "")); std::string stats_file = ""; if (use_cache) { if (image_path.find(out_prefix) == 0) { // If the image is, for example, run/run-L.tif, // then stats_file = run/run-L-stats.tif. stats_file = fs::path(image_path).replace_extension("").string() + "-stats.tif"; } else { // If the image is left_image.tif, // then stats_file = run/run-left_image-stats.tif stats_file = out_prefix + '-' + fs::path(image_path).stem().string() + "-stats.tif"; } } // Check if this stats file was computed after any image modifications. if ((use_cache && asp::first_is_newer(stats_file, image_path)) || (force_reuse_cache && fs::exists(stats_file))) { vw_out() << "\tReading statistics from file " + stats_file << "\n"; Vector stats; read_vector(stats, stats_file); // Just fetch the stats from the file on disk. result = stats; } else { // Compute the results // Read the resource and determine the block structure on disk. Use a boost shared ptr. vw::Vector2i block_size; { boost::shared_ptr rsrc (DiskImageResourcePtr(image_path)); block_size = rsrc->block_read_size(); } // Print a warning that processing can be slow if any of the block size // coords are bigger than 5120 pixels. if (block_size[0] > 5120 || block_size[1] > 5120) { vw_out(WarningMessage) << "Image " << image_path << " has block sizes of dimensions " << block_size[0] << " x " << block_size[1] << " (as shown by gdalinfo). This can make processing slow. Consider converting " << "it to tile format, using the command:\n" << "gdal_translate -co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 " << "input.tif output.tif\n"; } // Compute statistics at a reduced resolution const float TARGET_NUM_PIXELS = 1000000; float num_pixels = float(image.cols())*float(image.rows()); int stat_scale = int(ceil(sqrt(num_pixels / TARGET_NUM_PIXELS))); vw_out() << "Using downsample scale: " << stat_scale << "\n"; ChannelAccumulator > accumulator; vw::TerminalProgressCallback tp("asp","\tstats: "); if (block_size[0] >= block_size[1]) // Rows are long, so go row by row for_each_pixel_rowwise(subsample(edge_extend(image, ConstantEdgeExtension()), stat_scale), accumulator, tp); else // Columns are long, so go column by column for_each_pixel_columnwise(subsample(edge_extend(image, ConstantEdgeExtension()), stat_scale), accumulator, tp); result[0] = accumulator.quantile(0); // Min result[1] = accumulator.quantile(1); // Max result[2] = accumulator.approximate_mean(); result[3] = accumulator.approximate_stddev(); result[4] = accumulator.quantile(0.02); // Percentile values result[5] = accumulator.quantile(0.98); // Adjust lo/hi to be within 2 standard deviations of the mean, but do not // exceed min and max. Thi is needed for ISIS which has special pixels. May // become the default eventually or all uses as there is no point in // normalizing to a range that is much wider than the actual pixel values. if (adjust_min_max_with_std) { vw_out() << "\t--> Adjusting hi and lo to -+2 sigmas around mean.\n"; float lo = result[0]; float hi = result[1]; float mean = result[2]; float std = result[3]; if (lo < mean - 2*std) lo = mean - 2*std; if (hi > mean + 2*std) hi = mean + 2*std; result[0] = lo; result[1] = hi; } // Cache the results to disk if (use_cache) { vw_out() << "\tWriting stats file: " << stats_file << "\n"; Vector stats = result; // cast write_vector(stats_file, stats); } } // Done computing the results vw_out() << "\tlo: " << result[0] << " hi: " << result[1] << " mean: " << result[2] << " std_dev: " << result[3] << "\n"; return result; } // end function gather_stats // Checks if the given image file has an 8-bit channels bool hasByteChannels(const std::string& image_path) { boost::shared_ptr rsrc = vw::DiskImageResourcePtr(image_path); auto pixel_format = rsrc->pixel_format(); auto channel_type = rsrc->channel_type(); return (channel_type == vw::VW_CHANNEL_UINT8) && (pixel_format == vw::VW_PIXEL_GRAY || pixel_format == vw::VW_PIXEL_RGB || pixel_format == vw::VW_PIXEL_RGBA || pixel_format == vw::VW_PIXEL_GRAYA); } // Expand a box by a given percentage (typically pct is between 0 and 100) void expand_box_by_pct(vw::BBox2 & box, double pct) { // Check the pct is non-negative if (pct < 0.0) vw_throw(ArgumentErr() << "Invalid percentage when expanding a box: " << pct << ".\n"); double factor = pct / 100.0; double half_extra_x = 0.5 * box.width() * factor; double half_extra_y = 0.5 * box.height() * factor; box.min() -= Vector2(half_extra_x, half_extra_y); box.max() += Vector2(half_extra_x, half_extra_y); } } // end namespace asp ================================================ FILE: src/asp/Core/ImageUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file ImageUtils.h /// Utility functions for handling images #ifndef __ASP_CORE_IMAGE_UTILS_H__ #define __ASP_CORE_IMAGE_UTILS_H__ #include #include #include namespace vw { namespace cartography { class GeoReference; } } namespace asp { /// Load an input image, georef, and nodata value void load_image(std::string const& image_file, vw::ImageViewRef & image, double & nodata, bool & has_georef, vw::cartography::GeoReference & georef); /// Create a masked DEM void create_masked_dem(std::string const& dem_file, vw::cartography::GeoReference & dem_georef, vw::ImageViewRef> & masked_dem); /// Create a DEM ready to use for interpolation void create_interp_dem(std::string const& dem_file, vw::cartography::GeoReference & dem_georef, vw::ImageViewRef> & interp_dem); /// Take an interest point from a map projected image and convert it /// to the corresponding IP in the original non-map-projected image. /// - Return false if the pixel could not be converted. bool projected_ip_to_raw_ip(vw::ip::InterestPoint &P, vw::ImageViewRef> const& interp_dem, vw::CamPtr camera_model, vw::cartography::GeoReference const& georef, vw::cartography::GeoReference const& dem_georef); // Read keywords that describe how the images were map-projected. void read_mapproj_header(std::string const& map_file, // Outputs std::string & adj_key, std::string & img_file_key, std::string & cam_type_key, std::string & cam_file_key, std::string & dem_file_key, std::string & adj_prefix, std::string & image_file, std::string & cam_type, std::string & cam_file, std::string & dem_file); // Compute the min, max, mean, and standard deviation of an image object and // write them to a file. If prefix and image_path is set, will cache the results // to a file. vw::Vector gather_stats(vw::ImageViewRef> image, std::string const& out_prefix, std::string const& image_path, bool force_reuse_cache = false, bool adjust_min_max_with_std = false); // Checks if the given image file has an 8-bit channels bool hasByteChannels(const std::string& image_path); // Expand a box by a given percentage (typically pct is between 0 and 100) void expand_box_by_pct(vw::BBox2 & box, double pct); } // end namespace asp #endif//__ASP_CORE_IMAGE_UTILS_H__ ================================================ FILE: src/asp/Core/InterestPointMatching.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Some of the implementation is in InterestPointMatching2.cc using namespace vw; namespace fs = boost::filesystem; namespace asp { // Detect interest points. Use a cached ip file if available and if the // use_cached_ip flag is set. This is not meant to be used directly. Use // ip_matching() or homography_ip_matching(). The caller is responsible for // checking if this cached file is not older than the input image. void detect_ip(vw::ip::InterestPointList& ip, vw::ImageViewRef const& image, int ip_per_image, int ip_per_tile, std::string const vwip_file, double nodata, bool use_cached_ip) { if (use_cached_ip && fs::exists(vwip_file)) { // Sanity check for when the vwip need to be redone if ((asp::stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0) || asp::stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)) || !asp::stereo_settings().skip_rough_homography) vw::vw_throw(vw::ArgumentErr() << "Cannot use cached ip with --left-image-crop-win, " << "--right-image-crop-win, or --skip-rough-homography.\n"); vw::vw_out() << "\t Loading cached interest points file: " << vwip_file << "\n"; ip = vw::ip::read_binary_ip_file_list(vwip_file); return; } vw::Stopwatch sw1; sw1.start(); ip.clear(); // Automatically determine how many ip we need. Can be overridden below // either by --ip-per-image or --ip-per-tile (the latter takes priority). double tile_size = 1024.0; vw::BBox2i box = vw::bounding_box(image.impl()); double number_tiles = (box.width() / tile_size) * (box.height() / tile_size); // Must have not have both ip per image and ip per tile set if (ip_per_image > 0 && ip_per_tile > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot set both --ip-per-image and --ip-per-tile.\n"); if (ip_per_tile == 0) { // Create ip_per_tile from ip_per_image if (ip_per_image == 0) ip_per_image = 5000; // default ip_per_tile = double(ip_per_image) / number_tiles; if (ip_per_tile > 5000) ip_per_tile = 5000; if (ip_per_tile < 50) ip_per_tile = 50; } vw::vw_out() << "\t Using " << ip_per_tile << " interest points per tile (1024^2 px).\n"; const bool has_nodata = !std::isnan(nodata); // Load the detection method from stereo_settings. // - This relies on a direct match in the enum integer value. DetectIpMethod detect_method = static_cast(stereo_settings().ip_detect_method); // Detect interest points. // - Due to templated types we need to duplicate a bunch of code here if (detect_method == DETECT_IP_METHOD_INTEGRAL) { // Zack's custom detector int num_scales = stereo_settings().num_scales; if (num_scales <= 0) num_scales = vw::ip::IntegralAutoGainDetector::IP_DEFAULT_SCALES; else vw::vw_out() << "\t Using " << num_scales << " scales in OBALoG interest point detection.\n"; vw::ip::IntegralAutoGainDetector detector(ip_per_tile, num_scales); // This detector can't handle a mask so if there is nodata just set those pixels to zero. vw::vw_out() << "\t Detecting IP\n"; if (!has_nodata) ip = detect_interest_points(pixel_cast(image.impl()), detector, ip_per_tile); else ip = detect_interest_points(pixel_cast(apply_mask(create_mask(image.impl(),nodata))), detector, ip_per_tile); } else { // Initialize the OpenCV detector. Conveniently we can just pass in the type argument. // - If VW was not build with OpenCV, this call will just throw an exception. vw::ip::OpenCvIpDetectorType cv_method = vw::ip::OPENCV_IP_DETECTOR_TYPE_SIFT; if (detect_method == DETECT_IP_METHOD_ORB) cv_method = vw::ip::OPENCV_IP_DETECTOR_TYPE_ORB; // The opencv detector only works if the inputs are normalized, so do it here if it was not done before. // - If the images are already normalized most of the data will be in the 0-1 range. // - This normalize option will normalize PER-TILE which has different results than // the whole-image normalization that ASP normally uses. bool opencv_normalize = stereo_settings().skip_image_normalization; if (stereo_settings().ip_normalize_tiles) opencv_normalize = true; if (opencv_normalize) vw::vw_out() << "\t Using per-tile image normalization for interest points detection...\n"; bool build_opencv_descriptors = true; vw::ip::OpenCvInterestPointDetector detector(cv_method, opencv_normalize, build_opencv_descriptors, ip_per_tile); // These detectors do accept a mask so use one if applicable. vw::vw_out() << "\t Detecting IP\n"; if (!has_nodata) ip = detect_interest_points(pixel_cast(image.impl()), detector, ip_per_tile); else ip = detect_interest_points(pixel_cast(create_mask(image.impl(),nodata)), detector, ip_per_tile); } // End OpenCV case sw1.stop(); vw::vw_out(vw::DebugMessage,"asp") << "Detect interest points elapsed time: " << sw1.elapsed_seconds() << " s." << std::endl; if (!std::isnan(nodata)) { vw::vw_out() << "\t Removing IP near nodata with radius " << stereo_settings().ip_nodata_radius << std::endl; remove_ip_near_nodata(image.impl(), nodata, ip, stereo_settings().ip_nodata_radius); } // For the two OpenCV options we already built the descriptors, so // only do this for the integral method. if (detect_method == DETECT_IP_METHOD_INTEGRAL) { vw::Stopwatch sw2; sw2.start(); vw::vw_out() << "\t Building descriptors" << std::endl; vw::ip::SGradDescriptorGenerator descriptor; if (!has_nodata) describe_interest_points(image.impl(), descriptor, ip); else describe_interest_points(apply_mask(create_mask(image.impl(),nodata)), descriptor, ip); sw2.stop(); vw::vw_out(vw::DebugMessage,"asp") << "Building descriptors elapsed time: " << sw2.elapsed_seconds() << " s." << std::endl; } vw::vw_out() << "\t Number of interest points: " << ip.size() << std::endl; // If a file path was provided, record the IP (before matching) to disk. if (vwip_file != "") { vw::vw_out() << "\t Writing interest points: " << vwip_file << "\n"; vw::ip::write_binary_ip_file(vwip_file, ip); } return; } // Detect IP in a pair of images and apply rudimentary filtering. // Returns false if either image ended up with zero IP. bool detect_ip_pair(vw::ip::InterestPointList& ip1, vw::ip::InterestPointList& ip2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_image, int ip_per_tile, std::string const left_vwip_file, std::string const right_vwip_file, double nodata1, double nodata2, bool use_cached_ip) { vw::Stopwatch sw1; sw1.start(); // Detect interest points in the two images vw::vw_out() << "\t Looking for interest points in left image.\n"; detect_ip(ip1, vw::pixel_cast(image1), ip_per_image, ip_per_tile, left_vwip_file, nodata1, use_cached_ip); vw::vw_out() << "\t Looking for interest points in right image.\n"; detect_ip(ip2, vw::pixel_cast(image2), ip_per_image, ip_per_tile, right_vwip_file, nodata2, use_cached_ip); if (stereo_settings().ip_debug_images) { vw::vw_out() << "\t Writing detected IP debug images. " << std::endl; write_ip_debug_image("ASP_IP_detect_debug1.tif", image1, ip1, !std::isnan(nodata1), nodata1); write_ip_debug_image("ASP_IP_detect_debug2.tif", image2, ip2, !std::isnan(nodata2), nodata2); } side_ip_filtering(ip1, ip2, bounding_box(image1), bounding_box(image2)); sw1.stop(); vw::vw_out() << "Elapsed time in ip detection: " << sw1.elapsed_seconds() << " s.\n"; return ((ip1.size() > 0) && (ip2.size() > 0)); } /// Detect interest points and use a simple matching technique. /// This is not meant to be used directly. Use ip_matching(). void detect_match_ip(std::vector& matched_ip1, std::vector& matched_ip2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_tile, size_t number_of_jobs, std::string const left_vwip_file, std::string const right_vwip_file, bool use_cached_ip, double nodata1, double nodata2, std::string const& match_file) { // Detect interest points in the two images vw::ip::InterestPointList ip1, ip2; detect_ip_pair(ip1, ip2, image1, image2, asp::stereo_settings().ip_per_image, ip_per_tile, left_vwip_file, right_vwip_file, nodata1, nodata2, use_cached_ip); // Match the ip and save the match file. No epipolar constraint // is used in this mode. match_ip_no_datum(ip1, ip2, image1, image2, number_of_jobs, matched_ip1, matched_ip2, match_file); // outputs } // End function detect_match_ip void check_homography_matrix(Matrix const& H, int left_size, int right_size, int num_inliers) { // Ensure H has at least 2 rows and 2 columns if (H.rows() < 2 || H.cols() < 2) vw::vw_throw(ArgumentErr() << "InterestPointMatching: Homography matrix is too small.\n"); return; // Sanity checks. If these fail, most likely the two images are too different // for stereo to succeed. if (num_inliers < std::min(left_size, right_size)/2) { vw_out(WarningMessage) << "InterestPointMatching: The number of inliers is less " << "than 1/2 of the number of points. The inputs may be invalid.\n"; } double det = fabs(H(0, 0)*H(1, 1) - H(0, 1)*H(1, 0)); if (det <= 0.1 || det >= 10.0) { vw_out(WarningMessage) << "InterestPointMatching: The determinant of the 2x2 submatrix " << "of the homography matrix " << H << " is " << det << ". " << "There could be a large scale discrepancy among the input images " << "or the inputs may be an invalid stereo pair.\n"; } } // Find a rough homography that maps right to left using the camera // and datum information. More precisely, take a set of pixels in // the left camera image, project them onto the ground and back // project them into the right camera image. Then to the // reverse. This will help find a rough correspondence between // the pixels in the two camera images. Matrix rough_homography_fit(camera::CameraModel* cam1, camera::CameraModel* cam2, BBox2i const& box1, BBox2i const& box2, cartography::Datum const& datum) { vw::Stopwatch sw; sw.start(); // Bounce several points off the datum and fit an affine. std::vector left_points, right_points; int num = 100; left_points.reserve(2*num*num); right_points.reserve(2*num*num); // Report progress, as this may be slow TerminalProgressCallback tpc("", "\tRough homography--> "); tpc.report_progress(0); double inc_amount = 1.0 / double(num) / double(num); for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { try { Vector2 l(double(box1.width() - 1) * i / (num-1.0), double(box1.height() - 1) * j / (num-1.0)); Vector3 intersection = cartography::datum_intersection(datum, cam1, l); if (intersection == Vector3()) continue; Vector2 r = cam2->point_to_pixel(intersection); if (box2.contains(r)) { left_points.push_back(Vector3(l[0],l[1],1)); right_points.push_back(Vector3(r[0],r[1],1)); } } catch (...) {} try { Vector2 r(double(box2.width() - 1) * i / (num-1.0), double(box2.height() - 1) * j / (num-1.0)); Vector3 intersection = cartography::datum_intersection(datum, cam2, r); if (intersection == Vector3()) continue; Vector2 l = cam1->point_to_pixel(intersection); if (box1.contains(l)) { left_points.push_back(Vector3(l[0],l[1],1)); right_points.push_back(Vector3(r[0],r[1],1)); } } catch (...) {} tpc.report_incremental_progress(inc_amount); } } tpc.report_finished(); // At most 5000 points should be enough for rough homography as it is a simple transform. vw::ip::pick_pair_subset(left_points, right_points, 5000); vw_out() << "Projected " << left_points.size() << " rays for rough homography.\n"; if (left_points.empty() || right_points.empty()) 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"); // The --ip-inlier-factor is 0.2 by default in stereo and bundle_adjust. // This results in inlier_th = 0.1 * diagonal. May be too high for large images, // but the rough homography is well-behaved, since it uses cameras, and not // interest points, so it should be fine. double thresh_factor = stereo_settings().ip_inlier_factor; double inlier_th = norm_2(Vector2(box1.width(), box1.height())) * (0.5 * thresh_factor); inlier_th = std::max(inlier_th, 30.0); // don't allow it to be too small int min_inliers = left_points.size()/2; bool reduce_num_if_no_fit = true; // Using 1000 iterations is excessive here given that the these produced // interest points are not too noisy. This also takes a long time. int num_iter = stereo_settings().ip_num_ransac_iterations/10 + 50; // about 150 vw_out() << "\t Rough homography inlier threshold: " << inlier_th << "\n"; // Use RANSAC to determine a good homography transform between the images vw_out() << "Estimating rough homography using RANSAC with " << num_iter << " iterations.\n"; typedef math::HomographyFittingFunctor hfit_func; math::RandomSampleConsensus ransac(hfit_func(), math::InterestPointErrorMetric(), num_iter, inlier_th, min_inliers, reduce_num_if_no_fit); Matrix H = ransac(right_points, left_points); std::vector indices = ransac.inlier_indices(H, right_points, left_points); check_homography_matrix(H, left_points.size(), right_points.size(), indices.size()); vw_out() << "Number of inliers: " << indices.size() << ".\n"; sw.stop(); vw_out() << "Rough homography fit elapsed time: " << sw.elapsed_seconds() << " s.\n"; return H; } // Filter ip with homography. This is a wrapper around RANSAC. void filter_ip_homog(std::vector const& ip1_in, std::vector const& ip2_in, double inlier_th, // Outputs vw::Matrix & H, std::vector & indices) { // Initialize the outputs. Ensure H is a valid matrix, in case ransac fails. H = vw::math::identity_matrix<3>(); H.set_identity(); indices.clear(); vw::vw_out() << "\t Filtering interest point matches using homography.\n"; try { auto ransac_ip1 = iplist_to_vectorlist(ip1_in); auto ransac_ip2 = iplist_to_vectorlist(ip2_in); int min_inliers = ransac_ip1.size()/2; bool reduce_num_if_no_fit = true; vw_out() << "\t Homography ip filter inlier threshold: " << inlier_th << "\n"; vw_out() << "\t RANSAC iterations: " << stereo_settings().ip_num_ransac_iterations << "\n"; typedef math::RandomSampleConsensus RansacT; RansacT ransac(math::HomographyFittingFunctor(), math::InterestPointErrorMetric(), stereo_settings().ip_num_ransac_iterations, inlier_th, min_inliers, reduce_num_if_no_fit); H = ransac(ransac_ip2, ransac_ip1); // 2 then 1 is used here for legacy reasons indices = ransac.inlier_indices(H, ransac_ip2, ransac_ip1); vw::vw_out() << "Homography matrix:\n" << H << "\n"; vw_out() << "Number of inliers: " << indices.size() << ".\n"; check_homography_matrix(H, ransac_ip1.size(), ransac_ip2.size(), indices.size()); } catch (const math::RANSACErr& e) { vw_out() << "RANSAC failed: " << e.what() << "\n"; return; } } // Compute the homography matrix (in right_matrix). The left matrix // will have a translation corresponding to a crop. Vector2i homography_rectification(bool adjust_left_image_size, bool tight_inlier_threshold, Vector2i const& left_size, Vector2i const& right_size, std::vector const& left_ip, std::vector const& right_ip, vw::Matrix& left_matrix, vw::Matrix& right_matrix) { // This number is 1/15 by default in stereo, and 0.2 in bundle_adjust. The // latter is more tolerant of outliers, but for stereo this can result in a // huge search range for disparity, which is not good. // TODO(oalexan1): This number can be too large for large images. Maybe need // to use the square root of the diagonal of the image size. Also, in some // related places a constant factor is used, like 30. Need to make that // uniform. double thresh_factor = stereo_settings().ip_inlier_factor; double inlier_th = norm_2(Vector2(left_size.x(),left_size.y())) * (0.5*thresh_factor); // When determining matches per tile, a loose threshold can result in inaccurate // determination of the homography. We'd rather have it accurate here and throw // away some good matches than the other way around. Later these matches will // be replaced with matches per tile once the homography transform is found. if (tight_inlier_threshold) { inlier_th = std::min(0.05*norm_2(Vector2(left_size.x(),left_size.y())), inlier_th); inlier_th = std::min(inlier_th, 200.0); inlier_th = std::max(inlier_th, 50.0); } Matrix H = vw::math::identity_matrix<3>(); std::vector indices; filter_ip_homog(left_ip, right_ip, inlier_th, H, indices); // outputs // TODO(oalexan1): A percentile-based filter may help here, after finding // the inliers. It should be based on estimating H * right - left. // That because the inlier threshold is kind of arbitrary. // If outliers are found, need to recompute H based on inliers, which is quick. check_homography_matrix(H, left_ip.size(), right_ip.size(), indices.size()); // Set right to a homography that has been refined just to our inliers. // May be adjusted with a translation below. // TODO(oalexan1): It is not clear if adjusting a homography transform's // translation coefficients is the right way of applying a translation to it, // because it has a denominator too. left_matrix = vw::math::identity_matrix<3>(); right_matrix = H; // Work out the ideal render size BBox2i output_bbox, right_bbox; output_bbox.grow(Vector2i(0, 0)); output_bbox.grow(Vector2i(left_size.x(), 0)); output_bbox.grow(Vector2i(0, left_size.y())); output_bbox.grow(left_size); if (adjust_left_image_size) { // Crop the left and right images to the shared region. This is // done for efficiency. It may not be always desirable though, // as in this case we lose the one-to-one correspondence between // original input left image pixels and output disparity/point // cloud pixels. Vector3 temp = right_matrix*Vector3(0,0,1); temp /= temp.z(); right_bbox.grow(subvector(temp,0,2)); temp = right_matrix*Vector3(right_size.x(),0,1); temp /= temp.z(); right_bbox.grow(subvector(temp,0,2)); temp = right_matrix*Vector3(0,right_size.y(),1); temp /= temp.z(); right_bbox.grow(subvector(temp,0,2)); temp = right_matrix*Vector3(right_size.x(),right_size.y(),1); temp /= temp.z(); right_bbox.grow(subvector(temp,0,2)); output_bbox.crop(right_bbox); // Move the ideal render size to be aligned up with origin left_matrix (0,2) -= output_bbox.min().x(); right_matrix(0,2) -= output_bbox.min().x(); left_matrix (1,2) -= output_bbox.min().y(); right_matrix(1,2) -= output_bbox.min().y(); } return Vector2i(output_bbox.width(), output_bbox.height()); } /// Remove points in/out of a bounding box depending on "remove_outside". /// - Returns the number of points removed. size_t remove_ip_bbox(vw::BBox2i const& roi, vw::ip::InterestPointList & ip_list, bool remove_outside) { // Loop through all the points size_t num_removed = 0; vw::ip::InterestPointList::iterator ip; for (ip = ip_list.begin(); ip != ip_list.end(); ++ip) { if (roi.contains(vw::Vector2i(ip->ix,ip->iy)) xor remove_outside) { ip = ip_list.erase(ip); ++num_removed; --ip; } } return num_removed; } // End function remove_ip_bbox void side_ip_filtering(vw::ip::InterestPointList& ip1, vw::ip::InterestPointList& ip2, vw::BBox2i const& bbox1, vw::BBox2i const& bbox2) { // Filter out IP from the opposite sides of the two images. // - Would be better to just pass an ROI into the IP detector! if (stereo_settings().ip_edge_buffer_percent <= 0) return; // Figure out removal bboxes double percent = static_cast(stereo_settings().ip_edge_buffer_percent)/100.0; int width_left = floor(static_cast(bbox1.width()) * percent); int width_right = floor(static_cast(bbox2.width()) * percent); BBox2 bbox_left (width_left, 0, bbox1.width()-width_left, bbox1.height()); BBox2 bbox_right(0, 0, bbox2.width()-width_right, bbox2.height()); bool remove_outside = true; // Remove the points size_t num_removed_left = remove_ip_bbox(bbox_left, ip1, remove_outside); size_t num_removed_right = remove_ip_bbox(bbox_right, ip2, remove_outside); vw_out() << "Removed: " << num_removed_left << " points from the left side of the left image and " << num_removed_right << " points from the right side of the right image.\n"; } // End side IP filtering bool tri_ip_filtering(std::vector const& matched_ip1, std::vector const& matched_ip2, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, std::list& valid_indices) { typedef std::vector ArrayT; ArrayT error_samples(valid_indices.size()); // Create the 'error' samples. Which are triangulation error and distance to sphere. double angle_tol = vw::stereo::StereoModel::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180); stereo::StereoModel model(cam1, cam2, angle_tol); size_t count = 0; const double HIGH_ERROR = 9999999; BOOST_FOREACH(size_t i, valid_indices) { model(Vector2(matched_ip1[i].x, matched_ip1[i].y), Vector2(matched_ip2[i].x, matched_ip2[i].y), error_samples[count]); // The call returns exactly zero error to indicate a failed ray intersection // so replace it in those cases with a very high error if (error_samples[count] == 0) error_samples[count] = HIGH_ERROR; count++; } VW_ASSERT(count == valid_indices.size(), vw::MathErr() << "Error: tri_ip_filtering: count indices not aligned."); typedef std::vector, Vector > > ClusterT; const size_t NUM_CLUSTERS = 2; ClusterT error_clusters = gaussian_clustering(error_samples.begin(), error_samples.end(), NUM_CLUSTERS); // The best triangulation error is the one that has the smallest // standard deviations. They are focused on the tight pack of // inliers. Bring the smaller std-dev cluster to the front as it // is what we are interested in.OB if ((error_clusters.front().second[0] > error_clusters.back().second[0]) && (error_clusters.back().second[0] != std::numeric_limits::epsilon())) std::swap(error_clusters[0], error_clusters[1]); // Determine if we just wrote nothing but outliers (the variance // on triangulation is too high). if (error_clusters.front().second[0] > 1e6) { vw_out() << "\t Unable to find inlier cluster, keeping best 70% of points.\n"; // Instead of failing, take our best guess at which points are inliers // - Sort the error, then find an approximate percentile. const double CUTOFF_PERCENTILE = 0.7; std::vector sorted_error(error_samples); std::sort(sorted_error.begin(), sorted_error.end()); size_t last_good_index = static_cast(sorted_error.size()) * CUTOFF_PERCENTILE; double cutoff_value = 0; if (last_good_index < sorted_error.size()) cutoff_value = sorted_error[last_good_index]; // The maximum triangulation error still applies! if ((asp::stereo_settings().ip_triangulation_max_error > 0) && (cutoff_value > asp::stereo_settings().ip_triangulation_max_error)) cutoff_value = asp::stereo_settings().ip_triangulation_max_error; // Treat all points below the new cutoff_value as inliers std::list filtered_indices; size_t c=0; for (auto i = valid_indices.begin(); i != valid_indices.end(); i++) { if (error_samples[c] < cutoff_value) filtered_indices.push_back(*i); c++; } valid_indices = filtered_indices; return (!valid_indices.empty()); } // End of "nothing but outliers" case vw_out() << "\t Inlier cluster:\n" << "\t Triangulation error: " << error_clusters.front().first[0] << " +- " << sqrt(error_clusters.front().second[0]) << " meters\n"; // Record indices of points that match our clustering result const double escalar1 = 1.0 / sqrt(2.0 * M_PI * error_clusters.front().second[0]); // outside exp of normal eq const double escalar2 = 1.0 / sqrt(2.0 * M_PI * error_clusters.back().second[0]); const double escalar3 = 1.0 / (2 * error_clusters.front().second[0]); // inside exp of normal eq const double escalar4 = 1.0 / (2 * error_clusters.back().second[0]); size_t error_idx = 0; size_t prior_valid_size = valid_indices.size(); size_t outlier_count = 0; for (std::list::iterator i = valid_indices.begin(); i != valid_indices.end(); i++) { double err_diff_front = error_samples[error_idx]-error_clusters.front().first[0]; double err_diff_back = error_samples[error_idx]-error_clusters.back ().first[0]; if (!((escalar1 * exp((-err_diff_front * err_diff_front) * escalar3)) > (escalar2 * exp((-err_diff_back * err_diff_back) * escalar4)) || error_samples[error_idx] < error_clusters.front().first[0]) || ((asp::stereo_settings().ip_triangulation_max_error > 0) && (error_samples[error_idx] > asp::stereo_settings().ip_triangulation_max_error))) { // It's an outlier! //vw_out() << "Removing error_samples["<< error_idx <<"] = " << error_samples[error_idx] << std::endl; i = valid_indices.erase(i); i--; // For loop is going to increment this back up ++outlier_count; } error_idx++; } VW_ASSERT(prior_valid_size == error_idx, vw::MathErr() << "tri_ip_filtering: Programmer error. Indices don't " << "seem to be aligned."); vw_out() << "\t Removed " << outlier_count << " points in triangulation filtering.\n"; return (!valid_indices.empty()); } bool stddev_ip_filtering(std::vector const& ip1, std::vector const& ip2, std::list& valid_indices) { const int NUM_STD_FILTER = 4; // 4 stddev filtering. Deletes any disparity measurement that is 4 // stddev away from the measurements of it's local neighbors. We // kill off worse offender one at a time until everyone is compliant. bool deleted_something = false; size_t num_deleted = 0; do { deleted_something = false; Matrix locations1(valid_indices.size(), 2); size_t count = 0; std::vector reverse_lookup (valid_indices.size()); std::vector disparity_vector(valid_indices.size()); BOOST_FOREACH(size_t index, valid_indices) { locations1(count, 0) = ip1[index].x; locations1(count, 1) = ip1[index].y; reverse_lookup [count] = index; disparity_vector[count] = Vector2(ip2[index].x,ip2[index].y) - Vector2(ip1[index].x,ip1[index].y); count++; } math::FLANNTree tree1(asp::stereo_settings().flann_method); tree1.load_match_data(locations1, vw::math::FLANN_DistType_L2); std::pair worse_index; worse_index.first = 0; for (size_t i = 0; i < valid_indices.size(); i++) { Vector indices; Vector distance; const int NUM_INDICES_TO_GET = 11; tree1.knn_search(select_row(locations1, i), indices, distance, NUM_INDICES_TO_GET); // Bugfix: If there are too few inputs, in rare occasions // some of the outputs are invalid. Not always. Could not // figure this out in reasonable time, the logic is somewhere // deep inside FLANN. Just discard the bad results. std::vector good_indices; for (size_t j = 0; j < indices.size(); j++) { if ((indices[j] < 0) || (indices[j] >= (int)disparity_vector.size())) continue; good_indices.push_back(indices[j]); } // Make an average of the disparities around us and not our own measurement Vector2 sum; for (size_t j = 1; j < good_indices.size(); j++) { sum += disparity_vector[good_indices[j]]; } sum = normalize(sum); // Project all disparities along the new gradient Vector projections(good_indices.size()); for (size_t j = 0; j < good_indices.size(); j++) { projections[j] = dot_prod(disparity_vector[good_indices[j]], sum); } double mean = 0; double stddev = 0; for (size_t j = 1; j < good_indices.size(); j++) { mean += projections[j]; stddev += projections[j]*projections[j]; } mean /= good_indices.size() - 1; stddev = sqrt(stddev / (good_indices.size() - 1) - mean*mean); double std_distance = fabs(projections[0]-mean)/stddev; if (std_distance > worse_index.first) { worse_index.first = std_distance; worse_index.second = i; } } // End loop through valid indices if (worse_index.first > NUM_STD_FILTER) { std::list::iterator it = valid_indices.begin(); std::advance(it, worse_index.second); valid_indices.erase(it); deleted_something = true; ++num_deleted; } // If we ended up deleting everything, just quit here and return 0. if (valid_indices.empty()) return 0; } while (deleted_something); vw_out() << "\t Removed " << num_deleted << " points in stddev filtering.\n"; return valid_indices.size(); } size_t filter_ip_by_lonlat_and_elevation(vw::TransformPtr tx_left, vw::TransformPtr tx_right, vw::camera::CameraModel* left_camera_model, vw::camera::CameraModel* right_camera_model, vw::cartography::Datum const& datum, std::vector const& ip1_in, std::vector const& ip2_in, vw::Vector2 const & elevation_limit, vw::BBox2 const & lon_lat_limit, std::vector & ip1_out, std::vector & ip2_out) { // Handle case where the elevation or lonlat range are not set const size_t num_ip = ip1_in.size(); if (elevation_limit[1] <= elevation_limit[0] && lon_lat_limit.empty()) { ip1_out = ip1_in; ip2_out = ip2_in; return num_ip; } if (elevation_limit[0] < elevation_limit[1]) vw_out() << "\t * Applying elevation restriction. Height range: " << elevation_limit[0] << " to " << elevation_limit[1] << ".\n"; if (!lon_lat_limit.empty()) vw_out() << "\t * Applying lon-lat restriction: " << lon_lat_limit.min() << " to " << lon_lat_limit.max() << ".\n"; // Init output vectors ip1_out.clear(); ip2_out.clear(); ip1_out.reserve(num_ip); ip2_out.reserve(num_ip); // Set up stereo model double angle_tolerance = vw::stereo::StereoModel::robust_1_minus_cos (stereo_settings().min_triangulation_angle*M_PI/180); vw::stereo::StereoModel model(left_camera_model, right_camera_model, angle_tolerance); // This function can be called with both unaligned and aligned interest points bool aligned_ip = (tx_left.get() != NULL && tx_right != NULL); // For each interest point, compute the height and only keep it if the height falls within // the specified range. for (size_t i = 0; i < num_ip; i++) { // We must not both apply a transform and a scale at the same time // as these are meant to do the same thing in different circumstances. Vector2 p1 = Vector2(ip1_in[i].x, ip1_in[i].y); Vector2 p2 = Vector2(ip2_in[i].x, ip2_in[i].y); if (aligned_ip) { // Unalign p1 = tx_left->reverse (p1); p2 = tx_right->reverse(p2); } // Triangulate double err = -1.0; Vector3 xyz(0.0, 0.0, 0.0); try { xyz = model(p1, p2, err); } catch(...) { xyz = Vector3(); } if (err <= 0.0 || xyz == Vector3()) { // Triangulation failed continue; } Vector3 llh = datum.cartesian_to_geodetic(xyz); if ((elevation_limit[0] < elevation_limit[1]) && ((llh[2] < elevation_limit[0]) || (llh[2] > elevation_limit[1]))) { // vw_out() << "Removing IP diff: " << p2 - p1 << " with llh " << llh << std::endl; continue; } Vector2 lon_lat = subvector(llh, 0, 2); if ((!lon_lat_limit.empty()) && (!lon_lat_limit.contains(lon_lat))) { continue; } // vw_out() << "Keeping IP diff: " << p2 - p1 << " with llh " << llh << std::endl; ip1_out.push_back(ip1_in[i]); ip2_out.push_back(ip2_in[i]); } vw_out() << "\t * Removed " << ip1_in.size() - ip1_out.size() << " ip using elevation/lonlat filtering.\n"; return ip1_out.size(); } // End filter_ip_by_elevation // Filter ip by triangulation error and height range. // This assumes the interest points are for the original images, without alignment // or mapprojection. // TODO(oalexan1): Add here the ability to reverse the alignment void filter_ip_using_cameras(std::vector & ip1, std::vector & ip2, vw::camera::CameraModel const * cam1, vw::camera::CameraModel const * cam2, vw::cartography::Datum const & datum, double pct, double factor) { std::vector tri_errors(ip1.size()), heights(ip1.size()); // Compute the triangulation errors double angle_tol = vw::stereo::StereoModel ::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180); stereo::StereoModel model(cam1, cam2, angle_tol); double HIGH_ERROR = std::numeric_limits::max(); for (size_t i = 0; i < ip1.size(); i++) { Vector3 xyz; try { xyz = model(Vector2(ip1[i].x, ip1[i].y), Vector2(ip2[i].x, ip2[i].y), tri_errors[i]); } catch(...) { xyz = Vector3(); } // The call returns the zero tri error and zero xyz to indicate a // failed ray intersection so replace it in those cases with a // very high error. if (tri_errors[i] == 0 || xyz == Vector3()) { tri_errors[i] = HIGH_ERROR; heights[i] = HIGH_ERROR; continue; } // Find the height above datum Vector3 llh = datum.cartesian_to_geodetic(xyz); heights[i] = llh[2]; } // Put the valid heights in a vector std::vector vals; vals.reserve(ip1.size()); vals.clear(); for (size_t i = 0; i < ip1.size(); i++) { if (heights[i] >= HIGH_ERROR) continue; vals.push_back(heights[i]); } // Find the outlier brackets double pct_fraction = 1.0 - pct/100.0; double b = -1.0, e = -1.0; vw::math::find_outlier_brackets(vals, pct_fraction, factor, b, e); // Apply the outlier threshold int count = 0; for (size_t i = 0; i < ip1.size(); i++) { if (heights[i] >= HIGH_ERROR) continue; if (heights[i] < b || heights[i] > e) { heights[i] = HIGH_ERROR; count++; } } vw_out() << "Number (and fraction) of removed outliers by the height check: " << count << " (" << double(count)/ip1.size() << ").\n"; // Find the valid tri errors. Make use of the fact that we already filtered by height. vals.clear(); for (size_t i = 0; i < ip1.size(); i++) { if (tri_errors[i] >= HIGH_ERROR || heights[i] >= HIGH_ERROR) // already invalid continue; vals.push_back(tri_errors[i]); } // Find the outlier brackets. Since the triangulation errors, unlike // the heights, are usually rather uniform, adjust pct from 95 to // 75. double pct2 = (75.0/95.0) * pct; double pct_fraction2 = 1.0 - pct2/100.0; // Show some lenience below as due to jitter some errors could be somewhat bigger double factor2 = 2.0 * factor; b = -1.0; e = -1.0; vw::math::find_outlier_brackets(vals, pct_fraction2, factor2, b, e); // Apply the outlier threshold count = 0; for (size_t i = 0; i < ip1.size(); i++) { if (heights[i] >= HIGH_ERROR || tri_errors[i] >= HIGH_ERROR) continue; // already invalid // We will ignore b, as the triangulation errors are non-negative. if (tri_errors[i] > e) { tri_errors[i] = HIGH_ERROR; count++; } } vw_out() << "Number (and fraction) of removed outliers by the triangulation error check: " << count << " (" << double(count)/ip1.size() << ").\n"; // Copy the outliers in place count = 0; for (size_t i = 0; i < ip1.size(); i++) { if (tri_errors[i] >= HIGH_ERROR || heights[i] >= HIGH_ERROR) continue; ip1[count] = ip1[i]; ip2[count] = ip2[i]; count++; } ip1.resize(count); ip2.resize(count); } // Filter IP using a given DEM and max height difference. Assume that // the interest points have alignment applied to them (either via a // transform or from mapprojection). void ip_filter_using_dem(std::string const & ip_filter_using_dem, vw::TransformPtr tx_left, vw::TransformPtr tx_right, boost::shared_ptr left_camera_model, boost::shared_ptr right_camera_model, std::vector & left_aligned_ip, std::vector & right_aligned_ip) { vw_out() << "Filtering interest point matches with --ip-filter-using-dem.\n"; std::string dem_file; double max_height_diff = -1.0; std::istringstream is(ip_filter_using_dem); if (!(is >> dem_file >> max_height_diff)) vw_throw(ArgumentErr() << "Could not parse correctly option --ip-filter-using-dem.\n"); if (max_height_diff <= 0.0) vw_throw(ArgumentErr() << "Positive height diff value expected in --ip-filter-using-dem.\n"); // Read the DEM and supporting data vw::cartography::GeoReference dem_georef; DiskImageView dem_disk_image(dem_file); ImageViewRef> dem; boost::shared_ptr dem_rsrc(DiskImageResourcePtr(dem_file)); if (dem_rsrc->has_nodata_read()) dem = create_mask(dem_disk_image, dem_rsrc->nodata_read()); else dem = pixel_cast>(dem_disk_image); // all pixels are valid bool has_georef = vw::cartography::read_georeference(dem_georef, dem_file); if (!has_georef) vw_throw(ArgumentErr() << "There is no georeference information in: " << dem_file << ".\n"); // An invalid pixel value used for edge extension PixelMask nodata_pix(0); nodata_pix.invalidate(); ValueEdgeExtension> nodata_ext(nodata_pix); // Set up for interpolation. Out-of-range pixels are declared to be invalid. ImageViewRef> interp_dem = interpolate(dem, BilinearInterpolation(), nodata_ext); // Set up the stereo model for doing triangulation double angle_tol = vw::stereo::StereoModel ::robust_1_minus_cos(stereo_settings().min_triangulation_angle*M_PI/180); stereo::StereoModel model(left_camera_model.get(), right_camera_model.get(), angle_tol); std::set invalid_indices; for (size_t it = 0; it < left_aligned_ip.size(); it++) { // Undo the alignment or mapprojection Vector2 left_pix = tx_left->reverse (Vector2(left_aligned_ip[it].x, left_aligned_ip[it].y)); Vector2 right_pix = tx_right->reverse(Vector2(right_aligned_ip[it].x, right_aligned_ip[it].y)); // Triangulate double err = -1.0; Vector3 xyz(0.0, 0.0, 0.0); try { xyz = model(left_pix, right_pix, err); } catch(...) { xyz = Vector3(); } if (err <= 0.0 || xyz == Vector3()) { invalid_indices.insert(it); continue; } Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz); // This was tested to give correct results with the DEM // having its longitude in both [-180, 0] and [180, 360]. Vector2 pix = dem_georef.lonlat_to_pixel(Vector2(llh[0], llh[1])); PixelMask dem_val = interp_dem(pix.x(), pix.y()); if (!is_valid(dem_val) || std::abs(dem_val.child() - llh[2]) > max_height_diff) invalid_indices.insert(it); } int num_total = left_aligned_ip.size(); int num_invalid = invalid_indices.size(); int num_valid = num_total - num_invalid; vw_out() << "Removed " << num_invalid << " interest points out of " << num_total << " (" << 100.0 * double(num_invalid) / num_total << " pct).\n"; // Copy back only the valid pixels in-place int good_it = 0; for (int it = 0; it < num_total; it++) { if (invalid_indices.find(it) != invalid_indices.end()) continue; left_aligned_ip[good_it] = left_aligned_ip[it]; right_aligned_ip[good_it] = right_aligned_ip[it]; good_it++; } if (good_it != num_valid) vw_throw(ArgumentErr() << "Book-keeping failure in ip filtering using DEM.\n"); left_aligned_ip.resize(num_valid); right_aligned_ip.resize(num_valid); return; } // Estimate the search range by finding the median disparity and // creating a box of given dimensions around it. This assumes aligned // interest points. Note that this box may be an overestimate, // so it should be intersected with a previously existing box. vw::BBox2 search_range_using_spread(double max_disp_spread, std::vector const& left_ip, std::vector const& right_ip) { std::vector dx, dy; for (size_t i = 0; i < left_ip.size(); i++) { double diffX = right_ip[i].x - left_ip[i].x; double diffY = right_ip[i].y - left_ip[i].y; dx.push_back(diffX); dy.push_back(diffY); } if (dx.empty()) vw_throw(vw::ArgumentErr() << "No interest points left."); std::sort(dx.begin(), dx.end()); std::sort(dy.begin(), dy.end()); double mid_x = dx[dx.size()/2]; // median double mid_y = dy[dy.size()/2]; double half = max_disp_spread / 2.0; vw::BBox2 spread_box(mid_x - half, mid_y - half, max_disp_spread, max_disp_spread); return spread_box; } // Create interest points from valid D_sub values and make them full scale // (while still having potentially a global alignment applied to them). void aligned_ip_from_D_sub(vw::ImageViewRef> const & sub_disp, vw::Vector2 const & upsample_scale, std::vector & left_ip, std::vector & right_ip) { left_ip.clear(); right_ip.clear(); for (int col = 0; col < sub_disp.cols(); col++) { for (int row = 0; row < sub_disp.rows(); row++) { vw::PixelMask disp = sub_disp(col, row); if (!is_valid(disp)) continue; Vector2 left_pix(col, row); Vector2 right_pix = left_pix + disp.child(); left_pix = elem_prod(left_pix, upsample_scale); right_pix = elem_prod(right_pix, upsample_scale); vw::ip::InterestPoint left, right; left.x = left_pix.x(); left.y = left_pix.y(); right.x = right_pix.x(); right.y = right_pix.y(); left_ip.push_back(left); right_ip.push_back(right); } } } // Do IP matching, return, the best translation+scale fitting functor. vw::Matrix translation_ip_matching(vw::ImageView> const& image1, vw::ImageView> const& image2, int ip_per_tile, std::string const left_vwip_file, std::string const right_vwip_file, double nodata1, double nodata2) { using namespace vw; std::vector matched_ip1, matched_ip2; size_t number_of_jobs = 1; bool use_cached_ip = false; detect_match_ip(matched_ip1, matched_ip2, vw::pixel_cast(image1), vw::pixel_cast(image2), ip_per_tile, number_of_jobs, left_vwip_file, right_vwip_file, use_cached_ip, nodata1, nodata2); std::vector ransac_ip1 = iplist_to_vectorlist(matched_ip1); std::vector ransac_ip2 = iplist_to_vectorlist(matched_ip2); vw_out(DebugMessage,"asp") << "\t--> Removed " << matched_ip1.size() - ransac_ip1.size() << " duplicate matches.\n"; Matrix T; std::vector indices; try { vw::math::RandomSampleConsensus ransac(vw::math::TranslationScaleFittingFunctor(), vw::math::InterestPointErrorMetric(), stereo_settings().ip_num_ransac_iterations, 10, ransac_ip1.size()/2, true); T = ransac(ransac_ip2, ransac_ip1); indices = ransac.inlier_indices(T, ransac_ip2, ransac_ip1); } catch (...) { vw_out(WarningMessage,"console") << "Automatic Alignment Failed! Proceed with caution...\n"; T = vw::math::identity_matrix<3>(); } { // Keeping only inliers std::vector inlier_ip1, inlier_ip2; for (size_t i = 0; i < indices.size(); i++) { inlier_ip1.push_back(matched_ip1[indices[i]]); inlier_ip2.push_back(matched_ip2[indices[i]]); } matched_ip1 = inlier_ip1; matched_ip2 = inlier_ip2; } return T; } // Homography IP matching // This applies only the homography constraint. Not the best. // Can optionally restrict the matching to given image bounding boxes, // which can result in big efficiency gains. bool homography_ip_matching(vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_tile, int inlier_threshold, std::string const& match_filename, size_t number_of_jobs, std::string const left_vwip_file, std::string const right_vwip_file, bool use_cached_ip, double nodata1, double nodata2, vw::BBox2i const& bbox1, vw::BBox2i const& bbox2) { vw_out() << "\t--> Matching interest points using homography.\n"; // See if to restrict cropping to smaller regions vw::ImageViewRef local_image1 = image1; vw::ImageViewRef local_image2 = image2; vw::BBox2i local_bbox1 = bbox1; vw::BBox2i local_bbox2 = bbox2; bool crop = (!bbox1.empty() && !bbox2.empty()); if (crop) { local_bbox1.crop(bounding_box(image1)); local_bbox2.crop(bounding_box(image2)); local_image1 = vw::crop(image1, local_bbox1); local_image2 = vw::crop(image2, local_bbox2); use_cached_ip = false; // cannot use cached ip when cropping } std::vector matched_ip1, matched_ip2; detect_match_ip(matched_ip1, matched_ip2, local_image1, local_image2, ip_per_tile, number_of_jobs, left_vwip_file, right_vwip_file, use_cached_ip, nodata1, nodata2); if (matched_ip1.size() == 0 || matched_ip2.size() == 0) return false; // If we cropped, must shift the interest points back to the original image coordinates if (crop) { for (size_t i = 0; i < matched_ip1.size(); i++) { matched_ip1[i].x += local_bbox1.min().x(); matched_ip1[i].y += local_bbox1.min().y(); } for (size_t i = 0; i < matched_ip2.size(); i++) { matched_ip2[i].x += local_bbox2.min().x(); matched_ip2[i].y += local_bbox2.min().y(); } } // Filter the interest points using a homography constraint Stopwatch sw; sw.start(); Matrix H = vw::math::identity_matrix<3>(); std::vector indices; filter_ip_homog(matched_ip1, matched_ip2, inlier_threshold, H, indices); // outputs sw.stop(); vw_out() << "Filtering time: " << sw.elapsed_seconds() << " seconds.\n"; int num_left = indices.size(); if (num_left == 0) return false; // Form the filtered interest points std::vector final_ip1(num_left), final_ip2(num_left); for (size_t i = 0; i < num_left; i++) { final_ip1[i] = matched_ip1[indices[i]]; final_ip2[i] = matched_ip2[indices[i]]; } if (stereo_settings().ip_debug_images) { vw_out() << "\t Writing post-homography IP match debug image.\n"; write_match_image("InterestPointMatching__ip_matching_debug2.tif", image1, image2, final_ip1, final_ip2); } vw_out() << "\t * Writing match file: " << match_filename << "\n"; bool matches_as_txt = stereo_settings().matches_as_txt; ip::write_match_file(match_filename, final_ip1, final_ip2, matches_as_txt); return true; } // Detect interest points. Return also the rough homography that aligns the right image // to the left. bool detect_ip_aligned_pair(vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_per_image, int ip_per_tile, vw::cartography::Datum const& datum, std::string const left_vwip_file, double nodata1, double nodata2, // Outputs vw::ip::InterestPointList& ip1, vw::ip::InterestPointList& ip2, vw::Matrix & rough_homography) { BBox2i box1 = bounding_box(image1), box2 = bounding_box(image2); try { // Homography is defined in the original camera coordinates rough_homography = rough_homography_fit(cam1, cam2, box1, box2, datum); } catch(...) { vw_out() << "Rough homography fit failed, trying with identity transform. " << std::endl; rough_homography.set_identity(3); } // Remove the main translation and solve for BBox that fits the // image. If we used the translation from the solved homography with // poorly position cameras, the right image might be moved out of frame. rough_homography(0,2) = rough_homography(1,2) = 0; vw_out() << "Aligning right to left for interest points capture using rough homography: " << rough_homography << std::endl; // Find the image of the right image bounding box after applying the rough homography HomographyTransform rough_trans(rough_homography); BBox2i trans_box2 = rough_trans.forward_bbox(box2); // Check to see if this rough homography works VW_ASSERT(box1.intersects(trans_box2), LogicErr() << "The rough homography alignment based on datum and camera " << "geometry shows that input images do not overlap at all. Unable to proceed. " << "Examine your images, or consider using the option --skip-rough-homography.\n"); // Adjust the homography transform so that the right image bounding box has // (0, 0) as the minimum. We will count on this below and outside of this // function. See Transform.h for definition of homography transform. for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { rough_homography(j, i) -= trans_box2.min()[j] * rough_homography(2, i); } } // Update these after the adjustment to the homography transform rough_trans = HomographyTransform(rough_homography); trans_box2 = rough_trans.forward_bbox(box2); // Detect interest points for the left and (transformed) right image. // - It is important that we use NearestPixelInterpolation in the // next step. Using anything else will interpolate nodata values // and stop them from being masked out. // TODO(oalexan1): Would it be better to pass masked images and use interpolation? // TODO(oalexan1): Likely bilinear interpolation is better for the IP detection. auto ext = ValueEdgeExtension(std::isnan(nodata2) ? 0 : nodata2); std::string right_vwip_file = ""; // Don't record IP from transformed images bool use_cached_ip = false; if (!detect_ip_pair(ip1, ip2, image1, crop(transform(image2, rough_trans, ext, NearestPixelInterpolation()), trans_box2), ip_per_per_image, ip_per_tile, left_vwip_file, right_vwip_file, nodata1, nodata2, use_cached_ip)) { vw_out() << "Unable to detect interest points." << std::endl; return false; } // Undo the rough homography transform for the interest points ip::InterestPointList::iterator ip_it; for (ip_it = ip2.begin(); ip_it != ip2.end(); ip_it++) { Vector2 pt(ip_it->x, ip_it->y); pt = rough_trans.reverse(pt); ip_it->ix = ip_it->x = pt.x(); ip_it->iy = ip_it->y = pt.y(); } return true; } // End function detect_ip_aligned_pair // A debug routine to save images with matches on top of them. void write_match_image(std::string const& out_file_name, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, std::vector const& matched_ip1, std::vector const& matched_ip2) { // Skip image pairs with no matches. if (matched_ip1.empty()) return; // Work out the scaling to produce the subsampled images. These // values are choosen just allow a reasonable rendering time. float sub_scale = sqrt(1500.0 * 1500.0 / float(image1.impl().cols() * image1.impl().rows())); sub_scale += sqrt(1500.0 * 1500.0 / float(image2.impl().cols() * image2.impl().rows())); sub_scale /= 2; //if (sub_scale > 1) sub_scale = 1; vw::mosaic::ImageComposite> composite; //composite.insert(vw::pixel_cast_rescale >(resample(normalize(image1), sub_scale)), 0, 0); //composite.insert(vw::pixel_cast_rescale >(resample(normalize(image2), sub_scale)), vw::int32(image1.impl().cols() * sub_scale), 0); composite.insert(vw::pixel_cast_rescale >(image1), 0, 0); composite.insert(vw::pixel_cast_rescale >(image2), vw::int32(image1.impl().cols() * sub_scale), 0); composite.set_draft_mode(true); composite.prepare(); // Rasterize the composite so that we can draw on it. vw::ImageView> comp = composite; // Draw a red line between matching interest points for (size_t k = 0; k < matched_ip1.size(); k++) { vw::Vector2f start(matched_ip1[k].x, matched_ip1[k].y); vw::Vector2f end(matched_ip2[k].x+image1.impl().cols(), matched_ip2[k].y); start *= sub_scale; end *= sub_scale; float inc_amt = 1/norm_2(end-start); for (float r=0; r<1.0; r+=inc_amt) { int i = (int)(0.5 + start.x() + r*(end.x()-start.x())); int j = (int)(0.5 + start.y() + r*(end.y()-start.y())); if (i >=0 && j >=0 && i < comp.cols() && j < comp.rows()) comp(i,j) = vw::PixelRGB(255, 0, 0); } } vw::vw_out() << "Writing: " << out_file_name << std::endl; boost::shared_ptr rsrc(vw::DiskImageResource::create(out_file_name, comp.format())); vw::block_write_image(*rsrc, comp, vw::TerminalProgressCallback("", "")); } } // end namespace asp ================================================ FILE: src/asp/Core/InterestPointMatching.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_CORE_INTEREST_POINT_MATCHING_H__ #define __ASP_CORE_INTEREST_POINT_MATCHING_H__ #include #include #include #include #include #include namespace asp { // Debug utility to write out a matches on top of the images void write_match_image(std::string const& out_file_name, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, std::vector const& matched_ip1, std::vector const& matched_ip2); // Calls ip matching assuming a datum. We may or not apply a homography to // make right image like left image. This is useful so that both images have // similar scale and similar affine qualities. // - Only the left image will use an IP file since the right image is // modified. bool match_ip_with_datum(bool single_threaded_camera, bool use_rough_homography, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_tile, vw::cartography::Datum const& datum, std::string const& match_filename, size_t number_of_jobs, double epipolar_threshold, double uniqueness_threshold, std::string const left_vwip_file ="", std::string const right_vwip_file ="", double nodata1 = std::numeric_limits::quiet_NaN(), double nodata2 = std::numeric_limits::quiet_NaN()); // Do IP matching, return, the best translation+scale fitting functor. vw::Matrix translation_ip_matching(vw::ImageView> const& image1, vw::ImageView> const& image2, int ip_per_tile, std::string const left_vwip_file ="", std::string const right_vwip_file="", double nodata1 = std::numeric_limits::quiet_NaN(), double nodata2 = std::numeric_limits::quiet_NaN()); //------------------------------------------------------------------------------------------- // These are IP filtering functions. /// Optionally remove pixels from the opposite sides of the images. /// - This is a very simple filter for the left/right image common case. void side_ip_filtering(vw::ip::InterestPointList& ip1, vw::ip::InterestPointList& ip2, vw::BBox2i const& bbox1, vw::BBox2i const& bbox2); /// IP matching that uses clustering on triangulation error to /// determine inliers. Check output this filter can fail. /// /// Input and output is the valid indices. Valid indices must have /// something to start with. bool tri_ip_filtering(std::vector const& ip1, std::vector const& ip2, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, std::list& valid_indices); /// 4 stddev filtering. Deletes any disparity measurement that is 4 /// stddev away from the measurements of it's local neighbors. We /// kill off worse offender one at a time until everyone is compliant. bool stddev_ip_filtering(std::vector const& ip1, std::vector const& ip2, std::list& valid_indices); // Filter IP by ensuring that the triangulated IP are in the given lon-lat-height box size_t filter_ip_by_lonlat_and_elevation(vw::TransformPtr tx_left, vw::TransformPtr tx_right, vw::camera::CameraModel* left_camera_model, vw::camera::CameraModel* right_camera_model, vw::cartography::Datum const& datum, std::vector const& ip1_in, std::vector const& ip2_in, vw::Vector2 const & elevation_limit, vw::BBox2 const & lon_lat_limit, std::vector & ip1_out, std::vector & ip2_out); // Filter ip by triangulation error, reprojection error, and height range void filter_ip_using_cameras(std::vector & ip1, std::vector & ip2, vw::camera::CameraModel const* cam1, vw::camera::CameraModel const* cam2, vw::cartography::Datum const& datum, double pct, double factor); // Filter IP using a given DEM and max height difference. Assume that // the interest points have alignment applied to them (either via a // transform or from mapprojection). void ip_filter_using_dem(std::string const & ip_filter_using_dem, vw::TransformPtr tx_left, vw::TransformPtr tx_right, boost::shared_ptr left_camera_model, boost::shared_ptr right_camera_model, std::vector & left_aligned_ip, std::vector & right_aligned_ip); // Estimate the search range by finding the median disparity and // creating a box of given dimensions around it. This assumes aligned // interest points. vw::BBox2 search_range_using_spread(double max_disp_spread, std::vector const& left_ip, std::vector const& right_ip); //----------------------------------------------------------------------------- // Miscellaneous IP functions /// Find a rough homography that maps right to left using the camera /// and datum information. /// - This intersects rays with the datum, then projects them into the other camera. vw::Matrix rough_homography_fit(vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::BBox2i const& box1, vw::BBox2i const& box2, vw::cartography::Datum const& datum); /// Homography rectification that aligns the right image to the left /// image via a homography transform. It returns a vector2i of the /// ideal cropping size to use for the left and right image. The left /// transform is actually just a translation that sets origin to the /// shared corner of left and right. vw::Vector2i homography_rectification(bool adjust_left_image_size, bool tight_inlier_threshold, vw::Vector2i const& left_size, vw::Vector2i const& right_size, std::vector const& left_ip, std::vector const& right_ip, vw::Matrix& left_matrix, vw::Matrix& right_matrix); // Create interest points from valid D_sub values and make them full scale // (while still having potentially a global alignment applied to them). void aligned_ip_from_D_sub( vw::ImageViewRef> const & sub_disp, vw::Vector2 const & upsample_scale, std::vector & left_ip, std::vector & right_ip); // Homography IP matching // This applies only the homography constraint. Not the best. // Can optionally restrict the matching to given image bounding boxes, // which can result in big efficiency gains. bool homography_ip_matching(vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_tile, int inlier_threshold, std::string const& match_filename, size_t number_of_jobs, std::string const left_vwip_file, std::string const right_vwip_file, bool use_cached_ip, double nodata1, double nodata2, vw::BBox2i const& bbox1 = vw::BBox2i(), vw::BBox2i const& bbox2 = vw::BBox2i()); // Match the ip and save the match file. No epipolar constraint // is used in this mode. void match_ip_no_datum(vw::ip::InterestPointList const& ip1, vw::ip::InterestPointList const& ip2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, size_t number_of_jobs, // Outputs std::vector& matched_ip1, std::vector& matched_ip2, std::string const& match_file); // Choose the method used for IP matching enum DetectIpMethod {DETECT_IP_METHOD_INTEGRAL = 0, DETECT_IP_METHOD_SIFT = 1, DETECT_IP_METHOD_ORB = 2}; /// Detect interest points /// This is not meant to be used directly. Use ip_matching(). void detect_ip(vw::ip::InterestPointList& ip, vw::ImageViewRef const& image, int ip_per_image, int ip_per_tile, std::string const vwip_file, double nodata, bool use_cached_ip); // Detect IP in a pair of images and apply rudimentary filtering. // Returns false if either image ended up with zero IP. bool detect_ip_pair(vw::ip::InterestPointList& ip1, vw::ip::InterestPointList& ip2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_image, int ip_per_tile, std::string const left_vwip_file, std::string const right_vwip_file, double nodata1, double nodata2, bool use_cached_ip); // Detect interest points. Return also the rough homography that aligns the right image // to the left. bool detect_ip_aligned_pair(vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_image, int ip_per_tile, vw::cartography::Datum const& datum, std::string const left_vwip_file, double nodata1, double nodata2, // Outputs vw::ip::InterestPointList& ip1, vw::ip::InterestPointList& ip2, vw::Matrix &rough_homography); /// Detect interest points and use a simple matching technique. /// This is not meant to be used directly. Use ip_matching(). void detect_match_ip(std::vector& matched_ip1, std::vector& matched_ip2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_tile, size_t number_of_jobs, std::string const left_vwip_file ="", std::string const right_vwip_file="", bool use_cached_ip = false, double nodata1 = std::numeric_limits::quiet_NaN(), double nodata2 = std::numeric_limits::quiet_NaN(), std::string const& match_file = ""); // A debug routine to save images with matches on top of them. void write_match_image(std::string const& out_file_name, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, std::vector const& matched_ip1, std::vector const& matched_ip2); } // End namespace asp #endif//__ASP_CORE_INTEREST_POINT_MATCHING_H__ ================================================ FILE: src/asp/Core/InterestPointMatching2.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include // TODO(oalexan1): Rm this when moving the random subset code #include #include #include // Move some code here from InterestPointMatching.cc, as that one is slow to compile. // The logic here is mostly for matching, and not for ip detection or filtering. using namespace vw; namespace asp { int g_ip_num_errors = 0; Mutex g_ip_mutex; /// Takes interest points and then finds the nearest 10 matches /// according to their IP descriptors. It then /// filters them by whom are closest to the epipolar line via a /// threshold. The first 2 are then selected to be a match if /// their descriptor distance is sufficiently far apart. // TODO(oalexan1): Move this to VW as low-level? // VW has the related class InterestPointMatcher. class EpipolarLinePointMatcher { bool m_single_threaded_camera; double m_uniqueness_threshold, m_epipolar_threshold; vw::cartography::Datum m_datum; public: /// Constructor. EpipolarLinePointMatcher(bool single_threaded_camera, double uniqueness_threshold, double inlier_threshold, vw::cartography::Datum const& datum); /// This only returns the indices /// - ip_detect_method must match the method used to obtain the interest points void operator()(vw::ip::InterestPointList const& ip1, vw::ip::InterestPointList const& ip2, DetectIpMethod ip_detect_method, size_t number_of_jobs, vw::camera::CameraModel * cam1, vw::camera::CameraModel * cam2, std::vector & output_indices) const; /// Work out an epipolar line from interest point. Returns the /// coefficients for the following line equation: ax + by + c = 0 static vw::Vector3 epipolar_line(vw::Vector2 const& feature, vw::cartography::Datum const& datum, vw::camera::CameraModel * cam_ip, vw::camera::CameraModel * cam_obj, bool & success); /// Calculate distance between a line of equation ax + by + c = 0 static double distance_point_line(vw::Vector3 const& line, vw::Vector2 const& point); friend class EpipolarLineMatchTask; }; EpipolarLinePointMatcher::EpipolarLinePointMatcher(bool single_threaded_camera, double uniqueness_threshold, double epipolar_threshold, vw::cartography::Datum const& datum): m_single_threaded_camera(single_threaded_camera), m_uniqueness_threshold(uniqueness_threshold), m_epipolar_threshold(epipolar_threshold), m_datum(datum) { // Detect some problems before they result in strange math errors if (epipolar_threshold < 1) vw_throw(ArgumentErr() << "EpipolarLinePointMatcher: epipolar threshold is < 1.\n"); if (uniqueness_threshold < 0.1) vw_throw(ArgumentErr() << "EpipolarLinePointMatcher: uniqueness threshold is < 0.1.\n"); if (uniqueness_threshold > 0.99) vw_throw(ArgumentErr() << "EpipolarLinePointMatcher: uniqueness threshold is > 0.99.\n"); } Vector3 EpipolarLinePointMatcher::epipolar_line(Vector2 const& feature, cartography::Datum const& datum, camera::CameraModel* cam_ip, camera::CameraModel* cam_obj, bool & success) { success = true; // Watch out for errors thrown when projecting into the camera try { // Intersect the interest point pixel with the datum Vector3 p0 = cartography::datum_intersection(datum, cam_ip, feature); if (p0 == Vector3()) { // No intersection success = false; return Vector3(); } Vector3 p1 = p0 + 10*cam_ip->pixel_to_vector(feature); // Extend the point below the datum Vector2 ep0 = cam_obj->point_to_pixel(p0); // Project the intersection and extension into the other camera Vector2 ep1 = cam_obj->point_to_pixel(p1); Matrix matrix( 2, 3 ); select_col( matrix, 2 ) = Vector2(1,1); matrix(0,0) = ep0.x(); matrix(0,1) = ep0.y(); matrix(1,0) = ep1.x(); matrix(1,1) = ep1.y(); if (matrix != matrix) { // Got back NaN values. Can't proceed. success = false; return Vector3(); } // If the input matrix is bad this can result in some weird errors! Matrix nsp = nullspace(matrix); if (nsp.cols() <= 0 || nsp.rows() <= 0){ // Failed to find the nullspace success = false; return Vector3(); } return select_col(nsp,0); } catch (std::exception const& e) { // Turn this off, it can be verbose // Mutex::Lock lock(g_ip_mutex); // g_ip_num_errors++; // if (g_ip_num_errors < 100) { // vw_out(ErrorMessage) << e.what() << std::endl; // }else if (g_ip_num_errors == 100) { // vw_out() << "Will print no more error messages about failing to find epipolar line.\n"; // } } success = false; return Vector3(); } // TODO(oalexan1): Use std::abs() instead of fabs(). May change the result. double EpipolarLinePointMatcher::distance_point_line(Vector3 const& line, Vector2 const& point) { return fabs(line.x() * point.x() + line.y() * point.y() + line.z() ) / norm_2(subvector(line, 0, 2)); } // Local class definition class EpipolarLineMatchTask: public Task, private boost::noncopyable { typedef ip::InterestPointList::const_iterator IPListIter; bool m_single_threaded_camera; bool m_use_uchar_tree; math::FLANNTree & m_tree_float; math::FLANNTree& m_tree_uchar; IPListIter m_start, m_end; ip::InterestPointList const& m_ip_other; camera::CameraModel *m_cam1, *m_cam2; EpipolarLinePointMatcher const& m_matcher; Mutex& m_camera_mutex; std::vector::iterator m_output; public: EpipolarLineMatchTask(bool single_threaded_camera, bool use_uchar_tree, math::FLANNTree & tree_float, math::FLANNTree& tree_uchar, ip::InterestPointList::const_iterator start, ip::InterestPointList::const_iterator end, ip::InterestPointList const& ip2, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, EpipolarLinePointMatcher const& matcher, Mutex& camera_mutex, std::vector::iterator output): m_single_threaded_camera(single_threaded_camera), m_use_uchar_tree(use_uchar_tree), m_tree_float(tree_float), m_tree_uchar(tree_uchar), m_start(start), m_end(end), m_ip_other(ip2), m_cam1(cam1), m_cam2(cam2), m_matcher( matcher), m_camera_mutex(camera_mutex), m_output(output) {} void operator()() { const size_t NUM_MATCHES_TO_FIND = 10; Vector indices(NUM_MATCHES_TO_FIND); Vector distances(NUM_MATCHES_TO_FIND); for (IPListIter ip = m_start; ip != m_end; ip++) { Vector2 ip_org_coord = Vector2(ip->x, ip->y); Vector3 line_eq; // Find the equation that describes the epipolar line bool found_epipolar = false; if (m_single_threaded_camera) { // ISIS camera is single-threaded Mutex::Lock lock(m_camera_mutex); line_eq = m_matcher.epipolar_line( ip_org_coord, m_matcher.m_datum, m_cam1, m_cam2, found_epipolar); }else{ line_eq = m_matcher.epipolar_line( ip_org_coord, m_matcher.m_datum, m_cam1, m_cam2, found_epipolar); } if (!found_epipolar) { *m_output++ = (size_t)(-1); // Failed to find a match, return a flag! continue; // Skip to the next IP } // Use FLANN tree to find the N nearest neighbors according to the IP region descriptor? std::vector > kept_indices; kept_indices.reserve(NUM_MATCHES_TO_FIND); // Call the correct FLANN tree for the matching type size_t num_matches_valid = 0; if (m_use_uchar_tree) { vw::Vector uchar_descriptor(ip->descriptor.size()); for (size_t i=0; idescriptor.size(); i++) uchar_descriptor[i] = static_cast(ip->descriptor[i]); num_matches_valid = m_tree_uchar.knn_search(uchar_descriptor, indices, distances, NUM_MATCHES_TO_FIND); } else { num_matches_valid = m_tree_float.knn_search(ip->descriptor, indices, distances, NUM_MATCHES_TO_FIND); } if (num_matches_valid < 1) { *m_output++ = (size_t)(-1); // Failed to find a match, return a flag! continue; // Skip to the next IP } //vw_out() << "For descriptor: " << ip->descriptor << std::endl; //vw_out() << num_matches_valid << " Best match distances: " << distances << std::endl; //vw_out() << "Indices: " << indices << std::endl; // Loop through the N "nearest" points and keep only the ones within // m_matcher.m_epipolar_threshold pixel distance from the epipolar line const double EPIPOLAR_BAND_EXPANSION = 200; double small_epipolar_threshold = m_matcher.m_epipolar_threshold; double large_epipolar_threshold = small_epipolar_threshold + EPIPOLAR_BAND_EXPANSION; for ( size_t i = 0; i < num_matches_valid; i++ ) { auto ip2_it = m_ip_other.begin(); std::advance( ip2_it, indices[i] ); if (found_epipolar){ Vector2 ip2_org_coord = Vector2( ip2_it->x, ip2_it->y ); double line_distance = m_matcher.distance_point_line( line_eq, ip2_org_coord ); if (line_distance < large_epipolar_threshold) { if (line_distance < small_epipolar_threshold) kept_indices.push_back(std::pair(distances[i], indices[i])); else // In between thresholds kept_indices.push_back(std::pair(distances[i], -1)); } else { Vector2 ip1_coord(ip->x, ip->y); //double normDist = norm_2(ip1_coord - ip2_org_coord); //vw_out() << "Discarding match between " << ip1_coord << " and " << ip2_org_coord // << " because distance is " << line_distance << " and threshold is " // << m_matcher.m_epipolar_threshold << " norm dist = " << normDist<<"\n"; } } } // End loop for match pruning // If we only found one match or the first descriptor match is much better than the second if (((kept_indices.size() > 2) && (kept_indices[0].second >= 0) && (kept_indices[0].first < m_matcher.m_uniqueness_threshold * kept_indices[1].first)) || (kept_indices.size() == 1)) { *m_output++ = kept_indices[0].second; // Return the first of the matches we found //vw_out() << "Kept distance: " << kept_indices[0].first << std::endl; } else { // No matches or no clear winner *m_output++ = (size_t)(-1); // Failed to find a match, return a flag! } } // End loop through IP } // End function operator() }; // End class EpipolarLineMatchTask ------------------- void EpipolarLinePointMatcher::operator()(ip::InterestPointList const& ip1, ip::InterestPointList const& ip2, DetectIpMethod ip_detect_method, size_t number_of_jobs, camera::CameraModel * cam1, camera::CameraModel * cam2, std::vector & output_indices) const { typedef ip::InterestPointList::const_iterator IPListIter; Timer total_time("Total elapsed time", DebugMessage, "interest_point"); size_t ip1_size = ip1.size(), ip2_size = ip2.size(); output_indices.clear(); if (!ip1_size || !ip2_size) { vw_out(InfoMessage,"interest_point") << "KD-Tree: no points to match, exiting\n"; return; } // Build the output indices output_indices.resize(ip1_size); // Set up FLANNTree objects of all the different types we may need. math::FLANNTree kd_float(asp::stereo_settings().flann_method); math::FLANNTree kd_uchar(asp::stereo_settings().flann_method); Matrix ip2_matrix_float; Matrix ip2_matrix_uchar; // Pack the IP descriptors into a matrix and feed it to the chosen FLANNTree object const bool use_uchar_FLANN = (ip_detect_method == DETECT_IP_METHOD_ORB); if (use_uchar_FLANN) { ip_list_to_matrix(ip2, ip2_matrix_uchar); kd_uchar.load_match_data(ip2_matrix_uchar, vw::math::FLANN_DistType_Hamming); }else { ip_list_to_matrix(ip2, ip2_matrix_float); kd_float.load_match_data(ip2_matrix_float, vw::math::FLANN_DistType_L2); } vw_out(InfoMessage,"interest_point") << "FLANN-Tree created. Searching...\n"; FifoWorkQueue matching_queue; // Create a thread pool object Mutex camera_mutex; // Robustness fix if (ip1_size < number_of_jobs) number_of_jobs = ip1_size; // Get input and output iterators IPListIter start_it = ip1.begin(); std::vector::iterator output_it = output_indices.begin(); for (size_t i = 0; i < number_of_jobs - 1; i++) { // Update iterators and launch the job. IPListIter end_it = start_it; std::advance(end_it, ip1_size / number_of_jobs); boost::shared_ptr match_task(new EpipolarLineMatchTask(m_single_threaded_camera, use_uchar_FLANN, kd_float, kd_uchar, start_it, end_it, ip2, cam1, cam2, *this, camera_mutex, output_it)); matching_queue.add_task( match_task ); start_it = end_it; std::advance(output_it, ip1_size / number_of_jobs); } // Launch the last job. // TODO(oalexan1): Integrate this into the above loop. boost::shared_ptr match_task(new EpipolarLineMatchTask(m_single_threaded_camera, use_uchar_FLANN, kd_float, kd_uchar, start_it, ip1.end(), ip2, cam1, cam2, *this, camera_mutex, output_it)); matching_queue.add_task(match_task); matching_queue.join_all(); // Wait for all the jobs to finish. } // End class EpipolarLinePointMatcher //--------------------------------------------------------------------------------------- // Match a set of interest points. This can be invoked for all interest points // in the image, then multiple threads are used, for for partial subsets, // when this should be called with a single thread, as multiple such calls // may be running in parallel. void epipolar_ip_matching_task(bool single_threaded_camera, DetectIpMethod detect_method, int number_of_jobs, double epipolar_threshold, double uniqueness_threshold, vw::cartography::Datum const& datum, bool quiet, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::ip::InterestPointList const& ip1, vw::ip::InterestPointList const& ip2, // Outputs std::vector& matched_ip1, std::vector& matched_ip2) { std::vector forward_match, backward_match; EpipolarLinePointMatcher matcher(single_threaded_camera, uniqueness_threshold, epipolar_threshold, datum); if (!quiet) vw_out() << "\t Matching forward" << std::endl; matcher(ip1, ip2, detect_method, number_of_jobs, cam1, cam2, forward_match); if (!quiet) { vw_out() << "\t ---> Obtained " << forward_match.size() << " matches." << std::endl; vw_out() << "\t Matching backward" << std::endl; } matcher(ip2, ip1, detect_method, number_of_jobs, cam2, cam1, backward_match); if (!quiet) vw_out() << "\t ---> Obtained " << backward_match.size() << " matches." << std::endl; // Perform circle consistency check size_t valid_count = 0; const size_t NULL_INDEX = (size_t)(-1); for (size_t i = 0; i < forward_match.size(); i++) { if (forward_match[i] != NULL_INDEX) { if (backward_match[forward_match[i]] != i) { forward_match[i] = NULL_INDEX; } else { valid_count++; } } } // Produce listing of valid indices that agree with forward and backward matching matched_ip1.reserve(valid_count); // Get our allocations out of the way. matched_ip2.reserve(valid_count); auto ip1_it = ip1.begin(), ip2_it = ip2.begin(); for (size_t i = 0; i < forward_match.size(); i++) { if (forward_match[i] != NULL_INDEX) { matched_ip1.push_back(*ip1_it); ip2_it = ip2.begin(); std::advance(ip2_it, forward_match[i]); matched_ip2.push_back(*ip2_it); } ip1_it++; } return; } // Given a value x, find all n such that x is in the interval // [n*tile_size - extra, (n+1)*tile_size + extra]. We assume // that extra is at most half of tile size, so there are at most // 3 such indices. void tile_extra_indices(double x, int tile_size, int extra, std::vector & indices) { // This check should not be reached as the input parameters are validated. if (extra > tile_size/2 || extra < 0) vw_throw(ArgumentErr() << "tile_indices: extra is too large or too small.\n"); // wipe the output indices.clear(); int n = (int)floor(x / double(tile_size)); // iterate in -1, 0, 1 for (int i = -1; i <= 1; i++) { int m = n + i; if (m*tile_size - extra <= x && x <= (m+1)*tile_size + extra) { indices.push_back(m); } } return; } // Divide the left image and right aligned image into corresponding tiles. Find // the vector interest points in each left tile, and the corresponding one in // each right tile. These per-tile vectors will later be matched. The returned // interest points do not have alignment applied to them, that is only used // during processing. The division into tiles is virtual, as no actual tiles get // created. TODO(oalexan1): Tiles on the right and bottom edges may be small. We // do not take that into account. This may result in interest points there be // too dense. void group_ip_in_tiles(std::vector const& ip1_copy, std::vector const& ip2_copy, vw::Matrix align_matrix, // Outputs std::map, std::vector> & ip1_vec, std::map, std::vector> & ip2_vec) { // Wipe the output vectors ip1_vec.clear(); ip2_vec.clear(); HomographyTransform align_trans(align_matrix); // We will have tiles overlap, to ensure no interest points // fall between the cracks. That may happen if alignment is not perfect. Vector2i params = asp::stereo_settings().matches_per_tile_params; vw_out() << "Tile size used in matching: " << params[0] << "\n"; vw_out() << "Expanded tile size: " << params[1] << "\n"; int tile_size = params[0]; int extra = (params[1] - params[0])/2; // Map each ip to a box. for (int i = 0; i < (int)ip1_copy.size(); i++) { auto & ip = ip1_copy[i]; vw::Vector2 pt(ip.x, ip.y); // Doing floor on purpose, so ip in [0, tile_size]^2 go to first box int cx = floor(pt[0]/double(tile_size)); int cy = floor(pt[1]/double(tile_size)); auto p = std::make_pair(cx, cy); ip1_vec[p].push_back(ip1_copy[i]); } // Repeat for ip2. First bring to image1 coordinates for (int i = 0; i < (int)ip2_copy.size(); i++) { auto & ip = ip2_copy[i]; // Bring to left image coordinates vw::Vector2 pt(ip.x, ip.y); pt = align_trans.forward(pt); // Find all tiles of size tile_size with padding of extra on each side to // which this belongs. For example, assume for the moment that tiles are in // 1D. Then, the value 3 * tile_size - 0.8 * extra will belong to both tile // 3 and tile 2. Value 3 * tile_size + 0.7 * extra will belong to both tile // 3 and tile 4. std::vector x_indices, y_indices; tile_extra_indices(pt[0], tile_size, extra, x_indices); tile_extra_indices(pt[1], tile_size, extra, y_indices); for (int cx : x_indices) { for (int cy : y_indices) { auto p = std::make_pair(cx, cy); ip2_vec[p].push_back(ip2_copy[i]); } } } return; } void append_new_matches( // Inputs std::vector const& local_matched_ip1, std::vector const& local_matched_ip2, // Outputs (append) std::set> & seen1, std::set> & seen2, std::vector & matched_ip1, std::vector & matched_ip2) { for (int i = 0; i < (int)local_matched_ip1.size(); i++) { auto & ip1 = local_matched_ip1[i]; auto & ip2 = local_matched_ip2[i]; auto p1 = std::make_pair(ip1.x, ip1.y); auto p2 = std::make_pair(ip2.x, ip2.y); if (seen1.find(p1) == seen1.end() && seen2.find(p2) == seen2.end()) { matched_ip1.push_back(ip1); matched_ip2.push_back(ip2); seen1.insert(p1); seen2.insert(p2); } } return; } // TODO(oalexan1): Move this function out of here. // TODO(oalexan1): Call this function in ControlNetworkLoader.cc void pick_subset(int max_pairwise_matches, std::vector & ip1, std::vector & ip2) { std::vector subset; vw::math::pick_random_indices_in_range(ip1.size(), max_pairwise_matches, subset); std::sort(subset.begin(), subset.end()); // sort the indices; not strictly necessary std::vector ip1_full, ip2_full; ip1_full.swap(ip1); ip2_full.swap(ip2); ip1.resize(max_pairwise_matches); ip2.resize(max_pairwise_matches); for (size_t it = 0; it < subset.size(); it++) { ip1[it] = ip1_full[subset[it]]; ip2[it] = ip2_full[subset[it]]; } } // Match ip without a datum, cameras, epipolar lines. void match_ip_no_datum(std::vector const& ip1_copy, std::vector const& ip2_copy, DetectIpMethod detect_method, double uniqueness_threshold, bool quiet, // Outputs std::vector& matched_ip1, std::vector& matched_ip2) { // TODO: Should probably unify the ip::InterestPointMatcher class // with the EpipolarLinePointMatcher class! if (detect_method != DETECT_IP_METHOD_ORB) { // For all L2Norm distance metrics vw::ip::InterestPointMatcher matcher(asp::stereo_settings().flann_method, uniqueness_threshold); matcher(ip1_copy, ip2_copy, matched_ip1, matched_ip2, TerminalProgressCallback("asp", "\t Matching: "), quiet); } else { // For Hamming distance metrics vw::ip::InterestPointMatcher matcher(asp::stereo_settings().flann_method, uniqueness_threshold); matcher(ip1_copy, ip2_copy, matched_ip1, matched_ip2, TerminalProgressCallback("asp", "\t Matching: "), quiet); } return; } // Local class definition class MatchPerTileTask: public Task, private boost::noncopyable { int m_start_tile, m_num_tiles_per_job; bool m_have_datum, m_single_threaded_camera; DetectIpMethod m_detect_method; std::map, std::vector> const& m_ip1_vec; std::map, std::vector> const& m_ip2_vec; vw::camera::CameraModel* m_cam1; vw::camera::CameraModel* m_cam2; vw::cartography::Datum const& m_datum; double m_epipolar_threshold; double m_uniqueness_threshold; vw::Matrix const& m_align_matrix; int m_matches_per_tile; // Outputs std::set> & m_seen1; std::set> & m_seen2; std::vector & m_matched_ip1; std::vector & m_matched_ip2; Mutex& m_match_mutex; public: MatchPerTileTask(int start_tile, int num_tiles_per_job, bool have_datum, bool single_threaded_camera, DetectIpMethod detect_method, std::map, std::vector> const& ip1_vec, std::map, std::vector> const& ip2_vec, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::cartography::Datum const& datum, double epipolar_threshold, double uniqueness_threshold, vw::Matrix const& align_matrix, int matches_per_tile, // Outputs std::set> & seen1, std::set> & seen2, std::vector & matched_ip1, std::vector & matched_ip2, Mutex& match_mutex): m_start_tile(start_tile), m_num_tiles_per_job(num_tiles_per_job), m_have_datum(have_datum), m_single_threaded_camera(single_threaded_camera), m_detect_method(detect_method), m_ip1_vec(ip1_vec), m_ip2_vec(ip2_vec), m_cam1(cam1), m_cam2(cam2), m_datum(datum), m_epipolar_threshold(epipolar_threshold), m_uniqueness_threshold(uniqueness_threshold), m_align_matrix(align_matrix), m_matches_per_tile(matches_per_tile), m_seen1(seen1), m_seen2(seen2), m_matched_ip1(matched_ip1), m_matched_ip2(matched_ip2), m_match_mutex(match_mutex) {} void operator()() { bool quiet = true; // Do the tiles within the range [m_start_tile, m_start_tile + m_num_tiles_per_job) int tile_id = -1; for (auto it1 = m_ip1_vec.begin(); it1 != m_ip1_vec.end(); it1++) { // Do only the tiles within desired range tile_id++; if (tile_id < m_start_tile) continue; if (tile_id >= m_start_tile + m_num_tiles_per_job) break; // Find the corresponding set of ip in ip1_vec and ip2_vec auto key = it1->first; auto it2 = m_ip2_vec.find(key); if (it2 == m_ip2_vec.end()) continue; // no matches in this tile std::vector const & tile_ip1 = it1->second; // alias std::vector const & tile_ip2 = it2->second; // alias std::vector local_matched_ip1, local_matched_ip2; try { if (m_have_datum) { // Copy from std::vector to vw::ip::InterestPointList // TODO(oalexan1): Avoid this copy vw::ip::InterestPointList ip1_list, ip2_list; for (size_t i = 0; i < tile_ip1.size(); i++) ip1_list.push_back(tile_ip1[i]); for (size_t i = 0; i < tile_ip2.size(); i++) ip2_list.push_back(tile_ip2[i]); int local_number_of_jobs = 1; if (m_single_threaded_camera) { // ISIS camera is single-threaded, prevent a crash Mutex::Lock lock(m_match_mutex); epipolar_ip_matching_task(m_single_threaded_camera, m_detect_method, local_number_of_jobs, m_epipolar_threshold, m_uniqueness_threshold, m_datum, quiet, m_cam1, m_cam2, ip1_list, ip2_list, local_matched_ip1, local_matched_ip2); // outputs } else { // Multi-threaded camera epipolar_ip_matching_task(m_single_threaded_camera, m_detect_method, local_number_of_jobs, m_epipolar_threshold, m_uniqueness_threshold, m_datum, quiet, m_cam1, m_cam2, ip1_list, ip2_list, local_matched_ip1, local_matched_ip2); // outputs } } else { match_ip_no_datum(tile_ip1, tile_ip2, m_detect_method, m_uniqueness_threshold, quiet, local_matched_ip1, local_matched_ip2); // outputs } } catch(...) { // This need not succeed return; } // Remove some ip if too many if (local_matched_ip1.size() > m_matches_per_tile) pick_subset(m_matches_per_tile, local_matched_ip1, local_matched_ip2); { // Update the global output variables Mutex::Lock lock(m_match_mutex); append_new_matches(local_matched_ip1, local_matched_ip2, m_seen1, m_seen2, m_matched_ip1, m_matched_ip2); // append here } } return; } // End function operator() }; // End class MatchPerTileTask // Do interest point matching per tile, with and without having a datum. The // alignment matrix is used to bring the interest points in image2 to image1 // coordinates. Use stereo_settings().matches_per_tile_params. void matches_per_tile(bool have_datum, bool single_threaded_camera, DetectIpMethod detect_method, std::vector const& ip1_copy, std::vector const& ip2_copy, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::cartography::Datum const& datum, size_t number_of_jobs, double epipolar_threshold, double uniqueness_threshold, vw::Matrix const& align_matrix, // Outputs std::vector& matched_ip1, std::vector& matched_ip2) { // Wipe the prior matches matched_ip1.clear(); matched_ip2.clear(); // TODO(oalexan1): Add multi-threading here. bool quiet = true; std::map, std::vector> ip1_vec, ip2_vec; group_ip_in_tiles(ip1_copy, ip2_copy, align_matrix, ip1_vec, ip2_vec); // outputs // Adjust the number of jobs int num_tiles = ip1_vec.size(); if (num_tiles < number_of_jobs) number_of_jobs = num_tiles; // The number of tiles per job int num_tiles_per_job = ceil(double(num_tiles) / number_of_jobs); if (num_tiles_per_job == 0) num_tiles_per_job = 1; int start_tile = 0; // To help find unique matches std::set> seen1, seen2; // Iterate over each set of ip in ip1_vec FifoWorkQueue matching_queue; // Create a thread pool object Mutex match_mutex; for (size_t i = 0; i < number_of_jobs; i++) { boost::shared_ptr match_task(new MatchPerTileTask(start_tile, num_tiles_per_job, have_datum, single_threaded_camera, detect_method, ip1_vec, ip2_vec, cam1, cam2, datum, epipolar_threshold, uniqueness_threshold, align_matrix, asp::stereo_settings().matches_per_tile, seen1, seen2, matched_ip1, matched_ip2, match_mutex)); matching_queue.add_task(match_task); start_tile += num_tiles_per_job; // for the next job } // end iterating over sets of ip matching_queue.join_all(); // Wait for all jobs to finish return; } // end if matches per tile // TODO(oalexan1): Break up this function as it is too long. bool epipolar_ip_matching(bool single_threaded_camera, vw::ip::InterestPointList const& ip1, vw::ip::InterestPointList const& ip2, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, vw::cartography::Datum const& datum, size_t number_of_jobs, double epipolar_threshold, double uniqueness_threshold, double nodata1, double nodata2, bool match_per_tile, vw::Matrix const& align_matrix, // used only if match_per_tile is true // Outputs std::vector& matched_ip1, std::vector& matched_ip2) { matched_ip1.clear(); matched_ip2.clear(); // TODO(oalexan1): Avoid this copy std::vector ip1_copy, ip2_copy; ip1_copy.reserve(ip1.size()); ip2_copy.reserve(ip2.size()); std::copy(ip1.begin(), ip1.end(), std::back_inserter(ip1_copy)); std::copy(ip2.begin(), ip2.end(), std::back_inserter(ip2_copy)); // Match interest points forward/backward .. constraining on epipolar line DetectIpMethod detect_method = static_cast(stereo_settings().ip_detect_method); // Sanity check if (match_per_tile && asp::stereo_settings().matches_per_tile <= 0) vw::vw_throw(vw::ArgumentErr() << "epipolar_ip_matching: matches_per_tile must be positive.\n"); if (!match_per_tile) { vw_out() << "\t--> Matching interest points using the epipolar line." << std::endl; vw_out() << "\t Uniqueness threshold: " << uniqueness_threshold << "\n"; vw_out() << "\t Epipolar threshold: " << epipolar_threshold << "\n"; } else { // This will be printed on the second pass vw_out() << "\t--> Performing matching per tile.\n"; } // Do matching if (!match_per_tile) { bool quiet = false; // has to be true if many such jobs exist epipolar_ip_matching_task(single_threaded_camera, detect_method, number_of_jobs, epipolar_threshold, uniqueness_threshold, datum, quiet, cam1, cam2, ip1, ip2, matched_ip1, matched_ip2); // outputs } else { bool have_datum = true; matches_per_tile(have_datum, single_threaded_camera, detect_method, ip1_copy, ip2_copy, cam1, cam2, datum, number_of_jobs, epipolar_threshold, uniqueness_threshold, align_matrix, matched_ip1, matched_ip2); // outputs } vw_out() << "\t Matched " << matched_ip1.size() << " points." << std::endl; if (matched_ip1.empty()) return false; // Write out debug image if (stereo_settings().ip_debug_images) { vw_out() << "\t Writing IP match debug image prior to geometric filtering.\n"; write_match_image("InterestPointMatching__ip_matching_debug.tif", image1, image2, matched_ip1, matched_ip2); } // TODO(oalexan1): All the filtering logic below must be in a separate function // that will be called here. // Apply filtering of IP by a selection of assumptions. Low // triangulation error, agreement with klt tracking, and local // neighbors are the same neighbors in both images. std::list good_indices; for (size_t i = 0; i < matched_ip1.size(); i++) good_indices.push_back(i); if (!stereo_settings().disable_tri_filtering) { if (!tri_ip_filtering(matched_ip1, matched_ip2, cam1, cam2, good_indices)){ vw_out() << "No interest points left after triangulation filtering." << std::endl; return false; } } if (!stddev_ip_filtering(matched_ip1, matched_ip2, good_indices)) { vw_out() << "No interest points left after stddev filtering." << std::endl; return false; } // Record new list that contains only the inliers. vw_out() << "\t Reduced matches to " << good_indices.size() << "\n"; std::vector buffer(good_indices.size()); // Subselect and copy ip1 size_t w_index = 0; BOOST_FOREACH(size_t index, good_indices) { Vector2 l(matched_ip1[index].x, matched_ip1[index].y); matched_ip1[index].ix = matched_ip1[index].x = l.x(); matched_ip1[index].iy = matched_ip1[index].y = l.y(); buffer[w_index] = matched_ip1[index]; w_index++; } matched_ip1 = buffer; // Subselect and copy ip2 w_index = 0; BOOST_FOREACH(size_t index, good_indices) { Vector2 r(matched_ip2[index].x, matched_ip2[index].y); matched_ip2[index].ix = matched_ip2[index].x = r.x(); matched_ip2[index].iy = matched_ip2[index].y = r.y(); buffer[w_index] = matched_ip2[index]; w_index++; } matched_ip2 = buffer; // The interest points are not aligned here, so there's no need to align them vw::TransformPtr tx1(NULL); vw::TransformPtr tx2(NULL); // If options are set, filter by elevation. if (stereo_settings().elevation_limit[0] < stereo_settings().elevation_limit[1] || !stereo_settings().lon_lat_limit.empty()) { std::vector matched_ip1_out, matched_ip2_out; filter_ip_by_lonlat_and_elevation(tx1, tx2, cam1, cam2, datum, matched_ip1, matched_ip2, stereo_settings().elevation_limit, stereo_settings().lon_lat_limit, matched_ip1_out, matched_ip2_out); matched_ip1 = matched_ip1_out; matched_ip2 = matched_ip2_out; } // End elevation filtering if (stereo_settings().ip_debug_images) { vw_out() << "\t Writing IP match debug image after geometric filtering.\n"; write_match_image("InterestPointMatching__ip_matching_debug2.tif", image1, image2, matched_ip1, matched_ip2); } return true; } // End function epipolar_ip_matching // See the .h file for documentation. bool match_ip_with_datum(bool single_threaded_camera, bool use_rough_homography, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, int ip_per_tile, vw::cartography::Datum const& datum, std::string const& match_filename, size_t number_of_jobs, double epipolar_threshold, double uniqueness_threshold, std::string const left_file_path, std::string const right_file_path, double nodata1, double nodata2) { bool matches_as_txt = stereo_settings().matches_as_txt; if (use_rough_homography) vw_out() << "\t Using rough homography.\n"; else vw_out() << "\t Skipping rough homography.\n"; // This call aligns the right image to the left image then detects IPs in the two images. // Undo the alignment transform in the ip before returning, and return the transform. vw::ip::InterestPointList ip1, ip2; vw::Matrix rough_homography = vw::math::identity_matrix<3>(); bool use_cached_ip = false; if (use_rough_homography) detect_ip_aligned_pair(cam1, cam2, image1, image2, asp::stereo_settings().ip_per_image, ip_per_tile, datum, left_file_path, nodata1, nodata2, ip1, ip2, rough_homography); // Outputs else detect_ip_pair(ip1, ip2, image1, image2, asp::stereo_settings().ip_per_image, ip_per_tile, left_file_path, right_file_path, nodata1, nodata2, use_cached_ip); // Match the detected IPs which are in the original image coordinates. std::vector matched_ip1, matched_ip2; bool match_per_tile = false; vw::Matrix align_matrix = vw::math::identity_matrix<3>(); vw::Stopwatch sw2; sw2.start(); bool inlier = epipolar_ip_matching(single_threaded_camera, ip1, ip2, cam1, cam2, image1, image2, datum, number_of_jobs, epipolar_threshold, uniqueness_threshold, nodata1, nodata2, match_per_tile, align_matrix, matched_ip1, matched_ip2); // Outputs sw2.stop(); vw_out() << "Elapsed time in ip matching: " << sw2.elapsed_seconds() << " s.\n"; if (!inlier) return false; // Use the interest points that we found to compute an aligning homography // transform for the two images. This is always needed when finding matches // per tile or with rough homography. bool adjust_left_image_size = false, tight_inlier_threshold = false; Matrix matrix1 = vw::math::identity_matrix<3>(); Matrix matrix2 = vw::math::identity_matrix<3>(); if (use_rough_homography || asp::stereo_settings().matches_per_tile > 0) { vw_out() << "\t Computing homography transform.\n"; vw::Stopwatch sw3; sw3.start(); bool tight_inlier_threshold = (asp::stereo_settings().matches_per_tile > 0); homography_rectification(adjust_left_image_size, tight_inlier_threshold, image1.get_size(), image2.get_size(), matched_ip1, matched_ip2, matrix1, matrix2); sw3.stop(); vw_out() << "Elapsed time in homography computation: " << sw3.elapsed_seconds() << " s.\n"; } if (use_rough_homography && sum(abs(submatrix(rough_homography,0,0,2,2) - submatrix(matrix2,0,0,2,2))) > 4) { vw_out() << "Homography transform has largely different scale and skew " << "compared with the rough homography. Homography transform is " << matrix2 << ". Examine your images, or consider using the option " << "--skip-rough-homography.\n"; //return false; } // Second pass if doing matches per tile if (asp::stereo_settings().matches_per_tile > 0) { // We will use the homography matrix from left to right ip, stored in matrix2. // It is expected that matrix1 is the identity matrix. if (matrix1 != vw::math::identity_matrix<3>()) vw::vw_throw( ArgumentErr() << "Expecting identity matrix for left image alignment.\n"); match_per_tile = true; align_matrix = matrix2; // use the homography matrix vw::Stopwatch sw4; sw4.start(); bool inlier = epipolar_ip_matching(single_threaded_camera, ip1, ip2, cam1, cam2, image1, image2, datum, number_of_jobs, epipolar_threshold, uniqueness_threshold, nodata1, nodata2, match_per_tile, align_matrix, matched_ip1, matched_ip2); // Outputs sw4.stop(); vw_out() << "Elapsed time in ip matching when using tiles: " << sw4.elapsed_seconds() << " s.\n"; if (!inlier) return false; } // Write the matches to disk vw_out() << "\t * Writing match file: " << match_filename << "\n"; ip::write_match_file(match_filename, matched_ip1, matched_ip2, matches_as_txt); return inlier; } // Match the ip and save the match file. No datum or epipolar constraint // is used in this mode. void match_ip_no_datum(vw::ip::InterestPointList const& ip1, vw::ip::InterestPointList const& ip2, vw::ImageViewRef const& image1, vw::ImageViewRef const& image2, size_t number_of_jobs, // Outputs std::vector& matched_ip1, std::vector& matched_ip2, std::string const& match_file) { matched_ip1.clear(); matched_ip2.clear(); std::vector ip1_copy, ip2_copy; ip1_copy.reserve(ip1.size()); ip2_copy.reserve(ip2.size()); std::copy(ip1.begin(), ip1.end(), std::back_inserter(ip1_copy)); std::copy(ip2.begin(), ip2.end(), std::back_inserter(ip2_copy)); DetectIpMethod detect_method = static_cast(stereo_settings().ip_detect_method); // Best point must be closer than the next best point double uniqueness_threshold = stereo_settings().ip_uniqueness_thresh; vw_out() << "\t--> Uniqueness threshold: " << uniqueness_threshold << "\n"; bool quiet = false; vw::Stopwatch sw1; sw1.start(); match_ip_no_datum(ip1_copy, ip2_copy, detect_method, uniqueness_threshold, quiet, matched_ip1, matched_ip2); // outputs sw1.stop(); vw_out() << "Elapsed time in ip matching: " << sw1.elapsed_seconds() << " s.\n"; // Remove ip duplicates. Complexity is O(n log n). vw::ip::remove_duplicates(matched_ip1, matched_ip2); if (asp::stereo_settings().matches_per_tile != 0) { // Use the interest points that we found to compute an aligning // homography transform for the two images. vw_out() << "\t Computing homography transform.\n"; bool adjust_left_image_size = false; bool tight_inlier_threshold = true; // this is necessary for large images Matrix matrix1, matrix2; vw::Stopwatch sw2; sw2.start(); homography_rectification(adjust_left_image_size, tight_inlier_threshold, image1.get_size(), image2.get_size(), matched_ip1, matched_ip2, matrix1, matrix2); sw2.stop(); vw_out() << "Elapsed time in homography computation: " << sw2.elapsed_seconds() << " s.\n"; // We will use the homography matrix from left to right ip, stored in matrix2. // It is expected that matrix1 is the identity matrix. if (matrix1 != vw::math::identity_matrix<3>()) vw::vw_throw( ArgumentErr() << "Expecting identity matrix for left image alignment.\n"); vw::Matrix align_matrix = matrix2; // Initialize some quantities that won't be used but are part of the API. bool have_datum = false, single_threaded_camera = false; double epipolar_threshold = -1, nodata1 = -1, nodata2 = -1; vw::camera::CameraModel *cam1 = NULL, *cam2 = NULL; vw::cartography::Datum datum; vw::Stopwatch sw3; sw3.start(); vw_out() << "\t Performing matching per tile.\n"; matches_per_tile(have_datum, single_threaded_camera, detect_method, ip1_copy, ip2_copy, cam1, cam2, datum, number_of_jobs, epipolar_threshold, uniqueness_threshold, align_matrix, matched_ip1, matched_ip2); // outputs sw3.stop(); vw_out() << "Elapsed time in ip matching when using tiles: " << sw3.elapsed_seconds() << " s.\n"; } vw_out() << "\t Matched points: " << matched_ip1.size() << std::endl; if (stereo_settings().ip_debug_images) { vw_out() << "\t Writing IP initial match debug image.\n"; // Cast to float to make this compile ImageViewRef im1 = vw::pixel_cast(image1); ImageViewRef im2 = vw::pixel_cast(image2); write_match_image("InterestPointMatching__ip_matching_debug.tif", im1, im2, matched_ip1, matched_ip2); } // Save ip if (match_file != "") { // Create the output directory vw::create_out_dir(match_file); vw_out() << "Writing: " << match_file << std::endl; bool matches_as_txt = stereo_settings().matches_as_txt; vw::ip::write_match_file(match_file, matched_ip1, matched_ip2, matches_as_txt); } return; } } // end namespace asp ================================================ FILE: src/asp/Core/IpMatchingAlgs.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include using namespace vw; namespace fs = boost::filesystem; namespace asp { // Find the match file taking into account --match-files-prefix and // --clean-match-files-prefix. std::string stereoMatchFile(std::string const& left_cropped_file, std::string const& right_cropped_file, std::string const& out_prefix, bool matches_as_txt) { // Define the file name containing IP match information. bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); // See if can use an externally provided match file std::string match_filename; if (!crop_left && !crop_right) match_filename = asp::matchFileMultiPrefix(stereo_settings().clean_match_files_prefix, stereo_settings().match_files_prefix, out_prefix, left_cropped_file, right_cropped_file, matches_as_txt); // If the user wants to use an external match file, it better exist bool external_matches = (!stereo_settings().clean_match_files_prefix.empty() || !stereo_settings().match_files_prefix.empty()); if (external_matches && !boost::filesystem::exists(match_filename)) vw_throw(ArgumentErr() << "Missing IP file: " << match_filename); // Fall back to creating one if no luck if (match_filename == "" || !boost::filesystem::exists(match_filename)) match_filename = vw::ip::match_filename(out_prefix, left_cropped_file, right_cropped_file, matches_as_txt); return match_filename; } // Compute ip between L.tif and R.tif produced by stereo. void compute_ip_LR(std::string const & out_prefix) { const std::string left_aligned_image_file = out_prefix + "-L.tif"; const std::string right_aligned_image_file = out_prefix + "-R.tif"; // The L-R match file. TODO(oalexan1): May need to consider the // --match-files-prefix and --clean-match-files-prefix options. // For that, need to integrate with the logic for finding the match file // for non-mapprojected images. So this function should be called from // StereoSession::preprocessing_hook() where we know left_cropped_file, etc. // Must then also test with ISIS mapprojected images. bool matches_as_txt = stereo_settings().matches_as_txt; std::string match_filename = vw::ip::match_filename(out_prefix, "L.tif", "R.tif", matches_as_txt); // Make sure the match file is newer than these files std::vector ref_list; ref_list.push_back(left_aligned_image_file); ref_list.push_back(right_aligned_image_file); bool crop_left = (asp::stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (asp::stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); bool rebuild = (!first_is_newer(match_filename, ref_list) || crop_left || crop_right); if (!crop_left && !crop_right && (asp::stereo_settings().force_reuse_match_files || asp::stereo_settings().clean_match_files_prefix != "" || asp::stereo_settings().match_files_prefix != "")) rebuild = false; // Do not rebuild with externally provided match files if (fs::exists(match_filename) && !rebuild) { vw_out() << "Cached IP match file found: " << match_filename << std::endl; return; } vw_out() << "Computing interest points matches.\n"; // Load the images boost::shared_ptr left_rsrc(DiskImageResourcePtr(left_aligned_image_file)), right_rsrc(DiskImageResourcePtr(right_aligned_image_file)); std::string left_ip_filename = ip::ip_filename(out_prefix, left_aligned_image_file); std::string right_ip_filename = ip::ip_filename(out_prefix, right_aligned_image_file); // Read the no-data values written to disk previously when // the normalized left and right sub-images were created. float left_nodata_value = std::numeric_limits::quiet_NaN(); float right_nodata_value = std::numeric_limits::quiet_NaN(); if (left_rsrc->has_nodata_read ()) left_nodata_value = left_rsrc->nodata_read (); if (right_rsrc->has_nodata_read()) right_nodata_value = right_rsrc->nodata_read(); // These images can be big, so use ImageViewRef ImageViewRef left_image = DiskImageView(left_rsrc); ImageViewRef right_image = DiskImageView(right_rsrc); // Mask the nodata ImageViewRef> left_masked_image = create_mask(left_image, left_nodata_value); ImageViewRef> right_masked_image = create_mask(right_image, right_nodata_value); // Read the masks std::string left_mask_file = out_prefix + "-lMask.tif"; std::string right_mask_file = out_prefix + "-rMask.tif"; ImageViewRef> left_mask = create_mask(DiskImageView(left_mask_file), 0); ImageViewRef> right_mask = create_mask(DiskImageView(right_mask_file), 0); // The logic further down cannot handle NaN, so fix that if (std::isnan(left_nodata_value)) left_nodata_value = -std::numeric_limits::max(); if (std::isnan(right_nodata_value)) right_nodata_value = -std::numeric_limits::max(); // It is important to apply the masks so that not to find interest points // in areas where the images are invalid. left_masked_image = intersect_mask(left_masked_image, left_mask); right_masked_image = intersect_mask(right_masked_image, right_mask); left_image = apply_mask(left_masked_image, left_nodata_value); right_image = apply_mask(right_masked_image, right_nodata_value); // No interest point operations have been performed before vw_out() << "\t * Detecting interest points.\n"; // TODO: Depending on alignment method, we can tailor the IP filtering strategy. double thresh_factor = asp::stereo_settings().ip_inlier_factor; // This range is extra large to handle elevation differences. That can // be an issue with mapprojected images. // TODO(oalexan1): Must use everywhere a single choice of parameters // for ip matching with homography. const int inlier_threshold = 1000.0 * thresh_factor; // 200 by default size_t number_of_jobs = 1; bool use_cached_ip = false; bool success = asp::homography_ip_matching(left_image, right_image, asp::stereo_settings().ip_per_tile, inlier_threshold, match_filename, number_of_jobs, left_ip_filename, right_ip_filename, use_cached_ip, left_nodata_value, right_nodata_value); if (!success) vw_throw(ArgumentErr() << "Could not find interest points.\n"); return; } // Outlier removal based on the disparity of interest points. // Points with x or y disparity not within the 100-'pct' to 'pct' // percentile interval expanded by 'factor' will be removed as // outliers. Overwrite the ip in place. void filter_ip_by_disparity(double pct, // for example, 90.0 double factor, // for example, 3.0 bool quiet, // if not to print a lot of text std::vector & left_ip, std::vector & right_ip){ double pct_fraction = 1.0 - pct/100.0; double bx, ex, by, ey; std::vector dispx, dispy; for (size_t it = 0; it < left_ip.size(); it++) { dispx.push_back(right_ip[it].x - left_ip[it].x); dispy.push_back(right_ip[it].y - left_ip[it].y); } vw::math::find_outlier_brackets(dispx, pct_fraction, factor, bx, ex); vw::math::find_outlier_brackets(dispy, pct_fraction, factor, by, ey); //vw_out() << "Outlier statistics by disparity in x: b = " << bx << ", e = " << ex << ".\n"; //vw_out() << "Outlier statistics by disparity in y: b = " << by << ", e = " << ey << ".\n"; // Remove the bad ip size_t good_it = 0; for (size_t it = 0; it < left_ip.size(); it++) { if (dispx[it] < bx || dispx[it] > ex) continue; if (dispy[it] < by || dispy[it] > ey) continue; left_ip [good_it] = left_ip[it]; right_ip[good_it] = right_ip[it]; good_it++; } if (!quiet) vw_out() << "Removed " << left_ip.size() - good_it << " outliers based on percentiles of differences of interest " << "points with --outlier-removal-params.\n"; left_ip.resize(good_it); right_ip.resize(good_it); return; } double calc_ip_coverage_fraction(std::vector const& ip, vw::Vector2i const& image_size, int tile_size, int min_ip_per_tile) { if (tile_size < 1) vw_throw(LogicErr() << "calc_ip_coverage_fraction: tile size is " << tile_size); // Generate a grid of ROIs covering the entire image BBox2i full_bbox(Vector2i(0,0), image_size); bool include_partials = false; std::vector rois; rois = subdivide_bbox(full_bbox, tile_size, tile_size, include_partials); const size_t num_rois = rois.size(); if (num_rois == 0) return 0; // Cannot have any coverage in the degenerate case! // Pack all IP into a list for speed std::list ip_list; for (size_t i=0; i::iterator iter; for (iter=ip_list.begin(); iter!=ip_list.end(); ++iter) { // If the IP is in the ROI, remove it from the IP list so it // does not get searched again. if (rois[i].contains(*iter)) { iter = ip_list.erase(iter); ++ip_in_roi; --iter; } } // End IP loop if (ip_in_roi > min_ip_per_tile) ++num_filled_rois; }// End ROI loop return static_cast(num_filled_rois) / static_cast(num_rois); } /// Apply alignment transform to ip. Not to be used with mapprojected images. void align_ip(vw::TransformPtr const& tx_left, vw::TransformPtr const& tx_right, std::vector & ip_left, std::vector & ip_right) { // Loop through all the IP we found for (size_t i = 0; i < ip_left.size(); i++) { // Apply the alignment transforms to the recorded IP Vector2 l = tx_left->forward (Vector2(ip_left [i].x, ip_left [i].y)); Vector2 r = tx_right->forward(Vector2(ip_right[i].x, ip_right[i].y)); ip_left [i].x = l[0]; ip_left [i].y = l[1]; ip_left [i].ix = l[0]; ip_left [i].iy = l[1]; ip_right[i].x = r[0]; ip_right[i].y = r[1]; ip_right[i].ix = r[0]; ip_right[i].iy = r[1]; } return; } // End align_ip // Undo the alignment of interest points. If tx_left and tx_right are null, // that will mean there is no alignment to undo. void unalign_ip(vw::TransformPtr tx_left, vw::TransformPtr tx_right, std::vector const& ip1_in, std::vector const& ip2_in, std::vector & ip1_out, std::vector & ip2_out) { // Init the output vectors ip1_out.clear(); ip2_out.clear(); int num_ip = ip1_in.size(); ip1_out.reserve(num_ip); ip2_out.reserve(num_ip); if (int(tx_left.get() != NULL) + int(tx_right != NULL) == 1) vw_throw(ArgumentErr() << "Either both or none of the transforms must be set.\n"); // This function can be called with both unaligned and aligned interest points bool aligned_ip = (tx_left.get() != NULL && tx_right != NULL); for (size_t i = 0; i < num_ip; i++) { // We must not both apply a transform and a scale at the same time // as these are meant to do the same thing in different circumstances. Vector2 p1 = Vector2(ip1_in[i].x, ip1_in[i].y); Vector2 p2 = Vector2(ip2_in[i].x, ip2_in[i].y); if (aligned_ip) { // Unalign p1 = tx_left->reverse (p1); p2 = tx_right->reverse(p2); } // First push the original ip ip1_out.push_back(ip1_in[i]); ip2_out.push_back(ip2_in[i]); // Then adjust x and y ip1_out.back().x = p1[0]; ip1_out.back().y = p1[1]; ip2_out.back().x = p2[0]; ip2_out.back().y = p2[1]; // Same for ix and iy, for consistency ip1_out.back().ix = p1[0]; ip1_out.back().iy = p1[1]; ip2_out.back().ix = p2[0]; ip2_out.back().iy = p2[1]; } // ip_in and ip_out must have same size. if (ip1_in.size() != ip1_out.size()) vw_throw(ArgumentErr() << "Aligned and unaligned interest points have different sizes.\n"); return; } // Heuristics for match file prefix std::string matchMultiPrefix(std::string const& clean_match_files_prefix, std::string const& match_files_prefix, std::string const& out_prefix) { if (clean_match_files_prefix != "") return clean_match_files_prefix; else if (match_files_prefix != "") return match_files_prefix; return out_prefix; } // Heuristics for where to load the match file from std::string matchFileMultiPrefix(std::string const& clean_match_files_prefix, std::string const& match_files_prefix, std::string const& out_prefix, std::string const& image1_path, std::string const& image2_path, bool matches_as_txt) { std::string curr_prefix = asp::matchMultiPrefix(clean_match_files_prefix, match_files_prefix, out_prefix); if (clean_match_files_prefix != "") return vw::ip::clean_match_filename(curr_prefix, image1_path, image2_path, matches_as_txt); return vw::ip::match_filename(curr_prefix, image1_path, image2_path, matches_as_txt); } /// The unwarped disparity file name std::string unwarped_disp_file(std::string const& prefix, std::string const& left_image, std::string const& right_image, bool matches_as_txt) { std::string match_file = vw::ip::match_filename(prefix, left_image, right_image, matches_as_txt); std::string disp_file = boost::filesystem::path(match_file).replace_extension("").string(); return disp_file + "-unaligned-D.tif"; } // Find and sort the convergence angles for given cameras and interest points void convergence_angles(vw::camera::CameraModel const * left_cam, vw::camera::CameraModel const * right_cam, std::vector const& left_ip, std::vector const& right_ip, std::vector & sorted_angles) { int num_ip = left_ip.size(); sorted_angles.clear(); for (int ip_it = 0; ip_it < num_ip; ip_it++) { Vector2 lip(left_ip[ip_it].x, left_ip[ip_it].y); Vector2 rip(right_ip[ip_it].x, right_ip[ip_it].y); double angle = 0.0; try { angle = (180.0 / M_PI) * acos(dot_prod(left_cam->pixel_to_vector(lip), right_cam->pixel_to_vector(rip))); } catch(...) { // Projection into camera may not always succeed continue; } if (std::isnan(angle)) continue; sorted_angles.push_back(angle); } std::sort(sorted_angles.begin(), sorted_angles.end()); } // Find all match files stored on disk having this prefix. This is much faster // than trying to see if any combination of images results in a match file. void listExistingMatchFiles(std::string const& prefix, bool matches_as_txt, std::set & existing_files) { existing_files.clear(); fs::path dirName = fs::path("."); try { dirName = fs::path(prefix).parent_path(); } catch(...) {} // This is a fix for an output prefix which is of the form "run" rather than // "run/run". bool add_dot = false; if (dirName.string() == "") { dirName = fs::path("."); add_dot = true; } std::string ext; if (matches_as_txt) ext = ".txt"; else ext = ".match"; // Iterate over all files in the directory for (auto i = fs::directory_iterator(dirName); i != fs::directory_iterator(); i++) { if (fs::is_directory(i->path())) // skip dirs continue; std::string filename = i->path().string(); if (filename.find(ext) == std::string::npos) // keep only match files continue; if (add_dot && filename.size() >= 2 && filename[0] == '.' && filename[1] == '/' && filename.find(prefix) != 0) { // Had to temporarily replace prefix*.match with ./prefix*.match so // boost can list the current directory. Remove the dot (and slash) now. filename = filename.substr(2, filename.size()-2); } existing_files.insert(filename); } } // Given a pair of indices, return all the matches between them. void matchesForPair(vw::ba::ControlNetwork const& cnet, int left_cid, int right_cid, std::vector & left_ip, std::vector & right_ip) { // Wipe the outputs left_ip.clear(); right_ip.clear(); // Iterate over all control points in cnet for (int ipt = 0; ipt < cnet.size(); ipt++) { // Iterate over all measures for the current control point bool has_left = false, has_right = false; vw::ip::InterestPoint lip, rip; for (auto m = cnet[ipt].begin(); m != cnet[ipt].end(); m++) { int cid = m->image_id(); if (cid == left_cid) { has_left = true; lip.x = m->position()[0]; lip.y = m->position()[1]; } else if (cid == right_cid) { has_right = true; rip.x = m->position()[0]; rip.y = m->position()[1]; } } if (has_left && has_right) { left_ip.push_back(lip); right_ip.push_back(rip); } } return; } // Make a list of all of the image pairs to find matches for. When prior matches // are used, they can be in any order. void determineImagePairs(// Inputs int overlap_limit, bool match_first_to_last, bool external_matches, std::vector const& image_files, // if having optional preexisting camera positions bool got_est_cam_positions, // Optional filter distance, set to -1 if not used double position_filter_dist, // Estimated camera positions, set to empty if missing std::vector const& estimated_camera_gcc, // Optional preexisting list bool have_overlap_list, std::set> const& overlap_list, // Output std::vector> & all_pairs) { // Wipe the output all_pairs.clear(); // Need this to avoid repetitions std::set> local_set; int num_images = image_files.size(); for (int i0 = 0; i0 < num_images; i0++){ for (int j0 = i0 + 1; j0 <= i0 + overlap_limit; j0++){ // Make copies of i and j which we can modify int i = i0, j = j0; if (j >= num_images) { if (!match_first_to_last) continue; // out of bounds j = j % num_images; // wrap around if (i == j) continue; // can't have matches to itself if (i > j) std::swap(i, j); } // Apply the overlap list if manually specified. Otherwise every // image pair i, j as above will be matched. if (have_overlap_list) { auto pair1 = std::make_pair(image_files[i], image_files[j]); auto pair2 = std::make_pair(image_files[j], image_files[i]); if (overlap_list.find(pair1) == overlap_list.end() && overlap_list.find(pair2) == overlap_list.end()) continue; } // If this option is set, don't try to match cameras that are too far apart. if (got_est_cam_positions && (position_filter_dist > 0)) { Vector3 this_pos = estimated_camera_gcc[i]; Vector3 other_pos = estimated_camera_gcc[j]; if ((this_pos != Vector3(0,0,0)) && // If both positions are known (other_pos != Vector3(0,0,0)) && // and they are too far apart (norm_2(this_pos - other_pos) > position_filter_dist)) { vw_out() << "Skipping position: " << this_pos << " and " << other_pos << " with distance " << norm_2(this_pos - other_pos) << std::endl; continue; // Skip this image pair } } local_set.insert(std::make_pair(i,j)); } } if (external_matches) { // Accept matches in reverse order auto local_set_in = local_set; for (auto it = local_set_in.begin(); it != local_set_in.end(); it++) local_set.insert(std::make_pair(it->second, it->first)); } // The pairs without repetition for (auto it = local_set.begin(); it != local_set.end(); it++) all_pairs.push_back(*it); } // Find interest point matches by loading them from files for a given set of images. void findMatchFiles(// Inputs int overlap_limit, bool match_first_to_last, std::vector const& image_files, std::string const& clean_match_files_prefix, std::string const& match_files_prefix, std::string const& out_prefix, bool matches_as_txt, // Outputs std::map, std::string> & match_files) { // Clear the output match_files.clear(); // Make a list of all the image pairs to find matches for. bool external_matches = true; bool got_est_cam_positions = false; double position_filter_dist = -1.0; std::vector estimated_camera_gcc; bool have_overlap_list = false; std::set> overlap_list; std::vector> all_pairs; asp::determineImagePairs(overlap_limit, match_first_to_last, external_matches, image_files, got_est_cam_positions, position_filter_dist, estimated_camera_gcc, have_overlap_list, overlap_list, all_pairs); // output // List existing match files. This can take a while. vw_out() << "Computing the list of existing match files.\n"; std::string prefix = asp::matchMultiPrefix(clean_match_files_prefix, match_files_prefix, out_prefix); std::set existing_files; asp::listExistingMatchFiles(prefix, matches_as_txt, existing_files); // Load match files for (size_t k = 0; k < all_pairs.size(); k++) { int i = all_pairs[k].first; int j = all_pairs[k].second; std::string const& image1_path = image_files[i]; // alias std::string const& image2_path = image_files[j]; // alias // Load match files from a different source std::string match_file = asp::matchFileMultiPrefix(clean_match_files_prefix, match_files_prefix, out_prefix, image1_path, image2_path, matches_as_txt); // The external match file does not exist, don't try to load it if (existing_files.find(match_file) == existing_files.end()) continue; match_files[std::make_pair(i, j)] = match_file; } } } // end namespace asp ================================================ FILE: src/asp/Core/IpMatchingAlgs.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // This header file is to be very light-weight and only include // definitions of high-level interest point matching algorithms, and // no template-based logic. Those should go in // InterestPointMatching.h, which will be included in // IpMatchingAlgs.cc. The goal is to include in most places this // lightweight header rather than InterestPointMatching.h. // TODO(oalexan1): Move here more algorithms. #ifndef __ASP_CORE_IP_MATCHING_ALGS_H__ #define __ASP_CORE_IP_MATCHING_ALGS_H__ #include // defines vw::TransformPtr #include #include #include namespace vw { namespace ip { class InterestPoint; } namespace ba { class ControlNetwork; } namespace camera { class CameraModel; } } namespace asp { // Find the match file taking into account --match-files-prefix and // --clean-match-files-prefix. std::string stereoMatchFile(std::string const& left_cropped_file, std::string const& right_cropped_file, std::string const& out_prefix, bool matches_as_txt); // Compute ip between L.tif and R.tif produced by stereo. void compute_ip_LR(std::string const & out_prefix); // Outlier removal based on the disparity of interest points. // Points with x or y disparity not within the 100-'pct' to 'pct' // percentile interval expanded by 'factor' will be removed as // outliers. Overwrite the ip in place. void filter_ip_by_disparity(double pct, // for example, 90.0 double factor, // for example, 3.0 bool quiet, // if not to print a lot of text std::vector & left_ip, std::vector & right_ip); // Estimate the "spread" of IP coverage in an image. // - Returns a value between 0 and 1. // - Breaks the image into tiles and checks how many tiles have at least N IP. double calc_ip_coverage_fraction(std::vector const& ip, vw::Vector2i const& image_size, int tile_size=1024, int min_ip_per_tile=2); /// Apply alignment transform to ip. Not to be used with mapprojected images. void align_ip(vw::TransformPtr const& tx_left, vw::TransformPtr const& tx_right, std::vector & ip_left, std::vector & ip_right); // Undo the alignment of interest points. If tx_left and tx_right are null, // that will mean there is no alignment to undo. void unalign_ip(vw::TransformPtr tx_left, vw::TransformPtr tx_right, std::vector const& ip1_in, std::vector const& ip2_in, std::vector & ip1_out, std::vector & ip2_out); // Heuristics for match file prefix std::string matchMultiPrefix(std::string const& clean_match_files_prefix, std::string const& match_files_prefix, std::string const& out_prefix); // Heuristics for where to load the match file from std::string matchFileMultiPrefix(std::string const& clean_match_files_prefix, std::string const& match_files_prefix, std::string const& out_prefix, std::string const& image1_path, std::string const& image2_path, bool matches_as_txt); /// The unwarped disparity file name. std::string unwarped_disp_file(std::string const& prefix, std::string const& left_image, std::string const& right_image, bool matches_as_txt); // Find and sort the convergence angles for given cameras and interest points void convergence_angles(vw::camera::CameraModel const * left_cam, vw::camera::CameraModel const * right_cam, std::vector const& left_ip, std::vector const& right_ip, std::vector & sorted_angles); // Find all match files stored on disk having this prefix void listExistingMatchFiles(std::string const& prefix, bool matches_as_txt, std::set & existing_files); // Given a pair of indices, return all the matches between them. void matchesForPair(vw::ba::ControlNetwork const& cnet, int left_cid, int right_cid, std::vector & left_ip, std::vector & right_ip); // Find interest point matches by loading them from files for a given set of images. void findMatchFiles(// Inputs int overlap_limit, bool match_first_to_last, std::vector const& image_files, std::string const& clean_match_files_prefix, std::string const& match_files_prefix, std::string const& out_prefix, bool matches_as_txt, // Outputs std::map, std::string> & match_files); // Make a list of all of the image pairs to find matches for void determineImagePairs(// Inputs int overlap_limit, bool match_first_to_last, bool external_matches, std::vector const& image_files, // if having optional preexisting camera positions bool got_est_cam_positions, // Optional filter distance, set to -1 if not used double position_filter_dist, // Estimated camera positions, set to empty if missing std::vector const& estimated_camera_gcc, // Optional preexisting list bool have_overlap_list, std::set> const& overlap_list, // Output std::vector> & all_pairs); } // End namespace asp #endif//__ASP_CORE_IP_MATCHING_ALGS_H__ ================================================ FILE: src/asp/Core/LocalAlignment.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file LocalAlignment.cc /// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; namespace fs = boost::filesystem; namespace asp { // Grow a box to a square size. vw::BBox2i grow_box_to_square(vw::BBox2i const& box, int max_size) { int width = box.width(); int height = box.height(); int diffx = std::max(max_size - width, 0); int diffy = std::max(max_size - height, 0); BBox2i out_box = box; out_box.min() -= Vector2(diffx/2, diffy/2); out_box.max() += Vector2((diffx + 1)/2, (diffy + 1)/2); // +1 to handle the case of odd dims return out_box; } // Grow bbox to square while not exceeding given box vw::BBox2i grow_box_to_square_with_constraint(vw::BBox2i const& box, int max_size, vw::BBox2i const& max_box) { BBox2i out_box = box; for (int attempt = 0; attempt < 10; attempt++) { int width = box.width(); int height = box.height(); BBox2i prev_box = out_box; out_box = grow_box_to_square(out_box, max_size); // Ensure we do not exceed the image bounds out_box.crop(max_box); // TODO(oalexan1): Here need find the bounding box of the valid // data and if necessary grow box to make the bounding box of // the valid data be as wide and tall as a full tile. As it is, // the box could be big but a good chunk of it could be covering // an area with no data. // Stop when the box stops growing if (out_box == prev_box) break; } return out_box; } // Estimate the region in the right image corresponding // to left_trans_crop_win based on ip in the current box and // also by creating ip from D_sub. If cannot find enough such ip, // expand the box a little. Don't try too hard though, as then we // end up with too many outliers which can't be filtered easily. void estimate_right_trans_crop_win(ASPGlobalOptions const & opt, std::string const & left_unaligned_file, std::string const & right_unaligned_file, vw::HomographyTransform const & left_global_trans, vw::HomographyTransform const & right_global_trans, ImageViewRef> right_globally_aligned_image, int max_tile_size, double right_extra_factor, BBox2i const & left_trans_crop_win, BBox2i & right_trans_crop_win) { bool matches_as_txt = stereo_settings().matches_as_txt; vw_out() << "\t--> Reading unaligned interest points.\n"; std::vector left_unaligned_ip, right_unaligned_ip; std::string match_filename = vw::ip::match_filename(opt.out_prefix, left_unaligned_file, right_unaligned_file, matches_as_txt); if (!fs::exists(match_filename)) vw_throw(ArgumentErr() << "Missing IP file: " << match_filename); vw_out() << "\t * Loading match file: " << match_filename << "\n"; vw::ip::read_match_file(match_filename, left_unaligned_ip, right_unaligned_ip, matches_as_txt); right_trans_crop_win = BBox2i(); // wipe the output size_t min_num_ip = 20; BBox2i ip_crop_win = left_trans_crop_win; int win_size = std::max(left_trans_crop_win.width(), left_trans_crop_win.height()); for (int pass = 0; pass < 2; pass++) { std::vector left_trans_ip, right_trans_ip; // Read the ip from D_sub and scale them //vw_out() << "Creating IP from D_sub.\n"; std::vector left_ip_from_dsub, right_ip_from_dsub; if (stereo_settings().seed_mode > 0) { vw::ImageView> sub_disp; vw::Vector2 upsample_scale; std::string d_sub_file = opt.out_prefix + "-D_sub.tif"; asp::load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale); asp::aligned_ip_from_D_sub(sub_disp, upsample_scale, left_ip_from_dsub, right_ip_from_dsub); } // Append the ip from D_sub which are in the box int num_ip_from_d_sub = 0; for (size_t i = 0; i < left_ip_from_dsub.size(); i++) { Vector2 left_pt(left_ip_from_dsub[i].x, left_ip_from_dsub[i].y); if (!ip_crop_win.contains(left_pt)) continue; // Grow the right box Vector2 right_pt(right_ip_from_dsub[i].x, right_ip_from_dsub[i].y); right_trans_crop_win.grow(right_pt); left_trans_ip.push_back(left_ip_from_dsub[i]); right_trans_ip.push_back(right_ip_from_dsub[i]); num_ip_from_d_sub++; } // Append the regular ip which are in the box int num_global_ip_in_tile = 0; for (size_t i = 0; i < left_unaligned_ip.size(); i++) { Vector2 left_pt (left_unaligned_ip [i].x, left_unaligned_ip [i].y); Vector2 right_pt(right_unaligned_ip[i].x, right_unaligned_ip[i].y); left_pt = left_global_trans.forward(left_pt); right_pt = right_global_trans.forward(right_pt); if (!ip_crop_win.contains(left_pt)) continue; right_trans_crop_win.grow(right_pt); // Apply the alignment transforms to these ip left_trans_ip.push_back(left_unaligned_ip[i]); right_trans_ip.push_back(right_unaligned_ip[i]); left_trans_ip.back().x = left_pt.x(); left_trans_ip.back().y = left_pt.y(); right_trans_ip.back().x = right_pt.x(); right_trans_ip.back().y = right_pt.y(); num_global_ip_in_tile++; } // TODO(oalexan1): if the right box is way too big, so if there // are outliers, it needs to be shrank by finding the median of // of the ip and shrinking the box around it. if (stereo_settings().local_alignment_debug) { std::cout << "Attempt: " << pass << std::endl; std::cout << "Num ip from D_sub: " << num_ip_from_d_sub << std::endl; std::cout << "Num global ip in tile: " << num_global_ip_in_tile << std::endl; std::cout << "Left trans crop win " << left_trans_crop_win << std::endl; std::cout << "Right trans crop win " << right_trans_crop_win << std::endl; } // This is a bugfix, sometimes the right tile is under-estimated // if there are not enough ip. Make the box bigger as sometimes // it is not accurately determined based on input ip or // disparity. After ip are found, filtered, and local alignment // is applied, the aligned tiles will be shrunk (as I recall) // before running correlation. // TODO(oalexan1): Filter out outliers by median and bound before growing! // TODO(oalexan1): Allow the right box to be bigger than left box, // perhaps by a factor of 1.5. right_trans_crop_win = grow_box_to_square_with_constraint (right_trans_crop_win, right_extra_factor * max_tile_size, vw::bounding_box(right_globally_aligned_image)); if (stereo_settings().local_alignment_debug) { std::cout << "Grown right trans crop win " << right_trans_crop_win << std::endl; std::string out_match_filename = vw::ip::match_filename(opt.out_prefix + "-tile", "L.tif", "R.tif", matches_as_txt); vw_out() << "Writing match file: " << out_match_filename << "\n"; vw::ip::write_match_file(out_match_filename, left_trans_ip, right_trans_ip, matches_as_txt); } if (left_trans_ip.size() >= min_num_ip) break; // After each pass, grow the box a bit ip_crop_win.expand(win_size/5); } // Round up right_trans_crop_win.expand(1); right_trans_crop_win.crop(bounding_box(right_globally_aligned_image)); } // Unalign the ip, filter them using the cameras, align them back, // and return the inlier ip. void filter_local_ip_using_cameras(ASPGlobalOptions const & opt, Vector2 const & outlier_removal_params, vw::HomographyTransform const & left_global_trans, vw::HomographyTransform const & right_global_trans, BBox2i const & left_trans_crop_win, BBox2i const & right_trans_crop_win, vw::camera::CameraModel const * left_camera_model, vw::camera::CameraModel const * right_camera_model, vw::cartography::Datum const & datum, // These get modified std::vector & left_local_ip, std::vector & right_local_ip, std::vector & ip_inlier_indices) { bool matches_as_txt = stereo_settings().matches_as_txt; // Convert ip to original unaligned and uncropped coordinates std::vector left_global_ip; std::vector right_global_ip; for (size_t it = 0; it < ip_inlier_indices.size(); it++) { int i = ip_inlier_indices[it]; Vector2 left_pt (left_local_ip [i].x, left_local_ip [i].y); Vector2 right_pt(right_local_ip[i].x, right_local_ip[i].y); left_pt = left_global_trans.reverse (left_pt + left_trans_crop_win.min()); right_pt = right_global_trans.reverse(right_pt + right_trans_crop_win.min()); // First copy all the data from the input ip, then apply the transform left_global_ip.push_back(left_local_ip[i]); right_global_ip.push_back(right_local_ip[i]); left_global_ip.back().x = left_pt.x(); left_global_ip.back().y = left_pt.y(); right_global_ip.back().x = right_pt.x(); right_global_ip.back().y = right_pt.y(); } if (stereo_settings().local_alignment_debug) { std::string unaligned_match_filename = vw::ip::match_filename(opt.out_prefix + "-cropped-noalign-ip", opt.in_file1, opt.in_file2, matches_as_txt); vw_out() << "Writing match file: " << unaligned_match_filename << "\n"; vw::ip::write_match_file(unaligned_match_filename, left_global_ip, right_global_ip, matches_as_txt); } filter_ip_using_cameras(left_global_ip, right_global_ip, left_camera_model, right_camera_model, datum, outlier_removal_params[0], outlier_removal_params[1]); // Transform back to tile coordinates left_local_ip.clear(); right_local_ip.clear(); ip_inlier_indices.clear(); for (size_t i = 0; i < left_global_ip.size(); i++) { Vector2 left_pt (left_global_ip [i].x, left_global_ip [i].y); Vector2 right_pt(right_global_ip[i].x, right_global_ip[i].y); left_pt = left_global_trans.forward(left_pt) - left_trans_crop_win.min(); right_pt = right_global_trans.forward(right_pt) - right_trans_crop_win.min(); // First copy all the data from the input ip, then apply the transform left_local_ip.push_back(left_global_ip[i]); right_local_ip.push_back(right_global_ip[i]); left_local_ip.back().x = left_pt.x(); left_local_ip.back().y = left_pt.y(); right_local_ip.back().x = right_pt.x(); right_local_ip.back().y = right_pt.y(); ip_inlier_indices.push_back(i); } // end loop over ip } // Apply transforms to ip void apply_transforms_to_ip(std::vector const & left_input_ip, std::vector const & right_input_ip, std::vector const & ip_inlier_indices, vw::Matrix const & left_trans_mat, vw::Matrix const & right_trans_mat, // Outputs std::vector & left_trans_ip, std::vector & right_trans_ip) { // Wipe the outputs left_trans_ip.reserve(ip_inlier_indices.size()); right_trans_ip.reserve(ip_inlier_indices.size()); left_trans_ip.clear(); right_trans_ip.clear(); vw::HomographyTransform left_trans (left_trans_mat); vw::HomographyTransform right_trans(right_trans_mat); for (size_t it = 0; it < ip_inlier_indices.size(); it++) { int i = ip_inlier_indices[it]; Vector2 left_pt (left_input_ip [i].x, left_input_ip [i].y); Vector2 right_pt(right_input_ip[i].x, right_input_ip[i].y); left_pt = left_trans.forward(left_pt); right_pt = right_trans.forward(right_pt); // First copy all the data from the input ip, then apply the transform left_trans_ip.push_back(left_input_ip[i]); right_trans_ip.push_back(right_input_ip[i]); left_trans_ip.back().x = left_pt.x(); left_trans_ip.back().y = left_pt.y(); right_trans_ip.back().x = right_pt.x(); right_trans_ip.back().y = right_pt.y(); } } // Algorithm to perform local alignment. Approach: // - Given the global interest points and the left crop window, find // the right crop window. // - Crop the globally aligned images to these crop windows and find // the interest points for the crops // - Use the interest points to find the local alignment // - Apply the composition of the global and local alignment to the // original unaligned images to find the locally aligned images // - Save the locally aligned images to disk // - Estimate the search range for the locally aligned images void local_alignment(// Inputs ASPGlobalOptions const & opt, std::string const & alg_name, std::string const & session_name, int max_tile_size, double left_extra_factor, double right_extra_factor, vw::BBox2i const & tile_crop_win, bool write_nodata, vw::camera::CameraModel const * left_camera_model, vw::camera::CameraModel const * right_camera_model, vw::cartography::Datum const & datum, // Outputs vw::BBox2i & left_trans_crop_win, vw::BBox2i & right_trans_crop_win, vw::Matrix & left_local_mat, vw::Matrix & right_local_mat, std::string & left_aligned_file, std::string & right_aligned_file, int & min_disp, int & max_disp) { bool matches_as_txt = stereo_settings().matches_as_txt; // Read the unaligned images std::string left_unaligned_file = opt.in_file1; std::string right_unaligned_file = opt.in_file2; // TODO(oalexan1): Not sure if parallel_stereo won't strip the // crop win information. bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); if (crop_left) left_unaligned_file = opt.out_prefix + "-L-cropped.tif"; if (crop_right) right_unaligned_file = opt.out_prefix + "-R-cropped.tif"; // Read the globally aligned images and alignment transforms std::string left_globally_aligned_file = opt.out_prefix + "-L.tif"; std::string right_globally_aligned_file = opt.out_prefix + "-R.tif"; boost::shared_ptr left_rsrc (vw::DiskImageResourcePtr(left_globally_aligned_file)), right_rsrc(vw::DiskImageResourcePtr(right_globally_aligned_file)); float left_nodata_value = std::numeric_limits::quiet_NaN(); float right_nodata_value = std::numeric_limits::quiet_NaN(); if (left_rsrc->has_nodata_read()) left_nodata_value = left_rsrc->nodata_read(); if (right_rsrc->has_nodata_read()) right_nodata_value = right_rsrc->nodata_read(); // Note that we do not create masked images using nodata values. DiskImageView> left_globally_aligned_image(left_rsrc), right_globally_aligned_image(right_rsrc); // At image edges, the tile we work with can be a sliver which can // cause issues. Grow it to a square tile, then crop it to the // image bounding box (which may make it non-square again, so // repeat this a few times during which the box grows // bigger). left_trans_crop_win = grow_box_to_square_with_constraint (tile_crop_win, left_extra_factor * max_tile_size, vw::bounding_box(left_globally_aligned_image)); if (stereo_settings().local_alignment_debug) std::cout << "Grown left trans crop win " << left_trans_crop_win << std::endl; vw::Matrix left_global_mat = asp::alignmentMatrix(opt.out_prefix, asp::stereo_settings().alignment_method, "left"); vw::Matrix right_global_mat = asp::alignmentMatrix(opt.out_prefix, asp::stereo_settings().alignment_method, "right"); vw::HomographyTransform left_global_trans(left_global_mat); vw::HomographyTransform right_global_trans(right_global_mat); // Estimate the region in the right image corresponding // to left_trans_crop_win based on ip in the current box and // also by creating ip from D_sub. estimate_right_trans_crop_win(opt, left_unaligned_file, right_unaligned_file, left_global_trans, right_global_trans, right_globally_aligned_image, max_tile_size, right_extra_factor, left_trans_crop_win, // Output right_trans_crop_win); // TODO(oalexan1): May want to increase here the number of ip per image, // from the default of 5000 in InterestPointMatching.cc. // But do not introduce hard-coded values. // Redo ip matching in the current tile. It should be more accurate after alignment // and cropping. std::vector left_local_ip, right_local_ip; size_t number_of_jobs = 1; bool use_cached_ip = false; detect_match_ip(left_local_ip, right_local_ip, vw::pixel_cast(crop(left_globally_aligned_image, left_trans_crop_win)), vw::pixel_cast(crop(right_globally_aligned_image, right_trans_crop_win)), stereo_settings().ip_per_tile, number_of_jobs, "", "", use_cached_ip, // no saving or caching of ip left_nodata_value, right_nodata_value, ""); // do not save any match file to disk if (stereo_settings().local_alignment_debug) { // These clips have global but not local alignment vw::cartography::GeoReference georef; bool has_georef = false, has_nodata = true; float nan_nodata = std::numeric_limits::quiet_NaN(); std::string left_crop = opt.out_prefix + "-" + "left-crop.tif"; vw_out() << "\t--> Writing: " << left_crop << "\n"; block_write_gdal_image(left_crop, crop(left_globally_aligned_image, left_trans_crop_win), has_georef, georef, has_nodata, left_nodata_value, opt, TerminalProgressCallback("asp","\t Left: ")); std::string right_crop = opt.out_prefix + "-" + "right-crop.tif"; vw_out() << "\t--> Writing: " << right_crop << "\n"; block_write_gdal_image(right_crop, crop(right_globally_aligned_image, right_trans_crop_win), has_georef, georef, has_nodata, right_nodata_value, opt, TerminalProgressCallback("asp","\t Right: ")); std::string local_match_filename = vw::ip::match_filename(opt.out_prefix, left_crop, right_crop, matches_as_txt); vw_out() << "Writing match file: " << local_match_filename << "\n"; vw::ip::write_match_file(local_match_filename, left_local_ip, right_local_ip, matches_as_txt); } // The matrices which take care of the crop to the current tile Matrix left_crop_mat = math::identity_matrix<3>(); Matrix right_crop_mat = math::identity_matrix<3>(); left_crop_mat (0, 2) = -left_trans_crop_win.min().x(); left_crop_mat (1, 2) = -left_trans_crop_win.min().y(); right_crop_mat(0, 2) = -right_trans_crop_win.min().x(); right_crop_mat(1, 2) = -right_trans_crop_win.min().y(); // Find the local alignment // TODO(oalexan1): May want to do do an initial affine epipolar alignment // based on d_sub and preexisting match points, with a bigger outlier factor, // then do an initial rectification, then redo it as below. std::vector ip_inlier_indices; bool crop_to_shared_area = false; Vector2i local_trans_aligned_size = affine_epipolar_rectification(left_trans_crop_win.size(), right_trans_crop_win.size(), stereo_settings().local_alignment_threshold, stereo_settings().alignment_num_ransac_iterations, left_local_ip, right_local_ip, crop_to_shared_area, left_local_mat, right_local_mat, &ip_inlier_indices); // Combination of global alignment, crop to current tile, and local alignment Matrix combined_left_mat = left_local_mat * left_crop_mat * left_global_mat; Matrix combined_right_mat = right_local_mat * right_crop_mat * right_global_mat; // Apply the combined transforms to the original unscaled and // unaligned images, then scale them too. float left_unaligned_nodata_value = -32768.0; float right_unaligned_nodata_value = -32768.0; { // Retrieve nodata values and let the handles go out of scope // right away. For this to work, the ISIS type must be // registered with the DiskImageResource class. This happens in // "stereo.cc", so these calls will create DiskImageResourceIsis // objects. boost::shared_ptr left_unaligned_rsrc (DiskImageResourcePtr(left_unaligned_file)), right_unaligned_rsrc(DiskImageResourcePtr(right_unaligned_file)); asp::get_nodata_values(left_unaligned_rsrc, right_unaligned_rsrc, asp::stereo_settings().nodata_value, left_unaligned_nodata_value, right_unaligned_nodata_value); } // Input images ImageViewRef left_unaligned_image = DiskImageView(left_unaligned_file); ImageViewRef right_unaligned_image = DiskImageView(right_unaligned_file); // Set up image masks. If the user provided a custom no-data value, values // no more than that are masked. float user_nodata = asp::stereo_settings().nodata_value; ImageViewRef> left_masked_image, right_masked_image; if (!std::isnan(user_nodata)) { left_masked_image = create_mask_less_or_equal(left_unaligned_image, user_nodata); right_masked_image = create_mask_less_or_equal(right_unaligned_image, user_nodata); } else { left_masked_image = create_mask(left_unaligned_image, left_unaligned_nodata_value); right_masked_image = create_mask(right_unaligned_image, right_unaligned_nodata_value); } // By now the stats should be cached, but need to respect the API Vector6f left_stats = gather_stats(left_masked_image, opt.out_prefix, left_unaligned_file, asp::stereo_settings().force_reuse_match_files); Vector6f right_stats = gather_stats(right_masked_image, opt.out_prefix, right_unaligned_file, asp::stereo_settings().force_reuse_match_files); PixelMask nodata_mask = PixelMask(); // invalid value for a PixelMask // Apply the combined transform to original left and right images, // rather than to already transformed images. This way we avoid // double interpolation. ImageViewRef> left_aligned_image = vw::transform(left_masked_image, HomographyTransform(combined_left_mat), local_trans_aligned_size.x(), local_trans_aligned_size.y(), ValueEdgeExtension>(nodata_mask), BilinearInterpolation()); ImageViewRef> right_aligned_image = vw::transform(right_masked_image, HomographyTransform(combined_right_mat), local_trans_aligned_size.x(), local_trans_aligned_size.y(), ValueEdgeExtension>(nodata_mask), BilinearInterpolation()); // This is a bugfix. Things can go out-of-whack when there are clouds. // Note that the determinant being 0.15 means that the scale ratio // among the two images is sqrt(0.15) = 0.38. double det_left = vw::math::det(combined_left_mat); double det_right = vw::math::det(combined_right_mat); if (det_left < 0.15 || det_right < 0.15) vw_throw(vw::ArgumentErr() << "Expecting the determinants of local alignment " << "transforms to not be too different from 1. Got the values: " << det_left << ", " << det_right << ".\n"); if (det_left < 0.25 || det_right < 0.25) vw_out() << "Warning: the determinants of the local alignment transforms " << "are too different from 1. Got the " << det_left << ' ' << det_right << ".\n"; // Normalize the locally aligned images bool use_percentile_stretch = false; bool do_not_exceed_min_max = (session_name == "isis" || session_name == "isismapisis"); asp::normalize_images(stereo_settings().force_use_entire_range, stereo_settings().individually_normalize, use_percentile_stretch, do_not_exceed_min_max, left_stats, right_stats, left_aligned_image, right_aligned_image); // The S2P MGM algorithm needs NaN data float nan_nodata = std::numeric_limits::quiet_NaN(); // Fully form the image clips in memory. Otherwise, if something // goes wrong, there's an abort in block_write_gdal_image // somewhere, instead of exceptions being propagated // gracefully. It could not be found in reasonable time where the // abort was happening. ImageView left_trans_clip = apply_mask(left_aligned_image, nan_nodata); ImageView right_trans_clip = apply_mask(crop (edge_extend(right_aligned_image, ValueEdgeExtension>(nodata_mask)), bounding_box(left_aligned_image)), // note the left bounding box nan_nodata); if (alg_name == "msmw" || alg_name == "msmw2") { // msmw does not like nan left_trans_clip = apply_mask(create_mask(left_trans_clip, 0), 0); right_trans_clip = apply_mask(create_mask(right_trans_clip, 0), 0); } // Write the locally aligned images to disk vw::cartography::GeoReference georef; bool has_georef = false, has_aligned_nodata = write_nodata; std::string left_tile = "left-aligned-tile.tif"; std::string right_tile = "right-aligned-tile.tif"; left_aligned_file = opt.out_prefix + "-" + left_tile; vw_out() << "\t--> Writing: " << left_aligned_file << "\n"; block_write_gdal_image(left_aligned_file, left_trans_clip, has_georef, georef, has_aligned_nodata, nan_nodata, opt, TerminalProgressCallback("asp","\t Left: ")); right_aligned_file = opt.out_prefix + "-" + right_tile; vw_out() << "\t--> Writing: " << right_aligned_file << "\n"; block_write_gdal_image(right_aligned_file, right_trans_clip, has_georef, georef, has_aligned_nodata, nan_nodata, opt, TerminalProgressCallback("asp","\t Right: ")); Vector2 outlier_removal_params = stereo_settings().outlier_removal_params; // Filter outliers using cameras among the ip in the tile which have the global alignment // applied to them. if (outlier_removal_params[0] < 100.0) filter_local_ip_using_cameras(opt, outlier_removal_params, left_global_trans, right_global_trans, left_trans_crop_win, right_trans_crop_win, left_camera_model, right_camera_model, datum, // These get modified left_local_ip, right_local_ip, ip_inlier_indices); // Apply the local alignment transform to ip in the tile std::vector left_trans_local_ip; std::vector right_trans_local_ip; apply_transforms_to_ip(left_local_ip, right_local_ip, ip_inlier_indices, left_local_mat, right_local_mat, // Outputs left_trans_local_ip, right_trans_local_ip); // Filter outliers among locally aligned ip, this can reduce the search range bool quiet = false; if (outlier_removal_params[0] < 100.0) asp::filter_ip_by_disparity(outlier_removal_params[0], outlier_removal_params[1], quiet, left_trans_local_ip, right_trans_local_ip); // Find the disparity search range BBox2 disp_range; for (size_t it = 0; it < left_trans_local_ip.size(); it++) { Vector2 left_pt (left_trans_local_ip [it].x, left_trans_local_ip [it].y); Vector2 right_pt(right_trans_local_ip[it].x, right_trans_local_ip[it].y); disp_range.grow(right_pt - left_pt); } if (stereo_settings().local_alignment_debug) { std::string local_aligned_match_filename = vw::ip::match_filename(opt.out_prefix, left_tile, right_tile, matches_as_txt); vw_out() << "Writing match file: " << local_aligned_match_filename << "\n"; vw::ip::write_match_file(local_aligned_match_filename, left_trans_local_ip, right_trans_local_ip, matches_as_txt); } // Expand the disparity search range a bit double disp_width = disp_range.width(); double disp_extra = disp_width * stereo_settings().disparity_range_expansion_percent / 100.0; min_disp = floor(disp_range.min().x() - disp_extra/2.0); max_disp = ceil(disp_range.max().x() + disp_extra/2.0); // TODO(oalexan1): Make this into a function. if (stereo_settings().max_disp_spread > 0) { vw_out() << "Min and max disparities before invoking the --max-disp-spread option: " << min_disp << ' ' << max_disp << ".\n"; std::vector diff; for (size_t it = 0; it < left_trans_local_ip.size(); it++) diff.push_back(right_trans_local_ip[it].x - left_trans_local_ip[it].x); if (diff.empty()) vw_throw(ArgumentErr() << "No interest points left."); std::sort(diff.begin(), diff.end()); double mid_x = diff[diff.size()/2]; // median double len = stereo_settings().max_disp_spread; double half = len / 2.0; min_disp = std::max(min_disp, (int)floor(mid_x - half)); max_disp = std::min(max_disp, (int)ceil (mid_x + half)); // The resulting range of disparities will be printed later. } // TODO(oalexan1): If just small slivers of valid data // are left in the tiles without the padding, this tile better // be skipped. return; } #if 0 // This is some experimental code which may still have some uses. // Tweak the alignment transforms and their bounds. BBox2i new_left_win, new_right_win; for (size_t it = 0; it < ip_inlier_indices.size(); it++) { int i = ip_inlier_indices[it]; Vector2 left_pt = Vector2(left_local_ip [i].x, left_local_ip [i].y) + left_trans_crop_win.min(); Vector2 right_pt = Vector2(right_local_ip [i].x, right_local_ip [i].y) + right_trans_crop_win.min(); new_left_win.grow(left_pt); new_right_win.grow(right_pt); } std::cout << "old new left " << left_trans_crop_win << ' ' << new_left_win << std::endl; std::cout << "old new right " << right_trans_crop_win << ' ' << new_right_win << std::endl; // Apply local alignment to inlier ip and estimate the search range { vw::HomographyTransform left_local_trans (left_local_mat); vw::HomographyTransform right_local_trans(right_local_mat); int i = 0; Vector2 left_pt = Vector2(left_local_ip [i].x, left_local_ip [i].y); std::cout << "mapped before left " << left_local_trans.forward(left_pt) << std::endl; Vector2 right_pt = Vector2(right_local_ip [i].x, right_local_ip [i].y); std::cout << "mapped before right " << right_local_trans.forward(right_pt) << std::endl; } // Adjust the transforms given the new windows std::cout << "left mat is " << left_local_mat << std::endl; Vector3 left_shift(new_left_win.min().x() - left_trans_crop_win.min().x(), new_left_win.min().y() - left_trans_crop_win.min().y(), 0.0); std::cout << "left shift is " << left_shift << std::endl; left_shift = left_local_mat * left_shift; std::cout << "after left shift: " << left_shift << std::endl; left_local_mat(0, 2) += left_shift[0]; left_local_mat(1, 2) += left_shift[1]; std::cout << "left mat after " << left_local_mat << std::endl; std::cout << "right mat is " << right_local_mat << std::endl; Vector3 right_shift(new_right_win.min().x() - right_trans_crop_win.min().x(), new_right_win.min().y() - right_trans_crop_win.min().y(), 0.0); std::cout << "right shift is " << right_shift << std::endl; right_shift = right_local_mat * right_shift; std::cout << "after right shift: " << right_shift << std::endl; right_local_mat(0, 2) += right_shift[0]; right_local_mat(1, 2) += right_shift[1]; std::cout << "right mat after " << right_local_mat << std::endl; // Adjust the ip for (size_t i = 0; i < left_local_ip.size(); i++) { left_local_ip [i].x -= (new_left_win.min().x() - left_trans_crop_win.min().x()); left_local_ip [i].y -= (new_left_win.min().y() - left_trans_crop_win.min().y()); } for (size_t i = 0; i < right_local_ip.size(); i++) { right_local_ip [i].x -= (new_right_win.min().x() - right_trans_crop_win.min().x()); right_local_ip [i].y -= (new_right_win.min().y() - right_trans_crop_win.min().y()); } // Update the crop wins left_trans_crop_win = new_left_win; right_trans_crop_win = new_right_win; { vw::HomographyTransform left_local_trans (left_local_mat); vw::HomographyTransform right_local_trans(right_local_mat); int i = 0; Vector2 left_pt = Vector2(left_local_ip [i].x, left_local_ip [i].y); std::cout << "mapped after left " << left_local_trans.forward(left_pt) << std::endl; Vector2 right_pt = Vector2(right_local_ip [i].x, right_local_ip [i].y); std::cout << "mapped after right " << right_local_trans.forward(right_pt) << std::endl; // Find the trans box BBox2i trans_box; for (size_t it = 0; it < ip_inlier_indices.size(); it++) { int i = ip_inlier_indices[it]; Vector2 left_pt (left_local_ip [i].x, left_local_ip [i].y); Vector2 right_pt(right_local_ip[i].x, right_local_ip[i].y); left_pt = left_local_trans.forward(left_pt); right_pt = right_local_trans.forward(right_pt); trans_box.grow(left_pt); trans_box.grow(right_pt); } // Make it just a tiny bit bigger, may improve behavior, perhaps. // TODO(oalexan1): What if the ip do not cover fully the image tiles // and hence we now leave valuable real estate out? trans_box.expand(5); std::cout << "trans box is " << trans_box << std::endl; // adjust the trans box left_local_mat (0, 2) -= trans_box.min().x(); left_local_mat (1, 2) -= trans_box.min().y(); right_local_mat(0, 2) -= trans_box.min().x(); right_local_mat(1, 2) -= trans_box.min().y(); std::cout << "tran dims before " << local_trans_aligned_size << std::endl; local_trans_aligned_size = trans_box.size(); std::cout << "tran dims after " << local_trans_aligned_size << std::endl; } #endif // TODO(oalexan1): if left pix or right pix is invalid in the image, // the disparity must be invalid! Test with OpenCV SGBM, libelas, and mgm! // Also implement for unalign_2d_disparity. // Do the same for unalign_2d_disparity. // Go from 1D disparity of images with affine epipolar alignment to the 2D // disparity by undoing the transforms that applied this alignment. void unalign_1d_disparity(// Inputs vw::ImageViewRef aligned_disp_1d, vw::BBox2i const& left_crop_win, vw::BBox2i const& right_crop_win, vw::math::Matrix const& left_align_mat, vw::math::Matrix const& right_align_mat, // Output vw::ImageView> & unaligned_disp_2d) { vw::HomographyTransform left_align_trans (left_align_mat); vw::HomographyTransform right_align_trans(right_align_mat); float nan_nodata = std::numeric_limits::quiet_NaN(); // NaN value PixelMask nodata_mask = PixelMask(); // invalid value for a PixelMask ImageViewRef> masked_aligned_disp_1d = create_mask(aligned_disp_1d, nan_nodata); // TODO(oalexan1): Here bilinear interpolation is used. This will // make the holes a little bigger where there is no data. Need // to figure out if it is desired to fill holes. ImageViewRef> interp_aligned_disp_1d = interpolate(masked_aligned_disp_1d, BilinearInterpolation(), ValueEdgeExtension>(nodata_mask)); unaligned_disp_2d.set_size(left_crop_win.width(), left_crop_win.height()); for (int col = 0; col < unaligned_disp_2d.cols(); col++) { for (int row = 0; row < unaligned_disp_2d.rows(); row++) { Vector2 left_pix(col, row); Vector2 left_trans_pix = left_align_trans.forward(left_pix); PixelMask interp_disp = interp_aligned_disp_1d(left_trans_pix.x(), left_trans_pix.y()); if (!is_valid(interp_disp)) { unaligned_disp_2d(col, row) = PixelMask(); unaligned_disp_2d(col, row).invalidate(); continue; } // Since the disparity is 1D, the y value (row) is the same // as for the input. Vector2 right_trans_pix(left_trans_pix.x() + interp_disp.child(), left_trans_pix.y()); // Undo the transform Vector2 right_pix = right_align_trans.reverse(right_trans_pix); // Un-transformed disparity Vector2 disp_pix = right_pix - left_pix; // Adjust for the fact that the two tiles before alignment // were crops from larger images disp_pix += (right_crop_win.min() - left_crop_win.min()); unaligned_disp_2d(col, row).child() = Vector2f(disp_pix.x(), disp_pix.y()); unaligned_disp_2d(col, row).validate(); } } } // Go from 2D disparity of images with affine epipolar alignment to the 2D // disparity by undoing the transforms that applied this alignment. void unalign_2d_disparity(// Inputs vw::ImageView> const& aligned_disp_2d, vw::BBox2i const& left_crop_win, vw::BBox2i const& right_crop_win, vw::math::Matrix const& left_align_mat, vw::math::Matrix const& right_align_mat, // Output vw::ImageView> & unaligned_disp_2d) { vw::HomographyTransform left_align_trans (left_align_mat); vw::HomographyTransform right_align_trans(right_align_mat); PixelMask nodata_pix; nodata_pix.invalidate(); // TODO(oalexan1): Here bilinear interpolation is used. This will // make the holes a little bigger where there is no data. Need // to figure out if it is desired to fill holes. ImageViewRef> interp_aligned_disp_2d = interpolate(aligned_disp_2d, BilinearInterpolation(), ValueEdgeExtension>(nodata_pix)); unaligned_disp_2d.set_size(left_crop_win.width(), left_crop_win.height()); for (int col = 0; col < unaligned_disp_2d.cols(); col++) { for (int row = 0; row < unaligned_disp_2d.rows(); row++) { Vector2 left_pix(col, row); Vector2 left_trans_pix = left_align_trans.forward(left_pix); PixelMask interp_disp = interp_aligned_disp_2d(left_trans_pix.x(), left_trans_pix.y()); if (!is_valid(interp_disp)) { unaligned_disp_2d(col, row) = PixelMask(); unaligned_disp_2d(col, row).invalidate(); continue; } // Do the math with doubles rather than with floats, so cast // Vector2f to Vector2. Vector2 right_trans_pix = left_trans_pix + Vector2(interp_disp.child()); // Undo the transform Vector2 right_pix = right_align_trans.reverse(right_trans_pix); // Un-transformed disparity Vector2 disp_pix = right_pix - left_pix; // Adjust for the fact that the two tiles before alignment // were crops from larger images disp_pix += (right_crop_win.min() - left_crop_win.min()); unaligned_disp_2d(col, row).child() = Vector2f(disp_pix.x(), disp_pix.y()); unaligned_disp_2d(col, row).validate(); } } } // Given an image in one-to-one correspondence with an aligned left image, // find its corresponding version for the unaligned left image. // disparity by undoing the transforms that applied this alignment. void unalign_masked_image(// Inputs vw::ImageView> const& aligned_image, vw::BBox2i const& left_crop_win, vw::math::Matrix const& left_align_mat, // Output vw::ImageView> & unaligned_image) { vw::HomographyTransform left_align_trans(left_align_mat); PixelMask nodata_pix; nodata_pix.invalidate(); // TODO(oalexan1): Here bilinear interpolation is used. This will // make the holes a little bigger where there is no data. Need // to figure out if it is desired to fill holes. ImageViewRef> interp_aligned_image = interpolate(aligned_image, BilinearInterpolation(), ValueEdgeExtension>(nodata_pix)); unaligned_image.set_size(left_crop_win.width(), left_crop_win.height()); for (int col = 0; col < unaligned_image.cols(); col++) { for (int row = 0; row < unaligned_image.rows(); row++) { Vector2 left_pix(col, row); Vector2 left_trans_pix = left_align_trans.forward(left_pix); PixelMask interp_val = interp_aligned_image(left_trans_pix.x(), left_trans_pix.y()); unaligned_image(col, row) = interp_val; } } } // Read the list of external stereo programs (plugins) and extract // the path to each such plugin and its library dependencies. void parse_plugins_list(std::map & plugins, std::map & plugin_libs) { // Wipe the outputs plugins.clear(); plugin_libs.clear(); // The plugins are stored in ISISROOT as they are installed with conda. // Needed env variables, including ISISROOT, are set in stereo_corr. // But note that the plugin list is in the ASP install dir, and // not in ISISROOT. This only makes a difference in dev mode. char * isis_root = getenv("ISISROOT"); if (isis_root == NULL) vw_throw(vw::ArgumentErr() << "The variable ISISROOT was not set.\n"); // Get the path to the plugins from the path of the ASP stereo_corr // executable asking for it. std::string base_path = boost::dll::program_location().parent_path().parent_path().string(); std::string plugin_list = base_path + "/plugins/stereo" + "/plugin_list.txt"; std::ifstream handle; handle.open(plugin_list.c_str()); if (handle.fail()) vw_throw(vw::IOErr() << "Unable to open file \"" << plugin_list << "\""); vw::vw_out() << "Reading plugin list: " << plugin_list << "\n"; std::string line; while (getline(handle, line, '\n')) { if (line.size() == 0 || line[0] == '#') continue; // skip comment and empty line std::string plugin_name, plugin_path, plugin_lib; std::istringstream is(line); // Extract the plugin name and path if (!(is >> plugin_name >> plugin_path)) continue; // Make the plugin name lower-case, but not the rest of the values boost::to_lower(plugin_name); // Make plugin_path absolute, if need be if (plugin_path.size() > 0 && plugin_path[0] != '/') plugin_path = std::string(isis_root) + "/" + plugin_path; // Read the user-set library path is >> plugin_lib; if (plugin_lib != "") plugin_lib += ":"; // Append the isis lib path plugin_lib += std::string(isis_root) + "/lib"; // Split by colon in case there are multiple libraries std::vector plugin_libs_vec; boost::split(plugin_libs_vec, plugin_lib, boost::is_any_of(":")); // Make each relative path into an absolute path for (size_t it = 0; it < plugin_libs_vec.size(); it++) { if (plugin_libs_vec[it].size() > 0 && plugin_libs_vec[it][0] != '/') plugin_libs_vec[it] = std::string(isis_root) + "/" + plugin_libs_vec[it]; } // Concatenate back plugin_lib = boost::algorithm::join(plugin_libs_vec, ":"); plugins[plugin_name] = plugin_path; plugin_libs[plugin_name] = plugin_lib; } return; } // Given a string like "mgm -O 8 -s vfit", separate the name, // which is the first word, from the options, which is the rest. void parse_stereo_alg_name_and_opts(std::string const& stereo_alg, std::string & alg_name, std::string & alg_opts) { std::istringstream iss(stereo_alg); if (!(iss >> alg_name)) vw_throw(vw::ArgumentErr() << "Cannot parse the stereo algorithm from string: " << stereo_alg << ".\n"); alg_opts = ""; std::string val; while (iss >> val) alg_opts += val + " "; // Make the algorithm name lower-case, but not the options boost::to_lower(alg_name); } // Return true for an option name, which is a dash followed by a non-integer bool is_option_name(std::string const& val) { return (val.size() >= 2 && val[0] == '-' && (val[1] < '0' || val[1] > '9')); } // Return true if looking at a string having an equal sign bool is_env_var_and_val(std::string const& val) { for (size_t it = 0; it < val.size(); it++) if (val[it] == '=') return true; return false; } // Remove spaces at the end void rm_trailing_whitespace(std::string & val) { while (val.size() > 0 && (val.back() == ' ' || val.back() == '\t')) val.pop_back(); } // From A=b extract A as the name, and b as he value void get_env_var_name_and_val(std::string const& in, std::string & name, std::string & val) { name = ""; val = ""; bool found_equal = false; for (size_t it = 0; it < in.size(); it++) { if (in[it] == '=') { found_equal = true; continue; } if (!found_equal) name += in[it]; else val += in[it]; } if (name == "" || val == "") vw_throw(vw::ArgumentErr() << "Could not extract name and value from string: " << in << ".\n"); } // Put option-value pairs in a string. Respect the order given by pos_to_opt. std::string concatenate_optons(std::map const& opt_map, std::map const& pos_to_opt, std::string const& sep) { std::string out; for (auto it = pos_to_opt.begin(); it != pos_to_opt.end(); it++) { std::string const& opt = it->second; // alias auto it2 = opt_map.find(opt); if (it2 == opt_map.end()) continue; out += it2->first + sep + it2->second + " "; } rm_trailing_whitespace(out); return out; } // Given an input string having algorithm options, like "-v 4", and // environmental variables, like "VAL=5", possibly with repetitions, // so VAL=5 and VAL=6 can both be present, separate the two kinds // and remove the repetitions by keeping the values later in the // string. Do not allow any input character except letters, numbers, // space, period, underscore, plus, minus, and equal signs, for // security purposes. void extract_opts_and_env_vars(std::string const& input_str, std::string & options, std::map & option_map, std::string & env_vars, std::map & env_vars_map) { options = ""; env_vars = ""; option_map.clear(); env_vars_map.clear(); // Input validation for (size_t it = 0; it < input_str.size(); it++) { if (std::isalnum(input_str[it]) || input_str[it] == ' ' || input_str[it] == '\t' || input_str[it] == '_' || input_str[it] == '+' || input_str[it] == '-' || input_str[it] == '=' || input_str[it] == '.') continue; vw_throw(vw::ArgumentErr() << "Only the alphanumeric and ' ', '_', '-', '+', '=', '.' " << "characters are allowed as part of the stereo options. Got: " << input_str[it] << ".\n"); } // Tokenize the inputs std::vector tokens; std::istringstream iss(input_str); std::string val; while (iss >> val) tokens.push_back(val); // Ensure that the order is the same as in the input If // an item shows up twice in the input, keep the position of the // first occurrence. std::map opt_to_pos; std::map pos_to_opt; for (size_t it = 0; it < tokens.size(); it++) { std::string const& token = tokens[it]; if (is_env_var_and_val(token)) { // Is an env variable, A=b, like for MGM std::string name, val; get_env_var_name_and_val(token, name, val); env_vars_map[name] = val; if (opt_to_pos.find(name) == opt_to_pos.end()) { // First time it is encountered opt_to_pos[name] = it; pos_to_opt[it] = name; } } else { // Must be an option, like -v 3. if (!is_option_name(token)) vw_throw(vw::ArgumentErr() << "Expecting an option, so something starting " << "with a dash. Got: " << token << ".\n"); if (opt_to_pos.find(token) == opt_to_pos.end()) { // First time it is encountered opt_to_pos[token] = it; pos_to_opt[it] = token; } // All the tokens that follow and which are not options or env // vars must be values for this option std::string val = ""; for (size_t it2 = it + 1; it2 < tokens.size(); it2++) { if (is_option_name(tokens[it2]) || is_env_var_and_val(tokens[it2])) { // This token is not a value, so have to stop this inner // loop. Note how we modify the counter 'it' of the outer // loop so we revisit tokens[it2] in that loop. it = it2 - 1; break; } // Concatenate all the values val += tokens[it2] + " "; // Note how we modify the outer loop counter 'it'. It will // be incremented further as soon as we go to the outer // loop, so that loop will not examine tokens[it2] with which // we just dealt. Without this line one runs into a bug if // it2 is tokens.size() - 1 as the modification of 'it' // further up does not kick in. it = it2; } rm_trailing_whitespace(val); if (!val.empty()) option_map[token] = val; else option_map[token] = "1"; // if an option has no value treat it as a boolean } } // Now that the repeated options have been collapsed, put these back in strings options = concatenate_optons(option_map, pos_to_opt, " "); env_vars = concatenate_optons(env_vars_map, pos_to_opt, "="); } // Call the OpenCV BM or SGBM algorithm void call_opencv_bm_or_sgbm(std::string const& left_file, std::string const& right_file, std::string const& mode, // bm or a flavor of sgbm int block_size, int min_disp, int max_disp, int prefilter_cap, int uniqueness_ratio, int speckle_size, int speckle_range, int disp12_diff, int texture_thresh, // only for BM int P1, // only for SGBM int P2, // only for SGBM ASPGlobalOptions const& opt, std::string const& disparity_file, // Output vw::ImageView & out_disp) { DiskImageView left(left_file); DiskImageView right(right_file); cv::Mat left_cv, right_cv; asp::formScaledByteCVImage(left, left_cv); asp::formScaledByteCVImage(right, right_cv); // Create the bm and sgbm objects. Their parameters will be overwritten later. cv::Ptr bm = cv::StereoBM::create(16, 9); cv::Ptr sgbm = cv::StereoSGBM::create(0, 16, 3); if (block_size < 1 || block_size % 2 != 1) vw_throw(ArgumentErr() << "The block size must be positive and odd.\n"); int num_disp = (int) 16 * ceil((max_disp - min_disp) / 16.0); // Set BM parameters bm->setBlockSize(block_size); bm->setMinDisparity(min_disp); bm->setNumDisparities(num_disp); bm->setTextureThreshold(texture_thresh); bm->setPreFilterCap(prefilter_cap); bm->setUniquenessRatio(uniqueness_ratio); bm->setSpeckleWindowSize(speckle_size); bm->setSpeckleRange(speckle_range); bm->setDisp12MaxDiff(disp12_diff); // Set SGBM parameters int cn = 1; // Number of channels sgbm->setBlockSize(block_size); sgbm->setMinDisparity(min_disp); sgbm->setNumDisparities(num_disp); sgbm->setP1(P1*cn*block_size*block_size); sgbm->setP2(P2*cn*block_size*block_size); sgbm->setPreFilterCap(prefilter_cap); sgbm->setUniquenessRatio(uniqueness_ratio); sgbm->setSpeckleWindowSize(speckle_size); sgbm->setSpeckleRange(speckle_range); sgbm->setDisp12MaxDiff(disp12_diff); vw_out() << "Running OpenCV correlation with " << "-mode " << mode << " " << "-block_size " << block_size << " " << "-P1 " << P1 << " " << "-P2 " << P2 << " " << "-prefilter_cap " << prefilter_cap << " " << "-uniqueness_ratio " << uniqueness_ratio << " " << "-speckle_size " << speckle_size << " " << "-speckle_range " << speckle_range << " " << "-disp12_diff " << disp12_diff << " " << "--texture_thresh " << texture_thresh << std::endl; if (mode == "bm") { // Nothing to do here } else if (mode == "hh") { sgbm->setMode(cv::StereoSGBM::MODE_HH); } else if (mode == "sgbm") { sgbm->setMode(cv::StereoSGBM::MODE_SGBM); } else if (mode == "3way") { sgbm->setMode(cv::StereoSGBM::MODE_SGBM_3WAY); } else { vw_throw(ArgumentErr() << "Unknown OpenCV stereo mode: " << mode << ".\n"); } // Expand the image with padding, or else OpenCV crops the output // disparity, oddly enough. Idea copied from S2P in sgbm.cpp. // Copyright (c) 2012-2024, Gabriele Facciolo // This program is free software: you can use, modify and/or redistribute it // under the terms of the simplified BSD License. You should have received a // copy of this license along this program. If not, see // . float nan = std::numeric_limits::quiet_NaN(); int pad1 = std::max(max_disp, 0), pad2 = std::max(-min_disp, 0); cv::Mat left_cv_extra(left_cv.rows, left_cv.cols + pad1 + pad2, left_cv.type(), cv::Scalar(nan)); cv::Mat right_cv_extra(right_cv.rows, right_cv.cols + pad1 + pad2, right_cv.type(), cv::Scalar(nan)); asp::cvInsertBlock(left_cv, pad1, 0, left_cv_extra); asp::cvInsertBlock(right_cv, pad1, 0, right_cv_extra); cv::Mat disp, disp_extra; // Do the correlation if (mode == "bm") { bm->compute(left_cv_extra, right_cv_extra, disp_extra); } else if (mode == "hh" || mode == "sgbm" || mode == "3way") { sgbm->compute(left_cv_extra, right_cv_extra, disp_extra); } // Crop the disparity to remove the padding disp = disp_extra(cv::Range::all(), cv::Range(pad1, pad1 + left_cv.cols)); // Copy to ASP's format and handle no-data vw::ImageView asp_disp; asp_disp.set_size(disp.cols, disp.rows); for (int row = 0; row < disp.rows; row++) { for (int col = 0; col < disp.cols; col++) { if (disp.at(row, col) == -16*(-min_disp+1)) { // Convert from the OpenCV no-data value to NaN asp_disp(col, row) = nan; } else { // sgbm output disparity map is a 16-bit signed single-channel // image of the same size as the input image. It contains // disparity values scaled by 16. So, to get the floating-point // disparity map, you need to divide each disp element by 16. asp_disp(col, row) = -((float) disp.at(row, col)) / 16.0; } // Where the input image is nan, make the disparity nan too, // removing some sgbm artifacts if (std::isnan(left(col, row))) asp_disp(col, row) = nan; } } // Write the disparity to disk vw::cartography::GeoReference georef; bool has_georef = false; bool has_nodata = true; vw_out() << "Writing: " << disparity_file << "\n"; vw::cartography::block_write_gdal_image(disparity_file, asp_disp, has_georef, georef, has_nodata, nan, opt, TerminalProgressCallback ("asp", "\t--> Disparity :")); // Assign the disparity to the output variable (this should not do a copy). out_disp = asp_disp; } } // namespace asp ================================================ FILE: src/asp/Core/LocalAlignment.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file LocalAlignment.h /// #ifndef __LOCAL_ALIGNMENT_H__ #define __LOCAL_ALIGNMENT_H__ #include #include #include #include // Forward declarations namespace vw { namespace camera { class CameraModel; } namespace cartography { class Datum; } } namespace asp { // Algorithm to perform local alignment. Approach: // - Given the global interest points and the left crop window, find // the right crop window. // - Crop the globally aligned images to these crop windows and find // the interest points for the crops // - Use the interest points to find the local alignment // - Apply the composition of the global and local alignment to the // original unaligned images to find the locally aligned images // - Save the locally aligned images to disk // - Estimate the search range for the locally aligned images class ASPGlobalOptions; // forward declaration void local_alignment(// Inputs ASPGlobalOptions const & opt, std::string const & alg_name, std::string const & session_name, int max_tile_size, double left_extra_factor, double right_extra_factor, vw::BBox2i const & tile_crop_win, bool write_nodata, vw::camera::CameraModel const * left_camera_model, vw::camera::CameraModel const * right_camera_model, vw::cartography::Datum const & datum, // Outputs vw::BBox2i & left_trans_crop_win, vw::BBox2i & right_trans_crop_win, vw::Matrix & left_local_mat, vw::Matrix & right_local_mat, std::string & left_aligned_file, std::string & right_aligned_file, int & min_disp, int & max_disp); // Go from 1D disparity of images with affine epipolar alignment to the 2D // disparity by undoing the transforms that applied this alignment. void unalign_1d_disparity(// Inputs vw::ImageViewRef aligned_disp_1d, vw::BBox2i const& left_crop_win, vw::BBox2i const& right_crop_win, vw::math::Matrix const& left_align_mat, vw::math::Matrix const& right_align_mat, // Output vw::ImageView> & unaligned_disp_2d); // Go from 2D disparity of images with affine epipolar alignment to the 2D // disparity by undoing the transforms that applied this alignment. void unalign_2d_disparity(// Inputs vw::ImageView> const& aligned_disp_2d, vw::BBox2i const& left_crop_win, vw::BBox2i const& right_crop_win, vw::math::Matrix const& left_align_mat, vw::math::Matrix const& right_align_mat, // Output vw::ImageView> & unaligned_disp_2d); // Given an image in one-to-one correspondence with an aligned left image, // find its corresponding version for the unaligned left image. // disparity by undoing the transforms that applied this alignment. void unalign_masked_image(// Inputs vw::ImageView> const& aligned_image, vw::BBox2i const& left_crop_win, vw::math::Matrix const& left_align_mat, // Output vw::ImageView> & unaligned_image); vw::BBox2i grow_box_to_square(vw::BBox2i const& box, int max_size); // Read the list of external stereo programs (plugins) and extract // the path to each such plugin and its library dependencies. void parse_plugins_list(std::map & plugins, std::map & plugin_libs); // Given a string like "mgm -O 8 -s vfit", separate the name, // which is the first word, from the options, which is the rest. void parse_stereo_alg_name_and_opts(std::string const& stereo_alg, std::string & alg_name, std::string & alg_opts); // Given an input string having algorithm options, like "-v 4", and // environmental variables, like "VAL=5", possibly with repetitions, // so VAL=5 and VAL=6 can both be present, separate the two kinds // and remove the repetitions by keeping the values later in the // string. Do not allow any input character except letters, numbers, // space, period, underscore, plus, minus, and equal signs, for // security purposes. void extract_opts_and_env_vars(std::string const& input_str, std::string & options, std::map & option_map, std::string & env_vars, std::map & env_vars_map); // Call the OpenCV BM or SGBM algorithm void call_opencv_bm_or_sgbm(std::string const& left_file, std::string const& right_file, std::string const& mode, // bm or a flavor of sgbm int block_size, int min_disp, int max_disp, int prefilter_cap, int uniqueness_ratio, int speckle_size, int speckle_range, int disp12_diff, int texture_thresh, // only for BM int P1, // only for SGBM int P2, // only for SGBM ASPGlobalOptions const& opt, std::string const& disparity_file, // Output vw::ImageView & out_disp); } // end namespace asp #endif // __LOCAL_ALIGNMENT_H__ ================================================ FILE: src/asp/Core/Macros.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file Macros.h /// #ifndef __ASP_CORE_MACROS_H__ #define __ASP_CORE_MACROS_H__ #define ASP_STANDARD_CATCHES \ catch (const vw::ArgumentErr& e) { \ vw::vw_out() << "\n\nERROR: " << e.what() << "\n\n"; \ return 1; \ } catch (const vw::Exception& e) { \ std::cerr << "\n\nERROR: " << e.what() << "\n\n"; \ return 1; \ } catch (const std::bad_alloc& e) { \ std::cerr << "\n\nERROR: Ran out of memory!\n\n"; \ return 1; \ } catch (const std::exception& e) { \ std::cerr << "\n\nERROR: " << e.what() << "\n\n"; \ return 1; \ } #endif//__ASP_CORE_MACROS_H__ ================================================ FILE: src/asp/Core/MatchList.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include using namespace vw; namespace asp { void MatchList::throwIfNoPoint(size_t image, size_t point) const { if ((image >= m_matches.size()) || (point >= m_matches[image].size())) vw_throw(ArgumentErr() << "IP " << image << ", " << point << " does not exist!\n"); } void MatchList::resize(size_t num_images) { m_matches.resize(num_images); m_valid_matches.resize(num_images); } bool MatchList::addPoint(size_t image, vw::ip::InterestPoint const &pt, bool valid) { if (image >= m_matches.size()) return false; // We will start with an interest point in the left-most image, // and add matches to it in the other images. // At any time, an image to the left must have no fewer ip than // images on the right. Upon saving, all images must // have the same number of interest points. size_t curr_pts = m_matches[image].size(); // # Pts from current image bool is_good = true; for (size_t i = 0; i < image; i++) { // Look through lower-id images if (m_matches[i].size() < curr_pts+1) { is_good = false; } } // Check all higher-id images, they should have the same # Pts as this one. for (size_t i = image+1; i < m_matches.size(); i++) { if (m_matches[i].size() > curr_pts) { is_good = false; } } if (!is_good) return false; m_matches[image].push_back(pt); m_valid_matches[image].push_back(true); return true; } size_t MatchList::getNumImages() const { return m_matches.size(); } size_t MatchList::getNumPoints(size_t image) const { if (m_matches.empty()) return 0; return m_matches[image].size(); } vw::ip::InterestPoint const& MatchList::getPoint(size_t image, size_t point) const { throwIfNoPoint(image, point); return m_matches[image][point]; } vw::Vector2 MatchList::getPointCoord(size_t image, size_t point) const { throwIfNoPoint(image, point); return vw::Vector2(m_matches[image][point].x, m_matches[image][point].y); } bool MatchList::pointExists(size_t image, size_t point) const { return ((image < m_matches.size()) && (point < m_matches[image].size())); } bool MatchList::isPointValid(size_t image, size_t point) const { throwIfNoPoint(image, point); return m_valid_matches[image][point]; } void MatchList::setPointValid(size_t image, size_t point, bool newValue) { throwIfNoPoint(image, point); m_valid_matches[image][point] = newValue; } void MatchList::setPointPosition(size_t image, size_t point, float x, float y) { throwIfNoPoint(image, point); m_matches[image][point].x = x; m_matches[image][point].y = y; } int MatchList::findNearestMatchPoint(size_t image, vw::Vector2 P, double distLimit) const { if (image >= m_matches.size()) return -1; double min_dist = std::numeric_limits::max(); if (distLimit > 0) min_dist = distLimit; int min_index = -1; std::vector const& ip = m_matches[image]; // alias for (size_t ip_iter = 0; ip_iter < ip.size(); ip_iter++) { Vector2 Q(ip[ip_iter].x, ip[ip_iter].y); double curr_dist = norm_2(Q-P); if (curr_dist < min_dist) { min_dist = curr_dist; min_index = ip_iter; } } return min_index; } void MatchList::deletePointsForImage(size_t image) { if (image >= m_matches.size()) vw_throw(ArgumentErr() << "Image " << image << " does not exist!\n"); m_matches.erase (m_matches.begin() + image); m_valid_matches.erase(m_valid_matches.begin() + image); } bool MatchList::deletePointAcrossImages(size_t point) { // Sanity checks if (point >= getNumPoints()) vw::vw_throw(ArgumentErr() << "Requested point for deletion does not exist!"); for (size_t i = 0; i < m_matches.size(); i++) { if (m_matches[0].size() != m_matches[i].size()) { vw_throw(vw::ArgumentErr() << "Cannot delete matches. Must have the same number of " << "matches in each image.\n"); } } for (size_t vec_iter = 0; vec_iter < m_matches.size(); vec_iter++) { m_matches[vec_iter].erase(m_matches[vec_iter].begin() + point); m_valid_matches[vec_iter].erase(m_valid_matches[vec_iter].begin() + point); } return true; } bool MatchList::allPointsValid() const { if (m_valid_matches.size() != m_matches.size()) vw_throw(LogicErr() << "Valid matches out of sync with matches!\n"); for (size_t i = 0; i < m_matches.size(); i++) { if (m_matches[0].size() != m_matches[i].size()) return false; for (size_t j = 0; j < m_valid_matches[i].size(); j++) { if (!m_valid_matches[i][j]) return false; } } return true; } bool MatchList::loadPointsFromGCPs(std::string const gcpPath, std::vector const& imageNames) { using namespace vw::ba; if (getNumPoints() > 0) // Can't double-load points! return false; // Reset and resize *this = MatchList(); int num_images = imageNames.size(); this->resize(num_images); ControlNetwork cnet("gcp"); cnet.get_image_list() = imageNames; std::vector gcp_files; gcp_files.push_back(gcpPath); // The actual datum does not matter here as the GCP will not be edited or processed bool skip_datum_check = true; vw::cartography::Datum datum; try { add_ground_control_points(cnet, gcp_files, datum, skip_datum_check); } catch (...) { // Do not complain if the GCP file does not exist. Maybe we want to create it. return true; } CameraRelationNetwork crn; crn.from_cnet(cnet); typedef CameraNode::iterator crn_iter; if (crn.size() != num_images && crn.size() != 0) vw_throw(ArgumentErr() << "The number of images in the control network does not " << "agree with the number of images to view.\n"); // Load in all of the points for (size_t icam = 0; icam < crn.size(); icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { Vector2 observation = (**fiter).m_location; vw::ip::InterestPoint ip(observation.x(), observation.y()); m_matches[icam].push_back(ip); m_valid_matches[icam].push_back(true); } } // If any of the sizes do not match, reset everything! for (size_t icam = 0; icam < crn.size(); icam++) { if (m_matches[0].size() != m_matches[icam].size()) { *this = MatchList(); // reset resize(num_images); // use the correct size vw::vw_throw(ArgumentErr() << "Each GCP must be represented as a pixel in each image.\n"); } } return true; } bool MatchList::loadPointsFromVwip(std::vector const& vwipFiles, std::vector const& imageNames) { using namespace vw::ba; if (getNumPoints() > 0) // Can't double-load points! return false; // Reset and resize *this = MatchList(); size_t num_images = imageNames.size(); this->resize(num_images); // Load in all of the points for (size_t i = 0; i < num_images; ++i) { //std::vector ip; m_matches[i] = vw::ip::read_binary_ip_file(vwipFiles[i]); // Keep the valid matches synced up size_t num_pts = m_matches[i].size(); m_valid_matches[i].resize(num_pts); for (size_t j=0; j= getNumImages()) return; const size_t num_ip = m_matches[image].size(); m_valid_matches[image].resize(num_ip); for (size_t i=0; i const& image_files, std::string const& output_prefix, std::string const& first_match_file, bool matches_as_txt, // Outputs std::vector & matchFiles, std::vector & leftIndices, bool & matchfiles_found) { int num_images = image_files.size(); // Populate the outputs matchFiles.resize(num_images-1); leftIndices.resize(num_images-1); matchfiles_found = true; // if we fail, will be set to false std::string trial_match = ""; int leftIndex = 0; std::vector left, right; // local variables for (size_t i = 1; i < image_files.size(); i++) { // Handle user-provided match file for two images if ((first_match_file != "") && (image_files.size() == 2)) { matchFiles [0] = first_match_file; leftIndices[0] = 0; break; } // Look for the match file in the default location, and if it // does not appear prompt the user or a path. // Look in default location 1, match from previous file to this file. try { trial_match = vw::ip::match_filename(output_prefix, image_files[i-1], image_files[i], matches_as_txt); leftIndex = i - 1; vw::ip::read_match_file(trial_match, left, right, matches_as_txt); vw::vw_out() << "Read " << left.size() << " matches from " << trial_match << "\n"; } catch(...) { // Look in default location 2, match from first file to this file. try { trial_match = vw::ip::match_filename(output_prefix, image_files[0], image_files[i], matches_as_txt); leftIndex = 0; vw::ip::read_match_file(trial_match, left, right, matches_as_txt); vw::vw_out() << "Read " << left.size() << " matches from " << trial_match << "\n"; } catch(...) { // Default locations failed, Start with a blank match file. trial_match = vw::ip::match_filename(output_prefix, image_files[i-1], image_files[i], matches_as_txt); matchfiles_found = false; leftIndex = i-1; } } matchFiles [i-1] = trial_match; leftIndices[i-1] = leftIndex; } // End loop looking for match files } // Populate from two vectors of interest point matches void MatchList::populateFromIpPair(std::vector const& ip1, std::vector const& ip2) { if (ip1.size() != ip2.size()) vw_throw(ArgumentErr() << "The two interest point vectors must have the same size.\n"); // Reset and resize *this = MatchList(); resize(2); m_matches[0] = ip1; m_matches[1] = ip2; setIpValid(0); setIpValid(1); } bool MatchList::loadPointsFromMatchFiles(std::vector const& matchFiles, std::vector const& leftIndices, bool matches_as_txt) { // Count IP as in the same location if x and y are at least this close. const float ALLOWED_POS_DIFF = 0.5; // Can't double-load points! if ((getNumPoints() > 0) || (matchFiles.empty())) return false; const size_t num_images = matchFiles.size() + 1; // Make sure we have the right number of match files if ((matchFiles.size() != leftIndices.size())) return false; resize(0); // wipe first resize(num_images); // Loop through all of the matches size_t num_ip = 0; for (size_t i = 1; i < num_images; i++) { std::string match_file = matchFiles [i-1]; size_t j = leftIndices[i-1]; // Initialize all matches as invalid m_matches [i].resize(num_ip); m_valid_matches[i].resize(num_ip); for (size_t v = 0; v < num_ip; v++) { m_matches [i][v].x = v*10; // TODO: Better way to spread these IP? m_matches [i][v].y = v*10; m_valid_matches[i][v] = false; } std::vector left, right; try { vw_out() << "Reading match file: " << match_file << "\n"; ip::read_match_file(match_file, left, right, matches_as_txt); vw::vw_out() << "Read " << left.size() << " matches.\n"; } catch(...) { vw_out() << "IP load failed, leaving default invalid IP\n"; continue; } if (i == 1) { // The first case is easy m_matches[0] = left; m_matches[1] = right; setIpValid(0); setIpValid(1); num_ip = left.size(); // The first image sets the number of IP continue; } // For other cases, we need to isolate the same IP in the left image. // Loop through the ip in the "left" image size_t count = 0; for (size_t pnew=0; pnew const& imageNames, std::string const& match_file, bool matches_as_txt) const { if (!allPointsValid() || (imageNames.size() != m_matches.size())) vw::vw_throw(vw::ArgumentErr() << "Cannot write match files, not all points are valid.\n"); const size_t num_image_files = imageNames.size(); bool success = true; for (size_t i = 0; i < num_image_files; i++) { // Save both i to j matches and j to i matches if there are more than two images. // This is useful for SfS, though it is a bit of a hack. size_t beg = i + 1; if (num_image_files > 2) beg = 0; for (size_t j = beg; j < num_image_files; j++) { if (i == j) continue; // don't save i <-> i matches std::string output_path = vw::ip::match_filename(prefix, imageNames[i], imageNames[j], matches_as_txt); if ((num_image_files == 2) && (match_file != "")) output_path = match_file; try { vw_out() << "Writing: " << output_path << "\n"; ip::write_match_file(output_path, m_matches[i], m_matches[j], matches_as_txt); } catch(...) { vw::vw_throw(vw::ArgumentErr() << "Failed to save match file: " << output_path << ".\n"); } } } return success; } } // namespace asp ================================================ FILE: src/asp/Core/MatchList.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file MatchList.h /// /// Interest point matching logic. Used in the GUI. /// #ifndef __ASP_CORE_MATCHLIST_H__ #define __ASP_CORE_MATCHLIST_H__ // Vision Workbench #include #include #include #include #include #include #include namespace asp { /// Helper class to keep track of all the matching interest points /// - Each image must have the same number of interest points /// but in some situations some of the points can be flagged as invalid. // Populate the match files and leftIndices vectors void populateMatchFiles(std::vector const& image_files, std::string const& output_prefix, std::string const& first_match_file, bool matches_as_txt, // Outputs std::vector & matchFiles, std::vector & leftIndices, bool & matchfiles_found); class MatchList { public: /// Clear all exiting points and set up for a new image count. void resize(size_t num_images); /// Add a single point to the list. /// - Points must be added in order, low index to high index. /// - Returns false if the point could not be added. bool addPoint(size_t image, vw::ip::InterestPoint const &pt, bool valid=true); /// Return the number of images. size_t getNumImages() const; /// Return the number of points (usually but not always the same in each image). size_t getNumPoints(size_t image=0) const; /// Get a handle to a specific IP. vw::ip::InterestPoint const& getPoint(size_t image, size_t point) const; /// Returns the x/y coordinate of a point. vw::Vector2 getPointCoord(size_t image, size_t point) const; /// Return true if the point exists (valid or invalid) bool pointExists(size_t image, size_t point) const; /// Return true if a point is valid. bool isPointValid(size_t image, size_t point) const; /// Set the validity of a point. void setPointValid(size_t image, size_t point, bool newValue=true); /// Change the position of an interest point. void setPointPosition(size_t image, size_t point, float x, float y); /// Return the index of the nearest match point to the given pixel. /// - Returns -1 if no match was found. /// - If distLimit is set, return -1 if best match distance is over the limit. int findNearestMatchPoint(size_t image, vw::Vector2 P, double distLimit) const; /// Delete all IP for an image. void deletePointsForImage(size_t image); /// Delete the same IP in each image. bool deletePointAcrossImages(size_t point); /// Returns true if all points are valid and none are missing. bool allPointsValid() const; /// Try to load all of the points from match files on disk. /// - The match files correspond to files 0 < i < N and leftIndices /// contains the index of the other file they match to (0 or i-1). /// - Any points that cannot be loaded will be flagged as invalid. /// - Return the number of points loaded, or -1 for failure. bool loadPointsFromMatchFiles(std::vector const& matchFiles, std::vector const& leftIndices, bool matches_as_txt); /// Try to load the interest points from a GCP file. bool loadPointsFromGCPs(std::string const gcpPath, std::vector const& imageNames); /// Try to load the interest points from vwip files. bool loadPointsFromVwip(std::vector const& vwipFiles, std::vector const& imageNames); // Populate from two vectors of interest point matches void populateFromIpPair(std::vector const& ip1, std::vector const& ip2); /// Write all points out using a given prefix. bool savePointsToDisk(std::string const& prefix, std::vector const& imageNames, std::string const& match_file, bool matches_as_txt) const; private: /// Throw an exception if the specified point does not exist. void throwIfNoPoint(size_t image, size_t point) const; /// Set all IP for the image as valid. void setIpValid(size_t image); /// A set of interest points for each input image /// - There is always one set of matched interest points shared among all images. /// - The only way the counts can differ is if the user is in the process of manually /// adding an interest point to the images. /// - The length of the outer vector is equal to the number of MainWidget objects std::vector> m_matches; /// Stay synced with m_matches, set to false if that match is not std::vector> m_valid_matches; }; // End class MatchList } // namespace asp #endif // __ASP_CORE_MATCHLIST_H__ ================================================ FILE: src/asp/Core/Nvm.cc ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace asp { // Reads the NVM control network format. This function does not apply // the optical offsets. Use instead the function that does. void readNvm(std::string const & input_filename, std::vector & cid_to_keypoint_map, std::vector & cid_to_filename, std::vector> & pid_to_cid_fid, std::vector & pid_to_xyz, std::vector & world_to_cam, std::vector & focal_lengths) { vw::vw_out() << "Reading: " << input_filename << "\n"; std::ifstream f(input_filename, std::ios::in); std::string token; std::getline(f, token); // Assert that we start with our NVM token if (token.compare(0, 6, "NVM_V3") != 0) { vw::vw_throw(vw::ArgumentErr() << "File doesn't start with NVM token."); } // Read the number of cameras ptrdiff_t number_of_cid; f >> number_of_cid; if (number_of_cid < 1) vw::vw_throw(vw::ArgumentErr() << "NVM file is missing cameras."); // Resize all our structures to support the number of cameras we now expect cid_to_keypoint_map.resize(number_of_cid); cid_to_filename.resize(number_of_cid); world_to_cam.resize(number_of_cid); focal_lengths.resize(number_of_cid); for (ptrdiff_t cid = 0; cid < number_of_cid; cid++) { // Clear keypoints from map. We'll read these in shortly cid_to_keypoint_map.at(cid).resize(Eigen::NoChange_t(), 2); // Read the line that contains camera information std::string image_name; double focal, dist1, dist2; Eigen::Quaterniond q; Eigen::Vector3d c; f >> image_name >> focal; f >> q.w() >> q.x() >> q.y() >> q.z(); f >> c[0] >> c[1] >> c[2] >> dist1 >> dist2; cid_to_filename.at(cid) = image_name; focal_lengths.at(cid) = focal; // Solve for t, which is part of the affine transform Eigen::Matrix3d r = q.matrix(); world_to_cam.at(cid).linear() = r; world_to_cam.at(cid).translation() = -r * c; } // Read the number of points ptrdiff_t number_of_pid; f >> number_of_pid; if (number_of_pid < 1) vw::vw_throw(vw::ArgumentErr() << "The NVM file has no triangulated points."); // Read the point pid_to_cid_fid.resize(number_of_pid); pid_to_xyz.resize(number_of_pid); Eigen::Vector3d xyz; Eigen::Vector3i color; Eigen::Vector2d pt; ptrdiff_t cid, fid; for (ptrdiff_t pid = 0; pid < number_of_pid; pid++) { pid_to_cid_fid.at(pid).clear(); ptrdiff_t number_of_measures; f >> xyz[0] >> xyz[1] >> xyz[2] >> color[0] >> color[1] >> color[2] >> number_of_measures; pid_to_xyz.at(pid) = xyz; for (ptrdiff_t m = 0; m < number_of_measures; m++) { f >> cid >> fid >> pt[0] >> pt[1]; pid_to_cid_fid.at(pid)[cid] = fid; if (cid_to_keypoint_map.at(cid).cols() <= fid) cid_to_keypoint_map.at(cid).conservativeResize(Eigen::NoChange_t(), fid + 1); cid_to_keypoint_map.at(cid).col(fid) = pt; } if (!f.good()) vw::vw_throw(vw::ArgumentErr() << "Unable to read file: " << input_filename); } } // A function to create the offsets filename from the nvm filename std::string offsetsFilename(std::string const& nvm_filename) { int file_len = nvm_filename.size(); // cast to int to make subtraction safe // The length must be at least 5, as it must end with .nvm if (file_len < 5) vw::vw_throw(vw::ArgumentErr() << "Invalid nvm filename: " << nvm_filename << ".\n"); return nvm_filename.substr(0, std::max(file_len - 4, 0)) + "_offsets.txt"; } // A function to read nvm offsets (optical center per image). On each line there // must be the image name, then the optical center column, then row. Read into // an std::map, with the key being the image name, and the value being vector2 // of the optical center. Interest point matches are shifted relative to this. void readNvmOffsets(std::string const& offset_path, std::map & offsets) { // Wipe the output offsets.clear(); std::ifstream offset_fh(offset_path.c_str()); if (!offset_fh.good()) vw::vw_throw(vw::ArgumentErr() << "Cannot find optical offsets file: " << offset_path << ".\n"); vw::vw_out() << "Reading optical centers: " << offset_path << std::endl; std::string name; double x, y; while (offset_fh >> name >> x >> y) { // Check for repeated entries if (offsets.find(name) != offsets.end()) vw::vw_throw(vw::ArgumentErr() << "Repeated optical center entry for image: " << name << ".\n"); offsets[name] = Eigen::Vector2d(x, y); } } // Write the optical center offsets to a file. The format is the image name, // then the optical center column, then row. void writeNvmOffsets(std::string const& offset_path, std::map const& offsets) { std::ofstream offset_fh(offset_path.c_str()); offset_fh.precision(17); // double precision if (!offset_fh.good()) vw::vw_throw(vw::ArgumentErr() << "Cannot write optical offsets file: " << offset_path << ".\n"); vw::vw_out() << "Writing optical centers: " << offset_path << std::endl; for (auto it = offsets.begin(); it != offsets.end(); it++) offset_fh << it->first << ' ' << it->second[0] << ' ' << it->second[1] << std::endl; } // Write an nvm file. Note that a single focal length is assumed and no distortion. // Those are ignored, and only camera poses, matches, and keypoints are used. // It is assumed that the interest points are shifted relative to the optical center. // Write the optical center separately. void writeNvm(std::vector const& cid_to_keypoint_map, std::vector const& cid_to_filename, std::vector const& focal_lengths, std::vector> const& pid_to_cid_fid, std::vector const& pid_to_xyz, std::vector const& world_to_cam, std::map const& optical_centers, std::string const& output_filename) { // Ensure that the output directory having this file exists vw::create_out_dir(output_filename); vw::vw_out() << "Writing: " << output_filename << std::endl; std::fstream f(output_filename, std::ios::out); f.precision(17); // double precision f << "NVM_V3\n"; if (cid_to_filename.size() != cid_to_keypoint_map.size()) vw::vw_throw(vw::ArgumentErr() << "Unequal number of filenames and keypoints."); if (pid_to_cid_fid.size() != pid_to_xyz.size()) vw::vw_throw(vw::ArgumentErr() << "Unequal number of pid_to_cid_fid and xyz measurements."); if (cid_to_filename.size() != world_to_cam.size()) vw::vw_throw(vw::ArgumentErr() << "Unequal number of filename and camera transforms."); // Write camera information f << cid_to_filename.size() << std::endl; for (size_t cid = 0; cid < cid_to_filename.size(); cid++) { // World-to-camera rotation quaternion Eigen::Quaterniond q(world_to_cam[cid].rotation()); // Camera center in world coordinates Eigen::Vector3d t(world_to_cam[cid].translation()); Eigen::Vector3d camera_center = -world_to_cam[cid].rotation().inverse() * t; double focal_length = 1.0; if (!focal_lengths.empty()) focal_length = focal_lengths[cid]; f << cid_to_filename[cid] << " " << focal_length << " " << q.w() << " " << q.x() << " " << q.y() << " " << q.z() << " " << camera_center[0] << " " << camera_center[1] << " " << camera_center[2] << " " << "0 0\n"; // zero distortion, not used } // Write the number of points f << pid_to_cid_fid.size() << std::endl; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { f << pid_to_xyz[pid][0] << " " << pid_to_xyz[pid][1] << " " << pid_to_xyz[pid][2] << " 0 0 0 " << pid_to_cid_fid[pid].size(); if (pid_to_cid_fid[pid].size() <= 1) vw::vw_throw(vw::ArgumentErr() << "PID " << pid << " has " << pid_to_cid_fid[pid].size() << " measurements."); for (std::map::const_iterator it = pid_to_cid_fid[pid].begin(); it != pid_to_cid_fid[pid].end(); it++) { auto cid = it->first; auto fid = it->second; // Find the offset for this image Eigen::Vector2d offset = Eigen::Vector2d::Zero(); if (!optical_centers.empty()) { auto map_it = optical_centers.find(cid_to_filename[cid]); if (map_it == optical_centers.end()) { vw::vw_throw(vw::ArgumentErr() << "Cannot find optical offset for image " << cid_to_filename[cid] << "\n"); } offset = map_it->second; } // Write with the offset subtracted f << " " << cid << " " << fid << " " << cid_to_keypoint_map[it->first].col(it->second)[0] - offset[0] << " " << cid_to_keypoint_map[it->first].col(it->second)[1] - offset[1]; } f << std::endl; } // Close the file f.flush(); f.close(); if (!optical_centers.empty()) { // Write the optical center offsets std::string offset_path = offsetsFilename(output_filename); writeNvmOffsets(offset_path, optical_centers); } } // Write an nvm file. Keypoints are written as-is, and maybe shifted or not // relative to the optical center. No focal length info is known, so it is set // to 1.0. void writeNvm(std::vector const& cid_to_keypoint_map, std::vector const& cid_to_filename, std::vector> const& pid_to_cid_fid, std::vector const& pid_to_xyz, std::vector const& world_to_cam, std::string const& output_filename) { // Part of the API std::vector focal_lengths; std::map const optical_centers; writeNvm(cid_to_keypoint_map, cid_to_filename, focal_lengths, pid_to_cid_fid, pid_to_xyz, world_to_cam, optical_centers, output_filename); } // Given a map from current cid to new cid, apply this map to the nvm. This can // extract a submap and/or reorder data. void remapNvm(std::map const& cid2cid, // Outputs std::vector & cid_to_keypoint_map, std::vector & cid_to_filename, std::vector> & pid_to_cid_fid, std::vector & pid_to_xyz, std::vector & world_to_cam, std::vector & focal_lengths, std::map & optical_centers) { // cid2d must be non-empty if (cid2cid.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot reorder a control network with an empty map."); // Find the min and max value in the map int min_out_cid = cid2cid.begin()->second; int max_out_cid = cid2cid.begin()->second; for (auto const& p : cid2cid) { min_out_cid = std::min(min_out_cid, p.second); max_out_cid = std::max(max_out_cid, p.second); } // Min cid must be non-negative if (min_out_cid < 0) vw::vw_throw(vw::ArgumentErr() << "Cannot reorder a control network with negative cids."); // Check that all values in cid2cid are unique std::set values; for (auto const& p : cid2cid) { if (values.find(p.second) != values.end()) vw::vw_throw(vw::ArgumentErr() << "Cannot reorder a control network with repeated cids."); values.insert(p.second); } // Allocate space for the output int num_out = max_out_cid + 1; std::vector cid_to_keypoint_map_out(num_out); std::vector cid_to_filename_out(num_out); std::vector world_to_cam_out(num_out); std::vector focal_lengths_out(num_out); std::vector> pid_to_cid_fid_out; std::vector pid_to_xyz_out; std::map optical_centers_out; for (size_t cid = 0; cid < cid_to_filename.size(); cid++) { auto it = cid2cid.find(cid); if (it == cid2cid.end()) continue; size_t new_cid = it->second; cid_to_keypoint_map_out[new_cid] = cid_to_keypoint_map[cid]; cid_to_filename_out[new_cid] = cid_to_filename[cid]; world_to_cam_out[new_cid] = world_to_cam[cid]; focal_lengths_out[new_cid] = focal_lengths[cid]; if (!optical_centers.empty()) { auto it2 = optical_centers.find(cid_to_filename[cid]); if (it2 != optical_centers.end()) optical_centers_out[cid_to_filename[cid]] = it2->second; } } // Create new pid_to_cid_fid and pid_to_xyz. for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { auto const& cid_fid = pid_to_cid_fid[pid]; // alias std::map cid_fid_out; for (auto it = cid_fid.begin(); it != cid_fid.end(); it++) { int cid = it->first; auto cid2cid_it = cid2cid.find(cid); if (cid2cid_it == cid2cid.end()) continue; // not an image we want to keep int new_cid = cid2cid_it->second; cid_fid_out[new_cid] = it->second; // fid does not change } if (cid_fid_out.size() <= 1) continue; // tracks must have size at least 2 pid_to_cid_fid_out.push_back(cid_fid_out); pid_to_xyz_out.push_back(pid_to_xyz[pid]); } // Copy the output to the input cid_to_keypoint_map = cid_to_keypoint_map_out; cid_to_filename = cid_to_filename_out; world_to_cam = world_to_cam_out; focal_lengths = focal_lengths_out; pid_to_cid_fid = pid_to_cid_fid_out; pid_to_xyz = pid_to_xyz_out; optical_centers = optical_centers_out; } // Extract a submap in-place. void ExtractSubmap(std::vector const& images_to_keep, asp::nvmData & nvm) { // Sanity check. The images to keep must exist in the original map. std::map image2cid; for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) image2cid[nvm.cid_to_filename[cid]] = cid; for (size_t cid = 0; cid < images_to_keep.size(); cid++) { if (image2cid.find(images_to_keep[cid]) == image2cid.end()) vw::vw_out(vw::WarningMessage) << "Warning: Could not find in the input map the image: " << images_to_keep[cid] << "\n"; } // To extract the submap-in place, it is simpler to reorder the images // to extract to be in the same order as in the map. Keep those in // local vector 'keep'. std::vector keep; { std::set keep_set; for (size_t cid = 0; cid < images_to_keep.size(); cid++) keep_set.insert(images_to_keep[cid]); for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) { if (keep_set.find(nvm.cid_to_filename[cid]) != keep_set.end()) keep.push_back(nvm.cid_to_filename[cid]); } } // Map each image we keep to its index std::map keep2cid; for (size_t cid = 0; cid < keep.size(); cid++) keep2cid[keep[cid]] = cid; // The map from the old cid to the new cid std::map cid2cid; for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) { auto it = keep2cid.find(nvm.cid_to_filename[cid]); if (it == keep2cid.end()) continue; // current image is not in the final submap cid2cid[cid] = it->second; } // Sanity checks. All the kept images must be represented in cid2cid, // and the values in cid2cid must be consecutive. if (cid2cid.size() != keep.size() || cid2cid.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot extract a submap. Check your inputs. Maybe some images " << "are duplicated or none are in the map."); for (auto it = cid2cid.begin(); it != cid2cid.end(); it++) { auto it2 = it; it2++; if (it2 == cid2cid.end()) continue; if (it->second + 1 != it2->second || cid2cid.begin()->second != 0 ) vw::vw_throw(vw::ArgumentErr() << "Cannot extract a submap. Check if the images " << "you want to keep are in the same order as in the original map."); } // Remap the nvm asp::remapNvm(cid2cid, nvm.cid_to_keypoint_map, nvm.cid_to_filename, nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam, nvm.focal_lengths, nvm.optical_centers); vw::vw_out() << "Number of images in the extracted map: " << nvm.cid_to_filename.size() << "\n"; vw::vw_out() << "Number of tracks in the extracted map: " << nvm.pid_to_cid_fid.size() << "\n"; return; } // Reads the NVM control network format. If a filename having extension // _offset.txt instead of .nvm exists, read from it the optical center offsets // and apply them. void readNvm(std::string const& input_filename, bool nvm_no_shift, std::vector & cid_to_keypoint_map, std::vector & cid_to_filename, std::vector> & pid_to_cid_fid, std::vector & pid_to_xyz, std::vector & world_to_cam, std::vector & focal_lengths, std::map & offsets) { // Read the offsets (optical centers) to apply to the interest points, // if applicable. std::string offset_path = offsetsFilename(input_filename); std::ifstream offset_fh(offset_path.c_str()); bool have_offsets = false; offsets.clear(); if (nvm_no_shift) { have_offsets = false; if (offset_fh.good()) vw::vw_out() << "Ignoring the optical center offsets from: " << offset_path << std::endl; } else { if (!offset_fh.good()) vw::vw_throw(vw::ArgumentErr() << "Cannot find optical offsets file: " << offset_path << "\n"); readNvmOffsets(offset_path, offsets); have_offsets = true; } // Read the nvm as is, without applying any offsets asp::readNvm(input_filename, cid_to_keypoint_map, cid_to_filename, pid_to_cid_fid, pid_to_xyz, world_to_cam, focal_lengths); // If no offsets, use zero offsets if (nvm_no_shift) { for (ptrdiff_t cid = 0; cid < cid_to_filename.size(); cid++) offsets[cid_to_filename.at(cid)] = Eigen::Vector2d(0, 0); } // If we have the offsets, apply them to the interest points if (have_offsets) { for (ptrdiff_t cid = 0; cid < cid_to_filename.size(); cid++) { std::string name = cid_to_filename.at(cid); auto off_it = offsets.find(name); if (off_it == offsets.end()) vw::vw_throw(vw::ArgumentErr() << "Cannot find optical offset for image: " << name << "\n"); Eigen::Vector2d offset = off_it->second; for (ptrdiff_t fid = 0; fid < cid_to_keypoint_map.at(cid).cols(); fid++) { cid_to_keypoint_map.at(cid).col(fid) += offset; } } } // end applying offsets } // A wrapper to carry fewer things around void readNvm(std::string const& input_filename, bool nvm_no_shift, asp::nvmData & nvm) { readNvm(input_filename, nvm_no_shift, nvm.cid_to_keypoint_map, nvm.cid_to_filename, nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam, nvm.focal_lengths, nvm.optical_centers); } // A wrapper for writing an nvm file void writeNvm(asp::nvmData const& nvm, std::string const& output_filename) { writeNvm(nvm.cid_to_keypoint_map, nvm.cid_to_filename, nvm.focal_lengths, nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam, nvm.optical_centers, output_filename); } // Convert nvm to cnet void nvmToCnet(asp::nvmData const& nvm, // Outputs vw::ba::ControlNetwork & cnet, std::map & offsets, std::vector & world_to_cam) { // Wipe the output cnet = vw::ba::ControlNetwork("ASP_control_network"); // Add the images for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) cnet.add_image_name(nvm.cid_to_filename[cid]); // Add the points for (size_t pid = 0; pid < nvm.pid_to_cid_fid.size(); pid++) { vw::ba::ControlPoint cp; Eigen::Vector3d const& P = nvm.pid_to_xyz[pid]; cp.set_position(vw::Vector3(P[0], P[1], P[2])); cp.set_type(vw::ba::ControlPoint::TiePoint); // this is the default for (const auto& cid_fid: nvm.pid_to_cid_fid[pid]) { int cid = cid_fid.first; int fid = cid_fid.second; double x = nvm.cid_to_keypoint_map[cid].col(fid)[0]; double y = nvm.cid_to_keypoint_map[cid].col(fid)[1]; double sigma = 1.0; cp.add_measure(vw::ba::ControlMeasure(x, y, sigma, sigma, cid)); } cnet.add_control_point(cp); } offsets = nvm.optical_centers; world_to_cam = nvm.world_to_cam; } // Create an nvm from a cnet. There is no shift in the interest points. That is // applied only on loading and saving. Optionally, updated triangulated points // and outlier flags can be passed in. void cnetToNvm(vw::ba::ControlNetwork const& cnet, std::map const& offsets, std::vector const& world_to_cam, // Output asp::nvmData & nvm, // Optional updated triangulated points and outlier flags std::vector const& tri_vec, std::set const& outliers) { // Sanity check if (offsets.size() != world_to_cam.size()) vw::vw_throw(vw::ArgumentErr() << "cnetToNvm: Mismatch in offsets and world_to_cam.\n"); if (cnet.get_image_list().size() != world_to_cam.size()) vw::vw_throw(vw::ArgumentErr() << "cnetToNvm: Mismatch in cnet and world_to_cam.\n"); // If tri_vec is not empty, must have the same size as the cnet int num_points = cnet.size(); if (!tri_vec.empty() && (int)tri_vec.size() != num_points) vw::vw_throw(vw::ArgumentErr() << "cnetToNvm: Mismatch in tri_vec and cnet.\n"); // Wipe the output nvm = asp::nvmData(); nvm.cid_to_filename = cnet.get_image_list(); nvm.focal_lengths.resize(nvm.cid_to_filename.size(), 1.0); // dummy focal length nvm.world_to_cam = world_to_cam; nvm.optical_centers = offsets; // Allocate storage only for the inliers int num_inliers = num_points - outliers.size(); nvm.pid_to_xyz.resize(num_inliers); nvm.pid_to_cid_fid.resize(num_inliers); // Copy the triangulated points int inlier_count = 0; for (int pid = 0; pid < num_points; pid++) { // Skip outliers if (outliers.find(pid) != outliers.end()) continue; if (tri_vec.empty()) { vw::Vector3 P = cnet[pid].position(); nvm.pid_to_xyz[inlier_count] = Eigen::Vector3d(P[0], P[1], P[2]); } else { nvm.pid_to_xyz[inlier_count] = tri_vec[pid]; } inlier_count++; // Sanity check if (inlier_count > num_points) vw::vw_throw(vw::ArgumentErr() << "cnetToNvm: Book-keeping failure inlier count.\n"); } // Iterate through the control points and get the feature matches // Put all interest points per image in a map, so later we can // give them an id. int num_images = nvm.cid_to_filename.size(); typedef std::pair Pair; // 2D point with comparison operator std::vector> keypoint_map(num_images); for (int pid = 0; pid < num_points; pid++) { // Skip outliers if (outliers.find(pid) != outliers.end()) continue; vw::ba::ControlPoint const& cp = cnet[pid]; // Iterate through the measures for (int m = 0; m < cp.size(); m++) { vw::ba::ControlMeasure const& cm = cp[m]; int cid = cm.image_id(); vw::Vector2 pix = cm.position(); // Add to the keypoint map Pair key = std::make_pair(pix[0], pix[1]); // If the key is not in the map, add it with an id that is the current size of the map if (keypoint_map[cid].find(key) == keypoint_map[cid].end()) keypoint_map[cid][key] = keypoint_map[cid].size(); } } // Now fill in the keypoint map nvm.cid_to_keypoint_map.resize(nvm.cid_to_filename.size()); for (int cid = 0; cid < num_images; cid++) nvm.cid_to_keypoint_map[cid].resize(2, keypoint_map[cid].size()); inlier_count = 0; for (int pid = 0; pid < num_points; pid++) { vw::ba::ControlPoint const& cp = cnet[pid]; // Skip outliers if (outliers.find(pid) != outliers.end()) continue; // Iterate through the measures for (int m = 0; m < cp.size(); m++) { vw::ba::ControlMeasure const& cm = cp[m]; int cid = cm.image_id(); vw::Vector2 pix = cm.position(); Pair key = std::make_pair(pix[0], pix[1]); // The key is guaranteed to be in the map auto it = keypoint_map[cid].find(key); if (it == keypoint_map[cid].end()) vw::vw_throw(vw::ArgumentErr() << "cnetToNvm: Unexpected key not found.\n"); int fid = it->second; nvm.pid_to_cid_fid[inlier_count][cid] = fid; nvm.cid_to_keypoint_map[cid].col(fid) = Eigen::Vector2d(pix[0], pix[1]); } inlier_count++; } return; } // Reorder the nvm to agree with a given image list void remapNvm(std::vector const& image_files, asp::nvmData & nvm) { if (image_files.size() != nvm.cid_to_filename.size()) vw::vw_throw(vw::ArgumentErr() << "The nvm and input images do not have the same files.\n"); // Find the cid for each image in the nvm file std::map nvm_file2cid; for (size_t i = 0; i < nvm.cid_to_filename.size(); i++) nvm_file2cid[nvm.cid_to_filename[i]] = i; // Same for the image files std::map image_file2cid; for (size_t i = 0; i < image_files.size(); i++) image_file2cid[image_files[i]] = i; // These must have the same size if (nvm_file2cid.size() != image_file2cid.size()) vw::vw_throw(vw::ArgumentErr() << "The nvm and input images do not have the same files.\n"); // Create cid2cid map that will help reorder then nvm to agree with the // image files std::map cid2cid; for (size_t i = 0; i < image_files.size(); i++) { std::string image_file = image_files[i]; if (nvm_file2cid.find(image_file) == nvm_file2cid.end()) vw::vw_throw(vw::ArgumentErr() << "Cannot find image: " << image_file << " in the nvm.\n"); cid2cid[nvm_file2cid[image_file]] = i; } // Remap the nvm asp::remapNvm(cid2cid, nvm.cid_to_keypoint_map, nvm.cid_to_filename, nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam, nvm.focal_lengths, nvm.optical_centers); } // Read an NVM file into the VisionWorkbench control network format. The flag // nvm_no_shift, if true, means that the interest points are not shifted // relative to the optical center, so can be read as is. void readNvmAsCnet(std::string const& input_filename, std::vector const& image_files, bool nvm_no_shift, vw::ba::ControlNetwork & cnet, std::vector & world_to_cam, std::map & optical_offsets) { // Read the NVM file asp::nvmData nvm; asp::readNvm(input_filename, nvm_no_shift, nvm); // Must ensure the nvm image list agrees with the input image list if (!image_files.empty()) remapNvm(image_files, nvm); // Convert to a control network asp::nvmToCnet(nvm, cnet, optical_offsets, world_to_cam); } // Write a cnet to an NVM file. On writing, the feature matches from the cnet will be // shifted relative to the optical center. The optical center offsets are saved // to a separate file. void writeCnetAsNvm(vw::ba::ControlNetwork const& cnet, std::map const& optical_offsets, std::vector const& world_to_cam, std::string const& output_filename) { // Convert to an nvm asp::nvmData nvm; asp::cnetToNvm(cnet, optical_offsets, world_to_cam, nvm); // Write the nvm asp::writeNvm(nvm, output_filename); } } // end namespace asp ================================================ FILE: src/asp/Core/Nvm.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ // Logic for nvm files and the sfm solution #ifndef ASP_CORE_NVM_H_ #define ASP_CORE_NVM_H_ #include #include #include #include #include namespace vw { namespace ba { class ControlNetwork; } } namespace asp { struct nvmData { std::vector cid_to_keypoint_map; std::vector cid_to_filename; std::vector> pid_to_cid_fid; std::vector pid_to_xyz; std::vector world_to_cam; std::vector focal_lengths; // Interest points in the nvm file are shifted relative to optical centers std::map optical_centers; }; // Reads the NVM control network format. This function does not apply // the optical offsets. Use instead the function that does. void readNvm(std::string const & input_filename, std::vector & cid_to_keypoint_map, std::vector & cid_to_filename, std::vector> & pid_to_cid_fid, std::vector & pid_to_xyz, std::vector & world_to_cam, std::vector & focal_lengths); // A function to create the offsets filename from the nvm filename std::string offsetsFilename(std::string const& nvm_filename); // A function to read nvm offsets (optical center per image). On each line there // must be the image name, then the optical center column, then row. Read into // an std::map, with the key being the image name, and the value being vector2 // of the optical center. Interest point matches are shifted relative to this. void readNvmOffsets(std::string const& offset_path, std::map & offsets); // Write the optical center offsets to a file. The format is the image name, // then the optical center column, then row. void writeNvmOffsets(std::string const& offset_path, std::map const& offsets); // Write an NVM file. Subtract from the interest points the given offset. // The offsets are saved in a separate file. void writeNvm(asp::nvmData const& nvm, std::string const& output_filename); // Write an nvm file. Keypoints are written as-is, and maybe shifted or not // relative to the optical center. No focal length info is known, so it is set // to 1.0. void writeNvm(std::vector const& cid_to_keypoint_map, std::vector const& cid_to_filename, std::vector> const& pid_to_cid_fid, std::vector const& pid_to_xyz, std::vector const& world_to_cam, std::string const& output_filename); // Given a map from current cid to new cid, apply this map to the nvm. This can // extract a submap and/or reorder data. void remapNvm(std::map const& cid2cid, // Outputs std::vector & cid_to_keypoint_map, std::vector & cid_to_filename, std::vector> & pid_to_cid_fid, std::vector & pid_to_xyz, std::vector & world_to_cam, std::vector & focal_lengths, std::map & optical_centers); // Extract a submap in-place from an nvm object. void ExtractSubmap(std::vector const& images_to_keep, asp::nvmData & nvm); // Read an NVM file. Any offset is applied upon reading. void readNvm(std::string const& input_filename, bool nvm_no_shift, asp::nvmData & nvm); // Read an NVM file into the VisionWorkbench control network format. The flag // nvm_no_shift, if true, means that the interest points are not shifted // relative to the optical center, so can be read as is. void readNvmAsCnet(std::string const& input_filename, std::vector const& image_files, bool nvm_no_shift, // Outputs vw::ba::ControlNetwork & cnet, std::vector & world_to_cam, std::map & offsets); // Create an nvm from a cnet. There is no shift in the interest points. That is // applied only on loading and saving. Optionally, updated triangulated points // and outlier flags can be passed in. void cnetToNvm(vw::ba::ControlNetwork const& cnet, std::map const& offsets, std::vector const& world_to_cam, // Output asp::nvmData & nvm, // Optional updated triangulated points and outlier flags std::vector const& tri_vec = std::vector(), std::set const& outliers = std::set()); // Convert nvm to cnet void nvmToCnet(asp::nvmData const& nvm, // Outputs vw::ba::ControlNetwork & cnet, std::map & offsets, std::vector & world_to_cam); // Write a cnet to an NVM file. On writing, the feature matches from the cnet will be // shifted relative to the optical center. The optical center offsets are saved // to a separate file. void writeCnetAsNvm(vw::ba::ControlNetwork const& cnet, std::map const& optical_offsets, std::vector const& world_to_cam, std::string const& output_filename); } // end namespace asp #endif // ASP_CORE_NVM_H_ ================================================ FILE: src/asp/Core/OpenCVUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include namespace asp { // Return the OpenCV matrix type as a string std::string cvMatType(cv::Mat const& M) { int inttype = M.type(); std::string r, a; uchar depth = inttype & CV_MAT_DEPTH_MASK; uchar chans = 1 + (inttype >> CV_CN_SHIFT); switch (depth) { case CV_8U: r = "8U"; break; case CV_8S: r = "8S"; break; case CV_16U: r = "16U"; break; case CV_16S: r = "16S"; break; case CV_32S: r = "32S"; break; case CV_32F: r = "32F"; break; case CV_64F: r = "64F"; break; default: r = "User"; break; } r += "C"; r += (chans+'0'); return r; } // Convert a matrix from OpenCV to the VisionWorkbench matrix type. // Implemented only for double precision matrix (should be easy to // extend also for single precision and various integer types). vw::Matrix cvMatToVwMat(cv::Mat const& M) { std::string matType = asp::cvMatType(M); if (matType != "64FC1") { vw::vw_throw(vw::NoImplErr() << "cvMatToVwMat() implemented only for " << "double-precision OpenCV matrices (64FC1). Got: " << matType); } Eigen::Matrix EM; cv::cv2eigen(M, EM); vw::Matrix VM(EM.rows(), EM.cols()); for (int row = 0; row < EM.rows(); row++) { for (int col = 0; col < EM.cols(); col++) { VM(row, col) = EM(row, col); } } return VM; } // Scale an image from [0, 1] to [0, 255], round, and clamp. // NaN values are not affected. void formScaledByteCVImage(vw::ImageViewRef in, cv::Mat & out) { out = cv::Mat(in.rows(), in.cols(), CV_8UC1, cv::Scalar(0)); // Note how we read from in(col, row) but write to out(row, col) for (int row = 0; row < in.rows(); row++) { for (int col = 0; col < in.cols(); col++) { int val = round(255.0 * in(col, row)); if (val < 0) val = 0; if (val > 255) val = 255; out.at(row, col) = val; } } return; } // Scale a masked image from [0, 1] to [0, 255], round, and clamp. // Invalid values get set to 0 in the output. Masking likely casts NaN // to invalid data so they end up being set to 0. void maskedToScaledByteCvImage(vw::ImageViewRef> in, cv::Mat & out) { vw::ImageViewRef img = vw::apply_mask(in, 0.0f); formScaledByteCVImage(img, out); } // Insert an image as a block at a desired location in a bigger image void cvInsertBlock(cv::Mat const& input_image, int extra_x, int extra_y, cv::Mat& output_image) { input_image.copyTo(output_image(cv::Range(extra_y, extra_y + input_image.rows), cv::Range(extra_x, extra_x + input_image.cols))); } } // end namespace asp ================================================ FILE: src/asp/Core/OpenCVUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file OpenCVUtils.h /// #ifndef __ASP_CORE_OPENCVUTILS_H__ #define __ASP_CORE_OPENCVUTILS_H__ #include #include #include #include namespace asp { // Return the OpenCV matrix type as a string std::string cvMatType(cv::Mat const& M); // Convert a matrix from OpenCV to the VisionWorkbench matrix type. // Implemented only for double precision matrix. vw::Matrix cvMatToVwMat(cv::Mat const& M); // Scale an image from [0, 1] to [0, 255], round, and clamp. // NaN values are not affected. void formScaledByteCVImage(vw::ImageViewRef in, cv::Mat & out); // Scale a masked image from [0, 1] to [0, 255], round, and clamp. // Invalid values get set to 0 in the output. Masking likely casts NaN // to invalid data so they end up being set to 0. void maskedToScaledByteCvImage(vw::ImageViewRef> in, cv::Mat & out); // Insert an image as a block at a desired location in a bigger image void cvInsertBlock(cv::Mat const& input_image, int extra_x, int extra_y, cv::Mat& output_image); } #endif //__ASP_CORE_OPENCVUTILS_H__ ================================================ FILE: src/asp/Core/OrthoRasterizer.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file OrthoRasterizer.cc /// /// Given a point image and corresponding texture, this class /// resamples the point cloud on a regular grid over the [x,y] plane /// of the point image; producing an evenly sampled ortho-image with /// interpolated z values. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp{ using namespace vw; class compare_bboxes { // simple comparison function public: bool operator()(const BBox2i A, const BBox2i B) const { return (A.min().x() < B.min().x()); } }; void dump_image(std::string const& prefix, BBox2i const& box, ImageViewRef const& I) { //Crop the image to the given box and save to a file. std::ostringstream os; os << prefix << "_" << box.min().x() << "_" << box.min().y() << " " << box.width() << " " << box.height() << ".csv"; std::string file = os.str(); vw_out() << "Writing: " << file << std::endl; std::ofstream of(file.c_str()); of.precision(18); BBox2i lbox = box; lbox.crop(bounding_box(I)); ImageView crop_img = crop(I, lbox); for (int col = 0; col < crop_img.cols(); col++) { for (int row = 0; row < crop_img.rows(); row++) { Vector3 p = crop_img(col, row); if (std::isnan(p.z())) continue; of << p.x() << ' ' << p.y() << ' ' << p.z() << std::endl; } } of.close(); } // Task to parallelize the generation of bounding boxes for each block. class SubBlockBoundaryTask: public Task, private boost::noncopyable { ImageViewRef m_view; int m_sub_block_size; BBox2i m_image_bbox; BBox3& m_global_bbox; std::vector& m_point_image_boundaries; ImageViewRef const& m_error_image; double m_estim_max_error; // used for outlier removal by tri error based on percentage vw::BBox3 m_estim_proj_box; // used for outlier removal in the bounding box computation std::vector & m_errors_hist; double m_max_valid_triangulation_error; // used for outlier removal based on user thresh Mutex& m_mutex; const ProgressCallback& m_progress; float m_inc_amt; // This is growing a bbox of points in point projection and Z // values which are altitude. struct GrowBBoxAccumulator { BBox3 bbox; void operator()(Vector3 const& v) { if (!std::isnan(v.z())) bbox.grow(v); } }; struct ErrorHistAccumulator{ std::vector & m_hist; double m_max_val; ErrorHistAccumulator(std::vector& hist, double max_val): m_hist(hist), m_max_val(max_val) {} void operator()(double err) { if (err == 0) return; // null errors come from invalid pixels int len = m_hist.size(); int k = round((len-1)*std::min(err, m_max_val)/m_max_val); if (k >= 0 && k < len && m_max_val > 0) { // This is a bugfix for an observed situation when err is NaN. // In that case the rounding returns a negative integer. m_hist[k]++; } } }; public: SubBlockBoundaryTask(ImageViewRef const& view, int sub_block_size, BBox2i const& image_bbox, BBox3 & global_bbox, std::vector& boundaries, ImageViewRef const& error_image, double estim_max_error, vw::BBox3 const& estim_proj_box, std::vector & errors_hist, double max_valid_triangulation_error, Mutex& mutex, const ProgressCallback& progress, float inc_amt) : m_view(view.impl()), m_sub_block_size(sub_block_size), m_image_bbox(image_bbox), m_global_bbox(global_bbox), m_point_image_boundaries(boundaries), m_error_image(error_image), m_estim_max_error(estim_max_error), m_estim_proj_box(estim_proj_box), m_errors_hist(errors_hist), m_max_valid_triangulation_error(max_valid_triangulation_error), m_mutex(mutex), m_progress(progress), m_inc_amt(inc_amt) {} void operator()() { ImageView local_image = crop(m_view, m_image_bbox); bool remove_outliers_with_pct = (!m_errors_hist.empty()); ImageView local_error; if (remove_outliers_with_pct || m_max_valid_triangulation_error > 0.0) local_error = crop(m_error_image, m_image_bbox); // Further subdivide into boundaries so that prerasterize will // only query what it needs. std::vector blocks = subdivide_bbox(m_image_bbox, m_sub_block_size, m_sub_block_size); BBox3 local_union; std::list solutions; std::vector local_hist(m_errors_hist.size(), 0); bool nonempty_estim_proj_box = (!m_estim_proj_box.empty()); for (size_t i = 0; i < blocks.size(); i++) { BBox3 pts_bdbox; ImageView local_image2 = crop(local_image, blocks[i] - m_image_bbox.min()); // See if to filter by user-provided m_max_valid_triangulation_error. // Otherwise try to make use of m_estim_max_error if it was found. // If this is not provided we will later estimate and use such a value automatically // when doing the gridding. ImageView local_error2; if (m_max_valid_triangulation_error > 0 || m_estim_max_error > 0) local_error2 = crop(local_error, blocks[i] - m_image_bbox.min()); for (int col = 0; col < local_image2.cols(); col++) { for (int row = 0; row < local_image2.rows(); row++) { // Skip invalid points if (std::isnan(local_image2(col, row).z())) continue; // Skip outliers, points not in the estimated bounding box if (nonempty_estim_proj_box && !m_estim_proj_box.contains(local_image2(col, row))) { continue; } if (m_max_valid_triangulation_error > 0) { if (local_error2(col, row) > m_max_valid_triangulation_error) continue; } else if (m_estim_max_error > 0) { if (local_error2(col, row) > m_estim_max_error) continue; } pts_bdbox.grow(local_image2(col, row)); } } if (pts_bdbox.min().x() <= pts_bdbox.max().x() && pts_bdbox.min().y() <= pts_bdbox.max().y()) { // If the length is 0 along some dimension, grow it by a small amount // as otherwise this data point will not be included in the bounding box. for (int i = 0; i < 3; i++) { if (std::isinf(pts_bdbox.min()[i]) || std::isinf(pts_bdbox.max()[i])) continue; if (pts_bdbox.min()[i] == pts_bdbox.max()[i]) pts_bdbox.max()[i] = std::nextafter(pts_bdbox.max()[i], std::numeric_limits::max()); } local_union.grow(pts_bdbox); solutions.push_back(std::make_pair(pts_bdbox, blocks[i])); } if (remove_outliers_with_pct) { ErrorHistAccumulator error_accum(local_hist, m_estim_max_error); for_each_pixel(crop(local_error, blocks[i] - m_image_bbox.min()), error_accum); } } // Append to the global list of boxes and expand the point cloud // bounding box. if (local_union != BBox3()) { Mutex::Lock lock(m_mutex); for (std::list::const_iterator it = solutions.begin(); it != solutions.end(); it++) { m_point_image_boundaries.push_back(*it); } m_global_bbox.grow(local_union); if (remove_outliers_with_pct) for (int i = 0; i < (int)m_errors_hist.size(); i++) m_errors_hist[i] += local_hist[i]; m_progress.report_incremental_progress(m_inc_amt); } } }; // End function operator() void remove_outliers(ImageView & image, ImageViewRef const& errors, double error_cutoff, BBox2i const& box) { // Mask as NaN points above triangulation error if (error_cutoff < 0) return; // nothing to do double nan = std::numeric_limits::quiet_NaN(); ImageView error_copy = crop(errors, box); VW_ASSERT(image.cols() == error_copy.cols() && image.rows() == error_copy.rows(), ArgumentErr() << "Size mis-match in remove_outliers()."); for (int col = 0; col < image.cols(); col++) { for (int row = 0; row < image.rows(); row++) { if (error_copy(col, row) > error_cutoff) { image(col, row).z() = nan; } } } } void filter_by_median(ImageView & image, Vector2 const& median_filter_params) { // 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. int half = median_filter_params[0]/2; // half window size double thresh = median_filter_params[1]; if (half <= 0 || thresh <= 0) return; int nc = image.cols(), nr = image.rows(); // shorten double nan = std::numeric_limits::quiet_NaN(); ImageView image_out = copy(image); for (int col = 0; col < image.cols(); col++) { for (int row = 0; row < image.rows(); row++) { if (std::isnan(image(col, row).z())) continue; std::vector vals; for (int c = std::max(col-half, 0); c <= std::min(col+half, nc-1); c++) { for (int r = std::max(row-half, 0); r <= std::min(row+half, nr-1); r++) { if (std::isnan(image(c, r).z())) continue; vals.push_back(image(c, r).z()); } } double median = vw::math::destructive_median(vals); if (fabs(median - image(col, row).z()) > thresh) { image_out(col, row).z() = nan; } } } image = copy(image_out); } // TODO: This function should live somewhere else! // Erode this many pixels around invalid pixels void erode_image(ImageView & image, int erode_len) { if (erode_len <= 0) // No erode, we are finished! return; int nc = image.cols(), nr = image.rows(); // shorten double nan = std::numeric_limits::quiet_NaN(); int max_col = nc - 1; int max_row = nr - 1; // Create a buffer to modify and a pointer to allow easy // swapping of which image we are writing to. // - The first write is to the input image, so we don't have to do extra copies with one pass. ImageView buffer = copy(image); ImageView* read_ptr = &buffer; ImageView* write_ptr = ℑ ImageView* temp_ptr = 0; // One pass per erode length for (int pass = 0; pass < erode_len; pass++) { // Loop through the entire image for (int col = 0; col < nc; col++) { int start_col = std::max(col-1, 0); int stop_col = std::min(col+1, max_col); for (int row = 0; row < nr; row++) { int start_row = std::max(row-1, 0); int stop_row = std::min(row+1, max_row); // Loop through bounds checked border 1 region around this pixel for (int c = start_col; c <= stop_col; c++) { for (int r = start_row; r <= stop_row; r++) { // If any of these pixels are bad, throw out this pixel if (std::isnan(read_ptr->operator()(c, r).z())) write_ptr->operator()(col, row).z() = nan; } } // End inner erode double loop } } // End double loop through image pixels // Swap the read and write buffer pointers for the next pass // - No need to make copies each time, the nan regions will just keep expanding. temp_ptr = write_ptr; write_ptr = read_ptr; read_ptr = temp_ptr; } // end passes // If we had an even number of erode passes, the last write was to the temp // buffer and we need to copy it back to the input image. if ((erode_len % 2) == 0) image = copy(buffer); } // Given a histogram as a vector of counts, based on binning values // in the interval [0, max_val] with n bins, find a given percentile // error. Here, pct is in [0, 100]. double percentile_error(std::vector const& hist, double max_val, double pct) { double pct_ratio = pct / 100.0; // Total number of counts in the histogram int hist_size = hist.size(); vw::int64 num_errors = 0; for (int s = 0; s < hist_size; s++) num_errors += hist[s]; // The index so that the number of counts up to index is the fraction pct/100.0 // of the total number of counts. int cutoff_index = 0; vw::int64 sum = 0; // to protect against overflow when adding many numbers for (int s = 0; s < hist_size; s++) { sum += hist[s]; if (sum >= pct_ratio * num_errors) { cutoff_index = s; break; } } return max_val * cutoff_index / double(hist_size); } OrthoRasterizerView::OrthoRasterizerView (ImageViewRef point_image, ImageViewRef texture, double search_radius_factor, double sigma_factor, int pc_tile_size, vw::BBox2 const& projwin, bool gdal_tap, OutlierRemovalMethod outlier_removal_method, Vector2 const& remove_outliers_params, ImageViewRef const& error_image, double estim_max_error, vw::BBox3 const& estim_proj_box, double max_valid_triangulation_error, Vector2 median_filter_params, int erode_len, bool has_las_or_csv, std::string const& filter, double default_grid_size_multiplier, std::int64_t * num_invalid_pixels, vw::Mutex *count_mutex, const ProgressCallback& progress): // Ensure all members are initiated, even if to temporary values m_point_image(point_image), m_texture(ImageView(1,1)), m_bbox(BBox3()), m_snapped_bbox(BBox3()), m_spacing(0.0), m_default_spacing(0.0), m_default_spacing_x(0.0), m_default_spacing_y(0.0), m_search_radius_factor(search_radius_factor), m_sigma_factor(sigma_factor), m_default_value(0), m_min_z_as_default(true), m_use_alpha(false), m_block_size(pc_tile_size), m_projwin(projwin), m_gdal_tap(gdal_tap), m_error_image(error_image), m_error_cutoff(-1.0), m_median_filter_params(median_filter_params), m_erode_len(erode_len), m_default_grid_size_multiplier(default_grid_size_multiplier), m_num_invalid_pixels(num_invalid_pixels), m_count_mutex(count_mutex) { *m_num_invalid_pixels = 0; // Init counter set_texture(channel_cast(channels_to_planes(texture.impl()))); // Convert the filter from string to enum, to speed up checking against it later m_percentile = -1; // ensure it is initialized if (filter == "weighted_average") m_filter = asp::f_weighted_average; else if (filter == "min") m_filter = asp::f_min; else if (filter == "max") m_filter = asp::f_max; else if (filter == "mean") m_filter = asp::f_mean; else if (filter == "median") m_filter = asp::f_median; else if (filter == "stddev") m_filter = asp::f_stddev; else if (filter == "count") m_filter = asp::f_count; else if (filter == "nmad") m_filter = asp::f_nmad; else if (sscanf (filter.c_str(), "%lf-pct", &m_percentile) == 1) m_filter = asp::f_percentile; else vw_throw(ArgumentErr() << "OrthoRasterize: unknown filter: " << filter << ".\n"); //dump_image("img", BBox2(0, 0, 3000, 3000), point_image); // Compute the bounding box that encompasses tiles within the image // // They're used for querying what part of the image we need VW_OUT(DebugMessage,"asp") << "Computing raster bounding box.\n"; int num_bins = 1024; std::vector errors_hist; if (outlier_removal_method != NO_OUTLIER_REMOVAL_METHOD) { // Need to compute the histogram of all errors in the error image errors_hist = std::vector(num_bins, 0.0); } // Subdivide each block into smaller chunks. Note: small chunks // greatly increase the memory usage and run-time for very large // images (because they are very many). As such, make the chunks // bigger for bigger images. // Creating each task also has overhead from copying the // georeferences. // TODO(oalexan1): Check how big these are. Maybe // they should be as many tasks as there are threads or 2x that. double s = 10000.0; int sub_block_size = int(double(point_image.cols())*double(point_image.rows())/(s*s)); sub_block_size = std::max(1, sub_block_size); sub_block_size = int(round(pow(2.0, floor(log(sub_block_size)/log(2.0))))); sub_block_size = std::max(16, sub_block_size); sub_block_size = std::min(ASP_MAX_SUBBLOCK_SIZE, sub_block_size); std::vector blocks = subdivide_bbox(m_point_image, m_block_size, m_block_size); // Find the bounding box of each subblock, stored in // m_point_image_boundaries, together with other info by // searching through the image. FifoWorkQueue queue(vw_settings().default_num_threads()); typedef SubBlockBoundaryTask task_type; Mutex mutex; float inc_amt = 1.0 / float(blocks.size()); for (size_t i = 0; i < blocks.size(); i++) { boost::shared_ptr task(new task_type(m_point_image, sub_block_size, blocks[i], m_bbox, m_point_image_boundaries, error_image, estim_max_error, estim_proj_box, errors_hist, max_valid_triangulation_error, mutex, progress, inc_amt)); queue.add_task(task); } queue.join_all(); progress.report_finished(); if (m_bbox.empty()) vw_throw(ArgumentErr() << "OrthoRasterize: Input point cloud is empty!\n"); // Override with user's projwin, if specified if (m_projwin != BBox2()) { subvector(m_bbox.min(), 0, 2) = m_projwin.min(); subvector(m_bbox.max(), 0, 2) = m_projwin.max(); } VW_OUT(DebugMessage,"asp") << "Point cloud boundary is " << m_bbox << "\n"; if (outlier_removal_method != NO_OUTLIER_REMOVAL_METHOD) { // Per user request, find some error percentiles to print. std::map percentiles = {{25.0, 0.0}, {50.0, 0.0}, {75.0, 0.0}, // The user-percentile {remove_outliers_params[0], 0.0}}; for (auto it = percentiles.begin(); it != percentiles.end(); it++) percentiles[it->first] = percentile_error(errors_hist, estim_max_error, it->first); vw::int64 num_samples = 0; // to protect against overflow when adding many numbers for (int s = 0; s < errors_hist.size(); s++) num_samples += errors_hist[s]; // Find the outlier cutoff from the histogram of all errors. // The cutoff is the outlier factor times the percentile of the errors. double user_percentile = percentiles[remove_outliers_params[0]]; vw_out() << "Collected a sample of " << num_samples << " positive triangulation errors.\n"; vw_out() << "Error percentiles: " << "Q1 (25%): " << percentiles[25.0] << ", " << "Q2 (50%): " << percentiles[50.0] << ", " << "Q3 (75%): " << percentiles[75.0] << "." << std::endl; // Multiply by the outlier factor if (outlier_removal_method == PERCENTILE_OUTLIER_METHOD) { double factor = remove_outliers_params[1]; // e.g., 3.0 m_error_cutoff = factor * user_percentile; vw_out() << "Computing triangulation error cutoff based on --remove-outliers-params.\n"; } else if (outlier_removal_method == TUKEY_OUTLIER_METHOD) { vw_out() << "Using as outlier cutoff the Tukey formula Q3 + 1.5*(Q3 - Q1)." << std::endl; m_error_cutoff = percentiles[75.0] + 1.5*(percentiles[75.0] - percentiles[25.0]); } else { vw_throw(ArgumentErr() << "Unexpected choice for outlier removal method.\n"); } vw_out() << "Triangulation error cutoff is " << m_error_cutoff << " meters.\n"; } else if (max_valid_triangulation_error > 0.0) { m_error_cutoff = max_valid_triangulation_error; vw_out() << "Manual triangulation error cutoff is " << m_error_cutoff << " meters.\n"; } // Find the width and height of the median point cloud pixel in // projected coordinates. For las or csv files, this approach // does not work. int len = m_point_image_boundaries.size(); if (!has_las_or_csv) { // This vectors can be large, so don't keep them for too long std::vector vx, vy; vx.reserve(len); vx.clear(); vy.reserve(len); vy.clear(); BOOST_FOREACH(BBoxPair const& boundary, m_point_image_boundaries) { if (boundary.first.empty()) continue; vx.push_back(boundary.first.width() /sub_block_size); vy.push_back(boundary.first.height()/sub_block_size); } std::sort(vx.begin(), vx.end()); std::sort(vy.begin(), vy.end()); if (len > 0) { // Get the median // TODO(oalexan1): This is not robust. For lro nac, vertical resolution // and horizontal resolution differ by a factor of 4, e.g., // 0.5 m and 2 m. The median can be one of the two, which is // wrong. This code should be an average of the values in the // [25%, 75%] range. // TODO(oalexan1): Integrate with the logic for mapproject. // https://github.com/NeoGeographyToolkit/StereoPipeline/issues/173 m_default_spacing_x = vx[(int)(0.5*len)]; m_default_spacing_y = vy[(int)(0.5*len)]; } } return; } // End OrthoRasterizerView Constructor void OrthoRasterizerView::set_texture(ImageViewRef texture) { VW_ASSERT(texture.cols() == m_point_image.cols() && texture.rows() == m_point_image.rows(), ArgumentErr() << "Orthorasterizer: set_texture() failed." << " Texture dimensions must match point image dimensions."); m_texture = texture; } // This is kind of like part 2 of the constructor // - This function finalizes the spacing and generates a spacing-snapped BBox. void OrthoRasterizerView::initialize_spacing(const double spacing) { // This must happen after the bounding box was computed, but before setting // the spacing. We choose the coarsest of the two spacings m_default_spacing = std::max(m_default_spacing_x, m_default_spacing_y); if (spacing > 0 && m_default_spacing > 0 && spacing < m_default_spacing) { if (spacing < 0.001 * m_default_spacing) vw::vw_throw(vw::ArgumentErr() << "The user-provided grid size (--tr) is so small that likely it is in degrees, " << "while meters are expected.\n"); // For a lesser discrepancy, just print a warning. vw_out(vw::WarningMessage) << "The user-provided grid size (--tr) is " << spacing << ", " << "which is smaller than the auto-estimated grid size of " << m_default_spacing << ". Likely the DEM will not be accurate.\n"; } // Set the sampling rate (i.e. spacing between pixels) this->set_spacing(spacing); VW_OUT(DebugMessage,"asp") << "Pixel spacing is " << m_spacing << " pnt/px\n"; // We will snap the box so that its corners are integer multiples // of the grid size. This ensures that any two DEMs // with the same grid size and overlapping grids have those // grids match perfectly. m_snapped_bbox = m_bbox; // If the user wants to use m_search_radius_factor to do filling, // expand the box to allow the DEM to grow. if (m_search_radius_factor > 0) m_snapped_bbox.expand(spacing*m_search_radius_factor); asp::snapBBox3ToGrid(m_snapped_bbox, m_spacing); // Override with user's projwin, if specified if (m_projwin != BBox2()) { subvector(m_snapped_bbox.min(), 0, 2) = m_projwin.min(); subvector(m_snapped_bbox.max(), 0, 2) = m_projwin.max(); if (!m_gdal_tap) { // The proj win takes into account that each pixel's physical size is // m_spacing. So it is biased by half a pixel outwards from the snapped // box. Compensate for that here. m_snapped_bbox.min() += Vector3(m_spacing/2.0, m_spacing/2.0, 0); m_snapped_bbox.max() -= Vector3(m_spacing/2.0, m_spacing/2.0, 0); } asp::snapBBox3ToGrid(m_snapped_bbox, m_spacing); } } // End function initialize_spacing() // Function to convert pixel coordinates to the point domain BBox3 OrthoRasterizerView::pixel_to_point_bbox(BBox2 const& inbox) const { BBox3 outbox = m_snapped_bbox; // Adjust for --gdal-tap double d = 0.0; if (m_gdal_tap) d = m_spacing/2.0; outbox.min().x() = m_snapped_bbox.min().x() + ((double(inbox.min().x())) * m_spacing) + d; outbox.max().x() = m_snapped_bbox.min().x() + ((double(inbox.max().x())) * m_spacing) + d; outbox.min().y() = m_snapped_bbox.min().y() + ((double(rows() - inbox.max().y())) * m_spacing) + d; outbox.max().y() = m_snapped_bbox.min().y() + ((double(rows() - inbox.min().y())) * m_spacing) + d; return outbox; } /// \cond INTERNAL OrthoRasterizerView::prerasterize_type OrthoRasterizerView::prerasterize(BBox2i const& bbox) const { BBox2i outbox = bbox; // bugfix, ensure we see enough beyond current tile outbox.expand((int)ceil(std::max(m_search_radius_factor, 5.0))); // Used to find which points to add are within range BBox3 local_3d_bbox = pixel_to_point_bbox(outbox); ImageView d_buffer, weights; // Given a DEM grid point, search for cloud points within the // circular region of radius equal to grid size. As such, a // given cloud point may contribute to multiple DEM points, but // with different weights (set by Gaussian). We make this radius // no smaller than the default DEM spacing. Search radius can be // over-ridden by user. double search_radius; if (m_search_radius_factor <= 0.0) search_radius = std::max(m_spacing, m_default_spacing); else search_radius = m_spacing*m_search_radius_factor; asp::Point2Grid point2grid(outbox.width(), outbox.height(), d_buffer, weights, local_3d_bbox.min().x(), local_3d_bbox.min().y(), m_spacing, m_default_spacing, search_radius, m_sigma_factor, m_filter, m_percentile); // Set up the default color value double min_val = 0.0; if (m_use_alpha) { // use this dummy value to denote transparency min_val = std::numeric_limits::min(); } else if (m_min_z_as_default) { min_val = m_snapped_bbox.min().z(); } else { min_val = m_default_value; } point2grid.Clear(min_val); // For each block in the DEM space intersecting local_3d_bbox, // find the corresponding blocks in the point cloud space. We // use here a map since we'd like to group together the point // cloud blocks which fall within the same 256 x 256 tile, to do // their union instead of them individually, for reasons of speed. typedef std::map BlockMapType; typedef BlockMapType::iterator MapIterType; BlockMapType blocks_map; BOOST_FOREACH(BBoxPair const& boundary, m_point_image_boundaries) { if (! local_3d_bbox.intersects(boundary.first)) continue; BBox2i pc_block = boundary.second; BBox2i snapped_block; snapped_block.min() = m_block_size*floor(pc_block.min()/double(m_block_size)); snapped_block.max() = m_block_size*ceil(pc_block.max()/double(m_block_size)); MapIterType it = blocks_map.find(snapped_block); if (it != blocks_map.end()) { (it->second).grow(pc_block); } else { blocks_map.insert(std::pair(snapped_block, pc_block)); } } if (blocks_map.empty()) { // TODO: Don't include these pixels in the total? { // Lock and update the total number of invalid pixels in this tile. vw::Mutex::Lock lock(*m_count_mutex); // Care here, convert to int64_t before multiplication, to avoid // int32 overflow. (*m_num_invalid_pixels) += std::int64_t(bbox.width())*std::int64_t(bbox.height()); } return prerasterize_type(d_buffer, BBox2i(-outbox.min().x(), -outbox.min().y(), cols(), rows())); } for (MapIterType it = blocks_map.begin(); it != blocks_map.end(); it++) { BBox2i block = it->second; block.crop(vw::bounding_box(m_point_image)); // Pull a copy of the input image in memory. Expand the image // to be able to see a bit beyond when filling holes. BBox2i biased_block = block; int bias = m_median_filter_params[0]/2 + m_erode_len; biased_block.expand(bias); biased_block.crop(vw::bounding_box(m_point_image)); ImageView point_copy = crop(m_point_image, biased_block); remove_outliers(point_copy, m_error_image, m_error_cutoff, biased_block); filter_by_median(point_copy, m_median_filter_params); erode_image(point_copy, m_erode_len); // Crop back to the area of interest point_copy = crop(point_copy, block - biased_block.min()); ImageView texture_copy = crop(m_texture, block); typedef ImageView::pixel_accessor PointAcc; PointAcc row_acc = point_copy.origin(); for (int32 row = 0; row < point_copy.rows(); row++) { PointAcc point_ul = row_acc; for (int32 col = 0; col < point_copy.cols(); col++) { if (!std::isnan(point_copy(col, row).z()) && local_3d_bbox.contains(point_copy(col, row))) { point2grid.AddPoint(point_copy(col, row).x(), point_copy(col, row).y(), texture_copy(col, row)); } point_ul.next_col(); } // End column loop row_acc.next_row(); } // End row loop } point2grid.normalize(); // The software renderer returns an image which will render // upside down in most image formats, so we correct that here. // We also introduce transparent pixels into the result where necessary. // TODO: Here can do flipping in place. ImageView> result; result = flip_vertical(d_buffer); // Loop through result here and count up how many pixels have been // changed from the default value. std::int64_t num_unset = 0; for (int r = 0; r < result.rows(); r++) { for (int c = 0; c < result.cols(); c++) { Vector2i pix = Vector2(c, r) + outbox.min(); if (bbox.contains(pix)) { // Ignore the pixels in the temporary extension of bbox. if (result(c,r) == min_val) ++num_unset; } } } { // Lock and update the total number of invalid pixels in this tile. vw::Mutex::Lock lock(*m_count_mutex); (*m_num_invalid_pixels) += num_unset; } return prerasterize_type(result, BBox2i(-outbox.min().x(), -outbox.min().y(), cols(), rows())); } // When m_gdal_tap is true, the behavior subtly changes in a few places in a consistent way. int OrthoRasterizerView::cols() const { double ratio = std::abs(m_snapped_bbox.max().x() - m_snapped_bbox.min().x()) / m_spacing; return (int)round(ratio) + int(!m_gdal_tap); } int OrthoRasterizerView::rows() const { double ratio = std::abs(m_snapped_bbox.max().y() - m_snapped_bbox.min().y()) / m_spacing; return (int)round(ratio) + int(!m_gdal_tap); } int OrthoRasterizerView::planes() const { return 1; } // Return the affine georeferencing transform. vw::Matrix OrthoRasterizerView::geo_transform() { vw::Matrix geo_transform; geo_transform.set_identity(); geo_transform(0,0) = m_spacing; geo_transform(1,1) = -m_spacing; geo_transform(0,2) = m_snapped_bbox.min().x(); geo_transform(1,2) = m_snapped_bbox.max().y(); return geo_transform; } OrthoRasterizerView::pixel_accessor OrthoRasterizerView::origin() const { return pixel_accessor(*this); } OrthoRasterizerView::result_type OrthoRasterizerView::operator()(int /*i*/, int /*j*/, int /*p*/) const { vw::vw_throw(vw::NoImplErr() << "OrthoRasterizerView::operator()(double i, double j, int p) " << "has not been implemented."); return pixel_type(); } void OrthoRasterizerView::set_use_alpha(bool val) { m_use_alpha = val; } void OrthoRasterizerView::set_use_min_z_as_default(bool val) { m_min_z_as_default = val; } void OrthoRasterizerView::set_default_value(double val) { m_default_value = val; } double OrthoRasterizerView::default_value() { if (m_min_z_as_default) return m_bbox.min().z(); return m_default_value; } // If the DEM spacing is set to zero, we compute a DEM with // approximately the same pixel dimensions as the input image. // Note, however, that this could lead to a loss in DEM // resolution if the DEM is rotated from the orientation of the // original image. void OrthoRasterizerView::set_spacing(double val) { if (val == 0.0) m_spacing = m_default_spacing * m_default_grid_size_multiplier; else m_spacing = val; } double OrthoRasterizerView::spacing() const { return m_spacing; } // Convert the hole fill length from output image pixels to point cloud pixels. int OrthoRasterizerView::pc_hole_fill_len(int hole_fill_len) { if (hole_fill_len == 0) return 0; VW_ASSERT(m_spacing > 0 && m_default_spacing > 0, ArgumentErr() << "Expecting positive DEM spacing."); return (int)round((m_spacing / m_default_spacing) * hole_fill_len); } BBox3 OrthoRasterizerView::bounding_box() const { return m_snapped_bbox; } ImageViewRef OrthoRasterizerView::get_point_image() { return m_point_image; } void OrthoRasterizerView::set_point_image(ImageViewRef point_image) { m_point_image = point_image; } } // namespace asp ================================================ FILE: src/asp/Core/OrthoRasterizer.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file OrthoRasterizer.h /// /// Given a point image and corresponding texture, this class /// bins and averages the point cloud on a regular grid over the [x,y] /// plane of the point image; producing an evenly sampled ortho-image /// with interpolated z values. #ifndef __ASP_CORE_ORTHORASTERIZER_H__ #define __ASP_CORE_ORTHORASTERIZER_H__ #include #include #include #include #include #include #include namespace asp{ enum OutlierRemovalMethod {NO_OUTLIER_REMOVAL_METHOD, PERCENTILE_OUTLIER_METHOD, TUKEY_OUTLIER_METHOD}; typedef std::pair BBoxPair; /// Given a point image and corresponding texture, this class /// bins and averages the point cloud on a regular grid over the [x,y] /// plane of the point image; producing an evenly sampled ortho-image /// with interpolated z values. class OrthoRasterizerView: public vw::ImageViewBase { vw::ImageViewRef m_point_image; vw::ImageViewRef m_texture; vw::BBox3 m_bbox, m_snapped_bbox; // bounding box of point cloud double m_spacing; // point cloud units (usually m or deg) per pixel double m_default_spacing; // if user did not specify spacing double m_default_spacing_x; double m_default_spacing_y; double m_search_radius_factor; double m_sigma_factor; double m_default_value; bool m_min_z_as_default; bool m_use_alpha; int m_block_size; vw::BBox2 m_projwin; vw::ImageViewRef const& m_error_image; double m_error_cutoff; vw::Vector2 m_median_filter_params; int m_erode_len; asp::FilterType m_filter; double m_percentile; double m_default_grid_size_multiplier; std::int64_t * m_num_invalid_pixels; ///< Keep a count of nodata output pixels, needs to be pointer due to VW weirdness. vw::Mutex *m_count_mutex; ///< A lock for m_num_invalid_pixels, needs to be pointer due to C++ weirdness. // We could use a quad tree here but this should be a good enough improvement. std::vector m_point_image_boundaries; // These boundaries describe a point cloud 3D boundaries and then // their location in the the point cloud image. These boxes are // overlapping in the pc image X/Y domain to insure that // everything is triangulated. // Function to convert pixel coordinates to the point domain vw::BBox3 pixel_to_point_bbox(vw::BBox2 const& px) const; public: typedef vw::PixelGray pixel_type; typedef const vw::PixelGray result_type; typedef vw::ProceduralPixelAccessor pixel_accessor; bool m_gdal_tap; /// Constructor. Must call initialize_spacing before using the object!!! OrthoRasterizerView(vw::ImageViewRef point_image, vw::ImageViewRef texture, double search_radius_factor, double sigma_factor, int pc_tile_size, vw::BBox2 const& projwin, bool gdal_tap, OutlierRemovalMethod outlier_removal_method, vw::Vector2 const& remove_outliers_params, vw::ImageViewRef const& error_image, double estim_max_error, vw::BBox3 const& estim_proj_box, double max_valid_triangulation_error, vw::Vector2 median_filter_params, int erode_len, bool has_las_or_csv, std::string const& filter, double default_grid_size_multiplier, std::int64_t * num_invalid_pixels, vw::Mutex *count_mutex, const vw::ProgressCallback& progress); /// This must be called before the object can be used! void initialize_spacing(double spacing=0.0); /// You can change the texture after the class has been /// initialized. The texture must be ImageViewRef with the same /// dimensions as the point image. Callers must apply /// channel_cast(channels_to_planes(...)) before calling this. void set_texture(vw::ImageViewRef texture); int cols() const; int rows() const; int planes() const; pixel_accessor origin() const; result_type operator()(int /*i*/, int /*j*/, int /*p*/=0) const; /// \cond INTERNAL typedef vw::CropView > prerasterize_type; prerasterize_type prerasterize(vw::BBox2i const& bbox) const; template inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } /// \endcond void set_use_alpha(bool val); void set_use_min_z_as_default(bool val); void set_default_value(double val); double default_value(); void set_spacing(double val); double spacing() const; int pc_hole_fill_len(int hole_fill_len); vw::BBox3 bounding_box() const; vw::Matrix geo_transform(); vw::ImageViewRef get_point_image(); void set_point_image(vw::ImageViewRef point_image); }; } // namespace asp #endif ================================================ FILE: src/asp/Core/OutlierProcessing.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include using namespace vw; namespace asp { // Estimate a bounding box without outliers. Note that individual percentage factors // are used in x, y, and z. These are supposed to around 0.75 or so. The outlier factor is 3.0 // or so. void estimate_inliers_bbox(double pct_factor_x, double pct_factor_y, double pct_factor_z, double outlier_factor, std::vector const& x_vals, std::vector const& y_vals, std::vector const& z_vals, vw::BBox3 & inliers_bbox) { // Initialize the output inliers_bbox = BBox3(); double bx, ex, by, ey, bz, ez; if (!vw::math::find_outlier_brackets(x_vals, pct_factor_x, outlier_factor, bx, ex)) return; if (!vw::math::find_outlier_brackets(y_vals, pct_factor_y, outlier_factor, by, ey)) return; if (!vw::math::find_outlier_brackets(z_vals, pct_factor_z, outlier_factor, bz, ez)) return; // NaN values will result in an error further down if (ex != ex || ey != ey || ez != ez) return; // Need to compute the next double because the VW bounding box is // exclusive at the top. ex = std::nextafter(ex, std::numeric_limits::max()); ey = std::nextafter(ey, std::numeric_limits::max()); ez = std::nextafter(ez, std::numeric_limits::max()); inliers_bbox.grow(Vector3(bx, by, bz)); inliers_bbox.grow(Vector3(ex, ey, ez)); } // Get a generous estimate of the bounding box of the current set // while excluding outliers void estimate_points_bdbox(vw::ImageViewRef const& proj_points, vw::ImageViewRef const& error_image, vw::Vector2 const& remove_outliers_params, double estim_max_error, vw::BBox3 & inliers_bbox) { // TODO(oalexan1): Here it may help to do several passes. First throw out the worst // outliers, then estimate the box from the remaining points, etc. std::vector x_vals, y_vals, z_vals; for (int col = 0; col < proj_points.cols(); col++){ for (int row = 0; row < proj_points.rows(); row++){ // Avoid points marked as not valid Vector3 P = proj_points(col, row); if (P != P) continue; // Make use of the estimated error, if available if (estim_max_error > 0 && error_image(col, row) > estim_max_error) continue; x_vals.push_back(P.x()); y_vals.push_back(P.y()); z_vals.push_back(P.z()); } } double pct_factor = remove_outliers_params[0]/100.0; // e.g., 0.75 double outlier_factor = remove_outliers_params[1]; // e.g., 3.0. // Make these more generous, as we want to throw out only the worst // outliers. Note that we are even more generous in z, to avoid cutting // of isolated mountain peaks. This is a bugfix. double pct_factor_x = (1.0 + pct_factor)/2.0; // e.g., 0.875 double pct_factor_y = (1.0 + pct_factor)/2.0; // e.g., 0.875 double pct_factor_z = (3.0 + pct_factor)/4.0; // e.g., 0.9375 // Double this factor, now it will equal 6. With a small factor, if // the domain of the DEM is a rectangle rotated by 45 degrees, it // may cut off corners. outlier_factor *= 2.0; // Call auxiliary function to do the estimation estimate_inliers_bbox(pct_factor_x, pct_factor_y, pct_factor_z, outlier_factor, x_vals, y_vals, z_vals, inliers_bbox); return; } // A class to pick some samples to estimate the range of values // of a given dataset class ErrorRangeEstimAccum: public ReturnFixedType { typedef double accum_type; std::vector m_vals; public: typedef accum_type value_type; ErrorRangeEstimAccum() { m_vals.clear(); } void operator()( accum_type const& value ) { // Don't add zero errors, those most likely came from invalid points if (value > 0) m_vals.push_back(value); } int size(){ return m_vals.size(); } value_type value(Vector2 const& remove_outliers_params){ VW_ASSERT(!m_vals.empty(), ArgumentErr() << "ErrorRangeEstimAccum: no valid samples"); // How to pick a representative value for maximum error? The // maximum error itself may be no good, as it could be very // huge, and then sampling the range of errors will be distorted // by that. The solution adopted here: Find a percentile of the // range of errors, mulitply it by the outlier factor, and // multiply by another factor to ensure we don't underestimate // the maximum. This value may end up being larger than the // largest error, but at least it is is not grossly huge // if just a few of the errors are very large. std::sort(m_vals.begin(), m_vals.end()); int len = m_vals.size(); double pct = remove_outliers_params[0]/100.0; // e.g., 0.75 double factor = remove_outliers_params[1]; int k = std::min(len - 1, (int)(pct*len)); // Care here with empty sets if (k >= 0) return m_vals[k]*factor*4.0; return 0; } }; // Sample the image and get generous estimates (but without outliers) // of the maximum triangulation error and of the 3D box containing the // projected points. These will be tightened later. double estim_max_tri_error_and_proj_box(vw::ImageViewRef const& proj_points, vw::ImageViewRef const& error_image, vw::Vector2 const& remove_outliers_params, vw::BBox3 & estim_proj_box) { // Initialize the outputs double estim_max_error = 0.0; estim_proj_box = BBox3(); if (error_image.rows() > 0 && error_image.cols() > 0 && (error_image.cols() != proj_points.cols() || error_image.rows() != proj_points.rows())) vw_throw(ArgumentErr() << "The error image and point image must have the same size."); // Start with a 256 (2^8) by 256 sampling of the cloud bool success = true; for (int attempt = 8; attempt <= 18; attempt++) { double sample = (1 << attempt); int32 subsample_amt = int32(norm_2(Vector2(proj_points.cols(), proj_points.rows()))/sample); if (subsample_amt < 1) subsample_amt = 1; PixelAccumulator error_accum; if (error_image.cols() > 0 && error_image.rows() > 0) { //Stopwatch sw2; //sw2.start(); for_each_pixel(subsample(error_image, subsample_amt), error_accum, TerminalProgressCallback ("asp","Bounding box and triangulation error range estimation: ") ); if (error_accum.size() > 0) estim_max_error = error_accum.value(remove_outliers_params); else success = false; //sw2.stop(); //vw_out(DebugMessage,"asp") << "Elapsed time: " << sw2.elapsed_seconds() << std::endl; } asp::estimate_points_bdbox(subsample(proj_points, subsample_amt), subsample(error_image, subsample_amt), remove_outliers_params, estim_max_error, estim_proj_box); if (estim_proj_box.empty()) success = false; if (success || subsample_amt == 1) break; vw_out() << "DEM extent estimation failed. Check if your cloud is valid. " << "Trying again with finer sampling.\n"; } return estim_max_error; } } // end namespace asp ================================================ FILE: src/asp/Core/OutlierProcessing.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_CORE_OUTLIER_PROCESSING_H__ #define __ASP_CORE_OUTLIER_PROCESSING_H__ // Utilities for handling outliers #include #include namespace asp { // Estimate a bounding box without outliers. Note that individual percentage factors // are used in x, y, and z. These are supposed to around 0.75 or so. The outlier factor is 3.0 // or so. void estimate_inliers_bbox(double pct_factor_x, double pct_factor_y, double pct_factor_z, double outlier_factor, std::vector const& x_vals, std::vector const& y_vals, std::vector const& z_vals, vw::BBox3 & inliers_bbox); // Sample the image and get generous estimates (but without outliers) // of the maximum triangulation error and of the 3D box containing the // projected points. These will be tightened later. double estim_max_tri_error_and_proj_box(vw::ImageViewRef const& proj_points, vw::ImageViewRef const& error_image, vw::Vector2 const& remove_outliers_params, vw::BBox3 & estim_proj_box); } // End namespace asp #endif//__ASP_CORE_OUTLIER_PROCESSING_H__ ================================================ FILE: src/asp/Core/PdalUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // TODO(oalexan1): Move all LAS logic to here from PointUtils.cc, // as that file is too big and very slow to compile. // References: // https://www.asprs.org/wp-content/uploads/2019/07/LAS_1_4_r15.pdf // https://pdal.io/en/2.7.2/project/docs.html // https://github.com/PDAL/PDAL/blob/master/pdal/Dimension.json /// \file PdalUtils.cc /// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace pdal { // A class to produce a point cloud point-by-point, rather than // having it all in memory at the same time. It will be streamed to // disk. See the GDALReader in PDAL class for how to add more fields // and read from disk. class PDAL_DLL StreamedCloud: public Reader, public Streamable { public: std::string getName() const; StreamedCloud(bool has_georef, vw::ImageViewRef point_image, vw::ImageViewRef error_image, vw::ImageViewRef intensity, vw::ImageViewRef horizontal_stddev, vw::ImageViewRef vertical_stddev, bool save_triangulation_error, double max_valid_triangulation_error); ~StreamedCloud(); private: virtual void initialize(); virtual void addDimensions(PointLayoutPtr layout); virtual void ready(PointTableRef table); virtual point_count_t read(PointViewPtr view, point_count_t num); virtual void done(PointTableRef table); virtual bool processOne(PointRef& point); virtual void addArgs(ProgramArgs& args); bool m_has_georef; vw::ImageViewRef m_point_image; vw::ImageViewRef m_error_image; vw::ImageViewRef m_intensity; vw::ImageViewRef m_horizontal_stddev; vw::ImageViewRef m_vertical_stddev; bool m_save_triangulation_error; double m_max_valid_triangulation_error; // These are of type uint64_t point_count_t m_col_count, m_row_count, m_cols, m_rows; point_count_t m_count, m_size, m_num_valid_points, m_num_saved_points; vw::TerminalProgressCallback m_tpc; }; std::string StreamedCloud::getName() const { return "Ames Stereo Pipeline point cloud"; } StreamedCloud::StreamedCloud(bool has_georef, vw::ImageViewRef point_image, vw::ImageViewRef error_image, vw::ImageViewRef intensity, vw::ImageViewRef horizontal_stddev, vw::ImageViewRef vertical_stddev, bool save_triangulation_error, double max_valid_triangulation_error): m_has_georef(has_georef), m_point_image(point_image), m_error_image(error_image), m_intensity(intensity), m_horizontal_stddev(horizontal_stddev), m_vertical_stddev(vertical_stddev), m_save_triangulation_error(save_triangulation_error), m_max_valid_triangulation_error(max_valid_triangulation_error), m_col_count(0), m_row_count(0), m_cols(m_point_image.cols()), m_rows(m_point_image.rows()), m_size(m_cols * m_rows), // careful here to avoid integer overflow m_count(0), m_num_valid_points(0), m_num_saved_points(0), m_tpc(vw::TerminalProgressCallback("asp", "\t--> ")) {} StreamedCloud::~StreamedCloud() {} void StreamedCloud::initialize() {} // Set the cloud dimensions. void StreamedCloud::addDimensions(PointLayoutPtr layout) { layout->registerDim(pdal::Dimension::Id::X); layout->registerDim(pdal::Dimension::Id::Y); layout->registerDim(pdal::Dimension::Id::Z); // Co-opt the W dimension for the intensity if (m_intensity.cols() != 0 || m_intensity.rows() != 0) layout->registerDim(pdal::Dimension::Id::W); // intensity // Co-opt the TextureU dimension for the triangulation error if (m_save_triangulation_error) layout->registerDim(pdal::Dimension::Id::TextureU); // Co-opt the TextureV and TextureW dimensions for the horizontal and vertical stddev if (m_horizontal_stddev.cols() != 0 || m_horizontal_stddev.rows() != 0) layout->registerDim(pdal::Dimension::Id::TextureV); // horizontal stddev if (m_vertical_stddev.cols() != 0 || m_vertical_stddev.rows() != 0) layout->registerDim(pdal::Dimension::Id::TextureW); // vertical stddev } void StreamedCloud::addArgs(ProgramArgs& args) { } void StreamedCloud::ready(PointTableRef table) { m_count = 0; } // This function is used when a point cloud is formed fully in memory. // Not applicable here. point_count_t StreamedCloud::read(PointViewPtr view, point_count_t numPts) { throw pdal_error("The read() function must not be called in streaming mode."); return -1; } // Create one point at a time. Will ask for a point till the counter // reaches m_size. bool StreamedCloud::processOne(PointRef& point) { // Keep on going through the input cloud until a valid point // is found or until we run out of points. bool save_intensity = (m_intensity.cols() != 0 || m_intensity.rows() != 0); bool save_horizontal_stddev = (m_horizontal_stddev.cols() != 0 || m_horizontal_stddev.rows() != 0); bool save_vertical_stddev = (m_vertical_stddev.cols() != 0 || m_vertical_stddev.rows() != 0); while (1) { // Break the loop if no more points are available if (m_count >= m_size) return false; // Note how we access in col, row order, per ASP conventions vw::Vector3 xyz = m_point_image(m_col_count, m_row_count); // Skip no-data points and point above the max valid triangulation error bool valid_xyz = ((!m_has_georef && xyz != vw::Vector3()) || (m_has_georef && !std::isnan(xyz.z()))); bool valid_tri_err = (m_max_valid_triangulation_error <= 0 || m_error_image(m_col_count, m_row_count) <= m_max_valid_triangulation_error); if (valid_xyz) m_num_valid_points++; if (valid_xyz && valid_tri_err) { point.setField(Dimension::Id::X, xyz[0]); point.setField(Dimension::Id::Y, xyz[1]); point.setField(Dimension::Id::Z, xyz[2]); m_num_saved_points++; // Save the intensity as a double if (save_intensity) point.setField(Dimension::Id::W, m_intensity(m_col_count, m_row_count)); // Save the triangulation error as a double if (m_save_triangulation_error) point.setField(Dimension::Id::TextureU, m_error_image(m_col_count, m_row_count)); // Save the horizontal and vertical stddev as doubles if (save_horizontal_stddev) point.setField(Dimension::Id::TextureV, m_horizontal_stddev(m_col_count, m_row_count)); if (save_vertical_stddev) point.setField(Dimension::Id::TextureW, m_vertical_stddev(m_col_count, m_row_count)); } // Adjust the counters whether the point is good or not m_col_count++; if (m_col_count >= m_cols) { m_col_count = 0; m_row_count++; m_tpc.report_fractional_progress(m_row_count, m_rows); } m_count++; // Break the loop if a good point was found if (valid_xyz && valid_tri_err) return true; } // end while loop // This should not be reached return false; } void StreamedCloud::done(PointTableRef table) { m_tpc.report_finished(); vw::vw_out () << "Wrote: " << m_num_saved_points << " points." << std::endl; if (m_max_valid_triangulation_error > 0.0) { point_count_t num_excluded = m_num_valid_points - m_num_saved_points; double percent = 100.0 * double(num_excluded)/double(m_num_valid_points); percent = round(percent * 100.0)/100.0; // don't keep too many digits vw::vw_out() << "Excluded based on triangulation error: " << num_excluded << " points (" << percent << "%)." << std::endl; } } // End function done // A class to read a point cloud from a file point by point, without // loading it fully in memory. The points are printed to the screen. // This can be used as a template for other readers, such as the // LasLoader class. class PDAL_DLL StreamProcessor: public Writer, public Streamable { public: std::string getName() const; StreamProcessor(); ~StreamProcessor(); private: virtual void addArgs(ProgramArgs& args); virtual void initialize(); virtual void writeView(const PointViewPtr view); virtual bool processOne(PointRef& point); virtual void done(PointTableRef table); StreamProcessor& operator=(const StreamProcessor&) = delete; StreamProcessor(const StreamProcessor&) = delete; StreamProcessor(const StreamProcessor&&) = delete; }; std::string StreamProcessor::getName() const { return "StreamProcessor"; } StreamProcessor::StreamProcessor() {} StreamProcessor::~StreamProcessor() {} void StreamProcessor::addArgs(ProgramArgs& args){} void StreamProcessor::initialize(){} // This will be called for each point in the cloud. bool StreamProcessor::processOne(PointRef& point) { // Print the point coordinates std::cout << "Process point: " << point.getFieldAs(Dimension::Id::X) << ", " << point.getFieldAs(Dimension::Id::Y) << ", " << point.getFieldAs(Dimension::Id::Z) << std::endl; return true; } void StreamProcessor::done(PointTableRef table) { } void StreamProcessor::writeView(const PointViewPtr view) { throw pdal_error("The writeView() function must not be called in streaming mode."); } } // end namespace pdal namespace asp { bool georef_from_las(std::string const& las_file, vw::cartography::GeoReference & georef) { pdal::Options read_options; read_options.add("filename", las_file); pdal::LasReader reader; reader.setOptions(read_options); pdal::QuickInfo qi = reader.preview(); std::string wkt = qi.m_srs.getWKT(); if (wkt.empty()) return false; georef.set_wkt(wkt); return true; } // Read the number of points in the LAS file. For COPC files, we usually // care not for this, but for the number of points in a region. std::int64_t las_file_size(std::string const& las_file) { pdal::Options read_options; read_options.add("filename", las_file); pdal::LasReader reader; reader.setOptions(read_options); pdal::QuickInfo qi = reader.preview(); return qi.m_pointCount; } // Check if a file is in the LAS COPC format bool isCopc(std::string const& file) { bool is_copc = false; if (!asp::is_las(file)) return false; try { pdal::Options options; options.add("filename", file); pdal::CopcReader reader; reader.setOptions(options); pdal::QuickInfo qi(reader.preview()); is_copc = qi.valid(); } catch (pdal::pdal_error const& e) { is_copc = false; } return is_copc; } // Save a point cloud and triangulation error to the LAS format. void write_las(bool has_georef, vw::cartography::GeoReference const& georef, vw::ImageViewRef point_image, vw::ImageViewRef error_image, vw::ImageViewRef intensity, vw::ImageViewRef horizontal_stddev, vw::ImageViewRef vertical_stddev, vw::Vector3 const& offset, vw::Vector3 const& scale, bool compressed, bool save_triangulation_error, double max_valid_triangulation_error, std::string const& out_prefix) { // The point image and error image must have the same dimensions if ((error_image.cols() != 0 || error_image.rows() != 0) && (point_image.cols() != error_image.cols() || point_image.rows() != error_image.rows())) vw::vw_throw(vw::ArgumentErr() << "Expecting the point cloud image and the error image " << "to have the same dimensions.\n"); // If the intensity image is present, it must have the same dimensions // as the point image. if ((intensity.cols() != 0 || intensity.rows() != 0) && (point_image.cols() != intensity.cols() || point_image.rows() != intensity.rows())) vw::vw_throw(vw::ArgumentErr() << "Expecting the point cloud image and the intensity image (L.tif) " << "to have the same dimensions.\n"); // Sanity checks for horizontal and vertical stddev images if ((horizontal_stddev.cols() != 0 || horizontal_stddev.rows() != 0) && (point_image.cols() != horizontal_stddev.cols() || point_image.rows() != horizontal_stddev.rows())) vw::vw_throw(vw::ArgumentErr() << "Expecting the point cloud image and the horizontal stddev image " << "to have the same dimensions.\n"); if ((vertical_stddev.cols() != 0 || vertical_stddev.rows() != 0) && (point_image.cols() != vertical_stddev.cols() || point_image.rows() != vertical_stddev.rows())) vw::vw_throw(vw::ArgumentErr() << "Expecting the point cloud image and the vertical stddev image " << "to have the same dimensions.\n"); // Streamed cloud structure pdal::StreamedCloud stream_cloud(has_georef, point_image, error_image, intensity, horizontal_stddev, vertical_stddev, save_triangulation_error, max_valid_triangulation_error); // buf_size is the number of points that will be // processed and kept in this table at the same time. // A somewhat bigger value may result in some efficiencies. int buf_size = 1000; pdal::FixedPointTable t(buf_size); stream_cloud.prepare(t); // Set the output filename. The writer will compress the las file if the .laz // extension is used. std::string lasFile; if (compressed) lasFile = out_prefix + ".laz"; else lasFile = out_prefix + ".las"; vw::vw_out() << "Writing LAS file: " << lasFile + "\n"; pdal::Options write_options; write_options.add("filename", lasFile); write_options.add("offset_x", offset[0]); write_options.add("offset_y", offset[1]); write_options.add("offset_z", offset[2]); write_options.add("scale_x", scale[0]); write_options.add("scale_y", scale[1]); write_options.add("scale_z", scale[2]); // LAS 1.4 instead of default LAS 1.2 is needed for advanced fields if (save_triangulation_error || intensity.cols() != 0 || intensity.rows() != 0 || horizontal_stddev.cols() != 0 || horizontal_stddev.rows() != 0 || vertical_stddev.cols() != 0 || vertical_stddev.rows() != 0) { write_options.add("minor_version", 4); write_options.add("extra_dims", "all"); } if (has_georef) write_options.add("a_srs", georef.get_wkt()); pdal::LasWriter writer; writer.setOptions(write_options); writer.setInput(stream_cloud); writer.prepare(t); writer.execute(t); } // Read a LAS cloud and return a subset of it. This inherits from pdal::Writer // because it is a processing class. It brings in the data via a pdal::Reader // handle that is set when an instance of this is configured. class PDAL_DLL LasProcessor: public pdal::Writer, public pdal::Streamable { public: LasProcessor(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::cartography::GeoReference const& input_georef, bool verbose, bool calc_shift, std::int64_t num_total_points, // Outputs vw::Vector3 & shift, Eigen::MatrixXd & data): m_file_name(file_name), m_num_points_to_load(num_points_to_load), m_lonlat_box(lonlat_box), m_input_georef(input_georef), m_verbose(verbose), m_calc_shift(calc_shift), m_tpc(vw::TerminalProgressCallback("asp", "\t--> ")), m_num_total_points(num_total_points), // Outputs m_shift(shift), m_data(data) { m_data.conservativeResize(asp::DIM + 1, m_num_points_to_load); m_has_las_georef = asp::georef_from_las(m_file_name, m_las_georef); m_shift_was_calc = false; m_points_count = 0; // We will randomly pick or not a point with probability load_ratio m_load_ratio = (double)m_num_points_to_load/std::max(1.0, (double)m_num_total_points); std::int64_t hundred = 100; m_spacing = std::max(m_num_total_points/hundred, std::int64_t(1)); m_inc_amount = 1.0 / hundred; if (m_verbose) m_tpc.report_progress(0); } ~LasProcessor() {} virtual std::string getName() const { return "sample streamer"; } private: std::string m_file_name; std::int64_t m_num_points_to_load; vw::BBox2 m_lonlat_box; vw::cartography::GeoReference m_input_georef; bool m_verbose; bool m_calc_shift; bool m_has_las_georef; vw::cartography::GeoReference m_las_georef; double m_load_ratio; bool m_shift_was_calc; std::int64_t m_points_count; vw::TerminalProgressCallback m_tpc; std::int64_t m_spacing; double m_inc_amount; std::int64_t m_num_total_points; // Aliases, to be returned to the caller vw::Vector3 & m_shift; Eigen::MatrixXd & m_data; virtual void addArgs(pdal::ProgramArgs& args) {} virtual void initialize() {} // This will be called for each point in the cloud. virtual bool processOne(pdal::PointRef& point) { if (m_points_count >= m_num_points_to_load) return false; // done with reading points // try next time is above the load ratio double r = (double)std::rand()/(double)RAND_MAX; if (r > m_load_ratio) return true; // Current point vw::Vector3 xyz(point.getFieldAs(pdal::Dimension::Id::X), point.getFieldAs(pdal::Dimension::Id::Y), point.getFieldAs(pdal::Dimension::Id::Z)); if (m_has_las_georef) { // This is a projected point, convert to cartesian vw::Vector2 ll = m_las_georef.point_to_lonlat(subvector(xyz, 0, 2)); xyz = m_las_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], xyz[2])); } if (m_calc_shift && !m_shift_was_calc) { m_shift = xyz; m_shift_was_calc = true; } // Skip points outside the given box. Here we use the input georef. // It is assumed that if the box is non-empty then this georef is valid. if (!m_lonlat_box.empty()) { vw::Vector3 llh = m_input_georef.datum().cartesian_to_geodetic(xyz); if (!m_lonlat_box.contains(subvector(llh, 0, 2))) return true; } // Save this point for (int row = 0; row < asp::DIM; row++) m_data(row, m_points_count) = xyz[row] - m_shift[row]; m_data(asp::DIM, m_points_count) = 1; // last field if (m_verbose && m_points_count % m_spacing == 0) m_tpc.report_incremental_progress(m_inc_amount); m_points_count++; return true; } virtual void writeView(const pdal::PointViewPtr view) { throw pdal::pdal_error("The writeView() function must not be called in streaming mode."); } // To be called after all the points are read. virtual void done(pdal::PointTableRef table) { m_data.conservativeResize(Eigen::NoChange, m_points_count); if (m_verbose) m_tpc.report_finished(); } LasProcessor& operator=(const LasProcessor&) = delete; LasProcessor(const LasProcessor&) = delete; LasProcessor(const LasProcessor&&) = delete; }; // A filter to apply a transform to a cloud. Each point is processed in // streaming mode, without loading the entire point cloud into memory. May // adjust the scale and offset in the header of the output file. class PDAL_DLL TransformFilter: public pdal::Filter, public pdal::Streamable { public: std::string getName() const { return "transform_filter"; } TransformFilter(std::int64_t num_total_points, bool has_georef, vw::cartography::GeoReference const& georef, Eigen::MatrixXd const& T): m_has_georef(has_georef), m_georef(georef), m_T(T), m_tpc(vw::TerminalProgressCallback("asp", "\t--> ")) { int hundred = 100; m_spacing = std::max(num_total_points/hundred, std::int64_t(1)); m_inc_amount = 1.0 / double(hundred); m_count = 0; } ~TransformFilter() {} private: // Apply a transform to each point virtual bool processOne(pdal::PointRef& point) { // Initial point vw::Vector3 P(point.getFieldAs(pdal::Dimension::Id::X), point.getFieldAs(pdal::Dimension::Id::Y), point.getFieldAs(pdal::Dimension::Id::Z)); if (m_has_georef) { // This is a projected point, convert to cartesian vw::Vector2 ll = m_georef.point_to_lonlat(subvector(P, 0, 2)); P = m_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], P[2])); } // Apply the transform P = asp::apply_transform_to_vec(m_T, P); if (m_has_georef) { // Go back to projected space vw::Vector3 llh = m_georef.datum().cartesian_to_geodetic(P); subvector(P, 0, 2) = m_georef.lonlat_to_point(subvector(llh, 0, 2)); P[2] = llh[2]; } // Put the point back point.setField(pdal::Dimension::Id::X, P[0]); point.setField(pdal::Dimension::Id::Y, P[1]); point.setField(pdal::Dimension::Id::Z, P[2]); // Update the progress and the counter if (m_count % m_spacing == 0) m_tpc.report_incremental_progress(m_inc_amount); m_count++; return true; } virtual void done(pdal::PointTableRef table) { m_tpc.report_finished(); } bool m_has_georef; vw::cartography::GeoReference m_georef; Eigen::MatrixXd m_T; std::int64_t m_spacing; double m_inc_amount; std::int64_t m_count; vw::TerminalProgressCallback m_tpc; }; // Set up a reader for a LAS or COPC file void setupLasOrCopcReader(std::string const& in_file, vw::BBox2 const& copc_win, bool copc_read_all, boost::shared_ptr& pdal_reader, pdal::Options& read_options, std::int64_t & num_total_points) { read_options.add("filename", in_file); if (asp::isCopc(in_file)) { // Set the input point cloud. COPC is a streaming format, and need to fetch // the data in a box. pdal_reader.reset(new pdal::CopcReader()); if (copc_win == vw::BBox2() && !copc_read_all) vw::vw_throw(vw::ArgumentErr() << "Detected COPC file: " << in_file << ".\n" << "Set either the copc-win or copc-read-all option (the precise names " << "depends the invoked tool).\n"); if (!copc_read_all) { pdal::BOX2D bounds(copc_win.min().x(), copc_win.min().y(), copc_win.max().x(), copc_win.max().y()); read_options.add("bounds", bounds); } } else { pdal_reader.reset(new pdal::LasReader()); } pdal_reader->setOptions(read_options); // Note: For COPC files, the number of total points in the desired region // is a very rough estimate, and can be off by up to a factor of 10. // These are necessary to avoid a segfault in PDAL. It is not clear if it is // important to "execute" over a large table, or what exactly it is doing. pdal::PointTable table; pdal_reader->prepare(table); const auto set(pdal_reader->execute(table)); pdal::QuickInfo qi(pdal_reader->preview()); num_total_points = qi.m_pointCount; } // This is a helper function. Use instead load_las(). This function attempts to // load a given number of points but does no no checks on how many are loaded. // This returns the total number of points in the file, not the number of loaded // points. std::int64_t load_las_aux(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::cartography::GeoReference const& geo, bool verbose, vw::BBox2 const& copc_win, bool copc_read_all, bool calc_shift, // Outputs vw::Vector3 & shift, Eigen::MatrixXd & data) { // Set the input point cloud boost::shared_ptr pdal_reader; pdal::Options read_options; std::int64_t num_total_points = 0; // will change setupLasOrCopcReader(file_name, copc_win, copc_read_all, pdal_reader, read_options, num_total_points); // buf_size is the number of points that will be processed and kept in this // table at the same time. A somewhat bigger value may result in some // efficiencies. int buf_size = 100; pdal::FixedPointTable t(buf_size); pdal_reader->prepare(t); // Read the data asp::LasProcessor las_proc(file_name, num_points_to_load, lonlat_box, geo, verbose, calc_shift, num_total_points, // Outputs shift, data); pdal::Options proc_options; proc_options.add("filename", file_name); las_proc.setOptions(proc_options); las_proc.setInput(*pdal_reader); las_proc.prepare(t); las_proc.execute(t); return num_total_points; } // Try to load at least this many points from the LAS file. // TODO(oalexan1): This function should reduce the number of points // if they are too many. void load_las(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::BBox2 const& copc_win, bool copc_read_all, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, bool verbose, Eigen::MatrixXd & data) { std::int64_t num_total_points = load_las_aux(file_name, num_points_to_load, lonlat_box, geo, verbose, copc_win, copc_read_all, calc_shift, shift, data); // outputs int num_loaded_points = data.cols(); if (!lonlat_box.empty() && num_loaded_points < num_points_to_load && num_loaded_points < num_total_points) { // We loaded too few points. Try harder. Need some care here as to not run // out of memory. num_points_to_load = std::max(4*num_points_to_load, std::int64_t(10000000)); if (verbose) vw::vw_out() << "Too few points were loaded. Trying again." << std::endl; load_las_aux(file_name, num_points_to_load, lonlat_box, geo, verbose, copc_win, copc_read_all, calc_shift, shift, data); // outputs } } // Apply a given transform to a LAS file and save it. void apply_transform_to_las(std::string const& input_file, std::string const& output_file, vw::BBox2 const& copc_win, bool copc_read_all, Eigen::MatrixXd const& T) { // Set the input point cloud boost::shared_ptr pdal_reader; pdal::Options read_options; std::int64_t num_total_points = 0; // will change setupLasOrCopcReader(input_file, copc_win, copc_read_all, pdal_reader, read_options, num_total_points); // buf_size is the number of points that will be // processed and kept in this table at the same time. // A somewhat bigger value may result in some efficiencies. int buf_size = 100; pdal::FixedPointTable t(buf_size); pdal_reader->prepare(t); // Get the scale and offset. Must be run after the table is prepared. vw::Vector3 offset, scale; pdal::CopcReader *copc_reader = dynamic_cast(pdal_reader.get()); pdal::LasReader *las_reader = dynamic_cast(pdal_reader.get()); if (copc_reader != NULL) { pdal::QuickInfo qi(copc_reader->preview()); pdal::BOX3D bounds = qi.m_bounds; // The offset is the center point offset = vw::Vector3((bounds.minx + bounds.maxx)/2.0, (bounds.miny + bounds.maxy)/2.0, (bounds.minz + bounds.maxz)/2.0); // Let the scale be about 1 mm. Ensure it won't result in integer overflow, // with a margin. double max_len = std::max(bounds.maxx - bounds.minx, bounds.maxy - bounds.miny); max_len = std::max(max_len, bounds.maxz - bounds.minz); double s = std::max(1e-3, max_len / 1e+9); scale = vw::Vector3(s, s, s); } else if (las_reader != NULL) { pdal::LasHeader const& header = las_reader->header(); offset = vw::Vector3(header.offsetX(), header.offsetY(), header.offsetZ()); scale = vw::Vector3(header.scaleX(), header.scaleY(), header.scaleZ()); } else { vw::vw_throw(vw::IOErr() << "Unknown LAS file type: " << input_file); } vw::cartography::GeoReference las_georef; bool has_georef = asp::georef_from_las(input_file, las_georef); // Set up the filter asp::TransformFilter transform_filter(num_total_points, has_georef, las_georef, T); transform_filter.setInput(*pdal_reader); transform_filter.prepare(t); // If the data is in ECEF, apply the same transform to the offset and scale as // to the data. This way the internal representation of the data changes very // little, and the data is still well-normalized. if (!has_georef) { offset = asp::apply_transform_to_vec(T, offset); scale = asp::apply_transform_to_vec(T, scale); } // Set up the output file pdal::Options write_options; write_options.add("filename", output_file); // Set up the scale and offset for the output write_options.add("offset_x", offset[0]); write_options.add("offset_y", offset[1]); write_options.add("offset_z", offset[2]); write_options.add("scale_x", scale[0]); write_options.add("scale_y", scale[1]); write_options.add("scale_z", scale[2]); // Write the output file pdal::LasWriter writer; writer.setOptions(write_options); writer.setInput(transform_filter); writer.prepare(t); writer.execute(t); } } // End namespace asp ================================================ FILE: src/asp/Core/PdalUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PdalUtils.h /// // Utility functions that use PDAL #ifndef __ASP_CORE_PDAL_UTILS_H__ #define __ASP_CORE_PDAL_UTILS_H__ #include #include #include #include #include // Forward declaration of georef namespace vw { namespace cartography { class GeoReference; } } namespace pdal { class Reader; class Options; } namespace asp { // Read the number of points in the LAS file. For COPC files, we usually // care not for this, but for the number of points in a region. std::int64_t las_file_size(std::string const& las_file); // Read the georef from the las file and return true if the georef exists bool georef_from_las(std::string const& las_file, vw::cartography::GeoReference & georef); // Check if a file is in the LAS COPC format bool isCopc(std::string const& file); // Save a point cloud and triangulation error to the LAS format. void write_las(bool has_georef, vw::cartography::GeoReference const& georef, vw::ImageViewRef point_image, vw::ImageViewRef error_image, vw::ImageViewRef intensity, vw::ImageViewRef horizontal_stddev, vw::ImageViewRef vertical_stddev, vw::Vector3 const& offset, vw::Vector3 const& scale, bool compressed, bool save_triangulation_error, double max_valid_triangulation_error, std::string const& out_prefix); // Try to load at least this many points from the LAS file. // TODO(oalexan1): This function should reduce the number of points // if they are too many. void load_las(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::BBox2 const& copc_win, bool copc_read_all, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, bool verbose, Eigen::MatrixXd & data); // Apply a given transform to a LAS file and save it. void apply_transform_to_las(std::string const& input_file, std::string const& output_file, vw::BBox2 const& copc_win, bool copc_read_all, Eigen::MatrixXd const& T); // Set up a reader for a LAS or COPC file void setupLasOrCopcReader(std::string const& in_file, vw::BBox2 const& copc_win, bool copc_read_all, boost::shared_ptr& pdal_reader, pdal::Options& read_options, std::int64_t & num_total_points); } // End namespace asp #endif ================================================ FILE: src/asp/Core/PhotometricOutlier.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PhotometricOutlier.cc /// /// Warning: This code was written with only the Apollo Metric data in mind #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; using namespace vw; using namespace asp; void asp::photometric_outlier_rejection(vw::GdalWriteOptions const& opt, std::string const& prefix, std::string const& input_disparity, std::string & output_disparity, int kernel_size) { // Projecting right into perspective of left DiskImageView> right_disk_image(prefix+"-R.tif"); DiskImageView> disparity_disk_image( input_disparity ); stereo::DisparityTransform trans( disparity_disk_image ); std::string cache_dir = "/tmp"; // modify here to use a different cache dir if needed if (!fs::is_directory(cache_dir)) { vw_out() << "\nCreating cache directory: " << cache_dir << std::endl; fs::create_directories(cache_dir); } DiskCacheImageView> right_proj( transform( right_disk_image, trans, ZeroEdgeExtension()), "tif", TerminalProgressCallback("asp","Projecting R:"), cache_dir); // Differencing Left and Projected Right ImageViewRef>> right_mask = create_mask(right_proj); DiskImageView> left_image(prefix+"-L.tif"); DiskCacheImageView> diff( abs(apply_mask(copy_mask(left_image,right_mask))-right_proj), "tif", TerminalProgressCallback("asp","\tDifference:"), cache_dir); ChannelAccumulator> cdf; cdf.resize(8000,2001); for_each_pixel(diff, cdf); float thresh = cdf.quantile(0.99985); // Pulling out last bin of CDF vw_out() << "\t Using threshold: " << thresh << "\n"; // Thresholding image and dilating ImageView> dust = threshold(apply_mask(copy_mask(diff,right_mask)),thresh,1.0,0.0); ImageView> grass; grassfire(dust,grass); dust = gaussian_filter(grass,kernel_size/3); ImageViewRef> cleaned_disparity = intersect_mask(disparity_disk_image, intersect_mask(create_mask(threshold(dust,kernel_size,0.0,1.0)),right_mask)); vw::cartography::block_write_gdal_image(prefix + "-FDust.tif", cleaned_disparity, opt, TerminalProgressCallback("asp", "Dust Removal:") ); } ================================================ FILE: src/asp/Core/PhotometricOutlier.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PhotometricOutlier.h /// /// Warning: This code was written with only the Apollo Metric data in mind #ifndef __STEREO_CORE_PHOTOMETRIC_OUTLIER_H__ #define __STEREO_CORE_PHOTOMETRIC_OUTLIER_H__ #include // Forward declaration namespace vw{ struct GdalWriteOptions; } namespace asp { void photometric_outlier_rejection(vw::GdalWriteOptions const& opt, std::string const& prefix, std::string const& input_disparity, std::string & output_disparity, int kernel_size); } #endif //__STEREO_CORE_PHOTOMETRIC_OUTLIER_H__ ================================================ FILE: src/asp/Core/Point2Grid.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include namespace asp { // =========================================================================== // Class Member Functions // =========================================================================== Point2Grid::Point2Grid(int width, int height, vw::ImageView & buffer, vw::ImageView & weights, double x0, double y0, double grid_size, double min_spacing, double radius, double sigma_factor, FilterType filter, double percentile): m_width(width), m_height(height), m_buffer(buffer), m_weights(weights), m_x0(x0), m_y0(y0), m_grid_size(grid_size), m_radius(radius), m_filter(filter), m_percentile(percentile) { if (m_grid_size <= 0) vw::vw_throw(vw::ArgumentErr() << "Point2Grid: Grid size must be > 0.\n"); if (m_radius <= 0) vw::vw_throw(vw::ArgumentErr() << "Point2Grid: Search radius must be > 0.\n"); if (m_filter == f_percentile && (m_percentile < 0 || m_percentile > 100.0)) vw::vw_throw(vw::ArgumentErr() << "Point2Grid: Expecting the percentile in the range 0.0 to 100.0.\n"); // Stop here if we don't need to create gaussian weights if (m_filter != f_weighted_average) return; // By the time we reached the distance 'spacing' from the origin, we // want the Gaussian exp(-sigma*x^2) to decay to given value. Note // that the user may choose to make the grid size very small, but we // put a limit to how small 'spacing' gets, that is, how large sigma // gets, to ensure that the DEM stays smooth. double spacing = std::max(grid_size, min_spacing); double val = 0.25; double sigma = -std::log(val)/spacing/spacing; // Override this if passed from outside if (sigma_factor > 0) sigma = sigma_factor/spacing/spacing; // Sample the gaussian for speed int num_samples = 1000; m_dx = m_radius/(num_samples - 1.0); m_sampled_gauss.resize(num_samples); for (int k = 0; k < num_samples; k++) { double dist = k*m_dx; m_sampled_gauss[k] = std::exp(-sigma*dist*dist); } } void Point2Grid::Clear(const float value) { m_buffer.set_size (m_width, m_height); m_weights.set_size (m_width, m_height); for (int c = 0; c < m_buffer.cols(); c++) { for (int r = 0; r < m_buffer.rows(); r++) { m_buffer (c, r) = value; // usually this is the no-data value m_weights(c, r) = 0.0; } } // For these we need to keep all values (in fact, for stddev we could get away with less, // but it is not worth trying so hard). if (m_filter == f_median || m_filter == f_stddev || m_filter == f_nmad || m_filter == f_percentile) { m_vals.set_size(m_width, m_height); } } void Point2Grid::AddPoint(double x, double y, double z) { int minx = std::max((int)std::ceil((x - m_radius - m_x0)/m_grid_size), 0); int miny = std::max((int)std::ceil((y - m_radius - m_y0)/m_grid_size), 0); int maxx = std::min((int)std::floor((x + m_radius - m_x0)/m_grid_size), m_buffer.cols() - 1); int maxy = std::min((int)std::floor((y + m_radius - m_y0)/m_grid_size), m_buffer.rows() - 1); // Add the contribution of current point to all grid points within radius for (int ix = minx; ix <= maxx; ix++) { for (int iy = miny; iy <= maxy; iy++) { double gx = m_x0 + ix*m_grid_size; double gy = m_y0 + iy*m_grid_size; double dist = std::sqrt((x-gx)*(x-gx) + (y-gy)*(y-gy)); if (dist > m_radius) continue; if (m_filter == f_weighted_average) { double wt = m_sampled_gauss[(int)std::round(dist/m_dx)]; if (wt <= 0) continue; if (m_weights(ix, iy) == 0) m_buffer(ix, iy) = 0.0; // set to 0 before incrementing below m_buffer(ix, iy) += z*wt; m_weights(ix, iy) += wt; } else if (m_filter == f_mean) { if (m_weights(ix, iy) == 0) m_buffer(ix, iy) = 0.0; // set to 0 before incrementing below m_buffer(ix, iy) += z; m_weights(ix, iy) += 1; } else if (m_filter == f_min) { if (m_weights(ix, iy) == 0) { m_buffer(ix, iy) = z; // first time we set the value m_weights(ix, iy) = 1; // mark the fact that the buffer was initialized } else m_buffer(ix, iy) = std::min(m_buffer(ix, iy), z); } else if (m_filter == f_max) { if (m_weights(ix, iy) == 0) { m_buffer(ix, iy) = z; // first time we set the value m_weights(ix, iy) = 1; // mark the fact that the buffer was initialized } else m_buffer(ix, iy) = std::max(m_buffer(ix, iy), z); } else if (m_filter == f_count) { if (m_weights(ix, iy) == 0) { m_weights(ix, iy) = 1; // mark the fact that the buffer was initialized } else m_weights(ix, iy) += 1; } else if (m_filter == f_stddev || m_filter == f_median || m_filter == f_nmad || m_filter == f_percentile) { m_vals(ix, iy).push_back(z); // not strictly needed for stddev } } } } void Point2Grid::normalize() { for (int c = 0; c < m_buffer.cols(); c++) { for (int r = 0; r < m_buffer.rows(); r++) { if (m_filter == f_weighted_average || m_filter == f_mean) { if (m_weights(c, r) > 0) m_buffer (c, r) /= m_weights(c, r); } else if (m_filter == f_count) m_buffer(c, r) = m_weights(c, r); // hence instead of no-data we will have always 0 else if (m_filter == f_stddev) { if (m_vals(c, r).empty()) continue; // nothing to compute vw::math::StdDevAccumulator V; for (std::size_t it = 0; it < m_vals(c, r).size(); it++) V(m_vals(c, r)[it]); m_buffer(c, r) = V.value(); } else if (m_filter == f_median) { if (m_vals(c, r).empty()) continue; // nothing to compute vw::math::MedianAccumulator V; for (std::size_t it = 0; it < m_vals(c, r).size(); it++) V(m_vals(c, r)[it]); m_buffer(c, r) = V.value(); } else if (m_filter == f_nmad) { if (m_vals(c, r).empty()) continue; // nothing to compute m_buffer(c, r) = vw::math::destructive_nmad(m_vals(c, r)); } else if (m_filter == f_percentile) { if (m_vals(c, r).empty()) continue; // nothing to compute m_buffer(c, r) = vw::math::destructive_percentile(m_vals(c, r), m_percentile); } } } } } // end namespace asp ================================================ FILE: src/asp/Core/Point2Grid.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file Point2Grid.h /// #ifndef __VW_POINT2GRID_H__ #define __VW_POINT2GRID_H__ #include namespace asp { // The type of filter to apply to points within a circular bin. enum FilterType {f_weighted_average, f_min, f_max, f_mean, f_median, f_stddev, f_count, f_nmad, f_percentile}; /// Given a set of xyz points, create an xy grid. For every node in the /// grid, combine all points within given radius of the grid point and /// calculate a single z value at the grid point. class Point2Grid { public: Point2Grid(int width, int height, vw::ImageView & buffer, vw::ImageView & weights, double x0, double y0, double grid_size, double min_spacing, double radius, double sigma_factor, FilterType filter, double percentile); ~Point2Grid(){} void Clear (const float val); void AddPoint (double x, double y, double z); void normalize(); private: int m_width, m_height; // DEM dimensions vw::ImageView & m_buffer; vw::ImageView & m_weights; vw::ImageView< std::vector > m_vals; // when need to keep all individual values double m_x0, m_y0; // lower-left corner double m_grid_size; // spacing between output DEM pixels double m_radius; // how far to search for cloud points double m_dx; // spacing between samples std::vector m_sampled_gauss; FilterType m_filter; double m_percentile; // The actual value of the percentile to use if in that mode }; } #endif // __VW_POINT2GRID_H__ ================================================ FILE: src/asp/Core/PointCloudAlignment.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Utilities used in cloud alignment that make use of PDAL. /// \file PointCloudAlignment.cc #include #include #include #include // PDAL includes #include #include #include #include #include #include #include #include #include namespace asp { // Read a LAS cloud and return a subset of it. This inherits from pdal::Writer // because it is a processing class. It brings in the data via a pdal::Reader // handle that is set when an instance of this is configured. class PDAL_DLL LasProcessor: public pdal::Writer, public pdal::Streamable { public: LasProcessor(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::cartography::GeoReference const& input_georef, bool verbose, bool calc_shift, // Outputs std::int64_t & num_total_points, vw::Vector3 & shift, Eigen::MatrixXd & data): m_file_name(file_name), m_num_points_to_load(num_points_to_load), m_lonlat_box(lonlat_box), m_input_georef(input_georef), m_verbose(verbose), m_calc_shift(calc_shift), m_tpc(vw::TerminalProgressCallback("asp", "\t--> ")), // Outputs m_num_total_points(num_total_points), m_shift(shift), m_data(data) { m_data.conservativeResize(asp::DIM + 1, m_num_points_to_load); m_has_las_georef = asp::georef_from_las(m_file_name, m_las_georef); m_shift_was_calc = false; m_points_count = 0; // We will randomly pick or not a point with probability load_ratio m_num_total_points = asp::las_file_size(m_file_name); m_load_ratio = (double)m_num_points_to_load/std::max(1.0, (double)m_num_total_points); std::int64_t hundred = 100; m_spacing = std::max(m_num_total_points/hundred, std::int64_t(1)); m_inc_amount = 1.0 / hundred; if (m_verbose) m_tpc.report_progress(0); } ~LasProcessor() {} virtual std::string getName() const { return "sample streamer"; } private: std::string m_file_name; std::int64_t m_num_points_to_load; vw::BBox2 m_lonlat_box; vw::cartography::GeoReference m_input_georef; bool m_verbose; bool m_calc_shift; bool m_has_las_georef; vw::cartography::GeoReference m_las_georef; double m_load_ratio; bool m_shift_was_calc; std::int64_t m_points_count; vw::TerminalProgressCallback m_tpc; std::int64_t m_spacing; double m_inc_amount; // Aliases, to be returned to the caller std::int64_t & m_num_total_points; vw::Vector3 & m_shift; Eigen::MatrixXd & m_data; virtual void addArgs(pdal::ProgramArgs& args) {} virtual void initialize() {} // This will be called for each point in the cloud. virtual bool processOne(pdal::PointRef& point) { if (m_points_count >= m_num_points_to_load) return false; // done with reading points // try next time is above the load ratio double r = (double)std::rand()/(double)RAND_MAX; if (r > m_load_ratio) return true; // Current point vw::Vector3 xyz(point.getFieldAs(pdal::Dimension::Id::X), point.getFieldAs(pdal::Dimension::Id::Y), point.getFieldAs(pdal::Dimension::Id::Z)); if (m_has_las_georef) { // This is a projected point, convert to cartesian vw::Vector2 ll = m_las_georef.point_to_lonlat(subvector(xyz, 0, 2)); xyz = m_las_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], xyz[2])); } if (m_calc_shift && !m_shift_was_calc) { m_shift = xyz; m_shift_was_calc = true; } // Skip points outside the given box. Here we use the input georef. // It is assumed that if the box is non-empty then this georef is valid. if (!m_lonlat_box.empty()) { vw::Vector3 llh = m_input_georef.datum().cartesian_to_geodetic(xyz); if (!m_lonlat_box.contains(subvector(llh, 0, 2))) return true; } // Save this point for (int row = 0; row < asp::DIM; row++) m_data(row, m_points_count) = xyz[row] - m_shift[row]; m_data(asp::DIM, m_points_count) = 1; // last field if (m_verbose && m_points_count % m_spacing == 0) m_tpc.report_incremental_progress(m_inc_amount); m_points_count++; return true; } virtual void writeView(const pdal::PointViewPtr view) { throw pdal::pdal_error("The writeView() function must not be called in streaming mode."); } // To be called after all the points are read. virtual void done(pdal::PointTableRef table) { m_data.conservativeResize(Eigen::NoChange, m_points_count); if (m_verbose) m_tpc.report_finished(); } LasProcessor& operator=(const LasProcessor&) = delete; LasProcessor(const LasProcessor&) = delete; LasProcessor(const LasProcessor&&) = delete; }; // A filter to apply a transform to a cloud. Each point is processed in // streaming mode, without loading the entire point cloud into memory. May // adjust the scale and offset in the header of the output file. class PDAL_DLL TransformFilter: public pdal::Filter, public pdal::Streamable { public: std::string getName() const { return "transform_filter"; } TransformFilter(std::int64_t num_total_points, bool has_georef, vw::cartography::GeoReference const& georef, Eigen::MatrixXd const& T): m_has_georef(has_georef), m_georef(georef), m_T(T), m_tpc(vw::TerminalProgressCallback("asp", "\t--> ")) { int hundred = 100; m_spacing = std::max(num_total_points/hundred, std::int64_t(1)); m_inc_amount = 1.0 / double(hundred); m_count = 0; } ~TransformFilter() {} private: // Apply a transform to each point virtual bool processOne(pdal::PointRef& point) { // Initial point vw::Vector3 P(point.getFieldAs(pdal::Dimension::Id::X), point.getFieldAs(pdal::Dimension::Id::Y), point.getFieldAs(pdal::Dimension::Id::Z)); if (m_has_georef) { // This is a projected point, convert to cartesian vw::Vector2 ll = m_georef.point_to_lonlat(subvector(P, 0, 2)); P = m_georef.datum().geodetic_to_cartesian(vw::Vector3(ll[0], ll[1], P[2])); } // Apply the transform P = asp::apply_transform_to_vec(m_T, P); if (m_has_georef) { // Go back to projected space vw::Vector3 llh = m_georef.datum().cartesian_to_geodetic(P); subvector(P, 0, 2) = m_georef.lonlat_to_point(subvector(llh, 0, 2)); P[2] = llh[2]; } // Put the point back point.setField(pdal::Dimension::Id::X, P[0]); point.setField(pdal::Dimension::Id::Y, P[1]); point.setField(pdal::Dimension::Id::Z, P[2]); // Update the progress and the counter if (m_count % m_spacing == 0) m_tpc.report_incremental_progress(m_inc_amount); m_count++; return true; } virtual void done(pdal::PointTableRef table) { m_tpc.report_finished(); } bool m_has_georef; vw::cartography::GeoReference m_georef; Eigen::MatrixXd m_T; std::int64_t m_spacing; double m_inc_amount; std::int64_t m_count; vw::TerminalProgressCallback m_tpc; }; // This is a helper function. Use instead load_las(). This // function attempts to load a given number of points but does no no checks on // how many are loaded. std::int64_t load_las_aux(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::cartography::GeoReference const& geo, bool verbose, bool calc_shift, // Outputs vw::Vector3 & shift, Eigen::MatrixXd & data) { // Set the input point cloud pdal::Options read_options; read_options.add("filename", file_name); pdal::LasReader pdal_reader; pdal_reader.setOptions(read_options); // buf_size is the number of points that will be processed and kept in this // table at the same time. A somewhat bigger value may result in some // efficiencies. int buf_size = 100; pdal::FixedPointTable t(buf_size); pdal_reader.prepare(t); // Read the data std::int64_t num_total_points = 0; asp::LasProcessor las_proc(file_name, num_points_to_load, lonlat_box, geo, verbose, calc_shift, // Outputs num_total_points, shift, data); pdal::Options proc_options; las_proc.setOptions(proc_options); las_proc.setInput(pdal_reader); las_proc.prepare(t); las_proc.execute(t); return num_total_points; } // Apply a given transform to a LAS file and save it. void apply_transform_to_las(std::string const& input_file, std::string const& output_file, Eigen::MatrixXd const& T) { // buf_size is the number of points that will be // processed and kept in this table at the same time. // A somewhat bigger value may result in some efficiencies. int buf_size = 500; pdal::FixedPointTable t(buf_size); // Set the input point cloud pdal::Options read_options; read_options.add("filename", input_file); pdal::LasReader reader; reader.setOptions(read_options); reader.prepare(t); // Get the scale and offset from the input cloud header // Must be run after the table is prepared const pdal::LasHeader & header = reader.header(); vw::Vector3 offset(header.offsetX(), header.offsetY(), header.offsetZ()); vw::Vector3 scale (header.scaleX(), header.scaleY(), header.scaleZ()); std::int64_t num_total_points = asp::las_file_size(input_file); vw::cartography::GeoReference las_georef; bool has_georef = asp::georef_from_las(input_file, las_georef); // Set up the filter asp::TransformFilter transform_filter(num_total_points, has_georef, las_georef, T); transform_filter.setInput(reader); transform_filter.prepare(t); // If the data is in ECEF, apply the same transform to the offset and scale as // to the data. This way the internal representation of the data changes very // little, and the data is still well-normalized. if (!has_georef) { offset = asp::apply_transform_to_vec(T, offset); scale = asp::apply_transform_to_vec(T, scale); } // Set up the output file pdal::Options write_options; write_options.add("filename", output_file); // Set up the scale and offset for the output write_options.add("offset_x", offset[0]); write_options.add("offset_y", offset[1]); write_options.add("offset_z", offset[2]); write_options.add("scale_x", scale[0]); write_options.add("scale_y", scale[1]); write_options.add("scale_z", scale[2]); // Write the output file pdal::LasWriter writer; writer.setOptions(write_options); writer.setInput(transform_filter); writer.prepare(t); writer.execute(t); } } // end namespace asp ================================================ FILE: src/asp/Core/PointCloudAlignment.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PointCloudAlignment.h /// // Utilities used in cloud alignment that make use of PDAL. #ifndef __ASP_CORE_POINT_CLOUD_ALIGNMENT_H__ #define __ASP_CORE_POINT_CLOUD_ALIGNMENT_H__ #include #include #include #include #include namespace vw { class GdalWriteOptions; namespace cartography { class GeoReference; } } namespace asp { // This is a helper function. Use instead load_las(). This // function attempts to load a given number of points but does no no checks on // how many are loaded. std::int64_t load_las_aux(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::cartography::GeoReference const& geo, bool verbose, bool calc_shift, // Outputs vw::Vector3 & shift, Eigen::MatrixXd & data); // Apply a given transform to a LAS file and save it. void apply_transform_to_las(std::string const& input_file, std::string const& output_file, Eigen::MatrixXd const& T); } // End namespace asp #endif // __ASP_CORE_POINT_CLOUD_ALIGNMENT_H__ ================================================ FILE: src/asp/Core/PointCloudProcessing.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Process point clouds. This makes use of PDAL and ASP's CSV logic. /// \file PointCloudProcessing.cc #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Read through las points in streaming fashion. When a given amount is collected, // write a chip to disk. namespace asp { class PDAL_DLL ChipMaker: public pdal::Writer, public pdal::Streamable { public: std::string getName() const { return "chip maker"; } // Go through a LAS file and write to disk spatially organized tiles. // Also converts along the way from projected coordinates (if applicable) // to ECEF. // tile_len is big, but chip_size is small. ChipMaker(std::int64_t tile_len, std::int64_t chip_size, bool has_georef, vw::cartography::GeoReference const& georef, vw::GdalWriteOptions & opt, // will change std::string const& out_prefix, std::vector & out_files): m_tile_len(tile_len), m_chip_size(chip_size), m_has_georef(has_georef), m_georef(georef), m_opt(opt), m_out_prefix(out_prefix), m_out_files(out_files), m_tile_count(0), m_buf(vw::PointBuffer()) { // This is a bugfix for the LAS file not having the georef transform. It // has only the projection. This results in all kind of warnings. Ensure a // proper fictitious transform to make the warnings go away. vw::Matrix trans = m_georef.transform(); if (trans(1, 1) > 0) { double small = 1e-8; trans(0, 0) = small; trans(1, 1) = -small; m_georef.set_transform(trans); } } ~ChipMaker() {} private: std::int64_t m_tile_len; std::int64_t m_chip_size; bool m_has_georef; vw::cartography::GeoReference m_georef; vw::GdalWriteOptions & m_opt; std::string m_out_prefix; // output files will start with this prefix std::vector & m_out_files; // alias, used for output std::int64_t m_tile_count; vw::PointBuffer m_buf; // Call this when the buffer is full or when we are done reading. // Organize the points in small chips, with points in each chip // being spatially close together. Then write each chip to disk. void processBuf() { if (m_buf.empty()) return; // Make the chips vw::ImageView Img; vw::Chipper(m_buf, m_chip_size, m_has_georef, m_georef, m_tile_len, m_tile_len, Img); // Create a file of the form tile with index m_tile_count std::ostringstream os; os << m_out_prefix << "-" << m_tile_count << ".tif"; std::string out_file = os.str(); m_out_files.push_back(out_file); vw::vw_out() << "Writing temporary file: " << out_file << "\n"; bool has_nodata = false; double nodata = -std::numeric_limits::max(); vw::TerminalProgressCallback tpc("asp", "\t--> "); vw::GdalWriteOptions local_opt = m_opt; local_opt.cog = false; // Do not use COG with temporary files vw::cartography::block_write_gdal_image(out_file, Img, m_has_georef, m_georef, has_nodata, nodata, local_opt, tpc); // Wipe the buf when done and increment the tile count m_buf.clear(); m_tile_count++; } // This will be called for each point in the cloud. virtual bool processOne(pdal::PointRef& point) { // Current point vw::Vector3 pt(point.getFieldAs(pdal::Dimension::Id::X), point.getFieldAs(pdal::Dimension::Id::Y), point.getFieldAs(pdal::Dimension::Id::Z)); m_buf.push_back(pt); // If the buffer is full, process it std::int64_t max_num_pts_to_read = m_tile_len * m_tile_len; if (m_buf.size() >= max_num_pts_to_read) processBuf(); return true; } // To be called after all the points are read. virtual void done(pdal::PointTableRef table) { // Process the rest of the points processBuf(); } // Part of the API, not used here. virtual void writeView(const pdal::PointViewPtr view) { throw pdal::pdal_error("The writeView() function must not be called in streaming mode."); } virtual void addArgs(pdal::ProgramArgs& args) {} virtual void initialize() {} ChipMaker& operator=(const ChipMaker&) = delete; ChipMaker(const ChipMaker&) = delete; ChipMaker(const ChipMaker&&) = delete; }; class CsvReader: public BaseReader { std::string m_csv_file; asp::CsvConv m_csv_conv; bool m_is_first_line; bool m_has_valid_point; vw::Vector3 m_curr_point; std::ifstream * m_ifs; public: CsvReader(std::string const & csv_file, asp::CsvConv const& csv_conv, vw::cartography::GeoReference const& georef): m_csv_file(csv_file), m_csv_conv(csv_conv), m_is_first_line(true), m_has_valid_point(false) { // We will convert from projected space to xyz, unless points // are already in this format. m_has_georef = (m_csv_conv.format != asp::CsvConv::XYZ); m_georef = georef; m_num_points = asp::csv_file_size(m_csv_file); m_ifs = new std::ifstream (m_csv_file.c_str()); if (!*m_ifs) vw::vw_throw(vw::IOErr() << "Unable to open file: " << m_csv_file << "\n"); VW_ASSERT(m_csv_conv.csv_format_str != "", vw::ArgumentErr() << "CsvReader: The CSV format was not specified.\n"); } virtual bool ReadNextPoint() { std::string line; asp::CsvConv::CsvRecord vals; // Keep on reading, until a valid point is hit or the end of the file // is reached. while (1) { m_has_valid_point = static_cast(getline(*m_ifs, line, '\n')); if (!m_has_valid_point) return m_has_valid_point; // reached end of file vals = m_csv_conv.parse_csv_line(m_is_first_line, m_has_valid_point, line); // Will return projected point and height or xyz. We really // prefer projected points, as then the chipper will have an // easier time grouping spatially points close together, as it // operates the first two coordinates. bool return_point_height = true; try { m_curr_point = m_csv_conv.csv_to_cartesian_or_point_height(vals, m_georef, return_point_height); } catch (...) { // This is a bug fix. Skip points out of bounds. continue; } // Found a valid point if (m_has_valid_point) break; } return m_has_valid_point; } virtual vw::Vector3 GetPoint() { return m_curr_point; } virtual ~CsvReader() { delete m_ifs; m_ifs = NULL; } }; // End class CsvReader // Read unordered points from a Tif image. They will be organized into chips. class TifReader: public BaseReader { vw::ImageViewRef m_img; bool m_has_valid_point; vw::Vector3 m_curr_point; std::vector m_blocks; vw::ImageView m_block_img; // Use int64_t to avoid overflow std::int64_t m_block_count; std::int64_t m_block_len; std::int64_t m_point_count_in_block; std::int64_t m_total_point_count; public: TifReader(std::string const & tif_file): m_has_valid_point(false), m_block_count(0), m_point_count_in_block(0), m_block_len(0), m_total_point_count(0) { // Must ensure there are at least 3 channels in the image { vw::DiskImageResourceGDAL rsrc(tif_file); int num_channels = rsrc.channels(); if (num_channels < 3) vw::vw_throw(vw::ArgumentErr() << "TifReader: Expecting at least 3 channels " << "in the image.\n"); } // Read the first 3 channels std::vector tif_files; tif_files.push_back(tif_file); m_img = asp::form_point_cloud_composite(tif_files, ASP_MAX_SUBBLOCK_SIZE); // Compute the number of points in the image. To avoid integer overflow, // cast first to int64_t. m_num_points = std::int64_t(m_img.cols()) * std::int64_t(m_img.rows()); // Reading points one by one is very inefficient. We will read them in blocks. int block_size = 1024; m_blocks = vw::subdivide_bbox(vw::bounding_box(m_img), block_size, block_size); } virtual bool ReadNextPoint() { if (m_total_point_count >= m_num_points) { // No more points to read m_curr_point = vw::Vector3(); m_has_valid_point = false; return m_has_valid_point; } if (m_block_img.cols() == 0 || m_point_count_in_block >= m_block_len) { // Sanity checks if (m_block_count >= (int64_t)m_blocks.size()) vw::vw_throw(vw::ArgumentErr() << "TifReader: Unexpected end of file.\n"); // Read the next block vw::BBox2i block = m_blocks[m_block_count]; // The block must be contained within the bounding box and be non-empty if (block.empty() || !vw::bounding_box(m_img).contains(block)) vw::vw_throw(vw::ArgumentErr() << "TifReader: Invalid block.\n"); m_block_img = crop(m_img, block); m_block_len = std::int64_t(block.width()) * std::int64_t(block.height()); m_point_count_in_block = 0; m_block_count++; } // Find the row and column of the current point int col = m_point_count_in_block % m_block_img.cols(); int row = m_point_count_in_block / m_block_img.cols(); // Get the element m_curr_point = m_block_img(col, row); // Set the zero point to nan. Usually a scanner uses this value // if it cannot get a valid reading. if (m_curr_point == vw::Vector3()) { double nan = std::numeric_limits::quiet_NaN(); m_curr_point = vw::Vector3(nan, nan, nan); } // Increment the counters m_point_count_in_block++; m_total_point_count++; m_has_valid_point = true; return m_has_valid_point; } virtual vw::Vector3 GetPoint() { return m_curr_point; } virtual ~TifReader() { } }; // End class TifReader // TODO(oalexan1): Consider using PDAL for PCD files too. void PcdReader::read_header() { // Open the file as text std::ifstream handle; handle.open(m_pcd_file.c_str()); if (handle.fail()) { vw_throw(vw::IOErr() << "Unable to open file \"" << m_pcd_file << "\""); } // Start checking all of the header elements bool valid = true; std::string line, dummy, value; std::getline(handle, line); while (line[0] == '#') // Skip initial comment lines std::getline(handle, line); // Check the header version - we only support one kind for now. boost::to_lower(line); if (line.find("version 0.7") == std::string::npos) { vw::vw_out() << "Error: Unsupported PCD file version: " << line << "\n"; valid = false; } // Verify the fields std::getline(handle, line); boost::to_lower(line); if (line.find("fields x y z") == std::string::npos) { vw::vw_out() << "Error: Unsupported PCD fields: " << line << "\n"; valid = false; } // Get some other information, no checking here... handle >> dummy >> m_size_bytes; std::getline(handle, line); // Go to the next line if ((m_size_bytes != 4) && (m_size_bytes != 8)) { vw::vw_out() << "Error: Unsupported byte size: " << m_size_bytes << "\n"; valid = false; } handle >> dummy >> m_type; std::getline(handle, line); // Go to the next line if (m_type == 'F') m_type = 'f'; if (m_type != 'f') { vw::vw_out() << "Error: Currently only Float type PCD files are supported.\n"; valid = false; } // Get size info int width, height, count; handle >> dummy >> count; std::getline(handle, line); // Go to the next line if (count != 1) { vw::vw_out() << "Error: Unsupported PCD count: " << count << "\n"; valid = false; } handle >> dummy >> width >> dummy >> height; std::getline(handle, line); // Skip viewpoint line std::getline(handle, line); handle >> dummy >> m_num_points; if (m_num_points != (static_cast(width*height))) { vw::vw_out() << "Error: PCD point count error!\n"; valid = false; } // Get the type of file, ascii or binary handle >> dummy >> value; boost::to_lower(value); m_binary_format = (value != "ascii"); if (handle.fail()) { vw::vw_out() << "Error: PCD read error!\n"; valid = false; } m_header_length_bytes = handle.tellg(); // Stop reading the header file handle.close(); if (!valid) vw::vw_throw(vw::ArgumentErr() << "Fatal error reading PCD file: " << m_pcd_file); } PcdReader::PcdReader(std::string const & pcd_file) : m_pcd_file(pcd_file), m_has_valid_point(false) { // For now PCD files are required to be in XYZ GCC format. m_has_georef = false; read_header(); // Open the file for data reading in the proper format then skip past the header if (m_binary_format) m_ifs = new std::ifstream (m_pcd_file.c_str(), std::ios_base::binary); else m_ifs = new std::ifstream (m_pcd_file.c_str()); m_ifs->seekg(m_header_length_bytes); } bool PcdReader::ReadNextPoint() { // Check if there is more data if (!m_ifs->good()) { m_has_valid_point = false; return false; } if (m_binary_format) { if (m_size_bytes == 4) { // -> float float x, y, z; m_ifs->read(reinterpret_cast(&x), m_size_bytes); m_ifs->read(reinterpret_cast(&y), m_size_bytes); m_ifs->read(reinterpret_cast(&z), m_size_bytes); m_curr_point = vw::Vector3(x, y, z); } else { // 8 bytes -> double double x, y, z; m_ifs->read(reinterpret_cast(&x), m_size_bytes); m_ifs->read(reinterpret_cast(&y), m_size_bytes); m_ifs->read(reinterpret_cast(&z), m_size_bytes); m_curr_point = vw::Vector3(x, y, z); } } else { // Text format // Read in the next point double x, y, z; (*m_ifs) >> x >> y >> z; m_curr_point = vw::Vector3(x, y, z); } // Make sure the reads succeeded if (m_ifs->fail()) { m_has_valid_point = false; return false; } return true; } vw::Vector3 PcdReader::GetPoint() { return m_curr_point; } PcdReader::~PcdReader() { delete m_ifs; m_ifs = NULL; } std::int64_t pcd_file_size(std::string const& file) { PcdReader reader(file); return reader.m_num_points; } /// Create a Tif file from a point cloud. The file will be created block by /// block, when it needs to be written to disk. In each block the points will /// be organized into chips by location. It is important that the writer /// invoking this image be single-threaded, as we read from the cloud file /// sequentially. The LAS file is handled separately, as PDAL does not have a /// function for getting a point. The point cloud is in CSV or PCL format, /// with PCL not tested yet. class CloudToTif: public vw::ImageViewBase { typedef vw::Vector3 PixelT; asp::BaseReader * m_reader; int m_rows, m_cols; // These are pixel sizes, not tile counts. int m_block_size; public: typedef PixelT pixel_type; typedef PixelT result_type; typedef vw::ProceduralPixelAccessor pixel_accessor; CloudToTif(asp::BaseReader * reader, int image_rows, int image_cols, int block_size): m_reader(reader), m_rows(image_rows), m_cols(image_cols), m_block_size(block_size) {} inline vw::int32 cols () const { return m_cols; } inline vw::int32 rows () const { return m_rows; } inline vw::int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this); } inline result_type operator()(size_t i, size_t j, size_t p=0) const { vw::vw_throw(vw::NoImplErr() << "CloudToTif::operator(...) has not been implemented.\n"); return result_type(); } typedef vw::CropView> prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const { // Read a chunk of the las file, and store it in the current tile. std::int64_t num_cols = bbox.width(); std::int64_t num_rows = bbox.height(); VW_ASSERT((num_rows % m_block_size == 0) && (num_cols % m_block_size == 0), vw::ArgumentErr() << "CloudToTif: Expecting the number of rows and columns " << "to be a multiple of the block size.\n"); // Read the specified number of points from the file std::int64_t max_num_pts_to_read = num_cols * num_rows; std::int64_t count = 0; vw::PointBuffer in; while (m_reader->ReadNextPoint()) { in.push_back(m_reader->GetPoint()); count++; if (count >= max_num_pts_to_read) break; } // Take the points just read, and put them in groups by spatial // location, so that later point2dem does not need to read every // input point when writing a given tile, but only certain groups. vw::ImageView Img; vw::Chipper(in, m_block_size, m_reader->m_has_georef, m_reader->m_georef, num_cols, num_rows, Img); VW_ASSERT(num_cols == Img.cols() && num_rows == Img.rows(), vw::ArgumentErr() << "CloudToTif: Size mis-match.\n"); return crop(Img, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } template inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class CloudToTif // We will fetch a chunk of the las file of area ASP_POINT_CLOUD_TILE_LEN x // ASP_POINT_CLOUD_TILE_LEN, split it into bins of spatially close points, and write // it to disk as a tile in a vector tif image. The bigger the tile // size, the more likely the binning will be more efficient. But big // tiles use a lot of memory. Each tile will be partitioned in chips // of size block_size x block_size, which is always 128, consistent // with what point2dem later uses. void las_or_csv_to_tif(std::string const& in_file, std::string const& out_prefix, int num_rows, int block_size, vw::BBox2 const& copc_win, bool copc_read_all, vw::GdalWriteOptions & opt, // will change vw::cartography::GeoReference const& csv_georef, asp::CsvConv const& csv_conv, std::vector & out_files) { // Wipe the output out_files.clear(); // To do: Study performance for large files when this number changes vw::Vector2i tile_size(ASP_POINT_CLOUD_TILE_LEN, ASP_POINT_CLOUD_TILE_LEN); // Temporarily change the raster tile size vw::Vector2 original_tile_size = opt.raster_tile_size; opt.raster_tile_size = tile_size; boost::shared_ptr reader_ptr; if (asp::is_csv(in_file)) // CSV reader_ptr = boost::shared_ptr (new asp::CsvReader(in_file, csv_conv, csv_georef)); else if (asp::is_pcd(in_file)) // PCD reader_ptr = boost::shared_ptr(new asp::PcdReader(in_file)); else if (asp::is_tif(in_file)) reader_ptr = boost::shared_ptr(new asp::TifReader(in_file)); else if (asp::is_las(in_file)) reader_ptr = boost::shared_ptr(); // see below for las else vw::vw_throw(vw::ArgumentErr() << "Unknown file type: " << in_file << "\n"); // LAS files have a totally different interface, so have to be handled separately. if (asp::is_las(in_file)) { // LAS // Set up the reader boost::shared_ptr pdal_reader; pdal::Options read_options; std::int64_t num_total_points = 0; // will change asp::setupLasOrCopcReader(in_file, copc_win, copc_read_all, pdal_reader, read_options, num_total_points); // buf_size is the number of points that will be processed and kept in this // table at the same time. A somewhat bigger value may result in some // efficiencies. vw::vw_out() << "Breaking up the LAS file into spatially-organized files.\n"; int buf_size = 100; pdal::FixedPointTable t(buf_size); pdal_reader->prepare(t); vw::cartography::GeoReference las_georef; bool has_georef = asp::georef_from_las(in_file, las_georef); asp::ChipMaker writer(ASP_POINT_CLOUD_TILE_LEN, block_size, has_georef, las_georef, opt, out_prefix, out_files); pdal::Options write_options; // The option below will be needed when upgrading PDAL. For now it fails. write_options.add("filename", in_file); // not used, part of API writer.setOptions(write_options); writer.setInput(*pdal_reader); writer.prepare(t); writer.execute(t); } else { // CSV or PCD // Compute the dimensions of the temporary image we are about to create. std::int64_t num_points = reader_ptr->m_num_points; int num_row_tiles = std::max(1, (int)ceil(double(num_rows)/ASP_POINT_CLOUD_TILE_LEN)); int image_rows = ASP_POINT_CLOUD_TILE_LEN * num_row_tiles; int points_per_row = (int)ceil(double(num_points)/image_rows); int num_col_tiles = (int)ceil(double(points_per_row)/ASP_POINT_CLOUD_TILE_LEN); num_col_tiles = std::max(1, num_col_tiles); int image_cols = ASP_POINT_CLOUD_TILE_LEN * num_col_tiles; // For small CSV files, an image of dimensions ASP_POINT_CLOUD_TILE_LEN is // way too large and gridding is slow rather than instant. We will make the // size smaller while respecting all assumptions. if (num_points < ASP_POINT_CLOUD_TILE_LEN * ASP_POINT_CLOUD_TILE_LEN) { // Ensure multiple of block size int len = ceil(sqrt(num_points * 1.0) / block_size) * block_size; len = std::max(len, 1); len = std::min(len, ASP_POINT_CLOUD_TILE_LEN); image_rows = len; image_cols = len; } // Create the image. This will also separate it into chips, with each // chip having points that are spatially close together. vw::ImageViewRef Img = asp::CloudToTif(reader_ptr.get(), image_rows, image_cols, block_size); // Must use a thread only, as we read the input file serially std::string out_file = out_prefix + ".tif"; vw::vw_out() << "Writing spatially ordered data: " << out_file << "\n"; auto tpc = vw::TerminalProgressCallback("asp", "\t--> "); vw::GdalWriteOptions local_opt = opt; local_opt.cog = false; // Do not use COG with temporary files vw::cartography::write_gdal_image(out_file, Img, local_opt, tpc); out_files.push_back(out_file); } // Restore the original tile size opt.raster_tile_size = original_tile_size; return; } /// Builds a GeoReference from the first cloud having a georeference in the list bool georef_from_pc_files(std::vector const& files, vw::cartography::GeoReference & georef) { // Initialize georef = vw::cartography::GeoReference(); for (int i = 0; i < (int)files.size(); i++) { vw::cartography::GeoReference local_georef; // Sometimes ASP PC files can have georef, written there by stereo try { if (!is_las(files[i]) && read_georeference(local_georef, files[i])) { georef = local_georef; return true; } } catch(...) {} // Sometimes las files can have georef if (is_las(files[i]) && asp::georef_from_las(files[i], local_georef)) { georef = local_georef; return true; } } return false; } } // end namespace asp ================================================ FILE: src/asp/Core/PointCloudProcessing.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PointCloudProcessing.h /// // Process point clouds. This makes use of PDAL and ASP's csv logic. #ifndef __ASP_CORE_POINT_CLOUD_PROCESSING_H__ #define __ASP_CORE_POINT_CLOUD_PROCESSING_H__ #include #include #include namespace vw { class GdalWriteOptions; namespace cartography { class GeoReference; } } namespace asp { class CsvConv; // Builds a GeoReference from the first cloud having a georeference in the list bool georef_from_pc_files(std::vector const& files, vw::cartography::GeoReference & georef); /// Fetch a chunk of the las file of area ASP_POINT_CLOUD_TILE_LEN x ASP_POINT_CLOUD_TILE_LEN , /// split it into bins of spatially close points, and write /// it to disk as a tile in a vector tif image. void las_or_csv_to_tif(std::string const& in_file, std::string const& out_prefix, int num_rows, int block_size, vw::BBox2 const& copc_win, bool copc_read_all, vw::GdalWriteOptions & opt, // will change vw::cartography::GeoReference const& csv_georef, asp::CsvConv const& csv_conv, std::vector & out_files); } // End namespace asp #endif // __ASP_CORE_POINT_CLOUD_PROCESSING_H__ ================================================ FILE: src/asp/Core/PointCloudRead.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PointCloudRead.cc /// /// Pre-compiled wrappers for read_asp_point_cloud. The template /// version in GdalUtils.h calls read_channels which /// instantiates DiskImageView for Vector with M=1..12, /// costing ~30s of compile time per caller. Keeping the instantiations /// here confines that cost to one compilation unit. #include #include namespace asp { vw::ImageViewRef> read_asp_point_cloud_3(std::string const& filename) { return read_asp_point_cloud<3>(filename); } vw::ImageViewRef> read_asp_point_cloud_4(std::string const& filename) { return read_asp_point_cloud<4>(filename); } vw::ImageViewRef> read_asp_point_cloud_6(std::string const& filename) { return read_asp_point_cloud<6>(filename); } } // namespace asp ================================================ FILE: src/asp/Core/PointCloudRead.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PointCloudRead.h /// /// Pre-compiled wrappers for read_asp_point_cloud to avoid /// instantiating the 12-type template ladder in every caller. #ifndef __ASP_CORE_POINT_CLOUD_READ_H__ #define __ASP_CORE_POINT_CLOUD_READ_H__ #include #include #include namespace asp { // Non-template wrappers for reading ASP point clouds with 3, 4, or 6 // channels. These handle the shift-offset logic and call pre-compiled // channel readers, avoiding the 12-type template ladder. vw::ImageViewRef> read_asp_point_cloud_3(std::string const& filename); vw::ImageViewRef> read_asp_point_cloud_4(std::string const& filename); vw::ImageViewRef> read_asp_point_cloud_6(std::string const& filename); } // namespace asp #endif ================================================ FILE: src/asp/Core/PointToDem.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; using namespace vw; namespace asp { DemOptions::DemOptions(): nodata_value(-std::numeric_limits::max()), semi_major(0), semi_minor(0), dem_hole_fill_len(0), ortho_hole_fill_len(0), ortho_hole_fill_extra_len(0), remove_outliers_with_pct(true), use_tukey_outlier_removal(false), max_valid_triangulation_error(0), erode_len(0), search_radius_factor(0), sigma_factor(0), default_grid_size_multiplier(1.0), has_las_or_csv_or_pcd(false), max_output_size(9999999, 9999999), auto_proj_center(false), input_is_projected(false) {} // The files will be input point clouds, and if opt.do_ortho is // true, also texture files. If texture files are present, there // must be one for each point cloud, and each cloud must have the // same dimensions as its texture file. void parse_input_clouds_textures(std::vector const& files, DemOptions& opt) { int num = files.size(); if (num == 0) vw_throw(ArgumentErr() << "Missing input point clouds.\n"); // Ensure there were no unrecognized options for (int i = 0; i < num; i++) { if (!files[i].empty() && files[i][0] == '-') { vw_throw(ArgumentErr() << "Unrecognized option: " << files[i] << ".\n"); } } // Ensure that files exist for (int i = 0; i < num; i++) { if (asp::is_las(files[i]) && pdal::Utils::isRemote(files[i])) continue; // This is a remote file, so we don't check existence if (!fs::exists(files[i])) vw_throw(ArgumentErr() << "File does not exist: " << files[i] << ".\n"); } if (opt.do_ortho) { if (num <= 1) vw_throw(ArgumentErr() << "Missing input texture files.\n"); if (num%2 != 0) vw_throw(ArgumentErr() << "There must be as many texture files as input point clouds.\n"); } // Separate the input point clouds from the textures opt.pointcloud_files.clear(); opt.texture_files.clear(); for (int i = 0; i < num; i++) { if (asp::is_las_or_csv_or_pcd(files[i]) || get_num_channels(files[i]) >= 3) opt.pointcloud_files.push_back(files[i]); else opt.texture_files.push_back(files[i]); } if (opt.pointcloud_files.empty()) vw_throw(ArgumentErr() << "No valid point cloud files were provided.\n"); if (!opt.do_ortho && !opt.texture_files.empty()) vw_throw(ArgumentErr() << "No ortho image was requested, yet texture files were passed as inputs.\n"); // Must have this check here before we start assuming all input files // are tif. opt.has_las_or_csv_or_pcd = false; for (int i = 0; i < (int)files.size(); i++) opt.has_las_or_csv_or_pcd = (opt.has_las_or_csv_or_pcd || opt.input_is_projected || asp::is_las_or_csv_or_pcd(files[i])); if (opt.has_las_or_csv_or_pcd && opt.do_ortho) vw_throw(ArgumentErr() << "Cannot create orthoimages unless the inputs are PC.tif files.\n"); if (opt.do_ortho) { if (opt.pointcloud_files.size() != opt.texture_files.size()) vw_throw(ArgumentErr() << "There must be as many input point clouds " << "as texture files to be able to create orthoimages.\n"); for (int i = 0; i < (int)opt.pointcloud_files.size(); i++) { // Here we ignore that a point cloud file may have many channels. // We just want to verify that the cloud file and texture file // have the same number of rows and columns. DiskImageView cloud(opt.pointcloud_files[i]); DiskImageView texture(opt.texture_files[i]); if (cloud.cols() != texture.cols() || cloud.rows() != texture.rows()) vw_throw(ArgumentErr() << "Point cloud " << opt.pointcloud_files[i] << " and texture file " << opt.texture_files[i] << " do not have the same dimensions.\n"); } } return; } // Convert any LAS, CSV, PCD, or unorganized TIF files to ASP tif files. We do // some binning to make the spatial data more localized, to improve performance. // We will later wipe these temporary tif files. void chip_convert_to_tif(DemOptions const& opt, asp::CsvConv const& csv_conv, vw::cartography::GeoReference const& csv_georef, // Outputs std::vector & pc_files, std::vector & conv_files) { if (!opt.has_las_or_csv_or_pcd) return; Stopwatch sw; sw.start(); // Error checking for CSV int num_files = pc_files.size(); for (int i = 0; i < num_files; i++) { if (!asp::is_csv(pc_files[i])) continue; if (opt.csv_format_str == "") vw_throw(ArgumentErr() << "CSV files were passed in, but the option --csv-format was not set.\n"); } // There are situations in which some files will already be tif, and // others will be LAS or CSV. When we convert the latter to tif, // we'd like to be able to match the number of rows of the existing // tif files, so later when we concatenate all these files from left // to right for the purpose of creating the DEM, we waste little space. std::int64_t num_rows = 0; for (int i = 0; i < num_files; i++) { if (asp::is_las_or_csv_or_pcd(pc_files[i])) continue; DiskImageView img(pc_files[i]); // Record the max number of rows across all input tifs num_rows = std::max(num_rows, std::int64_t(img.rows())); } // No tif files exist. Find a reasonable value for the number of rows. if (num_rows == 0) { std::int64_t max_num_pts = 0; for (int i = 0; i < num_files; i++) { std::string file = pc_files[i]; if (asp::is_las(file)) max_num_pts = std::max(max_num_pts, asp::las_file_size(file)); if (asp::is_csv(file)) max_num_pts = std::max(max_num_pts, asp::csv_file_size(file)); // Note: PCD support needs to be tested! if (asp::is_pcd(file)) max_num_pts = std::max(max_num_pts, asp::pcd_file_size(file)); // No need to check for other cases: at least one file must be las or csv or pcd! } num_rows = std::max(std::int64_t(1), (std::int64_t)ceil(sqrt(double(max_num_pts)))); } // This is very important. For efficiency later, we don't want to // create blocks smaller than what OrthoImageView will use later. int block_size = ASP_MAX_SUBBLOCK_SIZE; // For csv and las files, create temporary tif files. In those files // we'll have the points binned so that nearby points have nearby // indices. This is key to fast rasterization later. std::vector all_out_files; for (int i = 0; i < num_files; i++) { if (!asp::is_las_or_csv_or_pcd(pc_files[i]) && !opt.input_is_projected) { // Skip organized tif files all_out_files.push_back(pc_files[i]); continue; } std::string in_file = pc_files[i]; vw::vw_out() << "Processing file: " << in_file << "\n"; std::string stem = fs::path(in_file).stem().string(); std::string suffix; if (opt.out_prefix.find(stem) != std::string::npos) suffix = ""; else suffix = "-" + stem; std::string file_prefix = opt.out_prefix + "-tmp" + suffix; // Perform the actual conversion to a tif file std::vector out_files; vw::GdalWriteOptions l_opt = opt; // Copy the write options asp::las_or_csv_to_tif(in_file, file_prefix, num_rows, block_size, opt.copc_win, opt.copc_read_all, l_opt, csv_georef, csv_conv, out_files); // Keep track of all produced files, and separately of conv_files. std::copy(out_files.begin(), out_files.end(), std::back_inserter(all_out_files)); std::copy(out_files.begin(), out_files.end(), std::back_inserter(conv_files)); } // Update the list of all files pc_files = all_out_files; sw.stop(); vw_out(DebugMessage,"asp") << "LAS or CSV to TIF conversion time: " << sw.elapsed_seconds() << " seconds.\n"; } // Set the projection based on options. By now opt.proj_lon and opt.proj_lat // should have been set. void setProjection(DemOptions const& opt, cartography::GeoReference & output_georef) { // Can set a projection either via a string or via options if (!opt.target_srs_string.empty() && opt.target_srs_string != "auto") vw::vw_throw(ArgumentErr() << "Using a projection with --t_srs precludes settting it in other ways."); // Shorten notation double lon = opt.proj_lon, lat = opt.proj_lat, s = opt.proj_scale; double e = opt.false_easting, n = opt.false_northing; switch (opt.projection) { case SINUSOIDAL: output_georef.set_sinusoidal(lon, e, n); break; case MERCATOR: output_georef.set_mercator(lat, lon, s, e, n); break; case TRANSVERSEMERCATOR: output_georef.set_transverse_mercator(lat, lon, s, e, n); break; case ORTHOGRAPHIC: output_georef.set_orthographic(lat, lon, e, n); break; case STEREOGRAPHIC: output_georef.set_stereographic(lat, lon, s, e, n); break; case OSTEREOGRAPHIC: output_georef.set_oblique_stereographic(lat, lon, s, e, n); break; case GNOMONIC: output_georef.set_gnomonic(lat, lon, s, e, n); break; case LAMBERTAZIMUTHAL: output_georef.set_lambert_azimuthal(lat, lon, e, n); break; case UTM: output_georef.set_UTM(opt.utm_zone); break; case GEOGRAPHIC: output_georef.set_geographic(); break; case AUTO_DETERMINED: setAutoProj(lat, lon, output_georef); break; default: // Throw an error if the projection is not set vw::vw_throw(ArgumentErr() << "No projection was set.\n"); } return; } } // end namespace asp ================================================ FILE: src/asp/Core/PointToDem.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PointToDem.h /// Utility functions for point2dem #ifndef __ASP_CORE_POINT_TO_DEM_H__ #define __ASP_CORE_POINT_TO_DEM_H__ #include #include namespace vw { namespace cartography { class Datum; class GeoReference; } } namespace asp { class CsvConv; // This is a list of types the user can specify for output with a dedicated // command line flag. enum ProjectionType { SINUSOIDAL, MERCATOR, TRANSVERSEMERCATOR, ORTHOGRAPHIC, STEREOGRAPHIC, OSTEREOGRAPHIC, GNOMONIC, LAMBERTAZIMUTHAL, UTM, GEOGRAPHIC, AUTO_DETERMINED }; struct DemOptions: vw::GdalWriteOptions { // Input std::vector pointcloud_files, texture_files; // Settings std::vector dem_spacing; float nodata_value; double semi_major, semi_minor; std::string reference_spheroid, datum; double proj_lat, proj_lon, proj_scale, false_easting, false_northing; double lon_offset, lat_offset, height_offset; size_t utm_zone; ProjectionType projection; bool has_alpha, do_normalize, do_ortho, do_error, propagate_errors, no_dem, scalar_error; double rounding_error; std::string target_srs_string; vw::BBox2 target_projwin, copc_win; int dem_hole_fill_len, ortho_hole_fill_len, ortho_hole_fill_extra_len; bool remove_outliers_with_pct, use_tukey_outlier_removal; vw::Vector2 remove_outliers_params; double max_valid_triangulation_error; vw::Vector2 median_filter_params; int erode_len; std::string csv_format_str, csv_srs, filter; std::string csv_proj4_str; // for backward compatibility double search_radius_factor, sigma_factor, default_grid_size_multiplier; bool has_las_or_csv_or_pcd, auto_proj_center, copc_read_all; vw::Vector2i max_output_size; bool input_is_projected, gdal_tap; // Output std::string out_prefix, output_file_type; // Constructor DemOptions(); }; void parse_input_clouds_textures(std::vector const& files, DemOptions& opt); // Convert any LAS or CSV files to ASP tif files. We do some binning to make the // spatial data more localized, to improve performance. We will later wipe these // temporary tif files. void chip_convert_to_tif(DemOptions const& opt, asp::CsvConv const& csv_conv, vw::cartography::GeoReference const& csv_georef, std::vector & pc_files, std::vector & conv_files); // Rasterize a DEM void rasterize_cloud(asp::OrthoRasterizerView& rasterizer, DemOptions& opt, vw::cartography::GeoReference& georef, std::int64_t * num_invalid_pixels); // Set the projection based on options. By now opt.proj_lon and opt.proj_lat // should have been set. void setProjection(DemOptions const& opt, vw::cartography::GeoReference & output_georef); } // end namespace asp #endif//__ASP_CORE_POINT_TO_DEM_H__ ================================================ FILE: src/asp/Core/PointToDem2.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; // Moved here some logic from PointToDem.cc to speed up compilation. using namespace vw; namespace asp { // Write an image to disk while handling some common options. template void save_image(DemOptions & opt, ImageT img, vw::cartography::GeoReference const& georef, int hole_fill_len, std::string const& imgName) { // When hole-filling is used, we need to look hole_fill_len beyond // the current block. If the block size is 256, and hole fill len // is big, like 512 or 1024, we end up processing a huge block // only to save a small center block. For that reason, save // temporarily with big blocks, and then re-save with small blocks. if (hole_fill_len > 512) vw_out(WarningMessage) << "Detected large hole-fill length. " << "Memory usage and run-time may go up.\n"; int block_size = nextpow2(2.0*hole_fill_len); block_size = std::max(256, block_size); // Append a tag if desired to compute the min, max, etc. Later on, in OrthoRasterizer // we do a full validation of opt.filter. std::string tag = ""; if (opt.filter != "weighted_average") tag = "-" + opt.filter; std::string output_file = opt.out_prefix + tag + "-" + imgName + "." + opt.output_file_type; vw_out() << "Writing: " << output_file << "\n"; TerminalProgressCallback tpc("asp", imgName + ": "); bool has_georef = true, has_nodata = true; if (opt.output_file_type == "tif") asp::saveWithTempBigBlocks(block_size, output_file, img, has_georef, georef, has_nodata, opt.nodata_value, opt, tpc); else vw::cartography::write_gdal_image(output_file, img, georef, opt, tpc); } // End function save_image // Round pixels in given image to multiple of given scale. // Don't round nodata values. template struct RoundImagePixelsSkipNoData: public vw::ReturnFixedType { double m_scale, m_nodata; RoundImagePixelsSkipNoData(double scale, double nodata): m_scale(scale), m_nodata(nodata) {} PixelT operator() (PixelT const& pt) const { // We will pass in m_scale = 0 if we don't want rounding to happen. if (m_scale <= 0) return pt; // Skip given pixel if any channels are nodata int num_channels = PixelNumChannels::value; typedef typename CompoundChannelType::type channel_type; for (int c = 0; c < num_channels; c++) { if ((double)compound_select_channel(pt,c) == m_nodata) return pt; } return PixelT(m_scale*round(channel_cast(pt)/m_scale)); } }; // If the third component of a vector is NaN, mask that vector as invalid template struct NaN2Mask: public ReturnFixedType> { NaN2Mask() {} PixelMask operator() (VectorT const& vec) const { if (std::isnan(vec.z())) return PixelMask(); // invalid else return PixelMask(vec); // valid } }; // Reverse the operation of NaN2Mask template struct Mask2NaN: public ReturnFixedType { Mask2NaN() {} VectorT operator() (PixelMask const& pvec) const { if (!is_valid(pvec)) return VectorT(0, 0, std::numeric_limits::quiet_NaN()); else return pvec.child(); } }; // If the third component of a vector is NaN, assign to it the given no-data value struct NaN2NoData: public ReturnFixedType { NaN2NoData(float nodata_val):m_nodata_val(nodata_val) {} float m_nodata_val; Vector3 operator() (Vector3 const& vec) const { if (std::isnan(vec.z())) return Vector3(m_nodata_val, m_nodata_val, m_nodata_val); // invalid else return vec; // valid } }; // Take a given point xyz and the error at that point. Convert the // error to the NED (North-East-Down) coordinate system. struct ErrorToNED: public ReturnFixedType { vw::cartography::GeoReference m_georef; ErrorToNED(vw::cartography::GeoReference const& georef):m_georef(georef) {} Vector3 operator() (Vector6 const& pt) const { Vector3 xyz = subvector(pt, 0, 3); if (xyz == Vector3()) return Vector3(); Vector3 err = subvector(pt, 3, 3); Vector3 llh = m_georef.datum().cartesian_to_geodetic(xyz); Matrix3x3 M = m_georef.datum().lonlat_to_ned_matrix(llh); Vector3 ned_err = inverse(M)*err; return ned_err; } }; template UnaryPerPixelView inline error_to_NED(ImageViewBase const& image, vw::cartography::GeoReference const& georef) { return UnaryPerPixelView(image.impl(), ErrorToNED(georef)); } template vw::UnaryPerPixelView> inline round_image_pixels_skip_nodata(vw::ImageViewBase const& image, double scale, double nodata) { return vw::UnaryPerPixelView> (image.impl(), RoundImagePixelsSkipNoData(scale, nodata)); } // A class for combining the three channels of errors and finding their absolute // values. class CombinedAbsView: public ImageViewBase { double m_nodata_value; ImageViewRef> m_image1; ImageViewRef> m_image2; ImageViewRef> m_image3; public: typedef Vector3f pixel_type; typedef const Vector3f result_type; typedef ProceduralPixelAccessor pixel_accessor; CombinedAbsView(double nodata_value, ImageViewRef> image1, ImageViewRef> image2, ImageViewRef> image3): m_nodata_value(nodata_value), m_image1(image1), m_image2(image2), m_image3(image3) {} inline int32 cols () const { return m_image1.cols(); } inline int32 rows () const { return m_image1.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this); } inline result_type operator()(size_t i, size_t j, size_t p=0) const { Vector3f error(m_image1(i, j), m_image2(i, j), m_image3(i, j)); if (error[0] == m_nodata_value || error[1] == m_nodata_value || error[2] == m_nodata_value) { return Vector3f(m_nodata_value, m_nodata_value, m_nodata_value); } return Vector3f(std::abs(error[0]), std::abs(error[1]), std::abs(error[2])); } typedef CombinedAbsView prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { return prerasterize_type(m_nodata_value, m_image1.prerasterize(bbox), m_image2.prerasterize(bbox), m_image3.prerasterize(bbox)); } template inline void rasterize(DestT const& dest, BBox2i const& bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; CombinedAbsView combine_abs_channels(double nodata_value, ImageViewRef> image1, ImageViewRef> image2, ImageViewRef> image3) { VW_ASSERT(image1.cols() == image2.cols() && image2.cols() == image3.cols() && image1.rows() == image2.rows() && image2.rows() == image3.rows(), ArgumentErr() << "Expecting the error channels to have the same size."); return CombinedAbsView(nodata_value, image1, image2, image3); } // Save the DEM void save_dem(DemOptions & opt, vw::cartography::GeoReference const& georef, asp::OrthoRasterizerView& rasterizer, Vector2 const& tile_size, std::int64_t * num_invalid_pixels) { // The value stored in num_invalid_pixels will get updated as the DEM is being // written to disk. That because OrthoRasterizerView has a pointer to it. // This must be reset before each use. // TODO(oalexan1): This logic is confusing. Better have two member functions that // first reset and later get this number. *num_invalid_pixels = 0; // We use the existing texture channel, which is the height. Stopwatch sw2; sw2.start(); ImageViewRef> dem = asp::round_image_pixels_skip_nodata(rasterizer.impl(), opt.rounding_error, opt.nodata_value); int hole_fill_len = opt.dem_hole_fill_len; if (hole_fill_len > 0) { // Note that we first cache the tiles of the rasterized DEM, and // fill holes later. This greatly improves the performance. dem = apply_mask (vw::fill_holes_grass(create_mask (block_cache(dem, tile_size, opt.num_threads), opt.nodata_value), hole_fill_len), opt.nodata_value); } // Stop the program if it is going to create too large a DEM, this will // cause a crash. Vector2i dem_size = bounding_box(dem).size(); vw_out()<< "Creating output file that is " << dem_size << " px.\n"; if ((dem_size[0] > opt.max_output_size[0]) || (dem_size[1] > opt.max_output_size[1])) vw_throw(ArgumentErr() << "Requested DEM size is too large, max allowed output size is " << opt.max_output_size << " pixels.\n"); asp::save_image(opt, dem, georef, hole_fill_len, "DEM"); sw2.stop(); vw_out(DebugMessage,"asp") << "DEM render time: " << sw2.elapsed_seconds() << ".\n"; // num_invalid_pixels was updated as the DEM was written. double num_invalid_pixelsD = *num_invalid_pixels; // Below we convert to double first and multiply later, to avoid // 32-bit integer overflow. double num_total_pixels = double(dem_size[0]) * double(dem_size[1]); double invalid_ratio = num_invalid_pixelsD / num_total_pixels; vw_out() << "Percentage of valid pixels: " << 100.0*(1.0 - invalid_ratio) << "%\n"; // Wipe after use. This will reset the counter in OrthoRasterizerView. *num_invalid_pixels = 0; } // Save the intersection error void save_intersection_error(DemOptions & opt, bool has_stddev, vw::cartography::GeoReference const& georef, Vector2 const& tile_size, asp::OrthoRasterizerView& rasterizer) { int hole_fill_len = 0; int num_channels = asp::num_channels(opt.pointcloud_files); if (num_channels == 4 || (num_channels == 6 && has_stddev) || opt.scalar_error) { // The error is a scalar (4 channels or 6 channels but last two are stddev), // or we want to find the norm of the error. ImageViewRef error_channel = asp::point_cloud_error_image(opt.pointcloud_files); rasterizer.set_texture(channel_cast(channels_to_planes(error_channel))); save_image(opt, asp::round_image_pixels_skip_nodata(rasterizer.impl(), opt.rounding_error, opt.nodata_value), georef, hole_fill_len, "IntersectionErr"); } else if (num_channels == 6) { // The error is a 3D vector. Convert it to NED coordinate system, and rasterize it. ImageViewRef point_disk_image = asp::form_point_cloud_composite (opt.pointcloud_files, ASP_MAX_SUBBLOCK_SIZE); ImageViewRef ned_err = asp::error_to_NED(point_disk_image, georef); std::vector>> rasterized(3); for (int ch_index = 0; ch_index < 3; ch_index++) { ImageViewRef ch = select_channel(ned_err, ch_index); rasterizer.set_texture(channel_cast(channels_to_planes(ch))); rasterized[ch_index] = block_cache(rasterizer.impl(), tile_size, opt.num_threads); } auto err_vec = asp::combine_abs_channels(opt.nodata_value, rasterized[0], rasterized[1], rasterized[2]); save_image(opt, asp::round_image_pixels_skip_nodata(err_vec, opt.rounding_error, opt.nodata_value), georef, hole_fill_len, "IntersectionErr"); } else { // Note: We don't throw. We still would like to write the // DRG (later) even if we can't write the error image. vw_out() << "The point cloud files must have an equal number of channels which " << "must be 4 or 6 to be able to process the intersection error.\n"; } } // Save horizontal and vertical stddev void save_stddev(DemOptions & opt, vw::cartography::GeoReference const& georef, asp::OrthoRasterizerView& rasterizer) { int num_channels = asp::num_channels(opt.pointcloud_files); double rounding_error = 0.0; vw_out() << "Not rounding propagated errors (option: --rounding-error) to avoid " << "introducing step artifacts.\n"; // Note: We don't throw here. We still would like to write the // DRG (later) even if we can't write the stddev. if (num_channels != 6) { vw_out() << "The input point cloud(s) must have 6 channels to be able to " << "grid the horizontal and vertical stddev.\n"; } else { int hole_fill_len = 0; ImageViewRef point_disk_image = asp::form_point_cloud_composite (opt.pointcloud_files, ASP_MAX_SUBBLOCK_SIZE); ImageViewRef horizontal_stddev_channel = select_channel(point_disk_image, 4); rasterizer.set_texture(channel_cast(channels_to_planes(horizontal_stddev_channel))); save_image(opt, asp::round_image_pixels_skip_nodata(rasterizer.impl(), rounding_error, // local value opt.nodata_value), georef, hole_fill_len, "HorizontalStdDev"); ImageViewRef vertical_stddev_channel = select_channel(point_disk_image, 5); rasterizer.set_texture(channel_cast(channels_to_planes(vertical_stddev_channel))); save_image(opt, asp::round_image_pixels_skip_nodata(rasterizer.impl(), rounding_error, // local value opt.nodata_value), georef, hole_fill_len, "VerticalStdDev"); } } // Save the orthoimage. The texture comes form L.tif instead of the heights. void save_ortho(DemOptions & opt, vw::cartography::GeoReference const& georef, asp::OrthoRasterizerView& rasterizer) { Stopwatch sw3; sw3.start(); // Set the texture channel ImageViewRef> texture = asp::form_point_cloud_composite> (opt.texture_files, ASP_MAX_SUBBLOCK_SIZE); rasterizer.set_texture(channel_cast(channels_to_planes(texture))); if (opt.ortho_hole_fill_len > 0) { // Need to convert the hole fill length from output image pixels // to input point cloud pixels as we will fill holes in the cloud // itself. int hole_fill_len = rasterizer.pc_hole_fill_len(opt.ortho_hole_fill_len); // Fetch a reference to the current point image ImageViewRef point_image = rasterizer.get_point_image(); // Mask the NaNs ImageViewRef> point_image_mask = per_pixel_filter(point_image, asp::NaN2Mask()); // If to grow the cloud a bit, to help hole-filling later. This should // not be large as it creates artifacts. The main work better // be done by grassfire later. if (opt.ortho_hole_fill_extra_len > 0) { int hole_fill_mode = 2; int hole_fill_num_smooth_iter = 3; int hole_fill_extra_len = rasterizer.pc_hole_fill_len(opt.ortho_hole_fill_extra_len); point_image_mask = vw::fill_holes(point_image_mask, hole_fill_mode, hole_fill_num_smooth_iter, hole_fill_extra_len); // Use big tiles, to reduce the overhead // of expanding each tile by hole size. int big_block_size = nextpow2(2.0*hole_fill_extra_len); big_block_size = std::max(256, big_block_size); // Cache each hole-filled point cloud tile as likely we will // need it again in the future when rasterizing a different // portion of the output ortho image. point_image_mask = block_cache(point_image_mask, vw::Vector2(big_block_size, big_block_size), opt.num_threads); } // Fill the holes point_image_mask =vw::fill_holes_grass(point_image_mask, hole_fill_len); // back to NaNs point_image = per_pixel_filter(point_image_mask, asp::Mask2NaN()); // When filling holes, use big tiles, to reduce the overhead // of expanding each tile by hole size. int big_block_size = nextpow2(2.0*hole_fill_len); big_block_size = std::max(256, big_block_size); // Cache each hole-filled point cloud tile as likely we will // need it again in the future when rasterizing a different // portion of the output ortho image. point_image = block_cache(point_image, vw::Vector2(big_block_size, big_block_size), opt.num_threads); // Pass to the rasterizer the point image with the holes filled rasterizer.set_point_image(point_image); } asp::save_image(opt, rasterizer.impl(), georef, 0, // no need for a buffer here, as we cache hole-filled tiles "DRG"); sw3.stop(); vw_out(DebugMessage,"asp") << "DRG render time: " << sw3.elapsed_seconds() << "\n"; } // Rasterize a DEM, and perhaps the error image, orthoimage, stddev, etc. // This may be called several times, with different grid sizes. void rasterize_cloud(asp::OrthoRasterizerView& rasterizer, DemOptions& opt, vw::cartography::GeoReference& georef, std::int64_t * num_invalid_pixels) { vw_out() << "\tStarting DEM rasterization\n"; vw_out() << "\t--> DEM spacing: " << rasterizer.spacing() << " pt/px\n"; vw_out() << "\t or: " << 1.0/rasterizer.spacing() << " px/pt\n"; // TODO: Maybe put a warning or check here if the size is too big // The affine transform. If the user specified --t_projwin, the transform // already incorporated that. georef.set_transform(rasterizer.geo_transform()); // Fix have pixel offset required if pixel_interpretation is // PixelAsArea. We could have done that earlier, but it makes // the above easier to not think about it. if (georef.pixel_interpretation() == vw::cartography::GeoReference::PixelAsArea && !rasterizer.m_gdal_tap) { Matrix3x3 transform = georef.transform(); transform(0,2) -= 0.5 * transform(0,0); transform(1,2) -= 0.5 * transform(1,1); georef.set_transform(transform); } // Do not round the DEM heights for small bodies if (georef.datum().semi_major_axis() <= asp::MIN_RADIUS_FOR_ROUNDING || georef.datum().semi_minor_axis() <= asp::MIN_RADIUS_FOR_ROUNDING) { opt.rounding_error = 0.0; } Vector2 tile_size(vw_settings().default_tile_size(), vw_settings().default_tile_size()); // Write out the DEM. We've set the texture to be the height. // This must happen before we set the texture to something else. if (!opt.no_dem) save_dem(opt, georef, rasterizer, tile_size, num_invalid_pixels); // If the point cloud has propagated stddev affects how we write the error image. bool has_stddev = asp::has_stddev(opt.pointcloud_files); // Write triangulation error image if requested if (opt.do_error) save_intersection_error(opt, has_stddev, georef, tile_size, rasterizer); if (opt.propagate_errors && !has_stddev) { // Do not throw an error. Go on and save at least the intersection // error and orthoimage. vw_out() << "Cannot grid the horizontal and vertical stddev as the point " << "cloud file is not in the expected format.\n"; opt.propagate_errors = false; } if (opt.propagate_errors) save_stddev(opt, georef, rasterizer); // Write out a normalized version of the DEM, if requested (for debugging). // Here the DEM is read back and written normalized to a new file. if (opt.do_normalize) { int hole_fill_len = 0; DiskImageView> dem_image(opt.out_prefix + "-DEM." + opt.output_file_type); asp::save_image(opt, apply_mask(channel_cast (normalize(create_mask(dem_image, opt.nodata_value), rasterizer.bounding_box().min().z(), rasterizer.bounding_box().max().z(), 0, 255))), georef, hole_fill_len, "DEM-normalized"); } // Write DRG if the user requested and provided a texture file. // This must be at the end, as we may be messing with the point // image in irreversible ways. if (opt.do_ortho) save_ortho(opt, georef, rasterizer); } // End rasterize_cloud } // end namespace asp ================================================ FILE: src/asp/Core/PointUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PointUtils.cc /// #include #include #include #include #include #include #include using namespace vw; using namespace vw::cartography; //------------------------------------------------------------------------------------------ // Class CsvConv functions std::string asp::CsvConv::write_header_string(std::string const delimiter) const{ std::stringstream s; std::map::const_iterator it; for (it = this->col2name.begin(); it != this->col2name.end(); it++) s << it->second << delimiter; return s.str(); } // This is a complete list of all supported column names, it must be kept up to date. int asp::CsvConv::get_sorted_index_for_name(std::string const& name) { if (name == "file") return 3; // The string goes in a different location if (name == "lon") return 0; if (name == "lat") return 1; if (name == "radius_m") return 2; if (name == "radius_km") return 2; if (name == "x") return 0; if (name == "y") return 1; if (name == "z") return 2; if (name == "pixel_x") return 0; if (name == "pixel_y") return 1; if (name == "pixel_val") return 2; if (name == "easting") return 0; if (name == "northing") return 1; if (name == "height_above_datum") return 2; vw_throw(ArgumentErr() << "Unsupported column name: " << name); } // Parse the CSV format string and build the data structure which // will enable to convert from CSV to Cartesian and vice-versa. // The user specifies 3 fields that determine the coordinate. // If min_num_fields 2, autocomplete the third value to 0. void asp::CsvConv::parse_csv_format(std::string const& csv_format_str, std::string const& csv_srs, int min_num_fields) { // This guards against the case where the user specifies a proj string // only having the string D_MARS, with no spheroid or axes. std::string csv_srs_lc = boost::to_lower_copy(csv_srs); // lowercase if ((csv_srs_lc.find("d_moon") != std::string::npos || csv_srs_lc.find("d_mars") != std::string::npos) && csv_srs_lc.find("spheroid") == std::string::npos) { vw_throw(ArgumentErr() << "D_MOON and D_MARS are not official projection strings. " << "The PROJ string is: " << csv_srs << ".\n"); } *this = asp::CsvConv(); // Reset this object to the default state this->csv_format_str = csv_format_str; // Record inputs this->csv_srs = csv_srs; std::string local = csv_format_str; // Make lowercase boost::algorithm::to_lower(local); if (local == "") // No format string passed in return; boost::replace_all(local, ":", " "); // Convert to space-delimited boost::replace_all(local, ",", " "); std::istringstream is(local); // The case of utm: "utm:23N 1:x 2:y 3:height_above_datum". Parse // the initial bit to get utm_zone and utm_north, leave the rest // alone. std::string str; is >> str; if (str == "utm") { is >> str; asp::parse_utm_str(str, this->utm_zone, this->utm_north); } else { // Go back to the original string is.clear(); is.str(local); } int col; std::string name; while (is.good()) { // Grab the next two elements if (! (is >> col >> name)) vw_throw(ArgumentErr() << "Could not parse: '" << csv_format_str << "'\n"); // Convert to zero-based indexing and error check col--; if (col < 0 || this->col2name.count(col)) vw_throw(ArgumentErr() << "Illegal column index in: '" << csv_format_str << "'\n"); // Store in the lookup maps this->name2col[name] = col; this->col2name[col] = name; } this->num_fields = this->name2col.size(); const int MAX_NUM_FIELDS = 4; // Location and a file if ((this->num_fields < min_num_fields) || (this->num_fields > MAX_NUM_FIELDS)) vw_throw(ArgumentErr() << "Invalid number of column indices in: '" << csv_format_str << "'\n"); if (min_num_fields < 2) vw::vw_throw(vw::ArgumentErr() << "Expecting at least two fields in the csv format.\n"); // Sort the names into a pre-specified order. std::vector sorted_names(this->num_fields); for (auto it = this->name2col.begin(); it != this->name2col.end(); it++) { int index = get_sorted_index_for_name(it->first); sorted_names[index] = it->first; if (it->first != "file") // Only the point data goes into a vector, not the filename this->col2sort[it->second] = index; } // If only two fields are set, auto-complete the third. Values for that field // will be set to 0. This makes it convenient to use many of the functions // expecting 3 fields. if (this->num_fields == 2 && sorted_names.size() == 2) { if (sorted_names[0] == "x" && sorted_names[1] == "y") sorted_names.push_back("z"); else if (sorted_names[0] == "lon" && sorted_names[1] == "lat") sorted_names.push_back("height_above_datum"); else if (sorted_names[0] == "easting" && sorted_names[1] == "northing") sorted_names.push_back("height_above_datum"); else if (sorted_names[0] == "pixel_x" && sorted_names[1] == "pixel_y") sorted_names.push_back("pixel_val"); else sorted_names.push_back("not_found"); // will trigger a failure below } // From the input strings, determine which set type applies to this file. if (sorted_names[0] == "x" && sorted_names[1] == "y" && sorted_names[2] == "z") { this->format = XYZ; } else if (sorted_names[0] == "lon" && sorted_names[1] == "lat" && sorted_names[2] == "radius_m") { this->format = LAT_LON_RADIUS_M; } else if (sorted_names[0] == "lon" && sorted_names[1] == "lat" && sorted_names[2] == "radius_km") { this->format = LAT_LON_RADIUS_KM; } else if (sorted_names[0] == "lon" && sorted_names[1] == "lat" && sorted_names[2] == "height_above_datum") { this->format = HEIGHT_LAT_LON; } else if (sorted_names[0] == "easting" && sorted_names[1] == "northing" && sorted_names[2] == "height_above_datum") { this->format = EASTING_HEIGHT_NORTHING; } else if (sorted_names[0] == "pixel_x" && sorted_names[1] == "pixel_y" && sorted_names[2] == "pixel_val") { this->format = PIXEL_XYVAL; } else { vw_throw(ArgumentErr() << "Cannot understand the csv format string: " << csv_format_str << ".\n"); } } // If the user passed in a csv file containing easting, northing, height // above datum, and either a utm zone or a custom PROJ string, // pass that info into the georeference for the purpose of converting // later from easting and northing to lon and lat. // TODO(oalexan1): This is fragile. It can quietly default to WGS84. bool asp::CsvConv::parse_georef(vw::cartography::GeoReference & georef) const { bool success = false; if (this->utm_zone >= 0) { // UTM case, for Earth only try{ georef.set_UTM(this->utm_zone, this->utm_north); success = true; } catch (const std::exception& e) { vw_throw(ArgumentErr() << "Detected error: " << e.what() << "\nPlease check if you are using an Earth datum.\n"); } } else if (this->csv_srs != "") { // Not UTM, with PROJ string bool have_user_datum = false; Datum user_datum; vw::cartography::set_srs_string(this->csv_srs, have_user_datum, user_datum, georef); success = true; } if (this->format == EASTING_HEIGHT_NORTHING && !georef.is_projected()) vw::vw_throw(vw::ArgumentErr() << "When a CSV file has Easting and Northing, " "must set --csv-srs, and it must use projected coordinates, " "not longitude-latitude.\n"); return success; } asp::CsvConv::CsvRecord asp::CsvConv::parse_csv_line(bool & is_first_line, bool & success, std::string const& line) const { // Parse a CSV file line in given format success = true; // Copy the input line into a temporary buffer const int bufSize = 2048; char temp[bufSize]; strncpy(temp, line.c_str(), bufSize); std::string sep = asp::csv_separator(); int col_index = -1; // The current column we are reading int num_floats_read = 0; int num_values_read = 0; CsvRecord values; // Quietly ignore empty lines, lines with spaces only, and lines starting with comments if (line.empty() || line[0] == '#' || hasSpacesOnly(line)) { success = false; is_first_line = false; return values; } char * ptr = temp; while (1) { col_index++; // Increment the column counter const char* token = strtok(ptr, sep.c_str()); // Split line on separator char ptr = NULL; // After the first call, strtok expects a null pointer as input. if (token == NULL) break; // no more tokens if (num_values_read >= this->num_fields) break; // read enough values // Check if this is one of the columns we need to read if (this->col2name.find(col_index) == this->col2name.end()) continue; if (this->col2name.at(col_index) == "file") // This is a string input values.file = token; else { // Parse the floating point value from the token double val; int flag = sscanf(token, "%lg", &val); if (flag == 0) { // Handle parsing failure success = false; break; } values.point_data[num_floats_read] = val; num_floats_read++; } num_values_read++; } // End loop through columns // Check if enough values were read and for NaN values if (num_values_read != this->num_fields || values.point_data != values.point_data) success = false; if (!success) { if (!is_first_line) { // Not the header vw_out () << "Failed to read line: " << line << "\n"; } } is_first_line = false; return values; } // Search for "color = red" and find "red". Return false on failure. // Can handle uppercase strings, also "color=red" and "color red". bool parse_color(std::string const& line, std::string & color) { color = ""; // reset the output if (line.empty() || line[0] == '#') return false; std::string line_lc = boost::to_lower_copy(line); // make lowercase size_t pos = line_lc.find("color"); if (pos == std::string::npos) return false; pos += 5; // go past the color // Skip past spaces and equal sign while (pos < line_lc.size() && (line_lc[pos] < 'a' || line_lc[pos] > 'z')) pos++; if (pos >= line_lc.size()) return false; // no color was set line_lc = line_lc.substr(pos); // Return the first token. This is useful if there are spaces and other things // afterward. std::istringstream iss(line_lc); std::string token; if (iss >> token) { color = token; return true; } return false; } size_t asp::CsvConv::read_csv_file(std::string const & file_path, std::list & output_list) const { // Clear output object output_list.clear(); // Open input file std::ifstream file(file_path.c_str()); if (!file) vw_throw(vw::IOErr() << "Unable to open file \"" << file_path << "\""); // Read through all the lines of the input file, parse each line, and build the output list. bool success; bool first_line = true; // TODO(oalexan1): Wipe this variable. std::string line = ""; while (std::getline(file, line, '\n')) { CsvRecord new_record = asp::CsvConv::parse_csv_line(first_line, success, line); if (success) output_list.push_back(new_record); first_line = false; } file.close(); return output_list.size(); } // Reads an entire CSV file having polygons. Individual // polygons are separated by a newline or some other unexpected text. size_t asp::CsvConv::read_poly_file(std::string const & file_path, std::list & output_list, std::vector & contiguous_blocks, std::vector & colors, std::vector & annotations) const { // Clear output object output_list.clear(); annotations.clear(); std::string color = "green"; // some default if (colors.size() > 0) { color = colors[0]; // use as default color what is passed from outside colors.clear(); // so we can keep on pushing for each polygon } contiguous_blocks.clear(); contiguous_blocks.push_back(0); // Open the input file std::ifstream file(file_path.c_str()); if (!file) vw_throw(vw::IOErr() << "Unable to open file \"" << file_path << "\""); // Read through all the lines of the input file, parse each line, and build // the output list. We ignore failed lines and lines having colors, and use // them as separators between polygons. bool success = false; bool first_line = true; // TODO(oalexan1): Rename this to: quiet_on_failure. std::string line = ""; vw::geometry::anno annotation; while (std::getline(file, line, '\n')) { // Parse colors std::string local_color; if (parse_color(line, local_color)) { color = local_color; while (colors.size() < contiguous_blocks.size()) colors.push_back(color); // catch up on colors } // Search for annotations bool found_anno = false; if (line.find("anno ") == 0 && vw::geometry::searchForAnnotation(line, annotation)) { annotations.push_back(annotation); found_anno = true; success = false; } CsvRecord new_record; if (!found_anno) new_record = asp::CsvConv::parse_csv_line(first_line, success, line); first_line = true; // Because for now the api changes this var. To fix at some point. if (success && !found_anno) { output_list.push_back(new_record); // This is a bugfix. If we are just starting a block, and there were some // invalid lines before, and some were colors, let the color of this // block be the last collected color if (contiguous_blocks.size() > 0 && contiguous_blocks.back() == 0 && colors.size() == contiguous_blocks.size()) { colors.back() = color; } // add an element to the last block contiguous_blocks.back()++; } else if (!found_anno) { // An annotation does not force a new block if (contiguous_blocks.back() > 0) { contiguous_blocks.push_back(0); // Add a new block while (colors.size() < contiguous_blocks.size()) colors.push_back(color); // catch up on colors } } } // This is needed in case no colors were found while (colors.size() < contiguous_blocks.size()) colors.push_back(color); // Wipe all blocks of length 0. Likely there is only one at the end. std::vector & v = contiguous_blocks; // alias v.erase(std::remove(v.begin(), v.end(), 0), v.end()); if (colors.size() > contiguous_blocks.size()) colors.resize(contiguous_blocks.size()); file.close(); return output_list.size(); } vw::Vector3 asp::CsvConv::sort_parsed_vector3(CsvRecord const& csv) const { Vector3 ordered_csv; int count = 0; const int NUM_POINT_PARAMS = 3; for (auto it = this->col2sort.begin(); it != this->col2sort.end(); it++) { if (it->second < NUM_POINT_PARAMS) // Don't include elements past the first three ordered_csv[it->second] = csv.point_data[count]; count++; } return ordered_csv; } vw::Vector3 asp::CsvConv::unsort_vector3(vw::Vector3 const& csv) const { Vector3 csv2; int count = 0; const int NUM_POINT_PARAMS = 3; for (std::map::const_iterator it = this->col2sort.begin(); it != this->col2sort.end(); it++) { if (it->second < NUM_POINT_PARAMS) { // Don't include elements past the first three csv2[count] = csv[it->second]; count++; } } return csv2; } // There is a lot of repeated code for the next three functions in order to // improve the speed of parsing points by doing the minimum number of conversions. // Return either xyz or a projected point. Note that the flag return_point_height // is not necessarily respected. Vector3 asp::CsvConv::csv_to_cartesian_or_point_height(CsvRecord const& csv, GeoReference const& geo, bool return_point_height) const{ Vector3 ordered_csv = sort_parsed_vector3(csv); // If the format is XYZ, there is a good chance we don't even have a reference. // So we cannot return a point_height. We need things this way for the chipper, // but this is quite confusing. if (this->format == XYZ) return ordered_csv; // already as xyz // Convert from CSV to Cartesian. Later we may convert to point_height format, // which, due to the projection in the georeference, may not be the same // as the input CSV format. E.g., input CSV may be lon, lat, height, // but the output of this function may be easting, northing, height. Vector3 xyz; if (this->format == EASTING_HEIGHT_NORTHING) { Vector3 point_height = Vector3(ordered_csv[0], ordered_csv[1], ordered_csv[2]); Vector2 ll = geo.point_to_lonlat(Vector2(point_height[0], point_height[1])); Vector3 llh = Vector3(ll[0], ll[1], point_height[2]); // now lon, lat, height xyz = geo.datum().geodetic_to_cartesian(llh); } else if (this->format == HEIGHT_LAT_LON) { xyz = geo.datum().geodetic_to_cartesian(ordered_csv); } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM if (this->format == LAT_LON_RADIUS_KM) ordered_csv[2] *= 1000.0; // now lon, lat, radius_m Vector3 tmp = ordered_csv; tmp[2] = 0; // now lon, lat, 0 xyz = geo.datum().geodetic_to_cartesian(tmp); // Update the radius xyz = ordered_csv[2]*(xyz/norm_2(xyz)); } if (return_point_height) return geo.geodetic_to_point(geo.datum().cartesian_to_geodetic(xyz)); return xyz; } vw::Vector3 asp::CsvConv::csv_to_cartesian(CsvRecord const& csv, vw::cartography::GeoReference const& geo) const { Vector3 ordered_csv = sort_parsed_vector3(csv); Vector3 xyz; if (this->format == XYZ) { return ordered_csv; // already as xyz } else if (this->format == EASTING_HEIGHT_NORTHING) { Vector3 point_height = Vector3(ordered_csv[0], ordered_csv[1], ordered_csv[2]); Vector2 ll = geo.point_to_lonlat(Vector2(point_height[0], point_height[1])); Vector3 llh = Vector3(ll[0], ll[1], point_height[2]); // now lon, lat, height xyz = geo.datum().geodetic_to_cartesian(llh); } else if (this->format == HEIGHT_LAT_LON) { xyz = geo.datum().geodetic_to_cartesian(ordered_csv); } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM if (this->format == LAT_LON_RADIUS_KM) ordered_csv[2] *= 1000.0; // now lon, lat, radius_m Vector3 tmp = ordered_csv; tmp[2] = 0; // now lon, lat, 0 xyz = geo.datum().geodetic_to_cartesian(tmp); // Update the radius xyz = ordered_csv[2]*(xyz/norm_2(xyz)); } return xyz; } // Returns Vector3(lon, lat, height_above_datum) vw::Vector3 asp::CsvConv::csv_to_geodetic(CsvRecord const& csv, vw::cartography::GeoReference const& geo) const { Vector3 ordered_csv = sort_parsed_vector3(csv); Vector3 llh; if (this->format == XYZ) { llh = geo.datum().cartesian_to_geodetic(ordered_csv); } else if (this->format == EASTING_HEIGHT_NORTHING) { Vector3 point_height = Vector3(ordered_csv[0], ordered_csv[1], ordered_csv[2]); Vector2 ll = geo.point_to_lonlat(Vector2(point_height[0], point_height[1])); llh = Vector3(ll[0], ll[1], point_height[2]); // now lon, lat, height } else if (this->format == HEIGHT_LAT_LON) { return ordered_csv; } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM if (this->format == LAT_LON_RADIUS_KM) ordered_csv[2] *= 1000.0; // now lon, lat, radius_m Vector3 tmp = ordered_csv; tmp[2] = 0; // now lon, lat, 0 Vector3 xyz = geo.datum().geodetic_to_cartesian(tmp); // Update the radius xyz = ordered_csv[2]*(xyz/norm_2(xyz)); llh = geo.datum().cartesian_to_geodetic(xyz); } return llh; } vw::Vector2 asp::CsvConv::csv_to_lonlat(CsvRecord const& csv, vw::cartography::GeoReference const& geo) const { Vector3 ordered_csv = sort_parsed_vector3(csv); if (this->format == XYZ) { Vector3 llh = geo.datum().cartesian_to_geodetic(ordered_csv); return Vector2(llh[0], llh[1]); } else if (this->format == EASTING_HEIGHT_NORTHING) { return geo.point_to_lonlat(Vector2(ordered_csv[0], ordered_csv[1])); } else if (this->format == HEIGHT_LAT_LON) { return Vector2(ordered_csv[0], ordered_csv[1]); } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM return Vector2(ordered_csv[0], ordered_csv[1]); } } Vector3 asp::CsvConv::cartesian_to_csv(Vector3 const& xyz, GeoReference const& geo, double mean_longitude) const { Vector3 csv; if (this->format == XYZ) { csv = xyz; // order is x, y, z } else { // format != XYZ, convert to the csv format. // Must assert here that the datum was specified. Vector3 llh = geo.datum().cartesian_to_geodetic(xyz); // lon-lat-height llh[0] += 360.0*round((mean_longitude - llh[0])/360.0); // 360 deg adjust if (this->format == EASTING_HEIGHT_NORTHING) { // go from lon, lat to easting, northing Vector2 en = geo.lonlat_to_point(Vector2(llh[0], llh[1])); csv = Vector3(en[0], en[1], llh[2]); // order is easting, northing, height } else if (this->format == HEIGHT_LAT_LON) { csv = llh; } else { // Handle asp::LAT_LON_RADIUS_M and asp::LAT_LON_RADIUS_KM llh[2] = norm_2(xyz); // order is lon, lat, radius_m if (this->format == LAT_LON_RADIUS_KM) { llh[2] /= 1000.0; // order is lon, lat, radius_km } csv = llh; } } // Now the csv vector contains the sorted values for our format // Now we have the csv fields, but they are in the order // corresponding to the sorted column names. Need to put them // in the same order as they were in the file originally. return unsort_vector3(csv); } // End class CsvConv functions bool asp::is_tif (std::string const& file) { std::string lfile = boost::to_lower_copy(file); return (boost::iends_with(lfile, ".tif") || boost::iends_with(lfile, ".ntf")); } bool asp::is_las(std::string const& file) { std::string lfile = boost::to_lower_copy(file); return (boost::iends_with(lfile, ".las") || boost::iends_with(lfile, ".laz")); } bool asp::is_csv(std::string const& file) { std::string lfile = boost::to_lower_copy(file); return (boost::iends_with(lfile, ".csv") || boost::iends_with(lfile, ".txt")); } bool asp::is_pcd(std::string const& file) { std::string lfile = boost::to_lower_copy(file); return boost::iends_with(lfile, ".pcd"); } bool asp::is_las_or_csv_or_pcd(std::string const& file) { return asp::is_las(file) || is_csv(file); } bool asp::read_user_datum(double semi_major, double semi_minor, std::string const& reference_spheroid, cartography::Datum& datum) { // Select a cartographic datum. There are several hard coded datums // that can be used here, or the user can specify their own. if (reference_spheroid != "") { datum.set_well_known_datum(reference_spheroid); } else if (semi_major == 6378137 && std::abs(semi_minor - 6356752.3142451793) < 1e-6) { datum.set_well_known_datum("WGS84"); } else if (semi_major > 0 && semi_minor > 0) { datum = cartography::Datum("User Specified Datum", "User Specified Spheroid", "Reference Meridian", semi_major, semi_minor, 0.0); } else { return false; } vw_out() << "\t--> Re-referencing altitude values using datum: " << datum.name() << ".\n"; vw_out() << "\t Axes [" << datum.semi_major_axis() << " " << datum.semi_minor_axis() << "] meters.\n"; return true; } void asp::parse_utm_str(std::string const& utm, int & zone, bool & north) { // Parse the string 58N // Initialize zone = -1; north = false; std::string a, b; for (int s = 0; s < (int)utm.size(); s++) { if (utm[s] >= '0' && utm[s] <= '9') { a += utm[s]; } else { b = utm[s]; break; } } if (a == "" || b == "") vw_throw(ArgumentErr() << "Could not parse UTM string: '" << utm << "'\n"); zone = atoi(a.c_str()); if (b == "n" || b == "N") { north = true; } else if (b == "s" || b == "S") { north = false; } else vw_throw(ArgumentErr() << "Could not parse UTM string: '" << utm << "'\n"); } bool asp::hasSpacesOnly(std::string const& str) { bool only_spaces = true; for (size_t it = 0; it < str.size(); it++) { if (str[it] != ' ' && str[it] != '\n' && str[it] != '\t') { only_spaces = false; break; } } return only_spaces; } bool asp::is_valid_csv_line(std::string const& line) { // A valid line is not empty and does not start with '#' and does not have spaces only. bool only_spaces = hasSpacesOnly(line); return (!only_spaces) && (!line.empty()) && (line[0] != '#'); } std::int64_t asp::csv_file_size(std::string const& file) { std::ifstream fh(file.c_str()); if (!fh) vw_throw(vw::IOErr() << "Unable to open file \"" << file << "\""); std::int64_t num_total_points = 0; std::string line; while (getline(fh, line, '\n')) { if (!asp::is_valid_csv_line(line)) continue; num_total_points++; } return num_total_points; } // Peek at the first valid line in a file to find how many columns it has int asp::fileNumCols(std::string const& file) { const int bufSize = 2048; char buffer[bufSize]; std::string sep = asp::csv_separator(); int num = 0; std::ifstream fh(file.c_str()); std::string line; while (getline(fh, line, '\n')) { if (!asp::is_valid_csv_line(line)) continue; // Copy the input line into a buffer that can be modified strncpy(buffer, line.c_str(), bufSize); char * ptr = buffer; // Inspect the tokens while (1) { const char* token = strtok(ptr, sep.c_str()); // Split line on seperator char ptr = NULL; // After the first call, strtok expects a null pointer as input. if (token == NULL) break; // no more tokens // Parse the floating point value from the token double val; int flag = sscanf(token, "%lg", &val); if (flag == 0) // Handle parsing failure break; num++; } break; // done finding a good line } return num; } // Erases a file suffix if one exists and returns the base string std::string asp::prefix_from_pointcloud_filename(std::string const& filename) { std::string result = filename; // First case: filenames that match -PC. int index = result.rfind("-PC."); if (index != -1) { result.erase(index, result.size()); return result; } // Second case: filenames that match . index = result.rfind("."); if (index != -1) { result.erase(index, result.size()); return result; } // No match return result; } // Compute bounding box of the given cloud. If is_geodetic is false, // that means a cloud of raw xyz cartesian values, then Vector3() // signifies no-data. If is_geodetic is true, no-data is suggested // by having the z component of the point be NaN. vw::BBox3 asp::pointcloud_bbox(vw::ImageViewRef const& point_image, bool is_geodetic) { vw::BBox3 result; vw::vw_out() << "Computing the point cloud bounding box.\n"; vw::TerminalProgressCallback progress_bar("asp", "\t--> "); for (int row=0; row < point_image.rows(); ++row) { progress_bar.report_fractional_progress(row, point_image.rows()); for (int col=0; col < point_image.cols(); ++col) { vw::Vector3 pt = point_image(col, row); if ((!is_geodetic && pt != vw::Vector3()) || (is_geodetic && !std::isnan(pt.z()))) result.grow(pt); } } progress_bar.report_finished(); return result; } // Determine if we should be using a longitude range between // [-180, 180] or [0,360]. The former is used, unless the latter // results in a tighter range of longitudes, such as when crossing // the international date line. vw::BBox2 asp::estim_lonlat_box(vw::ImageViewRef const& point_image, vw::cartography::Datum const& datum) { Stopwatch sw; sw.start(); // Do two attempts. Need this heuristic, because for small clouds, especially // created from CSV files, this can fail. vw::BBox2 ll_box, shifted_ll_box; for (int attempt = 0; attempt < 2; attempt++) { int32 subsample_amt = int32(norm_2(Vector2(point_image.cols(), point_image.rows()))/32.0); if (attempt == 1) { // For CSV, which can be small if (point_image.cols() <= ASP_POINT_CLOUD_TILE_LEN && point_image.rows() <= ASP_POINT_CLOUD_TILE_LEN) { subsample_amt = 1; } else if (point_image.cols() <= 10 * ASP_POINT_CLOUD_TILE_LEN && point_image.rows() <= 10 * ASP_POINT_CLOUD_TILE_LEN) { // Still a rather small cloud subsample_amt = int32(norm_2(Vector2(point_image.cols(), point_image.rows()))/8.0); } else { // Very big clouds subsample_amt = int32(norm_2(Vector2(point_image.cols(), point_image.rows()))/16.0); } } if (subsample_amt < 1) subsample_amt = 1; ImageViewRef sub_image = subsample(point_image, subsample_amt); for (int32 col = 0; col < sub_image.cols(); col++) { for (int32 row = 0; row < sub_image.rows(); row++) { auto pix = sub_image(col, row); if (pix == Vector3()) continue; // Longitude range is [-180, 180] vw::Vector3 llh = datum.cartesian_to_geodetic(pix); ll_box.grow(Vector2(llh[0], llh[1])); // Create the shifted box llh[0] += 360; if (llh[0] >= 360) llh[0] -= 360; shifted_ll_box.grow(Vector2(llh[0], llh[1])); } } // Stop at the first attempt if we have a non-empty box if (!ll_box.empty()) break; } if (ll_box.empty()) { // Empty box. The use the [-180, 180] range. ll_box = vw::BBox2(-0.1, -0.1, 0.2, 0.2); return ll_box; } // See which has narrower range. Account for numerical error. if (ll_box.width() > shifted_ll_box.width() + 1e-10) ll_box = shifted_ll_box; sw.stop(); vw_out(DebugMessage,"asp") << "Statistics time: " << sw.elapsed_seconds() << std::endl; return ll_box; } // Find the median longitude and latitude for a subset of the point cloud void asp::median_lon_lat(vw::ImageViewRef const& point_image, vw::cartography::GeoReference const& georef, double & lon, double & lat) { vw_out() << "Estimating the median longitude and latitude for the cloud.\n"; // Initialize the outputs lon = 0.0; lat = 0.0; // Try to subsample with these amounts std::vector sub = {32.0, 16.0}; Stopwatch sw; sw.start(); // Iterate over sub bool success = false; for (size_t s = 0; s < sub.size(); s++) { int32 subsample_amt = int32(norm_2(Vector2(point_image.cols(), point_image.rows()))/sub[s]); if (subsample_amt < 1) subsample_amt = 1; ImageViewRef sub_image = subsample(point_image, subsample_amt); // Accumulate valid values std::vector lons, lats; for (int32 col = 0; col < sub_image.cols(); col++) { for (int32 row = 0; row < sub_image.rows(); row++) { Vector3 ecef = sub_image(col, row); if (ecef == Vector3()) continue; Vector3 llh = georef.datum().cartesian_to_geodetic(ecef); lons.push_back(llh[0]); lats.push_back(llh[1]); } } if (lons.empty() || lats.empty()) continue; lon = vw::math::destructive_median(lons); lat = vw::math::destructive_median(lats); success = true; break; } if (!success) vw_throw(ArgumentErr() << "Could not find a valid median longitude and latitude. " << "Check if your cloud is empty.\n"); sw.stop(); vw_out(DebugMessage,"asp") << "Median longitude and latitude elapsed time: " << sw.elapsed_seconds() << std::endl; } /// Analyze a file name to determine the file type std::string asp::get_cloud_type(std::string const& file_name) { if (asp::is_csv(file_name)) return "CSV"; if (asp::is_las(file_name)) return "LAS"; // Note that any tif, ntf, and cub file with one channel with georeference be // interpreted as a DEM. int nc = vw::get_num_channels(file_name); vw::cartography::GeoReference geo; bool has_georef = vw::cartography::read_georeference(geo, file_name); if (nc == 1 && has_georef) return "DEM"; if (nc >= 3) return "PC"; vw_throw(vw::ArgumentErr() << "File: " << file_name << " is neither a point cloud nor a DEM.\n"); } // Find the number of channels in the point clouds. // If the point clouds have inconsistent number of channels, // return the minimum of 3 and the minimum number of channels. // This will be used to flag that we cannot reliable extract the // error channels, which start at channel 4. int asp::num_channels(std::vector const& pc_files) { VW_ASSERT(pc_files.size() >= 1, ArgumentErr() << "Expecting at least one point cloud file.\n"); int num_channels0 = get_num_channels(pc_files[0]); int min_num_channels = num_channels0; for (int i = 1; i < (int)pc_files.size(); i++) { int num_channels = get_num_channels(pc_files[i]); min_num_channels = std::min(min_num_channels, num_channels); if (num_channels != num_channels0) min_num_channels = std::min(min_num_channels, 3); } return min_num_channels; } // See if all the input point cloud files have stddev values bool asp::has_stddev(std::vector const& pc_files) { VW_ASSERT(pc_files.size() >= 1, ArgumentErr() << "Expecting at least one point cloud file.\n"); bool has_sd = true; for (size_t i = 0; i < pc_files.size(); i++) { std::string val; boost::shared_ptr rsrc(new vw::DiskImageResourceGDAL(pc_files[i])); std::string adj_key = "BAND5"; vw::cartography::read_header_string(*rsrc.get(), adj_key, val); if (val != "HorizontalStdDev") has_sd = false; adj_key = "BAND6"; vw::cartography::read_header_string(*rsrc.get(), adj_key, val); if (val != "VerticalStdDev") has_sd = false; } if (has_sd && asp::num_channels(pc_files) < 6) has_sd = false; return has_sd; } // Get a handle to the error image given a set of point clouds with 4 or 6 bands vw::ImageViewRef asp::point_cloud_error_image (std::vector const& pointcloud_files) { ImageViewRef error_image; int num_channels = asp::num_channels(pointcloud_files); bool has_sd = asp::has_stddev(pointcloud_files); if (num_channels == 4 || (num_channels == 6 && has_sd)) { // The error is a scalar (4 channels or 6 channels but last two are stddev values) error_image = asp::error_norm<4>(pointcloud_files); } else if (num_channels == 6) { error_image = asp::error_norm<6>(pointcloud_files); } else { // Return an empty image ImageView image; image.set_size(0, 0); error_image = image; } return error_image; } // Read a single image file as a point cloud or texture, depending on PixelT. // For PixelGray, just read the file directly. For vector types, use // the pre-compiled read_asp_point_cloud wrappers to avoid template bloat. namespace { template typename boost::enable_if>, ImageViewRef>::type read_point_cloud_compatible_file(std::string const& file) { return DiskImageView(file); } template typename boost::disable_if>, ImageViewRef>::type read_point_cloud_compatible_file(std::string const& file) { constexpr int N = vw::math::VectorSize::value; if constexpr (N == 3) return asp::read_asp_point_cloud_3(file); else if constexpr (N == 4) return asp::read_asp_point_cloud_4(file); else if constexpr (N == 6) return asp::read_asp_point_cloud_6(file); else vw::vw_throw(vw::ArgumentErr() << "Unsupported number of channels: " << N << "\n"); } } // end anonymous namespace // Read given files and form an image composite. template ImageViewRef asp::form_point_cloud_composite(std::vector const& files, int spacing) { VW_ASSERT(files.size() >= 1, ArgumentErr() << "Expecting at least one file.\n"); vw::mosaic::ImageComposite composite_image; composite_image.set_draft_mode(true); for (int i = 0; i < (int)files.size(); i++) { ImageViewRef I = read_point_cloud_compatible_file(files[i]); // Stack images side by side, transposing wide ones if (files.size() > 1 && I.rows() < I.cols()) I = transpose(I); int start = composite_image.cols(); if (i > 0) start = spacing * (int)ceil(double(start) / spacing) + spacing; composite_image.insert(I, start, 0); } return composite_image; } // Explicit instantiations of form_point_cloud_composite template ImageViewRef> asp::form_point_cloud_composite>(std::vector const&, int); template ImageViewRef asp::form_point_cloud_composite(std::vector const&, int); template ImageViewRef asp::form_point_cloud_composite(std::vector const&, int); template ImageViewRef asp::form_point_cloud_composite(std::vector const&, int); // Read the error channels from the point clouds, and take their norm template ImageViewRef asp::error_norm(std::vector const& pc_files) { VW_ASSERT(pc_files.size() >= 1, ArgumentErr() << "Expecting at least one file.\n"); const int beg_ech = 3; const int num_ech = num_ch - beg_ech; ImageViewRef> point_disk_image = asp::form_point_cloud_composite> (pc_files, ASP_MAX_SUBBLOCK_SIZE); ImageViewRef> error_channels = select_channels(point_disk_image, beg_ech); return per_pixel_filter(error_channels, asp::VectorNorm>()); } // Explicit instantiations of error_norm template ImageViewRef asp::error_norm<4>(std::vector const&); template ImageViewRef asp::error_norm<6>(std::vector const&); ================================================ FILE: src/asp/Core/PointUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PointUtils.h // Utilities for handling point cloud files (las, PC.tif, csv). #ifndef __ASP_CORE_POINT_UTILS_H__ #define __ASP_CORE_POINT_UTILS_H__ #include #include #include #include #include #include #include #include #include namespace vw{ namespace cartography { class Datum; class GeoReference; } namespace geometry { class anno; } } const int ASP_POINT_CLOUD_TILE_LEN = 2048; const int ASP_MAX_SUBBLOCK_SIZE = 128; namespace asp { class BaseOptions; /// A Data structure which converts from CSV to Cartesian and vice-versa. // TODO(oalexan1): There is no enforcement that the georeference has actually // been populated before it gets used. Fixing this will be quite some work // given the many places this is used. class CsvConv { public: // Definitions /// Any valid input file must contain one of these sets of fields /// - Note that the data is not stored in this order internally. enum CsvFormat{ XYZ, HEIGHT_LAT_LON, LAT_LON_RADIUS_M, LAT_LON_RADIUS_KM, EASTING_HEIGHT_NORTHING, PIXEL_XYVAL}; /// Object used to store the data parsed from a CSV line. struct CsvRecord{ vw::Vector3 point_data; std::string file; }; public: // Functions /// Default Constructor, the object is not ready to use. CsvConv() : format(XYZ), utm_zone(-1), utm_north(false), num_fields(0) {} bool is_configured() const {return csv_format_str != "";} CsvFormat get_format () const {return format;} /// Writes out a header string containing each of the extracted column names /// in the order they were specified. std::string write_header_string(std::string const delimiter = ", ") const; /// Initialize using a pair of CSV format strings void parse_csv_format(std::string const& csv_format_str, std::string const& csv_srs, int min_num_fields = 3); /// If the user passed in a csv file containing easting, northing, height /// above datum, and either a utm zone or a custom proj4 string, /// pass that info into the georeference for the purpose of converting /// later from easting and northing to lon and lat. bool parse_georef(vw::cartography::GeoReference & georef) const; /// Extract values we care about from a csv string and pack them in a vector. /// - This extracts the values in the same order they appear in the file. /// - Use one of the conversion functions to get coordinates from this vector. CsvRecord parse_csv_line(bool & is_first_line, bool & success, std::string const& line) const; /// Reads an entire CSV file and stores a record for each line. /// - Intended for use with smaller files. size_t read_csv_file(std::string const & file_path, std::list & output_list) const; /// Reads an entire CSV file having polygons. Individual /// polygons are separated by a newline or some other unexpected text. size_t read_poly_file(std::string const & file_path, std::list & output_list, std::vector & contiguous_blocks, std::vector & colors, std::vector & annotations) const; /// Convert values read from a csv file using parse_csv_line (in /// the same order they appear in the file) to a Cartesian /// point. If return_point_height is true, and the csv point is /// not in xyz format, return instead the projected point and /// height above datum. vw::Vector3 csv_to_cartesian_or_point_height(CsvRecord const& csv, vw::cartography::GeoReference const& geo, bool return_point_height) const; /// Convert values read from a csv file using parse_csv_line to a Cartesian point. vw::Vector3 csv_to_cartesian(CsvRecord const& csv, vw::cartography::GeoReference const& geo) const; /// Convert values read from a csv file using parse_csv_line to a lon/lat/height point. vw::Vector3 csv_to_geodetic(CsvRecord const& csv, vw::cartography::GeoReference const& geo) const; /// Convert values read from a csv file using parse_csv_line to a lon/lat point. vw::Vector2 csv_to_lonlat(CsvRecord const& csv, vw::cartography::GeoReference const& geo) const; /// Extracts the file name read from the csv line, or "" if it was not present. std::string file_from_csv(CsvRecord const& csv) const {return csv.file;} /// Re-order an xyz point so the values appear in the format and order they /// did in the csv file. This function does nothing about all the fields we /// ignored when we read the file. vw::Vector3 cartesian_to_csv(vw::Vector3 const& xyz, vw::cartography::GeoReference const& geo, double mean_longitude) const; /// Converts the point data vector from the order the fields appeared in the file /// to the order according to the "format" member variable. vw::Vector3 sort_parsed_vector3(CsvRecord const& v) const; /// Performs the reverse of sort_parsed_vector3, putting the values in the /// order that they originally appeared in the file (ignores the file /// field). vw::Vector3 unsort_vector3(vw::Vector3 const& v) const; private: // Variables std::map name2col; ///< Target names -> Column index in input csv std::map col2name; ///< Target column in input csv -> Name std::map col2sort; ///< Which input columns went in which vector indices (numbers only) std::string csv_format_str; std::string csv_srs; CsvFormat format; int utm_zone; bool utm_north; int num_fields; ///< The number of elements to extract from each CSV line friend class CsvReader; private: // Functions /// This function hard-codes the location in the parsed vector where each /// column type will go. static int get_sorted_index_for_name(std::string const& name); }; // End class CsvConv bool is_tif(std::string const& file); ///< Return true if this is a TIF file bool is_las(std::string const& file); ///< Return true if this is a LAS file bool is_csv(std::string const& file); ///< Return true if this is a CSV file bool is_pcd(std::string const& file); ///< Return true if this is a PCD file bool is_las_or_csv_or_pcd(std::string const& file); /// Builds a datum object out of the input arguments bool read_user_datum(double semi_major, double semi_minor, std::string const& reference_spheroid, vw::cartography::Datum& datum ); /// Parse a UTM string such as "58N" void parse_utm_str(std::string const& utm, int & zone, bool & north); /// CSV separator inline std::string csv_separator() { return ", \t"; } /// Need this for pc_align and point2dem inline std::string csv_opt_caption() { 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."; } /// A valid line is not empty and does not start with '#'. bool is_valid_csv_line(std::string const& line); /// If a line has spaces only bool hasSpacesOnly(std::string const& str); /// Returns the number of points contained in a CSV file std::int64_t csv_file_size(std::string const& file); /// Returns the number of points contained in a PCD file std::int64_t pcd_file_size(std::string const& file); // Peek at the first valid line in a file to find how many columns it has int fileNumCols(std::string const& file); /// Erases a file suffix if one exists and returns the base string std::string prefix_from_pointcloud_filename(std::string const& filename); /// Read a point cloud file in the format written by ASP. /// Given a point cloud with n channels, return the first m channels. /// We must have 1 <= m <= n <= 6. /// If the image was written by subtracting a shift, put that shift back. template vw::ImageViewRef> read_asp_point_cloud(std::string const& filename); /// Read multiple image files and pack them into a single patchwork tiled image. /// Relies on the vw::mosaic::ImageComposite class. Explicit instantiations /// are in PointUtils.cc for PixelGray, Vector3, Vector4, Vector6. template vw::ImageViewRef form_point_cloud_composite(std::vector const& files, int spacing = 0); // Apply an offset to the points in the PointImage class PointOffsetFunc : public vw::UnaryReturnSameType { vw::Vector3 m_offset; public: PointOffsetFunc(vw::Vector3 const& offset) : m_offset(offset) {} template T operator()(T const& p) const { if (p == T()) return p; // Zero points are invalid. This is buggy. return p + m_offset; } }; // End class PointOffsetFunc template vw::UnaryPerPixelView inline point_image_offset( vw::ImageViewBase const& image, vw::Vector3 const& offset) { return vw::UnaryPerPixelView( image.impl(), PointOffsetFunc(offset)); } // TODO: Move center lon functions and use consistently. // Center Longitudes class CenterLongitudeFunc : public vw::UnaryReturnSameType { double center; public: CenterLongitudeFunc(double c = 0) : center(c) {} vw::Vector3 operator()( vw::Vector3 const& v ) const { if ( v[0] < center - 180 ) return (*this)(v + vw::Vector3(360,0,0)); else if ( v[0] > center + 180 ) return (*this)(v - vw::Vector3(360,0,0)); return v; } }; // End class CenterLongitudeFunc template vw::UnaryPerPixelView inline recenter_longitude( vw::ImageViewBase const& image, double center ) { return vw::UnaryPerPixelView(image.impl(), CenterLongitudeFunc(center)); } /// ImageView operation that applies a transform matrix to every point in the image. class PointTransFunc : public vw::ReturnFixedType { vw::Matrix3x3 m_trans; public: PointTransFunc(vw::Matrix3x3 const& trans) : m_trans(trans) {} vw::Vector3 operator() (vw::Vector3 const& pt) const { return m_trans*pt; } }; template vw::UnaryPerPixelView inline point_transform( vw::ImageViewBase const& image, vw::Matrix3x3 const& t ) { return vw::UnaryPerPixelView(image.impl(), PointTransFunc(t)); } /// Compute bounding box of the given cloud. If is_geodetic is false, /// that means a cloud of raw xyz cartesian values, then Vector3() /// signifies no-data. If is_geodetic is true, no-data is suggested /// by having the z component of the point be NaN. vw::BBox3 pointcloud_bbox(vw::ImageViewRef const& point_image, bool is_geodetic); // Class to read points from CSV one point at a // time. Now that LAS support is via PDAL, this need // not imitate the old LAS reader in libLAS. class BaseReader { public: std::int64_t m_num_points; bool m_has_georef; // if the dataset has a georeference vw::cartography::GeoReference m_georef; virtual bool ReadNextPoint() = 0; virtual vw::Vector3 GetPoint() = 0; virtual ~BaseReader() {} }; // In the header file for the test, the others would ideally also have a test. /// Reader for .pcd files created by the PCL library. /// - Supports ascii and binary, but only three element GCC data. /// - This class needs to be tested before it is used!!!! class PcdReader: public BaseReader{ private: std::string m_pcd_file; bool m_has_valid_point; bool m_binary_format; int m_size_bytes; char m_type; size_t m_header_length_bytes; vw::Vector3 m_curr_point; std::ifstream * m_ifs; /// Read the text header of the PCD file void read_header(); public: PcdReader(std::string const & pcd_file); virtual bool ReadNextPoint(); virtual vw::Vector3 GetPoint(); virtual ~PcdReader(); }; // End class PcdReader // Determine if we should be using a longitude range between // [-180, 180] or [0,360]. The former is used, unless the latter // results in a tighter range of longitudes, such as when crossing // the international date line. vw::BBox2 estim_lonlat_box(vw::ImageViewRef const& point_image, vw::cartography::Datum const& datum); // Find the median longitude and latitude for a subset of the point cloud void median_lon_lat(vw::ImageViewRef const& point_image, vw::cartography::GeoReference const& georef, double & lon, double & lat); std::string get_cloud_type(std::string const& file_name); // Find the number of channels in the point clouds. // If the point clouds have inconsistent number of channels, // return the minimum of 3 and the minimum number of channels. // This will be used to flag that we cannot reliable extract the // error channels, which start at channel 4. int num_channels(std::vector const& pc_files); // See if all the input point cloud files have stddev values bool has_stddev(std::vector const& pc_files); // Per pixel operator returning the norm of a vector template struct VectorNorm: public vw::ReturnFixedType { VectorNorm() {} double operator() (VectorT const& vec) const { return norm_2(vec); } }; // Read the error channels from the point clouds, and take their norm. // Explicit instantiations are in PointUtils.cc for num_ch = 4 and 6. template vw::ImageViewRef error_norm(std::vector const& pc_files); // Get a handle to the error image given a set of point clouds with 4 or 6 bands vw::ImageViewRef point_cloud_error_image(std::vector const& pointcloud_files); } // End namespace asp #endif ================================================ FILE: src/asp/Core/ProjectiveCamApprox.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file ProjectiveCamApprox.cc // Approximate a camera model with a projective transform #include #include namespace asp { // Compute the best-fitting projective transform that maps a set of 3D ground points // to 2D image points. See also: applyProjTrans(). void calcProjTrans(std::vector const& imagePts, std::vector const& groundPts, std::vector & transformCoeffs) { if (imagePts.size() != groundPts.size()) vw::vw_throw(vw::ArgumentErr() << "The number of inputs and outputs must agree.\n"); int numPts = imagePts.size(); if (numPts < 8) vw::vw_throw(vw::ArgumentErr() << "At least 8 points are needed to fit a 3D-to-2D projective transform.\n"); int numMatRows = 2 * numPts; // there exist x and y coords for each point int numMatCols = 14; // Number of variables in the projective transform Eigen::MatrixXd M = Eigen::MatrixXd::Zero(numMatRows, numMatCols); Eigen::VectorXd b = Eigen::VectorXd::Zero(numMatRows); for (int it = 0; it < numPts; it++) { double x = groundPts[it].x(), y = groundPts[it].y(), z = groundPts[it].z(); double col = imagePts[it].x(), row = imagePts[it].y(); // If the solution coefficients are u0, u1, ..., must have: // (u0 + u1 * x + u2 * y + u3 * z) / (1 + u4 * x + u5 * y + u6 * z) = col // (u7 + u8 * x + u9 * y + u10 * z) / (1 + u11 * x + u12 * y + u13 * z) = row // Multiply by the denominators. Get a linear regression in the coefficients. M.row(2 * it + 0) << 1, x, y, z, -x * col, -y * col, -z * col, 0, 0, 0, 0, 0, 0, 0; M.row(2 * it + 1) << 0, 0, 0, 0, 0, 0, 0, 1, x, y, z, -x * row, -y * row, -z * row; b[2 * it + 0] = col; b[2 * it + 1] = row; } // Solve the over-determined system, per: // https://eigen.tuxfamily.org/dox/group__LeastSquares.html Eigen::VectorXd u = M.colPivHouseholderQr().solve(b); // Copy back the result to a standard vector (to avoid using Eigen too much as // that is slow to compile). transformCoeffs.resize(numMatCols); for (int it = 0; it < numMatCols; it++) transformCoeffs[it] = u[it]; return; } // Apply a projective transform to a ground point and compute the image pixel vw::Vector2 applyProjTrans(vw::Vector3 const& xyz, std::vector const& transformCoeffs) { std::vector const& u = transformCoeffs; // alias // See the projective transform formula in calcProjTrans(). double x = xyz.x(), y = xyz.y(), z = xyz.z(); double col_den = 1 + u[4] * x + u[5] * y + u[6] * z; double row_den = 1 + u[11] * x + u[12] * y + u[13] * z; // It is quite unusual for the denominator to be zero, as the ground point is // normally in front of the camera. In that case better return something large // rather than Inf. if (col_den == 0) col_den = 1e-8; if (row_den == 0) row_den = 1e-8; double col = (u[0] + u[1] * x + u[2] * y + u[3] * z) / col_den; double row = (u[7] + u[8] * x + u[9] * y + u[10] * z) / row_den; return vw::Vector2(col, row); } } // End namespace asp ================================================ FILE: src/asp/Core/ProjectiveCamApprox.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file ProjectiveCamApprox.h // Approximate a camera model with a projective transform #ifndef __ASP_CORE_PROJECTIVE_CAM_APPROX_H__ #define __ASP_CORE_PROJECTIVE_CAM_APPROX_H__ #include namespace asp { // Compute the best-fitting projective transform that maps a set of 3D ground points // to 2D image points. See also: applyProjTrans(). void calcProjTrans(std::vector const& imagePts, std::vector const& groundPts, std::vector & transformCoeffs); // Apply a projective transform to a ground point and compute the image pixel vw::Vector2 applyProjTrans(vw::Vector3 const& xyz, std::vector const& transformCoeffs); } // End namespace asp #endif // __ASP_CORE_PROJECTIVE_CAM_APPROX_H__ ================================================ FILE: src/asp/Core/ReportUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file ReportUtils.cc /// // Utilities for reading report files #include #include #include #include #include namespace asp { // See the header for the function description. void readReportFile(std::string const& report_file, std::set const& str_col_names, std::set const& num_col_names, // Outputs std::map> & str_map, std::map> & num_map) { // Open the file for reading, and throw an error if it fails vw::vw_out() << "Reading: " << report_file << "\n"; std::ifstream file(report_file.c_str()); if (!file.is_open()) vw::vw_throw(vw::ArgumentErr() << "Failed to open file: " << report_file << "\n"); // Wipe the outputs str_map.clear(); num_map.clear(); // Read the header std::string header; std::getline(file, header); // Make lowercase boost::to_lower(header); // Replace all pound signs and commas with spaces boost::replace_all(header, "#", " "); boost::replace_all(header, ",", " "); // Split the header into tokens std::istringstream is(header); std::vector colNames; std::string val; while (is >> val) colNames.push_back(val); // Parse each line std::string line; while (std::getline(file, line)) { // Replace all commas with spaces boost::replace_all(line, ",", " "); // Split the line into tokens std::istringstream is(line); std::vector tokens; while (is >> val) tokens.push_back(val); // Skip empty lines if (tokens.empty()) continue; // Skip lines starting with a pound sign if (tokens[0][0] == '#') continue; // Must have as many tokens as columns if (tokens.size() != colNames.size()) vw::vw_throw(vw::ArgumentErr() << "Line has " << tokens.size() << " values. " << "Expected: " << colNames.size() << "\n"); // Iterate over tokens. If the token is a string, add it to the string map. // If it is a number, add it to the number map. for (size_t i = 0; i < tokens.size(); i++) { // check if colNames[i] is in str_col_names if (str_col_names.find(colNames[i]) != str_col_names.end()) { str_map[colNames[i]].push_back(tokens[i]); } else if (num_col_names.find(colNames[i]) != num_col_names.end()) { // Must be a number. Add it to the number map. Do a simple sanity check. auto const& t = tokens[i]; if (!isdigit(t[0]) && t[0] != '-' && t[0] != '.') vw::vw_throw(vw::ArgumentErr() << "Expected a number, got: " << t << "\n"); num_map[colNames[i]].push_back(atof(t.c_str())); } } } // Check each desired column is present in the file for (std::string const& col: str_col_names) { if (str_map.find(col) == str_map.end()) vw::vw_throw(vw::ArgumentErr() << "Column " << col << " not found in: " << report_file << "\n"); } for (std::string const& col: num_col_names) { if (num_map.find(col) == num_map.end()) vw::vw_throw(vw::ArgumentErr() << "Column " << col << " not found in: " << report_file << "\n"); } // All columns must have the same size size_t num_rows = str_map.begin()->second.size(); for (auto const& p: str_map) { if (p.second.size() != num_rows) vw::vw_throw(vw::ArgumentErr() << "Column " << p.first << " has " << p.second.size() << " rows, expected: " << num_rows << "\n"); } for (auto const& p: num_map) { if (p.second.size() != num_rows) vw::vw_throw(vw::ArgumentErr() << "Column " << p.first << " has " << p.second.size() << " rows, expected: " << num_rows << "\n"); } } } // end namespace asp ================================================ FILE: src/asp/Core/ReportUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file ReportUtils.h /// // Utilities for reading report files #ifndef __ASP_CORE_REPORT_UTILS_H__ #define __ASP_CORE_REPORT_UTILS_H__ #include #include #include #include #include #include namespace asp { // Given a report file with the first line being a header having column names, // read it into a map. The keys will be the column names, the values will be // vectors of strings or doubles. The desired names of columns and their types // are passed in as arguments. void readReportFile(std::string const& report_file, std::set const& str_col_names, std::set const& num_col_names, // Outputs std::map> & str_map, std::map> & num_map); } // End namespace asp #endif ================================================ FILE: src/asp/Core/StereoSettings.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSettings.cc /// #include #include #include #include #include #include #include #include #include #include namespace po = boost::program_options; using namespace vw; const double g_nan_val = std::numeric_limits::quiet_NaN(); // Create a single instance of the StereoSettings // --------------------------------------------------- namespace { vw::RunOnce stereo_settings_once = VW_RUNONCE_INIT; boost::shared_ptr stereo_settings_ptr; void init_stereo_settings() { stereo_settings_ptr = boost::shared_ptr(new asp::StereoSettings()); } } namespace asp { StereoSettings& stereo_settings() { stereo_settings_once.run(init_stereo_settings); // Ensure StereoSettings are initialized if (!(*stereo_settings_ptr).initialized_stereo_settings) { // This call must happen first, otherwise we get into infinite // recursion. stereo_settings_ptr->initialized_stereo_settings = true; // Initialize the members of StereoSettings(). vw::GdalWriteOptions opt; stereo_settings_ptr->initialize(opt); } return *stereo_settings_ptr; } void StereoSettings::initialize(vw::GdalWriteOptions & opt) { // This is a bug fix. Ensure that all members of this class as // well as opt itself are always initialized before using them, // whether in stereo, other ASP applications, or the unit // tests. What is going on below is the following. The call to // generate_config_file_options() specifies what the values of the // class members should be, then we parse and initialize them when // po::store is invoked. Note that we don't override any of the // options from the command line (that's done much later), hence // below we use empty command line options. po::options_description l_opts(""); l_opts.add(asp::generate_config_file_options(opt)); po::variables_map l_vm; try { int l_argc = 1; const char* l_argv[] = {""}; po::store(po::command_line_parser(l_argc, l_argv).options(l_opts).style(po::command_line_style::unix_style).run(), l_vm); po::notify(l_vm); } catch (po::error const& e) { vw::vw_throw(vw::ArgumentErr() << "Error parsing input:\n" << e.what() << "\n" << l_opts); } } StereoSettings::StereoSettings() { // This var will turn to true once all stereo settings were parsed // and all the members of this class are initialized. initialized_stereo_settings = false; default_corr_timeout = 900; // in seconds nodata_value = g_nan_val; } // Define our options that are available // ---------------------------------------------------------- PreProcessingDescription::PreProcessingDescription(): po::options_description("Preprocessing options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("alignment-method", po::value(&global.alignment_method)->default_value("affineepipolar"), "Alignment for input images. [affineepipolar, local_epipolar, homography, epipolar, none]") ("left-image-crop-win", po::value(&global.left_image_crop_win)->default_value(BBox2i(0, 0, 0, 0), "xoff yoff xsize ysize"), "Do stereo in a region of the left image. Default: use the entire image. " "This option forces redoing all the pre-processing steps if a run is resumed. " "The region be created by stereo_gui. See also right-image-crop-win and " "proj-win.") ("right-image-crop-win", po::value(&global.right_image_crop_win)->default_value(BBox2i(0, 0, 0, 0), "xoff yoff xsize ysize"), "When combined with left-image-crop-win, do stereo in given subregions of " "left and right images. The crop windows can be determined using stereo_gui. " "See also proj-win.") ("proj-win", po::value(&global.proj_win)->default_value(BBox2i(0, 0, 0, 0), "minx miny maxx maxy"), "Limit stereo to this projection window for input mapprojected images. This " "option forces redoing all the pre-processing steps in a resumed run. " "Available in build 2026-01 or later. See also left-image-crop-win and " "right-image-crop-win.") ("force-use-entire-range", po::bool_switch(&global.force_use_entire_range)->default_value(false)->implicit_value(true), "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.") ("individually-normalize", po::bool_switch(&global.individually_normalize)->default_value(false)->implicit_value(true), "Individually normalize the input images between 0.0-1.0 using +- 2.5 sigmas about their mean values.") ("ip-per-tile", po::value(&global.ip_per_tile)->default_value(0), "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.") ("ip-per-image", po::value(&global.ip_per_image)->default_value(0), "How many interest points to detect in each image, before matching (default: automatic determination). Can set either this or --ip-per-tile.") ("matches-per-tile", po::value(&global.matches_per_tile)->default_value(0), "How many interest point matches to compute in each image tile (of size " "normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger " "than this. See also --matches-per-tile-params.") ("ip-detect-method", po::value(&global.ip_detect_method)->default_value(0), "Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.") ("epipolar-threshold", po::value(&global.epipolar_threshold)->default_value(-1), "Maximum distance from the epipolar line to search for IP matches. Default: automatic calculation.") ("ip-edge-buffer", po::value(&global.ip_edge_buffer_percent)->default_value(0), "Remove IP within this percentage from the outer edges of an image pair (integer percent).") ("normalize-ip-tiles", po::bool_switch(&global.ip_normalize_tiles)->default_value(false)->implicit_value(true), "Individually normalize tiles used for IP detection.") ("dem", po::value(&global.dem)->default_value(""), "Input DEM for processing map-projected images. Can be used instead of " "specifying the DEM as the last positional argument.") ("matches-as-txt", po::bool_switch(&global.matches_as_txt)->default_value(false)->implicit_value(true), "Read and write match files as plain text instead of binary.") ("ip-inlier-factor", po::value(&global.ip_inlier_factor)->default_value(0.2), "A higher factor will result in more interest points, but perhaps also more outliers, " "and a bigger search range.") ("ip-uniqueness-threshold", po::value(&global.ip_uniqueness_thresh)->default_value(0.8), "Min percentage distance between closest and second closest IP descriptors, a larger value allows more IP matches.") ("ip-nodata-radius", po::value(&global.ip_nodata_radius)->default_value(4), "Remove IP near nodata with this radius, in pixels.") ("ip-triangulation-max-error", po::value(&global.ip_triangulation_max_error)->default_value(-1), "When matching IP, filter out any pairs with a triangulation error higher than this.") ("ip-num-ransac-iterations", po::value(&global.ip_num_ransac_iterations)->default_value(1000), "How many RANSAC iterations to do in interest point matching.") ("disable-tri-ip-filter", po::bool_switch(&global.disable_tri_filtering)->default_value(false)->implicit_value(true), "Turn off the tri-ip filtering step.") ("ip-debug-images", po::bool_switch(&global.ip_debug_images)->default_value(false)->implicit_value(true), "Write debug images to disk when detecting and matching interest points.") ("num-obalog-scales", po::value(&global.num_scales)->default_value(-1), "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.") ("nodata-value", po::value(&global.nodata_value)->default_value(g_nan_val), "Pixels with values less than or equal to this number are treated as no-data. This overrides the no-data values from input images.") ("stddev-mask-kernel", po::value(&global.nodata_stddev_kernel)->default_value(-1), "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.") ("stddev-mask-thresh", po::value(&global.nodata_stddev_thresh)->default_value(0.5), "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.") ("skip-rough-homography", po::bool_switch(&global.skip_rough_homography)->default_value(false)->implicit_value(true), "Skip the step of performing datum-based rough homography if it fails.") ("no-datum", po::bool_switch(&global.no_datum)->default_value(false)->implicit_value(true), "Do not assume a reliable datum exists, such as for potato-shaped bodies.") ("skip-image-normalization", po::bool_switch(&global.skip_image_normalization)->default_value(false)->implicit_value(true), "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.") ("force-reuse-match-files", po::bool_switch(&global.force_reuse_match_files)->default_value(false)->implicit_value(true), "Force reusing the match files even if older than the images or cameras.") ("part-of-multiview-run", po::bool_switch(&global.part_of_multiview_run)->default_value(false)->implicit_value(true), "If the current run is part of a larger multiview run.") ("global-alignment-threshold", po::value(&global.global_alignment_threshold)->default_value(10), "Maximum distance from inlier interest point matches to the epipolar line when calculating the global affine epipolar alignment.") ("local-alignment-threshold", po::value(&global.local_alignment_threshold)->default_value(2), "Maximum distance from inlier interest point matches to the epipolar line when calculating the local affine epipolar alignment.") ("alignment-num-ransac-iterations", po::value(&global.alignment_num_ransac_iterations)->default_value(1000), "How many RANSAC iterations to use for global or local epipolar alignment.") ("outlier-removal-params", po::value(&global.outlier_removal_params)->default_value(Vector2(95.0, 3.0), "pct factor"), "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.") ("matches-per-tile-params", po::value(&global.matches_per_tile_params)->default_value(Vector2(1024, 1280), "1024 1280"), "To be used with --matches-per-tile. The first value is the image tile " "size for both images. A larger second value allows each right tile to " "further expand to this size, resulting in the tiles overlapping. This may be " "needed if the homography alignment between these images is not great, as " "this transform is used to pair up left and right image tiles.") ("datum", po::value(&global.datum)->default_value(""), "Set the planet 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). If not set, " "will be auto-guessed based on camera centers (for Earth, Mars, and Moon).") ("match-files-prefix", po::value(&global.match_files_prefix)->default_value(""), "Use the match file from this prefix. Normally contains match files " "created with bundle_adjust or parallel_stereo.") ("clean-match-files-prefix", po::value(&global.clean_match_files_prefix)->default_value(""), "Use as input the *-clean.match file from this prefix (this had the " "outliers filtered out).") ("band", po::value(&global.band)->default_value(-1), "Use this band (channel) from input images if more than one. The band count starts " "from 1. If not set and more than one band is present, use the first band and print a " "warning.") ("flann-method", po::value(&global.flann_method)->default_value("auto"), "Choose the FLANN method for matching interest points. Options: 'kmeans': slower but " "deterministic, 'kdtree': faster (up to 6x) but not deterministic (starting with " "FLANN 1.9.2). The default ('auto') is to use 'kmeans' for 25,000 features or less " "and 'kdtree' otherwise. This does not apply to ORB feature matching.") ("left-image-clip", po::value(&global.left_image_clip)->default_value(""), "If --left-image-crop-win is used, replaced the left image cropped to that window with this clip.") ("right-image-clip", po::value(&global.right_image_clip)->default_value(""), "If --right-image-crop-win is used, replaced the right image cropped to that window with this clip.") ("accept-provided-mapproj-dem", po::bool_switch(&global.accept_provided_mapproj_dem)->default_value(false)->implicit_value(true), "Accept the DEM provided on the command line as the one mapprojection was done with, " "even if it disagrees with the DEM recorded in the geoheaders of input images.") ("allow-different-mapproject-gsd", po::bool_switch(&global.allow_different_mapproject_gsd)->default_value(false)->implicit_value(true), "Allow the left and right mapprojected images to have different GSD. This is " "for backward compatibility, and is not recommended.") ("ortho-heights", po::value(&global.ortho_heights)->default_value(Vector2(g_nan_val, g_nan_val), "nan nan"), "It is assumed that the left and right input images have been mapprojected onto " "surfaces with the provided heights above a datum. The datum is read from the " "image geoheaders.") ("output-prefix-override", po::value(&global.output_prefix_override)->default_value(""), "Override the output prefix with this value. Needed during parallel stereo.") // For bathymetry correction ("left-bathy-mask", po::value(&global.left_bathy_mask), "Mask to use for the left image when doing bathymetry. Pixels classified as " "water must have non-positive value or be no-data in the mask, while land " "pixels must have positive value.") ("right-bathy-mask", po::value(&global.right_bathy_mask), "Mask to use for the right image when doing bathymetry. See also " "left-bathy-mask.") ("bathy-plane", po::value(&global.bathy_plane), "Path to a file containing a plane approximating the water surface, for " "bathymetry correction with underwater terrain. This corrects camera rays passing " "through water using Snell's law. If there is one plane per image, use " "--bathy-plane-list. Use together with --refraction-index.") ("bathy-plane-list", po::value(&global.bathy_plane_list)->default_value(""), "Path to a file containing a list of bathy plane files for bathymetry correction, " "if more than one. Set one plane file per line. Must specify one plane per input " "image, in the same order. Use with --refraction-index.") ("refraction-index", po::value(&global.refraction_index)->default_value(0), "The index of refraction of water to be used in bathymetry correction. " "Must be specified and bigger than 1. This index can be computed with " "the refr_index program.") ("output-cloud-type", po::value(&global.output_cloud_type)->default_value("all"), "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'.") ("stop-after-stats", po::bool_switch(&global.stop_after_stats)->default_value(false)->implicit_value(true), "Stop after computing stereo statistics. Needed for stereo_dist.") ("stereo-dist-mode", po::bool_switch(&global.stereo_dist_mode)->default_value(false)->implicit_value(true), "In this mode (distributed stereo processing) reuse the stats, expand the left crop " "win by padding, auto-compute the right crop win, and skip stereo convergence angle " "calculation.") ; } CorrelationDescription::CorrelationDescription(): po::options_description("Correlation options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("prefilter-mode", po::value(&global.pre_filter_mode)->default_value(2), "Filter used to prepare images before performing correlation. Used only with the " "asp_bm algorithm. Options: 0 (none), 1 (subtracted mean), 2 (LoG).") ("prefilter-kernel-width", po::value(&global.slogW)->default_value(1.5), "Sigma value for Gaussian kernel used with prefilter modes 1 and 2.") ("corr-seed-mode", po::value(&global.seed_mode)->default_value(1), "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)]") ("min-num-ip", po::value(&global.min_num_ip)->default_value(20), "The minimum number of interest points which must be found to estimate the search range.") ("corr-sub-seed-percent", po::value(&global.seed_percent_pad)->default_value(0.25), "Expand the search range by this factor when computing the low-resolution disparity.") ("disparity-range-expansion-percent", po::value(&global.disparity_range_expansion_percent)->default_value(20.0), "Expand the disparity range estimated from interest points by this percentage before computing the stereo correlation with local epipolar alignment.") ("cost-mode", po::value(&global.cost_mode)->default_value(2), "Correlation cost metric. [0 Absolute, 1 Squared, 2 Normalized Cross Correlation, 3 Census Transform (SGM only), 4 Ternary Census Transform (SGM only)]") ("xcorr-threshold", po::value(&global.xcorr_threshold)->default_value(2.0), "L-R vs R-L agreement threshold in pixels.") ("min-xcorr-level", po::value(&global.min_xcorr_level)->default_value(0), "Minimum level to run xcorr check on (SGM only).") ("save-left-right-disparity-difference", po::bool_switch(&global.save_lr_disp_diff)->default_value(false)->implicit_value(true), "Save the discrepancy between left-to-right and right-to-left disparities. See the doc for more info.") ("corr-kernel", po::value(&global.corr_kernel)->default_value(Vector2i(21,21),"21 21"), "Kernel size used for integer correlator.") ("corr-search", po::value(&global.search_range)->default_value(BBox2(0,0,0,0), "auto"), "Disparity search range. Will be used to find low-resolution disparity. Specify in format: hmin vmin hmax vmax. The doc has more info.") ("max-disp-spread", po::value(&global.max_disp_spread)->default_value(-1.0), "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.") ("corr-search-limit", po::value(&global.corr_search_limit)->default_value(BBox2(0,0,0,0), "auto"), "Limit the automatically computed disparity search range to these bounds, specified as: hmin vmin hmax vmax. See also --max-disp-spread.") ("ip-filter-using-dem", po::value(&global.ip_filter_using_dem)->default_value(""), "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: ' . Example: 'dem.tif 50.0'.") ("elevation-limit", po::value(&global.elevation_limit)->default_value(Vector2(0,0), "auto"), "Limit on expected elevation range: Specify as two values: min max.") // Note that we count later on the default for lon_lat_limit being BBox2(0,0,0,0). ("lon-lat-limit", po::value(&global.lon_lat_limit)->default_value(BBox2(0,0,0,0), "auto"), "Limit the triangulated interest points to this longitude-latitude range. The format is: lon_min lat_min lon_max lat_max.") ("corr-max-levels", po::value(&global.corr_max_levels)->default_value(5), "Max pyramid levels to process when using the integer correlator. (0 is just a single level).") // TODO: These parameters are used here, but are only set as filter options. //("rm-min-matches", po::value(&global.rm_min_matches)->default_value(60), // "Minimum number of pixels to be matched to keep sample (for filter mode 2).") //("rm-threshold", po::value(&global.rm_threshold)->default_value(3), // "Maximum distance between samples to be considered still matched (for filter mode 2).") ("rm-quantile-percentile", po::value(&global.rm_quantile_percentile)->default_value(0.85), "Filter out pixels in D_sub where disparity > multiple*quantile.") ("rm-quantile-multiple", po::value(&global.rm_quantile_multiple)->default_value(-1), "Filter out pixels in D_sub where disparity > multiple*quantile. Set to a positive " "value to enable.") ("skip-low-res-disparity-comp", po::bool_switch(&global.skip_low_res_disparity_comp)->default_value(false)->implicit_value(true), "Skip the low-resolution disparity computation. This option is invoked from " "parallel_stereo.") ("compute-low-res-disparity-only", po::bool_switch(&global.compute_low_res_disparity_only)->default_value(false)->implicit_value(true), "Compute only the low-resolution disparity, skip the full-resolution disparity " "computation.") ("disparity-estimation-dem", po::value(&global.disparity_estimation_dem)->default_value(""), "The DEM to use in estimating the low-resolution disparity " "(when corr-seed-mode is 2).") ("disparity-estimation-dem-error", po::value(&global.disparity_estimation_dem_error)->default_value(0.0), "Error, or uncertainty, in meters, of the disparity estimation DEM.") ("disparity-estimation-sample-rate", po::value(&global.disparity_estimation_sample_rate)->default_value(1), "Use one out of this many samples along each row and column, " "for ---corr-seed-mode 2.") ("corr-timeout", po::value(&global.corr_timeout)->default_value(global.default_corr_timeout), "Correlation timeout for an image tile, in seconds.") ("stereo-algorithm", po::value(&global.stereo_algorithm)->default_value("asp_bm"), "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.") ("corr-blob-filter", po::value(&global.corr_blob_filter_area)->default_value(0), "Filter blobs this size or less in correlation pyramid step.") ("corr-tile-size", po::value(&global.corr_tile_size_ovr)->default_value(ASPGlobalOptions::corr_tile_size()), "Override the default tile size used for processing.") ("sgm-collar-size", po::value(&global.sgm_collar_size)->default_value(512), "Extend SGM calculation to this distance to increase accuracy at tile borders.") ("sgm-search-buffer", po::value(&global.sgm_search_buffer)->default_value(Vector2i(4,4),"4 4"), "Search range expansion for SGM down stereo pyramid levels. Smaller values are faster, but greater change of blunders.") ("corr-memory-limit-mb", po::value(&global.corr_memory_limit_mb)->default_value(5*1024), "Keep correlation memory usage (per tile) close to this limit. Important for SGM/MGM.") ("correlator-mode", po::bool_switch(&global.correlator_mode)->default_value(false)->implicit_value(true), "Function as an image correlator only (including with subpixel refinement). Assume no cameras, aligned input images, and stop before triangulation, so at filtered disparity.") ("stereo-debug", po::bool_switch(&global.stereo_debug)->default_value(false)->implicit_value(true), "Write stereo debug images and output.") ("local-alignment-debug", po::bool_switch(&global.local_alignment_debug)->default_value(false)->implicit_value(true), "Save the results of more intermediate steps when doing local alignment."); po::options_description backwards_compat_options("Aliased backwards compatibility options"); // Do not add default values here. They may override the values set // earlier for these variables. backwards_compat_options.add_options() ("h-kernel", po::value(&global.corr_kernel[0]), "Correlation kernel width.") ("v-kernel", po::value(&global.corr_kernel[1]), "Correlation kernel height.") ("h-corr-min", po::value(&global.search_range.min()[0]), "Correlation window size min x.") ("h-corr-max", po::value(&global.search_range.max()[0]), "Correlation window size max x.") ("v-corr-min", po::value(&global.search_range.min()[1]), "Correlation window size min y.") ("v-corr-max", po::value(&global.search_range.max()[1]), "Correlation window size max y."); (*this).add(backwards_compat_options); } SubpixelDescription::SubpixelDescription(): po::options_description("Subpixel options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("subpixel-mode", po::value(&global.subpixel_mode)->default_value(1), "Subpixel algorithm. [0 None, 1 Parabola, 2 Bayes EM, 3 Affine, " "4 Phase Correlation 5 LK, 7 SGM None 8 SGM Linear, 9 SGM Poly4, " "10 SGM Cos, 11 SGM Parabola 12 SGM Blend]") ("subpix-from-blend", po::bool_switch(&global.subpix_from_blend)->default_value(false)->implicit_value(true), "For the input to subpixel, use the -B.tif file instead of the -D.tif file.") ("subpixel-kernel", po::value(&global.subpixel_kernel)->default_value(Vector2i(35,35), "35 35"), "Kernel size used for subpixel method.") ("disable-h-subpixel", po::bool_switch(&global.disable_h_subpixel)->default_value(false)->implicit_value(true), "Disable calculation of subpixel in horizontal direction.") ("disable-v-subpixel", po::bool_switch(&global.disable_v_subpixel)->default_value(false)->implicit_value(true), "Disable calculation of subpixel in vertical direction.") ("subpixel-max-levels", po::value(&global.subpixel_max_levels)->default_value(2), "Max pyramid levels to process when using the BayesEM refinement. (0 is just a single level).") ("phase-subpixel-accuracy", po::value(&global.phase_subpixel_accuracy)->default_value(20), "Accuracy to use for mode 4 phase subpixel. Resolution is 1/this. Larger values take more time."); po::options_description backwards_compat_options("Aliased backwards compatibility options"); backwards_compat_options.add_options() ("subpixel-h-kernel", po::value(&global.subpixel_kernel[0]), "Subpixel kernel width.") ("subpixel-v-kernel", po::value(&global.subpixel_kernel[1]), "Subpixel kernel height."); (*this).add(backwards_compat_options); } FilteringDescription::FilteringDescription(): po::options_description("Filtering options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("filter-mode", po::value(&global.filter_mode)->default_value(1), "Disparity filter mode. [0 None, 1 Use mean difference to neighbors (invalidates fewer pixels), 2 Use thresholds (invalidates more pixels)]") ("rm-half-kernel", po::value(&global.rm_half_kernel)->default_value(Vector2i(5,5), "5 5"), "Low confidence pixel removal kernel (half sized).") ("max-mean-diff", po::value(&global.max_mean_diff)->default_value(3), "Maximum difference between current pixel disparity and mean disparity of neighbors to still keep current disparity (for filter mode 1).") ("rm-min-matches", po::value(&global.rm_min_matches)->default_value(60), "Minimum number of pixels to be matched to keep sample (for filter mode 2).") ("rm-threshold", po::value(&global.rm_threshold)->default_value(3), "Maximum distance between samples to be considered still matched (for filter mode 2).") ("rm-cleanup-passes", po::value(&global.rm_cleanup_passes)->default_value(1), "Number of passes for cleanup during the post-processing phase.") ("enable-fill-holes", po::bool_switch(&global.enable_fill_holes)->default_value(false)->implicit_value(true), "Enable filling of holes in disparity using an inpainting method. Obsolete. It is suggested to use instead point2dem's analogous functionality.") ("disable-fill-holes", po::bool_switch(&global.disable_fill_holes)->default_value(false)->implicit_value(true), "Disable filling of holes using an inpainting method. Ignored and obsolete. To be removed in future versions of the software.") ("fill-holes-max-size", po::value(&global.fill_hole_max_size)->default_value(100000), "Holes with no more pixels than this number should be filled in.") ("edge-buffer-size", po::value(&global.edge_buffer_size)->default_value(-1), "Crop to be applied around image borders during filtering. If not set, and " "subpixel-mode is between 1 and 6 (inclusive), use the max of two subpixel-kernel " "values. Otherwise set to 5.") ("erode-max-size", po::value(&global.erode_max_size)->default_value(0), "Isolated blobs with no more pixels than this number should be removed.") ("median-filter-size", po::value(&global.median_filter_size)->default_value(0), "Filter subpixel results with a median filter of this size. Can only be used with texture smoothing.") ("texture-smooth-size", po::value(&global.disp_smooth_size)->default_value(0), "Kernel size to perform texture aware disparity smoothing with. Can only be used with median smoothing.") ("texture-smooth-scale", po::value(&global.disp_smooth_texture)->default_value(0.15), "Scaling factor for texture smoothing. Larger is more smoothing.") ("gotcha-disparity-refinement", po::bool_switch(&global.gotcha_disparity_refinement)->default_value(false)->implicit_value(true), "Turn on the experimental Gotcha disparity refinement. It refines and overwrites F.tif. See the option 'casp-go-param-file' for customizing its behavior.") ("casp-go-param-file", po::value(&global.casp_go_param_file)->default_value(""), "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.") ; po::options_description backwards_compat_options("Aliased backwards compatibility options"); // Do not add default values here. They may override the values set // earlier for these variables. backwards_compat_options.add_options() ("rm-h-half-kern", po::value(&global.rm_half_kernel[0]), "Filter kernel half width.") ("rm-v-half-kern", po::value(&global.rm_half_kernel[1]), "Filter kernel half height."); (*this).add(backwards_compat_options); } TriangulationDescription::TriangulationDescription(): po::options_description("Triangulation options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("universe-center", po::value(&global.universe_center)->default_value("None"), "Center from which to measure the universe radius for the purpose of removing outliers. [Camera, Zero (planet center), None]") ("near-universe-radius", po::value(&global.near_universe_radius)->default_value(0.0), "Radius of inner boundary of universe in meters (remove points with radius smaller than that).") ("far-universe-radius", po::value(&global.far_universe_radius)->default_value(0.0), "Radius of outer boundary of universe in meters (remove points with radius larger than that).") ("min-triangulation-angle", po::value(&global.min_triangulation_angle)->default_value(-1.0), "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.") ("max-valid-triangulation-error", po::value(&global.max_valid_triangulation_error)->default_value(0), "If positive, points with triangulation error larger than this will be removed from the cloud. Measured in meters.") ("bundle-adjust-prefix", po::value(&global.bundle_adjust_prefix), "Use the camera adjustments obtained by previously running bundle_adjust with this output prefix.") ("propagate-errors", po::bool_switch(&global.propagate_errors)->default_value(false)->implicit_value(true), "Propagate the errors from the input cameras to the triangulated point cloud.") ("horizontal-stddev", po::value(&global.horizontal_stddev)->default_value(Vector2(0, 0), "0 0"), "If positive, propagate these left and right camera horizontal ground plane stddev through triangulation. To be used with --propagate-errors.") ("position-covariance-factor", po::value(&global.position_covariance_factor)->default_value(1.0), "Multiply the satellite position covariances by this number before propagating them to the triangulated point cloud. Applicable only to Maxar(DigitalGlobe) linescan cameras.") ("orientation-covariance-factor", po::value(&global.orientation_covariance_factor)->default_value(1.0), "Multiply the satellite quaternion covariances by this number before propagating them to the triangulated point cloud. Applicable only to Maxar(DigitalGlobe) linescan cameras.") ("unalign-disparity", po::bool_switch(&global.unalign_disparity)->default_value(false)->implicit_value(true), "Take the computed disparity, and compute the disparity between unaligned images.") ("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.") ("num-matches-from-disp-triplets", po::value(&global.num_matches_from_disp_triplets)->default_value(0), "Create a match file with this many points uniformly sampled from the stereo " "disparity, while making sure that if there are more than two images, a set of ground " "features are represented by matches in at least three of them. See the documentation " "for more info.") ("point-cloud-rounding-error", po::value(&global.point_cloud_rounding_error)->default_value(0.0), "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.") ("save-double-precision-point-cloud", po::bool_switch(&global.save_double_precision_point_cloud)->default_value(false)->implicit_value(true), "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).") ("compute-point-cloud-center-only", po::bool_switch(&global.compute_point_cloud_center_only)->default_value(false)->implicit_value(true), "Only compute the center of triangulated point cloud and exit.") ("skip-point-cloud-center-comp", po::bool_switch(&global.skip_point_cloud_center_comp)->default_value(false)->implicit_value(true), "Skip the computation of the point cloud center. This option is invoked from parallel_stereo.") ("compute-error-vector", po::bool_switch(&global.compute_error_vector)->default_value(false)->implicit_value(true), "Compute the triangulation error vector, not just its length.") ("enable-atmospheric-refraction-correction", po::bool_switch(&global.enable_atmospheric_refraction_correction)->default_value(false)->implicit_value(true), "Enable atmospheric refraction correction for Pleiades linescan cameras. By default, " "such a correction is enabled only for WorldView linescan cameras.") ("enable-velocity-aberration-correction", po::bool_switch(&global.enable_velocity_aberration_correction)->default_value(false)->implicit_value(true), "Enable velocity aberration correction for Pleiades linescan cameras. By default, " "such a correction is enabled only for WorldView linescan cameras.") ; } GUIDescription::GUIDescription(): po::options_description("GUI options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("grid-cols", po::value(&global.grid_cols)->default_value(std::numeric_limits::max()), "Display images as tiles on a grid with this many columns. Default: Use one row.") ("window-size", po::value(&global.window_size)->default_value(Vector2i(1200,800),"1200 800"), "The width and height of the GUI window in pixels.") ("single-window,w", po::bool_switch(&global.single_window)->default_value(false)->implicit_value(true), "Show all images in the same window (with a dialog to choose among them) rather than next to each other.") ("view-several-side-by-side", po::bool_switch(&global.view_several_side_by_side)->default_value(false)->implicit_value(true), "View several images side-by-side, with a dialog to choose which images to show.") ("use-georef,g", po::bool_switch(&global.use_georef)->default_value(false)->implicit_value(true), "Plot the images in the projected coordinate system given by the georeference of the images.") ("hillshade", po::bool_switch(&global.hillshade)->default_value(false)->implicit_value(true), "Interpret the input images as DEMs and hillshade them.") ("hillshade-azimuth", po::value(&global.hillshade_azimuth)->default_value(300), "The azimuth value when showing hillshaded images.") ("hillshade-elevation", po::value(&global.hillshade_elevation)->default_value(20), "The elevation value when showing hillshaded images.") ("lowest-resolution-subimage-num-pixels", po::value(&global.lowest_resolution_subimage_num_pixels)->default_value(-1), "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.") ("view-matches", po::bool_switch(&global.view_matches)->default_value(false)->implicit_value(true), "Locate and display the interest point matches for a stereo pair.") ("match-file", po::value(&global.match_file)->default_value(""), "Display this match file instead of looking one up based on existing conventions (implies --view-matches).") ("gcp-file", po::value(&global.gcp_file)->default_value(""), "Display the GCP pixel coordinates for this GCP file (implies --view-matches).") ("gcp-sigma", po::value(&global.gcp_sigma)->default_value(1.0), "The sigma (uncertainty, in meters) to use for the GCPs. A smaller sigma suggests " "a more accurate GCP. See also option --fix-gcp-xyz in bundle adjustment.") ("dem-file", po::value(&global.dem_file)->default_value(""), "Use this DEM when creating GCP from images.") ("hide-all", po::bool_switch(&global.hide_all)->default_value(false)->implicit_value(true), "Start with all images turned off (if all images are in the same window, useful with a large number of images).") ("delete-temporary-files-on-exit", po::bool_switch(&global.delete_temporary_files_on_exit)->default_value(false)->implicit_value(true), "Delete any subsampled and other files created by the GUI when exiting.") ("create-image-pyramids-only", po::bool_switch(&global.create_image_pyramids_only)->default_value(false)->implicit_value(true), "Without starting the GUI, build multi-resolution pyramids for the inputs, to be able to load them fast later.") ("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.") ("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.") ("nvm", po::value(&global.nvm)->default_value(""), "Load this .nvm file having interest point matches. See also --nvm-no-shift. " "The rig_calibrator program can create such files. This option implies " "--pairwise-matches, --preview, and a larger value of " "--lowest-resolution-subimage-num-pixels.") ("nvm-no-shift", po::bool_switch(&global.nvm_no_shift)->default_value(false)->implicit_value(true), "Assume that the image features in the input nvm file were saved without " "being shifted to be relative to the optical center of the camera.") ("isis-cnet", po::value(&global.isis_cnet)->default_value(""), "Load a control network having interest point matches from this binary file " "in the ISIS jigsaw format. See also --nvm.") ("zoom-proj-win", po::value(&global.zoom_proj_win)->default_value(BBox2(0,0,0,0), ""), "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.") ("zoom-all-to-same-region", po::bool_switch(&global.zoom_all_to_same_region)->default_value(false)->implicit_value(true), "Zoom all images to same region. Also accessible from the View menu.") ("csv-format", po::value(&global.csv_format_str)->default_value(""), asp::csv_opt_caption().c_str()) ("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.") ("csv-datum", po::value(&global.csv_datum)->default_value(""), "The datum to use when plotting a CSV file.") ("preview", po::bool_switch(&global.preview)->default_value(false)->implicit_value(true), "Load and display the images one at a time. The 'n' and 'p' keys can be used to cycle through them.") ("min", po::value(&global.min)->default_value(g_nan_val), "Value corresponding to 'coldest' color in the color map, when " "using --colorize or --colorbar, and plotting CSV data. Also used " "to manually set the minimum value in grayscale images. If not set, " "use the dataset minimum for color images, and estimate the minimum " "for grayscale images.") ("max", po::value(&global.max)->default_value(g_nan_val), "Value corresponding to the 'hottest' color in the color map, when " "using --colorize or --colorbar, and plotting CSV data. Also used " "to manually set the maximum value in grayscale images. If not set, " "use the dataset maximum for color images, and estimate the maximum " "for grayscale images.") ("plot-point-radius", po::value(&global.plot_point_radius)->default_value(2), "When plotting points from CSV files, let each point be drawn as a filled ball with this radius, in pixels.") ("font-size", po::value(&global.font_size)->default_value(9), "Set the font size.") ("no-georef", po::bool_switch(&global.no_georef)->default_value(false)->implicit_value(true), "Do not use georeference information when displaying the data, even when it exists.") ; } // Options for stereo_parse ParseDescription::ParseDescription(): po::options_description("stereo_parse options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("parallel-tile-size", po::value(&global.parallel_tile_size)->default_value(Vector2i(0,0),"0 0"), "Create tiles with these dimensions that are needed for parallel_stereo. Skip the " "tiles that, after being padded, do not contain valid disparities.") ("stereo-dist-tile-params", po::value(&global.stereo_dist_tile_params)->default_value(Vector2i(0,0),"0 0"), "Create the list of tiles with padding, in left image pixel units, that cover the " "region of overlap of left and right mapprojected images. Specify as two positive " "integers, having the tile size and padding, without quotes. Square tiles are " "assumed. The tile size is without taking into account the padding. For use with the " "stereo_dist distributed processing program. The list will be written to -distTileList.txt.") ("tile-at-location", po::value(&global.tile_at_loc)->default_value(""), "Find the tile in the current parallel_stereo run which generated the DEM portion " "having this lon-lat-height location. Specify as a string in quotes: 'lon lat " "height'. Use this option with stereo_parse and the rest of options used in " "parallel_stereo, including cameras, output prefix, etc. (except for those needed for " "tiling and parallelization). This does not work with mapprojected images.") ; } // Options for parallel_stereo. These are not used by the stereo // executables, but accept them quietly so that when stereo_gui or // stereo_parse is invoked with a parallel_stereo command it would // not fail. Later, if parallel_stereo is invoked from stereo_gui, // these will be passed on. ParallelDescription::ParallelDescription(): po::options_description("parallel_stereo options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("nodes-list", po::value(&global.nodes_list)->default_value(""), "The list of computing nodes, one per line. If not provided, run on the local machine.") ("ssh", po::value(&global.ssh)->default_value(""), "Specify the path to an alternate version of the ssh tool to use.") ("processes", po::value(&global.processes)->default_value(-1), "The number of processes to use per node.") ("threads-multiprocess", po::value(&global.threads_multi)->default_value(-1), "The number of threads to use per process when running multiple processes.") ("threads-singleprocess",po::value(&global.threads_single)->default_value(-1), "The number of threads to use when running a single process (stereo_pprc and stereo_fltr).") ("entry-point,e", po::value(&global.entry_point)->default_value(0), "Stereo Pipeline entry point (an integer from 0-5).") ("stop-point", po::value(&global.stop_point)->default_value(6), "Stereo Pipeline stop point (an integer from 1-6). Stop before this step.") ("job-size-w", po::value(&global.job_size_w)->default_value(2048), "Pixel width of input image tile for a single process.") ("job-size-h", po::value(&global.job_size_h)->default_value(2048), "Pixel height of input image tile for a single process.") ("sparse-disp-options", po::value(&global.sparse_disp_options)->default_value(""), "Options to pass directly to sparse_disp. Use quotes around this string.") ("prev-run-prefix", po::value(&global.prev_run_prefix)->default_value(""), "Start at the triangulation stage while reusing the data from this prefix.") ("parallel-options", po::value(&global.parallel_options)->default_value(""), "Options to pass directly to GNU Parallel. Use quotes around this string."); } UndocOptsDescription::UndocOptsDescription(): po::options_description("Undocumented options") { StereoSettings& global = stereo_settings(); (*this).add_options() ("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].") ("attach-georeference-to-lowres-disparity", po::bool_switch(&global.attach_georeference_to_lowres_disparity)->default_value(false)->implicit_value(true), "If input images are georeferenced, make D_sub and D_sub_spread georeferenced."); } // This handles options which are not in stereo_settings(), but // rather in 'opt'. So they are not config options set in // stereo.default but only command-line options. void addAspGlobalOptions(boost::program_options::options_description & description, ASPGlobalOptions & opt) { description.add_options() ("session-type,t", po::value(&opt.stereo_session), "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.") ("stereo-file,s", po::value(&opt.stereo_default_filename)->default_value("./stereo.default"), "Explicitly specify the stereo.default file to use."); } po::options_description generate_config_file_options(vw::GdalWriteOptions& opt) { po::options_description cfg_options; cfg_options.add(vw::GdalWriteOptionsDescription(opt)); cfg_options.add(PreProcessingDescription()); cfg_options.add(CorrelationDescription()); cfg_options.add(SubpixelDescription()); cfg_options.add(FilteringDescription()); cfg_options.add(TriangulationDescription()); cfg_options.add(GUIDescription()); cfg_options.add(ParseDescription()); cfg_options.add(ParallelDescription()); cfg_options.add(UndocOptsDescription()); return cfg_options; } // TODO(oalexan1): More settings from validateStereoOptions() that only need // stereo_settings() should be validated here. void StereoSettings::validate() { using namespace boost::algorithm; to_lower(alignment_method); trim(alignment_method); VW_ASSERT(alignment_method == "none" || alignment_method == "homography" || alignment_method == "epipolar" || alignment_method == "affineepipolar" || alignment_method == "local_epipolar", ArgumentErr() << "\"" << alignment_method << "\" is not a valid option for alignment-method."); to_lower(universe_center); trim(universe_center); VW_ASSERT(universe_center == "camera" || universe_center == "zero" || universe_center == "none", ArgumentErr() << "\"" << universe_center << "\" is not a valid option for universe_center."); // Must have not have both ip per image and ip per tile set if (asp::stereo_settings().ip_per_image > 0 && asp::stereo_settings().ip_per_tile > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot set both --ip-per-image and --ip-per-tile.\n"); } void StereoSettings::write_copy(int argc, char *argv[], std::string const& input_file, std::string const& output_file) const { std::ifstream in(input_file.c_str()); std::ofstream out(output_file.c_str()); // Write some log information out << "# ASP stereo configuration copy" << "\n"; out << "# " << current_posix_time_string() << "\n"; out << "# > "; for (int i = 0; i < argc; i++) { if (i) out << " "; out << std::string(argv[i]); } out << "\n\n"; out << in.rdbuf(); in.close(); out.close(); } bool StereoSettings::is_search_defined() const { return !(search_range.min() == Vector2() && search_range.max() == Vector2()); } } // end namespace asp ================================================ FILE: src/asp/Core/StereoSettings.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSettings.h /// This a class with minimal dependencies having stereo setings that is /// included in many places. #ifndef __ASP_CORE_STEREO_SETTINGS_H__ #define __ASP_CORE_STEREO_SETTINGS_H__ #include namespace asp { class StereoSession; // Forward declaration /// 'Global scoped' variables struct ASPGlobalOptions: vw::GdalWriteOptions { // Input std::string in_file1, in_file2, cam_file1, cam_file2, input_dem, extra_argument1, extra_argument2, extra_argument3; // Settings std::string stereo_session, stereo_default_filename; boost::shared_ptr session; // Used to extract cameras // Output std::string out_prefix; // Constants static int corr_tile_size() { return 1024; } // Tile size for correlation static int rfne_tile_size() { return 256; } // Tile size for refinement static int tri_tile_size() { return 256; } // Tile size for tri/point cloud }; /// Structure holding variables class StereoSettings { public: StereoSettings(); void initialize(vw::GdalWriteOptions& opt); void validate(); void write_copy(int argc, char *argv[], std::string const& input_file, std::string const& output_file) const; bool is_search_defined() const; // ---------------- // Public variables // ---------------- // Preprocessing options std::string alignment_method; /// Valid options are: [Homography, Epipolar, None] // Note: Below we use BBox2 rather than BBox2i to not choke on float inputs. // Do stereo in given regions only. vw::BBox2 left_image_crop_win; vw::BBox2 right_image_crop_win; vw::BBox2 proj_win; // Limit stereo to this projwin (for mapprojected images only) // Data for use with bathymetry std::string left_bathy_mask, right_bathy_mask, bathy_mask_list; std::string bathy_plane, bathy_plane_list, output_cloud_type; double refraction_index; bool force_use_entire_range; /// Use entire dynamic range of image bool individually_normalize; /// If > 1, normalize the images /// individually with their /// own hi's and lo's int ip_per_tile; ///< How many ip to find in each 1024^2 tile int ip_per_image; ///< How many ip to find in each image int matches_per_tile; ///< How many ip matches to find in each 1024^2 tile int ip_detect_method; ///< Method used for matching interest points /// 0 = Zack's integral Obalog method /// 1 = OpenCV SIFT method /// 2 = OpenCV ORB method double epipolar_threshold; /// Max distance from epipolar line to search for IP matches. double ip_inlier_factor; /// General scaling factor for IP finding, a larger value allows more IPs to match. double ip_uniqueness_thresh; /// Min percentage distance between closest and second closest IP descriptors. double ip_nodata_radius; /// Remove IP near nodata with this radius, in pixels. double ip_triangulation_max_error; ///< Remove IP matches with triangulation error higher than this. int ip_num_ransac_iterations; ///< How many ransac iterations to do in ip matching. bool disable_tri_filtering; ///< Turn of tri-ip filtering. int num_scales; /// How many scales to use if detecting interest points with OBALoG. If not specified, 8 will be used. int ip_edge_buffer_percent; ///< When detecting IP, throw out points within this many % of pixels /// of the left/right edges of the images being matched. bool ip_normalize_tiles; ///< Individually normalize tiles for IP detection. std::string dem; ///< Input DEM for map-projected images bool matches_as_txt; ///< Read and write match files as plain text bool ip_debug_images; ///< Write debug interest point images. double nodata_value; ///< Pixels with values less than or equal to this number are treated as no-data. // This overrides the nodata values from input images. double nodata_stddev_thresh; /// int nodata_stddev_kernel; ///< Kernel size of the nodata stddev calculation bool skip_rough_homography; ///< Use this if datum-based rough homography fails. bool no_datum; ///< Do not assume a reliable datum exists 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. bool force_reuse_match_files; ///< Force reusing the match files even if older than the images or cameras bool part_of_multiview_run; ///< If this run is part of a larger multiview run std::string datum; ///< The datum to use with RPC camera models std::string match_files_prefix, clean_match_files_prefix; // Load matches from here std::string left_image_clip, right_image_clip; double global_alignment_threshold; /// Max distance from the epipolar line when doing global affine epipolar alignment double local_alignment_threshold; /// Max distance from the epipolar line when doing local affine epipolar alignment int alignment_num_ransac_iterations; ///< How many ransac iterations to do in global or local epipolar alignment transform computation vw::Vector2 outlier_removal_params; vw::Vector2i matches_per_tile_params; int band; bool allow_different_mapproject_gsd; vw::Vector2 ortho_heights; std::string output_prefix_override; // override the output prefix with this std::string flann_method; // The method to use for FLANN matching bool accept_provided_mapproj_dem; bool stop_after_stats; // Stop after computing stereo stats bool stereo_dist_mode; // Distributed stereo mode // Correlation options float slogW; ///< Preprocessing filter width vw::uint16 pre_filter_mode; // 0 = None // 1 = Gaussian Blur // 2 = Log Filter vw::uint16 seed_mode; // 0 = None, use global search for each tile // 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) int min_num_ip; ///< Minimum number of IP's needed for search range estimation. float seed_percent_pad; ///< Pad amount towards the IP found float disparity_range_expansion_percent; ///< Expand the estimated disparity range by this percentage before computing the stereo correlation with local alignment vw::uint16 cost_mode; // 0 = absolute difference // 1 = squared difference // 2 = normalized cross correlation // 3 = census transform // 3 = ternary census transform float xcorr_threshold; // L-R vs R-L agreement threshold in pixels int min_xcorr_level; // Min level to perform xcorr check at, if specified. bool save_lr_disp_diff; // Save the L-R and R-L disparity difference vw::Vector2i corr_kernel; // Correlation kernel vw::BBox2 search_range; // Correlation search range vw::BBox2 corr_search_limit; // Correlation search range limit std::string ip_filter_using_dem; // Filter using given DEM and height difference vw::Vector2 elevation_limit; // Expected range of elevation to limit results to. vw::BBox2 lon_lat_limit; // Limit the triangulated interest points to this lonlat range int corr_max_levels; // Max pyramid levels to process. 0 hits only once. double max_disp_spread; // Max disparity spread bool compute_low_res_disparity_only; // Skip the full-resolution disparity computation bool skip_low_res_disparity_comp; std::string disparity_estimation_dem; // DEM to use in estimating the low-resolution disparity double disparity_estimation_dem_error; // Error (in meters) of the disparity estimation DEM int disparity_estimation_sample_rate; int corr_timeout; // Correlation timeout for a tile, in seconds int default_corr_timeout; // Will be used to adjust corr_timeout std::string stereo_algorithm; // See StereoSettings.cc for the possible values. int corr_blob_filter_area; // Use blob filtering in pyramidal correlation int corr_tile_size_ovr; // Override the default tile size used for processing. int sgm_collar_size; // Extra tile padding used for SGM calculation. vw::Vector2i sgm_search_buffer; // Search padding in SGM around previous pyramid level disparity value. size_t corr_memory_limit_mb; // Correlation memory limit, only important for SGM/MGM. bool correlator_mode; // Use the correlation logic only (including subpixel rfne). bool stereo_debug; // Write stereo debug images and messages bool local_alignment_debug; // Debug local alignment // Subpixel options bool subpix_from_blend; // Read from -B.tif instead of -D.tif vw::uint16 subpixel_mode; // 0 = none // 1 = parabola fitting // 2 = affine, bayes weighting // 3 = affine // 4 = Lucas-Kanade // 5 = affine, bayes EM weighting vw::Vector2i subpixel_kernel; // Subpixel correlation kernel bool disable_h_subpixel, disable_v_subpixel; vw::uint16 subpixel_max_levels; // Max pyramid levels to process. 0 hits only once. vw::uint16 phase_subpixel_accuracy; // Phase subpixel is accurate to 1/this pixels // Filtering options int filter_mode; // Which filter mode to use vw::Vector2i rm_half_kernel; // Low confidence pixel removal kernel size int max_mean_diff; // Max mean diff between pixel and neighbors int rm_min_matches; // Min # of pxl to be matched to keep pxl double rm_threshold; // rm_threshold < disp[n]-disp[m] reject pxl double rm_quantile_percentile; // For quantile based filtering, reject low-res correlation double rm_quantile_multiple; // values > multiple * quantile. int rm_cleanup_passes; // Number of times to perform cleanup // in the post-processing phase int erode_max_size; // Max island size in pixels that it'll remove bool enable_fill_holes; // If to enable hole-filling bool disable_fill_holes; // This obsolete parameter is ignored int fill_hole_max_size; // Maximum hole size in pixels that we'll attempt to fill int edge_buffer_size; // Size of region filtered out of image edges. int median_filter_size; // Filter subpixel results with median filter of this size int disp_smooth_size; // Adaptive disparity smoothing size double disp_smooth_texture; // Adaptive disparity smoothing max texture value bool gotcha_disparity_refinement; std::string casp_go_param_file; // Triangulation options std::string universe_center; // Center for the radius clipping float near_universe_radius; // Radius of the universe in meters float far_universe_radius; // Radius of the universe in meters std::string bundle_adjust_prefix; // Use the camera adjustments obtained by previously running bundle_adjust with the output prefix specified here. // Pull this many matches from the stereo disparity int num_matches_from_disparity, num_matches_from_disp_triplets; // Error propagation options bool propagate_errors; vw::Vector2 horizontal_stddev; double position_covariance_factor, orientation_covariance_factor; bool compute_error_vector; // Compute the triangulation error vector, not just its length double min_triangulation_angle; // min angle for valid triangulation double max_valid_triangulation_error; 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). double point_cloud_rounding_error; // How much to round the output point cloud values bool compute_point_cloud_center_only; // Only compute the center of triangulated point cloud and exit. bool skip_point_cloud_center_comp; bool unalign_disparity; // Compute disparity between unaligned images bool enable_atmospheric_refraction_correction; bool enable_velocity_aberration_correction; // stereo_gui options int grid_cols; vw::Vector2i window_size; // The size of the GUI window bool single_window; bool use_georef; bool hillshade; int lowest_resolution_subimage_num_pixels; double hillshade_azimuth, hillshade_elevation, gcp_sigma; bool view_matches, view_several_side_by_side, preview; std::string match_file, gcp_file, dem_file, csv_datum, csv_format_str, csv_srs, nvm, isis_cnet; bool delete_temporary_files_on_exit; bool create_image_pyramids_only, hide_all, nvm_no_shift; bool pairwise_matches, pairwise_clean_matches, no_georef, zoom_all_to_same_region; std::vector vwip_files; vw::BBox2 zoom_proj_win; double min, max; int plot_point_radius, font_size; // stereo_parse options std::string tile_at_loc; vw::Vector2i parallel_tile_size; vw::Vector2i stereo_dist_tile_params; // Options for parallel_stereo. These are not used, but accept // them quietly so that when stereo_gui or stereo_parse is invoked // with a parallel_stereo command it would not fail. std::string nodes_list, ssh, sparse_disp_options, parallel_options, prev_run_prefix; int threads_multi, threads_single, processes, entry_point, stop_point, job_size_h, job_size_w; // Undocumented options. We don't want these exposed to the user. vw::BBox2i trans_crop_win; // Left image crop window in respect to L.tif. bool attach_georeference_to_lowres_disparity; // Internal variable, to ensure we always initialize this class before using it bool initialized_stereo_settings; }; /// Return the singleton instance of the stereo setting structure. /// The stereo settings struct is created the first time this method /// is invoked. You must *always* access the stereo settings through this function. StereoSettings& stereo_settings(); } #endif //__ASP_CORE_STEREO_SETTINGS_H__ ================================================ FILE: src/asp/Core/StereoSettingsDesc.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoOptionsDesc.h /// Logic for stereo settings descriptions. This uses heavily boost program /// options. #ifndef __ASP_CORE_STEREO_OPTIONS_DESC_H__ #define __ASP_CORE_STEREO_OPTIONS_DESC_H__ #include #include namespace asp { // Program options for each executable/step struct PreProcessingDescription: public boost::program_options::options_description { PreProcessingDescription(); }; struct CorrelationDescription: public boost::program_options::options_description { CorrelationDescription(); }; struct SubpixelDescription: public boost::program_options::options_description { SubpixelDescription(); }; struct FilteringDescription: public boost::program_options::options_description { FilteringDescription(); }; struct TriangulationDescription: public boost::program_options::options_description { TriangulationDescription(); }; struct GUIDescription: public boost::program_options::options_description { GUIDescription(); }; struct ParseDescription: public boost::program_options::options_description { ParseDescription(); }; struct ParallelDescription: public boost::program_options::options_description { ParallelDescription(); }; struct UndocOptsDescription: public boost::program_options::options_description { UndocOptsDescription(); }; boost::program_options::options_description generate_config_file_options(vw::GdalWriteOptions& opt); // This handles options which are not in stereo_settings(), but // rather in 'opt'. So they are not config options set in // stereo.default but only command-line options. void addAspGlobalOptions(boost::program_options::options_description & description, ASPGlobalOptions & opt); } #endif//__ASP_CORE_STEREO_OPTIONS_DESC_H__ ================================================ FILE: src/asp/Core/StereoSettingsParse.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSettingsParse.cc /// #include #include #include #include #include #include namespace po = boost::program_options; namespace asp { /// Custom readers for Boost program options class asp_config_file_iterator: public boost::program_options::detail::common_config_file_iterator { boost::shared_ptr > is; private: bool getline(std::string& s); // Used to precondition string before reading public: asp_config_file_iterator() { found_eof(); } // Creates a config file parser for the specified stream. asp_config_file_iterator(std::basic_istream& is, const std::set& allowed_options, bool allow_unregistered = false); }; bool asp_config_file_iterator::getline(std::string& s) { std::string ws; if (!std::getline(*is, ws, '\n')) return false; // Remove any comments that might be one the line size_t n = ws.find('#'); if (n != std::string::npos) ws = ws.substr(0, n); // Wipe any whitespace on either end boost::trim(ws); // Handle empty lines. Just pass them on through. if (ws.empty()) { s = ws; return true; } // If there is not an equal sign, the first space is turned to // equal, or it is just appended. Also, use lowercase for the key. n = ws.find('='); if (n == std::string::npos) { n = ws.find(' '); if (n == std::string::npos) { ws += "="; boost::to_lower(ws); } else { ws[n] = '='; std::string lowered_key = boost::to_lower_copy(ws.substr(0,n)); ws.replace(0, n, lowered_key); } } else { std::string lowered_key = boost::to_lower_copy(ws.substr(0,n)); ws.replace(0, n, lowered_key); } s = ws; return true; } asp_config_file_iterator::asp_config_file_iterator( std::basic_istream& is, const std::set& allowed_options, bool allow_unregistered): po::detail::common_config_file_iterator(allowed_options, allow_unregistered) { this->is.reset(&is, po::detail::null_deleter()); get(); } // Parse the ASP stereo config file, such as stereo.default, from an open handle. po::basic_parsed_options parse_asp_config_file(std::basic_istream& is, const po::options_description& desc, bool allow_unregistered) { std::set allowed_options; auto & options = desc.options(); for (size_t i = 0; i < options.size(); ++i) { const po::option_description& d = *options[i]; if (d.long_name().empty()) boost::throw_exception(po::error("long name required for config file")); allowed_options.insert(d.long_name()); } // Parser return char strings po::parsed_options parsed(&desc); std::copy(asp_config_file_iterator(is, allowed_options, allow_unregistered), asp_config_file_iterator(), std::back_inserter(parsed.options)); // Convert char strings into desired type return po::basic_parsed_options(parsed); } // Parse the ASP stereo config file, such as stereo.default. po::basic_parsed_options parse_asp_config_file(bool print_warning, std::string const& filename, const po::options_description& desc, bool allow_unregistered) { std::basic_ifstream strm(filename.c_str()); if (print_warning) { if (!strm) vw::vw_out() << "Stereo file " << filename << " could not be found. " << "Will use default settings and command line options only.\n"; else vw::vw_out() << "Loading stereo file: " << filename << "\n"; } return parse_asp_config_file(strm, desc, allow_unregistered); } } // end namespace asp ================================================ FILE: src/asp/Core/StereoSettingsParse.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSettingsParse.h /// Logic for parsing stereo config files. #ifndef __ASP_CORE_STEREO_SETTINGS_PARSE_H__ #define __ASP_CORE_STEREO_SETTINGS_PARSE_H__ #include #include namespace asp { /// Custom parsers for ASP's stereo.default files boost::program_options::basic_parsed_options parse_asp_config_file(std::basic_istream&, const boost::program_options::options_description&, bool allow_unregistered = false); boost::program_options::basic_parsed_options parse_asp_config_file(bool print_warning, std::string const&, const boost::program_options::options_description&, bool allow_unregistered = false); } #endif//__ASP_CORE_STEREO_SETTINGS_PARSE_H__ ================================================ FILE: src/asp/Core/StereoTiling.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoTiling.cc /// #include #include #include #include #include #include #include namespace asp { // Append a tile to a given set of polygons void appendTileToPoly(int beg_x, int beg_y, int curr_tile_x, int curr_tile_y, bool is_map_projected, vw::cartography::GeoReference const& georef, vw::geometry::dPoly & poly, std::vector & tile_id_vec, size_t tile_id) { std::vector x = {double(beg_x), double(beg_x + curr_tile_x), double(beg_x + curr_tile_x), double(beg_x)}; std::vector y = {double(beg_y), double(beg_y), double(beg_y + curr_tile_y), double(beg_y + curr_tile_y)}; if (is_map_projected) { // If the images are mapprojected, overwrite x and y with projected coordinates std::vector proj_x, proj_y; for (size_t i = 0; i < x.size(); i++) { vw::Vector2 pix_pt(x[i], y[i]); vw::Vector2 proj_pt = georef.pixel_to_point(pix_pt); proj_x.push_back(proj_pt[0]); proj_y.push_back(proj_pt[1]); } x = proj_x; y = proj_y; } else { // Only flip in y, to have the shapefiles agree with the images for (size_t i = 0; i < x.size(); i++) y[i] = -y[i]; } // Follow the dPoly API bool isPolyClosed = true; std::string color = "green", layer = ""; poly.appendPolygon(x.size(), vw::geometry::vecPtr(x), vw::geometry::vecPtr(y), isPolyClosed, color, layer); // This will be needed for QGIS tile_id_vec.push_back(tile_id); } // Produce the list of tiles for parallel_stereo. If D_sub is available, write // only those tiles for which D_sub has valid values. Also save a shape file // with the tiles and the tile index for each tile, to be read in QGIS for // visualization. void produceTiles(bool is_map_projected, std::string const& output_prefix, vw::Vector2 const& trans_left_image_size, vw::Vector2i const& parallel_tile_size, int sgm_collar_size) { if (trans_left_image_size == vw::Vector2(0, 0)) vw::vw_throw(vw::ArgumentErr() << "Cannot produce tiles without a valid L.tif.\n"); // This georeference has at least the datum vw::cartography::GeoReference georef; // If is mapprojected, read the georef from L.tif, as that is what is used for tiling. // This should handle correctly --left-image-crop-win as well. if (is_map_projected) { std::string left_image_file = output_prefix + "-L.tif"; bool has_georef = vw::cartography::read_georeference(georef, left_image_file); if (!has_georef) vw::vw_throw(vw::ArgumentErr() << "L.tif has no georeference, cannot produce tiles.\n"); } // Will store here the tile structure for visualization. The API requires // a vector of dPoly. std::vector polyVec(1); vw::geometry::dPoly & poly = polyVec[0]; // alias std::vector tile_id_vec; std::string fieldId = "tile_id"; // Will be used on reading in stereo_gui as well // We check for valid D_sub only if seed_mode is not 0 and not part of a multiview // run, as that one is tricky to get right, given that each pair run has its own D_sub. bool have_D_sub = false; std::string d_sub_file = output_prefix + "-D_sub.tif"; vw::ImageView> sub_disp; vw::Vector2 up_scale(0, 0); bool is_multiview = stereo_settings().part_of_multiview_run; if (stereo_settings().seed_mode != 0 && !is_multiview) { have_D_sub = true; try { asp::load_D_sub_and_scale(output_prefix, d_sub_file, sub_disp, up_scale); } catch (...) { // Keep on going if we cannot load D_sub. In that case we cannot exclude // the tiles with no data. have_D_sub = false; } } int tile_x = parallel_tile_size[0]; int tile_y = parallel_tile_size[1]; int tiles_nx = int(std::ceil(double(trans_left_image_size[0]) / tile_x)); int tiles_ny = int(std::ceil(double(trans_left_image_size[1]) / tile_y)); // Open the file for writing std::string dirList = output_prefix + "-dirList.txt"; std::ofstream ofs(dirList.c_str()); // Go over all tiles size_t tile_id = 0; for (int iy = 0; iy < tiles_ny; iy++) { for (int ix = 0; ix < tiles_nx; ix++) { // Adjust for the tiles at the boundary int curr_tile_x = tile_x; int curr_tile_y = tile_y; if (ix == tiles_nx - 1) curr_tile_x = std::max(int(trans_left_image_size[0]) - ix * tile_x, 0); if (iy == tiles_ny - 1) curr_tile_y = std::max(int(trans_left_image_size[1]) - iy * tile_y, 0); int beg_x = ix * tile_x; int beg_y = iy * tile_y; bool has_valid_vals = true; if (have_D_sub) { has_valid_vals = false; int min_sub_x = std::floor((beg_x - sgm_collar_size) / up_scale[0]); int min_sub_y = std::floor((beg_y - sgm_collar_size) / up_scale[1]); int max_sub_x = std::ceil((beg_x + curr_tile_x + sgm_collar_size) / up_scale[0]); int max_sub_y = std::ceil((beg_y + curr_tile_y + sgm_collar_size) / up_scale[1]); min_sub_x = std::max(min_sub_x, 0); min_sub_y = std::max(min_sub_y, 0); max_sub_x = std::min(max_sub_x, sub_disp.cols() - 1); max_sub_y = std::min(max_sub_y, sub_disp.rows() - 1); for (int y = min_sub_y; y <= max_sub_y; y++) { for (int x = min_sub_x; x <= max_sub_x; x++) { if (is_valid(sub_disp(x, y))) { has_valid_vals = true; break; } } if (has_valid_vals) break; } } if (has_valid_vals) { // Save the tile ofs << output_prefix << "-" << beg_x << "_" << beg_y << "_" << curr_tile_x << "_" << curr_tile_y << "\n"; // Append the tile to the shape file structure appendTileToPoly(beg_x, beg_y, curr_tile_x, curr_tile_y, is_map_projected, georef, poly, tile_id_vec, tile_id); tile_id++; } } } ofs.close(); // Save the shape file and qml file. Will save a georef only if the images are // mapprojected. In that case the shapefile can be overlaid on top of L.tif. std::string shapeFile = output_prefix + "-tiles.shp"; vw::vw_out() << "Writing shape file: " << shapeFile << "\n"; vw::geometry::write_shapefile(shapeFile, is_map_projected, georef, polyVec, fieldId, tile_id_vec); std::string qmlFile = output_prefix + "-tiles.qml"; // must match shapefile name vw::vw_out() << "Writing qml file: " << qmlFile << "\n"; vw::geometry::writeQml(qmlFile, fieldId); } // Produce the list of tiles covering the overlap region of two mapprojected images, // for use with stereo_dist. Write as a text file. Write a shapefile for visualization. void produceDistTileList(std::string const& in_file1, std::string const& in_file2, std::string const& output_prefix, vw::Vector2i const& stereo_dist_tile_params) { int tile_size = stereo_dist_tile_params[0]; int tile_padding = stereo_dist_tile_params[1]; if (tile_size <= 0 || tile_padding <= 0) vw::vw_throw(vw::ArgumentErr() << "Tile size and padding must be positive.\n"); // Read georefs from both images vw::cartography::GeoReference georef1, georef2; bool has_georef1 = vw::cartography::read_georeference(georef1, in_file1); bool has_georef2 = vw::cartography::read_georeference(georef2, in_file2); if (!has_georef1) vw::vw_throw(vw::ArgumentErr() << "Missing georeference in: " << in_file1 << "\n"); if (!has_georef2) vw::vw_throw(vw::ArgumentErr() << "Missing georeference in: " << in_file2 << "\n"); // Form bounding boxes in pixel coordinates vw::Vector2 dims1 = vw::file_image_size(in_file1); vw::Vector2 dims2 = vw::file_image_size(in_file2); vw::BBox2i bbox1_pix(0, 0, dims1[0], dims1[1]); vw::BBox2i bbox2_pix(0, 0, dims2[0], dims2[1]); // Form projected bounding box for image1 in its own projected coordinates vw::BBox2 bbox1_proj = georef1.pixel_to_point_bbox(bbox1_pix); // Form bounding box for image2 in image1's projected coordinates // GeoTransform converts from source (georef2) to destination (georef1) vw::cartography::GeoTransform geo_trans(georef2, georef1); vw::BBox2 bbox2_in_proj1 = geo_trans.pixel_to_point_bbox(bbox2_pix); // Find intersection in projected coordinates vw::BBox2 intersection_proj = bbox1_proj; intersection_proj.crop(bbox2_in_proj1); if (intersection_proj.empty()) vw::vw_throw(vw::ArgumentErr() << "The two images do not overlap.\n"); // Further limit by --proj-win if set vw::BBox2 proj_win = asp::stereo_settings().proj_win; if (proj_win != vw::BBox2(0, 0, 0, 0)) { // Swap min and max if need be if (proj_win.min().y() > proj_win.max().y()) std::swap(proj_win.min().y(), proj_win.max().y()); if (proj_win.min().x() > proj_win.max().x()) std::swap(proj_win.min().x(), proj_win.max().x()); intersection_proj.crop(proj_win); if (intersection_proj.empty()) vw::vw_throw(vw::ArgumentErr() << "The --proj-win does not overlap the images.\n"); } // Convert intersection to image1's pixel coordinates vw::BBox2i intersection_pix = georef1.point_to_pixel_bbox(intersection_proj); intersection_pix.expand(1); // Crop to image1's pixel box, just in case intersection_pix.crop(bbox1_pix); // Calculate number of tiles int width = intersection_pix.width(); int height = intersection_pix.height(); int tiles_nx = (int)std::ceil((double)width / tile_size); int tiles_ny = (int)std::ceil((double)height / tile_size); // Open output file std::string tile_list_file = output_prefix + "-distTileList.txt"; std::ofstream ofs(tile_list_file.c_str()); if (!ofs.good()) vw::vw_throw(vw::ArgumentErr() << "Cannot open for writing: " << tile_list_file << "\n"); vw::vw_out() << "Writing tile list: " << tile_list_file << "\n"; vw::vw_out() << "Intersection region: " << intersection_pix << "\n"; vw::vw_out() << "Tile size: " << tile_size << ", padding: " << tile_padding << "\n"; // Prepare shapefile structure std::vector polyVec(1); vw::geometry::dPoly& poly = polyVec[0]; std::vector tile_id_vec; std::string fieldId = "tile_id"; // Generate tiles covering the intersection region int num_tiles = 0; for (int iy = 0; iy < tiles_ny; iy++) { for (int ix = 0; ix < tiles_nx; ix++) { // Tile position and size (without padding) int tile_x = intersection_pix.min().x() + ix * tile_size; int tile_y = intersection_pix.min().y() + iy * tile_size; int tile_w = std::min(tile_size, intersection_pix.max().x() - tile_x); int tile_h = std::min(tile_size, intersection_pix.max().y() - tile_y); // Write: tile_x tile_y tile_w tile_h tile_padding ofs << tile_x << " " << tile_y << " " << tile_w << " " << tile_h << " " << tile_padding << "\n"; // Convert tile corners to projected coordinates for shapefile std::vector px(4), py(4); vw::Vector2 pt; pt = georef1.pixel_to_point(vw::Vector2(tile_x, tile_y)); px[0] = pt[0]; py[0] = pt[1]; pt = georef1.pixel_to_point(vw::Vector2(tile_x + tile_w, tile_y)); px[1] = pt[0]; py[1] = pt[1]; pt = georef1.pixel_to_point(vw::Vector2(tile_x + tile_w, tile_y + tile_h)); px[2] = pt[0]; py[2] = pt[1]; pt = georef1.pixel_to_point(vw::Vector2(tile_x, tile_y + tile_h)); px[3] = pt[0]; py[3] = pt[1]; // Append polygon bool isPolyClosed = true; std::string color = "green", layer = ""; poly.appendPolygon(px.size(), vw::geometry::vecPtr(px), vw::geometry::vecPtr(py), isPolyClosed, color, layer); tile_id_vec.push_back(num_tiles); num_tiles++; } } ofs.close(); vw::vw_out() << "Wrote " << num_tiles << " tiles.\n"; // Write shapefile and qml file (for QGIS) std::string shapeFile = output_prefix + "-distTileList.shp"; vw::vw_out() << "Writing shape file: " << shapeFile << "\n"; bool is_map_projected = true; // These are mapprojected images vw::geometry::write_shapefile(shapeFile, is_map_projected, georef1, polyVec, fieldId, tile_id_vec); std::string qmlFile = output_prefix + "-distTileList.qml"; vw::vw_out() << "Writing qml file: " << qmlFile << "\n"; vw::geometry::writeQml(qmlFile, fieldId); } // Handle the crop windows for distributed stereo mode. Here the left crop // window is expanded by the collar size and the right crop window is // auto-computed. void handleDistCropWins(std::string const& left_image, std::string const& right_image, int collar_size, // Outputs vw::BBox2 & left_crop_win, vw::BBox2 & right_crop_win) { // Sanity checks if (left_crop_win.width() <= 0 || left_crop_win.height() <= 0) vw::vw_throw(vw::ArgumentErr() << "In distributed stereo mode the left crop window " << "must have positive width and height.\n"); if (collar_size <= 0) vw::vw_throw(vw::ArgumentErr() << "In distributed stereo mode --sgm-collar-size " << "must be positive.\n"); if (right_crop_win != vw::BBox2(0, 0, 0, 0)) vw::vw_throw(vw::ArgumentErr() << "In distributed stereo mode the right crop window " << "must not be set, as it will be auto-computed.\n"); // Read georefs from both images vw::cartography::GeoReference left_georef, right_georef; bool has_left_georef = vw::cartography::read_georeference(left_georef, left_image); bool has_right_georef = vw::cartography::read_georeference(right_georef, right_image); if (!has_left_georef) vw::vw_throw(vw::ArgumentErr() << "Missing georeference in: " << left_image << "\n"); if (!has_right_georef) vw::vw_throw(vw::ArgumentErr() << "Missing georeference in: " << right_image << "\n"); // Get left image bbox vw::Vector2 left_dims = vw::file_image_size(left_image); vw::BBox2 left_bbox(0, 0, left_dims[0], left_dims[1]); // Expand left crop win by collar size left_crop_win.expand(collar_size); // Crop to left image bbox left_crop_win.crop(left_bbox); // Use geo transform to convert left crop win (pixels) to right image pixels // GeoTransform::forward_bbox converts pixel bbox from source to destination vw::cartography::GeoTransform geo_trans(left_georef, right_georef); right_crop_win = geo_trans.forward_bbox(left_crop_win); // Crop to right image bbox vw::Vector2 right_dims = vw::file_image_size(right_image); vw::BBox2 right_bbox(0, 0, right_dims[0], right_dims[1]); right_crop_win.crop(right_bbox); } } // end namespace asp ================================================ FILE: src/asp/Core/StereoTiling.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoTiling.h /// #ifndef __ASP_CORE_STEREO_TILING_H__ #define __ASP_CORE_STEREO_TILING_H__ #include #include #include namespace asp { // Produce the list of tiles for parallel_stereo. If D_sub is available, write // only those tiles for which D_sub has valid values. Also save a shape file // with the tiles and the tile index for each tile, to be read in QGIS for // visualization. void produceTiles(bool is_map_projected, std::string const& output_prefix, vw::Vector2 const& trans_left_image_size, vw::Vector2i const& parallel_tile_size, int sgm_collar_size); // Produce the list of tiles covering the overlap region of two mapprojected images, // for use with stereo_dist. Write as a text file and a shapefile for visualization. void produceDistTileList(std::string const& in_file1, std::string const& in_file2, std::string const& output_prefix, vw::Vector2i const& stereo_dist_tile_params); // Handle the crop windows for distributed stereo mode. Here the left crop // window is expanded by the collar size and the right crop window is // auto-computed. void handleDistCropWins(std::string const& left_image, std::string const& right_image, int collar_size, // Outputs vw::BBox2 & left_crop_win, vw::BBox2 & right_crop_win); } // end namespace asp #endif // __ASP_CORE_STEREO_TILING_H__ ================================================ FILE: src/asp/Core/ThreadedEdgeMask.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #ifndef __ASP_CORE_THREADEDEDGEMASK_H__ #define __ASP_CORE_THREADEDEDGEMASK_H__ namespace asp { /// Quick way to check which pixels are inside the valid input mask?? template class ThreadedEdgeMaskView: public vw::ImageViewBase> { ViewT m_view; typedef boost::shared_array SharedArray; SharedArray m_left, m_right, m_top, m_bottom; // Determines if a single pixel is valid. inline bool valid(vw::int32 i, vw::int32 j) const { if (i > m_left[j] && i < m_right[j] && j > m_top[i] && j < m_bottom[i]) return true; else return false; } // Task that checks individual blocks for edges class EdgeMaskTask: public vw::Task, private boost::noncopyable { ViewT m_view; typename ViewT::pixel_type m_mask_value; vw::BBox2i m_bbox; // Region of image we're working in typedef std::vector Array; typedef boost::shared_array SharedArray; SharedArray g_left, g_right, g_top, g_bottom; Array m_left, m_right, m_top, m_bottom; // This how much we increment after we test a pixel. Set to 1 if // every pixel is to be tested. const vw::int32 STEP_SIZE; public: EdgeMaskTask(ViewT const& view, typename ViewT::pixel_type mask_value, vw::int32 search_step, vw::BBox2i bbox, SharedArray left, SharedArray right, SharedArray top, SharedArray bottom): m_view(view), m_mask_value(mask_value), m_bbox(bbox), g_left(left), g_right(right), g_top(top), g_bottom(bottom), m_left(m_bbox.height()), m_right(m_bbox.height()), m_top(m_bbox.width()), m_bottom(m_bbox.width()), STEP_SIZE(search_step) { std::fill(m_left.begin (), m_left.end (), -1); std::fill(m_right.begin (), m_right.end (), -1); std::fill(m_top.begin (), m_top.end (), -1); std::fill(m_bottom.begin(), m_bottom.end(), -1); } void operator()() { // Rasterizing local tile vw::ImageView copy(crop(m_view, m_bbox)); { // Detecting Edges // Search left and right side for (int j = 0; j < copy.rows(); ++j) { // Loop up through the rows in the local tile int i = 0; while (i < copy.cols() && copy(i,j) == m_mask_value) // Move from left to right in row by STEP_SIZE i += STEP_SIZE; // until we hit an invalid pixel if (i > 0) i -= STEP_SIZE; // Walk back one step if we are not at col 0 while (i < copy.cols() && copy(i,j) == m_mask_value) // Now do the same thing but in steps of 1 ++i; if (i > 0) --i; // Early exit condition if entire row was nodata if (i == copy.cols() -1) continue; // We're keeping left and right as -1 m_left[j] = i; // Now we have the left-most valid column in the row i = copy.cols() - 1; // Do the same thing going right to left while (i >= 0 && copy(i,j) == m_mask_value) i -= STEP_SIZE; if (i < copy.cols() - 1) i += STEP_SIZE; while (i >= 0 && copy(i,j) == m_mask_value) --i; if (i < copy.cols() - 1) ++i; m_right[j] = i; } // Now find the first valid rows from the bottom for (int i = 0; i < copy.cols(); ++i) { int j = 0; while (j < copy.rows() && copy(i,j) == m_mask_value) j += STEP_SIZE; if (j > 0) j -= STEP_SIZE; while (j < copy.rows() && copy(i,j) == m_mask_value) ++j; if (j > 0) --j; // Early exit condition if entire column was nodata if (j == copy.rows() - 1) continue; // We're keeping top and bottom as -1 m_top[i] = j; j = copy.rows()-1; // And the first valid rows from the top while (j >= 0 && copy(i,j) == m_mask_value) j -= STEP_SIZE; if (j < copy.rows()-1) j += STEP_SIZE; while (j >= 0 && copy(i,j) == m_mask_value) --j; if (j < copy.rows()-1) ++j; m_bottom[i] = j; } } { // Merging result back into global perspective int l = 0; for (int j = m_bbox.min()[1]; // Loop through rows j < m_bbox.max()[1]; j++) { if (m_left[l] == -1) { // Skip rows with no pixels l++; continue; } g_left[j] = std::min(m_left[l] + m_bbox.min()[0], // Add in the bounding box column g_left[j]); g_right[j] = std::max(m_right[l] + m_bbox.min()[0], g_right[j]); l++; } l = 0; for (int i = m_bbox.min()[0]; // Loop through columns i < m_bbox.max()[0]; i++) { if (m_top[l] == -1) { // Skip columns with no pixels l++; continue; } g_top[i] = std::min(m_top[l] + m_bbox.min()[1], // Add in the bounding box row g_top[i]); g_bottom[i] = std::max(m_bottom[l] + m_bbox.min()[1], g_bottom[i]); l++; } } } }; // Specialized deep copy constructor (private) template ThreadedEdgeMaskView(ViewT const& view, ThreadedEdgeMaskView const& other, vw::BBox2i const& box): m_view(view), m_left(new vw::int32[box.height()]), m_right(new vw::int32[box.height()]), m_top(new vw::int32[box.width()]), m_bottom(new vw::int32[box.width()]) { // Copy only sections that we need std::copy(other.m_left.get()+box.min()[1], other.m_left.get()+box.max()[1], m_left.get()); std::copy(other.m_right.get()+box.min()[1], other.m_right.get()+box.max()[1], m_right.get()); std::copy(other.m_top.get()+box.min()[0], other.m_top.get()+box.max()[0], m_top.get()); std::copy(other.m_bottom.get()+box.min()[0], other.m_bottom.get()+box.max()[0], m_bottom.get()); // Modify to new coordinate system std::for_each(m_left.get(), m_left.get()+box.height(), vw::ArgValInPlaceSumFunctor(-box.min()[0])); std::for_each(m_right.get(), m_right.get()+box.height(), vw::ArgValInPlaceSumFunctor(-box.min()[0])); std::for_each(m_top.get(), m_top.get()+box.width(), vw::ArgValInPlaceSumFunctor(-box.min()[1])); std::for_each(m_bottom.get(), m_bottom.get()+box.width(), vw::ArgValInPlaceSumFunctor(-box.min()[1])); } public: typedef typename ViewT::pixel_type orig_pixel_type; typedef typename boost::remove_cv::type>::type unmasked_pixel_type; typedef vw::PixelMask pixel_type; typedef vw::PixelMask result_type; typedef vw::ProceduralPixelAccessor pixel_accessor; ThreadedEdgeMaskView(ViewT const& view, unmasked_pixel_type const& mask_value, vw::int32 mask_buffer = 0, vw::int32 block_size = vw::vw_settings().default_tile_size()): m_view(view), m_left(new vw::int32[view.rows()]), m_right(new vw::int32[view.rows()]), m_top(new vw::int32[view.cols()]), m_bottom(new vw::int32[view.cols()]) { std::fill(m_left.get(), m_left.get ()+view.rows(), view.cols()); std::fill(m_right.get(), m_right.get ()+view.rows(), 0); std::fill(m_top.get(), m_top.get ()+view.cols(), view.rows()); std::fill(m_bottom.get(), m_bottom.get()+view.cols(), 0); // Calculating edges in parallel vw::FifoWorkQueue queue(vw::vw_settings().default_num_threads()); std::vector bboxes = subdivide_bbox(m_view, block_size, block_size); // Figure out an ideal search step size. Smaller means we're // more likely to catch small features. Bigger step size means // will move a lot faster. int search_step = vw::math::norm_2(vw::Vector2i(m_view.cols(),m_view.rows())) / 500; if (search_step < 1) search_step = 1; if (search_step > 10) search_step = 10; vw::vw_out(vw::DebugMessage, "threadededgemask") << "Setting search step to " << search_step << std::endl; // Find the outermost valid pixel coming in from each line/direction. BOOST_FOREACH(vw::BBox2i const& box, bboxes) { vw::vw_out(vw::DebugMessage, "threadededgemask") << "Created EdgeMaskTask for " << box << std::endl; boost::shared_ptr task(new EdgeMaskTask(m_view, mask_value, search_step, box, m_left, m_right, m_top, m_bottom)); queue.add_task(task); } queue.join_all(); // Wait for all tasks to complete // Erode the valid area by mask_buffer size on each side. std::for_each(m_left.get(), m_left.get()+view.rows(), vw::ArgValInPlaceSumFunctor(mask_buffer)); std::for_each(m_right.get(), m_right.get()+view.rows(), vw::ArgValInPlaceDifferenceFunctor(mask_buffer)); std::for_each(m_top.get(), m_top.get()+view.cols(), vw::ArgValInPlaceSumFunctor(mask_buffer)); std::for_each(m_bottom.get(), m_bottom.get()+view.cols(), vw::ArgValInPlaceDifferenceFunctor(mask_buffer)); } inline vw::int32 cols () const { return m_view.cols (); } inline vw::int32 rows () const { return m_view.rows (); } inline vw::int32 planes() const { return m_view.planes(); } inline pixel_accessor origin() const { return pixel_accessor(*this); } inline result_type operator()(vw::int32 i, vw::int32 j, vw::int32 p=0) const { if (this->valid(i,j)) return pixel_type(m_view(i,j,p)); else return pixel_type(); } vw::BBox2i active_area() const { return vw::BBox2i(vw::Vector2i(*std::min_element(&m_left [0], &m_left [rows()])+1, *std::min_element(&m_top [0], &m_top [cols()])+1), vw::Vector2i(*std::max_element(&m_right [0], &m_right [rows()]), *std::max_element(&m_bottom[0], &m_bottom[cols()]))); } typedef vw::CropView>> prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const { // We are deep copying a small section of ThreadedEdgeMaskView // and then uncropping back to original coordinates. typedef ThreadedEdgeMaskView> inner_type; return vw::crop(inner_type(vw::crop(m_view.prerasterize(bbox),bbox), *this, bbox), -bbox.min()[0], -bbox.min()[1], this->cols(), this->rows()); } template inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } // Friend other types of threaded edge mask template friend class ThreadedEdgeMaskView; }; template ThreadedEdgeMaskView threaded_edge_mask(vw::ImageViewBase const& v, typename ViewT::pixel_type value, vw::int32 mask_buffer = 0, vw::int32 block_size = vw::vw_settings().default_tile_size()) { return ThreadedEdgeMaskView(v.impl(), value, mask_buffer, block_size); } } namespace vw { template struct IsMultiplyAccessible>: public true_type {}; } #endif//__ASP_CORE_THREADEDEDGEMASK_H__ ================================================ FILE: src/asp/Core/tests/TestAspProgramOptions.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include using namespace vw; using namespace asp; TEST( Common, separate_images_from_cameras_rpb ) { std::vector inputs, images, cameras; bool ensure_equal_sizes = true; inputs.push_back("1220996672.27391028_sc00110_c1_PAN.tiff"); inputs.push_back("1220996702.11131644_sc00110_c1_PAN.tiff"); inputs.push_back("1220996672.27391028_sc00110_c1_PAN.RPB"); inputs.push_back("1220996702.11131644_sc00110_c1_PAN.RPB"); EXPECT_NO_THROW(separate_images_from_cameras(inputs, images, cameras, ensure_equal_sizes)); EXPECT_EQ(2, images.size ()); EXPECT_EQ(2, cameras.size()); } TEST( Common, StereoMultiCmdCheck ) { // Init a georef, the numbers are pretty arbitrary, it just must be valid cartography::GeoReference georef; georef.set_geographic(); georef.set_proj4_projection_str("+proj=longlat +a=3396190 +b=3396190 +no_defs "); georef.set_well_known_geogcs("D_MARS"); Matrix3x3 affine; affine(0,0) = 0.01; // 100 pix/degree affine(1,1) = -0.01; // 100 pix/degree affine(2,2) = 1; affine(0,2) = 30; // 30 deg east affine(1,2) = -35; // 35 deg south georef.set_transform(affine); // For the test below to pass, the files must be present. ImageView dem(100, 100); double nodata = -1000; bool has_nodata = true, has_georef = true; TerminalProgressCallback tpc("asp", ": "); vw::GdalWriteOptions opt; vw::cartography::block_write_gdal_image("img1.tif", dem, has_georef, georef, has_nodata, nodata, opt, tpc); vw::cartography::block_write_gdal_image("img2.tif", dem, has_georef, georef, has_nodata, nodata, opt, tpc); vw::cartography::block_write_gdal_image("img3.tif", dem, has_georef, georef, has_nodata, nodata, opt, tpc); vw::cartography::block_write_gdal_image("img4.tif", dem, has_georef, georef, has_nodata, nodata, opt, tpc); vw::cartography::block_write_gdal_image("img1.cub", dem, has_georef, georef, has_nodata, nodata, opt, tpc); vw::cartography::block_write_gdal_image("img2.cub", dem, has_georef, georef, has_nodata, nodata, opt, tpc); vw::cartography::block_write_gdal_image("dem.tif", dem, has_georef, georef, has_nodata, nodata, opt, tpc); std::ofstream ofs1("img1.xml"); ofs1 << "test" << std::endl; ofs1.close(); std::ofstream ofs2("img2.xml"); ofs2 << "test" << std::endl; ofs2.close(); std::vector files; files.push_back("img1.tif"); files.push_back("img2.tif"); files.push_back("img1.xml"); files.push_back("img2.xml"); files.push_back("run/run"); std::vector image_paths, camera_paths; std::string prefix, dem_path; parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path); EXPECT_EQ(2, image_paths.size ()); EXPECT_EQ(2, camera_paths.size()); EXPECT_EQ("img1.tif", image_paths [0]); EXPECT_EQ("img2.tif", image_paths [1]); EXPECT_EQ("img1.xml", camera_paths[0]); EXPECT_EQ("img2.xml", camera_paths[1]); EXPECT_EQ("run/run" , prefix ); EXPECT_EQ("", dem_path); // ---- files.clear(); files.push_back("img1.cub"); files.push_back("img2.cub"); files.push_back("run/run"); parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path); EXPECT_EQ(2, image_paths.size ()); EXPECT_EQ(0, camera_paths.size()); EXPECT_EQ("img1.cub", image_paths [0]); EXPECT_EQ("img2.cub", image_paths [1]); EXPECT_EQ("run/run" , prefix); EXPECT_EQ("", dem_path); // ---- files.clear(); files.push_back("img1.tif"); files.push_back("img2.tif"); files.push_back("img1.cub"); files.push_back("img2.cub"); files.push_back("run/run"); files.push_back("dem.tif"); parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path); EXPECT_EQ(2, image_paths.size ()); EXPECT_EQ(2, camera_paths.size()); EXPECT_EQ("img1.tif", image_paths [0]); EXPECT_EQ("img2.tif", image_paths [1]); EXPECT_EQ("img1.cub", camera_paths[0]); EXPECT_EQ("img2.cub", camera_paths[1]); EXPECT_EQ("run/run", prefix); EXPECT_EQ("dem.tif", dem_path); // ---- files.clear(); files.push_back("img1.tif"); files.push_back("img2.tif"); files.push_back("img3.tif"); files.push_back("img4.tif"); files.push_back("run/run"); files.push_back("dem.tif"); parseStereoFiles(files, image_paths, camera_paths, prefix, dem_path); EXPECT_EQ(4, image_paths.size()); EXPECT_EQ(0, camera_paths.size()); EXPECT_EQ("img1.tif", image_paths [0]); EXPECT_EQ("img2.tif", image_paths [1]); EXPECT_EQ("img3.tif", image_paths [2]); EXPECT_EQ("img4.tif", image_paths [3]); EXPECT_EQ("run/run" , prefix); EXPECT_EQ("dem.tif" , dem_path); } // End test StereoMultiCmdCheck ================================================ FILE: src/asp/Core/tests/TestIntegralAutoGainDetector.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::ip; TEST( IntegralAutoGainDetector, VerifyMaxima ) { ImageView test_image(101,101); const float SIGMA = 3; // Drawing a DoG signal Vector2i location, center(50,50); for ( ; location.y() < test_image.rows(); location.y()++ ) { for ( location.x() = 0; location.x() < test_image.cols(); location.x()++ ) { float distance = norm_2( Vector2f(location - center) ); test_image( location.x(), location.y() ) = 40 * ( 1/(2*M_PI*SIGMA*SIGMA)*exp(-pow(distance,2)/(2*SIGMA*SIGMA)) - 1/(2*M_PI*4*SIGMA*SIGMA)*exp(-pow(distance,2)/(2*4*SIGMA*SIGMA)) ) + 0.5; } } // Detect interest points IntegralAutoGainDetector detector; ip::InterestPointList list = detector.process_image( test_image ); // On 32-bit Linux the answer is different #if __GNUC__ #if __x86_64__ || __ppc64__ EXPECT_EQ( list.size(), 9 ); // Digitization error #else EXPECT_EQ( list.size(), 13 ); // Digitization error #endif #endif // Find the best IP const ip::InterestPoint* best_ip = &list.front(); float best_ip_value = list.begin()->interest; BOOST_FOREACH( ip::InterestPoint const& ip, list ) { if ( ip.interest > best_ip_value ) { best_ip_value = ip.interest; best_ip = &ip; } } // The best IP is the one centered on the circle feature we // drew. There are more due to digitization errors and float point // errors in the the integral image. EXPECT_EQ( best_ip->x, 50 ); EXPECT_EQ( best_ip->y, 50 ); EXPECT_EQ( best_ip->scale, 1.875 ); // This is odd ... but I'm just verifying the impl calls the same // code. This was a bug that elluded me for a very long time. ASSERT_EQ( typeid(detector), typeid(detector.impl()) ); } ================================================ FILE: src/asp/Core/tests/TestInterestPointMatching.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include using namespace vw; using namespace asp; TEST( InterestPointMatching, DatumIntersection ) { // Make a synthetic camera (Parameters selected to mimic a DG like camera) camera::PinholeModel model( Vector3(-414653.934175,-2305310.05912,-6759174.5439), Quat(-0.0794638597818,-0.0396316037899,-0.40945443655,-0.907998840691).rotation_matrix(), 1.65e6, 1.65e6, 17500, 17500, Vector3(1,0,0), Vector3(0,1,0), Vector3(0,0,1)); // Project back a forth against a flattened sphere cartography::Datum datum("WGS84"); for ( size_t i = 0; i < 35000; i+= 2000 ) { for ( size_t j = 0; j < 35000; j+= 2000 ) { Vector2 meas( i, j ); Vector3 pos = cartography::datum_intersection( datum, &model, meas ); Vector3 geo = datum.cartesian_to_geodetic( pos ); // Verify that the geodetic height is zero (we are on the sphere). EXPECT_NEAR( 0, geo.z(), 1e-3 ); Vector2 ret = model.point_to_pixel( pos ); EXPECT_VECTOR_NEAR( meas, ret, 1e-3 ); } } // Project back and forth against a true sphere datum.set_semi_minor_axis( datum.semi_major_axis() ); for ( size_t i = 0; i < 35000; i+= 2000 ) { for ( size_t j = 0; j < 35000; j+= 2000 ) { Vector2 meas( i, j ); Vector3 pos = cartography::datum_intersection( datum, &model, meas ); Vector3 geo = datum.cartesian_to_geodetic( pos ); // Verify that the geodetic height is zero (we are on the sphere). EXPECT_NEAR( 0, geo.z(), 1e-3 ); Vector2 ret = model.point_to_pixel( pos ); EXPECT_VECTOR_NEAR( meas, ret, 1e-3 ); } } } ================================================ FILE: src/asp/Core/tests/TestPointUtils.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include using namespace vw; using namespace asp; TEST( PointUtils, CsvConv ) { // Needed for the Lola tests below. vw::cartography::GeoReference geo; geo.set_well_known_geogcs("D_MOON"); // Check format parsing CsvConv conv; conv.parse_csv_format("2:file 5:lon 6:lat 7:height_above_datum", ""); EXPECT_TRUE(conv.is_configured()); // Check line reading bool is_first_line = false; bool success = false; std::string line = "1, name.jpg, 3, 4, 5, 6, 7, 8, 9"; CsvConv::CsvRecord vals = conv.parse_csv_line(is_first_line, success, line); EXPECT_EQ("name.jpg", conv.file_from_csv(vals)); Vector3 point = conv.csv_to_geodetic(vals, geo); EXPECT_EQ(5, vals.point_data[0]); EXPECT_EQ(6, vals.point_data[1]); EXPECT_EQ(7, vals.point_data[2]); // Check format parsing conv.parse_csv_format("1:file 8:y 4:x 2:z", ""); EXPECT_TRUE(conv.is_configured()); // Check line reading line = "name.tif, 2, 3, 4, 5, 6, 7, 8, 9"; vals = conv.parse_csv_line(is_first_line, success, line); EXPECT_EQ("name.tif", conv.file_from_csv(vals)); point = conv.csv_to_cartesian(vals, geo); EXPECT_EQ(4, point[0]); // x EXPECT_EQ(8, point[1]); // y EXPECT_EQ(2, point[2]); // z // Check the unsort function const double mean_lon = 45; // Should not affect test point = conv.cartesian_to_csv(point, geo, mean_lon); EXPECT_EQ(2, point[0]); // z EXPECT_EQ(4, point[1]); // x EXPECT_EQ(8, point[2]); // y // Check format parsing conv.parse_csv_format("1:file 12:lat 13:lon 14:height_above_datum", ""); EXPECT_TRUE(conv.is_configured()); // Check line reading 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"; vals = conv.parse_csv_line(is_first_line, success, line); EXPECT_EQ("2009_10_20_0778", conv.file_from_csv(vals)); point = conv.csv_to_geodetic(vals, geo); EXPECT_EQ(-98.31170774, point[0]); // lon EXPECT_EQ(-75.22419715, point[1]); // lat EXPECT_EQ(10263.249, point[2]); // height // Check format parsing conv.parse_csv_format("1:height_above_datum 3:lon 2:lat", ""); EXPECT_TRUE(conv.is_configured()); // Check line reading line = "658.4780 69.3737799999999964, 310.0611559999999827, "; // Formatting is pretty bad here! vals = conv.parse_csv_line(is_first_line, success, line); EXPECT_EQ("", conv.file_from_csv(vals)); point = conv.csv_to_geodetic(vals, geo); EXPECT_EQ(310.0611559999999827, point[0]); // lon EXPECT_EQ(69.3737799999999964, point[1]); // lat EXPECT_EQ(658.4780, point[2]); // height // Check format parsing conv.parse_csv_format("4:lat 2:lon 3:radius_km", ""); EXPECT_TRUE(conv.is_configured()); // There is some loss of precision in the radius to height conversion! const double delta = 0.0001; // Check line reading line = "2009-09-06T05:50:31.41569740 3.7773769 1735.898125 27.4985349 "; // Formatting is pretty bad here vals = conv.parse_csv_line(is_first_line, success, line); EXPECT_EQ("", conv.file_from_csv(vals)); point = conv.csv_to_geodetic(vals, geo); EXPECT_NEAR(3.77738, point[0], delta); // lon EXPECT_NEAR(27.4985, point[1], delta); // lat EXPECT_NEAR(-1501.8749, point[2], delta); // height // Check format parsing conv.parse_csv_format("3:lat 2:radius_m 4:lon", ""); EXPECT_TRUE(conv.is_configured()); // Check line reading line = "2009-09-06T05:50:31.41569740 1735898.125 27.4985349 3.7773769 "; // Formatting is pretty bad here! vals = conv.parse_csv_line(is_first_line, success, line); EXPECT_EQ("", conv.file_from_csv(vals)); point = conv.csv_to_geodetic(vals, geo); EXPECT_NEAR(3.77738, point[0], delta); // lon EXPECT_NEAR(27.4985, point[1], delta); // lat EXPECT_NEAR(-1501.8749, point[2], delta); // height } // Open up an ascii style PCD file and make sure we can read all of the values from it. TEST( PointUtils, PcdReader ) { asp::PcdReader reader("sample_ascii.pcd"); std::vector values; values.push_back(Vector3(17.799999, -181.40001, 584.96973)); values.push_back(Vector3(14.56, -145.12001, 467.97577)); values.push_back(Vector3(15.663157, -152.7579, 492.60608)); values.push_back(Vector3(17.882353, -170.72942, 550.55975)); values.push_back(Vector3(18.258823, -170.72942, 550.55975)); values.push_back(Vector3(18.635294, -170.72942, 550.55975)); values.push_back(Vector3(23.085714, -207.3143, 668.5368 )); values.push_back(Vector3(27.466667, -241.86668, 779.95966)); values.push_back(Vector3(18.97143, -206.85715, 668.5368 )); for (size_t i=0; i #include #include #include #include #include #include #include using namespace vw; using namespace asp; TEST( ThreadedEdgeMask, active_area ) { ImageView input(10,10); fill(input,0); fill(crop(input,2,2,3,3),255); EXPECT_EQ( BBox2i(2,2,3,3), threaded_edge_mask(input,0).active_area() ); EXPECT_EQ( BBox2i(3,3,1,1), threaded_edge_mask(input,0,1).active_area() ); ImageView output = threaded_edge_mask(input,0); EXPECT_EQ( input, output ); input.set_size(5,5); fill(input,0); fill(crop(input,1,1,3,3),255); EXPECT_EQ( BBox2i(1,1,3,3), threaded_edge_mask(input,0).active_area() ); EXPECT_EQ( BBox2i(2,2,1,1), threaded_edge_mask(input,0,1).active_area() ); output = threaded_edge_mask(input,0); EXPECT_EQ( input, output ); } ================================================ FILE: src/asp/Core/tests/sample_ascii.pcd ================================================ # .PCD v0.7 - Point Cloud Data file format VERSION 0.7 FIELDS x y z SIZE 4 4 4 TYPE F F F COUNT 1 1 1 WIDTH 3715044 HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS 3715044 DATA ascii 17.799999 -181.40001 584.96973 14.56 -145.12001 467.97577 15.663157 -152.7579 492.60608 17.882353 -170.72942 550.55975 18.258823 -170.72942 550.55975 18.635294 -170.72942 550.55975 23.085714 -207.3143 668.5368 27.466667 -241.86668 779.95966 18.97143 -206.85715 668.5368 ================================================ FILE: src/asp/GUI/AppData.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file AppData.cc // // Data structures for the GUI // #include #include #include #include namespace asp { // Empty constructor AppData::AppData(): use_georef(false), display_mode(asp::REGULAR_VIEW) {} // Set up the gui data AppData::AppData(vw::GdalWriteOptions const& opt_in, bool use_georef_in, std::vector> const& properties, std::vector const& image_files_in): opt(opt_in), use_georef(use_georef_in), image_files(image_files_in) { display_mode = asp::stereo_settings().hillshade?asp::HILLSHADED_VIEW:asp::REGULAR_VIEW; if (!stereo_settings().zoom_proj_win.empty()) use_georef = true; size_t num_images = image_files.size(); images.resize(num_images); std::vector propertyIndices; asp::lookupPropertyIndices(properties, image_files, propertyIndices); // Read the images. If there is a delay, we read only the georef, deferring // for later loading the image pixels. bool delay = asp::stereo_settings().preview; bool has_georef = true; for (size_t i = 0; i < num_images; i++) { images[i].read(image_files[i], opt, asp::REGULAR_VIEW, properties[propertyIndices[i]], delay); // Above we read the image in regular mode. If plan to display hillshade, // for now set the flag for that, and the hillshaded image will be created // and set later. (Something more straightforward could be done.) images[i].m_display_mode = display_mode; has_georef = has_georef && images[i].has_georef; } // Use georef if all images have it. This may be turned off later if it is desired // to show matches. if (has_georef) use_georef = true; // It is tricky to set up a layout for georeferenced images if they are loaded // one or a few at a time. if (delay) use_georef = false; // If the user explicitly asked to not use georef, do not use it on startup if (asp::stereo_settings().no_georef) { use_georef = false; // Further control of georef is from the gui menu asp::stereo_settings().no_georef = false; } // Create the coordinate transforms world2image.resize(num_images); image2world.resize(num_images); if (use_georef) { for (int i = 0; i < num_images; i++) { world2image[i] = vw::cartography::GeoTransform(images[BASE_IMAGE_ID].georef, images[i].georef); image2world[i] = vw::cartography::GeoTransform(images[i].georef, images[BASE_IMAGE_ID].georef); } } } // If we use georef, the world is in projected point units of the // first image, with y replaced with -y, to keep the y axis downward, // for consistency with how images are plotted. Convert a world box // to a pixel box for the given image. vw::Vector2 AppData::world2image_trans(vw::Vector2 const& P, int imageIndex) const{ bool poly_or_xyz = images[imageIndex].isPolyOrCsv(); if (poly_or_xyz) { // Poly or points. There is no pixel concept in that case. if (!use_georef) return flip_in_y(P); return world2image[imageIndex].point_to_point(flip_in_y(P)); } // Image if (!use_georef) return P; return world2image[imageIndex].point_to_pixel(flip_in_y(P)); } vw::BBox2 AppData::world2image_trans(vw::BBox2 const& R, int imageIndex) const { bool poly_or_xyz = images[imageIndex].isPolyOrCsv(); if (R.empty()) return R; if (images.empty()) return R; if (poly_or_xyz) { // Poly or points. There is no pixel concept in that case. if (!use_georef) return flip_in_y(R); return world2image[imageIndex].point_to_point_bbox(flip_in_y(R)); } // Image if (!use_georef) return R; return world2image[imageIndex].point_to_pixel_bbox(flip_in_y(R)); } // The reverse of world2image_trans() vw::Vector2 AppData::image2world_trans(vw::Vector2 const& P, int imageIndex) const { bool poly_or_xyz = images[imageIndex].isPolyOrCsv(); if (poly_or_xyz) { if (!use_georef) return flip_in_y(P); return flip_in_y(image2world[imageIndex].point_to_point(P)); } if (!use_georef) return P; return flip_in_y(image2world[imageIndex].pixel_to_point(P)); } // The reverse of world2image_trans() vw::BBox2 AppData::image2world_trans(vw::BBox2 const& R, int imageIndex) const { if (R.empty()) return R; if (images.empty()) return R; bool poly_or_xyz = images[imageIndex].isPolyOrCsv(); // Consider the case when the current layer is a polygon. // TODO(oalexan1): What if a layer has both an image and a polygon? if (poly_or_xyz) { if (!use_georef) return flip_in_y(R); return flip_in_y(image2world[imageIndex].point_to_point_bbox(R)); } if (!use_georef) return R; return flip_in_y(image2world[imageIndex].pixel_to_point_bbox(R)); } // Convert from world coordinates to projected coordinates in given geospatial // projection vw::Vector2 AppData::world2proj(vw::Vector2 P, int imageIndex) const { if (!use_georef) return flip_in_y(P); return world2image[imageIndex].point_to_point(flip_in_y(P)); } // The reverse of world2proj vw::Vector2 AppData::proj2world(vw::Vector2 P, int imageIndex) const { if (!use_georef) return flip_in_y(P); return flip_in_y(image2world[imageIndex].point_to_point(P)); } } // namespace asp ================================================ FILE: src/asp/GUI/AppData.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file AppData.h // // Data structures for the GUI // #ifndef __ASP_GUI_APP_DATA_H__ #define __ASP_GUI_APP_DATA_H__ // Standard library includes #include #include // Vision Workbench includes #include // For vw::cartography::GeoTransform // ASP includes #include namespace asp { // User requested namespace 'asp' // See MainWidget.h for what this id does const int BASE_IMAGE_ID = 0; struct AppData { AppData(); AppData(vw::GdalWriteOptions const& opt, bool use_georef, std::vector> const& properties, std::vectorconst& image_files); // Convert pixels for current image into world coordinates, and vice versa vw::Vector2 world2image_trans(vw::Vector2 const& P, int imageIndex) const; vw::Vector2 image2world_trans(vw::Vector2 const& P, int imageIndex) const; vw::BBox2 world2image_trans(vw::BBox2 const& R, int imageIndex) const; vw::BBox2 image2world_trans(vw::BBox2 const& R, int imageIndex) const; // Convert from world coordinates to projected coordinates in given geospatial // projection, and vice versa vw::Vector2 world2proj(vw::Vector2 const P, int imageIndex) const; vw::Vector2 proj2world(vw::Vector2 const P, int imageIndex) const; vw::GdalWriteOptions opt; bool use_georef; asp::DisplayMode display_mode; std::vector image_files; std::vector images; std::vector world2image; std::vector image2world; }; } // namespace asp #endif // __ASP_GUI_APP_DATA_H__ ================================================ FILE: src/asp/GUI/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspGUI "${ASP_GUI_SRC_FILES}" "${ASP_GUI_TEST_FILES}" "${ASP_GUI_LIB_DEPENDENCIES}") # Need this for QT to work. set_target_properties(AspGUI PROPERTIES AUTOMOC TRUE) ================================================ FILE: src/asp/GUI/ChooseFilesDlg.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include #include namespace asp { using namespace vw; // Allow the user to choose which files to hide/show in the GUI. // User's choice will be processed by MainWidget::showFilesChosenByUser(). ChooseFilesDlg::ChooseFilesDlg(QWidget * parent): QWidget(parent){ setWindowModality(Qt::ApplicationModal); int spacing = 0; QVBoxLayout * vBoxLayout = new QVBoxLayout(this); vBoxLayout->setSpacing(spacing); vBoxLayout->setAlignment(Qt::AlignLeft); // The layout having the file names. It will be filled in // dynamically later. m_filesTable = new QTableWidget(); //m_filesTable->horizontalHeader()->hide(); m_filesTable->verticalHeader()->hide(); vBoxLayout->addWidget(m_filesTable); return; } ChooseFilesDlg::~ChooseFilesDlg(){} void ChooseFilesDlg::chooseFiles(const std::vector & image_files) { // See the top of this file for documentation. int numFiles = image_files.size(); int numCols = 2; m_filesTable->setRowCount(numFiles); m_filesTable->setColumnCount(numCols); for (int fileIter = 0; fileIter < numFiles; fileIter++){ // Checkbox QTableWidgetItem *item = new QTableWidgetItem(1); item->data(Qt::CheckStateRole); if (!asp::stereo_settings().hide_all) item->setCheckState(Qt::Checked); else item->setCheckState(Qt::Unchecked); m_filesTable->setItem(fileIter, 0, item); // Set the filename in the table std::string fileName = image_files[fileIter]; item = new QTableWidgetItem(fileName.c_str()); item->setFlags(Qt::NoItemFlags); item->setForeground(QColor::fromRgb(0, 0, 0)); m_filesTable->setItem(fileIter, numCols - 1, item); // To be able to quickly look up an image image_to_row[fileName] = fileIter; } QStringList rowNamesList; for (int fileIter = 0; fileIter < numFiles; fileIter++) rowNamesList << ""; m_filesTable->setVerticalHeaderLabels(rowNamesList); QStringList colNamesList; for (int colIter = 0; colIter < numCols; colIter++) colNamesList << ""; m_filesTable->setHorizontalHeaderLabels(colNamesList); QTableWidgetItem * hs = m_filesTable->horizontalHeaderItem(0); hs->setBackground(QBrush(QColor("lightgray"))); m_filesTable->setSelectionMode(QTableWidget::ExtendedSelection); std::string style = std::string("QTableWidget::indicator:unchecked ") + "{background-color:white; border: 1px solid black;}; " + "selection-background-color: rgba(128, 128, 128, 40);"; m_filesTable->setSelectionMode(QTableWidget::NoSelection); m_filesTable->setStyleSheet(style.c_str()); // Horizontal header caption QTableWidgetItem *item = new QTableWidgetItem("Hide/show all"); item->setFlags(Qt::NoItemFlags); item->setForeground(QColor::fromRgb(0, 0, 0)); m_filesTable->setHorizontalHeaderItem(1, item); m_filesTable->resizeColumnsToContents(); m_filesTable->resizeRowsToContents(); // The processing of user's choice happens in MainWidget::showFilesChosenByUser() return; } // Quickly find in what table row the current image is int ChooseFilesDlg::imageRow(std::string const& image) const { auto it = image_to_row.find(image); if (it == image_to_row.end()) { popUp("Cannot find image in table."); return 0; } return it->second; } // Check if the given image is hidden (not shown) based on the table checkbox bool ChooseFilesDlg::isHidden(std::string const& image) const { int row = imageRow(image); QTableWidgetItem *item = m_filesTable->item(row, 0); // TODO(oalexan1): Use below a function called image(int id). // There are more places like that. std::string curr_image = (m_filesTable->item(row, 1)->data(0)).toString().toStdString(); if (image == curr_image) return (item->checkState() == Qt::Unchecked); return false; } // Hide the given image void ChooseFilesDlg::hide(std::string const& image) { int image_id = imageRow(image); ChooseFilesDlg::hide(image_id); } void ChooseFilesDlg::hide(int image_id) { QTableWidgetItem *item = m_filesTable->item(image_id, 0); item->setCheckState(Qt::Unchecked); } // Show the given image by turning on the checkbox in the table void ChooseFilesDlg::unhide(std::string const& image) { int image_id = imageRow(image); ChooseFilesDlg::unhide(image_id); } void ChooseFilesDlg::unhide(int image_id) { QTableWidgetItem *item = m_filesTable->item(image_id, 0); item->setCheckState(Qt::Checked); } // Show this many of the first several input images void ChooseFilesDlg::setNumImagesToShow(int num) { int rows = m_filesTable->rowCount(); for (int row = 0; row < std::min(num, rows); row++) { QTableWidgetItem *item = m_filesTable->item(row, 0); item->setCheckState(Qt::Checked); } for (int row = num; row < rows; row++) { QTableWidgetItem *item = m_filesTable->item(row, 0); item->setCheckState(Qt::Unchecked); } } // Show all images void ChooseFilesDlg::showAllImages() { int rows = m_filesTable->rowCount(); for (int row = 0; row < rows; row++) { QTableWidgetItem *item = m_filesTable->item(row, 0); item->setCheckState(Qt::Checked); } } // Number of images being shown int ChooseFilesDlg::numShown() { int num = 0; int rows = m_filesTable->rowCount(); for (int row = 0; row < rows; row++) { QTableWidgetItem *item = m_filesTable->item(row, 0); num += (item->checkState() == Qt::Checked); } return num; } // If some images are shown, hide all. Else, show all. void ChooseFilesDlg::hideShowAll() { int rows = m_filesTable->rowCount(); // See if all files are hidden bool allOff = true; for (int rowIter = 0; rowIter < rows; rowIter++){ QTableWidgetItem *item = m_filesTable->item(rowIter, 0); if (item->checkState() == Qt::Checked){ allOff = false; } } // If all files are hidden, we will show all. Else hide all. for (int rowIter = 0; rowIter < rows; rowIter++){ QTableWidgetItem *item = m_filesTable->item(rowIter, 0); // TODO(oalexan1): Use below a function called image(int id). std::string fileName = (m_filesTable->item(rowIter, 1)->data(0)).toString().toStdString(); if (allOff) item->setCheckState(Qt::Checked); else item->setCheckState(Qt::Unchecked); } // Force the horizontal scrollbar in the table to go left, so one can see // the checkboxes. QScrollBar * hScrollBar = m_filesTable->horizontalScrollBar(); hScrollBar->triggerAction(QScrollBar::SliderToMinimum); } void ChooseFilesDlg::viewOtherImage(int delta) { if (delta != -1 && delta != 1) return; int rows = m_filesTable->rowCount(); if (rows == 0) return; // First see how many images have a checkbox now, so are being shown std::set shown; for (int rowIter = 0; rowIter < rows; rowIter++) { QTableWidgetItem *item = m_filesTable->item(rowIter, 0); if (item->checkState() == Qt::Checked) shown.insert(rowIter); } // If no images are being shown or more than one, show the first int shownRow = 0; if (shown.size() == 1) { // Else show the next or previous image. Note how we add 'rows' // before we find the remainder, as delta could be negative. shownRow = *shown.begin(); shownRow = (shownRow + delta + rows) % rows; } // Show the next/previous one, and hide the rest for (int rowIter = 0; rowIter < rows; rowIter++){ QTableWidgetItem *item = m_filesTable->item(rowIter, 0); if (rowIter == shownRow) item->setCheckState(Qt::Checked); else item->setCheckState(Qt::Unchecked); } // Print count and image file (count starts from 1) // TODO(oalexan1): Implement a function called image(int id) to avoid this // lengthy text. It can be used in other places too. std::string fileName = (m_filesTable->item(shownRow, 1)->data(0)).toString().toStdString(); vw_out() << "Image: " << shownRow + 1 << ' ' << fileName << "\n"; } void ChooseFilesDlg::keyPressEvent(QKeyEvent *event) { // std::cout << "Key was pressed " << event->key() << std::endl; } } // namespace asp ================================================ FILE: src/asp/GUI/ChooseFilesDlg.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file ChooseFilesDlg.h // // A dialog for user to choose which files to show. // #ifndef __STEREO_GUI_CHOOSE_FILES_DLG_H__ #define __STEREO_GUI_CHOOSE_FILES_DLG_H__ // Qt #include #include #include #include namespace asp { class imageData; // Class to create a file list on the left side of the window class ChooseFilesDlg: public QWidget{ Q_OBJECT public: ChooseFilesDlg(QWidget * parent); ~ChooseFilesDlg(); void chooseFiles(const std::vector & image_files); QTableWidget * getFilesTable(){ return m_filesTable; } static QString selectFilesTag(){ return ""; } // Check if the given image is hidden (not shown) based on the table checkbox bool isHidden(std::string const& image) const; // Hide the given image void hide(std::string const& image); void hide(int image_id); // Show the given image void unhide(std::string const& image); void unhide(int image_id); // Show this many of the first several input images void setNumImagesToShow(int num); // Show all images void showAllImages(); // Number of images being shown int numShown(); // If some images are shown, hide all. Else, show all. void hideShowAll(); void viewOtherImage(int delta); private: int imageRow(std::string const& image) const; QTableWidget * m_filesTable; void keyPressEvent(QKeyEvent *event); std::map image_to_row; }; } // namespace asp #endif // __STEREO_GUI_CHOOSE_FILES_DLG_H__ ================================================ FILE: src/asp/GUI/DiskImagePyramidMultiChannel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include #endif #include #include #include #include #include #include using namespace vw; namespace asp { vw::RunOnce temporary_files_once = VW_RUNONCE_INIT; boost::shared_ptr temporary_files_ptr; void init_temporary_files() { temporary_files_ptr = boost::shared_ptr(new TemporaryFiles()); } TemporaryFiles& temporary_files() { temporary_files_once.run(init_temporary_files); return *temporary_files_ptr; } // Form a QImage to show on screen from a single-channel double image. // Scale pixel values to [0, 255] and handle nodata. If colormap is not null, // apply it to produce colorized output instead of grayscale. void formQimageFloat(bool highlight_nodata, double nodata_val, float valid_min, float valid_max, vw::Vector2 const& approx_bounds, ImageView const& clip, vw::Colormap const* colormap, QImage & qimg) { double min_val = approx_bounds[0]; double max_val = approx_bounds[1]; bool has_valid_range = !std::isnan(valid_min) && !std::isnan(valid_max); qimg = QImage(clip.cols(), clip.rows(), QImage::Format_ARGB32_Premultiplied); #pragma omp parallel for for (int col = 0; col < clip.cols(); col++) { for (int row = 0; row < clip.rows(); row++) { double val = clip(col, row); bool is_nodata = (val == nodata_val) || std::isnan(val); if (!is_nodata && has_valid_range) is_nodata = (val < valid_min) || (val > valid_max); if (is_nodata) { if (!highlight_nodata) qimg.setPixel(col, row, QColor(0, 0, 0, 0).rgba()); else qimg.setPixel(col, row, qRgb(255, 0, 0)); continue; } double v = clip(col, row); double s = (std::max(v, min_val) - min_val) / (max_val - min_val); s = std::min(std::max(0.0, s), 1.0); if (colormap != nullptr) { vw::PixelRGB c = (*colormap)(s).child(); qimg.setPixel(col, row, QColor(c[0], c[1], c[2], 255).rgba()); } else { int gray = round(255.0 * s); qimg.setPixel(col, row, QColor(gray, gray, gray, 255).rgba()); } } } } // Form a QImage from a two-channel uint8 image (grayscale + mask). void formQimageGrayAlpha(ImageView> const& clip, QImage & qimg) { qimg = QImage(clip.cols(), clip.rows(), QImage::Format_ARGB32_Premultiplied); #pragma omp parallel for for (int col = 0; col < clip.cols(); col++) { for (int row = 0; row < clip.rows(); row++) { Vector v = clip(col, row); if (v[1] > 0 && v == v) // need the latter for NaN qimg.setPixel(col, row, QColor(v[0], v[0], v[0], 255).rgba()); else qimg.setPixel(col, row, QColor(0, 0, 0, 0).rgba()); } } } // Form a QImage from a 3 or 4 channel uint8 image (RGB or RGBA). template void formQimageRGB(ImageView const& clip, QImage & qimg) { qimg = QImage(clip.cols(), clip.rows(), QImage::Format_ARGB32_Premultiplied); #pragma omp parallel for for (int col = 0; col < clip.cols(); col++) { for (int row = 0; row < clip.rows(); row++) { PixelT v = clip(col, row); if (v != v) // NaN, set to transparent qimg.setPixel(col, row, QColor(0, 0, 0, 0).rgba()); else if (v.size() == 3) qimg.setPixel(col, row, QColor(v[0], v[1], v[2], 255).rgba()); else if (v.size() > 3) qimg.setPixel(col, row, QColor(v[0], v[1], v[2], 255*(v[3] > 0)).rgba()); else qimg.setPixel(col, row, QColor(v[0], v[0], v[0], 255).rgba()); } } } DiskImagePyramidMultiChannel:: DiskImagePyramidMultiChannel(std::string const& image_file, vw::GdalWriteOptions const& opt, int top_image_max_pix, int subsample): m_opt(opt), m_num_channels(0), m_rows(0), m_cols(0), m_type(UNINIT), m_valid_min(std::numeric_limits::quiet_NaN()), m_valid_max(std::numeric_limits::quiet_NaN()) { if (image_file == "") return; int & lowres_size = asp::stereo_settings().lowest_resolution_subimage_num_pixels; // alias if (lowres_size <= 0) // bug fix, longer term need to improve the workflow lowres_size = LOWRES_SIZE_DEFAULT; boost::shared_ptr image_rsrc = vw::DiskImageResourcePtr(image_file); ImageFormat image_fmt = image_rsrc->format(); // Redirect to the correctly typed function to perform the actual map projection. // - Must correspond to the type of the input image. // Instantiate the correct DiskImagePyramid then record information including // the list of temporary files it created. try { m_num_channels = get_num_channels(image_file); if (m_num_channels > 1 && image_fmt.channel_type != VW_CHANNEL_UINT8) { vw_out() << "File " << image_file << " has more than one band, and the " << "bands are not unsigned int. Reading only the first band in " << "double precision.\n"; } // For ISIS .cub files, get the valid pixel range so the pyramid // masks special pixels (LIS, LRS, HIS, HRS) during subsampling. float valid_min = std::numeric_limits::quiet_NaN(); float valid_max = std::numeric_limits::quiet_NaN(); #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 if (boost::filesystem::path(image_file).extension() == ".cub") { try { vw::DiskImageResourceIsis isis_rsrc(image_file); valid_min = isis_rsrc.valid_minimum(); valid_max = isis_rsrc.valid_maximum(); } catch (...) {} } #endif m_valid_min = valid_min; m_valid_max = valid_max; if (m_num_channels == 1 || image_fmt.channel_type != VW_CHANNEL_UINT8) { // Single channel image with float pixels. m_img_ch1_float = vw::mosaic::DiskImagePyramid(image_file, m_opt, lowres_size, 2, valid_min, valid_max); m_rows = m_img_ch1_float.rows(); m_cols = m_img_ch1_float.cols(); m_type = CH1_FLOAT; temporary_files().files.insert(m_img_ch1_float.get_temporary_files().begin(), m_img_ch1_float.get_temporary_files().end()); } else if (m_num_channels == 2) { // uint8 image with an alpha channel. m_img_ch2_uint8 = vw::mosaic::DiskImagePyramid> (image_file, m_opt, lowres_size); m_num_channels = 2; // we read only 1 channel m_rows = m_img_ch2_uint8.rows(); m_cols = m_img_ch2_uint8.cols(); m_type = CH2_UINT8; temporary_files().files.insert(m_img_ch2_uint8.get_temporary_files().begin(), m_img_ch2_uint8.get_temporary_files().end()); } else if (m_num_channels == 3) { // RGB image with three uint8 channels. m_img_ch3_uint8 = vw::mosaic::DiskImagePyramid> (image_file, m_opt, lowres_size); m_num_channels = 3; m_rows = m_img_ch3_uint8.rows(); m_cols = m_img_ch3_uint8.cols(); m_type = CH3_UINT8; temporary_files().files.insert(m_img_ch3_uint8.get_temporary_files().begin(), m_img_ch3_uint8.get_temporary_files().end()); } else if (m_num_channels == 4) { // RGB image with three uint8 channels and an alpha channel m_img_ch4_uint8 = vw::mosaic::DiskImagePyramid> (image_file, m_opt, lowres_size); m_num_channels = 4; m_rows = m_img_ch4_uint8.rows(); m_cols = m_img_ch4_uint8.cols(); m_type = CH4_UINT8; temporary_files().files.insert(m_img_ch4_uint8.get_temporary_files().begin(), m_img_ch4_uint8.get_temporary_files().end()); } else { vw_throw(ArgumentErr() << "Unsupported image with " << m_num_channels << " bands.\n"); } } catch (const Exception& e) { // Do not invoke popUp() here, since this function can be called without a GUI. vw_throw(ArgumentErr() << e.what()); return; } } double DiskImagePyramidMultiChannel::get_nodata_val() const { // Extract the clip, then convert it from VW format to QImage format. if (m_type == CH1_FLOAT) { return m_img_ch1_float.get_nodata_val(); } else if (m_type == CH2_UINT8) { return m_img_ch2_uint8.get_nodata_val(); } else if (m_type == CH3_UINT8) { return m_img_ch3_uint8.get_nodata_val(); } else if (m_type == CH4_UINT8) { return m_img_ch4_uint8.get_nodata_val(); } else { vw_throw(ArgumentErr() << "Unsupported image with " << m_num_channels << " bands\n"); } } void DiskImagePyramidMultiChannel::get_image_clip(double scale_in, vw::BBox2i region_in, bool highlight_nodata, vw::Colormap const* colormap, vw::Vector2 const& bounds_override, QImage & qimg, double & scale_out, vw::BBox2i & region_out) const { vw::Vector2 approx_bounds; // Extract the clip, then convert it from VW format to QImage format. if (m_type == CH1_FLOAT) { //Stopwatch sw0; //sw0.start(); if (bounds_override[0] < bounds_override[1]) { // Use the caller-provided bounds (joint min/max or user --min/--max) approx_bounds = bounds_override; } else if (asp::stereo_settings().min < asp::stereo_settings().max) { // If the min and max are set, not NaN, and first is less than the second approx_bounds = vw::Vector2(asp::stereo_settings().min, asp::stereo_settings().max); } else { // Normally these are auto-estimated rather well, except for images with // most data being very small, like in shadow. approx_bounds = m_img_ch1_float.approx_bounds(); } // Ensure the bounds are always distinct if (approx_bounds[0] >= approx_bounds[1] && approx_bounds[1] > -std::numeric_limits::max()) approx_bounds[0] = approx_bounds[1] - 1.0; //sw0.stop(); //vw_out() << "Render time sw0 (seconds): " << sw0.elapsed_seconds() << std::endl; ImageView clip; //Stopwatch sw1; //sw1.start(); m_img_ch1_float.get_image_clip(scale_in, region_in, clip, scale_out, region_out); //sw1.stop(); //vw_out() << "Render time sw1 (seconds): " << sw1.elapsed_seconds() << std::endl; //Stopwatch sw2; //sw2.start(); formQimageFloat(highlight_nodata, m_img_ch1_float.get_nodata_val(), m_valid_min, m_valid_max, approx_bounds, clip, colormap, qimg); //sw2.stop(); //vw_out() << "Render time sw2 (seconds): " << sw2.elapsed_seconds() << std::endl; } else if (m_type == CH2_UINT8) { ImageView> clip; //Stopwatch sw4; //sw4.start(); m_img_ch2_uint8.get_image_clip(scale_in, region_in, clip, scale_out, region_out); //sw4.stop(); //vw_out() << "Render time sw4 (seconds): " << sw4.elapsed_seconds() << std::endl; //Stopwatch sw5; //sw5.start(); formQimageGrayAlpha(clip, qimg); //sw5.stop(); //vw_out() << "Render time sw5 (seconds): " << sw5.elapsed_seconds() << std::endl; } else if (m_type == CH3_UINT8) { ImageView> clip; //Stopwatch sw6; //sw6.start(); m_img_ch3_uint8.get_image_clip(scale_in, region_in, clip, scale_out, region_out); //sw6.stop(); //vw_out() << "Render time sw6 (seconds): " << sw6.elapsed_seconds() << std::endl; //Stopwatch sw7; //sw7.start(); formQimageRGB(clip, qimg); //sw7.stop(); //vw_out() << "Render time sw7 (seconds): " << sw7.elapsed_seconds() << std::endl; } else if (m_type == CH4_UINT8) { //Stopwatch sw8; //sw8.start(); ImageView> clip; m_img_ch4_uint8.get_image_clip(scale_in, region_in, clip, scale_out, region_out); //sw8.stop(); //vw_out() << "Render time sw8 (seconds): " << sw8.elapsed_seconds() << std::endl; //Stopwatch sw9; //sw9.start(); formQimageRGB(clip, qimg); //sw9.stop(); //vw_out() << "Render time sw9 (seconds): " << sw9.elapsed_seconds() << std::endl; } else { vw_throw(ArgumentErr() << "Unsupported image with " << m_num_channels << " bands\n"); } } std::string DiskImagePyramidMultiChannel::get_value_as_str(int32 x, int32 y) const { // Below we cast from Vector to Vector, as the former // refuses to print well. std::ostringstream os; if (m_type == CH1_FLOAT) { os << m_img_ch1_float.bottom()(x, y, 0); } else if (m_type == CH2_UINT8) { os << Vector2(m_img_ch2_uint8.bottom()(x, y, 0)); } else if (m_type == CH3_UINT8) { os << Vector3(m_img_ch3_uint8.bottom()(x, y, 0)); } else if (m_type == CH4_UINT8) { os << Vector4(m_img_ch4_uint8.bottom()(x, y, 0)); } else { vw_throw(ArgumentErr() << "Unsupported image with " << m_num_channels << " bands\n"); } return os.str(); } double DiskImagePyramidMultiChannel::get_value_as_double(int32 x, int32 y) const { if (m_type == CH1_FLOAT) { return m_img_ch1_float.bottom()(x, y, 0); } else if (m_type == CH2_UINT8) { return m_img_ch2_uint8.bottom()(x, y, 0)[0]; } else { vw_throw(ArgumentErr() << "Unsupported image with " << m_num_channels << " bands\n"); } return 0; } } // namespace asp ================================================ FILE: src/asp/GUI/DiskImagePyramidMultiChannel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file DiskImagePyramidMultiChannel.h // // Functions for managing multi-channel images and converting // them to QImage. // #ifndef __STEREO_GUI_DISK_IMAGE_PYRAMID_MULTICHANNEL_H__ #define __STEREO_GUI_DISK_IMAGE_PYRAMID_MULTICHANNEL_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Must be before Qt headers #include #include #include #include #include #include namespace vw { class Colormap; } namespace asp { // The kinds of images we support enum ImgType {UNINIT, CH1_FLOAT, CH2_UINT8, CH3_UINT8, CH4_UINT8}; // A global structure to hold all the temporary files we have created struct TemporaryFiles { std::set files; }; // Access the global list of temporary files TemporaryFiles& temporary_files(); // An image class that supports 1 to 3 channels. We use // DiskImagePyramid to be able to use some of the // pre-defined member functions for an image class. This class // is not a perfect solution, but there seem to be no easy way // in ASP to handle images with variable numbers of channels. // TODO: Add the case when multi-channel images also have float or double pixels struct DiskImagePyramidMultiChannel { vw::GdalWriteOptions m_opt; vw::mosaic::DiskImagePyramid m_img_ch1_float; vw::mosaic::DiskImagePyramid> m_img_ch2_uint8; vw::mosaic::DiskImagePyramid> m_img_ch3_uint8; vw::mosaic::DiskImagePyramid> m_img_ch4_uint8; int m_num_channels; int m_rows, m_cols; ImgType m_type; // keeps track of which of the above images we use float m_valid_min; // ISIS valid pixel range (NaN if not applicable) float m_valid_max; // Constructor DiskImagePyramidMultiChannel(std::string const& image_file = "", vw::GdalWriteOptions const& opt = vw::GdalWriteOptions(), int top_image_max_pix = TOP_IMAGE_MAX_PIX, int subsample = PYRAMID_SUBSAMPLE); // This function will return a QImage to be shown on screen. // How we create it, depends on the type of image we want to display. void get_image_clip(double scale_in, vw::BBox2i region_in, bool highlight_nodata, vw::Colormap const* colormap, vw::Vector2 const& bounds_override, QImage & qimg, double & scale_out, vw::BBox2i & region_out) const; double get_nodata_val() const; vw::int32 cols () const { return m_cols; } vw::int32 rows () const { return m_rows; } vw::int32 planes() const { return m_num_channels; } // Return the element at this location (at the lowest level) cast to double. // - Only works for single channel pyramids! double get_value_as_double(vw::int32 x, vw::int32 y) const; // Return value as string std::string get_value_as_str(vw::int32 x, vw::int32 y) const; }; } // namespace asp #endif // __STEREO_GUI_DISK_IMAGE_PYRAMID_MULTICHANNEL_H__ ================================================ FILE: src/asp/GUI/EventWidget.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file EventWidget.cc // // Member functions of MainWidget that handle mouse, keyboard, // and other input events. #include #include #include #include #include #include #include #include #include using namespace vw; namespace asp { // All functions here are member functions of MainWidget, but are moved // to this file to reduce the size of MainWidget.cc. void MainWidget::mousePressEvent(QMouseEvent *event) { // For rubberband m_mousePrsX = event->pos().x(); m_mousePrsY = event->pos().y(); m_rubberBand = m_emptyRubberBand; m_curr_pixel_pos = QPoint2Vec(QPoint(m_mousePrsX, m_mousePrsY)); // Record where we clicked updateCurrentMousePosition(); // Need this for panning m_last_view = m_current_view; // Check if the user is holding down the crop window key. m_cropWinMode = ((event->buttons () & Qt::LeftButton) && (event->modifiers() & Qt::ControlModifier)); m_match_mgr.m_editMatchPointVecIndex = -1; // Keep this initialized // If the user is currently editing match points if (!m_polyEditMode && m_wid_menu_mgr->m_moveMatchPoint->isChecked() && !m_cropWinMode && asp::stereo_settings().view_matches) { m_match_mgr.m_editingMatches = true; Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY)); P = app_data.world2image_trans(P, m_base_image_id); // Find the match point we want to move double dist_limit = MATCH_POINT_DISTANCE_LIMIT; m_match_mgr.m_editMatchPointVecIndex = m_match_mgr.m_matchlist.findNearestMatchPoint(m_beg_image_id, P, dist_limit); if (asp::stereo_settings().view_matches) { // Update IP draw color // Will keep the zoom level emit updateMatchesSignal(); } else { // Will reset the layout before continuing with matches asp::stereo_settings().view_matches = true; emit toggleViewMatchesSignal(); } } // End match point update case // If the user is currently editing polygons if (m_polyEditMode && m_wid_menu_mgr->m_moveVertex->isChecked() && !m_cropWinMode) { Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY)); m_world_box.grow(P); // to not cut when plotting later // Find the vertex we want to move asp::PolySearchResult sr; asp::findClosestPolyVertex(P.x(), P.y(), app_data, m_beg_image_id, m_end_image_id, sr); m_editClipIndex = sr.clipIndex; m_editPolyVecIndex = sr.polyVecIndex; m_editIndexInCurrPoly = sr.polyIndexInCurrPoly; m_editVertIndexInCurrPoly = sr.vertIndexInCurrPoly; // This will redraw just the polygons, not the pixmap update(); // The action will continue in mouseMoveEvent() } // End polygon update case } // End function mousePressEvent() void MainWidget::mouseMoveEvent(QMouseEvent *event) { QPoint Q = event->pos(); int mouseMoveX = Q.x(), mouseMoveY = Q.y(); m_curr_pixel_pos = QPoint2Vec(Q); updateCurrentMousePosition(); if (!(event->buttons() & Qt::LeftButton)) return; // The mouse is pressed and moving m_cropWinMode = ((event->buttons () & Qt::LeftButton) && (event->modifiers() & Qt::ControlModifier)); if (handleMatchPointMove(mouseMoveX, mouseMoveY)) return; if (handlePolyVertexMove(mouseMoveX, mouseMoveY)) return; handleRubberBandDrag(mouseMoveX, mouseMoveY); } // End function mouseMoveEvent() // Handle match point dragging during mouse move bool MainWidget::handleMatchPointMove(int mouseMoveX, int mouseMoveY) { if (m_polyEditMode || !m_wid_menu_mgr->m_moveMatchPoint->isChecked() || m_cropWinMode) return false; m_match_mgr.m_editingMatches = true; // Error checking if ((m_beg_image_id < 0) || (m_match_mgr.m_editMatchPointVecIndex < 0) || (!m_match_mgr.m_matchlist.pointExists(m_beg_image_id, m_match_mgr.m_editMatchPointVecIndex))) return true; Vector2 P = screen2world(Vector2(mouseMoveX, mouseMoveY)); P = app_data.world2image_trans(P, m_base_image_id); // Update the IP location m_match_mgr.m_matchlist.setPointPosition(m_beg_image_id, m_match_mgr.m_editMatchPointVecIndex, P.x(), P.y()); if (asp::stereo_settings().view_matches) { // Update IP draw color // Will keep the zoom level emit updateMatchesSignal(); } else { // Will reset the layout before continuing with matches asp::stereo_settings().view_matches = true; emit toggleViewMatchesSignal(); } return true; } // Handle polygon vertex dragging during mouse move bool MainWidget::handlePolyVertexMove(int mouseMoveX, int mouseMoveY) { if (!m_polyEditMode || !m_wid_menu_mgr->m_moveVertex->isChecked() || m_cropWinMode) return false; // If moving vertices if (m_editClipIndex < 0 || m_editPolyVecIndex < 0 || m_editIndexInCurrPoly < 0 || m_editVertIndexInCurrPoly < 0) return true; Vector2 P = screen2world(Vector2(mouseMoveX, mouseMoveY)); m_world_box.grow(P); // to not cut when plotting later P = app_data.world2proj(P, m_editClipIndex); // projected units app_data.images[m_editClipIndex].polyVec[m_editPolyVecIndex] .changeVertexValue(m_editIndexInCurrPoly, m_editVertIndexInCurrPoly, P.x(), P.y()); // This will redraw just the polygons, not the pixmap update(); return true; } // Handle rubberband rectangle dragging during mouse move void MainWidget::handleRubberBandDrag(int mouseMoveX, int mouseMoveY) { // Standard Qt rubberband trick. This is highly confusing. The // explanation for what is going on is the following. We need to // wipe the old rubberband, and draw a new one. Hence just the // perimeters of these two rectangles need to be re-painted, // nothing else changes. The first updateRubberBand() call below // schedules that the perimeter of the current rubberband be // repainted, but the actual repainting, and this is the key, WILL // HAPPEN LATER! Then we change m_rubberBand to the new value, // then we schedule the repaint event on the new rubberband. // Continued below. updateRubberBand(m_rubberBand); m_rubberBand = QRect(std::min(m_mousePrsX, mouseMoveX), std::min(m_mousePrsY, mouseMoveY), std::abs(mouseMoveX - m_mousePrsX), std::abs(mouseMoveY - m_mousePrsY)); updateRubberBand(m_rubberBand); // Only now, a single call to MainWidget::PaintEvent() happens, // even though it appears from above that two calls could happen // since we requested two updates. This call updates the perimeter // of the old rubberband, in effect wiping it, since the region // occupied by the old rubberband is scheduled to be repainted, // but the rubberband itself is already changed. It also updates // the perimeter of the new rubberband, and as can be seen in // MainWidget::PaintEvent() the effect is to draw the rubberband. if (m_cropWinMode && !m_allowMultipleSelections) { // If there is on screen already a crop window, wipe it, as // we are now in the process of creating a new one. QRect R = bbox2qrect(world2screen(m_stereoCropWin)); updateRubberBand(R); m_stereoCropWin = BBox2(); R = bbox2qrect(world2screen(m_stereoCropWin)); updateRubberBand(R); } } // The action to take when a user releases the mouse close to where it was pressed void MainWidget::handlePixelClick(int mouseRelX, int mouseRelY) { // Threshold mode: early return if (m_threshold.calcMode) { handleThresholdClick(mouseRelX, mouseRelY); return; } Vector2 p = screen2world(Vector2(mouseRelX, mouseRelY)); if (!m_profile.mode && !m_polyEditMode) { QPainter paint; paint.begin(&m_pixmap); QPoint Q(mouseRelX, mouseRelY); paint.setPen(QColor("red")); paint.drawEllipse(Q, 2, 2); // Draw the point, and make it a little larger paint.end(); // Make sure to end the painting session } bool can_profile = m_profile.mode; // Print pixel coordinates and image value. for (int j = m_beg_image_id; j < m_end_image_id; j++) { int it = m_filesOrder[j]; // Don't show files the user wants hidden std::string fileName = app_data.images[it].name; if (m_chooseFiles && m_chooseFiles->isHidden(fileName)) continue; std::string val = "none"; Vector2 q = app_data.world2image_trans(p, it); int col = floor(q[0]), row = floor(q[1]); if (col >= 0 && row >= 0 && col < app_data.images[it].img().cols() && row < app_data.images[it].img().rows()) val = app_data.images[it].img().get_value_as_str(col, row); vw_out() << "Pixel and value: " << app_data.images[it].name << " (" << col << ", " << row << ") " << val << "\n"; update(); if (m_profile.mode) { // Sanity checks if (m_end_image_id - m_beg_image_id != 1) { popUp("A profile can be shown only when a single image is present."); can_profile = false; } int num_channels = app_data.images[it].img().planes(); if (num_channels != 1) { popUp("A profile can be shown only when the image has a single channel."); can_profile = false; } if (!can_profile) { MainWidget::setProfileMode(can_profile); return; } } // End if m_profile.mode } // end iterating over images if (can_profile) { // Save the current point the user clicked onto in the // world coordinate system. m_profile.x.push_back(p.x()); m_profile.y.push_back(p.y()); // PaintEvent() will be called, which will call // plotProfilePolyLine() to show the polygonal line. // Now show the profile. MainWidget::plotProfile(app_data.images, m_profile.x, m_profile.y); // TODO(oalexan1): Why is this buried in the short distance check? } else if (m_polyEditMode) { handlePolyEditClick(mouseRelX, mouseRelY); } } // Handle poly edit mode click: move or add vertex void MainWidget::handlePolyEditClick(int mouseRelX, int mouseRelY) { if (m_wid_menu_mgr->m_moveVertex->isChecked() && !m_cropWinMode) { // Move vertex if (m_editPolyVecIndex < 0 || m_editIndexInCurrPoly < 0 || m_editVertIndexInCurrPoly < 0) return; Vector2 P = screen2world(Vector2(mouseRelX, mouseRelY)); m_world_box.grow(P); // to not cut when plotting later P = app_data.world2proj(P, m_polyLayerIndex); // projected units app_data.images[m_polyLayerIndex].polyVec[m_editPolyVecIndex] .changeVertexValue(m_editIndexInCurrPoly, m_editVertIndexInCurrPoly, P.x(), P.y()); // These are no longer needed for the time being m_editPolyVecIndex = -1; m_editIndexInCurrPoly = -1; m_editVertIndexInCurrPoly = -1; // This will redraw just the polygons, not the pixmap update(); return; } // Add vertex addPolyVert(mouseRelX, mouseRelY); } // Handle threshold mode pixel click void MainWidget::handleThresholdClick(int mouseRelX, int mouseRelY) { // Image threshold mode. If we released the mouse where we // pressed it, that means we want the current pixel value // to be the threshold if larger than the existing threshold. if (m_end_image_id - m_beg_image_id != 1) { popUp("Must have just one image in each window to do " "image threshold detection."); m_threshold.calcMode = false; refreshPixmap(); return; } if (app_data.images[m_beg_image_id].img().planes() != 1) { popUp("Thresholding makes sense only for single-channel images."); m_threshold.calcMode = false; return; } if (app_data.use_georef) { popUp("Thresholding is not supported when using georeference " "information to show images."); m_threshold.calcMode = false; return; } Vector2 p = screen2world(Vector2(mouseRelX, mouseRelY)); Vector2 q = app_data.world2image_trans(p, m_beg_image_id); int col = round(q[0]), row = round(q[1]); vw_out() << "Clicked on pixel: " << col << ' ' << row << std::endl; if (col >= 0 && row >= 0 && col < app_data.images[m_beg_image_id].img().cols() && row < app_data.images[m_beg_image_id].img().rows()) { double val = app_data.images[m_beg_image_id].img().get_value_as_double( col, row); m_threshold.value = std::max(m_threshold.value, val); } vw_out() << "Image threshold for " << app_data.images[m_beg_image_id].name << ": " << m_threshold.value << std::endl; } // Handle crop win in mouse release event void MainWidget::handleCropWin() { // If now we allow multiple selected regions, but we did not allow at // the time the crop win was formed, save the crop win before it // will be overwritten. if (m_allowMultipleSelections && !m_stereoCropWin.empty()) { if (m_selectionRectangles.empty() || m_selectionRectangles.back() != m_stereoCropWin) { m_selectionRectangles.push_back(m_stereoCropWin); } } // User selects the region to use for stereo. Convert it to world // coordinates, and round to integer. If we use georeferences, // the crop win is in projected units for the first image, // so we must convert to pixels. m_stereoCropWin = screen2world(qrect2bbox(m_rubberBand)); if (m_allowMultipleSelections && !m_stereoCropWin.empty()) m_selectionRectangles.push_back(m_stereoCropWin); for (int j = m_beg_image_id; j < m_end_image_id; j++) { int image_it = m_filesOrder[j]; // Don't show files the user wants hidden std::string fileName = app_data.images[image_it].name; if (m_chooseFiles && m_chooseFiles->isHidden(fileName)) continue; BBox2 image_box = app_data.world2image_trans(m_stereoCropWin, image_it); vw_out() << std::setprecision(8) << "src win for " << app_data.images[image_it].name << ": " << round(image_box.min().x()) << ' ' << round(image_box.min().y()) << ' ' << round(image_box.width()) << ' ' << round(image_box.height()) << std::endl; if (app_data.images[image_it].has_georef) { Vector2 proj_min, proj_max; // Convert pixels to projected coordinates BBox2 point_box; if (app_data.images[image_it].isPolyOrCsv()) point_box = image_box; else point_box = app_data.images[image_it].georef.pixel_to_point_bbox(image_box); proj_min = point_box.min(); proj_max = point_box.max(); // Below we flip in y to make gdal happy vw_out() << std::setprecision(17) << "proj win for " << app_data.images[image_it].name << ": " << proj_min.x() << ' ' << proj_max.y() << ' ' << proj_max.x() << ' ' << proj_min.y() << std::endl; Vector2 lonlat_min, lonlat_max; BBox2 lonlat_box = app_data.images[image_it].georef.point_to_lonlat_bbox(point_box); lonlat_min = lonlat_box.min(); lonlat_max = lonlat_box.max(); // Again, miny and maxy are flipped on purpose vw_out() << std::setprecision(17) << "lonlat win for " << app_data.images[image_it].name << ": " << lonlat_min.x() << ' ' << lonlat_max.y() << ' ' << lonlat_max.x() << ' ' << lonlat_min.y() << std::endl; } } // Wipe the rubberband, no longer needed. updateRubberBand(m_rubberBand); m_rubberBand = m_emptyRubberBand; updateRubberBand(m_rubberBand); // Draw the crop window. This may not be precisely the rubberband // since there is some loss of precision in conversion from // Qrect to BBox2 and back. Note actually that we are not drawing // here, we are scheduling this area to be updated, the drawing // has to happen (with precisely this formula) in PaintEvent(). QRect R = bbox2qrect(world2screen(m_stereoCropWin)); updateRubberBand(R); return; } // Zoom in or out after the user releases the mouse, depending on // the rubberband direction void MainWidget::zoomInOut(int mouseRelX, int mouseRelY) { // Wipe the rubberband updateRubberBand(m_rubberBand); m_rubberBand = m_emptyRubberBand; updateRubberBand(m_rubberBand); m_can_emit_zoom_all_signal = true; if (mouseRelX > m_mousePrsX && mouseRelY > m_mousePrsY) { // Dragging the mouse from upper-left to lower-right zooms in // The window selected with the mouse in world coordinates Vector2 A = screen2world(Vector2(m_mousePrsX, m_mousePrsY)); Vector2 B = screen2world(Vector2(mouseRelX, mouseRelY)); BBox2 view = BBox2(A, B); // Zoom to this window. Don't zoom so much that the view box // ends up having size 0 to numerical precision. if (!view.empty()) { double ratio = double(m_window_width) / double(m_window_height); m_current_view = vw::geometry::expandBoxToRatio(view, ratio); } // Must redraw the entire image refreshPixmap(); } else if (mouseRelX < m_mousePrsX && mouseRelY < m_mousePrsY) { // Dragging the mouse in reverse zooms out double scale = 0.8; zoom(scale); } } // If a point was being moved, reset the ID and color. Points that are moved // are also set to valid. void MainWidget::adjustForEditMatchPoint() { m_match_mgr.m_matchlist.setPointValid(m_beg_image_id, m_match_mgr.m_editMatchPointVecIndex, true); m_match_mgr.m_editMatchPointVecIndex = -1; if (asp::stereo_settings().view_matches) { // Update IP draw color // Will keep the zoom level emit updateMatchesSignal(); } else { // Will reset the layout before continuing with matches asp::stereo_settings().view_matches = true; emit toggleViewMatchesSignal(); } } // Handle mouse release events void MainWidget::mouseReleaseEvent(QMouseEvent *event) { QPoint mouse_rel_pos = event->pos(); int mouseRelX = mouse_rel_pos.x(); int mouseRelY = mouse_rel_pos.y(); // Ctrl + left mouse button triggers crop window mode if ((event->buttons() & Qt::LeftButton) && (event->modifiers() & Qt::ControlModifier)) { m_cropWinMode = true; } if (app_data.images.empty()) return; // If a point was being moved, reset the ID and color. Points that are moved // are also set to valid. if (m_match_mgr.m_editMatchPointVecIndex >= 0) adjustForEditMatchPoint(); // If the mouse was released close to where it was pressed if (std::abs(m_mousePrsX - mouseRelX) < m_pixelTol && std::abs(m_mousePrsY - mouseRelY) < m_pixelTol) { handlePixelClick(mouseRelX, mouseRelY); return; } // Do not zoom or do other funny stuff if we are moving IP or vertices if (!m_polyEditMode && m_wid_menu_mgr->m_moveMatchPoint->isChecked() && !m_cropWinMode) return; if (m_polyEditMode && m_wid_menu_mgr->m_moveVertex->isChecked() && !m_cropWinMode) return; if (event->buttons() & Qt::RightButton) { // Drag the image along the mouse movement m_current_view -= (screen2world(QPoint2Vec(mouse_rel_pos)) - screen2world(QPoint2Vec(QPoint(m_mousePrsX, m_mousePrsY)))); refreshPixmap(); // will call paintEvent() return; } if (m_cropWinMode) { handleCropWin(); return; } if (Qt::LeftButton) { zoomInOut(mouseRelX, mouseRelY); return; } // At this stage the user is supposed to release the control key, so // we are no longer in crop win mode, even if we were so far. m_cropWinMode = false; return; } // End mouseReleaseEvent() void MainWidget::mouseDoubleClickEvent(QMouseEvent *event) { m_curr_pixel_pos = QPoint2Vec(event->pos()); updateCurrentMousePosition(); } void MainWidget::wheelEvent(QWheelEvent *event) { int num_degrees = event->angleDelta().y() / 8; double num_ticks = double(num_degrees) / 360; // Accumulate ticks m_accumulatedZoomTicks += num_ticks; // Merge all mouse wheel movements within this time frame. This prevents many // incremental zoom actions. m_zoomTimer->start(250); m_curr_pixel_pos = QPointF2Vec(event->position()); updateCurrentMousePosition(); } void MainWidget::enterEvent(QEvent *event) { } void MainWidget::leaveEvent(QEvent */*event*/) { } void MainWidget::keyPressEvent(QKeyEvent *event) { // Save these before we modify the box double width = m_current_view.width(); double height = m_current_view.height(); double factor = 0.2; // We will pan by moving by 20%. switch (event->key()) { // Pan case Qt::Key_Left: // Pan left m_current_view.min().x() -= width*factor; m_current_view.max().x() -= width*factor; m_can_emit_zoom_all_signal = true; refreshPixmap(); break; case Qt::Key_Right: // Pan right m_current_view.min().x() += width*factor; m_current_view.max().x() += width*factor; m_can_emit_zoom_all_signal = true; refreshPixmap(); break; case Qt::Key_Up: // Pan up m_current_view.min().y() -= height*factor; m_current_view.max().y() -= height*factor; m_can_emit_zoom_all_signal = true; refreshPixmap(); break; case Qt::Key_Down: // Pan down m_current_view.min().y() += height*factor; m_current_view.max().y() += height*factor; m_can_emit_zoom_all_signal = true; refreshPixmap(); break; default: QWidget::keyPressEvent(event); } } // Apply the zoom after a delay to accumulate mouse wheel events void MainWidget::handleZoomTimeout() { if (m_accumulatedZoomTicks == 0.0) return; // Multiply by 2.0 to make zooming more responsive double mag = std::abs(2.0 * m_accumulatedZoomTicks); double scale = 1; if (m_accumulatedZoomTicks > 0) scale = 1 + mag; else if (m_accumulatedZoomTicks < 0) scale = std::max(1 - mag, 0.5); zoom(scale); // Reset accumulated ticks after applying zoom m_accumulatedZoomTicks = 0.0; } void MainWidget::contextMenuEvent(QContextMenuEvent *event) { int x = event->x(), y = event->y(); m_mousePrsX = x; m_mousePrsY = y; m_wid_menu_mgr->setupContextMenu(this); m_wid_menu_mgr->m_contextMenu->popup(mapToGlobal(QPoint(x,y))); return; } } // namespace asp ================================================ FILE: src/asp/GUI/GuiArgs.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file GuiArgs.cc // #include #include #include #include #include #include namespace asp { // TODO(oalexan1): If the same file is repeated, will the book-keeping fail? // See the .h for more details. void preprocessArgs(int &argc, char** argv, std::vector> & properties) { // Defaults std::string curr_style = "default"; std::string curr_color = "default"; std::string curr_colormap = "binary-red-blue"; std::string colorbar = "0"; std::string colorize = "0"; // Track whether an image appeared after a colorization option was set bool image_after_color_opt = true; // One set of properties for each argument. That to make sure that a filename // can show up twice with different properties int out_it = 1; properties.resize(argc); for (int it = 1; it < argc; it++) { // skip program name, so start from 1 if (std::string(argv[it]) == "--style") { if (it == argc - 1) continue; // There is nothing else it++; curr_style = argv[it]; // copy the style value, and move past it continue; } if (std::string(argv[it]) == "--color") { if (it == argc - 1) continue; // There is nothing else it++; curr_color = argv[it]; // copy the color value, and move past it continue; } if (std::string(argv[it]) == "--colormap-style") { if (it == argc - 1) continue; // There is nothing else it++; curr_colormap = argv[it]; // copy the color value, and move past it image_after_color_opt = false; continue; } // Sticky boolean flags with no value if (std::string(argv[it]) == "--colorbar") { colorbar = "1"; colorize = "1"; // --colorbar implies --colorize image_after_color_opt = false; continue; } if (std::string(argv[it]) == "--no-colorbar") { colorbar = "0"; continue; } if (std::string(argv[it]) == "--colorize") { colorize = "1"; image_after_color_opt = false; continue; } if (std::string(argv[it]) == "--no-colorize") { colorize = "0"; continue; } // If this argument does not start with a dash, so is not an // option, assign to it the properties so far if (argv[it][0] != '-') { properties[it]["name"] = argv[it]; properties[it]["style"] = curr_style; properties[it]["color"] = curr_color; properties[it]["colormap"] = curr_colormap; properties[it]["colorbar"] = colorbar; properties[it]["colorize"] = colorize; image_after_color_opt = true; } // Shift arguments left, which will wipe what we processed above argv[out_it] = argv[it]; // this copies pointer addresses out_it++; } // Warn if colorization options were set after all images if (!image_after_color_opt) vw::vw_out(vw::WarningMessage) << "Colorization options (--colormap-style, --colorize, --colorbar) " << "were set after the last image, so they will not apply. " << "Move them before the images they should affect, as they only " << "apply to subsequent images.\n"; // Update the number of remaining arguments argc = out_it; return; } void lookupPropertyIndices(std::vector> const& properties, std::vector const& images, std::vector & propertyIndices) { propertyIndices.clear(); size_t start_p = 0; for (size_t i = 0; i < images.size(); i++) { for (size_t p_it = start_p; p_it < properties.size(); p_it++) { auto key_ptr = properties[p_it].find("name"); if (key_ptr == properties[p_it].end()) continue; if (key_ptr->second == images[i]) { start_p = p_it; // Found the right index for the property for the current file break; } } if (start_p >= properties.size()) { if (properties.empty()) vw::vw_throw(vw::ArgumentErr() << "No image properties were found.\n"); // For the nvm case, to not go out of bounds start_p = properties.size() - 1; } propertyIndices.push_back(start_p); start_p++; // next time start the search after the entry just identified } } // Keep only image files, shape files, and csv files void filterImages(std::vector & image_files) { // Form a local copy std::vector local_files; local_files.clear(); for (size_t i = 0; i < image_files.size(); i++) { bool is_image = true; try { vw::DiskImageView img(image_files[i]); } catch(...) { is_image = false; } // Accept shape files and csv files alongside images if (!is_image && !vw::has_shp_extension(image_files[i]) && !asp::hasCsv(image_files[i])) continue; local_files.push_back(image_files[i]); } // Overwrite the input files image_files = local_files; } // Remove option and vals void rmOptionVals(int argc, char ** argv, std::string const& opt, int num_vals) { // Wipe say --left-image-crop-win 0 0 100 100, that is, an option // with 4 values. for (int i = 0; i < argc; i++) { if (std::string(argv[i]) != opt) continue; for (int j = i; j < i + num_vals + 1; j++) { if (j >= argc) break; // To avoid problems with empty strings, set the string to space instead if (strlen(argv[j]) > 0) { argv[j][0] = ' '; argv[j][1] = '\0'; } } } } } // namespace asp ================================================ FILE: src/asp/GUI/GuiArgs.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file GuiArgs.h // #ifndef __ASP_GUI_GUI_ARGS_H__ #define __ASP_GUI_GUI_ARGS_H__ #include #include #include #include #include namespace asp { // Given an input string as: // stereo_gui --style line --color red --colormap-style inferno file1.txt \ // --color green file2.txt // extract each style, color, and colormap. Any of these apply for any following // files, till modified by another such option. The default style and color // are "default". Later, these will be either read from the files // themselves, or otherwise set to "line" and "green". Then modify the // args to remove these options, as the boost parser cannot parse // repeated options. void preprocessArgs(int &argc, char** argv, std::vector> & properties); // Given a vector of properties, with each property having a // potentially non-unique image name as an attribute and other // attributes as well, and a list of images, find the index of the // property for that image. Such logic is necessary because the same // image may show up twice, but with different properties each // time. So, the first occurrence of an image is matched to the first // occurrence of a property with that name, and so on. Also, there may // be properties for entities which are no longer in the list of // images. void lookupPropertyIndices(std::vector> const& properties, std::vector const& images, std::vector & propertyIndices); // Filter the input files, keeping only the valid images, shape files, and csv files void filterImages(std::vector & image_files); // Remove option and vals void rmOptionVals(int argc, char ** argv, std::string const& opt, int num_vals); } // namespace asp #endif // __ASP_GUI_GUI_ARGS_H__ ================================================ FILE: src/asp/GUI/GuiBase.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include namespace asp { void popUp(std::string const& msg){ QMessageBox msgBox; msgBox.setText(msg.c_str()); msgBox.exec(); return; } } // namespace asp ================================================ FILE: src/asp/GUI/GuiBase.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file GuiBase.h // // Very low-level Qt functions // #ifndef __STEREO_GUI_GUI_BASE_H__ #define __STEREO_GUI_GUI_BASE_H__ #include namespace asp { void popUp(std::string const& msg); } // namespace asp #endif // __STEREO_GUI_GUI_BASE_H__ ================================================ FILE: src/asp/GUI/GuiConstants.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file GuiConstants.h // // Magic numbers used across stereo_gui, centralized in one place. #ifndef __STEREO_GUI_CONSTANTS_H__ #define __STEREO_GUI_CONSTANTS_H__ namespace asp { // Max pixels in top pyramid level for image loading const int TOP_IMAGE_MAX_PIX = 1000 * 1000; // Default lowest-resolution subimage size const int LOWRES_SIZE_DEFAULT = 1000 * 1000; // Lowest-resolution subimage size when in preview (delay) mode const int LOWRES_SIZE_PREVIEW = 8000 * 8000; // Pyramid subsample factor for image loading in load() const int LOAD_SUBSAMPLE = 4; // Default pyramid subsample factor for DiskImagePyramidMultiChannel const int PYRAMID_SUBSAMPLE = 2; // Max screen distance (pixels) for match point pick/delete const double MATCH_POINT_DISTANCE_LIMIT = 70.0; } // namespace asp #endif // __STEREO_GUI_CONSTANTS_H__ ================================================ FILE: src/asp/GUI/GuiGeom.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include namespace asp { void findClosestPolyVertex(double world_x0, double world_y0, asp::AppData const& app_data, int beg_image_id, int end_image_id, PolySearchResult & result) { result = PolySearchResult(); result.minX = world_x0; result.minY = world_y0; vw::Vector2 world_P(world_x0, world_y0); for (int clipIter = beg_image_id; clipIter < end_image_id; clipIter++) { // Convert from world coordinates to given clip coordinates vw::Vector2 clip_P = app_data.world2proj(world_P, clipIter); PolySearchResult local; findClosestPolyVertex(clip_P.x(), clip_P.y(), app_data.images[clipIter].polyVec, local); // Unless the polygon is empty, convert back to world // coordinates, and see if the current distance is smaller than // the previous one. if (local.polyVecIndex >= 0 && local.polyIndexInCurrPoly >= 0 && local.vertIndexInCurrPoly >= 0) { vw::Vector2 closest_P = app_data.proj2world( vw::Vector2(local.minX, local.minY), clipIter); local.minDist = norm_2(closest_P - world_P); if (local.minDist <= result.minDist) { result = local; result.clipIndex = clipIter; result.minX = closest_P.x(); result.minY = closest_P.y(); } } } } // Find the closest point in a given vector of polygons to a given point. void findClosestPolyVertex(double x0, double y0, std::vector const& polyVec, PolySearchResult & result) { result = PolySearchResult(); result.minX = x0; result.minY = y0; for (int s = 0; s < (int)polyVec.size(); s++) { double minX0 = 0, minY0 = 0, minDist0 = 0; int polyIndex = -1, vertIndex = -1; polyVec[s].findClosestPolyVertex(x0, y0, polyIndex, vertIndex, minX0, minY0, minDist0); if (minDist0 <= result.minDist) { result.polyVecIndex = s; result.polyIndexInCurrPoly = polyIndex; result.vertIndexInCurrPoly = vertIndex; result.minDist = minDist0; result.minX = minX0; result.minY = minY0; } } } void findClosestPolyEdge(double world_x0, double world_y0, asp::AppData const& app_data, int beg_image_id, int end_image_id, PolySearchResult & result) { result = PolySearchResult(); result.minX = world_x0; result.minY = world_y0; vw::Vector2 world_P(world_x0, world_y0); for (int clipIter = beg_image_id; clipIter < end_image_id; clipIter++) { // Convert from world coordinates to given clip coordinates vw::Vector2 clip_P = app_data.world2proj(world_P, clipIter); PolySearchResult local; asp::findClosestPolyEdge(clip_P.x(), clip_P.y(), app_data.images[clipIter].polyVec, local); // Unless the polygon is empty, convert back to world // coordinates, and see if the current distance is smaller than // the previous one. if (local.polyVecIndex >= 0 && local.polyIndexInCurrPoly >= 0 && local.vertIndexInCurrPoly >= 0) { vw::Vector2 closest_P = app_data.proj2world( vw::Vector2(local.minX, local.minY), clipIter); local.minDist = norm_2(closest_P - world_P); if (local.minDist <= result.minDist) { result = local; result.clipIndex = clipIter; result.minX = closest_P.x(); result.minY = closest_P.y(); } } } } // Find the closest edge in a given vector of polygons to a given point. void findClosestPolyEdge(double x0, double y0, std::vector const& polyVec, PolySearchResult & result) { result = PolySearchResult(); result.minX = x0; result.minY = y0; for (int s = 0; s < (int)polyVec.size(); s++) { double minX0 = 0, minY0 = 0, minDist0 = 0; int polyIndex = -1, vertIndex = -1; polyVec[s].findClosestPolyEdge(x0, y0, polyIndex, vertIndex, minX0, minY0, minDist0); if (minDist0 <= result.minDist) { result.polyVecIndex = s; result.polyIndexInCurrPoly = polyIndex; result.vertIndexInCurrPoly = vertIndex; result.minDist = minDist0; result.minX = minX0; result.minY = minY0; } } } // Assemble the polygon structure void formPoly(std::string const& override_color, std::vector const& contiguous_blocks, std::vector const& colors, std::vector const& annotations, std::vector const& vertices, std::vector & polyVec) { // Wipe the output polyVec.clear(); polyVec.resize(1); if (colors.size() != contiguous_blocks.size()) vw::vw_throw(vw::ArgumentErr() << "There must be as many polygons as colors for them.\n"); size_t vertexCount = 0; for (size_t polyIt = 0; polyIt < contiguous_blocks.size(); polyIt++) { std::vector x, y; for (int vertexIt = 0; vertexIt < contiguous_blocks[polyIt]; vertexIt++) { if (vertexCount >= vertices.size()) vw::vw_throw(vw::ArgumentErr() << "Book-keeping error in reading polygons.\n"); x.push_back(vertices[vertexCount].x()); y.push_back(vertices[vertexCount].y()); vertexCount++; } std::string curr_color = colors[polyIt]; // use color from file if it exists // The command line color overrides what is in the file if (override_color != "default" && override_color != "") curr_color = override_color; bool isPolyClosed = true; std::string layer; polyVec[0].appendPolygon(x.size(), vw::geometry::vecPtr(x), vw::geometry::vecPtr(y), isPolyClosed, curr_color, layer); } polyVec[0].set_annotations(annotations); if (vertexCount != vertices.size()) vw::vw_throw(vw::ArgumentErr() << "The number of read vertices is not what is expected.\n"); return; } void mergePolys(asp::AppData & app_data, int beg_image_id, int end_image_id, int outIndex) { std::vector polyVec; try { // We will infer these from existing polygons std::string poly_color, layer_str; // We must first organize all those user-drawn curves into meaningful polygons. // This can flip orientations and order of polygons. std::vector ogr_polys; for (int clipIt = beg_image_id; clipIt < end_image_id; clipIt++) { auto & polyVec = app_data.images[clipIt].polyVec; for (size_t vecIter = 0; vecIter < polyVec.size(); vecIter++) { if (poly_color == "") { std::vector colors = polyVec[vecIter].get_colors(); if (!colors.empty()) poly_color = colors[0]; } if (layer_str == "") { std::vector layers = polyVec[vecIter].get_layers(); if (!layers.empty()) layer_str = layers[0]; } // Make a copy of the polygons vw::geometry::dPoly poly = polyVec[vecIter]; double * xv = poly.get_xv(); double * yv = poly.get_yv(); const int* numVerts = poly.get_numVerts(); int numPolys = poly.get_numPolys(); int totalNumVerts = poly.get_totalNumVerts(); // Convert from the coordinate system of each layer // to the one of the output layer for (int vIter = 0; vIter < totalNumVerts; vIter++) { vw::Vector2 P = app_data.proj2world(vw::Vector2(xv[vIter], yv[vIter]), clipIt); P = app_data.world2proj(P, outIndex); xv[vIter] = P.x(); yv[vIter] = P.y(); } // Iterate over polygon rings in the given polygon set int startPos = 0; for (int pIter = 0; pIter < numPolys; pIter++) { if (pIter > 0) startPos += numVerts[pIter - 1]; int numCurrPolyVerts = numVerts[pIter]; OGRLinearRing R; vw::geometry::toOGR(xv, yv, startPos, numCurrPolyVerts, R); OGRPolygon * P = new OGRPolygon; // the parent manages the allocation if (P->addRing(&R) != OGRERR_NONE) vw_throw(vw::ArgumentErr() << "Failed add ring to polygon.\n"); ogr_polys.push_back(P); } } } vw::geometry::mergeOGRPolygons(poly_color, layer_str, ogr_polys, polyVec); } catch(std::exception &e) { vw::vw_out() << "OGR failed at " << e.what() << std::endl; } // Wipe all existing polygons and replace with this one for (int clipIt = beg_image_id; clipIt < end_image_id; clipIt++) app_data.images[clipIt].polyVec.clear(); app_data.images[outIndex].polyVec = polyVec; } // Delete vertices in a given box void deleteVerticesInBox(asp::AppData & app_data, vw::BBox2 const& box, int beg_image_id, int end_image_id) { for (int clipIt = beg_image_id; clipIt < end_image_id; clipIt++) { for (size_t layerIt = 0; layerIt < app_data.images[clipIt].polyVec.size(); layerIt++) { vw::geometry::dPoly & poly = app_data.images[clipIt].polyVec[layerIt]; // alias int numPolys = poly.get_numPolys(); const int * numVerts = poly.get_numVerts(); const double * xv = poly.get_xv(); const double * yv = poly.get_yv(); std::vector colors = poly.get_colors(); std::vector layers = poly.get_layers(); vw::geometry::dPoly poly_out; int start = 0; for (int polyIter = 0; polyIter < numPolys; polyIter++) { if (polyIter > 0) start += numVerts[polyIter - 1]; int pSize = numVerts[polyIter]; std::vector out_xv, out_yv; for (int vIter = 0; vIter < pSize; vIter++) { double x = xv[start + vIter]; double y = yv[start + vIter]; vw::Vector2 P = app_data.proj2world(vw::Vector2(x, y), clipIt); // This vertex will be deleted if (box.contains(P)) continue; out_xv.push_back(x); out_yv.push_back(y); } bool isPolyClosed = true; poly_out.appendPolygon(out_xv.size(), vw::geometry::vecPtr(out_xv), vw::geometry::vecPtr(out_yv), isPolyClosed, colors[polyIter], layers[polyIter]); } // Overwrite the polygon app_data.images[clipIt].polyVec[layerIt] = poly_out; } } } } // end namespace asp ================================================ FILE: src/asp/GUI/GuiGeom.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_GUI_GUI_GEOM_H__ #define __ASP_GUI_GUI_GEOM_H__ #include #include #include #include namespace asp { // Result of searching for the closest polygon vertex or edge struct PolySearchResult { int clipIndex = -1; int polyVecIndex = -1; int polyIndexInCurrPoly = -1; int vertIndexInCurrPoly = -1; double minX = 0; double minY = 0; double minDist = std::numeric_limits::max(); }; void findClosestPolyVertex(double world_x0, double world_y0, asp::AppData const& app_data, int beg_image_id, int end_image_id, PolySearchResult & result); // Find the closest point in a given vector of polygons to a given point. void findClosestPolyVertex(double x0, double y0, std::vector const& polyVec, PolySearchResult & result); // Find the closest edge in a given set of polygons to a given point. void findClosestPolyEdge(double world_x0, double world_y0, asp::AppData const& app_data, int beg_image_id, int end_image_id, PolySearchResult & result); // Merge some polygons and save them in app_data.images[outIndex] void mergePolys(asp::AppData & app_data, int beg_image_id, int end_image_id, int outIndex); // Delete vertices in a given box void deleteVerticesInBox(asp::AppData & app_data, vw::BBox2 const& box, int beg_image_id, int end_image_id); // Assemble the polygon structure void formPoly(std::string const& override_color, std::vector const& contiguous_blocks, std::vector const& colors, std::vector const& annotations, std::vector const& vertices, std::vector & polyVec); // Find the closest edge in a given vector of polygons to a given point. void findClosestPolyEdge(double x0, double y0, std::vector const& polyVec, PolySearchResult & result); } #endif // __ASP_GUI_GUI_GEOM_H__ ================================================ FILE: src/asp/GUI/GuiUtilities.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // TODO(oalexan1): This is very slow to compile. Need to figure out // why. Could be the bundle adjustment logic. Or contouring, or // shapefile logic, or DiskImagePyramid read from GuiUtilities.h. // These may need to be moved to separate files. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // For contours #include #include #include using namespace vw; using namespace vw::geometry; namespace asp { bool isPolyZeroDim(const QPolygon & pa){ int numPts = pa.size(); for (int s = 1; s < numPts; s++){ if (pa[0] != pa[s]) return false; } return true; } bool getStringFromGui(QWidget * parent, std::string title, std::string description, std::string inputStr, std::string & outputStr){ // output outputStr = ""; bool ok = false; QString text = QInputDialog::getText(parent, title.c_str(), description.c_str(), QLineEdit::Normal, inputStr.c_str(), &ok); if (ok) outputStr = text.toStdString(); return ok; } bool supplyOutputPrefixIfNeeded(QWidget * parent, std::string & output_prefix){ if (output_prefix != "") return true; std::string caption = "Enter the output prefix to use for the interest point match file."; bool ans = getStringFromGui(parent, caption, caption, "", output_prefix); if (ans) vw::create_out_dir(output_prefix); return ans; } std::string fileDialog(std::string title, std::string start_folder){ std::string fileName = QFileDialog::getOpenFileName(0, title.c_str(), start_folder.c_str()).toStdString(); return fileName; } QRect bbox2qrect(BBox2 const& B){ // Need some care here, an empty BBox2 can have its corners // as the largest double, which can cause overflow. if (B.empty()) return QRect(); return QRect(round(B.min().x()), round(B.min().y()), round(B.width()), round(B.height())); } bool write_hillshade(vw::GdalWriteOptions const& opt, bool have_gui, double azimuth, double elevation, std::string const& input_file, std::string & output_file) { // Sanity check: Must have a georeference cartography::GeoReference georef; bool has_georef = vw::cartography::read_georeference(georef, input_file); if (!has_georef) { popUp("No georeference present in: " + input_file + "."); return false; } double scale = 0.0; double blur_sigma = std::numeric_limits::quiet_NaN(); double nodata_val = std::numeric_limits::quiet_NaN(); vw::read_nodata_val(input_file, nodata_val); std::ostringstream oss; oss << "_hillshade_a" << azimuth << "_e" << elevation << ".tif"; std::string suffix = oss.str(); output_file = vw::mosaic::filename_from_suffix1(input_file, suffix); bool align_light_to_georef = false; try { DiskImageView input(input_file); // TODO(oalexan1): Factor out repeated logic below. try { bool will_write = vw::mosaic::overwrite_if_no_good(input_file, output_file, input.cols(), input.rows()); if (will_write) { vw_out() << "Writing: " << output_file << "\n"; vw::cartography::do_multitype_hillshade(input_file, output_file, azimuth, elevation, scale, nodata_val, blur_sigma, align_light_to_georef, opt); } } catch(...) { // Failed to write, presumably because we have no write access. // Write the file in the current dir. vw_out() << "Failed to write: " << output_file << "\n"; output_file = vw::mosaic::filename_from_suffix2(input_file, suffix); bool will_write = vw::mosaic::overwrite_if_no_good(input_file, output_file, input.cols(), input.rows()); if (will_write) { vw_out() << "Writing: " << output_file << "\n"; vw::cartography::do_multitype_hillshade(input_file, output_file, azimuth, elevation, scale, nodata_val, blur_sigma, align_light_to_georef, opt); } } } catch (const Exception& e) { if (!have_gui) vw_out() << e.what() << "\n"; else popUp(e.what()); return false; } return true; } // TODO(oalexan1): The 0.5 bias may be the wrong thing to do. Need to test // more overlaying an image which is above threshold in a rectangular region // and below it outside that region void contour_image(DiskImagePyramidMultiChannel const& img, vw::cartography::GeoReference const & georef, double threshold, std::vector & polyVec) { std::vector> contours; std::vector hierarchy; // Create the OpenCV matrix. We will have issues for huge images. cv::Mat cv_img = cv::Mat::zeros(img.cols(), img.rows(), CV_8UC1); // Form the binary image. Values above threshold become 1, and less // than equal to the threshold become 0. long long int num_pixels_above_thresh = 0; for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { uchar val = (std::max(img.get_value_as_double(col, row), threshold) - threshold > 0); cv_img.at(col, row) = val; if (val > 0) num_pixels_above_thresh++; } } // Add the contour to the list of polygons to display polyVec.clear(); polyVec.resize(1); vw::geometry::dPoly & poly = polyVec[0]; // alias if (num_pixels_above_thresh == 0) return; // Return early, nothing to do // Find the contour cv::findContours(cv_img, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // Copy the polygon for export for (size_t k = 0; k < contours.size(); k++) { if (contours[k].empty()) continue; // Copy from float to double std::vector xv(contours[k].size()), yv(contours[k].size()); for (size_t vIter = 0; vIter < contours[k].size(); vIter++) { // We would like the contour to go through the center of the // pixels not through their upper-left corners. Hence add 0.5. double bias = 0.5; // Note how we flip x and y, because in our GUI the first // coordinate is the column. Vector2 S(contours[k][vIter].y + bias, contours[k][vIter].x + bias); // The GUI expects the contours to be in georeferenced coordinates S = georef.pixel_to_point(S); xv[vIter] = S.x(); yv[vIter] = S.y(); } bool isPolyClosed = true; std::string color = "green"; std::string layer = "0"; poly.appendPolygon(contours[k].size(), &xv[0], &yv[0], isPolyClosed, color, layer); } } // This will tweak the georeference so that point_to_pixel() is the identity. bool read_georef_from_shapefile(vw::cartography::GeoReference & georef, std::string const& file){ if (!vw::has_shp_extension(file)) vw_throw(ArgumentErr() << "Expecting a shapefile as input, got: " << file << ".\n"); bool has_georef = false; // will change std::vector polyVec; std::string poly_color; read_shapefile(file, poly_color, has_georef, georef, polyVec); return has_georef; } bool read_georef_from_image_or_shapefile(vw::cartography::GeoReference & georef, std::string const& file){ if (vw::has_shp_extension(file)) return read_georef_from_shapefile(georef, file); return vw::cartography::read_georeference(georef, file); } vw::Vector2 QPoint2Vec(QPoint const& qpt) { return vw::Vector2(qpt.x(), qpt.y()); } vw::Vector2 QPointF2Vec(QPointF const& qpt) { return vw::Vector2(qpt.x(), qpt.y()); } QPoint Vec2QPoint(vw::Vector2 const& V) { return QPoint(round(V.x()), round(V.y())); } vw::Vector2 flip_in_y(vw::Vector2 const& P) { return vw::Vector2(P.x(), -P.y()); } vw::BBox2 flip_in_y(vw::BBox2 const& B) { vw::BBox2 R = B; R.min().y() = -B.max().y(); R.max().y() = -B.min().y(); return R; } vw::BBox2 qrect2bbox(QRect const& R) { return vw::BBox2(vw::Vector2(R.left(), R.top()), vw::Vector2(R.right(), R.bottom())); } PointList::PointList(vw::Vector3 const& color): m_color(color) {} PointList::PointList(std::list const& points, vw::Vector3 const& color): m_color(color) { this->push_back(points); } std::list const& PointList::points() const { return m_points; } vw::Vector3 PointList::color() const { return m_color; } void PointList::push_back(vw::Vector2 pt) { m_points.push_back(pt); } void PointList::push_back(std::list pts) { std::list::iterator iter = pts.begin(); while (iter != pts.end()) { m_points.push_back(*iter); ++iter; } } // Given an image and an input file name, modify the filename using a suffix. // Write the image to that filename. If that fails, create instead the filename // in the current directory. Return the name of the output file. std::string write_in_orig_or_curr_dir(vw::GdalWriteOptions const& opt, vw::ImageViewRef & image, std::string const& input_file, std::string const& suffix, bool has_georef, vw::cartography::GeoReference const& georef, bool has_nodata, double nodata_val) { std::string output_file = vw::mosaic::filename_from_suffix1(input_file, suffix); vw::TerminalProgressCallback tpc("asp", ": "); vw::vw_out() << "Writing: " << output_file << "\n"; try { vw::cartography::block_write_gdal_image(output_file, image, has_georef, georef, has_nodata, nodata_val, opt, tpc); } catch(...) { // Failed to write, presumably because we have no write access. // Write the file in the current dir. vw::vw_out() << "Failed to write: " << output_file << "\n"; output_file = vw::mosaic::filename_from_suffix2(input_file, suffix); vw::vw_out() << "Writing: " << output_file << "\n"; vw::cartography::block_write_gdal_image(output_file, image, has_georef, georef, has_nodata, nodata_val, opt, tpc); } return output_file; } // See if we are in the mode where the images are displayed side-by-side with a // dialog to choose which ones to display. bool sideBySideWithDialog() { return (asp::stereo_settings().pairwise_matches || asp::stereo_settings().pairwise_clean_matches || asp::stereo_settings().view_several_side_by_side); } bool previewOrSideBySideWithDialog() { return asp::stereo_settings().preview || sideBySideWithDialog(); } // Turn off any such side-by-side logic void setNoSideBySideWithDialog() { asp::stereo_settings().pairwise_matches = false; asp::stereo_settings().pairwise_clean_matches = false; asp::stereo_settings().view_several_side_by_side = false; } } // namespace asp ================================================ FILE: src/asp/GUI/GuiUtilities.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file GuiUtilities.h // // Low-level GUI logic // #ifndef __STEREO_GUI_GUI_UTILITIES_H__ #define __STEREO_GUI_GUI_UTILITIES_H__ // Fforward declaration namespace asp { class DiskImagePyramidMultiChannel; } // Vision Workbench #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Must be before Qt headers #include #include #include #include #include #include #include #include class QMouseEvent; class QWheelEvent; class QPoint; class QResizeEvent; class QTableWidget; class QContextMenuEvent; class QMenu; class QPolygon; namespace asp { bool isPolyZeroDim(const QPolygon & pa); bool getStringFromGui(QWidget * parent, std::string title, std::string description, std::string inputStr, std::string & outputStr); bool supplyOutputPrefixIfNeeded(QWidget * parent, std::string & output_prefix); // Pop-up a window to have the user select a file std::string fileDialog(std::string title, std::string start_folder=""); // Flip a point and a box in y vw::Vector2 flip_in_y(vw::Vector2 const& P); vw::BBox2 flip_in_y(vw::BBox2 const& B); // Convert a QRect object to a BBox2 object. vw::BBox2 qrect2bbox(QRect const& R); // Convert a BBox2 object to a QRect object. QRect bbox2qrect(vw::BBox2 const& B); // Save a hillshaded file bool write_hillshade(vw::GdalWriteOptions const& opt, bool have_gui, double azimuth, double elevation, std::string const& input_file, std::string & output_file); // Given an image, and an input file name, modify the filename using // a prefix. Write the image to that filename. If that fails, create // instead the filename in the current directory. Return the name // of the output file. std::string write_in_orig_or_curr_dir(vw::GdalWriteOptions const& opt, vw::ImageViewRef & image, std::string const& input_file, std::string const& suffix, bool has_georef, vw::cartography::GeoReference const & georef, bool has_nodata, double nodata_val); // This will tweak the georeference so that point_to_pixel() is the identity. bool read_georef_from_shapefile(vw::cartography::GeoReference & georef, std::string const& file); bool read_georef_from_image_or_shapefile(vw::cartography::GeoReference & georef, std::string const& file); // Create contours from given image void contour_image(DiskImagePyramidMultiChannel const& img, vw::cartography::GeoReference const & georef, double threshold, std::vector & polyVec); // QT conversion functions vw::Vector2 QPoint2Vec(QPoint const& qpt); vw::Vector2 QPointF2Vec(QPointF const& qpt); QPoint Vec2QPoint(vw::Vector2 const& V ); // A simple class for keeping track of crosshair locations and colors. // - Contains a list of points and the color applied to them. class PointList { std::list m_points; vw::Vector3 m_color; public: PointList(vw::Vector3 const& color); PointList(std::list const& points, vw::Vector3 const& color); std::list const& points() const; vw::Vector3 color() const; void push_back(vw::Vector2 pt); void push_back(std::list pts); }; // For each pairs if image indices, store the match file and interest points. // Load these on-demand, and once loaded, keep them in memory. struct pairwiseMatchList { std::map, std::string> match_files; std::map, std::pair, std::vector>> matches; // We will copy here only the ip that need to be shown for the moment std::vector> ip_to_show; }; // See if we are in the mode where the images are displayed side-by-side with a // dialog to choose which ones to display. bool sideBySideWithDialog(); bool previewOrSideBySideWithDialog(); void setNoSideBySideWithDialog(); // turn off such logic } // namespace asp #endif // __STEREO_GUI_GUI_UTILITIES_H__ ================================================ FILE: src/asp/GUI/ImageData.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file ImageData.cc // // Implementation of the imageData class #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace vw; using namespace vw::geometry; namespace asp { namespace fs = boost::filesystem; // Return true if the extension is .csv or .txt // TODO(oalexan1): Move this to Common.cc bool hasCsv(std::string const& fileName) { std::string ext = vw::get_extension(fileName); if (ext == ".csv" || ext == ".txt") return true; return false; } // Read datum from a csv file, such as a pointmap file saved by bundle_adjust. bool read_datum_from_csv(std::string const& file, vw::cartography::Datum & datum) { int count = 0; std::ifstream fh(file); std::string line; while (getline(fh, line, '\n')) { // If the datum was not found early on, give up count++; if (count > 10) return false; if (vw::cartography::read_datum_from_str(line, datum)) return true; } return false; } // Given one or more of --csv-format-str, --csv-srs, and datum, extract // the needed metadata. void read_csv_metadata(std::string const& csv_file, std::string const& csv_format, bool isPoly, asp::CsvConv & csv_conv, bool & has_pixel_vals, bool & has_georef, vw::cartography::GeoReference & georef) { if (!fs::exists(csv_file)) { popUp("Could not load file: " + csv_file); return; } // Each file has its own csv format. Will be overriden if specified by the user // via --csv-format-str. std::string local_csv_format_str; bool guessed_lola = (csv_file.find("RDR") != std::string::npos && csv_file.find("PointPerRow") != std::string::npos); if (csv_format != "") { local_csv_format_str = csv_format; } else { // For the pointmap and match_offsets files the csv format is known, read it from // the file if not specified the user. Same for anchor_points files written by // jitter_solve. if (csv_file.find("pointmap") != std::string::npos || // bundle_adjust csv_file.find("match_offsets") != std::string::npos || // bundle_adjust csv_file.find("anchor_points") != std::string::npos || // jitter_solve csv_file.find("ref_terrain") != std::string::npos || // jitter_solve csv_file.find("beg_errors.csv") != std::string::npos || // pc_align csv_file.find("end_errors.csv") != std::string::npos) // pc_align local_csv_format_str = "1:lon, 2:lat, 4:height_above_datum"; // For the diff.csv files produced by geodiff the csv format is known, read it from // the file if not specified the user. if (csv_file.find("-diff.csv") != std::string::npos) // geodiff local_csv_format_str = "1:lon, 2:lat, 3:height_above_datum"; // LOLA if (local_csv_format_str == "" && guessed_lola) local_csv_format_str = "2:lon, 3:lat, 4:radius_km"; } // For polygons, can assume that first coordinate is x and second is y if (isPoly && local_csv_format_str.empty()) local_csv_format_str = "1:x, 2:y"; if (asp::stereo_settings().csv_srs != "") vw_out() << "Using projection: " << asp::stereo_settings().csv_srs << "\n"; try { int min_num_fields = 3; if (isPoly) min_num_fields = 2; // only x and y coordinates may exist csv_conv.parse_csv_format(local_csv_format_str, asp::stereo_settings().csv_srs, min_num_fields); } catch (...) { // Give a more specific error message popUp("Could not parse the csv format. Check or specify --csv-format.\n"); exit(0); // This is fatal, can't do anything without the format } // For the x, y, z format we will just plot pixel x, pixel y, and value (z). // No georeference can be used. asp::CsvConv::CsvFormat fmt = csv_conv.get_format(); if (fmt == asp::CsvConv::XYZ || fmt == asp::CsvConv::PIXEL_XYVAL) has_georef = false; else has_georef = true; has_pixel_vals = (fmt == asp::CsvConv::PIXEL_XYVAL); if (local_csv_format_str == "") { popUp("The option --csv-format-str must be specified."); exit(0); // this is fatal return; } vw_out() << "Using CSV format: " << local_csv_format_str << "\n"; // Handle the datum bool has_datum = false; // For a pointmap file, anchor points, or a -diff.csv file, read the // datum from the file. The --csv-datum option, if set, will // override this. bool known_csv = (csv_file.find("pointmap") != std::string::npos || csv_file.find("anchor_points") != std::string::npos || csv_file.find("match_offsets") != std::string::npos || csv_file.find("beg_errors.csv") != std::string::npos || csv_file.find("end_errors.csv") != std::string::npos || csv_file.find("-diff.csv") != std::string::npos || asp::hasCsv(csv_file)); if (known_csv) { vw::cartography::Datum datum; if (read_datum_from_csv(csv_file, datum)) { georef.set_datum(datum); has_datum = true; } } // Parse the datum and populate the georef csv_conv.parse_georef(georef); if (asp::stereo_settings().csv_datum != "") { vw::cartography::Datum datum(asp::stereo_settings().csv_datum); georef.set_datum(datum); has_datum = true; } if (!has_datum && guessed_lola) { vw::vw_out() << "Guessing the datum for LOLA.\n"; vw::cartography::Datum datum("D_MOON"); georef.set_datum(datum); has_datum = true; } if (has_georef) { if (!has_datum) { popUp("Must specify --csv-datum."); vw_throw(ArgumentErr() << "Missing --csv-datum.\n"); return; } } if (has_datum) vw::vw_out() << "Using datum: " << georef.datum() << "\n"; return; } void imageData::read(std::string const& name_in, vw::GdalWriteOptions const& opt, DisplayMode display_mode, std::map const& properties, bool delay_loading) { m_variants[display_mode].name = name_in; if (display_mode == REGULAR_VIEW) name = name_in; // TODO(oalexan1): There is no need to make the color a class member, // as it is already stored in individual polygons color = "default"; style = "default"; colormap = "binary-red-blue"; colorize = false; colorbar = false; m_opt = opt; m_display_mode = display_mode; // Properties passed on the command line; they take precedence for (auto it = properties.begin(); it != properties.end(); it++) { if (it->first == "color") color = it->second; // copy the poly/line/points color if (it->first == "style") style = it->second; // copy the style (poly, line, points) if (it->first == "colormap") colormap = it->second; // copy the colormap style (e.g., binary-red-blue) if (it->first == "colorize") colorize = atof(it->second.c_str()); if (it->first == "colorbar") colorbar = atof(it->second.c_str()); } // These must be set once we know the name and the style m_isPoly = imageData::isPolyInternal(name, style); m_isCsv = imageData::isCsvInternal(name, style); // When there are many images, we may prefer to load them on demand if (!delay_loading) load(); } // A few small local functions namespace { // Given a line of the form: // # key value1 value2 and so on // Read the key in one string, and the values in another string. void readEntryVal(std::string line, std::string & key, std::string & val) { // Initialize the outputs key = ""; val = ""; // Skip empty lines or those not starting with a pound sign if (line.empty() || line[0] != '#') return; // Eliminate the pound sign line = line.substr(1, line.size()-1); std::istringstream is(line); is >> key; val = ""; std::string token; while (is >> token) { val += token + " "; } boost::algorithm::trim(val); } // Open a file and extract the values for: WKT:, csv-format:, style: void parseCsvHeader(std::string const& file, std::string & wkt, std::string & csv_format, std::string & style) { wkt = ""; csv_format = ""; style = ""; std::ifstream fh(file.c_str()); // Read line by line. Stop when a line no longer starts with a pound sign. std::string line; while (getline(fh, line, '\n')) { // skip empty lines if (line.empty()) continue; // Stop if the pound sign is not the first character if (line[0] != '#') break; std::string key, val; readEntryVal(line, key, val); if (key == "WKT:") wkt = val; if (key == "csv-format:") csv_format = val; if (key == "style:") style = val; } } } // end local namespace // Load the image is not loaded so far void imageData::load() { // Loaded data need not be reloaded auto& variant = m_variants[m_display_mode]; if (variant.loaded) return; vw_out() << "Reading: " << variant.name << "\n"; variant.loaded = true; std::string default_poly_color = "green"; // default, will be overwritten later if (vw::has_shp_extension(name)) { // Read a shape file std::string poly_color = default_poly_color; if (color != "default" && color != "") poly_color = color; std::string fieldId = "tile_id"; // For reading tile geom written by stereo_parse read_shapefile(name, poly_color, has_georef, georef, polyVec, fieldId); double xll = -1.0, yll = -1.0, xur = -1.0, yur = -1.0; shapefile_bdbox(polyVec, xll, yll, xur, yur); // outputs image_bbox.min() = Vector2(xll, yll); image_bbox.max() = Vector2(xur, yur); } else if (asp::hasCsv(name)) { // Open a file and extract the values for: WKT:, csv-format:, style: std::string local_wkt, local_csv_format, local_style; parseCsvHeader(name, local_wkt, local_csv_format, local_style); // The style from the file overrides the style from the command line if (local_style != "") style = local_style; bool isPoly = (style == "poly" || style == "fpoly" || style == "line"); asp::CsvConv csv_conv; bool has_pixel_vals = false; // may change later has_georef = true; // this may change later // Read poly or csv if (isPoly && local_style != "") { // The polygon file has all the data int numCols = 2; // only x and y coordinates may exist csv_conv.parse_csv_format(local_csv_format, local_wkt, numCols); has_georef = (local_wkt != ""); if (has_georef) georef.set_wkt(local_wkt); has_pixel_vals = (csv_conv.get_format() == asp::CsvConv::PIXEL_XYVAL); } else { // Use options specified on the command line int numCols = asp::fileNumCols(name); read_csv_metadata(name, asp::stereo_settings().csv_format_str, isPoly, csv_conv, has_pixel_vals, has_georef, georef); } std::vector contiguous_blocks; std::vector colors; std::vector annotations; colors.push_back(default_poly_color); // to provide a default color for the reader // Read the file std::list pos_records; if (!isPoly) csv_conv.read_csv_file(name, pos_records); else csv_conv.read_poly_file(name, pos_records, contiguous_blocks, colors, annotations); scattered_data.clear(); // note that this is a member variable vw::BBox3 bounds; for (auto iter = pos_records.begin(); iter != pos_records.end(); iter++) { Vector3 val = csv_conv.sort_parsed_vector3(*iter); // For pixel values the y axis will go down if (has_pixel_vals) val[1] *= -1.0; scattered_data.push_back(val); bounds.grow(val); } image_bbox.min() = subvector(bounds.min(), 0, 2); image_bbox.max() = subvector(bounds.max(), 0, 2); val_range[0] = bounds.min()[2]; val_range[1] = bounds.max()[2]; if (isPoly) { asp::formPoly(color, contiguous_blocks, colors, annotations, scattered_data, polyVec); scattered_data.clear(); // the data is now in the poly structure } }else{ // Read an image int top_image_max_pix = TOP_IMAGE_MAX_PIX; int subsample = LOAD_SUBSAMPLE; has_georef = vw::cartography::read_georeference(georef, name); variant.image = DiskImagePyramidMultiChannel(variant.name, m_opt, top_image_max_pix, subsample); image_bbox = BBox2(0, 0, variant.image.cols(), variant.image.rows()); } } // Save the polygons to a plain text file. This must be in sync // with the logic for reading it. void imageData::writePoly(std::string const& polyFile) { // Put all the polygons into a single poly structure vw::geometry::dPoly poly; for (size_t polyIter = 0; polyIter < this->polyVec.size(); polyIter++) poly.appendPolygons(this->polyVec[polyIter]); bool has_geo = this->has_georef; vw::cartography::GeoReference const& geo = this->georef; vw_out() << "Writing: " << polyFile << "\n"; std::ofstream out(polyFile.c_str()); if (!out.is_open()) vw::vw_throw(vw::IOErr() << "Could not open: " << polyFile << "\n"); // Save to the file all properties that are needed on reading it back if (has_geo) { out << "# WKT: " << geo.get_wkt() << "\n"; if (geo.is_projected()) out << "# csv-format: 1:easting,2:northing\n"; else out << "# csv-format: 1:lon,2:lat\n"; } else { out << "# WKT:\n"; // no georef out << "# csv-format: 1:x,2:y\n"; } out << "# style: poly\n"; std::string defaultColor = "green"; // only to be used if individual colors are missing bool emptyLineAsSeparator = true; // Don't want to use a "NEXT" statement as separator poly.writePoly(out, defaultColor, emptyLineAsSeparator); } // The two functions below are very slow if used per pixel, so we cache their // values in member variables. Never call these directly. bool imageData::isPolyInternal(std::string const& name, std::string const& style) const { return (vw::has_shp_extension(name) || (asp::hasCsv(name) && (style == "poly" || style == "fpoly" || style == "line"))); } bool imageData::isCsvInternal(std::string const& name, std::string const& style) const { return asp::hasCsv(name) && !imageData::isPolyInternal(name, style); } // Find the min and max values, ignoring outliers. We look only // at the last component of each point, as that has the intensity, // while the previous two have the position. void findRobustBounds(std::vector const& scattered_data, double & min_val, double & max_val) { std::vector vals; for (size_t pt_it = 0; pt_it < scattered_data.size(); pt_it++) vals.push_back(scattered_data[pt_it][2]); double beg_inlier = -1, end_inlier = -1, pct_fraction = 0.25, factor = 3.0; vw::math::find_outlier_brackets(vals, pct_fraction, factor, beg_inlier, end_inlier); min_val = end_inlier; max_val = beg_inlier; for (size_t it = 0; it < vals.size(); it++) { if (vals[it] < beg_inlier || vals[it] > end_inlier) continue; min_val = std::min(min_val, vals[it]); max_val = std::max(max_val, vals[it]); } } // Compute joint min/max across all images in the given range. // Uses --min/--max if set, otherwise unions CSV findRobustBounds // and raster approx_bounds. vw::Vector2 calcJointBounds(std::vector const& images, int begIdx, int endIdx) { if (stereo_settings().min < stereo_settings().max) return vw::Vector2(stereo_settings().min, stereo_settings().max); vw::Vector2 bounds(std::numeric_limits::max(), -std::numeric_limits::max()); for (int i = begIdx; i < endIdx; i++) { if (images[i].m_isPoly) continue; if (images[i].m_isCsv) { if (!images[i].scattered_data.empty()) { double lo = 0.0, hi = 0.0; findRobustBounds(images[i].scattered_data, lo, hi); bounds[0] = std::min(bounds[0], lo); bounds[1] = std::max(bounds[1], hi); } continue; } auto const& img = images[i].currentImg(); if (img.m_type != CH1_FLOAT) continue; vw::Vector2 ab = img.m_img_ch1_float.approx_bounds(); bounds[0] = std::min(bounds[0], ab[0]); bounds[1] = std::max(bounds[1], ab[1]); } return bounds; } } // namespace asp ================================================ FILE: src/asp/GUI/ImageData.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file ImageData.h // // A class to keep all data associated with an image file #ifndef __STEREO_GUI_IMAGE_DATA_H__ #define __STEREO_GUI_IMAGE_DATA_H__ // ASP #include // VW #include #include #include #include #include #include #include #include namespace asp { enum DisplayMode {REGULAR_VIEW, HILLSHADED_VIEW, COLORIZED_VIEW, HILLSHADE_COLORIZED_VIEW, THRESHOLDED_VIEW}; // Return true if the extension is .csv or .txt bool hasCsv(std::string const& fileName); // An image pyramid and its loaded state for a given display mode struct ImageVariant { std::string name; DiskImagePyramidMultiChannel image; bool loaded = false; }; // A class to keep all data associated with an image file class imageData { public: std::string name; // primary filename (REGULAR_VIEW) vw::GdalWriteOptions m_opt; bool has_georef; vw::cartography::GeoReference georef; vw::BBox2 image_bbox; vw::Vector2 val_range; // There are several display modes. The one being shown is // determined by m_display_mode. Store the corresponding // image pyramid and loaded state in m_variants. DisplayMode m_display_mode; std::map m_variants; // Image pyramid for the regular (default) display mode DiskImagePyramidMultiChannel& img() { return m_variants[REGULAR_VIEW].image; } DiskImagePyramidMultiChannel const& img() const { return m_variants.at(REGULAR_VIEW).image; } // Image pyramid for the current display mode DiskImagePyramidMultiChannel& currentImg() { return m_variants[m_display_mode].image; } DiskImagePyramidMultiChannel const& currentImg() const { return m_variants.at(m_display_mode).image; } std::vector polyVec; // a shapefile std::string color; // poly color std::string style; // plotting style std::string colormap; // colormap style bool colorize; // if a given image must be colorized bool colorbar; // if a colorbar should be shown // Scattered data to be plotted at (x, y) location with z giving // the intensity. May be colorized. std::vector scattered_data; imageData(): m_display_mode(REGULAR_VIEW), has_georef(false), m_isPoly(false), m_isCsv(false), colorize(false), colorbar(false) {} // Read an image from disk and set the other variables. void read(std::string const& image, vw::GdalWriteOptions const& opt, DisplayMode display_mode = REGULAR_VIEW, std::map const& properties = std::map(), bool delay_loading = false); // The actual loading happens here void load(); // Save the polygons to a plain text file void writePoly(std::string const& polyFile); bool m_isPoly, m_isCsv; bool isPolyOrCsv() const { return m_isPoly || m_isCsv; } private: // These are very slow if used per pixel, so we cache their results in // member variables. Never call these directly. bool isPolyInternal(std::string const& name, std::string const& style) const; bool isCsvInternal(std::string const& name, std::string const& style) const; }; // Find the min and max values of scattered data, ignoring outliers. // Looks at the third component (intensity) of each point. void findRobustBounds(std::vector const& scattered_data, double & min_val, double & max_val); // Compute joint min/max across all images in the given range vw::Vector2 calcJointBounds(std::vector const& images, int begIdx, int endIdx); } // namespace asp #endif // __STEREO_GUI_IMAGE_DATA_H__ ================================================ FILE: src/asp/GUI/MainWidget.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file MainWidget.cc // // TODO(oalexan1): Each layer must have just a dPoly, rather // than a vector of them. // TODO: Test with empty images and images having just one pixel. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // colormaps supported by ASP #include #include #include #include #include #include #include using namespace vw; namespace asp { MainWidget::MainWidget(QWidget *parent, vw::GdalWriteOptions const& opt, int beg_image_id, int end_image_id, int base_image_id, asp::AppData & app_data, // alias std::string & output_prefix, // will be aliased asp::MatchPointMgr & match_mgr, ChooseFilesDlg * chooseFiles, bool & allowMultipleSelections): QwtScaleWidget(parent), WidgetBase(beg_image_id, end_image_id, base_image_id, app_data), m_opt(opt), m_chooseFiles(chooseFiles), m_output_prefix(output_prefix), // alias m_match_mgr(match_mgr), m_allowMultipleSelections(allowMultipleSelections), m_can_emit_zoom_all_signal(false), m_polyEditMode(false), m_polyLayerIndex(beg_image_id), m_pixelTol(6), m_backgroundColor(QColor("black")), m_lineWidth(2), m_polyColor("green"), m_firstPaintEvent(false), m_emptyRubberBand(QRect(0,0,0,0)), m_rubberBand(QRect(0,0,0,0)), m_cropWinMode(false), m_mousePrsX(0), m_mousePrsY(0), m_zoomTimer(new QTimer(this)), m_accumulatedZoomTicks(0.0) { connect(m_zoomTimer, &QTimer::timeout, this, &MainWidget::handleZoomTimeout); m_zoomTimer->setSingleShot(true); // Ensure it only fires once per debounce period installEventFilter(this); this->setMouseTracking(true); // Set the size policy that the widget can grow or shrink and still // be useful. this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); this->setFocusPolicy(Qt::ClickFocus); // Read the images. Find the box that will contain all of them. // If we use georef, that box is in projected point units // of the first image. // Also set up the image GeoReference transforms for each image // in both directions. int num_images = app_data.images.size(); m_filesOrder.resize(num_images); // Each image can be hillshaded independently of the other ones m_hillshade.azimuth = asp::stereo_settings().hillshade_azimuth; m_hillshade.elevation = asp::stereo_settings().hillshade_elevation; // Image threshold (struct defaults handle initialization) MainWidget::maybeGenHillshade(); // Set data per image for (int i = 0; i < num_images; i++) { m_filesOrder[i] = i; // start by keeping the order of files being read bool in_range = (m_beg_image_id <= i && i < m_end_image_id); if (!in_range) continue; // Don't load the files the user wants hidden in preview mode // This won't play nice with georefs or with images // with different sizes, or likely with polygons. bool delay = !asp::stereo_settings().nvm.empty() || asp::stereo_settings().preview; if (m_chooseFiles && m_chooseFiles->isHidden(app_data.images[i].name) && delay) continue; // Load if not loaded so far app_data.images[i].load(); if (app_data.use_georef && !app_data.images[i].has_georef) { popUp("No georeference present in: " + app_data.images[i].name + "."); vw_throw(ArgumentErr() << "Missing georeference.\n"); } // Grow the world box to fit all the images BBox2 B = app_data.image2world_trans(app_data.images[i].image_bbox, i); m_world_box.grow(B); // The first existing vector layer in the current widget becomes // the one we draw on. Otherwise we keep m_polyLayerIndex at // m_beg_image_id so we store any new polygons in // app_data.images[m_beg_image_id]. if (app_data.images[i].m_isPoly && m_polyLayerIndex == m_beg_image_id) m_polyLayerIndex = i; } // end iterating over the images if (!asp::stereo_settings().zoom_proj_win.empty()) { // Zoom to desired win. Later, once we know the window // size, this region's dimensions will be adjusted to have // correct aspect ratio. BBox2 proj_win = asp::stereo_settings().zoom_proj_win, image_box; if (app_data.images[m_base_image_id].isPolyOrCsv()) image_box = proj_win; else image_box = app_data.images[m_base_image_id].georef.point_to_pixel_bbox(proj_win); m_current_view = app_data.image2world_trans(image_box, m_base_image_id); } // To do: Warn the user if some images have georef while others don't. // Choose which files to hide/show in the GUI. In previewOrSideBySideWithDialog() // mode, see MainWindow() for alternative functionality which requires // redrawing the layout. if (m_chooseFiles && !previewOrSideBySideWithDialog()) { // When the user clicks on a table entry, say by modifying a // checkbox, update the display. QObject::connect(m_chooseFiles->getFilesTable(), SIGNAL(cellClicked(int, int)), this, SLOT(showFilesChosenByUser(int, int))); m_chooseFiles->getFilesTable()->setContextMenuPolicy(Qt::CustomContextMenu); QObject::connect(m_chooseFiles->getFilesTable(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customMenuRequested(QPoint))); } if (m_chooseFiles && !sideBySideWithDialog()) { // When the user clicks on the table header on top to show or hide all // When sideBySideWithDialog() is on, do not let every widget trigger this, // it will be done instead from the parent window. QObject::connect(m_chooseFiles->getFilesTable()->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(hideShowAll_widgetVersion())); } // Initialize the menu manager m_wid_menu_mgr = std::unique_ptr(new WidgetMenuMgr(this)); } // End constructor MainWidget::~MainWidget() { } bool MainWidget::eventFilter(QObject *obj, QEvent *E) { return QWidget::eventFilter(obj, E); } // What will happen when the user right-clicks on the table // listing the files. void MainWidget::customMenuRequested(QPoint pos) { // Process user's choice from m_chooseFiles. if (!m_chooseFiles) return; QTableWidget * filesTable = m_chooseFiles->getFilesTable(); // Determine which row of the table the user clicked on QModelIndex tablePos = filesTable->indexAt(pos); int imageIndex = tablePos.row(); // Form the menu, passing the image index explicitly QMenu *menu = m_wid_menu_mgr->formCustomMenu(this, imageIndex); menu->exec(filesTable->mapToGlobal(pos)); } void MainWidget::showFilesChosenByUser(int rowClicked, int columnClicked) { // Process user's choice from m_chooseFiles. if (!m_chooseFiles) return; QTableWidget * filesTable = m_chooseFiles->getFilesTable(); // If we did not click on the checkbox, but on the image name, // make it checked if (columnClicked > 0) { QTableWidgetItem *item = filesTable->item(rowClicked, 0); item->setCheckState(Qt::Checked); } // If we just checked a certain image, it will be shown on top of the other ones. QTableWidgetItem *item = filesTable->item(rowClicked, 0); if (item->checkState() == Qt::Checked) { bringImageOnTop(rowClicked); } // If we clicked on the image name, zoom to it. if (columnClicked > 0) { // I could not use this functionality from a double click event. MainWidget::zoomToImageInTableCell(rowClicked, columnClicked); } else { refreshPixmap(); } return; } void MainWidget::zoomToImageInTableCell(int rowClicked, int columnClicked) { zoomToImage(rowClicked); } void MainWidget::hideShowAll_widgetVersion() { if (sideBySideWithDialog()) { // The function hideShowAll_windowVersion() will be called, as // the layout and all widgets need to be recreated. return; } // Process user's choice from m_chooseFiles. if (!m_chooseFiles) return; m_chooseFiles->hideShowAll(); // In either case, reset the order in which the images are displayed int num_images = app_data.images.size(); m_filesOrder.resize(num_images); for (int i = 0; i < num_images; i++) m_filesOrder[i] = i; refreshPixmap(); } vw::BBox2 MainWidget::worldBox() const { return m_world_box; } void MainWidget::setWorldBox(vw::BBox2 const& world_box) { m_world_box = world_box; } // Zoom to show each image fully. void MainWidget::sizeToFit() { double aspect = double(m_window_width) / m_window_height; m_current_view = vw::geometry::expandBoxToRatio(m_world_box, aspect); // If this is the first time we draw the image, so right when // we started, invoke update() which will invoke paintEvent(). // That one will not only call refreshPixmap() but will // also mark that it did so. This is a bit confusing, but it is // necessary since otherwise Qt will first call this function, // invoking refreshPixmap(), then will call update() one more time // invoking needlessly refreshPixmap() again, which is expensive. if (m_firstPaintEvent) { update(); } else { refreshPixmap(); } } void MainWidget::viewUnthreshImages() { for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) app_data.images[image_iter].m_display_mode = REGULAR_VIEW; refreshPixmap(); } // The region that is currently viewable, in the first image pixel domain BBox2 MainWidget::firstImagePixelBox() const{ if (app_data.images.size() == 0) { // Must never happen vw_out() << "Did not expect no images!"; vw_throw(ArgumentErr() << "Did not expect no images.\n"); } return app_data.world2image_trans(m_current_view, m_beg_image_id); } // The current image box in world coordinates BBox2 MainWidget::firstImageWorldBox(BBox2 const& image_box) const{ if (app_data.images.size() == 0) { // Must never happen vw_out() << "Did not expect no images!"; vw_throw(ArgumentErr() << "Did not expect no images.\n"); } return app_data.image2world_trans(image_box, m_beg_image_id); } void MainWidget::viewThreshImages(bool refresh_pixmap) { int num_non_poly_images = 0; int num_images = app_data.images.size(); for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) { if (!app_data.images[image_iter].m_isPoly && !app_data.images[image_iter].m_isCsv) num_non_poly_images++; } if (num_non_poly_images > 1) { if (std::isnan(asp::stereo_settings().nodata_value)) popUp("Must have just one image in each window to view thresholded images."); else popUp("Must have just one image in each window to use the nodata option."); for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) app_data.images[image_iter].m_display_mode = REGULAR_VIEW; refreshPixmap(); return; } // Create the thresholded images and save them to disk. We have to do it each // time as perhaps the image threshold changed. for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) { std::string input_file = app_data.images[image_iter].name; if (app_data.images[image_iter].isPolyOrCsv()) continue; double nodata_val = -std::numeric_limits::max(); vw::read_nodata_val(input_file, nodata_val); // Do not use max(nodata_val, thresh) as sometimes nodata_val can be larger than data nodata_val = m_threshold.value; int num_channels = app_data.images[image_iter].img().planes(); if (num_channels != 1) { popUp("Thresholding makes sense only for single-channel images."); app_data.images[image_iter].m_display_mode = REGULAR_VIEW; return; } app_data.images[image_iter].m_display_mode = THRESHOLDED_VIEW; ImageViewRef thresh_image = apply_mask(create_mask_less_or_equal(DiskImageView(input_file), nodata_val), nodata_val); // TODO(oalexan1): Need to do something like in write_hillshade() // so that we don't have to always re-write the thresholded image. std::string suffix = "_thresh.tif"; bool has_nodata = true; std::string thresholded_file = write_in_orig_or_curr_dir(m_opt, thresh_image, input_file, suffix, app_data.images[image_iter].has_georef, app_data.images[image_iter].georef, has_nodata, nodata_val); // Read it back right away app_data.images[image_iter].m_variants[THRESHOLDED_VIEW].loaded = false; // force reload app_data.images[image_iter].read(thresholded_file, m_opt, THRESHOLDED_VIEW); temporary_files().files.insert(thresholded_file); } // We may not want to refresh the pixmap right away if we are going to // update the GUI anyway in proper time if (refresh_pixmap) refreshPixmap(); } void MainWidget::maybeGenHillshade() { int num_images = app_data.images.size(); // Create the hillshaded images and save them to disk. We have to do // it each time as perhaps the hillshade parameters changed. for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) { if (app_data.images[image_iter].m_display_mode != HILLSHADED_VIEW) continue; if (app_data.images[image_iter].name.find("_CMAP.tif") != std::string::npos) { app_data.images[image_iter].m_display_mode = REGULAR_VIEW; continue; // silently ignore colormap images } // Cannot hillshade a polygon or xyz data if (app_data.images[image_iter].isPolyOrCsv()) { app_data.images[image_iter].m_display_mode = REGULAR_VIEW; continue; } if (!app_data.images[image_iter].has_georef) { popUp("Hill-shading requires georeferenced images."); app_data.images[image_iter].m_display_mode = REGULAR_VIEW; return; } std::string input_file = app_data.images[image_iter].name; int num_channels = app_data.images[image_iter].img().planes(); if (num_channels != 1) { // Turn off hillshade mode for all images which don't support it, // or else this error will keep on coming up for (int iter2 = 0; iter2 < num_images; iter2++) { int num_channels2 = app_data.images[iter2].img().planes(); if (num_channels2 != 1) { // TODO(oalexan1): Do we need a lock here? app_data.images[iter2].m_display_mode = REGULAR_VIEW; } } // TODO(oalexan1): This warning still shows up many times // the images are side-by-side popUp("Hill-shading makes sense only for single-channel images."); continue; } // Save the hillshaded images to disk (unless it already exists) std::string hillshaded_file; bool have_gui = true; bool success = write_hillshade(m_opt, have_gui, m_hillshade.azimuth, m_hillshade.elevation, input_file, hillshaded_file); if (!success) { app_data.images[image_iter].m_display_mode = REGULAR_VIEW; return; } app_data.images[image_iter].read(hillshaded_file, m_opt, HILLSHADED_VIEW); temporary_files().files.insert(hillshaded_file); } } // Allow the user to select multiple windows. void MainWidget::allowMultipleSelections() { m_allowMultipleSelections = !m_allowMultipleSelections; m_wid_menu_mgr->m_allowMultipleSelections_action->setChecked(m_allowMultipleSelections); if (!m_allowMultipleSelections) { m_selectionRectangles.clear(); refreshPixmap(); } } // This is reached with right-click from the list of images on the left void MainWidget::toggleHillshadeFromImageList(int imageIndex) { if (app_data.images[imageIndex].m_display_mode == HILLSHADED_VIEW) app_data.images[imageIndex].m_display_mode = REGULAR_VIEW; else app_data.images[imageIndex].m_display_mode = HILLSHADED_VIEW; // We will assume if the user wants to see the hillshade // status of this image change, he'll also want it on top. bringImageOnTop(imageIndex); refreshHillshade(); } // This is reached with right-click from the image itself void MainWidget::toggleHillshadeImageRightClick() { for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) { if (app_data.images[image_iter].m_display_mode == HILLSHADED_VIEW) app_data.images[image_iter].m_display_mode = REGULAR_VIEW; else if (app_data.images[image_iter].m_display_mode != HILLSHADED_VIEW) app_data.images[image_iter].m_display_mode = HILLSHADED_VIEW; } refreshHillshade(); } void MainWidget::refreshHillshade() { m_threshold.calcMode = false; MainWidget::maybeGenHillshade(); refreshPixmap(); } void MainWidget::zoomToImage(int imageIndex) { // We will assume if the user wants to zoom to this image, // it should be on top. bringImageOnTop(imageIndex); // Set the view window to be the region encompassing the image BBox2 world_box = app_data.image2world_trans( app_data.images[imageIndex].image_bbox, imageIndex); double aspect = double(m_window_width) / m_window_height; m_current_view = vw::geometry::expandBoxToRatio(world_box, aspect); // Redraw in the computed window refreshPixmap(); } void MainWidget::bringImageOnTopSlot(int imageIndex) { bringImageOnTop(imageIndex); refreshPixmap(); } void MainWidget::pushImageToBottomSlot(int imageIndex) { pushImageToBottom(imageIndex); refreshPixmap(); } void MainWidget::viewHillshadedImages(bool hillshade_mode) { MainWidget::setHillshadeMode(hillshade_mode); refreshHillshade(); } // Each image can be hillshaded independently of the others void MainWidget::setHillshadeMode(bool hillshade_mode) { for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) { if (hillshade_mode) app_data.images[image_iter].m_display_mode = HILLSHADED_VIEW; else app_data.images[image_iter].m_display_mode = REGULAR_VIEW; } } // Ensure the current image is displayed. Note that this on its own // does not refresh the view as refreshPixmap() is not called. void MainWidget::showImage(std::string const& image_name) { if (!m_chooseFiles) return; m_chooseFiles->unhide(image_name); } // The image with the given index will be on top when shown. void MainWidget::bringImageOnTop(int image_index) { auto it = std::find(m_filesOrder.begin(), m_filesOrder.end(), image_index); if (it != m_filesOrder.end()) { m_filesOrder.erase(it); m_filesOrder.push_back(image_index); // show last, so on top } // The image should be visible MainWidget::showImage(app_data.images[image_index].name); } // The image with the given index will be on top when shown. void MainWidget::pushImageToBottom(int image_index) { auto it = std::find(m_filesOrder.begin(), m_filesOrder.end(), image_index); if (it != m_filesOrder.end()) { m_filesOrder.erase(it); m_filesOrder.insert(m_filesOrder.begin(), image_index); // show first, so at the bottom } // The image should be visible MainWidget::showImage(app_data.images[image_index].name); } // Convert the crop window to original pixel coordinates from // pixel coordinates on the screen. // TODO: Make screen2world() do it, to take an input a QRect (or BBox2) // and return as output the converted box. bool MainWidget::get_crop_win(QRect & win) { // This pop-up will be shown when the user attempts to run stereo from // the gui. if (m_end_image_id - m_beg_image_id != 1) { popUp("Must have just one image in each window to be able to select " "regions for stereo."); m_cropWinMode = false; m_rubberBand = m_emptyRubberBand; m_stereoCropWin = BBox2(); refreshPixmap(); return false; } if (m_stereoCropWin.empty()) { popUp("No valid region for stereo is present. Regions can be selected " "with Control-Mouse in each image."); return false; } win = bbox2qrect(app_data.world2image_trans(m_stereoCropWin, m_beg_image_id)); return true; } void MainWidget::zoom(double scale) { updateCurrentMousePosition(); scale = std::max(1e-8, scale); vw::BBox2 current_view = (m_current_view - m_curr_world_pos) / scale + m_curr_world_pos; if (!current_view.empty()) { // Check to make sure we haven't hit our zoom limits. m_current_view = current_view; m_can_emit_zoom_all_signal = true; refreshPixmap(); } } void MainWidget::resizeEvent(QResizeEvent*) { QRect v = this->geometry(); m_window_width = std::max(v.width(), 1); m_window_height = std::max(v.height(), 1); // If we already have a view, keep it but adjust it a bit if the // window aspect ratio changed as result of resizing. The // corresponding pixel box will be computed automatically. double ratio = double(m_window_width) / double(m_window_height); if (m_current_view.empty()) m_current_view = vw::geometry::expandBoxToRatio(m_world_box, ratio); else m_current_view = vw::geometry::expandBoxToRatio(m_current_view, ratio); if (m_firstPaintEvent) { // Avoid calling refreshPixmap() in this case, as resizeEvent() // will be followed anyway by paintEvent(), will call // refreshPixmap(). Otherwise work gets duplicated which affects // rendering speed. return; } // This is necessary, otherwise the image won't be redrawn refreshPixmap(); return; } // Transform an image taking into account the georeference. void MainWidget::renderGeoreferencedImage(double scale_out, int image_index, QPainter* paint, bool has_csv, QImage const& sourceImage, BBox2i const& screen_box, BBox2i const& region_out, ImageView & drawn_already) { // Create a QImage object to store the transformed image QImage transformedImage = QImage(screen_box.width(), screen_box.height(), QImage::Format_ARGB32_Premultiplied); // TODO(oalexan1): Cache the last 10 images to not recompute them all the time // when toggling images on and off. // The world2image call can be very expensive. Tabulate it with sampling, // and then invoke it using bicubic interpolation. // This is a speedup. // TODO(oalexan1): Factor out this logic. // TODO(oalexan1): This should happen just once per given screen box. So toggling an // image on and off should not require recomputing this. int rate = 5; int cols = screen_box.max().x()/rate + 2 + vw::BicubicInterpolation::pixel_buffer; int rows = screen_box.max().y()/rate + 2 + vw::BicubicInterpolation::pixel_buffer; ImageView screen2world_cache(cols, rows); bool can_cache = true; #pragma omp parallel for for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { Vector2 screen_pt(col*rate, row*rate); Vector2 world_pt = screen2world(screen_pt); Vector2 p; try { p = app_data.world2image_trans(world_pt, image_index); } catch (...) { // Something went wrong, the results won't be reliable #pragma omp critical can_cache = false; } screen2world_cache(col, row) = p; } } // Create bicubic interpolator ImageViewRef screen2world_cache_interp = interpolate(screen2world_cache, BicubicInterpolation(), ConstantEdgeExtension()); // Initialize all pixels to transparent for (int col = 0; col < transformedImage.width(); col++) { for (int row = 0; row < transformedImage.height(); row++) { transformedImage.setPixel(col, row, QColor(0, 0, 0, 0).rgba()); } } #pragma omp parallel for for (int x = screen_box.min().x(); x < screen_box.max().x(); x++) { for (int y = screen_box.min().y(); y < screen_box.max().y(); y++) { // Skip pixels that were already drawn. Cannot handle csv files. if (drawn_already(x, y) != 0 && !has_csv) continue; // p is in pixel coordinates of image i Vector2 p; if (can_cache) { double col = double(x)/double(rate); double row = double(y)/double(rate); p = screen2world_cache_interp(col, row); } else { // Convert from a pixel as seen on screen to the world coordinate system Vector2 world_pt = screen2world(Vector2(x, y)); try { p = app_data.world2image_trans(world_pt, image_index); } catch (const std::exception& e) { continue; } } // Convert to scaled image pixels and snap to integer value p = floor(p/scale_out); int px = p.x() - region_out.min().x(); int py = p.y() - region_out.min().y(); if (px < 0 || py < 0 || px >= sourceImage.width() || py >= sourceImage.height()) continue; // If the pixel is black or transparent, skip it QColor color = sourceImage.pixel(px, py); if (color == QColorConstants::Transparent || color.alpha() == 0) continue; if (color.red() == 0 && color.green() == 0 && color.blue() == 0) continue; transformedImage.setPixel(x-screen_box.min().x(), y-screen_box.min().y(), color.rgba()); // Flag this as drawn. No need to protect this with a lock. // TODO(oalexan1): Account here for hasCsv, as then this // logic does not work. if (!has_csv) drawn_already(x, y) = 1; } } // Send the QImage object to the painter QRect rect(screen_box.min().x(), screen_box.min().y(), screen_box.width(), screen_box.height()); paint->drawImage(rect, transformedImage); } // Build a colormap from a colormap style string. Falls back to // "binary-red-blue" if the style is not recognized. vw::Colormap buildColormap(std::string const& colormap_style) { std::map lut_map; try { vw::parseColorStyle(colormap_style, lut_map); } catch (...) { vw::parseColorStyle("binary-red-blue", lut_map); } return vw::Colormap(lut_map); } // Draw the images on the screen void MainWidget::drawImage(QPainter* paint) { // Sometimes we arrive here prematurely, before the window geometry was // determined. Then, there is nothing to do. if (m_current_view.empty()) return; // See where it fits on the screen BBox2i full_screen_box; full_screen_box.grow(floor(world2screen(m_current_view.min()))); full_screen_box.grow(ceil(world2screen(m_current_view.max()))); // Keep track of which pixels were drawn. Initialize with zeros. ImageView drawn_already; if (app_data.use_georef) { drawn_already.set_size(full_screen_box.max().x(), full_screen_box.max().y()); for (int col = 0; col < drawn_already.cols(); col++) { for (int row = 0; row < drawn_already.rows(); row++) { drawn_already(col, row) = 0; } } } // Stopwatch sw1; // sw1.start(); // When using georeferenced images we will draw the last image to be drawn // first, so that we skip the pixels from other images that are covered by it. // This is a speedup. Needs to be implemented also without a georef and when // there exist csv files (which will be tricky). std::vector draw_order; bool has_csv = false; for (int j = m_beg_image_id; j < m_end_image_id; j++) { int i = m_filesOrder[j]; // image index // Don't show files the user wants hidden if (m_chooseFiles && m_chooseFiles->isHidden(app_data.images[i].name)) continue; draw_order.push_back(i); if (app_data.images[i].m_isCsv) has_csv = true; } if (app_data.use_georef && !has_csv) std::reverse(draw_order.begin(), draw_order.end()); // For --colorize, compute joint min/max across all images in this widget vw::Vector2 joint_bounds(std::numeric_limits::max(), -std::numeric_limits::max()); bool any_colorize = false; for (int i = m_beg_image_id; i < m_end_image_id; i++) any_colorize = any_colorize || app_data.images[i].colorize; if (any_colorize) joint_bounds = calcJointBounds(app_data.images, m_beg_image_id, m_end_image_id); // Draw the images // TODO(oalexan1): Must use a single QImage, that will be updated as we go // over images and scattered points in csv. for (size_t j = 0; j < draw_order.size(); j++) { int i = draw_order[j]; // image index // Load if not loaded so far app_data.images[i].load(); if (app_data.images[i].m_isPoly) continue; // those will be always drawn on top of images, to be done later // TODO(oalexan1): Must draw this onto a QImage and then draw the QImage // Onto the same QImage will draw the imgaes. //QImage image; //QPainter local_painter(&image); // later pass this to the widget painter. // Maybe should replace m_pixmap with QImage. if (app_data.images[i].m_isCsv) { MainWidget::drawScatteredData(paint, i, joint_bounds); continue; // there is no image, so no point going on } // The portion of the image in the current view. BBox2 curr_world_box = m_current_view; BBox2 B = app_data.image2world_trans(app_data.images[i].image_bbox, i); curr_world_box.crop(B); // This is a bugfix for the case when the world boxes // of images do not overlap. if (curr_world_box.empty()) continue; // See where it fits on the screen BBox2i screen_box; screen_box.grow(floor(world2screen(curr_world_box.min()))); screen_box.grow(ceil(world2screen(curr_world_box.max()))); // Ensure the screen box is never empty if (screen_box.min().x() >= screen_box.max().x()) screen_box.max().x() = screen_box.min().x() + 1; if (screen_box.min().y() >= screen_box.max().y()) screen_box.max().y() = screen_box.min().y() + 1; // If all screen pixels are drawn already based on images that should be // on top of this one, no need to draw this image. if (app_data.use_georef) { bool all_drawn = true; #pragma omp parallel for for (int x = screen_box.min().x(); x < screen_box.max().x(); x++) { for (int y = screen_box.min().y(); y < screen_box.max().y(); y++) { if (drawn_already(x, y) == 0) { #pragma omp critical all_drawn = false; break; } } } if (all_drawn) continue; // cannot break as the next image may use a different screen box } // Go from world coordinates to pixels in the current image. BBox2 image_box = app_data.world2image_trans(curr_world_box, i); // Grow a bit to integer, as otherwise strange things happen // when zooming in too close image_box.min() = floor(image_box.min()); image_box.max() = ceil(image_box.max()); // Since the image portion contained in image_box could be huge, but the // screen area small, render a sub-sampled version of the image for speed. // Increase the scale a little. This will make the image a little blurrier // but will be faster to render. double scale = sqrt((1.0*image_box.width()) * image_box.height())/ std::max(1.0, sqrt((1.0*screen_box.width()) * screen_box.height())); scale *= 1.3; double scale_out = 1.0; // will be modified by get_image_clip() BBox2i region_out; bool highlight_nodata = (app_data.images[i].m_display_mode == THRESHOLDED_VIEW); if (!std::isnan(asp::stereo_settings().nodata_value)) { // When the user specifies --nodata-value, we will show // nodata pixels as transparent. highlight_nodata = false; } // Build a colormap if this image has colorize set vw::Colormap const* colormap_ptr = nullptr; vw::Colormap colormap_obj = buildColormap("binary-red-blue"); if (app_data.images[i].colorize && !app_data.images[i].colormap.empty()) { colormap_obj = buildColormap(app_data.images[i].colormap); colormap_ptr = &colormap_obj; } QImage qimg; app_data.images[i].currentImg().get_image_clip(scale, image_box, highlight_nodata, colormap_ptr, joint_bounds, qimg, scale_out, region_out); // Draw on image screen Stopwatch sw4; sw4.start(); if (!app_data.use_georef) { // This is a regular image, no georeference, just pass it to the Qt painter QRect rect(screen_box.min().x(), screen_box.min().y(), screen_box.width(), screen_box.height()); paint->drawImage(rect, qimg); } else { MainWidget::renderGeoreferencedImage(scale_out, i, paint, has_csv, qimg, screen_box, region_out, drawn_already); } } // End loop through input images // sw1.stop(); // vw_out() << "Render time (seconds): " << sw1.elapsed_seconds() << "\n"; return; } // End function drawImage() // Draw irregular xyz data to be plotted at (x, y) location with z giving // the intensity. May be colorized. // TODO(oalexan1): There is a bug now. Need to record the screen pixels // at which drawScatteredData() was called, and then not draw over them. // See the caller of this function. // It sounds like your problem would be best solved by rendering the widget to a // pixmap (within the paint event), and then drawing that pixmap to the screen // in the paint event. This way, you can draw the scattered data to the pixmap, // and it will be preserved across paint events. // https://stackoverflow.com/questions/13058669/how-to-obtain-the-frame-buffer-from-within-qwidgets-paintevent void MainWidget::drawScatteredData(QPainter* paint, int image_index, vw::Vector2 const& bounds_override) { int r = asp::stereo_settings().plot_point_radius; // Use caller-provided joint bounds when valid, otherwise compute locally double min_val = 0.0, max_val = 0.0; // will change if (bounds_override[0] < bounds_override[1]) { min_val = bounds_override[0]; max_val = bounds_override[1]; } else if (asp::stereo_settings().min < asp::stereo_settings().max) { min_val = asp::stereo_settings().min; max_val = asp::stereo_settings().max; } else { findRobustBounds(app_data.images[image_index].scattered_data, min_val, max_val); } vw::Colormap colormap = buildColormap(app_data.images[image_index].colormap); for (size_t pt_it = 0; pt_it < app_data.images[image_index].scattered_data.size(); pt_it++) { auto const& P = app_data.images[image_index].scattered_data[pt_it]; vw::Vector2 world_P = app_data.proj2world(subvector(P, 0, 2), image_index); Vector2 screen_P = world2screen(world_P); QPoint Q(screen_P.x(), screen_P.y()); // Scale the intensity to [0, 1] double s = (P[2] - min_val) / (max_val - min_val); if (max_val <= min_val) s = 0.0; // degenerate case if (s > 1.0) s = 1.0; if (s < 0.0) s = 0.0; QColor c; if (app_data.images[image_index].colorize) { // Get the color from the colormap PixelRGB v = colormap(s).child(); c = QColor(v[0], v[1], v[2]); } else { // Grayscale color s = round(255.0 * s); c = QColor(s, s, s); } // Draw the ball paint->setPen(QPen(c)); paint->setBrush(QBrush(c)); paint->drawEllipse(Q, r, r); } return; } void MainWidget::updateCurrentMousePosition() { m_curr_world_pos = screen2world(m_curr_pixel_pos); } vw::BBox2 MainWidget::current_view() const { return m_current_view; } void MainWidget::zoomToRegion(vw::BBox2 const& region) { if (region.empty()) { popUp("Cannot zoom to empty region."); return; } double ratio = double(m_window_width) / double(m_window_height); m_current_view = vw::geometry::expandBoxToRatio(region, ratio); refreshPixmap(); } // -------------------------------------------------------------- // MainWidget Event Handlers // -------------------------------------------------------------- void MainWidget::refreshPixmap() { // This is an expensive function. It will completely redraw // what is on the screen. For that reason, don't draw directly on // the screen, but rather into m_pixmap, which we use as a cache. // If just tiny redrawings are necessary, such as updating the // rubberband, simply pull the view from this cache, // and update the rubberband on top of it. This technique // is a well-known design pattern in Qt. if (asp::stereo_settings().zoom_all_to_same_region && m_can_emit_zoom_all_signal) { m_can_emit_zoom_all_signal = false; emit zoomAllToSameRegionSignal(m_beg_image_id); // Now we call the parent, which will set the zoom window, // and call back here for all widgets. return; } m_pixmap = QPixmap(size()); m_pixmap.fill(m_backgroundColor); QPainter paint; paint.begin(&m_pixmap); MainWidget::drawImage(&paint); paint.end(); // Make sure to end the painting session // Invokes MainWidget::PaintEvent(). This will draw the pixmap on the screen, // and draw the rubberband, interest points, etc. on top of it. update(); return; } void MainWidget::paintEvent(QPaintEvent * /* event */) { if (m_firstPaintEvent) { // This will be called the very first time the display is // initialized. We will paint into the pixmap, and // then display the pixmap on the screen. m_firstPaintEvent = false; refreshPixmap(); } // Note that we draw from the cached pixmap, instead of redrawing // the image from scratch. QPainter paint(this); paint.drawPixmap(0, 0, m_pixmap); QColor rubberBandColor = QColor("yellow"); QColor cropWinColor = QColor("red"); std::string polyColorStr = m_polyColor; QColor polyColor = QColor(polyColorStr.c_str()); // We will color the rubberband in the crop win color if we are // in crop win mode. if (m_cropWinMode) paint.setPen(cropWinColor); else paint.setPen(rubberBandColor); // Draw the rubberband. We adjust by subtracting 1 from right and // bottom corner below to be consistent with updateRubberBand(), as // rect.bottom() is rect.top() + rect.height()-1. paint.drawRect(m_rubberBand.normalized().adjusted(0, 0, -1, -1)); // Draw the stereo crop window. Note that the stereo crop window // may exist independently of whether the rubber band exists. if (!m_stereoCropWin.empty()) { // TODO(oalexan1): Is this logic redundant given the block below? QRect R = bbox2qrect(world2screen(m_stereoCropWin)); paint.setPen(cropWinColor); paint.drawRect(R.normalized().adjusted(0, 0, -1, -1)); } // If we allow multiple selection windows for (size_t win = 0; win < m_selectionRectangles.size(); win++) { QRect R = bbox2qrect(world2screen(m_selectionRectangles[win])); paint.setPen(cropWinColor); paint.drawRect(R.normalized().adjusted(0, 0, -1, -1)); // Bugfix for when the selection rectangle is too small to be seen // by the user. We draw a small circle. if (R.width() < 2 && R.height() < 2) { paint.setPen(cropWinColor); paint.setBrush(cropWinColor); // Find Qrect upper-left-corner int x0 = R.x() + R.width()/2; int y0 = R.y() + R.height()/2; int len = 2; paint.drawEllipse(x0, y0, 2*len, 2*len); } } // TODO(oalexan1): All the logic below must be in its own function, // called for example plotPolygons(). // When deleting vertices need to use a georef as well. bool plotPoints = false, plotEdges = true, plotFilled = false; int drawVertIndex = 0; bool isPolyClosed = false; std::string layer = ""; // Plot the polygonal line which we are profiling if (m_profile.mode) { vw::geometry::dPoly poly; poly.appendPolygon(m_profile.x.size(), vw::geometry::vecPtr(m_profile.x), vw::geometry::vecPtr(m_profile.y), isPolyClosed, polyColorStr, layer); bool showIndices = false; MainWidget::plotPoly(plotPoints, plotEdges, plotFilled, showIndices, m_lineWidth, drawVertIndex, polyColor, paint, poly); } // TODO(oalexan1): Should the persistent polygons be drawn // as part of the drawImage() call? That will be a lot more efficient // than being redrawn any time the mouse moves, etc. But then how to handle // polygons being edited? MainWidget::plotPolys(paint); // Call another function to handle drawing the interest points // This drawing is expensive as it happens every time paintEvent() // is called, which is is countless times when the mouse is // dragged, for example. But such a high refresh rate may be // necessary for editing interest point matches and polygons. // Something clever is needed, such as putting polygons and interest // points which are not modified in refreshPixmap() which is called rarely, // and here putting only the actively modified elements. For now, // editing of ip is not allowed for viewing pairwise matches, so those // ip are drawn in refreshPixmap() if (asp::stereo_settings().view_matches || asp::stereo_settings().pairwise_matches || asp::stereo_settings().pairwise_clean_matches) { if (m_end_image_id - m_beg_image_id > 1) { asp::stereo_settings().view_matches = false; popUp("Images must be side-by-side to view/edit matches."); emit toggleViewMatchesSignal(); } else { m_match_mgr.drawInterestPoints(&paint, this, m_beg_image_id, m_base_image_id, m_window_width, m_window_height); } } } // end paint event // Call paintEvent() on the edges of the rubberband. // Use a margin wider than 1 pixel to account for HiDPI/Retina displays // where devicePixelRatio > 1. void MainWidget::updateRubberBand(QRect & R) { QRect rect = R.normalized(); if (rect.width() > 0 || rect.height() > 0) { int w = devicePixelRatio() + 1; update(rect.left() - w, rect.top() - w, rect.width() + 2*w, w*2); update(rect.left() - w, rect.top() - w, w*2, rect.height() + 2*w); update(rect.left() - w, rect.bottom() - w, rect.width() + 2*w, w*2); update(rect.right() - w, rect.top() - w, w*2, rect.height() + 2*w); } } // Convert a length in pixels to a length in world coordinates double MainWidget::pixelToWorldDist(double pd) { Vector2 p = screen2world(Vector2(0, 0)); Vector2 q = screen2world(Vector2(pd, 0)); return norm_2(p-q); } void MainWidget::viewMatches() { // Complain if there are multiple images and matches was turned on if ((m_end_image_id - m_beg_image_id != 1) && asp::stereo_settings().view_matches) { asp::stereo_settings().view_matches = false; popUp("Must have the images side-by-side to view/edit interest point matches."); emit toggleViewMatchesSignal(); return; } update(); // redraw matches on top of existing images } void MainWidget::addMatchPoint() { if (m_beg_image_id >= static_cast(m_match_mgr.m_matchlist.getNumImages())) { popUp("Number of existing matches is corrupted. Cannot add matches."); return; } if (m_end_image_id - m_beg_image_id != 1) { asp::stereo_settings().view_matches = false; popUp("Must have the images side-by-side to view/edit interest point matches."); emit toggleViewMatchesSignal(); return; } if (!asp::stereo_settings().view_matches) { popUp("Must turn on viewing matches from the menu to add interest point matches."); emit toggleViewMatchesSignal(); return; } m_match_mgr.m_editingMatches = true; // Convert mouse coords to world coords then image coords. Vector2 world_coord = screen2world(Vector2(m_mousePrsX, m_mousePrsY)); Vector2 P = app_data.world2image_trans(world_coord, m_base_image_id); // Try to add the new IP. bool is_good = m_match_mgr.m_matchlist.addPoint(m_beg_image_id, ip::InterestPoint(P.x(), P.y())); if (!is_good) { popUp(std::string("Add matches by adding a point in the left-most ") + "image and corresponding matches in the other images left to right. " + "Cannot add this match."); return; } // Must refresh the matches in all the images, not just this one. // Will keep the zoom level. emit updateMatchesSignal(); } // We cannot delete match points unless all images have the same number of them. void MainWidget::deleteMatchPoint() { if (m_end_image_id - m_beg_image_id != 1) { popUp("Must have just one image in each window to delete interest point matches."); return; } if (!asp::stereo_settings().view_matches) { popUp("Must turn on viewing matches from the menu to delete interest point matches."); emit toggleViewMatchesSignal(); return; } if (m_match_mgr.m_matchlist.getNumPoints() == 0) { popUp("No matches to delete."); return; } // Find the closest match to this point. Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY)); P = app_data.world2image_trans(P, m_base_image_id); double dist_limit = MATCH_POINT_DISTANCE_LIMIT; int min_index = m_match_mgr.m_matchlist.findNearestMatchPoint(m_beg_image_id, P, dist_limit); if (min_index < 0) { popUp("Did not find a nearby match to delete."); return; } m_match_mgr.m_editingMatches = true; bool result = false; try { result = m_match_mgr.m_matchlist.deletePointAcrossImages(min_index); } catch (std::exception const& e) { popUp(e.what()); return; } if (result) { // Must refresh the matches in all the images, not just this one if (asp::stereo_settings().view_matches) { // Will keep the zoom level emit updateMatchesSignal(); } else { // Will reset the layout before continuing with matches asp::stereo_settings().view_matches = true; emit toggleViewMatchesSignal(); } } } // Delete the selections that contain the current point void MainWidget::deleteSelection() { Vector2 P = screen2world(Vector2(m_mousePrsX, m_mousePrsY)); // The main crop win if (m_stereoCropWin.contains(P)) { QRect R = bbox2qrect(world2screen(m_stereoCropWin)); updateRubberBand(R); // mark that later we should redraw this polygonal line m_stereoCropWin = BBox2(); } std::vector curr_rects; for (size_t it = 0; it < m_selectionRectangles.size(); it++) { if (!m_selectionRectangles[it].contains(P)) { curr_rects.push_back(m_selectionRectangles[it]); } else { QRect R = bbox2qrect(world2screen(m_selectionRectangles[it])); updateRubberBand(R); // mark that later we should redraw this polygonal line } } m_selectionRectangles = curr_rects; return; } // Hide images not intersecting given selected region void MainWidget::hideImagesNotInRegion() { if (!m_chooseFiles) return; if (m_stereoCropWin.empty()) { popUp("Must select a region with Control-Mouse before invoking this."); return; } for (int j = m_beg_image_id; j < m_end_image_id; j++) { int image_it = m_filesOrder[j]; std::string fileName = app_data.images[image_it].name; BBox2i image_box = app_data.world2image_trans(m_stereoCropWin, image_it); image_box.crop(BBox2(0, 0, app_data.images[image_it].img().cols(), app_data.images[image_it].img().rows())); if (image_box.empty()) m_chooseFiles->hide(fileName); else m_chooseFiles->unhide(fileName); } refreshPixmap(); return; } // Show the current image threshold, and allow the user to change it. void MainWidget::setThreshold() { std::ostringstream oss; oss.precision(17); oss << m_threshold.value; std::string imageThresh = oss.str(); bool ans = getStringFromGui(this, "Image threshold", "Image threshold", imageThresh, imageThresh); if (!ans) return; double thresh = atof(imageThresh.c_str()); MainWidget::setThreshold(thresh); } void MainWidget::setThreshold(double thresh) { int non_poly_image = 0; int num_non_poly_images = 0; for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) { if (!app_data.images[image_iter].m_isPoly && !app_data.images[image_iter].m_isCsv) num_non_poly_images++; non_poly_image = image_iter; } if (num_non_poly_images > 1) { if (std::isnan(asp::stereo_settings().nodata_value)) popUp("Must have just one image in each window to set the image threshold."); else popUp("Must have just one image in each window to use the nodata value option."); return; } m_threshold.value = thresh; vw_out() << "Image threshold for " << app_data.images[non_poly_image].name << ": " << m_threshold.value << std::endl; } // TODO(oalexan1): Each image must know its threshold double MainWidget::getThreshold() const { return m_threshold.value; } // Set the azimuth and elevation for hillshaded images void MainWidget::setHillshadeParams() { std::ostringstream oss; oss.precision(17); oss << m_hillshade.azimuth << " " << m_hillshade.elevation << std::endl; std::string azimuthElevation = oss.str(); bool ans = getStringFromGui(this, "Hillshade azimuth and elevation", "Hillshade azimuth and elevation", azimuthElevation, azimuthElevation); if (!ans) return; std::istringstream iss(azimuthElevation); double a, e; if (! (iss >> a >> e)) { popUp("Could not read the hillshade azimuth and elevation values."); return; } m_hillshade.azimuth = a; m_hillshade.elevation = e; MainWidget::maybeGenHillshade(); refreshPixmap(); vw_out() << "Hillshade azimuth and elevation for " << app_data.images[m_beg_image_id].name << ": " << m_hillshade.azimuth << ' ' << m_hillshade.elevation << "\n"; } // Save the current view to a file void MainWidget::saveScreenshot() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save screenshot"), "./screenshot.bmp", tr("(*.bmp *.xpm)")); if (fileName.toStdString() == "") return; QImageWriter writer(fileName); if (!writer.write(m_pixmap.toImage())) { popUp(writer.errorString().toStdString()); } } void MainWidget::setCropWin(vw::BBox2 const& stereoCropWin) { m_stereoCropWin = stereoCropWin; } } // namespace asp ================================================ FILE: src/asp/GUI/MainWidget.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file MainWidget.h // // A widget showing images and vector data // #ifndef __STEREO_GUI_MAIN_WIDGET_H__ #define __STEREO_GUI_MAIN_WIDGET_H__ // ASP #include #include #include #include // Vision Workbench #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Qt #include #include #include // Qwt #include #include #include #include #include #include #include #include #include class QMouseEvent; class QWheelEvent; class QPoint; class QResizeEvent; class QTableWidget; class QTableWidgetItem; class QContextMenuEvent; class QStylePainter; namespace asp { // Forward declarations class ChooseFilesDlg; class WidgetMenuMgr; // This class handles user interaction with the a single image pane. class MainWidget: public QwtScaleWidget, public WidgetBase { Q_OBJECT public: // Constructors/Destructor MainWidget(QWidget *parent, vw::GdalWriteOptions const& opt, int beg_image_id, int end_image_id, int base_image_id, asp::AppData & app_data, std::string & output_prefix, // will be aliased asp::MatchPointMgr & match_mgr, ChooseFilesDlg * chooseFiles, bool & allowMultipleSelections); // alias virtual ~MainWidget(); bool get_crop_win(QRect & win); // Set a default size for this widget. This is usually overridden // by parent views. virtual QSize sizeHint () const { return QSize(500,500); } // Image Manipulation Methods void zoom (double scale); void viewMatches(); void setEditingMatches(bool editingMatches) { m_match_mgr.m_editingMatches = editingMatches; } bool getEditingMatches() const { return m_match_mgr.m_editingMatches; } void setThreshMode(bool turnOn) { m_threshold.calcMode = turnOn; } void plotProfile(std::vector const& images, std::vector const& profileX, std::vector const& profileY); void drawOneVertex(int x0, int y0, QColor color, int lineWidth, int drawVertIndex, QPainter &paint); void plotPolys(QPainter & paint); void plotPoly(bool plotPoints, bool plotEdges, bool plotFilled, bool showIndices, int lineWidth, int drawVertIndex, // 0 is a good choice here QColor const& color, QPainter &paint, vw::geometry::dPoly currPoly); // Make a local copy on purpose //void plotProfilePolyLine(QStylePainter & paint, void plotProfilePolyLine(QPainter & paint, std::vector const& profileX, std::vector const& profileY); void setThreshold(double thresh); // Set the image threshold double getThreshold() const; // Get the image threshold void setLineWidth(int lineWidth); // Set the line width for polygons int getLineWidth() const; // Get the line width for polygons void setPolyColor(std::string const& polyColor); // Set the color of polygons std::string getPolyColor() const; // Get the color of polygons vw::BBox2 current_view() const; void zoomToRegion (vw::BBox2 const& region); void setHillshadeMode(bool hillshade_mode); vw::BBox2 firstImagePixelBox() const; vw::BBox2 firstImageWorldBox(vw::BBox2 const& image_box) const; void setWorldBox(vw::BBox2 const& world_box); vw::BBox2 worldBox() const; void keyPressEvent(QKeyEvent *event); void setCropWin(vw::BBox2 const& stereoCropWin); bool & m_allowMultipleSelections; // alias, controlled from MainWindow for all widgets bool m_polyEditMode; signals: void toggleViewMatchesSignal (); void recreateLayoutSignal (); void updateMatchesSignal (); // this one will do less work and keep the zoom level void uncheckProfileModeCheckbox (); void uncheckPolyEditModeCheckbox(); void zoomAllToSameRegionSignal (int); public slots: void sizeToFit(); void showFilesChosenByUser (int rowClicked, int columnClicked); void zoomToImageInTableCell(int rowClicked, int columnClicked); void hideShowAll_widgetVersion(); void customMenuRequested(QPoint pos); void viewUnthreshImages(); void viewThreshImages (bool refresh_pixmap); void viewHillshadedImages(bool hillshade_mode); void addMatchPoint (); // Add a new interest point (from right click menu) void deleteMatchPoint (); // Delete an interest point (from right click menu) void setThreshold (); // Set change image threshold (from right click menu) void setHillshadeParams (); // Set the azimuth and elevation for hillshaded images. void toggleHillshadeImageRightClick(); // Turn on/off hillshading on right-click on image void toggleHillshadeFromImageList(int imageIndex); // Toggle hillshade by right-click on image list void refreshHillshade (); // Update the display if the state of hillshading changed. void bringImageOnTopSlot (int imageIndex); // Show this image on top of other images. void pushImageToBottomSlot (int imageIndex); // Show all other images on top of this void zoomToImage (int imageIndex); // Zoom to have this image in full view. void changePolyColor (int imageIndex); // Change the color of given set of polygons void allowMultipleSelections(); // Allow the user to select multiple regions void deleteSelection (); // Delete an area selected with the mouse at current point void hideImagesNotInRegion (); // Hide images not intersecting a given region void saveVectorLayerAsShapeFile(); // Save polygons in current layer as shapefile void saveVectorLayerAsTextFile(); // Save polygons in current layer as a text file bool contourImage (); // Contour an image at a specified threshold void setProfileMode (bool profile_mode); // Turn on and off the 1D profile tool void setPolyEditMode(bool polyEditMode, bool refresh); // Turn on and off the vector layer drawing void deleteVertex (); // Delete a vertex from a vector layer void deleteVertices (); // Delete poly vertices in selected region void insertVertex (); // Insert an intermediate vertex at right-click void mergePolys (); // Merge existing polygons void saveScreenshot (); // Save a screenshot of the current imagery void refreshPixmap(); // Draw the image protected: // Setup bool eventFilter(QObject *obj, QEvent *E); void resizeEvent(QResizeEvent*); // Event handlers void paintEvent (QPaintEvent *event); void mousePressEvent (QMouseEvent *event); void mouseReleaseEvent (QMouseEvent *event); void mouseMoveEvent (QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void wheelEvent (QWheelEvent *event); void enterEvent (QEvent *event); void leaveEvent (QEvent *event); void contextMenuEvent (QContextMenuEvent *event); private slots: void handleZoomTimeout(); // Slot for the zoom timer private: class ProfilePlotter : public QwtPlot { public: ProfilePlotter(MainWidget * parent): QwtPlot(NULL), m_parent(parent) {} ~ProfilePlotter() {} private: void closeEvent(QCloseEvent *) { // Signal to the parent that the window got closed. // Turn off profiling. bool profile_mode = false; m_parent->setProfileMode(profile_mode); } MainWidget * m_parent; }; vw::GdalWriteOptions m_opt; // Handle to parent GUI panel used to select which of the multiple "owned" // images should be currently displayed. // - Null if there is only one image. ChooseFilesDlg * m_chooseFiles; std::vector m_filesOrder; // The order the images are drawn in. std::string & m_output_prefix; // alias // Hillshade parameters struct HillshadeSettings { double azimuth = 0.0; double elevation = 0.0; }; HillshadeSettings m_hillshade; asp::MatchPointMgr & m_match_mgr; bool m_firstPaintEvent; QRect m_emptyRubberBand; QRect m_rubberBand; vw::BBox2 m_stereoCropWin; std::vector m_selectionRectangles; // If we are selecting a crop win to do stereo in bool m_cropWinMode; // Profile tool state struct ProfileState { bool mode = false; std::vector x, y; // indices in the image to profile std::vector valsX, valsY; // index and pixel value ProfilePlotter *plot = nullptr; // the profile window }; ProfileState m_profile; // Use double buffering: draw to a pixmap first, refresh it only // if really necessary, and display it when paintEvent is called. QPixmap m_pixmap; // Default color when polys are created from scratch std::string m_polyColor; std::map m_perImagePolyColor; int m_lineWidth; // Mouse position vw::Vector2 m_curr_pixel_pos, m_curr_world_pos; // Mouse press position int m_mousePrsX, m_mousePrsY; // Right-click context menu std::unique_ptr m_wid_menu_mgr; // Threshold state struct ThresholdState { double value = -std::numeric_limits::max(); bool calcMode = false; }; ThresholdState m_threshold; bool m_can_emit_zoom_all_signal; // Drawing is driven by QPaintEvent, which calls out to drawImage() void drawImage(QPainter* paint); // Draw irregular xyz data to be plotted at (x, y) location with z giving // the intensity. May be colorized. void drawScatteredData(QPainter* paint, int image_index, vw::Vector2 const& bounds_override); // Zoom debouncing QTimer *m_zoomTimer; // Owned by Qt's parent-child mechanism double m_accumulatedZoomTicks; private: // Helper functions for event handlers void handlePixelClick(int mouseRelX, int mouseRelY); void handleCropWin(); void zoomInOut(int mouseRelX, int mouseRelY); void adjustForEditMatchPoint(); bool handleMatchPointMove(int mouseMoveX, int mouseMoveY); bool handlePolyVertexMove(int mouseMoveX, int mouseMoveY); void handleRubberBandDrag(int mouseMoveX, int mouseMoveY); void handleThresholdClick(int mouseRelX, int mouseRelY); void handlePolyEditClick(int mouseRelX, int mouseRelY); void renderGeoreferencedImage(double scale_out, int image_index, QPainter* paint, bool has_csv, QImage const& sourceImage, vw::BBox2i const& screen_box, vw::BBox2i const& region_out, vw::ImageView & screen_image); void updateCurrentMousePosition(); void updateRubberBand(QRect & R); void maybeGenHillshade(); void showImage (std::string const& image_name); void bringImageOnTop (int image_index); void pushImageToBottom(int image_index); void updateFilesToHide(); // For polygon drawing int m_polyLayerIndex; // which of the current images owns the poly vector layer vw::Vector2 m_startPix; // The first poly vertex being drawn in world coords std::vector m_currPolyX, m_currPolyY; int m_editClipIndex, m_editPolyVecIndex, m_editIndexInCurrPoly, m_editVertIndexInCurrPoly; // Points closer than this are in some situations considered equal int m_pixelTol; QColor m_backgroundColor; double pixelToWorldDist(double pd); void appendToPolyVec (vw::geometry::dPoly const& P); void addPolyVert (double px, double py); }; // Build a colormap from a style string, with fallback vw::Colormap buildColormap(std::string const& colormap_style); } // namespace asp #endif // __STEREO_GUI_MAIN_WIDGET_H__ ================================================ FILE: src/asp/GUI/MainWindow.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file MainWindow.cc // // The stereo_gui main window class. // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace asp; using namespace vw; namespace fs = boost::filesystem; // Need this class to manage what happens when keys are pressed while // the ChooseFilesDlg table is in focus. Do not let it accept key // strokes, which just end up editing the table entries, but rather // pass them to the main program event filter. class chooseFilesFilterDelegate: public QStyledItemDelegate { public: chooseFilesFilterDelegate(QObject *filter, QObject *parent = 0): QStyledItemDelegate(parent), filter(filter) {} virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QWidget *editor = QStyledItemDelegate::createEditor(parent, option, index); editor->installEventFilter(filter); return editor; } private: QObject *filter; }; bool MainWindow::sanityChecks(int num_images) { if (num_images <= 0) { popUp("No valid images to display."); return false; } if (stereo_settings().dem_file == "" && stereo_settings().gcp_file != "" && !fs::exists(stereo_settings().gcp_file)) { popUp("The GCP file does not exist. If desired to create it, please specify --dem-file."); return false; } if (stereo_settings().gcp_sigma <= 0) { popUp("The GCP sigma must be positive."); return false; } // The dem file must exist if not empty. Must also have a georef. if (stereo_settings().dem_file != "") { try { DiskImageView dem(stereo_settings().dem_file); } catch (...) { popUp("The DEM file does not exist or is not a valid image file."); return false; } vw::cartography::GeoReference georef; bool has_georef = vw::cartography::read_georeference(georef, stereo_settings().dem_file); if (!has_georef) { popUp("The DEM file does not have a georeference. Please provide one."); return false; } } // This is for the workflow of creating GCP from a DEM and images bool gcp_exists = !stereo_settings().gcp_file.empty() && fs::exists(stereo_settings().gcp_file); if (gcp_exists && stereo_settings().dem_file != "") { popUp("A DEM file and GCP file were specified. Then, the GCP file passed in " "must not exist, since it is supposed to be created based on the DEM."); return false; } if (int(!stereo_settings().match_file.empty()) + int(!stereo_settings().vwip_files.empty()) + int(gcp_exists) > 1) { // We make an exception for the non-existing GCP file, per the above popUp("Cannot load at the same time more than one of: matches, GCP, or .vwip files."); return false; } m_saved_gcp_and_ip = true; if (MainWindow::creatingGcp()) m_saved_gcp_and_ip = false; // will need to save GCP and IP files // If a gcp file was passed in, we will interpret those as matches if (stereo_settings().gcp_file != "") asp::stereo_settings().view_matches = true; // If .vwip files were passed in, we will interpret those as matches. if (!stereo_settings().vwip_files.empty()) { asp::stereo_settings().view_matches = true; if (app_data.image_files.size() != stereo_settings().vwip_files.size()) { popUp("There must be as many .vwip files as images."); return false; } } // If a match file was explicitly specified, use it. if (stereo_settings().match_file != "") { if (app_data.image_files.size() != 2) { popUp("The --match-file option only works with two valid input images."); return false; } asp::stereo_settings().view_matches = true; } int num = int(asp::stereo_settings().view_matches) + int(asp::stereo_settings().pairwise_matches) + int(asp::stereo_settings().pairwise_clean_matches); if (num > 1) { popUp("Conflicting options for viewing match files were specified."); return false; } // Cannot show matches when viewing as georeferenced images if (num > 0) app_data.use_georef = false; if (num > 0 && !stereo_settings().zoom_proj_win.empty()) { popUp("Cannot zoom to proj win when showing matches."); return false; } // Need at least two images to view matches, but make an exception for vwip files if (num_images <= 1 && stereo_settings().vwip_files.empty() && (asp::stereo_settings().view_matches || asp::stereo_settings().pairwise_matches || asp::stereo_settings().pairwise_clean_matches) && stereo_settings().gcp_file.empty()) { popUp("Cannot view matches if there is at most one image."); return false; } if (asp::stereo_settings().plot_point_radius <= 0) { popUp("The value --plot-point-radius must be positive."); return false; } if (asp::stereo_settings().preview && sideBySideWithDialog()) { popUp("Cannot have both the preview mode and side-by-side images."); return false; } if (asp::stereo_settings().no_georef && asp::stereo_settings().use_georef) { popUp("Cannot have both the no-georef and use-georef options."); return false; } return true; } MainWindow::MainWindow(vw::GdalWriteOptions const& opt, std::vector const& images, std::string& output_prefix, int grid_cols, vw::Vector2i const& window_size, bool single_window, bool use_georef, std::vector> const& properties, int argc, char ** argv): m_opt(opt), m_output_prefix(output_prefix), m_widRatio(0.3), m_chooseFiles(NULL), m_grid_cols(grid_cols), m_allowMultipleSelections(false), m_argc(argc), m_argv(argv), m_show_two_images_when_side_by_side_with_dialog(true), m_cursor_count(0), m_saved_gcp_and_ip(true), m_match_mgr(app_data) { // Initialize m_match_mgr with app_data // Window size resize(window_size[0], window_size[1]); // Window title std::string window_title = "Stereo GUI"; this->setWindowTitle(window_title.c_str()); // The images and other data std::vector local_images = images; // may change later std::vector world_to_cam; std::map optical_offsets; // When loading an NVM file, will assume we want to inspect pairwise // matches. Also set the images from the NVM file. It is assumed // that the interest points to be loaded are not shifted relative to // the optical center. Analogous logic happens for ISIS cnet files. if (!asp::stereo_settings().nvm.empty() && !asp::stereo_settings().isis_cnet.empty()) { popUp("Cannot load both an ISIS cnet and an NVM file."); exit(1); } if (!asp::stereo_settings().nvm.empty()) { asp::stereo_settings().pairwise_matches = true; vw_out() << "Reading NVM file: " << asp::stereo_settings().nvm << "\n"; try { asp::readNvmAsCnet(asp::stereo_settings().nvm, std::vector(), asp::stereo_settings().nvm_no_shift, m_match_mgr.m_cnet, world_to_cam, optical_offsets); } catch (const std::exception& e) { popUp(e.what()); exit(1); } if (!local_images.empty()) popUp("Will ignore the images passed in and will use the nvm file only."); local_images = m_match_mgr.m_cnet.get_image_list(); // overwrite local_images } if (!asp::stereo_settings().isis_cnet.empty()) { asp::stereo_settings().pairwise_matches = true; vw::vw_out() << "Reading ISIS control network: " << asp::stereo_settings().isis_cnet << "\n"; try { asp::IsisCnetData isisCnetData; // Part of the API, unused here asp::loadIsisCnet(asp::stereo_settings().isis_cnet, local_images, m_match_mgr.m_cnet, isisCnetData); // outputs } catch (const std::exception& e) { popUp(e.what()); exit(1); } } // Collect only the valid images asp::filterImages(local_images); // Set the default lowest resolution subimage size. Use a shorthand below. // Must happen before images are loaded. int & lowres_size = asp::stereo_settings().lowest_resolution_subimage_num_pixels; bool delay = asp::stereo_settings().preview; if (lowres_size <= 0) { if (delay) { // To avoid creating many small subimages. But then the displaying is slow. lowres_size = LOWRES_SIZE_PREVIEW; } else { lowres_size = LOWRES_SIZE_DEFAULT; } } // All the data is stored and shared via with object app_data = asp::AppData(opt, use_georef, properties, local_images); // Ensure the inputs are reasonable int num_images = app_data.images.size(); if (!MainWindow::sanityChecks(num_images)) forceQuit(); // For being able to choose which files to show/hide m_chooseFiles = new ChooseFilesDlg(this); m_chooseFiles->chooseFiles(app_data.image_files); // See note at chooseFilesFilterDelegate m_chooseFiles->getFilesTable()->setItemDelegate(new chooseFilesFilterDelegate(this)); m_chooseFiles->getFilesTable()->installEventFilter(this); QObject::connect(m_chooseFiles->getFilesTable(), SIGNAL(cellClicked(int, int)), this, SLOT(perhapsCreateLayout(int, int))); QObject::connect(m_chooseFiles->getFilesTable()->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(hideShowAll_windowVersion())); m_match_mgr.init(num_images); // By default, show the images in one row if (m_grid_cols <= 0) m_grid_cols = std::numeric_limits::max(); // If no custom view mode, this is the default m_view_type = VIEW_SIDE_BY_SIDE; // Preview mode normally implies a single window. if (asp::stereo_settings().preview && !sideBySideWithDialog()) single_window = true; if (m_grid_cols > 0 && m_grid_cols < int(num_images) && !sideBySideWithDialog()) m_view_type = VIEW_AS_TILES_ON_GRID; if (single_window && !sideBySideWithDialog()) m_view_type = VIEW_IN_SINGLE_WINDOW; m_view_type_old = m_view_type; // initialize this // Set up the basic layout of the window and its menus m_win_menu_mgr.init(this); // Must happen after menus are created createLayout(); } // Wrap a widget in a horizontal layout with a colorbar on the right. // Returns the wrapper widget, or the original widget if bounds are invalid. // The colormap style is taken from the first image in the range. QWidget* createColorbarLayout(QWidget* widget, double min_val, double max_val, std::string const& colormap_style) { if (min_val >= max_val) return widget; // Parse the colormap std::map lut_map; vw::parseColorStyle(colormap_style, lut_map); // Build a QwtLinearColorMap from the LUT auto firstC = lut_map.begin()->second; auto lastC = lut_map.rbegin()->second; QwtLinearColorMap *cmap = new QwtLinearColorMap(QColor(firstC[0], firstC[1], firstC[2]), QColor(lastC[0], lastC[1], lastC[2])); for (auto it = lut_map.begin(); it != lut_map.end(); it++) { if (it->first == 0.0 || it->first == 1.0) continue; auto const& c = it->second; cmap->addColorStop(it->first, QColor(c[0], c[1], c[2])); } // Create the colorbar widget QwtScaleWidget *colorbar = new QwtScaleWidget(QwtScaleDraw::RightScale); QwtInterval interval(min_val, max_val); colorbar->setColorBarEnabled(true); colorbar->setColorBarWidth(30); colorbar->setColorMap(interval, cmap); QwtLinearScaleEngine engine; colorbar->setScaleDiv( engine.divideScale(min_val, max_val, 8, 5)); // Wrap in a horizontal layout QWidget *wrapper = new QWidget(); QHBoxLayout *hbox = new QHBoxLayout(wrapper); hbox->setContentsMargins(0, 0, 0, 0); hbox->setSpacing(0); hbox->addWidget(widget, 1); hbox->addWidget(colorbar, 0); return wrapper; } // Create a new central widget. Qt is smart enough to de-allocate // the previous widget and all of its children. void MainWindow::createLayout() { MainWindow::updateViewMenuEntries(); // We must cleanup the previous profiles before wiping the existing // widgets. There must be a better way of doing it. for (size_t wit = 0; wit < m_widgets.size(); wit++) { bool profile_mode = false; if (m_widgets[wit]) m_widgets[wit]->setProfileMode(profile_mode); } QWidget * centralWidget = new QWidget(this); setCentralWidget(centralWidget); QSplitter * splitter = new QSplitter(centralWidget); // Wipe the widgets from the array. Qt will automatically delete // the widgets when the time is right. m_widgets.clear(); // Note that the menus persist even when the layout changes // Show all images if switching to side-by-side view without a dialog if ((asp::stereo_settings().zoom_all_to_same_region || m_view_type == VIEW_SIDE_BY_SIDE || m_view_type == VIEW_AS_TILES_ON_GRID) && !sideBySideWithDialog()) m_chooseFiles->showAllImages(); // Set up the dialog for choosing files m_chooseFiles->setMaximumSize(int(m_widRatio*size().width()), size().height()); if (asp::stereo_settings().preview && !sideBySideWithDialog()) { // Show only the first image, unless it was decided somewhere else // another one image is to be shown. if (m_chooseFiles && m_chooseFiles->numShown() != 1) m_chooseFiles->setNumImagesToShow(1); } // When showing matches or other ways of showing images side-by-side, // automatically change the layout if (sideBySideWithDialog() || asp::stereo_settings().view_matches) { m_view_type = VIEW_SIDE_BY_SIDE; if (sideBySideWithDialog() && m_show_two_images_when_side_by_side_with_dialog) { // This must be triggered only when the tool starts or when switched // into sideBySideWithDialog() mode from the menu. Later the use // can change the number of images shown. m_chooseFiles->setNumImagesToShow(2); m_show_two_images_when_side_by_side_with_dialog = false; } } splitter->addWidget(m_chooseFiles); bool do_colorize = false; for (size_t i = 0; i < app_data.images.size(); i++) do_colorize = do_colorize || app_data.images[i].colorize || app_data.images[i].colorbar; bool delay = !asp::stereo_settings().nvm.empty() || !asp::stereo_settings().isis_cnet.empty() || asp::stereo_settings().preview; if (delay && do_colorize) { popUp("Cannot colorize images when using the preview mode or when " "loading an NVM or ISIS cnet file."); // This is hard to get right do_colorize = false; } // See if to show it. In a side-by-side view it is normally not needed size_t num_images = app_data.images.size(); bool showChooseFiles = ((m_view_type == VIEW_IN_SINGLE_WINDOW || sideBySideWithDialog()) && num_images > 1); m_chooseFiles->setVisible(showChooseFiles); if (m_view_type == VIEW_IN_SINGLE_WINDOW) { // Pass all images to a single MainWidget object. int beg_image_id = 0, end_image_id = app_data.images.size(); MainWidget * widget = new MainWidget(centralWidget, m_opt, beg_image_id, end_image_id, BASE_IMAGE_ID, app_data, m_output_prefix, m_match_mgr, m_chooseFiles, m_allowMultipleSelections); // Tell the widget if the poly edit mode and hillshade mode is on or not bool refresh = false; // Do not refresh prematurely widget->setPolyEditMode(m_win_menu_mgr.m_polyEditMode_action->isChecked(), refresh); m_widgets.push_back(widget); } else { // Each MainWidget object gets passed a single image for (size_t i = 0; i < app_data.images.size(); i++) { // Do not create hidden widgets, that really slows down the display when there // are many of them, but just a handful are needed. bool isHidden = (sideBySideWithDialog() && m_chooseFiles && m_chooseFiles->isHidden(app_data.images[i].name)); if (isHidden) continue; int beg_image_id = i, end_image_id = i + 1; MainWidget * widget = new MainWidget(centralWidget, m_opt, beg_image_id, end_image_id, BASE_IMAGE_ID, app_data, m_output_prefix, m_match_mgr, m_chooseFiles, m_allowMultipleSelections); m_widgets.push_back(widget); } } // Once all widgets zoom to same proj win, turn this off asp::stereo_settings().zoom_proj_win = BBox2(); // Put the images in a grid int num_widgets = m_widgets.size(); QGridLayout *grid = new QGridLayout(centralWidget); // By default, show the images side-by-side int grid_cols = std::numeric_limits::max(); if (m_view_type == VIEW_AS_TILES_ON_GRID) grid_cols = m_grid_cols; for (int i = 0; i < num_widgets; i++) { if (m_widgets[i] == NULL) continue; // Add the current widget int row = i / grid_cols; int col = i % grid_cols; // When --colorbar is set, wrap MainWidget + colorbar in a container QWidget* wid = m_widgets[i]; int begIdx = m_widgets[i] ? m_widgets[i]->m_beg_image_id : 0; int endIdx = m_widgets[i] ? m_widgets[i]->m_end_image_id : 0; if (m_widgets[i] && app_data.images[begIdx].colorbar) { vw::Vector2 bounds = calcJointBounds(app_data.images, begIdx, endIdx); wid = createColorbarLayout(m_widgets[i], bounds[0], bounds[1], app_data.images[begIdx].colormap); } grid->addWidget(wid, row, col); if (!m_widgets[i]) continue; // Only MainWidget type can be used below // Intercept this widget's request to view (or refresh) the matches in all // the widgets, not just this one's. connect(m_widgets[i], SIGNAL(toggleViewMatchesSignal()), this, SLOT(toggleViewMatches())); connect(m_widgets[i], SIGNAL(updateMatchesSignal()), this, SLOT(viewMatches())); connect(m_widgets[i], SIGNAL(uncheckProfileModeCheckbox()), this, SLOT(uncheckProfileModeCheckbox())); connect(m_widgets[i], SIGNAL(uncheckPolyEditModeCheckbox()), this, SLOT(uncheckPolyEditModeCheckbox())); connect(m_widgets[i], SIGNAL(zoomAllToSameRegionSignal(int)), this, SLOT(zoomAllToSameRegionAction(int))); connect(m_widgets[i], SIGNAL(recreateLayoutSignal()), this, SLOT(createLayout())); } QWidget *container = new QWidget(centralWidget); container->setLayout(grid); splitter->addWidget(container); // Set new layout QGridLayout *layout = new QGridLayout(centralWidget); layout->addWidget(splitter, 0, 0); centralWidget->setLayout(layout); if (asp::stereo_settings().view_matches) MainWindow::viewMatches(); if (asp::stereo_settings().pairwise_matches || asp::stereo_settings().pairwise_clean_matches) MainWindow::viewPairwiseMatchesOrCleanMatches(); double nodata_value = stereo_settings().nodata_value; if (!std::isnan(nodata_value)) { for (size_t i = 0; i < m_widgets.size(); i++) { if (!m_widgets[i]) continue; m_widgets[i]->setThreshold(nodata_value); bool refresh_pixmap = false; // Prepare everything but don't redraw yet m_widgets[i]->viewThreshImages(refresh_pixmap); } } // Refresh the menu checkboxes auto& wm = m_win_menu_mgr; wm.m_viewSingleWindow_action ->setChecked(m_view_type == VIEW_IN_SINGLE_WINDOW); wm.m_viewAllSideBySide_action ->setChecked(m_view_type == VIEW_SIDE_BY_SIDE && !asp::stereo_settings().view_several_side_by_side); wm.m_viewSeveralSideBySide_action ->setChecked(asp::stereo_settings().view_several_side_by_side); wm.m_viewAsTiles_action ->setChecked(m_view_type == VIEW_AS_TILES_ON_GRID); MainWindow::updateDisplayModeMenuEntries(); wm.m_viewGeoreferencedImages_action ->setChecked(app_data.use_georef); wm.m_overlayGeoreferencedImages_action ->setChecked(app_data.use_georef && (m_view_type == VIEW_IN_SINGLE_WINDOW)); wm.m_zoomAllToSameRegion_action ->setChecked(asp::stereo_settings().zoom_all_to_same_region); if (m_widgets.size() == 2 && num_images == 2 && asp::stereo_settings().left_image_crop_win != BBox2() && asp::stereo_settings().right_image_crop_win != BBox2()) { // Draw crop windows passed as arguments if (m_widgets[0]) m_widgets[0]->setCropWin(stereo_settings().left_image_crop_win); if (m_widgets[1]) m_widgets[1]->setCropWin(stereo_settings().right_image_crop_win); // Do this just once, on startup asp::stereo_settings().left_image_crop_win = BBox2(); asp::stereo_settings().right_image_crop_win = BBox2(); } if (asp::stereo_settings().zoom_all_to_same_region) { // See where the earlier viewable region ended up in the current world // coordinate system. A lot of things could have changed since then. BBox2 world_box; for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) { vw::BBox2 region = m_widgets[i]->worldBox(); world_box.grow(region); } } // Let this be the world box in all images. Later, during resizeEvent(), the // sizeToFit() function will be called which will use this box. for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->setWorldBox(world_box); } } return; } // In previewOrSideBySideWithDialog mode, checking/unchecking images has to result // in redisplay of selected ones. void MainWindow::perhapsCreateLayout(int row, int col) { if (m_chooseFiles && asp::stereo_settings().preview) { // If clicked on a cell, must show this image, and hide the rest int rows = m_chooseFiles->getFilesTable()->rowCount(); for (int row_it = 0; row_it < rows; row_it++) { if (row_it == row) m_chooseFiles->unhide(row_it); else m_chooseFiles->hide(row_it); } } if (previewOrSideBySideWithDialog()) createLayout(); } // When in sideBySideWithDialog mode, hide or show all images. Otherwise // this function does nothing, and hideShowAll_widgetVersion() gets called. void MainWindow::hideShowAll_windowVersion() { if (!sideBySideWithDialog()) { // The function hideShowAll_widgetVersion will be called, which // does not need to recreate the layout. return; } if (m_chooseFiles) m_chooseFiles->hideShowAll(); // This ensures we don't override how many images are shown m_show_two_images_when_side_by_side_with_dialog = false; createLayout(); } void MainWindow::resizeEvent(QResizeEvent *) { if (m_chooseFiles) m_chooseFiles->setMaximumSize(int(m_widRatio*size().width()), size().height()); } void MainWindow::closeEvent(QCloseEvent *) { forceQuit(); } bool MainWindow::editingMatches() const { // See if in the middle of editing of matches bool editing_matches = false; for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i] != NULL && m_widgets[i]->getEditingMatches()) editing_matches = true; } return editing_matches; } // We can create GCP when --gcp-file and --dem-file got specified, // and the GCP file does not exist yet. bool MainWindow::creatingGcp() const { return (stereo_settings().dem_file != "" && stereo_settings().gcp_file != "" && !fs::exists(asp::stereo_settings().gcp_file)); } void MainWindow::forceQuit() { // See if in the middle of creating GCP bool force_quit = false; if (!m_saved_gcp_and_ip) { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, "Quit", "GCP and IP matches were not saved. Quit?", QMessageBox::Yes|QMessageBox::No); if (reply != QMessageBox::Yes) return; // If we want to quit without saving GCP, will not pop up the dialog again force_quit = true; } // See if in the middle of editing of matches with unsaved matches if (!force_quit && MainWindow::editingMatches()) { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, "Quit", "Interest point matches were not saved. Quit?", QMessageBox::Yes|QMessageBox::No); if (reply != QMessageBox::Yes) return; } if (asp::stereo_settings().delete_temporary_files_on_exit) { std::set & tmp_files = asp::temporary_files().files; for (auto it = tmp_files.begin(); it != tmp_files.end() ; it++) { std::string file = *it; if (fs::exists(file)) { vw_out() << "Deleting: " << file << std::endl; fs::remove(file); } } } exit(0); // A fix for an older buggy version of Qt } // Zoom in/out of each image so that it fits fully within its allocated display area. // If we zoom all images to same region, zoom all to the union of display areas. void MainWindow::sizeToFit() { if (asp::stereo_settings().zoom_all_to_same_region) { BBox2 big_region; for (size_t i = 0; i < m_widgets.size(); i++) { if (!m_widgets[i]) continue; vw::BBox2 region = m_widgets[i]->worldBox(); big_region.grow(region); } for (size_t i = 0; i < m_widgets.size(); i++) { if (!m_widgets[i]) continue; m_widgets[i]->zoomToRegion(big_region); } }else{ // Full view for each individual image for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->sizeToFit(); } } } void MainWindow::zoomIn() { for (size_t i = 0; i < m_widgets.size(); i++) if (m_widgets[i]) m_widgets[i]->zoom(1.0/0.75); } void MainWindow::zoomOut() { for (size_t i = 0; i < m_widgets.size(); i++) if (m_widgets[i]) m_widgets[i]->zoom(0.75); } void MainWindow::viewSingleWindow() { bool single_window = m_win_menu_mgr.m_viewSingleWindow_action->isChecked(); if (single_window) { if (m_view_type != VIEW_IN_SINGLE_WINDOW) m_view_type_old = m_view_type; // back this up m_view_type = VIEW_IN_SINGLE_WINDOW; // Since we will view all in single window, can't select images with matches asp::stereo_settings().view_matches = false; setNoSideBySideWithDialog(); MainWindow::updateViewMenuEntries(); // Turn off zooming all images to same region if all are in the same window if (asp::stereo_settings().zoom_all_to_same_region) { asp::stereo_settings().zoom_all_to_same_region = false; setZoomAllToSameRegionAux(asp::stereo_settings().zoom_all_to_same_region); } }else{ if (m_view_type_old != VIEW_IN_SINGLE_WINDOW) m_view_type = m_view_type_old; // restore this else{ // nothing to restore to. Default to side by side. m_view_type = VIEW_SIDE_BY_SIDE; } } createLayout(); } void MainWindow::viewAllSideBySide() { m_view_type = VIEW_SIDE_BY_SIDE; asp::stereo_settings().preview = false; setNoSideBySideWithDialog(); createLayout(); } void MainWindow::viewSeveralSideBySide() { m_view_type = VIEW_SIDE_BY_SIDE; asp::stereo_settings().preview = false; asp::stereo_settings().view_several_side_by_side = true; m_show_two_images_when_side_by_side_with_dialog = true; // start with 2 createLayout(); } void MainWindow::viewAsTiles() { if (!m_win_menu_mgr.m_viewAsTiles_action->isChecked()) { if (m_view_type_old != VIEW_AS_TILES_ON_GRID) m_view_type = m_view_type_old; // restore this else m_view_type = VIEW_SIDE_BY_SIDE; asp::stereo_settings().preview = false; setNoSideBySideWithDialog(); createLayout(); return; } std::string gridColsStr; bool ans = getStringFromGui(this, "Number of columns in the grid", "Number of columns in the grid", "", gridColsStr); if (!ans) return; m_grid_cols = std::max(atoi(gridColsStr.c_str()), 1); m_view_type_old = m_view_type; // back this up m_view_type = VIEW_AS_TILES_ON_GRID; // When viewing as tile we cannot show matches asp::stereo_settings().view_matches = false; asp::stereo_settings().preview = false; setNoSideBySideWithDialog(); MainWindow::updateViewMenuEntries(); createLayout(); } void MainWindow::zoomToProjWin() { std::string projWinStr; bool ans = getStringFromGui(this, "Enter proj win (4 values)", "Enter proj win (4 values)", "", projWinStr); if (!ans) return; std::istringstream is(projWinStr); double a, b, c, d; if (!(is >> a >> b >> c >> d)) { popUp("Four float values expected."); return; } if (!m_widgets[BASE_IMAGE_ID]) { popUp("Unexpected missing widget."); return; } if (!app_data.use_georef) { popUp("Turn on viewing georeferenced images to zoom to given proj win."); return; } // This takes care of the fact that the order of corners can be reversed BBox2 proj_win; proj_win.grow(Vector2(a, b)); proj_win.grow(Vector2(c, d)); BBox2 image_box; if (app_data.images[BASE_IMAGE_ID].isPolyOrCsv()) image_box = proj_win; else image_box = app_data.images[BASE_IMAGE_ID].georef.point_to_pixel_bbox(proj_win); BBox2 world_box = app_data.image2world_trans(image_box, BASE_IMAGE_ID); for (size_t i = 0; i < m_widgets.size(); i++) { if (!m_widgets[i]) continue; m_widgets[i]->zoomToRegion(world_box); } } // Update the checkboxes for the matches menu entries based on stereo_settings() // values. void MainWindow::updateViewMenuEntries() { auto& wm = m_win_menu_mgr; wm.m_viewMatches_action ->setChecked(asp::stereo_settings().view_matches); wm.m_viewPairwiseCleanMatches_action ->setChecked(asp::stereo_settings().pairwise_clean_matches); wm.m_viewPairwiseMatches_action ->setChecked(asp::stereo_settings().pairwise_matches); wm.m_viewSeveralSideBySide_action ->setChecked(asp::stereo_settings().view_several_side_by_side); } // Update checkboxes for viewing thresholded and hillshaded images void MainWindow::updateDisplayModeMenuEntries() { auto& wm = m_win_menu_mgr; wm.m_viewThreshImages_action ->setChecked(app_data.display_mode == THRESHOLDED_VIEW); wm.m_viewHillshadedImages_action ->setChecked(app_data.display_mode == HILLSHADED_VIEW); } void MainWindow::viewMatchesFromMenu() { // Record user's intent asp::stereo_settings().view_matches = m_win_menu_mgr.m_viewMatches_action->isChecked(); toggleViewMatches(); } // The value of asp::stereo_settings().view_matches must be set before // calling this. It will be invoked as result of user clicking on the // menu or adding/deleting match points. void MainWindow::toggleViewMatches() { asp::stereo_settings().pairwise_matches = false; asp::stereo_settings().pairwise_clean_matches = false; asp::stereo_settings().preview = false; MainWindow::updateViewMenuEntries(); m_show_two_images_when_side_by_side_with_dialog = false; m_chooseFiles->showAllImages(); MainWindow::createLayout(); // This will call viewMatches() after a GUI reorg } // Show or hide matches depending on the value of m_viewMatches. We // assume first ip in first image manages first ip in all other // images. We allow ip without matches in other images, that can be // useful, but not before saving, when their numbers must agree for // all images. void MainWindow::viewMatches() { // Record user's intent asp::stereo_settings().view_matches = m_win_menu_mgr.m_viewMatches_action->isChecked(); asp::stereo_settings().preview = false; // Turn off the other ways of viewing matches if (asp::stereo_settings().view_matches) { asp::stereo_settings().pairwise_matches = false; asp::stereo_settings().pairwise_clean_matches = false; asp::stereo_settings().preview = false; MainWindow::updateViewMenuEntries(); } // If started editing matches do not load them from disk if (MainWindow::editingMatches()) m_match_mgr.m_matches_exist = true; // TODO(oalexan1): Improve match loading when done this way, it is // rather ad hoc. Maybe just switch to pairwise matches each time // there's more than two images. // We will load the matches just once, as we later will add/delete // matches manually. if (!m_match_mgr.m_matches_exist && asp::stereo_settings().view_matches) { // We will try to load matches m_match_mgr.m_matches_exist = true; size_t num_images = app_data.image_files.size(); bool gcp_exists = !stereo_settings().gcp_file.empty() && fs::exists(stereo_settings().gcp_file); if (gcp_exists) { // Load GCP. If the GCP file was specified but does not exist, we will // try to load the matches instead, which later will be used to make the // gcp. try { m_match_mgr.m_matchlist.loadPointsFromGCPs(stereo_settings().gcp_file, app_data.image_files); } catch (std::exception const& e) { popUp(e.what()); return; } } else if (!stereo_settings().vwip_files.empty()) { // Try to read matches from vwip files m_match_mgr.m_matchlist.loadPointsFromVwip(stereo_settings().vwip_files, app_data.image_files); } else { // If no match file was specified by now, ask the user for the output prefix. if (stereo_settings().match_file == "") { if (!supplyOutputPrefixIfNeeded(this, m_output_prefix)) return; } // Load matches std::vector matchFiles; std::vector leftIndices; bool matchfiles_found = false; asp::populateMatchFiles(app_data.image_files, m_output_prefix, stereo_settings().match_file, stereo_settings().matches_as_txt, matchFiles, leftIndices, matchfiles_found); if (matchfiles_found) m_match_mgr.m_matchlist.loadPointsFromMatchFiles(matchFiles, leftIndices, stereo_settings().matches_as_txt); } } // End case where we tried to load the matches // Set all the matches to be visible. for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->viewMatches(); } return; } void MainWindow::viewPairwiseMatchesSlot() { // Record user's intent asp::stereo_settings().pairwise_matches = m_win_menu_mgr.m_viewPairwiseMatches_action->isChecked(); if (asp::stereo_settings().pairwise_matches) m_show_two_images_when_side_by_side_with_dialog = true; // Turn off the other ways of viewing matches asp::stereo_settings().view_matches = false; asp::stereo_settings().pairwise_clean_matches = false; MainWindow::updateViewMenuEntries(); // Must always recreate the layout as this option can totally change the interface createLayout(); } void MainWindow::viewPairwiseCleanMatchesSlot() { // Record user's intent asp::stereo_settings().pairwise_clean_matches = m_win_menu_mgr.m_viewPairwiseCleanMatches_action->isChecked(); if (asp::stereo_settings().pairwise_clean_matches) m_show_two_images_when_side_by_side_with_dialog = true; // Turn off the other ways of viewing matches asp::stereo_settings().view_matches = false; asp::stereo_settings().pairwise_matches = false; MainWindow::updateViewMenuEntries(); // Must always recreate the layout as this option can totally change the interface createLayout(); } // These two modes will be handled together as they are very // similar. void MainWindow::viewPairwiseMatchesOrCleanMatches() { MainWindow::updateViewMenuEntries(); if (!asp::stereo_settings().pairwise_matches && !asp::stereo_settings().pairwise_clean_matches) { return; } if (app_data.use_georef) { popUp("To view matches, turn off viewing the images as georeferenced."); asp::stereo_settings().pairwise_matches = false; asp::stereo_settings().pairwise_clean_matches = false; MainWindow::updateViewMenuEntries(); createLayout(); return; } if (asp::stereo_settings().pairwise_matches && asp::stereo_settings().pairwise_clean_matches) { popUp("Cannot show both pairwise matches and pairwise clean matches at the same time."); asp::stereo_settings().pairwise_matches = false; asp::stereo_settings().pairwise_clean_matches = false; MainWindow::updateViewMenuEntries(); createLayout(); return; } if (m_output_prefix == "" && stereo_settings().nvm.empty() && stereo_settings().isis_cnet.empty()) { popUp("Cannot show pairwise (clean) matches, as the output prefix was not set."); asp::stereo_settings().pairwise_matches = false; asp::stereo_settings().pairwise_clean_matches = false; MainWindow::updateViewMenuEntries(); createLayout(); return; } // See which images are seen std::vector seen_indices; for (size_t it = 0; it < app_data.images.size(); it++) { if (!m_chooseFiles->isHidden(app_data.images[it].name)) { seen_indices.push_back(it); } } // Only show matches if precisely two images are currently displayed if (seen_indices.size() != 2) { // Ensure no stray matches from before are shown m_match_mgr.m_pairwiseMatches.ip_to_show.clear(); m_match_mgr.m_pairwiseCleanMatches.ip_to_show.clear(); return; } int left_index = seen_indices[0], right_index = seen_indices[1]; m_match_mgr.loadPairwiseMatches(left_index, right_index, m_output_prefix); // Call viewMatches() in each widget. That widgets already knows about m_match_mgr. // The controls for what kind of matches to show are in asp::stereo_settings(). for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->viewMatches(); } } void MainWindow::saveMatches() { if (stereo_settings().match_file == "") { if (!supplyOutputPrefixIfNeeded(this, m_output_prefix)) return; } try { m_match_mgr.m_matchlist.savePointsToDisk(m_output_prefix, app_data.image_files, stereo_settings().match_file, stereo_settings().matches_as_txt); } catch (std::exception const& e) { popUp(e.what()); return; } m_match_mgr.m_matches_exist = true; // If creating GCP, and matches are not saved yet, that means GCP were not saved // either if (MainWindow::creatingGcp() && MainWindow::editingMatches()) m_saved_gcp_and_ip = false; // matches got saved, no more editing for now for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i] != NULL) m_widgets[i]->setEditingMatches(false); } } void MainWindow::writeGroundControlPoints() { if (!m_match_mgr.m_matchlist.allPointsValid()) { popUp("Cannot save GCP, at least one point is missing or not valid."); return; } m_match_mgr.m_matches_exist = true; const size_t num_images = app_data.image_files.size(); const size_t num_ips = m_match_mgr.m_matchlist.getNumPoints(); // Don't record pixels from the last image, which is used for reference const size_t num_images_to_save = num_images - 1; vw_out() << "Saving GCP with " << num_images << " images and " << num_ips << " ips.\n"; if (num_images != m_match_mgr.m_matchlist.getNumImages()) return popUp("Cannot save matches. Image and match vectors are unequal!"); if (num_ips < 1) return popUp("Cannot save matches. No matches have been created."); // Prompt the user for a DEM path unless specified via --dem-file. if (stereo_settings().dem_file == "") { try { stereo_settings().dem_file = QFileDialog::getOpenFileName(0, "Select DEM to use for point elevations", m_output_prefix.c_str()).toStdString(); } catch(...) { return popUp("Error selecting the DEM path."); } } if (stereo_settings().dem_file == "") return; // Likely the user did not choose a file, so cancel the save. // Have a DEM file, need to save GCP, and did not save it yet m_saved_gcp_and_ip = false; // Prompt the user for the desired output path unless specified in --gcp-file. if (stereo_settings().gcp_file == "") { try { std::string default_path = m_output_prefix + "/ground_control_points.gcp"; if (m_output_prefix.empty()) // Default to current dir if prefix not set default_path = "ground_control_points.gcp"; stereo_settings().gcp_file = QFileDialog::getSaveFileName(0, "Select a path to save the GCP file to", default_path.c_str()).toStdString(); }catch(...) { return popUp("Error selecting the output path."); } } // Must save the matches. This is helpful in case // want to resume creating GCP. MainWindow::saveMatches(); try { asp::genWriteGcp(app_data.image_files, stereo_settings().gcp_file, stereo_settings().dem_file, m_match_mgr.m_matchlist, asp::stereo_settings().gcp_sigma); m_saved_gcp_and_ip = true; } catch (std::exception const& e) { popUp(e.what()); return; } } void MainWindow::addDelMatches() { popUp("Right-click on images to add/delete interest point matches."); return; } void MainWindow::run_stereo_or_parallel_stereo(std::string const& cmd) { if (m_widgets.size() < 2) { // Note: We allow three images, as the third may be the DEM QMessageBox::about(this, tr("Error"), tr("Need to have two images side-by-side to run stereo.")); return; } // Output prefix must be non-empty if (m_output_prefix.empty()) { QMessageBox::about(this, tr("Error"), tr("The output prefix must be passed in, together with the images, " "cameras, and stereo options, to be able to run stereo.")); return; } // There is no need for a pop-up on failure here, as there will be one // in get_crop_win() if the crop windows are not set. QRect left_win, right_win; if ((!m_widgets[0] || !m_widgets[0]->get_crop_win(left_win)) || (!m_widgets[1] || !m_widgets[1]->get_crop_win(right_win))) return; int left_x = left_win.x(); int left_y = left_win.y(); int left_wx = left_win.width(); int left_wy = left_win.height(); int right_x = right_win.x(); int right_y = right_win.y(); int right_wx = right_win.width(); int right_wy = right_win.height(); std::string run_cmd = vw::program_path(cmd, m_argv[0]); // Wipe pre-existing left-image-crop-win and right-image-crop-win asp::rmOptionVals(m_argc, m_argv, "--left-image-crop-win", 4); asp::rmOptionVals(m_argc, m_argv, "--right-image-crop-win", 4); // Wipe the stereo_gui --window-size option and some others that are no // use for stereo. asp::rmOptionVals(m_argc, m_argv, "--window-size", 2); asp::rmOptionVals(m_argc, m_argv, "--font-size", 1); asp::rmOptionVals(m_argc, m_argv, "--lowest-resolution-subimage-num-pixels", 1); // Form the command to run for (int i = 1; i < m_argc; i++) { std::string token = std::string(m_argv[i]); // Skip adding empty spaces we may have introduced with asp::rmOptionVals(). if (token == " ") continue; // Use quotes if there are spaces if (token.find(" ") != std::string::npos || token.find("\t") != std::string::npos) token = '"' + token + '"'; run_cmd += " " + token; } // Add crop win options std::ostringstream os; os << " --left-image-crop-win " << left_x << " " << left_y << " " << left_wx << " " << left_wy; os << " --right-image-crop-win " << right_x << " " << right_y << " " << right_wx << " " << right_wy; run_cmd += os.str(); // Run the command vw_out() << "Running: " << run_cmd << std::endl; system(run_cmd.c_str()); QMessageBox::about(this, tr("stereo_gui"), tr("Done running stereo")); } void MainWindow::save_screenshot() { QMessageBox::about(this, tr("Info"), tr("To save a screenshot, right-click on an image.")); return; } void MainWindow::select_region() { 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.")); return; } void MainWindow::change_cursor() { m_cursor_count = (m_cursor_count + 1) % 3; if (m_cursor_count == 0) { setCursor(Qt::PointingHandCursor); } else if (m_cursor_count == 1) { setCursor(Qt::UpArrowCursor); } else{ setCursor(Qt::ArrowCursor); } } void MainWindow::run_stereo() { MainWindow::run_stereo_or_parallel_stereo("stereo"); } void MainWindow::run_parallel_stereo() { MainWindow::run_stereo_or_parallel_stereo("parallel_stereo"); } // Toggle on or of the tool for detecting a threshold in images void MainWindow::thresholdCalc() { bool on = m_win_menu_mgr.m_thresholdCalc_action->isChecked(); for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->setThreshMode(on); } } void MainWindow::viewThreshImages() { if (m_win_menu_mgr.m_viewThreshImages_action->isChecked()) app_data.display_mode = THRESHOLDED_VIEW; else app_data.display_mode = REGULAR_VIEW; MainWindow::updateDisplayModeMenuEntries(); for (size_t i = 0; i < m_widgets.size(); i++) { if (!m_widgets[i]) continue; bool refresh_pixmap = true; if (app_data.display_mode == THRESHOLDED_VIEW) m_widgets[i]->viewThreshImages(refresh_pixmap); else m_widgets[i]->viewUnthreshImages(); } } void MainWindow::contourImages() { for (size_t i = 0; i < m_widgets.size(); i++) { if (!m_widgets[i] || m_widgets[i]->getThreshold() == -std::numeric_limits::max()) { popUp("Set the threshold via the Threshold menu before finding the contour."); return; } } for (size_t i = 0; i < m_widgets.size(); i++) { // If we fail at one of the contouring operations, presumably a // pop-up will be shown, and then it is not worth continuing, // which may just result in more pop-ups. if (!m_widgets[i]->contourImage()) return; } } void MainWindow::saveVectorLayerAsShapeFile() { if (m_widgets.size() > 1) { popUp("More than one pane exists. Use the right-click menu of the desired pane instead."); return; } if (m_widgets.size() == 1 && m_widgets[0]) m_widgets[0]->saveVectorLayerAsShapeFile(); } void MainWindow::saveVectorLayerAsTextFile() { if (m_widgets.size() > 1) { popUp("More than one pane exists. Use the right-click menu of the desired pane instead."); return; } if (m_widgets.size() == 1 && m_widgets[0]) m_widgets[0]->saveVectorLayerAsTextFile(); } void MainWindow::thresholdGetSet() { std::ostringstream oss; oss.precision(18); for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) oss << m_widgets[i]->getThreshold() << " "; } std::string thresh = oss.str(); bool ans = getStringFromGui(this, "Image thresholds", "Image thresholds", thresh, thresh); if (!ans) return; std::istringstream iss(thresh.c_str()); std::vector thresholds; double val; while (iss >> val) thresholds.push_back(val); if (thresholds.size() != m_widgets.size()) { popUp("There must be as many thresholds as images."); return; } for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->setThreshold(thresholds[i]); } // Turn off viewing thresholded images when the threshold is set. The user can // turn this back on, and then the thresholded image will be recomputed and // displayed. app_data.display_mode = REGULAR_VIEW; MainWindow::updateDisplayModeMenuEntries(); MainWindow::viewThreshImages(); } void MainWindow::setLineWidth() { std::ostringstream oss; for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) { oss << m_widgets[i]->getLineWidth(); // All widgets will have the same line width break; } } std::string lineWidthStr = oss.str(); bool ans = getStringFromGui(this, "Polygonal line width", "Polygonal line width", lineWidthStr, lineWidthStr); if (!ans) return; int lineWidth = atoi(lineWidthStr.c_str()); if (lineWidth <= 0) { popUp("The line width must be a positive integer."); return; } for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->setLineWidth(lineWidth); } } void MainWindow::setPolyColor() { std::string polyColor; for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) { polyColor = m_widgets[i]->getPolyColor(); // All widgets will have the same poly color break; } } bool ans = getStringFromGui(this, "Polygonal line color", "Polygonal line color", polyColor, polyColor); if (!ans) return; if (polyColor == "") { popUp("The polygonal line color must be set."); return; } for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->setPolyColor(polyColor); } } void MainWindow::viewHillshadedImages() { bool hillshade = m_win_menu_mgr.m_viewHillshadedImages_action->isChecked(); app_data.display_mode = hillshade ? HILLSHADED_VIEW : REGULAR_VIEW; MainWindow::updateDisplayModeMenuEntries(); for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->viewHillshadedImages(app_data.display_mode == HILLSHADED_VIEW); } } // Pass to the widget the desire to zoom all images to the same region // or its cancellation void MainWindow::setZoomAllToSameRegionAux(bool do_zoom) { m_win_menu_mgr.m_zoomAllToSameRegion_action->setChecked(do_zoom); } // Pass to the widget the desire to zoom all images to the same region // or its cancellation void MainWindow::setZoomAllToSameRegion() { asp::stereo_settings().zoom_all_to_same_region = m_win_menu_mgr.m_zoomAllToSameRegion_action->isChecked(); setZoomAllToSameRegionAux(asp::stereo_settings().zoom_all_to_same_region); if (!asp::stereo_settings().zoom_all_to_same_region) return; // nothing to do // If zooming to same region, windows better not be on top of each other if (m_view_type == VIEW_IN_SINGLE_WINDOW) { if (m_view_type_old != VIEW_IN_SINGLE_WINDOW) m_view_type = m_view_type_old; // restore this else m_view_type = VIEW_SIDE_BY_SIDE; } // If all images are georeferenced, it makes perfect sense to turn // on georeferencing when zooming. The user can later turn it off // from the menu if so desired. bool has_georef = true; for (size_t i = 0; i < app_data.image_files.size(); i++) { has_georef = has_georef && app_data.images[i].has_georef; } if (has_georef && !app_data.use_georef) { app_data.use_georef = true; m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef); viewGeoreferencedImages(); // This will invoke createLayout() too. }else{ createLayout(); } } // Zoom all widgets to the same region which comes from widget with given id. // There is no need to re-create any layouts now, as nothing changes // except the fact that we zoom. void MainWindow::zoomAllToSameRegionAction(int widget_id) { int num_widgets = m_widgets.size(); if (widget_id < 0 || widget_id >= num_widgets) { popUp("Invalid widget id."); return; } if (!m_widgets[widget_id]) return; vw::BBox2 region = m_widgets[widget_id]->current_view(); for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) { m_widgets[i]->zoomToRegion(region); } } } // View next or previous image void MainWindow::viewOtherImage(int delta) { if (!m_chooseFiles) { popUp("The file chooser is not on."); return; } if (m_view_type != VIEW_IN_SINGLE_WINDOW && !previewOrSideBySideWithDialog()) { popUp("Viewing the next/prev image requires that all images be in the same window or side-by-side with a dialog."); return; } m_chooseFiles->viewOtherImage(delta); if (m_view_type == VIEW_IN_SINGLE_WINDOW && !previewOrSideBySideWithDialog() && m_widgets.size() == 1 && m_widgets[0]) m_widgets[0]->refreshPixmap(); else if (previewOrSideBySideWithDialog()) createLayout(); return; } void MainWindow::viewNextImage() { MainWindow::viewOtherImage(1); } void MainWindow::viewPrevImage() { MainWindow::viewOtherImage(-1); } void MainWindow::uncheckProfileModeCheckbox() { m_win_menu_mgr.m_profileMode_action->setChecked(false); return; } void MainWindow::profileMode() { bool profile_mode = m_win_menu_mgr.m_profileMode_action->isChecked(); if (profile_mode && m_widgets.size() != 1) { popUp("A profile can be shown only when a single image is present."); uncheckProfileModeCheckbox(); return; } for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->setProfileMode(profile_mode); } } void MainWindow::uncheckPolyEditModeCheckbox() { m_win_menu_mgr.m_polyEditMode_action->setChecked(false); return; } void MainWindow::polyEditMode() { bool polyEditMode = m_win_menu_mgr.m_polyEditMode_action->isChecked(); if (polyEditMode) { // Turn on vector layer editing if (!app_data.use_georef) { bool has_georef = true; for (size_t i = 0; i < app_data.images.size(); i++) has_georef = has_georef && app_data.images[i].has_georef; if (has_georef) { app_data.use_georef = true; // If georeference information exists, draw polygons in that mode, // and any newly-created polygons will inherit the georeference. popUp("To edit polygons, the data will be overlaid in one window using georeferences."); app_data.use_georef = true; m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef); m_win_menu_mgr.m_overlayGeoreferencedImages_action ->setChecked(app_data.use_georef); overlayGeoreferencedImages(); return; } } } // We arrive here if no GUI overhaul happens. Simply notify the // widgets to turn on or off the editing of polygons. bool refresh = true; for (size_t i = 0; i < m_widgets.size(); i++) { if (m_widgets[i]) m_widgets[i]->setPolyEditMode(polyEditMode, refresh); } return; } void MainWindow::viewGeoreferencedImages() { app_data.use_georef = m_win_menu_mgr.m_viewGeoreferencedImages_action->isChecked(); if (app_data.use_georef) { // Will show in single window with georef. Must first check if all images have georef. for (size_t i = 0; i < app_data.image_files.size(); i++) { if (!app_data.images[i].has_georef) { popUp("Cannot view georeferenced images, as there is no georeference in: " + app_data.image_files[i]); app_data.use_georef = false; m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef); m_win_menu_mgr.m_overlayGeoreferencedImages_action ->setChecked(app_data.use_georef); return; } } } createLayout(); } void MainWindow::overlayGeoreferencedImages() { app_data.use_georef = m_win_menu_mgr.m_overlayGeoreferencedImages_action->isChecked(); if (app_data.use_georef) { // Will show in single window with georef. Must first check if all images have georef. for (size_t i = 0; i < app_data.image_files.size(); i++) { if (!app_data.images[i].has_georef) { popUp("Cannot overlay, as there is no georeference in: " + app_data.image_files[i]); app_data.use_georef = false; m_win_menu_mgr.m_viewGeoreferencedImages_action->setChecked(app_data.use_georef); m_win_menu_mgr.m_overlayGeoreferencedImages_action ->setChecked(app_data.use_georef); return; } } if (m_view_type != VIEW_IN_SINGLE_WINDOW) m_view_type_old = m_view_type; // back this up m_view_type = VIEW_IN_SINGLE_WINDOW; // Turn off zooming all images to same region if all are in the same window if (asp::stereo_settings().zoom_all_to_same_region) { asp::stereo_settings().zoom_all_to_same_region = false; setZoomAllToSameRegionAux(asp::stereo_settings().zoom_all_to_same_region); } }else{ if (m_view_type_old != VIEW_IN_SINGLE_WINDOW) m_view_type = m_view_type_old; // restore this else m_view_type = VIEW_SIDE_BY_SIDE; } createLayout(); } void MainWindow::about() { std::ostringstream about_text; about_text << "

stereo_gui

" << "

NASA Ames Research Center. " << "See the manual for documentation.

"; QMessageBox::about(this, tr("About stereo_gui"), tr(about_text.str().c_str())); } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { #if 0 // Logic which for now does nothing but may be useful one day if (event->type() == QEvent::KeyPress) { QKeyEvent *key_event = static_cast(event); if (int(key_event->key()) == 67) { // do something } } #endif return QMainWindow::eventFilter(obj, event); } void MainWindow::keyPressEvent(QKeyEvent *event) { // Redirect to some widget. This is a fix for panning not working // unless one clicks on the image first. for (size_t wit = 0; wit < m_widgets.size(); wit++) { if (m_widgets[wit]) { m_widgets[wit]->keyPressEvent(event); break; } } } ================================================ FILE: src/asp/GUI/MainWindow.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file MainWindow.h // // #ifndef __STEREO_GUI_MAINWINDOW_H__ #define __STEREO_GUI_MAINWINDOW_H__ #include #include #include #include #include #include #include #include #include #include #include #include // Forward declarations class QAction; class QLabel; class QTabWidget; class QSplitter; namespace asp { enum ViewType {VIEW_SIDE_BY_SIDE, VIEW_IN_SINGLE_WINDOW, VIEW_AS_TILES_ON_GRID}; class MainWidget; class ChooseFilesDlg; // This class handles the menus at the top bar and other application level details. class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(vw::GdalWriteOptions const& opt, std::vector const& images, std::string& output_prefix, // non-const, so we can change it int grid_cols, vw::Vector2i const& window_size, bool single_window, bool use_georef, std::vector> const& properties, int argc, char ** argv); virtual ~MainWindow() {} private slots: void forceQuit (); // Ensure the program shuts down. void sizeToFit (); void zoomIn (); void zoomOut (); void viewSingleWindow (); void viewAllSideBySide (); void viewSeveralSideBySide (); void viewAsTiles (); void zoomToProjWin (); void viewMatchesFromMenu(); void toggleViewMatches (); void zoomAllToSameRegionAction(int widget_id); void viewMatches(); void viewPairwiseMatchesSlot(); void viewPairwiseCleanMatchesSlot(); void addDelMatches (); void saveMatches (); void writeGroundControlPoints (); // Write a ground control point file for bundle_adjust void save_screenshot (); void select_region (); void change_cursor (); void run_stereo (); void run_parallel_stereo (); void thresholdCalc (); void thresholdGetSet (); void setPolyColor (); void setLineWidth (); void viewThreshImages (); void contourImages (); void saveVectorLayerAsShapeFile (); void saveVectorLayerAsTextFile (); void viewHillshadedImages (); void viewGeoreferencedImages (); void overlayGeoreferencedImages (); void setZoomAllToSameRegion (); void setZoomAllToSameRegionAux(bool do_zoom); void viewNextImage (); void viewPrevImage (); void viewOtherImage(int delta); void profileMode (); void polyEditMode (); void uncheckProfileModeCheckbox (); void uncheckPolyEditModeCheckbox(); void about (); protected: void keyPressEvent(QKeyEvent *event); bool eventFilter(QObject *obj, QEvent *e); private slots: void perhapsCreateLayout(int row, int col); void hideShowAll_windowVersion(); void createLayout(); private: void run_stereo_or_parallel_stereo(std::string const& cmd); // Go through m_matches and retain only IPs detected in the first image. // - If require_all is set, only keep IPs detected in all images. size_t consolidate_matches(bool require_all = true); // Event handlers void resizeEvent(QResizeEvent *); void closeEvent (QCloseEvent *); // See if in the middle of editing matches bool editingMatches() const; bool creatingGcp() const; void updateViewMenuEntries(); void updateDisplayModeMenuEntries(); bool sanityChecks(int num_images); void viewPairwiseMatchesOrCleanMatches(); vw::GdalWriteOptions m_opt; std::string m_output_prefix; double m_widRatio; // ratio of sidebar to entire win wid std::vector m_widgets; // one of these for each separate image pane. ChooseFilesDlg * m_chooseFiles; // left sidebar for selecting files WindowMenuMgr m_win_menu_mgr; friend struct WindowMenuMgr; ViewType m_view_type, m_view_type_old; int m_grid_cols, m_grid_cols_old; bool m_allowMultipleSelections; int m_argc; char ** m_argv; asp::MatchPointMgr m_match_mgr; int m_cursor_count; // This will be set to true each time we enter the mode when images // are shown side-by-side with a dialog. The user can later choose // to show any number. bool m_show_two_images_when_side_by_side_with_dialog; bool m_saved_gcp_and_ip; // Application data shared among all widgets asp::AppData app_data; }; } // namespace asp #endif // __STEREO_GUI_MAINWINDOW_H__ ================================================ FILE: src/asp/GUI/MatchPointMgr.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include #include #include #include using namespace vw; namespace asp { void MatchPointMgr::drawInterestPoints(QPainter* paint, MainWidget* main_widget, int beg_image_id, int base_image_id, int window_width, int window_height) { // Highlight colors for various actions QColor ipColor = QColor(255, 0, 0); // Red QColor ipInvalidColor = QColor(255,163, 26); // Orange QColor ipAddHighlightColor = QColor(64,255, 0); // Green QColor ipMoveHighlightColor = QColor(255, 0,255); // Magenta paint->setBrush(Qt::NoBrush); // If this point is currently being edited by the user, highlight it. // - Here we check to see if it has not been placed in all images yet. bool highlight_last = false; if (asp::stereo_settings().view_matches) { int lastImage = int(m_matchlist.getNumImages()) - 1; highlight_last = (m_matchlist.getNumPoints(beg_image_id) > m_matchlist.getNumPoints(lastImage)); } std::vector ip_vec; if (asp::stereo_settings().view_matches) { for (size_t ip_iter = 0; ip_iter < m_matchlist.getNumPoints(beg_image_id); ip_iter++) { // Generate the pixel coord of the point Vector2 pt = m_matchlist.getPointCoord(beg_image_id, ip_iter); ip_vec.push_back(pt); } } else if (asp::stereo_settings().pairwise_matches && beg_image_id < m_pairwiseMatches.ip_to_show.size()) { // Had to check if ip_to_show was initialized by now auto & ip_in_vec = m_pairwiseMatches.ip_to_show[beg_image_id]; // alias for (size_t ip_iter = 0; ip_iter < ip_in_vec.size(); ip_iter++) { ip_vec.push_back(Vector2(ip_in_vec[ip_iter].x, ip_in_vec[ip_iter].y)); } } else if (asp::stereo_settings().pairwise_clean_matches && beg_image_id < m_pairwiseCleanMatches.ip_to_show.size()) { // Had to check if ip_to_show was initialized by now auto & ip_in_vec = m_pairwiseCleanMatches.ip_to_show[beg_image_id]; // alias for (size_t ip_iter = 0; ip_iter < ip_in_vec.size(); ip_iter++) { ip_vec.push_back(Vector2(ip_in_vec[ip_iter].x, ip_in_vec[ip_iter].y)); } } // Iterate over interest points for (size_t ip_iter = 0; ip_iter < ip_vec.size(); ip_iter++) { // Generate the pixel coord of the point Vector2 pt = ip_vec[ip_iter]; Vector2 world = m_app_data.image2world_trans(pt, base_image_id); // Use m_app_data Vector2 P = main_widget->world2screen(world); // Use main_widget->world2screen // Do not draw points that are outside the viewing area if (P.x() < 0 || P.x() > window_width || P.y() < 0 || P.y() > window_height) { continue; } paint->setPen(ipColor); // The default IP color paint->setBrush(ipColor); // make the point filled if (asp::stereo_settings().view_matches) { // Some special handling for when we add matches if (!m_matchlist.isPointValid(beg_image_id, ip_iter)) { paint->setPen(ipInvalidColor); paint->setBrush(ipInvalidColor); } // Highlighting the last point if (highlight_last && (ip_iter == m_matchlist.getNumPoints(beg_image_id)-1)) { paint->setPen(ipAddHighlightColor); paint->setBrush(ipAddHighlightColor); } if (static_cast(ip_iter) == m_editMatchPointVecIndex) { paint->setPen(ipMoveHighlightColor); paint->setBrush(ipMoveHighlightColor); } } QPoint Q(P.x(), P.y()); paint->drawEllipse(Q, 2, 2); // Draw the point } // End loop through points } // End function drawInterestPoints void MatchPointMgr::loadPairwiseMatches(int left_index, int right_index, std::string const& output_prefix) { bool matches_as_txt = asp::stereo_settings().matches_as_txt; pairwiseMatchList * pairwiseMatches = NULL; std::string match_file; auto index_pair = std::make_pair(left_index, right_index); if (asp::stereo_settings().pairwise_matches) { pairwiseMatches = &m_pairwiseMatches; if (!asp::stereo_settings().nvm.empty() || !asp::stereo_settings().isis_cnet.empty()) { // Load from nvm or isis cnet match_file = "placeholder.match"; pairwiseMatches->match_files[index_pair] = match_file; // flag it as loaded // Where we want these loaded auto & left_ip = pairwiseMatches->matches[index_pair].first; // alias auto & right_ip = pairwiseMatches->matches[index_pair].second; // alias if (left_ip.empty() && right_ip.empty()) asp::matchesForPair(m_cnet, left_index, right_index, left_ip, right_ip); } else if (pairwiseMatches->match_files.find(index_pair) == pairwiseMatches->match_files.end()) { // Load pairwise matches match_file = vw::ip::match_filename(output_prefix, m_app_data.images[left_index].name, m_app_data.images[right_index].name, matches_as_txt); } } else { // Load pairwise clean matches pairwiseMatches = &m_pairwiseCleanMatches; if (pairwiseMatches->match_files.find(index_pair) == pairwiseMatches->match_files.end()) { match_file = vw::ip::clean_match_filename(output_prefix, m_app_data.images[left_index].name, m_app_data.images[right_index].name, matches_as_txt); } } // Ensure the ip per image are always empty but initialized. This will ensure that // later in MainWidget::viewMatches() we plot the intended matches. if (pairwiseMatches) { pairwiseMatches->ip_to_show.clear(); pairwiseMatches->ip_to_show.resize(m_app_data.images.size()); } // Where we want these loaded auto & left_ip = pairwiseMatches->matches[index_pair].first; // alias auto & right_ip = pairwiseMatches->matches[index_pair].second; // alias // If the file was not loaded before, load it. Note that matches from an nvm file // are loaded by now. if (pairwiseMatches->match_files.find(index_pair) == pairwiseMatches->match_files.end()) { // Flag it as loaded pairwiseMatches->match_files[index_pair] = match_file; try { // Load it vw_out() << "Loading match file: " << match_file << "\n"; vw::ip::read_match_file(match_file, left_ip, right_ip, matches_as_txt); vw_out() << "Read: " << left_ip.size() << " matches.\n"; } catch (...) { // Having this pop-up for a large number of images is annoying vw_out() << "Cannot find the match file with given images and output prefix.\n"; return; } } // These will be read when interest points are drawn pairwiseMatches->ip_to_show[left_index] = left_ip; pairwiseMatches->ip_to_show[right_index] = right_ip; } } // End namespace asp ================================================ FILE: src/asp/GUI/MatchPointMgr.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_GUI_MATCH_POINT_MGR_H__ #define __ASP_GUI_MATCH_POINT_MGR_H__ // ASP #include #include // Vision Workbench #include // For pairwiseMatchList #include // For ControlNetwork // Standard #include #include #include class QPainter; namespace asp { // Forward declarations class AppData; class MainWidget; // Structures to keep track of all interest point matches. class MatchPointMgr { public: MatchPointMgr(asp::AppData & app_data): // Constructor now takes AppData m_matches_exist(false), m_cnet("ASP_control_network"), m_editMatchPointVecIndex(-1), m_editingMatches(false), m_app_data(app_data) {} // Initialize m_app_data void init(int num_images) { m_matchlist.resize(num_images); } void drawInterestPoints(QPainter* paint, MainWidget* main_widget, // New argument int beg_image_id, int base_image_id, int window_width, int window_height); void loadPairwiseMatches(int left_index, int right_index, std::string const& output_prefix); // Member variables bool m_matches_exist; asp::MatchList m_matchlist; pairwiseMatchList m_pairwiseMatches; pairwiseMatchList m_pairwiseCleanMatches; vw::ba::ControlNetwork m_cnet; int m_editMatchPointVecIndex; // Point being edited bool m_editingMatches; // If we are in the middle of editing match points asp::AppData & m_app_data; // Reference to AppData }; // End class MatchPointMgr } // End namespace asp #endif // __ASP_GUI_MATCH_POINT_MGR_H__ ================================================ FILE: src/asp/GUI/PolyWidget.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file PolyWidget.cc // // Member functions of MainWidget that have to do with polygons. #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asp { // All functions here are member functions of MainWidget, but are moved // to this file to reduce the size of MainWidget.cc. // Change the color of given layer of polygons void MainWidget::changePolyColor(int imageIndex) { std::string polyColor; bool ans = getStringFromGui(this, "Polygonal line color", "Polygonal line color", polyColor, polyColor); if (!ans) return; if (polyColor == "") { popUp("The polygonal line color must be set."); return; } // We will assume the user wants to see this on top m_perImagePolyColor[imageIndex] = polyColor; bringImageOnTop(imageIndex); // Redraw everything, which will change the color refreshPixmap(); } void MainWidget::setPolyEditMode(bool polyEditMode, bool refresh) { m_polyEditMode = polyEditMode; // Turn off moving vertices any time we turn on or off poly editing m_wid_menu_mgr->m_moveVertex->setChecked(false); m_wid_menu_mgr->m_showIndices->setChecked(false); if (!m_polyEditMode) { // Clean up any unfinished polygon // Need to put here pop-up asking to save m_currPolyX.clear(); m_currPolyY.clear(); // Call back to the main window and tell it to uncheck the polyEditMode checkbox // mode checkbox. emit uncheckPolyEditModeCheckbox(); return; } else { setProfileMode(false); } // On occasions we don't want to force a refresh prematurely, the // GUI will take care of it when the layout is created if (refresh) refreshPixmap(); } // TODO(oalexan1): Move out this non-gui function. void MainWidget::appendToPolyVec(vw::geometry::dPoly const& P) { // Append the new polygon to the list of polygons. If we have several // clips already, append it to the last clip. If we have no clips, // create a new clip. if (app_data.images[m_polyLayerIndex].polyVec.size() == 0) { app_data.images[m_polyLayerIndex].polyVec.push_back(P); } else { app_data.images[m_polyLayerIndex].polyVec.back().appendPolygons(P); } return; } // Add a point to the polygon being drawn or stop drawing and append // the drawn polygon to the list of polygons. This polygon is in the // world coordinate system. When we append it, we will convert it to // points in the desired geodetic projection. void MainWidget::addPolyVert(double px, double py) { vw::Vector2 S(px, py); // current point in screen pixels int pSize = m_currPolyX.size(); // This is a bugfix. Before starting drawing, update // m_polyLayerIndex to point to a currently visible layer, // otherwise it looks as if polygons are invisible. if (pSize == 0 && m_chooseFiles && m_chooseFiles->isHidden(app_data.images[m_polyLayerIndex].name)) { for (int j = m_beg_image_id; j < m_end_image_id; j++) { int i = m_filesOrder[j]; // image index if (m_chooseFiles && m_chooseFiles->isHidden(app_data.images[i].name)) continue; m_polyLayerIndex = i; // not hidden } } // Starting point in this polygon. It is absolutely essential that we // keep it in world units. Otherwise, if we zoom while the polygon // is being drawn, we will not be able to close it properly. if (pSize == 0) m_startPix = screen2world(S); if (pSize <= 0 || vw::math::norm_2(world2screen(m_startPix) - S) > m_pixelTol) { // We did not arrive yet at the starting point of the polygon being // drawn. Add the current point. S = screen2world(S); // world coordinates m_world_box.grow(S); // to not cut when plotting later S = app_data.world2proj(S, m_polyLayerIndex); // projected units m_currPolyX.push_back(S.x()); m_currPolyY.push_back(S.y()); pSize = m_currPolyX.size(); // This will call paintEvent which will draw the current poly line update(); return; } // Form the newly finished polygon vw::geometry::dPoly poly; poly.reset(); bool isPolyClosed = true; std::string color = app_data.images[m_polyLayerIndex].color; if (color == "default") color = m_polyColor; // if no color was set from the command line // If the user set a custom color auto color_it = m_perImagePolyColor.find(m_polyLayerIndex); if (color_it != m_perImagePolyColor.end()) { color = color_it->second; app_data.images[m_polyLayerIndex].color = color; // save for the future } std::string layer = ""; poly.appendPolygon(pSize, vw::geometry::vecPtr(m_currPolyX), vw::geometry::vecPtr(m_currPolyY), isPolyClosed, color, layer); appendToPolyVec(poly); m_currPolyX.clear(); m_currPolyY.clear(); update(); // redraw the just polygons, not the underlying images //refreshPixmap(); return; } // Delete a vertex closest to where the user clicked. // TODO(oalexan1): This will fail when different polygons have // different georeferences. void MainWidget::deleteVertex() { vw::Vector2 P = screen2world(vw::Vector2(m_mousePrsX, m_mousePrsY)); asp::PolySearchResult sr; asp::findClosestPolyVertex(P.x(), P.y(), app_data, m_beg_image_id, m_end_image_id, sr); if (sr.clipIndex < 0 || sr.polyVecIndex < 0 || sr.polyIndexInCurrPoly < 0 || sr.vertIndexInCurrPoly < 0) return; app_data.images[sr.clipIndex].polyVec[sr.polyVecIndex].eraseVertex (sr.polyIndexInCurrPoly, sr.vertIndexInCurrPoly); // This will redraw just the polygons, not the pixmap update(); return; } // TODO(oalexan1): Move out this non-gui function. void MainWidget::deleteVertices() { if (m_stereoCropWin.empty()) { popUp("No region is selected."); return; } asp::deleteVerticesInBox(app_data, m_stereoCropWin, m_beg_image_id, m_end_image_id); // The selection has done its job, wipe it now m_stereoCropWin = vw::BBox2(); // This will redraw just the polygons, not the pixmap update(); } // Insert intermediate vertex where the mouse right-clicks. // TODO(oalexan1): This will fail when different polygons have // different georeferences. // TODO(oalexan1): Move out this non-gui function. void MainWidget::insertVertex() { vw::Vector2 P = screen2world(vw::Vector2(m_mousePrsX, m_mousePrsY)); m_world_box.grow(P); // to not cut when plotting later // If there is absolutely no polygon, start by creating one // with just one point. bool allEmpty = true; for (size_t clipIt = m_beg_image_id; clipIt < m_end_image_id; clipIt++) { if (app_data.images[clipIt].polyVec.size() > 0 && app_data.images[clipIt].polyVec[0].get_totalNumVerts() > 0) { allEmpty = false; break; } } if (allEmpty) { addPolyVert(m_mousePrsX, m_mousePrsY); // init the polygon addPolyVert(m_mousePrsX, m_mousePrsY); // declare the polygon finished return; } // The location of the point to be inserted looks more reasonable // when one searches for closest edge, not vertex. asp::PolySearchResult sr; asp::findClosestPolyEdge(P.x(), P.y(), app_data, m_beg_image_id, m_end_image_id, sr); if (sr.clipIndex < 0 || sr.polyVecIndex < 0 || sr.polyIndexInCurrPoly < 0 || sr.vertIndexInCurrPoly < 0) return; // Convert to coordinates of the desired clip P = app_data.world2proj(P, sr.clipIndex); // Need +1 below as we insert AFTER current vertex app_data.images[sr.clipIndex].polyVec[sr.polyVecIndex].insertVertex( sr.polyIndexInCurrPoly, sr.vertIndexInCurrPoly + 1, P.x(), P.y()); // This will redraw just the polygons, not the pixmap update(); return; } // Merge existing polygons void MainWidget::mergePolys() { asp::mergePolys(app_data, m_beg_image_id, m_end_image_id, m_polyLayerIndex); } // Save the currently created vector layer void MainWidget::saveVectorLayerAsShapeFile() { if (m_polyLayerIndex < m_beg_image_id || m_polyLayerIndex >= m_end_image_id) { popUp("Images are inconsistent. Cannot save vector layer."); return; } std::string shapeFile = app_data.images[m_polyLayerIndex].name; shapeFile = boost::filesystem::path(shapeFile).replace_extension(".shp").string(); QString qShapeFile = QFileDialog::getSaveFileName(this, tr("Save shapefile"), shapeFile.c_str(), tr("(*.shp)")); shapeFile = qShapeFile.toStdString(); if (shapeFile == "") return; bool has_geo = app_data.images[m_polyLayerIndex].has_georef; vw::cartography::GeoReference const& geo = app_data.images[m_polyLayerIndex].georef; // Save only polygons in the given layer. Polygons in other layers // can have individual georeferences. vw::vw_out() << "Writing: " << shapeFile << "\n"; vw::geometry::write_shapefile(shapeFile, has_geo, geo, app_data.images[m_polyLayerIndex].polyVec); } // Save the currently created vector layer. Its index is m_polyLayerIndex. // Other layers are not saved. They may have their own georeferences. void MainWidget::saveVectorLayerAsTextFile() { if (m_polyLayerIndex < m_beg_image_id || m_polyLayerIndex >= m_end_image_id) { popUp("Images are inconsistent. Cannot save vector layer."); return; } std::string textFile = app_data.images[m_polyLayerIndex].name; textFile = boost::filesystem::path(textFile).replace_extension(".txt").string(); QString qtextFile = QFileDialog::getSaveFileName(this, tr("Save text file"), textFile.c_str(), tr("(*.txt)")); textFile = qtextFile.toStdString(); if (textFile == "") return; app_data.images[m_polyLayerIndex].writePoly(textFile); } // Contour the current image bool MainWidget::contourImage() { int non_poly_image = -1; int num_non_poly_images = 0; for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) { if (!app_data.images[image_iter].m_isPoly && !app_data.images[image_iter].m_isCsv) num_non_poly_images++; non_poly_image = image_iter; } if (num_non_poly_images > 1) { popUp("Must have just one image in window to contour an image."); return false; } if (non_poly_image < 0) return true; // Will quietly skip this m_polyLayerIndex = non_poly_image; int num_channels = app_data.images[m_polyLayerIndex].img().planes(); if (num_channels > 1) { popUp("Contouring images makes sense only for single-channel images."); return false; } if (num_channels == 1) asp::contour_image(app_data.images[m_polyLayerIndex].img(), app_data.images[m_polyLayerIndex].georef, m_threshold.value, app_data.images[m_polyLayerIndex].polyVec); // This will call paintEvent which will draw the contour update(); return true; } void MainWidget::drawOneVertex(int x0, int y0, QColor color, int lineWidth, int drawVertIndex, QPainter &paint) { // Draw a vertex as a small shape (a circle, rectangle, triangle) // Use variable size shapes to distinguish better points on top of // each other int len = 2*(drawVertIndex+1); len = std::min(len, 8); // limit how big this can get paint.setPen(QPen(color, lineWidth)); int numTypes = 4; if (drawVertIndex < 0) { // This will be reached only for the case when a polygon // is so small that it collapses into a point. len = lineWidth; paint.setBrush(color); paint.drawRect(x0 - len, y0 - len, 2*len, 2*len); } else if (drawVertIndex%numTypes == 0) { // Draw a small empty ellipse paint.setBrush(Qt::NoBrush); paint.drawEllipse(x0 - len, y0 - len, 2*len, 2*len); } else if (drawVertIndex%numTypes == 1) { // Draw an empty square paint.setBrush(Qt::NoBrush); paint.drawRect(x0 - len, y0 - len, 2*len, 2*len); } else if (drawVertIndex%numTypes == 2) { // Draw an empty triangle paint.setBrush(Qt::NoBrush); paint.drawLine(x0 - len, y0 - len, x0 + len, y0 - len); paint.drawLine(x0 - len, y0 - len, x0 + 0, y0 + len); paint.drawLine(x0 + len, y0 - len, x0 + 0, y0 + len); } else { // Draw an empty reversed triangle paint.setBrush(Qt::NoBrush); paint.drawLine(x0 - len, y0 + len, x0 + len, y0 + len); paint.drawLine(x0 - len, y0 + len, x0 + 0, y0 - len); paint.drawLine(x0 + len, y0 + len, x0 + 0, y0 - len); } return; } void MainWidget::plotPoly(bool plotPoints, bool plotEdges, bool plotFilled, bool showIndices, int lineWidth, int drawVertIndex, // 0 is a good choice here QColor const& color, QPainter & paint, // Make a local copy of the poly on purpose vw::geometry::dPoly currPoly) { using namespace vw::geometry; if (m_world_box.empty()) return; // The box in world coordinates double x_min = m_world_box.min().x(); double y_min = m_world_box.min().y(); double x_max = m_world_box.max().x(); double y_max = m_world_box.max().y(); double screen_min_x = 0, screen_min_y = 0; // When polys are filled, plot largest polys first if (plotFilled) { // What on screen looks counter-clockwise, internally is clockwise, // because the screen y axis is in fact pointing down. // We need to reverse the orientation for the logic below to work properly //currPoly.reverse(); //currPoly.sortBySizeAndMaybeAddBigContainingRect(x_min, y_min, x_max, y_max); //currPoly.reverse(); } // Clip the polygon a bit beyond the viewing window, as to not see // the edges where the cut took place. It is a bit tricky to // decide how much the extra should be. double tol = 1e-12; double pixelSize = std::max(m_world_box.width()/m_window_width, m_world_box.height()/m_window_height); double extra = 2*pixelSize*lineWidth; double extraX = extra + tol * std::max(std::abs(x_min), std::abs(x_max)); double extraY = extra + tol * std::max(std::abs(y_min), std::abs(y_max)); // Will try to use the color from polygons if they exist. Otherwise // use the default color. QColor local_color = color; dPoly clippedPoly; currPoly.clipPoly(x_min - extraX, y_min - extraY, x_max + extraX, y_max + extraY, clippedPoly); // output std::vector annotations; if (showIndices) { clippedPoly.compVertIndexAnno(); clippedPoly.get_vertIndexAnno(annotations); } else { // Copy regular annotations from the file clippedPoly.get_annotations(annotations); } const double * xv = clippedPoly.get_xv(); const double * yv = clippedPoly.get_yv(); const int * numVerts = clippedPoly.get_numVerts(); int numPolys = clippedPoly.get_numPolys(); // Aliases const std::vector & isPolyClosed = clippedPoly.get_isPolyClosed(); const std::vector & colors = clippedPoly.get_colors(); // we ignore these int start = 0; for (int pIter = 0; pIter < numPolys; pIter++) { if (pIter > 0) start += numVerts[pIter - 1]; int pSize = numVerts[pIter]; // Use the corresponding color if it exists and is valid if (colors.size() > pIter) { QColor curr_color = QColor(colors[pIter].c_str()); if (curr_color.isValid()) local_color = curr_color; } // Determine the orientation of polygons double signedArea = 0.0; if (plotFilled && isPolyClosed[pIter]) { bool counter_cc = true; signedArea = signedPolyArea(pSize, xv + start, yv + start, counter_cc); } QPolygon pa(pSize); for (int vIter = 0; vIter < pSize; vIter++) { vw::Vector2 P = world2screen(vw::Vector2(xv[start + vIter], yv[start + vIter])); pa[vIter] = QPoint(P.x(), P.y()); // Qt's built in points are too small. Instead of drawing a point // draw a small shape. int tol = 4; // This is a bug fix for missing points. I don't understand // // why this is necessary and why the number 4 is right. if (plotPoints && P.x() > screen_min_x - tol && P.x() < screen_min_x + m_window_width + tol && P.y() > screen_min_y - tol && P.y() < screen_min_y + m_window_height + tol) { drawOneVertex(P.x(), P.y(), local_color, lineWidth, drawVertIndex, paint); } } if (pa.size() <= 0) continue; if (plotEdges) { if (plotFilled && isPolyClosed[pIter]) { // Notice that we fill clockwise polygons, those with // negative area. That because on screen they in fact // appear counter-clockwise, since the screen y axis is // always down, and because the ESRI shapefile format // expects an outer polygon to be clockwise. if (signedArea < 0.0) paint.setBrush(local_color); else paint.setBrush(m_backgroundColor); paint.setPen(Qt::NoPen); } else { paint.setBrush(Qt::NoBrush); paint.setPen(QPen(local_color, lineWidth)); } if (isPolyZeroDim(pa)) { // Treat the case of polygons which are made up of just one point int l_drawVertIndex = -1; drawOneVertex(pa[0].x(), pa[0].y(), local_color, lineWidth, l_drawVertIndex, paint); } else if (isPolyClosed[pIter]) { if (plotFilled) { paint.drawPolygon(pa); } else { // In some versions of Qt, drawPolygon is buggy when not // called to fill polygons. Don't use it, just draw the // edges one by one. int n = pa.size(); for (int k = 0; k < n; k++) { QPolygon pb; int x0, y0; pa.point(k, &x0, &y0); pb << QPoint(x0, y0); int x1, y1; pa.point((k+1)%n, &x1, &y1); pb << QPoint(x1, y1); paint.drawPolyline(pb); } } } else { paint.drawPolyline(pa); // don't join the last vertex to the first } } } // Plot the annotations int numAnno = annotations.size(); for (int aIter = 0; aIter < numAnno; aIter++) { const anno & A = annotations[aIter]; // alias // Avoid points close to boundary, as were we clipped artificially if (! (A.x >= x_min && A.x <= x_max && A.y >= y_min && A.y <= y_max)) continue; vw::Vector2 P = world2screen(vw::Vector2(A.x, A.y)); paint.setPen(QPen(QColor("gold"), lineWidth)); paint.drawText(P.x(), P.y(), (A.label).c_str()); } // End plotting annotations return; } // TODO(oalexan1): Should the persistent polygons be drawn // as part of the drawImage() call? That will be a lot more efficient // than being redrawn any time the mouse moves, etc. How about polygons // actively being edited? void MainWidget::plotPolys(QPainter & paint) { // Loop through the input images. Plot the polygons. Note how we // add one more fake image at the end to take care of the polygon // we are in the middle of drawing. This extra fake image is a hackish thing for (int j = m_beg_image_id; j < m_end_image_id + 1; j++) { // use + 1, per above bool currDrawnPoly = (j == m_end_image_id); // last poly is the currently drawn one int image_it = m_polyLayerIndex; // for currently drawn poly if (!currDrawnPoly) { image_it = m_filesOrder[j]; // for the other polys // Don't show files the user wants hidden std::string fileName = app_data.images[image_it].name; if (m_chooseFiles && m_chooseFiles->isHidden(fileName)) continue; } // See if to use a custom color for this polygon, specified by the user from the gui auto color_it = m_perImagePolyColor.find(image_it); if (!currDrawnPoly && color_it != m_perImagePolyColor.end()) { std::string color = color_it->second; app_data.images[image_it].color = color; // save for the future for (auto& poly: app_data.images[image_it].polyVec) poly.set_color(color); } // Let polyVec be the polygons for the current image, or, // at the end, the polygon we are in the middle of drawing // TODO(oalexan1): How to avoid a deep copy? std::vector polyVec; if (!currDrawnPoly) { polyVec = app_data.images[image_it].polyVec; // deep copy } else { if (m_currPolyX.empty() || !m_polyEditMode) continue; vw::geometry::dPoly poly; poly.reset(); bool isPolyClosed = false; // because we are in the middle of drawing it std::string layer = ""; poly.appendPolygon(m_currPolyX.size(), vw::geometry::vecPtr(m_currPolyX), vw::geometry::vecPtr(m_currPolyY), isPolyClosed, m_polyColor, layer); polyVec.push_back(poly); } // Plot the polygon being drawn now, and pre-existing polygons for (size_t polyIter = 0; polyIter < polyVec.size(); polyIter++) { vw::geometry::dPoly poly = polyVec[polyIter]; // make a deep copy if (poly.get_totalNumVerts() == 0) continue; // Convert to world units int numVerts = poly.get_totalNumVerts(); double * xv = poly.get_xv(); double * yv = poly.get_yv(); for (int vIter = 0; vIter < numVerts; vIter++) { vw::Vector2 P = app_data.proj2world(vw::Vector2(xv[vIter], yv[vIter]), image_it); xv[vIter] = P.x(); yv[vIter] = P.y(); } // Convert annotations to world units std::vector annotations; poly.get_annotations(annotations); for (size_t aIter = 0; aIter < annotations.size(); aIter++) { vw::geometry::anno & A = annotations[aIter]; // alias vw::Vector2 P = app_data.proj2world(vw::Vector2(A.x, A.y), image_it); A.x = P.x(); A.y = P.y(); } poly.set_annotations(annotations); int drawVertIndex = 0; bool plotPoints = false, plotEdges = true, plotFilled = false; if (m_polyEditMode && m_wid_menu_mgr->m_moveVertex->isChecked()) { drawVertIndex = 1; // to draw a little square at each movable vertex plotPoints = true; } else { drawVertIndex = 0; plotPoints = false; } // Note: We plot below the whole set of polygons in 'poly'. We pass in // the first color in the first poly to respect this API. In that function // we will iterate over polygons and plot each with its own color. // At some point need to revisit if plotPoly() actually needs a color // as an argument or it can always be read from 'poly' itself. const std::vector & colors = poly.get_colors(); MainWidget::plotPoly(plotPoints, plotEdges, m_wid_menu_mgr->m_showPolysFilled->isChecked(), m_wid_menu_mgr->m_showIndices->isChecked(), m_lineWidth, drawVertIndex, QColor(colors[0].c_str()), paint, poly); // Show a small square at the first vertex of the in-progress polygon // so the user can see where to click to close it if (currDrawnPoly && !m_currPolyX.empty()) { vw::Vector2 S = world2screen(m_startPix); drawOneVertex(S.x(), S.y(), QColor(m_polyColor.c_str()), m_lineWidth, 1, paint); } } } // end iterating over polygons for all images } // Go to the pixel locations on screen, and draw the polygonal line. // This is robust to zooming in the middle of profiling. // TODO: This will function badly when zooming. void MainWidget::plotProfilePolyLine(QPainter & paint, std::vector const& profileX, std::vector const& profileY) { if (profileX.empty()) return; paint.setPen(QColor("red")); std::vector profilePixels; for (size_t it = 0; it < profileX.size(); it++) { vw::Vector2 P = world2screen(vw::Vector2(profileX[it], profileY[it])); QPoint Q(P.x(), P.y()); paint.drawEllipse(Q, 2, 2); // Draw the point, and make it a little large profilePixels.push_back(Q); } paint.drawPolyline(&profilePixels[0], profilePixels.size()); } void MainWidget::setPolyColor(std::string const& polyColor) { m_polyColor = polyColor; // When the color is set from the top menu rather than right-clicking // on an individual layer in the table on the left, it applies to all polygons for (int image_iter = m_beg_image_id; image_iter < m_end_image_id; image_iter++) m_perImagePolyColor[image_iter] = polyColor; refreshPixmap(); } std::string MainWidget::getPolyColor() const { return m_polyColor; } void MainWidget::setLineWidth(int lineWidth) { m_lineWidth = lineWidth; update(); } int MainWidget::getLineWidth() const { return m_lineWidth; } } // end namespace asp ================================================ FILE: src/asp/GUI/ProfileWidget.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file ProfileWidget.cc // // Member functions of MainWidget that have to do with profing. #include #include #include #include namespace asp { // We assume the user picked n points in the image. // Draw n-1 segments in between them. Plot the obtained profile. void MainWidget::plotProfile(std::vector const& images, // indices in the image to profile std::vector const& profileX, std::vector const& profileY) { if (images.empty()) return; // nothing to do // Create the profile window if (m_profile.plot == NULL) m_profile.plot = new ProfilePlotter(this); int imgInd = m_beg_image_id; // just one image is present double nodata_val = images[imgInd].img().get_nodata_val(); m_profile.valsX.clear(); m_profile.valsY.clear(); int count = 0; int num_pts = profileX.size(); for (int pt_iter = 0; pt_iter < num_pts; pt_iter++) { // Nothing to do if we are at the last point, unless // there is only one point. if (num_pts > 1 && pt_iter == num_pts - 1) continue; vw::Vector2 pt(profileX[pt_iter], profileY[pt_iter]); vw::Vector2 begP = app_data.world2image_trans(pt, imgInd); vw::Vector2 endP; if (num_pts == 1) { endP = begP; // only one point is present } else { vw::Vector2 pt(profileX[pt_iter+1], profileY[pt_iter+1]); endP = app_data.world2image_trans(pt, imgInd); } int begX = begP.x(), begY = begP.y(); int endX = endP.x(), endY = endP.y(); int seg_len = std::abs(begX - endX) + std::abs(begY - endY); if (seg_len == 0) seg_len = 1; // ensure it is never empty for (int p = 0; p <= seg_len; p++) { double t = double(p)/seg_len; int x = round(begX + t*(endX - begX)); int y = round(begY + t*(endY - begY)); bool is_in = (x >= 0 && x <= images[imgInd].img().cols()-1 && y >= 0 && y <= images[imgInd].img().rows()-1); if (!is_in) continue; double pixel_val = images[imgInd].img().get_value_as_double(x, y); // TODO: Deal with this NAN if (pixel_val == nodata_val) pixel_val = std::numeric_limits::quiet_NaN(); m_profile.valsX.push_back(count); m_profile.valsY.push_back(pixel_val); count++; } } if (num_pts == 1) { // Just one point, really m_profile.valsX.resize(1); m_profile.valsY.resize(1); } // Wipe whatever was there before m_profile.plot->detachItems(); QwtPlotCurve * curve = new QwtPlotCurve("1D Profile"); m_profile.plot->setFixedWidth(300); m_profile.plot->setWindowTitle("1D Profile"); if (!m_profile.valsX.empty()) { double min_x = *std::min_element(m_profile.valsX.begin(), m_profile.valsX.end()); double max_x = *std::max_element(m_profile.valsX.begin(), m_profile.valsX.end()); double min_y = *std::min_element(m_profile.valsY.begin(), m_profile.valsY.end()); double max_y = *std::max_element(m_profile.valsY.begin(), m_profile.valsY.end()); // Ensure the window is always valid double small = 0.1; if (min_x == max_x) { min_x -= small; max_x += small; } if (min_y == max_y) { min_y -= small; max_y += small; } // Plot a point as a fat dot if (num_pts == 1) { curve->setStyle(QwtPlotCurve::Dots); } curve->setData(new QwtCPointerData(&m_profile.valsX[0], &m_profile.valsY[0], m_profile.valsX.size())); curve->setPen(* new QPen(Qt::red)); curve->attach(m_profile.plot); double delta = 0.1; // expand a bit right to see more x and y labels double widx = max_x - min_x; double widy = max_y - min_y; m_profile.plot->setAxisScale(QwtPlot::xBottom, min_x - delta*widx, max_x + delta*widx); m_profile.plot->setAxisScale(QwtPlot::yLeft, min_y - delta*widy, max_y + delta*widy); } // Finally, refresh the plot m_profile.plot->replot(); m_profile.plot->show(); } void MainWidget::setProfileMode(bool profile_mode) { m_profile.mode = profile_mode; if (!m_profile.mode) { // Clean up any profiling related info m_profile.x.clear(); m_profile.y.clear(); // Close the window. if (m_profile.plot != NULL) { m_profile.plot->close(); m_profile.plot->deleteLater(); delete m_profile.plot; m_profile.plot = NULL; } // Call back to the main window and tell it to uncheck the profile // mode checkbox. emit uncheckProfileModeCheckbox(); return; } else { bool refresh = true; setPolyEditMode(false, refresh); // Load the data if not loaded already for (size_t it = 0; it < app_data.images.size(); it++) app_data.images[it].load(); // Show the profile window MainWidget::plotProfile(app_data.images, m_profile.x, m_profile.y); } refreshPixmap(); } } // end namespace asp ================================================ FILE: src/asp/GUI/WidgetBase.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file WidgetBase.cc #include namespace vw { namespace cartography { class GeoTransform; }} namespace asp { WidgetBase::WidgetBase(int beg_image_id, int end_image_id, int base_image_id, asp::AppData & data): m_beg_image_id(beg_image_id), m_end_image_id(end_image_id), app_data(data), m_base_image_id(base_image_id), m_world_box(vw::BBox2()), m_border_factor(0.95) { } // Convert a position in the world coordinate system to a pixel // position as seen on screen (the screen origin is the // visible upper-left corner of the widget). vw::Vector2 WidgetBase::world2screen(vw::Vector2 const& p) const { double x = m_window_width*((p.x() - m_current_view.min().x()) / m_current_view.width()); double y = m_window_height*((p.y() - m_current_view.min().y()) / m_current_view.height()); // Create an empty border margin, to make it easier to zoom // by allowing the zoom window to slightly exceed the visible image // area (that inability was such a nuisance). x = m_border_factor*(x - m_window_width /2.0) + m_window_width /2.0; y = m_border_factor*(y - m_window_height/2.0) + m_window_height/2.0; return vw::Vector2(x, y); } // Convert a pixel on the screen to world coordinates. // See app_data.world2image_trans() for the definition. vw::Vector2 WidgetBase::screen2world(vw::Vector2 const& p) const { // First undo the empty border margin double x = p.x(), y = p.y(); x = (x - m_window_width /2.0)/m_border_factor + m_window_width /2.0; y = (y - m_window_height/2.0)/m_border_factor + m_window_height/2.0; // Scale to world coordinates x = m_current_view.min().x() + (m_current_view.width () * x / m_window_width); y = m_current_view.min().y() + (m_current_view.height() * y / m_window_height); return vw::Vector2(x, y); } vw::BBox2 WidgetBase::screen2world(vw::BBox2 const& R) const { if (R.empty()) return R; vw::Vector2 A = screen2world(R.min()); vw::Vector2 B = screen2world(R.max()); return vw::BBox2(A, B); } vw::BBox2 WidgetBase::world2screen(vw::BBox2 const& R) const { if (R.empty()) return R; vw::Vector2 A = world2screen(R.min()); vw::Vector2 B = world2screen(R.max()); return vw::BBox2(A, B); } } // namespace asp ================================================ FILE: src/asp/GUI/WidgetBase.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file WidgetBase.h // // This has logic that is used in MainWidget. // #ifndef __STEREO_GUI_WIDGET_BASE_H__ #define __STEREO_GUI_WIDGET_BASE_H__ #include // to avoid errors about boost and Qobject // ASP #include #include // Vision Workbench #include #include #include #include #include #include #include #include namespace asp { class WidgetBase { public: // Constructors/Destructor WidgetBase(int beg_image_id, int end_image_id, int base_image_id, asp::AppData & data); virtual ~WidgetBase(){} // The box which contains fully all images in the current widget, // in world coordinates. vw::BBox2 m_world_box; // The box in world coordinates which has the current view and // last view. This is normally smaller than m_world_box. vw::BBox2 m_current_view, m_last_view; // Dimensions and stats int m_window_width; // the width of the plotting window in screen pixels int m_window_height; // the height of the plotting window in screen pixels // Shrink the image to be shown on screen by this factor // (typically 0.90 to 0.95) to create an extra empty margin at a widget's // border, to make it easier to zoom. double m_border_factor; int m_beg_image_id; // The id of the first image among images in this widget int m_end_image_id; // The id of the image past the last image among images // The index of the image on top of which the rest are overlaid. // We will render in this image's pixel or projected domain. This // only becomes important if using georeference, and the images // have different projections. int m_base_image_id; // A reference to the shared application data asp::AppData & app_data; vw::Vector2 world2screen(vw::Vector2 const& p) const; vw::Vector2 screen2world(vw::Vector2 const& p) const; vw::BBox2 world2screen(vw::BBox2 const& R) const; vw::BBox2 screen2world(vw::BBox2 const& R) const; }; // End class WidgetBase } // namespace asp #endif // __STEREO_GUI_WIDGET_BASE_H__ ================================================ FILE: src/asp/GUI/WidgetMenuMgr.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file WidgetMenuMgr.cc // // Handles right-click context menu creation and management for MainWidget. // #include #include #include namespace asp { // Right-click context menu WidgetMenuMgr::WidgetMenuMgr(MainWidget* wid) { m_contextMenu = new QMenu(wid); // Polygon editing mode, they will be visible only when editing happens m_insertVertex = m_contextMenu->addAction("Insert vertex"); m_deleteVertex = m_contextMenu->addAction("Delete vertex"); m_deleteVertices = m_contextMenu->addAction("Delete vertices in selected region"); m_moveVertex = m_contextMenu->addAction("Move vertices"); m_moveVertex->setCheckable(true); m_moveVertex->setChecked(false); m_showPolysFilled = m_contextMenu->addAction("Show polygons filled"); m_showPolysFilled->setCheckable(true); m_showPolysFilled->setChecked(false); m_showIndices = m_contextMenu->addAction("Show vertex indices"); m_showIndices->setCheckable(true); m_showIndices->setChecked(false); m_mergePolys = m_contextMenu->addAction("Merge polygons"); // Other options m_addMatchPoint = m_contextMenu->addAction("Add match point"); m_deleteMatchPoint = m_contextMenu->addAction("Delete match point"); m_moveMatchPoint = m_contextMenu->addAction("Move match point"); m_moveMatchPoint->setCheckable(true); m_moveMatchPoint->setChecked(false); m_toggleHillshadeImageRightClick = m_contextMenu->addAction("Toggle hillshaded display"); m_setHillshadeParams = m_contextMenu->addAction("View/set hillshade azimuth and elevation"); m_saveVectorLayerAsShapeFile = m_contextMenu->addAction("Save vector layer as shape file"); m_saveVectorLayerAsTextFile = m_contextMenu->addAction("Save vector layer as text file"); m_saveScreenshot = m_contextMenu->addAction("Save screenshot"); m_setThreshold = m_contextMenu->addAction("View/set threshold"); m_allowMultipleSelections_action = m_contextMenu->addAction("Allow multiple selected regions"); m_allowMultipleSelections_action->setCheckable(true); m_allowMultipleSelections_action->setChecked(wid->m_allowMultipleSelections); m_deleteSelection = m_contextMenu->addAction("Delete selected regions around this point"); m_hideImagesNotInRegion = m_contextMenu->addAction("Hide images not intersecting selected region"); // Connect signals to slots in the wid QObject::connect(m_addMatchPoint, SIGNAL(triggered()), wid, SLOT(addMatchPoint())); QObject::connect(m_deleteMatchPoint, SIGNAL(triggered()), wid, SLOT(deleteMatchPoint())); QObject::connect(m_toggleHillshadeImageRightClick, SIGNAL(triggered()), wid, SLOT(toggleHillshadeImageRightClick())); QObject::connect(m_setHillshadeParams, SIGNAL(triggered()), wid, SLOT(setHillshadeParams())); QObject::connect(m_setThreshold, SIGNAL(triggered()), wid, SLOT(setThreshold())); QObject::connect(m_saveScreenshot, SIGNAL(triggered()), wid, SLOT(saveScreenshot())); QObject::connect(m_allowMultipleSelections_action, SIGNAL(triggered()), wid, SLOT(allowMultipleSelections())); QObject::connect(m_deleteSelection, SIGNAL(triggered()), wid, SLOT(deleteSelection())); QObject::connect(m_hideImagesNotInRegion, SIGNAL(triggered()), wid, SLOT(hideImagesNotInRegion())); QObject::connect(m_saveVectorLayerAsShapeFile, SIGNAL(triggered()), wid, SLOT(saveVectorLayerAsShapeFile())); QObject::connect(m_saveVectorLayerAsTextFile, SIGNAL(triggered()), wid, SLOT(saveVectorLayerAsTextFile())); QObject::connect(m_deleteVertex, SIGNAL(triggered()), wid, SLOT(deleteVertex())); QObject::connect(m_deleteVertices, SIGNAL(triggered()), wid, SLOT(deleteVertices())); QObject::connect(m_insertVertex, SIGNAL(triggered()), wid, SLOT(insertVertex())); QObject::connect(m_mergePolys, SIGNAL(triggered()), wid, SLOT(mergePolys())); } void WidgetMenuMgr::setupContextMenu(MainWidget* wid) { // If in poly edit mode, turn on these items. m_deleteVertex->setVisible(wid->m_polyEditMode); m_deleteVertices->setVisible(wid->m_polyEditMode); m_insertVertex->setVisible(wid->m_polyEditMode); m_moveVertex->setVisible(wid->m_polyEditMode); m_showIndices->setVisible(wid->m_polyEditMode); m_showPolysFilled->setVisible(wid->m_polyEditMode); // Add the saving polygon option even when not editing m_saveVectorLayerAsShapeFile->setVisible(true); m_saveVectorLayerAsTextFile->setVisible(true); m_mergePolys->setVisible(wid->m_polyEditMode); // Refresh this from the variable, before popping up the menu m_allowMultipleSelections_action->setChecked(wid->m_allowMultipleSelections); // Turn on these items if we are NOT in poly edit mode. Also turn some off // in sideBySideWithDialog() mode, as then we draw the interest points // only with refreshPixmap(), which is rare, so user's editing // choices won't be reflected in the GUI. m_addMatchPoint->setVisible(!wid->m_polyEditMode && !sideBySideWithDialog()); m_deleteMatchPoint->setVisible(!wid->m_polyEditMode && !sideBySideWithDialog()); m_moveMatchPoint->setVisible(!wid->m_polyEditMode && !sideBySideWithDialog()); m_toggleHillshadeImageRightClick->setVisible(!wid->m_polyEditMode); m_setHillshadeParams->setVisible(!wid->m_polyEditMode); m_setThreshold->setVisible(!wid->m_polyEditMode); m_allowMultipleSelections_action->setVisible(!wid->m_polyEditMode); m_deleteSelection->setVisible(!sideBySideWithDialog()); m_hideImagesNotInRegion->setVisible(!sideBySideWithDialog()); m_saveScreenshot->setVisible(true); // always visible } QMenu* WidgetMenuMgr::formCustomMenu(MainWidget* wid, int imageIndex) { m_customMenu = new QMenu(wid); m_toggleHillshadeFromImageList = m_customMenu->addAction("Toggle hillshade display"); QObject::connect(m_toggleHillshadeFromImageList, &QAction::triggered, [wid, imageIndex]() { wid->toggleHillshadeFromImageList(imageIndex); }); if (!sideBySideWithDialog()) { // Do not offer these options when the images are side-by-side, // as that will just mess up with their order. m_bringImageOnTopFromTable = m_customMenu->addAction("Bring image on top"); QObject::connect(m_bringImageOnTopFromTable, &QAction::triggered, [wid, imageIndex]() { wid->bringImageOnTopSlot(imageIndex); }); m_pushImageToBottomFromTable = m_customMenu->addAction("Push image to bottom"); QObject::connect(m_pushImageToBottomFromTable, &QAction::triggered, [wid, imageIndex]() { wid->pushImageToBottomSlot(imageIndex); }); } m_zoomToImageFromTable = m_customMenu->addAction("Zoom to image"); QObject::connect(m_zoomToImageFromTable, &QAction::triggered, [wid, imageIndex]() { wid->zoomToImage(imageIndex); }); // If having polygons, make it possible to change their colors bool hasPoly = false; for (int image_iter = wid->m_beg_image_id; image_iter < wid->m_end_image_id; image_iter++) { if (wid->app_data.images[image_iter].m_isPoly) hasPoly = true; } if (hasPoly) { m_changePolyColor = m_customMenu->addAction("Change colors of polygons"); QObject::connect(m_changePolyColor, &QAction::triggered, [wid, imageIndex]() { wid->changePolyColor(imageIndex); }); } return m_customMenu; } } // End namespace asp ================================================ FILE: src/asp/GUI/WidgetMenuMgr.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file WidgetMenuMgr.h // // Handles right-click context menu creation and management for MainWidget. // #ifndef __STEREO_GUI_WIDGET_MENU_MGR_H__ #define __STEREO_GUI_WIDGET_MENU_MGR_H__ // Qt #include #include #include namespace asp { class MainWidget; // Forward declaration // Right-click context menu for MainWidget struct WidgetMenuMgr { // Constructor to create and connect menu actions WidgetMenuMgr(MainWidget* wid); QMenu* formCustomMenu(MainWidget* wid, int imageIndex); void setupContextMenu(MainWidget* wid); // Right-click context menu QMenu * m_contextMenu; QMenu * m_customMenu; QAction* m_addMatchPoint; QAction* m_deleteMatchPoint; QAction* m_moveMatchPoint; QAction* m_toggleHillshadeImageRightClick; QAction* m_setThreshold; QAction* m_setHillshadeParams; QAction* m_saveScreenshot; QAction* m_toggleHillshadeFromImageList; QAction* m_zoomToImageFromTable; QAction* m_bringImageOnTopFromTable; QAction* m_pushImageToBottomFromTable; QAction* m_changePolyColor; QAction* m_allowMultipleSelections_action; QAction* m_deleteSelection; QAction* m_hideImagesNotInRegion; QAction* m_saveVectorLayerAsShapeFile; QAction* m_saveVectorLayerAsTextFile; QAction* m_deleteVertex; QAction* m_deleteVertices; QAction* m_insertVertex; QAction* m_moveVertex; QAction* m_showIndices; QAction* m_mergePolys; QAction* m_showPolysFilled; }; // End struct WidgetMenuMgr } // End namespace asp #endif // __STEREO_GUI_WIDGET_MENU_MGR_H__ ================================================ FILE: src/asp/GUI/WindowMenuMgr.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file WindowMenuMgr.cc // // Handles menu bar creation and management for MainWindow. // #include #include #include #include namespace asp { void WindowMenuMgr::init(MainWindow* win) { QMenuBar* menu = win->menuBar(); // Exit or Quit m_exit_action = new QAction(QObject::tr("Exit"), win); m_exit_action->setShortcut(QObject::tr("Q")); m_exit_action->setStatusTip(QObject::tr("Exit the application")); QObject::connect(m_exit_action, SIGNAL(triggered()), win, SLOT(forceQuit())); // Save screenshot m_save_screenshot_action = new QAction(QObject::tr("Save screenshot"), win); m_save_screenshot_action->setStatusTip(QObject::tr("Save screenshot")); QObject::connect(m_save_screenshot_action, SIGNAL(triggered()), win, SLOT(save_screenshot())); // Select region m_select_region_action = new QAction(QObject::tr("Select region"), win); m_select_region_action->setStatusTip(QObject::tr("Select rectangular region")); QObject::connect(m_select_region_action, SIGNAL(triggered()), win, SLOT(select_region())); // Change cursor shape (a workaround for Qt not setting the cursor correctly in vnc) m_change_cursor_action = new QAction(QObject::tr("Change cursor shape"), win); m_change_cursor_action->setStatusTip(QObject::tr("Change cursor shape")); QObject::connect(m_change_cursor_action, SIGNAL(triggered()), win, SLOT(change_cursor())); m_change_cursor_action->setShortcut(QObject::tr("C")); // Run parallel_stereo m_run_parallel_stereo_action = new QAction(QObject::tr("Run parallel_stereo"), win); m_run_parallel_stereo_action->setStatusTip(QObject::tr("Run parallel_stereo on selected clips")); QObject::connect(m_run_parallel_stereo_action, SIGNAL(triggered()), win, SLOT(run_parallel_stereo())); m_run_parallel_stereo_action->setShortcut(QObject::tr("R")); // Run stereo m_run_stereo_action = new QAction(QObject::tr("Run stereo"), win); m_run_stereo_action->setStatusTip(QObject::tr("Run stereo on selected clips")); QObject::connect(m_run_stereo_action, SIGNAL(triggered()), win, SLOT(run_stereo())); // Zoom to full view m_sizeToFit_action = new QAction(QObject::tr("Zoom to full view"), win); m_sizeToFit_action->setStatusTip(QObject::tr("Change the view to encompass the images")); QObject::connect(m_sizeToFit_action, SIGNAL(triggered()), win, SLOT(sizeToFit())); m_sizeToFit_action->setShortcut(QObject::tr("F")); // Zoom in and out m_zoomIn_action = new QAction(QObject::tr("Zoom in"), win); m_zoomIn_action->setStatusTip(QObject::tr("Zoom in")); m_zoomIn_action->setShortcuts({QKeySequence(Qt::Key_Equal), QKeySequence(Qt::Key_Plus)}); QObject::connect(m_zoomIn_action, SIGNAL(triggered()), win, SLOT(zoomIn())); m_zoomOut_action = new QAction(QObject::tr("Zoom out"), win); m_zoomOut_action->setStatusTip(QObject::tr("Zoom out")); m_zoomOut_action->setShortcuts({QKeySequence(Qt::Key_Minus), QKeySequence(Qt::Key_Underscore)}); QObject::connect(m_zoomOut_action, SIGNAL(triggered()), win, SLOT(zoomOut())); m_viewSingleWindow_action = new QAction(QObject::tr("Single window"), win); m_viewSingleWindow_action->setStatusTip(QObject::tr("View images in a single window")); m_viewSingleWindow_action->setCheckable(true); m_viewSingleWindow_action->setChecked(win->m_view_type == VIEW_IN_SINGLE_WINDOW); m_viewSingleWindow_action->setShortcut(QObject::tr("W")); QObject::connect(m_viewSingleWindow_action, SIGNAL(triggered()), win, SLOT(viewSingleWindow())); m_viewAllSideBySide_action = new QAction(QObject::tr("All side-by-side"), win); m_viewAllSideBySide_action->setStatusTip(QObject::tr("View all images side-by-side")); m_viewAllSideBySide_action->setCheckable(true); m_viewAllSideBySide_action->setChecked(win->m_view_type == VIEW_SIDE_BY_SIDE && !sideBySideWithDialog()); m_viewAllSideBySide_action->setShortcut(QObject::tr("S")); QObject::connect(m_viewAllSideBySide_action, SIGNAL(triggered()), win, SLOT(viewAllSideBySide())); m_viewSeveralSideBySide_action = new QAction(QObject::tr("Several side-by-side"), win); m_viewSeveralSideBySide_action->setStatusTip(QObject::tr("View several images side-by-side")); m_viewSeveralSideBySide_action->setCheckable(true); m_viewSeveralSideBySide_action->setChecked( asp::stereo_settings().view_several_side_by_side); QObject::connect(m_viewSeveralSideBySide_action, SIGNAL(triggered()), win, SLOT(viewSeveralSideBySide())); m_viewAsTiles_action = new QAction(QObject::tr("As tiles on grid"), win); m_viewAsTiles_action->setStatusTip(QObject::tr("View images as tiles on grid")); m_viewAsTiles_action->setCheckable(true); m_viewAsTiles_action->setChecked(win->m_view_type == VIEW_AS_TILES_ON_GRID); m_viewAsTiles_action->setShortcut(QObject::tr("T")); QObject::connect(m_viewAsTiles_action, SIGNAL(triggered()), win, SLOT(viewAsTiles())); // View hillshaded images m_viewHillshadedImages_action = new QAction(QObject::tr("Hillshaded images"), win); m_viewHillshadedImages_action->setStatusTip(QObject::tr("View hillshaded images")); m_viewHillshadedImages_action->setCheckable(true); m_viewHillshadedImages_action->setChecked( win->app_data.display_mode == HILLSHADED_VIEW); m_viewHillshadedImages_action->setShortcut(QObject::tr("H")); QObject::connect(m_viewHillshadedImages_action, SIGNAL(triggered()), win, SLOT(viewHillshadedImages())); // View as georeferenced m_viewGeoreferencedImages_action = new QAction(QObject::tr("View as georeferenced images"), win); m_viewGeoreferencedImages_action->setStatusTip( QObject::tr("View as georeferenced images")); m_viewGeoreferencedImages_action->setCheckable(true); m_viewGeoreferencedImages_action->setChecked(win->app_data.use_georef); m_viewGeoreferencedImages_action->setShortcut(QObject::tr("G")); QObject::connect(m_viewGeoreferencedImages_action, SIGNAL(triggered()), win, SLOT(viewGeoreferencedImages())); // View overlaid georeferenced images m_overlayGeoreferencedImages_action = new QAction(QObject::tr("Overlay georeferenced images"), win); m_overlayGeoreferencedImages_action->setStatusTip( QObject::tr("Overlay georeferenced images")); m_overlayGeoreferencedImages_action->setCheckable(true); m_overlayGeoreferencedImages_action->setChecked( win->app_data.use_georef && (win->m_view_type == VIEW_IN_SINGLE_WINDOW)); m_overlayGeoreferencedImages_action->setShortcut(QObject::tr("O")); QObject::connect(m_overlayGeoreferencedImages_action, SIGNAL(triggered()), win, SLOT(overlayGeoreferencedImages())); // Zoom all images to same region m_zoomAllToSameRegion_action = new QAction(QObject::tr("Zoom all images to same region"), win); m_zoomAllToSameRegion_action->setStatusTip( QObject::tr("Zoom all images to same region")); m_zoomAllToSameRegion_action->setCheckable(true); m_zoomAllToSameRegion_action->setChecked( asp::stereo_settings().zoom_all_to_same_region); m_zoomAllToSameRegion_action->setShortcut(QObject::tr("Z")); QObject::connect(m_zoomAllToSameRegion_action, SIGNAL(triggered()), win, SLOT(setZoomAllToSameRegion())); // View next image m_viewNextImage_action = new QAction(QObject::tr("View next image"), win); m_viewNextImage_action->setStatusTip(QObject::tr("View next image")); m_viewNextImage_action->setCheckable(false); m_viewNextImage_action->setShortcut(QObject::tr("N")); QObject::connect(m_viewNextImage_action, SIGNAL(triggered()), win, SLOT(viewNextImage())); // View prev image m_viewPrevImage_action = new QAction(QObject::tr("View previous image"), win); m_viewPrevImage_action->setStatusTip(QObject::tr("View previous image")); m_viewPrevImage_action->setCheckable(false); m_viewPrevImage_action->setShortcut(QObject::tr("P")); QObject::connect(m_viewPrevImage_action, SIGNAL(triggered()), win, SLOT(viewPrevImage())); m_zoomToProjWin_action = new QAction(QObject::tr("Zoom to proj win"), win); m_zoomToProjWin_action->setStatusTip(QObject::tr("Zoom to proj win")); m_zoomToProjWin_action->setCheckable(false); QObject::connect(m_zoomToProjWin_action, SIGNAL(triggered()), win, SLOT(zoomToProjWin())); // IP matches m_viewMatches_action = new QAction(QObject::tr("View IP matches"), win); m_viewMatches_action->setStatusTip(QObject::tr("View IP matches")); m_viewMatches_action->setCheckable(true); m_viewMatches_action->setChecked(asp::stereo_settings().view_matches); QObject::connect(m_viewMatches_action, SIGNAL(triggered()), win, SLOT(viewMatchesFromMenu())); m_viewPairwiseMatches_action = new QAction(QObject::tr("View pairwise IP matches"), win); m_viewPairwiseMatches_action->setStatusTip(QObject::tr("View pairwise IP matches")); m_viewPairwiseMatches_action->setCheckable(true); m_viewPairwiseMatches_action->setChecked( asp::stereo_settings().pairwise_matches); QObject::connect(m_viewPairwiseMatches_action, SIGNAL(triggered()), win, SLOT(viewPairwiseMatchesSlot())); m_viewPairwiseCleanMatches_action = new QAction(QObject::tr("View pairwise clean IP matches"), win); m_viewPairwiseCleanMatches_action->setStatusTip( QObject::tr("View pairwise clean IP matches")); m_viewPairwiseCleanMatches_action->setCheckable(true); m_viewPairwiseCleanMatches_action->setChecked( asp::stereo_settings().pairwise_clean_matches); QObject::connect(m_viewPairwiseCleanMatches_action, SIGNAL(triggered()), win, SLOT(viewPairwiseCleanMatchesSlot())); m_addDelMatches_action = new QAction(QObject::tr("Add/delete IP matches"), win); m_addDelMatches_action->setStatusTip(QObject::tr("Add/delete interest point matches")); QObject::connect(m_addDelMatches_action, SIGNAL(triggered()), win, SLOT(addDelMatches())); m_saveMatches_action = new QAction(QObject::tr("Save IP matches"), win); m_saveMatches_action->setStatusTip(QObject::tr("Save interest point matches")); QObject::connect(m_saveMatches_action, SIGNAL(triggered()), win, SLOT(saveMatches())); m_writeGcp_action = new QAction(QObject::tr("Save GCP and IP matches"), win); m_writeGcp_action->setStatusTip( QObject::tr("Save interest point matches as GCP for bundle_adjust")); QObject::connect(m_writeGcp_action, SIGNAL(triggered()), win, SLOT(writeGroundControlPoints())); // Threshold calculation by clicking on pixels and setting the threshold // as the largest determined pixel value m_thresholdCalc_action = new QAction(QObject::tr("Threshold detection"), win); m_thresholdCalc_action->setStatusTip(QObject::tr("Threshold detection")); m_thresholdCalc_action->setCheckable(true); QObject::connect(m_thresholdCalc_action, SIGNAL(triggered()), win, SLOT(thresholdCalc())); // Thresholded image visualization m_viewThreshImages_action = new QAction(QObject::tr("View thresholded images"), win); m_viewThreshImages_action->setStatusTip(QObject::tr("View thresholded images")); m_viewThreshImages_action->setCheckable(true); m_viewThreshImages_action->setChecked( win->app_data.display_mode == THRESHOLDED_VIEW); QObject::connect(m_viewThreshImages_action, SIGNAL(triggered()), win, SLOT(viewThreshImages())); // View/set image threshold m_thresholdGetSet_action = new QAction(QObject::tr("View/set thresholds"), win); m_thresholdGetSet_action->setStatusTip(QObject::tr("View/set thresholds")); QObject::connect(m_thresholdGetSet_action, SIGNAL(triggered()), win, SLOT(thresholdGetSet())); // 1D profile mode m_profileMode_action = new QAction(QObject::tr("1D profile mode"), win); m_profileMode_action->setStatusTip(QObject::tr("Profile mode")); m_profileMode_action->setCheckable(true); m_profileMode_action->setChecked(false); QObject::connect(m_profileMode_action, SIGNAL(triggered()), win, SLOT(profileMode())); // Polygon edit mode m_polyEditMode_action = new QAction(QObject::tr("Polygon edit mode"), win); m_polyEditMode_action->setStatusTip(QObject::tr("Polygon edit mode")); m_polyEditMode_action->setCheckable(true); m_polyEditMode_action->setChecked(false); QObject::connect(m_polyEditMode_action, SIGNAL(triggered()), win, SLOT(polyEditMode())); // Set line width m_setLineWidth_action = new QAction(QObject::tr("Set line width"), win); m_setLineWidth_action->setStatusTip(QObject::tr("Set line width")); QObject::connect(m_setLineWidth_action, SIGNAL(triggered()), win, SLOT(setLineWidth())); // Set color of polygons m_setPolyColor_action = new QAction(QObject::tr("Set color of polygons"), win); m_setPolyColor_action->setStatusTip(QObject::tr("Set color of polygons")); QObject::connect(m_setPolyColor_action, SIGNAL(triggered()), win, SLOT(setPolyColor())); // Contour image m_contourImages_action = new QAction(QObject::tr("Find contour at threshold"), win); m_contourImages_action->setStatusTip(QObject::tr("Find contour at threshold")); QObject::connect(m_contourImages_action, SIGNAL(triggered()), win, SLOT(contourImages())); // Save vector layer as shape file m_saveVectorLayerAsShapeFile_action = new QAction(QObject::tr("Save vector layer as shapefile"), win); m_saveVectorLayerAsShapeFile_action->setStatusTip( QObject::tr("Save vector layer as shapefile")); QObject::connect(m_saveVectorLayerAsShapeFile_action, SIGNAL(triggered()), win, SLOT(saveVectorLayerAsShapeFile())); // Save vector layer as text file m_saveVectorLayerAsTextFile_action = new QAction(QObject::tr("Save vector layer as text file"), win); m_saveVectorLayerAsTextFile_action->setStatusTip( QObject::tr("Save vector layer as text file")); QObject::connect(m_saveVectorLayerAsTextFile_action, SIGNAL(triggered()), win, SLOT(saveVectorLayerAsTextFile())); // The About box m_about_action = new QAction(QObject::tr("About stereo_gui"), win); m_about_action->setStatusTip(QObject::tr("Show the stereo_gui about box")); QObject::connect(m_about_action, SIGNAL(triggered()), win, SLOT(about())); // File menu m_file_menu = menu->addMenu(QObject::tr("&File")); m_file_menu->addAction(m_save_screenshot_action); m_file_menu->addAction(m_select_region_action); m_file_menu->addAction(m_change_cursor_action); m_file_menu->addAction(m_exit_action); // Run menu m_file_menu = menu->addMenu(QObject::tr("&Run")); m_file_menu->addAction(m_run_parallel_stereo_action); m_file_menu->addAction(m_run_stereo_action); // View menu m_view_menu = menu->addMenu(QObject::tr("&View")); m_view_menu->addAction(m_sizeToFit_action); m_view_menu->addAction(m_zoomIn_action); m_view_menu->addAction(m_zoomOut_action); m_view_menu->addAction(m_viewSingleWindow_action); m_view_menu->addAction(m_viewAllSideBySide_action); m_view_menu->addAction(m_viewSeveralSideBySide_action); m_view_menu->addAction(m_viewAsTiles_action); m_view_menu->addAction(m_viewHillshadedImages_action); m_view_menu->addAction(m_viewGeoreferencedImages_action); m_view_menu->addAction(m_overlayGeoreferencedImages_action); m_view_menu->addAction(m_zoomAllToSameRegion_action); m_view_menu->addAction(m_viewNextImage_action); m_view_menu->addAction(m_viewPrevImage_action); m_view_menu->addAction(m_zoomToProjWin_action); // Matches menu m_matches_menu = menu->addMenu(QObject::tr("&IP matches")); m_matches_menu->addAction(m_viewMatches_action); m_matches_menu->addAction(m_viewPairwiseMatches_action); m_matches_menu->addAction(m_viewPairwiseCleanMatches_action); m_matches_menu->addAction(m_addDelMatches_action); m_matches_menu->addAction(m_saveMatches_action); m_matches_menu->addAction(m_writeGcp_action); // Threshold menu m_threshold_menu = menu->addMenu(QObject::tr("&Threshold")); m_threshold_menu->addAction(m_thresholdCalc_action); m_threshold_menu->addAction(m_viewThreshImages_action); m_threshold_menu->addAction(m_thresholdGetSet_action); // Profile menu m_profile_menu = menu->addMenu(QObject::tr("Profile")); m_profile_menu->addAction(m_profileMode_action); // Vector layer menu m_vector_layer_menu = menu->addMenu(QObject::tr("Vector layer")); m_vector_layer_menu->addAction(m_polyEditMode_action); m_vector_layer_menu->addAction(m_setLineWidth_action); m_vector_layer_menu->addAction(m_setPolyColor_action); m_vector_layer_menu->addAction(m_contourImages_action); m_vector_layer_menu->addAction(m_saveVectorLayerAsShapeFile_action); m_vector_layer_menu->addAction(m_saveVectorLayerAsTextFile_action); // Help menu m_help_menu = menu->addMenu(QObject::tr("&Help")); m_help_menu->addAction(m_about_action); } } // End namespace asp ================================================ FILE: src/asp/GUI/WindowMenuMgr.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file WindowMenuMgr.h // // Handles menu bar creation and management for MainWindow. // #ifndef __STEREO_GUI_WINDOW_MENU_MGR_H__ #define __STEREO_GUI_WINDOW_MENU_MGR_H__ // Qt #include #include namespace asp { class MainWindow; // Forward declaration // Menu bar for MainWindow struct WindowMenuMgr { WindowMenuMgr() = default; // Build the menu bar and connect signals to MainWindow slots void init(MainWindow* win); // Menus QMenu *m_file_menu; QMenu *m_view_menu; QMenu *m_matches_menu; QMenu *m_threshold_menu; QMenu *m_profile_menu; QMenu *m_vector_layer_menu; QMenu *m_help_menu; // Actions QAction *m_about_action; QAction *m_thresholdCalc_action; QAction *m_thresholdGetSet_action; QAction *m_setLineWidth_action; QAction *m_setPolyColor_action; QAction *m_sizeToFit_action; QAction *m_zoomIn_action; QAction *m_zoomOut_action; QAction *m_viewSingleWindow_action; QAction *m_viewAllSideBySide_action; QAction *m_viewSeveralSideBySide_action; QAction *m_viewAsTiles_action; QAction *m_zoomToProjWin_action; QAction *m_viewHillshadedImages_action; QAction *m_viewGeoreferencedImages_action; QAction *m_overlayGeoreferencedImages_action; QAction *m_viewThreshImages_action; QAction *m_contourImages_action; QAction *m_saveVectorLayerAsShapeFile_action; QAction *m_saveVectorLayerAsTextFile_action; QAction *m_zoomAllToSameRegion_action; QAction *m_viewNextImage_action; QAction *m_viewPrevImage_action; QAction *m_viewMatches_action; QAction *m_viewPairwiseMatches_action; QAction *m_viewPairwiseCleanMatches_action; QAction *m_addDelMatches_action; QAction *m_saveMatches_action; QAction *m_writeGcp_action; QAction *m_save_screenshot_action; QAction *m_select_region_action; QAction *m_change_cursor_action; QAction *m_run_stereo_action; QAction *m_run_parallel_stereo_action; QAction *m_exit_action; QAction *m_profileMode_action; QAction *m_polyEditMode_action; }; // End struct WindowMenuMgr } // End namespace asp #endif // __STEREO_GUI_WINDOW_MENU_MGR_H__ ================================================ FILE: src/asp/GenerateConfig.cmake ================================================ # This file generates asp_config.h and asp_version_config.h from # asp_config.h.in and asp_version_config.h.in. include(CheckIncludeFiles) include(CheckSymbolExists) include(CheckFunctionExists) include(CheckTypeSize) include(CheckCXXSymbolExists) include(CheckCXXSourceCompiles) # TODO: How much of this do we need? ########################################################################### # Check if certain include files are present # - Define to 1 if present, blank otherwise. #CHECK_INCLUDE_FILES(ext/stdio_filebuf.h VW_HAVE_EXT_STDIO_FILEBUF_H) # TODO #CHECK_INCLUDE_FILES(fenv.h VW_HAVE_FENV_H) CHECK_INCLUDE_FILES(inttypes.h ASP_HAVE_INTTYPES_H) #CHECK_INCLUDE_FILES(memory.h VW_HAVE_MEMORY_H) CHECK_INCLUDE_FILES(pwd.h ASP_HAVE_PWD_H) #CHECK_INCLUDE_FILES(stdint.h VW_HAVE_STDINT_H) #CHECK_INCLUDE_FILES(stdlib.h VW_HAVE_STDLIB_H) #CHECK_INCLUDE_FILES(strings.h VW_HAVE_STRINGS_H) #CHECK_INCLUDE_FILES(string.h VW_HAVE_STRING_H) #CHECK_INCLUDE_FILES(sys/stat.h VW_HAVE_SYS_STAT_H) #CHECK_INCLUDE_FILES(sys/types.h VW_HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILES(dlfcn.h ASP_HAVE_DLFCN_H) #CHECK_INCLUDE_FILES(unistd.h VW_HAVE_UNISTD_H) # Ignore, only used by plate. # Define to 1 if you have the ANSI C header files. #define VW_STDC_HEADERS @STDC_HEADERS@ ########################################################################### # Check if certain compiler features are available set(emptyIncludeList ) CHECK_CXX_SOURCE_COMPILES("void testFunc() __attribute__((deprecated)); void testFunc(){} int main(){return 0;}" ASP_COMPILER_HAS_ATTRIBUTE_DEPRECATED) CHECK_CXX_SOURCE_COMPILES("void testFunc() __attribute__((noreturn)); void testFunc(){} int main(){return 0;}" ASP_COMPILER_HAS_ATTRIBUTE_NORETURN) #CHECK_CXX_SOURCE_COMPILES("void testFunc() __attribute__((warn_unused_result)); void testFunc(){} int main(){return 0;}" VW_COMPILER_HAS_ATTRIBUTE_WARN_UNUSED_RESULT) # Check for some supported functions (could probably streamline ssize_t check) #check_cxx_symbol_exists(exp2 cmath VW_HAVE_EXP2) #check_cxx_symbol_exists(fabsl cmath VW_HAVE_FABSL) #check_cxx_symbol_exists(feenableexcept "fenv.h" VW_HAVE_FEENABLEEXCEPT) check_cxx_symbol_exists(getpid "unistd.h;sys/types.h" ASP_HAVE_GETPID) check_cxx_symbol_exists(getpwuid "pwd.h;sys/types.h" ASP_HAVE_GETPWUID) #check_cxx_symbol_exists(llabs "stdlib.h" VW_HAVE_LLABS) #check_cxx_symbol_exists(log2 cmath VW_HAVE_LOG2) #check_cxx_symbol_exists(mkstemps "stdlib.h" VW_HAVE_MKSTEMPS) #check_cxx_symbol_exists(tgamma cmath VW_HAVE_TGAMMA) #CHECK_CXX_SOURCE_COMPILES(" # #include # int main(){ssize_t a=2; return a;}" VW_HAVE_SSIZET) ########################################################################### # Determine which libraries we can build # If we made it to here we can build these modules set(ASP_HAVE_PKG_CORE 1) set(ASP_HAVE_PKG_CAMERA 1) set(ASP_HAVE_PKG_SESSIONS 1) set(ASP_HAVE_PKG_GUI 1) set(ASP_HAVE_PKG_TOOLS 1) ####################################################################### # Finished setting up variables, now call the function to paste them into a file # Each value like "@VAR@ is replaced by the CMake variable of the same name # The generated file modification time is not updated unless its content actually changed, # which prevents needless compilation. message("Generating config file: ${CMAKE_BINARY_DIR}/src/asp/asp_config.h") configure_file(${CMAKE_SOURCE_DIR}/src/asp/asp_config.h.in ${CMAKE_BINARY_DIR}/src/asp/asp_config.h) # This file's data changes often so keep it separate to avoid recompilation. message("Generating config file: ${CMAKE_BINARY_DIR}/src/asp/asp_date_config.h") configure_file(${CMAKE_SOURCE_DIR}/src/asp/asp_date_config.h.in ${CMAKE_BINARY_DIR}/src/asp/asp_date_config.h) ================================================ FILE: src/asp/Gotcha/ALSC.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include using namespace std; using namespace cv; namespace gotcha { ALSC::ALSC() {} ALSC::ALSC(Mat imgL, Mat imgR, CALSCParam paramALSC){ m_imgL = imgL; // soft data copy m_imgR = imgR; m_paramALSC = paramALSC; // hard copy nMaxIter = m_paramALSC.m_nMaxIter; nPatchRadius = m_paramALSC.m_nPatch; fDisplacementThr = m_paramALSC.m_fDriftThr; fAffineThr = m_paramALSC.m_fAffThr; fEigenThr = m_paramALSC.m_fEigThr; bNeedW = m_paramALSC.m_bWeighting; nParam = 0; if (m_paramALSC.m_bIntOffset) nParam = 7; else nParam = 6; nRowPatch = 2 * nPatchRadius + 1; nColPatch = 2 * nPatchRadius + 1; matPatchL = Eigen::MatrixXf(nRowPatch,nColPatch); matPatchR = Eigen::MatrixXf(nRowPatch,nColPatch); matC = Eigen::Matrix2f(); // prepare buffers for a normal equation, Ax = B nSystemMatrixRows = nRowPatch*nColPatch; //4 * nRadius * nRadius + 1 + 4 * nRadius; emA = Eigen::MatrixXf(nSystemMatrixRows,nParam); emB = Eigen::VectorXf(nSystemMatrixRows); pfGx.resize(nRowPatch); for (int i = 0; i < nRowPatch; i++) { pfGx[i].resize(nColPatch); } pfGy.resize(nRowPatch); for (int i = 0; i < nRowPatch; i++) { pfGy[i].resize(nColPatch); } } bool ALSC::isIntersecting(Rect rectA, Rect rectB){ bool bRes = false; Rect rectInter; rectInter = rectA & rectB; if (rectInter.area() > 0) bRes = true; else bRes = false; return bRes; } bool ALSC::doMatching(Point2f ptStartL, Point2f ptStartR, CTiePt& tp, const float* pfAffStart){ ///////////////////////////////// // set ALSC processing parameters ///////////////////////////////// //QElapsedTimer timer; //timer.restart(); // define the size of the input images Rect_ rectL = Rect(0, 0, m_imgL.cols, m_imgL.rows); Rect_ rectR = Rect(0, 0, m_imgR.cols, m_imgR.rows); // But I presume they (i.e., imgage L and R) are the same size // define the size of an initial patch, i.e., (2*nRadius+1) by (2*nRadius+1) Rect_ rectPatchL(ptStartL.x - nPatchRadius, ptStartL.y - nPatchRadius, nColPatch, nRowPatch); Rect_ rectPatchR(ptStartR.x - nPatchRadius, ptStartR.y - nPatchRadius, nColPatch, nRowPatch); // checking the validity of the size of an initial patch if (!rectL.contains(ptStartL) || !rectR.contains(ptStartR) || !isIntersecting(rectL, rectPatchL) || !isIntersecting(rectR, rectPatchR)) return false; // don't stop processing as thre might be more tiepoints in the queue // set an initial affine transform float pfAffine[4] = {0, 0, 0, 0}; // these are actually parameters for dA not A distortPatch(m_imgL, ptStartL, (float*) pfAffine, matPatchL); // simple image cropping in this case if (pfAffStart != NULL){ pfAffine[0] = pfAffStart[0]; pfAffine[1] = pfAffStart[1]; pfAffine[2] = pfAffStart[2]; pfAffine[3] = pfAffStart[3]; ptStartR.x += pfAffStart[4]; ptStartR.y += pfAffStart[5]; } distortPatch(m_imgR, ptStartR, (float*) pfAffine, matPatchR); Point2f ptOffset(0.f, 0.f); /////////////////////////////////////////////////////////////////// // initilise temporary variables for ALSC /////////////////////////////////////////////////////////////////// // initilise updated right boundary Point2f pptUpdatedBoundary[4]; pptUpdatedBoundary[0] = Point2f(rectPatchR.x, rectPatchR.y); pptUpdatedBoundary[1] = Point2f(rectPatchR.x, rectPatchR.y+rectPatchR.height); pptUpdatedBoundary[2] = Point2f(rectPatchR.x+rectPatchR.width, rectPatchR.y+rectPatchR.height); pptUpdatedBoundary[3] = Point2f(rectPatchR.x+rectPatchR.width, rectPatchR.y); Point2f ptUpdatedR(ptStartR); bool bNeed2Stop = false; double dEigenVal = 1E20; //Double.MAX_VALUE;// 0.d; float fIntOffOld = 0.f; //intensity offset only used when m_paramALSC.m_bIntOffset float fIntOffNew = 0.f; Point2f ptBestR(0,0); double dBestEig = 1E20; float pfAffBest[4]={0,0,0,0}; /////////////////////////////////////////////////////////////////// // starting ALSC operation for a single tiepoint /////////////////////////////////////////////////////////////////// for (int j = 0; j < nMaxIter; j++) { getGradientX(matPatchR); getGradientY(matPatchR); // make a system matrix A for LMS int count = 0; for (int y = 0; y < nRowPatch; y++) { int yOffset = y - nPatchRadius; for (int x = 0; x < nColPatch; x++) { int xOffset = x - nPatchRadius; float fVal = pfGx[y][x]; emA(count,0) = fVal; emA(count,1) = fVal * xOffset; emA(count,2) = fVal * yOffset; fVal = pfGy[y][x]; emA(count,3) = fVal; emA(count,4) = fVal * xOffset; emA(count,5) = fVal * yOffset; if (nParam == 7) { emA(count,6) = 1; } emB(count) = matPatchL(y, x) - matPatchR(y, x); count++; } } // get LMS solution Eigen::VectorXf emS(nParam); Eigen::MatrixXf emAS(nParam,nParam); /* Don't explicitly calculate the inverse! Use Cholesky decomposition instead. */ Eigen::MatrixXf emAT = emA.transpose(); emAS = (emAT*emA); emS = emAS.llt().solve(emAT*emB); if (m_paramALSC.m_bIntOffset) fIntOffNew = emS(6); // error computation Eigen::VectorXf emErrors(nSystemMatrixRows); emErrors = (emA * emS) - emB; // Compute the standard deviation of residual errors double dTotElelement = nSystemMatrixRows; //nRowPatch *nColPatch; //2 * nRadius + 1; //dTotElelement *= dTotElelement; double dErrorSum = emErrors.squaredNorm(); double dSTDResidual = dErrorSum / (dTotElelement - nParam); // rms of residual error double dResidual = 0.f; dResidual = sqrt(dErrorSum / (double) nSystemMatrixRows); // maximum eigenvalue of shift covariance matrix float a = emAS(0, 0); float b = emAS(3, 0); float d = emAS(3, 3); /* float pdC[2][2] = {{a, b}, {b, d}}; Mat matD(2, 2, CV_32FC1, pdC); SVD svdb(matD.inv()); */ matC(0,0) = d; matC(0,1) = -b; matC(1,0) = -b; matC(1,1) = a; matC *= (1.0/(a*d-b*b)); Eigen::JacobiSVD svd(matC); //cout << svd.singularValues()(0) << " " << svdb.w.at(0) << endl; //assert(svd.singularValues()(0) == svdb.w.at(0)); dEigenVal = svd.singularValues()(0); //dEigenVal = svdb.w.at(0,0); // maximum eigenvalues dEigenVal *= 10000.0f * dSTDResidual; // scaling ////////////////////////////////////////////////////////////// // check the validity of solution ////////////////////////////////////////////////////////////// float x = emS(0); float y = emS(3); float dist = sqrt(x * x + y * y); if (dist > fDisplacementThr) bNeed2Stop = true; if (std::abs(emS(1)) > fAffineThr || std::isnan(emS(1))) bNeed2Stop = true; if (std::abs(emS(2)) > fAffineThr || std::isnan(emS(2))) bNeed2Stop = true; if (std::abs(emS(4)) > fAffineThr || std::isnan(emS(4))) bNeed2Stop = true; if (std::abs(emS(5)) > fAffineThr || std::isnan(emS(5))) bNeed2Stop = true; if (bNeed2Stop){ break; } ////////////////////////////////////////////////////////////// // update parameters ////////////////////////////////////////////////////////////// pfAffine[0] = emS(1); pfAffine[1] = emS(2); pfAffine[2] = emS(4); pfAffine[3] = emS(5); ptOffset.x = x; ptOffset.y = y; ptUpdatedR.x += ptOffset.x; ptUpdatedR.y += ptOffset.y; if (dEigenVal < fEigenThr){ if (dBestEig > dEigenVal){ dBestEig = dEigenVal; ptBestR = ptUpdatedR; for (int m = 0; m < 4; m++) pfAffBest[m] = pfAffine[m]; } } // get distorted ROI and patch distortPatch(m_imgR, ptUpdatedR, (float*)pfAffine, matPatchR, (Point2f*)pptUpdatedBoundary); fIntOffOld = fIntOffNew; } // the end of single iteration of a ALSC process /////////////////////////////////////////////////////////////////// // the end of single ALSC operation on a tiepoint /////////////////////////////////////////////////////////////////// if (dBestEig > fEigenThr && !bNeed2Stop) bNeed2Stop = true; if (std::isnan(dEigenVal)) bNeed2Stop = true; // collect results if (!bNeed2Stop){ // CRefinedTP tp; tp.m_ptL = ptStartL; tp.m_ptR = ptBestR; //ptUpdatedR; // tp.m_fSimVal = dEigenVal/m_paramALSC.m_fEigThr; // normlise score, the smaller is the better tp.m_fSimVal = dBestEig; //dEigenVal; for (int i = 0; i < 4; i++) tp.m_pfAffine[i] = pfAffBest[i]; //pfAffine[i]; tp.m_ptOffset = ptBestR - ptStartR; //ptUpdatedR - ptStartR; if (pfAffStart != NULL){ tp.m_ptOffset.x += pfAffStart[4]; tp.m_ptOffset.y += pfAffStart[5]; } //m_pvecRefTP.push_back(tp); } return (!bNeed2Stop); } void ALSC::getGradientX(Eigen::Ref matSrc) { int nW = matSrc.cols(); int nH = matSrc.rows(); for (int y = 1; y < nH - 1; y++) { for (int x = 1; x < nW - 1; x++) { pfGx.at(y).at(x) = matSrc(y, x+1) - matSrc(y, x); } } return; } void ALSC::getGradientY(Eigen::Ref matSrc) { int nW = matSrc.cols(); int nH = matSrc.rows(); for (int y = 1; y < nH - 1; y++) { for (int x = 1; x < nW - 1; x++) { pfGy.at(y).at(x) = matSrc(y+1, x) - matSrc(y, x); } } return; } void ALSC::affineTransform(double x, double y, const Point2f ptCentre, const float *pfAff, double *dNewX, double *dNewY){ double dOffsetX, dOffsetY; dOffsetX = x * pfAff[0] + y * pfAff[1]; dOffsetY = x * pfAff[2] + y * pfAff[3]; *dNewX = ptCentre.x + x + dOffsetX; *dNewY = ptCentre.y + y + dOffsetY; return; } void ALSC::distortPatch(const Mat& matImg, const Point2f ptCentre, const float* pfAff, Eigen::Ref matImgPatch, Point2f* pptUpdated) { double dNewX = 0, dNewY = 0; int nW = matImgPatch.cols(); int nH = matImgPatch.rows(); int i = 0, j = 0; int initX = -nW / 2; int initY = -nH / 2; if(pptUpdated != NULL){ pptUpdated[0] = Point2f(0,0); pptUpdated[1] = Point2f(0,0); pptUpdated[2] = Point2f(0,0); pptUpdated[3] = Point2f(0,0); } /* Case when we're just cropping an image, don't waste time doing interpolation */ if(pfAff[0] == 0 && pfAff[1] == 0 && pfAff[2] == 0 && pfAff[3] == 0){ for (j = 0; j < nH; j++) { for (i = 0; i < nW; i++) { dNewX = ptCentre.x + initX + i; dNewY = ptCentre.y + initY + j; if(dNewX < 0 || dNewY < 0 || dNewX > matImg.cols || dNewY > matImg.rows) matImgPatch(j,i) = 0.0; else{ matImgPatch(j,i) = matImg.at(dNewY, dNewX); } } } if(pptUpdated != NULL){ pptUpdated[0] = Point2f(ptCentre.x + initX, ptCentre.y + initY); pptUpdated[1] = Point2f(ptCentre.x + initX, ptCentre.y + initY + nH-1); pptUpdated[2] = Point2f(ptCentre.x + initX + nW-1, 0); pptUpdated[3] = Point2f(ptCentre.x + initX + nW-1, ptCentre.y + initY + nH-1); } }else{ /* Otherwise interpolate */ for (j = 0; j < nH; j++) { for (i = 0; i < nW; i++) { /* Perform the affine transform on the points */ affineTransform(initX+i, initY+j, ptCentre, pfAff, &dNewX, &dNewY); /* Interpolate from the image */ matImgPatch(j,i) = interpolate(dNewX, dNewY, matImg); /* Check if we're at one of the patch corners and store into the boundary array if needed */ if(i == 0){ if(j == 0){ if (pptUpdated != NULL) pptUpdated[0] = Point2f(dNewX, dNewY); }else if(j == nH-1){ if (pptUpdated != NULL) pptUpdated[1] = Point2f(dNewX, dNewY); } }else if(i == nW-1 && j == 0){ if (pptUpdated != NULL) pptUpdated[3] = Point2f(dNewX, dNewY); } } } if (pptUpdated != NULL) pptUpdated[2] = Point2f(dNewX, dNewY); } return; } float ALSC::interpolate(double dNewX, double dNewY, const Mat &matImg){ int x1, x2, y2, y1; float val1, val2, val3, val4; float fPixelVal = 0.0; double x,y; val1 = val2 = val3 = val4 = 0.0; x1 = (int) floor(dNewX); x2 = (int) ceil(dNewX); y2 = (int) ceil(dNewY); y1 = (int) floor(dNewY); if(x1 < 0 || y1 < 0 || x2 >= matImg.cols || y2 >= matImg.rows) return 0.0; if (x1 == x2 && y1 == y2){ // when dNewX and dNewY are both integer -> happy case no interpolation is required fPixelVal = matImg.at(y1, x1); } else if (x1 == x2 && y1 != y2){ // dNewX is integer but dNewY is not. 1D interpolation is required (not bidirectional interpolation) val1 = matImg.at(y1, x1); val2 = matImg.at(y2, x1); fPixelVal = (val2 - val1) * (dNewY - y1) + val1; } else if (x1 != x2 && y1 == y2){ val1 = matImg.at(y1, x1); val2 = matImg.at(y1, x2); fPixelVal = (val2 - val1) * (dNewX - x1) + val1; } else{ // bidirectional interpolation x = dNewX; y = dNewY; val1 = matImg.at(y1, x1); val2 = matImg.at(y1, x2); val3 = matImg.at(y2, x1); val4 = matImg.at(y2, x2); fPixelVal = (val1 * (x2 - x) * (y2 - y) + val2 * (x - x1) * (y2 - y) + val3 * (x2 - x) * (y - y1) + val4 * (x - x1) * (y - y1)); } return fPixelVal; } float ALSCU16::interpolate(double dNewX, double dNewY, const Mat &matImg){ int x1, x2, y2, y1; float val1, val2, val3, val4; float fPixelVal = 0.0; double x,y; val1 = val2 = val3 = val4 = 0.0; x1 = (int) floor(dNewX); x2 = (int) ceil(dNewX); y2 = (int) ceil(dNewY); y1 = (int) floor(dNewY); if(x1 < 0 || y1 < 0 || x2 >= matImg.cols || y2 >= matImg.rows) return 0.0; if (x1 == x2 && y1 == y2){ // when dNewX and dNewY are both integer -> happy case no interpolation is required fPixelVal = matImg.at(y1, x1); } else if (x1 == x2 && y1 != y2){ // dNewX is integer but dNewY is not. 1D interpolation is required (not bidirectional interpolation) val1 = matImg.at(y1, x1); val2 = matImg.at(y2, x1); fPixelVal = (val2 - val1) * (dNewY - y1) / (y2 - y1) + val1; } else if (x1 != x2 && y1 == y2){ val1 = matImg.at(y1, x1); val2 = matImg.at(y1, x2); fPixelVal = (val2 - val1) * (dNewX - x1) / (x2 - x1) + val1; } else{ // bidirectional interpolation x = dNewX; y = dNewY; val1 = matImg.at(y1, x1); val2 = matImg.at(y1, x2); val3 = matImg.at(y2, x1); val4 = matImg.at(y2, x2); fPixelVal = (val1 * (x2 - x) * (y2 - y) / (x2 - x1) / (y2 - y1) + val2 * (x - x1) * (y2 - y) / (x2 - x1) / (y2 - y1) + val3 * (x2 - x) * (y - y1) / (x2 - x1) / (y2 - y1) + val4 * (x - x1) * (y - y1) / (x2 - x1) / (y2 - y1)); } return fPixelVal; } float ALSCF32::interpolate(double dNewX, double dNewY, const Mat &matImg){ int x1, x2, y2, y1; float val1, val2, val3, val4; float fPixelVal = 0.0; double x,y; val1 = val2 = val3 = val4 = 0.0; x1 = (int) floor(dNewX); x2 = (int) ceil(dNewX); y2 = (int) ceil(dNewY); y1 = (int) floor(dNewY); if(x1 < 0 || y1 < 0 || x2 >= matImg.cols || y2 >= matImg.rows) return 0.0; if (x1 == x2 && y1 == y2){ // when dNewX and dNewY are both integer -> happy case no interpolation is required fPixelVal = matImg.at(y1, x1); } else if (x1 == x2 && y1 != y2){ // dNewX is integer but dNewY is not. 1D interpolation is required (not bidirectional interpolation) val1 = matImg.at(y1, x1); val2 = matImg.at(y2, x1); fPixelVal = (val2 - val1) * (dNewY - y1) / (y2 - y1) + val1; } else if (x1 != x2 && y1 == y2){ val1 = matImg.at(y1, x1); val2 = matImg.at(y1, x2); fPixelVal = (val2 - val1) * (dNewX - x1) / (x2 - x1) + val1; } else{ // bidirectional interpolation x = dNewX; y = dNewY; val1 = matImg.at(y1, x1); val2 = matImg.at(y1, x2); val3 = matImg.at(y2, x1); val4 = matImg.at(y2, x2); fPixelVal = (val1 * (x2 - x) * (y2 - y) / (x2 - x1) / (y2 - y1) + val2 * (x - x1) * (y2 - y) / (x2 - x1) / (y2 - y1) + val3 * (x2 - x) * (y - y1) / (x2 - x1) / (y2 - y1) + val4 * (x - x1) * (y - y1) / (x2 - x1) / (y2 - y1)); } return fPixelVal; } // this function for the feature refinement void ALSC::performALSC(const vector *pvecTpts, const float* pfAffStart){ ////////////////////////////////////////////////// // Start processing for each seed point ////////////////////////////////////////////////// int nLength = pvecTpts->size(); m_pvecRefTP.clear(); // clear result buffer m_vecPassList.clear(); // clear pass index for (int i = 0; i < nLength; i++) { // get a seed point Point2f ptStartL, ptStartR; ptStartL = pvecTpts->at(i).m_ptL; ptStartR = pvecTpts->at(i).m_ptR; CTiePt tp; // If the point is matched, update the result list if(doMatching (ptStartL, ptStartR, tp, pfAffStart)){ m_pvecRefTP.push_back(tp); // collect results m_vecPassList.push_back(i); } } // end of operation for all seed points } } // end namespace gotcha ================================================ FILE: src/asp/Gotcha/ALSC.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_ALSC_H #define ASP_GOTCHA_ALSC_H #include #include #include #include #include #include #include #include #include #include namespace gotcha { class ALSC { public: ALSC(); ALSC(cv::Mat imgL, cv::Mat imgR, CALSCParam paramALSC); void performALSC(const std::vector* pvecTpts , const float* pfAffStart = NULL); // Nb. it is normally used for TC refinement (i.e., verification) // pfAffStart might be needed if ALSC resumes from the previous TP results void getRefinedTps(std::vector& vecRefTP) const {vecRefTP = m_pvecRefTP;} const std::vector* getRefinedTps() {return &m_pvecRefTP;} // the result which passes the ALSC test std::vector getPassList() {return m_vecPassList;} enum{NO_ERR, OB_ERR}; private: bool isIntersecting(cv::Rect rectA, cv::Rect rectB); void getGradientX(Eigen::Ref matSrc); void getGradientY(Eigen::Ref matSrc); void distortPatch(const cv::Mat& matImg, const cv::Point2f ptCentre, const float* pfAff, Eigen::Ref matImgPatch, cv::Point2f* pptUpdated = NULL); bool doMatching(cv::Point2f ptStartL, cv::Point2f ptStartR, CTiePt& tp, const float* pfAffInt = NULL); void affineTransform(double x, double y, const cv::Point2f ptCentre, const float *pfAff, double *dNewX, double *dNewY); float interpolate(double dNewX, double dNewY, const cv::Mat &matImg); private: // inputs cv::Mat m_imgL; cv::Mat m_imgR; CALSCParam m_paramALSC; cv::Mat m_imgR_resize; int nMaxIter; int nPatchRadius; float fDisplacementThr; float fAffineThr; float fEigenThr; bool bNeedW; int nRowPatch; int nColPatch; int nSystemMatrixRows; std::vector > pfGx; std::vector > pfGy; Eigen::MatrixXf matPatchL; Eigen::MatrixXf matPatchR; Eigen::Matrix2f matC; Eigen::MatrixXf emA; Eigen::VectorXf emB; int nParam; // outputs: std::vector m_pvecRefTP; std::vector m_vecPassList; // index list which passes ALSC test }; class ALSCU16 : public ALSC { float interpolate(double dNewX, double dNewY, const cv::Mat &matImg); }; class ALSCF32 : public ALSC { float interpolate(double dNewX, double dNewY, const cv::Mat &matImg); }; } // end namespace gotcha #endif // ASP_GOTCHA_ALSC_H ================================================ FILE: src/asp/Gotcha/CALSCParam.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_CALSCPARAM_H #define ASP_GOTCHA_CALSCPARAM_H namespace gotcha { class CALSCParam { public: CALSCParam():m_nMaxIter(10),m_nPatch(30),m_fEigThr(150.f),m_fAffThr(1.5f),m_fDriftThr(0.8f), m_bWeighting(false),m_bIntOffset(true){} // matching param int m_nMaxIter; // the max num of iterations int m_nPatch; // the size of a matching patch float m_fEigThr; float m_fAffThr; float m_fDriftThr; bool m_bWeighting; bool m_bIntOffset; }; } // end namespace gotcha #endif // ASP_GOTCHA_CALSCPARAM_H ================================================ FILE: src/asp/Gotcha/CASP-GO_params.xml ================================================ 8 3 8 150 30 8 1.5 0.8 0 1 25 3 1.5 60 21 7.5 25 0 21 500 1.0 400 8 10 0.6 3 ================================================ FILE: src/asp/Gotcha/CBatchProc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include namespace fs = boost::filesystem; using namespace vw; using namespace cv; using namespace std; namespace gotcha { // Convert a float image from ASP format to an OpenCV float image // and vice-versa. Note that ASP stores an image as col, row. void aspMatToCvMat(vw::ImageView const& in, cv::Mat & out) { out = cv::Mat::zeros(in.rows(), in.cols(), CV_32F); for (int row = 0; row < out.rows; row++) { for (int col = 0; col < out.cols; col++) { out.at(row, col) = in(col, row); } } } void cvMatToAspMat(cv::Mat const& in, vw::ImageView & out) { out.set_size(in.cols, in.rows); for (int row = 0; row < in.rows; row++) { for (int col = 0; col < in.cols; col++) { out(col, row) = in.at(row, col); } } } CBatchProc::CBatchProc(std::string const & strMetaFile, vw::ImageView const & imgL, vw::ImageView const & imgR, vw::ImageView const & input_dispX, vw::ImageView const & input_dispY) { // Sanity checks if (bounding_box(imgL) != bounding_box(imgR) || bounding_box(input_dispX) != bounding_box(imgR) || bounding_box(input_dispY) != bounding_box(imgR)) vw_throw(ArgumentErr() << "Not all inputs have the same dimensions."); // initialize m_strMetaFile = strMetaFile; #if 0 m_strImgL = strLeftImagePath; m_strImgR = strRightImagePath; m_strDispX = strDisparityX; m_strDispY = strDisparityY; m_strOutPath = strOutputPrefix; #endif // Convert the inputs to cv::Mat, which is what Gotcha prefers aspMatToCvMat(imgL, m_imgL); aspMatToCvMat(imgR, m_imgR); aspMatToCvMat(input_dispX, m_input_dispX); aspMatToCvMat(input_dispY, m_input_dispY); if (!validateProjParam()){ std::cerr << "ERROR: The project input files cannot be validated" << std::endl; exit(1); } if (!validateProjInputs()){ std::cerr << "ERROR: The project input files not in correct format" << std::endl; exit(1); } } CBatchProc::~CBatchProc() { } bool CBatchProc::validateProjParam() { bool bRes = true; #if 0 // image file existence if (!fs::exists(m_strImgL)){ std::cerr << "ERROR: Left image file does not exist." << std::endl; bRes = false; } if (!fs::exists(m_strImgR)){ std::cerr << "ERROR: Right image file does not exist." << std::endl; bRes = false; } // These are passed in-memory now if (!fs::exists(m_strDispX)){ std::cerr << "Gotcha on given disparity map. ERROR: X disparity file does not exist." << std::endl; bRes = false; } if (!fs::exists(m_strDispY)){ std::cerr << "Gotcha on given disparity map. ERROR: Y disparity file does not exist." << std::endl; bRes = false; } #endif return bRes; } bool CBatchProc::validateProjInputs() { bool bRes = true; //m_input_dispX = imread(m_strDispX, CV_LOAD_IMAGE_ANYDEPTH); //m_input_dispY = imread(m_strDispY, CV_LOAD_IMAGE_ANYDEPTH); if ((m_input_dispX.depth()!=2 && m_input_dispX.depth()!=5)|| (m_input_dispY.depth()!=2 && m_input_dispY.depth()!=5)){ bRes = false; std::cerr << "Gotcha on given disparity map. ERROR: Input x/y disparity map not in 16bit unsigned integer or 32bit floating point" << std::endl; } if (m_input_dispX.channels()!=1 || m_input_dispY.channels()!=1){ bRes = false; std::cerr << "Gotcha on given disparity map. ERROR: Please take single channel image as input x/y disparity map" << std::endl; } //std::cout << "Generating bad pixel/gap mask file." << std::endl; generateMask(); //std::cout << "Reading mask: " << m_strMask << std::endl; //Mat Mask = imread(m_strMask, CV_LOAD_IMAGE_ANYDEPTH); if (m_Mask.depth()!=0 || m_Mask.channels()!=1){ bRes = false; std::cerr << "ERROR: Input mask file not in 8 bit single channel unsigned int format" << std::endl; } return bRes; } void CBatchProc::doBatchProcessing(vw::ImageView & output_dispX, vw::ImageView & output_dispY) { //std::cout << "Starting processing now..." << std::endl // << "================================" << std::endl << std::endl; std::vector vecTPs; generateTPFile(vecTPs); refinement(vecTPs, output_dispX, output_dispY); //std::cout << "Process completed" << std::endl; //std::cout << std::endl; //std::cout << "================================" << std::endl << std::endl; } void CBatchProc::generateMask() { // These are kept in memory now, no need to read them from disk #if 0 string strMask = "-GM.tif"; m_strMask = m_strOutPath + strMask; m_input_dispX = imread(m_strDispX, CV_LOAD_IMAGE_ANYDEPTH); m_input_dispY = imread(m_strDispY, CV_LOAD_IMAGE_ANYDEPTH); #endif m_Mask = Mat::zeros(m_input_dispX.size(), CV_8UC1); if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){ for (int i=0; i(i,j)==65535 || m_input_dispY.at(i,j)==65535) m_Mask.at(i,j)=1; } } //std::cout << "Writing mask: " << m_strMask << std::endl; //imwrite(m_strMask, Mask); } else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){ int numBadpixel = 0; for (int i=0; i(i,j)==0.0) { //Nodata value of ASP disparity is 0. m_Mask.at(i,j)=1; numBadpixel+=1; } } } //std::cout << "GAP Pixels masked: " << numBadpixel << std::endl; //std::cout << "Writing mask: " << m_strMask << std::endl; //imwrite(m_strMask, Mask); } } void CBatchProc::generateTPFile(std::vector & vecTPs) { // Wipe the output vecTPs.clear(); cv::Mat dispX, dispY; m_input_dispX.copyTo(dispX); m_input_dispY.copyTo(dispY); // Turn this logic off, as the data is kept in memory #if 0 dispX = imread(m_strDispX, CV_LOAD_IMAGE_ANYDEPTH); dispY = imread(m_strDispY, CV_LOAD_IMAGE_ANYDEPTH); std::cout << "Reading mask: " << m_strMask << std::endl; Mat Mask = imread(m_strMask, CV_LOAD_IMAGE_ANYDEPTH); Mask.convertTo(Mask, CV_8UC1); #endif //string strTPFile = "-TP.txt"; //m_strTPFile = m_strOutPath + strTPFile; if (dispX.depth()==2 && dispY.depth()==2){ dispX.convertTo(dispX, CV_16UC1); dispY.convertTo(dispY, CV_16UC1); for (int i=0; i(i,j)==1){ dispX.at(i,j)=65535; dispY.at(i,j)=65535; } } } } else if (dispX.depth()==5 && dispY.depth()==5){ dispX.convertTo(dispX, CV_32FC1); dispY.convertTo(dispY, CV_32FC1); for (int i=0; i(i,j)==1){ dispX.at(i,j)= 0.0; dispY.at(i,j)= 0.0; } } } } if (dispX.depth()==2 && dispY.depth()==2){ Mat dispX_tmp(dispX.size(),CV_16UC1); Mat dispY_tmp(dispY.size(),CV_16UC1); dispX.copyTo(dispX_tmp); dispY.copyTo(dispY_tmp); for (int i=1; i(i-1,j-1)!=65535 && dispX.at(i-1,j)!=65535 && dispX.at(i-1,j+1)!=65535 && dispX.at(i,j-1)!=65535 && dispX.at(i,j+1)!=65535 && dispX.at(i+1,j-1)!=65535 && dispX.at(i+1,j)!=65535 && dispX.at(i+1,j+1)!=65535 && dispY.at(i-1,j-1)!=65535 && dispY.at(i-1,j)!=65535 && dispY.at(i-1,j+1)!=65535 && dispY.at(i,j-1)!=65535 && dispY.at(i,j+1)!=65535 && dispY.at(i+1,j-1)!=65535 && dispY.at(i+1,j)!=65535 && dispY.at(i+1,j+1)!=65535){ dispX_tmp.at(i,j)=65535; dispY_tmp.at(i,j)=65535; } } } dispX_tmp.copyTo(dispX); dispY_tmp.copyTo(dispY); } else if (dispX.depth()==5 && dispY.depth()==5){ Mat dispX_tmp(dispX.size(),CV_32FC1); Mat dispY_tmp(dispY.size(),CV_32FC1); Mat dispX_tmp2(dispX.size(),CV_32FC1); Mat dispY_tmp2(dispY.size(),CV_32FC1); // Only leave the gap border pixels to speed-up the process. // Should be cancelled if use sGotcha dispX.copyTo(dispX_tmp); dispY.copyTo(dispY_tmp); for (int i=1; i(i-1,j-1)!=0.0 && dispX.at(i-1,j)!=0.0 && dispX.at(i-1,j+1)!=0.0 && dispX.at(i,j-1)!=0.0 && dispX.at(i,j+1)!=0.0 && dispX.at(i+1,j-1)!=0.0 && dispX.at(i+1,j)!=0.0 && dispX.at(i+1,j+1)!=0.0 && dispY.at(i-1,j-1)!=0.0 && dispY.at(i-1,j)!=0.0 && dispY.at(i-1,j+1)!=0.0 && dispY.at(i,j-1)!=0.0 && dispY.at(i,j+1)!=0.0 && dispY.at(i+1,j-1)!=0.0 && dispY.at(i+1,j)!=0.0 && dispY.at(i+1,j+1)!=0.0){ dispX_tmp.at(i,j)= 0.0; dispY_tmp.at(i,j)= 0.0; } } } dispX_tmp.copyTo(dispX_tmp2); dispY_tmp.copyTo(dispY_tmp2); for (int i=1; i(i,j)!=0.0 && dispX_tmp.at(i,j) ==0.0 && (dispX_tmp.at(i-1,j-1)!=0.0 || dispX_tmp.at(i-1,j)!=0.0 || dispX_tmp.at(i-1,j+1)!=0.0 || dispX_tmp.at(i,j-1)!=0.0 || dispX_tmp.at(i,j+1)!=0.0 || dispX_tmp.at(i+1,j-1)!=0.0 || dispX_tmp.at(i+1,j)!=0.0 || dispX_tmp.at(i+1,j+1)!=0.0 ) ){ dispX_tmp2.at(i,j) = dispX.at(i,j); dispY_tmp2.at(i,j) = dispY.at(i,j); } } } //double the TPs dispX_tmp2.copyTo(dispX); dispY_tmp2.copyTo(dispY); } if (dispX.depth()==2 && dispY.depth()==2){ dispX.convertTo(dispX, CV_16UC1); dispY.convertTo(dispY, CV_16UC1); vector Lx, Ly; vector Rx, Ry; for (int i=0; i(i,j)!=65535 && dispY.at(i,j)!=65535){ unsigned short lx, ly; float rx, ry; lx = j; ly = i; rx = j + (dispX.at(i,j)-16384)/16.; ry = i + (dispY.at(i,j)-16384)/16.; Lx.push_back(lx); Ly.push_back(ly); Rx.push_back(rx); Ry.push_back(ry); } } } #if 1 // Keep the TP in memory, not on disk, this way one can run multiple threads // doing Gotcha. int nLen = Lx.size(); vecTPs.resize(nLen); for (int i = 0 ; i < nLen; i++){ unsigned short lx, ly; float rx, ry; lx = Lx.at(i); ly = Ly.at(i); rx = Rx.at(i); ry = Ry.at(i); CTiePt tp; tp.m_ptL.x = lx; tp.m_ptL.y = ly; tp.m_ptR.x = rx; tp.m_ptR.y = ry; tp.m_fSimVal = 0.5; vecTPs[i] = tp; } #else ofstream sfTP; std::cout << "Writing: " << m_strTPFile << std::endl; sfTP.open(m_strTPFile.c_str()); sfTP.precision(10); int nLen = Lx.size(); int nEle = 5; if (sfTP.is_open()){ sfTP << nLen << " " << nEle << std::endl; for (int i = 0 ; i < nLen ;i++){ unsigned short lx, ly; float rx, ry; lx = Lx.at(i); ly = Ly.at(i); rx = Rx.at(i); ry = Ry.at(i); sfTP << lx << " " << ly << " " << rx << " " << ry << " " << 0.5 << " " << std::endl; } sfTP.close(); } else { std::cout << "ERROR: Can not convert X/Y disparity map to TP file. " << "Please check the directory for storing Gotcha results is writable." << std::endl; } #endif } else if (dispX.depth()==5 && dispY.depth()==5){ dispX.convertTo(dispX, CV_32FC1); dispY.convertTo(dispY, CV_32FC1); vector Lx, Ly; vector Rx, Ry; for (int i=0; i(i,j)!= 0.0 && dispY.at(i,j)!=0.0){ //nodata should be -3.40282346639e+038, but ASP disparity map uses 0 as nodata unsigned short lx, ly; float rx, ry; lx = j; ly = i; rx = j + dispX.at(i,j); ry = i + dispY.at(i,j); Lx.push_back(lx); Ly.push_back(ly); Rx.push_back(rx); Ry.push_back(ry); } } } #if 1 // Keep the TP in memory, not on disk, this way one can run multiple threads // doing Gotcha. int nLen = Lx.size(); vecTPs.resize(nLen); for (int i = 0 ; i < nLen; i++){ unsigned short lx, ly; float rx, ry; lx = Lx.at(i); ly = Ly.at(i); rx = Rx.at(i); ry = Ry.at(i); CTiePt tp; tp.m_ptL.x = lx; tp.m_ptL.y = ly; tp.m_ptR.x = rx; tp.m_ptR.y = ry; tp.m_fSimVal = 0.5; vecTPs[i] = tp; } #else ofstream sfTP; sfTP.open(m_strTPFile.c_str()); std::cout << "Writing: " << m_strTPFile << std::endl; sfTP.precision(10); int nLen = Lx.size(); int nEle = 5; if (sfTP.is_open()){ sfTP << nLen << " " << nEle << std::endl; for (int i = 0 ; i < nLen ;i++){ unsigned short lx, ly; float rx, ry; lx = Lx.at(i); ly = Ly.at(i); rx = Rx.at(i); ry = Ry.at(i); sfTP << lx << " " << ly << " " << rx << " " << ry << " " << 0.5 << " " << std::endl; } sfTP.close(); } else { std::cout << "ERROR: Can not convert X/Y disparity map to TP file. " << "Please check the directory for storing Gotcha results is writable." << std::endl; } #endif } } void CBatchProc::refinement(std::vector const& vecTPs, vw::ImageView & output_dispX, vw::ImageView & output_dispY) { //std::cout << "Gotcha densification based on existing disparity map:" << std::endl; FileStorage fs(m_strMetaFile, FileStorage::READ); FileNode tl = fs["sGotchaParam"]; // read GOTCHA param CDensifyParam paramDense; paramDense.m_nProcType = 0; paramDense.m_paramGotcha.m_fDiffCoef = 0.05; paramDense.m_paramGotcha.m_fDiffThr = 0.1; paramDense.m_paramGotcha.m_nDiffIter = 5; //paramDense.m_paramGotcha.m_nMinTile = (int)tl["nMinTile"]; //Mat matDummy = imread(m_strImgL, CV_LOAD_IMAGE_ANYDEPTH); paramDense.m_paramGotcha.m_nMinTile = m_imgL.cols + m_imgL.rows; paramDense.m_paramGotcha.m_nNeiType = (int)tl["nNeiType"]; paramDense.m_paramGotcha.m_paramALSC.m_bIntOffset = (int)tl["bIntOffset"]; paramDense.m_paramGotcha.m_paramALSC.m_bWeighting = (int)tl["bWeight"]; paramDense.m_paramGotcha.m_paramALSC.m_fAffThr = (float)tl["fAff"]; paramDense.m_paramGotcha.m_paramALSC.m_fDriftThr = (float)tl["fDrift"]; paramDense.m_paramGotcha.m_paramALSC.m_fEigThr = (float)tl["fMaxEigenValue"]; paramDense.m_paramGotcha.m_paramALSC.m_nMaxIter = (int)tl["nALSCIteration"]; paramDense.m_paramGotcha.m_paramALSC.m_nPatch = (int)tl["nALSCKernel"]; #if 0 string strBase = m_strOutPath; string strTPFile = "-TP.txt"; paramDense.m_strTPFile = strBase + strTPFile; paramDense.m_paramGotcha.m_strMask = m_strMask; string strUpdatedDispX = "-c1_refined.txt"; paramDense.m_strUpdatedDispX = strBase + strUpdatedDispX; string strUpdatedDispY = "-c2_refined.txt"; paramDense.m_strUpdatedDispY = strBase + strUpdatedDispY; string strUpdatedDispSim = "-uncertainty.txt"; paramDense.m_strUpdatedDispSim = strBase + strUpdatedDispSim; paramDense.m_strImgL = m_strImgL; paramDense.m_strImgR = m_strImgR; paramDense.m_strOutPath = m_strOutPath; paramDense.m_strDispX = m_strDispX; paramDense.m_strDispY = m_strDispY; paramDense.m_Mask = m_Mask; #endif CDensify densify(paramDense, vecTPs, m_imgL, m_imgR, m_input_dispX, m_input_dispY, m_Mask); //std::cout << "CASP-GO INFO: performing Gotcha densification" << std::endl; cv::Mat cv_output_dispX, cv_output_dispY; int nErrCode = densify.performDensitification(cv_output_dispX, cv_output_dispY); if (nErrCode != CDensifyParam::NO_ERR){ std::cerr << "Warning: Processing error on densifying operation (ERROR CODE: " << nErrCode << " )" << std::endl; } // Export the data to ASP cvMatToAspMat(cv_output_dispX, output_dispX); cvMatToAspMat(cv_output_dispY, output_dispY); } Point3f CBatchProc::rotate(Point3f ptIn, Mat matQ, bool bInverse){ // this believe matQ is a unit vector Point3f ptRes; float p[4] = {0, ptIn.x, ptIn.y, ptIn.z}; float q[4]; float q_inv[4]; // get quaternion vector for(int i = 0; i < 4; i++) { q[i] = matQ.at(i,0); q_inv[i] = -1 * matQ.at(i,0); } q_inv[0] = -1 * q_inv[0]; // q = [w x y z] and q^-1 = [w -x -y -z] // compute rotation // [0 v'] = q[0 v]q^-1 float pfTemp[4] = {0.f,}; float pfTemp2[4] = {0.f,}; if (bInverse){ quaternionMultiplication(q_inv, p, pfTemp); quaternionMultiplication(pfTemp, q, pfTemp2); } else{ quaternionMultiplication(q, p, pfTemp); quaternionMultiplication(pfTemp, q_inv, pfTemp2); } ptRes.x = pfTemp2[1]; ptRes.y = pfTemp2[2]; ptRes.z = pfTemp2[3]; return ptRes; } void CBatchProc::quaternionMultiplication(const float* p, const float* q, float* pfOut){ // compute p*q = pfOut // x = q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x; // y = -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y; // z = q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z; // w = -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w; // float a = p[0], b = p[1], c = p[2], d =p[3]; pfOut[0] = p[0]*q[0] - (p[1]*q[1]+p[2]*q[2]+p[3]*q[3]); // w1*w2-v1.v2; pfOut[1] = p[1]*q[0] + p[2]*q[3] - p[3]*q[2] + p[0]*q[1]; pfOut[2] = -1*p[1]*q[3] + p[2]*q[0] + p[3]*q[1] + p[0]*q[2]; pfOut[3] = p[1]*q[2] - p[2]*q[1] + p[3]*q[0] + p[0]*q[3]; } } // end namespace gotcha ================================================ FILE: src/asp/Gotcha/CBatchProc.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_CBATCHPROC_H #define ASP_GOTCHA_CBATCHPROC_H #include #include #include #include #include #include #include #include #include #include #include #include namespace gotcha { class CBatchProc { public: CBatchProc(std::string const & strMetaFile, vw::ImageView const & imgL, vw::ImageView const & imgR, vw::ImageView const & input_dispX, vw::ImageView const & input_dispY); ~CBatchProc(); void doBatchProcessing(vw::ImageView & output_dispX, vw::ImageView & output_dispY); private: void setProjParameter(); bool validateProjParam(); bool validateProjInputs(); void generateMask(); void generateTPFile(std::vector & vecTPs); cv::Point3f rotate(cv::Point3f ptIn, cv::Mat matQ, bool bInverse); void quaternionMultiplication(const float* p, const float* q, float* pfOut); protected: // processing void refinement(std::vector const& vecTPs, vw::ImageView & output_dispX, vw::ImageView & output_dispY); protected: std::string m_strMetaFile; // file path to the Metadata file #if 0 std::string m_strImgL; std::string m_strImgR; std::string m_strDispX; std::string m_strDispY; string m_strMask; std::string m_strTPFile; std::string m_strOutPath; // a user-supplied file path for the output directory #endif cv::Mat m_imgL, m_imgR; cv::Mat m_input_dispX, m_input_dispY; cv::Mat m_Mask; }; // Apply Gotcha refinement to each padded tile class GotchaPerBlockView: public vw::ImageViewBase{ vw::ImageViewRef> m_input_disp; vw::ImageViewRef m_left_img, m_right_img; int m_padding; std::string m_casp_go_param_file; typedef vw::PixelMask PixelT; public: GotchaPerBlockView(vw::ImageViewRef> input_disp, vw::ImageViewRef left_img, vw::ImageViewRef right_img, int padding, std::string const& casp_go_param_file): m_input_disp(input_disp), m_left_img(left_img), m_right_img(right_img), m_padding(padding), m_casp_go_param_file(casp_go_param_file){} typedef PixelT pixel_type; typedef PixelT result_type; typedef vw::ProceduralPixelAccessor pixel_accessor; inline vw::int32 cols() const { return m_input_disp.cols(); } inline vw::int32 rows() const { return m_input_disp.rows(); } inline vw::int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); } inline pixel_type operator()( double/*i*/, double/*j*/, vw::int32/*p*/ = 0 ) const { vw::vw_throw(vw::NoImplErr() << "GotchaPerBlockView::operator()(...) is not implemented"); return pixel_type(); } typedef vw::CropView> prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const { // Need to see a bit more of the input image to avoid tiling artifacts vw::BBox2i biased_box = bbox; biased_box.expand(m_padding); biased_box.crop(bounding_box(m_input_disp)); // Run Gotcha on the expanded and cropped tile. // TODO(oalexan1): Verify that it assumes a value of 0 for invalid disparities vw::ImageView cropped_disp = crop(m_input_disp, biased_box); vw::ImageView output_dispX, output_dispY; CBatchProc batchProc(m_casp_go_param_file, crop(m_left_img, biased_box), crop(m_right_img, biased_box), vw::select_channel(cropped_disp, 0), vw::select_channel(cropped_disp, 1)); batchProc.doBatchProcessing(output_dispX, output_dispY); // Integrate back the processed bands. vw::select_channel(cropped_disp, 0) = output_dispX; vw::select_channel(cropped_disp, 1) = output_dispY; return prerasterize_type(cropped_disp, -biased_box.min().x(), -biased_box.min().y(), cols(), rows()); } template inline void rasterize(DestT const& dest, vw::BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; GotchaPerBlockView gotcha_refine(vw::ImageViewRef> input_disp, vw::ImageViewRef left_img, vw::ImageViewRef right_img, int padding, std::string const& casp_go_param_file){ return GotchaPerBlockView(input_disp, left_img, right_img, padding, casp_go_param_file); } } // end namespace gotcha #endif // ASP_GOTCHA_CBATCHPROC_H ================================================ FILE: src/asp/Gotcha/CDensify.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include #include using namespace std; using namespace cv; namespace gotcha { CDensify::CDensify(){} CDensify::CDensify(CDensifyParam paramDense, std::vector const& vecTPs, cv::Mat imgL, cv::Mat imgR, cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask){ setParameters(paramDense, vecTPs, imgL, imgR, input_dispX, input_dispY, Mask); } void CDensify::setParameters(CDensifyParam paramDense, std::vector const& vecTPs, cv::Mat imgL, cv::Mat imgR, cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask){ m_paramDense = paramDense; m_vecTPs = vecTPs; m_imgL = imgL; m_imgR = imgR; m_input_dispX = input_dispX; m_input_dispY = input_dispY; m_Mask = Mask; // loadImages(); // m_nCount = 0; // cout << m_paramDense.m_paramGotcha.m_paramALSC.m_fEigThr<< endl; } #if 0 void CDensify::loadImages(){ string strImgL, strImgR; // get input images strImgL = m_paramDense.m_strImgL; strImgR = m_paramDense.m_strImgR; setImages(strImgL, strImgR); } #endif #if 0 bool CDensify::loadTPForDensification(string strTPFile){ bool bRes = true; bRes = loadTP(strTPFile); return bRes; } #endif int CDensify::performDensitification(cv::Mat & output_dispX, cv::Mat & output_dispY){ /////////////////////////////////////////// // validate the input images /////////////////////////////////////////// if ( m_imgL.data == NULL || m_imgR.data == NULL) return CDensifyParam::FILE_IO_ERR; #if 0 // TP are now kept in memory the whole time, so no need to load them if (!loadTPForDensification(m_paramDense.m_strTPFile)) return CDensifyParam::FILE_IO_ERR; #endif if(m_paramDense.m_nProcType == CDensifyParam::GOTCHA){ double start = getTickCount(); // Generate integer-float seed points (nb. feature detection only gives float-float seed points) // Also, this is necessary to keep the original seed data, as initial ALSC will remove some seeds if selected. //Function below run initial ALSC on disparity based TPs. If use, need to change: //1. doGotcha(m_imgL, m_imgR, vecSeedTemp, m_paramDense.m_paramGotcha, m_vectpAdded) //2. m_vectpAdded.insert(m_vectpAdded.end(), vecSeedTemp.begin(), vecSeedTemp.end()); //3. need some change in doPGotcha //IMARS still need initial ALSC vector vecSeedTemp = getIntToFloatSeed(m_vecTPs); m_vecTPs.clear(); for (int j = 0; j < (int)vecSeedTemp.size(); j++){ CTiePt tpTemp = vecSeedTemp.at(j); m_vecTPs.push_back(tpTemp); } //IMARS still need initial ALSC //cout << "CASP-GO INFO: starting Gotcha" << endl; if (!doGotcha(m_imgL, m_imgR, m_vecTPs, m_paramDense.m_paramGotcha, m_vectpAdded)) return CDensifyParam::GOTCHA_ERR; // remove TP with large y disparity // nb. sometimes large y disparity can be produced even from a rectified pair double dYLimit = 100; vector::iterator iter; for (iter = m_vectpAdded.begin(); iter < m_vectpAdded.end(); ){ double dy = iter->m_ptL.y - iter->m_ptR.y; dy = sqrt(dy*dy); if (dy > dYLimit) m_vectpAdded.erase(iter); else iter++; } m_vectpAdded.insert(m_vectpAdded.end(), m_vecTPs.begin(), m_vecTPs.end()); double end = getTickCount(); procTime = (end - start)/getTickFrequency(); //cout << "CASP-GO INFO: making data products" << endl; makeDataProducts(); if (!saveResult(output_dispX, output_dispY)) return CDensifyParam::FILE_IO_ERR; // Do not save the log, this is hard to manage with multiple instances // running in parallel. //if (!saveLog()) // return CDensifyParam::FILE_IO_ERR; } else if (m_paramDense.m_nProcType == CDensifyParam::P_GOTCHA){ double start = getTickCount(); if (!doPGotcha(m_paramDense.m_paramGotcha.m_nNeiType)) return CDensifyParam::P_GOTCHA_ERR; // remove TP with large y disparity double dYLimit = 100; //IMARS vector::iterator iter; for (iter = m_vectpAdded.begin(); iter < m_vectpAdded.end(); ){ double dy = iter->m_ptL.y - iter->m_ptR.y; dy = sqrt(dy*dy); if (dy > dYLimit) m_vectpAdded.erase(iter); else iter++; } m_vectpAdded.insert(m_vectpAdded.end(), m_vecTPs.begin(), m_vecTPs.end()); double end = getTickCount(); procTime = (end - start)/getTickFrequency(); makeDataProducts(); if (!saveResult(output_dispX, output_dispY)) return CDensifyParam::FILE_IO_ERR; // Do not save the log, this is hard to manage with multiple instances // running in parallel. //if (!saveLog()) // return CDensifyParam::FILE_IO_ERR; } return CDensifyParam::NO_ERR; } vector CDensify::getIntToFloatSeed(vector& vecTPSrc) { vector vecRes; int nLen = vecTPSrc.size(); for (int i = 0; i < nLen; i++){ //get four neighbours CTiePt tp = vecTPSrc.at(i); Point2f ptL = tp.m_ptL; Point2f ptR = tp.m_ptR; float dX = 0, dY = 0; // xy offset to make integer seed dX = floor(ptL.x) - ptL.x; dY = floor(ptL.y) - ptL.y; if (dX == 0 && dY == 0){ vecRes.push_back(tp); continue; } Point2f ptDelta(dX,dY); Point2f ptIntL = ptL + ptDelta; // ptIntL may be in float if ptL is came from the Rectified coordinate Point2f ptIntR = ptR + ptDelta; ///////////////////////////////////////////////////// // collect 4 integer seed and validate ///////////////////////////////////////////////////// CTiePt tpTemp = tp; vector vectpSeeds; // pt1 (top-left) tpTemp.m_ptL = ptIntL; tpTemp.m_ptR = ptIntR; vectpSeeds.push_back(tpTemp); // pt2 (top-right) tpTemp.m_ptL = ptIntL + Point2f(1, 0); tpTemp.m_ptR = ptIntR + Point2f(1, 0); vectpSeeds.push_back(tpTemp); // pt3 (bottom-left) tpTemp.m_ptL = ptIntL + Point2f(0, 1); tpTemp.m_ptR = ptIntR + Point2f(0, 1); vectpSeeds.push_back(tpTemp); // pt 4 (bottom-right) tpTemp.m_ptL = ptIntL + Point2f(1, 1); tpTemp.m_ptR = ptIntR + Point2f(1, 1); vectpSeeds.push_back(tpTemp); //apply ALSC to collect as new seed ALSC alsc(m_imgL, m_imgR, m_paramDense.m_paramGotcha.m_paramALSC); alsc.performALSC(&vectpSeeds); vectpSeeds.clear(); alsc.getRefinedTps(vectpSeeds); // hard-copy for (int j = 0; j < (int)vectpSeeds.size(); j++){ CTiePt tpRef = vectpSeeds.at(j); if (tpRef.m_fSimVal != CTiePt::NOT_DEF){ vecRes.push_back(tpRef); } } } return vecRes; } bool CDensify::saveProjLog(string strFile){ return true; #if 0 std::cout << "Writing log " << strFile << std::endl; bool bRes = false; ofstream sfLog; sfLog.open(strFile.c_str(), ios::app | ios::out); string strProcType = getProcType(); if (sfLog.is_open()){ sfLog << "" << endl; sfLog << "Input left image path: " << m_paramDense.m_strImgL << endl; sfLog << "Input right image path: " << m_paramDense.m_strImgR << endl; sfLog << "Processing type: " << strProcType << endl; sfLog << "Input x disparity map path: " << m_paramDense.m_strDispX << endl; sfLog << "Input y disparity map path: " << m_paramDense.m_strDispY << endl; sfLog << "Output tie-point file (from disparity) path: " << m_paramDense.m_strTPFile << endl; sfLog << "Input/output mask file path: " << m_paramDense.m_paramGotcha.m_strMask << endl; sfLog << "Output x disparity map path: " << m_paramDense.m_strUpdatedDispX << endl; sfLog << "Output y disparity map path: " << m_paramDense.m_strUpdatedDispY << endl; sfLog << endl; sfLog.close(); bRes = true; } else return bRes = false; return bRes; #endif } bool CDensify::saveLog(){ return true; #if 0 string FILE_LOG = "-GLog.txt"; string strFile = m_paramDense.m_strOutPath + FILE_LOG; bool bRes = false; // save parameter log //bRes = saveProjLog(strFile); bRes = saveGOTCHAParam(m_paramDense.m_paramGotcha, strFile); bRes = bRes && saveALSCParam(m_paramDense.m_paramGotcha.m_paramALSC, strFile); // save result log bRes = bRes && saveResLog(strFile); return bRes; #endif } bool CDensify::saveResLog(string strFile){ return true; #if 0 bool bRes = false; int nNumFinalTPs = nNumSeedTPs+m_vectpAdded.size(); ofstream sfLog; sfLog.open(strFile.c_str(), ios::app | ios::out); if (sfLog.is_open()){ sfLog << "" << endl; sfLog << "Processing method: " << m_paramDense.getProcessingType() << endl; sfLog << "Total number of seed TPs: " << nNumSeedTPs << endl; sfLog << "Total number of final TPs: " << nNumFinalTPs << endl; sfLog << "Total processing time(sec): " << procTime << endl; sfLog << endl; sfLog << endl; sfLog.close(); bRes = true; } else return bRes = false; return bRes; #endif } void CDensify::makeDataProducts(){ // prepare output data product from the list of densified tiepoints // make output products (disparity map x,y and sim) int nW = m_imgL.cols; int nH = m_imgL.rows; // clear&initialise output buffers m_matDisMapX = Mat::ones(nH, nW, CV_32FC1)*0.0; m_matDisMapY = Mat::ones(nH, nW, CV_32FC1)*0.0; m_matDisMapSim = Mat::ones(nH, nW, CV_32FC1)*-1; // fill the disparity map int nLen = m_vectpAdded.size(); for (int i = 0 ; i < nLen; i++){ CTiePt tp = m_vectpAdded.at(i); Point2f ptL = tp.m_ptL; Point2f ptR = tp.m_ptR; float fSim = tp.m_fSimVal; int x = (int) ptL.x; int y = (int) ptL.y; Rect_ rect(0,0,nW,nH); if (rect.contains(Point2i(x,y))) { m_matDisMapX.at(y,x) = ptR.x - x; m_matDisMapY.at(y,x) = ptR.y - y; m_matDisMapSim.at(y,x) = fSim; } } } bool CDensify::saveResult(cv::Mat & output_dispX, cv::Mat & output_dispY){ bool bRes = true; //string strFile = m_paramDense.m_strTPFile; //bRes = saveTP(m_vectpAdded, strFile); //cout << "Writing results..." << endl; output_dispX = Mat::ones(m_matDisMapX.size(), CV_32FC1)*0.0; output_dispY = Mat::ones(m_matDisMapY.size(), CV_32FC1)*0.0; for (int i =0; i(i,j)!= 0.0){ //-3.40282346639e+038 float disp = m_matDisMapX.at(i,j); output_dispX.at(i,j)=disp; } } } for (int i =0; i(i,j)!= 0.0){ float disp = m_matDisMapY.at(i,j); output_dispY.at(i,j)=disp; } } } //Mat m_input_dispX = imread(m_paramDense.m_strDispX, CV_LOAD_IMAGE_ANYDEPTH); //Mat m_input_dispY = imread(m_paramDense.m_strDispY, CV_LOAD_IMAGE_ANYDEPTH); //std::cout << "Reading mask: " << m_paramDense.m_strMask << std::endl; //Mat Mask = imread(m_paramDense.m_strMask, CV_LOAD_IMAGE_ANYDEPTH); //Mask.convertTo(Mask, CV_8UC1); nNumSeedTPs = 0; if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){ for (int i=0; i(i,j)==1){ m_input_dispX.at(i,j)=65535; m_input_dispY.at(i,j)=65535; } } } } else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){ for (int i=0; i(i,j)==1){ m_input_dispX.at(i,j)= 0.0; m_input_dispY.at(i,j)= 0.0; } } } } if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){ for (int i=0; i(i,j)!=65535 && m_input_dispY.at(i,j)!=65535) nNumSeedTPs+=1; } } } else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){ for (int i=0; i(i,j)!= 0.0 && m_input_dispY.at(i,j)!= 0.0) nNumSeedTPs+=1; } } } //Recover values of original disp map if (m_input_dispX.depth()==2 && m_input_dispY.depth()==2){ for (int i =0; i(i,j)!=65535) output_dispX.at(i,j)=m_input_dispX.at(i,j); if (m_input_dispY.at(i,j)!=65535) output_dispY.at(i,j)=m_input_dispY.at(i,j); } } } else if (m_input_dispX.depth()==5 && m_input_dispY.depth()==5){ for (int i =0; i(i,j)!= 0.0){ //IMARS float disp = m_input_dispX.at(i,j); //IMARS output_dispX.at(i,j)=disp; //IMARS } if (m_input_dispY.at(i,j)!= 0.0){ //IMARS float disp = m_input_dispY.at(i,j); //IMARS output_dispY.at(i,j)=disp; //IMARS } } } } //Cancelled in IMARS, since using sGotcha, we have whole map. #if 0 // The outputs are now passed out rather than saved to disk string strFileC1 = m_paramDense.m_strUpdatedDispX; bRes = bRes && saveMatrix(output_dispX, strFileC1); //imwrite(strFile, output_dispX); string strFileC2 = m_paramDense.m_strUpdatedDispY; bRes = bRes && saveMatrix(output_dispY, strFileC2); //imwrite(strFile, output_dispY); // Do not write this file as it is not used. If needed, such a // file must be written for every tile ASP processes. string strFileC3 = m_paramDense.m_strUpdatedDispSim; std::cout << "Saving matrix: " << strFileC3 << std::endl; bRes = bRes && saveMatrix(m_matDisMapSim, strFileC3); string strC1Tiff = "-c1_refined.tif"; string strC2Tiff = "-c2_refined.tif"; string strC3Tiff = "-uncertainty.tif"; string strFileC1Tiff = m_paramDense.m_strOutPath + strC1Tiff; string strFileC2Tiff = m_paramDense.m_strOutPath + strC2Tiff; string strFileC3Tiff = m_paramDense.m_strOutPath + strC3Tiff; ostringstream strCmdGdalConversionC1; strCmdGdalConversionC1 << "gdal_translate " << strFileC1 << " -of GTiff " << strFileC1Tiff; std::cout << strCmdGdalConversionC1.str() << std::endl; system(strCmdGdalConversionC1.str().c_str()); ostringstream strCmdGdalConversionC2; strCmdGdalConversionC2 << "gdal_translate " << strFileC2 << " -of GTiff " << strFileC2Tiff; std::cout << strCmdGdalConversionC2.str() << std::endl; system(strCmdGdalConversionC2.str().c_str()); ostringstream strCmdGdalConversionC3; strCmdGdalConversionC3 << "gdal_translate " << strFileC3 << " -of GTiff " << strFileC3Tiff; std::cout << strCmdGdalConversionC3.str() << std::endl; system(strCmdGdalConversionC3.str().c_str()); #endif return bRes; } void CDensify::getNeighbour(const CTiePt tp, vector& vecNeiTp, const int nNeiType, const Mat& matSim){ // Point2f ptLeft = tp.m_ptL; Point2f ptRight = tp.m_ptR; if (nNeiType == CGOTCHAParam::NEI_DIFF){ getDisffusedNei(vecNeiTp, tp, matSim); } /*if(nNeiType == CGOTCHAParam::NEI_X || nNeiType == CGOTCHAParam::NEI_Y || nNeiType == CGOTCHAParam::NEI_4 || nNeiType == CGOTCHAParam::NEI_8)*/ else { if (nNeiType == CGOTCHAParam::NEI_4 || nNeiType == CGOTCHAParam::NEI_Y || nNeiType == CGOTCHAParam::NEI_8){ CTiePt tp2; tp2.m_ptL = ptLeft + Point2f(0,1); tp2.m_ptR = ptRight + Point2f(0,1); vecNeiTp.push_back(tp2); tp2.m_ptL = ptLeft + Point2f(0,-1); tp2.m_ptR = ptRight + Point2f(0,-1); vecNeiTp.push_back(tp2); } if (nNeiType == CGOTCHAParam::NEI_X || nNeiType == CGOTCHAParam::NEI_4 || nNeiType == CGOTCHAParam::NEI_8){ CTiePt tp; tp.m_ptL = ptLeft + Point2f(1,0); tp.m_ptR = ptRight + Point2f(1,0); vecNeiTp.push_back(tp); tp.m_ptL = ptLeft + Point2f(-1,0); tp.m_ptR = ptRight + Point2f(-1,0); vecNeiTp.push_back(tp); } if (nNeiType == CGOTCHAParam::NEI_8){ CTiePt tp8; tp8.m_ptL = ptLeft + Point2f(-1,-1); tp8.m_ptR = ptRight + Point2f(-1,-1); vecNeiTp.push_back(tp8); tp8.m_ptL = ptLeft + Point2f(1,1); tp8.m_ptR = ptRight + Point2f(1,1); vecNeiTp.push_back(tp8); tp8.m_ptL = ptLeft + Point2f(-1,1); tp8.m_ptR = ptRight + Point2f(-1,1); vecNeiTp.push_back(tp8); tp8.m_ptL = ptLeft + Point2f(1,-1); tp8.m_ptR = ptRight + Point2f(1,-1); vecNeiTp.push_back(tp8); } } } void CDensify::getDisffusedNei(vector& vecNeiTp, const CTiePt tp, const Mat& matSim){ // estimate the growth // make a diffusion map int nSzDiff = m_paramDense.m_paramGotcha.m_paramALSC.m_nPatch;//12 double pdDiffMap[nSzDiff*2+1][nSzDiff*2+1]; int nW = m_imgL.cols;//m_imgL.getMaxX()+1;//m_imgL.getWidth(); int nH = m_imgL.rows;//m_imgL.getMaxY()+1;//m_imgL.getHeight(); Rect rectRegion(0,0,nW, nH); Point2f ptLeft = tp.m_ptL; Point2f ptRight = tp.m_ptR; for (int j = -nSzDiff ; j < nSzDiff + 1; j++){ for (int i = -nSzDiff ; i < nSzDiff + 1; i++){ double val = 0.f; int nX = (int)floor(ptLeft.x+i); int nY = (int)floor(ptLeft.y+j); if (rectRegion.contains(Point(nX, nY)) && matSim.at(nY, nX) > 0){ // assume sim value has been already normalised val = 1.f - matSim.at(nY, nX);// /m_paramDense.m_paramGotcha.m_paramALSC.m_fEigThr; } pdDiffMap[j+nSzDiff][i+nSzDiff] = val; } } // heat diffusion equation double dAlpha = m_paramDense.m_paramGotcha.m_fDiffCoef;// 0.05; // diffusion coefficient double dThr = m_paramDense.m_paramGotcha.m_fDiffThr;// 0.1; int nIter = m_paramDense.m_paramGotcha.m_nDiffIter;// 5; int nRow = nSzDiff*2+1; int nCol = nSzDiff*2+1; double pdDiffMapNext[nRow][nCol]; double pdDiffMapCurrnet[nRow][nCol]; for(int j = 0 ; j < nRow; j++){ for(int i = 0; i < nCol; i++){ pdDiffMapCurrnet[j][i] = pdDiffMap[j][i]; pdDiffMapNext[j][i] = 0; } } // define neighbours for (int k = 0 ; k < nIter; k++){ // get diffused double pdTemp[nRow][nCol]; for (int j = 1; j < nRow-1; j++){ for (int i = 1; i < nCol-1; i++){ pdDiffMapNext[j][i] = pdDiffMapCurrnet[j][i] + dAlpha * (pdDiffMapCurrnet[j+1][i] + pdDiffMapCurrnet[j][i+1] + pdDiffMapCurrnet[j-1][i] + pdDiffMapCurrnet[j][i-1] - 4*pdDiffMapCurrnet[j][i]); pdTemp[j][i] = pdDiffMapNext[j][i]; } } for(int j = 1 ; j < nRow-1; j++){ for(int i = 1; i < nCol-1; i++){ pdDiffMapCurrnet[j][i] = pdTemp[j][i]; } } } int count = 0; for (int j = 1; j < nRow-1; j++){ for (int i = 1; i < nCol-1; i++){ if (pdDiffMapNext[j][i] > dThr) { //&& (i != nSzDiff && j != nSzDiff)){ // add as a neighbour if (i == nSzDiff && j == nSzDiff) continue; CTiePt tpNei; tpNei.m_ptL.x = ptLeft.x + i - nSzDiff; tpNei.m_ptL.y = ptLeft.y + j - nSzDiff; tpNei.m_ptR.x = ptRight.x + i - nSzDiff; tpNei.m_ptR.y = ptRight.y + j - nSzDiff; vecNeiTp.push_back(tpNei); count++; } } } // add minimum num of neighbours CTiePt tp2; tp2.m_ptL = ptLeft + Point2f(0,1); tp2.m_ptR = ptRight + Point2f(0,1); if (!isHavingTP(vecNeiTp, tp2)) vecNeiTp.push_back(tp2); tp2.m_ptL = ptLeft + Point2f(0,-1); tp2.m_ptR = ptRight + Point2f(0,-1); if (!isHavingTP(vecNeiTp, tp2)) vecNeiTp.push_back(tp2); //CTiePt tp3; tp2.m_ptL = ptLeft + Point2f(1,0); tp2.m_ptR = ptRight + Point2f(1,0); if (!isHavingTP(vecNeiTp, tp2)) vecNeiTp.push_back(tp2); tp2.m_ptL = ptLeft + Point2f(-1,0); tp2.m_ptR = ptRight + Point2f(-1,0); if (!isHavingTP(vecNeiTp, tp2)) vecNeiTp.push_back(tp2); } bool CDensify::isHavingTP(vector& vecNeiTp, CTiePt tp){ bool bRes = false; int nLen = vecNeiTp.size(); for (int i = 0; i < nLen; i++){ if (vecNeiTp.at(i) == tp){ bRes = true; break; } } return bRes; } void CDensify::removeOutsideImage(vector& vecNeiTp, const Rect_ rectTileL, const Rect_ rectImgR){ vector::iterator iter; for (iter = vecNeiTp.begin(); iter < vecNeiTp.end(); ){ if (!rectTileL.contains(iter->m_ptL) || !rectImgR.contains(iter->m_ptR)) vecNeiTp.erase(iter); else iter++; } } void CDensify::removePtInLUT(vector& vecNeiTp, const vector& pLUT, const int nWidth){ vector::iterator iter; for (iter = vecNeiTp.begin(); iter < vecNeiTp.end(); ){ int nX = (int)floor(iter->m_ptL.x); int nY = (int)floor(iter->m_ptL.y); //int nIdx = nY * m_imgL.cols + nX; int nIdx = nY * nWidth + nX; if (pLUT[nIdx]) vecNeiTp.erase(iter); else iter++; } } void CDensify::makeTiles(vector< Rect_ >& vecRectTiles, int nMin){ vector< Rect_ >::iterator iter; for (iter = vecRectTiles.begin(); iter < vecRectTiles.end(); ){ Rect_ rectParent = *iter; if (rectParent.width/2 > nMin && rectParent.height/2 > nMin){ vecRectTiles.erase(iter); vector< Rect_ > vecChild; breakIntoSubRect(rectParent, vecChild); vecRectTiles.insert(vecRectTiles.end(), vecChild.begin(), vecChild.end()); iter = vecRectTiles.begin(); } else iter++; } } void CDensify::breakIntoSubRect(Rect_ rectParent, vector< Rect_ >& vecRes){ float fHalfW = rectParent.width/2.f; float fHalfH = rectParent.height/2.f; Point2f ptTopLeft[4]; ptTopLeft[0] = Point2f(rectParent.x, rectParent.y); ptTopLeft[1] = Point2f(rectParent.x+fHalfW, rectParent.y); ptTopLeft[2] = Point2f(rectParent.x, rectParent.y+fHalfH); ptTopLeft[3] = Point2f(rectParent.x+fHalfW, rectParent.y+fHalfH); Size sz(fHalfW, fHalfH); Rect_ rect(ptTopLeft[0], sz); vecRes.push_back(rect); sz = Size(rectParent.x+rectParent.width - ptTopLeft[1].x, fHalfH); rect = Rect(ptTopLeft[1], sz); vecRes.push_back(rect); sz = Size(fHalfW, rectParent.y+rectParent.height - ptTopLeft[2].y); rect = Rect(ptTopLeft[2], sz); vecRes.push_back(rect); sz = Size(rectParent.x+rectParent.width - ptTopLeft[3].x, rectParent.y+rectParent.height - ptTopLeft[3].y); rect = Rect(ptTopLeft[3], sz); vecRes.push_back(rect); } bool CDensify::doGotcha(const Mat& matImgL, const Mat& matImgR, vector& vectpSeeds, const CGOTCHAParam& paramGotcha, vector& vectpAdded){ bool bRes = true; //////////////////////////////////////////// // parameter preparation // cout << "CASP-GO INFO: initialisaing similarity map" << endl; Mat matSimMap = Mat::ones(matImgL.rows, matImgL.cols, CV_32FC1); // 2D similarity map for diffusion matSimMap = matSimMap*-1; // cout << "DEBUG: matImgL has statistics: rows " << matImgL.rows << "; cols: " << matImgL.cols << "; channels: " << matImgL.channels() << "; bitdepth code: " << matImgL.depth() << endl; Size szImgL(matImgL.cols, matImgL.rows); // cout << "CASP-GO INFO: initialising pixel LUT" << endl; // IMARS bool pLUT[szImgL.area()]; // if true it indicates the pixel has already processed vector pLUT; //IMARS // initialise for (int i = 0; i< szImgL.area(); i++){ bool bpLUT = false; //IMARS pLUT.push_back(bpLUT); //IMARS } //IMARS vector< Rect_ > vecRectTiles; vecRectTiles.push_back(Rect(0., 0., matImgL.cols, matImgL.rows)); // cout << "CASP-GO INFO: Making tiles" << endl; makeTiles(vecRectTiles, paramGotcha.m_nMinTile); if (paramGotcha.m_bNeedInitALSC){ // cout << "CASP-GO INFO: Running initial ALSC refinement" << endl; ALSC alsc(matImgL, matImgR, paramGotcha.m_paramALSC); alsc.performALSC(&vectpSeeds); vectpSeeds.clear(); alsc.getRefinedTps(vectpSeeds); // hard-copy } // cout << "CASP-GO INFO: initialise similarity map with seed points" << endl; // initialise sim map with seedpoitns for (int i = 0; i < (int)vectpSeeds.size(); i++){ int nX = (int)floor(vectpSeeds.at(i).m_ptL.x); int nY = (int)floor(vectpSeeds.at(i).m_ptL.y); matSimMap.at(nY, nX) = vectpSeeds.at(i).m_fSimVal; int nIdx = nY*szImgL.width + nX; pLUT[nIdx] = true; //cout << "DEBUG: pLUT change successfully to " << pLUT[nIdx] << endl; } // cout << "CASP-GO INFO: apply mask to remove area that no densification is required." << endl; // apply mask, remove area where no densification is required //std::cout << "Reading mask: " << paramGotcha.m_strMask << std::endl; //Mat Mask = imread(paramGotcha.m_strMask, CV_LOAD_IMAGE_ANYDEPTH); for (int i=0; i(i,j)==0){ int nIdx = i*m_Mask.cols + j; pLUT[nIdx] = true; //cout << "DEBUG: pLUT change successfully to " << pLUT[nIdx] << endl; } } } ///////////////////////// vectpAdded.clear(); //cout << "CASP-GO INFO: Desifying disparity... ..." << endl; for (int i = 0 ; i < (int)vecRectTiles.size(); i++){ vector vecRes; bRes = bRes && doTileGotcha(matImgL, matImgR, vectpSeeds, paramGotcha, vecRes, vecRectTiles.at(i), matSimMap, pLUT); // collect result vectpAdded.insert(vectpAdded.end(), vecRes.begin(), vecRes.end()); // debug //cout << "Tile " << i << " has been processed: " << vecRes.size() << " points are added" << endl; } return bRes; } bool CDensify::doTileGotcha(const Mat& matImgL, const Mat& matImgR, const vector& vectpSeeds, const CGOTCHAParam& paramGotcha, vector& vectpAdded, const Rect_ rectTileL, Mat& matSimMap, vector& pLUT){ vector vectpSeedTPs; //= vectpSeeds; // need this hard copy for sorting Size szImgL(matImgL.cols, matImgL.rows); Rect_ rectImgR (0, 0, matImgR.cols, matImgR.rows); vectpAdded.clear(); //clear output tp list // set indicator buffer for (int i = 0 ; i < (int)vectpSeeds.size(); i++){ CTiePt tp = vectpSeeds.at(i); if (rectTileL.contains(tp.m_ptL)){ vectpSeedTPs.push_back(tp); } } //std::cout << "Reading mask: " << paramGotcha.m_strMask << std::endl; //Mat Mask = imread(paramGotcha.m_strMask, CV_LOAD_IMAGE_ANYDEPTH); Mat imgL = matImgL; Mat imgR = matImgR; imgL.convertTo(imgL, CV_8UC1); imgR.convertTo(imgR, CV_8UC1); unsigned int nGapSize = 0; for (int i=0; i(i,j)==1 && imgL.at(i,j)!=0 &&imgR.at(i,j)!=0) nGapSize+=1; } } //sort(vectpSeedTPs.begin(), vectpSeedTPs.end(), compareTP); // sorted in ascending order ///////////////////////////////////////////////////////////////////// // stereo region growing //int nCount = 0; // for debug #if 0 // Hide the verbose messages cout << "[--------------------] 0% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; #endif while (vectpSeedTPs.size() > 0) { // get a point from seed CTiePt tp = vectpSeedTPs.at(0); // mvectpAdded.push_back(tp); vectpSeedTPs.erase(vectpSeedTPs.begin()); vector vecNeiTp; getNeighbour(tp, vecNeiTp, paramGotcha.m_nNeiType, matSimMap); removeOutsideImage(vecNeiTp, rectTileL, rectImgR); removePtInLUT(vecNeiTp, pLUT, matImgL.cols); //ALSC if ((int)vecNeiTp.size() > 0){ // get affine data from a seed float pfData[6] = {0, 0, 0, 0, 0, 0}; for (int k = 0; k < 4; k++) pfData[k] = tp.m_pfAffine[k]; pfData[4] = tp.m_ptOffset.x; pfData[5] = tp.m_ptOffset.y; ALSC alsc(matImgL, matImgR, paramGotcha.m_paramALSC); alsc.performALSC(&vecNeiTp, (float*) pfData); const vector* pvecRefTPtemp = alsc.getRefinedTps(); int nLen = pvecRefTPtemp->size(); if( nLen > 0){ // append survived neighbours to the seed point list and the seed LUT // vector::iterator iterNei; for (int i = 0 ; i < nLen; i++){ CTiePt tpNei = pvecRefTPtemp->at(i); int nXnei = (int)floor(tpNei.m_ptL.x); int nYnei = (int)floor(tpNei.m_ptL.y); int nIdxNei = nYnei*szImgL.width + nXnei; matSimMap.at(nYnei,nXnei) = tpNei.m_fSimVal; pLUT[nIdxNei] = true; vectpSeedTPs.push_back(tpNei); vectpAdded.push_back(tpNei); } //sort(vectpSeedTPs.begin(), vectpSeedTPs.end(), compareTP); } } #if 0 // Hide the verbose messages if (vectpAdded.size()>0){ if (vectpAdded.size() >= (nGapSize)/20 && vectpAdded.size() < 2*(nGapSize)/20) cout << "[*-------------------] 5% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 2*(nGapSize)/20 && vectpAdded.size() < 3*(nGapSize)/20) cout << "[**------------------] 10% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 3*(nGapSize)/20 && vectpAdded.size() < 4*(nGapSize)/20) cout << "[***-----------------] 15% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 4*(nGapSize)/20 && vectpAdded.size() < 5*(nGapSize)/20) cout << "[****----------------] 20% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 5*(nGapSize)/20 && vectpAdded.size() < 6*(nGapSize)/20) cout << "[*****---------------] 25% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 6*(nGapSize)/20 && vectpAdded.size() < 7*(nGapSize)/20) cout << "[******--------------] 30% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 7*(nGapSize)/20 && vectpAdded.size() < 8*(nGapSize)/20) cout << "[*******-------------] 35% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 8*(nGapSize)/20 && vectpAdded.size() < 9*(nGapSize)/20) cout << "[********------------] 40% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 9*(nGapSize)/20 && vectpAdded.size() < 10*(nGapSize)/20) cout << "[*********-----------] 45% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 10*(nGapSize)/20 && vectpAdded.size() < 11*(nGapSize)/20) cout << "[**********----------] 50% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 11*(nGapSize)/20 && vectpAdded.size() < 12*(nGapSize)/20) cout << "[***********---------] 55% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 12*(nGapSize)/20 && vectpAdded.size() < 13*(nGapSize)/20) cout << "[************--------] 60% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 13*(nGapSize)/20 && vectpAdded.size() < 14*(nGapSize)/20) cout << "[*************-------] 65% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 14*(nGapSize)/20 && vectpAdded.size() < 15*(nGapSize)/20) cout << "[**************------] 70% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 15*(nGapSize)/20 && vectpAdded.size() < 16*(nGapSize)/20) cout << "[***************-----] 75% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 16*(nGapSize)/20 && vectpAdded.size() < 17*(nGapSize)/20) cout << "[****************----] 80% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 17*(nGapSize)/20 && vectpAdded.size() < 18*(nGapSize)/20) cout << "[*****************---] 85% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 18*(nGapSize)/20 && vectpAdded.size() < 19*(nGapSize)/20) cout << "[******************--] 90% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() >= 19*(nGapSize)/20 && vectpAdded.size() < 20*(nGapSize)/20) cout << "[*******************-] 95% OF THE GAP AREA HAS BEEN DENSIFIED\r" << std::flush; else if (vectpAdded.size() == nGapSize) cout << "[********************]100% OF THE GAP AREA HAS BEEN DENSIFIED"; } #endif } #if 0 cout << endl; #endif return true; } bool CDensify::doPGotcha(int nNeiType){ // pyramid construction int nTotLev = getTotPyramidLev(m_paramDense.m_paramGotcha.m_paramALSC.m_nPatch); vector vecImgPyL; vector vecImgPyR; buildPyramid(m_imgL, vecImgPyL, nTotLev); buildPyramid(m_imgR, vecImgPyR, nTotLev); vector vecOrgSeedClone = getIntToFloatSeed(m_vecTPs); if (m_paramDense.m_paramGotcha.m_bNeedInitALSC){ ALSC alsc(m_imgL, m_imgR, m_paramDense.m_paramGotcha.m_paramALSC); alsc.performALSC(&vecOrgSeedClone); vecOrgSeedClone.clear(); alsc.getRefinedTps(vecOrgSeedClone); // hard-copy } CGOTCHAParam paramG = m_paramDense.m_paramGotcha; paramG.m_nNeiType = nNeiType; paramG.m_bNeedInitALSC = true; float fTempLim = m_paramDense.m_paramGotcha.m_paramALSC.m_fEigThr; int nTempSz = m_paramDense.m_paramGotcha.m_paramALSC.m_nPatch; float fMinRate = 0.3f; float fMinRatePatch = 0.5f; vector vecAddedTemp; // addition from previous level bool bRes = true; for (int i = nTotLev-1; i >= 0; i--){ // prepare new processing param at level i paramG.m_paramALSC.m_nPatch = (int)(nTempSz * (1.f - fMinRatePatch * i/(nTotLev-1))); paramG.m_paramALSC.m_fEigThr = fTempLim * (1.f + fMinRate * i/(nTotLev-1)); // prepare seed for current level vector vecSeedTemp; float fDenom = pow(2.f, i); int nLen = vecOrgSeedClone.size(); for (int j = 0; j < nLen; j++){ CTiePt tp; tp = vecOrgSeedClone.at(j); tp.m_ptL.x = tp.m_ptL.x / fDenom; tp.m_ptL.y = tp.m_ptL.y / fDenom; tp.m_ptR.x = tp.m_ptR.x / fDenom; tp.m_ptR.y = tp.m_ptR.y / fDenom; for (int k = 0; k < 4 ; k++) tp.m_pfAffine[k] = 0.; tp.m_ptOffset.x = tp.m_ptOffset.x / fDenom; tp.m_ptOffset.y = tp.m_ptOffset.y / fDenom; vecSeedTemp.push_back(tp); } // added point propagated points nLen = vecAddedTemp.size(); for (int j = 0; j < nLen; j++){ vecAddedTemp.at(j).m_ptL.x *= 2.f; vecAddedTemp.at(j).m_ptL.y *= 2.f; vecAddedTemp.at(j).m_ptR.x *= 2.f; vecAddedTemp.at(j).m_ptR.y *= 2.f; for (int k = 0; k < 4 ; k++) vecAddedTemp.at(j).m_pfAffine[k] = 0.; vecAddedTemp.at(j).m_ptOffset.x *= 2.f; vecAddedTemp.at(j).m_ptOffset.y *= 2.f; } if (nLen > 0){ ALSC alsc(vecImgPyL.at(i), vecImgPyR.at(i), paramG.m_paramALSC); alsc.performALSC(&vecAddedTemp); vecAddedTemp.clear(); alsc.getRefinedTps(vecAddedTemp); // hard-copy } vector seedIn; seedIn.insert(seedIn.end(), vecSeedTemp.begin(), vecSeedTemp.end() ); seedIn.insert(seedIn.end(), vecAddedTemp.begin(), vecAddedTemp.end()); vecSeedTemp.clear(); // debug //cout << "# seed pts at the " << i << " level" << ": " << seedIn.size() << endl; vector vecResTemp; bRes = bRes && doGotcha(vecImgPyL.at(i), vecImgPyR.at(i), seedIn, paramG, vecResTemp); vecAddedTemp.insert(vecAddedTemp.end(), vecResTemp.begin(), vecResTemp.end()); // debug // cout << "# added pts at the " << i << " level" << ": " << vecResTemp.size() << endl; } m_vectpAdded.clear(); m_vectpAdded.insert(m_vectpAdded.end(), vecOrgSeedClone.begin(), vecOrgSeedClone.end()); // m_vectpAdded.insert(m_vectpAdded.end(), m_vecTPs.begin(), m_vecTPs.end()); m_vectpAdded.insert(m_vectpAdded.end(), vecAddedTemp.begin(), vecAddedTemp.end()); return bRes; } int CDensify::getTotPyramidLev(int nszPatch) { int nRes = 0; Size szImgL(m_imgL.cols, m_imgL.rows); Size szImgR(m_imgR.cols, m_imgR.rows); int nW = 0, nH = 0; // get smallest size of width nW = min(szImgL.width, szImgR.width); nH = min(szImgL.height, szImgR.height); int nMinSz = 4*(nszPatch * 2 + 1); Size szMin(nMinSz,nMinSz); // estimate the minimum of the largest levels while(nW > szMin.width || nH > szMin.height){ nW /= 2; nH /= 2; nRes++; } return nRes; } } // end namespace gotcha ================================================ FILE: src/asp/Gotcha/CDensify.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_CDENSIFY_H #define ASP_GOTCHA_CDENSIFY_H #include #include #include #include #include #include #include #include #include #include #include #include namespace gotcha { class CDensify: public CProcBlock { public: CDensify(); CDensify(CDensifyParam paramDense, std::vector const& vecTPs, cv::Mat imgL, cv::Mat imgR, cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask); void setParameters(CDensifyParam paramDense, std::vector const& vecTPs, cv::Mat imgL, cv::Mat imgR, cv::Mat input_dispX, cv::Mat input_dispY, cv::Mat Mask); int performDensitification(cv::Mat & output_dispX, cv::Mat & cv_output_dispY); int getNumTotTps() const {return m_vectpAdded.size();} static bool compareTP(CTiePt tpX, CTiePt tpY){ return (tpX.m_fSimVal < tpY.m_fSimVal); } std::string getProcType(){ return "GOTCHA_FROM_DISP"; } private: //void loadImages(); std::vector getIntToFloatSeed(std::vector& vecTPSrc); // get integer Seed point pairs from a float seed point pair bool doGotcha(const cv::Mat& matImgL, const cv::Mat& matImgR, std::vector& vectpSeeds, const CGOTCHAParam& paramGotcha, std::vector& vectpAdded); bool doTileGotcha(const cv::Mat& matImgL, const cv::Mat& matImgR, const std::vector& vectpSeeds, const CGOTCHAParam& paramGotcha, std::vector& mvectpAdded, const cv::Rect_ rectTileL, cv::Mat& matSimMap, std::vector& pLUT); //IMARS void removePtInLUT(std::vector& vecNeiTp, const std::vector& pLUT, const int nWidth); //IMARS void removeOutsideImage(std::vector& vecNeiTp, const cv::Rect_ rectTileL, const cv::Rect_ rectImgR); void getNeighbour(const CTiePt tp, std::vector& vecNeiTp, const int nNeiType, const cv::Mat& matSim); void getDisffusedNei(std::vector& vecNeiTp, const CTiePt tp, const cv::Mat& matSim); void breakIntoSubRect(cv::Rect_ rectParent, std::vector< cv::Rect_ >& vecRes); void makeTiles(std::vector< cv::Rect_ >& vecRectTiles, int nMin); bool isHavingTP(std::vector& vecNeiTp, CTiePt tp); // used in diffused neighbour bool doPGotcha(int nNeiType); int getTotPyramidLev(int nszPatch); void makeDataProducts(); bool saveResult(cv::Mat & output_dispX, cv::Mat & cv_output_dispY); bool saveProjLog (std::string strFile); bool saveLog(); bool saveResLog(std::string strFile); bool loadTPForDensification(std::string strTPFile); private: // inputs CDensifyParam m_paramDense; cv::Mat m_imgL, m_imgR; cv::Mat m_input_dispX, m_input_dispY; cv::Mat m_Mask; std::vector m_vecTPs; // outputs std::vector m_vectpAdded; // final tp result (i.e. seed tps + newly added tps) // Disparity maps: // the disparity of a point p_i at x,y in the left image is stored at // (x, y) in the disparity maps, e.g., (m_matDisMapX and m_matDisMapY). // For example, the position of the corresponding point p'_i in the right image can be defined as // (x+x_dist, y+y_dist), where 'xdist' and 'ydist' are value at (x,y) in m_matDisMapX and m_matDisMapY, respectively. // When disparity values are not known, the vaule of the disparity map is set to zero. cv::Mat m_matDisMapX; cv::Mat m_matDisMapY; cv::Mat m_matDisMapSim; // matching score map: smaller score is better score and -1 indicate unknown cv::Mat m_matHL; // used when the rectified images are used cv::Mat m_matHR; int nNumSeedTPs; double procTime; }; } // end namespace gotcha #endif // ASP_GOTCHA_CDENSIFY_H ================================================ FILE: src/asp/Gotcha/CDensifyParam.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_CDENSIFYPARAM_H #define ASP_GOTCHA_CDENSIFYPARAM_H #include #include #include namespace gotcha { class CDensifyParam { public: CDensifyParam(): m_nProcType(GOTCHA){} int m_nProcType; // growing method #if 0 std::string m_strImgL; std::string m_strImgR; std::string m_strOutPath; std::string m_strTPFile; std::string m_strDispX; std::string m_strDispY; std::string m_strUpdatedDispX; std::string m_strUpdatedDispY; std::string m_strUpdatedDispSim; #endif std::string getProcessingType(){ if (m_nProcType == GOTCHA) return "GOTCHA"; else if (m_nProcType == P_GOTCHA) return "P_GOTCHA"; return "UNKNOWN"; } CGOTCHAParam m_paramGotcha; enum {GOTCHA, P_GOTCHA}; enum {NO_ERR, FILE_IO_ERR, GOTCHA_ERR, LINE_GOTCHA_ERR, P_GOTCHA_ERR}; }; } // end namespace gotcha #endif // ASP_GOTCHA_CDENSIFYPARAM_H ================================================ FILE: src/asp/Gotcha/CGOTCHAParam.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_CGOTCHAPARAM_H #define ASP_GOTCHA_CGOTCHAPARAM_H #include #include namespace gotcha { class CGOTCHAParam { public: CGOTCHAParam():m_nNeiType(NEI_4),m_fDiffCoef(0.05),m_fDiffThr(0.1),m_nDiffIter(5), m_bNeedInitALSC(true){ m_nMinTile = 1000000000;} std::string getNeiType(){if (m_nNeiType == NEI_X) return "NEI_X"; else if (m_nNeiType == NEI_Y) return "NEI_Y"; else if (m_nNeiType == NEI_4) return "NEI_4"; else if (m_nNeiType == NEI_8) return "NEI_8"; else if (m_nNeiType == NEI_DIFF) return "NEI_Difussion"; else return "UNKNOWN";} int m_nNeiType; int m_nMinTile; float m_fDiffCoef; float m_fDiffThr; int m_nDiffIter; //std::string m_strMask; CALSCParam m_paramALSC; bool m_bNeedInitALSC; // set true if initial alsc on seed points are required enum {NEI_X, NEI_Y, NEI_4, NEI_8, NEI_DIFF}; }; } // end namespace gotcha #endif // ASP_GOTCHA_CGOTCHAPARAM_H ================================================ FILE: src/asp/Gotcha/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspGotcha "${ASP_GOTCHA_SRC_FILES}" "${ASP_GOTCHA_TEST_FILES}" "${ASP_GOTCHA_LIB_DEPENDENCIES}") ================================================ FILE: src/asp/Gotcha/CProcBlock.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include using namespace std; using namespace cv; namespace gotcha { CProcBlock::CProcBlock(){} // Images are passed in memory now #if 0 void CProcBlock::setImages(string strImgL, string strImgR, bool bGrey){ // read image as a grey -> vital for alsc and gotcha if (bGrey){ m_imgL = imread(strImgL, CV_LOAD_IMAGE_ANYDEPTH); //IMARS m_imgR = imread(strImgR, CV_LOAD_IMAGE_ANYDEPTH); //IMARS } else{ m_imgL = imread(strImgL, 1); m_imgR = imread(strImgR, 1); } } #endif bool CProcBlock::saveTP(const vector& vecTPs, const string strFile){ ofstream sfTP; sfTP.open(strFile.c_str()); int nLen = vecTPs.size(); int nEle = 11; if (sfTP.is_open()){ // header sfTP << nLen << " " << nEle << endl; // data for (int i = 0 ; i < nLen ;i++){ CTiePt tp = vecTPs.at(i); sfTP << tp.m_ptL.x << " "<< tp.m_ptL.y << " " << tp.m_ptR.x << " "<< tp.m_ptR.y << " " << tp.m_fSimVal << " "<< tp.m_pfAffine[0] << " " << tp.m_pfAffine[1] << " "<< tp.m_pfAffine[2] << " " << tp.m_pfAffine[3] << " " << tp.m_ptOffset.x << " " << tp.m_ptOffset.y << endl; } sfTP.close(); } else return false; return true; } #if 0 bool CProcBlock::loadTP(const string strFile){ std::cout << "Reading " << strFile << std::endl; ifstream sfTPFile; sfTPFile.open(strFile.c_str()); m_vecTPs.clear(); //m_vecRefTPs.clear(); int nTotLen = 0; if (sfTPFile.is_open()){ // total num of TPs (i.e., lines) int nElement; // total num of elements in a TP sfTPFile >> nTotLen >> nElement; for (int i = 0 ; i < nTotLen; i++){ CTiePt tp; sfTPFile >> tp.m_ptL.x >> tp.m_ptL.y >> tp.m_ptR.x >> tp.m_ptR.y >> tp.m_fSimVal; if (nElement > 5){ float fDummy; for (int k = 0 ; k < 6; k++) sfTPFile >> fDummy; } if (nElement > 11){ float fDummy; double dDummy; for (int k = 0 ; k < 6; k++) sfTPFile >> fDummy; for (int k = 0 ; k < 8; k++) sfTPFile >> dDummy; } m_vecTPs.push_back(tp); } sfTPFile.close(); } else return false; if (nTotLen < 8) { //cerr << "TP should be more than 8 pts" << endl; return false; } return true; } #endif bool CProcBlock::saveMatrix(const Mat& matData, const string strFile){ ofstream sfOut; sfOut.open(strFile.c_str()); if (sfOut.is_open()){ sfOut << "ncols " << matData.cols << endl; sfOut << "nrows " << matData.rows << endl; sfOut << "xllcorner 0" << endl; sfOut << "yllcorner 0" << endl; sfOut << "cellsize 1" << endl; for (int i = 0; i < matData.rows; i++){ for (int j = 0; j < matData.cols; j++){ if (matData.depth() == CV_32F) sfOut << matData.at(i,j) << " "; else if (matData.depth() == CV_64F) sfOut << matData.at(i,j) << " "; else if (matData.depth() == CV_8U) sfOut << matData.at(i,j) << " "; } sfOut << endl; } sfOut.close(); } else return false; return true; } #if 0 bool CProcBlock::loadMatrix(Mat &matData, const string strFile, bool bDoublePrecision){ if (bDoublePrecision){ ifstream sfIn; sfIn.open(strFile.c_str()); if (sfIn.is_open()){ int nRow; int nCol; sfIn >> nRow >> nCol; matData = Mat::zeros(nRow, nCol, CV_64F); for (int i = 0; i < matData.rows; i++){ for (int j = 0; j < matData.cols; j++){ sfIn >> matData.at(i,j); } } sfIn.close(); } else return false; return true; } else{ return loadMatrix(matData, strFile); } } bool CProcBlock::loadMatrix(Mat &matData, const string strFile){ ifstream sfIn; sfIn.open(strFile.c_str()); if (sfIn.is_open()){ int nRow; int nCol; sfIn >> nRow >> nCol; matData = Mat::zeros(nRow, nCol, CV_32F); for (int i = 0; i < matData.rows; i++){ for (int j = 0; j < matData.cols; j++){ sfIn >> matData.at(i,j); } } sfIn.close(); } else return false; return true; } bool CProcBlock::loadMatrix(string strFile){ ifstream sfIn; sfIn.open(strFile.c_str()); if (sfIn.is_open()){ int nRow; int nCol; sfIn >> nRow >> nCol; m_dispX = Mat::zeros(nRow, nCol, CV_32F); for (int i = 0; i < m_dispX.rows; i++){ for (int j = 0; j < m_dispX.cols; j++){ sfIn >> m_dispX.at(i,j); } } sfIn.close(); } else return false; return true; } #endif bool CProcBlock::saveALSCParam(const CALSCParam& paramALSC, const string strOut){ ofstream sfLog; sfLog.open(strOut.c_str(), ios::app | ios::out); if (sfLog.is_open()){ sfLog << "" << endl; sfLog << "The size of a matching patch: " << paramALSC.m_nPatch << endl; sfLog << "Maximum eigenval: " << paramALSC.m_fEigThr << endl; sfLog << "Maximum iteration: " << paramALSC.m_nMaxIter << endl; sfLog << "Affine distortion limit: " << paramALSC.m_fAffThr << endl; sfLog << "Translation limit: " << paramALSC.m_fDriftThr << endl; sfLog << "Use intensity offset parameter: " << paramALSC.m_bIntOffset << endl; sfLog << "Use weighting coefficients: " << paramALSC.m_bWeighting << endl; sfLog << endl; sfLog.close(); } else return false; return true; } bool CProcBlock::saveGOTCHAParam(CGOTCHAParam& paramGOTCHA, const string strOut){ ofstream sfLog; sfLog.open(strOut.c_str(), ios::app | ios::out); if (sfLog.is_open()){ sfLog << "" << endl; sfLog << "Neighbour type: " << paramGOTCHA.getNeiType()<< endl; sfLog << "Diffusion iteration: " << paramGOTCHA.m_nDiffIter << endl; sfLog << "Diffusion threshold: " << paramGOTCHA.m_fDiffThr << endl; sfLog << "Diffusion coefficient: " << paramGOTCHA.m_fDiffCoef << endl; //sfLog << "Minimum image tile size: " << paramGOTCHA.m_nMinTile << endl; sfLog << "Need initial ALSC on seed TPs: " << paramGOTCHA.m_bNeedInitALSC << endl; sfLog << endl; sfLog.close(); } else return false; return true; } } // end namespace gotcha ================================================ FILE: src/asp/Gotcha/CProcBlock.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_CPROCBLOCK_H #define ASP_GOTCHA_CPROCBLOCK_H #include #include #include #include #include #include #include #include #include #include #include #include namespace gotcha { class CProcBlock{ public: CProcBlock(); // assume matrix has float data type //static bool loadMatrix(cv::Mat& matData, const std::string strFile); protected: // file I/O //bool loadMatrix(cv::Mat &matData, const std::string strFile, bool bDoublePrecision); //bool loadMatrix(std::string strFile); //void setImages(std::string strImgL, std::string strImgR, bool bGrey = true); //bool loadTP(const std::string strFile); bool saveTP(const std::vector& vecTPs, const std::string strFile); bool saveMatrix(const cv::Mat& matData, const std::string strFile); // assume matrix is in float or double data type bool saveALSCParam(const CALSCParam& paramALSC, const std::string strOut); bool saveGOTCHAParam(CGOTCHAParam& paramGOTCHA, const std::string strOut); protected: //cv::Mat m_dispX; }; } // end namespace gotcha #endif // ASP_GOTCHA_CPROCBLOCK_H ================================================ FILE: src/asp/Gotcha/CTiePt.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_GOTCHA_CTIEPT_H #define ASP_GOTCHA_CTIEPT_H #include namespace gotcha { class CTiePt { public: CTiePt():m_fSimVal(NOT_DEF){m_pfAffine[0] = 0; m_pfAffine [1] = 0; m_pfAffine[2] = 0; m_pfAffine [3] = 0;} cv::Point2f m_ptL; // left xy position cv::Point2f m_ptR; // right xy position float m_fSimVal; // matching similarity (score) from 0 to 1.0, othewise it is not defined float m_pfAffine [4]; cv::Point2f m_ptOffset; enum {NOT_DEF = -1}; bool operator==(const CTiePt& x){ if ((this->m_ptL == x.m_ptL) && (this->m_ptR == x.m_ptR)) return true; else return false; } }; } // end namespace gotcha #endif // ASP_GOTCHA_CTIEPT_H ================================================ FILE: src/asp/Gotcha/README.txt ================================================ This directory contains the source code for the CASP-GO Gotcha disparity refinement algorithm, originally from: https://github.com/mssl-imaging/CASP-GO/tree/master/src/DispRefine It was incorporated into ASP under NASA proposal 19-PDART19_2-0094. Author: Yu Tao Copyright (c) 2016-2019, Imaging Group, Mullard Space Science Laboratory, University College London. All rights reserved. ================================================ FILE: src/asp/IceBridge/CMakeLists.txt ================================================ # IceBridge add_executable(correct_icebridge_l3_dem correct_icebridge_l3_dem.cc) target_link_libraries(correct_icebridge_l3_dem AspCore AspSessions) install(TARGETS correct_icebridge_l3_dem DESTINATION bin) add_executable(nav2cam nav2cam.cc) target_link_libraries(nav2cam AspCore AspSessions) install(TARGETS nav2cam DESTINATION bin) add_executable(ortho2pinhole ortho2pinhole.cc) target_link_libraries(ortho2pinhole AspSessions) install(TARGETS ortho2pinhole DESTINATION bin) add_executable(orbitviz_pinhole orbitviz_pinhole.cc) target_link_libraries(orbitviz_pinhole AspSessions) install(TARGETS orbitviz_pinhole DESTINATION bin) # Install all of the python files. set(PYTHON_TOOLS icebridge_kmz_to_csv.py extract_icebridge_ATM_points.py lvis2kml.py) foreach(p ${PYTHON_TOOLS}) INSTALL(FILES ${p} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_EXECUTE GROUP_READ WORLD_EXECUTE DESTINATION bin) endforeach() ================================================ FILE: src/asp/IceBridge/README.txt ================================================ This document describes how to process IceBridge images to create DEMs that are aligned to the LIDAR ground reference. 1. Data location The data is available from https://nsidc.org/data/icebridge/data_summaries.html#camera including camera information, raw imagery, orthorectified imagery, LIDAR point clouds, and pre-existing DEMs for some of the flights. Flight paths can be visualized here: https://asapdata.arc.nasa.gov/dms/missions.html 2. Data fetching preliminaries To be able to fetch any data, one should create an account with NSIDC, and then set up bulk downloading by following the instructions at https://nsidc.org/support/faq/what-options-are-available-bulk-downloading-data-https-earthdata-login-enabled For some flights, the camera (and hence its calibration file) changed in mid-flight, detailed info about this is available at https://nsidc.org/data/IODCC0/versions/1 in the "User Guide" tab. The camera calibration files can be fetched recursively using the command: wget -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/ These files are in the PDF format, and can be converted to the .tsai format used by ASP using the script StereoPipeline/src/asp/IceBridge/process_calibration_file.py The complete list of cameras for all flights is in camera_lookup.txt which is parsed automatically by full_processing_script.py, handling cameras that changed in mid-flight (in directory StereoPipeline/src/asp/IceBridge). 3. Data fetching and archiving The images can be fetched via the tool: StereoPipeline/src/asp/IceBridge/full_processing_script.py (see inside this tool for an example usage). To only fetch, validate, and do some conversions, use the option: --stop-after-fetch To control which files are fetched and later processed use: --start-frame and --stop-frame These params do not apply to the lidar files. If you want to limit the number of those, you can specify a small --max-num-to-fetch (note this will limit the number of all types of files). 4. Peculiar cases. See the notes at special_cases.txt about some things to be aware of. 5. Working the archived data The fetched data are stored on lou, at /u/oalexan1/projects/data/icebridge The DEMs that were used to create the orthoimages and which we use to create the camera models are in the reference_dems/ subdirectory. To archive data to lou after fetching, use: --tar-and-wipe To start with an existing lou archive, use: --start-with-lou-archive These assume user name is oalexan1 for reasons too long to describe. The tool will attempt to update the dataset once fetched and untarred. If necessary, it can be pushed back to lou afterwards as described above. Alternatively, to bring data back to pfe for processing, connect to lou and run from the data directory a command similar to: tar xfv AN_20091026.tar -C /nobackupnfs2/your/work/dir It is suggested you re-run the the fetch command once you unpack it, as some datasets that were fetched earlier may be less checked for validity and may be missing some data. ================================================ FILE: src/asp/IceBridge/archive_functions.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Contains functions to store/retrieve data from outside a run folder import os, sys, optparse, datetime, time, subprocess, logging, multiprocessing import re, shutil, time, getpass, glob import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, archive_functions import asp_system_utils #asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] REMOTE_INPUT_FOLDER = 'lfe:/u/oalexan1/projects/data/icebridge' def robust_shiftc(cmd, logger, attempts = 120): '''Try to fetch/submit with shiftc for at least 2 hours, with attempts every minute. We worked hard for many hours to produce a run, and we should not let a temporary problem with the server nullify our work.''' sleep_time = 60 for attempt in range(attempts): if attempt > 0: logger.info("Trying attempt: " + str(attempt+1) + " out of " + str(attempts)) logger.info(cmd) status = os.system(cmd) if status == 0: return if attempt == attempts - 1: raise Exception('Failed to copy data after ' + str(attempts) + ' attempts.') else: attempt += 1 logger.info("Will try shiftc again after sleeping for " + str(sleep_time) + \ " seconds.") time.sleep(sleep_time) def stripHost(val): # Replace lfe:/path with /path m = re.match("^.*?:\s*(.*?)$", val) if m: return m.group(1) else: return val def get_remote_output_folder(user): '''Get the folder containing DEMs for given user.''' if user == 'smcmich1': return 'lfe:/u/smcmich1/icebridge/output' elif user == 'oalexan1': return 'lfe:/u/oalexan1/projects/data/icebridge/output' else: raise Exception("Unknown user: " + user) def get_remote_ortho_folder(user): '''Get the folder containing orthos for given user.''' if user == 'smcmich1': return 'lfe:/u/smcmich1/icebridge/ortho' elif user == 'oalexan1': return 'lfe:/u/oalexan1/projects/data/icebridge/ortho' else: raise Exception("Unknown user: " + user) REMOTE_CAMERA_FOLDER_SCOTT = 'lfe:/u/smcmich1/icebridge/camera' REMOTE_CAMERA_FOLDER_OLEG = 'lfe:/u/oalexan1/projects/data/icebridge/camera' if icebridge_common.getUser() == 'smcmich1': REMOTE_CAMERA_FOLDER = REMOTE_CAMERA_FOLDER_SCOTT REMOTE_ALIGN_CAM_FOLDER = 'lfe:/u/smcmich1/icebridge/aligned_cameras' REMOTE_ORTHO_FOLDER = 'lfe:/u/smcmich1/icebridge/ortho' REMOTE_SUMMARY_FOLDER = 'lfe:/u/smcmich1/icebridge/summaries' REMOTE_LABEL_FOLDER = 'lfe:/u/smcmich1/icebridge/labels' LUNOKHOD = 'lunokhod2' L_SUMMARY_FOLDER = LUNOKHOD + ':/home/smcmich1/data/icebridge_summaries' elif icebridge_common.getUser() == 'oalexan1': REMOTE_CAMERA_FOLDER = REMOTE_CAMERA_FOLDER_OLEG REMOTE_ALIGN_CAM_FOLDER = 'lfe:/u/oalexan1/projects/data/icebridge/aligned_cameras' REMOTE_SUMMARY_FOLDER = 'lfe:/u/oalexan1/projects/data/icebridge/summaries' REMOTE_LABEL_FOLDER = 'lfe:/u/oalexan1/projects/data/icebridge/labels' LUNOKHOD = 'lunokhod1' L_SUMMARY_FOLDER = LUNOKHOD + ':/home/oalexan1/projects/data/icebridge/summaries' REMOTE_OUTPUT_FOLDER = get_remote_output_folder(icebridge_common.getUser()) REMOTE_ORTHO_FOLDER = get_remote_ortho_folder(icebridge_common.getUser()) def retrieveRunData(run, unpackFolder, useTar, forceTapeFetch, skipTapeCameraFetch, logger): '''Retrieve the data for the specified run from Lfe.''' logger.info('Retrieving data for run ' + str(run)) fileName = run.getInputTarName() unpackDir = os.path.join(unpackFolder, os.path.splitext(fileName)[0]) jpegDir = os.path.join(unpackDir, os.path.basename(run.getJpegFolder())) if os.path.exists(jpegDir) and os.path.isdir(jpegDir) and (not forceTapeFetch): logger.info("Won't fetch from lfe, as we already have: " + jpegDir) return lfePath = os.path.join(REMOTE_INPUT_FOLDER, fileName) # Retrieve a preprocessed set of camera files if we have it # - Do this first as sometimes we only have the camera files. if not skipTapeCameraFetch: fetchCameraFolder(run, logger) else: logger.info("Skip fetching cameras from tape.") # I have had bad luck with shift to fetch. So in the worst case try tar. tar_cmd = 'ssh lfe "cd ' + os.path.dirname(stripHost(lfePath)) + "; tar xfv " + \ os.path.basename(lfePath) + " -C " + os.path.realpath(unpackFolder) + '"' shift_cmd = 'shiftc --wait -d -r --verify --extract-tar ' + lfePath + ' ' + unpackFolder if useTar: # If to use tar right away robust_shiftc(tar_cmd, logger, attempts = 1) else: try: # If shiftc does not work, fall back to tar. # Don't try too hard on fetching. robust_shiftc(shift_cmd, logger, attempts = 10) except Exception as e: robust_shiftc(tar_cmd, logger, attempts = 1) def fetchProcessedByType(run, unpackFolder, logger, dataType): '''Fetch from lfe the latest archive of processed DEMs or orthos by modification time. For now we ignore the timestamp.''' logger.info('Fetching processed ' + dataType + ' data for ' + str(run)) # Fetch the latest file by modification time as returned by 'ls'. # A given file can be either in Scott's or Oleg's archive. # It can be in both, and it can be multiple instances. # Need to list all and fetch the latest. if dataType == 'DEM': fileName = run.getOutputTarName(useWildCard = True) lfePaths = os.path.join(stripHost(get_remote_output_folder('oalexan1')), fileName) + " " + \ os.path.join(stripHost(get_remote_output_folder('smcmich1')), fileName) elif dataType == 'ORTHO': fileName = run.getOrthoTarName(useWildCard = True) lfePaths = os.path.join(stripHost(get_remote_ortho_folder('oalexan1')), fileName) + " " + \ os.path.join(stripHost(get_remote_ortho_folder('smcmich1')), fileName) else: raise Exception("Unknown data type: " + dataType) # Get the list cmd = 'ssh lfe "ls -altd ' + lfePaths + '"' logger.info(cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, outputPath = None, suppressOutput = True, redo = True, noThrow = True) # Parse the answer and keep the latest. out = out.strip() vals = out.split('\n') for val in vals: logger.info("Found: " + val) lfePath = "" for val in vals: if len(val) >= 1 and val[0] == 'l': continue # this is a symlink arr = val.split() lfePath = arr[-1] break # found what we needed if lfePath == "": logger.info("Could not locate: " + fileName) return False cmd = 'shiftc --wait -d -r --verify --extract-tar ' + 'lfe:' + lfePath + ' ' + unpackFolder logger.info(cmd) status = os.system(cmd) # Try tar if shift failed if status != 0: logger.info('Did not sucessfully fetch archived processed data of type: ' + dataType) logger.info('Will try with tar.''') tar_cmd = 'ssh lfe "cd ' + os.path.dirname(lfePath) + "; tar xfv " + \ os.path.basename(lfePath) + " -C " + os.path.realpath(unpackFolder) + '"' logger.info(tar_cmd) status = os.system(tar_cmd) if status != 0: logger.info('Failed using tar as well.') return False return True def fetchCameraFolder(run, logger): '''Fetch a camera folder from the archive if it exists. Returns True if we got the file. If more than one, return the latest by modification time.''' logger.info('Fetching camera folder for ' + str(run)) # Tar up the camera files and send them at the same time using the shiftc command cameraFolder = run.getCameraFolder() fileName = run.getCameraTarName() # There could be multiple camera folders, fetch the latest by modification time. strippedName = fileName m = re.match('^(.*?)\.tar', strippedName) if m: strippedName = m.group(1) m = re.match('^(.*?)' + run.suffix, strippedName) if m: strippedName = m.group(1) # Look for the tarred camera files in each remote folder # - TODO: This may not get the latest if cameras are in each folder! found_rcf = '' for rcf in [REMOTE_CAMERA_FOLDER_OLEG, REMOTE_CAMERA_FOLDER_SCOTT]: cmd = 'ssh lfe "ls -dt ' + stripHost(rcf) + '/' + strippedName + '*.tar"' logger.info(cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, outputPath = None, suppressOutput = True, redo = True, noThrow = True) out = out.strip() vals = out.split() if len(vals) >= 1: # Pick the first one, which is the newest out = vals[0] if out != '': found_rcf = rcf break if found_rcf == '': logger.info('Did not find camera file for run.') return False fileName = os.path.basename(out) lfePath = os.path.join(found_rcf, fileName) cmd = 'shiftc --wait -d -r --extract-tar ' + lfePath + ' .' # Don't try too hard below, if failed first time that means there are no cameras # to fetch logger.info(cmd) status = os.system(cmd) if status != 0: logger.info('Did not find camera file for run.') return False else: logger.info('Finished retrieving cameras from lfe.') return True def packAndSendCameraFolder(run, logger): '''Archive the camera folder for later use''' logger.info('Archiving camera folder for run ' + str(run)) # Tar up the camera files and send them at the same time using the shiftc command cameraFolder = run.getCameraFolder() fileName = run.getCameraTarName() lfePath = os.path.join(REMOTE_CAMERA_FOLDER, fileName) # First remove any existing tar file. Use 2>/dev/null to not print # NASA's "You have no expecation of privacy." cmd = "ssh lfe 'rm -f " + stripHost(lfePath) + "' 2>/dev/null" logger.info(cmd) os.system(cmd) # Do the new file. Save the projection bounds, we will need that for later # as that file is very time consuming to create. cwd = os.getcwd() os.chdir(run.parentFolder) runFolder = str(run) cmd = 'shiftc --wait -d -r --include=\'^.*?(' + \ os.path.basename(icebridge_common.projectionBoundsFile(runFolder)) + \ '|' + icebridge_common.validFilesPrefix() + '.*|' + \ os.path.basename(cameraFolder) + '.*?\.tsai)$\' --create-tar ' + runFolder + \ ' ' + lfePath robust_shiftc(cmd, logger) logger.info("Finished archiving cameras.") os.chdir(cwd) # Test if this is reversible #fetchCameraFolder(run, logger) def packAndSendAlignedCameras(run, logger): '''Archive the pc_align-ed cameras for later use''' logger.info('Archiving aligned cameras for run ' + str(run)) cwd = os.getcwd() os.chdir(run.parentFolder) runFolder = str(run) fileName = run.getAlignedCameraTarName() lfePath = os.path.join(REMOTE_ALIGN_CAM_FOLDER, fileName) # First remove any existing tar file cmd = "ssh lfe 'rm -f " + stripHost(lfePath) + "' 2>/dev/null" logger.info(cmd) os.system(cmd) # Create a new archive cmd = 'shiftc --wait -d -r --include=\'^.*?' + icebridge_common.alignedBundleStr() + \ '.*?\.tsai$\' --create-tar ' + runFolder + \ ' ' + lfePath robust_shiftc(cmd, logger) os.chdir(cwd) logger.info('Finished sending aligned cameras to lfe.') def packAndSendOrthos(run, logger): '''Archive the created ortho images.''' logger.info('Archiving ortho images for run ' + str(run)) cwd = os.getcwd() os.chdir(run.parentFolder) runFolder = str(run) fileName = run.getOrthoTarName() lfePath = os.path.join(REMOTE_ORTHO_FOLDER, fileName) # First remove any existing tar file cmd = "ssh lfe 'rm -f " + stripHost(lfePath) + "' 2>/dev/null" logger.info(cmd) os.system(cmd) # Create a new archive cmd = 'shiftc --wait -d -r --include=\'^.*?' + icebridge_common.orthoFileName() + \ '$\' --create-tar ' + runFolder + ' ' + lfePath robust_shiftc(cmd, logger) os.chdir(cwd) logger.info('Finished sending ortho images to lfe.') def packAndSendSummaryFolder(run, folder, logger, backupToL2=False): '''Archive the summary folder in case we want to look at it later''' logger.info('Archiving summary folder for run ' + str(run)) cwd = os.getcwd() os.chdir(run.parentFolder) fileName = run.getSummaryTarName() # Create a local tar file. # Turn this approach off, new approach below. # - Some fiddling to make the packed folders convenient cmd = 'tar -chf '+ fileName +' -C '+ folder +'/.. ' + os.path.basename(folder) logger.info(cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, outputPath = None, suppressOutput = True, redo = True, noThrow = True) # This tends to print a very verbose message ans = out + '\n' + err vals = ans.split('\n') if len(vals) < 10: logger.info(ans) else: vals = vals[0:10] logger.info("\n".join(vals)) logger.info("Above output truncated.") # Use shiftc to create a local copy, and we want to include log files too #runFolder = str(run) #sumName = os.path.basename(run.getSummaryFolder()) #cmd = 'shiftc --wait -d -r --dereference --include=\'^.*?(' \ # + icebridge_common.logFilePrefix() + '|' \ # + runFolder + '/' + sumName + '|' \ # + icebridge_common.manager_log_prefix() \ # + ')\' --create-tar ' + runFolder \ # + ' ' + fileName #logger.info(cmd) #os.system(cmd) # Delete any existing copy of the file on lfe lfePath = os.path.join(REMOTE_SUMMARY_FOLDER, fileName) cmd = "ssh lfe 'rm -f " + stripHost(lfePath) + "' 2>/dev/null" logger.info(cmd) os.system(cmd) # Send the file to lfe using shiftc cmd = 'shiftc --wait -d -r ' + fileName + ' ' + lfePath robust_shiftc(cmd, logger) logger.info('Finished sending summary to lfe.') if backupToL2: # Wipe the copy on lunokhod l2Path = os.path.join(L_SUMMARY_FOLDER, fileName) cmd = "ssh " + LUNOKHOD + " 'rm -f "+ stripHost(l2Path) +"' 2>/dev/null" logger.info(cmd) os.system(cmd) # Make target directory on lunokhod cmd = "ssh " + LUNOKHOD + " 'mkdir -p " + os.path.dirname(stripHost(l2Path)) + \ "' 2>/dev/null" logger.info(cmd) os.system(cmd) # Send a copy of the file to Lunokhod for convenience cmd = 'scp ' + fileName + ' ' + l2Path + ' 2>/dev/null' logger.info(cmd) os.system(cmd) # Clean up the local tar file cmd = 'rm -f ' + fileName logger.info(cmd) os.system(cmd) os.chdir(cwd) def packAndSendCompletedRun(run, logger): '''Assembles and compresses the deliverable parts of the run''' logger.info('Getting ready to pack up run ' + str(run)) cwd = os.getcwd() os.chdir(run.parentFolder) runFolder = str(run) # Use symlinks to assemble a fake file structure to tar up assemblyFolder = run.getAssemblyFolder() batchFolders = run.getBatchFolderList() os.system('mkdir -p ' + assemblyFolder) # Wipe any dead symlinks, as maybe this is not the first time the assembly is made pattern = os.path.join(assemblyFolder, '*') currFiles = glob.glob(pattern) for filename in currFiles: if not os.path.exists(os.path.realpath(filename)): logger.info("Will wipe dead link: " + filename) os.system("rm -f " + filename) # For each batch folder, start adding links to files that we want in the tarball for batch in batchFolders: # Skip folders where we did not produce final output finalDemFile = os.path.join(batch, icebridge_common.blendFileName()) if not os.path.exists(finalDemFile): continue # Need to change the name of these files when they go in the output folder (startFrame, stopFrame) = icebridge_common.getFrameRangeFromBatchFolder(batch) # We respect the convention below in push_to_nsidc.py. prefix = ('F_%05d_%05d' % (startFrame, stopFrame)) prefix = os.path.join(assemblyFolder, prefix) target = prefix + '_DEM.tif' try: if os.path.exists(target): os.system("rm -f " + target) # to wipe whatever was there os.symlink(finalDemFile, target) except Exception as e: logger.info(str(e) + " when doing: ln -s " + finalDemFile + " " + target) # Tar up the assembled files and send them at the same time using the shiftc command # - No need to use a compression algorithm here fileName = run.getOutputTarName() lfePath = os.path.join(REMOTE_OUTPUT_FOLDER, fileName) logger.info('Sending run to lfe...') cmd = "ssh lfe 'rm -f " + stripHost(lfePath) + "' 2>/dev/null" logger.info(cmd) os.system(cmd) cmd = 'shiftc --wait -d -r --dereference --create-tar ' + \ os.path.join(runFolder, os.path.basename(assemblyFolder)) + ' ' + lfePath # Command to transfer the files as they are in the batch dirs without symlink #cmd = 'shiftc --wait -d -r --include=\'^.*?' + icebridge_common.blendFileName() + \ # '$\' --create-tar ' + runFolder + \ # ' ' + lfePath try: robust_shiftc(cmd, logger) except Exception as e: logger.info(str(e)) raise Exception('Failed to pack/send results for run ' + str(run) + \ '. Maybe not all sym links are valid.') os.chdir(cwd) logger.info('Finished sending run to lfe.') def packAndSendLabels(run, logger): '''Archive the labeled images generated by the 3rd party tool.''' # Archive everything stored in the 'labeled' and 'label_ortho' folders. logger.info('Archiving labled images for run ' + str(run)) cwd = os.getcwd() os.chdir(run.parentFolder) runFolder = str(run) relLabelFolder = os.path.join(runFolder, os.path.basename(run.getLabelFolder())) relOrthoFolder = os.path.join(runFolder, os.path.basename(run.getLabelOrthoFolder())) # Remove any .xml files cmd = 'rm ' + run.getLabelFolder() + '/*.xml' print(cmd) os.system(cmd) cmd = 'rm ' + run.getLabelOrthoFolder() + '/*.xml' print(cmd) os.system(cmd) fileName = run.getLabelTarName() lfePath = os.path.join(REMOTE_LABEL_FOLDER, fileName) # First remove any existing tar file cmd = "ssh lfe 'rm -f " + stripHost(lfePath) + "' 2>/dev/null" logger.info(cmd) os.system(cmd) # Create a new archive cmd = ('shiftc --wait -d -r --create-tar ' + relLabelFolder +' '+ relOrthoFolder +' '+ lfePath) robust_shiftc(cmd, logger) os.chdir(cwd) logger.info('Finished sending labels to lfe.') ================================================ FILE: src/asp/IceBridge/blend_dems.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # For each DEM, blend it, within its footprint, with neighboring DEMs. # That is to say, make several mosaics. First the DEM alone. Then # blended with the one on the right. Then also with the one on the # left. Then with second on the right. Then with second on the left. # Keep the result with the lowest mean error to lidar. # It creates files of the form: # processed/batch_2489_2490_2/out-blend-DEM.tif # processed/batch_2489_2490_2/out-blend-DEM-diff.csv # Operate in the range [startFrame, stopFrame) so does not include the # last one. # See usage below. # TODO: Find a better way of picking DEMs to blend. For example, # include only those which decrease the mean error. Then compare # if this approach gives lower error than the current way # which keeps on adding DEMs left and right. import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, glob import traceback import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] def getMeanDemDiff(dems, outputPrefix): '''Get the mean distance between the input DEMs to the main DEM.''' mainDem = dems[0] meanDiff = 0.0 meanCount = 0.0 for i in range(1,len(dems)): thisDem = dems[i] if not thisDem: continue diffPrefix = outputPrefix + '_' + str(i) diffPath = diffPrefix + '-diff.tif' cmd = ('geodiff --absolute %s %s -o %s' % (mainDem, thisDem, diffPrefix)) print(cmd) asp_system_utils.executeCommand(cmd, diffPath, True, False) try: # Read in and examine the results results = icebridge_common.readGeodiffOutput(diffPath) print("Found inter-DEM diff " + str(i) + " = " + str(results['Mean'])) meanDiff = meanDiff + results['Mean'] meanCount = meanCount + 1.0 except: print('No overlap with DEM ' + thisDem) if meanCount < 1: # Handle degenerate cases return 0 meanDiff = meanDiff / meanCount print('Mean of DEM diffs = ' + str(meanDiff)) return meanDiff def runBlend(frame, processFolder, lidarFile, fireballDEM, options, threadText, redo, suppressOutput): WEIGHT_EXP = 1.3 # This will run as multiple processes. Hence have to catch all exceptions. try: demFile, batchFolder = icebridge_common.frameToFile(frame, icebridge_common.alignFileName(), processFolder, options.bundleLength) lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile) if demFile == "": print("Could not find DEM for frame: " + str(frame)) return # The names for the final results finalOutputPrefix = os.path.join(batchFolder, 'out-blend-DEM') finalBlend = finalOutputPrefix + '.tif' finalDiff = finalOutputPrefix + "-diff.csv" fireballOutputPrefix = os.path.join(batchFolder, 'out-blend-fb-footprint') fireballBlendOutput = fireballOutputPrefix + '-tile-0.tif' finalFireballOutput = fireballOutputPrefix + '-DEM.tif' fireballDiffPath = fireballOutputPrefix + "-diff.csv" # This is turned off for now. Find the diff between neighboring # aligned DEMs before blending. prevDemFile, prevBatchFolder = \ icebridge_common.frameToFile(frame-1, icebridge_common.alignFileName(), processFolder, options.bundleLength) prevDiffPrefix = os.path.join(batchFolder, 'out-prev') prevDiffFile = prevDiffPrefix + '-diff.tif' if options.computeDiffToPrev and redo and os.path.exists(prevDiffFile): os.system("rm -f " + prevDiffFile) if os.path.exists(prevDemFile) and os.path.exists(demFile): if os.path.exists(prevDiffFile): print("File exists: " + prevDiffFile) else: cmd = ('geodiff --absolute %s %s -o %s' % (prevDemFile, demFile, prevDiffPrefix)) print(cmd) asp_system_utils.executeCommand(cmd, prevDiffFile, suppressOutput, redo) if not redo: set1Exists = False if (os.path.exists(finalBlend) and os.path.exists(finalDiff)): print("Files exist: " + finalBlend + " " + finalDiff + ".") set1Exists = True set2Exists = True if fireballDEM != "": if (os.path.exists(finalFireballOutput) and os.path.exists(fireballDiffPath)): print("Files exist: " + finalFireballOutput + " " + fireballDiffPath + ".") set2Exists = True else: set2Exists = False if set1Exists and set2Exists: return # We will blend the dems with frame offsets within frameOffsets[0:index] filesToWipe = [] bestMean = 1.0e+100 bestBlend = '' bestVals = '' bestDiff = '' # Look at frames with these offsets when blending frameOffsets = [0, 1, -1, 2, -2] for index in range(len(frameOffsets)): # Find all the DEMs up to the current index dems = [] currDemFile = "" for val in range(0, index+1): offset = frameOffsets[val] currDemFile, currBatchFolder = \ icebridge_common.frameToFile(frame + offset, icebridge_common.alignFileName(), processFolder, options.bundleLength) if currDemFile == "": continue dems.append(currDemFile) if currDemFile == "": # The last DEM was not present. Hence this iteration will add nothing new. continue # Compute the mean distance between the DEMs # TODO: Make sure this gets cleaned up! meanWorkPrefix = os.path.join(batchFolder, 'bd') meanDiff = getMeanDemDiff(dems, meanWorkPrefix) # If the mean error between DEMs is creater than this, # use a less aggressive blending method. MEAN_DIFF_BLEND_THRESHOLD = 1.0 demString = " ".join(dems) outputPrefix = os.path.join(batchFolder, 'out-blend-' + str(index)) # Blend DEMs together using dem_mosaic demString = " ".join(demFiles) cmd = ('dem_mosaic --weights-exponent %f %s %s -o %s' % (WEIGHT_EXP, demString, threadText, outputPrefix)) if meanDiff > MEAN_DIFF_BLEND_THRESHOLD: cmd += ' --propagate-nodata --use-centerline-weights ' print(cmd) # Execute the blend command. # - Sometimes there is junk left from a previous interrupted run. So if we # got so far, recreate all files. localRedo = True print(cmd) asp_system_utils.executeCommand(cmd, blendOutput, suppressOutput, localRedo) filesToWipe.append(blendOutput) diffPath = outputPrefix + "-diff.csv" filesToWipe.append(diffPath) # Compute post-blending error to lidar cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' % (lidarCsvFormatString, blendOutput, lidarFile, outputPrefix)) print(cmd) asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo) # Read in and examine the results try: results = icebridge_common.readGeodiffOutput(diffPath) print("Current mean error to lidar is " + str(results['Mean'])) if bestMean > float(results['Mean']): bestMean = float(results['Mean']) bestBlend = blendOutput bestVals = demString bestDiff = diffPath except Exception as e: pass logFiles = glob.glob(outputPrefix + "*" + "-log-" + "*") filesToWipe += logFiles # Update the filenames of the output files print("Best mean error to lidar is " + str(bestMean) + " when blending " + bestVals) cmd = "mv " + bestBlend + " " + finalBlend print(cmd) asp_system_utils.executeCommand(cmd, finalBlend, suppressOutput, redo) cmd = "mv " + bestDiff + " " + finalDiff print(cmd) asp_system_utils.executeCommand(cmd, finalDiff, suppressOutput, redo) # Generate a thumbnail of the final DEM hillOutput = finalOutputPrefix+'_HILLSHADE.tif' cmd = 'hillshade ' + finalBlend +' -o ' + hillOutput asp_system_utils.executeCommand(cmd, hillOutput, suppressOutput, redo) # Generate a low resolution compressed thumbnail of the hillshade for debugging thumbOutput = finalOutputPrefix + '_HILLSHADE_browse.tif' cmd = 'gdal_translate '+hillOutput+' '+thumbOutput+' -of GTiff -outsize 40% 40% -b 1 -co "COMPRESS=JPEG"' asp_system_utils.executeCommand(cmd, thumbOutput, suppressOutput, redo) os.system("rm -f " + hillOutput) # Remove this file to keep down the file count # Do another blend, to this DEM's footprint, but not using it if fireballDEM != "": # Find all the DEMs dems = [] for val in range(0, len(frameOffsets)): offset = frameOffsets[val] currDemFile, currBatchFolder = \ icebridge_common.frameToFile(frame + offset, icebridge_common.alignFileName(), processFolder, options.bundleLength) if currDemFile == "": continue dems.append(currDemFile) demString = " ".join(dems) cmd = ('dem_mosaic --weights-exponent %f %s %s -o %s' % (WEIGHT_EXP, demString, threadText, fireballOutputPrefix)) #filesToWipe.append(fireballBlendOutput) print(cmd) # Sometimes there is junk left from a previous interrupted run. So if we # got so far, recreate all files. localRedo = True asp_system_utils.executeCommand(cmd, fireballBlendOutput, suppressOutput, localRedo) #filesToWipe.append(fireballDiffPath) cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' % (lidarCsvFormatString, fireballBlendOutput, lidarFile, fireballOutputPrefix)) print(cmd) asp_system_utils.executeCommand(cmd, fireballDiffPath, suppressOutput, redo) # Read in and examine the results try: results = icebridge_common.readGeodiffOutput(fireballDiffPath) print("Mean error to lidar in fireball footprint is " + str(results['Mean'])) cmd = "mv " + fireballBlendOutput + " " + finalFireballOutput print(cmd) asp_system_utils.executeCommand(cmd, finalFireballOutput, suppressOutput, redo) except Exception as e: pass # Generate a thumbnail of the final DEM #hillOutput = fireballOutputPrefix+'_HILLSHADE.tif' #cmd = 'hillshade ' + finalFireballOutput +' -o ' + hillOutput #print(cmd) #asp_system_utils.executeCommand(cmd, hillOutput, suppressOutput, redo) ## Generate a low resolution compressed thumbnail of the hillshade for debugging #thumbOutput = fireballOutputPrefix + '_HILLSHADE_browse.tif' #cmd = 'gdal_translate '+hillOutput+' '+thumbOutput+' -of GTiff -outsize 40% 40% -b 1 -co "COMPRESS=JPEG"' #asp_system_utils.executeCommand(cmd, thumbOutput, suppressOutput, redo) #os.system("rm -f " + hillOutput) # Remove this file to keep down the file count logFiles = glob.glob(fireballOutputPrefix + "*" + "-log-" + "*") filesToWipe += logFiles # Done with dealing with the fireball footprint # Clean up extra files for fileName in filesToWipe: if os.path.exists(fileName): print("Removing: " + fileName) os.system("rm -f " + fileName) # TODO: Handle this cleanup better! os.system('rm -f ' + meanWorkPrefix + '*') except Exception as e: print('Blending failed!\n' + str(e) + ". " + str(traceback.print_exc())) sys.stdout.flush() def main(argsIn): try: # Sample usage: # python ~/projects/StereoPipeline/src/asp/IceBridge/blend_dems.py --site GR \ # --yyyymmdd 20120315 --start-frame 2490 --stop-frame 2491 --bundle-length 2 \ # --num-threads 8 --num-processes 10 usage = '''blend_dems.py ''' parser = argparse.ArgumentParser(usage=usage) # Run selection parser.add_argument("--yyyymmdd", dest="yyyymmdd", required=True, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", required=True, help="Name of the location of the images (AN, GR, or AL)") parser.add_argument("--output-folder", dest="outputFolder", default=None, help="Name of the output folder. If not specified, " + \ "use something like AN_YYYYMMDD.") # Processing options parser.add_argument('--bundle-length', dest='bundleLength', default=2, type=int, help="The number of images to bundle adjust and process " + \ "in a single batch.") parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on. This frame will also be processed.') parser.add_argument("--processing-subfolder", dest="processingSubfolder", default=None, help="Specify a subfolder name where the processing outputs will go. "+\ "The default is no additional folder.") parser.add_argument("--compute-diff-to-prev-dem", action="store_true", dest="computeDiffToPrev", default=False, help="Compute the absolute difference between the current DEM " + "and the one before it.") parser.add_argument("--blend-to-fireball-footprint", action="store_true", dest="blendToFireball", default=False, help="Create additional blended DEMs having the same " + \ "footprint as Fireball DEMs.") # Performance options parser.add_argument('--num-processes', dest='numProcesses', default=1, type=int, help='The number of simultaneous processes to run.') parser.add_argument('--num-threads', dest='numThreads', default=8, type=int, help='The number of threads per process.') options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) icebridge_common.switchWorkDir() os.system("ulimit -c 0") # disable core dumps os.system("rm -f core.*") # these keep on popping up os.system("umask 022") # enforce files be readable by others if len(options.yyyymmdd) != 8 and len(options.yyyymmdd) != 9: # Make an exception for 20100422a raise Exception("The --yyyymmdd field must have length 8 or 9.") if options.outputFolder is None: options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd) os.system('mkdir -p ' + options.outputFolder) logLevel = logging.INFO # Make this an option?? logger = icebridge_common.setUpLogger(options.outputFolder, logLevel, 'icebridge_blend_log') (out, err, status) = asp_system_utils.executeCommand(['uname', '-a'], suppressOutput = True) logger.info("Running on machine: " + out) logger.info(str(argsIn)) processFolder = os.path.join(options.outputFolder, 'processed') # Handle subfolder option. This is useful for comparing results with different parameters! if options.processingSubfolder: processFolder = os.path.join(processFolder, options.processingSubfolder) logger.info('Reading from processing subfolder: ' + options.processingSubfolder) orthoFolder = icebridge_common.getOrthoFolder(options.outputFolder) orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) if not os.path.exists(orthoIndexPath): raise Exception("Error: Missing ortho index file: " + orthoIndexPath + ".") (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath) if options.blendToFireball: fireballFrameDict = icebridge_common.getCorrectedFireballDems(options.outputFolder) lidarFolder = icebridge_common.getLidarFolder(options.outputFolder) threadText = '' if options.numThreads: threadText = '--threads ' + str(options.numThreads) redo = False suppressOutput = True taskHandles = [] if options.numProcesses > 1: pool = multiprocessing.Pool(options.numProcesses) # Bound the frames sortedFrames = sorted(orthoFrameDict.keys()) if len(sortedFrames) > 0: if options.startFrame < sortedFrames[0]: options.startFrame = sortedFrames[0] if options.stopFrame > sortedFrames[-1] + 1: options.stopFrame = sortedFrames[-1] + 1 else: # No ortho files, that means nothing to do options.startFrame = 0 options.stopFrame = 0 for frame in range(options.startFrame, options.stopFrame): if not frame in orthoFrameDict: logger.info("Error: Missing ortho file for frame: " + str(frame) + ".") continue orthoFile = orthoFrameDict[frame] try: lidarFile = icebridge_common.findMatchingLidarFile(orthoFile, lidarFolder) except: # Skip if no lidar file matches this frame continue fireballDEM = "" if options.blendToFireball: if frame in fireballFrameDict: fireballDEM = fireballFrameDict[frame] else: logger.info("No fireball DEM for frame: " + str(frame)) args = (frame, processFolder, lidarFile, fireballDEM, options, threadText, redo, suppressOutput) # Run things sequentially if only one process, to make it easy to debug if options.numProcesses > 1: taskHandles.append(pool.apply_async(runBlend, args)) else: runBlend(*args) if options.numProcesses > 1: icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, interactive = False, quitKey='q', sleepTime=20) icebridge_common.stopTaskPool(pool) # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/camera_lookup.txt ================================================ # Camera used for each flight, based on https://nsidc.org/data/IODCC0/ # in the "User Guide" tab. # Fall 2009, Antarctic AN 20091016 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091018 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091020 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091021 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091024 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091025 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091027 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091028 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091029 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091030 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091031 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091102 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091103 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091104 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091105 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091107 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091109 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091112 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091115 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091116 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091118 IODCC0_20091020_AN_NASA_DMS01_opt.pdf AN 20091208 IODCC0_20091020_AN_NASA_DMS01_opt.pdf # Spring 2010, Arctic GR 20100317 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100322 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100323 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100324 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100326 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100329 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100330 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100402 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100405 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100409 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100412 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100413 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100414 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100419 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100420 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100421 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100422 IODCC0_2010_GR_NASA_DMS02.pdf # two flights actually GR 20100423 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100430 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100507 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100508 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100510 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100512 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100513 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100514 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100515 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100517 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100519 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100520 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100521 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100525 IODCC0_2010_GR_NASA_DMS02.pdf GR 20100526 IODCC0_2010_GR_NASA_DMS02.pdf # Fall 2010, Antarctic AN 20101016 IODCC0_2010_AN_NASA_DMS01.pdf # Flight 10/16/2010 all # Two cameras for this flight AN 20101026 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101026 IODCC0_2010_AN_NASA_DMS01.pdf Flight 10/26/2010 frames 00040-11982 AN 20101028 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101030 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101104 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101105 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101106 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101110 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101113 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101119 IODCC0_2010_AN_NASA_DMS02_opt.pdf AN 20101120 IODCC0_2010_AN_NASA_DMS02_opt.pdf # Spring 2011, Arctic GR 20110309 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110316 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110317 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110318 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110322 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110323 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110325 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110326 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110328 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110329 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110331 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110406 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110407 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110408 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110411 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110412 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110413 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110414 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110415 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110416 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110418 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110419 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110422 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110423 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110425 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110426 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110428 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110429 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110502 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110504 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110505 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110506 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110507 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110509 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110510 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110511 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110512 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110513 IODCC0_2011_GR_NASA_DMS03_opt.pdf # Flight with two cameras GR 20110516 IODCC0_2011_GR_NASA_DMS03_opt.pdf GR 20110516 IODCC0_2011_GR_NASA_DMS04.pdf Flight 5/16/2011 frames 10338-10931 GR 20110519 IODCC0_2011_GR_NASA_DMS03_opt.pdf # Fall 2011, Antarctic AN 20111004 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111009 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111010 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111012 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111013 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111014 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111017 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111018 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111020 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111021 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111023 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111024 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111025 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111026 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111029 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111030 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111103 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111104 IODCC0_2011_AN_NASA_DMS04_opt.pdf # Flights 11/07/2011 thru 11/17/2011 AN 20111107 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111109 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111111 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111112 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111113 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111114 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111116 IODCC0_2011_AN_NASA_DMS05_opt.pdf AN 20111117 IODCC0_2011_AN_NASA_DMS05_opt.pdf # Flight with two cameras AN 20111119 IODCC0_2011_AN_NASA_DMS04_opt.pdf AN 20111119 IODCC0_2011_AN_NASA_DMS05_opt.pdf Flight 11/19/2011 frames 00011-12762 AN 20111119 IODCC0_2011_AN_NASA_DMS05_opt.pdf Flight 11/19/2011 frames 14330-14388 # Spring 2012, Arctic # Flights 3/6/2012 thru 4/4/2012 GR 20120306 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120314 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120315 IODCC0_20120315_GR_NASA_DMS06_opt.pdf GR 20120316 IODCC0_20120315_GR_NASA_DMS06_opt.pdf GR 20120317 IODCC0_20120315_GR_NASA_DMS06_opt.pdf GR 20120319 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120321 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120322 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120323 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120326 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120327 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120328 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120329 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120330 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120402 IODCC0_2012_GR_NASA_DMS06_opt.pdf GR 20120404 IODCC0_2012_GR_NASA_DMS06_opt.pdf # Flights 4/10/2012 thru 5/17/2012 GR 20120410 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120411 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120412 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120413 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120414 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120416 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120417 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120418 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120419 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120420 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120421 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120423 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120425 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120428 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120429 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120430 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120502 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120503 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120504 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120507 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120508 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120509 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120510 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120511 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120514 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120515 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120516 IODCC0_2012_GR_NASA_DMS08_opt.pdf GR 20120517 IODCC0_2012_GR_NASA_DMS08_opt.pdf # Fall 2012, Antarctic AN 20121003 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121012 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121013 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121015 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121016 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121018 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121019 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121022 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121023 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121025 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121027 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121028 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121101 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121102 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121104 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121106 IODCC0_2012_AN_NASA_DMS07_opt.pdf # Flight with two cameras AN 20121107 IODCC0_2012_AN_NASA_DMS07_opt.pdf AN 20121107 IODCC0_2012_AN_NASA_DMS09.pdf Flight 11/07/2012 frames 13920-17415 # Spring 2013, Arctic GR 20130314 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130320 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130321 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130322 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130323 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130324 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130326 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130327 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130328 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130402 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130404 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130405 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130406 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130408 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130409 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130410 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130411 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130412 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130415 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130418 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130419 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130420 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130422 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130423 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130424 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130425 IODCC0_2013_GR_NASA_DMS10_opt.pdf GR 20130426 IODCC0_2013_GR_NASA_DMS10_opt.pdf # Fall 2013, Antarctic AN 20131108 IODCC0_20131127_AN_NASA_DMS12_opt.pdf AN 20131118 IODCC0_20131127_AN_NASA_DMS12_opt.pdf AN 20131119 IODCC0_20131127_AN_NASA_DMS12_opt.pdf AN 20131120 IODCC0_20131127_AN_NASA_DMS12_opt.pdf AN 20131125 IODCC0_20131127_AN_NASA_DMS12_opt.pdf # Flight with two cameras AN 20131126 IODCC0_20131127_AN_NASA_DMS12_opt.pdf AN 20131126 IODCC0_2013_AN_NASA_DMS11.pdf Flight 11/26/2013 frames 10551-16024 AN 20131127 IODCC0_20131127_AN_NASA_DMS12_opt.pdf # Spring 2014, Arctic GR 20140306 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140310 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140312 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140313 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140314 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140315 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140317 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140318 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140319 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140321 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140324 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140325 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140326 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140328 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140331 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140401 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140403 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140404 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140405 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140407 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140408 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140409 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140410 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140412 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140414 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140415 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140416 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140419 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140421 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140423 IODCC0_2014_GR_NASA_DMS13_opt.pdf # Flight with two cameras GR 20140424 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140424 IODCC0_2014_GR_NASA_DMS14.pdf Flight 4/24/2014 frames 19842-20330 GR 20140426 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140428 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140429 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140430 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140501 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140502 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140505 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140506 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140507 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140508 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140509 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140512 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140514 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140515 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140516 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140519 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140520 IODCC0_2014_GR_NASA_DMS13_opt.pdf GR 20140521 IODCC0_2014_GR_NASA_DMS13_opt.pdf # Fall 2014, Antarctic AN 20141008 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141016 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141018 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141020 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141023 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141025 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141026 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141028 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141029 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141102 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141103 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141105 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141106 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141107 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141108 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141110 IODCC0_2014_AN_NASA_DMS18_opt.pdf Flight 11/10/2014 all AN 20141111 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141113 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141114 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141115 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141116 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141121 IODCC0_2014_AN_NASA_DMS17_opt.pdf AN 20141122 IODCC0_2014_AN_NASA_DMS17_opt.pdf # Spring 2015, Arctic GR 20150313 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150319 IODCC0_20150408_GR_NASA_DMS19_opt.pdf # Flight with two cameras GR 20150324 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150324 IODCC0_2015_GR_NASA_DMS18.pdf Flight 3/24/2015 frames 08239-14656 GR 20150325 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150326 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150327 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150329 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150330 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150401 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150403 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150408 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150409 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150410 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150411 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150413 IODCC0_20150408_GR_NASA_DMS19_opt.pdf # Flight with two cameras GR 20150414 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150414 IODCC0_2015_GR_NASA_DMS18.pdf Flight 4/14/2015 frames 00749-22182 GR 20150417 IODCC0_20150408_GR_NASA_DMS19_opt.pdf # Flight with two cameras GR 20150418 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150418 IODCC0_2015_GR_NASA_DMS18.pdf Flight 4/18/2015 frames 17050-17089 GR 20150420 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150421 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150422 IODCC0_20150408_GR_NASA_DMS19_opt.pdf # Flight with two cameras GR 20150423 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150423 IODCC0_2015_GR_NASA_DMS18.pdf Flight 4/23/2015 frames 11709-25232 GR 20150424 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150425 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150427 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150428 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150430 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150501 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150505 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150506 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150507 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150508 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150511 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150512 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150515 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150521 IODCC0_20150408_GR_NASA_DMS19_opt.pdf GR 20150522 IODCC0_20150408_GR_NASA_DMS19_opt.pdf # Fall 2015, Antarctic AN 20150910 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20150911 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20150917 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20150922 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20150924 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20150926 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20150926 IODCC0_2015_AN_NASA_DMS15_rot.pdf Flight 9/26/2015 frames 02114-02857 AN 20150929 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151001 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151003 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151005 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151007 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151010 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151012 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151014 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151017 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151020 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151022 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151025 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151025 IODCC0_2015_AN_NASA_DMS15_rot.pdf Flight 10/25/2015 frames 01369-03289 AN 20151027 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151029 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151031 IODCC0_2015_AN_NASA_DMS16_rot.pdf AN 20151101 IODCC0_2015_AN_NASA_DMS16_rot.pdf # Fall 2015, Arctic GR 20150915 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20150923 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20150924 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20150925 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20150928 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20150930 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151005 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151006 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151008 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151009 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151013 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151018 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151019 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151020 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151021 IODCC0_2015_GR_NASA_DMS20_rot.pdf GR 20151022 IODCC0_2015_GR_NASA_DMS20_rot.pdf # Spring 2016, Arctic GR 20160322 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160412 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160419 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160420 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160421 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160429 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160503 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160504 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160509 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160510 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160511 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160512 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160513 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160514 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160516 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160517 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160518 IODCC0_2016_GR_NASA_DMS21_opt.pdf GR 20160519 IODCC0_2016_GR_NASA_DMS21_opt.pdf # Summer 2016 Alaska GR 20160629 IODCC0_2016_GR_NASA_DMS15_rot.pdf GR 20160713 IODCC0_2016_GR_NASA_DMS15_rot.pdf GR 20160714 IODCC0_2016_GR_NASA_DMS15_rot.pdf GR 20160715 IODCC0_2016_GR_NASA_DMS15_rot.pdf GR 20160719 IODCC0_2016_GR_NASA_DMS15_rot.pdf GR 20160720 IODCC0_2016_GR_NASA_DMS15_rot.pdf GR 20160721 IODCC0_2016_GR_NASA_DMS15_rot.pdf # Fall 2016, Antarctic AN 20161005 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161014 IODCC0_2016_AN_NASA_DMS22.pdf # Flight with two cameras AN 20161015 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161015 IODCC0_2016_AN_NASA_DMS23.pdf Flight 10/15/2016 frames 00006-00939 only AN 20161017 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161020 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161022 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161024 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161025 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161026 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161027 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161028 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161031 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161102 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161103 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161104 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161105 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161107 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161109 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161110 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161111 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161112 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161114 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161115 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161117 IODCC0_2016_AN_NASA_DMS22.pdf AN 20161118 IODCC0_2016_AN_NASA_DMS22.pdf # Spring 2017, Arctic GR 20170226 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170227 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170309 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170310 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170311 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170312 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170314 IODCC0_2017_GR_NASA_DMS25_opt.pdf frames 10-7561 GR 20170314 IODCC0_2017_GR_NASA_DMS24_opt.pdf frames 7600-12920 GR 20170320 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170322 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170323 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170324 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170327 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170328 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170329 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170330 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170331 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170403 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170405 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170406 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170407 IODCC0_2017_GR_NASA_DMS25_opt.pdf GR 20170410 IODCC0_2017_GR_NASA_DMS25_opt.pdf frames 6-7039 GR 20170410 IODCC0_2017_GR_NASA_DMS24_opt.pdf frames 7040-15139 GR 20170411 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170412 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170413 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170414 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170417 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170419 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170421 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170422 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170424 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170426 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170428 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170429 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170501 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170502 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170503 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170505 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170506 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170508 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170510 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170511 IODCC0_2017_GR_NASA_DMS24_opt.pdf GR 20170512 IODCC0_2017_GR_NASA_DMS24_opt.pdf # Summer 2017, Arctic GR 20170710 IODCC0_2017_GR_NASA_DMS26_rot.pdf GR 20170717 IODCC0_2017_GR_NASA_DMS26_rot.pdf GR 20170718 IODCC0_2017_GR_NASA_DMS26_rot.pdf GR 20170719 IODCC0_2017_GR_NASA_DMS26_rot.pdf GR 20170724 IODCC0_2017_GR_NASA_DMS26_rot.pdf GR 20170725 IODCC0_2017_GR_NASA_DMS26_rot.pdf frames 0006-2390 GR 20170725 IODCC0_2017_GR_NASA_DMS22_rot.pdf frames 2391-7471 # Fall 20017, Antarctic AN 20171029 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171031 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171103 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171104 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171112 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171114 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171116 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171116 IODCC0_2017_AN_NASA_DMS22.pdf frames 0240-2626 AN 20171121 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171122 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171124 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171125 IODCC0_20171029_AN_NASA_DMS27_opt.pdf AN 20171129 IODCC0_20171029_AN_NASA_DMS27_opt.pdf See also special_cases.txt ================================================ FILE: src/asp/IceBridge/camera_models_from_nav.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Compile a list of all the dates with data available import os, sys, optparse, subprocess, logging # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_file_utils, icebridge_common asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] #------------------------------------------------------------------------------ # TODO: Fetch the input nav file in the main fetch script def main(argsIn): # Command line parsing try: usage = "usage: camera_models_from_nav.py [options]" parser = optparse.OptionParser(usage=usage) parser.add_option('--start-frame', dest='startFrame', default=-1, type='int', help='The frame number to start processing with.') parser.add_option('--stop-frame', dest='stopFrame', default=999999, type='int', help='The frame number to finish processing with.') parser.add_option("--input-calibration-camera", dest="inputCalCamera", default="", help="Use this input calibrated camera.") parser.add_option('--camera-mounting', dest='cameraMounting', default=0, type='int', help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.') (options, args) = parser.parse_args(argsIn) if len(args) < 5: print ('Error: Missing arguments.') print (usage) return -1 imageFolder = os.path.abspath(args[0]) orthoFolder = os.path.abspath(args[1]) calFolder = os.path.abspath(args[2]) navFolder = os.path.abspath(args[3]) outputFolder = os.path.abspath(args[4]) except optparse.OptionError as msg: raise Usage(msg) runDir = os.path.dirname(orthoFolder) os.system("mkdir -p " + runDir) logLevel = logging.INFO # Make this an option?? logger = icebridge_common.setUpLogger(runDir, logLevel, 'camera_models_from_nav_log') if not os.path.exists(orthoFolder): logger.error('Ortho folder ' + orthoFolder + ' does not exist!') return -1 # Find the nav file # - There should only be one or two nav files per flight. fileList = os.listdir(navFolder) fileList = [x for x in fileList if '.out' in x] if len(fileList) == 0: logger.error('No nav files in: ' + navFolder) return -1 navPath = os.path.join(navFolder, fileList[0]) parsedNavPath = navPath.replace('.out', '.txt') if not asp_file_utils.fileIsNonZero(navPath): logger.error('Nav file ' + navPath + ' is invalid!') return -1 # Create the output file only if it is empty or does not exist isNonEmpty = asp_file_utils.fileIsNonZero(parsedNavPath) if not isNonEmpty: # Initialize the output file as being empty logger.info("Create empty file: " + parsedNavPath) open(parsedNavPath, 'w').close() # Append to the output parsed nav file for fileName in fileList: # Convert the nav file from binary to text navPath = os.path.join(navFolder, fileName) with open(navPath, 'r') as f: try: text = f.readline() if 'HTML' in text: # Sometimes the server is down, and instead of the binary nav file # we are given an html file with an error message. logger.info("Have invalid nav file: " + navPath) return -1 # Die in this case! except UnicodeDecodeError as e: # Got a binary file, that means likely we are good pass cmd = asp_system_utils.which('sbet2txt.pl') + ' -q ' + navPath + ' >> ' + parsedNavPath logger.info(cmd) if not isNonEmpty: os.system(cmd) cameraPath = options.inputCalCamera if cameraPath == "": # No input camera file provided, look one up. It does not matter much, # as later ortho2pinhole will insert the correct intrinsics. goodFile = False fileList = os.listdir(calFolder) fileList = [x for x in fileList if (('.tsai' in x) and ('~' not in x))] if not fileList: logger.error('Unable to find any camera files in ' + calFolder) return -1 for fileName in fileList: cameraPath = os.path.join(calFolder, fileName) # Check if this path is valid with open(cameraPath, 'r') as f: for line in f: if 'fu' in line: goodFile = True break if goodFile: break # Get the ortho list orthoFiles = icebridge_common.getTifs(orthoFolder) logger.info('Found ' + str(len(orthoFiles)) + ' ortho files.') # Look up the frame numbers for each ortho file infoDict = {} for ortho in orthoFiles: if ('gray' in ortho) or ('sub' in ortho): continue frame = icebridge_common.getFrameNumberFromFilename(ortho) if frame < options.startFrame or frame > options.stopFrame: continue infoDict[frame] = [ortho, ''] # Get the image file list try: imageFiles = icebridge_common.getTifs(imageFolder) except Exception as e: raise Exception("Cannot continue with nav generation, will resume later when images are created. This is not a fatal error. " + str(e)) logger.info('Found ' + str(len(imageFiles)) + ' image files.') # Update the second part of each dictionary object for image in imageFiles: if ('gray' in image) or ('sub' in image): continue frame = icebridge_common.getFrameNumberFromFilename(image) if frame < options.startFrame or frame > options.stopFrame: continue if frame not in infoDict: logger.info('Image missing ortho file: ' +image) # don't throw here, that will mess the whole batch, we will recover # the missing one later. continue infoDict[frame][1] = image os.system('mkdir -p ' + outputFolder) orthoListFile = os.path.join(outputFolder, 'ortho_file_list_' + str(options.startFrame) + "_" + str(options.stopFrame) + '.csv') # Open the output file for writing logger.info("Writing: " + orthoListFile) with open(orthoListFile, 'w') as outputFile: # Loop through frames in order for key in sorted(infoDict): # Write the ortho name and the output camera name to the file (ortho, image) = infoDict[key] if not image: #raise Exception('Ortho missing image file: ' +ortho) continue camera = image.replace('.tif', '.tsai') outputFile.write(ortho +', ' + camera + '\n') # Check if we already have all of the output camera files. haveAllFiles = True with open(orthoListFile, 'r') as inputFile: for line in inputFile: parts = line.split(',') camPath = os.path.join(outputFolder, parts[1].strip()) if not asp_file_utils.fileIsNonZero(camPath): logger.info('Missing file -> ' + camPath) haveAllFiles = False break # Call the C++ tool to generate a camera model for each ortho file if not haveAllFiles: cmd = ('nav2cam --input-cam %s --nav-file %s --cam-list %s --output-folder %s --camera-mounting %d' % (cameraPath, parsedNavPath, orthoListFile, outputFolder, options.cameraMounting)) logger.info(cmd) os.system(cmd) else: logger.info("All nav files were already generated.") # Generate a kml file for the nav camera files kmlPath = os.path.join(outputFolder, 'nav_cameras.kml') # This is a hack. If we are invoked from a Pleiades node, do not # create this kml file, as nodes will just overwrite each other. # This job may happen anyway earlier or later when on the head node. if not 'PBS_NODEFILE' in os.environ: try: tempPath = os.path.join(outputFolder, 'list.txt') logger.info('Generating nav camera kml file: ' + kmlPath) os.system('ls ' + outputFolder + '/*.tsai > ' + tempPath) orbitviz_pinhole = asp_system_utils.which('orbitviz_pinhole') cmd = orbitviz_pinhole + ' --hide-labels -o ' + kmlPath + ' --input-list ' + tempPath logger.info(cmd) asp_system_utils.executeCommand(cmd, kmlPath, suppressOutput=True, redo=False) os.remove(tempPath) except Exception as e: logger.info("Warning: " + str(e)) logger.info('Finished generating camera models from nav!') return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/correct_icebridge_l3_dem.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include #include #include #include /** A simple tool to fix the Icebridge L3 dems located here: http://nsidc.org/data/iodms3 The files are missing a tag indicating that they are type float and are incorrectly read as type uint32. They are also missing the projection information. This tool just rewrites the file so that this information is added. */ using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw::cartography; int main( int argc, char *argv[] ) { // Simple input parsing if (argc < 4) { vw_out() << "Usage: \n"; return -1; } std::string input_path = argv[1]; std::string output_path = argv[2]; int pole = atoi(argv[3]); // Specify which polar projection to use // Load the existing georeference info, then add the projection info. DiskImageResourceGDAL in_rsrc(input_path); GeoReference georef; bool has_georef = read_georeference(georef, in_rsrc); if (!has_georef) { vw_throw( ArgumentErr() << "Could not read the georeference from: " << input_path << ". Check if the corresponding .tfw file is present.\n"); } //vw_out() << "Georef = " << georef << std::endl; if (pole) // EPSG:3413 georef.set_proj4_projection_str("+proj=stere +lat_0=90 +lon_0=-45 +lat_ts=70 +ellps=WGS84 +datum=WGS84 +units=m"); else // EPSG:3031 georef.set_proj4_projection_str("+proj=stere +lat_0=-90 +lon_0=0 +lat_ts=-71 +ellps=WGS84 +datum=WGS84 +units=m"); //vw_out() << "Output Georef = " << georef << std::endl; // Set nodata if it is not already set. This should be constant across files. double nodata_val = -32767; // Somehow -32767 is hard-coded in those files. if ( in_rsrc.has_nodata_read() ) { nodata_val = in_rsrc.nodata_read(); vw_out() << "\tFound input nodata value: " << nodata_val << std::endl; } // Rasterize the input data using the incorrect uint32 type. DiskImageView input_dem(in_rsrc); ImageView data_in = input_dem; // Make a float casted copy of the image data. ImageView data_out(data_in.cols(), data_in.rows()); size_t num_bytes = data_in.cols()*data_in.rows()*sizeof(float); memcpy(data_out.data(), data_in.data(), num_bytes); // Write the output file. GdalWriteOptions opt; vw_out() << "Writing: " << output_path << std::endl; block_write_gdal_image(output_path, data_out, true, georef, true, nodata_val, opt, TerminalProgressCallback("vw","")); return 0; } ================================================ FILE: src/asp/IceBridge/extract_icebridge_ATM_points.py ================================================ #!/usr/bin/env python import sys, os, argparse # The path to the ASP qi2txt file basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] import sys import os, glob, re, shutil, subprocess, string, time, errno, optparse, math import asp_system_utils, asp_cmd_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] def extract_qi_points(inputPath): '''Extract data from a n Icebridge qi file. Use this ASP format code to read: --csv-format 1:lat,2:lon,3:height_above_datum ''' # Extract the data from the name name = os.path.basename(inputPath) start = name.find('_') stop = name.rfind('_') dateString = name[start+1:stop] year = int(dateString[0:4]) month = int(dateString[4:6]) # Check if the file is little endian endianFlag = ' -L ' if (year < 2010) or ((year == 2010) and (month < 10)): endianFlag = ' ' # Earlier dates are big endian, later dates are little endian. outputPath = inputPath.replace('.qi', '.csv') lookInLibexec = True execPath = asp_system_utils.which('qi2txt', lookInLibexec) cmd = execPath + ' -S' + endianFlag + inputPath + ' > ' + outputPath print(cmd) os.system(cmd) if os.path.exists(outputPath): print ('Wrote file: ' + outputPath) else: print ('Failed to write file ' + outputPath + '!!!') def extract_hdf5_points(inputPath): '''Extract data from an Icebridge hdf5 file. Use this ASP format code to read: --csv-format 1:lat,2:lon,3:height_above_datum ''' outputPath = inputPath.replace('.h5', '.csv') tempLat = inputPath + '_lat.txt' tempLon = inputPath + '_lon.txt' tempAlt = inputPath + '_alt.txt' lookInLibexec = True execPath = asp_system_utils.which('h5dump', lookInLibexec) # Extract the three values of interest one at a time cmd = execPath + ' -o '+tempLat+' -m "%.7f" --noindex -w 20 --dataset=latitude ' + \ inputPath + ' >/dev/null' print(cmd) os.system(cmd) cmd = execPath + ' -o '+tempLon+' -m "%.7f" --noindex -w 20 --dataset=longitude ' + \ inputPath + ' >/dev/null' print(cmd) os.system(cmd) cmd = execPath + ' -o '+tempAlt+' -m "%.7f" --noindex -w 20 --dataset=elevation ' + \ inputPath + ' >/dev/null' print(cmd) os.system(cmd) # Merge the three one column files into a single three column file execPath = asp_system_utils.which('paste', lookInLibexec) cmd = execPath + ' ' + tempLat + ' ' + tempLon + ' ' + tempAlt + ' > ' + outputPath print(cmd) os.system(cmd) if os.path.exists(tempLat): os.remove(tempLat) if os.path.exists(tempLon): os.remove(tempLon) if os.path.exists(tempAlt): os.remove(tempAlt) # Remove any trailing commas in lines and strip all lines without commas. cmd = "sed -i 's/,$//;/,/!d' " + outputPath print(cmd) os.system(cmd) if os.path.exists(outputPath): print('Wrote: ' + outputPath) else: print('Failed to write: ' + outputPath) def main(argsIn): # Use parser that ignores unknown options usage = "usage: " + os.path.basename(__file__) + " " parser = argparse.ArgumentParser(usage=usage, epilog="") (options, args) = parser.parse_known_args(argsIn) if len(args) < 1: parser.print_help() parser.error("Missing input ATM cloud.\n" ); # Get the input file and figure out the converter to use inputPath = args[0] ext = os.path.splitext(inputPath)[1] if ext == '.h5': extract_hdf5_points(inputPath) return 0 if ext == '.qi': extract_qi_points(inputPath) return 0 print ('Did not recognize input file type!') return -1 if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/fetch_icebridge_data.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' Tool for downloading IceBridge data ''' import sys, os, re, subprocess, optparse, logging import icebridge_common logging.info('DEBUG') logger = logging.getLogger(__name__) # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] #------------------------------------------------------------------------------ # Constants LIDAR_TYPES = ['atm1', 'atm2', 'lvis'] MAX_IN_ONE_CALL = 100 # when fetching in batches def validateNavOrWipe(filename, logger): '''If a nav file is not valid, wipe it.''' if not os.path.exists(filename): return False try: f = open(filename) line = f.readline() m = re.match("^.*?DOCTYPE\s+HTML", line) if m: logger.info("Bad nav data, will wipe: " + filename) os.system("rm -f " + filename) return False except UnicodeDecodeError as e: # If it cannot be decoded, the file is likely in binary, hence valid return True return True def checkFound(filename): '''Check if an HTML file has the 404 Not Found message.''' if not os.path.exists(filename): return False with open(filename, 'r') as f: for line in f: m = re.match("404 Not Found", line) if m: return False return True def checkIfUrlExists(url, baseCurlCmd): '''Return true if the given IceBrige folder URL is valid. This functionality, if done right, times out, likely to pecularities of the NSIDC server. Hence, do a hack. Fetch the file first, and check for whether it was found or not.''' path = url.replace('/','_') # a temporary path curlCmd = baseCurlCmd + ' ' + url + ' > ' + path p = subprocess.Popen(curlCmd, shell=True, universal_newlines=True) os.waitpid(p.pid, 0) found = checkFound(path) wipeCmd = "rm -f " + path os.system(wipeCmd) return found def makeYearFolder(year, site): '''Generate part of the URL. Only used for images.''' return str(year) + '_' + site + '_NASA' def makeDateFolder(year, month, day, ext, fileType): '''Generate part of the URL.''' if fileType == 'jpeg': datePart = ('%02d%02d%04d%s') % (month, day, year, ext) return datePart +'_raw' else: # Used for all other cases datePart = ('%04d.%02d.%02d%s') % (year, month, day, ext) return datePart def hasGoodLat(latitude, isSouth): '''Return true if latitude and isSouth parameters match.''' if (isSouth and latitude < 0) or ( (not isSouth) and latitude > 0 ): return True return False def fetchAndParseIndexFileAux(isSouth, separateByLat, dayVal, baseCurlCmd, folderUrl, path, fileType): '''Retrieve the index file for a folder of data and create a parsed version of it that contains frame number / filename pairs.''' # Download the html file curlCmd = baseCurlCmd + ' ' + folderUrl + ' > ' + path logger.info(curlCmd) p = subprocess.Popen(curlCmd, shell=True, universal_newlines=True) os.waitpid(p.pid, 0) # Find all the file names in the index file and # dump them to a new index file logger.info('Extracting file name list from index.html file...') with open(path, 'r') as f: indexText = f.read() # Must wipe this html file. We fetch it too often in different # contexts. If not wiped, the code fails to work in some # very rare but real situations. if os.path.exists(path): os.remove(path) # Extract just the file names fileList = [] # ensure initialization if fileType == 'jpeg': fileList = re.findall(">[0-9_]*.JPG", indexText, re.IGNORECASE) if fileType == 'ortho': fileList = re.findall(">DMS\w*.tif<", indexText, re.IGNORECASE) if fileType == 'fireball': # Fireball DEMs fileList = re.findall(">IODMS\w*DEM.tif", indexText, re.IGNORECASE) if fileType == 'lvis': fileList = re.findall(">ILVIS\w+.TXT", indexText, re.IGNORECASE) if fileType == 'atm1': fileList = re.findall(">ILATM1B[0-9_]*.ATM4\w+.qi", indexText, re.IGNORECASE) # >ILATM1B_20111018_145455.ATM4BT4.qi # or >ILATM1B_20091016_165112.atm4cT3.qi if fileType == 'atm2': # Match ILATM1B_20160713_195419.ATM5BT5.h5 fileList = re.findall(">ILATM1B[0-9_]*.ATM\w+.h5", indexText, re.IGNORECASE) # Get rid of '>' and '<' for fileIter in range(len(fileList)): fileList[fileIter] = fileList[fileIter].replace(">", "") fileList[fileIter] = fileList[fileIter].replace("<", "") # Some runs, eg, https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2015.09.24 # have files for both GR and AN, with same frame number. Those need to be separated # by latitude. This is a problem only with orthoimages. badXmls = set() outputFolder = os.path.dirname(path) if separateByLat: allFilesToFetch = [] allUrlsToFetch = [] for filename in fileList: xmlFile = icebridge_common.xmlFile(filename) url = os.path.join(folderUrl, xmlFile) outputPath = os.path.join(outputFolder, xmlFile) allFilesToFetch.append(outputPath) allUrlsToFetch.append(url) dryRun = False icebridge_common.fetchFilesInBatches(baseCurlCmd, MAX_IN_ONE_CALL, dryRun, outputFolder, allFilesToFetch, allUrlsToFetch, logger) # Mark the bad ones for xmlFile in allFilesToFetch: latitude = icebridge_common.parseLatitude(xmlFile) isGood = hasGoodLat(latitude, isSouth) if not isGood: badXmls.add(xmlFile) elif (fileType == 'ortho' or fileType == 'fireball'): # Sometimes there is a large gap in the timestamp. That means orthoimages # from previous day are spilling over. If dayVal is 0, we must ignore # the spillover images. If dayVal is 1, we must keep the spillover images # and igore the others. list1 = [] list2 = [] isBigGap = False prevStamp = -1 for filename in fileList: [imageDateString, imageTimeString] = icebridge_common.parseTimeStamps(filename) currStamp = float(imageTimeString)/1000000.0 # hours if prevStamp < 0: list1.append(filename) prevStamp = currStamp continue # Note that once isBigGap becomes true, it stays true # even when the gap gets small again if currStamp - prevStamp >= 6: # six hour gap is a lot isBigGap = True if not isBigGap: list1.append(filename) else: list2.append(filename) prevStamp = currStamp # for next iteration if isBigGap: if dayVal == 0: fileList = list2[:] # current day else: fileList = list1[:] # spillover from prev day # For each entry that matched the regex, record: the frame number and the file name. frameDict = {} urlDict = {} badFiles = [] for filename in fileList: if len(badXmls) > 0: xmlFile = os.path.join(outputFolder, icebridge_common.xmlFile(filename)) if xmlFile in badXmls: continue frame = icebridge_common.getFrameNumberFromFilename(filename) if frame in frameDict.keys(): # The same frame must not occur twice. if fileType not in LIDAR_TYPES: logger.error("Error: Found two file names with same frame number: " + \ frameDict[frame] + " and " + filename) badFiles.append(filename) badFiles.append(frameDict[frame]) # note that folderUrl can vary among orthoimages, as sometimes # some of them are in a folder for the next day. frameDict[frame] = filename urlDict[frame] = folderUrl # Wipe them all, to be sorted later for badFile in badFiles: if os.path.exists(badFile): logger.info("Deleting: " + badFile) os.remove(badFile) xmlFile = icebridge_common.xmlFile(badFile) if os.path.exists(xmlFile): logger.info("Deleting: " + xmlFile) os.remove(xmlFile) if len(badFiles) > 0: raise Exception("Found files with same frame number") return (frameDict, urlDict) # These exist both in AN and GR, all mixed up, and have to separate by lat def isInSeparateByLatTable(yyyymmdd): '''''' return yyyymmdd in ['20150923', '20150924', '20151004', '20151005', '20151019', '20151020', '20151021', '20151022']; def twoFlightsInOneDay(site, yyyymmdd): '''Return true if there are two flights in one day.''' # For this day, there are GR_20100422a and GR_20100422b if site == 'GR' and yyyymmdd == '20100422': return True # For this day, there are GR_20170725a and GR_20170725b if site == 'GR' and yyyymmdd == '20170725': return True return False def getFolderUrl(yyyymmdd, year, month, day, dayInc, # if to add one to the day site, fileType): '''Get full URL to the location where the files are kept.''' # Note that yyyymmdd can equal 20100422a. ext = '' if len(yyyymmdd) == 9: ext = yyyymmdd[8] if fileType == 'nav': # This is the simplest, usually one file per flight. base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IPAPP1B_GPSInsCorrected_v01' yearFolder = makeYearFolder(year, site) folderUrl = os.path.join(base, yearFolder) return folderUrl if fileType == 'jpeg': # If yyyymmdd is 20100422, put a or b depending on dayVal if twoFlightsInOneDay(site, yyyymmdd): if dayInc == 0: ext = 'a' else: ext = 'b' dayInc = 0 #base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01' base = 'https://daacdata.apps.nsidc.org/pub/DATASETS/ICEBRIDGE/IODMS0_DMSraw_v01' yearFolder = makeYearFolder(year, site) dateFolder = makeDateFolder(year, month, day + dayInc, ext, fileType) folderUrl = os.path.join(base, yearFolder, dateFolder) return folderUrl # The other types share more formatting if twoFlightsInOneDay(site, yyyymmdd): dayInc = 0 # for this particular day, one should not look at the next day if fileType == 'ortho': base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001' elif fileType == 'fireball': base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS3.001' elif fileType == 'atm1': base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.001/' elif fileType == 'atm2': base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.002/' elif fileType == 'lvis': base = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/' else: raise("Unknown type: " + fileType) dateFolder = makeDateFolder(year, month, day + dayInc, ext, fileType) folderUrl = os.path.join(base, dateFolder) return folderUrl def fetchAndParseIndexFile(options, isSouth, baseCurlCmd, outputFolder): '''Create a list of all files that must be fetched unless done already.''' # For AN 20091112, etc, some of the ortho images are stored at the # beginning of the next day's flight. Need to sort this out, and # it is tricky. More comments within the code. fetchNextDay = True separateByLat = (options.type == 'ortho' and isInSeparateByLatTable(options.yyyymmdd)) if separateByLat: # Here we won't fetch the next day, we will just separate by latitude within # a given day fetchNextDay = False orthoOrFireball = ( (options.type == 'ortho') or (options.type == 'fireball') ) if fetchNextDay: # Normally we fetch for next day only for ortho or fireball. However, # for one single special flight, we do it for jpeg too, as then # the jpegs are also split. if orthoOrFireball or \ ((options.type == 'jpeg') and twoFlightsInOneDay(options.site, options.yyyymmdd)): fetchNextDay = True else: fetchNextDay = False # If we need to parse the next flight day as well, as expected in some runs, # we will fetch two html files, but create a single index out of them. dayVals = [0] if fetchNextDay: dayVals.append(1) indexPath = icebridge_common.htmlIndexFile(outputFolder) currIndexPath = indexPath parsedIndexPath = icebridge_common.csvIndexFile(outputFolder) if options.refetchIndex: os.system('rm -f ' + indexPath) os.system('rm -f ' + parsedIndexPath) if icebridge_common.fileNonEmpty(parsedIndexPath): logger.info('Already have the index file ' + parsedIndexPath + ', keeping it.') return parsedIndexPath frameDict = {} urlDict = {} # We need the list of jpeg frames. Sometimes when fetching ortho images, # and we have to fetch from the next day, don't fetch unless # in the jpeg index. if len(dayVals) > 1 and options.type != 'jpeg': jpegFolder = icebridge_common.getJpegFolder(os.path.dirname(outputFolder)) jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder) (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath) orthoStamp = {} if options.type == 'fireball': # This is a bugfix. Ensure that the fireball DEM has not just # the same frame number, but also same timestamp as the ortho. orthoFolder = icebridge_common.getOrthoFolder(os.path.dirname(outputFolder)) orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath) for frame in sorted(orthoFrameDict.keys()): filename = orthoFrameDict[frame] [imageDateString, imageTimeString] = icebridge_common.parseTimeStamps(filename) orthoStamp[frame] = imageTimeString for dayVal in dayVals: if len(dayVals) > 1: currIndexPath = indexPath + '.day' + str(dayVal) if options.refetchIndex: os.system('rm -f ' + currIndexPath) # Find folderUrl which contains all of the files if options.type in LIDAR_TYPES: options.allFrames = True # For lidar, always get all the frames! # For lidar, the data can come from one of three sources. # Unfortunately sometimes there is more than one source, and then # we need to pick by latitude. folderUrls = [] lidar_types = [] for lidar in LIDAR_TYPES: folderUrl = getFolderUrl(options.yyyymmdd, options.year, options.month, options.day, dayVal, # note here the dayVal options.site, lidar) logger.info('Checking lidar URL: ' + folderUrl) if checkIfUrlExists(folderUrl, baseCurlCmd): logger.info('Found match with lidar type: ' + lidar) folderUrls.append(folderUrl) lidar_types.append(lidar) if len(folderUrls) == 0: logger.info('WARNING: Could not find any lidar data for the given date!') elif len(folderUrls) == 1: # Unique solution folderUrl = folderUrls[0] options.type = lidar_types[0] elif len(folderUrls) >= 2: # Multiple solutions. Pick the good one by latitude. logger.info("Multiples URLs to search: " + " ".join(folderUrls)) count = -1 isGood = False for folderUrl in folderUrls: count += 1 (localFrameDict, localUrlDict) = \ fetchAndParseIndexFileAux(isSouth, separateByLat, dayVal, baseCurlCmd, folderUrl, currIndexPath, lidar_types[count]) for frame in sorted(localFrameDict.keys()): filename = localFrameDict[frame] xmlFile = icebridge_common.xmlFile(filename) url = os.path.join(folderUrl, xmlFile) # Download the file curlCmd = baseCurlCmd + ' ' + url + ' > ' + xmlFile logger.info(curlCmd) p = subprocess.Popen(curlCmd, shell=True, universal_newlines=True) os.waitpid(p.pid, 0) latitude = icebridge_common.parseLatitude(xmlFile) if os.path.exists(xmlFile): os.remove(xmlFile) if hasGoodLat(latitude, isSouth): isGood = True options.type = lidar_types[count] logger.info("Good latitude " + str(latitude) + ", will use " + folderUrl + " of type " + lidar_types[count]) else: logger.info("Bad latitude " + str(latitude) + ", will not use " + folderUrl + " of type " + lidar_types[count]) # Stop at first file no matter what break if isGood: break if not isGood: if options.type in LIDAR_TYPES and options.ignoreMissingLidar: logger.info("No lidar. None of these URLs are good: " + " ".join(folderUrls)) else: raise Exception("None of these URLs are good: " + " ".join(folderUrls)) else: # Other cases are simpler folderUrl = getFolderUrl(options.yyyymmdd, options.year, options.month, options.day, dayVal, # note here the dayVal options.site, options.type) logger.info('Fetching from URL: ' + folderUrl) (localFrameDict, localUrlDict) = \ fetchAndParseIndexFileAux(isSouth, separateByLat, dayVal, baseCurlCmd, folderUrl, currIndexPath, options.type) # Append to the main index for frame in sorted(localFrameDict.keys()): if options.type == 'fireball': # This is a bugfix. Ensure that the fireball DEM has not just # the same frame number, but also same timestamp as the ortho. # Otherwise we may accidentally getting one from next day. [imageDateString, imageTimeString] = \ icebridge_common.parseTimeStamps(localFrameDict[frame]) if frame not in orthoStamp: #logger.info("Missing ortho for fireball: " + localFrameDict[frame]) continue if abs(int(imageTimeString) - int(orthoStamp[frame])) > 1000: # Apparently a tolerance is needed. Use 10 seconds, so the number 1000. #logger.info("Will not use fireball DEM whose timestamp differs from ortho.") #logger.info("Fireball is: " + localFrameDict[frame]) #logger.info("Ortho is: " + orthoFrameDict[frame]) continue # Fetch from next day, unless already have a value. And don't fetch # frames not in the jpeg index. if len(dayVals) > 1 and options.type != 'jpeg': if not frame in jpegFrameDict.keys(): continue if frame in frameDict.keys(): continue frameDict[frame] = localFrameDict[frame] urlDict[frame] = localUrlDict[frame] # Write the combined index file icebridge_common.writeIndexFile(parsedIndexPath, frameDict, urlDict) return parsedIndexPath def lidarFilesInRange(lidarDict, lidarFolder, startFrame, stopFrame): '''Fetch only lidar files for the given frame range. Do that as follows. For each ortho frame in [startFrame, stopFrame], find the lidar file with the closest timestamp. Collect them all. Add the two neighboring ones, to help with finding lidar pairs later.''' lidarList = [] for frame in sorted(lidarDict.keys()): lidarList.append(lidarDict[frame]) # If we requested all frames, also get all the lidar files. if ((startFrame == icebridge_common.getSmallestFrame()) and (stopFrame == icebridge_common.getLargestFrame() ) ): minLidarIndex = 0 maxLidarIndex = len(lidarList)-1 else: minLidarIndex = len(lidarList) maxLidarIndex = 0 # Build up a list of lidar files that match the requested input frames orthoFolder = icebridge_common.getOrthoFolder(os.path.dirname(lidarFolder)) orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath) for frame in sorted(orthoFrameDict.keys()): if ((frame < startFrame) or (frame > stopFrame) ): continue orthoFrame = orthoFrameDict[frame] try: matchingLidar = icebridge_common.findMatchingLidarFileFromList(orthoFrame, lidarList) except: # Some image files don't have a matching lidar file, just keep going. continue for index in range(len(lidarList)): if lidarList[index] == matchingLidar: if minLidarIndex > index: minLidarIndex = index if maxLidarIndex < index: maxLidarIndex = index # We will fetch neighboring lidar files as well if minLidarIndex > 0: minLidarIndex = minLidarIndex -1 if maxLidarIndex + 1 < len(lidarList): maxLidarIndex = maxLidarIndex + 1 lidarsToFetch = set() if lidarList: for index in range(minLidarIndex, maxLidarIndex+1): # Fetch only the requested lidar files. lidarsToFetch.add(lidarList[index]) return lidarsToFetch def fetchNavData(options, outputFolder): '''Fetch all the nav data for a flight.''' success = False # The storage convention for these is very easy! # - A few dates have two files instead of one. folderUrl = getFolderUrl(options.yyyymmdd, options.year, options.month, options.day, False, options.site, options.type) filename = 'sbet_' + options.yyyymmdd + '.out' filenameA = 'sbet_' + options.yyyymmdd + 'a.out' filenameB = 'sbet_' + options.yyyymmdd + 'b.out' # Check which urls are accurate for this file # This is not robust enough, as it can return good status even when the data is missing. # So comment it out. Rather fetch all files and check them later. #url = folderUrl + filename #if checkIfUrlExists(url): # fileList = [filename] #else: # fileList = [filenameA, filenameB] fileList = [filename, filenameA, filenameB] if options.refetchNav: cmd = "rm -f " + os.path.join(outputFolder, "sbet_*") print(cmd) os.system(cmd) # Download the files for f in fileList: url = os.path.join(folderUrl, f) outputPath = os.path.join(outputFolder, f) # TODO: How to handle refetch? if validateNavOrWipe(outputPath, logger): success = True continue # This times out, so avoid it #if not checkIfUrlExists(url): # continue ans = icebridge_common.fetchFile(url, outputPath) if not ans: logger.info("Bad url: " + url) continue if validateNavOrWipe(outputPath, logger): success = True if success: return 0 return 1 def doFetch(options, outputFolder): '''The main fetch function. Returns the number of failures.''' # Verify that required files exist home = os.path.expanduser("~") if not (os.path.exists(home+'/.netrc') and os.path.exists(home+'/.urs_cookies')): logger.error('Missing a required authentication file! See instructions here:\n' + ' https://nsidc.org/support/faq/what-options-are-available-bulk-' + 'downloading-data-https-earthdata-login-enabled') return -1 curlPath = asp_system_utils.which("curl") curlOpts = ' -n -L ' cookiePaths = ' -b ~/.urs_cookies -c ~/.urs_cookies ' baseCurlCmd = curlPath + curlOpts + cookiePaths logger.info('Creating output folder: ' + outputFolder) os.system('mkdir -p ' + outputFolder) isSouth = (options.site == 'AN') if options.type == 'nav': # Nav fetching is much less complicated return fetchNavData(options, outputFolder) parsedIndexPath = fetchAndParseIndexFile(options, isSouth, baseCurlCmd, outputFolder) if not icebridge_common.fileNonEmpty(parsedIndexPath): # Some dirs are weird, both images, fireball dems, and ortho. # Just accept whatever there is, but with a warning. logger.info('Warning: Missing index file: ' + parsedIndexPath) # Store file information in a dictionary # - Keep track of the earliest and latest frame logger.info('Reading file list from ' + parsedIndexPath) try: (frameDict, urlDict) = icebridge_common.readIndexFile(parsedIndexPath) except: # We probably ran into old format index file. Must refetch. logger.info('Could not read index file. Try again.') options.refetchIndex = True parsedIndexPath = fetchAndParseIndexFile(options, isSouth, baseCurlCmd, outputFolder) (frameDict, urlDict) = icebridge_common.readIndexFile(parsedIndexPath) if options.stopAfterIndexFetch: return 0 isLidar = (options.type in LIDAR_TYPES) allFrames = sorted(frameDict.keys()) if not isLidar: # The lidar frames use a totally different numbering than the image/ortho/dem frames firstFrame = icebridge_common.getLargestFrame() # start big lastFrame = icebridge_common.getSmallestFrame() # start small for frameNumber in allFrames: if frameNumber < firstFrame: firstFrame = frameNumber if frameNumber > lastFrame: lastFrame = frameNumber if options.allFrames: options.startFrame = firstFrame options.stopFrame = lastFrame if isLidar: # Based on image frames, determine which lidar frames to fetch. if options.ignoreMissingLidar and len(frameDict.keys()) == 0: # Nothing we can do if this run has no lidar and we are told to continue logger.info("Warning: missing lidar, but continuing.") lidarsToFetch = set() else: lidarsToFetch = lidarFilesInRange(frameDict, outputFolder, options.startFrame, options.stopFrame) # There is always a chance that not all requested frames are available. # That is particularly true for Fireball DEMs. Instead of failing, # just download what is present and give a warning. if options.startFrame not in frameDict and not isLidar: logger.info("Warning: Frame " + str(options.startFrame) + " is not found in this flight.") if options.stopFrame and (options.stopFrame not in frameDict) and not isLidar: logger.info("Warning: Frame " + str(options.stopFrame) + " is not found in this flight.") allFilesToFetch = [] # Files that we will fetch, relative to the current dir. allUrlsToFetch = [] # Full url of each file. # Loop through all found frames within the provided range currentFileCount = 0 lastFrame = "" if len(allFrames) > 0: lastFrame = allFrames[len(allFrames)-1] hasTfw = (options.type == 'fireball') hasXml = ( isLidar or (options.type == 'ortho') or hasTfw ) numFetched = 0 skipCount = 0 for frame in allFrames: # Skip frame outside of range if isLidar: if frameDict[frame] not in lidarsToFetch: continue else: if ((frame < options.startFrame) or (frame > options.stopFrame) ): continue # Handle the frame skip option if options.frameSkip > 0: if skipCount < options.frameSkip: skipCount += 1 continue skipCount = 0 filename = frameDict[frame] # Some files have an associated xml file. Fireball DEMs also have a tfw file. currFilesToFetch = [filename] if hasXml: currFilesToFetch.append(icebridge_common.xmlFile(filename)) if hasTfw: currFilesToFetch.append(icebridge_common.tfwFile(filename)) for filename in currFilesToFetch: url = os.path.join(urlDict[frame], filename) outputPath = os.path.join(outputFolder, filename) allFilesToFetch.append(outputPath) allUrlsToFetch.append(url) # Restrict lidar fetch amount according to the parameter if (isLidar and options.maxNumLidarToFetch > 0 and len(allFilesToFetch) > options.maxNumLidarToFetch): # Ensure an even number, to fetch both the lidar file and its xml if options.maxNumLidarToFetch % 2 == 1: options.maxNumLidarToFetch += 1 allFilesToFetch = allFilesToFetch[0:options.maxNumLidarToFetch] allUrlsToFetch = allUrlsToFetch [0:options.maxNumLidarToFetch] icebridge_common.fetchFilesInBatches(baseCurlCmd, MAX_IN_ONE_CALL, options.dryRun, outputFolder, allFilesToFetch, allUrlsToFetch, logger) # Fetch from disk the set of already validated files, if any validFilesList = icebridge_common.validFilesList(os.path.dirname(outputFolder), options.startFrame, options.stopFrame) validFilesSet = set() validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) numInitialValidFiles = len(validFilesSet) # Verify that all files were fetched and are in good shape failedFiles = [] for outputPath in allFilesToFetch: if options.skipValidate: continue if not icebridge_common.fileNonEmpty(outputPath): logger.info('Missing file: ' + outputPath) failedFiles.append(outputPath) continue if icebridge_common.hasImageExtension(outputPath): if False: # This check is just so slow. Turn it off for now. # This will impact only the validation of jpegs, # as the other files can be validated via the checksum. # Jpegs will be validated when converting them to 1 band images if outputPath in validFilesSet and os.path.exists(outputPath): #logger.info('Previously validated: ' + outputPath) # verbose continue else: if not icebridge_common.isValidImage(outputPath): logger.info('Found an invalid image. Will wipe it: ' + outputPath) if os.path.exists(outputPath): os.remove(outputPath) failedFiles.append(outputPath) continue else: logger.info('Valid image: ' + outputPath) validFilesSet.add(outputPath) # mark it as validated # Sanity check: XML files must have the right latitude. if icebridge_common.fileExtension(outputPath) == '.xml': if outputPath in validFilesSet and os.path.exists(outputPath): #logger.info('Previously validated: ' + outputPath) #verbose continue else: if os.path.exists(outputPath): try: latitude = icebridge_common.parseLatitude(outputPath) logger.info('Valid file: ' + outputPath) validFilesSet.add(outputPath) # mark it as validated except: # Corrupted file logger.info("Failed to parse latitude, will wipe: " + outputPath) if os.path.exists(outputPath): os.remove(outputPath) failedFiles.append(outputPath) # On a second thought, don't wipe files with wrong latitude, as # next time we run fetch we will have to fetch them again. # Hopefully they will be ignored. #isGood = hasGoodLat(latitude, isSouth) #if not isGood: # logger.info("Wiping XML file " + outputPath + " with bad latitude " + \ # str(latitude)) # os.remove(outputPath) # imageFile = icebridge_common.xmlToImage(outputPath) # if os.path.exists(imageFile): # logger.info("Wiping TIF file " + imageFile + " with bad latitude " + \ # str(latitude)) # os.remove(imageFile) # Verify the chcksum if hasXml and len(outputPath) >= 4 and outputPath[-4:] != '.xml' \ and outputPath[-4:] != '.tfw': if outputPath in validFilesSet and os.path.exists(outputPath): #logger.info('Previously validated: ' + outputPath) # verbose continue else: isGood = icebridge_common.hasValidChkSum(outputPath, logger) if not isGood: xmlFile = icebridge_common.xmlFile(outputPath) logger.info('Found invalid data. Will wipe: ' + outputPath + ' ' + xmlFile) if os.path.exists(outputPath): os.remove(outputPath) if os.path.exists(xmlFile): os.remove(xmlFile) failedFiles.append(outputPath) failedFiles.append(xmlFile) continue else: logger.info('Valid file: ' + outputPath) validFilesSet.add(outputPath) if hasTfw and icebridge_common.fileExtension(outputPath) == '.tfw': if outputPath in validFilesSet and os.path.exists(outputPath): #logger.info('Previously validated: ' + outputPath) continue else: isGood = icebridge_common.isValidTfw(outputPath, logger) if not isGood: xmlFile = icebridge_common.xmlFile(outputPath) logger.info('Found invalid tfw. Will wipe: ' + outputPath + ' ' + xmlFile) if os.path.exists(outputPath): os.remove(outputPath) if os.path.exists(xmlFile): os.remove(xmlFile) failedFiles.append(outputPath) failedFiles.append(xmlFile) continue else: logger.info('Valid tfw file: ' + outputPath) validFilesSet.add(outputPath) # Write to disk the list of validated files, but only if new # validations happened. First re-read that list, in case a # different process modified it in the meantime, such as if two # managers are running at the same time. numFinalValidFiles = len(validFilesSet) if numInitialValidFiles != numFinalValidFiles: validFilesSet = \ icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) icebridge_common.writeValidFilesList(validFilesList, validFilesSet) numFailed = len(failedFiles) if numFailed > 0: logger.info("Number of files that could not be processed: " + str(numFailed)) return numFailed def main(argsIn): # Command line parsing try: usage = "usage: fetch_icebridge_data.py [options] output_folder" parser = optparse.OptionParser(usage=usage) parser.add_option("--year", dest="year", type='int', default=None, help="Number of processes to use (default program tries to choose best)") parser.add_option("--month", dest="month", type='int', default=None, help="Number of processes to use (default program tries to choose best)") parser.add_option("--day", dest="day", type='int', default=None, help="Number of processes to use (default program tries to choose best)") parser.add_option("--yyyymmdd", dest="yyyymmdd", default=None, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_option("--site", dest="site", default=None, help="Name of the location of the images (AN or GR)") parser.add_option("--start-frame", dest="startFrame", type='int', default=icebridge_common.getSmallestFrame(), help="Frame number or start of frame sequence") parser.add_option("--stop-frame", dest="stopFrame", type='int', default=icebridge_common.getLargestFrame(), help="End of frame sequence to download.") parser.add_option("--all-frames", action="store_true", dest="allFrames", default=False, help="Fetch all frames for this flight.") parser.add_option("--skip-validate", action="store_true", dest="skipValidate", default=False, help="Skip input data validation.") parser.add_option("--ignore-missing-lidar", action="store_true", dest="ignoreMissingLidar", default=False, help="Keep going if the lidar is missing.") parser.add_option("--frame-skip", dest="frameSkip", type='int', default=0, help="Skip this many frames between downloads.") parser.add_option("--dry-run", action="store_true", dest="dryRun", default=False, help="Just print the image/ortho/fireball download commands.") parser.add_option("--refetch-index", action="store_true", dest="refetchIndex", default=False, help="Force refetch of the index file.") parser.add_option("--refetch-nav", action="store_true", dest="refetchNav", default=False, help="Force refetch of the nav file.") parser.add_option("--stop-after-index-fetch", action="store_true", dest="stopAfterIndexFetch", default=False, help="Stop after fetching the indices.") parser.add_option('--max-num-lidar-to-fetch', dest='maxNumLidarToFetch', default=-1, type='int', help='The maximum number of lidar files to fetch. ' + \ 'This is used in debugging.') # This call handles all the parallel_mapproject specific options. (options, args) = parser.parse_args(argsIn) if len(args) != 1: logger.info('Error: Missing output folder.\n' + usage) return -1 outputFolder = os.path.abspath(args[0]) # TODO: Restore "type" input parameter so that outside users who do not use # our folder convention can use this tool. options.type = icebridge_common.folderToType(outputFolder) if options.type == 'lidar': options.type = LIDAR_TYPES[0] print ('Detected type: ' + options.type) # Handle unified date option if options.yyyymmdd: options.year = int(options.yyyymmdd[0:4]) options.month = int(options.yyyymmdd[4:6]) options.day = int(options.yyyymmdd[6:8]) if not options.stopFrame: options.stopFrame = options.startFrame # Error checking if (not options.year) or (not options.month) or (not options.day): logger.error('Error: year, month, and day must be provided.\n' + usage) return -1 # Ortho and Fireball DEM files don't need this information to find them. if (options.type == 'jpeg') and not (options.site == 'AN' or options.site == 'GR'): logger.error('Error, site must be AN or GR for images.\n' + usage) return -1 KNOWN_TYPES = ['jpeg', 'ortho', 'fireball', 'nav'] + LIDAR_TYPES if not (options.type.lower() in KNOWN_TYPES): logger.error('Error, type must be image, ortho, fireball, or a lidar type.\n' + usage) return -1 except optparse.OptionError as msg: raise Exception(msg) # Make several attempts. Stop if there is no progress. numPrevFailed = -1 numFailed = -1 for attempt in range(10): numFailed = doFetch(options, outputFolder) if numFailed == 0: return 0 # Success if numFailed == numPrevFailed: logger.info("No progress in attempt %d" % (attempt+1)) return -1 # Try again logger.info("Failed to fetch all in attempt %d, will try again.\n" % (attempt+1)) numPrevFailed = numFailed return -1 # We should not come all the way to here if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/fetcher_script.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Fetch all the data for a run and run conversions. # See sample usage below. import os, sys, optparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import asp_system_utils, asp_alg_utils, asp_geo_utils import icebridge_common, full_processing_script asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] #louUser = 'oalexan1' # all data is stored under this user name louUser = 'smcmich1' g_start_time = -1 g_stop_time = -1 def start_time(): global g_start_time, g_stop_time g_start_time = time.time() def stop_time(job, logger): global g_start_time, g_stop_time g_stop_time = time.time() wall_s = float(g_stop_time - g_start_time)/3600.0 logger.info( ("Elapsed time for %s is %g hours." % (job, wall_s) ) ) def workDirs(): '''When fetching data, return the paths where it is stored temporarily on pfe, and for archival, on lou.''' currDir = os.getcwd() m = re.match("^.*?/" + louUser + "/(.*?)$", currDir) if not m: raise Exception("Could not match %s in %s " % (louUser, currDir)) pfePath = '/nobackupp7/' + louUser + '/' + m.group(1) # path on pfe lfePath = '/u/' + louUser + '/' + m.group(1) # path on lfe return (pfePath, lfePath) def tarAndWipe(options, logger): '''Connect to lou from where we can see the files, then tar and wipe the current run.''' logger.info("All files were fetched and checks passed. " + "Will tar to lou and optionally wipe the dir.") # Per https://www.nas.nasa.gov/hecc/support/kb/using- # shift-for-local-transfers-and-tar-operations_512.html # one can tar and push to lfe at the same time if # connecting to lfe first, from where one can see the pfe # filesystem. Avoid though using the suggested shift # command. It may be faster, but it detaches and is hard # to manage. Note: To untar and transfer in one step, one # should as well go to lfe first. #(pfePath, lfePath) = workDirs() pfePath = '/nobackup/smcmich1/icebridge/data' lfePath = '/u/smcmich1/icebridge/inputs' # print lfePath # logger.info(options.outputFolder) # raise Exception('eouoeu') lfeCmd = 'cd ' + pfePath + '; tar cfv ' + lfePath + '/' + \ options.outputFolder + '.tar ' + options.outputFolder start_time() cmd = 'ssh ' + louUser + '@lfe "' + lfeCmd + '"' logger.info(cmd) p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True) output, error = p.communicate() if p.returncode != 0: raise Exception('Failed to tar and copy to lfe.') else: logger.info('Success tarring and copying to lfe.') if options.outputFolder == "" or options.outputFolder[0] == '.': raise Exception('Output folder is not as expected. ' + 'Not deleting anything just in case.') # Do this here, before the wiping stop_time("tar_and_wipe", logger) if options.wipe: logger.info('Will wipe: ' + options.outputFolder) try: shutil.rmtree(options.outputFolder) except Exception as e: # TODO: Can't wipe it as still logging there print("Failed to wipe " + options.outputFolder) return 0 def startWithLouArchive(options, logger): '''Connect to lou, and untar a given archive on pfe.''' (pfePath, lfePath) = workDirs() # See tarAndWipe() for the logic of how one can work with pfe and lfe tarFile = options.outputFolder + '.tar' lfeCmd = 'cd ' + lfePath + '; tar xfv ' + lfePath + '/' + tarFile + \ ' -C ' + pfePath cmd = 'ssh ' + louUser + '@lfe "' + lfeCmd + '"' logger.info(cmd) os.system(cmd) #p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True) #output, error = p.communicate() #if p.returncode != 0: # # Don't fail, just continue # logger.info('Failed to untar lfe archive: ' + tarFile) # #raise Exception('Failed to untar lfe archive: ' + options.outputFolder + '.tar') #else: # logger.info('Success untarring lfe archive.') return 0 def main(argsIn): try: # Sample usage: # python fetcher_script.py \ # --yyyymmdd 20091016 --site AN --start-frame 350 --stop-frame 353 --skip-validate # An output folder will be crated automatically (with a name like # AN_20091016), or its name can be specified via the --output-folder # option. usage = '''usage: fetcher_script.py <options>''' parser = optparse.OptionParser(usage=usage) # Run selection parser.add_option("--yyyymmdd", dest="yyyymmdd", default=None, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_option("--site", dest="site", default=None, help="Name of the location of the images (AN, GR, or AL)") parser.add_option("--camera-calibration-folder", dest="inputCalFolder", default=None, help="The folder containing camera calibration.") parser.add_option("--reference-dem-folder", dest="refDemFolder", default=None, help="The folder containing DEMs that created orthoimages.") # Python treats numbers starting with 0 as being in octal rather than decimal. # Ridiculous. So read them as strings and convert to int. parser.add_option('--start-frame', dest='startFrameStr', default=None, help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_option('--stop-frame', dest='stopFrameStr', default=None, help='Frame to stop on.') parser.add_option('--max-num-lidar-to-fetch', dest='maxNumLidarToFetch', default=100000000, type='int', help='The maximum number of lidar files to fetch. ' + \ 'This is used in debugging.') parser.add_option("--skip-validate", action="store_true", dest="skipValidate", default=False, help="Skip input data validation.") parser.add_option("--ignore-missing-lidar", action="store_true", dest="ignoreMissingLidar", default=False, help="Keep going if the lidar is missing.") parser.add_option("--no-lidar-convert", action="store_true", dest="noLidarConvert", default=False, help="Skip lidar files in the conversion step.") parser.add_option("--no-nav", action="store_true", dest="noNav", default=False, help="Skip dealing with raw nav data.") parser.add_option("--skip-processing", action="store_true", dest="skipProcessing", default=False, help="Skip fetch, validate, and convert. Assume all data is ready.") parser.add_option("--refetch-index", action="store_true", dest="refetchIndex", default=False, help="Force refetch of the index file.") parser.add_option("--stop-after-index-fetch", action="store_true", dest="stopAfterIndexFetch", default=False, help="Stop after fetching the indices.") parser.add_option("--tar", action="store_true", dest="tar", default=False, help="After fetching all data and performing all conversions and " + \ "validations, make a tarball on lou. Only valid on Pleiades!") parser.add_option("--wipe", action="store_true", dest="wipe", default=False, help="After making a tarball with --tar, wipe the directory. ") parser.add_option("--start-with-lou-archive", action="store_true", dest="startWithLouArchive", default=False, help="Untar an existing archive from lou, then continue.") (options, args) = parser.parse_args(argsIn) except optparse.OptionError as msg: raise Usage(msg) if options.yyyymmdd is None or options.site is None: print("The flight date and site must be specified.") return -1 options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd) os.system('mkdir -p ' + options.outputFolder) logLevel = logging.INFO logger = icebridge_common.setUpLogger(options.outputFolder, logLevel, 'icebridge_fetcher_log') # Explicitely go from strings to integers, per earlier note. if options.startFrameStr is not None: startFrame = int(options.startFrameStr) else: startFrame = icebridge_common.getSmallestFrame() if options.stopFrameStr is not None: stopFrame = int(options.stopFrameStr) else: stopFrame = icebridge_common.getLargestFrame() # Unarchive, then continue with fetching if options.startWithLouArchive: start_time() startWithLouArchive(options, logger) stop_time("fetch_from_lou", logger) cmd = (('--yyyymmdd %s --site %s --start-frame %d --stop-frame %d ' + '--max-num-lidar-to-fetch %d --stop-after-convert --no-ortho-convert --refetch') % (options.yyyymmdd, options.site, startFrame, stopFrame, options.maxNumLidarToFetch)) if options.refetchIndex: cmd += ' --refetch-index' # this was not right in older fetched runs if options.stopAfterIndexFetch: cmd += ' --stop-after-index-fetch' if options.skipValidate: cmd += ' --skip-validate' if options.ignoreMissingLidar: cmd += ' --ignore-missing-lidar' if options.noLidarConvert: cmd += ' --no-lidar-convert' if options.noNav: cmd += ' --no-nav' if options.inputCalFolder is not None: cmd += ' --camera-calibration-folder ' + options.inputCalFolder if options.refDemFolder is not None: cmd += ' --reference-dem-folder ' + options.refDemFolder if not options.skipProcessing: # Refetch all nav stuff, as it was unreliable in the past navFolder = icebridge_common.getNavFolder(options.outputFolder) navCameraFolder = icebridge_common.getNavCameraFolder(options.outputFolder) if os.path.exists(navFolder): logger.info("Wiping: " + navFolder) os.system('rm -rfv ' + navFolder) if os.path.exists(navCameraFolder): logger.info("Wiping: " + navCameraFolder) os.system('rm -rfv ' + navCameraFolder) # Wipe processed lidar, as sometimes errors crept in. logger.info("Wiping processed lidar:") lidarFolder = icebridge_common.getLidarFolder(options.outputFolder) if os.path.exists(lidarFolder): os.system('rm -fv ' + lidarFolder + '/*csv') pairedFolder = icebridge_common.getPairedLidarFolder(lidarFolder) if os.path.exists(pairedFolder): os.system('rm -rfv ' + pairedFolder) logger.info("full_processing_script.py " + cmd) start_time() if full_processing_script.main(cmd.split()) < 0: return -1 stop_time("fetch_validate", logger) # Archive after fetching if options.tar: tarAndWipe(options, logger) # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/full_processing_script.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Fetch all the data for a run and then process all the data. # See sample usage below. import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time import os.path as P import glob # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, fetch_icebridge_data, process_icebridge_run, extract_icebridge_ATM_points import input_conversions import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] def fetchAllRunData(options, startFrame, stopFrame, jpegFolder, orthoFolder, fireballFolder, lidarFolder, navFolder): '''Download all data needed to process a run''' logger = logging.getLogger(__name__) logger.info('Downloading data for the run...') baseCommand = (('--yyyymmdd %s --site %s --start-frame %d --stop-frame %d') % (options.yyyymmdd, options.site, startFrame, stopFrame)) if options.maxNumLidarToFetch is not None and options.maxNumLidarToFetch >= 0: baseCommand += ' --max-num-lidar-to-fetch ' + str(options.maxNumLidarToFetch) if options.refetchIndex: baseCommand += ' --refetch-index' # this was not right in older fetched runs if options.refetchNav: baseCommand += ' --refetch-nav' # sometimes this was corrupted if options.stopAfterIndexFetch: baseCommand += ' --stop-after-index-fetch' if options.skipValidate: baseCommand += ' --skip-validate' if options.ignoreMissingLidar: baseCommand += ' --ignore-missing-lidar' if options.dryRun: baseCommand += ' --dry-run' jpegCommand = baseCommand + ' ' + jpegFolder orthoCommand = baseCommand + ' ' + orthoFolder fireballCommand = baseCommand + ' ' + fireballFolder lidarCommand = baseCommand + ' ' + lidarFolder navCommand = baseCommand + ' ' + navFolder # Try to do all the downloads one after another # - On a failure the error message should already be printed. # - The fetching tool will not redownload existing data. if fetch_icebridge_data.main(jpegCommand.split()) < 0: return -1 if fetch_icebridge_data.main(orthoCommand.split()) < 0: return -1 if fetch_icebridge_data.main(fireballCommand.split()) < 0: logger.info('Fireball DEM data is optional, continuing run.') if not options.noNavFetch: if fetch_icebridge_data.main(navCommand.split()) < 0: return -1 # Skip the lidar fetch if the user requested no lidar files if (options.maxNumLidarToFetch is None) or (options.maxNumLidarToFetch > 0): if fetch_icebridge_data.main(lidarCommand.split()) < 0: return -1 # jpeg and ortho indices must be consistent if not options.skipValidate: logger.info("Check for consistency between raw and ortho images.") jpegIndex = icebridge_common.csvIndexFile(jpegFolder) orthoIndex = icebridge_common.csvIndexFile(orthoFolder) (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndex) (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndex) for jpegFrame in jpegFrameDict.keys(): if jpegFrame < startFrame or jpegFrame > stopFrame: continue if jpegFrame not in orthoFrameDict.keys(): logger.info("Found jpeg frame missing from ortho: " + str(jpegFrame)) #raise Exception ("Found jpeg frame missing from ortho:" + str(jpegFrame)) for orthoFrame in orthoFrameDict.keys(): if orthoFrame < startFrame or orthoFrame > stopFrame: continue if orthoFrame not in jpegFrameDict.keys(): # This can happen, don't die because of it logger.info("Found ortho frame missing from jpeg: " + str(orthoFrame)) #raise Exception ("Found ortho frame missing from jpeg:" + str(orthoFrame)) # TODO: Wipe any ortho and jpeg images not in the index, or at least warn about it. return 0 def validateOrthosAndFireball(options, fileType, logger): '''Validate ortho and fireball files within the current frame range. This is expected to be in called in parallel for smaller chunks. Lidar files will be validated serially. Jpegs get validated when converted to tif. Return True if all is good.''' badFiles = False logger.info("Validating files of type: " + fileType) if fileType == 'ortho': dataFolder = icebridge_common.getOrthoFolder(options.outputFolder) elif fileType == 'fireball': dataFolder = icebridge_common.getFireballFolder(options.outputFolder) else: raise Exception("Unknown file type: " + fileType) indexPath = icebridge_common.csvIndexFile(dataFolder) if not os.path.exists(indexPath): # The issue of what to do when the index does not exist should # have been settled by now. return (not badFiles) # Fetch from disk the set of already validated files, if any validFilesList = icebridge_common.validFilesList(options.outputFolder, options.startFrame, options.stopFrame) validFilesSet = set() validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) numInitialValidFiles = len(validFilesSet) (frameDict, urlDict) = icebridge_common.readIndexFile(indexPath, prependFolder = True) for frame in frameDict.keys(): if frame < options.startFrame or frame > options.stopFrame: continue outputPath = frameDict[frame] xmlFile = icebridge_common.xmlFile(outputPath) if outputPath in validFilesSet and os.path.exists(outputPath) and \ xmlFile in validFilesSet and os.path.exists(xmlFile): #logger.info('Previously validated: ' + outputPath + ' ' + xmlFile) continue else: isGood = icebridge_common.hasValidChkSum(outputPath, logger) if not isGood: logger.info('Found invalid data. Will wipe: ' + outputPath + ' ' + xmlFile) os.system('rm -f ' + outputPath) # will not throw os.system('rm -f ' + xmlFile) # will not throw badFiles = True else: logger.info('Valid file: ' + outputPath) validFilesSet.add(outputPath) validFilesSet.add(xmlFile) if fileType != 'fireball': continue # Also validate tfw tfwFile = icebridge_common.tfwFile(outputPath) xmlFile = icebridge_common.xmlFile(tfwFile) if tfwFile in validFilesSet and os.path.exists(tfwFile) and \ xmlFile in validFilesSet and os.path.exists(xmlFile): #logger.info('Previously validated: ' + tfwFile + ' ' + xmlFile) continue else: isGood = icebridge_common.isValidTfw(tfwFile, logger) if not isGood: logger.info('Found invalid tfw. Will wipe: ' + tfwFile + ' ' + xmlFile) os.system('rm -f ' + tfwFile) # will not throw os.system('rm -f ' + xmlFile) # will not throw badFiles = True else: logger.info('Valid tfw file: ' + tfwFile) validFilesSet.add(tfwFile) validFilesSet.add(xmlFile) # Write to disk the list of validated files, but only if new # validations happened. First re-read that list, in case a # different process modified it in the meantime, such as if two # managers are running at the same time. numFinalValidFiles = len(validFilesSet) if numInitialValidFiles != numFinalValidFiles: validFilesSet = \ icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) icebridge_common.writeValidFilesList(validFilesList, validFilesSet) return (not badFiles) def runFetchConvert(options, isSouth, cameraFolder, imageFolder, jpegFolder, orthoFolder, fireballFolder, corrFireballFolder, lidarFolder, processedFolder, navFolder, navCameraFolder, refDemPath, logger): '''Fetch and/or convert. Return 0 on success.''' if options.noFetch: logger.info('Skipping fetch.') else: # Call data fetch routine and check the result fetchResult = fetchAllRunData(options, options.startFrame, options.stopFrame, jpegFolder, orthoFolder, fireballFolder, lidarFolder, navFolder) if fetchResult < 0: logger.error("Fetching failed!") return -1 # This step is slow, so run it here as part of fetching and save its result # We certainly don't want it to throw any exception at this stage. try: forceAllFramesInRange = True availableFrames = [] (autoStereoInterval, breaks) = \ process_icebridge_run.getImageSpacing(orthoFolder, availableFrames, options.startFrame, options.stopFrame, options.maxOverlapRatio, forceAllFramesInRange) except Exception as e: pass if options.stopAfterFetch or options.dryRun: logger.info('Fetching complete, finished!') return 0 # Keep track of how we are doing isGood = True if options.noConvert: logger.info('Skipping convert.') else: # When files fail in these conversion functions we log the error and keep going if not options.skipFastConvert: if not options.skipValidate: # Validate orthos and dems for this frame range. ans = validateOrthosAndFireball(options, 'ortho', logger) isGood = (isGood and ans) ans = validateOrthosAndFireball(options, 'fireball', logger) isGood = (isGood and ans) # Run non-ortho conversions without any multiprocessing (they are pretty fast) # TODO: May be worth doing the faster functions with multiprocessing in the future if not options.noLidarConvert: ans = input_conversions.convertLidarDataToCsv(lidarFolder, options.startFrame, options.stopFrame, options.skipValidate, logger) isGood = (isGood and ans) ans = input_conversions.pairLidarFiles(lidarFolder, options.skipValidate, logger) isGood = (isGood and ans) ans = input_conversions.correctFireballDems(fireballFolder, corrFireballFolder, options.startFrame, options.stopFrame, (not isSouth), options.skipValidate, logger) isGood = (isGood and ans) ans = input_conversions.convertJpegs(jpegFolder, imageFolder, options.startFrame, options.stopFrame, options.skipValidate, options.cameraMounting, logger) isGood = (isGood and ans) if not options.noNavFetch: # Single process call to parse the nav files. input_conversions.getCameraModelsFromNav(imageFolder, orthoFolder, options.inputCalFolder, options.inputCalCamera, options.cameraLookupFile, navFolder, navCameraFolder, options.yyyymmdd, options.site, options.startFrame, options.stopFrame, options.cameraMounting, logger) else: navCameraFolder = "" options.simpleCameras = False if not options.noOrthoConvert: # Multi-process call to convert ortho images input_conversions.getCameraModelsFromOrtho(imageFolder, orthoFolder, options.inputCalFolder, options.inputCalCamera, options.cameraLookupFile, options.noNavFetch, navCameraFolder, options.yyyymmdd, options.site, refDemPath, cameraFolder, options.simpleCameras, options.startFrame, options.stopFrame, options.framesFile, options.numOrthoProcesses, options.numThreads, logger) os.system("rm -f core.*") # these keep on popping up if isGood: return 0 return -1 def processTheRun(options, imageFolder, cameraFolder, lidarFolder, orthoFolder, fireballFolder, processedFolder, isSouth, refDemPath): '''Do all the run processing''' # Some care is taken with the --stereo-arguments argument to make sure it is passed correctly. processCommand = (('%s %s %s %s --bundle-length %d --fireball-folder %s ' + '--ortho-folder %s --num-processes %d --num-threads %d ' + '--reference-dem %s --max-overlap-ratio %g') % (imageFolder, cameraFolder, lidarFolder, processedFolder, options.bundleLength, fireballFolder, orthoFolder, options.numProcesses, options.numThreads, refDemPath, options.maxOverlapRatio)) if isSouth: processCommand += ' --south' if options.startFrame: processCommand += ' --start-frame ' + str(options.startFrame) if options.stopFrame: processCommand += ' --stop-frame ' + str(options.stopFrame) if options.logBatches: processCommand += ' --log-batches' if options.cleanup: processCommand += ' --cleanup' if options.manyip: processCommand += ' --many-ip' processCommand += ' --stereo-arguments ' logger = logging.getLogger(__name__) logger.info('Process command: process_icebridge_run ' + processCommand + options.stereoArgs.strip()) args = processCommand.split() args += (options.stereoArgs.strip(),) # Make sure this is properly passed process_icebridge_run.main(args) def solveIntrinsics_Part1(options, jpegFolder, cameraFolder, navCameraFolder, processedFolder, logger): '''Some preliminary work before solving for intrinsics. Here we look up the default calibration file, and generate an RPC approximation of its distortion model with polynomials of degree 4. We will then create cameras and stereo DEMs using this initial camera file with RPC distortion.''' # Sanity checks if options.startFrame == icebridge_common.getSmallestFrame() or \ options.stopFrame == icebridge_common.getLargestFrame(): raise Exception("When solving for intrinsics, must specify a frame range.") if options.bundleLength != 2: raise Exception("When solving for intrinsics, we assume bundle length of 2.") if (options.stopFrame - options.startFrame) % 2 == 0: raise Exception("When solving for intrinsics, must have an even number of frames, " + " so stopFrame - startFrame must be odd.") if options.processingSubfolder: raise Exception("Processing subfolder not supported when solving for intrinsics.") # Generate extra data we will use later to float intrinsics options.stereoArgs += " --num-matches-from-disp-triplets 10000 --unalign-disparity " # --enable-fill-holes " # Create separate directories for cameras and processed data, # as these will be distinct than what we will finally be # using to do the full run. suff = "_camgen" cameraFolder += suff navCameraFolder += suff processedFolder += suff # Get the input calibration file defaultCalibFile = "" for frame in range(options.startFrame, options.stopFrame+1): currCalibFile = input_conversions.getCalibrationFileForFrame(options.cameraLookupFile, options.inputCalFolder, frame, options.yyyymmdd, options.site, logger) if defaultCalibFile == "": defaultCalibFile = currCalibFile if defaultCalibFile != currCalibFile: # This is important, the calibration file must be unique raise Exception("Found two distinct calibration files: " + defaultCalibFile + \ " and " + currCalibFile) logger.info("Default calibration file: " + defaultCalibFile) if options.inputCalCamera != "": defaultCalibFile = options.inputCalCamera logger.info("Using instead the user-provided: " + defaultCalibFile) # Find the first image in the range jpegIndex = icebridge_common.csvIndexFile(jpegFolder) (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndex, prependFolder = True) if options.startFrame not in jpegFrameDict.keys(): raise Exception("Could not find jpeg image for frame: " + options.startFrame) firstImage = jpegFrameDict[options.startFrame] # Create the RPC file before optimization rpcCalibFile = os.path.join(processedFolder, os.path.basename(defaultCalibFile)) rpcCalibFile = rpcCalibFile.replace(".tsai", "_INIT_RPC.tsai") logger.info("Will approximate camera model " + defaultCalibFile + " with " + \ options.outputModelType + " model " + rpcCalibFile) if not os.path.exists(defaultCalibFile): raise Exception('Cannot find file: ' + defaultCalibFile) os.system("mkdir -p " + os.path.dirname(rpcCalibFile)) cmd = "convert_pinhole_model --input-file " + firstImage + ' --camera-file ' + \ defaultCalibFile + ' --output-type ' + options.outputModelType + \ ' --sample-spacing 50 -o ' + rpcCalibFile logger.info(cmd) os.system(cmd) # Use this one from now on options.inputCalCamera = rpcCalibFile # Return the modified values return (options, cameraFolder, navCameraFolder, processedFolder) def solveIntrinsics_Part2(options, imageFolder, cameraFolder, lidarFolder, orthoFolder, processedFolder, isSouth, logger): '''Create a camera model with optimized intrinsics. By now we processed a bunch of images and created bundle-adjusted and pc_aligned cameras and DEMs while using a camera model with distortion implemented using RPC coefficients which was obtained from the photometrics model. We now use the obtained cameras as inputs to a bundle adjust problem where we will optimize the intrinsics, including the distortion RPC coefficients, using the lidar as an external constraint, and many dense IP pairs and triplets (no quadruplets yet, even if 4 images overlap).''' # Get a list of all the input files imageCameraPairs = icebridge_common.getImageCameraPairs(imageFolder, cameraFolder, options.startFrame, options.stopFrame, logger) # The paired lidar file for the first image should be huge enough to contain # all images. lidarFile = icebridge_common.findMatchingLidarFile(imageCameraPairs[0][0], lidarFolder) logger.info('Found matching lidar file ' + lidarFile) lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile) numFiles = len(imageCameraPairs) if numFiles < 2: raise Exception('Failed to find any image camera pairs!') if numFiles % 2 != 0: raise Exception("When solving for intrinsics, must have an even number of frames to use.") # Collect pc_align-ed cameras, unaligned disparities, and dense match files images = [] cameras = [] for it in range(numFiles/2): begFrame = options.startFrame + 2*it endFrame = begFrame + 1 batchFolderName = icebridge_common.batchFolderName(begFrame, endFrame, options.bundleLength) thisOutputFolder = os.path.join(processedFolder, batchFolderName) # Find all the cameras after bundle adjustment and pc_align. pattern = icebridge_common.getAlignedBundlePrefix(thisOutputFolder) + '*.tsai' alignedCameras = glob.glob(pattern) if len(alignedCameras) != options.bundleLength: raise Exception("Expected " + str(options.bundleLength) + " cameras, here's what " + " was obtained instead: " + " ".join(alignedCameras)) img0 = ""; cam0 = ""; img1 = ""; cam1 = "" for cam in alignedCameras: frame = icebridge_common.getFrameNumberFromFilename(cam) if begFrame == frame: img0 = imageCameraPairs[2*it][0] cam0 = cam if endFrame == frame: img1 = imageCameraPairs[2*it+1][0] cam1 = cam images.append(img0); images.append(img1) cameras.append(cam0); cameras.append(cam1) # Match files and disp files dispFiles = [] matchFiles = [] for it in range(numFiles-1): begFrame = options.startFrame + it endFrame = begFrame + 1 batchFolderName = icebridge_common.batchFolderName(begFrame, endFrame, options.bundleLength) thisOutputFolder = os.path.join(processedFolder, batchFolderName) stereoFolder = os.path.join(thisOutputFolder, 'stereo_pair_'+str(0)) DISP_PREFIX = "disp-" currMatchFiles = glob.glob(os.path.join(stereoFolder, '*' + DISP_PREFIX + '*.match')) if len(currMatchFiles) != 1: raise Exception("Expecting a single dense match file in " + stereoFolder) matchFiles.append(currMatchFiles[0]) currDispFiles = glob.glob(os.path.join(stereoFolder, '*unaligned-D.tif')) if len(currDispFiles) != 1: raise Exception("Expecting a single unaligned disparity file in " + stereoFolder) dispFiles.append(currDispFiles[0]) # Create output directory for bundle adjustment and copy there the match files baDir = os.path.join(processedFolder, "bundle_intrinsics") baPrefix = os.path.join(baDir, "out") os.system("mkdir -p " + baDir) for matchFile in matchFiles: dstFile = os.path.basename(matchFile) dstFile = dstFile.replace(DISP_PREFIX, '') dstFile = os.path.join(baDir, dstFile) cmd = "cp -f " + matchFile + " " + dstFile logger.info(cmd) os.system(cmd) # The bundle adjustment solveIntr = "" if not options.skipSolvingIntrinsics: solveIntr = " --solve-intrinsics " cmd = "bundle_adjust " + " ".join(images) + " " + " ".join(cameras) + \ ' --reference-terrain ' + lidarFile + \ ' --disparity-list "' + " ".join(dispFiles) + '"' + \ ' --datum wgs84 -t nadirpinhole --inline-adjustments --robust-threshold 2' + \ ' --camera-weight 0 --csv-format ' + lidarCsvFormatString + \ ' --overlap-limit 1 --max-disp-error 50 --max-iterations 100 ' + \ solveIntr + ' --parameter-tolerance 1e-12 -o ' + baPrefix logger.info(cmd) os.system(cmd) # Generate DEMs of residuals before and after optimization projString = icebridge_common.getEpsgCode(isSouth, asString=True) for val in ['initial', 'final']: cmd = 'point2dem --t_srs ' + projString + ' --tr 2' + \ ' --csv-format 1:lon,2:lat,4:height_above_datum' + \ ' ' + baPrefix + '-' + val + '_residuals_.csv' logger.info(cmd) os.system(cmd) cmd = 'point2dem --t_srs ' + projString + ' --tr 2' + \ ' --csv-format 1:lon,2:lat,4:height_above_datum' + \ ' ' + baPrefix + '-' + val +'_residuals_reference_terrain.txt' logger.info(cmd) os.system(cmd) # Look at the latest written tsai file, that will be the optimized distortion file. # Force the initial rotation and translation to be the identity, this is # expected by ortho2pinhole. outFiles = filter(os.path.isfile, glob.glob(baPrefix + '*.tsai')) outFiles.sort(key=lambda x: os.path.getmtime(x)) optFile = outFiles[-1] logger.info("Reading optimized file: " + optFile) with open(optFile, 'r') as f: lines = f.readlines() for it in range(len(lines)): lines[it] = lines[it].strip() if re.match("^C\s*=\s*", lines[it]): lines[it] = "C = 0 0 0" if re.match("^R\s*=\s*", lines[it]): lines[it] = "R = 1 0 0 0 1 0 0 0 1" # Write the final desired optimized RPC file logger.info("Writing final optimized file: " + options.outputCalCamera) # Below is a bugfix, must take full path to find the dir, otherwise it may fail. os.system("mkdir -p " + os.path.dirname(os.path.abspath(options.outputCalCamera))) with open(options.outputCalCamera, 'w') as f: for line in lines: f.write(line + "\n") def main(argsIn): try: # Sample usage: # python full_processing_script.py \ # --yyyymmdd 20091016 --site AN --num-processes 1 --num-threads 12 --bundle-length 12 \ # --start-frame 350 --stop-frame 353 --skip-validate \ # --camera-calibration-folder camera_calib \ # --reference-dem-folder ref_dem_folder # An output folder will be crated automatically (with a name like # AN_20091016), or its name can be specified via the --output-folder # option. usage = '''full_processing_script.py <options>''' parser = argparse.ArgumentParser(usage=usage) # Run selection parser.add_argument("--yyyymmdd", dest="yyyymmdd", required=True, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", required=True, help="Name of the location of the images (AN, GR, or AL)") parser.add_argument("--output-folder", dest="outputFolder", default=None, help="Name of the output folder. If not specified, " + \ "use something like AN_YYYYMMDD.") parser.add_argument("--camera-lookup-file", dest="cameraLookupFile", default=None, help="The file to use to find which camera was used for which " + \ "flight. By default it is in the same directory as this script " + \ "and named camera_lookup.txt.") # Processing options parser.add_argument('--bundle-length', dest='bundleLength', default=2, type=int, help="The number of images to bundle adjust and process " + \ "in a single batch.") # TODO: Compute this automatically?? parser.add_argument('--overlap-limit', dest='overlapLimit', default=2, type=int, help="The number of images to treat as overlapping for " + \ "bundle adjustment.") parser.add_argument('--max-overlap-ratio', dest='maxOverlapRatio', default=0.85, 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.') parser.add_argument('--stereo-arguments', dest='stereoArgs', # set --min-xcorr-level 0 to do the left-to-right # and right-to-left consistency check at the lowest level. default='--stereo-algorithm 2 --min-xcorr-level 0', help='Extra arguments to pass to stereo.') parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on.') parser.add_argument('--frames-file', dest='framesFile', default="", help='Specific frames to run ortho2pinhole on within this frame range.') parser.add_argument('--max-num-lidar-to-fetch', dest='maxNumLidarToFetch', default=None, type=int, help="The maximum number of lidar files to fetch. " + \ "This is used in debugging.") parser.add_argument("--camera-calibration-folder", dest="inputCalFolder", default=None, help="The folder containing camera calibration.") parser.add_argument("--input-calibration-camera", dest="inputCalCamera", default="", help="Instead of looking up the calibrated camera in the calibration folder, use this one.") parser.add_argument("--output-calibration-camera", dest="outputCalCamera", default="", help="If specified, float the intrinsics and write the optimized model here.") parser.add_argument("--output-model-type", dest="outputModelType", default="RPC", help="Generate a distortion model of type RPC, RPC5, or RPC6.") parser.add_argument("--skip-solving-intrinsics", action="store_true", dest="skipSolvingIntrinsics", default=False, help="When jointly solving for all extrinsics and intrinsics, " + \ "keep the intrinsics fixed.") parser.add_argument("--reference-dem-folder", dest="refDemFolder", default=None, help="The folder containing DEMs that created orthoimages.") parser.add_argument("--processing-subfolder", dest="processingSubfolder", default=None, help="Specify a subfolder name where the processing outputs will go. " + \ "fault is no additional folder") parser.add_argument("--simple-cameras", action="store_true", dest="simpleCameras", default=False, help="Don't use orthoimages to refine the camera models.") # This option is only needed when generating camera models from the nav files. parser.add_argument('--camera-mounting', default=0, dest='cameraMounting', type=int, help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.') # Performance options parser.add_argument('--num-processes', dest='numProcesses', default=1, type=int, help='The number of simultaneous processes to run.') parser.add_argument('--num-ortho-processes', dest='numOrthoProcesses', default=-1, type=int, help='The number of simultaneous ortho processes to run.') parser.add_argument('--num-threads', dest='numThreads', default=8, type=int, help='The number of threads per process.') # Action control parser.add_argument("--skip-fetch", action="store_true", dest="noFetch", default=False, help="Skip data fetching.") parser.add_argument("--skip-convert", action="store_true", dest="noConvert", default=False, help="Skip data conversion.") parser.add_argument("--stop-after-fetch", action="store_true", dest="stopAfterFetch", default=False, help="Stop program after data fetching.") parser.add_argument("--stop-after-convert", action="store_true", dest="stopAfterConvert", default=False, help="Stop program after data conversion.") parser.add_argument("--skip-validate", action="store_true", dest="skipValidate", default=False, help="Skip input data validation.") parser.add_argument("--ignore-missing-lidar", action="store_true", dest="ignoreMissingLidar", default=False, help="Keep going if the lidar is missing.") parser.add_argument("--log-batches", action="store_true", dest="logBatches", default=False, help="Log the required batch commands without running them.") parser.add_argument('--cleanup', action='store_true', default=False, dest='cleanup', help='If the final result is produced delete intermediate files.') parser.add_argument('--many-ip', action='store_true', default=False, dest='manyip', help='If to use a lot of IP in bundle adjustment from the beginning.') parser.add_argument("--dry-run", action="store_true", dest="dryRun", default=False, help="Set up the input directories but do not fetch/process any imagery.") parser.add_argument("--refetch", action="store_true", dest="reFetch", default=False, help="Try fetching again if some files turned out invalid " + \ "during conversions.") parser.add_argument("--refetch-index", action="store_true", dest="refetchIndex", default=False, help="Force refetch of the index file.") parser.add_argument("--refetch-nav", action="store_true", dest="refetchNav", default=False, help="Force refetch of the nav file.") parser.add_argument("--stop-after-index-fetch", action="store_true", dest="stopAfterIndexFetch", default=False, help="Stop after fetching the indices.") parser.add_argument("--no-nav", action="store_true", dest="noNavFetch", default=False, help="Don't fetch or convert the nav data.") parser.add_argument("--no-lidar-convert", action="store_true", dest="noLidarConvert", default=False, help="Skip lidar files in the conversion step.") parser.add_argument("--no-ortho-convert", action="store_true", dest="noOrthoConvert", default=False, help="Skip generating camera models in the conversion step.") parser.add_argument("--skip-fast-conversions", action="store_true", dest="skipFastConvert", default=False, help="Skips all non-ortho conversions.") options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) icebridge_common.switchWorkDir() if options.numOrthoProcesses < 0: options.numOrthoProcesses = options.numProcesses isSouth = icebridge_common.checkSite(options.site) # Turned off elevation limits here since they are being set from LIDAR data. ## Add the site based elevation limits to the stereoArgs option #altLimits = icebridge_common.getElevationLimits(options.site) #options.stereoArgs = (' %s --elevation-limit %f %f ' # % (options.stereoArgs, altLimits[0], altLimits[1])) options.stereoArgs = (' %s ' % (options.stereoArgs)) if options.cameraLookupFile is None: options.cameraLookupFile = P.join(basepath, 'camera_lookup.txt') if not os.path.isfile(options.cameraLookupFile): raise Exception("Can't find camera file: " + options.cameraLookupFile) if len(options.yyyymmdd) != 8 and len(options.yyyymmdd) != 9: # Make an exception for 20100422a raise Exception("The --yyyymmdd field must have length 8 or 9.") if options.outputFolder is None: options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd) if options.stopAfterIndexFetch: options.stopAfterFetch = True os.system('mkdir -p ' + options.outputFolder) logLevel = logging.INFO # Record everything logger = icebridge_common.setUpLogger(options.outputFolder, logLevel, 'icebridge_processing_log_frames_' + \ str(options.startFrame) + "_" + str(options.stopFrame)) # Make sure we later know what we were doing logger.info("full_processing_script.py " + " ".join(argsIn)) (out, err, status) = asp_system_utils.executeCommand(['uname', '-a'], suppressOutput = True) logger.info("Running on machine: " + out) logger.info("Work dir is " + os.getcwd()) os.system("ulimit -c 0") # disable core dumps os.system("umask 022") # enforce files be readable by others # Perform some input checks and initializations # These are not needed unless cameras are initialized if options.inputCalFolder is None or not os.path.exists(options.inputCalFolder): raise Exception("Missing camera calibration folder.") if options.refDemFolder is None or not os.path.exists(options.refDemFolder): raise Exception("Missing reference DEM folder.") refDemName = icebridge_common.getReferenceDemName(options.site) refDemPath = os.path.join(options.refDemFolder, refDemName) if not os.path.exists(refDemPath): raise Exception("Missing reference DEM: " + refDemPath) # TODO: CLEAN UP!!! # Set up the output folders cameraFolder = icebridge_common.getCameraFolder(options.outputFolder) imageFolder = icebridge_common.getImageFolder(options.outputFolder) jpegFolder = icebridge_common.getJpegFolder(options.outputFolder) orthoFolder = icebridge_common.getOrthoFolder(options.outputFolder) fireballFolder = icebridge_common.getFireballFolder(options.outputFolder) corrFireballFolder = icebridge_common.getCorrFireballFolder(options.outputFolder) lidarFolder = icebridge_common.getLidarFolder(options.outputFolder) navFolder = icebridge_common.getNavFolder(options.outputFolder) navCameraFolder = icebridge_common.getNavCameraFolder(options.outputFolder) processedFolder = icebridge_common.getProcessedFolder(options.outputFolder) if options.outputCalCamera != "": if options.maxOverlapRatio < 1: raise Exception ("For optimizing intrinsics, must set --max-overlap-ratio to 1, " + \ "to always use consecutive frames.") # Prepare to solve for intrinsics. Note that this modifies some things along the way. (options, cameraFolder, navCameraFolder, processedFolder) = \ solveIntrinsics_Part1(options, jpegFolder, cameraFolder, navCameraFolder, processedFolder, logger) # Handle subfolder option. This is useful for comparing results with different parameters! if options.processingSubfolder: processedFolder = os.path.join(processedFolder, options.processingSubfolder) logger.info('Will write to processing subfolder: ' + options.processingSubfolder) # If something failed in the first attempt either in fetch or in # convert, we will wipe bad files, and try to refetch/re-convert. numAttempts = 1 if options.reFetch and (not options.noFetch): numAttempts = 2 for attempt in range(numAttempts): if numAttempts > 1: logger.info("Fetch/convert attempt: " + str(attempt+1)) ans = runFetchConvert(options, isSouth, cameraFolder, imageFolder, jpegFolder, orthoFolder, fireballFolder, corrFireballFolder, lidarFolder, processedFolder, navFolder, navCameraFolder, refDemPath, logger) if ans == 0: break if options.stopAfterFetch or options.dryRun or options.stopAfterConvert: logger.info('Fetch/convert finished!') return 0 # Call the processing routine processTheRun(options, imageFolder, cameraFolder, lidarFolder, orthoFolder, corrFireballFolder, processedFolder, isSouth, refDemPath) if options.outputCalCamera != "": # Finish solving for intrinscs. solveIntrinsics_Part2(options, imageFolder, cameraFolder, lidarFolder, orthoFolder, processedFolder, isSouth, logger) # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/gen_ortho.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # For a given frame, blend the two DEMs containing that frame, and one # more to the left and to the right to ensure we have enough coverage, # and then mapproject onto this obtained DEM the current image # and current bundle-adjusted and aligned camera. # It creates a file of the form: # processed/batch_2489_2490_2/out-ortho.tif # The resolution is auto-determined per each image. # Operate in the range [startFrame, stopFrame) so does not include the # last one. # See usage below. import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, glob import traceback import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] def createRotatedCameraFile(cameraIn, cameraOut, cameraMounting): '''Create a copy of the input camera model which accounts for a 90 degree rotation of the corresponding image.''' # Usually the input camera file is fine if cameraMounting < 2: return cameraIn # Read in the camera file cameraLinesIn = [] cameraLinesOut = [] with open(cameraIn, 'r') as f: for line in f: cameraLinesIn.append(line.strip()) cameraLinesOut.append(cameraLinesIn[0]) # VERSION cameraLinesOut.append(cameraLinesIn[2].replace('v','u')) # fu = fv cameraLinesOut.append(cameraLinesIn[1].replace('u','v')) # fv = fu cameraLinesOut.append(cameraLinesIn[4].replace('v','u')) # cu = cv cameraLinesOut.append(cameraLinesIn[3].replace('u','v')) # cv = cu cameraLinesOut.append(cameraLinesIn[5]) # u_direction cameraLinesOut.append(cameraLinesIn[6]) # v_direction cameraLinesOut.append(cameraLinesIn[7]) # w_direction cameraLinesOut.append(cameraLinesIn[8]) # C cameraLinesOut.append('dummy') # R R = [float(x) for x in cameraLinesIn[9].strip().split()[2:]] cameraLinesOut.append(cameraLinesIn[10]) # pitch cameraLinesOut.append(cameraLinesIn[11]) # distortion type cameraLinesOut.append('dummy') # xp cameraLinesOut.append('dummy') # yp for i in range(14,len(cameraLinesIn)): cameraLinesOut.append(cameraLinesIn[i]) # copy the remaining values (k, p, b) unchanged. rNew = R[:] xpIn = float(cameraLinesIn[12].strip().split()[2]) # Extract input xp, yp ypIn = float(cameraLinesIn[13].strip().split()[2]) if cameraMounting == 2: # Rotate the camera 90 degrees clockwise # x = y, y = -x rNew[0] = R[1] # x = y rNew[3] = R[4] rNew[6] = R[7] rNew[1] = -1.0*R[0] # y = -x rNew[4] = -1.0*R[3] rNew[7] = -1.0*R[6] xpOut = -1.0*ypIn ypOut = xpIn if cameraMounting == 3: # Rotate the camera 90 degrees counter-clockwise. rNew[0] = -1.0*R[1] # x = -y rNew[3] = -1.0*R[4] rNew[6] = -1.0*R[7] rNew[1] = R[0] # y = x rNew[4] = R[3] rNew[7] = R[6] xpOut = ypIn ypOut = -1.0*xpIn # Repack the rotated values cameraLinesOut[ 9] = 'R = ' + ' '.join([str(x) for x in rNew]) cameraLinesOut[12] = 'xp = ' + str(xpOut) cameraLinesOut[13] = 'yp = ' + str(ypOut) with open(cameraOut, 'w') as f: for line in cameraLinesOut: f.write(line + '\n') return cameraOut def runOrtho(frame, processFolder, imageFile, bundleLength, cameraMounting, threadText, redo, suppressOutput): os.system("ulimit -c 0") # disable core dumps os.system("rm -f core.*") # these keep on popping up os.system("umask 022") # enforce files be readable by others # This will run as multiple processes. Hence have to catch all exceptions: projBounds = () try: # Retrieve the aligned camera file alignCamFile, batchFolder = \ icebridge_common.frameToFile(frame, icebridge_common.alignedBundleStr() + '*' + str(frame) + '.tsai', processFolder, bundleLength) if alignCamFile == "": print("Could not find aligned camera for frame: " + str(frame)) return # To ensure we mapproject the image fully, mosaic the several DEMs # around it. Keep the closest 5. Try to grab more first to account # for skipped frames. frameOffsets = [0, 1, -1, 2, -2, -3, 3, -4, 4] dems = [] for offset in frameOffsets: # Find the DEM file for the desired frame demFile, batchFolder = icebridge_common.frameToFile(frame + offset, icebridge_common.blendFileName(), processFolder, bundleLength) # If the central DEM is missing, we are out of luck if offset == 0 and demFile == "": print("Could not find blended DEM for frame: " + str(frame + offset)) return if offset == 0: demGeoInfo = asp_geo_utils.getImageGeoInfo(demFile, getStats=False) projBounds = demGeoInfo['projection_bounds'] # minX maxX minY maxY if demFile == "": # Missing DEM continue if len(dems) >= 5: break # too many already dems.append(demFile) demList = " ".join(dems) # Call this one more time, to get the current batch folder currDemFile, batchFolder = icebridge_common.frameToFile(frame, icebridge_common.blendFileName(), processFolder, bundleLength) # The names for the final results finalOrtho = os.path.join(batchFolder, icebridge_common.orthoFileName()) finalOrthoPreview = os.path.join(batchFolder, icebridge_common.orthoPreviewFileName()) if (not redo) and os.path.exists(finalOrtho): print("File exists: " + finalOrtho + ".") else: filesToWipe = [] # If the center dem spans say 1 km, there's no way the # ortho can span more than 5 km, unless something is # seriously out of whack, such as alignment failing for # some neighbours. In the best case, if the center dem is # 1 km by 1 km, the obtained ortho will likely be 1.4 km # by 1 km, as an image extends beyond its stereo dem with # a neighbor. factor = float(2.0) projWinStr = "" if len(projBounds) >= 4: # projBounds is in the format minX maxX minY maxY widX = float(projBounds[1]) - float(projBounds[0]) widY = float(projBounds[3]) - float(projBounds[2]) projBounds = ( float(projBounds[0]) - factor*widX, # minX float(projBounds[1]) + factor*widX, # maxX float(projBounds[2]) - factor*widY, # minY float(projBounds[3]) + factor*widY # maxY ) projWinStr = ("--t_projwin %f %f %f %f" % \ (projBounds[0], projBounds[2], projBounds[1], projBounds[3])) # See if we have a pre-existing DEM to use as footprint mosaicPrefix = os.path.join(batchFolder, 'out-temp-mosaic') mosaicOutput = mosaicPrefix + '-tile-0.tif' cmd = ('dem_mosaic --hole-fill-length 500 %s %s %s -o %s' % (demList, threadText, projWinStr, mosaicPrefix)) filesToWipe.append(mosaicOutput) # no longer needed # Generate the DEM mosaic print(cmd) localRedo = True # The file below should not exist unless there was a crash asp_system_utils.executeCommand(cmd, mosaicOutput, suppressOutput, localRedo) # Borow some pixels from the footprint DEM,just to grow a bit the real estate finalFootprintDEM = os.path.join(batchFolder, icebridge_common.footprintFileName()) if os.path.exists(finalFootprintDEM): mosaicPrefix2 = os.path.join(batchFolder, 'out-temp-mosaic2') mosaicOutput2 = mosaicPrefix2 + '-tile-0.tif' cmd = ('dem_mosaic --priority-blending-length 50 %s %s %s %s -o %s' % (mosaicOutput, finalFootprintDEM, threadText, projWinStr, mosaicPrefix2)) print(cmd) localRedo = True # The file below should not exist unless there was a crash asp_system_utils.executeCommand(cmd, mosaicOutput2, suppressOutput, localRedo, noThrow = True) if os.path.exists(mosaicOutput2): cmd = "mv -f " + mosaicOutput2 + " " + mosaicOutput print(cmd) os.system(cmd) # TODO: Look at more aggressive hole-filling. But need a testcase. filesToWipe += glob.glob(mosaicPrefix + '*' + '-log-' + '*') # First mapproject to create a tif image with 4 channels. # Then pull 3 channels and compress them as jpeg, while keeping the # image a geotiff. tempOrtho = os.path.join(batchFolder, icebridge_common.orthoFileName() + "_tmp.tif") # There is no need for this file to exist unless it is stray junk if os.path.exists(tempOrtho): os.remove(tempOrtho) # If needed, generate a temporary camera file to correct a mounting rotation. # - When the camera mount is rotated 90 degrees stereo is run on a corrected version # but ortho needs to work on the original uncorrected jpeg image. tempCamFile = alignCamFile + '_temp_rot.tsai' tempCamFile = createRotatedCameraFile(alignCamFile, tempCamFile, cameraMounting) # Run mapproject. The grid size is auto-determined. cmd = ('mapproject --no-geoheader-info %s %s %s %s %s' % (mosaicOutput, imageFile, tempCamFile, tempOrtho, threadText)) print(cmd) asp_system_utils.executeCommand(cmd, tempOrtho, suppressOutput, redo) # Set temporary files to be cleaned up filesToWipe.append(tempOrtho) if tempCamFile != alignCamFile: filesToWipe.append(tempCamFile) # This makes the images smaller than Rose's by a factor of about 4, # even though both types are jpeg compressed. Rose's images filtered # through this command also get compressed by a factor of 4. # I conclude that the jpeg compression used by Rose was not as # aggressive as the one used in gdal_translate, but there is no # apparent knob to control that. cmd = "gdal_translate -b 1 -b 2 -b 3 -co compress=jpeg " + tempOrtho + " " + finalOrtho print(cmd) asp_system_utils.executeCommand(cmd, finalOrtho, suppressOutput, redo) # Clean up extra files for fileName in filesToWipe: if os.path.exists(fileName): print("Removing: " + fileName) os.remove(fileName) if (not redo) and os.path.exists(finalOrthoPreview): print("File exists: " + finalOrthoPreview + ".") else: cmd = 'gdal_translate -scale -outsize 25% 25% -of jpeg ' + finalOrtho + \ ' ' + finalOrthoPreview print(cmd) asp_system_utils.executeCommand(cmd, finalOrthoPreview, suppressOutput, redo) except Exception as e: print('Ortho creation failed!\n' + str(e) + ". " + str(traceback.print_exc())) os.system("rm -f core.*") # these keep on popping up # To ensure we print promptly what we did so far sys.stdout.flush() def main(argsIn): try: # Sample usage: # python ~/projects/StereoPipeline/src/asp/IceBridge/gen_ortho.py --site GR \ # --yyyymmdd 20120315 --start-frame 2490 --stop-frame 2491 --bundle-length 2 \ # --num-threads 8 --num-processes 3. usage = '''gen_ortho.py <options>''' parser = argparse.ArgumentParser(usage=usage) # Run selection parser.add_argument("--yyyymmdd", dest="yyyymmdd", required=True, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", required=True, help="Name of the location of the images (AN, GR, or AL)") parser.add_argument("--output-folder", dest="outputFolder", default=None, help="Name of the output folder. If not specified, " + \ "use something like AN_YYYYMMDD.") # Processing options parser.add_argument('--bundle-length', dest='bundleLength', default=2, type=int, help="The number of images to bundle adjust and process " + \ "in a single batch.") parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on. This frame will also be processed.') parser.add_argument('--camera-mounting', dest='cameraMounting', default=0, type=int, help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.') parser.add_argument("--processing-subfolder", dest="processingSubfolder", default=None, help="Specify a subfolder name where the processing outputs will go. "+\ "The default is no additional folder.") # Performance options parser.add_argument('--num-processes', dest='numProcesses', default=1, type=int, help='The number of simultaneous processes to run.') parser.add_argument('--num-threads', dest='numThreads', default=8, type=int, help='The number of threads per process.') options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) icebridge_common.switchWorkDir() if len(options.yyyymmdd) != 8 and len(options.yyyymmdd) != 9: # Make an exception for 20100422a raise Exception("The --yyyymmdd field must have length 8 or 9.") if options.outputFolder is None: options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd) os.system('mkdir -p ' + options.outputFolder) logLevel = logging.INFO # Make this an option?? logger = icebridge_common.setUpLogger(options.outputFolder, logLevel, 'icebridge_ortho_log') (out, err, status) = asp_system_utils.executeCommand(['uname', '-a'], suppressOutput = True) logger.info("Running on machine: " + out) processFolder = os.path.join(options.outputFolder, 'processed') # Handle subfolder option. This is useful for comparing results with different parameters! if options.processingSubfolder: processFolder = os.path.join(processFolder, options.processingSubfolder) logger.info('Reading from processing subfolder: ' + options.processingSubfolder) jpegFolder = icebridge_common.getJpegFolder(options.outputFolder) jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder) if not os.path.exists(jpegIndexPath): raise Exception("Error: Missing jpeg index file: " + jpegIndexPath + ".") (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath, prependFolder = True) threadText = '' if options.numThreads: threadText = '--threads ' + str(options.numThreads) redo = False suppressOutput = True taskHandles = [] if options.numProcesses > 1: pool = multiprocessing.Pool(options.numProcesses) # Bound the frames sortedFrames = sorted(jpegFrameDict.keys()) if len(sortedFrames) > 0: if options.startFrame < sortedFrames[0]: options.startFrame = sortedFrames[0] if options.stopFrame > sortedFrames[-1] + 1: options.stopFrame = sortedFrames[-1] + 1 else: # No jpeg files, that means nothing to do options.startFrame = 0 options.stopFrame = 0 for frame in range(options.startFrame, options.stopFrame): if not frame in jpegFrameDict: logger.info("Error: Missing jpeg file for frame: " + str(frame) + ".") continue # Find the right image currImage = jpegFrameDict[frame] args = (frame, processFolder, currImage, options.bundleLength, options.cameraMounting, threadText, redo, suppressOutput) # Run things sequentially if only one process, to make it easy to debug if options.numProcesses > 1: taskHandles.append(pool.apply_async(runOrtho, args)) else: runOrtho(*args) if options.numProcesses > 1: icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, interactive = False, quitKey='q', sleepTime=20) icebridge_common.stopTaskPool(pool) # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/generate_fake_camera_models.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Simple script to generate fake camera files for selected images. # - The NSIDC upload script just requires camera file names to get the timestamp. import os, sys, argparse, datetime, time import traceback, fetch_icebridge_data, icebridge_common # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] def main(argsIn): try: usage = '''generate_fake_camera_models.py <options>''' parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--yyyymmdd", dest="yyyymmdd", required=True, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", required=True, help="Name of the location of the images (AN, GR, or AL)") parser.add_argument("--work-folder", dest="workFolder", default=None, help="Temporary download folder.") parser.add_argument("--output-folder", dest="outputFolder", default=None, help="Name of the output folder. If not specified, " + \ "use something like AN_YYYYMMDD.") parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on. This frame will also be processed.') options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) # Fetch the jpeg files for missing camera files fetch_options = options fetch_options.type = 'jpeg' fetch_options.year = int(options.yyyymmdd[0:4]) fetch_options.month = int(options.yyyymmdd[4:6]) fetch_options.day = int(options.yyyymmdd[6:8]) fetch_options.skipValidate = True fetch_options.ignoreMissingLidar = True fetch_options.maxNumLidarToFetch = 0 fetch_options.refetchIndex = False fetch_options.refetchNav = False fetch_options.stopAfterIndexFetch = False fetch_options.dryRun = False fetch_options.allFrames = False fetch_options.frameSkip = 0 fetch_icebridge_data.doFetch(fetch_options, options.workFolder) if not os.path.exists(options.outputFolder): os.makedirs(options.outputFolder) # For each jpeg file, generate an empty file with the correct file name. inputFiles = os.listdir(options.workFolder) for f in inputFiles: if os.path.splitext(f)[1] != '.JPG': continue inputPath = os.path.join(options.workFolder, f) print inputPath # Get image info frame = icebridge_common.getFrameNumberFromFilename(inputPath) (datestr, timestr) = icebridge_common.getJpegDateTime(inputPath) # Pick output name outputName = icebridge_common.formFilePrefix(datestr, timestr, frame) + '.tsai' outputPath = os.path.join(options.outputFolder, outputName) cmd = 'touch ' + outputPath print cmd os.system(cmd) # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/generate_flight_summary.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Top level program to process all of the Icebridge data. # - This program is not sophisticated enough to handle everything and will need to be # superceded by another script. import os, sys, optparse, datetime, time, subprocess, logging, multiprocessing import re, shutil, time, getpass, argparse import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, pbs_functions, archive_functions, run_helper, lvis2kml import process_icebridge_batch import asp_system_utils, asp_geo_utils, asp_image_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] # TODO: Move this function! def getLastLog(logPrefix): '''Return the path to the latest log file matching a prefix''' # Get all the files in the folder containing the prefix folder = os.path.dirname(logPrefix) logFiles = os.listdir(folder) logFiles = [os.path.join(folder, x) for x in logFiles] logFiles = [x for x in logFiles if logPrefix in x] # No matches found! if not logFiles: return None # Go through the remaining files and find the one with the latest modify time # - Assumes the modify time is a good replacement for the stamp in the file name. latestFile = logFiles[0] latestTime = os.path.getmtime(latestFile) for log in logFiles: thisTime = os.path.getmtime(log) if thisTime > latestTime: latestTime = thisTime latestFile = log return latestFile def getFailureCause(batchFolder): '''Try to figure out the reason that a DEM failed''' # Define a list of failure reasons and text descriptions UNKNOWN = -1 SUCCESS = 0 FAIL_FILE_MISSING = 1 FAIL_CAMERA_MISSING = 2 FAIL_LIDAR_DEM_TOO_LARGE = 3 FAIL_LIDAR = 4 FAIL_BUNDLE = 5 FAIL_STEREO_NO_POINTS = 6 FAIL_STEREO = 7 FAIL_STEREO_POINT2DEM = 8 FAIL_PC_ALIGN = 9 FAIL_FRACTION_VALID = 10 FAIL_NO_LIDAR_DEM_OVERLAP = 11 FAIL_TINY_DEM = 12 FAIL_NO_LIDAR_MATCH = 13 FAIL_CAMERA_GSD = 14 errorSummaries = {} # Human readable error codes errorSummaries[UNKNOWN ] = 'Unknown failure' errorSummaries[SUCCESS ] = 'Success' errorSummaries[FAIL_FILE_MISSING] = 'Missing argument file' errorSummaries[FAIL_CAMERA_MISSING] = 'Failed to generate camera file' #errorSummaries[FAIL_LIDAR_DEM_TOO_LARGE] = 'LIDAR DEM would be too large' errorSummaries[FAIL_LIDAR ] = 'Failed to generate lidar DEM' errorSummaries[FAIL_BUNDLE ] = 'Bundle adjust failed' errorSummaries[FAIL_STEREO_NO_POINTS] = 'Generated empty stereo point cloud' errorSummaries[FAIL_STEREO ] = 'Stereo failed' errorSummaries[FAIL_STEREO_POINT2DEM] = 'Other stereo point2dem failure' errorSummaries[FAIL_PC_ALIGN] = 'pc_align failed' errorSummaries[FAIL_FRACTION_VALID] = 'Too few valid pixels' errorSummaries[FAIL_NO_LIDAR_DEM_OVERLAP] = 'No lidar-DEM overlap' errorSummaries[FAIL_TINY_DEM] = 'Generated DEM is too small' errorSummaries[FAIL_NO_LIDAR_MATCH] = 'Failed to find matching lidar file for image' errorSummaries[FAIL_CAMERA_GSD] = 'Error computing camera GSD in process_icebridge_batch' errorLogText = {} # Text in the log file that indicates an error occurred errorLogText[SUCCESS ] = 'Finished script process_icebridge_batch!' errorLogText[FAIL_FILE_MISSING] = 'Arg parsing error: Input file' errorLogText[FAIL_CAMERA_MISSING] = 'Not enough input pairs exist to continue, quitting!' #errorLogText[FAIL_LIDAR_DEM_TOO_LARGE] = 'Requested DEM size is too large' errorLogText[FAIL_LIDAR ] = 'Failed to generate lidar DEM to estimate height range!' errorLogText[FAIL_BUNDLE ] = 'Bundle adjustment failed!' errorLogText[FAIL_STEREO_NO_POINTS] = 'OrthoRasterize: Input point cloud is empty!' errorLogText[FAIL_STEREO ] = 'Stereo call failed!' errorLogText[FAIL_STEREO_POINT2DEM] = 'point2dem call on stereo pair failed!' errorLogText[FAIL_PC_ALIGN] = 'Unable to align image at max displacement!' errorLogText[FAIL_FRACTION_VALID] = 'Required DEM pixel fraction is' errorLogText[FAIL_NO_LIDAR_DEM_OVERLAP] = 'No overlap between lidar DEM and stereo DEM' errorLogText[FAIL_TINY_DEM] = 'is less than minumum size' errorLogText[FAIL_NO_LIDAR_MATCH] = 'Failed to find matching lidar file for image' errorLogText[FAIL_CAMERA_GSD] = 'Failed to compute GSD for any camera' foundError = UNKNOWN logPrefix = os.path.join(batchFolder, icebridge_common.logFilePrefix()) latestLog = getLastLog(logPrefix) if not latestLog: print("Cannot find log matching: " + logPrefix) return (foundError, errorSummaries[foundError]) # Search for errors in chronological order logText = '' with open(latestLog, 'r') as log: logText = log.read() for code in errorLogText.iterkeys(): if code in (UNKNOWN, SUCCESS): #Skip these codes continue if errorLogText[code] in logText: foundError = code break # Stop at the first error we find return (foundError, errorSummaries[foundError]) def generateFlightSummary(run, options): '''Generate a folder containing handy debugging files including output thumbnails''' # Copy logs to the output folder print 'Copying log files...' badImageFolder = os.path.join(options.outputFolder, 'badImages') runFolder = run.getFolder() procFolder = run.getProcessFolder() navCameraFolder = run.getNavCameraFolder() os.system('mkdir -p ' + options.outputFolder) os.system('mkdir -p ' + badImageFolder) packedErrorLog = os.path.join(runFolder, 'packedErrors.log') if os.path.exists(packedErrorLog): try: shutil.copy(packedErrorLog, options.outputFolder) except Exception as e: # In case it complains about copying a file onto itself print("Warning: " + str(e)) if not options.skipKml: # Copy the input camera kml file camerasInKmlPath = os.path.join(procFolder, 'cameras_in.kml') try: shutil.copy(camerasInKmlPath, options.outputFolder) except Exception as e: # In case it complains about copying a file onto itself print("Warning: " + str(e)) # Copy the input camera kml file navCamerasKmlPath = os.path.join(navCameraFolder, 'nav_cameras.kml') try: shutil.copy(navCamerasKmlPath, options.outputFolder) except Exception as e: # In case it complains about copying a file onto itself print("Warning: " + str(e)) # Create a merged version of all the bundle adjusted camera files # - The tool currently includes cameras more than once if they appear # in multiple bundles. print 'Merging output camera kml files...' cmd = "find "+procFolder+" -name cameras_out.kml" p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, shell=False, universal_newlines=True) textOutput, err = p.communicate() camKmlFiles = textOutput.replace('\n', ' ') # Write the list of files to process to disk. Otherwise, if we just # pass the full list on the command line, it may be too big # and the call will fail. kmlList = os.path.join(options.outputFolder, 'kml_list.txt') print("Writing: " + kmlList) with open(kmlList, 'w') as f: for filename in sorted(camKmlFiles.split()): filename = filename.strip() if filename == "": continue f.write(filename + "\n") outputKml = os.path.join(options.outputFolder, 'cameras_out.kml') scriptPath = icebridge_common.fullPath('merge_orbitviz.py') cmd = 'python ' + scriptPath + ' ' + outputKml + ' -list ' + kmlList print(cmd) os.system(cmd) # Generate lidar kml files print("Generating lidar kml files") LIDAR_POINT_SKIP = 1527 lidarFiles = run.getLidarList(prependFolder=True) lidarOutputFolder = os.path.join(options.outputFolder, 'lidar') os.system('mkdir -p ' + lidarOutputFolder) for f in lidarFiles: inputPath = os.path.splitext(f)[0] + '.csv' outputPath = os.path.join(lidarOutputFolder, os.path.basename(f)+'.kml') args = [inputPath, outputPath, '--skip', str(LIDAR_POINT_SKIP), '--color', 'red'] if not os.path.exists(outputPath): # Don't recreate these files print("Generating: " + outputPath) # This can be very slow, so print what is going on try: lvis2kml.main(args) except Exception as e: # Do not let this make our life miserable print("Problem: " + str(e)) # Collect per-batch information batchInfoPath = os.path.join(options.outputFolder, 'batchInfoSummary.csv') failedBatchPath = os.path.join(options.outputFolder, 'failedBatchList.csv') print("Writing statistics to: " + batchInfoPath) print("Writing failures to: " + failedBatchPath) batchInfoLog = open(batchInfoPath, 'w') failureLog = open(failedBatchPath, 'w') # Write the header for the batch log file batchInfoLog.write('# startFrame, stopFrame, centerLon, centerLat, meanAlt, ' + 'meanLidarDiff, meanInterDiff, meanFireDiff, meanFireLidarDiff, ' + 'percentValid, meanBlendDiff, meanBlendDiffInFireballFootprint, ' + \ 'corrSearchWid, corrMem(GB), corrElapsedTime(minutes)\n') failureLog.write('# startFrame, stopFrame, errorCode, errorText\n') demList = run.getOutputFileList(icebridge_common.blendFileName()) for (dem, frames) in demList: demFolder = os.path.dirname(dem) # Handle frame range option if (frames[0] < options.startFrame): continue if (frames[1] > options.stopFrame): break # Progress indication if frames[0] % 100 == 0: print("Frame: " + str(frames[0])) batchInfoLog.flush() # for instant gratification failureLog.flush() # Read in blend results which are not part of the consolidated stats file blendDiffPath = os.path.join(demFolder, 'out-blend-DEM-diff.csv') try: blendDiffResults = icebridge_common.readGeodiffOutput(blendDiffPath) except: blendDiffResults = {'Mean':-999} # Read in blend results which are not part of the consolidated stats file # for the blend done in the fireball footprint fireballBlendDiffPath = os.path.join(demFolder, 'out-blend-fb-footprint-diff.csv') try: fireballBlendDiffResults = icebridge_common.readGeodiffOutput(fireballBlendDiffPath) except: fireballBlendDiffResults = {'Mean':-999} runStatsFile = os.path.join(demFolder, icebridge_common.getRunStatsFile()) statsLine = icebridge_common.readStats(runStatsFile) # All of the other results should be in a consolidated stats file consolidatedStatsPath = os.path.join(demFolder, 'out-consolidated_stats.txt') if not os.path.exists(consolidatedStatsPath): # Stats file not present, recreate it. print 'Recreating missing stats file: ' + consolidatedStatsPath # Get paths to the files of interest # This logic must be sync-ed up with cleanBatch(). lidarDiffPath = os.path.join(demFolder, 'out-diff.csv') interDiffPath = os.path.join(demFolder, 'out_inter_diff_summary.csv') fireDiffPath = os.path.join(demFolder, 'out_fireball_diff_summary.csv') fireLidarDiffPath = os.path.join(demFolder, 'out_fireLidar_diff_summary.csv') fractionValidPath = os.path.join(demFolder, 'valid_pixel_fraction.txt') process_icebridge_batch.consolidateStats(lidarDiffPath, interDiffPath, fireDiffPath, fireLidarDiffPath, dem, consolidatedStatsPath, fractionValidPath, None, options.skipGeo) # Now the consolidated file should always be present with open(consolidatedStatsPath, 'r') as f: statsText = f.read() # Write info to summary file try: batchInfoLog.write('%d, %d, %s, %f, %f, %s\n' % (frames[0], frames[1], statsText, blendDiffResults['Mean'], fireballBlendDiffResults['Mean'], statsLine)) except: # Bugfix for corrupted data print("Problem parsing frame: " + str(frames[0])) # Keep a list of batches that did not generate an output DEM parts = statsText.split(',') if len(parts) <= 2: print("Cannot parse " + consolidatedStatsPath + ", skipping.") else: if (float(parts[0]) == 0) and (float(parts[1]) == 0) and (float(parts[2]) == -999): if os.path.exists(dem): # Handle the case where the statistics are bad for some reason errorCode = 0 errorText = 'Success but statistics are bad' else: # A real failure, figure out the cause batchFolder = os.path.dirname(dem) (errorCode, errorText) = getFailureCause(batchFolder) #print str((errorCode, errorText)) #if errorCode < 0: # Debug code for unknown errors #print str((errorCode, errorText)) #print statsText #print batchFolder #raise Exception('DEBUG') failureLog.write('%d, %d, %d, %s\n' % (frames[0], frames[1], errorCode, errorText)) # Make a link to the DEM thumbnail file in our summary folder hillshadePath = os.path.join(demFolder, 'out-blend-DEM_HILLSHADE_browse.tif') if os.path.exists(hillshadePath): thumbName = ('dem_%05d_%05d_browse.tif' % (frames[0], frames[1])) thumbPath = os.path.join(options.outputFolder, thumbName) icebridge_common.makeSymLink(hillshadePath, thumbPath, verbose=False) else: # If the DEM thumbnail does not exist, look for the input frame thumbnail. inPath = os.path.join(demFolder, 'first_image_browse.tif') thumbName = ('input_%05d_browse.tif' % (frames[0])) thumbPath = os.path.join(badImageFolder, thumbName) if os.path.exists(inPath): icebridge_common.makeSymLink(inPath, thumbPath, verbose=False) # Make a link to the ortho thumbnail file in our summary folder orthoPath = os.path.join(demFolder, icebridge_common.orthoPreviewFileName()) if os.path.exists(orthoPath): thumbName = ('ortho_%05d_%05d_browse.jpg' % (frames[0], frames[1])) thumbPath = os.path.join(options.outputFolder, thumbName) icebridge_common.makeSymLink(orthoPath, thumbPath, verbose=False) # End loop through expected DEMs and writing log files batchInfoLog.close() failureLog.close() print 'Finished generating flight summary in folder: ' + options.outputFolder print("Wrote: " + batchInfoPath) print("Wrote: " + failedBatchPath) # The parent folder is where the runs AN_... and GR_..., etc., are # stored. Usually it is the current directory. def main(argsIn): '''Parse arguments and call the processing function''' try: # Sample usage: # python generate_flight_summary.py --yyyymmdd 20091016 --site AN usage = '''generate_flight_summary.py <options>''' parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--yyyymmdd", dest="yyyymmdd", required=True, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", required=True, help="Name of the location of the images (AN, GR, or AL).") parser.add_argument("--output-folder", dest="outputFolder", default=None, help="Name of the output folder. If not specified, " + \ "use something like AN_YYYYMMDD.") parser.add_argument("--parent-folder", dest="parentFolder", default=os.getcwd(), help="The folder having all the runs.") parser.add_argument("--skip-kml-gen", action="store_true", dest="skipKml", default=False, help="Skip combining kml files.") parser.add_argument("--skip-geo-center", action="store_true", dest="skipGeo", default=False, help="Skip computing the center of the tile, which is slow.") parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on.') options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) if options.outputFolder is None: options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd) run = run_helper.RunHelper(options.site, options.yyyymmdd, options.parentFolder) generateFlightSummary(run, options) return 0 # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/get_date_list.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Compile a list of all the dates with data available import os, sys, optparse, datetime, subprocess, re # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_alg_utils, asp_geo_utils, icebridge_common asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] #------------------------------------------------------------------------------ # Constants def fetchAndParseIndexFile(folderUrl, path, parsedPath, fileType): '''Retrieve the index file for a folder of data and create a parsed version of it that contains frame number / filename pairs.''' # Set up the command cookiePaths = ' -b ~/.urs_cookies -c ~/.urs_cookies ' curlOpts = ' -n -L ' cmd = 'curl ' + cookiePaths + curlOpts + folderUrl + ' > ' + path # Download the file print cmd p = subprocess.Popen(cmd, shell=True, universal_newlines=True) os.waitpid(p.pid, 0) # Find all the file names in the index file and # dump them to a new index file print 'Extracting file name list from index.html file...' with open(path, 'r') as f: indexText = f.read() # Extract just the file names if fileType == 'image': fileList = re.findall(">[0-9_]*.JPG", indexText) # For each entry that matched the regex, record: the "frame" number, the file name. with open(parsedPath, 'w') as f: for x in fileList: if fileType == 'image': f.write(x[12:17] +', '+ x[1:] + '\n') def main(argsIn): # Command line parsing try: usage = "usage: get_date_list.py output_path" parser = optparse.OptionParser(usage=usage) # This call handles all the parallel_mapproject specific options. (options, args) = parser.parse_args(argsIn) if len(args) != 1: print 'Error: Missing output path.' print usage return -1 outputPath = os.path.abspath(args[0]) except optparse.OptionError as msg: raise Exception(msg) # TODO: Move into a common function! # Verify that required files exist home = os.path.expanduser("~") if not (os.path.exists(home+'/.netrc') and os.path.exists(home+'/.urs_cookies')): print 'Missing a required authentication file! See instructions here:' print ' https://nsidc.org/support/faq/what-options-are-available-bulk-downloading-data-https-earthdata-login-enabled' return -1 topIndexPath = outputPath + '_top.csv' tempIndexPath = outputPath + '_temp.csv' # Get the top level index TOP_URL = 'https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/' print 'Fetching top level index from: ' + TOP_URL icebridge_common.fetchFile(TOP_URL, topIndexPath) with open(topIndexPath, 'r') as f: topText = f.read() # Find all the sub folders in this file matches = re.findall(">[0-9_ANGR]*_NASA", topText) missionList = [x[1:] for x in matches] allDates = [] # Loop through the sub folders for mission in missionList: missionUrl = TOP_URL + mission print 'Checking mission at: ' + missionUrl icebridge_common.fetchFile(missionUrl, tempIndexPath) site = mission[5:7] with open(tempIndexPath, 'r') as f: missionText = f.read() matches = re.findall(">[0-9]*_raw", missionText) dateList = [x[1:] for x in matches] for date in dateList: yyyymmdd = date[4:8] + date[0:4] allDates.append( (yyyymmdd, site) ) with open(outputPath, 'w') as f: for date in allDates: f.write(date[0] +', '+ date[1] +'\n') print 'Wrote out ' + str(len(allDates)) + ' dates to file.' print 'Finished!' # Clean up os.remove(topIndexPath) os.remove(tempIndexPath) if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/icebridge_common.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Icebridge utility functions import os, sys, datetime, time, subprocess, logging, re, hashlib, string import psutil, errno, getpass, glob # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../IceBridge') # for dev ASP pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_alg_utils, asp_geo_utils, asp_image_utils, asp_file_utils asp_system_utils.verify_python_version_is_supported() def switchWorkDir(): '''A work directory must be set before running a qsub job, and here we switch to it.''' workDir = "" if 'OIB_WORK_DIR' in os.environ: workDir = os.environ['OIB_WORK_DIR'] if os.path.isdir(workDir): os.chdir(workDir) else: raise Exception("Work directory does not exist: " + workDir) def getUser(): '''Return the current user name.''' return getpass.getuser() def fullPath(script): '''The full path to a script on the icebridge folder.''' basepath = os.path.dirname(os.path.realpath(__file__)) return os.path.join(basepath, script) def outputFolder(site, yyyymmdd): '''The output folder name.''' return site + '_' + yyyymmdd def makeSymLink(oldFile, newFile, verbose=True): '''Safely create a symlink''' oldPath = os.path.abspath(oldFile) try: asp_system_utils.mkdir_p(os.path.dirname(newFile)) if verbose: print("ln -s " + oldPath + " " + newFile) os.symlink(oldPath, newFile) except OSError as e: if e.errno == errno.EEXIST: os.remove(newFile) os.symlink(oldPath, newFile) def getSmallestFrame(): '''Return the smallest possible frame number.''' return 0 def getLargestFrame(): '''Return the largest possible frame number.''' return 99999999 # 100 million should be enough def fileExtension(filename): '''Convenience function to get the file extension.''' return os.path.splitext(filename)[1] def hasImageExtension(filename): '''Return true if the file is a recognized image extension.''' extension = fileExtension(filename).lower() validExtensions = ['.tif', '.jpg', '.jpeg', '.ntf'] if extension in validExtensions: return True return False def getRunStatsFile(): return 'runStats.txt' def getCameraFolder(outputFolder): return os.path.join(outputFolder, 'camera') def getImageFolder(outputFolder): return os.path.join(outputFolder, 'image') def getJpegFolder(outputFolder): return os.path.join(outputFolder, 'jpeg') def getOrthoFolder(outputFolder): return os.path.join(outputFolder, 'ortho') def getFireballFolder(outputFolder): return os.path.join(outputFolder, 'fireball') def getCorrFireballFolder(outputFolder): return os.path.join(outputFolder, 'corr_fireball') def getLidarFolder(outputFolder): return os.path.join(outputFolder, 'lidar') def getProcessedFolder(outputFolder): return os.path.join(outputFolder, 'processed') def getPairedLidarFolder(lidarFolder): return os.path.join(lidarFolder, 'paired') def getNavFolder(outputFolder): return os.path.join(outputFolder, 'nav') def getNavCameraFolder(outputFolder): return os.path.join(outputFolder, 'nav_camera') def getLabelFolder(outputFolder): return os.path.join(outputFolder, 'labeled') def getLabelOrthoFolder(outputFolder): return os.path.join(outputFolder, 'label_ortho') def getConvertedLidarIndexFile(lidarFolder): return os.path.join(lidarFolder, 'converted_lidar_index.csv') def getPairedIndexFile(pairedFolder): return os.path.join(pairedFolder, 'paired_lidar_index.csv') def folderToType(folder): '''If input is myRun/ortho, return "ortho". Same for "fireball", "lidar", etc.''' return os.path.basename(folder) def htmlIndexFile(folder): '''Return the html index file for this folder (if appropriate)''' return os.path.join(folder, folderToType(folder) + "_index.html") def csvIndexFile(folder): '''Return the clean csv version of the html index file for this folder (if appropriate) ''' return htmlIndexFile(folder) + ".csv" def getJpegDateTime(filepath): '''Get the date and time from a raw jpeg file.''' # TODO: For some files it is probably in the name. # Use this tool to extract the metadata cmd = [asp_system_utils.which('gdalinfo'), filepath] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) out, err = p.communicate() lines = out.split('\n') for line in lines: if 'EXIF_DateTimeOriginal' not in line: continue parts = line.replace('=',' ').split() dateString = parts[1].strip().replace(':','') timeString = parts[2].strip().replace(':','') return (dateString, timeString) raise Exception('Failed to read date/time from file: ' + filepath) def getPixelSize(filepath): '''Get the pixel size from a GeoTiff''' cmd = [asp_system_utils.which('gdalinfo'), filepath] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) out, err = p.communicate() lines = out.split('\n') for line in lines: m = re.match("^.*?Pixel\s+Size\s*=\s*\((.*?)\s*,", line) if m: return float(m.group(1)) # If nothing works return -1.0 def jpegToImageFile(jpegFile, orthoFile): '''Given AN_20121107/jpeg/2012_11_08_17415.JPG and DMS_1381721_17415_20121108_00303910.tif create AN_20121107/image/DMS_20121108_003039_17415.tif. This can throw an exception.''' jpegFolder = os.path.dirname(jpegFile) imageFolder = getImageFolder(os.path.dirname(jpegFolder)) if not os.path.exists(jpegFolder): raise Exception("Missing " + jpegFolder) if not os.path.exists(imageFolder): raise Exception("Missing " + imageFolder) if not os.path.exists(jpegFile): raise Exception("Missing " + jpegFile) frame = getFrameNumberFromFilename(jpegFile) # This was the original implementation, but it can give wrong results # when the jpeg has incorrect time. #(dateString, timeString) = getJpegDateTime(jpegFile) [dateString, timeString] = parseTimeStamps(orthoFile) outputName = formFilePrefix(dateString, timeString, frame) + ".tif" outputPath = os.path.join(imageFolder, outputName) return outputPath def makeJpegFileName(run, frame): '''Generate a file name like: 2016_07_19_00015.JPG''' return ('%s_%05d.JPG' % (run.yyyy_mm_dd(), frame)) def makeLabelFileName(run, frame): '''Generate a file name like: 2016_07_19_00015_classified.tif''' return ('%s_%05d_classified.tif' % (run.yyyy_mm_dd(), frame)) def makeLabelOrthoFileName(run, frame): '''Generate a file name like: 2016_07_19_00015_classified_ortho.tif''' return ('%s_%05d_classified_ortho.tif' % (run.yyyy_mm_dd(), frame)) def projectionBoundsFile(folder): return os.path.join(folder, 'projection_bounds.csv') def readProjectionBounds(indexFile): '''Read projection bunds for each ortho image.''' bounds = {} # Nothing to if not os.path.exists(indexFile): return bounds with open(indexFile, 'r') as f: for line in f: parts = line.strip().split(',') for v in range(len(parts)): parts[v] = parts[v].strip() if parts[v] != "": parts[v] = float(parts[v].strip()) if len(parts) != 6: # Maybe when we wrote it last time we got interrupted. # Note that the last value is just an empty space. continue frame = int(parts[0]) bounds[frame] = (parts[1], parts[2], parts[3], parts[4]) return bounds def writeProjectionBounds(indexFile, bounds): '''Write projection bounds for all images.''' with open(indexFile, 'w') as f: for frame in sorted(bounds.keys()): a,b,c,d = bounds[frame] vals = [frame, a, b, c, d] for val in vals: f.write(str(val) + ', ') f.write('\n') def readLinesInSet(fileName): '''Read the lines from a file as elements in a set, while stripping all leading and trailing spaces.''' filesSet = set() if not os.path.exists(fileName): return filesSet with open(fileName, 'r') as f: for line in f: line = line.strip() filesSet.add(line) return filesSet def logFilePrefix(): return 'icebridge_batch_log' def validFilesPrefix(): '''This one is used in multiple places.''' return 'valid_files' def manager_log_prefix(): return 'pleiades_manager_log' def validFilesList(folder, startFrame, stopFrame): '''File containing the list of fetched files that were validated. for the given range. Need the range so that when we validate in parallel, we do not overwrite the same file. Later these validation files will be merged.''' prefix = validFilesPrefix() + '_' + str(startFrame) + '_' + str(stopFrame) + '.csv' return os.path.join(folder, prefix) def updateValidFilesListFromDisk(filesList, filesSet): '''Update the current set of valid files with any new info from disk.''' # Nothing to if not os.path.exists(filesList): return filesSet print("Reading: " + filesList) with open(filesList, 'r') as f: for line in f: line = line.strip() filesSet.add(line) return filesSet def writeValidFilesList(filesList, filesSet): '''Write the list of valid files to disk.''' print("Writing: " + filesList) with open(filesList, 'w') as f: for filename in sorted(filesSet): f.write(filename + '\n') def readIndexFile(parsedIndexPath, prependFolder = False): '''Read an index file having frame number, filename, and url it came from.''' frameDict = {} urlDict = {} with open(parsedIndexPath, 'r') as f: for line in f: parts = line.strip().split(',') if len(parts) < 3: # Odd index file raise Exception("Invalid index file: " + parsedIndexPath) frameNumber = int(parts[0]) frameDict[frameNumber] = parts[1].strip() if prependFolder: frameDict[frameNumber] = os.path.join(os.path.dirname(parsedIndexPath), frameDict[frameNumber]) urlDict[frameNumber] = parts[2].strip() return (frameDict, urlDict) def writeIndexFile(indexPath, frameDict, urlDict): '''Write an index file, optionally with urls.''' with open(indexPath, 'w') as f: for frame in sorted(frameDict.keys()): frameName = frameDict[frame] urlName = "" if frame in urlDict: urlName = urlDict[frame] f.write(str(frame) + ', ' + frameName + ', ' + urlName + '\n') def isValidImage(filename): '''Check that an image file is not corrupted in some way. This check is not enough.''' if not os.path.exists(filename): return False # Must always wipe .aux.xml. Always. Otherwise, if this function is called first time # it may return False, but if called second time it may return True. auxFile = filename + '.aux.xml' if os.path.exists(auxFile): os.remove(auxFile) gdalinfoPath = asp_system_utils.which("gdalinfo") cmd = gdalinfoPath + ' -stats ' + filename if os.path.exists(auxFile): os.remove(auxFile) p = subprocess.Popen(cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) output, error = p.communicate() if p.returncode != 0: return False if error is not None: output += error m = re.match("^.*?(Block\s+failed|Premature\s+end)", output, re.IGNORECASE|re.MULTILINE|re.DOTALL) if m: return False return True def isDEM(filename): '''Return true if a file is a recognized DEM.''' if 'crop' in filename or 'CMAP' in filename: return False # ignore some stray files return (len(filename) >= 8 and filename[-8:] == '_DEM.tif') def isLidar(filename): '''Return true if the file is an input (not converted) lidar format''' extension = fileExtension(filename) return (extension == '.qi') or (extension == '.hdf5') or \ (extension == '.h5') or (extension == '.TXT') def isValidLidarCSV(filename): '''Check that a lidar csv file is valid. It must have at least threee entries on one line.''' if not os.path.exists(filename): return False with open(filename, "r") as ins: array = [] for line in ins: # This will help with lines which only have spaces line = line.strip() # Skip empty lines if len(line) == 0: continue # Skip lines starting with spaces followed by # m = re.match("^\s*\#", line) if m: continue line = line.replace(',', ' ') line = line.replace('\t', ' ') vals = line.split(' ') num = 0 for val in vals: if len(val) == 0: continue num += 1 if num >= 3: return True else: return False return False def getLidarCsvFormat(filename): '''Returns the ASP CSV format string to use for a lidar file''' extension = fileExtension(filename) if extension == '.TXT': # LVIS return '5:lat,4:lon,6:height_above_datum' return '1:lat,2:lon,3:height_above_datum' # ATM def getCameraGsdAndBounds(imagePath, cameraPath, logger, referenceDem=None, projString=""): '''Compute the GSD and bounding box of a single camera. Use the DEM is provided, otherwise use the datum.''' # Run GSD tool tool = asp_system_utils.which('camera_footprint') cmd = ('%s --quick --datum wgs84 -t nadirpinhole %s %s' % (tool, imagePath, cameraPath)) if referenceDem: cmd += ' --dem-file ' + referenceDem cmd = cmd.split() if projString: cmd.append('--t_srs',) cmd.append(projString) logger.info(" ".join(cmd)) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) textOutput, err = p.communicate() logger.info(textOutput) # Extract the gsd from the output text m = re.findall(r"Computed mean gsd: (\d+\.*[0-9e\-]*)", textOutput) if len(m) != 1: # An unknown error occurred, move on. raise Exception('Unable to compute GSD for file: ' + cameraPath) gsd = float(m[0]) # Extract the bounding box from the output text print(textOutput) m = re.findall( r"Min: \(([0-9e\-\.\+]*), ([0-9e\-\.\+]*)\) width: ([0-9e\-\.\+]*) height: ([0-9e\-\.\+]*)", textOutput) if (len(m) != 1) and (len(m[0]) != 4): # An unknown error occurred, move on. raise Exception('Unable to compute GSD for file: ' + cameraPath) bounds = [float(x) for x in m[0]] return (gsd, bounds) def getGsdFromMapproject(imagePath, cameraPath, logger, lidarDem, referenceDem): '''Compute the GSD by quering mapproject.''' # Try to compute the gsd first from the lidar dem, and if that fails, # from the reference dem. gsd = -1 for dem in [lidarDem, referenceDem]: tmpOutFile = cameraPath + ".tmp.tif" tool = asp_system_utils.which('mapproject') cmd = ('%s %s %s %s %s --query-projection' % (tool, dem, imagePath, cameraPath, tmpOutFile)) cmd = cmd.split() logger.info(" ".join(cmd)) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) textOutput, err = p.communicate() logger.info(textOutput) # Extract the gsd from the output text m = re.findall(r"Output pixel size:\s*(.*?)\n", textOutput) if len(m) == 1: gsd = float(m[0]) break if gsd == -1: raise Exception('Unable to compute GSD for file: ' + cameraPath) os.system("rm -f " + tmpOutFile) return gsd def getCorrectedFireballDems(outputFolder): '''Get a dictionary of the corrected fireball DEMs, with path prepended to them.''' fireballFolder = getFireballFolder(outputFolder) corrFireballFolder = getCorrFireballFolder(outputFolder) fireballIndexPath = csvIndexFile(fireballFolder) if not os.path.exists(fireballIndexPath): raise Exception("Error: Missing fireball index file: " + fireballIndexPath + ".") (fireballFrameDict, fireballUrlDict) = \ readIndexFile(fireballIndexPath, prependFolder = True) orthoFolder = getOrthoFolder(outputFolder) orthoIndexPath = csvIndexFile(orthoFolder) if not os.path.exists(orthoIndexPath): raise Exception("Error: Missing ortho index file: " + orthoIndexPath + ".") (orthoFrameDict, orthoUrlDict) = \ readIndexFile(orthoIndexPath, prependFolder = True) correctedFireballFrameDict = {} for frame in fireballFrameDict.keys(): fireballDem = fireballFrameDict[frame] # Get the corrected one corrDem = os.path.join(corrFireballFolder, os.path.basename(fireballDem)) # This is a bugfix. Sometimes fireball DEMs for one flight # actually are for the next flight. All this sorry story is # because sometimes flights extend beyond midnight, and the # book-keeping gets confused. This was fixed for orthos. Here, if # a DEM has a different date than the ortho, ignore it. if frame not in orthoFrameDict: continue [orthoDateString, orthoTimeString] = parseTimeStamps(orthoFrameDict[frame]) [fireballDateString, fireballTimeString] = parseTimeStamps(fireballDem) if orthoDateString != fireballDateString: continue correctedFireballFrameDict[frame] = corrDem return correctedFireballFrameDict def getCameraGsdAndBoundsRetry(imagePath, cameraPath, logger, referenceDem, projString=""): '''As getCameraGsd, but retry with the datum if the DEM fails.''' try: # Compute GSD using the DEM # - Only need the projection string when not using a DEM results = getCameraGsdAndBounds(imagePath, cameraPath, logger, referenceDem) except: # If that failed, try intersecting with the datum. logger.info('DEM intersection failed, trying with datum...') results = getCameraGsdAndBounds(imagePath, cameraPath, logger, None, projString) return results def getImageCameraPairs(imageFolder, cameraFolder, startFrame, stopFrame, logger): '''Return a list of paired image/camera files.''' # TODO: This is not robust. Need to create an index of all images rather than # reading whatever is in that directory. # Get a list of all the input files allImageFiles = getTifs(imageFolder) allCameraFiles = getByExtension(cameraFolder, '.tsai') allImageFiles.sort() # Put in order so the frames line up allCameraFiles.sort() # Keep only the images and cameras within the given range imageFiles = [] imageFrames = [] for image in allImageFiles: frame = getFrameNumberFromFilename(image) if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue imageFiles.append(image) imageFrames.append(frame) cameraFiles = [] cameraFrames = [] for camera in allCameraFiles: frame = getFrameNumberFromFilename(camera) if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue cameraFiles.append(camera) cameraFrames.append(frame) # Remove files without a matching pair goodImages = [] goodCameras = [] for frame in imageFrames: goodImages.append(frame in cameraFrames) for frame in cameraFrames: goodCameras.append(frame in imageFrames) imageFiles = [p[0] for p in zip(imageFiles, goodImages ) if p[1]] cameraFiles = [p[0] for p in zip(cameraFiles, goodCameras) if p[1]] logger.info('Of %d input images in range, using %d with camera files.' % (len(goodImages), len(imageFiles))) if len(imageFiles) < 2: logger.error('Not enough input pairs exist to continue, quitting!') return [] # Get full paths imageFiles = [os.path.join(imageFolder, f) for f in imageFiles ] cameraFiles = [os.path.join(cameraFolder,f) for f in cameraFiles] numFiles = len(imageFiles) if (len(cameraFiles) != numFiles): logger.error('process_icebridge_run.py: counted ' + str(len(imageFiles)) + \ ' image files.\n' + 'and ' + str(len(cameraFiles)) + ' camera files.\n'+ 'Error: Number of image files and number of camera files must match!') return [] imageCameraPairs = zip(imageFiles, cameraFiles) return imageCameraPairs def batchFolderPrefix(): '''The name of the batch folder starts like this.''' return "batch_" def batchFolderName(startFrame, stopFrame, bundleLength): '''The name of the folder containing processed data for given frames.''' return ('%s%05d_%05d_%d' % (batchFolderPrefix(), startFrame, stopFrame, bundleLength)) def frameToFile(frame, suffix, processFolder, bundleLength): '''For a given frame, find the corresponding file in the batch folder with given suffix.''' # We count here on the convention for writing batch folders prefix = ('%s%05d_*_%d' % (batchFolderPrefix(), frame, bundleLength)) batchFolderGlob = os.path.join(processFolder, prefix + '/*' + suffix) matches = glob.glob(batchFolderGlob) if len(matches) == 0: #print("Error: No matches for: " + batchFolderGlob + ". Will skip this frame.") return "", "" if len(matches) > 1: # This I believe is an artifact of running the entire flight twice, # with different value for --start-frame each time. # For now, just take whatever is there, at some point this needs to be sorted out. print("Warning: Found more than one answer matching glob:" + batchFolderGlob) print("Values are: " + " ".join(matches)) #return "", "" return matches[0], os.path.dirname(matches[0]) def findInvalidFrames(validFilesSet, outputFolder, fileType): '''Out of the files of a given type, find the ones that are not in the given set of valid images.''' if fileType == 'ortho': dataFolder = getOrthoFolder(outputFolder) elif fileType == 'jpeg': dataFolder = getJpegFolder(outputFolder) else: raise Exception("Unknown file type: " + fileType) # To be able to study which files are in which set, make all paths consistenty # absolute localOutputFolder = os.path.basename(outputFolder) localFileSet = set() for fileName in validFilesSet: fileName = os.path.abspath(fileName) # Correct for wrong path to folder (fragile) #m = re.match("^.*?" + localOutputFolder + "/(.*?)$", fileName) #if not m: continue #fileName = os.path.abspath(os.path.join(outputFolder, m.group(1))) localFileSet.add(fileName) indexPath = csvIndexFile(dataFolder) if not os.path.exists(indexPath): raise Exception("Missing file: " + indexPath) (frameDict, urlDict) = readIndexFile(indexPath, prependFolder = True) badFrameDict = {} for frame in frameDict.keys(): fileName = os.path.abspath(frameDict[frame]) # Correct for wrong path to folder (fragile) #m = re.match("^.*?" + localOutputFolder + "/(.*?)$", fileName) #if not m: continue #fileName = os.path.abspath(os.path.join(outputFolder, m.group(1))) if fileName not in localFileSet: badFrameDict[frame] = fileName return badFrameDict def orthoListToRerun(validFilesSet, outputFolder, startFrame, stopFrame): '''See for which files we need to redo ortho2pinhole.''' invalidJpegs = findInvalidFrames(validFilesSet, outputFolder, 'jpeg') invalidOrthos = findInvalidFrames(validFilesSet, outputFolder, 'ortho') trackedFrames = set() orthoList = os.path.join(outputFolder, 'orthosToRerun.txt') with open(orthoList, 'w') as f: for frame in sorted(invalidJpegs.keys() + invalidOrthos.keys()): if frame in trackedFrames: continue # we already saw this if int(frame) < startFrame or int(frame) > stopFrame: continue trackedFrames.add(frame) f.write(str(frame) + '\n') return (orthoList, len(trackedFrames)) def getBatchFolderFromBatchLine(line): '''Returns something like /path/to/AN_20111012/processed/batch_125_126_2.''' # Extract just the desired folder name m = re.match('^.*?\s([^\s]*?' + batchFolderPrefix() +'\d+_\d+_\d+)', line) if m: return m.group(1) return "" def getFrameRangeFromBatchFolder(folder): '''Returns (startFrame, endFrame) for a batch folder.''' '''This is also used to parse a command in a batch file.''' # Extract just the desired folder name m = re.match('^.*?' + batchFolderPrefix() + '([0-9]+)_([0-9]+)', folder) if not m: raise Exception('Failed to find batch frames in folder: ' + folder) return (int(m.group(1)), int(m.group(2))) def xmlFile(filename): '''Return the matching xml file path for the input file.''' if (len(filename) >= 8 and filename[-7:-4] == 'DEM'): # DEM.tif and DEM.tfw #file_DEM.tif and file_DEM.tfw becomes file.xml return filename[:-8] + '.xml' # For other types return filename + '.xml' def xmlToImage(filename): if fileExtension(filename) != '.xml': raise Exception("Not an XML file: " + filename) return filename[:-4] def tfwFile(filename): '''Return the matching tfw file path for the input file.''' return filename[:-4] + '.tfw' def isFloat(value): '''Return true if the input value can be converted to a float.''' try: float(value) return True except: return False def hasValidChkSum(filename, logger): '''Some files have an xml file containing the chksum. If so, varify its validity. This applies to orthoimages, DEMs, and tfw files.''' #isTfw = (fileExtension(filename) == '.tfw') if not os.path.exists(filename): logger.info("File does not exist: " + filename) return False baseFile = os.path.basename(filename) xml_file = xmlFile(filename) if not os.path.exists(xml_file): logger.info("File does not exist: " + xml_file) return False expectedChksum = '' chkSumCount = 0 currFile = '' with open(xml_file, "r") as xf: for line in xf: # There can be multiple files m = re.match("^.*?\<DistributedFileName\>(.*?)\<", line, re.IGNORECASE) if m: currFile = m.group(1) # Encompass both kinds of checksum m = re.match("^.*?\<Checksum\>(\w+)(\||\<)", line, re.IGNORECASE) if m: chkSumCount += 1 # There can be multiple checksums. The file can give a hint: if currFile != '': if currFile == baseFile: expectedChksum = m.group(1) else: # Just pick the first chksum if chkSumCount == 1: expectedChksum = m.group(1) actualChksum = hashlib.md5(open(filename,'rb').read()).hexdigest() if actualChksum != expectedChksum or actualChksum == '' or expectedChksum == '': logger.info("Computed chksum: " + str(actualChksum) + " in " + filename) logger.info("Expected chksum: " + str(expectedChksum) + " in " + filename) return False return True def isValidTfw(filename, logger): '''This file must have 6 lines of floats and a valid chksum.''' if fileExtension(filename) != '.tfw': return False if not hasValidChkSum(filename, logger): return False count = 0 with open(filename, "r") as xf: for line in xf: line = line.strip() if isFloat(line): count += 1 return (count >= 6) def parseLatitude(filename): '''Find the <PointLatitude> value in the given file.''' if not os.path.exists(filename): raise Exception("Could not find file: " + filename) latitude = None with open(filename, "r") as xf: for line in xf: m = re.match("^.*?\<PointLatitude\>(.*?)\<", line, re.IGNORECASE) if m: latitude = float(m.group(1)) break if latitude is None: raise Exception("Could not parse positive or negative latitude from: " + filename) return latitude def getCameraFileName(imageFileName): '''Get the camera file name we associate with an input image file.''' return imageFileName.replace('.tif', '.tsai') # This function works for raw images, camera tsai files, orthoimages, # DEMs, lvis, OSSP label files, atm1, and atm2 files. def getFrameNumberFromFilename(filename): # Match 2009_10_16_<several digits>.JPG m = re.match("^.*?\d+\_\d+\_\d+\_(\d+)\.JPG", filename, re.IGNORECASE) if m: return int(m.group(1)) # Match DMS_20111012_145559_00156.tif or .tsai (created by our python scripts) m = re.match("^.*?DMS\_\d+\_\d+\_(\d+)\.(tif|tsai)", filename, re.IGNORECASE) if m: return int(m.group(1)) # Match DMS_1000109_03939_20091016_23310503_V02.tif (fetched from NSIDC) m = re.match("^.*?DMS\_\d+\_(\d+)\w+\.tif", filename, re.IGNORECASE) if m: return int(m.group(1)) # Match IODMS3_20111018_14295436_00347_DEM.tif m = re.match("^.*?IODMS[a-zA-Z0-9]*?\_\d+\_\d+\_(\d+)\w+DEM\.tif", filename, re.IGNORECASE) if m: return int(m.group(1)) # Match ILVIS2_AQ2015_0929_R1605_060226.TXT m = re.match("^.*?ILVIS.*?_(\d+)(.TXT)", filename, re.IGNORECASE) if m: return int(m.group(1)) # Match ILATM1B_20091016_193033.atm4cT3.qi # or ILATM1B_20160713_195419.ATM5BT5.h5 m = re.match("^.*?ILATM\w+\_\d+\_(\d+)\.\w+\.(h5|qi)", filename, re.IGNORECASE) if m: return int(m.group(1)) # Match 2016_07_19_00008_classified.tif or .h5 m = re.match("^.*?\d+\_\d+\_\d+\_(\d+)_classified\.[h5|tif]", filename, re.IGNORECASE) if m: return int(m.group(1)) raise Exception('Could not parse: ' + filename) def getTifs(folder, prependFolder=False): '''Get tif files in given directory, ignoring _sub files. This returns the files without sorting.''' files = [] for f in os.listdir(folder): # Skip non-image files and sub-images ext = os.path.splitext(f)[1] if (ext != '.tif') or ('_sub' in f) or ('pct.tif' in f) or ('_hillshade_' in f): continue if prependFolder: files.append(os.path.join(folder, f)) else: files.append(f) return files def getJpegs(folder): # TODO: This function should not be used as it is not robust. # Rather, look up the index, and read only files listed there. '''Get jpeg files in given directory. This returns the files without sorting or the folder name prepended to them.''' files = [] for f in os.listdir(folder): ext = os.path.splitext(f)[1] if ext != '.JPG': continue files.append(f) return files def getByExtension(folder, ext): # TODO: This function should not be used as it is not robust. # Rather, look up the index, and read only files listed there. '''Get files with given extension. This returns the files without sorting or the folder name prepended to them.''' files = [] for f in os.listdir(folder): curr_ext = os.path.splitext(f)[1] if ext != curr_ext: continue files.append(f) return files def getDems(folder): # TODO: This function should not be used as it is not robust. # Rather, look up the index, and read only files listed there. '''Get DEM files. This returns the files without sorting or the folder name prepended to them.''' files = [] for f in os.listdir(folder): if not isDEM(f): continue files.append(f) return files def getLidar(folder): # TODO: This function should not be used as it is not robust. # Rather, look up the index, and read only files listed there. '''Get LIDAR files. This returns the files without sorting or the folder name prepended to them.''' files = [] for f in os.listdir(folder): if not isLidar(f): continue files.append(f) return files def getMatchingFrames(inputFiles, candidateFiles): '''Given a list of input files and candidate files, returns a list of candidate files having the same frame numbers as the input files in the same order. An entry will be 'None' if there is no matching frame.''' # Init output structure numFiles = len(inputFiles) outputList = [] for i in range(0,numFiles): outputList.append(None) numMatched = 0 # Loop through all the candidate files for c in candidateFiles: candidateFrame = getFrameNumberFromFilename(c) # Compare them to each of the input files for i in range(0,numFiles): if outputList[i]: # Skip matched files continue inputFrame = getFrameNumberFromFilename(inputFiles[i]) if inputFrame == candidateFrame: # If the frames match, record the file outputList[i] = c numMatched += 1 if numMatched == numFiles: # Quit once all files are matched return outputList return outputList def parseDateTimeStrings(dateString, timeString, useTimeFix, returnMinAndSecOnly): '''Parse strings in the format 20110323_17433900.''' MILLISECOND_TO_MICROSECOND = 10000 year = int(dateString[0:4]) month = int(dateString[4:6]) day = int(dateString[6:8]) hour = int(timeString[0:2]) minute = int(timeString[2:4]) second = int(timeString[4:6]) if returnMinAndSecOnly: return (minute, second) if useTimeFix: # Some files number the minutes and seconds from 1-60! minute = minute - 1 second = second - 1 usecond = 0 if len(timeString) > 6: usecond = int(timeString[6:8]) * MILLISECOND_TO_MICROSECOND try: result = datetime.datetime(year, month, day, hour, minute, second, usecond) return result except Exception as e: raise Exception('Caught exception processing dateString: ' + dateString +', timeString: ' + timeString +'\n with values: ' + str((year, month, day, hour, minute, second, usecond)) +'\n' + str(e)) def secondsSinceMidnightToHHMMSS(secondsSinceMidnight): '''Convert from integer number to HHMMSS string.''' hours, remainder = divmod(secondsSinceMidnight, 3600) minutes, seconds = divmod(remainder, 60) return ('%02d%02d%02d' % (hours, minutes, seconds)) def formFilePrefix(dateString, timeString, frame): '''Form a file with given numbers. This is used in more than one place.''' if len(timeString) > 6: timeString = timeString[0:6] # dump the fractions of a second return ('DMS_%s_%s_%05d') % (dateString, timeString, frame) def parseParts(fileName): '''This function parses pieces of a file. It is very related to formFilePrefix(), parseTimeStamps(), and getFrameNumberFromFilename()''' m = re.match("^(.*?)DMS_(\d+)_(\d+)_(\d+)(\..*?)$", fileName) if not m: return ["", "", "", "", ""] return [m.group(1), m.group(2), m.group(3), m.group(4), m.group(5)] def parseTimeStamps(fileName): '''Pull two six or eight digit values from the given file name as the time and date stamps.''' # Start by handling ILVIS2_AQ2011_1012_R1203_049752.TXT # Format is ILVIS1B_LOYYYY_MMDD_RYYMM_nnnnnn.xxx # where nnnnnn is number of seconds since UTC midnight of the day the data collection started # per http://nsidc.org/data/ilvis1b/versions/1 and # https://nsidc.org/data/ilvis1b m = re.match("^.*?ILVIS\d\_[A-Z][A-Z](\d\d\d\d)\_(\d\d\d\d)\_.*?\_(\d+)\.TXT", fileName, re.IGNORECASE) if m: lidarDateString = m.group(1) + m.group(2) secondsInDay = int(m.group(3)) lidarTimeString = secondsSinceMidnightToHHMMSS(secondsInDay) return [lidarDateString, lidarTimeString] fileName = os.path.basename(fileName) # Now look at something like: DMS_1100106_11985_20101026_19113275.tif m = re.match("^DMS\_(\d+)_(\d+)_(\d+)_(\d+)\.tif", fileName, re.IGNORECASE) if m: # The format is: a value, frame number, yyyymmdd, hhmmssss dateString = m.group(3) timeString = m.group(4) return [dateString, timeString] # This is somewhat fragile older code andling other cases fileName = fileName.replace('.', '_') fileName = fileName.replace('-', '_') parts = fileName.split('_') imageDateString = "" imageTimeString = "" for part in parts: if len(part) != 6 and len(part) != 8: continue if len(part) == 6: if part < '000000' or part > '999999': continue if len(part) == 8: if part < '00000000' or part > '99999999': continue if imageDateString == "" and len(part) == 8: # The date must always be 8 digits (YYYYMMDD) imageDateString = part continue if imageTimeString == "": # The time can be hhmmss or hhmmssff (ff = hundreds of seconds) imageTimeString = part continue if imageDateString == "": return [] if imageTimeString == "": return [] return [imageDateString, imageTimeString] def lidarFiles(lidarFolder): '''Find lidar files in given folder that are plain text, so either .TXT or .csv converted from ATM, etc. Note that the folder name is not prepended to the file names.''' # All files in the folder allFiles = os.listdir(lidarFolder) # See based on existing files if we are dealing with LVIS isLVIS = False for f in allFiles: m = re.match("^.*?ILVIS.*?\d+\.TXT", f, re.IGNORECASE) if m: isLVIS = True # Get just the files we converted to csv format or plain text LVIS files lidarFiles = [] for f in allFiles: extension = os.path.splitext(f)[1] if 'html.csv' in f: continue # skip index.html.csv if (not isLVIS and extension == '.csv') or (isLVIS and extension == '.TXT'): lidarFiles.append(f) lidarFiles.sort() lidarExt = '.csv' if isLVIS: lidarExt = '.TXT' return (lidarFiles, lidarExt, isLVIS) def alignFileName(): '''The name of a generated aligned DEM.''' return 'out-align-DEM.tif' def blendFileName(): '''The name of a generated blended DEM.''' return 'out-blend-DEM.tif' def orthoFileName(): '''The name of a generated ortho file.''' return 'out-ortho.tif' def footprintFileName(): '''The name of a generated footprint DEM.''' return 'out-trans-footprint-DEM.tif' def orthoPreviewFileName(): '''The name of a generated ortho preview file.''' return 'out-ortho-PREVIEW.jpg' def getAlignPrefix(outputFolder): return os.path.join(outputFolder, 'align/out') def getBundlePrefix(outputFolder): '''The name of the prefix for the bundle-adjusted cameras.''' return os.path.join(outputFolder, 'bundle/out') def alignedBundleStr(): '''The name of the prefix (sans folder) for the generated bundle-adjusted and pc_aligned camera files.''' return 'aligned_bundle/out' def getAlignedBundlePrefix(outputFolder): '''The name of the prefix for the bundle-adjusted cameras.''' return os.path.join(outputFolder, alignedBundleStr()) def lidar_pair_prefix(): return 'LIDAR_PAIR_' def findMatchingLidarFile(imageFile, lidarFolder): '''Given an image file, find the best lidar file to use for alignment.''' # Look in the paired lidar folder, not the original lidar folder. pairedFolder = getPairedLidarFolder(lidarFolder) pairedLidarFile = getPairedIndexFile(pairedFolder) if not os.path.exists(pairedLidarFile): raise Exception("Missing file: " + pairedLidarFile) (lidarDict, dummyUrlDict) = readIndexFile(pairedLidarFile, prependFolder = True) lidarFilesIn = sorted(lidarDict.values()) lidarFiles = [] # Verify that all the expected lidar files are there! for f in lidarFilesIn: if os.path.exists(f): lidarFiles.append(f) else: print ('WARNING: Expected paired lidar file ' + f + ' does not exist!') if len(lidarFiles) <= 0: raise Exception("Empty directory of pairs in " + pairedFolder) return findMatchingLidarFileFromList(imageFile, lidarFiles) def findMatchingLidarFileFromList(imageFile, lidarFiles): '''Find the best matching lidar file from a list.''' vals = parseTimeStamps(imageFile) if len(vals) < 2: raise Exception('Failed to parse the date and time from: ' + imageFile) useTimeFix = False returnMinAndSecOnly = False imageDateTime = parseDateTimeStrings(vals[0], vals[1], useTimeFix, returnMinAndSecOnly) #print 'INPUT = ' + str(imageDateTime) # Search for the matching file in the lidar folder. # - We are looking for the closest lidar time that starts BEFORE the image time. # - It is possible for an image to span lidar files, we will address that if we need to! bestTimeDelta = datetime.timedelta.max bestLidarFile = 'NA' zeroDelta = datetime.timedelta() # First see if we need correction for sometimes seconds going from 1 to 60. minMinSec = 60 maxMinSec = 0 for lidarPath in lidarFiles: vals = parseTimeStamps(lidarPath) if len(vals) < 2: continue # ignore bad files useTimeFix = False returnMinAndSecOnly = True (minute, second) = parseDateTimeStrings(vals[0], vals[1], useTimeFix, returnMinAndSecOnly) if second < minMinSec: minMinSec = second if second > maxMinSec: maxMinSec = second if minute < minMinSec: minMinSec = minute if minute > maxMinSec: maxMinSec = minute if minMinSec <= 0 and maxMinSec >= 60: raise Exception("The minute/second range goes from " + str(minMinSec) + " to " + str(maxMinSec)) useTimeFix = False if maxMinSec >= 60: useTimeFix = True #print 'Using lidar time fix!' for lidarPath in lidarFiles: vals = parseTimeStamps(lidarPath) if len(vals) < 2: continue # ignore bad files try: returnMinAndSecOnly = False lidarDateTime = parseDateTimeStrings(vals[0], vals[1], useTimeFix, returnMinAndSecOnly) #lidarDateTime = lidarDateTime + datetime.timedelta(hours=2, minutes=3, seconds=42) # Manual hack for flights with bad lidar times! except Exception as e: raise Exception('Failed to parse datetime for lidar file: ' + lidarPath + '\n' + 'Error is: ' + str(e)) #print 'THIS = ' + str(lidarDateTime) # Compare time to the image time timeDelta = abs(imageDateTime - lidarDateTime) #print 'DELTA = ' + str(timeDelta) # Select the closest lidar time # - Since we are using the paired files, the file time is in the middle # of the (large) file so being close to the middle should make sure the DEM # is fully covered by LIDAR data. if timeDelta < bestTimeDelta: bestLidarFile = lidarPath bestTimeDelta = timeDelta # Normal spacing seems to be 6.5 minutes but this must vary by flight. MAX_DELTA = datetime.timedelta(minutes=15) if (bestLidarFile == 'NA') or (bestTimeDelta > MAX_DELTA): errorMessage = 'Failed to find matching lidar file for image ' + imageFile if bestLidarFile: errorMessage += '\n--> Nearest lidar file was '+ bestLidarFile +' with delta ' + str(bestTimeDelta) raise Exception(errorMessage) #print bestLidarFile #print bestTimeDelta return bestLidarFile def fileNonEmpty(path): '''Make sure file exists and is non-empty.''' return os.path.exists(path) and (os.path.getsize(path) > 0) def fetchFile(url, outputPath): '''Retrieve one file using curl. Return True on success.''' # Set up the command cookiePaths = ' -b ~/.urs_cookies -c ~/.urs_cookies ' curlOpts = ' -n -L ' cmd = 'curl ' + cookiePaths + curlOpts + url + ' > ' + outputPath # Download the file print (cmd) p = subprocess.Popen(cmd, shell=True, universal_newlines=True) os.waitpid(p.pid, 0) return os.path.exists(outputPath) def partitionArray(arr, wid): '''Partition one array into sub-arrays, each of length at most wid.''' out = [] cur = [] start = 0 while (start < len(arr)): if len(cur) < wid: cur.append(arr[start]) else: out.append(cur[:]) cur = [arr[start]] start += 1 # Append the leftover elements if len(cur) > 0: out.append(cur[:]) return out # It is faster to invoke one curl command for multiple files. # Do not fetch files that already exist. Note that we expect # that each file looks like outputFolder/name.<ext>, # and each url looks like https://.../name.<ext>. def fetchFilesInBatches(baseCurlCmd, batchSize, dryRun, outputFolder, files, urls, logger): '''Fetch a list of files in batches using curl.''' curlCmd = baseCurlCmd numFiles = len(files) if numFiles != len(urls): raise Exception("Expecting as many files as urls.") currentFileCount = 0 for fileIter in range(numFiles): if not fileNonEmpty(files[fileIter]): # Add to the command curlCmd += ' -O ' + urls[fileIter] currentFileCount += 1 # Number of files in the current download command # Download the indicated files when we hit the limit or run out of files if ( (currentFileCount >= batchSize) or (fileIter == numFiles - 1) ) and \ currentFileCount > 0: logger.info(curlCmd) if not dryRun: logger.info("Saving the data in " + outputFolder) p = subprocess.Popen(curlCmd, cwd=outputFolder, shell=True, universal_newlines=True) os.waitpid(p.pid, 0) # Start command fresh for the next file currentFileCount = 0 curlCmd = baseCurlCmd # This block of code is just to get a non-blocking keyboard check! import signal class AlarmException(Exception): pass def alarmHandler(signum, frame): raise AlarmException def nonBlockingRawInput(prompt='', timeout=20): '''Return a key if pressed or an empty string otherwise. Waits for timeout, non-blocking.''' signal.signal(signal.SIGALRM, alarmHandler) signal.alarm(timeout) try: text = raw_input(prompt) signal.alarm(0) return text except AlarmException: pass # Timeout signal.signal(signal.SIGALRM, signal.SIG_IGN) return '' def waitForTaskCompletionOrKeypress(taskHandles, logger = None, interactive=True, quitKey='q', sleepTime=20): '''Block in this function until the user presses a key or all tasks complete.''' # Wait for all the tasks to complete notReady = len(taskHandles) while notReady > 0: if interactive: # Wait and see if the user presses a key msg = 'Waiting on ' + str(notReady) + ' process(es), press '+str(quitKey)+'<Enter> to abort...\n' keypress = nonBlockingRawInput(prompt=msg, timeout=sleepTime) if keypress == quitKey: logger_print(logger, 'Recieved quit command!') break else: logger_print(logger, "Waiting on " + str(notReady) + ' incomplete tasks.') time.sleep(sleepTime) # As long as we have this process waiting, keep track of our resource consumption. cpuPercentUsage = psutil.cpu_percent() memInfo = psutil.virtual_memory() memUsed = memInfo[0] - memInfo[1] memPercentUsage = float(memUsed) / float(memInfo[0]) usageMessage = ('CPU percent usage = %f, Memory percent usage = %f' % (cpuPercentUsage, memPercentUsage)) logger_print(logger, usageMessage) # Otherwise count up the tasks we are still waiting on. notReady = 0 for task in taskHandles: if not task.ready(): notReady += 1 return def stopTaskPool(pool): '''Stop remaining tasks and kill the pool.''' PROCESS_POOL_KILL_TIMEOUT = 3 pool.close() time.sleep(PROCESS_POOL_KILL_TIMEOUT) pool.terminate() pool.join() def setUpLogger(outputFolder, logLevel, logPathPrefix): '''Set up the root logger so all called files will write to the same output file.''' # Generate a timestamped log file in the output folder timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') logName = logPathPrefix +'_'+ timestamp + '.txt' logPath = os.path.join(outputFolder, logName) logger = logging.getLogger() # Call with no argument to configure the root logger. logger.setLevel(level=logLevel) logger.propagate = False # This is a unique logger, don't copy messages to parent modules. # Make sure we have exacly one stream handler to mirror logging to console. hasStreamHandler = False for h in logger.handlers: if 'StreamHandler' in str(h): hasStreamHandler = True if not hasStreamHandler: logger.addHandler(logging.StreamHandler()) fileHandler = logging.FileHandler(logPath) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fileHandler.setFormatter(formatter) logger.addHandler(fileHandler) logger = logging.getLogger(__name__) # We configured root, but continue logging with the normal name. return logger def logger_print(logger, msg): '''Print to logger, if present. This helps keeps all messages in sync.''' if logger is not None: logger.info(msg) else: print(msg) # TODO: Rename to isSouth. def checkSite(site): '''Verify the site is legal and return True if it is in the southern hemisphere.''' possibleSites = ['AN', 'GR', 'AL'] if site not in possibleSites: raise Exception("Site must be either AN, GR, or AL.") isSouth = (site == 'AN') return isSouth def getElevationLimits(site): '''Return the min and max elevation expected at a given site''' # Would it work better to compute this on a per-flight or per-DEM basis? if site == 'AN': return (-50, 4500) if site == 'GR': return (-50, 3500) if site == 'AL': return (-50, 3500) def getEpsgCode(isSouth, asString=True): '''Return EPSG code for a location. See notes in getProjString.''' code = 3413 if isSouth: code = 3031 if asString: return 'EPSG:' + str(code) return code def getProjString(isSouth, addQuotes=False): '''Return the correct proj string for the pole. Surrounding quotes are optional''' # EPSG 3413 - WGS 84 / NSIDC Sea Ice Polar Stereographic North #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' # EPSG 3031 - WGS 84 / Antarctic Polar Stereographic #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' s = getEpsgCode(isSouth, asString=True) if addQuotes: return '"'+s+'"' else: return s def getReferenceDemName(site): '''Returns the DEM name to use for a given location''' # Note: The AN and GR DEMs match our projection system for those sites. if site == 'AN': #return 'krigged_dem_nsidc_ndv0_fill.tif' # Higher resolution return 'ramp200dem_wgs_v2.tif' # Used to produce the orthos - EPSG 3031 if site == 'GR': #return 'gimpdem_90m_v1.1.tif' # Higher resolution return 'NSIDC_Grn1km_wgs84_elev.tif' # Used to produce the orthos - EPSG 3413 if site == 'AL': # Supposedly these were produced with the SRTM map but that map # does not seem to actually include Alaska. This may mean the NED # map (60 meter) was used but this would require tile handling logic # so for now we will try to use this single 300m DEM. return 'akdem300m.tif' # 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 ' def readStats(inputPath): '''Read some info about a run. Do a little parsing.''' if os.path.exists(inputPath): with open(inputPath, 'r') as f: for line in f: if line == "": continue line = line.strip() vals = line.split(",") if len(vals) != 3: continue # Convert time to a float value representing minutes. # Pre-pad with zeros for missing fields. time_arr = ["0", "0", "0"] + vals[2].split(":") minutes = float(time_arr[-1])/60.0 + float(time_arr[-2]) + 60.0*float(time_arr[-3]) minutes = round(10*minutes)/10 vals[2] = " " + str(minutes) # Rm too many zeros vals[1] = " " + str( round(float(vals[1])*10)/10.0 ) line = ",".join(vals) return line return "-1, -1, -1" def readGeodiffOutput(inputPath): '''Read in the header from a geodiff output csv file. Returns a dictionary containing 'Max', 'Min', 'Mean', and 'StdDev'. ''' if not os.path.exists(inputPath): raise Exception('geodiff output file ' + inputPath + ' does not exist!') # Pack the results into a dictionary keywords = ['Max', 'Min', 'Mean', 'StdDev'] results = {} ext = os.path.splitext(inputPath)[1] if ext == '.csv': numHeaderLines = 0 with open(inputPath, 'r') as f: for line in f: if '#' not in line: # Quit when we go past the comment lines break numHeaderLines = numHeaderLines + 1 for word in keywords: # Look for the four values if word in line: parts = line.split(':') # Extract the number if len(parts) != 2: raise Exception('Error parsing geodiff line:\n' + line) results[word] = float(parts[1]) break # Go on to the next line in the file # For CSV files, include a count of the number of points compared. numLines = asp_file_utils.getFileLineCount(inputPath) - numHeaderLines results['NumDiffs'] = numLines else: # Handle .tif files stats = asp_image_utils.getImageStats(inputPath)[0] results['Min' ] = stats[0] results['Max' ] = stats[1] results['Mean' ] = stats[2] results['StdDev'] = stats[3] return results def isBatchValid(batchFolder): '''Returns true if the given batch has produced a good output DEM.''' # The maximum allowed distance between our DEM and the lidar file. MAX_LIDAR_DEM_DIFF_METERS = 5 try: diffPath = os.path.join(batchFolder, 'out-diff.csv') results = readGeodiffOutput(diffPath) return (results['MEAN'] <= MAX_LIDAR_DEM_DIFF_METERS) except: return False def gsdToDemRes(gsd): '''The DEM resolution is 4x the GSD.''' GSD_RESOLUTION_MULTIPLIER = 4.0 return gsd * GSD_RESOLUTION_MULTIPLIER # For debugging functions #if __name__ == "__main__": # print (getFrameRangeFromBatchFolder('/home/test/batch_234_1425/')) ================================================ FILE: src/asp/IceBridge/icebridge_kmz_to_csv.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' Extracts the frame event positions from an Icebridge KMZ file and writes them out as a bundle_adjust compatible .csv file. Currently these files are available at this website: http://asapdata.arc.nasa.gov/dms/missions.html ''' import sys, os import shutil, string, errno, optparse, glob # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils asp_system_utils.verify_python_version_is_supported() def convert(inputPath, outputPath): '''Converts the input KML file to a CSV file''' fIn = open(inputPath, 'r') fOut = open(outputPath, 'w') fOut.write('# ID, longitude, latitude, elevation\n') for line in fIn: if '<dd>Frame ID:' in line: start = line.find(':') stop = line.rfind(';') idString = line[start+2:stop] if '<coordinates>' in line: # Extract the coordinate from the string start = line.find('>') stop = line.rfind('<') s = line[start+1:stop] parts = s.split(',') longitude = parts[0] latitude = parts[1] elevation = parts[2] fOut.write('%s, %s, %s, %s\n' % (idString, longitude, latitude, elevation)) idString = None fIn.close() fOut.close() def unpackKmz(inputPath): '''Extracts the KML file from the KMZ file''' # Unzip the KMZ file silently cmd = 'unzip -q -o ' + inputPath #print cmd os.system(cmd) # Return path to the KML file folder = os.path.dirname(inputPath) unzipPath = os.path.join(folder, 'doc.kml') if not os.path.exists(unzipPath): raise Exception('Failed to unzip KML data!') return unzipPath def main(inputPath, outputPath): '''Does all the work!''' kmlPath = unpackKmz(inputPath) convert(kmlPath, outputPath) if __name__ == "__main__": # Handle input parameters if len(sys.argv) != 3: print('Wrong number of input arguments provided.') print('Usage: icebridge_kmz_to_csv <input kmz file> <output csv file>') else: sys.exit(main(sys.argv[1], sys.argv[2])) ================================================ FILE: src/asp/IceBridge/input_conversions.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Fetch all the data for a run and then process all the data. # See sample usage below. import os, sys, optparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, fetch_icebridge_data, process_icebridge_run import extract_icebridge_ATM_points, camera_models_from_nav import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() def convertJpegs(jpegFolder, imageFolder, startFrame, stopFrame, skipValidate, cameraMounting, logger): '''Convert jpeg images from RGB to single channel. Returns false if any files failed.''' badFiles = False logger.info('Converting input images to grayscale...') os.system('mkdir -p ' + imageFolder) # Loop through all the input images jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder) if not os.path.exists(jpegIndexPath): raise Exception("Error: Missing jpeg index file: " + jpegIndexPath + ".") (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath, prependFolder = True) # Need the orthos to get the timestamp orthoFolder = icebridge_common.getOrthoFolder(os.path.dirname(jpegFolder)) orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) if not os.path.exists(orthoIndexPath): raise Exception("Error: Missing ortho index file: " + orthoIndexPath + ".") (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath, prependFolder = True) if not skipValidate: validFilesList = icebridge_common.validFilesList(os.path.dirname(jpegFolder), startFrame, stopFrame) validFilesSet = set() validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) numInitialValidFiles = len(validFilesSet) # Fast check for missing images. This is fragile, as maybe it gets # the wrong file with a similar name, but an honest check is very slow. imageFiles = icebridge_common.getTifs(imageFolder, prependFolder = True) imageFrameDict = {} for imageFile in imageFiles: frame = icebridge_common.getFrameNumberFromFilename(imageFile) if frame < startFrame or frame > stopFrame: continue imageFrameDict[frame] = imageFile for frame in sorted(jpegFrameDict.keys()): inputPath = jpegFrameDict[frame] # Only deal with frames in range if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue if frame in imageFrameDict.keys() and skipValidate: # Fast, hackish check continue if frame not in orthoFrameDict: logger.info("Error: Could not find ortho image for jpeg frame: " + str(frame)) # Don't want to throw here. Just ignore the missing ortho continue # Make sure the timestamp and frame number are in the output file name try: outputPath = icebridge_common.jpegToImageFile(inputPath, orthoFrameDict[frame]) except Exception as e: logger.info(str(e)) logger.info("Removing bad file: " + inputPath) os.system('rm -f ' + inputPath) # will not throw badFiles = True continue # Skip existing valid files if skipValidate: if os.path.exists(outputPath): logger.info("File exists, skipping: " + outputPath) continue else: if outputPath in validFilesSet and os.path.exists(outputPath): #logger.info('Previously validated: ' + outputPath) # very verbose validFilesSet.add(inputPath) # Must have this continue if icebridge_common.isValidImage(outputPath): #logger.info("File exists and is valid, skipping: " + outputPath) # verbose if not skipValidate: # Mark both the input and the output as validated validFilesSet.add(inputPath) validFilesSet.add(outputPath) continue # Use ImageMagick tool to convert from RGB to grayscale # - Some image orientations are rotated to make stereo processing easier. rotateString = '' if cameraMounting == 2: # Flight direction towards top of image rotateString = '-rotate 90 ' if cameraMounting == 3: # Flight direction towards bottom of image rotateString = '-rotate -90 ' cmd = ('%s %s -colorspace Gray %s%s') % \ (asp_system_utils.which('convert'), inputPath, rotateString, outputPath) logger.info(cmd) # Run command and fetch its output p = subprocess.Popen(cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) output, error = p.communicate() if p.returncode != 0: badFiles = True logger.error("Command failed.") logger.error("Wiping bad files: " + inputPath + " and " + outputPath + '\n' + output) os.system('rm -f ' + inputPath) # will not throw os.system('rm -f ' + outputPath) # will not throw if not os.path.exists(outputPath): badFiles = True logger.error('Failed to convert jpeg file: ' + inputPath) logger.error("Wiping bad files: " + inputPath + " and " + outputPath + '\n' + output) os.system('rm -f ' + inputPath) # will not throw os.system('rm -f ' + outputPath) # will not throw # Check for corrupted files if error is not None: output += error m = re.match("^.*?premature\s+end", output, re.IGNORECASE|re.MULTILINE|re.DOTALL) if m: badFiles = True logger.error("Wiping bad files: " + inputPath + " and " + outputPath + '\n' + output) os.system('rm -f ' + inputPath) # will not throw os.system('rm -f ' + outputPath) # will not throw if not skipValidate: # Write to disk the list of validated files, but only if new # validations happened. First re-read that list, in case a # different process modified it in the meantime, such as if two # managers are running at the same time. numFinalValidFiles = len(validFilesSet) if numInitialValidFiles != numFinalValidFiles: validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) icebridge_common.writeValidFilesList(validFilesList, validFilesSet) if badFiles: logger.error("Converstion of JPEGs failed. If any files were corrupted, " + "they were removed, and need to be re-fetched.") return (not badFiles) def correctFireballDems(fireballFolder, corrFireballFolder, startFrame, stopFrame, isNorth, skipValidate, logger): '''Fix the header problem in Fireball DEMs''' logger.info('Correcting Fireball DEMs ...') # Read the existing DEMs fireballIndexPath = icebridge_common.csvIndexFile(fireballFolder) if not os.path.exists(fireballIndexPath): raise Exception("Error: Missing fireball index file: " + fireballIndexPath + ".") (fireballFrameDict, fireballUrlDict) = \ icebridge_common.readIndexFile(fireballIndexPath, prependFolder = True) if not skipValidate: validFilesList = icebridge_common.validFilesList(os.path.dirname(fireballFolder), startFrame, stopFrame) validFilesSet = set() validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) numInitialValidFiles = len(validFilesSet) # Loop through all the input images os.system('mkdir -p ' + corrFireballFolder) badFiles = False for frame in sorted(fireballFrameDict.keys()): # Skip if outside the frame range if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue inputPath = fireballFrameDict[frame] if not icebridge_common.isDEM(inputPath): continue outputPath = os.path.join(corrFireballFolder, os.path.basename(inputPath)) # Skip existing valid files if skipValidate: if os.path.exists(outputPath): logger.info("File exists, skipping: " + outputPath) continue else: if outputPath in validFilesSet and os.path.exists(outputPath): #logger.info('Previously validated: ' + outputPath) # very vebose continue if icebridge_common.isValidImage(outputPath): #logger.info("File exists and is valid, skipping: " + outputPath) validFilesSet.add(outputPath) # mark it as validated continue # Run the correction script execPath = asp_system_utils.which('correct_icebridge_l3_dem') cmd = (('%s %s %s %d') % (execPath, inputPath, outputPath, isNorth)) logger.info(cmd) # TODO: Run this as a subprocess and check the return code os.system(cmd) # Check if the output file is good if not icebridge_common.isValidImage(outputPath): logger.error('Failed to convert dem file, wiping: ' + inputPath + ' ' + outputPath) os.system('rm -f ' + inputPath) # will not throw os.system('rm -f ' + outputPath) # will not throw badFiles = True else: if not skipValidate: validFilesSet.add(outputPath) # mark it as validated if not skipValidate: # Write to disk the list of validated files, but only if new # validations happened. First re-read that list, in case a # different process modified it in the meantime, such as if two # managers are running at the same time. numFinalValidFiles = len(validFilesSet) if numInitialValidFiles != numFinalValidFiles: validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) icebridge_common.writeValidFilesList(validFilesList, validFilesSet) return (not badFiles) def getCalibrationFileForFrame(cameraLoopkupFile, inputCalFolder, frame, yyyymmdd, site, logger): '''Return the camera model file to be used with a given input frame.''' # To manually force a certain camera file, use this spot! #name = 'IODCC0_2015_GR_NASA_DMS20.tsai' #return os.path.join(inputCalFolder, name) camera = '' # Iterate through lines in lookup file with open(cameraLoopkupFile, "r") as cf: for line in cf: # Split line into parts and match site/date entries line = line.strip() vals = re.split('\s+', line) if len(vals) < 3: continue if vals[0] != site or vals[1] != yyyymmdd: continue curr_camera = vals[2] if curr_camera == "": raise Exception('Found an empty camera for day and site: ' + yyyymmdd + ' ' + site) # There is one default camera, and possible a backup camera for a range # of frames # - Currently these are on separate lines m = re.match("^.*?frames\s+(\d+)-(\d+)", line) if not m: # The default camera, it is always before the backup one in the list. # So this map must not be populated yet with this key. camera = curr_camera else: # The backup camera for a range startRange = int(m.group(1)) stopRange = int(m.group(2)) if (frame >= startRange) and (frame <= stopRange): camera = curr_camera # TODO: Modify file format so each flight has all info on a single line! #break # Each frame will match only one line if camera == "": logger.error('Failed to parse the camera.') raise Exception('Failed to parse the camera.') # Switch the extension to .tsai camera = camera[:-4] + '.tsai' return os.path.join(inputCalFolder, camera) def cameraFromOrthoWrapper(inputPath, orthoPath, inputCamFile, estimatedCameraPath, outputCamFile, refDemPath, simpleCamera, numThreads): '''Generate a camera model from a single ortho file''' # Make multiple calls with different options until we get one that works well IP_METHOD = [1, 0, 2, 1, 1, 2, 0] # IP method FORCE_SIMPLE = [0, 0, 0, 0, 0, 0, 1] # If all else fails use simple mode LOCAL_NORM = [False, False, False, False, True, True, False] # If true, image tiles are individually normalized with method 1 and 2 IP_PER_TILE = [0, 0, 0, 1024, 0, 0, 0] numAttempts = len(IP_METHOD) MIN_IP = 15 # Require more IP to make sure we don't get bogus camera models DESIRED_IP = 200 # If we don't hit this number, try other methods before taking the best one. # The max distance in meters the ortho2pinhole solution is allowed to move from the input # navigation estimate. MAX_TRANSLATION = 7 bestIpCount = 0 tempFilePath = outputCamFile + '_temp' # Used to hold the current best result matchPath = outputCamFile + '.match' # Used to hold the match file if it exists tempMatchPath = matchPath + '_temp' os.system("ulimit -c 0") # disable core dumps os.system("rm -f core.*") # these keep on popping up os.system("umask 022") # enforce files be readable by others numPoints = 0 # must be initialized for i in range(0,numAttempts): # Get parameters for this attempt ipMethod = IP_METHOD[i] localNorm = LOCAL_NORM[i] if FORCE_SIMPLE[i]: # Always turn this on for the final attempt! simpleCamera = True # Call ortho2pinhole command ortho2pinhole = asp_system_utils.which("ortho2pinhole") cmd = (('%s %s %s %s %s --reference-dem %s --crop-reference-dem --threads %d ' \ '--ip-detect-method %d --minimum-ip %d --max-translation %f') % (ortho2pinhole, inputPath, orthoPath, inputCamFile, outputCamFile, refDemPath, numThreads, ipMethod, MIN_IP, MAX_TRANSLATION) ) if localNorm: cmd += ' --skip-image-normalization' if estimatedCameraPath is not None: cmd += ' --camera-estimate ' + estimatedCameraPath if simpleCamera: cmd += ' --short-circuit' if IP_PER_TILE[i] > 0: cmd += ' --ip-per-tile ' + str(IP_PER_TILE[i]) # Use a print statement as the logger fails from multiple processes print(cmd) os.system('rm -f ' + matchPath) # Needs to be gone p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, universal_newlines=True) textOutput, err = p.communicate() p.wait() print(textOutput) if not os.path.exists(outputCamFile): # Keep trying if no output file produced continue if simpleCamera: break # Never need more than one attempt with simpleCamera! # Check the number of IP used m = re.findall(r"Using (\d+) points to create the camera model.", textOutput) if len(m) != 1: # An unknown error occurred, move on. continue numPoints = int(m[0]) if numPoints >= DESIRED_IP: # Got a lot of points, quit break if numPoints > bestIpCount: # Got some points but not many, try other options bestIpCount = numPoints # to see if we can beat this result. shutil.move(outputCamFile, tempFilePath) if os.path.exists(matchPath): shutil.move(matchPath, tempMatchPath) if (not simpleCamera) and (numPoints < DESIRED_IP): # If we never got the desired # of points shutil.move(tempFilePath, outputCamFile) # Use the camera file with the most points found if os.path.exists(tempMatchPath): shutil.move(tempMatchPath, matchPath) print ('Best number of ortho points = ' + str(bestIpCount)) else: print ('Best number of ortho points = ' + str(numPoints)) os.system('rm -f ' + tempFilePath ) # Clean up these files os.system('rm -f ' + tempMatchPath) os.system("rm -f core.*") # these keep on popping up os.system("rm -f " + outputCamFile + "*-log-*") # wipe logs if not os.path.exists(outputCamFile): # This function is getting called from a pool, so just log the failure. print('Failed to convert ortho file: ' + orthoPath) # I saw this being recommended, to dump all print statements in the current task sys.stdout.flush() def getCameraModelsFromOrtho(imageFolder, orthoFolder, inputCalFolder, inputCalCamera, cameraLookupFile, noNav, navCameraFolder, yyyymmdd, site, refDemPath, cameraFolder, simpleCameras, startFrame, stopFrame, framesFile, numProcesses, numThreads, logger): '''Generate camera models from the ortho files. Returns false if any files were not generated.''' logger.info('Generating camera models from ortho images...') imageFiles = icebridge_common.getTifs(imageFolder) orthoFiles = icebridge_common.getTifs(orthoFolder) if navCameraFolder != "": estimateFiles = icebridge_common.getByExtension(navCameraFolder, '.tsai') else: estimateFiles = [] # See if to process frames from file filesSet = set() if framesFile != "": filesSet = icebridge_common.readLinesInSet(framesFile) # Make a dictionary of ortho files by frame # - The orthoFiles list contains _gray.tif as well as the original # images. Prefer the gray versions because it saves a bit of time # in the ortho2pinhole process. orthoFrames = {} for f in orthoFiles: frame = icebridge_common.getFrameNumberFromFilename(f) if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue if (framesFile != "") and (str(frame) not in filesSet): continue # Record this file if it is the first of this frame or # if it is the gray version of this frame. if (frame not in orthoFrames) or ('_gray.tif' in f): orthoFrames[frame] = f # Make a dictionary of estimated camera files by frame estimatedFrames = {} for f in estimateFiles: frame = icebridge_common.getFrameNumberFromFilename(f) if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue if (framesFile != "") and (str(frame) not in filesSet): continue estimatedFrames[frame] = f imageFiles.sort() logger.info('Starting ortho processing pool with ' + str(numProcesses) + ' processes.') pool = multiprocessing.Pool(numProcesses) # Loop through all input images taskHandles = [] outputFiles = [] for imageFile in imageFiles: # Skip non-image files (including _sub images made by stereo_gui) # TODO: Use a function here from icebridge_common. Also replace # all similar locations. ext = os.path.splitext(imageFile)[1] if (ext != '.tif') or ('_sub' in imageFile) or ('pct.tif' in imageFile): continue # Get associated orthofile frame = icebridge_common.getFrameNumberFromFilename(imageFile) if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue if (framesFile != "") and (str(frame) not in filesSet): continue if not frame in orthoFrames.keys(): continue # Find the estimated camera file to use with this ortho frame. orthoFile = orthoFrames[frame] try: estimatedCameraFile = estimatedFrames[frame] estimatedCameraPath = os.path.join(navCameraFolder, estimatedCameraFile) except: # For now treat this as an error, a missing nav file suggests # that something is going wrong with the flight! if not noNav: logger.error('Missing nav estimated camera for frame ' + str(frame)) continue else: estimatedCameraFile = None estimatedCameraPath = None #estimatedCameraFile = None #estimatedCameraPath = None # Check output file inputPath = os.path.join(imageFolder, imageFile) orthoPath = os.path.join(orthoFolder, orthoFile) outputCamFile = os.path.join(cameraFolder, icebridge_common.getCameraFileName(imageFile)) outputFiles.append(outputCamFile) if os.path.exists(outputCamFile): logger.info("File exists, skipping: " + outputCamFile) os.system("rm -f " + outputCamFile + "*-log-*") # wipe logs continue # Determine which input camera file will be used for this frame if inputCalCamera == "": inputCamFile = getCalibrationFileForFrame(cameraLookupFile, inputCalFolder, frame, yyyymmdd, site, logger) else: # This logic will force to use a given camera rather than # looking it up. This is not the usual way of doing things. inputCamFile = inputCalCamera if not os.path.exists(inputCalCamera): raise Exception("Could not find: " + inputCalCamera) orthoArgs = (inputPath, orthoPath, inputCamFile, estimatedCameraPath, outputCamFile, refDemPath, simpleCameras, numThreads) if numProcesses > 1: # Add ortho2pinhole command to the task pool taskHandles.append(pool.apply_async(cameraFromOrthoWrapper, orthoArgs)) else: # Single process, more logging info this way cameraFromOrthoWrapper(*orthoArgs) # Wait for all the tasks to complete logger.info('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.') icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, interactive=False, quitKey='q') # All tasks should be finished icebridge_common.stopTaskPool(pool) logger.info('Finished ortho processing.') # Run a check to see if we got all the output files for f in outputFiles: if not os.path.exists(f): return False return True def getCameraModelsFromNav(imageFolder, orthoFolder, inputCalFolder, inputCalCamera, cameraLookupFile, navFolder, navCameraFolder, yyyymmdd, site, startFrame, stopFrame, cameraMounting, logger): '''Given the folder containing navigation files, generate an estimated camera model for each file.''' # Note: Currently these output files DO NOT contain accurate intrinsic parameters! logger.info("Get camera models from nav.") # All the work is done by the separate file. cmd = [imageFolder, orthoFolder, inputCalFolder, navFolder, navCameraFolder, '--start-frame', str(startFrame), '--stop-frame', str(stopFrame)] # Pick an input calibration file to use. The exact one is not essential here, # things will be refined later. if inputCalCamera == "": inputCalCamera = getCalibrationFileForFrame(cameraLookupFile, inputCalFolder, startFrame, yyyymmdd, site, logger) if inputCalCamera != "" and os.path.exists(inputCalCamera): cmd += ['--input-calibration-camera', inputCalCamera] # Only one alternate orientation (180 degree flipped) is handled here. # - The two 90 degree flips are handled by rotating the input images! if cameraMounting == 1: cmd += ['--camera-mounting', str(cameraMounting)] logger.info("camera_models_from_nav.py " + " ".join(cmd)) if (camera_models_from_nav.main(cmd) < 0): raise Exception('Error generating camera models from nav!') def convertLidarDataToCsv(lidarFolder, startFrame, stopFrame, skipValidate, logger): '''Make sure all lidar data is available in a readable text format. Returns false if any files failed to convert.''' logger.info('Converting LIDAR files...') lidarIndexPath = icebridge_common.csvIndexFile(lidarFolder) (frameDict, urlDict) = icebridge_common.readIndexFile(lidarIndexPath) if not skipValidate: validFilesList = icebridge_common.validFilesList(os.path.dirname(lidarFolder), startFrame, stopFrame) validFilesSet = set() validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) numInitialValidFiles = len(validFilesSet) convDict = {} # Loop through all files in the folder badFiles = False for frame in sorted(frameDict.keys()): f = frameDict[frame] extension = icebridge_common.fileExtension(f) # Only interested in a few file types if (extension != '.qi') and (extension != '.hdf5') and (extension != '.h5'): convDict[frame] = f # these are already in plain text continue convDict[frame] = os.path.splitext(f)[0] + '.csv' outputPath = os.path.join(lidarFolder, convDict[frame]) # Handle paths fullPath = os.path.join(lidarFolder, f) if not os.path.exists(fullPath): logger.info("Cannot convert missing file: " + fullPath) continue # If the input is invalid, wipe both it, its xml, and the output # Hopefully there will be a subsquent fetch step where it will get # refetched. if not icebridge_common.hasValidChkSum(fullPath, logger): logger.info("Will wipe invalid file: " + fullPath) xmlFile = icebridge_common.xmlFile(fullPath) os.system('rm -f ' + fullPath) # will not throw os.system('rm -f ' + xmlFile) # will not throw os.system('rm -f ' + outputPath) # will not throw badFiles = True continue # Skip existing valid files if skipValidate: if os.path.exists(outputPath): logger.info("File exists, skipping: " + outputPath) continue else: if outputPath in validFilesSet and os.path.exists(outputPath): #logger.info('Previously validated: ' + outputPath) # verbose continue if icebridge_common.isValidLidarCSV(outputPath): #logger.info("File exists and is valid, skipping: " + outputPath) continue # Call the conversion logger.info("Process " + fullPath) extract_icebridge_ATM_points.main([fullPath]) # Check the result if not icebridge_common.isValidLidarCSV(outputPath): logger.error('Failed to parse LIDAR file, will wipe: ' + outputPath) os.system('rm -f ' + outputPath) # will not throw badFiles = True else: if not skipValidate: validFilesSet.add(outputPath) # mark it as validated convLidarFile = icebridge_common.getConvertedLidarIndexFile(lidarFolder) willWriteConvFile = False if not os.path.exists(convLidarFile): willWriteConvFile = True else: # Bugfix: Sometimes the written converted file has the wrong size, maybe # something got interrupted earlier. (lidarDictIn, dummyUrlDict) = icebridge_common.readIndexFile(convLidarFile) if lidarDictIn != convDict: willWriteConvFile = True if willWriteConvFile: logger.info("Writing: " + convLidarFile) icebridge_common.writeIndexFile(convLidarFile, convDict, {}) if not skipValidate: # Write to disk the list of validated files, but only if new # validations happened. First re-read that list, in case a # different process modified it in the meantime, such as if two # managers are running at the same time. numFinalValidFiles = len(validFilesSet) if numInitialValidFiles != numFinalValidFiles: validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) icebridge_common.writeValidFilesList(validFilesList, validFilesSet) return (not badFiles) def pairLidarFiles(lidarFolder, skipValidate, logger): '''For each pair of lidar files generate a double size point cloud. We can use these later since they do not have any gaps between adjacent files.''' logger.info('Generating lidar pairs...') # Create the output folder pairedFolder = icebridge_common.getPairedLidarFolder(lidarFolder) os.system('mkdir -p ' + pairedFolder) convLidarFile = icebridge_common.getConvertedLidarIndexFile(lidarFolder) if not os.path.exists(convLidarFile): raise Exception("Missing file: " + convLidarFile) (lidarDict, dummyUrlDict) = icebridge_common.readIndexFile(convLidarFile) lidarExt = '' for frame in lidarDict: lidarExt = icebridge_common.fileExtension(lidarDict[frame]) numLidarFiles = len(lidarDict.keys()) pairedDict = {} # Loop through all pairs of csv files in the folder badFiles = False lidarKeys = sorted(lidarDict.keys()) for i in range(len(lidarKeys)-1): thisFile = lidarDict[lidarKeys[i ]] nextFile = lidarDict[lidarKeys[i+1]] date2, time2 = icebridge_common.parseTimeStamps(nextFile) # Record the name with the second file # - More useful because the time for the second file represents the middle of the file. outputName = icebridge_common.lidar_pair_prefix() + date2 +'_'+ time2 + lidarExt pairedDict[lidarKeys[i]] = outputName # Handle paths path1 = os.path.join(lidarFolder, thisFile) path2 = os.path.join(lidarFolder, nextFile) outputPath = os.path.join(pairedFolder, outputName) if not os.path.exists(path1) or not os.path.exists(path2): logger.info("Cannot create " + outputPath + " as we are missing its inputs") # If the inputs are missing, but the output is there, most likely it is corrupt. # Wipe it. Hopefully a subsequent fetch and convert step will bring it back. if os.path.exists(outputPath): logger.info("Wiping: " + outputPath) os.system('rm -f ' + outputPath) # will not throw badFiles = True continue # Skip existing valid files if skipValidate: if os.path.exists(outputPath): logger.info("File exists, skipping: " + outputPath) continue else: if icebridge_common.isValidLidarCSV(outputPath): #logger.info("File exists and is valid, skipping: " + outputPath) continue # Concatenate the two files cmd1 = 'cat ' + path1 + ' > ' + outputPath cmd2 = 'tail -n +2 -q ' + path2 + ' >> ' + outputPath logger.info(cmd1) p = subprocess.Popen(cmd1, stdout=subprocess.PIPE, shell=True, universal_newlines=True) out, err = p.communicate() logger.info(cmd2) p = subprocess.Popen(cmd2, stdout=subprocess.PIPE, shell=True, universal_newlines=True) out, err = p.communicate() if not icebridge_common.isValidLidarCSV(outputPath): logger.error('Failed to generate merged LIDAR file, will wipe: ' + outputPath) os.system('rm -f ' + outputPath) # will not throw badFiles = True pairedLidarFile = icebridge_common.getPairedIndexFile(pairedFolder) willWritePairedFile = False if not os.path.exists(pairedLidarFile): willWritePairedFile = True else: # Bugfix: Sometimes the written converted file has the wrong size, maybe # something got interrupted earlier. (lidarDictIn, dummyUrlDict) = icebridge_common.readIndexFile(pairedLidarFile) if lidarDictIn != pairedDict: willWritePairedFile = True if willWritePairedFile: logger.info("Writing: " + pairedLidarFile) icebridge_common.writeIndexFile(pairedLidarFile, pairedDict, {}) return (not badFiles) ================================================ FILE: src/asp/IceBridge/label_images.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Wrapper Script for the OSSP machine learning based labelling tool. import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing, re, glob import traceback import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, run_helper import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] def get_camera(cameraFolder, frame): '''Get the label file and the camera file for a given frame''' # Get a list of all the input files # allImageFiles = icebridge_common.getTifs(labelFolder) allCameraFiles = icebridge_common.getByExtension(cameraFolder, '.tsai') # Keep only the images and cameras within the given range # imageFile = None # for image in allImageFiles: # thisFrame = icebridge_common.getFrameNumberFromFilename(image) # if thisFrame != frame: # continue # imageFile = os.path.join(labelFolder, image) # break cameraFile = None for camera in allCameraFiles: thisFrame = icebridge_common.getFrameNumberFromFilename(camera) if thisFrame != frame: continue cameraFile = os.path.join(cameraFolder, camera) break return cameraFile def label_images(outputFolder, frameNum, trainingPath, site, yyyymmdd, numThreads): '''Apply the labeling algorithm to a single image, then map project the result.''' print 'Running label for frame: ' + str(frameNum) # Get required paths inputFolder = icebridge_common.getJpegFolder (outputFolder) cameraFolder = icebridge_common.getCameraFolder (outputFolder) labelFolder = icebridge_common.getLabelFolder (outputFolder) orthoFolder = icebridge_common.getLabelOrthoFolder(outputFolder) # Hardcoded paths!!! toolPath = 'python ~/repo/OSSP/ossp_process.py' refDemFolder = '/nobackup/smcmich1/icebridge/reference_dems/' # Run the label tool NO_SPLITTING = 1 # Plenty of RAM to load these images ONE_PROCESS = 1 # Figure out the label path run = run_helper.RunHelper(site, yyyymmdd) labelName = icebridge_common.makeLabelFileName(run, frameNum) labelPath = os.path.join(labelFolder, labelName) #cmd = ('%s %s --output_dir %s --min_frame %d --max_frame %d srgb %s --splits %d --parallel %d' % # (toolPath, inputFolder, labelFolder, frameNum, frameNum, trainingPath, NO_SPLITTING, ONE_PROCESS)) cmd = ('time %s %s --output_dir %s --min_frame %d --max_frame %d srgb %s' % (toolPath, inputFolder, labelFolder, frameNum, frameNum, trainingPath)) print cmd if icebridge_common.isValidImage(labelPath): print 'Skipping completed file: ' + labelPath else: os.system(cmd) # Also generate the map projected version of the image # Figure out the camera and output path cameraPath = get_camera(cameraFolder, frameNum) fname = os.path.basename(labelPath).replace('classified', 'classified_ortho') mapProjPath = os.path.join(orthoFolder, fname) if not icebridge_common.isValidImage(labelPath): print 'ERROR: Failed to generate label file: ' + labelPath return # Set map projection parameters toolPath = 'mapproject' isSouth = (site == 'AN') srs = projString = icebridge_common.getEpsgCode(isSouth, asString=True) demPath = 'WGS84' # Map project on to a flat surface, elevation zero. #demPath = os.path.join(refDemFolder, icebridge_common.getReferenceDemName(site)) # The NSIDC ortho DEM # Mapproject cmd = ('time %s %s %s %s %s -t nadirpinhole --t_srs %s --threads %d --num-processes 1 --ot Byte --nearest-neighbor' % (toolPath, demPath, labelPath, cameraPath, mapProjPath, srs, numThreads)) print cmd if icebridge_common.isValidImage(mapProjPath): print 'Skipping existing file: ' + mapProjPath else: os.system(cmd) if not os.path.exists(mapProjPath): print 'ERROR: Failed to generate map projected label file: ' + mapProjPath return def main(argsIn): try: usage = '''label_images.py <options>''' parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--yyyymmdd", dest="yyyymmdd", required=True, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", required=True, help="Name of the location of the images (AN, GR, or AL)") parser.add_argument("--output-folder", dest="outputFolder", default=None, help="Name of the output folder. If not specified, " + \ "use something like AN_YYYYMMDD.") parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on. This frame will also be processed.') parser.add_argument("--training", dest="trainingPath", required=True, help="Path to the training file.") parser.add_argument('--num-processes', dest='numProcesses', default=8, type=int, help='The number of simultaneous processes to run.') parser.add_argument('--num-threads', dest='numThreads', default=1, type=int, help='Used for mapproject.') options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) if not os.path.exists(options.trainingPath): print 'Error: Input training file ' + options.trainingPath + ' does not exist!' return -1 # TODO: Everything should use the RunHelper class for this! if options.outputFolder is None: options.outputFolder = icebridge_common.outputFolder(options.site, options.yyyymmdd) # Set up a processing tool to handle the frames, this will be more efficient # than using the built-in mulithreading support. pool = multiprocessing.Pool(options.numProcesses) taskHandles = [] for i in range(options.startFrame, options.stopFrame+1): # Run on a single frame with one thread. #label_images(options.outputFolder, i, options.trainingPath, options.site, options.yyyymmdd, options.numThreads) taskHandles.append(pool.apply_async(label_images, (options.outputFolder, i, options.trainingPath, options.site, options.yyyymmdd, options.numThreads))) # Wait for all the tasks to complete print('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.') icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, interactive=False) # All tasks should be finished, clean up the processing pool icebridge_common.stopTaskPool(pool) print('Jobs finished.') # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/lvis2kml.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ import sys, os, optparse, sys, string, simplekml ''' Convert an LVIS lidar data or XML file into a Google Earth compatible KML format. The raw data produces points, the XML files produce bounding regions. ''' def readPositions(positionFilePath): '''Read in the LVIS data''' if not os.path.exists(positionFilePath): raise Exception('File ' + positionFilePath + ' is missing!') # Is this a border file or a raw data file? isBorderFile = ('.xml' in positionFilePath) isLvisFile = ('.TXT' in positionFilePath) f = open(positionFilePath, 'r') pointList = [] lon = 0 # Only used for border files for line in f: if isBorderFile: if not (('PointLongitude' in line) or ('PointLatitude' in line)): continue # Find the number start = line.find('>')+1 stop = line.rfind('<') num = float(line[start:stop]) # Record pairs with no elevation if 'PointLongitude' in line: lon = num if 'PointLatitude' in line: thisPoint = (lon, num) pointList.append(thisPoint) else: # Lidar point files (possibly converted to CSV by another tool) if '#' in line: # Skip lines containing the comment symbol continue strings = line.replace(',','').split() # Record lot/lat/alt triples if isLvisFile: if len(strings) < 6: continue lon = float(strings[3]) lat = float(strings[4]) height = float(strings[5]) else: # ATM lidar if len(strings) < 3: continue lon = float(strings[1]) lat = float(strings[0]) height = float(strings[2]) thisPoint = (lon, lat, height) pointList.append(thisPoint) f.close() return pointList def generatePointKml(pointList, outputPath, pointSkip, name, color): """Generates a KML plot for the input points""" # Initialize kml document kml = simplekml.Kml() kml.document.name = name kml.hint = 'target=earth' ALT = 2 # Compute the min and max point values minHeight = pointList[0][ALT] maxHeight = minHeight for p in pointList: if p[ALT] < minHeight: minHeight = p[ALT] if p[ALT] > maxHeight: maxHeight = p[ALT] heightRange = maxHeight - minHeight # Plot each point counter = 0 for i in range (0, len(pointList), int(pointSkip)): (lon, lat, height) = pointList[i] point = kml.newpoint(name=str(counter), coords=[(lon, lat, height)], altitudemode= simplekml.AltitudeMode.relativetoground) point.extrude = 0 counter = counter + 1 point.style.labelstyle.scale = 0 point.style.iconstyle.scale = 0.6 point.style.iconstyle.icon.href = 'http://maps.google.com/mapfiles/kml/shapes/open-diamond.png' # Generate a color based on the error value: white (low error) <--> red (high error) thisHeight = pointList[i][ALT] colorVal = int(255.0 - 255.0*(thisHeight - minHeight)/heightRange) if (colorVal < 0): colorVal = 0 if color == 'blue': point.style.iconstyle.color = simplekml.Color.rgb(colorVal,colorVal,255,255) elif color == 'green': point.style.iconstyle.color = simplekml.Color.rgb(colorVal,255,colorVal,255) else: # red point.style.iconstyle.color = simplekml.Color.rgb(255,colorVal,colorVal,255) # Save kml document kml.save(outputPath) return counter def generateBorderKml(pointList, outputPath, name, color): """Generates a KML plot of a point border""" # Initialize kml document kml = simplekml.Kml() kml.document.name = name kml.hint = 'target=earth' # Make a polygon with the provided borders poly = kml.newpolygon() poly.outerboundaryis.coords = pointList poly.outerboundaryis.coords = pointList # Set style if color == 'blue': poly.style.linestyle.color = simplekml.Color.blue elif color == 'green': poly.style.linestyle.color = simplekml.Color.green else: # red poly.style.linestyle.color = simplekml.Color.red # Save kml document kml.save(outputPath) return len(pointList) #-------------------------------------------------------------------------------------------- def main(argsIn): try: usage = "usage: lvis2kml [options] <inputPath> [outputPath]\n" parser = optparse.OptionParser(usage=usage) parser.set_defaults(skip=1) parser.set_defaults(name=None) parser.set_defaults(color='red') parser.add_option("--skip", dest="skip", help="Plot only every N'th point (default 1)") parser.add_option("--name", dest="name", help="KML name") parser.add_option("--color", dest="color", help="Draw in red, blue, or green") (options, args) = parser.parse_args(argsIn) except optparse.OptionError as msg: raise Exception(msg) if len(args) < 1: print('Missing required input path.') print(usage) return -1 # If output path is not specified, just append .kml to the input path. inputPath = args[0] if len(args) > 1: outputPath = args[1] else: outputPath = inputPath + '.kml' if not options.name: options.name = os.path.basename(inputPath) print("Beginning processing.") pointList = readPositions(inputPath) print('Loaded ' + str(len(pointList)) +' points.') if '.xml' in inputPath: # Plot a border polygon generateBorderKml(pointList, outputPath, options.name, options.color) else: # Plot individual points generatePointKml(pointList, outputPath, options.skip, options.name, options.color) print("Finished.") return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/merge_orbitviz.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Merge multiple output files from orbitviz import os, sys, optparse, datetime, time, subprocess, logging, multiprocessing, re, shutil, time import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] def main(args): # Parse input arguments if len(args) == 2: # If only one input file was provided, just copy it to the output file. shutil.copyfile(args[1], args[0]) return 0 if len(args) < 3: print 'usage: merge_orbitviz.py <output_file> <input_file_1> <input_file_2> ...' return -1 outputPath = os.path.abspath(args[0]) if args[1] == '-list': # Read from list, this is beneficial if the files are too many inputPaths = [] with open(args[2], 'r') as inputFile: for line in inputFile: line = line.strip() inputPaths.append(line) else: inputPaths = [os.path.abspath(x) for x in args[1:]] if not inputPaths: print 'Error: No input files detected!' return -1 # Open the output file with open(outputPath, 'w') as outputFile: # Copy most of the input file, stopping at the document close tags with open(inputPaths[0], 'r') as inputFile: for line in inputFile: if '</Document>' in line: break outputFile.write(line+'\n') # Copy only the camera positions from the other files for inputPath in inputPaths[1:]: copying = False with open(inputPath, 'r') as inputFile: for line in inputFile: if '<Placemark>' in line: # Start copying these lines copying = True if copying: outputFile.write(line+'\n') if '</Placemark>' in line: # Stop copying these lines copying = False # Close off the output file outputFile.write('</Document>\n</kml>') print 'Finished writing ' + outputPath # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/multi_flight_label_runner.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Program to generate labels for multiple flights, one after the other. import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing import re, shutil, glob import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, run_helper asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] #========================================================================= # Functions def updateLogFile(path, run): '''Add an run to the log file if it is not already there''' if checkLogFile(date): return with open(path, 'a') as f: f.write(run.name() + '\n') def checkLogFile(path, run): '''Return true if the date is in the file''' run_name = run.name() with open(path, 'r') as f: for line in f: if run_name in line: return True return False #========================================================================= # Main def main(argsIn): # Parse the input arguments if len(argsIn) < 2: print 'Usage: multi_flight_runner <input_flight_list> <finished_flight_list>' return 0 inputFlightLog = argsIn[0] outputFlightLog = argsIn[1] # Stop processing early if we build up too many flights! MAX_RUNS_RETAINED = 3 runsRetained = [] runsDeleted = [] with open(inputFlightLog, 'r') as inLog: for line in inLog: # Make run object and check if we already did this run parts = line.split('_') run = RunHelper(parts[0], parts[1]) if checkLogFile(outputFlightLog, run): print 'Skipping already completed run: ' + str(run) continue print 'Going to process run: ' + str(run) runFolder = os.path.join('/nobackup/smcmich1/icebridge/', str(run)) # Set up the processing command # - This will generate all the labels for the current flight and then wipe everything # if all of the label files were generated. TOOL_PATH = 'python ~/repo/StereoPipeline/src/asp/IceBridge/pleiades_manager.py' 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' cmd += ' --site ' + run.site + ' --yyyymmdd ' + run.yyyymmdd print cmd os.system(cmd) # Whether or not we succeeded, log that we processed the flight. updateLogFile(outputFlightLog, run) if not os.path.exists(runFolder): print 'Run successful, deleted!' runsDeleted.append(run.name()) else: print 'Run failed, retained!'' runsRetained.append(run.name()) if len(runsRetained) >= MAX_RUNS_RETAINED: print 'Too many flights failed, quitting now!' break numRuns = len(runsRetained) + len(runsDeleted) print '---=== Finished processing ' + str(numRuns) + ' flights! ===---' # Send an email with a record of the runs we processed emailAddress = getEmailAddress(icebridge_common.getUser()) print("Sending email to: " + emailAddress) subject = 'Finished running batch flight labelling script!' body = '\nThe following runs were retained (some files missing):' for r in runsRetained: body += r + '\n' body = '\nThe following runs were deleted (all files created):' for r in runsDeleted: body += r + '\n' sendEmail(emailAddress, subject, body) # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/multi_process_command_runner.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ import os, sys, argparse, multiprocessing # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) sys.path.insert(0, libexecpath) sys.path.insert(0, toolspath) import icebridge_common import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] '''Simple tool to run commands in parallel from an input file. First argument is the input file containing the commands to run. Second argument is the number of parallel processes to use. Third argument (optional) is the starting line. Fourth argument (optional) is the stopping line (not processed).''' def runCommand(command): '''Run one of the commands from the file''' print(command) os.system(command) def main(argsIn): try: usage = '''usage: multi_process_command_runner.py ...''' parser = argparse.ArgumentParser(usage=usage) # Data selection options parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames. Set both to -1 to blindly run all commands.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on. This last one will not be processed.') parser.add_argument('--num-processes', dest='numProcesses', type=int, default=-1, help='How many processes to start at the same time.') parser.add_argument("--command-file-path", dest="commandFilePath", default=None, help="The file from where to read the commands to process.") parser.add_argument("--force-redo-these-frames", dest="redoFrameList", default="", help="For each frame in this file (stored one per line) within the current frame range, delete the batch folder and redo the batch.") options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) icebridge_common.switchWorkDir() os.system("ulimit -c 0") # disable core dumps os.system("umask 022") # enforce files be readable by others if not os.path.exists(options.commandFilePath): print('Error: File ' + options.commandFilePath + ' does not exist!') return -1 # TODO: Write to a log? print('Starting processing pool with ' + str(options.numProcesses) +' processes.') pool = multiprocessing.Pool(options.numProcesses) taskHandles = [] framesToDo = set() if options.redoFrameList != "" and os.path.exists(options.redoFrameList): with open(options.redoFrameList, 'r') as f: text = f.read() for line in text.split('\n'): line = line.strip() if line == "": continue framesToDo.add(int(line)) # Open the file and loop through all the lines # - Count the lines as we go so we only process the desired lines print('Opening command file ' + options.commandFilePath) text = '' with open(options.commandFilePath, 'r') as f: text = f.read() for line in text.split('\n'): if line == "": continue # If the frame range is turned off, just run the commands as-is. if (options.startFrame < 0 and options.stopFrame < 0): # Add the command to the task pool taskHandles.append(pool.apply_async(runCommand, (line,))) continue (begFrame, endFrame) = icebridge_common.getFrameRangeFromBatchFolder(line) # Check line indices if begFrame >= options.startFrame and begFrame < options.stopFrame: if options.redoFrameList != "": if begFrame in framesToDo: folderName = icebridge_common.getBatchFolderFromBatchLine(line) if os.path.exists(folderName): print("will wipe " + folderName) cmd = "rm -rf " + folderName print(cmd) try: os.system(cmd) except Exception as e: pass else: print("Could not find " + folderName) else: print("Will skip frame: " + str(begFrame)) continue # Add the command to the task pool taskHandles.append(pool.apply_async(runCommand, (line,))) # Wait for all the tasks to complete print('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.') icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, interactive=False) # All tasks should be finished, clean up the processing pool icebridge_common.stopTaskPool(pool) print('Jobs finished.') # Run main function if called from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/nav2cam.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file nav2cam.cc /// // Start with an IceBridge nav file, from https://nsidc.org/data/IPAPP1B/versions/1, // for example, sbet_20111012.out. See the User Guide there for more info. // Convert the nav file to text using the Perl reader // from http://nsidc.org/data/docs/daac/icebridge/ipapp1b/index.html // The obtained text file, with a name like sbet_20111012.txt, will have // the format: // // GPS seconds since start of the week, latitude (degrees), longitude (degrees), // Altitude (meters, above WGS84), x velocity, y velocity, z velocity, // roll (radians), pitch (radians), heading (radians), etc. These // are relative to the camera center, with the camera looking down. // // In addition to that nav file in text format, take an input a raw // image, for example, 2011_10_12_09765.JPG, the corresponding L1B // orthoimage_path, DMS_1281706_09765_20111012_18060740.tif. in the format // DMS_fffffff_FFFFF_YYYYMMDD_HHmmsshh.tif, where hh is hundreds of a // second, and the time is GPS time (not UTC!). // // Convert this time stamp into GPS seconds, and look-up and // interpolate the camera position/orientation in the sbet nav // file. Combine with the camera intrinsics tsai file passed on input, // and write down the camera intrinsics + extrinsics tsai file. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/PointUtils.h> #include <vw/Math/Vector.h> #include <vw/Math/Matrix.h> #include <vw/Camera/PinholeModel.h> #include <vw/Math/PositionInterp.h> #include <ctime> #include <stdlib.h> // Turn off warnings from eigen #if defined(__GNUC__) || defined(__GNUG__) #define LOCAL_GCC_VERSION (__GNUC__ * 10000 \ + __GNUC_MINOR__ * 100 \ + __GNUC_PATCHLEVEL__) #if LOCAL_GCC_VERSION >= 40600 #pragma GCC diagnostic push #endif #if LOCAL_GCC_VERSION >= 40202 #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #endif #endif #if defined(__GNUC__) || defined(__GNUG__) #if LOCAL_GCC_VERSION >= 40600 #pragma GCC diagnostic pop #endif #undef LOCAL_GCC_VERSION #endif namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw; using namespace vw::camera; using namespace vw::cartography; using namespace vw::math; // From DMS_1281706_09765_20111012_18060740.tif // extract the date 2011/10/12 and time 18:06:07.40. // Then find how many seconds elapsed since the beginning of the week. double gps_seconds(std::string const& orthoimage_path){ std::string label = "DMS"; std::size_t it = orthoimage_path.find(label); if (it == std::string::npos) vw_throw( ArgumentErr() << "Could not find the text " << label << " in " << orthoimage_path << "\n" ); it += 18; std::string date = orthoimage_path.substr(it, 8); std::string time = orthoimage_path.substr(it+9, 8); std::string year_str = date.substr(0, 4); std::string month_str = date.substr(4, 2); std::string day_str = date.substr(6, 2); int year = atoi(year_str.c_str()); int month = atoi(month_str.c_str()); int day = atoi(day_str.c_str()); std::string hour_str = time.substr(0, 2); std::string min_str = time.substr(2, 2); std::string sec_str = time.substr(4, 2); std::string fsec_str = time.substr(6, 2); int hour = atoi(hour_str.c_str()); int min = atoi(min_str.c_str()); int sec = atoi(sec_str.c_str()); int fsec = atoi(fsec_str.c_str()); // first two digit of fractional part of second std::tm time_in = {sec, min, hour, // second, minute, hour day, // 1-based day month-1, // 0-based month year - 1900}; // year since 1900 std::time_t time_val = std::mktime( & time_in ); // the return value from localtime is a static global - do not call // this function from more than one thread! std::tm const *time_out = std::localtime(&time_val); uint64 weekday = time_out->tm_wday; // Sunday is 0 uint64 all_seconds = weekday*24*3600 + (uint64)hour*3600 + (uint64)min*60 + (uint64)sec; double final_time = static_cast<double>(all_seconds) + static_cast<double>(fsec)/100.0; return final_time; } /// Extract the parameters from a line of the nav file void scan_line(std::string const& line, double& seconds, double& lat, double& lon, double& alt, double& roll, double& pitch, double& heading){ double xv, yv, zv; if (sscanf(line.c_str(), "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", &seconds, &lat, &lon, &alt, &xv, &yv, &zv, &roll, &pitch, &heading) != 10) vw_throw( ArgumentErr() << "Could not scan 10 values from line: " << line << "\n" ); } /// Rotate about X (forward) Matrix3x3 get_rotation_matrix_roll(double roll) { Matrix3x3 M; M(0,0) = 1.0; M(0,1) = 0.0; M(0,2) = 0.0; M(1,0) = 0.0; M(1,1) = cos(roll); M(1,2) = -sin(roll); M(2,0) = 0.0; M(2,1) = sin(roll); M(2,2) = cos(roll); return M; } /// Rotate about Y (right) Matrix3x3 get_rotation_matrix_pitch(double pitch) { Matrix3x3 M; M(0,0) = cos(pitch); M(0,1) = 0.0; M(0,2) = sin(pitch); M(1,0) = 0.0; M(1,1) = 1.0; M(1,2) = 0.0; M(2,0) = -sin(pitch); M(2,1) = 0.0; M(2,2) = cos(pitch); return M; } /// Rotate about Z (down) Matrix3x3 get_rotation_matrix_yaw(double yaw) { Matrix3x3 M; M(0,0) = cos(yaw); M(0,1) = -sin(yaw); M(0,2) = 0.0; M(1,0) = sin(yaw); M(1,1) = cos(yaw); M(1,2) = 0.0; M(2,0) = 0.0; M(2,1) = 0.0; M(2,2) = 1.0; return M; } // TODO: It is not clear what the right order should be! Matrix3x3 get_look_rotation_matrix(double yaw, double pitch, double roll, int rot_order) { // These calculations are copied from the SPOT 123-4-58 Geometry Handbook (GAEL-P135-DOC-001) Matrix3x3 Mp = get_rotation_matrix_pitch(pitch); Matrix3x3 Mr = get_rotation_matrix_roll (roll ); Matrix3x3 My = get_rotation_matrix_yaw (yaw ); if (rot_order == 1) return Mp*Mr*My; if (rot_order == 2) return Mp*My*Mr; if (rot_order == 3) return My*Mp*Mr; if (rot_order == 4) return My*Mr*Mp; if (rot_order == 5) return Mr*Mp*My; if (rot_order == 6) return Mr*My*Mp; Matrix3x3 out = Mp*Mr*My; return out; } /// Generate the pose and position from nav information void parse_camera_pose(std::string const& line, Vector3 & xyz, Quat & look, Quat & ned, double& lon, double& lat, double& alt, double &roll, double &pitch, double &heading, int rot_order){ // Parse the line of text double seconds; scan_line(line, seconds, lat, lon, alt, roll, pitch, heading); // Get cartesian coordinates - this is easy. Datum datum_wgs84("WGS84"); xyz = datum_wgs84.geodetic_to_cartesian(Vector3(lon, lat, alt)); // Generate the NED frame at this location. // - This is relative to the GCC coordinate frame. ned = Quat(datum_wgs84.lonlat_to_ned_matrix(Vector3(lon, lat, alt))); // Get the local rotation matrix at this coordinate. look = Quat(get_look_rotation_matrix(-heading, -pitch, -roll, rot_order)); } struct Options : public vw::GdalWriteOptions { std::string nav_file, input_cam, output_folder; std::vector<std::string> image_files, camera_files; bool detect_offset; int camera_mounting; double time_offset; }; void handle_arguments( int argc, char *argv[], Options& opt ) { std::string cam_list_path; po::options_description general_options(""); general_options.add_options() ("input-cam", po::value(&opt.input_cam)->default_value(""), "The input camera file from where to read the intrinsics.") ("nav-file", po::value(&opt.nav_file)->default_value(""), "The nav file, in text format.") ("time-offset", po::value(&opt.time_offset)->default_value(0.0), "Time offset to be added to the navigation file timestamps.") ("output-folder", po::value(&opt.output_folder)->default_value(""), "Output folder where the camera files are written.") // TODO: Remove secret option to pass in negative values to change how rotations are applied! ("camera-mounting" , po::value(&opt.camera_mounting)->default_value(0), "0 = right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.") ("detect-offset", po::bool_switch(&opt.detect_offset)->default_value(false)->implicit_value(true), "Instead of generating camera files, estimate time offset to the provided camera files.") ("cam-list", po::value(&cam_list_path)->default_value(""), "A sorted list of input ortho and camera files."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Check mandatory inputs if ( opt.nav_file.empty() ) vw_throw( ArgumentErr() << "Missing input nav file.\n" << usage << general_options ); if ( opt.input_cam.empty() ) vw_throw( ArgumentErr() << "Missing input pinhole camera.\n" << usage << general_options ); if ( cam_list_path.empty() ) vw_throw( ArgumentErr() << "Missing input file list file.\n" << usage << general_options ); if ( !cam_list_path.empty() ) { // Load all the names from the camera list file into opt.image_files vw_out() << "Reading input files from " << cam_list_path << "...\n"; std::ifstream input_stream(cam_list_path.c_str()); std::string line; while (getline(input_stream, line)){ // Loop through lines in the file // The line should be in the form "orthoFile, cameraFile" size_t comma = line.find(","); std::string ortho = line.substr(0, comma); std::string camera = line.substr(comma+2); boost::trim(ortho); boost::trim(camera); opt.image_files.push_back(ortho); opt.camera_files.push_back(camera); } input_stream.close(); vw_out() << "Read " << opt.image_files.size() << " files from " << cam_list_path << std::endl; } } /** Class which loads an Icebridge nav file in chunks and provides an interpolator for each chunk. */ class ScrollingNavInterpolator { public: // TODO: Is the rotation interpolation method ok? It is the only // method implemented in VW with sparse time values! typedef vw::LagrangianInterpolationVarTime PosInterpType; typedef vw::LagrangianInterpolationVarTime RotInterpType; // Open the file ScrollingNavInterpolator(std::string const& path, Datum const& datum_in) : m_datum(datum_in) { m_input_stream.open(path.c_str()); // Load the nav file in chunks of this size const size_t INTERPOLATE_CHUNK_LENGTH = 10000; const size_t INTERPOLATE_CHUNK_OVERLAP = 1000; // Overlap between chunks m_chunk_length = INTERPOLATE_CHUNK_LENGTH; m_chunk_overlap = INTERPOLATE_CHUNK_OVERLAP; // Init vectors to a fixed size m_time_vector.resize(INTERPOLATE_CHUNK_LENGTH); m_loc_vector.resize (INTERPOLATE_CHUNK_LENGTH); m_rot_vector.resize (INTERPOLATE_CHUNK_LENGTH); m_first_chunk = true; } ~ScrollingNavInterpolator() { m_input_stream.close(); } /// Set up the next interpolator /// - Returns false if the end of the file was reached bool load_next_chunk(boost::shared_ptr<PosInterpType> &pos_interpolator_ptr, boost::shared_ptr<PosInterpType> &rot_interpolator_ptr) { if (m_input_stream.bad()) return false; size_t index = 0; if (!m_first_chunk) { // Copy N values from the end of the vectors to the beginning const size_t end_index = m_chunk_length - m_chunk_overlap; for (index=0; index<m_chunk_overlap; ++index) { m_time_vector[index] = m_time_vector[end_index+index]; m_loc_vector [index] = m_loc_vector [end_index+index]; m_rot_vector [index] = m_rot_vector [end_index+index]; } } else m_first_chunk = false; // Populate rest of the vectors by reading from the file double time; Vector3 loc, angles; while (read_next_line(time, loc, angles)){ m_time_vector[index] = time; m_loc_vector [index] = loc; m_rot_vector [index] = angles; ++index; if (index == m_chunk_length) break; } // If we hit the end of the file just return false, hopefully no camera // data is right at the end of the file! if (index < m_chunk_length) return false; // Set up the interpolator const int INTERP_RADIUS = 4; pos_interpolator_ptr = boost::shared_ptr<PosInterpType>( new PosInterpType(m_loc_vector, m_time_vector, INTERP_RADIUS)); rot_interpolator_ptr = boost::shared_ptr<RotInterpType>( new RotInterpType(m_rot_vector, m_time_vector, INTERP_RADIUS)); return true; } /// Return the time boundaries of the current interpolator void get_time_boundaries(double &start, double &end) const { start = m_time_vector.front(); end = m_time_vector.back (); } /// Load a target location vector. void set_target_locs(std::vector<Vector3> const& target_locs) { m_target_loc_vector = target_locs; m_target_distance_vector.resize(m_target_loc_vector.size()); m_target_time_vector.resize (m_target_loc_vector.size()); for (size_t i=0; i<m_target_distance_vector.size(); ++i) { m_target_distance_vector[i] = 999999999; m_target_time_vector [i] = -1; } } /// Get target location vector closest times. void get_target_times(std::vector<double> &target_time_vector, std::vector<double> &target_distance_vector) const { target_time_vector = m_target_time_vector; target_distance_vector = m_target_distance_vector; } private: bool m_first_chunk; const Datum m_datum; std::vector<double > m_time_vector; std::vector<Vector3> m_loc_vector; std::vector<Vector3> m_rot_vector; size_t m_chunk_length; size_t m_chunk_overlap; std::ifstream m_input_stream; /// Search for these locations in the entire file! std::vector<Vector3> m_target_loc_vector; std::vector<double > m_target_distance_vector; std::vector<double > m_target_time_vector; /// Read and parse the next line in the file bool read_next_line(double &time, Vector3& loc, Vector3& rot) { // Try to read the line std::string line; if (!getline(m_input_stream, line)) return false; // Parse the line double lat, lon, alt, roll, pitch, heading; scan_line(line, time, lat, lon, alt, roll, pitch, heading); Vector3 llh(lon, lat, alt); loc = m_datum.geodetic_to_cartesian(llh); rot[0] = roll; rot[1] = pitch; rot[2] = heading; // Compare this position to target locations if they exist. if (!m_target_loc_vector.empty()) update_target_locs(loc, time); return true; } /// Check if this location is the best match to any target locations. void update_target_locs(Vector3 loc, double time) { // For each target, record the time and distance if this is the best match. for (size_t i=0; i<m_target_loc_vector.size(); ++i) { double distance = norm_2(loc - m_target_loc_vector[i]); if (distance < m_target_distance_vector[i]) { m_target_distance_vector[i] = distance; m_target_time_vector [i] = time; } } // End loop through targets } }; // End class ScrollingNavInterpolator /// Pretty-print a rotation matrix. void print_matrix(Matrix3x3 const& m) { for (int r=0; r<3; ++r){ for (int c=0; c<3; ++c){ std::cout << m(r,c) << " "; } std::cout << std::endl; } } /// Helper function to write out the camera model once we have the position and pose. /// - This also adds the important row-direction flip from the camera to the image. void write_output_camera(Vector3 const& center, Matrix3x3 const& pose, std::string const& input_cam, std::string const& output_camera) { // Load the reference pinhole model, update it, and write it out to disk. PinholeModel camera_model(input_cam); camera_model.set_camera_center(center); camera_model.set_camera_pose(pose); //vw_out() << "Writing: " << output_camera << std::endl; /* TODO: The camera model does not handle this properly!!! // The image is vertically flipped compared to the camera coordinate system // so negate the appropriate camera parameter here to account for that. Vector3 u_vec, v_vec, w_vec; camera_model.coordinate_frame(u_vec, v_vec, w_vec); camera_model.set_coordinate_frame(u_vec, -1.0*v_vec, w_vec); */ /* Matrix3x3 pose_flip(pose); // As a workaround, negate the Y axis! pose_flip(0,1) *= -1; pose_flip(1,1) *= -1; pose_flip(2,1) *= -1; camera_model.set_camera_pose(pose_flip); */ camera_model.write(output_camera); } // ================================================================================ int main(int argc, char* argv[]) { Options opt; try { handle_arguments(argc, argv, opt); Datum datum_wgs84("WGS84"); // Set the time zone for the program (used inside the gps_seconds function) to UTC // time so our time conversions work properly. // TODO: Should this be always be the same? const std::string TZ_UTC = "TZ=UTC"; vw_out() << "Setting time zone: " << TZ_UTC << std::endl; char* temp = (char*)TZ_UTC.c_str(); putenv(temp); // Print progress every N files const size_t PRINT_INTERVAL = 200; const boost::filesystem::path output_dir(opt.output_folder); // Initialize the nav interpolator std::cout << "Opening input stream: " << opt.nav_file << std::endl; ScrollingNavInterpolator interpLoader(opt.nav_file, datum_wgs84); // Load target camera positions if desired std::vector<Vector3> target_locations; std::vector<double > target_times; if (opt.detect_offset) { std::cout << "Reading target locations...\n"; const size_t num_targets = opt.camera_files.size(); target_locations.reserve(num_targets); target_times.reserve (num_targets); for (size_t i=0; i<num_targets; ++i) { try { boost::filesystem::path camera_file(opt.camera_files[i]); boost::filesystem::path camera_path = output_dir / camera_file; PinholeModel model(camera_path.string()); target_locations.push_back(model.camera_center()); target_times.push_back (gps_seconds(opt.image_files[i])); } catch(...) { } // Just skip cameras that we can't read in. } interpLoader.set_target_locs(target_locations); std::cout << "Done loading " << target_locations.size() << " target locations.\n"; } // End target loading condition boost::shared_ptr<ScrollingNavInterpolator::PosInterpType> pos_interpolator_ptr; boost::shared_ptr<ScrollingNavInterpolator::RotInterpType> rot_interpolator_ptr; double start, end; const double POSE_TIME_DELTA = 0.1; // Look this far ahead/behind to determine direction const double CHUNK_TIME_BOUNDARY = 1.0; // Require this much interpolation time size_t file_index = 0; const size_t num_files = opt.image_files.size(); // Keep loading chunks until the nav data catches up with the images double ortho_time=0; while (interpLoader.load_next_chunk(pos_interpolator_ptr, rot_interpolator_ptr)) { // Get the time boundaries of the current chunk interpLoader.get_time_boundaries(start, end); // When detecting offsets all we want to do is loop through the nav file. if (opt.detect_offset) continue; // Loop through ortho files until we need to advance the nav chunk while (file_index < num_files) { // Get the next input and output paths std::string orthoimage_path = opt.image_files [file_index]; boost::filesystem::path camera_file(opt.camera_files[file_index]); boost::filesystem::path output_camera_path = output_dir / camera_file; // Get time for this frame if (ortho_time == 0) { ortho_time = gps_seconds(orthoimage_path) - opt.time_offset; //vw_out() << orthoimage_path << " -> gps_time = " << ortho_time << std::endl; } // If this ortho is too far ahead in time, move on to the next nav chunk. if (ortho_time > end - CHUNK_TIME_BOUNDARY) break; // Don't advance file_index // If this ortho is too early in time, move on to the next ortho file. if (ortho_time < start + CHUNK_TIME_BOUNDARY) { vw_out() << "Too early to interpolate position for file " << orthoimage_path << std::endl; ++file_index; ortho_time = 0; continue; } // Try to interpolate this ortho position Vector3 gcc_interp, rot_interp; try{ gcc_interp = pos_interpolator_ptr->operator()(ortho_time); rot_interp = rot_interpolator_ptr->operator()(ortho_time); } catch(...){ vw_out() << "Failed to interpolate position for file " << orthoimage_path << std::endl; ++file_index; ortho_time = 0; continue; } Vector3 llh_interp = datum_wgs84.cartesian_to_geodetic(gcc_interp); double roll = rot_interp[0]; double pitch = rot_interp[1]; //double heading = rot_interp[2]; //vw_out() << "For file " << orthoimage_path << " computed LLH " << llh_interp << std::endl; //vw_out() << "Roll = " << roll <<" = "<< roll*180/3.14159<< std::endl; //vw_out() << "Pitch = " << pitch <<" = "<< pitch*180/3.14159<< std::endl; //vw_out() << "Heading = " << heading << std::endl; // Now estimate the rotation information /* For some reason the heading interpolated from the navigation data is about 30 degrees off from what is expected by looking at the flight path. The roll and pitch values are consistent with what is stored in the Icebridge-provided ortho files (the heading is not provided). What has proven to work the best so far is to estimate the camera pose including the heading just by using the flight path, and then to apply the pitch and roll to that matrix. The best order to apply the pitch and roll has been determined by seeing which one map-projects closest to the lidar data. */ // Get a point ahead of and behind the frame location Vector3 gcc_interp_forward = pos_interpolator_ptr->operator()(ortho_time+POSE_TIME_DELTA); Vector3 gcc_interp_backward = pos_interpolator_ptr->operator()(ortho_time-POSE_TIME_DELTA); if (gcc_interp_forward == gcc_interp_backward) { vw_out() << "Failed to estimate pose for file " << orthoimage_path << std::endl; ++file_index; ortho_time = 0; continue; } // From these points get two flight direction vectors and take the mean. Vector3 dir1 = gcc_interp_forward - gcc_interp; Vector3 dir2 = gcc_interp - gcc_interp_backward; Vector3 xDir = (dir1 + dir2) / 2.0; // The Z vector is straight down from the camera to the ground. Vector3 llh_ground = llh_interp; llh_ground[2] = 0; Vector3 gcc_ground = datum_wgs84.geodetic_to_cartesian(llh_ground); Vector3 zDir = gcc_ground - gcc_interp; // Normalize the vectors xDir = xDir / norm_2(xDir); zDir = zDir / norm_2(zDir); // The Y vector is the cross product of the two established vectors Vector3 yDir = cross_prod(zDir, xDir); // Hack to allow testing of whether rotation is applied before axis change. // - The rotations appear to take affect BEFORE the camera mounting (ie they are aircraft rotations) // - Once we are satisfied this is always true, remove the option not to do this. if (opt.camera_mounting > 0) { Matrix3x3 rotation_matrix_gcc(xDir[0], yDir[0], zDir[0], xDir[1], yDir[1], zDir[1], xDir[2], yDir[2], zDir[2]); Matrix3x3 M_roll = get_rotation_matrix_roll (roll); Matrix3x3 M_pitch = get_rotation_matrix_pitch(pitch); Matrix3x3 M = rotation_matrix_gcc*M_pitch*M_roll; // Pre-apply rotation. xDir = Vector3(M(0,0), M(1,0), M(2,0)); // Restore axes yDir = Vector3(M(0,1), M(1,1), M(2,1)); zDir = Vector3(M(0,2), M(1,2), M(2,2)); roll = 0; // Set to zero so that these rotations are not applied twice pitch = 0; } // Account for the camera mounting direction relative to aircraft motion. Vector3 vTemp; switch(abs(opt.camera_mounting)) { case 1: // Left forwards xDir = xDir * -1.0; yDir = yDir * -1.0; break; case 2: // Top forwards vTemp = xDir; xDir = -1.0*yDir; yDir = vTemp; break; case 3: // Bottom forwards vTemp = xDir; xDir = yDir; yDir = -1.0*vTemp; break; default: break; // Right forwards, the default. } // Pack into a rotation matrix Matrix3x3 rotation_matrix_gcc(xDir[0], yDir[0], zDir[0], xDir[1], yDir[1], zDir[1], xDir[2], yDir[2], zDir[2]); // TODO: ENU or NED? //Matrix3x3 ned_matrix = datum_wgs84.lonlat_to_ned_matrix(llh_interp); //Matrix3x3 enu_matrix(ned_matrix(0,1), ned_matrix(0,0), -ned_matrix(0,2), // ned_matrix(1,1), ned_matrix(1,0), -ned_matrix(1,2), // ned_matrix(2,1), ned_matrix(2,0), -ned_matrix(2,2)); //Vector3 north(ned_matrix(0,0), ned_matrix(1,0), ned_matrix(2,0)); //double angle = acos(dot_prod(xDir, north) / (norm_2(north)*norm_2(xDir))); // TODO: Clean all this up once we are satisfied with it! Matrix3x3 M_roll = get_rotation_matrix_roll (roll); Matrix3x3 M_pitch = get_rotation_matrix_pitch(pitch); // Without documentation it is very difficult to determine // which of these rotation orders is correct! // - Could be neither since the yaw rotation is already baked in. //Matrix3x3 M1 = M_pitch*M_roll*rotation_matrix_gcc; // <-- off //Matrix3x3 M2 = M_roll*M_pitch*rotation_matrix_gcc; // <-- off Matrix3x3 M3 = rotation_matrix_gcc*M_pitch*M_roll; // <-- Best //Matrix3x3 M4 = rotation_matrix_gcc*M_roll*M_pitch; // <-- Ok write_output_camera(gcc_interp, M3, opt.input_cam, output_camera_path.string()); // Update progress if (file_index % PRINT_INTERVAL == 0) vw_out() << file_index << " files processed.\n"; ++file_index; ortho_time = 0; } // End loop through ortho files } // End loop through nav batches vw_out() << "Finished looping through the nav file.\n"; /* // TODO: The camera position needs to be interpolated from the several nearest lines! Vector3 xyz; Quat rot, look, ned; // Try out different rotation orders for (int rot_order = 5; rot_order <= 5; rot_order++) { // Process the navigation information from this line parse_camera_pose(curr_line, xyz, look, ned, lon, lat, alt, roll, pitch, heading, rot_order); vw_out() << "Got GCC coord: " << xyz << std::endl; // This is highly confusing, but apparently we need to keep // the original longitude when computing the ned matrix that // transforms from the coordinate system with orgin at the // center of the Earth to the North-East-Down coordinate // system that was obtained from the starting image, rather // than modifying it as we move over new points over the Earth surface. if (lon0 == BIG_NUMBER){ // First value for these variables. lon0 = lon; } //ned = Quat(datum_wgs84.lonlat_to_ned_matrix(Vector3(lon0, lat, alt))); Quat rotation_matrix_gcc = inverse(ned)*inverse(look); // Update the input pinhole model and write it out to disk. input_pinhole_model.set_camera_center(xyz); input_pinhole_model.set_camera_pose(rotation_matrix_gcc); vw_out() << "Writing: " << output_camera_path << std::endl; input_pinhole_model.write(output_camera_path); } // End rot_order loop // Update progress if (i % PRINT_INTERVAL == 0) vw_out() << i << " files completed.\n"; } // End loop through input files */ if (opt.detect_offset) { std::cout << "Getting target results...\n"; // Compute the mean difference between the target camera time and the matched time // and print the results. std::vector<double> matched_times, best_distances; interpLoader.get_target_times(matched_times, best_distances); const size_t num_targets = target_times.size(); double mean_offset = 0, mean_dist = 0; for (size_t i=0; i<num_targets; ++i) { double diff = matched_times[i] - target_times[i]; mean_offset += diff; mean_dist += best_distances[i]; std::cout << "Offset: " << diff << ", dist = " << best_distances[i] << ", time = " << matched_times[i] << std::endl; } mean_offset /= static_cast<double>(num_targets); mean_dist /= static_cast<double>(num_targets); std::cout << "Computed mean nav time offset: " << mean_offset << std::endl; std::cout << "Computed mean nav distance : " << mean_dist << std::endl; } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/IceBridge/orbitviz_pinhole.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file orbitviz.cc /// // This is as scaled-down version of orbitviz that only operates on pinhole files /************************************************************************ * File: orbitviz.cc ************************************************************************/ #include <vw/FileIO/KML.h> #include <vw/FileIO/FileUtils.h> #include <vw/Camera/PinholeModel.h> #include <iomanip> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> #include <boost/filesystem/path.hpp> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/fstream.hpp> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> using namespace vw; using namespace vw::camera; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options : public vw::GdalWriteOptions { Options() {} // Input std::vector<std::string> input_files; std::string path_to_outside_model, input_list; // Settings bool write_csv, hide_labels; double model_scale; ///< Size scaling applied to 3D models // Output std::string out_file; }; void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options(""); general_options.add_options() ("output,o", po::value(&opt.out_file)->default_value("orbit.kml"), "The output kml file that will be written") ("input-list", po::value(&opt.input_list)->default_value(""), "File containing list of input files") ("use-path-to-dae-model,u", po::value(&opt.path_to_outside_model), "Instead of using an icon to mark a camera, use a 3D model with extension .dae") ("hide-labels", po::bool_switch(&opt.hide_labels)->default_value(false)->implicit_value(true), "Hide image names unless the camera is highlighted.") // The KML class applies a model scale of 3000 * this value. ("model-scale", po::value(&opt.model_scale)->default_value(1.0/30.0), "Scale factor applied to 3D model size.") ("write-csv", po::bool_switch(&opt.write_csv)->default_value(false), "Write a csv file with the orbital data."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("input-files", po::value(&opt.input_files) ); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("[options] <input cameras>\n"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); if (opt.input_list != "") { std::ifstream handle(opt.input_list.c_str()); std::string line; size_t count = 0; while (getline(handle, line)){ opt.input_files.push_back(line); ++count; } handle.close(); vw_out() << "Read in " << count << " camera files from " << opt.input_list << std::endl; } if (opt.input_files.empty()) vw_throw( ArgumentErr() << "No input files provided!\n" ); } int main(int argc, char* argv[]) { Options opt; try { handle_arguments( argc, argv, opt ); size_t num_cameras = opt.input_files.size(); // Prepare output directory vw::create_out_dir(opt.out_file); // Create the KML file. KMLFile kml( opt.out_file, "orbitviz" ); // Style listing if ( opt.path_to_outside_model.empty() ) { // Placemark Style kml.append_style( "plane", "", 1.2, "http://maps.google.com/mapfiles/kml/shapes/airports.png", opt.hide_labels); kml.append_style( "plane_highlight", "", 1.4, "http://maps.google.com/mapfiles/kml/shapes/airports.png"); kml.append_stylemap( "camera_placemark", "plane", "plane_highlight" ); } // Load up the datum cartography::Datum datum("WGS84"); std::string csv_file = fs::path(opt.out_file).replace_extension("csv").string(); std::ofstream csv_handle; if ( opt.write_csv ) { csv_handle.open(csv_file.c_str()); if ( !csv_handle.is_open() ) vw_throw( IOErr() << "Unable to open output file.\n" ); } Vector2 camera_pixel(0, 0); // Building Camera Models and then writing to KML std::vector<Vector3> camera_positions(num_cameras); for (size_t i=0; i < num_cameras; i++) { // Load this input file PinholeModel current_camera(opt.input_files[i]); if ( opt.write_csv ) { csv_handle << opt.input_files[i] << ", "; Vector3 xyz = current_camera.camera_center(camera_pixel); csv_handle << std::setprecision(12); csv_handle << xyz[0] << ", " << xyz[1] << ", " << xyz[2] << "\n"; } // End csv write condition // Compute and record the GDC coordinates Vector3 lon_lat_alt = datum.cartesian_to_geodetic(current_camera.camera_center(camera_pixel)); camera_positions[i] = lon_lat_alt; // Adding placemarks std::string display_name = strip_directory(opt.input_files[i]); if (!opt.path_to_outside_model.empty()) { kml.append_model( opt.path_to_outside_model, lon_lat_alt.x(), lon_lat_alt.y(), inverse(current_camera.camera_pose(camera_pixel)), display_name, "", lon_lat_alt[2], opt.model_scale ); } else { kml.append_placemark( lon_lat_alt.x(), lon_lat_alt.y(), display_name, "", "camera_placemark", lon_lat_alt[2], true ); } } // End loop through cameras // Put the Writing: messages here, so that they show up after all other info. vw_out() << "Writing: " << opt.out_file << std::endl; kml.close_kml(); if (opt.write_csv){ vw_out() << "Writing: " << csv_file << std::endl; csv_handle.close(); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/IceBridge/ortho2pinhole.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file ortho2pinhole.cc /// // Given a raw image and a map-projected version of it (an ortho // image), use that to find the camera position and orientation from // which the image was acquired. If no DEM is provided via // opt.reference_dem, we assume for now that the image is mapprojected // onto the datum. Save on output a gcp file, that may be used to further // refine the camera using bundle_adjust. #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/Macros.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/PointUtils.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/ImageUtils.h> #include <vw/Image/ImageTransform.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Camera/PinholeModel.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Math/Geometry.h> #include <vw/Core/Stopwatch.h> #include <vw/FileIO/FileUtils.h> #include <boost/core/null_deleter.hpp> // Turn off warnings from eigen #if defined(__GNUC__) || defined(__GNUG__) #define LOCAL_GCC_VERSION (__GNUC__ * 10000 \ + __GNUC_MINOR__ * 100 \ + __GNUC_PATCHLEVEL__) #if LOCAL_GCC_VERSION >= 40600 #pragma GCC diagnostic push #endif #if LOCAL_GCC_VERSION >= 40202 #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #endif #endif #include <ceres/ceres.h> #include <ceres/loss_function.h> #if defined(__GNUC__) || defined(__GNUG__) #if LOCAL_GCC_VERSION >= 40600 #pragma GCC diagnostic pop #endif #undef LOCAL_GCC_VERSION #endif namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw; using namespace vw::camera; struct Options : public vw::GdalWriteOptions { std::string raw_image, ortho_image, input_cam, output_cam, reference_dem, camera_estimate; double camera_height, orthoimage_height, ip_inlier_factor, max_translation; int ip_per_tile, ip_detect_method, min_ip; bool individually_normalize, keep_match_file, write_gcp_file, skip_image_normalization, show_error, short_circuit, crop_reference_dem; // Make sure all values are initialized, even though they will be // over-written later. Options(): camera_height(-1), orthoimage_height(0), ip_per_tile(0), ip_detect_method(0), individually_normalize(false), keep_match_file(false) {} }; /// Record a set of IP results as ground control points // TODO(oalexan1): Use asp::writeGcp() instead of inline GCP writing. void write_gcp_file(Options const& opt, std::vector<Vector3> const& llh_pts, std::vector<Vector2> const& pixels) { // Save a gcp file, later bundle_adjust can use it to improve upon this camera model std::string gcp_file = opt.output_cam + ".gcp"; vw_out() << "Writing: " << gcp_file << std::endl; std::ofstream output_handle(gcp_file.c_str()); for (size_t pt_iter = 0; pt_iter < pixels.size(); pt_iter++) { // Loop through IPs Vector3 llh = llh_pts[pt_iter]; Vector2 pix = pixels[pt_iter]; // The ground control point ID output_handle << pt_iter; // Lat, lon, height output_handle << ", " << llh[1] << ", " << llh[0] << ", " << llh[2]; // Sigma values output_handle << ", " << 1 << ", " << 1 << ", " << 1; // Pixel value output_handle << ", " << opt.raw_image; output_handle << ", " << pix.x() << ", " << pix.y(); // IP location in image output_handle << ", " << 1 << ", " << 1; // Sigma values output_handle << std::endl; // Finish the line } // End loop through IPs output_handle.close(); } // End write_gcp_file /// Read the camera height above ground from the ortho file, unless it was user-specified. double get_cam_height_estimate(Options const& opt) { double cam_height = opt.camera_height; if (cam_height < 0) { const std::string alt_key = "Altitude"; std::string alt_str; boost::shared_ptr<vw::DiskImageResource> rsrc(new vw::DiskImageResourceGDAL(opt.ortho_image)); vw::cartography::read_header_string(*rsrc.get(), alt_key, alt_str); if (alt_str == "") vw_throw(ArgumentErr() << "Cannot find the 'Altitude' metadata in the image: " << opt.ortho_image << ". It should then be specified on the command line as --camera-height.\n"); cam_height = atof(alt_str.c_str()); } return cam_height; } // Unpack six parameters into a translation and rotation void unpack_parameters(Vector<double> const &C, Vector3 &translation, Matrix3x3 &rotation) { translation = Vector3(C[3], C[4], C[5]); Vector3 angles(C[0], C[1], C[2]); rotation = axis_angle_to_matrix(angles); } /// Find the camera model that best explains the DEM pixel observations class OtpSolveLMA : public vw::math::LeastSquaresModelBase<OtpSolveLMA> { // TODO: Normalize! /// The normalized values are in the -1 to 1 range. std::vector<vw::Vector3> const& m_gcc_coords; std::vector<vw::Vector2> const& m_pixel_coords; boost::shared_ptr<CameraModel> m_camera_model; mutable size_t m_iter_count; public: typedef vw::Vector<double> result_type; // normalized pixels typedef result_type domain_type; // Camera parameters: x,y,z, typedef vw::Matrix<double> jacobian_type; /// Instantiate the solver with a set of GCC <--> Pixel pairs. OtpSolveLMA(std::vector<vw::Vector3> const& gcc_coords, std::vector<vw::Vector2> const& pixel_coords, boost::shared_ptr<CameraModel> camera_model): m_gcc_coords(gcc_coords), m_pixel_coords(pixel_coords), m_camera_model(camera_model), m_iter_count(0) { std::cout << "Init model with " << m_gcc_coords.size() << " points.\n"; } /// Given a set of RPC coefficients, compute the projected pixels. inline result_type operator()(domain_type const& C) const { // Set up the camera with the proposed rotation/translation Vector3 translation; Quat rotation; //unpack_parameters(C, translation, rotation); translation = Vector3(C[3], C[4], C[5]); Vector3 angles(C[0], C[1], C[2]); rotation = axis_angle_to_quaternion(angles); //std::cout << "Testing translation: " << translation << std::endl; //std::cout << "Testing rotation: " << rotation << std::endl; AdjustedCameraModel adj_cam(m_camera_model, translation, rotation); // Compute the error scores const double NO_VIEW_ERROR = 999; const size_t result_size = m_gcc_coords.size() * 2; result_type result; result.set_size(result_size); double mean_error = 0; int missedPixelCount = 0; for (size_t i=0; i<m_gcc_coords.size(); ++i) { try{ Vector2 pixel = adj_cam.point_to_pixel(m_gcc_coords[i]); //std::cout << pixel << " vs " << m_pixel_coords[i] << std::endl; result[2*i ] = pixel[0]; result[2*i+1] = pixel[1]; mean_error += (fabs(pixel[0] - m_pixel_coords[i][0]) + fabs(pixel[1] - m_pixel_coords[i][1]))/2.0; } catch(vw::camera::PointToPixelErr) { result[2*i ] = NO_VIEW_ERROR; result[2*i+1] = NO_VIEW_ERROR; ++missedPixelCount; } } //std::cout << "Iter " << m_iter_count << " -> mean error = " << mean_error/m_gcc_coords.size() << std::endl; //std::cout << "Missed pixel count = " << missedPixelCount << std::endl; ++m_iter_count; return result; } }; // End class OtpSolveLMA /// Solve for a camera translation/rotation based on pixel/gcc coordinate pairs. int solve_for_cam_adjust(boost::shared_ptr<PinholeModel> camera_model, std::vector<Vector2> const& pixel_coords, std::vector<Vector3> const& gcc_coords, vw::Vector3 & translation, vw::Matrix3x3 & rotation, double & norm_error) { // Set up the optimizer model OtpSolveLMA lma_model(gcc_coords, pixel_coords, camera_model); int status; // Use the L-M solver to optimize the camera position. const double abs_tolerance = 1e-24; const double rel_tolerance = 1e-24; const int max_iterations = 2000; // Set up with identity transform const size_t NUM_PARAMS = 6; Vector<double> seed_params(NUM_PARAMS); for (size_t i=0; i<NUM_PARAMS; ++i) seed_params[i] = 0.0; // Pack the target pixel observations const size_t num_observations = pixel_coords.size()*2; Vector<double> packed_observations(num_observations); for (size_t i=0; i<pixel_coords.size(); ++i) { packed_observations[2*i ] = pixel_coords[i][0]; packed_observations[2*i+1] = pixel_coords[i][1]; } // Run the observation Vector<double> final_params; final_params = math::levenberg_marquardt(lma_model, seed_params, packed_observations, status, abs_tolerance, rel_tolerance, max_iterations); if (status < 1) { // This means the solver failed to converge! VW_OUT(DebugMessage, "asp") << "ortho2pinhole: WARNING --> Levenberg-Marquardt solver status = " << status << std::endl; } // Otherwise the solver converged, compute the final error number. Vector<double> final_projected = lma_model(final_params); Vector<double> final_error = lma_model.difference(final_projected, packed_observations); norm_error = norm_2(final_error); unpack_parameters(final_params, translation, rotation); return status; } /// Load the DEM and adjust some options depending on DEM statistics. void load_reference_dem(Options &opt, boost::shared_ptr<DiskImageResource> const& rsrc_ortho, vw::cartography::GeoReference const& ortho_georef, ImageViewRef< PixelMask<float> > &dem, vw::cartography::GeoReference &dem_georef, bool &elevation_change_present) { // Set up the DEM if it was provided. float dem_nodata = -std::numeric_limits<float>::max(); bool is_good = vw::cartography::read_georeference(dem_georef, opt.reference_dem); if (!is_good) { vw_throw(ArgumentErr() << "Error: Cannot read georeference from: " << opt.reference_dem << ".\n"); } { // Read the no-data DiskImageResourceGDAL rsrc(opt.reference_dem); if (rsrc.has_nodata_read()) dem_nodata = rsrc.nodata_read(); } bool crop_is_success = false; if (opt.crop_reference_dem) { // Crop the DEM to a small area and read fully into memory DiskImageView<float> tmp_ortho(rsrc_ortho); BBox2 ortho_bbox = bounding_box(tmp_ortho); DiskImageView<float> tmp_dem(opt.reference_dem); BBox2 dem_bbox = bounding_box(tmp_dem); // The GeoTransform will hide the messy details of conversions vw::cartography::GeoTransform geotrans(dem_georef, ortho_georef, dem_bbox, ortho_bbox); // Get the ortho bbox in the DEM pixel domain BBox2 crop_box = geotrans.reverse_bbox(ortho_bbox); if (crop_box.empty()) { // This should not happen, but go figure, as the DEM could be very coarse ortho_bbox.expand(10000); crop_box = geotrans.reverse_bbox(ortho_bbox); } if (!crop_box.empty() && crop_box.width() < 5000 && crop_box.height() < 5000) { // It may be empty for a very coarse DEM maybe crop_box.expand(200); // TODO: Need to think more here crop_box.crop(dem_bbox); if (!crop_box.empty()) { ImageView<float> cropped_dem = crop(DiskImageView<float>(opt.reference_dem), crop_box); dem = create_mask(cropped_dem, dem_nodata); dem_georef = crop(dem_georef, crop_box); crop_is_success = true; } } vw_out() << "DEM bounding box: " << bounding_box(dem) << std::endl; } // Default behavior if (!crop_is_success) dem = create_mask(DiskImageView<float>(opt.reference_dem), dem_nodata); // Get an estimate of the elevation range in the input image const int HEIGHT_SKIP = 500; // The DEM is very low resolution InterpolationView<EdgeExtensionView< ImageViewRef< PixelMask<float> >, ConstantEdgeExtension >, BilinearInterpolation> interp_dem = interpolate(dem, BilinearInterpolation(), ConstantEdgeExtension()); double max_height = -9999, min_height = 9999999, mean_height=0.0, num_heights = 0; for (int r=0; r<rsrc_ortho->rows(); r+=HEIGHT_SKIP) { for (int c=0; c<rsrc_ortho->cols(); c+=HEIGHT_SKIP) { // Ortho pixel to DEM pixel Vector2 ortho_pix(c, r); Vector2 ll = ortho_georef.pixel_to_lonlat(ortho_pix); Vector2 dem_pix = dem_georef.lonlat_to_pixel(ll); double x = dem_pix.x(), y = dem_pix.y(); if (0 <= x && x <= dem.cols() - 1 && 0 <= y && y <= dem.rows() - 1) { PixelMask<float> dem_val = interp_dem(x, y); if (is_valid(dem_val)) { // Accumulate the valid height range double height = dem_val.child(); mean_height += height; num_heights += 1.0; if (height < min_height) min_height = height; if (height > max_height) max_height = height; } } // End boundary check } // End col loop } // End row loop if (num_heights < 1.0) { vw_out() << "No intersection found with the reference DEM!\n"; return; // No information can be gained in this case. } mean_height = mean_height / num_heights; // Set a flag if we detect there is a significant amount of elevation change in the image const double ELEVATION_CHANGE_THRESHOLD = 40; // Meters double elevation_change = max_height - min_height; vw_out() << "Estimated elevation change of " << elevation_change << std::endl; if (elevation_change > ELEVATION_CHANGE_THRESHOLD) elevation_change_present = true; // If the user did not specify an orthoimage height, use the statistics we computed // to get an estimate. if (opt.orthoimage_height == 0.0) { opt.orthoimage_height = mean_height; vw_out() << "Estimated orthoimage height to be " << opt.orthoimage_height << std::endl; } } // End load_reference_dem void load_camera_and_find_ip(Options const& opt, boost::shared_ptr<DiskImageResource> const& rsrc_raw, boost::shared_ptr<DiskImageResource> const& rsrc_ortho, std::string const& match_filename, boost::shared_ptr<CameraModel> &cam) { std::string out_prefix = "tmp-prefix"; std::string stereo_session = "pinhole"; float nodata1, nodata2; asp::SessionPtr session(asp::StereoSessionFactory::create(stereo_session, opt, opt.raw_image, opt.ortho_image, opt.input_cam, opt.input_cam, out_prefix)); asp::get_nodata_values(rsrc_raw, rsrc_ortho, asp::stereo_settings().nodata_value, nodata1, nodata2); cam = session->camera_model(opt.raw_image, opt.input_cam); // Skip IP finding if the match file exists since the code will re-use it anyways. if (boost::filesystem::exists(match_filename)) { vw_out() << "Using existing match filename " << match_filename << std::endl; return; } try { // IP matching may not succeed for all pairs // Get masked views of the images to get statistics from DiskImageView<float> image1_view(rsrc_raw), image2_view(rsrc_ortho); ImageViewRef<PixelMask<float>> masked_image1 = create_mask(image1_view, nodata1); ImageViewRef<PixelMask<float>> masked_image2 = create_mask(image2_view, nodata2); vw::Vector<vw::float32,6> image1_stats = asp::gather_stats(masked_image1, "", opt.raw_image); vw::Vector<vw::float32,6> image2_stats = asp::gather_stats(masked_image2, "", opt.ortho_image); session->ip_matching(opt.raw_image, opt.ortho_image, Vector2(masked_image1.cols(), masked_image1.rows()), image1_stats, image2_stats, nodata1, nodata2, cam.get(), cam.get(), match_filename, "", ""); } catch (const std::exception& e) { vw_throw(ArgumentErr() << "Could not find interest points between images " << opt.raw_image << " and " << opt.ortho_image << "\n" << e.what() << "\n"); } //End try/catch } // End load_camera_and_find_ip /// Copy pertinent information from the nav camera estimate to the /// pinhole camera model so that we keep the intrinsic parameters. void update_pinhole_from_nav_estimate(vw::camera::PinholeModel *pcam, vw::camera::PinholeModel const& nav_camera) { // Copy the camera position pcam->set_camera_center(nav_camera.camera_center()); // Copy the camera orientation, being careful to avoid undiagnosed quaternion/matrix issue. pcam->set_camera_pose(nav_camera.get_rotation_matrix()); // Copy the camera<->image transform which nav2cam uses to flip the vertical axis. // -> This is not currently happening because our camera model is not properly // handling those parameters! For now we are messing with the pose instead. Vector3 u_vec, v_vec, w_vec; nav_camera.coordinate_frame(u_vec, v_vec, w_vec); pcam->set_coordinate_frame(u_vec, v_vec, w_vec); } /// Generate the estimated camera using a 3D affine transform or load in from a file. /// - pcam is the input camera model. void get_estimated_camera_position(Options const& opt, bool have_dem_points, vw::camera::PinholeModel *pcam, std::vector<Vector3> const& raw_flat_xyz, std::vector<Vector3> const& ortho_flat_xyz) { // Use a simple solution to get an initial estimate. // Pack the in/out point pairs into two matrices. int num_pts = raw_flat_xyz.size(); vw_out() << "Using " << num_pts << " points to create the camera model.\n"; vw::Matrix<double> points_in(3, num_pts), points_out(3, num_pts); typedef vw::math::MatrixCol<vw::Matrix<double> > ColView; for (int pt_iter = 0; pt_iter < num_pts; pt_iter++) { ColView colIn (points_in, pt_iter); ColView colOut(points_out, pt_iter); colIn = raw_flat_xyz [pt_iter]; colOut = ortho_flat_xyz[pt_iter]; } // Call function to compute a 3D affine transform between the two point sets // - This is always between the nadir facing camera over flat terrain and the // ortho at the estimated constant elevation. // - The ortho elevation needs to be flat so that the "plane" of the camera points // does not tilt away from the correct position trying to align to 3D terrain. vw::Matrix3x3 rotation; vw::Vector3 translation; double scale; vw::math::find_3D_transform(points_in, points_out, rotation, translation, scale); vw_out() << "Determined camera extrinsics from orthoimage: " << std::endl; vw_out() << "scale: " << scale << std::endl; // Apply the transform to the camera. pcam->apply_transform(rotation, translation, scale); std::cout << "Est affine camera:\n" << *pcam << std::endl; if (opt.camera_estimate != "") { // Load the estimated camera PinholeModel est_cam(opt.camera_estimate); std::cout << "est_cam = \n" << est_cam << std::endl; // If our solution moved too far from the estimated camera, use // the estimated position/pose instead. double dist = norm_2(pcam->camera_center() - est_cam.camera_center()); vw_out() << "Flat affine estimate is " << dist << " meters from the input camera estimate.\n"; if (dist > opt.max_translation) { update_pinhole_from_nav_estimate(pcam, est_cam); vw_out() << "Flat affine estimate difference limit is " << opt.max_translation << ", using input estimate instead\n"; } } // End have camera estimate case } // End load_estimated_camera /// Use IPs from the ortho image and DEM to optimize the camera with a Lev-Mar solver. /// - Returns norm_error of the chosen solution. double refine_camera_with_dem_pts(Options const& opt, vw::cartography::GeoReference const& dem_georef, bool use_extra_caution, std::vector<Vector3> const& ortho_dem_xyz, std::vector<Vector2> const& raw_pixels2, vw::camera::PinholeModel *pcam) { int num_pts = ortho_dem_xyz.size(); // Try multiple solver attempts with varying camera heights const double TARGET_ERROR = 1000; // Error can be quite low but incorrect results tend to be very large const double HEIGHT_STEP = 50; const int NUM_SEARCH_STEPS = 6; // Set up the search elevation offsets // - Only use additional offsets if we don't have an estimated camera file. std::vector<double> height_offsets; height_offsets.push_back(0); if (opt.camera_estimate == "") { for (int i=1; i<=NUM_SEARCH_STEPS; ++i) { height_offsets.push_back(i*HEIGHT_STEP); height_offsets.push_back(-1*i*HEIGHT_STEP); } } const size_t max_attempts = height_offsets.size(); size_t attempt_count = 0; vw::Matrix3x3 rotation, best_rotation; vw::Vector3 translation, best_translation, best_gcc; double norm_error = 99999999999; double best_error = norm_error; // Record starting position Vector3 initial_center_gcc = pcam->camera_center(Vector2(0,0)); Vector3 initial_center_llh = dem_georef.datum().cartesian_to_geodetic(initial_center_gcc); while (attempt_count < max_attempts) { // Set the camera position double new_height = initial_center_llh[2] + height_offsets[attempt_count]; Vector3 new_llh = initial_center_llh; new_llh[2] = new_height; Vector3 new_gcc = dem_georef.datum().geodetic_to_cartesian(new_llh); pcam->set_camera_center(new_gcc); vw_out() << "Running LM solver attempt " << attempt_count << " with starting elevation: " << new_height << std::endl; // Refine our initial estimate of the camera position using an LM solver with the camera model. int status = solve_for_cam_adjust(boost::shared_ptr<PinholeModel> (pcam, boost::null_deleter()), raw_pixels2, ortho_dem_xyz, translation, rotation, norm_error); attempt_count += 1; vw_out() << "LM solver status: " << status << std::endl; if (status < 1) { vw_out() << "LM solver failed!\n"; continue; // Move on to the next attempt } // Success case vw_out() << "Success: LM solver error = " << norm_error << std::endl; // Keep track of our best solution if (norm_error < best_error) { best_rotation = rotation; best_translation = translation; best_error = norm_error; best_gcc = new_gcc; } // If the error was very good, stop trying new solutions. if ((norm_error < TARGET_ERROR) && !use_extra_caution) break; } // End solver attempt loop vw_out() << "Best LM solver error = " << best_error << std::endl; // TODO: Make a function for this? // Apply the transform to the camera. Quat rot_q(best_rotation); pcam->set_camera_center(best_gcc); // Make sure the adjustment applies to the right center location AdjustedCameraModel adj_cam(boost::shared_ptr<PinholeModel>(pcam, boost::null_deleter()), best_translation, rot_q); Quat pose = adj_cam.camera_pose(Vector2()); Vector3 center = adj_cam.camera_center(Vector2()); pcam->set_camera_pose(pose); // TODO: There may be a problem here! pcam->set_camera_center(center); if (opt.show_error) { // Print error in pixels for each IP for (int i=0; i<num_pts; ++i) { Vector2 pixel = pcam->point_to_pixel(ortho_dem_xyz[i]); double diff = norm_2(pixel - raw_pixels2[i]); std::cout << "Error " << i << " = " << diff << std::endl; } } return best_error; } // End function refine_camera_with_dem_pts // Primary task-solving function. void ortho2pinhole(Options & opt) { // Input image handles boost::shared_ptr<DiskImageResource> rsrc_raw(vw::DiskImageResourcePtr(opt.raw_image)), rsrc_ortho(vw::DiskImageResourcePtr(opt.ortho_image)); if ((rsrc_raw->channels() > 1) || (rsrc_ortho->channels() > 1)) vw_throw(ArgumentErr() << "Error: Input images can only have a single channel!\n\n"); // Load GeoRef from the ortho image vw::cartography::GeoReference ortho_georef; bool is_good = vw::cartography::read_georeference(ortho_georef, opt.ortho_image); if (!is_good) { vw_throw(ArgumentErr() << "Error: Cannot read georeference from: " << opt.ortho_image << ".\n"); } // Set up the DEM if it was provided. ImageViewRef< PixelMask<float> > dem; vw::cartography::GeoReference dem_georef; bool has_ref_dem = (opt.reference_dem != ""); bool elevation_change_present = false; if (has_ref_dem) { load_reference_dem(opt, rsrc_ortho, ortho_georef, dem, dem_georef, elevation_change_present); } // When significant elevation change is present, the homography IP filter is not // accurate and we need to compensate by relaxing our inlier threshold. const double ELEVATION_INLIER_SCALE = 10; if (elevation_change_present) { // TODO: Decouple threshold from other params! asp::stereo_settings().epipolar_threshold = 150*asp::stereo_settings().ip_inlier_factor * ELEVATION_INLIER_SCALE; //asp::stereo_settings().ip_inlier_factor *= ELEVATION_INLIER_SCALE; vw_out() << "Due to elevation change, increasing ip_inlier_factor to " << asp::stereo_settings().ip_inlier_factor << std::endl; } // Load camera and find IP std::string match_filename = opt.output_cam + ".match"; boost::shared_ptr<CameraModel> cam; load_camera_and_find_ip(opt, rsrc_raw, rsrc_ortho, match_filename, cam); // The ortho image file must have the height of the camera above the ground. // This can be over-written from the command line. double cam_height = get_cam_height_estimate(opt); vw_out() << "Using estimated cam height: " << cam_height << std::endl; std::vector<vw::ip::InterestPoint> raw_ip, ortho_ip; ip::read_binary_match_file(match_filename, raw_ip, ortho_ip); vw::camera::PinholeModel *pcam = dynamic_cast<vw::camera::PinholeModel*>(cam.get()); if (pcam == NULL) { vw_throw(ArgumentErr() << "Expecting a pinhole camera model.\n"); } if (!(pcam->camera_pose() == Quaternion<double>(1, 0, 0, 0))) { // We like to start with a camera pointing along the z axis. That makes life easy. vw_throw(ArgumentErr() << "Expecting the input camera to have identity rotation.\n"); } /* // There is a vertical flip in the camera/image relationship not included in the camera files! TODO: The camera model is not handling this parameter!!!!!!! Vector3 u_vec, v_vec, w_vec; pcam->coordinate_frame(u_vec, v_vec, w_vec); pcam->set_coordinate_frame(u_vec, -1.0*v_vec, w_vec); */ // Find pairs of points. First point is in the camera coordinate system, // second in the ground coordinate system. This will allow us to transform // the camera to the latter system. // We use two versions of ground points. In one we assume constant height, // in the second we pull the heights from a DEM. If there are enough // of the latter kind of points, we use those. // - The "2" variables go with the "ortho_dem" variables. std::vector<Vector3> raw_flat_xyz, ortho_flat_xyz, ortho_flat_llh; std::vector<Vector3> raw_flat_xyz2, ortho_dem_xyz, ortho_dem_llh; std::vector<Vector2> raw_pixels, raw_pixels2; // Estimate the relative camera height from the terrain // - Make sure the camera always has some room to intersect rays! bool use_extra_caution = false; const double MIN_CAM_HEIGHT = 100; double relative_cam_height = cam_height - opt.orthoimage_height; if (relative_cam_height < MIN_CAM_HEIGHT) { vw_out() << "WARNING: Estimated camera height is too close to the estimated ortho height!\n" << "Forcing the relative camera height to be " << MIN_CAM_HEIGHT << std::endl; relative_cam_height = MIN_CAM_HEIGHT; use_extra_caution = true; } else vw_out() << "Relative cam height = " << relative_cam_height << std::endl; for (size_t ip_iter = 0; ip_iter < raw_ip.size(); ip_iter++) { try { // Get ray from the raw image pixel Vector2 raw_pix(raw_ip[ip_iter].x, raw_ip[ip_iter].y); Vector3 ctr = pcam->camera_center (raw_pix); Vector3 dir = pcam->pixel_to_vector(raw_pix); // We assume the ground is flat. Intersect rays going from camera // with the plane z = cam_height - orthoimage_height. Vector3 point_in = ctr + (relative_cam_height/dir[2])*dir; // Get lonlat location for this IP IP. Vector2 ortho_pix(ortho_ip[ip_iter].x, ortho_ip[ip_iter].y); Vector2 ll = ortho_georef.pixel_to_lonlat(ortho_pix); // Use given assumed height of orthoimage above the datum. Vector3 llh(ll[0], ll[1], opt.orthoimage_height); Vector3 point_out = ortho_georef.datum().geodetic_to_cartesian(llh); raw_flat_xyz.push_back(point_in); ortho_flat_xyz.push_back(point_out); ortho_flat_llh.push_back(llh); raw_pixels.push_back(raw_pix); if (!has_ref_dem) continue; // Now let's see if the DEM is any good PixelMask<float> dem_val; dem_val.invalidate(); Vector2 dem_pix = dem_georef.lonlat_to_pixel(ll); double x = dem_pix.x(), y = dem_pix.y(); // Is this pixel contained in the DEM? if (0 <= x && x <= dem.cols() - 1 && 0 <= y && y <= dem.rows() - 1) { InterpolationView<EdgeExtensionView< ImageViewRef< PixelMask<float> >, ConstantEdgeExtension >, BilinearInterpolation> interp_dem = interpolate(dem, BilinearInterpolation(), ConstantEdgeExtension()); dem_val = interp_dem(x, y); if (is_valid(dem_val)) { Vector3 llh(ll[0], ll[1], dem_val.child()); Vector3 point_out = dem_georef.datum().geodetic_to_cartesian(llh); raw_flat_xyz2.push_back(point_in); ortho_dem_xyz.push_back(point_out); ortho_dem_llh.push_back(llh); raw_pixels2.push_back(raw_pix); } } // end considering the reference DEM } catch(...) {} // Ignore any points which trigger a camera exception } // See if enough points were found const int num_ip_found = static_cast<int>(raw_pixels.size()); const int num_dem_ip_found = static_cast<int>(ortho_dem_xyz.size()); if (num_ip_found < opt.min_ip) { if (!opt.keep_match_file) { vw_out() << "Removing: " << match_filename << std::endl; boost::filesystem::remove(match_filename); } // If we have the estimated model use that, better than nothing. if (opt.camera_estimate != "") { PinholeModel est_cam(opt.camera_estimate); update_pinhole_from_nav_estimate(pcam, est_cam); } vw_throw(ArgumentErr() << "Error: Only found " << num_ip_found << " interest points, quitting.\n"); } // See if enough points on the DEM were found bool use_dem_points = false; if (has_ref_dem) { const int MIN_NUM_DEM_POINTS = 8; if ((num_ip_found > num_dem_ip_found) && (num_dem_ip_found < MIN_NUM_DEM_POINTS)) { vw_out() << "Less than " << MIN_NUM_DEM_POINTS << " interest points were on the DEM. Igorning the DEM " << "and using the constant height: " << opt.orthoimage_height << "\n"; } else { // Use the DEM points use_dem_points = true; } } // Get our best estimate of the camera position // - This will be from an affine transform between points or // just be loaded from an input file. get_estimated_camera_position(opt, use_dem_points, pcam, raw_flat_xyz, ortho_flat_xyz); Vector3 gcc_cam_est = pcam->camera_center(); Vector3 llh_cam_est = ortho_georef.datum().cartesian_to_geodetic(gcc_cam_est); vw_out() << "Non-DEM camera center located at " << llh_cam_est << std::endl; if (use_dem_points) { // Use a Lev-Mar solver to refine the camera points using the DEM. double refine_error = refine_camera_with_dem_pts(opt, dem_georef, use_extra_caution, ortho_dem_xyz, raw_pixels2, pcam); Vector3 llh_cam_dem = ortho_georef.datum().cartesian_to_geodetic(pcam->camera_center()); vw_out() << "DEM enhanced camera center located at " << llh_cam_dem << std::endl; // If an estimate was provided and the DEM optimization moved us too far away from that estimate, // revert back to the input estimate. Also revert if the error was too high. const double MAX_REFINE_ERROR = 4000; if (opt.camera_estimate != "") { bool revert_camera = false; if (refine_error > MAX_REFINE_ERROR) { vw_out() << "Refinement error is too high, reverting to input camera estimate.\n"; revert_camera = true; } else { double dist = norm_2(pcam->camera_center() - gcc_cam_est); vw_out() << "Camera distance from estimate is " << dist << std::endl; if (dist > opt.max_translation) { vw_out() << "Camera solution is too far from the input estimate, reverting to estimate.\n"; revert_camera = true; } } if (revert_camera) { // Use estimated camera with input camera intrinsics PinholeModel est_cam(opt.camera_estimate); update_pinhole_from_nav_estimate(pcam, est_cam); } } } // End of second pass DEM handling case vw_out() << "Writing: " << opt.output_cam << std::endl; pcam->write(opt.output_cam); // Save a gcp file in case we want to use it for something later. if (opt.write_gcp_file) { if (use_dem_points) { write_gcp_file(opt, ortho_dem_llh, raw_pixels2); } else { write_gcp_file(opt, ortho_flat_llh, raw_pixels); } } if (!opt.keep_match_file) { vw_out() << "Removing: " << match_filename << std::endl; boost::filesystem::remove(match_filename); } } /// If an rgb input image was passed in, convert to a temporary grayscale /// image and work on that instead. /// - This is useful for the Icebridge case. std::string handle_rgb_input(std::string const& input_path, Options const& opt) { boost::shared_ptr<DiskImageResource> rsrc(vw::DiskImageResourcePtr(input_path)); if (rsrc->channels() != 3) return input_path; // Nothing to do in this case vw_out() << "Assuming input image is RGB format...\n"; std::string gray_path = input_path + "_gray.tif"; // Read the misc header strings from the file so we can propogate them // to the output file. std::map<std::string, std::string> keywords; vw::cartography::read_header_strings(*rsrc.get(), keywords); vw::cartography::GeoReference georef; bool has_georef = vw::cartography::read_georeference(georef, input_path); bool has_nodata = true; double nodata = 0.0; block_write_gdal_image(gray_path, weighted_rgb_to_gray(DiskImageView<PixelRGB<uint8> >(input_path)), has_georef, georef, has_nodata, nodata, opt, ProgressCallback::dummy_instance(), keywords); return gray_path; } void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("camera-estimate", po::value(&opt.camera_estimate)->default_value(""), "An estimated camera model used for location and pose estimate only.") ("max-translation", po::value(&opt.max_translation)->default_value(10.0), "The maximum distance the camera solution is allowed to move from camera-estimate.") ("camera-height", po::value(&opt.camera_height)->default_value(-1.0), "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.") ("orthoimage-height", po::value(&opt.orthoimage_height)->default_value(0.0), "The approximate height above the datum, in meters, at which the orthoimage is positioned. We assume flat ground. See also --reference-dem.") ("reference-dem", po::value(&opt.reference_dem)->default_value(""), "If provided, extract from this DEM the heights above the ground rather than assuming the value in --orthoimage-height.") ("ip-per-tile", po::value(&opt.ip_per_tile)->default_value(0), "How many interest points to detect in each 1024^2 image tile (default: automatic determination).") ("ip-detect-method",po::value(&opt.ip_detect_method)->default_value(1), "Interest point detection algorithm (0: Integral OBALoG, 1: OpenCV SIFT (default), 2: OpenCV ORB.") ("minimum-ip", po::value(&opt.min_ip)->default_value(5), "Don't create a camera model if fewer than this many interest point matches were found.") ("ip-inlier-factor", po::value(&opt.ip_inlier_factor)->default_value(0.2), "Interest points inlier factor.") ("individually-normalize", po::bool_switch(&opt.individually_normalize)->default_value(false)->implicit_value(true), "Individually normalize the input images instead of using common values.") ("skip-image-normalization", po::bool_switch(&opt.skip_image_normalization)->default_value(false)->implicit_value(true), "Skip the step of normalizing the values of input images.") ("short-circuit", po::bool_switch(&opt.short_circuit)->default_value(false)->implicit_value(true), "No processing, just copy input intrinsic parameters to camera-estimate and write out.") ("show-error", po::bool_switch(&opt.show_error)->default_value(false)->implicit_value(true), "Print point error.") ("keep-match-file", po::bool_switch(&opt.keep_match_file)->default_value(false)->implicit_value(true), "Don't delete the .match file after running.") ("write-gcp-file", po::bool_switch(&opt.write_gcp_file)->default_value(false)->implicit_value(true), "Write a bundle_adjust compatible gcp file.") ("crop-reference-dem", po::bool_switch(&opt.crop_reference_dem)->default_value(false)->implicit_value(true), "Crop the reference DEM to a generous area to make it faster to load."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("raw-image", po::value(&opt.raw_image)) ("orthoimage", po::value(&opt.ortho_image)) ("input-cam", po::value(&opt.input_cam)) ("output-cam", po::value(&opt.output_cam)); po::positional_options_description positional_desc; positional_desc.add("raw-image", 1); positional_desc.add("orthoimage", 1); positional_desc.add("input-cam", 1); positional_desc.add("output-cam", 1); std::string usage("<raw image> <ortho image> <input pinhole cam> <output pinhole cam> [options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Copy the IP settings to the global stereo_settings() object asp::stereo_settings().ip_detect_method = opt.ip_detect_method; asp::stereo_settings().individually_normalize = opt.individually_normalize; asp::stereo_settings().skip_image_normalization = opt.skip_image_normalization; asp::stereo_settings().ip_inlier_factor = opt.ip_inlier_factor; asp::stereo_settings().ip_per_tile = opt.ip_per_tile; if (opt.raw_image.empty()) vw_throw(ArgumentErr() << "Missing input raw image.\n" << usage << general_options); if (opt.ortho_image.empty()) vw_throw(ArgumentErr() << "Missing input ortho image.\n" << usage << general_options); if (opt.input_cam.empty()) vw_throw(ArgumentErr() << "Missing input pinhole camera.\n" << usage << general_options); if (opt.output_cam.empty()) vw_throw(ArgumentErr() << "Missing output pinhole camera.\n" << usage << general_options); if (opt.camera_estimate != "") { if (!boost::filesystem::exists(opt.camera_estimate)) { vw_throw(ArgumentErr() << "Estimated camera file " << opt.camera_estimate << " does not exist!\n"); } } if (opt.short_circuit && opt.camera_estimate == "") vw_throw(ArgumentErr() << "Estimated camera file is required with the short-circuit option.\n"); // Create the output directory vw::create_out_dir(opt.output_cam); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.output_cam); } // ================================================================================ int main(int argc, char* argv[]) { Options opt; try { handle_arguments(argc, argv, opt); if (opt.short_circuit) { vw_out() << "Creating camera without using ortho image.\n"; // Load input camera files vw_out() << "Loading: " << opt.input_cam << std::endl; PinholeModel input_cam(opt.input_cam); vw_out() << "Loading: " << opt.camera_estimate << std::endl; PinholeModel est_cam(opt.camera_estimate); // Copy camera position and pose from estimate camera to input camera input_cam.set_camera_center(est_cam.camera_center()); input_cam.set_camera_pose (est_cam.camera_pose ()); // Write to output camera vw_out() << "Writing: " << opt.output_cam << std::endl; input_cam.write(opt.output_cam); return 0; } opt.raw_image = handle_rgb_input(opt.raw_image, opt); opt.ortho_image = handle_rgb_input(opt.ortho_image, opt); ortho2pinhole(opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/IceBridge/pbs_functions.py ================================================ import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing import re, shutil, platform import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, pbs_functions, archive_functions, run_helper import asp_system_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] '''Contains functions for working with the PBS job system on the Pleiades supercomputer''' # Constants MAX_PBS_NAME_LENGTH = 15 # Wait this many seconds between checking for job completion SLEEP_TIME = 60 def cleanJobID(jobID): '''Remove the part after the dot, when the input looks like 149691.pbspl233b.''' jobID = jobID.strip() m = re.match('^(.*?)\.', jobID) if m: return m.group(1) else: return jobID def getActiveJobs(user): '''Returns a list of the currently active jobs and their status''' # Run qstat command to get a list of all active jobs by this user cmd = ['qstat', '-u', user] (textOutput, err, status) = \ asp_system_utils.executeCommand(cmd, outputPath=None, suppressOutput = True, redo=True, noThrow=True, numAttempts = 1000, sleepTime = 60 ) lines = textOutput.split('\n') # Strip header lines NUM_HEADER_LINES = 3 JOBID_INDEX = 0 NAME_INDEX = 3 STATUS_INDEX = 7 if len(lines) <= NUM_HEADER_LINES: return [] lines = lines[NUM_HEADER_LINES:] # Pick out all the job names and put them in a list jobs = [] for line in lines: parts = line.split() if len(parts) < STATUS_INDEX: continue jobID = cleanJobID(parts[JOBID_INDEX]) jobName = parts[NAME_INDEX] status = parts[STATUS_INDEX] jobs.append((jobID, jobName, status)) return jobs def getNumCores(nodeType): '''Return the number of cores available for a given node type''' if nodeType == 'wes': # Merope return 12 if nodeType == 'san': return 16 if nodeType == 'ivy': return 20 if nodeType == 'has': return 24 if nodeType == 'bro': return 28 raise Exception('Unrecognized node type: ' + nodeType) def submitJob(jobName, queueName, maxHours, logger, minutesInDevelQueue, groupId, nodeType, commandPath, args, logPrefix, priority=None, pythonPath='/u/oalexan1/.local/lib/python2.7/site-packages'): '''Submits a job to the PBS system. Any such job must invoke icebridge_common.switchWorkDir().''' if len(queueName) > MAX_PBS_NAME_LENGTH: raise Exception('Job name "'+queueName+'" exceeds the maximum length of ' + str(MAX_PBS_NAME_LENGTH)) numCpus = getNumCores(nodeType) # Cores or CPUs? hourString = '"'+str(maxHours)+':00:00"' # We must create and execute a shell script, to be able to explicitely # direct the output and error to files, without counting # on PBS to manage that, as that one overfloes. # All our outputs and errors will go to the "verbose" files, # while PBS will write its summaries, etc, to the other files. shellScriptPath = logPrefix + '_script.sh' verboseOutputPath = logPrefix + '_verbose_output.log' verboseErrorsPath = logPrefix + '_verbose_errors.log' outputPath = logPrefix + '_output.log' errorsPath = logPrefix + '_errors.log' workDir = os.getcwd() numAttempts = 1000 # For debugging if minutesInDevelQueue > 0: queueName = 'devel' hourString = '00:' + str(minutesInDevelQueue).zfill(2) + ':00' #numAttempts = 1 # For some reason qsub errors out in the devel queue # The "-m eb" option sends the user an email when the process begins and when it ends. # The -r n ensures the job does not restart if it runs out of memory. # Debug the environment #for v in os.environ.keys(): # logger.info("env is " + v + '=' + str(os.environ[v])) # We empty PYTHONSTARTUP and LD_LIBRARY_PATH so that python can function # properly on the nodes. priorityString = '' if priority: priorityString = ' -p ' + str(priority) + ' ' # Generate the shell command shellCommand = ( "%s %s > %s 2> %s\n" % (commandPath, args, verboseOutputPath, verboseErrorsPath) ) with open(shellScriptPath, 'w') as f: f.write("#!/bin/bash\n") f.write(shellCommand) # Make it executable os.system("chmod a+rx " + shellScriptPath) # Run it 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' % (queueName, jobName, priorityString, hourString, groupId, errorsPath, outputPath, workDir, numCpus, nodeType, workDir, pythonPath, shellScriptPath)) #~/repo/python_env/lib/python2.7/site-packages/ #/u/oalexan1/.local/lib/python2.7/site-packages logger.info(pbsCommand) outputPath = None suppressOutput = True redo = True noThrow = True (out, err, status) = \ asp_system_utils.executeCommand(pbsCommand, outputPath, suppressOutput, redo, noThrow, numAttempts, SLEEP_TIME) if status != 0: logger.info(out) logger.info(err) logger.info("Status is: " + str(status)) jobID = '' else: jobID = cleanJobID(out) logger.info("Submitted job named " + str(jobName) + " with id " + str(jobID)) return jobID def waitForJobCompletion(jobIDs, logger, name=None): '''Sleep until all of the submitted jobs containing the provided job prefix have completed''' postfix = '.' if name: postfix = ' from flight ' + name + '.' logger.info("Began waiting on " + str(len(jobIDs)) + " job(s)" + postfix) jobsRunning = [] user = icebridge_common.getUser() stillWorking = True while stillWorking: time.sleep(SLEEP_TIME) stillWorking = False # Look through the list for jobs with the run's date in the name allJobs = getActiveJobs(user) numActiveJobs = 0 for (jobID, jobName, status) in allJobs: if jobID in jobIDs: numActiveJobs += 1 # Matching job found so we keep waiting stillWorking = True # Print a message if this is the first time we saw the job as running if (status == 'R') and (jobID not in jobsRunning): jobsRunning.append(jobID) logger.info('Started running job named ' + str(jobName) + ' with id ' + str(jobID)) logger.info("Waiting on " + str(numActiveJobs) + " jobs" + postfix) ================================================ FILE: src/asp/IceBridge/pleiades_job_runner.sh ================================================ #!/bin/bash # Simple shell script for running command line calls echo $PATH # Grab the only input argument TOOL=$1 COMMAND=$2 echo $TOOL echo $COMMAND # TODO: Verify that the log file goes to the correct place # Call the function $TOOL $COMMAND ================================================ FILE: src/asp/IceBridge/pleiades_manager.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Top level program to process all of the Icebridge data. # - This program is not sophisticated enough to handle everything and will need to be # superceded by another script. import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing import re, shutil, glob import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, pbs_functions, archive_functions, run_helper import asp_system_utils, generate_flight_summary asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] #========================================================================= # Parameters # Constants used in this file CAMGEN_PBS_QUEUE = 'normal' BATCH_PBS_QUEUE = 'normal' BLEND_PBS_QUEUE = 'normal' ORTHOGEN_PBS_QUEUE = 'normal' LABEL_PBS_QUEUE = 'normal' GROUP_ID = 's2022' g_start_time = -1 g_stop_time = -1 def start_time(): global g_start_time, g_stop_time g_start_time = time.time() def stop_time(job, logger): global g_start_time, g_stop_time g_stop_time = time.time() wall_s = float(g_stop_time - g_start_time)/3600.0 logger.info( ("Elapsed time for %s is %g hours." % (job, wall_s) ) ) PFE_NODES = ['san', 'ivy', 'has', 'bro'] #========================================================================= # 'wes' = Westmere = 12 cores/24 processors, 48 GB mem, SBU 1.0, Launch from mfe1 only! # 'san' = Sandy bridge = 16 cores, 32 GB mem, SBU 1.82 # 'ivy' = Ivy bridge = 20 cores, 64 GB mem, SBU 2.52 # 'has' = Haswell = 24 cores, 128 GB mem, SBU 3.34 # 'bro' = Broadwell = 28 cores, 128 GB mem, SBU 4.04 def getParallelParams(nodeType, task): '''Return (numProcesses, numThreads, tasksPerJob, maxHours) for running a certain task on a certain node type''' # Define additional combinations and edit as needed. if task == 'camgen': if nodeType == 'san': return (8, 4, 300, 8) if nodeType == 'ivy': return (10, 3, 400, 8) if nodeType == 'bro': return (14, 4, 500, 8) if nodeType == 'wes': return (8, 4, 150, 8) # more jobs will go faster if task == 'dem': if nodeType == 'san': return (2, 8, 70, 8) if nodeType == 'ivy': return (4, 8, 80, 8) if nodeType == 'bro': return (6, 8, 100, 8) if nodeType == 'wes': return (3, 8, 50, 12) if task == 'blend': if nodeType == 'san': return (8, 3, 1200, 6) if nodeType == 'ivy': return (10, 3, 1000, 6) if nodeType == 'bro': return (14, 4, 1400, 6) # 200 seems to finish in 10 minutes if nodeType == 'wes': return (8, 3, 300, 8) # use more nodes so less jobs per node if task == 'orthogen': if nodeType == 'san': return (8, 4, 350, 8) if nodeType == 'ivy': return (10, 2, 400, 8) if nodeType == 'bro': return (14, 4, 500, 8) if nodeType == 'wes': return (8, 4, 200, 8) if task == 'label': if nodeType == 'san': return (8, 4, 200, 8) if nodeType == 'ivy': return (6, 4, 100, 8) if nodeType == 'bro': return (12, 3, 150, 8) if nodeType == 'wes': return (3, 1, 35, 8) raise Exception('No params defined for node type ' + nodeType + ', task = ' + task) #========================================================================= def getLabelTrainingPath(userName): '''Path to the OSSP label training file''' if userName == 'smcmich1': #return '/u/smcmich1/repo/OSSP/training_datasets/icebridge_v3_training_data.h5' return '/u/smcmich1/repo/OSSP/training_datasets/icebridge_v5_training_data.h5' if userName == 'oalexan1': raise Exception('Need to set the label training path!') def getEmailAddress(userName): '''Return the email address to use for a user''' if userName == 'smcmich1': return 'scott.mcmichael@gmail.com' if userName == 'oalexan1': return 'oleg.alexandrov@nasa.gov' def sendEmail(address, subject, body): '''Send a simple email from the command line''' # Remove any quotes, as that confuses the command line. subject = subject.replace("\"", "") body = body.replace("\"", "") try: cmd = 'mail -s "' + subject + '" ' + address + ' <<< "' + body + '"' #print(cmd) # too verbose to print os.system(cmd) except Exception as e: print("Could not send mail.") #--------------------------------------------------------------------- def readRunList(path, options): '''Reads a list of runs in this format: GR 20110411. Output is a list of (site, yyyymmdd) pairs.''' runList = [] with open(path, 'r') as f: for line in f: if line[0] == '#': # Skip comments continue parts = line.split() # Site, yyyymmdd # Set up a class object to help manage the run runList.append(run_helper.RunHelper(parts[0], parts[1], options.unpackDir)) return runList def addToRunList(path, run): '''Append a run to a list file''' with open(path, 'a') as f: f.write(path[0]+' '+path[1]+'\n') def getRunsToProcess(allRuns, skipRuns, doneRuns): '''Go through the run lists to get the list of runs that should be processed.''' runList = [] for run in allRuns: if (run in skipRuns) or (run in doneRuns): continue runList.append(run) return runList #--------------------------------------------------------------------- def runFetch(run, options, logger): '''Fetch all the data for a run if it is not already available''' logger.info("Checking all data is present.") # Check if already done allIsFetched = False if options.skipCheckInputs: allIsFetched = True else: try: # Note that the check below is incomplete, it does not check for Fireball allIsFetched = run.allSourceDataFetched(options.noNavFetch) except Exception as e: allIsFetched = False logger.warning('Caught error checking fetch status.\n' + str(e)) # Fetch the archive from lfe, only in the case the directory is not present if not options.skipTapeFetch: try: archive_functions.retrieveRunData(run, options.unpackDir, options.useTar, options.forceTapeFetch, options.skipTapeCameraFetch, logger) except Exception as e: pass # return gracefully pythonPath = asp_system_utils.which('python') # Fetch whatever is missing directly from NSIDC, and force to have the indices # regenerated in this case. Hopefully just a few files are missing. # - This is likely to have to fetch the large nav data file(s). # Note that we do all conversions as well, sans camera generation. But hopefully the run is clean and all # has been done by now. if not options.noRefetch: logger.info("Fetch from NSIDC.") 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)) if options.noNavFetch: cmd += ' --no-nav' if options.simpleCameras: cmd += ' --simple-cameras' if options.manyip: cmd += ' --many-ip' if options.cameraMounting: cmd += ' --camera-mount ' + str(options.cameraMounting) if options.inputCalCamera != "": cmd += ' --input-calibration-camera ' + options.inputCalCamera if options.skipValidate or options.parallelValidate: # We will do validation in parallel later cmd += ' --skip-validate' if not options.noRefetchIndex: cmd += ' --refetch-index' if options.refetchNav: cmd += ' --refetch-nav' logger.info(cmd) os.system(cmd) # Rename to the newest convention of computing the timestamp. # This must happen after all is fetched from tape and we # refreshed the indices from NSIDC. run.massRename(options.startFrame, options.stopFrame, logger) # Many of the archived input lidar files have problems, correct them here. # - Remove blank lines and remove trailing commas. # - Would be nice if this step was faster. #cmd = 'find '+run.getLidarFolder()+''' -name "*.csv" -exec sed -i 's/,$//;/,/!d' {} \;''' #print cmd #os.system(cmd) # Don't need to check results, they should be cleaned out in conversion call. run.setFlag('fetch_complete') def runConversion(run, options, conversionAttempt, logger): '''Run the conversion tasks for this run on the supercomputer nodes. This will also run through the fetch step to make sure we have everything we need. Note: This function calls itself!''' # Check if already done. If we want to validate in parallel, we must still # go through this step, though hopefully it will be very fast then. # TODO: Can have a check if all files have been validated (jpeg, ortho, image, etc), # and then, if all cameras are also present, this step can be skipped. try: if run.conversionIsFinished(options.startFrame, options.stopFrame) and \ run.checkForImages(options.startFrame, options.stopFrame, logger) and \ (not options.parallelValidate): logger.info('Conversion is already complete.') return except Exception as e: logger.warning('Caught error checking conversion status, re-running conversion.\n' + str(e)) logger.info('Converting data for run ' + str(run)) # Run just the nav data --> estimated camera conversion on the PFE machine. # - This is single threaded and may take a while but is primarily IO driven. # - We can't start the slower ortho2pinhole processes until this is finished. # - If all of the camera files already exist this call will finish up very quickly. if not options.noNavFetch: logger.info("Generating estimated camera files from the navigation files.") pythonPath = asp_system_utils.which('python') 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)) if options.simpleCameras: cmd += ' --simple-cameras' else: # Nav is probably bad, use ortho2pinhole only. cmd += ' --no-nav' if options.skipValidate or options.parallelValidate: cmd += ' --skip-validate' if options.cameraMounting: cmd += ' --camera-mount ' + str(options.cameraMounting) if options.inputCalCamera != "": cmd += ' --input-calibration-camera ' + options.inputCalCamera logger.info(cmd) os.system(cmd) logger.info("Finished generating estimated camera files from nav.") # Retrieve parallel processing parameters (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, 'camgen') # Split the conversions across multiple nodes using frame ranges # - The first job submitted will be the only one that converts the lidar data. # We will also run validation in parallel. numFrames = options.stopFrame - options.startFrame + 1 numCamgenJobs = numFrames / tasksPerJob if numCamgenJobs < 1: numCamgenJobs = 1 outputFolder = run.getFolder() scriptPath = icebridge_common.fullPath('full_processing_script.py') 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' % ( options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, numThreads, numProcesses, outputFolder)) if options.noNavFetch: args += ' --no-nav' if options.simpleCameras: # This option greatly decreases the conversion run time args += ' --simple-cameras' else: # Nav is probably bad, use ortho2pinhole only. args += ' --no-nav' if options.manyip: args += ' --many-ip' if options.noOrthoConvert: args += ' --no-ortho-convert' if options.cameraMounting: args += ' --camera-mount ' + str(options.cameraMounting) if options.inputCalCamera != "": args += ' --input-calibration-camera ' + options.inputCalCamera baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits. # Get the location to store the logs pbsLogFolder = run.getPbsLogFolder() os.system('mkdir -p ' + pbsLogFolder) # Submit all the jobs currentFrame = options.startFrame jobIDs = [] for i in range(0, numCamgenJobs): jobName = ('%s%06d%s' % ('C', currentFrame, baseName) ) # C for camera startFrame = currentFrame stopFrame = currentFrame+tasksPerJob-1 if (i == numCamgenJobs - 1): stopFrame = options.stopFrame # Make sure nothing is lost at the end thisArgs = (args + ' --start-frame ' + str(startFrame) + ' --stop-frame ' + str(stopFrame ) ) if i != 0: # Only the first job will convert lidar files thisArgs += ' --no-lidar-convert' logPrefix = os.path.join(pbsLogFolder, 'convert_' + jobName) pythonPath = asp_system_utils.which('python') logger.info('Submitting camera generation job: ' + scriptPath + ' ' + thisArgs) jobID = pbs_functions.submitJob(jobName, CAMGEN_PBS_QUEUE, maxHours, logger, options.minutesInDevelQueue, GROUP_ID, options.nodeType, pythonPath, scriptPath + " " + thisArgs, logPrefix) jobIDs.append(jobID) currentFrame += tasksPerJob # Wait for conversions to finish pbs_functions.waitForJobCompletion(jobIDs, logger) if options.parallelValidate: # Consolidate various validation files done in parallel, to make the subsequent # step faster. validFilesList = icebridge_common.validFilesList(outputFolder, options.startFrame, options.stopFrame) validFilesSet = set() validFilesSet = icebridge_common.updateValidFilesListFromDisk(validFilesList, validFilesSet) allValidFiles = glob.glob(os.path.join(outputFolder, icebridge_common.validFilesPrefix() + '*')) for fileName in allValidFiles: validFilesSet = icebridge_common.updateValidFilesListFromDisk(fileName, validFilesSet) icebridge_common.writeValidFilesList(validFilesList, validFilesSet) # Now we will refetch and reprocess all files that were not # valid so far. Hopefully not too many. This must be on a head # node to be able to access the network. We don't do any orthoconvert # here as that one is too time-consuming logger.info("Refetch and process any invalid files.") pythonPath = asp_system_utils.which('python') 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)) if options.noNavFetch: cmd += ' --no-nav' if options.simpleCameras: cmd += ' --simple-cameras' if options.manyip: cmd += ' --many-ip' if options.noOrthoConvert: cmd += ' --no-ortho-convert' if options.cameraMounting: cmd += ' --camera-mount ' + str(options.cameraMounting) if options.inputCalCamera != "": cmd += ' --input-calibration-camera ' + options.inputCalCamera logger.info(cmd) os.system(cmd) # See if there are any new files for which we need to run ortho2pinhole on some node logger.info("See for which files to redo ortho.") (orthoList, numFrames) = \ icebridge_common.orthoListToRerun(validFilesSet, outputFolder, options.startFrame, options.stopFrame) logger.info("Number of cameras to regenerate using ortho2pinhole: " + str(numFrames)) if numFrames > 0: if numFrames > tasksPerJob and conversionAttempt == 0: # Too many frames, just rerun all jobs conversionAttempt = 1 logger.info("Re-running conversion with many nodes.") runConversion(run, options, conversionAttempt, logger) return logger.info("Re-running conversion with one node.") 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)) if options.noNavFetch: cmd += ' --no-nav' if options.simpleCameras: cmd += ' --simple-cameras' if options.manyip: cmd += ' --many-ip' if options.noOrthoConvert: cmd += ' --no-ortho-convert' if options.cameraMounting: cmd += ' --camera-mount ' + str(options.cameraMounting) if options.inputCalCamera != "": cmd += ' --input-calibration-camera ' + options.inputCalCamera #logger.info(cmd) jobIDs = [] jobName = ('%s%06d%s' % ('C', 0, baseName) ) # C for camera logPrefix = os.path.join(pbsLogFolder, 'convert_' + jobName) logger.info('Submitting camera generation job: ' + cmd) pythonPath = asp_system_utils.which('python') jobID = pbs_functions.submitJob(jobName, CAMGEN_PBS_QUEUE, maxHours, logger, options.minutesInDevelQueue, GROUP_ID, options.nodeType, pythonPath, cmd, logPrefix) jobIDs.append(jobID) # Wait for conversions to finish pbs_functions.waitForJobCompletion(jobIDs, logger, baseName) logger.info("Finished refetching and reprocessing.") # Check the results # - If we didn't get everything keep going and process as much as we can. success = False try: success = run.conversionIsFinished(options.startFrame, options.stopFrame, verbose = True) except Exception as e: logger.warning('Caught error checking conversion status.\n' + str(e)) if not success: #raise Exception('Failed to convert run ' + str(run)) logger.warning('Could not fully convert run ' + str(run)) run.setFlag('conversion_complete') def generateBatchList(run, options, listPath, logger): '''Generate a list of all the processing batches required for a run''' logger.info("Generate batch list: " + listPath) refDemName = icebridge_common.getReferenceDemName(run.site) refDemPath = os.path.join(options.refDemFolder, refDemName) # Retrieve parallel processing parameters (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, 'dem') # No actual processing is being done here so it can run on the PFE # - No start/stop frames here, always generate the full list so it is stable. pythonPath = asp_system_utils.which('python') scriptPath = icebridge_common.fullPath('full_processing_script.py') 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 ' % (pythonPath, scriptPath, options.inputCalFolder, options.refDemFolder, run.site, run.yyyymmdd, numThreads, numProcesses, run.getFolder(), options.bundleLength)) # For full runs we must cleanup, as otherwise we'll run out of space if not options.skipCleanup: cmd += ' --cleanup' if options.noNavFetch: cmd += ' --no-nav' if options.simpleCameras: cmd += ' --simple-cameras' if options.manyip: cmd += ' --many-ip' if options.cameraMounting: cmd += ' --camera-mount ' + str(options.cameraMounting) if options.inputCalCamera != "": cmd += ' --input-calibration-camera ' + options.inputCalCamera # TODO: Find out what takes so long here! # - Also fix the logging! logger.info(cmd) os.system(cmd) def getOutputFolderFromBatchCommand(batchCommand): '''Extract the output folder from a line in the batch file''' m = re.match('^.*?--output-folder\s+(.*?)\s', batchCommand) if not m: raise Exception('Failed to extract output folder from: ' + batchCommand) return m.group(1) # TODO: Share code with the other function def filterBatchJobFile(run, batchListPath, logger): '''Make a copy of the batch list file which only contains incomplete batches.''' runFolder = run.getFolder() newBatchPath = batchListPath + '_onlyFailed.txt' # Make sure each batch produced the aligned DEM file #batchOutputName = 'out-blend-DEM.tif' batchOutputName = 'out-align-DEM.tif' #batchOutputName = 'out-ortho.tif' fIn = open(batchListPath, 'r') fOut = open(newBatchPath, 'w') for line in fIn: outputFolder = getOutputFolderFromBatchCommand(line) targetPath = os.path.join(outputFolder, batchOutputName) if not os.path.exists(targetPath): fOut.write(line) fIn.close() fOut.close() return newBatchPath def submitBatchJobs(run, options, batchListPath, logger): '''Read all the batch jobs required for a run and distribute them across job submissions. Returns the common string in the job names.''' if not os.path.exists(batchListPath): logger.error('Failed to generate batch list file: ' + batchListPath) raise Exception('Failed to generate batch list file: ' + batchListPath) # Retrieve parallel processing parameters (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, 'dem') # Read the batch list logger.info("Reading batch list: " + batchListPath) batchLines = [] with open(batchListPath, 'r') as f: text = f.read() batchLines = text.split('\n') # Find all lines in the batch list in range framesInRange = [] for line in batchLines: if line == "": continue (begFrame, endFrame) = icebridge_common.getFrameRangeFromBatchFolder(line) if begFrame >= options.startFrame and begFrame < options.stopFrame: framesInRange.append(begFrame) frameGroups = icebridge_common.partitionArray(framesInRange, tasksPerJob) numBatches = len(framesInRange) numBatchJobs = len(frameGroups) logger.info( ("Num batches: %d, tasks per job: %d, number of jobs: %d" % (numBatches, tasksPerJob, numBatchJobs) ) ) baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits. # Call the tool which just executes commands from a file scriptPath = icebridge_common.fullPath('multi_process_command_runner.py') outputFolder = run.getFolder() pbsLogFolder = run.getPbsLogFolder() jobIDs = [] for group in frameGroups: if len(group) == 0: continue firstFrame = group[0] lastFrame = group[-1] + 1 # go one beyond jobName = ('%s%06d%s' % ('D', firstFrame, baseName) ) # D for DEM # Specify the range of lines in the file we want this node to execute args = ('--command-file-path %s --start-frame %d --stop-frame %d --num-processes %d' % \ (batchListPath, firstFrame, lastFrame, numProcesses)) if options.redoFrameList != "": args += ' --force-redo-these-frames ' + options.redoFrameList logPrefix = os.path.join(pbsLogFolder, 'batch_' + jobName) logger.info('Submitting DEM creation job: ' + scriptPath + ' ' + args) pythonPath = asp_system_utils.which('python') jobID = pbs_functions.submitJob(jobName, BATCH_PBS_QUEUE, maxHours, logger, options.minutesInDevelQueue, GROUP_ID, options.nodeType, pythonPath, scriptPath + ' ' + args, logPrefix) jobIDs.append(jobID) # Waiting on these jobs happens outside this function return (baseName, jobIDs) def launchJobs(run, mode, options, logger): '''Run a blend, ortho gen, or label job.''' # TODO: Also merge with the logic for creating a camera file. logger.info('Running task ' + mode + ' for run ' + str(run)) # Retrieve parallel processing parameters (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType, mode) # Split the jobs across multiple nodes using frame ranges numFrames = options.stopFrame - options.startFrame + 1 numJobs = numFrames / tasksPerJob if numJobs < 1: numJobs = 1 logger.info( ("Num frames: %d, tasks per job: %d, number of %s jobs: %d" % (numFrames, tasksPerJob, mode, numJobs) ) ) outputFolder = run.getFolder() scriptPath = "" extraArgs = "" jobTag = "" priority = 5 if mode == 'orthogen': scriptPath = icebridge_common.fullPath('gen_ortho.py') queueName = ORTHOGEN_PBS_QUEUE jobTag = 'O' extraArgs = ' --bundle-length ' + str(options.bundleLength) + \ ' --camera-mounting ' + str(options.cameraMounting) elif mode == 'blend': scriptPath = icebridge_common.fullPath('blend_dems.py') queueName = BLEND_PBS_QUEUE jobTag = 'B' extraArgs = ' --blend-to-fireball-footprint --bundle-length ' + str(options.bundleLength) if options.computeDiffToPrev: extraArgs += ' --compute-diff-to-prev-dem' elif mode == 'label': scriptPath = icebridge_common.fullPath('label_images.py') queueName = LABEL_PBS_QUEUE jobTag = 'L' priority = 0 # Make these slightly lower priority than the other jobs. # May need to experiment with these numbers. extraArgs = ' --training ' + getLabelTrainingPath(icebridge_common.getUser()) else: raise Exception("Unknown mode: " + mode) args = (('--site %s --yyyymmdd %s --num-threads %d --num-processes %d ' + \ '--output-folder %s %s ') % (run.site, run.yyyymmdd, numThreads, numProcesses, outputFolder, extraArgs)) baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits. # Get the location to store the logs pbsLogFolder = run.getPbsLogFolder() # Submit all the jobs jobNames = [] jobIDs = [] currentFrame = options.startFrame for i in range(0, numJobs): jobName = ('%s%06d%s' % (jobTag, currentFrame, baseName) ) # 'B'lend or 'O'rtho startFrame = currentFrame stopFrame = currentFrame+tasksPerJob # Last frame passed to the tool is not processed if (i == numJobs - 1): stopFrame = options.stopFrame # Make sure nothing is lost at the end thisArgs = (args + ' --start-frame ' + str(startFrame) + ' --stop-frame ' + str(stopFrame) ) logPrefix = os.path.join(pbsLogFolder, mode + '_' + jobName) logger.info('Submitting job: ' + scriptPath + ' ' + thisArgs) pythonPath = asp_system_utils.which('python') jobID = pbs_functions.submitJob(jobName, queueName, maxHours, logger, options.minutesInDevelQueue, GROUP_ID, options.nodeType, pythonPath, scriptPath + ' ' + thisArgs, logPrefix, priority, pythonPath) jobNames.append(jobName) jobIDs.append(jobID) currentFrame += tasksPerJob return (baseName, jobNames, jobIDs) def checkResultsForType(run, options, batchListPath, batchOutputName, logger): '''Check how many of the specified file type we produced''' numNominal = 0 numProduced = 0 (minFrame, maxFrame) = run.getFrameRange() with open(batchListPath, 'r') as f: for line in f: outputFolder = getOutputFolderFromBatchCommand(line) (begFrame, endFrame) = icebridge_common.getFrameRangeFromBatchFolder(outputFolder) if begFrame < options.startFrame: continue if begFrame >= options.stopFrame: continue if begFrame >= maxFrame: # This is necessary. For the last valid frame, there is never a DEM. continue targetPath = os.path.join(outputFolder, batchOutputName) numNominal += 1 if os.path.exists(targetPath): numProduced += 1 else: logger.info('Did not find: ' + targetPath) if not os.path.exists(outputFolder): logger.error('Check output folder position in batch log file!') return (numNominal, numProduced) def checkLabelResults(run, options, logger): '''Get a count of the label files produced in a frame range.''' numNominal = 0 numProduced = 0 numOrtho = 0 (minFrame, maxFrame) = run.getFrameRange() labelFolder = run.getLabelFolder() orthoFolder = run.getOrthoFolder() jpegFolder = run.getJpegFolder() for frame in range(minFrame, maxFrame+1): labelFile = icebridge_common.makeLabelFileName (run, frame) orthoFile = icebridge_common.makeLabelOrthoFileName(run, frame) jpegFile = icebridge_common.makeJpegFileName (run, frame) labelPath = os.path.join(labelFolder, labelFile) orthoPath = os.path.join(orthoFolder, orthoFile) jpegPath = os.path.join(jpegFolder, jpegFile ) numNominal += 1 if os.path.exists(labelPath): numProduced += 1 if os.path.exists(orthoPath): # Won't exist if the label doesn't numOrtho += 1 else: logger.info('Did not find: ' + orthoPath) else: if os.path.exists(jpegPath): logger.info('Did not find: ' + labelPath) else: logger.info('Jpeg missing for file: ' + labelPath) return (numNominal, numProduced, numOrtho) def checkResults(run, options, logger, batchListPath): logger.info("Checking the results.") # TODO: Some existing functionlity below can be integrated better. runFolder = run.getFolder() packedErrorLog = os.path.join(runFolder, 'packedErrors.log') with open(packedErrorLog, 'w') as errorLog: # Look for errors in the log files # TODO: These log files should be in the batch folders now! pbsLogFolder = run.getPbsLogFolder() logFileList = os.listdir(pbsLogFolder) logFileList = [os.path.join(pbsLogFolder, x) for x in logFileList] errorCount = 0 errorWords = ['but crn has', 'LD_PRELOAD cannot be preloaded'] # TODO: Add more! for log in logFileList: with open(log, 'r') as f: for line in f: hasError = False for word in errorWords: if word in line: hasError = True # Count up the errors and copy them to the packed error log. if hasError: errorLog.write(line) errorCount += 1 logger.info('Counted ' + str(errorCount) + ' errors in log files!') # Produced DEMs (numNominalDems, numProducedDems) = checkResultsForType(run, options, batchListPath, icebridge_common.blendFileName(), logger) # Produced orthos (numNominalOrthos, numProducedOrthos) = checkResultsForType(run, options, batchListPath, icebridge_common.orthoFileName(), logger) # Produced labels (numNominalLabels, numProducedLabels, numLabelOrthos) = checkLabelResults(run, options, logger) resultText = "" resultText += ('Created %d out of %d output DEMs. ' % (numProducedDems, numNominalDems)) resultText += ('Created %d out of %d output ortho images. ' % (numProducedOrthos, numNominalOrthos)) resultText += ('Created %d out of %d output label files. ' % (numProducedLabels, numNominalLabels)) resultText += ('Created %d out of %d output label ortho files. ' % (numLabelOrthos, numNominalLabels)) resultText += ('Detected %d errors. ' % (errorCount)) # Load index of fireball DEMs for comparison fireballDems = {} try: allFireballDems = icebridge_common.getCorrectedFireballDems(run.getFolder()) for frame in allFireballDems.keys(): if frame < options.startFrame or frame >= options.stopFrame: continue fireballDems[frame] = allFireballDems[frame] except Exception as e: # No fireball logger.info(str(e)) numFireballDems = len(fireballDems.keys()) alignedDems = run.existingFilesDict(icebridge_common.alignFileName(), options.startFrame, options.stopFrame) numAlignedDems = len(alignedDems.keys()) blendedDems = run.existingFilesDict(icebridge_common.blendFileName(), options.startFrame, options.stopFrame) numBlendedDems = len(blendedDems.keys()) orthos = run.existingFilesDict(icebridge_common.orthoFileName(), options.startFrame, options.stopFrame) numOrthos = len(orthos.keys()) numMissingBlended = 0 for frame in sorted(alignedDems.keys()): if frame not in blendedDems.keys(): logger.info("Found aligned DEM but no blended DEM for frame: " + str(frame)) numMissingBlended += 1 numMissingOrthos = 0 for frame in sorted(blendedDems.keys()): if frame not in orthos.keys(): logger.info("Found blended DEM but no ortho for frame: " + str(frame)) numMissingOrthos += 1 numMissingAligned = 0 for frame in sorted(fireballDems.keys()): if not frame in blendedDems.keys(): logger.info("Found fireball DEM but no blended DEM for frame: " + str(frame)) numMissingAligned += 1 vals = ["Number of aligned DEMs: " + str(numAlignedDems), "Number of blended DEMs: " + str(numBlendedDems), "Number of ortho images: " + str(numOrthos), "Number of fireball DEMs: " + str(numFireballDems), "Aligned DEMs without blended DEMs: " + str(numMissingBlended), "Blended DEMs without ortho images: " + str(numMissingOrthos), "Fireball DEMs with no corresponding blended DEM: " + str(numMissingAligned) ] resultText += "\n" + "\n".join(vals) logger.info(resultText) labelsWereSuccess = (numProducedLabels == numNominalLabels) runWasSuccess = False if (numProducedDems == numNominalDems) and \ (numProducedOrthos == numNominalOrthos) and \ (errorCount == 0): runWasSuccess = True if options.generateLabels: # Labels are probably run by themselves. runWasSuccess = labelsWereSuccess return (runWasSuccess, resultText) def checkRequiredTools(): '''Verify that we have all the tools we will be calling during the script.''' scripts = ['full_processing_script.py', 'multi_process_command_runner.py', 'merge_orbitviz.py', 'process_icebridge_run.py', 'process_icebridge_batch.py', 'lvis2kml.py', 'blend_dems.py', 'gen_ortho.py'] tools = ['ortho2pinhole', 'camera_footprint', 'bundle_adjust', 'stereo', 'point2dem', 'mapproject'] for tool in tools: asp_system_utils.checkIfToolExists(tool) for script in scripts: if not os.path.exists(icebridge_common.fullPath(script)): raise Exception("Could not find: " + script) def main(argsIn): try: usage = '''usage: pleiades_manager.py <options> ''' parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--base-dir", dest="baseDir", default=os.getcwd(), help="Where all the inputs and outputs are stored.") parser.add_argument("--unpack-dir", dest="unpackDir", default=None, help="Where to unpack the data.") parser.add_argument("--yyyymmdd", dest="yyyymmdd", default=None, help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", required=True, help="Name of the location of the images (AN, GR, or AL)") parser.add_argument("--node-type", dest="nodeType", default='ivy', help="Node type to use (wes[mfe], san, ivy, has, bro)") # Debug option parser.add_argument('--minutes-in-devel-queue', dest='minutesInDevelQueue', type=int, default=0, help="If positive, submit to the devel queue for this many minutes.") parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on.') parser.add_argument("--camera-calibration-folder", dest="inputCalFolder", default=None, help="The folder containing camera calibration.") parser.add_argument("--input-calibration-camera", dest="inputCalCamera", default="", help="Instead of looking up the calibrated camera in the calibration folder, use this one.") parser.add_argument("--reference-dem-folder", dest="refDemFolder", default=None, help="The folder containing DEMs that created orthoimages.") parser.add_argument('--bundle-length', dest='bundleLength', default=2, type=int, help="The number of images to bundle adjust and process in a single batch.") parser.add_argument("--recompute-batch-file", action="store_true", dest="recomputeBatches", default=False, help="Recompute an existing batch file.") parser.add_argument("--no-refetch", action="store_true", dest="noRefetch", default=False, help="Do not attempt to refetch from NSIDC.") parser.add_argument("--no-refetch-index", action="store_true", dest="noRefetchIndex", default=False, help="Do not refetch the index from NSIDC.") parser.add_argument("--refetch-nav", action="store_true", dest="refetchNav", default=False, help="Force refetch the nav data.") parser.add_argument("--skip-check-inputs", action="store_true", dest="skipCheckInputs", default=False, help="Skip checking if files exist. This can be very slow for many files.") parser.add_argument("--skip-completed-batches", action="store_true", dest="failedBatchesOnly", default=False, help="Don't reprocess completed batches.") parser.add_argument("--force-redo-these-frames", dest="redoFrameList", default="", 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).") parser.add_argument("--use-tar", action="store_true", dest="useTar", default=False, help="Fetch from lfe using tar instead of shift.") parser.add_argument("--skip-fetch", action="store_true", dest="skipFetch", default=False, help="Don't fetch.") parser.add_argument("--skip-tape-fetch", action="store_true", dest="skipTapeFetch", default=False, 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.") parser.add_argument("--force-tape-fetch", action="store_true", dest="forceTapeFetch", default=False, help="Fetch from tape even if a partial run directory is alrady present.") parser.add_argument("--skip-fetch-camera-from-tape", action="store_true", dest="skipTapeCameraFetch", default=False, help="Don't fetch any archived cameras, create them from scratch.") parser.add_argument("--skip-convert", action="store_true", dest="skipConvert", default=False, help="Don't convert.") parser.add_argument("--skip-archive-cameras", action="store_true", dest="skipArchiveCameras", default=False, help="Skip archiving the cameras.") parser.add_argument("--skip-batch-gen", action="store_true", dest="skipBatchGen", default=False, help="Skip generating batches.") parser.add_argument("--skip-process", action="store_true", dest="skipProcess", default=False, help="Don't process the batches.") parser.add_argument("--skip-blend", action="store_true", dest="skipBlend", default=False, help="Skip blending.") parser.add_argument("--skip-ortho-gen", action="store_true", dest="skipOrthoGen", default=False, help="Skip ortho image generation.") parser.add_argument("--skip-check-outputs", action="store_true", dest="skipCheckOutputs", default=False, help="Skip checking the outputs.") parser.add_argument("--skip-report", action="store_true", dest="skipReport", default=False, help="Skip invoking the flight summary tool.") parser.add_argument("--skip-kml", action="store_true", dest="skipKml", default=False, help="Skip kml gen when doing a flight summary report.") parser.add_argument("--skip-archive-aligned-cameras", action="store_true", dest="skipArchiveAlignedCameras", default=False, help="Skip archiving the aligned cameras.") parser.add_argument("--skip-archive-orthos", action="store_true", dest="skipArchiveOrthos", default=False, help="Skip archiving the generated ortho images.") parser.add_argument("--skip-archive-summary", action="store_true", dest="skipArchiveSummary", default=False, help="Skip archiving the summary.") parser.add_argument("--skip-archive-run", action="store_true", dest="skipArchiveRun", default=False, help="Skip archiving the DEMs.") parser.add_argument("--skip-cleanup", action="store_true", dest="skipCleanup", default=False, help="Don't cleanup extra files from a run.") parser.add_argument("--skip-email", action="store_true", dest="skipEmail", default=False, help="Don't send email.") parser.add_argument("--no-nav", action="store_true", dest="noNavFetch", default=False, help="Don't fetch or convert the nav data.") parser.add_argument('--many-ip', action='store_true', default=False, dest='manyip', help='If to use a lot of IP in bundle adjustment from the beginning.') parser.add_argument("--no-ortho-convert", action="store_true", dest="noOrthoConvert", default=False, help="Skip generating camera models in the conversion step.") parser.add_argument("--simple-cameras", action="store_true", dest="simpleCameras", default=False, help="Don't use ortho images to refine camera models.") parser.add_argument("--camera-mounting", dest="cameraMounting", default=0, help='0=right-forwards, 1=left-forwards, 2=top-forwards, 3=bottom-forwards.') parser.add_argument("--skip-validate", action="store_true", dest="skipValidate", default=False, help="Don't validate the input data.") parser.add_argument("--compute-diff-to-prev-dem", action="store_true", dest="computeDiffToPrev", default=False, help="Compute the absolute difference between the current DEM " + \ "and the one before it when blending.") parser.add_argument("--no-parallel-validate", action="store_false", dest="parallelValidate", default=True, help="Validate in parallel, during conversion.") parser.add_argument("--wipe-processed", action="store_true", dest="wipeProcessed", default=False, help="Wipe the processed folder.") parser.add_argument("--wipe-all", action="store_true", dest="wipeAll", default=False, help="Wipe completely the directory, including the inputs.") parser.add_argument("--generate-labels", action="store_true", dest="generateLabels", default=False, help="Run python label creation script on input jpegs. Only for sea ice flights!") parser.add_argument("--archive-labels", action="store_true", dest="archiveLabels", default=False, help="Archive the results from --generate-labels.") options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) # Check if we are on the right machine (host, err, status) = asp_system_utils.executeCommand(['uname', '-n'], suppressOutput = True) host = host.strip() if 'pfe' in host and options.nodeType not in PFE_NODES: raise Exception("From machine " + host + " can only launch on: " + " ".join(PFE_NODES)) if 'mfe' in host and options.nodeType != 'wes': raise Exception("From machine " + host + " can only launch on: wes") if options.unpackDir is None: options.unpackDir = os.path.join(options.baseDir, 'data') run = run_helper.RunHelper(options.site, options.yyyymmdd, options.unpackDir) # Set up logging in the run directory options.logFolder = os.path.join(run.getFolder(), 'manager_logs') os.system('mkdir -p ' + options.logFolder) logLevel = logging.INFO logger = icebridge_common.setUpLogger(options.logFolder, logLevel, icebridge_common.manager_log_prefix()) logger.info("Logging in: " + options.logFolder) os.system('mkdir -p ' + options.unpackDir) summaryFolder = run.getSummaryFolder() checkRequiredTools() # Make sure all the needed tools can be found before we start logger.info("Disabling core dumps.") # these just take a lot of room os.system("ulimit -c 0") os.system("umask 022") # enforce files be readable by others # See how many hours we used so far. I think this counter gets updated once a day. (out, err, status) = asp_system_utils.executeCommand("acct_ytd", outputPath = None, suppressOutput = True, redo = True, noThrow = True) logger.info("Hours used so far:\n" + out + '\n' + err) if True: # WARNING: Below we tweak options.startFrame and options.stopFrame. # If a loop over runs is implemeneted, things will break! if not options.skipFetch: # Obtain the data for a run if it is not already done start_time() runFetch(run, options, logger) stop_time("fetch", logger) # This must happen after fetch, otherwise fetch gets confused. # Get the location to store the logs pbsLogFolder = run.getPbsLogFolder() logger.info("Storing logs in: " + pbsLogFolder) os.system('mkdir -p ' + pbsLogFolder) # Narrow the frame range. Note that if we really are at the last # existing frame, we increment 1, to make sure we never miss anything. (minFrame, maxFrame) = run.getFrameRange() if options.startFrame < minFrame: options.startFrame = minFrame if options.stopFrame >= maxFrame: options.stopFrame = maxFrame + 1 # see above logger.info('Detected frame range: ' + str((options.startFrame, options.stopFrame))) if not options.skipConvert: # Run initial camera generation start_time() conversionAttempt = 0 runConversion(run, options, conversionAttempt, logger) stop_time("convert", logger) # I see no reason to exit early #if options.skipProcess and options.skipBlend and options.skipReport and \ # (not options.recomputeBatches) and options.skipArchiveCameras: # logger.info('Quitting early.') # return 0 fullBatchListPath = os.path.join(run.getProcessFolder(), 'batch_commands_log.txt') batchListPath = fullBatchListPath if not options.skipBatchGen: start_time() if os.path.exists(fullBatchListPath) and not options.recomputeBatches: logger.info('Re-using existing batch list file.') else: # Run command to generate the list of batch jobs for this run logger.info('Fetching batch list for run ' + str(run)) generateBatchList(run, options, fullBatchListPath, logger) if options.failedBatchesOnly: logger.info('Assembling batch file with only failed batches...') batchListPath = filterBatchJobFile(run, batchListPath, logger) stop_time("batch gen", logger) if not options.skipProcess: start_time() # Divide up batches into jobs and submit them to machines. logger.info('Submitting jobs for run ' + str(run)) (baseName, jobIDs) = submitBatchJobs(run, options, batchListPath, logger) # Wait for all the jobs to finish logger.info('Waiting for job completion of run ' + str(run)) pbs_functions.waitForJobCompletion(jobIDs, logger, baseName) logger.info('All jobs finished for run '+str(run)) stop_time("dem creation", logger) labelJobNames = None if options.generateLabels: (baseName, labelJobNames, labelJobIds) = launchJobs(run, 'label', options, logger) ## Go ahead and launch the other jobs while these are in the queue # Not running in parallel anymore, so just wait here. pbs_functions.waitForJobCompletion(labelJobIds, logger, baseName) if not options.skipBlend: start_time() (baseName, jobNames, jobIDs) = launchJobs(run, 'blend', options, logger) pbs_functions.waitForJobCompletion(jobIDs, logger, baseName) stop_time("blend", logger) if not options.skipOrthoGen: start_time() (baseName, jobNames, jobIDs) = launchJobs(run, 'orthogen', options, logger) pbs_functions.waitForJobCompletion(jobIDs, logger, baseName) stop_time("orthogen", logger) #if labelJobNames: # Now wait for any label jobs to finish. # pbs_functions.waitForJobCompletion(labelJobIds, logger, baseName) runWasSuccess = True resultText = 'Summary skipped' if not options.skipCheckOutputs: start_time() # Generate a simple report of the results (runWasSuccess, resultText) = checkResults(run, options, logger, fullBatchListPath) stop_time("check outputs", logger) if not options.skipReport: start_time() # Generate a summary folder and send a copy to Lou os.system('mkdir -p ' + summaryFolder) genCmd = ['--yyyymmdd', run.yyyymmdd, '--site', run.site, '--output-folder', summaryFolder, '--parent-folder', run.parentFolder] if ((options.startFrame != icebridge_common.getSmallestFrame()) and (options.stopFrame != icebridge_common.getLargestFrame() ) ): genCmd += ['--start-frame', str(options.startFrame), '--stop-frame', str(options.stopFrame )] if options.skipKml: genCmd += ['--skip-kml'] logger.info("Running generate_flight_summary.py " + " ".join(genCmd)) try: generate_flight_summary.main(genCmd) except Exception as e: # Do not let this one ruin the day, if anything we can run it later logger.info(str(e)) stop_time("report", logger) # Pack up camera folder and store it for later. if not options.skipArchiveCameras: start_time() try: archive_functions.packAndSendCameraFolder(run, logger) except Exception as e: print 'Caught exception sending camera folder' logger.exception(e) stop_time("archive cameras", logger) # Pack up the aligned cameras and store them for later if not options.skipArchiveAlignedCameras: start_time() try: archive_functions.packAndSendAlignedCameras(run, logger) except Exception as e: print 'Caught exception sending aligned cameras' logger.exception(e) stop_time("archive aligned cameras", logger) # Archive the DEMs if not options.skipArchiveRun: start_time() archive_functions.packAndSendCompletedRun(run, logger) stop_time("archive dems", logger) # Pack up the generated ortho images and store them for later if not options.skipArchiveOrthos: start_time() try: archive_functions.packAndSendOrthos(run, logger) except Exception as e: print 'Caught exception sending ortho images.' logger.exception(e) stop_time("archive orthos", logger) # Archive the label files if options.archiveLabels: start_time() archive_functions.packAndSendLabels(run, logger) stop_time("archive labels", logger) # send summary and logs to lunokhod and lfe. # This must be towards the end, as it saves the log of this # script as well. if not options.skipArchiveSummary: start_time() archive_functions.packAndSendSummaryFolder(run, summaryFolder, logger) stop_time("archive summary", logger) if not options.skipEmail: emailAddress = getEmailAddress(icebridge_common.getUser()) logger.info("Sending email to: " + emailAddress) if runWasSuccess: sendEmail(emailAddress, 'OIB run passed - ' + str(run), resultText) else: sendEmail(emailAddress, '"OIB run failed - ' + str(run), resultText) if options.wipeProcessed: processedFolder = run.getProcessFolder() logger.info("Will delete: " + processedFolder) os.system("rm -rf " + processedFolder) if options.wipeAll and runWasSuccess: outFolder = run.getFolder() logger.info("Will delete: " + outFolder) os.system("rm -rf " + outFolder) #raise Exception('DEBUG - END LOOP') logger.info('==== pleiades_manager script has finished for run: ' + str(run) + ' ====') # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/process_calibration_file.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Given a calibration file in pdf format from # https://nsidc.org/data/IODCC0/ # convert it to the tsai format that can be used by ASP. # Usage: python ~/projects/StereoPipeline/src/asp/IceBridge/process_calibration_file.py file.pdf import os, sys, optparse, subprocess, re # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../IceBridge') # for dev ASP pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] def main(argsIn): try: usage = '''usage: process_calibration_file.py file.pdf''' parser = optparse.OptionParser(usage=usage) (options, args) = parser.parse_args(argsIn) except optparse.OptionError as msg: raise Usage(msg) if len(args) != 1: raise Exception(usage) # The input is a pdf file inFile = args[0] base, ext = os.path.splitext(inFile) if ext != ".pdf": raise Exception("The input file must be in pdf format.") if not os.path.isfile(inFile): raise Exception("Missing input file: " + inFile + ".") # Convert from pdf to text pdfToTextExec = asp_system_utils.which("pdftotext") cmd = pdfToTextExec + ' ' + inFile print(cmd) p = subprocess.Popen(cmd, shell=True, universal_newlines=True) os.waitpid(p.pid, 0) txtFile = base + '.txt' if not os.path.isfile(txtFile): raise Exception("Missing file: " + txtFile + ".") tsaiFile = base + '.tsai' # Read the lines lines = [] fin = open(txtFile, 'r') while True: line = fin.readline() if not line: break line = line.strip() if line == "": continue lines.append(line) fin.close() width, height, f, xp, yp, pitch_x, pitch_y, k1, k2, k3, p1, p2, b1, b2 = \ (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1) # Strip the mm count = 0 for line in lines: while True: m = re.match("^(.*?\d)mm(.*?)$", line) if not m: break line = m.group(1) + m.group(2) lines[count] = line count += 1 #print("line is ", line) # Parse the lines count = 0 for line in lines: m = re.match("^.*?Resolution\s*=\s*(\d+)\s*x\s*(\d+)", line) if m and width == -1 and height == -1: width = m.group(1) height = m.group(2) m = re.match("^.*?Pixel width\s*=\s*(.*?),\s*Pixel height\s*=\s*(.*?)\s*$", line) if m and pitch_x == -1 and pitch_y == -1: pitch_x = m.group(1) pitch_y = m.group(2) if pitch_x != pitch_y: raise Exception ("Expecting pixel width and height to be same.") m = re.match(".*?c\s*=", line) if m and f == -1: f = lines[count+3] m = re.match(".*?xp\s*=", line) if m and xp == -1: xp = lines[count+1] m = re.match(".*?yp\s*=", line) if m and yp == -1: yp = lines[count+1] m = re.match(".*?K1\s*=\s*(.*?)\s*$", line) if m and k1 == -1: k1 = m.group(1) m = re.match(".*?K2\s*=\s*(.*?)\s*$", line) if m and k2 == -1: k2 = m.group(1) m = re.match(".*?K3\s*=\s*(.*?)\s*$", line) if m and k3 == -1: k3 = m.group(1) m = re.match(".*?P1\s*=\s*(.*?)\s*$", line) if m and p1 == -1: p1 = m.group(1) m = re.match(".*?P2\s*=\s*(.*?)\s*$", line) if m and p2 == -1: p2 = m.group(1) m = re.match(".*?B1\s*=\s*(.*?)\s*$", line) if m and b1 == -1: b1 = m.group(1) m = re.match(".*?B2\s*=\s*(.*?)\s*$", line) if m and b2 == -1: b2 = m.group(1) count += 1 cu = float(width) * float(pitch_x) / 2.0 cv = float(height) * float(pitch_y) / 2.0 print ("Writing: " + tsaiFile) fout = open(tsaiFile, 'w') fout.write("VERSION_3\n") fout.write("fu = " + f + "\n") fout.write("fv = " + f + "\n") fout.write("cu = " + repr(cu) + "\n") fout.write("cv = " + repr(cv) + "\n") fout.write("u_direction = 1 0 0\n") fout.write("v_direction = 0 1 0\n") fout.write("w_direction = 0 0 1\n") fout.write("C = 0 0 0\n") fout.write("R = 1 0 0 0 1 0 0 0 1\n") fout.write("pitch = " + pitch_x + "\n") fout.write("Photometrix\n") fout.write("xp = " + xp + "\n") fout.write("yp = " + yp + "\n") fout.write("k1 = " + k1 + "\n") fout.write("k2 = " + k2 + "\n") fout.write("k3 = " + k3 + "\n") fout.write("p1 = " + p1 + "\n") fout.write("p2 = " + p2 + "\n") fout.write("b1 = " + b1 + "\n") fout.write("b2 = " + b2 + "\n") fout.close() # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/process_icebridge_batch.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Run bundle adjustment, stereo, generate DEMs, merge dems, perform alignment, etc, # for a series of icebridge images import os, sys, optparse, datetime, logging, multiprocessing, glob, re, shutil # The path to the ASP python files basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) sys.path.insert(0, libexecpath) sys.path.insert(0, toolspath) import icebridge_common import asp_system_utils, asp_alg_utils, asp_geo_utils, asp_image_utils, asp_file_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] # TODO: For the footprint DEM, implement some functions like: # getFootprintPrefix() to avoid replicate the '-footprint-' string all # over the place. def formImageCameraString(inputPairs): '''Generate [images] [cameras] string from a list of input pairs.''' imagesAndCams = "" images = "" cameras = "" for (image, camera) in inputPairs: images += image; images += " " cameras += camera; cameras += " " imagesAndCams = images + cameras return imagesAndCams def makeDemAndCheckError(options, projString, pointCloud, lidarFile, lidarCsvFormatString, threadText, logger): '''Make a DEM from a point cloud and compute the geodiff results with lidar.''' suppressOutput = True redo = True # Generate a DEM file from the point cloud cmd = ('point2dem --tr %lf --t_srs %s %s %s' % (options.demResolution, projString, pointCloud, threadText)) icebridge_common.logger_print(logger, cmd) demPath = pointCloud.replace('.tif', '-DEM.tif') asp_system_utils.executeCommand(cmd, demPath, suppressOutput, redo) # Run geodiff with lidar and read in the results diffPrefix = pointCloud diffPath = diffPrefix + '-diff.csv' cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' % (lidarCsvFormatString, demPath, lidarFile, diffPrefix)) icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo) icebridge_common.logger_print(logger, out + '\n' + err) results = icebridge_common.readGeodiffOutput(diffPath) return (demPath, diffPath, results) # TODO: May not need this function! def getOverlapAmount(dem1, dem2, logger): '''Count the number of overlapping pixels in two DEMs''' # Generate a DEM file from the point cloud mosaicPrefix = os.path.join(os.path.dirname(dem1), 'overlapTemp') mosaicOutput = mosaicPrefix + '-tile-0-count.tif' cmd = ('dem_mosaic --count %s %s -o %s' % (dem1, dem2, mosaicPrefix)) icebridge_common.logger_print(logger, cmd) asp_system_utils.executeCommand(cmd, mosaicOutput, True, True) # Count up the '2' values # Need to be 8 bit for ImageMagick u8Mosaic = mosaicPrefix + '-u8_count.tif' cmd = ('gdal_translate -ot byte %s %s' % (mosaicOutput, u8Mosaic)) icebridge_common.logger_print(logger, cmd) asp_system_utils.executeCommand(cmd, u8Mosaic, True, True) # Now count the overlapping pixels cmd = ('convert ' + u8Mosaic + ' -fill black +opaque "gray(2)" -fill white -opaque "gray(2)" ' + '-format "%[fx:w*h*mean]" info:') icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, u8Mosaic, True, True) if status != 0: raise Exception('Failed to compute overlap amount!') count = int(out.strip()) # Clean up os.remove(mosaicOutput) os.remove(u8Mosaic) return count def robustPcAlign(options, outputPrefix, lidarFile, lidarDemPath, demPath, finalAlignedDEM, projString, lidarCsvFormatString, threadText, logger): '''Try pc_align with increasing max displacements until we it completes with enough lidar points used in the comparison''' # Displacements are still since an initial vertical shift is applied DISPLACEMENTS = [2, 5, 10, 25, 50 #, 50, 100, 200 ] # TODO: Increase these numbers for land flights! ERR_HEADER_SIZE = 3 IDEAL_LIDAR_DIST = 0.1 # Quit aligning if we get under this error MIN_DIST_IMPROVEMENT = 0.25 # Pct improvement in error to accept a larger max-disp MIN_NUM_DIFFS = 100 # Can't trust results with fewer diffs. lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile) alignPrefix = icebridge_common.getAlignPrefix(options.outputFolder) pcAlignFolder = os.path.dirname(alignPrefix) endErrorPath = alignPrefix + '-end_errors.csv' transformPath = alignPrefix + '-transform.txt' invTransPath = alignPrefix + '-inverse-transform.txt' # needed for ortho gen alignedPC = alignPrefix +'-trans_reference.tif' alignedDem = alignedPC.replace('-trans_reference.tif', '-trans_reference-DEM.tif') lidarDiffPath = outputPrefix + "-diff.csv" # Check if the file is already there if ( os.path.exists(alignedDem) or os.path.exists(finalAlignedDEM) ) \ and os.path.exists(lidarDiffPath): results = icebridge_common.readGeodiffOutput(lidarDiffPath) logger.info("Outputs of pc_align already exist.") return alignedDem, lidarDiffPath, results['Mean'] # Estimate an initial vertical shift between our DEM and the lidar data. try: diffPrefix = os.path.join(options.outputFolder, 'out') diffOutput = diffPrefix + '-diff.tif' cmd = ('geodiff %s %s -o %s' % (demPath, lidarDemPath, diffPrefix)) icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, diffOutput, True, True) icebridge_common.logger_print(logger, out + '\n' + err) diffInfo = asp_image_utils.getImageStats(diffOutput) meanDiff = -1.0 * diffInfo[0][2] # This adjustment is made in the down direction. os.system('rm -rf ' + diffOutput) # Go ahead and clean this up now logger.info('Vertical diff estimate from lidar = ' + str(meanDiff)) except: raise Exception('No overlap between lidar DEM and stereo DEM!') bestMeanDiff = -1 bestMaxDisp = -1 bestNumDiffs = -1 bestTransPath = os.path.join(pcAlignFolder, 'best_transform.txt') bestInvTransPath = os.path.join(pcAlignFolder, 'best_inverse_transform.txt') bestDemPath = os.path.join(pcAlignFolder, 'best_dem.tif') bestDiffPath = os.path.join(pcAlignFolder, 'best_diff.csv') # Done computing the desired point count, now align our DEM. resultsDict = {} for maxDisp in DISPLACEMENTS: # Call pc_align alignOptions = ( ('--max-displacement %f --csv-format %s ' + '--save-inv-transformed-reference-points ' + '--initial-ned-translation "0 0 %f"') % (maxDisp, lidarCsvFormatString, meanDiff)) cmd = ('pc_align %s %s %s -o %s %s' % (alignOptions, demPath, lidarFile, alignPrefix, threadText)) try: # Redo must be true here icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, alignedPC, True, True) icebridge_common.logger_print(logger, out + '\n' + err) # Get diff stats for this attempt (thisDem, thisLidarDiffPath, results) = \ makeDemAndCheckError(options, projString, alignedPC, lidarFile, lidarCsvFormatString, threadText, logger) transformPath = thisDem.replace('trans_reference-DEM.tif', 'transform.txt') invTransPath = thisDem.replace('trans_reference-DEM.tif', 'inverse-transform.txt') #numDiffs = getOverlapAmount(thisDem, lidarDemPath, logger) except: icebridge_common.logger_print(logger, 'Alignment failed, trying next displacement.') continue # Try the next displacement #shutil.copyfile(thisDem, str(maxDisp) + '_dem.tif') # DEBUG # Keep track of the best displacement result, requiring a minimum # improvement in the mean error to accept a higher-displacement result. # - Also don't accept results with less lidar points covered because that is # a sign that the DEM has been tilted away from the LIDAR path. thisDiff = results['Mean'] numDiffs = results['NumDiffs'] percent_improvement = (bestMeanDiff - thisDiff) / bestMeanDiff icebridge_common.logger_print(logger, '\nDiff results for max displacement ' + str(maxDisp) + ' = ' + str(results) + ', num diffs = ' + str(numDiffs) + ', improvement ratio = ' + str(percent_improvement)) resultsDict[str(maxDisp)] = results if ((numDiffs > MIN_NUM_DIFFS) and ( (bestMeanDiff < 0) or (thisDiff < IDEAL_LIDAR_DIST) or ((percent_improvement >= MIN_DIST_IMPROVEMENT) and (numDiffs >= bestNumDiffs)) ) ): icebridge_common.logger_print(logger, 'Accepting pc_align result for displacement ' + str(maxDisp)) bestMeanDiff = thisDiff bestMaxDisp = maxDisp bestNumDiffs = numDiffs shutil.move(thisDem, bestDemPath ) shutil.move(transformPath, bestTransPath) shutil.move(invTransPath, bestInvTransPath) shutil.move(thisLidarDiffPath, bestDiffPath) if thisDiff < IDEAL_LIDAR_DIST: break # No need to check more displacements if this result is great if bestMeanDiff < 0: raise Exception('Unable to align image at max displacement!') # Move the best result into the default file locations. icebridge_common.logger_print(logger, 'Best mean diff is ' + str(bestMeanDiff) +' with --max-displacement = ' + str(bestMaxDisp) +' and num diffs = ' + str(bestNumDiffs)) logger.info(resultsDict) shutil.move(bestDemPath, alignedDem) transformPath = alignPrefix + '-transform.txt' invTransPath = alignPrefix + '-inverse-transform.txt' # needed for ortho gen logger.info("mv " + bestTransPath + " " + transformPath) logger.info("mv " + bestInvTransPath + " " + invTransPath) if bestTransPath != transformPath and os.path.exists(bestTransPath): shutil.move(bestTransPath, transformPath) if bestInvTransPath != invTransPath and os.path.exists(bestInvTransPath): shutil.move(bestInvTransPath, invTransPath) shutil.move(bestDiffPath, lidarDiffPath) results = icebridge_common.readGeodiffOutput(lidarDiffPath) # Apply the same transform to the footprint DEM. This one is used in blending later. finalFootprintDEM = os.path.join(options.outputFolder, icebridge_common.footprintFileName()) if os.path.exists(finalFootprintDEM): logger.info("File exists: " + finalFootprintDEM) else: alignOptions = ( ('--max-displacement -1 --csv-format %s ' + \ '--save-inv-transformed-reference-points') % \ (lidarCsvFormatString)) alignPrefixFoot = alignPrefix + '-footprint' footDemPath = demPath.replace("DEM.tif", "footprint-DEM.tif") cmd = ('pc_align --num-iterations 0 --initial-transform %s %s %s %s -o %s %s' % (transformPath, alignOptions, footDemPath, lidarFile, alignPrefixFoot, threadText)) alignedFootPC = alignPrefixFoot + '-trans_reference.tif' try: logger.info(cmd) # to make it go to the log, not just on screen asp_system_utils.executeCommand(cmd, alignedFootPC, False, True) if os.path.exists(footDemPath): os.remove(footDemPath) # No longer needed except: pass try: # POINT2DEM on the aligned PC file cmd = (('point2dem --search-radius-factor 5 --dem-hole-fill-len 500 ' + '--tr %lf --t_srs %s %s %s') % (options.demResolution, projString, alignedFootPC, threadText)) alignedFootDEM = alignPrefixFoot + '-trans_reference-DEM.tif' logger.info(cmd) # to make it go to the log, not just on screen asp_system_utils.executeCommand(cmd, alignedFootDEM, False, True) except: pass # Move it out of the align directory if os.path.exists(alignedFootDEM): if os.path.exists(finalFootprintDEM): os.remove(finalFootprintDEM) logger.info("Renaming " + alignedFootDEM + " to " + finalFootprintDEM) os.rename(alignedFootDEM, finalFootprintDEM) else: logger.info("File does not exist: " + alignedFootDEM) # Wipe all auxilliary footprint files for filename in glob.glob(alignPrefix + '-footprint-*'): logger.info("Removing: " + filename) os.remove(filename) return alignedDem, lidarDiffPath, results['Mean'] def blurImage(inputPath, outputPath, suppressOutput, redo): '''Create a blurred copy of an image''' # Blurring the input image can help reduce the negative impact of jpeg artifacts. # - The 6x3 option applies a significant amount of blur but it is still not enough # to clean up all the jpeg artifacts! cmd = 'convert ' +inputPath+' -compress LZW -blur 6x3 '+outputPath asp_system_utils.executeCommand(cmd, outputPath, suppressOutput, redo) def robustBundleAdjust(options, inputPairs, suppressOutput, redo, threadText, heightLimitString, logger): '''Perform bundle adjustment with multiple retries in case things fail. Returns inputPairs with the updated camera models swapped in.''' # - Bundle adjust all of the input images in the batch at the same time. # - An overlap number less than 2 is prone to very bad bundle adjust results so # don't use less than that. If there is really only enough overlap for one we # will have to examine the results very carefully! MIN_BA_OVERLAP = 2 TRANSLATION_WEIGHT = 4.0 ROBUST_THRESHOLD = 2.0 OVERLAP_EXPONENT = 0 MIN_IP_MATCHES = 22 # The cropping below does not work with rotated images! #SIDE_IP_CROP_PERCENT = 20 # Remove IP in 20% of the sides of the images SIDE_IP_CROP_PERCENT = 1 # Remove IP in 20% of the sides of the images bundlePrefix = icebridge_common.getBundlePrefix(options.outputFolder) baOverlapLimit = options.stereoImageInterval + 3 if baOverlapLimit < MIN_BA_OVERLAP: baOverlapLimit = MIN_BA_OVERLAP # Try many attempts until one works # - Blurring can help with artifacts. # - Many IP can also help, but risks getting false matches and is slower. ipMethod = [1, 0, 2, 1, 0, 2, 1, 0, 1, 0, 2, 1 ] ipPerTile = [500, 500, 500, 500, 500, 500, 500, 500, 2000, 2000, 2000, 2000] useBlur = [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 ] epipolarT = [450, 450, 450, 450, 450, 450, 2000, 2000, 450, 450, 450, 2000] normIpTiles = [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1 ] if options.manyip: # When using many IP, ip-method 0 gives more ip ipMethod[0] = 0 ipMethod[1] = 1 SIDE_IP_CROP_PERCENT = 0 for v in range(len(ipPerTile)): ipPerTile[v] = 2000 # This is the rough percentage of the image that we want to have interest points in. MIN_IP_COVERAGE = 0.70 if (len(ipMethod) != len(ipPerTile)) or (len(ipMethod) != len(useBlur)) or \ (len(ipMethod) != len(epipolarT)): raise Exception("Book-keeping error in robust bundle adjustment.") imageCameraString = formImageCameraString(inputPairs) # Fill inputPairs with output camera names for pair in inputPairs: pair[1] = bundlePrefix +'-'+ os.path.basename(pair[1]) # Generate a new string with the blurred image files paths # - Don't actually generate blurred files unless they are needed # - Blurred images will be deleted when the final batch cleanup function is called. blurredImageCameraString = imageCameraString blurPairs = [] i = 0 for pair in inputPairs: imagePath = pair[0] blurredPath = bundlePrefix + '_' + str(i)+ '_blurred.tif' blurredImageCameraString = blurredImageCameraString.replace(imagePath, blurredPath) blurPairs.append((imagePath, blurredPath)) i = i + 1 outputCamera = inputPairs[0][1] # Loop through all our parameter settings, quit as soon as one works. bestNumIpPreElevation = 0 bestCmd = '' bestCmdSuccess = False success = False successWithoutCoverage = False for attempt in range(len(ipPerTile)): argString = imageCameraString if useBlur[attempt]: # Make sure blurred images are created for pair in blurPairs: blurImage(pair[0], pair[1], False, False) argString = blurredImageCameraString # If using many ip, stop using the elevation restriction earlier currHeightLimitString = heightLimitString if options.manyip and attempt > len(ipPerTile)/2: currHeightLimitString = "" cmd = (('bundle_adjust %s -o %s %s %s --datum wgs84 ' + '--approximate-pinhole-intrinsics ' + # '--rotation-weight 400 ' + # this may be needed for some flights '--translation-weight %0.16g -t nadirpinhole --skip-rough-homography ' + '--inline-adjustments --overlap-limit %d --robust-threshold %0.16g ' + '--ip-detect-method %d --ip-per-tile %d --min-matches %d ' + '--overlap-exponent %0.16g --epipolar-threshold %d ' + '--ip-side-filter-percent %d ') % (argString, bundlePrefix, threadText, currHeightLimitString, TRANSLATION_WEIGHT, baOverlapLimit, ROBUST_THRESHOLD, ipMethod[attempt], ipPerTile[attempt], MIN_IP_MATCHES, OVERLAP_EXPONENT, epipolarT[attempt], SIDE_IP_CROP_PERCENT)) # This helps in cases where there is a small dark object (like a stream) that prevents # large snow areas from being processed well. Can lead to false IP. if normIpTiles[attempt]: cmd += ' --normalize-ip-tiles' if options.solve_intr: cmd += ' --solve-intrinsics' # Disabling triangulation error filtering up front and then applying it post bundle adjust # works well but it is currently only supported in bundle_adjust for two cameras at once! if len(inputPairs) == 2: cmd += ' --disable-tri-ip-filter --num-passes 3 ' + \ '--remove-outliers-params 75.0,3.0,2.0,3.0 ' + \ '--outlier-removal-params 90.0 3.0 ' # Run the BA command and log errors logger.info(cmd) # to make it go to the log, not just on screen icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, outputCamera, True, redo, noThrow=True) logger.info(out + '\n' + err) if status == 0: # Record if we had a success before coverage was checked successWithoutCoverage = True thisSuccessWithoutCoverage = (status == 0) if status == 0: # Check to see if we got the desired amount of coverage. # - TODO: How to do this with >2 cameras? m = re.findall(r"IP coverage fraction after cleaning = ([0-9e\-\.\+]*)", out) if len(m) == 0: # Handle case where no IP were removed for high residual. m = re.findall(r"IP coverage fraction = ([0-9e\-\.\+]*)", out) if len(m) > 0: # If this text is available... ipCoveragePercentage = float(m[-1]) # Use the last instance of this text. logger.info('Read coverage percentage: ' + str(ipCoveragePercentage)) if ipCoveragePercentage < MIN_IP_COVERAGE: logger.info('Coverage percentage is less than required amount: ' + str(MIN_IP_COVERAGE) + ', trying more IP options to get more coverage.') status = -1 if status == 0: logger.info("Bundle adjustment succeded on attempt " + str(attempt)) success = True break # Keep track of the best number of IP before elevation filtering. m = re.findall(r"Reduced matches to (\d+)", out) if len(m) == 1: # If this text is available... numIpPreElevation = int(m[0]) # Mostly want to save a successful command but use numIpPreElevation as a tiebreaker. if ((numIpPreElevation > bestNumIpPreElevation) and not (bestCmdSuccess and not thisSuccessWithoutCoverage)) \ or (thisSuccessWithoutCoverage and not bestCmdSuccess): bestNumIpPreElevation = numIpPreElevation bestCmd = cmd bestCmdSuccess = thisSuccessWithoutCoverage # Try again. Carefully wipe only relevant files logger.info("Trying bundle adjustment again.") for f in glob.glob(bundlePrefix + '*'): if 'blurred.tif' in f: # Don't wipe these files continue logger.info("Wipe: " + f) os.remove(f) # End bundle adjust attempts # If we failed, retry the best attempt if not success: # If we never succeeded even before coverage checking, lift the elevation restriction. # - This increases the risk of bad IP's being used but it is better than failing. if successWithoutCoverage: logger.info("Retrying bundle_adjust without coverage check") cmd = bestCmd else: logger.info("Retrying bundle_adjust without coverage check or elevation restriction") cmd = bestCmd.replace(heightLimitString, '') icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, outputCamera, True, redo, noThrow=True) logger.info(out + '\n' + err) if status == 0: logger.info("Bundle adjustment succeded on repeat attempt.") success = True if not success: raise Exception('Bundle adjustment failed!\n') # Return image/camera pairs with the camera files replaced with the bundle_adjust output files. # - Also return if we used blurred input images or not return inputPairs def applyTransformToCameras(options, inputPairs, suppressOutput, redo, threadText, heightLimitString, logger): '''Create cameras with the pc_align transform applied to them, # so that we can later generate ortho images.''' imagesAndCams = formImageCameraString(inputPairs) alignPrefix = icebridge_common.getAlignPrefix(options.outputFolder) bundlePrefix = icebridge_common.getBundlePrefix(options.outputFolder) alignedBundlePrefix = icebridge_common.getAlignedBundlePrefix(options.outputFolder) outputCamera = inputPairs[0][1].replace(bundlePrefix, alignedBundlePrefix) if os.path.exists(outputCamera): logger.info("Transformed cameras already exist.") return initialTransform = alignPrefix + '-inverse-transform.txt' if not os.path.exists(initialTransform): raise Exception("Cannot locate pc_align transform: " + initialTransform) # We will run bundle adjustment with 0 iterations. Hence use whatever match files # we had before matchFiles = glob.glob(bundlePrefix + '*.match') for matchFile in matchFiles: newMatchFile = matchFile.replace(bundlePrefix, alignedBundlePrefix) icebridge_common.makeSymLink(matchFile, newMatchFile) cmd = (('bundle_adjust %s -o %s %s --datum wgs84 ' + '-t nadirpinhole --skip-rough-homography '+ '--inline-adjustments --min-matches 0 --max-iterations 0 --ip-per-tile 1000 ' + ' --initial-transform %s') % (imagesAndCams, alignedBundlePrefix, threadText, initialTransform)) # Run the BA command and log errors logger.info("Applying pc_align transform to cameras.") logger.info(cmd) # to make it go to the log, not just on screen (out, err, status) = asp_system_utils.executeCommand(cmd, outputCamera, True, redo, noThrow=True) logger.info(out + '\n' + err) # Since input cameras start with out- and output prefix starts with out-, the output # cameras will start with out-out-. Fix this. for camera in glob.glob(alignedBundlePrefix + '*.tsai'): cameraOut = camera.replace(alignedBundlePrefix + '-out', alignedBundlePrefix) if camera != cameraOut and os.path.exists(camera) and (not os.path.exists(cameraOut)): cmd = 'mv ' + camera + ' ' + cameraOut logger.info(cmd) os.system(cmd) def getMatchFiles(options, origInputPairs, index): '''Get the path of the match file generated by bundle_adjust for a given image pair, and the path to where that match file could be copied to the stereo folder in order to be used.''' # TODO: These definitions are repeated elsewhere bundlePrefix = icebridge_common.getBundlePrefix(options.outputFolder) thisOutputFolder = os.path.join(options.outputFolder, 'stereo_pair_'+str(index)) thisPairPrefix = os.path.join(thisOutputFolder, 'out') # Saturate the pair index at the end of the list. # - This serves to handle the case where bundle_adjust was called with a # truncated input image list in a one-DEM multiple-image case. pairIndex = index + options.stereoImageInterval if pairIndex >= len(origInputPairs): pairIndex = len(origInputPairs) - 1 leftImageName = os.path.basename(origInputPairs[index ][0]) rightImageName = os.path.basename(origInputPairs[pairIndex][0]) normalMatchPath = ('%s-%s__%s.match' % (bundlePrefix, leftImageName.replace('.tif',''), rightImageName.replace('.tif',''))) blurMatchPath = ('%s-out_%d_blurred__out_%d_blurred.match' % (bundlePrefix, index, pairIndex)) outputMatchPath = ('%s-%s__%s.match' % (thisPairPrefix, leftImageName.replace('.tif',''), rightImageName.replace('.tif',''))) if os.path.exists(normalMatchPath): inputMatchPath = normalMatchPath else: if os.path.exists(blurMatchPath): inputMatchPath = blurMatchPath else: # Match files may not exist if the bundle adjust dir got cleaned up return ("", "") #raise Exception('Unable to find bundle_adjust match file ' + str(index)) return (inputMatchPath, outputMatchPath) def consolidateGeodiffResults(inputFiles, outputPath=None): '''Create a summary file of multiple geodiff csv output files''' if len(inputFiles) == 0: # No input files, do nothing. return None # Take the max/min of min/max and the mean of mean and stddev keywords = ['Max', 'Min', 'Mean', 'StdDev'] mergedResult = {'Max':-999999.0, 'Min':999999.0, 'Mean':0.0, 'StdDev':0.0} for path in inputFiles: results = icebridge_common.readGeodiffOutput(path) if results['Max'] > mergedResult['Max']: mergedResult['Max'] = results['Max'] if results['Min'] < mergedResult['Min']: mergedResult['Min'] = results['Min'] mergedResult['Mean' ] += results['Mean' ] mergedResult['StdDev'] += results['StdDev'] mergedResult['Mean' ] = mergedResult['Mean' ] / float(len(inputFiles)) mergedResult['StdDev'] = mergedResult['StdDev'] / float(len(inputFiles)) if not outputPath: return mergedResult # If an output path was provided, write out the values in a similar to geodiff format. with open(outputPath, 'w') as f: f.write('# Max difference: '+str(mergedResult['Max' ])+'\n') f.write('# Min difference: '+str(mergedResult['Min' ])+'\n') f.write('# Mean difference: '+str(mergedResult['Mean' ])+'\n') f.write('# StdDev of difference: '+str(mergedResult['StdDev'])+'\n') # Delete all the input diff files to reduce file bloat if we wrote the output file if os.path.exists(outputPath): for f in inputFiles: os.system('rm -f ' + f) return mergedResult def consolidateStats(lidarDiffPath, interDiffPath, fireDiffPath, fireLidarDiffPath, demPath, outputPath, fractionValidPath, logger, skipGeo = False): '''Consolidate statistics into a single file''' # Read in the diff results try: lidarDiffResults = icebridge_common.readGeodiffOutput(lidarDiffPath) except: lidarDiffResults = {'Mean':-999} try: interDiffResults = icebridge_common.readGeodiffOutput(interDiffPath) except: interDiffResults = {'Mean':-999} try: fireDiffResults = icebridge_common.readGeodiffOutput(fireDiffPath) except: fireDiffResults = {'Mean':-999} try: fireLidarDiffResults = icebridge_common.readGeodiffOutput(fireLidarDiffPath) except: fireLidarDiffResults = {'Mean':-999} try: with open(fractionValidPath, 'r') as f: fractionValid = float(f.read()) except: fractionValid = -1 # Get DEM stats success = True if skipGeo: success = False else: try: geoInfo = asp_geo_utils.getImageGeoInfo(demPath, getStats=False) stats = asp_image_utils.getImageStats(demPath)[0] meanAlt = stats[2] centerX, centerY = geoInfo['projection_center'] # Convert from projected coordinates to lonlat coordinates isSouth = ('+lat_0=-90' in geoInfo['proj_string']) projString = icebridge_common.getEpsgCode(isSouth, asString=True) PROJ_STR_WGS84 = 'EPSG:4326' (centerLon, centerLat) = asp_geo_utils.convertCoordinate(projString, PROJ_STR_WGS84, centerX, centerY) except Exception as e: pass # Print nothing, comes out too verbose #if logger: # #logger.exception('Caught exception getting DEM center coordinates:\n' + str(e)) # #logger.info("Not fatal, will continue.") # for clarity in the log use this line #else: # #print 'Could not compute DEM center coordinates.' success = False if not success: centerLon = 0 centerLat = 0 meanAlt = -999 # Write info to summary file with open(outputPath, 'w') as f: f.write('%f, %f, %f, %f, %f, %f, %f, %f' % (centerLon, centerLat, meanAlt, lidarDiffResults['Mean'], interDiffResults ['Mean'], fireDiffResults ['Mean'], fireLidarDiffResults['Mean'], fractionValid)) def readConsolidatedStatsFile(consolidatedStatsPath): '''Read the contents of the stats file''' if not os.path.exists(consolidatedStatsPath): raise Exception('Consolidated stats file missing: ' + consolidatedStatsPath) with open(consolidatedStatsPath, 'r') as f: statsText = f.read() parts = split(statsText) return [float(x) for x in parts] def lidarCsvToDem(lidarFile, projBounds, projString, outputFolder, threadText, redo, logger): '''Generate a DEM from a lidar file in the given region (plus a buffer)''' LIDAR_DEM_RESOLUTION = 5 # TODO: Vary this LIDAR_PROJ_BUFFER_METERS = 100 lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile) # Buffer out the input bounds minX = projBounds[0] - LIDAR_PROJ_BUFFER_METERS # Expand the bounds a bit minY = projBounds[1] - LIDAR_PROJ_BUFFER_METERS maxX = projBounds[2] + LIDAR_PROJ_BUFFER_METERS maxY = projBounds[3] + LIDAR_PROJ_BUFFER_METERS # Generate a DEM from the lidar point cloud in this region lidarDemPrefix = os.path.join(outputFolder, 'cropped_lidar') # Add --search-radius-factor 5 to help with mapproject later # when estimating the gsd. 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' % (minX, minY, maxX, maxY, LIDAR_DEM_RESOLUTION, projString, lidarFile, threadText, lidarCsvFormatString, lidarDemPrefix)) lidarDemOutput = lidarDemPrefix+'-DEM.tif' icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, lidarDemOutput, True, redo, noThrow=True) logger.info(out + '\n' + err) if status != 0: raise Exception('Did not generate any lidar DEM!') return lidarDemOutput def cropGdalImage(projBounds, inputPath, outputPath, logger): '''Crop out a section of an image''' PROJ_BUFFER_METERS = 100 minX = projBounds[0] - PROJ_BUFFER_METERS # Expand the bounds a bit minY = projBounds[1] - PROJ_BUFFER_METERS maxX = projBounds[2] + PROJ_BUFFER_METERS maxY = projBounds[3] + PROJ_BUFFER_METERS cmd = ('gdal_translate %s %s -projwin %f %f %f %f' % (inputPath, outputPath, minX, maxY, maxX, minY)) logger.info(cmd) asp_system_utils.executeCommand(cmd, outputPath, True, False) def estimateHeightRange(projBounds, projString, lidarFile, options, threadText, suppressOutput, redo, logger): '''Estimate the valid height range in a region based on input height info. Also generates the lidar DEM.''' # Expand the estimate by this much in either direction # - If the input cameras are good then this can be fairly small, at least for flat # regions. Bad cameras are much farther off. HEIGHT_BUFFER = 20 # Create a lidar DEM at the region lidarDemPath = lidarCsvToDem(lidarFile, projBounds, projString, options.outputFolder, threadText, redo, logger) # Get the min and max height of the lidar file try: lidarMin, lidarMax, lidarMean, lidarStd = asp_image_utils.getImageStats(lidarDemPath)[0] logger.info('Found lidar height min = %f, max = %f' % (lidarMin, lidarMax)) except: raise Exception('Failed to generate lidar DEM to estimate height range!') minHeight = lidarMin maxHeight = lidarMax # Get the min/max height in the reference DEM region # - The lidar field is narrower than the image so sometimes it can miss terrain features # that show up in the lower resolution DEM. try: demCropPath = os.path.join(options.outputFolder, 'cropped_ref_dem.tif') cropGdalImage(projBounds, options.referenceDem, demCropPath, logger) refDemMin, refDemMax, refDemMean, refDemStd = asp_image_utils.getImageStats(demCropPath)[0] logger.info('Found ref DEM height min = %f, max = %f' % (refDemMin, refDemMax)) if refDemMin < minHeight: minHeight = refDemMin if refDemMax > maxHeight: maxHeight = refDemMax except: logger.warning('Error generating reference DEM height estimate for ') minHeight = minHeight - HEIGHT_BUFFER maxHeight = maxHeight + HEIGHT_BUFFER # Generate the height string s = '--elevation-limit ' + str(minHeight) +' '+ str(maxHeight) return (s, lidarDemPath) def getWidthAndMemUsageFromStereoOutput(outputText, errorText): '''Parse the output from running stereo and return the search range width and the memory usage in GB.''' successParsintStats = False corrSearchWidth = -1 memUsage = -1 elapsed = "-1" out = outputText + "\n" + errorText for line in out.split('\n'): m = re.match("^.*?Search\s+Range:.*?Min:.*?width:\s*(\d+)", line, re.IGNORECASE) if m: corrSearchWidth = float(m.group(1)) successParsintStats = True m = re.match("^.*?elapsed=(.*?)\s+mem=(\d.*?)\s+.*?time_stereo_corr", line, re.IGNORECASE) if m: elapsed = m.group(1) memUsage = float(m.group(2)) memUsage = float(round(memUsage/100000.0))/10.0 # convert to GB successParsintStats = True return (corrSearchWidth, memUsage, elapsed, successParsintStats) def createDem(i, options, inputPairs, prefixes, demFiles, projString, heightLimitString, threadText, matchFilePair, suppressOutput, redo, logger=None): '''Create a DEM from a pair of images''' # Since we use epipolar alignment our images should be aligned at least this well. VERTICAL_SEARCH_LIMIT = 10 TIMEOUT = 40*60 # Do not let any process take more than this time in seconds # Get the appropriate image to use as a stereo pair pairIndex = i + options.stereoImageInterval thisPairPrefix = prefixes[i] argString = ('%s %s %s %s ' % (inputPairs[i][0], inputPairs[pairIndex][0], inputPairs[i][1], inputPairs[pairIndex][1])) # - This epipolar threshold is post camera model based alignment so it can be quite restrictive. # - Note that the base level memory usage ignoring the SGM buffers is about 2 GB so this memory # usage is in addition to that. minIpString = '--min-num-ip 40' stereoCmd = (('stereo %s %s %s %s -t nadirpinhole --alignment-method epipolar ' + '--skip-rough-homography --corr-blob-filter 50 --corr-seed-mode 0 ' + '--outlier-removal-params 90.0 3.0 --epipolar-threshold 10 %s ') % (argString, thisPairPrefix, threadText, heightLimitString, minIpString)) searchLimitString = (' --corr-search-limit -9999 -' + str(VERTICAL_SEARCH_LIMIT) + ' 9999 ' + str(VERTICAL_SEARCH_LIMIT) ) if '--stereo-algorithm 0' not in options.stereoArgs: correlationArgString = (' --xcorr-threshold 2 --corr-kernel 7 7 ' + ' --corr-tile-size 9000 --cost-mode 4 --sgm-search-buffer 4 2 ' + searchLimitString + ' --corr-memory-limit-mb 6000 ' + options.stereoArgs ) #+ ' --corr-blob-filter 100') filterArgString = (' --rm-cleanup-passes 0 --median-filter-size 5 ' + ' --texture-smooth-size 17 --texture-smooth-scale 0.14 ') else: correlationArgString = options.stereoArgs filterArgString = '' stereoCmd += correlationArgString stereoCmd += filterArgString stereoCmd += ' --check-mem-usage' # Call and check status triOutput = thisPairPrefix + '-PC.tif' icebridge_common.logger_print(logger, stereoCmd) if (not options.manyip) or (matchFilePair[0] == ""): (out, err, status) = asp_system_utils.executeCommand(stereoCmd, triOutput, suppressOutput, redo, noThrow=True, timeout = TIMEOUT) else: # Jump directly to using the ip from bundle_adjust (out, err, status) = ("", "", -1) if status != 0: # If stereo failed, try it again with the .match file that was created by bundle_adjust. if not options.manyip: icebridge_common.logger_print(logger, 'First stereo attempt failed, will copy .match file from bundle_adjust and retry.') else: icebridge_common.logger_print(logger, 'Copy right away .match file from bundle_adjust and retry.') # Clear any existing .match file then link in the new one. cmd = 'rm -f ' + thisPairPrefix + '*.match' icebridge_common.logger_print(logger, cmd) os.system(cmd) if matchFilePair[0] == "": # This can happen if the bundle adjust directory got cleaned up. Nothing we can do. raise Exception("No usable match files. Stereo call failed.") icebridge_common.makeSymLink(matchFilePair[0], matchFilePair[1]) if not os.path.exists(matchFilePair[1]): raise Exception('Failed to create .match file symlink: ' + matchFilePair[1]) # With the .match file copied we can retry with the same parameters. # - Remove some filtering steps we don't need. # - Exception is the height limit string, which we can remove if using existing IP. stereoCmd = stereoCmd.replace(minIpString, '--min-num-ip 10') m = re.match("^\s*$", heightLimitString) if not m: # This is a bugfix, check for empty heightLimitString stereoCmd = stereoCmd.replace(heightLimitString, ' ') icebridge_common.logger_print(logger, stereoCmd) os.system('rm -f ' + triOutput) # In case the output cloud exists but is bad (out, err, status) = asp_system_utils.executeCommand(stereoCmd, triOutput, suppressOutput, redo, noThrow=True, timeout = TIMEOUT) if status != 0: # If we fail again give up. icebridge_common.logger_print(logger, out + '\n' + err) raise Exception('Stereo call failed!') # Extract the search range width and memory usage from the output text. (corrSearchWidth, memUsage, elapsed, gotMemStats) = \ getWidthAndMemUsageFromStereoOutput(out, err) icebridge_common.logger_print(logger, ("Corr search width: %d mem usage: %f GB elapsed: %s" % (corrSearchWidth, memUsage, elapsed) ) ) if i == 0 and gotMemStats: # If we could not parse the data, write nothing. Maybe this time # we are rerunning things, and did not actually do any work. filePath = os.path.join(os.path.dirname(os.path.dirname(thisPairPrefix)), icebridge_common.getRunStatsFile()) icebridge_common.logger_print(logger, "Writing: " + filePath) with open(filePath, 'w') as f: f.write( ("%d, %f, %s\n") % (corrSearchWidth, memUsage, elapsed) ) # point2dem on the result of ASP # - The size limit is to prevent bad point clouds from creating giant DEM files which # cause the processing node to crash. cmd = (('point2dem ' + ' --errorimage ' + # '--max-valid-triangulation-error 10 ' + # useful when studying distortion '--max-output-size 10000 10000 --dem-spacing %lf --t_srs %s %s %s') % (options.demResolution, projString, triOutput, threadText)) p2dOutput = demFiles[i] icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, p2dOutput, suppressOutput, redo, noThrow=True) if status != 0: icebridge_common.logger_print(logger, out + '\n' + err) raise Exception('point2dem call on stereo pair failed!') # Require a certain percentage of valid output pixels to go forwards with this DEM # - This calculation currently does not work well but anything under this is probably bad. # TODO: This validity fraction is NOT ACCURATE and needs to be improved! MIN_FRACTION_VALID_PIXELS = 0.10 percentageFlagFile = os.path.join(options.outputFolder, 'valid_pixel_fraction.txt') fractionValid = 1.0; # Try to parse the output text for the percentage or read it from disk if we already logged it. m = re.findall(r"Percentage of valid pixels = ([0-9e\-\.\+]+)", out) if len(m) == 1: fractionValid = float(m[0]) icebridge_common.logger_print(logger, 'Valid DEM pixel fraction = ' + str(fractionValid)) with open(percentageFlagFile, 'w') as f: # Log the percentage to disk f.write(str(fractionValid)) else: try: # Read the percentage from disk with open(percentageFlagFile, 'r') as f: fractionValid = float(f.read()) except: icebridge_common.logger_print(logger, 'Unable to read dem percentage fraction from file ' + percentageFlagFile) icebridge_common.logger_print(logger, 'Detected valid pixel fraction = ' + str(fractionValid)) if fractionValid < MIN_FRACTION_VALID_PIXELS: raise Exception('Required DEM pixel fraction is ' + str(MIN_FRACTION_VALID_PIXELS) + ', got instead ' + str(fractionValid) + ' aborting processing on this DEM.') # If the output DEM is too small then something is probably wrong. MIN_DEM_SIZE_PIXELS = 200 (width, height) = asp_image_utils.getImageSize(p2dOutput) if (width < MIN_DEM_SIZE_PIXELS) or (height < MIN_DEM_SIZE_PIXELS): raise Exception('DEM size (' + str(width) + ', ' + str(height) + ') is less than minumum size ' + str(MIN_DEM_SIZE_PIXELS)) # The DEM with larger footprint, not filtered out as agressively. We use # the valid pixels in this DEM's footprint as a template where to blend. p2dFoot = thisPairPrefix + '-footprint' cmd = ( ('point2dem --max-output-size 10000 10000 --tr %lf --t_srs %s %s %s ' + ' --remove-outliers-params 75 12 -o %s ') % (options.demResolution, projString, triOutput, threadText, p2dFoot)) p2dFoot = p2dFoot + '-DEM.tif' icebridge_common.logger_print(logger, cmd) (out, err, status) = asp_system_utils.executeCommand(cmd, p2dFoot, suppressOutput, redo, noThrow=True) if status != 0: icebridge_common.logger_print(logger, out + '\n' + err) raise Exception('point2dem call on stereo pair failed!') def cleanBatch(batchFolder, alignPrefix, stereoPrefixes, interDiffPaths, fireballDiffPaths): '''Clean up all non-output files to conserve space. Setting smallFiles will remove additional low size files.''' smallFiles = True # Delete all of the stereo folders for s in stereoPrefixes: if smallFiles: folder = os.path.dirname(s) os.system('rm -rf ' + folder) else: os.system('rm -rf ' + s + '*.tif') if smallFiles: # Delete bundle_adjust folder. Note that will also wipe the cameras. os.system('rm -rf ' + os.path.dirname(icebridge_common.getBundlePrefix(batchFolder))) # Clean out the pc_align folder alignFiles = ['-beg_errors.csv', '-end_errors.csv', '-iterationInfo.csv', '-trans_reference.tif', '-transform.txt', '-inverse-transform.txt'] for currFile in alignFiles: os.system('rm -f ' + alignPrefix + currFile) logFiles = glob.glob(alignPrefix + '*-log-*') for logFile in logFiles: os.system('rm -f ' + logFile) # Wipe all footprint files except the final result footprintFiles = glob.glob(alignPrefix + '*footprint*') for footprintFile in footprintFiles: if not footprintFile.endswith('out-footprint-trans_reference-DEM.tif'): os.system('rm -f ' + footprintFile) # Delete the diff images for f in (interDiffPaths + fireballDiffPaths): os.system('rm -f ' + f) # Delete dangling link. os.system('rm -f ' + os.path.join(batchFolder, 'out-DEM.tif')) # Delete lidar_crop files lidar_crop_glob = os.path.join(batchFolder, '*cropped_lidar*') for filename in glob.glob(lidar_crop_glob): os.system('rm -f ' + filename) # Delete the cropped DEM path demCropPath = os.path.join(batchFolder, 'cropped_ref_dem.tif') os.system('rm -f ' + demCropPath) # Wipe the pc_aligned bundle directory except for the final results alignedBundlePrefix = icebridge_common.getAlignedBundlePrefix(batchFolder) for filename in glob.glob(alignedBundlePrefix + '*'): if not filename.endswith('.tsai'): os.system('rm -f ' + filename) # Wipe the entire align directory, we moved out of it everything by now os.system('rm -rf ' + os.path.dirname(alignPrefix)) # Repeating the logic from generate_flight_summary.py. consolidatedStatsPath = os.path.join(batchFolder, 'out-consolidated_stats.txt') if os.path.exists(consolidatedStatsPath): # Then we don't need the individual files lidarDiffPath = os.path.join(batchFolder, 'out-diff.csv') interDiffPath = os.path.join(batchFolder, 'out_inter_diff_summary.csv') fireDiffPath = os.path.join(batchFolder, 'out_fireball_diff_summary.csv') fireLidarDiffPath = os.path.join(batchFolder, 'out_fireLidar_diff_summary.csv') percentageFlagFile = os.path.join(batchFolder, 'valid_pixel_fraction.txt') for filename in [lidarDiffPath, interDiffPath, fireDiffPath, fireLidarDiffPath, percentageFlagFile]: os.system('rm -f ' + filename) # Wipe any aux.xml for filename in glob.glob(os.path.join(batchFolder, '*aux.xml')): os.system('rm -f ' + filename) def main(argsIn): '''Handle arguments then call doWork function''' try: usage = '''usage: process_icebridge_batch <imageA> <imageB> [imageC ...] <cameraA> <cameraB> [cameraC ...]''' parser = optparse.OptionParser(usage=usage) # Data options parser.add_option('--south', action='store_true', default=False, dest='isSouth', help='MUST be set if the images are in the southern hemisphere.') parser.add_option('--lidar-folder', default=None, dest='lidarFolder', help='Use pc-align to match the closest lidar file.') parser.add_option('--output-folder', default=None, dest='outputFolder', help='The folder used for output.') parser.add_option('--reference-dem', default=None, dest='referenceDem', help='Low resolution DEM used for certain checks.') parser.add_option('--fireball-folder', default=None, dest='fireballFolder', help='Folder containing fireball DEMs.') # Processing options parser.add_option('--max-displacement', dest='maxDisplacement', default=20, type='float', help='Max displacement value passed to pc_align.') parser.add_option('--solve-intrinsics', action='store_true', default=False, dest='solve_intr', help='If to float the intrinsics params.') parser.add_option('--stereo-arguments', dest='stereoArgs', default='', help='Additional argument string to be passed to the stereo command.') parser.add_option('--stereo-image-interval', dest='stereoImageInterval', default=1, type='int', help='Advance this many frames to get the stereo pair. ' + \ ' Also sets bundle adjust overlap limit.') # Output options parser.add_option('--dem-resolution', dest='demResolution', default=0.4, type='float', help='Generate output DEMs at this resolution.') parser.add_option('--cleanup', action='store_true', default=False, dest='cleanup', help='If the final result is produced delete intermediate files.') parser.add_option('--many-ip', action='store_true', default=False, dest='manyip', help='If to use a lot of IP in bundle adjustment from the beginning.') # Performance options parser.add_option('--num-threads', dest='numThreads', default=None, type='int', help='The number of threads to use for processing.') (options, args) = parser.parse_args(argsIn) # Check argument count numArgs = len(args) numCameras = (numArgs) / 2 if ( (2*numCameras - numArgs) != 0) or (numCameras < 2): print("Expecting as many images as cameras. Got: " + " ".join(args)) print (usage) return 0 except optparse.OptionError as msg: raise Usage(msg) # Start up the logger, output will go in the output folder. #logger = logging.getLogger(__name__) logLevel = logging.INFO # Make this an option?? asp_system_utils.mkdir_p(options.outputFolder) logger = icebridge_common.setUpLogger(options.outputFolder, logLevel, icebridge_common.logFilePrefix()) logger.info('Input arguments: ' + str(argsIn)) # Run the rest of the code and log any unhandled exceptions. try: doWork(options, args, logger) return 0 # Success! except Exception as e: logger.exception(e) # Failed to generate output file try: # When we failed to generate the output DEM, # generate a thumbnail of the first input image to help diagnose problems. thumbOutput = os.path.join(options.outputFolder, 'first_image_browse.tif') cmd = 'gdal_translate '+args[0]+' '+thumbOutput+' -of GTiff -outsize 40% 40% -b 1 -co "COMPRESS=JPEG"' asp_system_utils.executeCommand(cmd, thumbOutput, True, False) logger.info('Created browse image ' + thumbOutput) except: logger.exception('Failed to generate debug input image thumbnail.') return -1 # Failure! def doWork(options, args, logger): '''Do all of the processing.''' os.system("ulimit -c 0") # disable core dumps os.system("rm -f core.*") # these keep on popping up os.system("umask 022") # enforce files be readable by others numArgs = len(args) numCameras = (numArgs) / 2 numStereoRuns = numCameras - options.stereoImageInterval # Verify all input files exist for i in range(0,numArgs): if not os.path.exists(args[i]): logger.error('Arg parsing error: Input file '+ args[i] +' does not exist!') return 0 # Parse input files inputPairs = [] for i in range(0, numCameras): image = args[i] camera = args[i + numCameras] inputPairs.append([image, camera]) imageCameraString = ' '.join(args) projString = icebridge_common.getProjString(options.isSouth, addQuotes=False) suppressOutput = False redo = False logger.info('Starting processing...') threadText = '' if options.numThreads: threadText = ' --threads ' + str(options.numThreads) +' ' # If a lidar folder was specified, find the best lidar file. lidarFile = None if options.lidarFolder: logger.info('Searching for matching lidar file...') lidarFile = icebridge_common.findMatchingLidarFile(inputPairs[0][0], options.lidarFolder) logger.info('Found matching lidar file ' + lidarFile) lidarCsvFormatString = icebridge_common.getLidarCsvFormat(lidarFile) outputPrefix = os.path.join(options.outputFolder, 'out') # Check the last output products from this script. If they exist, # quit now so we don't regenerate intermediate products. consolidatedStatsPath = outputPrefix + '-consolidated_stats.txt' finalAlignedDEM = outputPrefix + '-align-DEM.tif' try: # If the consolidated stats file exists but is incomplete, remove it so that we go ahead with processing. stats = readConsolidatedStatsFile(consolidatedStatsPath) if (stats[0] == 0) or (stats[1] == 0) or (stats[2] == -999): os.remove(consolidatedStatsPath) except: pass if ( os.path.exists(consolidatedStatsPath) and os.path.exists(finalAlignedDEM) and not redo ): logger.info('Final output files already exists: ' + finalAlignedDEM + ' and ' + consolidatedStatsPath + '. Quitting script early.') # Include the same normal completion message logger.info('Finished script process_icebridge_batch!') return # Find the mean GSD and the bounds. Note that later we don't actually use # this resolution, rather we compute it automatically with point2dem. heightLimitString = '' lidarDemPath = None # Path to a DEM created from lidar data. if options.referenceDem: #MAX_OVERSAMPLING = 3.0 computedGsd = options.demResolution meanGsd = 0 totalBounds = [99999999, 99999999, -99999999, -999999999] # minX, minY, maxX, maxY for i in range(0,numCameras): try: # Compute the native GSD of the first input camera computedGsd, bounds = icebridge_common.getCameraGsdAndBoundsRetry( inputPairs[i][0], inputPairs[i][1], logger, options.referenceDem, projString) meanGsd += computedGsd # Accumulate the bounding box minX = bounds[0] minY = bounds[1] maxX = minX + bounds[2] maxY = minY + bounds[3] if totalBounds[0] > minX: totalBounds[0] = minX if totalBounds[1] > minY: totalBounds[1] = minY if totalBounds[2] < maxX: totalBounds[2] = maxX if totalBounds[3] < maxY: totalBounds[3] = maxY except: logger.warning('Failed to compute GSD for camera: ' + inputPairs[0][1]) meanGsd = meanGsd / numCameras # Check that the output GSD is not set too much lower than the native resolution #print 'GSD = ' + str(meanGsd) #print 'TotalBounds = ' + str(totalBounds) #if options.demResolution < (meanGsd*MAX_OVERSAMPLING): # logger.warning('Specified resolution ' + str(options.demResolution) + # ' is too fine for camera with computed GSD ' + str(meanGsd) + # '. Switching to native GSD.)') # options.demResolution = meanGsd*MAX_OVERSAMPLING # Undersampling is not as dangerous, just print a warning. #if options.demResolution > 5*meanGsd: # logger.warning('Specified resolution ' + str(options.demResolution) + # ' is much larger than computed GSD ' + str(meanGsd)) # Use variable GSD, depending on the frame only. options.demResolution = icebridge_common.gsdToDemRes(meanGsd) if lidarFile: # Compute a good height limit from the reference DEM # - Can try generating lonlat bounds in the future, but maybe better # to keep these in projected coordinate space. (heightLimitString, lidarDemPath) = estimateHeightRange(totalBounds, projString, lidarFile, options, threadText, suppressOutput, redo, logger) #if options.manyip: # heightLimitString = "" # Turn it off # Recompute mean gsd based on quering mapproject meanGsd = 0 numVals = 0 for i in range(0,numCameras): try: # Compute the native GSD of the first input camera computedGsd = \ icebridge_common.getGsdFromMapproject(inputPairs[i][0], inputPairs[i][1], logger, lidarDemPath, options.referenceDem) meanGsd += computedGsd numVals += 1 except: logger.warning('Failed to compute GSD for camera: ' + inputPairs[0][1]) if numVals == 0: raise Exception('Failed to compute GSD for any camera!') meanGsd = meanGsd / numVals options.demResolution = icebridge_common.gsdToDemRes(meanGsd) logger.info('DEM resolution ' + str(options.demResolution)) # BUNDLE_ADJUST origInputPairs = inputPairs # All input pairs, non-blurred or otherwise altered. # For now at least only pass into bundle adjust the images which will be used in stereo. # - This lets use use some BA tools which are currently only supported for two images. if numStereoRuns == 1: prunedInputPairs = [inputPairs[0], inputPairs[-1]] else: # Bundle on all input images prunedInputPairs = inputPairs inputPairs = robustBundleAdjust(options, prunedInputPairs, suppressOutput, redo, threadText, heightLimitString, logger) # Record the best match file generated by bundle_adjust for each output pair # and where it can be copied for stereo to re-use it. baMatchFiles = [] for i in range(0,len(prunedInputPairs)-1): (inputMatch, outputMatch) = getMatchFiles(options, prunedInputPairs, i) baMatchFiles.append( (inputMatch, outputMatch)) # Generate a map of post-bundle camera positions orbitvizAfter = os.path.join(options.outputFolder, 'cameras_out.kml') vizString = '' for (image, camera) in inputPairs: vizString += camera + ' ' cmd = ('orbitviz_pinhole --hide-labels -o ' +orbitvizAfter + ' '+ vizString) logger.info(cmd) # to make it go to the log, not just on screen asp_system_utils.executeCommand(cmd, orbitvizAfter, suppressOutput, redo) # STEREO # Call stereo separately on each pair of cameras and create a DEM # Check if we have all of the stereo output files prefixes = [] demFiles = [] fireLidarDiffCsvPaths = [] # Load index of fireball DEMs for comparison if options.fireballFolder: fireballFrameDict = icebridge_common.getCorrectedFireballDems\ (os.path.dirname(options.fireballFolder)) matchingFireballDems = [] atLeastOneDemMissing = False for i in range(0, numStereoRuns): thisOutputFolder = os.path.join(options.outputFolder, 'stereo_pair_'+str(i)) thisPairPrefix = os.path.join(thisOutputFolder, 'out') prefixes.append(thisPairPrefix) p2dOutput = thisPairPrefix + '-DEM.tif' demFiles.append(p2dOutput) if not os.path.exists(p2dOutput): atLeastOneDemMissing = True # Diff with fireball early, in case our run fails currCam = inputPairs[i][1] frame = icebridge_common.getFrameNumberFromFilename(currCam) if frame not in fireballFrameDict.keys(): matchingFireballDems.append(None) # Store flag object continue fireball = fireballFrameDict[frame] matchingFireballDems.append(fireball) if lidarFile: prefix = outputPrefix + '_fireball_lidar_' + str(i) csvPath = prefix + "-diff.csv" cmd = ('geodiff --absolute --csv-format %s %s %s -o %s' % (lidarCsvFormatString, fireball, lidarFile, prefix)) logger.info(cmd) # to make it go to the log, not just on screen asp_system_utils.executeCommand(cmd, csvPath, suppressOutput, redo) fireLidarDiffCsvPaths.append(csvPath) # Process the batch serially (but we will start multiple such batches in parallel). for i in range(0, numStereoRuns): createDem(i, options, origInputPairs, prefixes, demFiles, projString, heightLimitString, threadText, baMatchFiles[i], suppressOutput, redo, logger) # If we had to create at least one DEM, need to redo all the post-DEM creation steps if atLeastOneDemMissing: redo = True logger.info('Finished running all stereo instances.') numDems = len(demFiles) # Check the elevation disparities between the DEMs. High discrepancy # usually means there was an alignment error. interDiffSummaryPath = outputPrefix + '_inter_diff_summary.csv' interDiffPaths = [] for i in range(1,numDems): try: # Call geodiff prefix = outputPrefix + '_inter_dem_' + str(i) diffPath = prefix + "-diff.tif" cmd = ('geodiff --absolute %s %s -o %s' % (demFiles[0], demFiles[i], prefix)) logger.info(cmd) # to make it go to the log, not just on screen asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo) # Read in and examine the results results = icebridge_common.readGeodiffOutput(diffPath) interDiffPaths.append(diffPath) except: pass # Files with no overlap will fail here #logger.warning('Difference between dem ' + demFiles[0] + \ # ' and dem ' + demFiles[i] + ' failed!') # Can do interdiff only if there is more than one DEM if numDems > 1: consolidateGeodiffResults(interDiffPaths, interDiffSummaryPath) else: logger.info("Only one stereo pair is present, cannot create: " + interDiffSummaryPath) # DEM_MOSAIC allDemPath = outputPrefix + '-DEM.tif' if numDems == 1: # If there are only two files just skip this step icebridge_common.makeSymLink(demFiles[0], allDemPath) # For the footprint. We implemented this only for batch size of 2. demFoot = demFiles[0].replace("DEM.tif", "footprint-DEM.tif") if os.path.exists(demFoot): allDemFoot = allDemPath.replace("DEM.tif", "footprint-DEM.tif") logger.info("ln -s " + demFoot + " " + allDemFoot) icebridge_common.makeSymLink(demFoot, allDemFoot) else: logger.info("File does not exist: " + demFoot) else: demString = ' '.join(demFiles) # Only the default blend method produces good results but the DEMs must not be too # far off for it to work. print (projString) cmd = ('dem_mosaic %s --tr %lf --t_srs %s %s -o %s' % (demString, options.demResolution, projString, threadText, outputPrefix)) print (cmd) mosaicOutput = outputPrefix + '-tile-0.tif' logger.info(cmd) # to make it go to the log, not just on screen asp_system_utils.executeCommand(cmd, mosaicOutput, suppressOutput, redo) # TODO: Updated fractionValid in this case # Create a symlink to the mosaic file with a better name icebridge_common.makeSymLink(mosaicOutput, allDemPath) # More comparisons with Fireball DEMs if available fireballDiffPaths = [] if options.fireballFolder: fireballDiffSummaryPath = outputPrefix + '_fireball_diff_summary.csv' fireLidarDiffSummaryPath = outputPrefix + '_fireLidar_diff_summary.csv' # Loop through matches # - Each fireball DEM is compared to our final output DEM as without the pc_align step # the errors will be high and won't mean much. for i in range(0,numDems): dem = demFiles[i] fireball = matchingFireballDems[i] if not fireball: # Skip missing fireball file (will be 'None') continue #try: prefix = outputPrefix + '_fireball_' + str(i) diffPath = prefix + "-diff.tif" cmd = ('geodiff --absolute %s %s -o %s' % (allDemPath, fireball, prefix)) logger.info(cmd) try: asp_system_utils.executeCommand(cmd, diffPath, suppressOutput, redo) except Exception as e: # This is necessary, sometimes the fireball DEM is wrong logger.info('Caught exception doing diff to fireball: ' + str(e)) logger.info("Not fatal, will continue.") # for clarity in the log, use this line continue results = icebridge_common.readGeodiffOutput(diffPath) fireballDiffPaths.append(diffPath) #except: # logger.warning('Difference between dem ' + demFiles[0] + ' and fireball failed!') consolidateGeodiffResults(fireballDiffPaths, fireballDiffSummaryPath ) consolidateGeodiffResults(fireLidarDiffCsvPaths, fireLidarDiffSummaryPath) lidarDiffPath = '' if lidarFile: # PC_ALIGN # - Use function to call with increasing max distance limits alignedDem, lidarDiffPath, meanErr = \ robustPcAlign(options, outputPrefix, lidarFile, lidarDemPath, allDemPath, finalAlignedDEM, projString, lidarCsvFormatString, threadText, logger) # Move the aligned DEM to the main directory, to have one file less if os.path.exists(alignedDem): logger.info("Moving " + alignedDem + " to " + finalAlignedDEM) if os.path.exists(finalAlignedDEM): os.remove(finalAlignedDEM) os.rename(alignedDem, finalAlignedDEM) allDemPath = finalAlignedDEM # Create pc-aligned bundle-adjusted cameras applyTransformToCameras(options, inputPairs, suppressOutput, redo, threadText, heightLimitString, logger) # Consolidate statistics into a one line summary file percentageFlagFile = os.path.join(options.outputFolder, 'valid_pixel_fraction.txt') consolidateStats(lidarDiffPath, interDiffSummaryPath, fireballDiffSummaryPath, fireLidarDiffSummaryPath, allDemPath, consolidatedStatsPath, percentageFlagFile, logger) if options.cleanup and os.path.exists(finalAlignedDEM): # Delete large files that we don't need going forwards. alignPrefix = icebridge_common.getAlignPrefix(options.outputFolder) cleanBatch(options.outputFolder, alignPrefix, prefixes, interDiffPaths, fireballDiffPaths) logger.info('Finished script process_icebridge_batch!') # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/process_icebridge_run.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Process an entire run of icebrige images. Multiple runs will be started in parallel. # All the image, camera, and lidar files must have date and time stamps, # like the orthoimages and the Fireball DEMs. As such, raw image # files must be renamed to be similar to the ortho image files. # No other files must be present in those directries. # Image files must be single-channel, so use for example gdal_translate -b 1. import os, sys, optparse, datetime, multiprocessing, time, logging, subprocess, re import traceback # We must import this explicitly, it is not imported by the top-level # multiprocessing module. import multiprocessing.pool # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) sys.path.insert(0, libexecpath) sys.path.insert(0, toolspath) import icebridge_common, process_icebridge_batch import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # TODO: Fix the logging! logging.info('DEBUG') logger = logging.getLogger(__name__) # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] # This is the file name in the output folder where batch commands will # be written to with the --log-batches option. BATCH_COMMAND_LOG_FILE = 'batch_commands_log.txt' def processBatch(imageCameraPairs, lidarFolder, referenceDem, skipInterval, outputFolder, extraOptions, outputResolution, stereoArgs, batchNum, batchLogPath=''): '''Processes a batch of images at once''' suppressOutput = False redo = False argString = '' for pair in imageCameraPairs: argString += pair[0] + ' ' for pair in imageCameraPairs: argString += pair[1] + ' ' # Just set the options and call the pair python tool. # We can try out bundle adjustment for intrinsic parameters here. cmd = ('--lidar-folder %s --reference-dem %s --stereo-image-interval %d --dem-resolution %f' \ ' --output-folder %s %s %s --stereo-arguments ' % (lidarFolder, referenceDem, skipInterval, outputResolution, outputFolder, argString, extraOptions)) if batchLogPath: # With this option we just log the commands to a text file # - Setting this option limits to one process so there will be only one # simultaneous file writer. with open(batchLogPath, 'a') as f: f.write('python ' + icebridge_common.fullPath('process_icebridge_batch.py') + ' ' + \ cmd +'"'+ stereoArgs +'"\n') return try: args = cmd.split() args += (stereoArgs.strip(),) # Make sure this is properly passed process_icebridge_batch.main(args) except Exception as e: logger.error('Batch processing failed!\n' + str(e) + traceback.print_exc()) def getImageSpacing(orthoFolder, availableFrames, startFrame, stopFrame, maxOverlapRatio, forceAllFramesInRange): '''Find a good image stereo spacing interval that gives us a good balance between coverage and baseline width. Also detect all frames where this is a large break after the current frame.''' logger.info('Computing optimal image stereo interval...') ## With very few cameras this is the only possible way to process them #if len(availableFrames) < 3 and not forceAllFramesInRange: # return ([], {}) # No skip, no breaks # Retrieve a list of the ortho files orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) if not os.path.exists(orthoIndexPath): raise Exception("Error: Missing ortho index file: " + orthoIndexPath + ".") (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath, prependFolder = True) # From the dictionary create a sorted list of ortho files in the frame range breaks = [] largeSkips = {} orthoFiles = [] for frame in sorted(orthoFrameDict.keys()): # Only process frames within the range if not ( (frame >= startFrame) and (frame <= stopFrame) ): continue orthoPath = orthoFrameDict[frame] frame = icebridge_common.getFrameNumberFromFilename(orthoPath) if not forceAllFramesInRange: if frame not in availableFrames: # Skip frames we did not compute a camera for continue orthoFiles.append(orthoPath) orthoFiles.sort() numOrthos = len(orthoFiles) # First load whatever boxes are there projectionIndexFile = icebridge_common.projectionBoundsFile(os.path.dirname(orthoFolder)) logger.info("Reading: " + projectionIndexFile) boundsDict = icebridge_common.readProjectionBounds(projectionIndexFile) # Get the bounding box and frame number of each ortho image logger.info('Loading bounding boxes...') frames = [] updatedBounds = False # will be true if some computation got done count = 0 for i in range(0, numOrthos): # This can be slow, so add a progress dialong count = count + 1 if (count - 1) % 1000 == 0: logger.info('Progress: ' + str(count) + '/' + str(numOrthos)) thisFrame = icebridge_common.getFrameNumberFromFilename(orthoFiles[i]) if thisFrame not in boundsDict: imageGeoInfo = asp_geo_utils.getImageGeoInfo(orthoFiles[i], getStats=False) thisBox = imageGeoInfo['projection_bounds'] boundsDict[thisFrame] = thisBox updatedBounds = True frames.append(thisFrame) # Read this file again, in case some other process modified it in the meantime. # This won't happen in production mode, but can during testing with partial sequences. boundsDictRecent = icebridge_common.readProjectionBounds(projectionIndexFile) for frame in sorted(boundsDictRecent.keys()): if not frame in boundsDict.keys(): boundsDict[frame] = boundsDictRecent[frame] updatedBounds = True # Save the bounds. There is always the danger that two processes will # do that at the same time, but this is rare, as hopefully we get here # only once from the manager. It is not a big loss if this file gets messed up. if updatedBounds: logger.info("Writing: " + projectionIndexFile) icebridge_common.writeProjectionBounds(projectionIndexFile, boundsDict) # Since we are only comparing the image bounding boxes, not their exact corners, # these ratios are only estimates. MAX_RATIO = maxOverlapRatio # = 0.85 # Increase skip until we get below this... MIN_RATIO = 0.75 # ... but don't go below this value! NOTRY_RATIO = 0.0001 # Don't bother with overlap amounts less than this (small on purpose) def getBboxArea(bbox): '''Return the area of a bounding box in form of (minX, maxX, minY, maxY)''' width = bbox[1] - bbox[0] height = bbox[3] - bbox[2] if (width < 0) or (height < 0): return 0 return width*height # Iterate over the frames and find the best stereo frame for each for i in range(0, numOrthos-1): thisFrame = frames[i] thisBox = boundsDict[thisFrame] thisArea = getBboxArea(thisBox) interval = 1 while(True): # Compute intersection area between this and next image nextFrame = frames[i+interval] nextBox = boundsDict[nextFrame] intersect = [max(thisBox[0], nextBox[0]), # Min X min(thisBox[1], nextBox[1]), # Max X max(thisBox[2], nextBox[2]), # Min Y min(thisBox[3], nextBox[3])] # Max Y area = getBboxArea(intersect) ratio = 0 if area > 0: ratio = area / thisArea if interval == 1: # Cases for the smallest interval... if ratio < NOTRY_RATIO: breaks.append(thisFrame) # No match for this frame logger.info('Detected large break after frame ' + str(thisFrame)) break if ratio < MIN_RATIO: break # No reason to try increasing skip amounts for this frame else: # interval > 1 if ratio < MIN_RATIO: # Went too small, walk back the interval. interval = interval - 1 break if ratio > MAX_RATIO: # Too much overlap, increase interval interval = interval + 1 else: # Overlap is fine, keep this interval. break # Handle the case where we go past the end of frames looking for a match. if i+interval >= len(frames): interval = interval - 1 break if interval > 1: # Only record larger than normal intervals. largeSkips[thisFrame] = interval logger.info('Detected ' + str(len(breaks)) + ' breaks in image coverage.') logger.info('Detected ' + str(len(largeSkips)) + ' images with interval > 1.') return (breaks, largeSkips) def list_median(lst): sortedLst = sorted(lst) lstLen = len(lst) index = (lstLen - 1) // 2 if (lstLen % 2): return sortedLst[index] else: return (sortedLst[index] + sortedLst[index + 1])/2.0 def getRunMedianGsd(imageCameraPairs, referenceDem, isSouth, frameSkip=1): '''Compute the mean GSD of the images across the run''' logger.info('Computing mean input image GSD...') projString = icebridge_common.getProjString(isSouth) # Iterate through the input pairs numPairs = len(imageCameraPairs) #medianGsd = 0.0 #numChecks = 0.0 gsdVals = [] for i in range(0, numPairs, frameSkip): pair = imageCameraPairs[i] # Average in the GSD for each file we can process gsd, bounds = icebridge_common.getCameraGsdAndBoundsRetry(pair[0], pair[1], logger, referenceDem, projString) # TODO Move on to the next file on failure gsdVals.append(gsd) #medianGsd += gsd #numChecks += 1.0 #medianGsd = medianGsd / numChecks medianGsd = list_median(gsdVals) logger.info('Computed input image mean GSD: ' + str(medianGsd)) return medianGsd class NoDaemonProcess(multiprocessing.Process): # make 'daemon' attribute always return False def _get_daemon(self): return False def _set_daemon(self, value): pass daemon = property(_get_daemon, _set_daemon) # A pool that allows each process to have its own pool of subprocesses. # This should be used with care. class NonDaemonPool(multiprocessing.pool.Pool): Process = NoDaemonProcess def main(argsIn): try: usage = '''usage: process_icebridge_run.py <image_folder> <camera_folder> <lidar_folder> <output_folder>''' parser = optparse.OptionParser(usage=usage) # Data selection optios parser.add_option('--start-frame', dest='startFrame', default=-1, type='int', help='The frame number to start processing with.') parser.add_option('--stop-frame', dest='stopFrame', default=-1, type='int', help='The frame number to finish processing with.') parser.add_option('--south', action='store_true', default=False, dest='isSouth', help='MUST be set if the images are in the southern hemisphere.') # Processing options parser.add_option('--stereo-arguments', dest='stereoArgs', default='', help='Additional argument string to be passed to the stereo command.') parser.add_option('--bundle-length', dest='bundleLength', default=2, type='int', help='Number of images to bundle adjust and process at once.') parser.add_option('--image-stereo-interval', dest='imageStereoInterval', default=None, type='int', help='Advance this many frames to get the stereo pair. Default is auto-calculate') parser.add_option('--max-overlap-ratio', dest='maxOverlapRatio', default=0.85, type='float', help='The maximum ratio of overlap between images to be accepted as part of a stereo pair.') parser.add_option('--solve-intrinsics', action='store_true', default=False, dest='solve_intr', help='If to float the intrinsics params.') #parser.add_option('--dem-resolution', dest='demResolution', default=0.4, # type='float', help='Generate output DEMs at this resolution.') parser.add_option('--max-displacement', dest='maxDisplacement', default=20, type='float', help='Max displacement value passed to pc_align.') # Performance options parser.add_option('--num-processes', dest='numProcesses', default=1, type='int', help='The number of simultaneous processes to run.') parser.add_option('--num-threads', dest='numThreads', default=None, type='int', help='The number threads to use per process.') # Action options parser.add_option('--interactive', action='store_true', default=False, dest='interactive', help='If to wait on user input to terminate the jobs.') parser.add_option('--log-batches', action='store_true', default=False, dest='logBatches', help="Just log the batch commands to a file.") parser.add_option('--cleanup', action='store_true', default=False, dest='cleanup', help='If the final result is produced delete intermediate files.') parser.add_option('--many-ip', action='store_true', default=False, dest='manyip', help='If to use a lot of IP in bundle adjustment from the beginning.') parser.add_option('--dry-run', action='store_true', default=False, dest='dryRun', help="Print but don't launch the processing jobs.") parser.add_option('--ortho-folder', dest='orthoFolder', default=None, help='Use ortho files to adjust processing to the image spacing.') parser.add_option('--fireball-folder', dest='fireballFolder', default=None, help='Location of fireball DEMs for comparison.') parser.add_option('--reference-dem', dest='referenceDem', default=None, help='Reference DEM used to calculate the expected GSD.') (options, args) = parser.parse_args(argsIn) if len(args) < 4: print(usage) return 0 imageFolder = args[0] cameraFolder = args[1] lidarFolder = args[2] outputFolder = args[3] except optparse.OptionError as msg: raise Usage(msg) os.system("ulimit -c 0") # disable core dumps os.system("umask 022") # enforce files be readable by others # Check the inputs for f in [imageFolder, cameraFolder, lidarFolder]: if not os.path.exists(f): logger.error('Input folder '+ f +' does not exist!') return 0 asp_system_utils.mkdir_p(outputFolder) suppressOutput = False redo = False logger.info('\nStarting processing...') # Get a list of all the input files imageCameraPairs = icebridge_common.getImageCameraPairs(imageFolder, cameraFolder, options.startFrame, options.stopFrame, logger) numFiles = len(list(imageCameraPairs)) if numFiles < 2: raise Exception('Failed to find any image camera pairs!') # Check that the files are properly aligned lastFrame = -1 availableFrames = [] for (image, camera) in imageCameraPairs: frameNumber = icebridge_common.getFrameNumberFromFilename(image) availableFrames.append(frameNumber) if (icebridge_common.getFrameNumberFromFilename(camera) != frameNumber): logger.error('Error: input files do not align!\n' + str((image, camera))) return -1 if frameNumber <= lastFrame: logger.error('Error: input frames not sorted properly!\n') return -1 lastFrame = frameNumber # Do not compute output resolution. Will be overwritten anyway per frame. ## Set the output resolution as the computed mean GSD ## TODO: This should be cashed, and recomputed only when the batch file changes! #NUM_GSD_FRAMES = 20 #logger.info('Computing GSD with ' + str(NUM_GSD_FRAMES) + ' frames.') #gsdFrameSkip = len(imageCameraPairs) / NUM_GSD_FRAMES #if gsdFrameSkip < 1: # gsdFrameSkip = 1 #medianGsd = getRunMedianGsd(imageCameraPairs, options.referenceDem, options.isSouth, # gsdFrameSkip) #outputResolution = icebridge_common.gsdToDemRes(medianGsd) #logger.info('OUTPUT_RESOLUTION: ' + str(outputResolution)) outputResolution = 0.4 # Generate a map of initial camera positions orbitvizBefore = os.path.join(outputFolder, 'cameras_in.kml') vizString = '' for (image, camera) in imageCameraPairs: vizString += camera+' ' cmd = 'orbitviz_pinhole --hide-labels -o '+ orbitvizBefore +' '+ vizString logger.info('Running orbitviz on input files...') # Suppress (potentially long) output asp_system_utils.executeCommand(cmd, orbitvizBefore, True, redo) # Set up options for process_icebridge_batch extraOptions = '' if options.numThreads: extraOptions += ' --num-threads ' + str(options.numThreads) if options.solve_intr: extraOptions += ' --solve-intrinsics ' if options.isSouth: extraOptions += ' --south ' if options.maxDisplacement: extraOptions += ' --max-displacement ' + str(options.maxDisplacement) if options.fireballFolder: extraOptions += ' --fireball-folder ' + str(options.fireballFolder) if options.cleanup: extraOptions += ' --cleanup ' if options.manyip: extraOptions += ' --many-ip ' # We ran this before, as part of fetching, so hopefully all the data is cached forceAllFramesInRange = False (breaks, largeSkips) = getImageSpacing(options.orthoFolder, availableFrames, options.startFrame, options.stopFrame, options.maxOverlapRatio, forceAllFramesInRange) if options.imageStereoInterval: logger.info('Using manually specified image stereo interval: ' + str(options.imageStereoInterval)) largeSkips = [] # Always use a manually specified skip interval else: options.imageStereoInterval = 1 sleepTime = 20 # If all we are doing is logging commands then one process is sufficient. # - Wipe the output file while we are at it. batchLogPath = '' batchNum = 0 if options.logBatches: options.numProcesses = 1 sleepTime = 1 batchLogPath = os.path.join(outputFolder, BATCH_COMMAND_LOG_FILE) os.system('rm -f ' + batchLogPath) logger.info('Just generating batch log file '+batchLogPath+', no processing will occur.') logger.info('Starting processing pool with ' + str(options.numProcesses) +' processes.') pool = NonDaemonPool(options.numProcesses) # Call process_icebridge_batch on each batch of images. # - Batch size should be the largest number of images which can be effectively bundle-adjusted. taskHandles = [] batchImageCameraPairs = [] frameNumbers = [] i = 0 # The frame index that starts the current batch while True: # Loop for adding batches # Bugfix: arrived at the last feasible frame (maybe there are more but # they lack cameras). if i >= len(list(imageCameraPairs)): break firstBundleFrame = icebridge_common.getFrameNumberFromFilename(imageCameraPairs[i][0]) # Determine the frame skip amount for this batch (set by the first frame) thisSkipInterval = options.imageStereoInterval if firstBundleFrame in largeSkips: #print(" ", firstBundleFrame, " in largeskips!" ) thisSkipInterval = largeSkips[firstBundleFrame] thisBatchSize = options.bundleLength + thisSkipInterval - 1 # Keep adding frames until we have enough or run out of frames j = i # The frame index that ends the batch while True: if j >= len(imageCameraPairs): # Bugfix: arrived at the last feasible frame. break frameNumber = icebridge_common.getFrameNumberFromFilename(imageCameraPairs[j][0]) # Useful debugging code #print("Framenumber is ", frameNumber) #if int(frameNumber) > 8531: # # pass # for t in range(8340, 8360): # print("i frame is ", t, imageCameraPairs[t][0]) # print("breaks are ", breaks) # sys.exit(1) # Update conditions hitBreakFrame = (frameNumber in breaks) lastFrame = (frameNumber > options.stopFrame) or (j >= numFiles) endBatch = ( len(frameNumbers) >= thisBatchSize ) if lastFrame or endBatch: break # The new frame is too much, don't add it to the batch # Add frame to the list for the current batch batchImageCameraPairs.append(imageCameraPairs[j]) frameNumbers.append(frameNumber) if hitBreakFrame: logger.info("Hit a break, won't start a batch with frame: " + str(frameNumber)) break # Break after this frame, it is the last one added to the batch. j = j + 1 # Done adding frames to this batch if len(frameNumbers) <= thisSkipInterval: logger.info('Batch from frame: ' + str(firstBundleFrame) + ' is too small to run. Skipping.') else: # Submit the batch if not options.logBatches: logger.info('Processing frame number: ' + str(firstBundleFrame)) # The output folder is named after the first and last frame in the batch. # We count on this convention in blend_dems.py. batchFolderName = icebridge_common.batchFolderName(frameNumbers[0], frameNumbers[-1], options.bundleLength) thisOutputFolder = os.path.join(outputFolder, batchFolderName) if not options.logBatches: logger.info('Running processing batch in output folder: ' + \ thisOutputFolder + '\n' + 'with options: ' + \ extraOptions + ' --stereo-arguments ' + \ options.stereoArgs) if not options.dryRun: # Generate the command call taskHandles.append(pool.apply_async(processBatch, (batchImageCameraPairs, lidarFolder, options.referenceDem, thisSkipInterval, thisOutputFolder, extraOptions, outputResolution, options.stereoArgs, batchNum, batchLogPath))) batchNum += 1 # Reset these lists batchImageCameraPairs = [] frameNumbers = [] # Advance to the frame that starts the next batch if hitBreakFrame: # When we hit a break in the frames we need to start the # next batch after the break frame #print("Hit break frame for i, j, frameNumber", i, j, frameNumber) i = j + 1 else: # Start in the next frame that was not used as a "left" stereo image. i = i + options.bundleLength - 1 if lastFrame: break # Quit the main loop if we hit the end of the frame list. # End of loop through input file pairs logger.info('Finished adding ' + str(len(taskHandles)) + ' tasks to the pool.') # Wait for all the tasks to complete icebridge_common.waitForTaskCompletionOrKeypress(taskHandles, logger, options.interactive, quitKey='q', sleepTime=sleepTime) # Either all the tasks are finished or the user requested a cancel. # Clean up the processing pool icebridge_common.stopTaskPool(pool) logger.info('Finished process_icebridge_run.') # to avoid ending a log with 'waiting ...' # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/push_to_nsidc.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Push DEMs and orthos to NSIDC. # 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' # If there is more than one archive, push the one with the latest # modification time. # TODO: How to prevent old copies littering the remote directory? import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing import re, shutil, glob import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, archive_functions, run_helper import asp_system_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] g_start_time = -1 g_stop_time = -1 def start_time(): global g_start_time, g_stop_time g_start_time = time.time() def stop_time(job, logger): global g_start_time, g_stop_time g_stop_time = time.time() wall_s = float(g_stop_time - g_start_time)/3600.0 logger.info( ("Elapsed time for %s is %g hours." % (job, wall_s) ) ) def fetchIndices(options, logger): '''Fetch the csv indices of available files.''' logger.info("Fetch indices from NSIDC.") pythonPath = asp_system_utils.which('python') cmd = ( (pythonPath + ' ' + icebridge_common.fullPath('full_processing_script.py') + \ ' --camera-calibration-folder %s --reference-dem-folder %s --site %s ' + \ '--yyyymmdd %s --stop-after-index-fetch --no-nav ' ) % \ (options.inputCalFolder, options.refDemFolder, options.site, options.yyyymmdd)) logger.info(cmd) start_time() os.system(cmd) stop_time("fetch index", logger) def pushByType(run, options, logger, dataType): # Fetch the ortho index from NSIDC if missing outputFolder = run.getFolder() logger.info("Output folder is " + outputFolder) os.system("mkdir -p " + outputFolder) # Current directory. It is important to go from /u to the real dir which is /nobackup... unpackDir = os.path.realpath(os.getcwd()) logger.info("Unpack directory is " + unpackDir) orthoFolder = icebridge_common.getOrthoFolder(outputFolder) orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) if not os.path.exists(orthoIndexPath): fetchIndices(options, logger) logger.info("Reading ortho index: " + orthoIndexPath) (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath) # Fetch unarchived folder if missing if dataType == 'DEM': unarchivedFolder = run.getAssemblyFolder() elif dataType == 'ORTHO': unarchivedFolder = run.getProcessFolder() else: raise Exception("Unknown data type: " + dataType) logger.info("Unarchived data folder is " + unarchivedFolder) # Especially for ortho, force-fetch each time, as there is no good way # of checking if we fetched well before. start_time() if not archive_functions.fetchProcessedByType(run, unpackDir, logger, dataType): return stop_time("fetching archived data by type: " + dataType, logger) # Make the output directory at NSIDC m = re.match("(\d\d\d\d)(\d\d)(\d\d)", options.yyyymmdd) if m: outDir = options.site + "_" + m.group(1) + "." + m.group(2) + "." + m.group(3) else: raise Exception("Could not parse: " + options.yyyymmdd) # Keep the output directory locally here localDirPath = os.path.join(outputFolder, dataType, outDir) os.system("mkdir -p " + localDirPath) logger.info("Storing the renamed " + dataType + " files in " + localDirPath) logger.info("Directory name at NSIDC: " + outDir) # Read the DEMs and orthos, and copy them to outDir according to the final convention if dataType == 'DEM': dataFiles = icebridge_common.getTifs(unarchivedFolder, prependFolder=True) else: dataFiles = glob.glob(os.path.join(unarchivedFolder, 'batch_*', 'out-ortho.tif')) for dataFile in dataFiles: # Here we use the convention from archive_functions.py for DEMs and from how we store orthos. if dataType == 'DEM': m = re.match("^.*?" + unarchivedFolder + "/F_(\d+)_\d+_" + dataType + \ "\.tif$", dataFile) if not m: continue frameNumber = int(m.group(1)) else: m = re.match("^.*?" + unarchivedFolder + "/batch_(\d+)_\d+_\d+/" + \ "out-ortho.tif$", dataFile) if not m: continue frameNumber = int(m.group(1)) if frameNumber < options.startFrame or frameNumber > options.stopFrame: continue # For each data file, copy from the ortho its meta info if not frameNumber in orthoFrameDict.keys(): # Bugfix: Ortho fetching failed, try again fetchIndices(options, logger) logger.info("Re-reading ortho index: " + orthoIndexPath) (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath) if not frameNumber in orthoFrameDict.keys(): # This time there is nothing we can do raise Exception("Cannot find ortho for frame: " + str(frameNumber)) orthoFile = orthoFrameDict[frameNumber] [dateString, timeString] = icebridge_common.parseTimeStamps(orthoFile) # It is always possible that the ortho file date will be the next day # after the current flight date, if the flight goes after midnight. # So it is not unreasonable that options.yyyymmdd != dateString. if dataType == 'DEM': outFile = ('IODEM3_%s_%s_%05d_DEM.tif' % (dateString, timeString, frameNumber)) else: # TODO: Need to think more of the naming convention. outFile = ('IODEM3_%s_%s_%05d_ORTHO.tif' % (dateString, timeString, frameNumber)) cmd = "/bin/cp -fv " + dataFile + " " + os.path.join(localDirPath, outFile) logger.info(cmd) os.system(cmd) # Push the directory to NSIDC remoteDirPath = os.path.join(os.path.basename(os.path.dirname(localDirPath)), os.path.basename(localDirPath)) remoteDirPath = os.path.join('/incoming', 'Ames', remoteDirPath) logger.info("Storing at NSIDC in: " + remoteDirPath) cmd = 'lftp -e "mirror -P 20 -c -R -vvv --delete --delete-first ' + localDirPath + \ ' ' + remoteDirPath + ' -i \'\.(tif)$\'; bye\" -u ' + options.loginInfo logger.info(cmd) start_time() (output, err, status) = asp_system_utils.executeCommand(cmd, suppressOutput = True) #status = os.system(cmd) logger.info("LFTP output and error: " + output + ' ' + err) logger.info("LFTP status: " + str(status)) #if status != 0: # raise Exception("Problem pushing") stop_time("push to NSIDC", logger) def main(argsIn): try: usage = '''usage: push_to_nsidc.py <options> ''' parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--yyyymmdd", dest="yyyymmdd", default="", help="Specify the year, month, and day in one YYYYMMDD string.") parser.add_argument("--site", dest="site", default = "", help="Name of the location of the images (AN, GR, or AL)") parser.add_argument("--site_yyyymmdd", dest="site_yyyymmdd", default = "", help="A value like GR_20150330, which will be split into site and yyyymmdd by this script.") parser.add_argument('--start-frame', dest='startFrame', type=int, default=icebridge_common.getSmallestFrame(), help="Frame to start with. Leave this and stop-frame blank to " + \ "process all frames.") parser.add_argument('--stop-frame', dest='stopFrame', type=int, default=icebridge_common.getLargestFrame(), help='Frame to stop on.') parser.add_argument("--camera-calibration-folder", dest="inputCalFolder", default=None, help="The folder containing camera calibration.") parser.add_argument("--reference-dem-folder", dest="refDemFolder", default=None, help="The folder containing DEMs that created orthoimages.") parser.add_argument("--login-info", dest="loginInfo", default=None, help="user,password destination.nsidc.org.") parser.add_argument("--done-file", dest="doneFile", default=None, help="List of runs that were done by now.") options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) # parse --site_yyyymmdd. Sometimes it is easier to pass this than # to pass separately --site and --yyyymmdd. m = re.match('^(\w+)_(\w+)', options.site_yyyymmdd) if m: options.site = m.group(1) options.yyyymmdd = m.group(2) else: options.site_yyyymmdd = options.site + "_" + options.yyyymmdd # Read the done file and exit if the current flight is done done = set() if options.doneFile != "": with open(options.doneFile, 'r') as f: for val in f: val = val.strip() done.add(val) if options.site_yyyymmdd in done: print("Skipping done flight: " + options.site_yyyymmdd) return 0 run = run_helper.RunHelper(options.site, options.yyyymmdd, os.getcwd()) # Set up logging in the run directory. Log outside of the run dir, # as that one we will wipe logFolder = os.path.abspath(os.path.join(run.getFolder(), '..', 'push_logs')) os.system('mkdir -p ' + logFolder) logLevel = logging.INFO logger = icebridge_common.setUpLogger(logFolder, logLevel, "push") logger.info("Logging in: " + logFolder) # Check the lftp version. On some machines it is too old. (out, err, status) = asp_system_utils.executeCommand(['lftp', '--version'], suppressOutput = True) m = re.match('^.*?LFTP\s+\|\s+Version\s+4.5', out) if not m: raise Exception('Expecting LFTP version 4.5.') else: logger.info("Found an acceptable version of LFTP.") pushByType(run, options, logger, 'DEM') #pushByType(run, options, logger, 'ORTHO') # need to wait for format decision # Wipe at the end cmd = "rm -rf " + run.getFolder() logger.info(cmd) os.system(cmd) # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/qi2txt.cc ================================================ /* * Initial version was received at NSIDC from Serdar Manizade. Modified * significantly by Bruce Raup (braup@nsidc.org). * 7-8-16 Modified by Cade "The Intern" Haley to accommodate 10 and 14-word data * plus other output modes * * qi2txt() creates ascii output (to standard output) from qfit binary files * (12-word input). Output stream contains the laser lat/lon/elev/hhmmss * (removed output of passive data and laser srt). Originally written by Bob * Swift/EG&G, Modified by Serdar Manizade 08-Feb-2010. Output format includes * title for each column, comma delimited. * * Input data are in big-endian format. This reader automatically detects the * endianness of the host machine and swaps if needed. * * * The output columns are different depending on whether the ATM records * are 10, 12, or 14 words long (hence the need for 'scale' and 'multiply_table' * below). The corresponding column information will be printed to standard output. */ /* Copied from qi2txt-readme.txt OVERVIEW This readme accompanies the IceBridge QFIT data reader: qi2txt The qi2txt program reads binary data files from the Operation IceBridge ATM instrument, which are available as the ILATM1B and BLATM1B product at the National Snow and Ice Data Center (NSIDC), at http://nsidc.org/data/ilatm1b.html This software is available at http://nsidc.org/data/icebridge/tools.html DISCLAIMER This software is provided as-is as a service to the user community in the hope that it will be useful, but without any warranty of fitness for any particular purpose or correctness. Bug reports, comments, and suggestions for improvement are welcome; please send to nsidc@nsidc.org. CHANGELOG v0.4 >> 7-8-16 Modified to accommodate 10 and 14-word data outputs plus more output modes: - Short output -Coordinates only -First and Last -Print all The program assumes by default that the input binary QFIT file is in big endian format. It tests the endianness of the host machine and swaps the data to match that of the host machine. To have the program assume the data format is little endian, use the -L option. Examples of using the reader: Convert an entire binary input file to a (possibly huge) text file: $ ./qi2txt inputfile.qi > outfile_ascii.txt Extract lat, lon, elevation only, skipping over the header line: $ ./qi2txt -S inputfile.qi > xyz.txt Print the first few lines, and tell the program that the input file is in little endian format: $ ./qi2txt -L inputfile.qi | head -n10 */ #include <stdio.h> #include <stdlib.h> /*---------------------------------------------------------------------- * Contents of define.h - operating system dependent stuff *----------------------------------------------------------------------*/ static const char define_h_rcsid[] = "$Id: define.h 16072 2010-01-30 19:39:09Z brodzik $"; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <math.h> #include <assert.h> #ifdef DEBUG_MALLOC #include "dbmalloc.h" #endif #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define NEVER FALSE #ifndef PI #define PI 3.141592653589793 #endif #define radians(t) ( (t) * PI / 180.0) #define degrees(t) ( (t) * 180.0 / PI) #define nint(x) ((int)((x)+.5)) #define sign(x) ((x) < 0 ? -1 : 1) #define streq(s1,s2) (strcmp(s1,s2) == 0) #ifdef NEED_STRDUP static char *t_sd_p; #define strdup(string) \ t_sd_p = (char *)malloc(strlen(string)+1); \ if (t_sd_p) strcpy(t_sd_p, string); #endif #define NUMBER(a) ((int)(sizeof(a)/sizeof(a[0]))) #define ABORT EXIT_FAILURE #define error_exit(msg) {fprintf(stderr,"%s\n",msg); exit(ABORT);} #define repeat do #define until(condition) while(!(condition)) #define MAX_STRING 256 //typedef int bool; typedef unsigned char byte1; typedef unsigned short int byte2; typedef unsigned int byte4; typedef unsigned long long NSIDCbyte8; typedef char int1; typedef short int int2; typedef int int4; typedef long long NSIDCint8; #define BYTE1_BITS CHAR_BIT #define BYTE1_MAX UCHAR_MAX #define BYTE2_MAX USHRT_MAX #define BYTE4_MAX UINT_MAX #define NSIDCBYTE8_MAX ULLONG_MAX #define INT1_MAX SCHAR_MAX #define INT2_MAX SHRT_MAX #define INT4_MAX INT_MAX #define NSIDCINT8_MAX LLONG_MAX #define BYTE1_MIN 0 #define BYTE2_MIN 0 #define BYTE4_MIN 0 #define NSIDCBYTE8_MIN 0 #define INT1_MIN SCHAR_MIN #define INT2_MIN SHRT_MIN #define INT4_MIN INT_MIN #define NSIDCINT8_MIN LLONG_MIN /*---------------------------------------------------------------------- * END contents of define.h *----------------------------------------------------------------------*/ #define SEEK_SET 0 #define MAXARG 14 #define LAT_MIN 0 #define LAT_MAX 90 /* There are system endian.h definitions, but I'm not sure these are available * on all potential platforms. This source file includes a small routine to * test the endianness of the machine it's running on. */ #define MY_BIG_ENDIAN 0 #define MY_LITTLE_ENDIAN 1 #define MAX_NAME_LENGTH 1024 #define VERSION 0.4 int short_output = 0; int coordinates_output = 0; int first_n_last = 0; int printall = 0; int host_endianness; int data_endianness; /*======================================================================*/ /* byte swap function myswap */ int4 myswap(char *in, char* out, int4 len, int4 cnt) { int4 i, j, k, sp, ep; for (i=0; i<cnt; ++i) { sp = i*len; ep = sp+len-1; /* ((i+1) * len)-1; */ for (j=sp, k=0; j<=ep; ++j, ++k) { out[j] = in[ep-k]; } } return(i); } /*======================================================================*/ int testendianness(void) { typedef union { int i; char c[4]; } u; u temp; temp.i = 0x12345678; if (temp.c[0] == 0x12) { return(MY_BIG_ENDIAN); } else { return(MY_LITTLE_ENDIAN); } } /*======================================================================*/ int4 get_record_length(int4 *value, int4 *svalue, FILE *infile) { int4 nvar;// ipart; fread((char *)value,sizeof(*value),1,infile);//Read single int4 /* swap bytes if host machine is little-endian (e.g. PC) */ if (host_endianness != data_endianness) { /*ipart =*/ myswap((char*)value,(char*)svalue,4,1); // Swap the bytes in that int4 nvar = *(svalue) / 4; } else { /* Sun Workstations, etc. */ nvar = *(value) / 4; } /* rewind file */ fseek (infile,0L,SEEK_SET); /* read past first record */ fread((char *)value,sizeof(*value),nvar,infile); // Read again but length of that first integer into infile return( nvar ); } /*======================================================================*/ /* Print function which accommodates a variety of modes */ // word_format = values 0-2 representing 10, 12, and 14 word modes, respectively // mode = Different print modes. 'n' = normal, 'h' = header only // bufout = Pointer to the array containing the multiplied results void printData(int word_format, char mode, double * bufout){ if (short_output){ if (mode == 'h'){ fprintf(stdout,"# LATITUDE,LONGITUDE,ELEVATION,TIME-HHMMSS\n"); return; } switch(word_format){ case 0: fprintf(stdout,"%10.7f %11.7f %8.3f %011.4f\n", bufout[1], bufout[2],bufout[3],bufout[9]); break; case 1: fprintf(stdout,"%10.7f %11.7f %8.3f %011.4f\n", bufout[1], bufout[2],bufout[3],bufout[11]); break; case 2: fprintf(stdout,"%10.7f %11.7f %8.3f %011.4f\n", bufout[1], bufout[2],bufout[3],bufout[13]); break; } } else if (coordinates_output){ //Longitude, latitude if (mode == 'n'){ fprintf(stdout,"%.6f %.6f\n", bufout[2], bufout[1]); } } else { /* full output */ switch(word_format){ case 0: // 10 word if (mode == 'h'){ fprintf(stdout,"# REL_TIME,LATITUDE,LONGITUDE,ELEVATION,strt_pulse_sigstr,ref_sigstr,azi,pitch,roll,time-hhmmss\n"); return; } fprintf(stdout, "%10.6f %10.7f %11.7f %8.3f %7.0f %5.0f %5.0f %10.3f %11.3f %011.4f\n", bufout[0], bufout[1], bufout[2], bufout[3], bufout[4], bufout[5], bufout[6], bufout[7], bufout[8], bufout[9]); break; case 1: // 12 word if (mode == 'h'){ fprintf(stdout,"# REL_TIME,LATITUDE,LONGITUDE,ELEVATION,strt_pulse_sigstr,ref_sigstr,azi,pitch,roll,gps_dil_prec,pulse_width,time-hhmmss\n"); return; } fprintf(stdout, "%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", bufout[0], bufout[1], bufout[2], bufout[3], bufout[4], bufout[5], bufout[6], bufout[7], bufout[8], bufout[9], bufout[10], bufout[11]); break; case 2: // 14 word if (mode == 'h'){ fprintf(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"); return; } fprintf(stdout, "%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", bufout[0], bufout[1], bufout[2], bufout[3], bufout[4], bufout[5], bufout[6], bufout[7], bufout[8], bufout[9], bufout[10], bufout[11], bufout[12], bufout[13]); break; } } } int main(int argc, char *argv[]) { char infilename[MAX_NAME_LENGTH]; // 100 long c string FILE *infile; // Pointer to infile c string int4 value[MAXARG], svalue[MAXARG];//, gvalue[MAXARG];// value, s, and g w/ 14 spots each long unsigned int in_rec = 0, out_rec = 0; int4 neg_rec_count = 0; int4 j, nvar, /*ipart,*/ multiply_rule; // This scale represents a combination of word sizes, // appropriately multiplied by 'multiply_matrix' double scale[MAXARG] = { 1.0e3, 1.0e6, 1.0e6, 1.0e3, 1.0, 1.0, 1.0e3, 1.0e3, 1.0e3, 1.0e1, 1.0e6, 1.0e6, 1.0e3, 1.0 }; int multiply_table[3][MAXARG] = // 3 word formats, 14 max words // 0 = don't multiply, 1 = multiply by scale[i], 2 = is timestamp {{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 2}}; int word_format; double bufout[MAXARG];// 14 entries const char *endian[] = { "big", "little" }; float version = VERSION; host_endianness = testendianness(); // Had to make some edits here to accept more than one argument at once! if (argc < 2) { fprintf(stderr, "%s version %g\n", argv[0], version ); fprintf( stderr, "Usage: %s [-S/-C/-L/-F/-P] inputfile\n", argv[0] ); fprintf( stderr, " Use -S to print shortened version (only LAT,LONG,ELEVATION,TIME)\n" ); fprintf( stderr, " Use -C to print coordinates only (for generating .spatial files)\n" ); fprintf( stderr, " Use -L to assume data is little-endian\n" ); fprintf( stderr, " Use -F to print only first and last valid lines in short form\n" ); fprintf( stderr, " Use -P to forceably print all lines, even if garbage (for debug)\n" ); fprintf( stderr, " By default the program assumes the data are big-endian\n" ); fprintf( stderr, " In either case, it tests the host architecture and will\n" ); fprintf( stderr, " try to match the data to that endianness.\n" ); fprintf( stderr, "(Enter any key to exit)\n" ); getchar(); exit(1); } // To keep this code simple, this must be the last argument! int file_index = argc - 1; data_endianness = MY_BIG_ENDIAN; // Check for flags for (int i=1; i<argc-1; ++i) { if (strcmp(argv[i], "-S")==0) // Short mode short_output = 1; if (strcmp(argv[i], "-C")==0) // Coordinates only coordinates_output = 1; if (strcmp(argv[i], "-L")==0) // Little endian mode data_endianness = MY_LITTLE_ENDIAN; if (strcmp(argv[i], "-F")==0){ // Print first and last records only first_n_last = 1; short_output = 1; } if (strcmp(argv[i], "-P")==0) // Print all records, even negative printall = 1; } strncpy(infilename, argv[file_index], MAX_NAME_LENGTH); // Dump first arg name into 1024 long c string fprintf(stderr, "%s version %g\n", argv[0], version ); fprintf(stderr, " Input file: %s\n", infilename); fprintf(stderr, "This machine is %s endian.\n", endian[host_endianness]); fprintf(stderr, "Assuming data are %s endian.\n", endian[data_endianness]); infile=fopen(infilename,"rb"); // Open the filename in binary read mode, give pointer to file object if (infile==NULL) { fprintf(stderr, "cannot open input file\n"); exit(1); } /* read first record and verify fixed record length */ nvar = get_record_length(value, svalue, infile); word_format = (nvar-10)/2; // 10word = 0, 12word = 1, 14word = 2 // Quick error check if (word_format > 2){ fprintf(stderr, "ERROR: Unexpected words/record %d\n", nvar); exit(1); } fprintf(stderr, "Number of words/record = %d\n", nvar); fprintf(stderr, "Skipping records with negative time values.\n"); // // OUTPUT FILE instead of stdout // FILE *output = fopen("output.txt","w+"); // if (output==NULL){ // fprintf(stderr, "cant create output file"); // exit (1); // } int found_first = 0; int found_last = 0; int nvar_mult = 0; printData(word_format, 'h', NULL); // Print headers // Begin fairly slow stdout print. Want speedup? fputs out to file instead! while (fread((char *)value,sizeof(*value),nvar,infile) != 0) { ++in_rec; /* swap bytes if host machine is little-endian (e.g. PC) */ if (host_endianness != data_endianness) { /*ipart =*/ myswap((char*)value,(char*)svalue,sizeof(*value),nvar); } else { /* host machine is big-endian (e.g. Sun Workstation) */ for (j=0; j < nvar; j++) svalue[j] = value[j]; } /* skip header records which begin with negative integers */ // if (*(svalue) >= 0 && (in_rec%20000)==0) { if (*(svalue) >= 0 || printall == 1) { /* convert scaled integers to double precision reals */ for (j=0; j < nvar; j++){ multiply_rule=multiply_table[word_format][j]; if (multiply_rule == 1){ // Regular divide (value / scale) bufout[j] = svalue[j] / scale[j]; } else if (multiply_rule == 2){ // Is an HHMMSS timestamp bufout[j] = svalue[j] / 1.0e3; } else{ // Doesn't need to be scaled bufout[j] = svalue[j]; } } /* convert positive east longitude to negative when value exists */ if (bufout[2] > 180) bufout[2] -= 360; /* xyz limited output for laser spot */ if (bufout[1] != 0.0 && bufout[3] > -9999){ printData(word_format, 'n', bufout); ///////PRINT DATA /* SPECIAL: Track when first line, then last line is printed*/ (found_first) ? (found_last=1) : (found_first=1); ++out_rec; } } else { ++neg_rec_count; } /* SPECIAL: Print first and last lines only */ if (first_n_last && found_first){ nvar_mult++; if (found_last){ break; } // Rewind line-by-line to find the last data point fseek(infile,-nvar*nvar_mult*sizeof(*value), SEEK_END); } } fprintf(stderr, "Number of records read = %ld\nNumber of records written = %ld\n", in_rec, out_rec); fprintf(stderr, "Number of negative time records skipped = %d\n", neg_rec_count); fclose(infile); if (out_rec == 0){ fprintf(stderr, "\n\tWarning: No valid records found."); exit (2); } // fclose(output); return 0; } ================================================ FILE: src/asp/IceBridge/regenerate_summary_images.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Program to generate a new version of a SUMMARY tarball with any missing # DEM and ORTHO browse images replaced. import os, sys, argparse, datetime, time, subprocess, logging, multiprocessing import traceback import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, pbs_functions, archive_functions, run_helper import asp_system_utils, generate_flight_summary asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] #========================================================================= # Parameters # Constants used in this file PBS_QUEUE = 'normal' GROUP_ID = 's2022' g_start_time = -1 g_stop_time = -1 def start_time(): global g_start_time, g_stop_time g_start_time = time.time() def stop_time(job, logger): global g_start_time, g_stop_time g_stop_time = time.time() wall_s = float(g_stop_time - g_start_time)/3600.0 logger.info( ("Elapsed time for %s is %g hours." % (job, wall_s) ) ) PFE_NODES = ['san', 'ivy', 'has', 'bro'] #========================================================================= # 'wes' = Westmere = 12 cores/24 processors, 48 GB mem, SBU 1.0, Launch from mfe1 only! # 'san' = Sandy bridge = 16 cores, 32 GB mem, SBU 1.82 # 'ivy' = Ivy bridge = 20 cores, 64 GB mem, SBU 2.52 # 'has' = Haswell = 24 cores, 128 GB mem, SBU 3.34 # 'bro' = Broadwell = 28 cores, 128 GB mem, SBU 4.04 def getParallelParams(nodeType): '''Return (numProcesses, numThreads, tasksPerJob, maxHours) for running a certain task on a certain node type''' if nodeType == 'san': return (16, 1, 600, 2) if nodeType == 'ivy': return (20, 1, 700, 2) if nodeType == 'has': return (24, 1, 800, 2) if nodeType == 'bro': return (28, 1, 900, 2) if nodeType == 'wes': return (12, 1, 400, 2) raise Exception('No params defined for node type ' + nodeType + ', task = ' + task) #========================================================================= def getEmailAddress(userName): '''Return the email address to use for a user''' if userName == 'smcmich1': return 'scott.t.mcmichael@nasa.gov' if userName == 'oalexan1': return 'oleg.alexandrov@nasa.gov' def sendEmail(address, subject, body): '''Send a simple email from the command line''' # Remove any quotes, as that confuses the command line. subject = subject.replace("\"", "") body = body.replace("\"", "") try: cmd = 'mail -s "' + subject + '" ' + address + ' <<< "' + body + '"' #print(cmd) # too verbose to print os.system(cmd) except Exception as e: print("Could not send mail.") #--------------------------------------------------------------------- def submitBatchJobs(commandFileList, options, pbsLogFolder, run, logger): '''Read all the batch jobs required for a run and distribute them across job submissions. Returns the common string in the job names.''' # Retrieve parallel processing parameters (numProcesses, numThreads, tasksPerJob, maxHours) = getParallelParams(options.nodeType) numBatches = len(commandFileList) logger.info( ("Num batches: %d, tasks per job: %d" % (numBatches, tasksPerJob) ) ) baseName = run.shortName() # SITE + YYMMDD = 8 chars, leaves seven for frame digits. # Call the tool which just executes commands from a file scriptPath = icebridge_common.fullPath('multi_process_command_runner.py') index = 0 jobIDs = [] for commandFile in commandFileList: jobName = ('%s%05d%s' % ('RS', index, baseName) ) # Specify the range of lines in the file we want this node to execute args = ('--command-file-path %s --start-frame -1 --stop-frame -1 --num-processes %d' % \ (commandFile, numProcesses)) logPrefix = os.path.join(pbsLogFolder, 'batch_' + jobName) logger.info('Submitting summary regen job: ' + scriptPath + ' ' + args) BATCH_PBS_QUEUE = 'normal' jobID = pbs_functions.submitJob(jobName, BATCH_PBS_QUEUE, maxHours, logger, options.minutesInDevelQueue, GROUP_ID, options.nodeType, '~/repo/python_env/bin/python', scriptPath + ' ' + args, logPrefix) jobIDs.append(jobID) index += 1 # Waiting on these jobs happens outside this function return (baseName, jobIDs) def checkRequiredTools(): '''Verify that we have all the tools we will be calling during the script.''' tools = ['gdal_translate'] for tool in tools: asp_system_utils.checkIfToolExists(tool) def fetchTarball(louPath, localPath): '''Retrieve and unpack the desired tarball file from Lou''' if os.path.exists(localPath): return # Currently not checking that everything is there! cmd = 'shiftc --wait -d -r --verify --extract-tar lfe:' + louPath + ' ' + localPath print cmd os.system(cmd) if not os.path.exists(localPath): raise Exception('Failed to retrieve tarball: lfe:' + louPath) def getSummaryFileCommand(inFile, outFile, isOrtho): '''Get a one line command to generate a single summary file''' if isOrtho: cmd = 'gdal_translate -scale -outsize 25% 25% -of jpeg ' + inFile +' '+ outFile else: # Hillshade then downsample. tempPath = outFile + '_temp.tif' cmd = 'hillshade ' + inFile +' -o ' + tempPath cmd += (' && gdal_translate '+ tempPath +' '+ outFile+ ' -of GTiff -outsize 40% 40% -b 1 -co "COMPRESS=JPEG"') cmd += ' && rm ' + tempPath return cmd def descendIfNeeded(folder): '''If the input folder contains only a single folder, return that contained folder. Otherwise return the input folder.''' files = os.listdir(folder) if (len(files) == 1) and os.path.isdir(os.path.join(folder,files[0])): return os.path.join(folder, files[0]) else: return folder # TODO: Move to a shared file! def getUnpackedFiles(folder): '''Find all the DEM or ORTHO files unpacked from their tarball.''' # Dig down through the initial unpack folder top_folder = descendIfNeeded(folder) # Dig down through a subsequent unpack folder possible_directories = ['tarAssembly', 'processed', 'camera', 'summary'] file_dir = [] for d in possible_directories: test_dir = os.path.join(top_folder, d) if os.path.exists(test_dir): file_dir = test_dir break test_dir = os.path.join(top_folder, d) if os.path.exists(test_dir): file_dir = test_dir break # Handle case where each file is buried in a subfolder final_files = [] file_list = os.listdir(file_dir) for f in file_list: full_path = os.path.join(file_dir, f) if os.path.isdir(full_path): subfiles = os.listdir(full_path) final_files.append(os.path.join(full_path, subfiles[0])) else: final_files.append(full_path) return final_files def getMissingSummaryFiles(folder, summaryFolder, isOrtho): '''Return a list of input/output pairs of missing summary files.''' print 'Looking for missing summary files for folder: ' + folder inFiles = getUnpackedFiles(folder) summaryFiles = os.listdir(summaryFolder) # Handle DEM and ORTHO browse images separately. keyword = 'dem' if isOrtho: keyword = 'ortho' # Associate each summary file with its frame number summaryFrames = {} for c in summaryFiles: if keyword not in c: continue # Inputs like: dem_01058_01060_browse.tif parts = os.path.basename(c).split('_') frame = int(parts[1]) summaryFrames[frame] = c # See if any input files are missing their summary frame missingSummaryList = [] for f in inFiles: # Skip metadata files ext = os.path.splitext(f)[1] if ext != '.tif': continue # TODO: This may break later! fname = os.path.basename(f) if fname[0] == 'F': parts = fname.split('_') frameStart = int(parts[1]) frameEnd = int(parts[2]) else: # AN_20141116/processed/batch_05962_05963_2/out-ortho.tif parts = os.path.dirname(f).split('_') frameStart = int(parts[-3]) frameEnd = int(parts[-2]) try: summary = summaryFrames[frameStart] continue # Summary file already exists. except KeyError: # Get the desired summary file name if isOrtho: summaryName = ('ortho_%05d_%05d_browse.tif' % (frameStart, frameEnd)) else: # DEM summaryName = ('dem_%05d_%05d_browse.tif' % (frameStart, frameEnd)) summaryPath = os.path.join(summaryFolder, summaryName) missingSummaryList.append((f, summaryPath)) return missingSummaryList def writeCommandFiles(missingDemFiles, missingOrthoFiles, outputPrefix, chunkSize): '''Generate conversion commands for each missing summary file and divide them up into files of a fixed length. Returns the list of command files that were written.''' if (not missingDemFiles) and (not missingOrthoFiles): return [] # Open the first file fileCounter = 0 cmdCounter = 0 fname = outputPrefix + str(fileCounter) + '.txt' handle = open(fname, 'w') commandFiles = [fname] # Add all the DEM commands for p in missingDemFiles: # If the file is too large, start a new file. if cmdCounter >= chunkSize: fileCounter += 1 cmdCounter = 0 handle.close() fname = outputPrefix + str(fileCounter) + '.txt' handle = open(fname, 'w') commandFiles.append(fname) # Generate command, then write to file. cmd = getSummaryFileCommand(p[0], p[1], isOrtho=False) handle.write(cmd + '\n') cmdCounter += 1 # Add all the ORTHO commands for p in missingOrthoFiles: if cmdCounter >= chunkSize: fileCounter += 1 cmdCounter = 0 handle.close() fname = outputPrefix + str(fileCounter) + '.txt' handle = open(fname, 'w') commandFiles.append(fname) cmd = getSummaryFileCommand(p[0], p[1], isOrtho=True) handle.write(cmd + '\n') cmdCounter += 1 handle.close() print 'Created ' + str(len(commandFiles)) + ' command files.' return commandFiles def main(argsIn): try: usage = '''usage: regenerate_summary_images.py <options> ''' parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--data-folder", dest="dataFolder", help="Where all the inputs and outputs are stored.") parser.add_argument("--work-folder", dest="workFolder", help="Where working files are stored.") parser.add_argument("--site", dest="site", help="Site code.") parser.add_argument("--yyyymmdd", dest="yyyymmdd", help="Date.") #parser.add_argument("--dem-tarball", dest="demTarball", default=os.getcwd(), # help="Where all the inputs and outputs are stored.") #parser.add_argument("--ortho-tarball", dest="orthoTarball", default=None, # help="Where to unpack the data.") #parser.add_argument("--summary-tarball", dest="summaryTarball", default=None, # help="Where to unpack the data.") #parser.add_argument("--unpack-dir", dest="unpackDir", default=None, # help="Where to unpack the data.") parser.add_argument("--node-type", dest="nodeType", default='san', help="Node type to use (wes[mfe], san, ivy, has, bro)") #parser.add_argument("--skip-archive-summary", action="store_true", # dest="skipArchiveSummary", default=False, # help="Skip archiving the summary.") # Debug option parser.add_argument('--minutes-in-devel-queue', dest='minutesInDevelQueue', type=int, default=0, help="If positive, submit to the devel queue for this many minutes.") options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) # Check if we are on the right machine (host, err, status) = asp_system_utils.executeCommand(['uname', '-n'], suppressOutput = True) host = host.strip() if 'pfe' in host and options.nodeType not in PFE_NODES: raise Exception("From machine " + host + " can only launch on: " + " ".join(PFE_NODES)) if 'mfe' in host and options.nodeType != 'wes': raise Exception("From machine " + host + " can only launch on: wes") # Make sure our paths will work when called from PBS options.dataFolder= os.path.abspath(options.dataFolder) #os.system('mkdir -p ' + options.unpackDir) # TODO: Check folders! run = run_helper.RunHelper(options.site, options.yyyymmdd, options.workFolder) runFolder = os.path.join(options.workFolder, str(run)) os.system('mkdir -p ' + runFolder) logFolder = os.path.join(runFolder, 'logs') # Set up logging in the run directory os.system('mkdir -p ' + logFolder) logLevel = logging.INFO logger = icebridge_common.setUpLogger(logFolder, logLevel, icebridge_common.manager_log_prefix()) logger.info("Logging in: " + logFolder) checkRequiredTools() # Make sure all the needed tools can be found before we start logger.info("Disabling core dumps.") # these just take a lot of room os.system("ulimit -c 0") os.system("umask 022") # enforce files be readable by others # See how many hours we used so far. I think this counter gets updated once a day. (out, err, status) = asp_system_utils.executeCommand("acct_ytd", outputPath = None, suppressOutput = True, redo = True, noThrow = True) logger.info("Hours used so far:\n" + out + '\n' + err) try: # Fetch and extract the tarball files from Lou localDemFolder = os.path.join(options.dataFolder, run.name()+'_dems') localOrthoFolder = os.path.join(options.dataFolder, run.name()+'_orthos') demSummaryFolder = os.path.join(options.dataFolder, run.name()+'_dem_summaries') orthoSummaryFolder = os.path.join(options.dataFolder, run.name()+'_ortho_summaries') missingDemFiles = [] missingOrthoFiles = [] for f in os.listdir(localDemFolder): if 'temp' in f: raise Exception('Bad file: ' + f) if ('IODEM3' in f) and (f[-4:] == '.tif'): inputPath = os.path.join(localDemFolder, f) outputPath = os.path.join(demSummaryFolder, f.replace('DEM.tif', 'DEM_browse.tif')) if not os.path.exists(outputPath): missingDemFiles.append((inputPath, outputPath)) for f in os.listdir(localOrthoFolder): if 'temp' in f: raise Exception('Bad file: ' + f) if ('IODIM3' in f) and (f[-4:] == '.tif'): inputPath = os.path.join(localOrthoFolder, f) outputPath = os.path.join(orthoSummaryFolder, f.replace('ORTHO.tif', 'ORTHO.jpg')) if not os.path.exists(outputPath): missingOrthoFiles.append((inputPath, outputPath)) #print 'Fetching and unpacking tarballs...' #fetchTarball(options.demTarball, localDemFolder) #fetchTarball(options.orthoTarball, localOrthoFolder) #fetchTarball(options.summaryTarball, localSummaryFolder) # If the summary tarball unpacked to []/summary/summary, # work with the lower level folder from now on. #localSummaryFolder = descendIfNeeded(localSummaryFolder) # Make a list of all input files that are missing their summary file, and # the desired output path for that file. #missingDemFiles = getMissingSummaryFiles(localDemFolder, localSummaryFolder, isOrtho=False) #missingOrthoFiles = getMissingSummaryFiles(localOrthoFolder, localSummaryFolder, isOrtho=True ) # Divide this list into chunks and for each chunk generate a file containing all of # the gdal_translate commands that need to be executed. print 'Writing command files...' commandFileLength = getParallelParams(options.nodeType)[2] commandFilePrefix = os.path.join(runFolder, 'convert_commands_') print 'Clearing existing command files.' os.system('rm ' + commandFilePrefix + '*') commandFileList = writeCommandFiles(missingDemFiles, missingOrthoFiles, commandFilePrefix, commandFileLength) #raise Exception('DEBUG') # Get the location to store the logs pbsLogFolder = run.getPbsLogFolder() logger.info("Storing logs in: " + pbsLogFolder) os.system('mkdir -p ' + pbsLogFolder) # Call multi_process_command_runner.py through PBS for each chunk. start_time() (baseName, jobIDs) = submitBatchJobs(commandFileList, options, pbsLogFolder, run, logger) # Wait for everything to finish. pbs_functions.waitForJobCompletion(jobIDs, logger, baseName) stop_time("pbs_jobs", logger) # Check that we now have all of the summary files. # - Both of these should now be empty. #newMissingDemFiles = getMissingSummaryFiles(localDemFolder, demSummaryFolder, isOrtho=False) #newMissingOrthoFiles = getMissingSummaryFiles(localOrthoFolder, orthoSummaryFolder, isOrtho=True ) numDemsMissing = 0 numOrthosMissing = 0 for pair in missingDemFiles: if not os.path.exists(pair[1]): numDemsMissing += 1 for pair in missingOrthoFiles: if not os.path.exists(pair[1]): numOrthosMissing += 1 resultText = ('After regeneration, missing %d DEM summaries and %d ORTHO summaries' % (numDemsMissing, numOrthosMissing)) logger.info(resultText) runWasSuccess = ((numDemsMissing == 0) and (numOrthosMissing == 0)) # If successful, create a new tarball and send it to Lou. #if runWasSuccess and (not options.skipArchiveSummary): # start_time() # archive_functions.packAndSendSummaryFolder(run, localSummaryFolder, logger) # stop_time("archive summary", logger) except Exception as e: resultText = 'Caught exception: ' + str(e) + '\n' + traceback.format_exc() runWasSuccess = False # Send a summary email. emailAddress = getEmailAddress(icebridge_common.getUser()) logger.info("Sending email to: " + emailAddress) if runWasSuccess: sendEmail(emailAddress, 'OIB summary regen passed', resultText) else: sendEmail(emailAddress, '"OIB summary regen failed', resultText) # TODO: Add automated delete command! #if options.wipeProcessed: # processedFolder = run.getProcessFolder() # logger.info("Will delete: " + processedFolder) # os.system("rm -rf " + processedFolder) logger.info('==== regenerate_summary_images script has finished for run: ' + str(run) + ' ====') # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/run_helper.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Class to help manage a run stored on disk import os, sys, optparse, datetime, time, subprocess, logging, multiprocessing import re, shutil, time, getpass, glob import os.path as P # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common, asp_file_utils # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] class RunHelper(): '''Class for managing a folder for processing one run (flight)''' def __init__(self, site, yyyymmdd, parentFolder=''): '''Constructor. If optional parent folder is provided, it will be prependend to all returned paths.''' self.site = site self.yyyymmdd = yyyymmdd self.parentFolder = parentFolder # Create the timestamp just once, rather than each time it is # needed, as maybe the date has changed while the run # was being done. self.suffix = "_V" self.timestamp = self.suffix +datetime.datetime.now().strftime("%Y%m%d") def __str__(self): '''Define string autoconversion''' return self.site +'_'+ self.yyyymmdd def name(self): '''Return a name in SS_YYYYMMDD format''' return str(self) def shortName(self): '''Return a name in SSYYMMDD format''' return self.site + self.yyyymmdd[2:] def yyyy_mm_dd(self): '''Return the date in the format YYYY_MM_DD''' return self.yyyymmdd[0:4] +'_'+ self.yyyymmdd[4:6] +'_'+ self.yyyymmdd[6:8] # TODO: Add version numbers to these in a way that is easily handled! def getInputTarName(self): '''Return the file name used to tar up the downloaded input data''' return self.name() + '.tar' def getCameraTarName(self): '''Return the file name used to tar up the generated camera files''' return 'CAMERA_' + self.name() + self.timestamp + '.tar' def getAlignedCameraTarName(self): '''Return the file name used to tar up the generated bundle-adjustd and aligned camera files''' return 'ALIGNED_CAMERA_' + self.name() + self.timestamp + '.tar' def getOrthoTarName(self, useWildCard = False): '''Return the file name used to tar up the generated ortho images.''' if useWildCard: # This is conventient when we want to list all existing outputs return 'ORTHO_' + self.name() + '*' + '.tar' return 'ORTHO_' + self.name() + self.timestamp + '.tar' def getSummaryTarName(self): '''Return the file name used to tar up the generated camera files''' return 'SUMMARY_' + self.name() + self.timestamp + '.tar' def getOutputTarName(self, useWildCard = False): '''Return the file name used to tar up the final results''' if useWildCard: # This is conventient when we want to list all existing outputs return 'DEM_' + self.name() + '*' + '.tar' return 'DEM_' + self.name() + self.timestamp + '.tar' def getLabelTarName(self): '''Return the file name used to tar up the label files''' return 'LABELS_' + self.name() + self.timestamp + '.tar' def getFolder(self): '''Returns the folder where this run will be stored''' return os.path.join(self.parentFolder, str(self)) def _internalLoc(self, path): '''Returns a folder relative to getFolder()''' return os.path.join(self.getFolder(), path) # TODO: Merge these with corresponding functions in icebridge_common. def getJpegFolder(self): return self._internalLoc('jpeg') def getImageFolder(self): return self._internalLoc('image') def getLidarFolder(self): return self._internalLoc('lidar') def getLidarPairFolder(self): return icebridge_common.getPairedLidarFolder(self.getLidarFolder()) def getNavFolder(self): return self._internalLoc('nav') def getNavCameraFolder(self): return self._internalLoc('nav_camera') def getCameraFolder(self): return self._internalLoc('camera') def getOrthoFolder(self): return self._internalLoc('ortho') def getProcessFolder(self): return self._internalLoc('processed') def getAssemblyFolder(self): return self._internalLoc('tarAssembly') def getPbsLogFolder(self): return self._internalLoc('pbsLog') def getSummaryFolder(self): return self._internalLoc('summary') def getLabelFolder(self): return self._internalLoc('labeled') def getLabelOrthoFolder(self): return self._internalLoc('label_ortho') def getJpegList(self, prependFolder=False): '''Return a list containing all the currently stored jpeg files''' jpegFolder = self.getJpegFolder() jpegs = icebridge_common.getJpegs(jpegFolder) if prependFolder: jpegs = [os.path.join(jpegFolder, x) for x in jpegs] jpegs.sort() return jpegs def getImageList(self, prependFolder=False): '''Return a list containing all the currently stored image files''' imageFolder = self.getImageFolder() images = icebridge_common.getTifs(imageFolder) if prependFolder: images = [os.path.join(imageFolder, x) for x in images] images.sort() return images def getLidarList(self, paired=False, prependFolder=False): '''Return a list containing all the currently stored lidar files. This does not return converted csv files.''' lidarFolder = self.getLidarFolder() if paired: lidarFolder = icebridge_common.getPairedLidarFolder(lidarFolder) files = icebridge_common.getLidar(lidarFolder) if prependFolder: files = [os.path.join(lidarFolder, x) for x in files] files.sort() return files def getBatchFolderList(self): '''Return a list of all the batch folders''' pFolder = self.getProcessFolder() batchFolders = os.listdir(pFolder) def getFirstFrame(s): try: parts = s.split('_') return int(parts[1]) except: return 99999999 batchFolders.sort(key=getFirstFrame) batchFolders = [os.path.join(pFolder,x) for x in batchFolders if 'batch_' in x] batchFolders = [x for x in batchFolders if os.path.isdir(x)] return batchFolders # Get a list of all output files of given type. They may not exist. def getOutputFileList(self, fileType): '''Return a list containing all the output DEM files in the run and the associated frames''' batchList = self.getBatchFolderList() output = [] for batch in batchList: frames = icebridge_common.getFrameRangeFromBatchFolder(batch) path = os.path.join(batch, fileType) output.append((path, frames)) return output def existingFilesDict(self, fileType, startFrame, stopFrame): '''See which output files of given type exist.''' fileList = self.getOutputFileList(fileType) fileDict = {} for (filename, frames) in fileList: # Handle frame range option if (frames[0] < startFrame): continue if (frames[1] > stopFrame): break if not os.path.exists(filename): continue fileDict[frames[0]] = filename return fileDict def allSourceDataFetched(self, noNav, verbose=False): '''Return true if all the required source data has been downloaded''' logger = logging.getLogger(__name__) # Old file collections use a different naming scheme altIndexName = 'image_index.html.csv' # Verify these input folders subFolders = [self.getJpegFolder(), self.getLidarFolder(), self.getOrthoFolder()] for folder in subFolders: # Make sure all the files specified in the parsed index file are present indexFile = icebridge_common.csvIndexFile(folder) if not os.path.exists(indexFile): # See if the older naming scheme was used altPath = os.path.join(folder, altIndexName) if os.path.exists(altPath): indexFile = altPath (fileDict, urlDict) = icebridge_common.readIndexFile(indexFile) logger.info("Checking all files listed in: " + indexFile) num = len(fileDict.keys()) count = 0 for f in fileDict.itervalues(): # Add the progress, as this operation can be terribly slow # when the filesystem is not doing too well, especially on mfe. count = count + 1 if (count - 1) % 1000 == 0: logger.info('Progress: ' + str(count) + '/' + str(num)) path = os.path.join(folder, f) if not os.path.exists(path): logger.error('Missing file ' + path) return False if not noNav: # Simple nav file check navFiles = os.listdir(self.getNavFolder()) navFiles = [x for x in navFiles if '.out' in navFiles] if (len(navFiles) == 0) or (len(navFiles) > 2): logger.error('Wrong number of nav files detected!') return False return True # Success! def massRenameByGlob(self, startFrame, stopFrame, orthoFrameDict, globStr, logger): '''Axuxually function used below.''' files = glob.glob(globStr) for fileName in files: # This is rather fragile, try to ignore certain types of files if ('_sub' in fileName) or ('pct.tif' in fileName) or ('_hillshade_' in fileName): continue [prefix, dateString, timeString, frameString, suffix] = \ icebridge_common.parseParts(fileName) if frameString == "": logger.info("Could not parse frame and time stamps from: " + fileName) continue frame = int(frameString) if frame < startFrame or frame > stopFrame: continue if not frame in orthoFrameDict: logger.info("Missing ortho for frame: " + frameString) continue [newDateString, newTimeString] = icebridge_common.parseTimeStamps(orthoFrameDict[frame]) newFile = prefix + icebridge_common.formFilePrefix(newDateString, newTimeString, frame) + suffix if not os.path.exists(fileName): continue if fileName == newFile: continue if os.path.exists(newFile): logger.info("File exists: " + newFile + ", will wipe " + fileName) os.system("rm -f " + fileName) continue logger.info("Renaming: " + fileName + " to " + newFile) os.system("mv -f " + fileName + " " + newFile) def massRename(self, startFrame, stopFrame, logger): '''We changed how the timestamp for images and cameras is computed. Make all existing converted images, cameras, nav cameras, and aligned cameras conform.''' logger.info("Renaming files with timestamp. This is slow.") # Need to do a mass rename for incorrect timestamp for: # converted images, nav cameras, cameras, and bundle aligned cameras outputFolder = self.getFolder() cameraFolder = icebridge_common.getCameraFolder(outputFolder) imageFolder = icebridge_common.getImageFolder(outputFolder) jpegFolder = icebridge_common.getJpegFolder(outputFolder) orthoFolder = icebridge_common.getOrthoFolder(outputFolder) processedFolder = icebridge_common.getProcessedFolder(outputFolder) navFolder = icebridge_common.getNavFolder(outputFolder) navCameraFolder = icebridge_common.getNavCameraFolder(outputFolder) # Need the orthos to get the timestamp orthoFolder = icebridge_common.getOrthoFolder(os.path.dirname(jpegFolder)) orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) if not os.path.exists(orthoIndexPath): raise Exception("Error: Missing ortho index file: " + orthoIndexPath + ".") (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath, prependFolder = True) logger.info('Renaming camera files...') self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, os.path.join(cameraFolder, '*DMS*tsai'), logger) logger.info('Renaming nav camera files...') self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, os.path.join(navCameraFolder, '*DMS*tsai'), logger) logger.info('Renaming converted images...') self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, os.path.join(imageFolder, '*DMS*tif'), logger) logger.info('Renaming aligned cameras...') self.massRenameByGlob(startFrame, stopFrame, orthoFrameDict, os.path.join(processedFolder, 'batch*', icebridge_common.alignedBundleStr() + '*DMS*tsai'), logger) def checkForImages(self, startFrame, stopFrame, logger): '''Return true if all the images have been converted from jpeg.''' logger.info("Checking if all jpegs have been converted.") jpegFolder = self.getJpegFolder() imageFolder = self.getImageFolder() orthoFolder = self.getOrthoFolder() if not os.path.exists(jpegFolder): logger.info("Missing: " + jpegFolder) return False if not os.path.exists(imageFolder): logger.info("Missing: " + imageFolder) return False jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder) if not os.path.exists(jpegIndexPath): logger.info("Missing: " + jpegIndexPath) return False (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath, prependFolder = True) # Need the orthos to get the timestamp orthoIndexPath = icebridge_common.csvIndexFile(orthoFolder) if not os.path.exists(orthoIndexPath): raise Exception("Error: Missing ortho index file: " + orthoIndexPath + ".") (orthoFrameDict, orthoUrlDict) = icebridge_common.readIndexFile(orthoIndexPath, prependFolder = True) # Thorough check for missing images. It is very slow. num = len(jpegFrameDict.keys()) allGood = True count = 0 for frame in sorted(jpegFrameDict.keys()): if frame < startFrame or frame > stopFrame: continue # Add the progress, as this operation can be terribly slow # when the filesystem is not doing too well, especially on mfe. count = count + 1 if (count - 1) % 1000 == 0: logger.info('Progress: ' + str(count) + '/' + str(num)) inputPath = jpegFrameDict[frame] if not frame in orthoFrameDict: logger.info("Missing ortho for frame: " + frame) continue # Make sure the timestamp and frame number are in the output file name try: outputPath = icebridge_common.jpegToImageFile(inputPath, orthoFrameDict[frame]) except Exception as e: logger.info(str(e)) logger.info("Removing bad file: " + inputPath) if os.path.exists(inputPath): os.remove(inputPath) allGood = False continue if not os.path.exists(outputPath): logger.info("Missing image file: " + outputPath) allGood = False return allGood def conversionIsFinished(self, startFrame, stopFrame, verbose=False): '''Return true if this run is present and conversion has finished running on it''' logger = logging.getLogger(__name__) # Make sure that there is a camera file for input image file. # - This could be a more expansive check. cameraFolder = self.getCameraFolder() imageList = self.getImageList() for imageFile in imageList: camFile = os.path.join(cameraFolder, icebridge_common.getCameraFileName(imageFile)) # Check only within range # TODO: Actually we need the cameras to go a bit beyond frame = icebridge_common.getFrameNumberFromFilename(camFile) if frame < startFrame or frame >= stopFrame: continue if not os.path.exists(camFile): if verbose: logger.error('Missing file ' + camFile) return False # Do a simple check of the converted lidar files prependFolder = True lidarFolder = self.getLidarFolder() convLidarFile = icebridge_common.getConvertedLidarIndexFile(lidarFolder) (lidarDict, dummyUrlDict) = icebridge_common.readIndexFile(convLidarFile, prependFolder) pairedLidarFolder = icebridge_common.getPairedLidarFolder(lidarFolder) pairedLidarFile = icebridge_common.getPairedIndexFile(pairedLidarFolder) (pairedLidarDict, dummyUrlDict) = icebridge_common.readIndexFile(pairedLidarFile, prependFolder) numLidar = len(lidarDict.values()) numPairedLidar = len(pairedLidarDict.values()) if numLidar != (numPairedLidar+1): logger.error('Not enough paired lidar files found') return False # Make sure the lidar files are not empty success = True for f in lidarDict.values() + pairedLidarDict.values(): if not asp_file_utils.fileIsNonZero(f): logger.error('lidar file ' + f + ' is empty!') os.system('rm -f ' + f) # Remove bad files success = False return success def getFrameRange(self): '''Return the min and max frame currently stored for the run''' jpegFolder = icebridge_common.getJpegFolder(self.getFolder()) jpegIndexPath = icebridge_common.csvIndexFile(jpegFolder) if not os.path.exists(jpegIndexPath): raise Exception("Error: Missing jpeg index file: " + jpegIndexPath + ".") (jpegFrameDict, jpegUrlDict) = icebridge_common.readIndexFile(jpegIndexPath) frames = sorted(jpegFrameDict.keys()) if len(frames) == 0: raise Exception("Empty folder: " + jpegFolder) return (frames[0], frames[-1]) def setFlag(self, flag): '''Set a file based flag to be checked later''' os.system('touch '+ self._internalLoc(flag)) def checkFlag(self, flag): '''Check if a file based flag has been set''' return os.path.exists(self._internalLoc(flag)) def clearFlag(self, flag): '''Clear a file based flag''' return os.system('rm -rf ' + self._internalLoc(flag)) def deleteLocalData(self): '''Delete everything which has not been archived''' os.system('rm -rf ' + self.getFolder()) ================================================ FILE: src/asp/IceBridge/run_multiple_flights.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Script to run pleiades_manager multiple times with fixed arguments to fetch and process data. import os, sys, argparse, time, threading import traceback # The path to the ASP python files and tools basepath = os.path.dirname(os.path.realpath(__file__)) # won't change, unlike syspath pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP binpath = os.path.abspath(basepath + '/../bin') # for packaged ASP icebridgepath = os.path.abspath(basepath + '/../IceBridge') # IceBridge tools toolspath = os.path.abspath(basepath + '/../Tools') # ASP Tools # Prepend to Python path sys.path.insert(0, basepath) sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) sys.path.insert(0, icebridgepath) import icebridge_common import asp_system_utils, asp_alg_utils, asp_geo_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = basepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = pythonpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = icebridgepath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = toolspath + os.pathsep + os.environ["PATH"] os.environ["PATH"] = binpath + os.pathsep + os.environ["PATH"] def checkFileForFlight(path, site, date): '''Return True if the site/date pair is contained in the file''' with open(path, 'r') as f: for line in f: # Parse the line parts = line.split() if len(parts) != 2: print('Illegal input line is skipped: ' + line) continue thisSite = parts[0] thisDate = parts[1] if (thisSite == site) and (thisDate == date): return True return False def processAndLog(command, logPath, line, deleteFolder=None): '''Run the command and log the result''' print(command) #os.system(command) time.sleep(2) # DEBUG # TODO: How to check for an error? with open(logPath, 'a') as f: f.write(line + '\n') print('Finished running: ' + command) if deleteFolder: print('Cleaning up folder: ' + deleteFolder) cleanup = 'rm -rf ' + deleteFolder #print(cleanup) #os.system(cleanup) def main(argsIn): try: usage = '''label_images.py <options>''' parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--input-file", dest="inputFile", required=True, help="Path to a file containing 'SITE DATE' pairs, one per line, to be run.") parser.add_argument("--success-file", dest="successFile", required=True, help="Log of completed flights.") parser.add_argument("--failure-file", dest="failureFile", required=True, help="Log of failed flights.") parser.add_argument("--limit", dest="limit", default=4, help="Don't process more than this many flights at once.") options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: parser.error(msg) # This assumes that we already have the input data archived. 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""" # This assumes that we already have the flight fetched. 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""" # Build up the list of flights to process tasks = [] print(options.inputFile) with open(options.inputFile, 'r') as f: for line in f: # Parse the line parts = line.split() if len(parts) != 2: print('ERROR: Illegal input line is skipped: ' + line) continue site = parts[0] date = parts[1] # See if we already processed this flight if ( checkFileForFlight(options.successFile, site, date) or checkFileForFlight(options.failureFile, site, date) ): print('This flight was already processed, skipping...') continue tasks.append((site, date)) print('Finished creating the flight list.') # Loop through all of the flights to process them numProcessed = 0 lastPair = None fetchThread = None processThread = None for (site, date) in tasks: idString = (' --site %s --yyyymmdd %s ' % (site, date)) fetchCmd = FETCH_COMMAND + idString processCmd = PROCESS_COMMAND + idString # Launch the fetch job for this flight # TODO: Log to both files logLine = site+' '+date print('Launching FETCH job for ' + logLine) fetchThread = threading.Thread(target=processAndLog, args=(fetchCmd, options.successFile, logLine)) fetchThread.start() # Launch the process job for the previous flight if lastPair: if processThread: print('Waiting on the last processing job to complete...') processThread.join() logLine = lastPair[0]+' '+lastPair[1] print('Launching PROCESS job for ' + logLine) folder = '/nobackup/smcmich1/icebridge/data/'+lastPair[0]+'_'+lastPair[1] processThread = threading.Thread(target=processAndLog, args=(processCmd, options.successFile, logLine, None)) processThread.start() if fetchThread: print('Waiting on the last fetch job to complete...') fetchThread.join() # This pair was fetched this iteration, will be processed next iteration. lastPair = (site, date) numProcessed += 1 if numProcessed >= options.limit: print('Hit the limit of processed flights!') break # Process the data from the last fetch if lastPair: if processThread: print('Waiting on the last processing job to complete...') processThread.join() logLine = lastPair[0]+' '+lastPair[1] print('Launching PROCESS job for ' + logLine) folder = '/nobackup/smcmich1/icebridge/data/'+lastPair[0]+'_'+lastPair[1] processThread = threading.Thread(target=processAndLog, args=(processCmd, options.successFile, logLine, None)) processThread.start() # Make sure everything is finished if fetchThread: print('Waiting on the last fetch job to complete...') fetchThread.join() if processThread: print('Waiting on the last processing job to complete...') processThread.join() print('Jobs finished.') # Run main function if file used from shell if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/IceBridge/sbet2txt.pl ================================================ #!/usr/bin/perl ###################################################################### # Reader for the DMS Applanix GPS data for Operation IceBridge. # The file format is "SBET". # Author: Bruce Raup, braup@nsidc.org ###################################################################### use strict; use warnings; # get basename of program my $progname = $0; $progname =~ s{^.*/}{}; use Getopt::Std; # Get Subversion revision number my $version = '$Revision: 15550 $'; ($version) = $version =~ /^\$Revision:\s*(\d+\.?\d*)/; # Set defaults above definition of $usage so that defaults can be shown there. my $usage = "$progname version $version Usage: $progname -h (prints this help message and exits) OR $progname [-q] [-r] [-n N] infile where -q Quiet mode -n Output only every nth point -r Raw mode. Don't convert lon/lat coordinates to degrees -- explicitly ends options. Arguments starting with '-' (e.g. negative numbers) thereafter will not be interpreted as options. This program reads a binary SBET file and dumps it as ASCII to standard output. "; # Get command-line options. Letters that require arguments should be followed # by a ':' in the call to getopts. my %opt = (); if (! getopts('hqn:r', \%opt) ) { die "$usage\n"; } die "$usage\n" if $opt{h}; # main program if (! defined $ARGV[0]) { print STDERR "No input file specified on command line.\n\n"; die "$usage\n"; } if (! -f $ARGV[0]) { print STDERR "Couldn't find input file $ARGV[0]\n\n"; die "$usage\n"; } dump_sbet_file($ARGV[0]); # End of main ############################################################################## ## Subroutines ############################################################################## ############################################################################## ## dump_sbet_file ############################################################################## sub dump_sbet_file { my $infile = shift; my $rec_length = 136; # bytes. 17 doubles my $point_count = 0; my $n_points; if ($opt{n}) { $n_points = $opt{n}; unless ($n_points > 0) { die "Bad value for -n argument.\n\n$usage\n"; } } open my $F, "<", $infile or die "Couldn't open $infile for reading: $!"; my $rec; while ($rec_length == read($F, $rec, $rec_length)) { if (!defined $n_points || $point_count % $n_points == 0) { print_sbet_rec_as_ascii($rec); } ++$point_count; } } ############################################################################## ## print_sbet_rec_as_ascii ############################################################################## sub print_sbet_rec_as_ascii { my $binrec = shift; my $rec_field_pattern = 'd17'; my ($time, $lat, $lon, $alt, $x_vel, $y_vel, $z_vel, $roll, $pitch, $heading, $wander, $x_force, $y_force, $z_force, $x_ang_rate, $y_ang_rate, $z_ang_rate) = unpack('d17', $binrec); unless ($opt{r}) { my $r2d = 180 / 3.141592654; $lat *= $r2d; $lon *= $r2d; } print join(' ', $time, $lat, $lon, $alt, $x_vel, $y_vel, $z_vel, $roll, $pitch, $heading, $wander, $x_force, $y_force, $z_force, $x_ang_rate, $y_ang_rate, $z_ang_rate), "\n"; } # Internal documentation below. See it nicely formatted by typing # perldoc thisfile # at the system command line. For help on this format, see the man page # perlpod(1) (that is, type 'man perlpod' at the command line.) __END__ =head1 NAME skeleton_program - skeleton program for perl =head1 SYNOPSIS Copy to new location and edit. =head1 DESCRIPTION This file can (should) be used as a starter template for new perl programs. =head1 EXAMPLES =head1 AUTHOR Bruce H. Raup (braup@nsidc.org) ================================================ FILE: src/asp/IceBridge/special_cases.txt ================================================ 1. Major flight notes - 2015 flights are rotated 180 degrees from the standard camera mounting, ie flight direction is towards the left side of the image. - Use the option "--camera-mounting 1" - 2016 flights are rotated 90 degrees from the standard camera mounting, ie flight direction is towards the upper side of the image. - Use the option "--camera-mounting 2" 2. For GR_04222010, raw images are split into two dirs: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2010_GR_NASA/04222010a_raw/ https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2010_GR_NASA/04222010b_raw/ but the ortho images and lidar are in one dir: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2010.04.22/ https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2010.04.22/ The fetching tool takes care of this automatically. Same for GR_07252017. 3. For flight AN 20091025, the raw image folder https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2009_AN_NASA/10252009_raw/ has images for both 10/25 and for 10/26. The ortho images though are split into two: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2009.10.25/ https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2009.10.26/ There is only one LIDAR file: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2009.10.25/ For processing, it will be convenient to move data to a single directory, for the earliest of these two dates, and concatenate the orthoimage indices from both directories, and the same for the raw image index and DEM index files (the latter are empty in this case). When it comes to submitting the data for archival, it perhaps makes most sense to follow the same convention as for orthoimages (so splitting things back), and need to verify the convention used in the Fireball DEMs. Here is the complete list of flights for which we will have to fetch orthoimages from the next day's dataset. AN 20091025 AN 20091103 AN 20091104 AN 20091105 AN 20091109 AN 20091112 AN 20101026 AN 20101110 GR 20120317 AN 20121107 AN 20131120 AN 20131127 GR 20150327 GR 20150330 AN 20150911 AN 20150926 GR 20160421 GR 20160715 The fetching tool takes care of this automatically. 4. There exist runs with the same flight day in the North and South Hemisphere. For example, consider the raw images: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_GR_NASA/09242015_raw/2015_09_24_00280.JPG https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_AN_NASA/09242015_raw/2015_09_24_00280.JPG Their ortho images are in the same output directory, with same frame number, but with a different timestamp: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2015.09.24/DMS_1552503_00280_20150924_13202038.tif (GR) https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/IODMS1B.001/2015.09.24/DMS_1567708_00280_20150924_15010401.tif (AN) Here are the pairs of such directories: 20150924 corresp to: 2015_AN_NASA 09242015_raw 2015_GR_NASA 09242015_raw 20151005 corresp to: 2015_AN_NASA 10052015_raw 2015_GR_NASA 10052015_raw 20151020 corresp to: 2015_AN_NASA 10202015_raw 2015_GR_NASA 10202015_raw 20151022 corresp to: 2015_AN_NASA 10222015_raw 2015_GR_NASA 10222015_raw There are corresponding LIDAR files, some for AN and some for GR. For example, for 20150924, there are: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2015.09.24/ and https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.002/2015.09.24/ The fetching tool can correctly fetch the ortho images by first fetching the corresponding XML files for each orthoimage and then filtering by latitude. It also determines which LIDAR file to get using similar logic. None of these have Fireball DEMs. 5. For 20151019, there are both LVIS and ATM clouds: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.002/2015.10.19/ https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2015.10.19/ even though on that day there is only an GR dataset: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_GR_NASA/10192015_raw/ and no AN dataset. The closest is for 10202015: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE_FTP/IODMS0_DMSraw_v01/2015_AN_NASA/10202015_raw/ The software is able to fetch the right LIDAR for the GR run, and should not be invoked for the AN run. 6. Some AN test flights are in fact over California, East Coast, or en route. Those should be ignored, as they have no LIDAR. AN 20111004 (https://asapdata.arc.nasa.gov/dms/flight_html/1281702.html) AN 20111009 (https://asapdata.arc.nasa.gov/dms/flight_html/1281704.html) AN_20101016 AN 20131108 GR 20100423 GR 20130314 GR_20100430 GR_20100317 GR_20150313 This has LIDAR though but it is en-route: AN 20111010 (https://asapdata.arc.nasa.gov/dms/flight_html/1281705.html) Some flights have both LVIS and ATM and they are both valid: https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILVIS2.001/2011.10.12 https://n5eil01u.ecs.nsidc.org/ICEBRIDGE/ILATM1B.001/2011.10.12 We need to think of what to do in such a situation. 7. Miscellaneous flight notes: AN 20101104 - This is a short flight which travels around the South Pole but it suffers from a lot of cloud coverage and missing lidar sections. GR 20100526 - Includes an airport flyover. GR_20110317 - Image quality is poor. GR_20100409 - Image quality is poor. AN_20111013 - Not great image quality at the beginning. AN_20091025 - Mix of fine features and bad images GR_20110415 - Mix of large terrain and small features. GR_20110322 - Only frames 1-600 have lidar, after that altitude is much higher, careful about auto-GSD. 8. Flights lacking features Some combination of altitude, camera quality, and ground features results in some flights containing sections of images which have no quality features for us to use. These images are are usually flat but are nearly impossible to process. AN 20101110 AN_20101104 GR_20100329 GR 20110322 - Only a bit of the flight GR 20100422 - Only part of the flight AN_20091020 - Some features GR_20110505 - Moderate features ================================================ FILE: src/asp/IsisIO/BaseEquation.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_BASE_EQUATION__ #define __ASP_BASE_EQUATION__ // STL #include <fstream> #include <iostream> // VW #include <vw/Math/Vector.h> namespace asp { // Vector Equation is a method // used to modify an IsisCameraModel through // IsisAdjustCameraModel. // BaseEquation // Returns a Vector3 that is evaluated on a double, time. // class BaseEquation { protected: vw::Vector3 m_cached_output; double m_cached_time; double m_time_offset; // Update Cache (m_cached_output) virtual void update ( double t ) = 0; public: // Constructor virtual ~BaseEquation() {} virtual std::string type() const = 0; //Evaluates the equation at time T vw::Vector3 evaluate( double t ) { if ( t != m_cached_time ) update( t ); return m_cached_output; } vw::Vector3 operator()( double t ) { return evaluate(t);} // Tells the number of constants defining the equation // This is especially vague as it is meant for interaction with a // bundle adjuster. BA just wants to roll through the constants // and redefine them. virtual size_t size() const = 0; virtual double& operator[]( size_t n ) = 0; const double& operator[]( size_t n ) const { return const_cast<BaseEquation*>(this)->operator[](n); } // Allows us to set the time offset void set_time_offset( double offset ) { m_cached_time = -1; m_time_offset = offset; } double get_time_offset() const { return m_time_offset; } // FileIO routines virtual void write( std::ofstream &f ) = 0; virtual void read( std::ifstream &f ) = 0; }; } #endif//__ASP_BASE_EQUATION__ ================================================ FILE: src/asp/IsisIO/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspIsisIO "${ASP_ISISIO_SRC_FILES}" "${ASP_ISISIO_TEST_FILES}" "${ASP_ISISIO_LIB_DEPENDENCIES}") ================================================ FILE: src/asp/IsisIO/DiskImageResourceIsis.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DiskImageResourceDDD.cc /// #ifdef _MSC_VER #pragma warning(disable:4244) #pragma warning(disable:4267) #pragma warning(disable:4996) #endif #include <vw/Core/Exception.h> #include <vw/Math/BBox.h> #include <vw/Math/Vector.h> #include <vw/Image/ImageResource.h> #include <vw/Image/PixelTypeInfo.h> #include <asp/IsisIO/DiskImageResourceIsis.h> #include <string> #include <Cube.h> #include <Portal.h> #include <SpecialPixel.h> using namespace boost; namespace vw { // We use a fixed tile size of 2048x2048 pixels here. Although this // may not be the native tile size of the ISIS cube, it seems to be // much faster to let the ISIS driver aggregate smaller blocks by // making a larger request rather than caching those blocks ourselves. Vector2i DiskImageResourceIsis::block_read_size() const { return Vector2i(2048,2048); } /// Bind the resource to a file for writing. void DiskImageResourceIsis::create(std::string const& /*filename*/, ImageFormat const& /*format*/) { throw NoImplErr() << "The Isis driver does not yet support creation of Isis files"; } /// Bind the resource to a file for reading. Confirm that we can open /// the file and that it has a sane pixel format. void DiskImageResourceIsis::open(std::string const& filename) { m_cube = boost::shared_ptr<Isis::Cube>(new Isis::Cube()); m_filename = filename; m_cube->open(QString::fromStdString(m_filename)); VW_ASSERT(m_cube->isOpen(), IOErr() << "DiskImageResourceIsis: Could not open cube file: \"" << filename << "\"."); // Code copied from DiskImageResourceGDAL.cc, with some modifications, // to fix a crash in loading an ISIS .cub file with 4 bands. if ( m_cube->bandCount() == 1) { m_format.pixel_format = VW_PIXEL_GRAY; m_format.planes = 1; } else if (m_cube->bandCount() == 2) { m_format.pixel_format = VW_PIXEL_GRAYA; m_format.planes = 1; } else if (m_cube->bandCount() == 3) { m_format.pixel_format = VW_PIXEL_RGB; m_format.planes = 1; } else if (m_cube->bandCount() == 4) { m_format.pixel_format = VW_PIXEL_RGBA; m_format.planes = 1; } else { m_format.pixel_format = VW_PIXEL_SCALAR; m_format.planes = m_cube->bandCount(); } // Extract the dimensions of the image m_format.cols = m_cube->sampleCount(); m_format.rows = m_cube->lineCount(); // Set member variables according to the specified pixel type Isis::PixelType isis_ptype = m_cube->pixelType(); switch (isis_ptype) { case Isis::UnsignedByte: m_bytes_per_pixel = 1; m_format.channel_type = VW_CHANNEL_UINT8; break; case Isis::SignedByte: m_bytes_per_pixel = 1; m_format.channel_type = VW_CHANNEL_INT8; break; case Isis::UnsignedWord: m_bytes_per_pixel = 2; m_format.channel_type = VW_CHANNEL_UINT16; break; case Isis::SignedWord: m_bytes_per_pixel = 2; m_format.channel_type = VW_CHANNEL_INT16; break; case Isis::UnsignedInteger: m_bytes_per_pixel = 4; m_format.channel_type = VW_CHANNEL_UINT32; break; case Isis::SignedInteger: m_bytes_per_pixel = 4; m_format.channel_type = VW_CHANNEL_INT32; break; case Isis::Real: m_bytes_per_pixel = 4; m_format.channel_type = VW_CHANNEL_FLOAT32; break; case Isis::Double: m_bytes_per_pixel = 8; m_format.channel_type = VW_CHANNEL_FLOAT64; break; default: vw_throw(IOErr() << "DiskImageResourceIsis: Unknown pixel type."); } } /// Read the disk image into the given buffer. void DiskImageResourceIsis::read(ImageBuffer const& dest, BBox2i const& bbox) const { VW_ASSERT(bbox.max().x() <= m_cube->sampleCount() || bbox.max().y() <= m_cube->lineCount(), IOErr() << "DiskImageResourceIsis: requested bbox " << bbox << " exceeds image dimensions [" << m_cube->sampleCount() << " " << m_cube->lineCount() << "]"); // Read in the requested tile from the cube file. Note that ISIS // cube pixel indices appear to be 1-based. Isis::Portal buffer(bbox.width(), bbox.height(), m_cube->pixelType()); buffer.SetPosition(bbox.min().x()+1, bbox.min().y()+1, 1); m_cube->read(buffer); // Create generic image buffer from the Isis data. ImageBuffer src; src.data = buffer.RawBuffer(); src.format = m_format; src.format.cols = bbox.width(); src.format.rows = bbox.height(); src.cstride = m_bytes_per_pixel; src.rstride = m_bytes_per_pixel * bbox.width(); src.pstride = m_bytes_per_pixel * bbox.width() * bbox.height(); convert(dest, src); } // Write the given buffer into the disk image. void DiskImageResourceIsis::write(ImageBuffer const& /*src*/, BBox2i const& /*bbox*/) { vw_throw ( NoImplErr() << "The Isis driver does not yet support creation of Isis files" ); } // A FileIO hook to open a file for reading DiskImageResource* DiskImageResourceIsis::construct_open(std::string const& filename) { return new DiskImageResourceIsis(filename); } // A FileIO hook to open a file for writing DiskImageResource* DiskImageResourceIsis::construct_create(std::string const& filename, ImageFormat const& format) { return new DiskImageResourceIsis(filename, format); } /// Info about special pixel types in ISIS // -------------------------------------- double DiskImageResourceIsis::nodata_read() const { switch (m_format.channel_type) { case VW_CHANNEL_FLOAT64: return Isis::NULL8; case VW_CHANNEL_FLOAT32: return Isis::NULL4; case VW_CHANNEL_INT32: return Isis::INULL4; case VW_CHANNEL_INT16: return Isis::NULL2; default: return 0.0; } } double DiskImageResourceIsis::valid_minimum() const { switch (m_format.channel_type) { case VW_CHANNEL_FLOAT64: return Isis::ValidMinimum; case VW_CHANNEL_FLOAT32: return Isis::VALID_MIN4; case VW_CHANNEL_INT32: return Isis::IVALID_MIN4; case VW_CHANNEL_INT16: return Isis::VALID_MIN2; case VW_CHANNEL_UINT16: return Isis::VALID_MINU2; default: return Isis::VALID_MIN1; } } double DiskImageResourceIsis::valid_maximum() const { switch (m_format.channel_type) { case VW_CHANNEL_FLOAT64: return Isis::ValidMaximum; case VW_CHANNEL_FLOAT32: return Isis::VALID_MAX4; case VW_CHANNEL_INT32: return 2147483647; case VW_CHANNEL_INT16: return Isis::VALID_MAX2; case VW_CHANNEL_UINT16: return Isis::VALID_MAXU2; default: return Isis::VALID_MAX1; } } bool DiskImageResourceIsis::is_map_projected() const { // They used to have a HasProjection. I'm not sure if this fix is the correct method now. return m_cube->projection() != NULL; } } ================================================ FILE: src/asp/IsisIO/DiskImageResourceIsis.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file DiskImageResourceIsis.h /// /// Provides support for ISIS image files. /// #ifndef __VW_FILEIO_DISK_IMAGE_RESOUCE_ISIS_H__ #define __VW_FILEIO_DISK_IMAGE_RESOUCE_ISIS_H__ #include <vw/Image/PixelTypes.h> #include <vw/FileIO/DiskImageResource.h> #include <vw/FileIO/DiskImageResourceGDAL.h> namespace Isis { class Cube; } namespace vw { class DiskImageResourceIsis : public DiskImageResourceGDAL { public: DiskImageResourceIsis(std::string const& filename) : DiskImageResourceGDAL(filename) { open(filename); } DiskImageResourceIsis(std::string const& filename, ImageFormat const& format) : DiskImageResourceGDAL(filename) { create(filename, format); } virtual ~DiskImageResourceIsis() {} /// Returns the type of disk image resource. static std::string type_static() { return "ISIS"; } virtual std::string type() { return type_static(); } virtual bool has_block_write () const {return false;} virtual bool has_nodata_write() const {return false;} virtual bool has_block_read () const {return true; } virtual bool has_nodata_read () const {return true; } virtual Vector2i block_read_size() const; virtual void read (ImageBuffer const& dest, BBox2i const& bbox) const; virtual void write(ImageBuffer const& dest, BBox2i const& bbox); virtual void flush() {} // std::string query(std::string const& key) const; void open(std::string const& filename); void create(std::string const& filename, ImageFormat const& format); static DiskImageResource* construct_open (std::string const& filename); static DiskImageResource* construct_create(std::string const& filename, ImageFormat const& format); // Info about special pixel types in ISIS // -------------------------------------- // Note: Isis has many types of invalid pixels. If creating a mask // of valid pixels, use only pixels within the valid range // provided in the functions below. double nodata_read () const; double valid_minimum() const; double valid_maximum() const; // Additional cube informat bool is_map_projected() const; private: boost::shared_ptr<Isis::Cube> m_cube; std::string m_filename; int m_bytes_per_pixel; Vector2i m_native_block_size; }; } // namespace vw #endif // __VW_FILEIO_DISK_IMAGE_RESOUCE_ISIS_H__ ================================================ FILE: src/asp/IsisIO/Equation.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <vw/Core/Exception.h> #include <asp/IsisIO/Equation.h> #include <asp/IsisIO/BaseEquation.h> #include <asp/IsisIO/PolyEquation.h> #include <asp/IsisIO/RPNEquation.h> #include <ostream> #include <string> using namespace vw; using namespace asp; // Useful tools //------------------------------------------------------- // Debugging output of coefficients (constants) std::ostream& asp::operator<<( std::ostream& os, boost::shared_ptr<BaseEquation> eq ) { os << "Vector Equation-----------------------------\n"; os << " " << eq->type() << std::endl; os << " Time Offset: " << eq->get_time_offset() << "\n"; os << " Eq Coeff: " << "\n"; unsigned working_idx = 0; while ( working_idx != eq->size() ) { os << " "; for ( int i = 0; i < 4; i++ ) if ( working_idx != eq->size() ) { os << (*eq)[working_idx] << " "; working_idx++; } os << "\n"; } os << "--------------------------------------------\n"; return os; } // Determines equation type and write appropriate void asp::write_equation( std::ofstream& f, boost::shared_ptr<BaseEquation> eq ) { f << eq->type() << "\n"; eq->write( f ); } // Determines equation type from file and return appropriate boost::shared_ptr<BaseEquation> asp::read_equation( std::ifstream& f) { if ( !f.is_open() ) vw_throw( IOErr() << "IsisIO/Equation: Unable to open equation file\n" ); boost::shared_ptr<BaseEquation> eq; std::string buffer = ""; std::getline( f, buffer ); if ( buffer == "PolyEquation" ) { boost::shared_ptr<PolyEquation> eqn_new( new PolyEquation() ); eq = boost::dynamic_pointer_cast<BaseEquation>( eqn_new ); eq->read( f ); } else if ( buffer == "RPNEquation" ) { boost::shared_ptr<RPNEquation> eqn_new( new RPNEquation() ); eq = boost::dynamic_pointer_cast<BaseEquation>( eqn_new ); eq->read( f ); } else { vw_throw( IOErr() << "Unknown equation type: " << buffer << "\n" ); } return eq; } ================================================ FILE: src/asp/IsisIO/Equation.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_EQUATION_H__ #define __ASP_EQUATION_H__ #include <iosfwd> #include <boost/smart_ptr/shared_ptr.hpp> namespace asp { class BaseEquation; // Useful tools //------------------------------------------------------- // Debugging output of coefficients (constants) std::ostream& operator<<( std::ostream&, boost::shared_ptr<BaseEquation> eq); // Determines equation type and write appropriate void write_equation( std::ofstream& f, boost::shared_ptr<BaseEquation> eq); // Determines equation type from file and return appropriate boost::shared_ptr<BaseEquation> read_equation( std::ifstream& f); } #endif//__ASP_EQUATION_H__ ================================================ FILE: src/asp/IsisIO/IsisCameraModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file IsisCameraModel.h /// /// This file contains the ISIS camera model. /// #ifndef __VW_CAMERAMODEL_ISIS_H__ #define __VW_CAMERAMODEL_ISIS_H__ // VW #include <vw/Math/Vector.h> #include <vw/Math/Matrix.h> #include <vw/Camera/CameraModel.h> // ASP #include <asp/IsisIO/IsisInterface.h> namespace vw { namespace camera { // This is largely just a shortened reimplementation of ISIS's // Camera.cpp. class IsisCameraModel : public CameraModel { public: //------------------------------------------------------------------ // Constructors / Destructors //------------------------------------------------------------------ IsisCameraModel(std::string cube_filename) : m_interface(asp::isis::IsisInterface::open( cube_filename )) {} virtual std::string type() const { return "Isis"; } //------------------------------------------------------------------ // Methods //------------------------------------------------------------------ // Computes the image of the point 'point' in 3D space on the // image plane. Returns a pixel location (col, row) where the // point appears in the image. virtual Vector2 point_to_pixel(Vector3 const& point) const { return m_interface->point_to_pixel( point ); } // Returns a (normalized) pointing vector from the camera center // through the position of the pixel 'pix' on the image plane. virtual Vector3 pixel_to_vector (Vector2 const& pix) const { return m_interface->pixel_to_vector( pix ); } // Returns the position of the focal point of the camera virtual Vector3 camera_center(Vector2 const& pix = Vector2() ) const { return m_interface->camera_center( pix ); } // Pose is a rotation which moves a vector in camera coordinates // into world coordinates. virtual Quat camera_pose(Vector2 const& pix = Vector2() ) const { return m_interface->camera_pose( pix ); } // Returns the number of lines is the ISIS cube int lines() const { return m_interface->lines(); } // Returns the number of samples in the ISIS cube int samples() const{ return m_interface->samples(); } // Returns the serial number of the ISIS cube std::string serial_number() const { return m_interface->serial_number(); } // Returns the ephemeris time for a pixel double ephemeris_time( Vector2 const& pix = Vector2() ) const { return m_interface->ephemeris_time( pix ); } // Sun position in the target frame's inertial frame Vector3 sun_position( Vector2 const& pix = Vector2() ) const { return m_interface->sun_position( pix ); } // The three main radii that make up the spheroid. Z is out the polar region Vector3 target_radii() const { return m_interface->target_radii(); } // The spheroid name std::string target_name() const { return m_interface->target_name(); } // The datum vw::cartography::Datum get_datum_isis(bool use_sphere_for_non_earth) const { return m_interface->get_datum_isis(use_sphere_for_non_earth); } protected: boost::shared_ptr<asp::isis::IsisInterface> m_interface; friend std::ostream& operator<<( std::ostream&, IsisCameraModel const& ); }; // IOstream interface // --------------------------------------------- inline std::ostream& operator<<( std::ostream& os, IsisCameraModel const& i ) { os << "IsisCameraModel" << i.lines() << "x" << i.samples() << "( " << i.m_interface << " )"; return os; } }} #endif //__VW_CAMERA_ISIS_H__ ================================================ FILE: src/asp/IsisIO/IsisInterface.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/IsisIO/IsisInterface.h> #include <asp/IsisIO/IsisInterfaceMapFrame.h> #include <asp/IsisIO/IsisInterfaceFrame.h> #include <asp/IsisIO/IsisInterfaceMapLineScan.h> #include <asp/IsisIO/IsisInterfaceLineScan.h> #include <asp/IsisIO/IsisInterfaceSAR.h> #include <isis/Cube.h> #include <isis/Distance.h> #include <isis/Pvl.h> #include <isis/Camera.h> #include <isis/Target.h> #include <isis/FileName.h> #include <isis/CameraFactory.h> #include <isis/SerialNumber.h> #include <isis/iTime.h> #include <isis/Blob.h> #include <isis/Process.h> #include <isis/CubeAttribute.h> #include <vw/Core/Exception.h> #include <vw/Math/Vector.h> #include <vw/Core/Log.h> #include <boost/filesystem.hpp> #include <iomanip> #include <ostream> using namespace vw; namespace asp {namespace isis { IsisInterface::IsisInterface(std::string const& file) { // Opening labels and camera Isis::FileName ifilename(QString::fromStdString(file)); m_label = std::make_unique<Isis::Pvl>(); m_label->read(ifilename.expanded()); // Opening Isis::Camera m_cube = std::make_unique<Isis::Cube>(QString::fromStdString(file)); m_camera.reset(Isis::CameraFactory::Create(*m_cube)); // Set the datum // TODO(oalexan1): This is fragile. Need to find the right internal ISIS // function to use to convert ECEF to lon-lat-height and vice-versa. bool use_sphere_for_non_earth = true; m_datum = this->get_datum_isis(use_sphere_for_non_earth); } IsisInterface::~IsisInterface() {} IsisInterface* IsisInterface::open(std::string const& filename) { // Opening Labels (This should be done somehow though labels) Isis::FileName ifilename(QString::fromStdString(filename)); Isis::Pvl label; label.read(ifilename.expanded()); QString access = "r"; Isis::Cube tempCube(QString::fromStdString(filename), access); Isis::Camera* camera = Isis::CameraFactory::Create(tempCube); IsisInterface* result; // Instantiate the correct class type switch (camera->GetCameraType()) { case 0: // Framing camera if (camera->HasProjection()) result = new IsisInterfaceMapFrame(filename); else result = new IsisInterfaceFrame(filename); break; case 2: // Linescan camera if (camera->HasProjection()) result = new IsisInterfaceMapLineScan(filename); else result = new IsisInterfaceLineScan(filename); break; case 3: // SAR camera (such as MiniRF) // The same interface handles both projected and unprojected images, // since the ISIS functions take care of the details. // TODO(oalexan1): that cam2map-ed images are handled correctly. result = new IsisInterfaceSAR(filename); break; default: // LRO WAC comes here vw_throw(NoImplErr() << "Unusual input file: " << filename << ". Seems to have Isis camera type " << camera->GetCameraType() << ". Check your data. Maybe it will work with CSM."); } return result; } int IsisInterface::lines() const { return m_camera->Lines(); } int IsisInterface::samples() const { return m_camera->Samples(); } std::string IsisInterface::serial_number() const { Isis::Pvl copy(*m_label); return Isis::SerialNumber::Compose(copy, true).toStdString(); } double IsisInterface::ephemeris_time(vw::Vector2 const& pix) const { m_camera->SetImage(pix[0]+1, pix[1]+1); return m_camera->time().Et(); } vw::Vector3 IsisInterface::sun_position(vw::Vector2 const& pix) const { m_camera->SetImage(pix[0]+1, pix[1]+1); Vector3 sun; m_camera->sunPosition(&sun[0]); return sun * 1000; } vw::Vector3 IsisInterface::target_radii() const { Isis::Distance radii[3]; m_camera->radii(radii); return Vector3(radii[0].meters(), radii[1].meters(), radii[2].meters()); } std::string IsisInterface::target_name() const { return m_camera->target()->name().toStdString(); } // Manufacture a datum vw::cartography::Datum IsisInterface::get_datum_isis(bool use_sphere_for_non_earth) const { vw::Vector3 radii = this->target_radii(); double radius1 = (radii[0] + radii[1]) / 2.0; // average the x and y axes (semi-major) double radius2 = radius1; if (!use_sphere_for_non_earth) radius2 = radii[2]; // the z radius (semi-minor axis) vw::cartography::Datum datum("D_" + this->target_name(), this->target_name(), "Reference Meridian", radius1, radius2, 0); return datum; } std::ostream& operator<<(std::ostream& os, IsisInterface* i) { os << "IsisInterface" << i->type() << "(Serial=" << i->serial_number() << std::setprecision(9) << ", f=" << i->m_camera->FocalLength() << " mm, pitch=" << i->m_camera->PixelPitch() << " mm/px," << std::setprecision(6) << "Center=" << i->camera_center() << ")"; return os; } // Check if ISISROOT and ISISDATA was set bool IsisEnv() { char * isisroot_ptr = getenv("ISISROOT"); char * isisdata_ptr = getenv("ISISDATA"); if (isisroot_ptr == NULL || isisdata_ptr == NULL || std::string(isisroot_ptr) == "" || std::string(isisdata_ptr) == "" || !boost::filesystem::exists(std::string(isisroot_ptr) + "/IsisPreferences")) return false; return true; } // TODO(oalexan1): This must be integrated with ISIS void deleteKeywords(Isis::Cube *cube) { Isis::PvlGroup &kernelsGroup = cube->group("Kernels"); // Get rid of keywords from spiceinit if (kernelsGroup.hasKeyword("LeapSecond")) { kernelsGroup.deleteKeyword("LeapSecond"); } if (kernelsGroup.hasKeyword("TargetAttitudeShape")) { kernelsGroup.deleteKeyword("TargetAttitudeShape"); } if (kernelsGroup.hasKeyword("TargetPosition")) { kernelsGroup.deleteKeyword("TargetPosition"); } if (kernelsGroup.hasKeyword("InstrumentPointing")) { kernelsGroup.deleteKeyword("InstrumentPointing"); } if (kernelsGroup.hasKeyword("InstrumentPointingQuality")) { kernelsGroup.deleteKeyword("InstrumentPointingQuality"); } if (kernelsGroup.hasKeyword("Instrument")) { kernelsGroup.deleteKeyword("Instrument"); } if (kernelsGroup.hasKeyword("SpacecraftClock")) { kernelsGroup.deleteKeyword("SpacecraftClock"); } if (kernelsGroup.hasKeyword("InstrumentPositionQuality")) { kernelsGroup.deleteKeyword("InstrumentPositionQuality"); } if (kernelsGroup.hasKeyword("InstrumentPosition")) { kernelsGroup.deleteKeyword("InstrumentPosition"); } if (kernelsGroup.hasKeyword("InstrumentAddendum")) { kernelsGroup.deleteKeyword("InstrumentAddendum"); } if (kernelsGroup.hasKeyword("EXTRA")) { kernelsGroup.deleteKeyword("EXTRA"); } if (kernelsGroup.hasKeyword("Source")) { kernelsGroup.deleteKeyword("Source"); } if (kernelsGroup.hasKeyword("SpacecraftPointing")) { kernelsGroup.deleteKeyword("SpacecraftPointing"); } if (kernelsGroup.hasKeyword("SpacecraftPosition")) { kernelsGroup.deleteKeyword("SpacecraftPosition"); } if (kernelsGroup.hasKeyword("CameraVersion")) { kernelsGroup.deleteKeyword("CameraVersion"); } if (kernelsGroup.hasKeyword("ElevationModel")) { kernelsGroup.deleteKeyword("ElevationModel"); } if (kernelsGroup.hasKeyword("Frame")) { kernelsGroup.deleteKeyword("Frame"); } if (kernelsGroup.hasKeyword("StartPadding")) { kernelsGroup.deleteKeyword("StartPadding"); } if (kernelsGroup.hasKeyword("EndPadding")) { kernelsGroup.deleteKeyword("EndPadding"); } if (kernelsGroup.hasKeyword("RayTraceEngine")) { kernelsGroup.deleteKeyword("RayTraceEngine"); } if (kernelsGroup.hasKeyword("OnError")) { kernelsGroup.deleteKeyword("OnError"); } if (kernelsGroup.hasKeyword("Tolerance")) { kernelsGroup.deleteKeyword("Tolerance"); } if (cube->label()->hasObject("NaifKeywords")) { cube->label()->deleteObject("NaifKeywords"); } // Delete any existing polygon (per jigsaw) if (cube->label()->hasObject("Polygon")) { cube->label()->deleteObject("Polygon"); } // Delete any CameraStatistics table (per jigsaw) for (int iobj = 0; iobj < cube->label()->objects(); iobj++) { Isis::PvlObject obj = cube->label()->object(iobj); if (obj.name() != "Table") continue; if (obj["Name"][0] != QString("CameraStatistics")) continue; cube->label()->deleteObject(iobj); break; } // Remove tables from spiceinit before writing to the cube (per csminit) cube->deleteBlob("InstrumentPointing", "Table"); cube->deleteBlob("InstrumentPosition", "Table"); cube->deleteBlob("BodyRotation", "Table"); cube->deleteBlob("SunPosition", "Table"); cube->deleteBlob("CameraStatistics", "Table"); cube->deleteBlob("Footprint", "Polygon"); // Wipe any existing blob (per csminit) cube->deleteBlob("CSMState", "String"); } // Peek inside a cube file to see if it has a CSM blob. This needs ISIS // logic, rather than any CSM-specific info. bool IsisCubeHasCsmBlob(std::string const& cubeFile) { QString qCubeFile = QString::fromStdString(cubeFile); QString access = "r"; Isis::Cube cube(qCubeFile, access); return cube.hasBlob("CSMState", "String"); } // Read the CSM state (a string) from a cube file. Throw an exception if // missing. Careful not to copy junk from the blob. std::string csmStateFromIsisCube(std::string const& cubeFile) { QString qCubeFile = QString::fromStdString(cubeFile); QString access = "r"; Isis::Cube cube(qCubeFile, access); if (!cube.hasBlob("CSMState", "String")) vw::vw_throw( vw::ArgumentErr() << "Cannot find the CSM state in: " << cubeFile << "\n"); Isis::Blob csmStateBlob("CSMState", "String"); cube.read(csmStateBlob); // Copy precisely the number of characters in the blob. This prevents copying junk, // which can result in a parse error later. int len = csmStateBlob.Size(); std::string buf(len, ' '); memcpy(&buf[0], csmStateBlob.getBuffer(), len); return buf; } // Save a CSM state to an ISIS Cube file. Wipe any spice info. // This may throw if the file cannot be saved. void saveCsmStateToIsisCube(std::string const& cubeFile, std::string const& pluginName, std::string const& modelName, std::string const& modelState) { if (modelState.empty()) vw::vw_throw( vw::ArgumentErr() << "Cannot save empty CSM state to ISIS cube file " << cubeFile << ".\n"); QString qCubeFile = QString::fromStdString(cubeFile); Isis::Process p; Isis::CubeAttributeInput inAtt; Isis::Cube *cube = p.SetInputCube(qCubeFile, inAtt, Isis::ReadWrite); // Delete any spice and other obsolete keywords (per csminit) deleteKeywords(cube); // Add the CSM state to to a blob Isis::Blob csmStateBlob("CSMState", "String"); csmStateBlob.setData(modelState.c_str(), modelState.size()); // Save the state and other info to the cube QString jigComment = "Jigged = " + Isis::iTime::CurrentLocalTime(); QString qModelName = QString::fromStdString(modelName); QString qPluginName = QString::fromStdString(pluginName); Isis::PvlObject &blobLabel = csmStateBlob.Label(); blobLabel += Isis::PvlKeyword("ModelName", qModelName); blobLabel += Isis::PvlKeyword("PluginName", qPluginName); blobLabel.addComment(jigComment); // Write the cube cube->write(csmStateBlob); Isis::CameraFactory::Create(*cube); p.WriteHistory(*cube); // Note: It appears that one need not deallocate the cube, at least it is not // done in ISIS code and the comments do not mention needing that. } }} // end namespace asp::isis ================================================ FILE: src/asp/IsisIO/IsisInterface.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file IsisInterface.h /// /// Generic Interface with ISIS /// #ifndef __ASP_ISIS_INTERFACE_H__ #define __ASP_ISIS_INTERFACE_H__ // Must include foreach.hpp before Cube.h as otherwise there will be // an issue with Qt imported by Cube.h. #include <boost/foreach.hpp> // VW & ASP #include <vw/Math/Vector.h> #include <vw/Math/Quaternion.h> #include <vw/Cartography/Datum.h> #include <memory> // Isis include #include <Cube.h> #include <string> namespace Isis { class Pvl; class Camera; } namespace asp { namespace isis { /// The IsisInterface abstract base class // ------------------------------------------------------- class IsisInterface { public: IsisInterface( std::string const& file ); virtual ~IsisInterface(); // Can't be declared here since we have // incomplete types from Isis. virtual std::string type() = 0; /// Construct an IsisInterface-derived class of the correct type for the given file. static IsisInterface* open( std::string const& filename ); // Standard Methods //------------------------------------------------------ // These are the standard camera request; IsisInterface allows for // them to be customized for the type of camera so that they are // fast and not too full of conditionals. virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point ) const = 0; virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix ) const = 0; virtual vw::Vector3 camera_center ( vw::Vector2 const& pix = vw::Vector2() ) const = 0; virtual vw::Quat camera_pose ( vw::Vector2 const& pix = vw::Vector2() ) const = 0; // General information //------------------------------------------------------ int lines () const; int samples () const; std::string serial_number () const; double ephemeris_time( vw::Vector2 const& pix ) const; vw::Vector3 sun_position ( vw::Vector2 const& pix = vw::Vector2() ) const; vw::Vector3 target_radii () const; std::string target_name () const; vw::cartography::Datum get_datum_isis(bool use_sphere_for_non_earth) const; protected: // Standard Variables //------------------------------------------------------ std::unique_ptr<Isis::Pvl> m_label; std::unique_ptr<Isis::Camera> m_camera; std::unique_ptr<Isis::Cube> m_cube; vw::cartography::Datum m_datum; friend std::ostream& operator<<( std::ostream&, IsisInterface* ); }; // IOstream interface // ------------------------------------------------------- std::ostream& operator<<( std::ostream& os, IsisInterface* i ); bool IsisEnv(); // Peek inside a Cube file to see if it has a CSM blob. This needs ISIS // logic, rather than any CSM-specific info. bool IsisCubeHasCsmBlob(std::string const& cubeFile); // Read the CSM state (a string) from a cube file. Throw an exception // if missing. std::string csmStateFromIsisCube(std::string const& cubeFile); // Save a CSM state to an ISIS Cube file. Wipe any spice info. This may // throw if the file cannot be saved. void saveCsmStateToIsisCube(std::string const& cubeFile, std::string const& pluginName, std::string const& modelName, std::string const& modelState); }} #endif //__ASP_ISIS_INTERFACE_H__ ================================================ FILE: src/asp/IsisIO/IsisInterfaceFrame.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <vw/Math/Matrix.h> #include <asp/IsisIO/IsisInterfaceFrame.h> #include <algorithm> #include <vector> #include <Camera.h> #include <CameraDetectorMap.h> #include <CameraDistortionMap.h> #include <CameraFocalPlaneMap.h> using namespace vw; using namespace asp; using namespace asp::isis; // Constructor IsisInterfaceFrame::IsisInterfaceFrame(std::string const& filename): IsisInterface(filename), m_alphacube(*m_cube) { // Gutting Isis::Camera m_distortmap = m_camera->DistortionMap(); m_focalmap = m_camera->FocalPlaneMap(); m_detectmap = m_camera->DetectorMap(); // Calculate the camera center (just once) m_camera->instrumentPosition(&m_center[0]); m_center *= 1000.0; // convert to meters // Calculating the camera pose (just once) std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix(); std::vector<double> rot_body = m_camera->bodyRotation()->Matrix(); MatrixProxy<double,3,3> R_inst(&(rot_inst[0])); MatrixProxy<double,3,3> R_body(&(rot_body[0])); // Instrument Rotation = Spacecraft to Camera's Frame // Body Rotation = Spacecraft to World Frame m_pose = Quat(R_body*transpose(R_inst)); } Vector2 IsisInterfaceFrame::point_to_pixel(Vector3 const& point) const { Vector3 look = normalize(point - m_center); std::vector<double> lookB_copy(3); std::copy(look.begin(), look.end(), lookB_copy.begin()); lookB_copy = m_camera->bodyRotation()->J2000Vector(lookB_copy); lookB_copy = m_camera->instrumentRotation()->ReferenceVector(lookB_copy); std::copy(lookB_copy.begin(), lookB_copy.end(), look.begin()); look = m_camera->FocalLength() * (look / std::abs(look[2])); // Project into the camera m_distortmap->SetUndistortedFocalPlane(look[0], look[1]); m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(), m_distortmap->FocalPlaneY()); m_detectmap->SetDetector(m_focalmap->DetectorSample(), m_focalmap->DetectorLine()); return Vector2(m_alphacube.BetaSample(m_detectmap->ParentSample()) - 1, m_alphacube.BetaLine(m_detectmap->ParentLine()) - 1); } Vector3 IsisInterfaceFrame::pixel_to_vector(Vector2 const& px) const { m_detectmap->SetParent(m_alphacube.AlphaSample(px[0] + 1), m_alphacube.AlphaLine(px[1] + 1)); m_focalmap->SetDetector(m_detectmap->DetectorSample(), m_detectmap->DetectorLine()); m_distortmap->SetFocalPlane(m_focalmap->FocalPlaneX(), m_focalmap->FocalPlaneY()); std::vector<double> look(3); look[0] = m_distortmap->UndistortedFocalPlaneX(); look[1] = m_distortmap->UndistortedFocalPlaneY(); look[2] = m_distortmap->UndistortedFocalPlaneZ(); VectorProxy<double,3> result(&look[0]); result = normalize(result); look = m_camera->instrumentRotation()->J2000Vector(look); look = m_camera->bodyRotation()->ReferenceVector(look); return result; } Vector3 IsisInterfaceFrame::camera_center(Vector2 const& /*pix*/) const { return m_center; } Quat IsisInterfaceFrame::camera_pose(Vector2 const& /*pix*/) const { return m_pose; } ================================================ FILE: src/asp/IsisIO/IsisInterfaceFrame.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file IsisInterfaceFrame.h /// /// Frame Camera Interface with ISIS /// #ifndef __ASP_ISIS_INTERFACE_FRAME_H__ #define __ASP_ISIS_INTERFACE_FRAME_H__ #include <vw/Math/Vector.h> #include <vw/Math/Quaternion.h> #include <asp/IsisIO/IsisInterface.h> #include <string> #include <AlphaCube.h> namespace Isis { class CameraDetectorMap; class CameraDistortionMap; class CameraFocalPlaneMap; } namespace asp { namespace isis { class IsisInterfaceFrame : public IsisInterface { public: IsisInterfaceFrame( std::string const& filename ); virtual std::string type() { return "Frame"; } // Standard Methods //------------------------------------------------- virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point ) const; virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix ) const; virtual vw::Vector3 camera_center ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const; virtual vw::Quat camera_pose ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const; protected: // Custom Variables Isis::CameraDistortionMap *m_distortmap; Isis::CameraFocalPlaneMap *m_focalmap; Isis::CameraDetectorMap *m_detectmap; mutable Isis::AlphaCube m_alphacube; vw::Vector3 m_center; vw::Quat m_pose; }; }} #endif//__ASP_ISIS_INTERFACE_FRAME_H__ ================================================ FILE: src/asp/IsisIO/IsisInterfaceLineScan.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/IsisIO/IsisInterfaceLineScan.h> #include <vw/Math/LevenbergMarquardt.h> #include <vw/Math/Matrix.h> #include <vw/Camera/CameraModel.h> // Isis headers #include <Camera.h> #include <CameraDetectorMap.h> #include <CameraDistortionMap.h> #include <CameraFocalPlaneMap.h> #include <iTime.h> #include <SurfacePoint.h> #include <Latitude.h> #include <Longitude.h> #include <Angle.h> #include <algorithm> #include <vector> using namespace vw; using namespace asp; using namespace asp::isis; // Construct IsisInterfaceLineScan::IsisInterfaceLineScan(std::string const& filename): IsisInterface(filename), m_alphacube(*m_cube) { // Gutting Isis::Camera m_distortmap = m_camera->DistortionMap(); m_focalmap = m_camera->FocalPlaneMap(); m_detectmap = m_camera->DetectorMap(); } // Custom function to help avoid over invoking the deeply buried // functions of Isis::Sensor void IsisInterfaceLineScan::SetTime(Vector2 const& px, bool calc_pose) const { if (px != m_c_location) { m_c_location = px; m_detectmap->SetParent(m_alphacube.AlphaSample(px[0]), m_alphacube.AlphaLine(px[1])); if (calc_pose) { // Calculating the spacecraft position and orientation (hence pose) m_camera->instrumentPosition(&m_center[0]); m_center *= 1000; std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix(); std::vector<double> rot_body = m_camera->bodyRotation()->Matrix(); MatrixProxy<double,3,3> R_inst(&(rot_inst[0])); MatrixProxy<double,3,3> R_body(&(rot_body[0])); m_pose = Quat(R_body*transpose(R_inst)); } } } class EphemerisLMA : public vw::math::LeastSquaresModelBase<EphemerisLMA> { vw::Vector3 m_point; Isis::Camera* m_camera; Isis::CameraDistortionMap *m_distortmap; Isis::CameraFocalPlaneMap *m_focalmap; public: typedef vw::Vector<double> result_type; // Back project result typedef vw::Vector<double> domain_type; // Ephemeris time typedef vw::Matrix<double> jacobian_type; inline EphemerisLMA(vw::Vector3 const& point, Isis::Camera* camera, Isis::CameraDistortionMap* distortmap, Isis::CameraFocalPlaneMap* focalmap) : m_point(point), m_camera(camera), m_distortmap(distortmap), m_focalmap(focalmap) {} inline result_type operator()(domain_type const& x) const; }; // LMA for projecting point to linescan camera EphemerisLMA::result_type EphemerisLMA::operator()(EphemerisLMA::domain_type const& x) const { // Setting Ephemeris Time m_camera->setTime(Isis::iTime(x[0])); // Calculating the look direction in camera frame Vector3 instr_pos; m_camera->instrumentPosition(&instr_pos[0]); instr_pos *= 1000; // Spice gives in km Vector3 lookB = normalize(m_point - instr_pos); std::vector<double> lookB_copy(3); std::copy(lookB.begin(), lookB.end(), lookB_copy.begin()); std::vector<double> lookJ = m_camera->bodyRotation()->J2000Vector(lookB_copy); std::vector<double> lookC = m_camera->instrumentRotation()->ReferenceVector(lookJ); Vector3 look; std::copy(lookC.begin(), lookC.end(), look.begin()); // Projecting to mm focal plane look = m_camera->FocalLength() * (look / look[2]); m_distortmap->SetUndistortedFocalPlane(look[0], look[1]); m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(), m_distortmap->FocalPlaneY()); result_type result(1); // Not exactly sure about lineoffset .. but ISIS does it result[0] = m_focalmap->DetectorLineOffset() - m_focalmap->DetectorLine(); return result; } // The secant method for solving the equation model(t) = 0 with given // absolute tolerance. Do not use a smaller tol than 1e-8, as this can // result in numerical instability for some high focal length and a junk // solution. This method does implement some safeguards against divergence. // It is assumed that the model function takes as input and returns the output // as a Vector<double> of size 1. // Thoroughly validated with MOC, CTX, LRO NAC. Old LMA approach is commented // out. // TODO(oalexan1): Move this to a more general place and test with Earth cameras. namespace asp { template<class ModelT> double secant_method(ModelT const& model, double start, double tol) { Vector<double> t0(1), t1(1); double dt = 0.1; t0[0] = start; t1[0] = start + dt; Vector<double> f0 = model(t0); Vector<double> f1 = model(t1); // Do at most 10 iterations. This method usually converges in 5 iterations // or less. If it does not converge, it is probably because there is a problem. for (int i = 0; i < 10; i++) { // If the function is close to 0, or function values are too small, // stop iterating, as bad things will happen. if (std::abs(f1[0]) < tol || std::abs(f1[0] - f0[0]) < tol) break; // If the function is close to 0, but stops getting closer to it, that is // a sign of divergence, most likely due to numerical precision issues. // Stop iterating. Note how we use here a larger value than tol. if (std::abs(f0[0]) < std::abs(f1[0]) && std::abs(f0[0]) < 100 * tol) { f1 = f0; t1 = t0; break; } Vector<double> t2(1); t2[0] = t1[0] - f1[0]*(t1[0]-t0[0])/(f1[0]-f0[0]); t0 = t1; t1 = t2; f0 = f1; f1 = model(t1); } return t1[0]; } } // end namespace asp Vector2 IsisInterfaceLineScan::point_to_pixel(Vector3 const& point) const { // First seed LMA with an ephemeris time in the middle of the image // TODO(oalexan1): Can create an affine function that fits a // ground location to best-guess ephemeris time. This is how // it is done for CSM. This may save a few iterations. double middle = lines() / 2; m_detectmap->SetParent(1, m_alphacube.AlphaLine(middle)); double start_e = m_camera->time().Et(); // Build LMA EphemerisLMA model(point, m_camera.get(), m_distortmap, m_focalmap); int status; Vector<double> objective(1), start(1); start[0] = start_e; objective[0] = 0; // Use the secant method to find the ideal time Vector<double> solution_e(1); double tol = 1e-8; // Do not use a smaller tol to avoid numerical instability solution_e[0] = asp::secant_method(model, start[0], tol); // Old approach, based on LMA. About 2.2-2.6 times slower than secant method. // solution_e = math::levenberg_marquardt(model, start, objective, status); // // Make sure we found ideal time // VW_ASSERT(status > 0, vw::camera::PointToPixelErr() // << " Unable to project point into ISIS linescan camera "); // Converting now to pixel m_camera->setTime(Isis::iTime(solution_e[0])); // Working out pointing m_camera->instrumentPosition(&m_center[0]); m_center *= 1000; Vector3 look = normalize(point-m_center); // Calculating rotation to camera frame std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix(); std::vector<double> rot_body = m_camera->bodyRotation()->Matrix(); MatrixProxy<double,3,3> R_inst(&(rot_inst[0])); MatrixProxy<double,3,3> R_body(&(rot_body[0])); m_pose = Quat(R_body*transpose(R_inst)); look = inverse(m_pose).rotate(look); look = m_camera->FocalLength() * (look / look[2]); m_distortmap->SetUndistortedFocalPlane(look[0], look[1]); m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(), m_distortmap->FocalPlaneY()); m_detectmap->SetDetector(m_focalmap->DetectorSample(), m_focalmap->DetectorLine()); Vector2 pixel(m_detectmap->ParentSample(), m_detectmap->ParentLine()); pixel[0] = m_alphacube.BetaSample(pixel[0]); pixel[1] = m_alphacube.BetaLine(pixel[1]); SetTime(pixel, false); pixel -= Vector2(1,1); return pixel; } Vector3 IsisInterfaceLineScan::pixel_to_vector(Vector2 const& pix) const { Vector2 px = pix + Vector2(1,1); SetTime(px, true); // Projecting to get look direction Vector3 result; m_focalmap->SetDetector(m_detectmap->DetectorSample(), m_detectmap->DetectorLine()); m_distortmap->SetFocalPlane(m_focalmap->FocalPlaneX(), m_focalmap->FocalPlaneY()); result[0] = m_distortmap->UndistortedFocalPlaneX(); result[1] = m_distortmap->UndistortedFocalPlaneY(); result[2] = m_distortmap->UndistortedFocalPlaneZ(); result = normalize(result); result = m_pose.rotate(result); return result; } Vector3 IsisInterfaceLineScan::camera_center(Vector2 const& pix) const { Vector2 px = pix + Vector2(1,1); SetTime(px, true); return m_center; } Quat IsisInterfaceLineScan::camera_pose(Vector2 const& pix) const { Vector2 px = pix + Vector2(1,1); SetTime(px, true); return m_pose; } ================================================ FILE: src/asp/IsisIO/IsisInterfaceLineScan.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file IsisInterfaceLineScan.h /// /// Line Scan Camera Interface with ISIS /// #ifndef __ASP_ISIS_INTERFACE_LINESCAN_H__ #define __ASP_ISIS_INTERFACE_LINESCAN_H__ #include <vw/Math/Vector.h> #include <vw/Math/Quaternion.h> #include <asp/IsisIO/IsisInterface.h> #include <string> #include <AlphaCube.h> namespace Isis { class CameraDetectorMap; class CameraDistortionMap; class CameraFocalPlaneMap; } namespace asp { namespace isis { class IsisInterfaceLineScan : public IsisInterface { public: IsisInterfaceLineScan(std::string const& file); virtual ~IsisInterfaceLineScan() {} virtual std::string type() { return "LineScan"; } // Standard Methods //------------------------------------------------- virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const; virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix ) const; virtual vw::Vector3 camera_center (vw::Vector2 const& pix = vw::Vector2(1,1)) const; virtual vw::Quat camera_pose (vw::Vector2 const& pix = vw::Vector2(1,1)) const; protected: // Custom Variables Isis::CameraDistortionMap *m_distortmap; Isis::CameraFocalPlaneMap *m_focalmap; Isis::CameraDetectorMap *m_detectmap; mutable Isis::AlphaCube m_alphacube; // Doesn't use const private: // Custom Functions mutable vw::Vector2 m_c_location; mutable vw::Vector3 m_center; mutable vw::Quat m_pose; void SetTime(vw::Vector2 const& px, bool calc_pose = false) const; }; }} #endif//__ASP_ISIS_INTERFACE_LINESCAN_H__ ================================================ FILE: src/asp/IsisIO/IsisInterfaceMapFrame.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // ASP #include <asp/IsisIO/IsisInterfaceMapFrame.h> #include <vw/Cartography/PointImageManipulation.h> // ISIS #include <ProjectionFactory.h> #include <Projection.h> #include <CameraGroundMap.h> #include <CameraDistortionMap.h> #include <Distance.h> #include <SurfacePoint.h> #include <Latitude.h> #include <Longitude.h> using namespace vw; using namespace asp; using namespace asp::isis; // Constructor IsisInterfaceMapFrame::IsisInterfaceMapFrame(std::string const& filename) : IsisInterface(filename) {// , m_projection(Isis::ProjectionFactory::CreateFromCube(*m_label)) { Isis::TProjection* tempProj = (Isis::TProjection*)Isis::ProjectionFactory::CreateFromCube(*m_label); m_projection.reset(tempProj); // Gutting Isis::Camera m_groundmap = m_camera->GroundMap(); m_distortmap = m_camera->DistortionMap(); // TODO(oalexan1): Look at these radii, see if perhaps one can get the datum this way m_camera->radii(m_radii); // Calculate the camera center (just once) m_camera->instrumentPosition(&m_center[0]); m_center *= 1000.0; // convert to meters // Calculating the camera pose (just once) std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix(); std::vector<double> rot_body = m_camera->bodyRotation()->Matrix(); MatrixProxy<double,3,3> R_inst(&(rot_inst[0])); MatrixProxy<double,3,3> R_body(&(rot_body[0])); m_pose = Quat(R_body*transpose(R_inst)); } Vector2 IsisInterfaceMapFrame::point_to_pixel(Vector3 const& point) const { // TODO(oalexan1): It looks that the code below assumes the datum to be spherical. Vector3 lon_lat_radius = cartography::xyz_to_lon_lat_radius_estimate(point); // TODO: INACCURATE!!! if (lon_lat_radius[0] < 0) lon_lat_radius[0] += 360.0; // Project into the camera m_groundmap->SetGround( Isis::SurfacePoint(Isis::Latitude (lon_lat_radius[1], Isis::Angle::Degrees ), Isis::Longitude(lon_lat_radius[0], Isis::Angle::Degrees ), Isis::Distance (lon_lat_radius[2], Isis::Distance::Meters))); m_distortmap->SetUndistortedFocalPlane(m_groundmap->FocalPlaneX(), m_groundmap->FocalPlaneY()); // Projection back out on to DEM m_groundmap->SetFocalPlane(m_distortmap->UndistortedFocalPlaneX(), m_distortmap->UndistortedFocalPlaneY(), m_distortmap->UndistortedFocalPlaneZ()); m_projection->SetGround(m_camera->UniversalLatitude(), m_camera->UniversalLongitude()); return Vector2(m_projection->WorldX() - 1, m_projection->WorldY() - 1); } Vector3 IsisInterfaceMapFrame::pixel_to_vector(Vector2 const& px) const { m_projection->SetWorld(px[0] + 1, px[1] + 1); // Longitude and Latitude are planetocentric. This is why // lon_lat_radius_to_xyz is the apprioprate choice. Vector3 lon_lat_radius(m_projection->UniversalLongitude(), m_projection->UniversalLatitude(), m_camera->LocalRadius(m_projection->UniversalLatitude(), m_projection->UniversalLongitude()).meters()); Vector3 point = cartography::lon_lat_radius_to_xyz_estimate(lon_lat_radius); // TODO: INACCURATE!!! return normalize(point-m_center); } Vector3 IsisInterfaceMapFrame::camera_center(Vector2 const& /*pix*/) const { return m_center; } Quat IsisInterfaceMapFrame::camera_pose(Vector2 const& /*pix*/) const { return m_pose; } ================================================ FILE: src/asp/IsisIO/IsisInterfaceMapFrame.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file IsisInterfaceMapFrame.h /// /// Map Projected Frame Camera Interface with ISIS /// #ifndef __ASP_ISIS_INTERFACE_MAP_FRAME_H__ #define __ASP_ISIS_INTERFACE_MAP_FRAME_H__ #include <TProjection.h> #include <vw/Math/Vector.h> #include <asp/IsisIO/IsisInterface.h> #include <memory> #include <string> // Isis forward declaration namespace Isis { class CameraGroundMap; class CameraDistortionMap; class Projection; } #include <Distance.h> namespace asp { namespace isis { /// ?? class IsisInterfaceMapFrame : public IsisInterface { public: IsisInterfaceMapFrame( std::string const& file ); virtual std::string type() { return "MapFrame"; } // Standard methods //------------------------------------------------- virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point ) const; // TODO: Inaccurate! Needs DATUM! virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix ) const; virtual vw::Vector3 camera_center ( vw::Vector2 const& pix = vw::Vector2() ) const; virtual vw::Quat camera_pose ( vw::Vector2 const& pix = vw::Vector2() ) const; protected: // Custom variables std::unique_ptr<Isis::TProjection> m_projection; Isis::CameraGroundMap *m_groundmap; Isis::CameraDistortionMap *m_distortmap; vw::Vector3 m_center; vw::Quat m_pose; Isis::Distance m_radii[3]; }; }} #endif//__ASP_ISIS_INTERFACE_MAP_FRAME_H__ ================================================ FILE: src/asp/IsisIO/IsisInterfaceMapLineScan.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <vw/Math/Matrix.h> #include <vw/Math/Quaternion.h> #include <vw/Math/Vector.h> #include <vw/Math/LevenbergMarquardt.h> #include <vw/Camera/CameraModel.h> #include <asp/IsisIO/IsisInterfaceMapLineScan.h> #include <algorithm> #include <limits> #include <string> #include <vector> #include <Camera.h> #include <CameraDistortionMap.h> #include <CameraFocalPlaneMap.h> #include <CameraGroundMap.h> #include <Latitude.h> #include <Longitude.h> #include <Projection.h> #include <ProjectionFactory.h> #include <Sensor.h> #include <SpiceRotation.h> #include <iTime.h> using namespace vw; using namespace asp; using namespace asp::isis; // Constructor IsisInterfaceMapLineScan::IsisInterfaceMapLineScan(std::string const& filename) : IsisInterface(filename){ //,m_projection(Isis::ProjectionFactory::CreateFromCube(*m_label)) { Isis::TProjection* tempProj = (Isis::TProjection*)Isis::ProjectionFactory::CreateFromCube(*m_label); m_projection.reset(tempProj); // Gutting Isis::Camera m_distortmap = m_camera->DistortionMap(); m_groundmap = m_camera->GroundMap(); m_focalmap = m_camera->FocalPlaneMap(); m_cache_px[0] = m_cache_px[1] = std::numeric_limits<double>::quiet_NaN(); } // Custom Functions class EphemerisLMA : public vw::math::LeastSquaresModelBase<EphemerisLMA> { vw::Vector3 m_point; Isis::Camera* m_camera; Isis::CameraDistortionMap *m_distortmap; Isis::CameraFocalPlaneMap *m_focalmap; public: typedef vw::Vector<double> result_type; // Back project result typedef vw::Vector<double> domain_type; // Ephemeris time typedef vw::Matrix<double> jacobian_type; inline EphemerisLMA(vw::Vector3 const& point, Isis::Camera* camera, Isis::CameraDistortionMap* distortmap, Isis::CameraFocalPlaneMap* focalmap): m_point(point), m_camera(camera), m_distortmap(distortmap), m_focalmap(focalmap) {} inline result_type operator()(domain_type const& x) const; }; // LMA for projecting point to linescan camera EphemerisLMA::result_type EphemerisLMA::operator()(EphemerisLMA::domain_type const& x) const { // Setting Ephemeris Time m_camera->setTime(Isis::iTime(x[0])); // Calculating the look direction in camera frame Vector3 instru; m_camera->instrumentPosition(&instru[0]); instru *= 1000; // Spice gives in km Vector3 lookB = normalize(m_point - instru); std::vector<double> lookB_copy(3); std::copy(lookB.begin(),lookB.end(),lookB_copy.begin()); std::vector<double> lookJ = m_camera->bodyRotation()->J2000Vector(lookB_copy); std::vector<double> lookC = m_camera->instrumentRotation()->ReferenceVector(lookJ); Vector3 look; std::copy(lookC.begin(),lookC.end(),look.begin()); // Projecting to mm focal plane look = m_camera->FocalLength() * (look / look[2]); m_distortmap->SetUndistortedFocalPlane(look[0], look[1]); m_focalmap->SetFocalPlane(m_distortmap->FocalPlaneX(), m_distortmap->FocalPlaneY()); result_type result(1); // Not exactly sure about lineoffset .. but ISIS does it result[0] = m_focalmap->DetectorLineOffset() - m_focalmap->DetectorLine(); return result; } Vector2 IsisInterfaceMapLineScan::point_to_pixel(Vector3 const& point) const { // First seed LMA with an ephemeris time in the middle of the image double middle_et = m_camera->cacheStartTime().Et() + (m_camera->cacheEndTime().Et()-m_camera->cacheStartTime().Et())/2.0; // Build LMA EphemerisLMA model(point, m_camera.get(), m_distortmap, m_focalmap); int status; Vector<double> objective(1), start(1); start[0] = middle_et; Vector<double> solution_e = math::levenberg_marquardt(model, start, objective, status); // Make sure we found ideal time VW_ASSERT(status > 0, camera::PointToPixelErr() << " Unable to project point into ISIS map linescan camera."); // Setting to camera time to solution m_camera->setTime(Isis::iTime(solution_e[0])); // Working out pointing Vector3 center; m_camera->instrumentPosition(¢er[0]); Vector3 look = normalize(point-1000*center); // Calculating rotation to camera frame std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix(); std::vector<double> rot_body = m_camera->bodyRotation()->Matrix(); MatrixProxy<double,3,3> R_inst(&(rot_inst[0])); MatrixProxy<double,3,3> R_body(&(rot_body[0])); look = transpose(R_body*transpose(R_inst))*look; look = m_camera->FocalLength() * (look / look[2]); // Projecting back on to ground to find out time m_groundmap->SetFocalPlane(look[0], look[1], look[2]); m_projection->SetGround(m_camera->UniversalLatitude(), m_camera->UniversalLongitude()); m_cache_px = Vector2(m_projection->WorldX()-1, m_projection->WorldY()-1); return m_cache_px; } Vector3 IsisInterfaceMapLineScan::camera_center(Vector2 const& px) const { if (px != m_cache_px) { m_cache_px = px; if (!m_projection->SetWorld(px[0]+1, px[1]+1)) vw_throw(camera::PixelToRayErr() << "Failed to SetWorld."); if (!m_groundmap->SetGround(Isis::Latitude(m_projection->UniversalLatitude(), Isis::Angle::Degrees), Isis::Longitude(m_projection->UniversalLongitude(), Isis::Angle::Degrees))) vw_throw(camera::PixelToRayErr() << "Failed to SetGround."); } Vector3 position; m_camera->instrumentPosition(&position[0]); return position * 1e3; } Vector3 IsisInterfaceMapLineScan::pixel_to_vector(Vector2 const& px) const { Vector3 sB = camera_center(px); Vector3 p_pB; m_camera->Sensor::Coordinate(&p_pB[0]); return normalize(p_pB*1000 - sB); } Quat IsisInterfaceMapLineScan::camera_pose(Vector2 const& px) const { camera_center(px); std::vector<double> rot_inst = m_camera->instrumentRotation()->Matrix(); std::vector<double> rot_body = m_camera->bodyRotation()->Matrix(); MatrixProxy<double,3,3> R_inst(&(rot_inst[0])); MatrixProxy<double,3,3> R_body(&(rot_body[0])); return Quat(R_body*transpose(R_inst)); } ================================================ FILE: src/asp/IsisIO/IsisInterfaceMapLineScan.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file IsisInterfaceMapLineScane.h /// /// Map Projected Line Scan Camera Interface with ISIS /// #ifndef __ASP_ISIS_INTERFACE_MAP_LINESCAN_H__ #define __ASP_ISIS_INTERFACE_MAP_LINESCAN_H__ // ASP & VW #include <asp/IsisIO/IsisInterface.h> #include <memory> // Isis #include <TProjection.h> #include <CameraDistortionMap.h> #include <CameraGroundMap.h> #include <CameraFocalPlaneMap.h> namespace asp { namespace isis { class IsisInterfaceMapLineScan : public IsisInterface { public: IsisInterfaceMapLineScan( std::string const& file ); virtual std::string type() { return "MapLineScan"; } // Standard Methods //------------------------------------------------- virtual vw::Vector2 point_to_pixel ( vw::Vector3 const& point ) const; virtual vw::Vector3 pixel_to_vector( vw::Vector2 const& pix ) const; virtual vw::Vector3 camera_center ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const; virtual vw::Quat camera_pose ( vw::Vector2 const& pix = vw::Vector2(1,1) ) const; protected: // Custom Variables mutable vw::Vector2 m_cache_px; std::unique_ptr<Isis::TProjection> m_projection; Isis::CameraDistortionMap *m_distortmap; Isis::CameraGroundMap *m_groundmap; Isis::CameraFocalPlaneMap *m_focalmap; }; }} #endif//__ASP_ISIS_INTERFACE_MAP_LINESCAN_H__ ================================================ FILE: src/asp/IsisIO/IsisInterfaceSAR.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <vw/Math/Matrix.h> #include <vw/Camera/CameraModel.h> #include <vw/Core/Exception.h> #include <asp/IsisIO/IsisInterfaceSAR.h> #include <vw/Cartography/PointImageManipulation.h> // ISIS #include <Camera.h> #include <CameraDetectorMap.h> #include <CameraDistortionMap.h> #include <CameraGroundMap.h> #include <CameraFocalPlaneMap.h> #include <Distance.h> #include <iTime.h> #include <Target.h> #include <SurfacePoint.h> #include <Latitude.h> #include <Longitude.h> #include <Angle.h> #include <algorithm> #include <vector> using namespace vw; using namespace asp; using namespace asp::isis; // Constructor IsisInterfaceSAR::IsisInterfaceSAR(std::string const& filename): IsisInterface(filename), m_alphacube(*m_cube) { // Gutting Isis::Camera m_groundmap = m_camera->GroundMap(); m_distortmap = m_camera->DistortionMap(); m_focalmap = m_camera->FocalPlaneMap(); m_detectmap = m_camera->DetectorMap(); // Set the shape to be the ellipsoid. This will ensure that ground // points will be on the ellipsoid, which is needed in // pixel_to_vector(). m_camera->IgnoreElevationModel(true); } Vector2 IsisInterfaceSAR::point_to_pixel(Vector3 const& point) const { // TODO(oalexan1): It looks that the code below assumes the datum to be spherical. Vector3 lon_lat_radius = cartography::xyz_to_lon_lat_radius_estimate(point); // TODO: INACCURATE!!! if (lon_lat_radius[0] < 0) lon_lat_radius[0] += 360.0; // Project into the camera. The ground was set to be the ellipsoid in the constructor. if (!m_groundmap->SetGround (Isis::SurfacePoint(Isis::Latitude (lon_lat_radius[1], Isis::Angle::Degrees ), Isis::Longitude(lon_lat_radius[0], Isis::Angle::Degrees ), Isis::Distance (lon_lat_radius[2], Isis::Distance::Meters)))) vw_throw(camera::PixelToRayErr() << "Failed in SetGround()."); m_distortmap->SetUndistortedFocalPlane(m_groundmap->FocalPlaneX(), m_groundmap->FocalPlaneY()); // ISIS pixels start with 1. return Vector2(m_camera->Sample() - 1.0, m_camera->Line() - 1.0); } // TODO(oalexan1): There should be a better way of doing this Vector3 IsisInterfaceSAR::pixel_to_vector(Vector2 const& pix) const { // Find the camera center Vector3 cam_ctr = camera_center(pix); // Find the intersection with the ground. The ground is defined // in the constructor to be the ellipsoid. The camera center also // sets the image pixel, so the intersection with ground is computed // already, need to just fetch it. Vector3 llh(m_camera->UniversalLongitude(), m_camera->UniversalLatitude(), 0.0); Vector3 ground_pt = m_datum.geodetic_to_cartesian(llh); // The desired vector is the normalized direction from the camera // center to the ground Vector3 dir = ground_pt - cam_ctr; return dir / norm_2(dir); } Vector3 IsisInterfaceSAR::camera_center(Vector2 const& pix) const { Vector2 isis_pix = pix + Vector2(1,1); if (!m_camera->SetImage(isis_pix[0], isis_pix[1])) vw_throw(camera::PixelToRayErr() << "Failed in SetImage()."); vw::Vector3 center; m_camera->instrumentPosition(¢er[0]); center *= 1000.0; // km to meters return center; } Quat IsisInterfaceSAR::camera_pose(Vector2 const& pix) const { vw_throw(NoImplErr() << "camera_pose() not implemented for ISIS SAR cameras."); return vw::Quat(); } ================================================ FILE: src/asp/IsisIO/IsisInterfaceSAR.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file IsisInterfaceSAR.h /// /// ISIS SAR Camera Interface. Tested with MiniRF. /// #ifndef __ASP_ISIS_INTERFACE_SAR_H__ #define __ASP_ISIS_INTERFACE_SAR_H__ #include <vw/Math/Vector.h> #include <vw/Math/Quaternion.h> #include <vw/Cartography/Datum.h> #include <asp/IsisIO/IsisInterface.h> #include <string> #include <AlphaCube.h> namespace Isis { class CameraDetectorMap; class CameraGroundMap; class CameraDistortionMap; class CameraFocalPlaneMap; } namespace asp { namespace isis { class IsisInterfaceSAR : public IsisInterface { public: IsisInterfaceSAR(std::string const& file); virtual ~IsisInterfaceSAR() {} virtual std::string type() { return "SAR"; } // Standard methods //------------------------------------------------- virtual vw::Vector2 point_to_pixel (vw::Vector3 const& point) const; virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const; virtual vw::Vector3 camera_center (vw::Vector2 const& pix) const; virtual vw::Quat camera_pose (vw::Vector2 const& pix) const; protected: // Custom variables Isis::CameraDistortionMap *m_distortmap; Isis::CameraFocalPlaneMap *m_focalmap; Isis::CameraDetectorMap *m_detectmap; mutable Isis::AlphaCube m_alphacube; // Doesn't use const Isis::CameraGroundMap *m_groundmap; }; }} #endif//__ASP_ISIS_INTERFACE_SAR_H__ ================================================ FILE: src/asp/IsisIO/IsisSpecialPixels.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisSpecialPixels.h> #include <asp/IsisIO/DiskImageResourceIsis.h> #include <vw/Core/Functors.h> #include <vw/Image/MaskViews.h> #include <vw/Image/PerPixelViews.h> #include <vw/Image/PixelTypes.h> #include <vw/Image/Filter.h> #include <cmath> #include <limits> // Isis headers #include <isis/SpecialPixel.h> namespace asp { // IsisSpecialPixelFunc // /// Replace ISIS missing data values with a pixel value of your choice. template <class PixelT> class IsisSpecialPixelFunc: public vw::UnaryReturnSameType { PixelT m_replacement_low; PixelT m_replacement_high; PixelT m_replacement_null; // Private IsisSpecialPixelFunc(): m_replacement_low(0), m_replacement_high(0), m_replacement_null(0) {} public: IsisSpecialPixelFunc(PixelT const& pix_l, PixelT const& pix_h, PixelT const& pix_n): m_replacement_low(pix_l), m_replacement_high(pix_h), m_replacement_null(pix_n) {} // Helper to determine special across different channel types template <typename ChannelT, typename T = void> struct Helper { static inline bool IsSpecial(ChannelT const& arg) { return false; } static inline bool IsHighPixel(ChannelT const& arg) { return false; } static inline bool IsNull(ChannelT const& arg) { return false; } }; template<typename T> struct Helper<double, T> { static inline bool IsSpecial(double const& arg) { return arg < Isis::VALID_MIN8; } static inline bool IsHighPixel(double const& arg) { return arg == Isis::HIGH_INSTR_SAT8 || arg == Isis::HIGH_REPR_SAT8; } static inline bool IsNull(double const& arg) { return arg == Isis::NULL8; } }; template<typename T> struct Helper<float, T> { static inline bool IsSpecial(float const& arg) { return arg < Isis::VALID_MIN4; } static inline bool IsHighPixel(float const& arg) { return arg == Isis::HIGH_INSTR_SAT4 || arg == Isis::HIGH_REPR_SAT4; } static inline bool IsNull(float const& arg) { return arg == Isis::NULL4; } }; template<typename T> struct Helper<short, T>{ static inline bool IsSpecial(short const& arg) { return arg < Isis::VALID_MIN2; } static inline bool IsHighPixel(short const& arg) { return arg == Isis::HIGH_INSTR_SAT2 || arg == Isis::HIGH_REPR_SAT2; } static inline bool IsNull(short const& arg) { return arg == Isis::NULL2; } }; template<typename T> struct Helper<unsigned short, T> { static inline bool IsSpecial(unsigned short const& arg) { return arg < Isis::VALID_MINU2 || arg > Isis::VALID_MAXU2; } static inline bool IsHighPixel(unsigned short const& arg) { return arg == Isis::HIGH_INSTR_SATU2 || arg == Isis::HIGH_REPR_SATU2; } static inline bool IsNull(unsigned short const& arg) { return arg == Isis::NULLU2; } }; template<typename T> struct Helper<unsigned char, T> { static inline bool IsSpecial(unsigned char const& arg) { return arg < Isis::VALID_MIN1 || arg > Isis::VALID_MAX1; } static inline bool IsHighPixel(unsigned char const& arg) { return arg == Isis::HIGH_INSTR_SAT1 || arg == Isis::HIGH_REPR_SAT1; } static inline bool IsNull(unsigned char const& arg) { return arg == Isis::NULL1; } }; PixelT operator() (PixelT const& pix) const { typedef typename vw::CompoundChannelType<PixelT>::type channel_type; typedef Helper<channel_type, void> help; for (size_t n = 0; n < vw::CompoundNumChannels<PixelT>::value; ++n) { if (help::IsSpecial(vw::compound_select_channel<const channel_type&>(pix,n))) { if (help::IsHighPixel(vw::compound_select_channel<const channel_type&>(pix,n))) return m_replacement_high; else if (help::IsNull(vw::compound_select_channel<const channel_type&>(pix,n))) return m_replacement_null; else return m_replacement_low; } } return pix; } }; // Replace ISIS special pixel values with given replacement values. // Specialize this only for float pixels, as that's all that is needed. vw::ImageViewRef<float> removeIsisSpecialPixels(vw::ImageViewRef<float> const& image, float r_low, float r_high, float r_null) { auto obj = IsisSpecialPixelFunc<float>(r_low, r_high, r_null); return vw::per_pixel_filter(image.impl(), obj); } // Adjust a masked image to handle ISIS special pixels void adjustIsisImage(std::string const& input_file, float nodata_value, vw::ImageViewRef<vw::PixelMask<float>> & masked_image) { boost::shared_ptr<vw::DiskImageResourceIsis> isis_rsrc(new vw::DiskImageResourceIsis(input_file)); float isis_lo = isis_rsrc->valid_minimum(); float isis_hi = isis_rsrc->valid_maximum(); // Force the low value to be greater than the nodata value if (!std::isnan(nodata_value) && nodata_value >= isis_lo) { isis_lo = std::nextafter(nodata_value, std::numeric_limits<float>::max()); if (isis_hi < isis_lo) isis_hi = isis_lo; } vw::ImageViewRef<float> processed_image = vw::apply_mask(masked_image, isis_lo); // Invalidate pixels outside range masked_image = vw::create_mask(processed_image, isis_lo, isis_hi); processed_image = vw::apply_mask(masked_image, isis_lo); // ISIS-aware removal of special pixels processed_image = removeIsisSpecialPixels(processed_image, isis_lo, isis_hi, isis_lo); masked_image = vw::create_mask(processed_image, isis_lo); } } // end namespace asp #endif // ASP_HAVE_PKG_ISIS ================================================ FILE: src/asp/IsisIO/IsisSpecialPixels.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_ISISIO_ISISSPECIALPIXELS_H__ #define __ASP_ISISIO_ISISSPECIALPIXELS_H__ #include <vw/Image/ImageViewRef.h> namespace asp { // Adjust a masked image to handle ISIS special pixels. Reads valid min/max // from the ISIS file and removes special pixels from the image. void adjustIsisImage(std::string const& input_file, float nodata_value, vw::ImageViewRef<vw::PixelMask<float>> & masked_image); } // end namespace asp #endif//__ASP_ISISIO_ISISSPECIALPIXELS_H__ ================================================ FILE: src/asp/IsisIO/PolyEquation.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <vw/Core/FundamentalTypes.h> #include <vw/Math/Vector.h> #include <asp/IsisIO/PolyEquation.h> #include <iomanip> #include <vector> #include <string> #include <algorithm> #include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/classification.hpp> using namespace vw; using namespace asp; // Constructors //--------------------------------------------- PolyEquation::PolyEquation ( int order ) { if ( order < 0 ) vw_throw( ArgumentErr() << "PolyEquation: Polynomial order must be greater than zero." ); if ( order > 254 ) vw_throw( ArgumentErr() << "PolyEquation: Polynomial order must be less than 255" ); m_x_coeff.set_size( order + 1 ); m_y_coeff.set_size( order + 1 ); m_z_coeff.set_size( order + 1 ); for ( int i = 0; i < order+1; i++ ) m_x_coeff[i] = m_y_coeff[i] = m_z_coeff[i] = 0; m_cached_time = -1; m_time_offset = 0; m_max_length = uint8(order)+1; } PolyEquation::PolyEquation( int order_x, int order_y, int order_z ) { if ( order_x < 0 || order_y < 0 || order_z < 0 ) vw_throw( ArgumentErr() << "PolyEquation: Polynomial order must be greater than zero." ); if ( order_x > 254 || order_y > 254 || order_z > 254 ) vw_throw( ArgumentErr() << "PolyEquation: Polynomial order must be less than 255" ); m_x_coeff.set_size(order_x+1); m_y_coeff.set_size(order_y+1); m_z_coeff.set_size(order_z+1); for ( unsigned i = 0; i < m_x_coeff.size(); i++ ) m_x_coeff[i] = 0; for ( unsigned i = 0; i < m_y_coeff.size(); i++ ) m_y_coeff[i] = 0; for ( unsigned i = 0; i < m_z_coeff.size(); i++ ) m_z_coeff[i] = 0; m_cached_time = -1; m_time_offset = 0; m_max_length = uint8( std::max( order_x, std::max( order_y, order_z ) ) ) + 1; } // Update //----------------------------------------------- void PolyEquation::update( double t ) { m_cached_time = t; double delta_t = t-m_time_offset; Vector<double> powers( m_max_length ); powers[0] = 1; for ( uint8 i = 1; i < m_max_length; i++ ) powers[i] = powers[i-1]*delta_t; m_cached_output[0] = sum( elem_prod(m_x_coeff, subvector(powers,0,m_x_coeff.size())) ); m_cached_output[1] = sum( elem_prod(m_y_coeff, subvector(powers,0,m_y_coeff.size())) ); m_cached_output[2] = sum( elem_prod(m_z_coeff, subvector(powers,0,m_z_coeff.size())) ); } // FileIO //----------------------------------------------- void PolyEquation::write( std::ofstream& f ) { for ( int i = 0; i < 3; i++ ) { Vector<double>* pointer; switch(i) { case 0: pointer = &m_x_coeff; break; case 1: pointer = &m_y_coeff; break; default: case 2: pointer = &m_z_coeff; break; } f << std::setprecision( 15 ); for ( unsigned j = 0; j < (*pointer).size(); j++ ) f << (*pointer)[j] << " "; f << "\n"; } } void PolyEquation::read( std::ifstream& f ) { std::string buffer; std::vector<std::string> tokens; m_cached_time = -1; for ( int i = 0; i < 3; i++ ) { buffer = ""; std::getline( f, buffer ); boost::split( tokens, buffer, boost::is_any_of(" =\n") ); // Cleaning out any tokens that are just "" for(std::vector<std::string>::iterator iter = tokens.begin(); iter != tokens.end(); ++iter ) if ( (*iter) == "" ) { iter = tokens.erase(iter); iter--; } Vector<double>* pointer; switch(i) { case 0: pointer = &m_x_coeff; break; case 1: pointer = &m_y_coeff; break; default: case 2: pointer = &m_z_coeff; break; } pointer->set_size( tokens.size() ); for ( unsigned j = 0; j < tokens.size(); j++ ) (*pointer)[j] = atof( tokens[j].c_str() ); } } // Constant Access //----------------------------------------------- double& PolyEquation::operator[]( size_t n ) { m_cached_time = -1; if (n >= m_x_coeff.size() + m_y_coeff.size() + m_z_coeff.size()) vw_throw(ArgumentErr() << "PolyEquation: invalid index."); if (n < m_x_coeff.size()) { return m_x_coeff[n]; } else if (n < m_x_coeff.size() + m_y_coeff.size()) { return m_y_coeff[n - m_x_coeff.size()]; } else { return m_z_coeff[n - m_x_coeff.size() - m_y_coeff.size()]; } } ================================================ FILE: src/asp/IsisIO/PolyEquation.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_POLY_EQUATION__ #define __ASP_POLY_EQUATION__ #include <asp/IsisIO/BaseEquation.h> namespace asp { // Polynomial Equation // .. is a vector equation described by an n'th order polynomial class PolyEquation : public BaseEquation { vw::Vector<double> m_x_coeff; vw::Vector<double> m_y_coeff; vw::Vector<double> m_z_coeff; vw::uint8 m_max_length; // Maximum order + 1 void update ( double t ); public: PolyEquation( int order = 0 ); PolyEquation( int, int, int ); PolyEquation(vw::Vector<double> const& x, vw::Vector<double> const& y, vw::Vector<double> const& z) : m_x_coeff(x), m_y_coeff(y), m_z_coeff(z) { m_cached_time = -1; m_time_offset = 0; if ( x.size() > 254 || y.size() > 254 || z.size() > 254 ) vw::vw_throw( vw::ArgumentErr() << "PolyEquation: Polynomial order must be less than 255" ); m_max_length = vw::uint8( std::max( x.size(), std::max( y.size(), z.size() ) ) ) + 1; } std::string type() const { return "PolyEquation"; } size_t size() const { return m_x_coeff.size()+m_y_coeff.size()+m_z_coeff.size(); } double& operator[]( size_t n ); void write( std::ofstream &f ); void read( std::ifstream &f ); }; } #endif//__ASP_POLY_EQUATION__ ================================================ FILE: src/asp/IsisIO/RPNEquation.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <vw/Core/Exception.h> #include <vw/Math/Vector.h> #include <asp/IsisIO/RPNEquation.h> #include <iomanip> #include <stack> #include <vector> #include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/split.hpp> using namespace vw; using namespace asp; // Constructors //----------------------------------------------------- RPNEquation::RPNEquation() { m_x_eq.clear(); m_x_consts.clear(); m_y_eq.clear(); m_y_consts.clear(); m_z_eq.clear(); m_z_consts.clear(); m_cached_time = -1; m_time_offset = 0; } RPNEquation::RPNEquation( std::string const& x_eq, std::string const& y_eq, std::string const& z_eq ) { string_to_eqn( x_eq, m_x_eq, m_x_consts ); string_to_eqn( y_eq, m_y_eq, m_y_consts ); string_to_eqn( z_eq, m_z_eq, m_z_consts ); m_cached_time = -1; m_time_offset = 0; } // Update //----------------------------------------------------- void RPNEquation::update( double t ) { m_cached_time = t; double delta_t = t - m_time_offset; m_cached_output[0] = evaluate( m_x_eq, m_x_consts, delta_t ); m_cached_output[1] = evaluate( m_y_eq, m_y_consts, delta_t ); m_cached_output[2] = evaluate( m_z_eq, m_z_consts, delta_t ); } void RPNEquation::string_to_eqn( std::string const& str, std::vector<std::string>& commands, std::vector<double>& consts ) { // Breaks a string into the equation format used internally commands.clear(); consts.clear(); boost::split( commands, str, boost::is_any_of(" =")); // Cleaning out any tokens that are just "" for(std::vector<std::string>::iterator iter = commands.begin(); iter != commands.end(); ++iter ) { if ( (*iter) == "" ) { iter = commands.erase(iter); iter--; } } // Pulling out the numbers for(std::vector<std::string>::iterator iter = commands.begin(); iter != commands.end(); ++iter ) { if ( isdigit( (*iter)[(*iter).size()-1] ) ) { consts.push_back( atof( iter->c_str() ) ); *iter = "c"; } } } double RPNEquation::evaluate( std::vector<std::string> const& commands, std::vector<double>& consts, double t ) { // Evaluates an equation in the internal format if ( commands.empty() ) return 0; int consts_index = 0; std::stack<double> rpn_stack; double buffer; for ( std::vector<std::string>::const_iterator iter = commands.begin(); iter != commands.end(); ++iter ) { if ( *iter == "c" ) { rpn_stack.push( consts[consts_index] ); consts_index++; } else if ( *iter == "t" ) { rpn_stack.push( t ); } else if ( rpn_stack.size() < 1 ) { vw_throw( IOErr() << "Insufficient arguments for RPN command: " << *iter << "\n" ); } else if ( *iter == "sin" ) { buffer = sin( rpn_stack.top() ); rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( *iter == "cos" ) { buffer = cos( rpn_stack.top() ); rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( *iter == "tan" ) { buffer = tan( rpn_stack.top() ); rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( *iter == "abs" ) { buffer = fabs( rpn_stack.top() ); rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( rpn_stack.size() < 2 ) { vw_throw( IOErr() << "Insufficient arguments for command: " << *iter << "\n" ); } else if ( *iter == "*" ) { buffer = rpn_stack.top(); rpn_stack.pop(); buffer *= rpn_stack.top(); rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( *iter == "/" ) { buffer = rpn_stack.top(); rpn_stack.pop(); buffer = rpn_stack.top() / buffer; rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( *iter == "-" ) { buffer = rpn_stack.top(); rpn_stack.pop(); buffer = rpn_stack.top() - buffer; rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( *iter == "+" ) { buffer = rpn_stack.top(); rpn_stack.pop(); buffer += rpn_stack.top(); rpn_stack.pop(); rpn_stack.push( buffer ); } else if ( *iter == "^" ) { buffer = rpn_stack.top(); rpn_stack.pop(); buffer = pow( rpn_stack.top(), buffer ); rpn_stack.pop(); rpn_stack.push( buffer ); } else { vw_throw( IOErr() << "Unknown RPN operator: " << *iter << "\n" ); } } // End of calculator if ( rpn_stack.size() != 1 ) vw_throw( IOErr() << "Unbalanced RPN equation! More constants than need by operators.\n" ); return rpn_stack.top(); } // FileIO //----------------------------------------------------- void RPNEquation::write( std::ofstream &f ) { for ( int i = 0; i < 3; i++ ) { std::vector<std::string>* eq_ptr = NULL; std::vector<double>* cs_ptr = NULL; switch(i) { case 0: eq_ptr = &m_x_eq; cs_ptr = &m_x_consts; break; case 1: eq_ptr = &m_y_eq; cs_ptr = &m_y_consts; break; case 2: eq_ptr = &m_z_eq; cs_ptr = &m_z_consts; break; } f << std::setprecision( 15 ); int cs_idx = 0; for ( unsigned j = 0; j < eq_ptr->size(); j++ ) { if ( (*eq_ptr)[j] == "c" ) { f << (*cs_ptr)[cs_idx] << " "; cs_idx++; } else { f << (*eq_ptr)[j] << " "; } } f << "\n"; } } void RPNEquation::read( std::ifstream &f ) { std::string buffer; m_cached_time = -1; buffer.clear(); std::getline( f, buffer ); string_to_eqn( buffer, m_x_eq, m_x_consts ); buffer.clear(); std::getline( f, buffer ); string_to_eqn( buffer, m_y_eq, m_y_consts ); buffer.clear(); std::getline( f, buffer ); string_to_eqn( buffer, m_z_eq, m_z_consts ); } // Constant Access //----------------------------------------------------- double& RPNEquation::operator[]( size_t n ) { m_cached_time = -1; if ( n >= m_x_consts.size() + m_y_consts.size() + m_z_consts.size() ) vw_throw( ArgumentErr() << "RPNEquation: invalid index." ); if ( n < m_x_consts.size() ) return m_x_consts[n]; else if ( n < m_x_consts.size() + m_y_consts.size() ) return m_y_consts[n-m_x_consts.size()]; return m_z_consts[n-m_x_consts.size()-m_y_consts.size()]; } ================================================ FILE: src/asp/IsisIO/RPNEquation.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_RPN_EQUATION__ #define __ASP_RPN_EQUATION__ // STL #include <vector> // ASP #include <asp/IsisIO/BaseEquation.h> namespace asp { // RPN Equation // .. is an equation defined by a string containing Reverse Polish // Notation (RPN) equation. // ex: 3 t + 4 t * sin * == sin(4t)*(3+t) // // Current supported commands // t (refers to the t this equation is evaluated with) // sin, cos, tan, abs // *, /, -, +, ^ // // Remember: Have your equation space delimited // Also: 'c' is an internal place holder for RPNEquation class RPNEquation : public BaseEquation { std::vector<std::string> m_x_eq; std::vector<double> m_x_consts; std::vector<std::string> m_y_eq; std::vector<double> m_y_consts; std::vector<std::string> m_z_eq; std::vector<double> m_z_consts; void update( double t ); void string_to_eqn( std::string const& str, std::vector<std::string>& commands, std::vector<double>& consts ); double evaluate( std::vector<std::string> const& commands, std::vector<double>& consts, double t ); public: RPNEquation(); RPNEquation( std::string const& x_eq, std::string const& y_eq, std::string const& z_eq ); std::string type() const { return "RPNEquation"; } size_t size() const { return m_x_consts.size() + m_y_consts.size() + m_z_consts.size(); } double& operator[]( size_t n ); void write( std::ofstream &f ); void read( std::ifstream &f ); }; } #endif//__ASP_RPN_EQUATION__ ================================================ FILE: src/asp/IsisIO/tests/TestEphemerisEquations.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <test/Helpers.h> #include <asp/IsisIO/PolyEquation.h> #include <asp/IsisIO/RPNEquation.h> using namespace vw; using namespace asp; double DELTA = 1e-6; TEST(EphemerisEquations, polynomial_equal_order) { PolyEquation poly(0); EXPECT_EQ( poly.size(), 3u ); EXPECT_EQ( poly.type(), "PolyEquation" ); poly[0] = 10; poly[1] = 1; poly[2] = 20; EXPECT_EQ( poly[0], 10 ); EXPECT_EQ( poly[1], 1 ); EXPECT_EQ( poly[2], 20 ); Vector3 test = poly(20); EXPECT_EQ( 10, test[0] ); EXPECT_EQ( 1, test[1] ); EXPECT_EQ( 20, test[2] ); poly[1] = -50; test = poly(-100); EXPECT_EQ( 10, test[0] ); EXPECT_EQ( -50, test[1] ); EXPECT_EQ( 20, test[2] ); PolyEquation poly2(1); EXPECT_EQ( poly2.size(), 6u ); poly2[0] = 10; poly2[1] = 0.5; poly2[2] = 5; poly2[3] = -0.5; poly2[4] = 0; poly2[5] = 6; test = poly2(20); EXPECT_EQ( 20, test[0] ); EXPECT_EQ( -5, test[1] ); EXPECT_EQ( 120, test[2] ); } TEST(EphemerisEquations, polynomial_variable_order) { PolyEquation poly(0,2,1); EXPECT_EQ( 6u, poly.size() ); EXPECT_EQ( poly.type(), "PolyEquation" ); poly[0] = 11; poly[1] = -5; poly[2] = 0.6; poly[3] = .1; poly[4] = -4; poly[5] = 2.5; EXPECT_EQ( -5, poly[1] ); Vector3 test = poly(-1.5); EXPECT_NEAR( 11, test[0], DELTA ); EXPECT_NEAR( -5.675, test[1], DELTA ); EXPECT_NEAR( -7.75, test[2], DELTA ); } TEST(EphemerisEquations, polynomial_defined_const) { Vector<double> x_coeff(1); x_coeff[0] = 11; Vector<double> y_coeff(3); y_coeff[0] = -5; y_coeff[1] = 0.6; y_coeff[2] = .1; Vector<double> z_coeff(2); z_coeff[0] = -4; z_coeff[1] = 2.5; PolyEquation poly(x_coeff, y_coeff, z_coeff); EXPECT_EQ( 6u, poly.size() ); EXPECT_EQ( poly.type(), "PolyEquation" ); EXPECT_EQ( -5, poly[1] ); Vector3 test = poly(-1.5); EXPECT_NEAR( 11, test[0], DELTA ); EXPECT_NEAR( -5.675, test[1], DELTA ); EXPECT_NEAR( -7.75, test[2], DELTA ); } TEST(EphemerisEquations, reversepolish) { std::string x_eq("3 t t * * 1 +"); std::string y_eq("t sin 4 * t +"); std::string z_eq("t t 2 * * 5 t / - abs"); RPNEquation rpn( x_eq, y_eq, z_eq ); EXPECT_EQ( 5u, rpn.size() ); EXPECT_EQ( "RPNEquation", rpn.type() ); Vector3 test = rpn(-1.5); EXPECT_NEAR( 7.75, test[0], DELTA ); EXPECT_NEAR( -5.48997994641622, test[1], DELTA ); EXPECT_NEAR( 7.8333333333, test[2], DELTA ); rpn[0] = 22; rpn[2] = 9; rpn[3] = 8; test = rpn(-1.5); EXPECT_NEAR( 50.5, test[0], DELTA ); EXPECT_NEAR( -10.4774548794365, test[1], DELTA ); EXPECT_NEAR( 21.333333333, test[2], DELTA ); rpn.set_time_offset( -20 ); EXPECT_EQ( -20, rpn.get_time_offset() ); test = rpn(-1.5); // like eval with 18.5 EXPECT_NEAR( 7530.5, test[0], DELTA ); EXPECT_NEAR( 15.4176744337735, test[1], DELTA ); EXPECT_NEAR( 2737.72972972973, test[2], DELTA ); } ================================================ FILE: src/asp/IsisIO/tests/TestIsisCameraModel.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <test/Helpers.h> #include <vw/Math/Vector.h> #include <vw/Core/Debugging.h> #include <asp/IsisIO/IsisCameraModel.h> #include <vw/Cartography/PointImageManipulation.h> #include <FileName.h> #include <CameraFactory.h> #include <TProjection.h> #include <ProjectionFactory.h> #include <Cube.h> #include <Camera.h> #include <Pvl.h> #include <AlphaCube.h> #include <CameraFocalPlaneMap.h> #include <CameraDetectorMap.h> #include <CameraDistortionMap.h> #include <Projection.h> #include <Distance.h> #include <boost/foreach.hpp> using namespace vw; using namespace vw::camera; double DELTA = 1e-8; Vector2 generate_random( int const& xsize, int const& ysize ) { Vector2 pixel; pixel[0] = rand() % ( 10 * xsize - 10 ) + 10; pixel[0] /= 10.0; pixel[1] = rand() % ( 10 * ysize - 10 ) + 10; pixel[1] /= 10.0; return pixel; } TEST(IsisCameraModel, mapprojected) { if (!asp::isis::IsisEnv()) { vw_out() << "ISISROOT or ISISDATA was not set. ISIS unit tests won't be run." << std::endl; return; } std::string file("E0201461.tiny.cub"); Isis::FileName cubefile( file.c_str() ); Isis::Pvl label; label.read( cubefile.expanded() ); Isis::Cube tempCube(cubefile.expanded()); Isis::Camera* cam = Isis::CameraFactory::Create( tempCube ); Isis::AlphaCube alphacube( tempCube ); Isis::TProjection* proj =(Isis::TProjection*)Isis::ProjectionFactory::CreateFromCube( label ); // This is testing the assumption that we don't need to invoke much // of the camera model to do a pixel to vector. srand( 42 ); // We only want repeatible pseudo random for ( size_t i = 0; i < 2; i++ ) { Vector2 pixel = generate_random( cam->Samples(), cam->Lines() ); Vector2 noise = generate_random( cam->Samples(), cam->Lines() ); proj->SetWorld( pixel[0], pixel[1] ); Vector3 lon_lat_radius( proj->UniversalLongitude(), proj->UniversalLatitude(), cam->LocalRadius( proj->UniversalLatitude(), proj->UniversalLongitude() ).meters() ); cam->SetImage( noise[0], noise[1] ); cam->SetUniversalGround( lon_lat_radius[1], lon_lat_radius[0], lon_lat_radius[2] ); EXPECT_VECTOR_NEAR( Vector2(cam->Sample(),cam->Line()), pixel, 1e-3 ); double ip[3]; cam->instrumentPosition( ip ); VectorProxy<double,3> instru( ip ); double bc[3]; cam->Coordinate( bc ); VectorProxy<double,3> coord( bc ); Vector3 alt = cartography::lon_lat_radius_to_xyz_estimate( lon_lat_radius ); // INACCURATE Vector3 dir = normalize( alt - instru ); Vector3 new_point = instru*1000+50000*dir; new_point /= 1000; } delete cam; delete proj; } TEST(IsisCameraModel, groundmap_chk) { // Run two methods .. // solve for vector out with and without the groundmap solution // prove that they get the same values if (!asp::isis::IsisEnv()) { vw_out() << "ISISROOT or ISISDATA was not set. ISIS unit tests won't be run." << std::endl; return; } std::vector<std::string> files; files.push_back("E1701676.reduce.cub"); // Linescan files.push_back("5165r.cub"); // Frame files.push_back("5165r.map.cub"); files.push_back("E0201461.tiny.cub"); for ( size_t j = 0; j < files.size(); j++ ) { vw_out() << "File: " << files[j] << "\n"; vw_out() << "------------------------------------\n"; Isis::FileName cubefile( files[j].c_str() ); Isis::Pvl label; label.read( cubefile.expanded() ); Isis::Cube tempCube(cubefile.expanded()); Isis::Camera* cam = Isis::CameraFactory::Create( tempCube ); Isis::AlphaCube alphacube( tempCube ); vw_out() << "CameraType: " << cam->GetCameraType() << "\n"; double m_delta = 1e-8; if ( cam->HasProjection() ) m_delta = 2e-2; // Cameras and Projections don't always line up // Ripping out the parts of the Camera Model Isis::CameraDistortionMap* distortmap = cam->DistortionMap(); Isis::CameraFocalPlaneMap* focalmap = cam->FocalPlaneMap(); Isis::CameraDetectorMap* detectmap = cam->DetectorMap(); // Building test set std::vector<Vector2> pixel_sets; srand( 42 ); for ( size_t i = 0; i < 1000; i++ ) { Vector2 pixel = generate_random( cam->Samples(), cam->Lines() ); pixel_sets.push_back(pixel); } std::vector<Vector3> g_solution_sets, nog_solution_sets; Timer *t = new Timer("No GroundMap Solution"); for ( size_t i = 0; i < pixel_sets.size(); i++ ) { Vector2 pixel = pixel_sets[i]; Vector3 nog_solution; // No Ground Map Solution detectmap->SetParent( alphacube.AlphaSample(pixel[0]), alphacube.AlphaLine(pixel[1]) ); focalmap->SetDetector( detectmap->DetectorSample(), detectmap->DetectorLine() ); distortmap->SetFocalPlane( focalmap->FocalPlaneX(), focalmap->FocalPlaneY() ); nog_solution[0] = distortmap->UndistortedFocalPlaneX(); nog_solution[1] = distortmap->UndistortedFocalPlaneY(); nog_solution[2] = distortmap->UndistortedFocalPlaneZ(); nog_solution /= norm_2(nog_solution); std::vector<double> lookC(3); // Should make fancy func for std vec and vec std::copy( nog_solution.begin(), nog_solution.end(), lookC.begin() ); std::vector<double> lookJ = cam->instrumentRotation()->J2000Vector(lookC); lookC = cam->bodyRotation()->ReferenceVector(lookJ); std::copy( lookC.begin(), lookC.end(), nog_solution.begin() ); nog_solution_sets.push_back(nog_solution); } delete(t); t = new Timer("Ground Map Solution:"); for ( size_t i = 0; i < pixel_sets.size(); i++ ) { Vector2 pixel = pixel_sets[i]; Vector3 g_solution; // Ground Map Solution cam->SetImage(pixel[0],pixel[1]); double p[3]; cam->instrumentPosition(p); Vector3 instrument( p[0], p[1], p[2] ); cam->Coordinate(p); Vector3 ground( p[0], p[1], p[2] ); g_solution = normalize( ground - instrument ); g_solution_sets.push_back(g_solution); } delete t; for ( size_t i = 0; i < pixel_sets.size(); i++ ) EXPECT_VECTOR_NEAR( nog_solution_sets[i], g_solution_sets[i], m_delta ); } } TEST(IsisCameraModel, camera_model) { if (!asp::isis::IsisEnv()) { vw_out() << "ISISROOT or ISISDATA was not set. ISIS unit tests won't be run." << std::endl; return; } // Circle Check std::vector<std::string> files; files.push_back("E1701676.reduce.cub"); files.push_back("5165r.cub"); files.push_back("E0201461.tiny.cub"); // Map Projected files.push_back("5165r.map.cub"); srand( 42 ); BOOST_FOREACH( std::string const& cube, files ) { IsisCameraModel cam(cube); vw_out() << "File: " << cube << "\n"; vw_out() << "------------------------------------\n"; Timer t(cube+"'s time: "); for ( size_t i = 0; i < 2; i++ ) { Vector2 pixel = generate_random( cam.samples(), cam.lines() ); Vector3 point = cam.pixel_to_vector( pixel ); for ( size_t k = 0; k < 2; k++ ) { // Apply noise to make sure we are not using stored values Vector2 noise = generate_random( cam.samples(), cam.lines() ); } point *= 70000; // 70 km below point += cam.camera_center( pixel ); for ( size_t k = 0; k < 2; k++ ) { // Apply noise to make sure we are not using stored values Vector2 noise = generate_random( cam.samples(), cam.lines() ); } Vector2 rpixel = cam.point_to_pixel( point ); EXPECT_VECTOR_NEAR( pixel, rpixel, 0.02 ); EXPECT_TRUE( cam.ephemeris_time(Vector2()) ); } EXPECT_TRUE( cam.sun_position() != Vector3() ); EXPECT_TRUE( cam.target_radii() != Vector3() ); EXPECT_GT( cam.target_radii()[0], 0 ); EXPECT_GT( cam.target_radii()[1], 0 ); EXPECT_GT( cam.target_radii()[2], 0 ); Vector2 center_pixel( cam.lines(), cam.samples() ); center_pixel /= 2; Quat center_pose = cam.camera_pose(center_pixel); double angle_from_z = acos(dot_prod(Vector3(0,0,1),inverse(center_pose).rotate(cam.pixel_to_vector(center_pixel)))); EXPECT_LT( angle_from_z, 0.5 ); } } ================================================ FILE: src/asp/OpenMVG/CMakeLists.txt ================================================ add_library_wrapper(AspOpenMvg "${ASP_OPENMVG_SRC_FILES}" "${ASP_OPENMVG_TEST_FILES}" "${ASP_OPENMVG_LIB_DEPENDENCIES}") ================================================ FILE: src/asp/OpenMVG/README.md ================================================ This has several small utilities copied from the OpenMVG project. ================================================ FILE: src/asp/OpenMVG/flat_pair_map.hpp ================================================ // Copyright (c) 2012-2016 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_FLAT_PAIR_MAP_HPP #define OPENMVG_FLAT_PAIR_MAP_HPP #include <algorithm> #include <utility> #include <vector> namespace aspOpenMVG { /// Lightweight copy of the flat_map of BOOST library /// Use a vector to speed up insertion (preallocated array) template<typename T1, typename T2> class flat_pair_map { using P = std::pair<T1, T2>; public: using iterator = typename std::vector< P >::iterator; typename std::vector< P >::iterator find(const T1 & val) { return std::lower_bound(m_vec.begin(), m_vec.end(), val, superiorToFirst); } T2 & operator[](const T1 & val) { return std::lower_bound(m_vec.begin(), m_vec.end(), val, superiorToFirst)->second; } void sort() { std::sort(m_vec.begin(), m_vec.end(), sortPairAscend);} void push_back(const P & val) { m_vec.push_back(val);} void clear() { m_vec.clear();} void reserve(size_t count) { m_vec.reserve(count);} template< class... Args > void emplace_back( Args&&... args ) { m_vec.emplace_back(std::forward<Args>(args)...); } size_t size() const { return m_vec.size();} const P& operator[](std::size_t idx) const { return m_vec[idx];} private: std::vector< P > m_vec; static bool sortPairAscend(const P &a, const P &b) {return a.first<b.first;} static bool superiorToFirst(const P &a, const T1 &b) {return a.first<b;} }; } // namespace aspOpenMVG #endif // OPENMVG_FLAT_PAIR_MAP_HPP ================================================ FILE: src/asp/OpenMVG/indMatch.hpp ================================================ // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_MATCHING_IND_MATCH_HPP #define OPENMVG_MATCHING_IND_MATCH_HPP #include <asp/OpenMVG/types.hpp> //#include <cereal/cereal.hpp> // Serialization #include <iostream> #include <map> #include <set> #include <vector> namespace aspOpenMVG { namespace matching { /// Structure in order to save pairwise indexed references. /// A sort operator exist in order to remove duplicates of IndMatch series. struct IndMatch { IndMatch(IndexT i = 0, IndexT j = 0) : i_(i), j_(j) {} friend bool operator==(const IndMatch& m1, const IndMatch& m2) { return (m1.i_ == m2.i_ && m1.j_ == m2.j_); } friend bool operator!=(const IndMatch& m1, const IndMatch& m2) { return !(m1 == m2); } // Lexicographical ordering of matches. Used to remove duplicates friend bool operator<(const IndMatch& m1, const IndMatch& m2) { return (m1.i_ < m2.i_ || (m1.i_ == m2.i_ && m1.j_ < m2.j_)); } /// Remove duplicates ((i_, j_) that appears multiple times) static bool getDeduplicated(std::vector<IndMatch> & vec_match) { const size_t sizeBefore = vec_match.size(); const std::set<IndMatch> set_deduplicated( vec_match.begin(), vec_match.end()); vec_match.assign(set_deduplicated.begin(), set_deduplicated.end()); return sizeBefore != vec_match.size(); } // Serialization template <class Archive> void serialize( Archive & ar ) { ar(i_, j_); } IndexT i_, j_; // Left, right index }; inline std::ostream& operator<<(std::ostream & out, const IndMatch & obj) { return out << obj.i_ << " " << obj.j_; } inline std::istream& operator>>(std::istream & in, IndMatch & obj) { return in >> obj.i_ >> obj.j_; } using IndMatches = std::vector<matching::IndMatch>; /// Pairwise matches (indexed matches for a pair <I,J>) /// The interface used to store corresponding point indexes per images pairs class PairWiseMatchesContainer { public: virtual ~PairWiseMatchesContainer() {} virtual void insert(std::pair<Pair, IndMatches>&& pairWiseMatches) = 0; }; //-- /// Pairwise matches (indexed matches for a pair <I,J>) /// A structure used to store corresponding point indexes per images pairs struct PairWiseMatches : public PairWiseMatchesContainer, public std::map< Pair, IndMatches > { void insert(std::pair<Pair, IndMatches> && pairWiseMatches)override { std::map< Pair, IndMatches >::insert( std::forward<std::pair<Pair, IndMatches>>(pairWiseMatches)); } // Serialization template <class Archive> void serialize( Archive & ar ) { ar(static_cast<std::map< Pair, IndMatches >&>(*this)); } }; inline Pair_Set getPairs(const PairWiseMatches & matches) { Pair_Set pairs; for ( const auto & cur_pair : matches ) pairs.insert(cur_pair.first); return pairs; } } // namespace matching } // namespace aspOpenMVG // namespace cereal // { // // This struct specialization will tell cereal which is the right way to serialize PairWiseMatches // template <class Archive> // struct specialize< // Archive, // aspOpenMVG::matching::PairWiseMatches, // cereal::specialization::member_serialize> // {}; // } // namespace cereal #endif // OPENMVG_MATCHING_IND_MATCH_HPP ================================================ FILE: src/asp/OpenMVG/numeric.cpp ================================================ // Copyright (c) 2007, 2008 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #include <asp/OpenMVG/numeric.h> #include <fstream> namespace aspOpenMVG { Mat3 CrossProductMatrix(const Vec3 &x) { Mat3 X; X << 0, -x(2), x(1), x(2), 0, -x(0), -x(1), x(0), 0; return X; } Mat3 RotationAroundX(double angle) { return Eigen::AngleAxisd(angle, Vec3::UnitX()).toRotationMatrix(); } Mat3 RotationAroundY(double angle) { return Eigen::AngleAxisd(angle, Vec3::UnitY()).toRotationMatrix(); } Mat3 RotationAroundZ(double angle) { return Eigen::AngleAxisd(angle, Vec3::UnitZ()).toRotationMatrix(); } double getRotationMagnitude(const Mat3 & R2) { const Mat3 R1 = Mat3::Identity(); double cos_theta = (R1.array() * R2.array()).sum() / 3.0; cos_theta = clamp(cos_theta, -1.0, 1.0); return std::acos(cos_theta); } Mat3 LookAt(const Vec3 ¢er, const Vec3 & up) { Vec3 zc = center.normalized(); Vec3 xc = up.cross(zc).normalized(); Vec3 yc = zc.cross(xc); Mat3 R; R.row(0) = xc; R.row(1) = yc; R.row(2) = zc; return R; } //eyePosition3D is a XYZ position. This is where you are (your eye is). //center3D is the XYZ position where you want to look at. //upVector3D is a XYZ normalized vector. Quite often 0.0, 1.0, 0.0 Mat3 LookAt2(const Vec3 &eyePosition3D, const Vec3 ¢er3D, const Vec3 &upVector3D ) { Vec3 forward, side, up; Mat3 matrix2, resultMatrix; //------------------ forward = center3D - eyePosition3D; forward.normalize(); //------------------ //Side = forward x up //ComputeNormalOfPlane(side, forward, upVector3D); side[0]=(forward[1]*upVector3D[2])-(forward[2]*upVector3D[1]); side[1]=(forward[2]*upVector3D[0])-(forward[0]*upVector3D[2]); side[2]=(forward[0]*upVector3D[1])-(forward[1]*upVector3D[0]); side.normalize(); //------------------ //Recompute up as: up = side x forward //ComputeNormalOfPlane(up, side, forward); up[0]=(side[1]*forward[2])-(side[2]*forward[1]); up[1]=(side[2]*forward[0])-(side[0]*forward[2]); up[2]=(side[0]*forward[1])-(side[1]*forward[0]); //------------------ matrix2(0) = side[0]; matrix2(1) = side[1]; matrix2(2) = side[2]; //------------------ matrix2(3) = up[0]; matrix2(4) = up[1]; matrix2(5) = up[2]; //------------------ matrix2(6) = -forward[0]; matrix2(7) = -forward[1]; matrix2(8) = -forward[2]; return matrix2; } void MeanAndVarianceAlongRows(const Mat &A, Vec *mean_pointer, Vec *variance_pointer) { const Mat::Index n = A.rows(); const double m = static_cast<double>(A.cols()); (*mean_pointer) = Vec::Zero(n); (*variance_pointer) = Vec::Zero(n); for (Mat::Index i = 0; i < n; ++i) { (*mean_pointer)(i) += A.row(i).array().sum(); (*variance_pointer)(i) += (A.row(i).array() * A.row(i).array()).array().sum(); } (*mean_pointer) /= m; for (Mat::Index i = 0; i < n; ++i) { (*variance_pointer)(i) = (*variance_pointer)(i) / m - Square((*mean_pointer)(i)); } } bool exportMatToTextFile(const Mat & mat, const std::string & filename, const std::string & sPrefix) { bool bOk = false; std::ofstream outfile; outfile.open(filename.c_str(), std::ios_base::out); if (outfile.is_open()) { outfile << sPrefix << "=[" << std::endl; for (int j=0; j < mat.rows(); ++j) { for (int i=0; i < mat.cols(); ++i) { outfile << mat(j,i) << " "; } outfile << ";\n"; } outfile << "];"; bOk = true; } outfile.close(); return bOk; } } // namespace aspOpenMVG ================================================ FILE: src/asp/OpenMVG/numeric.h ================================================ // Copyright (c) 2007, 2008 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_NUMERIC_NUMERIC_H #define OPENMVG_NUMERIC_NUMERIC_H //-- // Eigen // http://eigen.tuxfamily.org/dox-devel/QuickRefPage.html //-- #include <Eigen/Core> #include <Eigen/Eigenvalues> #include <Eigen/Geometry> #include <Eigen/LU> #include <Eigen/QR> #include <Eigen/SparseCore> #include <Eigen/StdVector> #include <Eigen/SVD> #include <cmath> #include <iostream> #include <numeric> #include <string> #include <vector> namespace aspOpenMVG { // Check MSVC #if _WIN32 || _WIN64 #if _WIN64 #define ENV64BIT #else #define ENV32BIT #endif #endif // Check GCC #if __GNUC__ #if __x86_64__ || __ppc64__ || _LP64 #define ENV64BIT #else #define ENV32BIT #endif #endif using Eigen::Map; /// Trait used for double type using EigenDoubleTraits = Eigen::NumTraits<double>; /// 3d vector using double internal format using Vec3 = Eigen::Vector3d; /// 2d vector using int internal format using Vec2i = Eigen::Vector2i; /// 2d vector using float internal format using Vec2f = Eigen::Vector2f; /// 3d vector using float internal format using Vec3f =Eigen::Vector3f; /// 9d vector using double internal format using Vec9 = Eigen::Matrix<double, 9, 1>; /// Quaternion type using Quaternion = Eigen::Quaternion<double>; /// 3x3 matrix using double internal format using Mat3 = Eigen::Matrix<double, 3, 3>; #if defined(ENV32BIT) /// 3x4 matrix using double internal format using Mat34 = Eigen::Matrix<double, 3, 4, Eigen::DontAlign>; /// 2d vector using double internal format using Vec2 = Eigen::Matrix<double, 2, 1, Eigen::DontAlign>; /// 4d vector using double internal format using Vec4 = Eigen::Matrix<double, 4, 1, Eigen::DontAlign>; /// 6d vector using double internal format using Vec6 = Eigen::Matrix<double, 6, 1, Eigen::DontAlign>; #else // 64 bits compiler /// 3x4 matrix using double internal format using Mat34 = Eigen::Matrix<double, 3, 4>; /// 2d vector using double internal format using Vec2 = Eigen::Vector2d; /// 4d vector using double internal format using Vec4 = Eigen::Vector4d; /// 6d vector using double internal format using Vec6 = Eigen::Matrix<double, 6, 1>; #endif /// 4x4 matrix using double internal format using Mat4 = Eigen::Matrix<double, 4, 4>; /// generic matrix using unsigned int internal format using Matu = Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic>; /// 3x3 matrix using double internal format with RowMajor storage using RMat3 = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>; //-- General purpose Matrix and Vector /// Unconstrained matrix using double internal format using Mat = Eigen::MatrixXd; /// Unconstrained vector using double internal format using Vec = Eigen::VectorXd; /// Unconstrained vector using unsigned int internal format using Vecu = Eigen::Matrix<unsigned int, Eigen::Dynamic, 1>; /// Unconstrained matrix using float internal format using Matf = Eigen::MatrixXf; /// Unconstrained vector using float internal format using Vecf = Eigen::VectorXf; /// 2xN matrix using double internal format using Mat2X = Eigen::Matrix<double, 2, Eigen::Dynamic>; /// 3xN matrix using double internal format using Mat3X = Eigen::Matrix<double, 3, Eigen::Dynamic>; /// 4xN matrix using double internal format using Mat4X = Eigen::Matrix<double, 4, Eigen::Dynamic>; /// 9xN matrix using double internal format using MatX9 = Eigen::Matrix<double, Eigen::Dynamic, 9>; //-- Sparse Matrix (Column major, and row major) /// Sparse unconstrained matrix using double internal format using sMat = Eigen::SparseMatrix<double>; /// Sparse unconstrained matrix using double internal format and Row Major storage using sRMat = Eigen::SparseMatrix<double, Eigen::RowMajor>; //-------------- //-- Function -- //-------------- /** * @brief Compute square of a number * @tparam T Type of the number to square * @param x Input number * @return square of x */ template<typename T> inline T Square( T x ) { return x * x; } /** * @brief Clamp value inside a given range * @tparam T working type * @param val Value to clamp * @param min Lower bound of clamping range * @param max Upper bound od clamping range * @return clamped value * @note Assuming range form a valid range (ie: min <= max ) */ template<typename T> inline T clamp( const T & val, const T& min, const T & max ) { return std::max( min, std::min( val, max ) ); //(val < min) ? val : ((val>max) ? val : max); } /** * @brief Given a vector, computes it's cross product matrix * * Cross product matrix is a helper matrix used to express cross product as a multiplication matrix \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 * \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$ * * where \f$\begin{pmatrix}a\end{pmatrix}_{\times}\f$ is the cross product matrix of a. * * @param x Input vector * @return Cross product matrix of a input vector */ Mat3 CrossProductMatrix( const Vec3 &x ); /** * @brief Compute rotation matrix around X-axis * @param angle Angle of rotation in radian * @return Rotation matrix of given magnitude */ Mat3 RotationAroundX( double angle ); /** * @brief Compute rotation matrix around Y-axis * @param angle Angle of rotation in radian * @return Rotation matrix of given magnitude */ Mat3 RotationAroundY( double angle ); /** * @brief Compute rotation matrix around Z-axis * @param angle Angle sof rotation in radian * @return Rotation matrix of given magnitude */ Mat3 RotationAroundZ( double angle ); /** * @brief Convert an angle from degree to radian * @param degree Angle in degree * @return Same angle in radian * @note Assuming input angle is in range [0;360] */ inline double D2R( double degree ) { return degree * M_PI / 180.0; } /** * @brief Convert an angle from radian to degree * @param radian Angle in radian * @return Same angle in degree * @note Assuming input angle in range [0;2Pi] */ inline double R2D( double radian ) { return radian / M_PI * 180.0; } /** * @brief Compute mean rotation magnitude of the given rotation matrix * @param R2 Input rotation matrix * @return magnitude of the rotation (in radian) * @note Assuming R2 is a correct rotation matrix * @note Mean is computed using the matrix column dot products to an Identity matrix */ double getRotationMagnitude( const Mat3 & R2 ); /** * @brief Gives an indication of the sign of the input value * @param x Value to test * @retval 1.0 if value is nul or positive * @retval -1.0 if value is negative */ inline double SIGN( double x ) { return x < 0.0 ? -1.0 : 1.0; } /** * @brief Compute L infinity norm * \f$ \| v \|_{\infty} = \max ( |v_0| , |v_1| , \dots , |v_n| ) \f$ * @param x Input vector * @return L infinity norm of input vector */ template<typename TVec> inline double NormLInfinity( const TVec &x ) { return x.array().abs().maxCoeff(); } /** * @brief Compute L infinity distance between two vectors * @param x first vector * @param y second vector * @return distance between input vectors using L infinity norm */ template<typename TVec> inline double DistanceLInfinity( const TVec &x, const TVec &y ) { return NormLInfinity( x - y ); } /** * @brief Solve linear system * * Linear system is given by : \n * \f$ A x = 0 \f$ * Solution is found using the constraint on x : \f$ \| x \| = 1 \f$ * * @param[in,out] A Input matrix storing the system to solve * @param[out] nullspace result vector containing the solution of the system * @return Singular value corresponding to the solution of the system * * @note Computation is made using SVD decomposition of input matrix * @note Input matrix A content may be modified during computation * @note Input vector nullspace may be resized to store the full result */ template <typename TMat, typename TVec> double Nullspace( TMat *A, TVec *nullspace ) { if ( A->rows() >= A->cols() ) { Eigen::JacobiSVD<TMat> svd( *A, Eigen::ComputeFullV ); ( *nullspace ) = svd.matrixV().col( A->cols() - 1 ); return svd.singularValues()( A->cols() - 1 ); } // Extend A with rows of zeros to make it square. It's a hack, but is // necessary until Eigen supports SVD with more columns than rows. TMat A_extended( A->cols(), A->cols() ); A_extended.block( A->rows(), 0, A->cols() - A->rows(), A->cols() ).setZero(); A_extended.block( 0, 0, A->rows(), A->cols() ) = ( *A ); return Nullspace( &A_extended, nullspace ); } /** * @brief Solve linear system and gives the two best solutions * * Linear system is given by : \n * \f$ A x = 0 \f$ * Solution is found using the constraint on x : \f$ \| x \| = 1 \f$ * * @param[in,out] A Input matrix storing the system to solve * @param[out] x1 result vector containing the best solution of the system * @param[out] x2 result vector containing the second best solution of the system * @return Singular value corresponding to the best solution of the system * * @note Computation is made using SVD decomposition of input matrix * @note Input matrix A content may be modified during computation * @note Input vector nullspace may be resized to store the full result */ template <typename TMat, typename TVec1, typename TVec2> inline double Nullspace2( TMat *A, TVec1 *x1, TVec2 *x2 ) { if ( A->rows() >= A->cols() ) { Eigen::JacobiSVD<TMat> svd( *A, Eigen::ComputeFullV ); TMat V = svd.matrixV(); *x1 = V.col( A->cols() - 1 ); *x2 = V.col( A->cols() - 2 ); return svd.singularValues()( A->cols() - 1 ); } // Extend A with rows of zeros to make it square. It's a hack, but is // necessary until Eigen supports SVD with more columns than rows. TMat A_extended( A->cols(), A->cols() ); A_extended.block( A->rows(), 0, A->cols() - A->rows(), A->cols() ).setZero(); A_extended.block( 0, 0, A->rows(), A->cols() ) = ( *A ); return Nullspace2( &A_extended, x1, x2 ); } /** * @brief Compute look at matrix * Make a rotation matrix such that center becomes the direction of the * positive z-axis, and y is oriented close to up by default. * @param center New direction (z-axis) * @param up Desired up vector (y-axis) * @return Rotation matrix */ Mat3 LookAt( const Vec3 ¢er, const Vec3 & up = Vec3::UnitY() ); /** * @brief Compute generic look at matrix * @param eyePosition3D New center of rotation * @param center3D Position where matrix look at (center3D-eyePosition3D forms the new z-axis) * @param upVector3D Desired up vector (y-axis) * @return Rotation matrix conforming the given parameters */ Mat3 LookAt2( const Vec3 &eyePosition3D, const Vec3 ¢er3D = Vec3::Zero(), const Vec3 &upVector3D = Vec3::UnitY() ); #define SUM_OR_DYNAMIC(x,y) (x==Eigen::Dynamic||y==Eigen::Dynamic)?Eigen::Dynamic:(x+y) template<typename Derived1, typename Derived2> struct hstack_return { using Scalar =typename Derived1::Scalar; enum { RowsAtCompileTime = Derived1::RowsAtCompileTime, ColsAtCompileTime = SUM_OR_DYNAMIC( Derived1::ColsAtCompileTime, Derived2::ColsAtCompileTime ), Options = Derived1::Flags & Eigen::RowMajorBit ? Eigen::RowMajor : 0, MaxRowsAtCompileTime = Derived1::MaxRowsAtCompileTime, MaxColsAtCompileTime = SUM_OR_DYNAMIC( Derived1::MaxColsAtCompileTime, Derived2::MaxColsAtCompileTime ) }; using type = Eigen::Matrix< Scalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime>; }; template<typename Derived1, typename Derived2> typename hstack_return<Derived1, Derived2>::type HStack ( const Eigen::MatrixBase<Derived1>& lhs, const Eigen::MatrixBase<Derived2>& rhs ) { typename hstack_return<Derived1, Derived2>::type res; res.resize( lhs.rows(), lhs.cols() + rhs.cols() ); res << lhs, rhs; return res; } template<typename Derived1, typename Derived2> struct vstack_return { using Scalar = typename Derived1::Scalar; enum { RowsAtCompileTime = SUM_OR_DYNAMIC( Derived1::RowsAtCompileTime, Derived2::RowsAtCompileTime ), ColsAtCompileTime = Derived1::ColsAtCompileTime, Options = Derived1::Flags & Eigen::RowMajorBit ? Eigen::RowMajor : 0, MaxRowsAtCompileTime = SUM_OR_DYNAMIC( Derived1::MaxRowsAtCompileTime, Derived2::MaxRowsAtCompileTime ), MaxColsAtCompileTime = Derived1::MaxColsAtCompileTime }; using type = Eigen::Matrix< Scalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime>; }; template<typename Derived1, typename Derived2> typename vstack_return<Derived1, Derived2>::type VStack ( const Eigen::MatrixBase<Derived1>& lhs, const Eigen::MatrixBase<Derived2>& rhs ) { typename vstack_return<Derived1, Derived2>::type res; res.resize( lhs.rows() + rhs.rows(), lhs.cols() ); res << lhs, rhs; return res; } #undef SUM_OR_DYNAMIC /** * @brief Compute Frobenius norm * \f$ \| A \|_2 = \sqrt{ \sum_{i=1}^n \sum_{j=0}^m a_{ij}^2 } \f$ * @param Input A input matrix * @return Frobenius norm of given matrix */ template<typename TMat> inline double FrobeniusNorm( const TMat &A ) { return sqrt( A.array().abs2().sum() ); } /** * @brief Compute distance between two matrices using Frobenius norm * @param A first matrix * @param B second matrix * @return Distance between the input matrices given Frobenius norm */ template<typename TMat> inline double FrobeniusDistance( const TMat &A, const TMat &B ) { return FrobeniusNorm( A - B ); } /** * @brief Compute similarity of matrices given cosine similarity mesure * \f$ \cos( A , B ) = \frac{ A . B }{ \| A \|_2 \| B \|_2 } \f$ * @param a First matrix * @param b Second matrix * @return cosine similarity mesure between the input matrices */ template<class TMat> double CosinusBetweenMatrices( const TMat &a, const TMat &b ) { return ( a.array() * b.array() ).sum() / FrobeniusNorm( a ) / FrobeniusNorm( b ); } /** * @brief Extract a submatrix given a list of column * @param A Input matrix * @param columns A vector of columns index to extract * @return Matrix containing a subset of input matrix columns * @note columns index start at index 0 * @note Assuming columns contains a list of valid columns index */ template <typename TMat, typename TCols> TMat ExtractColumns( const TMat &A, const TCols &columns ) { TMat compressed( A.rows(), columns.size() ); for ( size_t i = 0; i < static_cast<size_t>( columns.size() ); ++i ) { compressed.col( i ) = A.col( columns[i] ); } return compressed; } /** * @brief Compute per row mean and variance * @param A input matrix * @param[out] mean_pointer a pointer to a vector where mean values are stored * @param[out] variance_pointer a pointer to a vector where variance values are stored * @note mean_pointer and variance_pointer vector may be resized to store all values */ void MeanAndVarianceAlongRows( const Mat &A, Vec *mean_pointer, Vec *variance_pointer ); /** * @brief Export a matrix to a file in Text mode * @param mat Matrix to export * @param filename Path to the file where matrix will be written * @param sPrefix Prefix before content of the matrix * @retval true if export is correct * @retval false if there was an error during export */ bool exportMatToTextFile( const Mat & mat, const std::string & filename, const std::string & sPrefix = "A" ); /** * @brief Test if value is a finite one * @param val Input parameter * @retval 0 if input is not a finite one * @retval non-zero value if input is a finite one */ inline int is_finite( const double val ) { #ifdef _MSC_VER return _finite( val ); #else return std::isfinite( val ); #endif } /** * @brief Compute min, max, mean and median value a a given range * @param begin start computation iterator * @param end end computation iterator * @param[out] min Minimum value of range * @param[out] max Maximum value of range * @param[out] mean Mean value of range * @param[out] median Median value of range * @return true if the statistical values can be estimated */ template <typename Type, typename DataInputIterator> bool minMaxMeanMedian( DataInputIterator begin, DataInputIterator end, Type & min, Type & max, Type & mean, Type & median ) { if( std::distance( begin, end ) < 1 ) { return false; } std::vector<Type> vec_val( begin, end ); std::sort( vec_val.begin(), vec_val.end() ); min = vec_val[0]; max = vec_val[vec_val.size() - 1]; mean = accumulate( vec_val.begin(), vec_val.end(), Type( 0 ) ) / static_cast<Type>( vec_val.size() ); median = vec_val[vec_val.size() / 2]; return true; } /** * @brief Display to standard output min, max, mean and median value of input range * @param begin start of range * @param end end of range */ template <typename Type, typename DataInputIterator> void minMaxMeanMedian( DataInputIterator begin, DataInputIterator end ) { Type min, max, mean, median; minMaxMeanMedian( begin, end, min, max, mean, median ); std::cout << "\n" << "\t min: " << min << "\n" << "\t mean: " << mean << "\n" << "\t median: " << median << std::endl << "\t max: " << max << std::endl; } /** ** Split a range [ a ; b [ into a set of n ranges : [ a ; c1 [ U [ c1 ; c2 [ U ... U [ c(n-1) ; b [ ** Output range vector only store [ a , c1 , c2 , ... , b ] ** if input range can't be split (range [a;b[ size is less than nb_split, only return [a;b[ range ** ** @param range_start Start of range to split ** @param range_end End of range to split ** @param nb_split Number of desired split ** @param d_range Output splitted range **/ template < typename T > void SplitRange( const T range_start , const T range_end , const int nb_split , std::vector< T > & d_range ) { const T range_length = range_end - range_start ; if( range_length < nb_split ) { d_range.push_back( range_start ) ; d_range.push_back( range_end ) ; } else { const T delta_range = range_length / nb_split ; d_range.push_back( range_start ) ; for( int i = 1 ; i < nb_split ; ++i ) { d_range.push_back( range_start + i * delta_range ) ; } d_range.push_back( range_end ) ; } } } // namespace aspOpenMVG #endif // OPENMVG_NUMERIC_NUMERIC_H ================================================ FILE: src/asp/OpenMVG/projection.cpp ================================================ // Copyright (c) 2010 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #include <asp/OpenMVG/projection.hpp> namespace aspOpenMVG { /// Compute P = K[R|t] void P_From_KRt( const Mat3 &K, const Mat3 &R, const Vec3 &t, Mat34 *P) { *P = K * HStack(R,t); } void KRt_From_P(const Mat34 &P, Mat3 *Kp, Mat3 *Rp, Vec3 *tp) { // Decompose using the RQ decomposition HZ A4.1.1 pag.579. Mat3 K = P.block(0, 0, 3, 3); Mat3 Q; Q.setIdentity(); // Set K(2,1) to zero. if (K(2,1) != 0) { double c = -K(2,2); double s = K(2,1); double l = sqrt(c * c + s * s); c /= l; s /= l; Mat3 Qx; Qx << 1, 0, 0, 0, c, -s, 0, s, c; K = K * Qx; Q = Qx.transpose() * Q; } // Set K(2,0) to zero. if (K(2,0) != 0) { double c = K(2,2); double s = K(2,0); double l = sqrt(c * c + s * s); c /= l; s /= l; Mat3 Qy; Qy << c, 0, s, 0, 1, 0, -s, 0, c; K = K * Qy; Q = Qy.transpose() * Q; } // Set K(1,0) to zero. if (K(1,0) != 0) { double c = -K(1,1); double s = K(1,0); double l = sqrt(c * c + s * s); c /= l; s /= l; Mat3 Qz; Qz << c,-s, 0, s, c, 0, 0, 0, 1; K = K * Qz; Q = Qz.transpose() * Q; } Mat3 R = Q; //Mat3 H = P.block(0, 0, 3, 3); // RQ decomposition //Eigen::HouseholderQR<Mat3> qr(H); //Mat3 K = qr.matrixQR().triangularView<Eigen::Upper>(); //Mat3 R = qr.householderQ(); // Ensure that the diagonal is positive and R determinant == 1. if (K(2,2) < 0) { K = -K; R = -R; } if (K(1,1) < 0) { Mat3 S; S << 1, 0, 0, 0,-1, 0, 0, 0, 1; K = K * S; R = S * R; } if (K(0,0) < 0) { Mat3 S; S << -1, 0, 0, 0, 1, 0, 0, 0, 1; K = K * S; R = S * R; } // Compute translation. Eigen::PartialPivLU<Mat3> lu(K); Vec3 t = lu.solve(P.col(3)); if(R.determinant()<0) { R = -R; t = -t; } // scale K so that K(2,2) = 1 K = K / K(2,2); *Kp = K; *Rp = R; *tp = t; } Mat3 F_from_P(const Mat34 & P1, const Mat34 & P2) { Mat3 F12; using Mat24 = Eigen::Matrix<double, 2, 4>; Mat24 X1 = P1.block<2, 4>(1, 0); Mat24 X2; X2 << P1.row(2), P1.row(0); Mat24 X3 = P1.block<2, 4>(0, 0); Mat24 Y1 = P2.block<2, 4>(1, 0); Mat24 Y2; Y2 << P2.row(2), P2.row(0); Mat24 Y3 = P2.block<2, 4>(0, 0); Mat4 X1Y1, X2Y1, X3Y1, X1Y2, X2Y2, X3Y2, X1Y3, X2Y3, X3Y3; X1Y1 << X1, Y1; X2Y1 << X2, Y1; X3Y1 << X3, Y1; X1Y2 << X1, Y2; X2Y2 << X2, Y2; X3Y2 << X3, Y2; X1Y3 << X1, Y3; X2Y3 << X2, Y3; X3Y3 << X3, Y3; F12 << X1Y1.determinant(), X2Y1.determinant(), X3Y1.determinant(), X1Y2.determinant(), X2Y2.determinant(), X3Y2.determinant(), X1Y3.determinant(), X2Y3.determinant(), X3Y3.determinant(); return F12; } Vec2 Project(const Mat34 &P, const Vec3 &X) { return Vec3(P * X.homogeneous()).hnormalized(); } void Project(const Mat34 &P, const Mat3X &X, Mat2X *x) { x->resize(2, X.cols()); for (size_t c = 0; c < static_cast<size_t>(X.cols()); ++c) { x->col(c) = Project(P, Vec3(X.col(c))); } } void Project(const Mat34 &P, const Mat4X &X, Mat2X *x) { x->resize(2, X.cols()); for (Mat4X::Index c = 0; c < X.cols(); ++c) { const Vec3 hx = P * X.col(c); x->col(c) = hx.hnormalized(); } } Mat2X Project(const Mat34 &P, const Mat3X &X) { Mat2X x(2, X.cols()); Project(P, X, &x); return x; } Mat2X Project(const Mat34 &P, const Mat4X &X) { Mat2X x(2, X.cols()); Project(P, X, &x); return x; } void HomogeneousToEuclidean(const Vec4 &H, Vec3 *X) { double w = H(3); *X << H(0) / w, H(1) / w, H(2) / w; } void EuclideanToHomogeneous(const Mat &X, Mat *H) { Mat::Index d = X.rows(); Mat::Index n = X.cols(); H->resize(d + 1, n); H->block(0, 0, d, n) = X; H->row(d).setOnes(); } double Depth(const Mat3 &R, const Vec3 &t, const Vec3 &X) { return (R*X)[2] + t[2]; } void HomogeneousToEuclidean(const Mat &H, Mat *X) { Mat::Index d = H.rows() - 1; Mat::Index n = H.cols(); X->resize(d, n); for (Mat::Index i = 0; i < n; ++i) { double h = H(d, i); for (int j = 0; j < d; ++j) { (*X)(j, i) = H(j, i) / h; } } } Mat3X EuclideanToHomogeneous(const Mat2X &x) { Mat3X h(3, x.cols()); h.block(0, 0, 2, x.cols()) = x; h.row(2).setOnes(); return h; } void EuclideanToHomogeneous(const Mat2X &x, Mat3X *h) { h->resize(3, x.cols()); h->block(0, 0, 2, x.cols()) = x; h->row(2).setOnes(); } void HomogeneousToEuclidean(const Mat3X &h, Mat2X *e) { e->resize(2, h.cols()); e->row(0) = h.row(0).array() / h.row(2).array(); e->row(1) = h.row(1).array() / h.row(2).array(); } void EuclideanToNormalizedCamera(const Mat2X &x, const Mat3 &K, Mat2X *n) { Mat3X x_image_h; EuclideanToHomogeneous(x, &x_image_h); Mat3X x_camera_h = K.inverse() * x_image_h; HomogeneousToEuclidean(x_camera_h, n); } void HomogeneousToNormalizedCamera(const Mat3X &x, const Mat3 &K, Mat2X *n) { Mat3X x_camera_h = K.inverse() * x; HomogeneousToEuclidean(x_camera_h, n); } /// Estimates the root mean square error (2D) double RootMeanSquareError(const Mat2X &x_image, const Mat4X &X_world, const Mat34 &P) { size_t num_points = x_image.cols(); Mat2X dx = Project(P, X_world) - x_image; return dx.norm() / num_points; } /// Estimates the root mean square error (2D) double RootMeanSquareError(const Mat2X &x_image, const Mat3X &X_world, const Mat3 &K, const Mat3 &R, const Vec3 &t) { Mat34 P; P_From_KRt(K, R, t, &P); size_t num_points = x_image.cols(); Mat2X dx = Project(P, X_world) - x_image; return dx.norm() / num_points; } } // namespace aspOpenMVG ================================================ FILE: src/asp/OpenMVG/projection.hpp ================================================ // Copyright (c) 2010 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_MULTIVIEW_PROJECTION_HPP #define OPENMVG_MULTIVIEW_PROJECTION_HPP #include <asp/OpenMVG/numeric.h> /// Collection of function related to the classic Projection matrix used /// in computer vision. P = K[R|t] with [t]=[-RC] Cf HZ namespace aspOpenMVG { /** * @brief Compute P = K[R|t] * @param K Intrinsic matrix * @param R Rotation matrix * @param t Translation vector * @param[out] P Projection matrix */ void P_From_KRt( const Mat3 &K, const Mat3 &R, const Vec3 &t, Mat34 *P ); /** * Decompose using the RQ decomposition * @param P Projection matrix * @param[out] Kp Intrinsic matrix * @param[out] Rp Rotation matrix * @param[out] tp Translation vector * @ref Multiple View Geometry - Richard Hartley, Andrew Zisserman - second edition * @see HZ A4.1.1 pag.579. */ void KRt_From_P( const Mat34 &P, Mat3 *Kp, Mat3 *Rp, Vec3 *tp ); /** * @brief Compute a fundamental matrix from projection matrices * @param P1 Projection matrix of first camera * @param P2 Projection matrix of second camera * @return Fundamental matrix between the two camera */ Mat3 F_from_P( const Mat34 & P1, const Mat34 & P2 ); /** * @brief Compute the depth of the X point. R*X[2]+t[2] * @param R Rotation matrix * @param t Translation vector * @param X 3d points * @return Depth of X wtr to the camera center */ double Depth( const Mat3 &R, const Vec3 &t, const Vec3 &X ); /** * @brief Compute P*[X|1.0]. Transformed from homogeneous to euclidean coordinates * @param P Camera projection matrix * @param X Input 3d point * @return Projected point */ Vec2 Project( const Mat34 &P, const Vec3 &X ); /** * @brief Compute P*[X|1.0] for the X list of point (3D point) * @param P Camera projection matrix * @param X Input 3d points * @param[out] x Projected points */ void Project( const Mat34 &P, const Mat3X &X, Mat2X *x ); /** * @brief Compute P*[X|1.0] for the X list of point (4D point) * @param P Camera projection matrix * @param X Input 4d points * @param[out] x Projected points */ void Project( const Mat34 &P, const Mat4X &X, Mat2X *x ); /** * @brief Return P*[X|1.0] for the X list of point (3D point) * @param P Camera projection matrix * @param X Input 3d points * @return Projected points */ Mat2X Project( const Mat34 &P, const Mat3X &X ); /** * @brief Return P*[X|1.0] for the X list of point (4D point) * @param P Camera projection matrix * @param X Input 4d points * @return Projected points */ Mat2X Project( const Mat34 &P, const Mat4X &X ); /** * @brief Change homogeneous coordinates to euclidean * @param H Input 4d point * @param[out] X Output 3d point */ void HomogeneousToEuclidean( const Vec4 &H, Vec3 *X ); /** * @brief Change euclidean coordinates to homogeneous * @param X Input points * @param H Output points */ void EuclideanToHomogeneous( const Mat &X, Mat *H ); /** * @brief Change homogeneous to euclidean * @param H Input homogeneous Points * @param[out] Output euclidean points */ void HomogeneousToEuclidean( const Mat &H, Mat *X ); /** * @brief Change euclidean to homogenous * @param x Input 2d points * @return Output 3d homogeneous points */ Mat3X EuclideanToHomogeneous( const Mat2X &x ); /** * @brief Change euclidean to homogenous * @param x Input 2d points * @param[out] h Output 3d homogeneous points */ void EuclideanToHomogeneous( const Mat2X &x, Mat3X *h ); /** * @brief Change homogenous to euclidean * @param x Input 3d homogeneous points * @param[out] e Output 2d euclidean points */ void HomogeneousToEuclidean( const Mat3X &h, Mat2X *e ); /** * @brief Project x point in camera coordinates * @param x Input list of 2d points * @param K intrinsic matrix * @param[out] n Normalized points in camera plane frame */ void EuclideanToNormalizedCamera( const Mat2X &x, const Mat3 &K, Mat2X *n ); /** * @brief Project x point in camera coordinates * @param x Input list of (homogeneous) 3d points * @param K intrinsic matrix * @param[out] n Normalized points in camera plane frame */ void HomogeneousToNormalizedCamera( const Mat3X &x, const Mat3 &K, Mat2X *n ); /** * @brief Estimates the root mean square error (2D) * @param x_image Points in image frame * @param X_world Points in world frame * @param P Projection matrix * @return RMS of projection error */ double RootMeanSquareError( const Mat2X &x_image, const Mat4X &X_world, const Mat34 &P ); /** * @brief Estimates the root mean square error (2D) * @param x_image Points in image frame * @param X_world Points in world frame * @param K Intrinsic matrix * @param R Rotation matrix * @param t translation vector * @note KRt defines a projection */ double RootMeanSquareError( const Mat2X &x_image, const Mat3X &X_world, const Mat3 &K, const Mat3 &R, const Vec3 &t ); } // namespace aspOpenMVG #endif // OPENMVG_MULTIVIEW_PROJECTION_HPP ================================================ FILE: src/asp/OpenMVG/tracks.hpp ================================================ // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. // Implementation of [1] an efficient algorithm to compute track from pairwise // correspondences. // // [1] Pierre Moulon and Pascal Monasse, // "Unordered feature tracking made fast and easy" CVMP 2012. // // It tracks the position of features along the series of image from pairwise // correspondences. // // From map< [imageI,ImageJ], [indexed matches array] > it builds tracks. // // Usage : // PairWiseMatches map_Matches; // PairedIndMatchImport(sMatchFile, map_Matches); // Load series of pairwise matches // //--------------------------------------- // // Compute tracks from matches // //--------------------------------------- // TracksBuilder tracksBuilder; // tracks::STLMAPTracks map_tracks; // tracksBuilder.Build(map_Matches); // Build: Efficient fusion of correspondences // tracksBuilder.Filter(); // Filter: Remove tracks that have conflict // tracksBuilder.ExportToSTL(map_tracks); // Build tracks with STL compliant type // #ifndef OPENMVG_TRACKS_TRACKS_HPP #define OPENMVG_TRACKS_TRACKS_HPP #include <asp/OpenMVG/indMatch.hpp> #include <asp/OpenMVG/flat_pair_map.hpp> #include <asp/OpenMVG/union_find.hpp> #include <algorithm> #include <cstdint> #include <functional> #include <map> #include <memory> #include <set> #include <vector> namespace aspOpenMVG { using namespace aspOpenMVG::matching; namespace tracks { // Data structure to store a track: collection of {ImageId,FeatureId} // The corresponding image points with their imageId and FeatureId. using submapTrack = std::map<uint32_t,uint32_t>; // A track is a collection of {trackId, submapTrack} using STLMAPTracks = std::map< size_t, submapTrack >; struct TracksBuilder { using indexedFeaturePair = std::pair<uint32_t, uint32_t>; flat_pair_map<indexedFeaturePair, uint32_t> map_node_to_index; UnionFind uf_tree; /// Build tracks for a given series of pairWise matches void Build( const PairWiseMatches & map_pair_wise_matches) { // 1. We need to know how much single set we will have. // i.e each set is made of a tuple : (imageIndex, featureIndex) using SetIndexedPair = std::set<indexedFeaturePair>; SetIndexedPair allFeatures; // For each couple of images list the used features for ( const auto & iter : map_pair_wise_matches ) { const auto & I = iter.first.first; const auto & J = iter.first.second; const std::vector<IndMatch> & vec_FilteredMatches = iter.second; // Retrieve all shared features and add them to a set for ( const auto & cur_filtered_match : vec_FilteredMatches ) { allFeatures.emplace(I,cur_filtered_match.i_); allFeatures.emplace(J,cur_filtered_match.j_); } } // 2. Build the 'flat' representation where a tuple (the node) // is attached to a unique index. map_node_to_index.reserve(allFeatures.size()); unsigned int cpt = 0; for (const auto & feat : allFeatures) { map_node_to_index.emplace_back(feat, cpt); ++cpt; } // Sort the flat_pair_map map_node_to_index.sort(); // Clean some memory allFeatures.clear(); // 3. Add the node and the pairwise correpondences in the UF tree. uf_tree.InitSets(map_node_to_index.size()); // 4. Union of the matched features corresponding UF tree sets for ( const auto & iter : map_pair_wise_matches ) { const auto & I = iter.first.first; const auto & J = iter.first.second; const std::vector<IndMatch> & vec_FilteredMatches = iter.second; for (const IndMatch & match : vec_FilteredMatches) { const indexedFeaturePair pairI(I, match.i_); const indexedFeaturePair pairJ(J, match.j_); // Link feature correspondences to the corresponding containing sets. uf_tree.Union(map_node_to_index[pairI], map_node_to_index[pairJ]); } } } /// Remove bad tracks (too short or track with ids collision) bool Filter(size_t nLengthSupTo = 2) { // Remove bad tracks: // - track that are too short, // - track with id conflicts: // i.e. tracks that have many times the same image index // From the UF tree, create tracks of the image indexes. // If an image index appears two time the track must disappear // If a track is too short it has to be removed. std::map<unsigned int, std::set<unsigned int> > tracks; std::set<unsigned int> problematic_track_id; // Build tracks from the UF tree, track problematic ids. for (unsigned int k = 0; k < map_node_to_index.size(); ++k) { const unsigned int & track_id = uf_tree.m_cc_parent[k]; if (problematic_track_id.count(track_id) != 0) continue; // Track already marked const auto & feat = map_node_to_index[k]; if (tracks[track_id].count(feat.first.first)) { problematic_track_id.insert(track_id); } else { tracks[track_id].insert(feat.first.first); } } // - track that are too short, for (const auto & val : tracks) { if (val.second.size() < nLengthSupTo) { problematic_track_id.insert(val.first); } } for (unsigned int & root_index : uf_tree.m_cc_parent) { if (problematic_track_id.count(root_index) > 0) { // reset selected root uf_tree.m_cc_size[root_index] = 1; root_index = std::numeric_limits<unsigned int>::max(); } } return false; } /// Return the number of connected set in the UnionFind structure (tree forest) size_t NbTracks() const { std::set<unsigned int> parent_id(uf_tree.m_cc_parent.begin(), uf_tree.m_cc_parent.end()); // Erase the "special marker" that depicted rejected tracks parent_id.erase(std::numeric_limits<unsigned int>::max()); return parent_id.size(); } /// Export tracks as a map (each entry is a sequence of imageId and featureIndex): /// {TrackIndex => {(imageIndex, featureIndex), ... ,(imageIndex, featureIndex)} void ExportToSTL(STLMAPTracks & map_tracks) { map_tracks.clear(); for (unsigned int k = 0; k < map_node_to_index.size(); ++k) { const auto & feat = map_node_to_index[k]; const unsigned int track_id = uf_tree.m_cc_parent[k]; if ( // ensure never add rejected elements (track marked as invalid) track_id != std::numeric_limits<unsigned int>::max() // ensure never add 1-length track element (it's not a track) && uf_tree.m_cc_size[track_id] > 1 ) { map_tracks[track_id].insert(feat.first); } } } }; struct TracksUtilsMap { /** * @brief Find common tracks between images. * * @param[in] set_imageIndex: set of images we are looking for common tracks * @param[in] map_tracksIn: all tracks of the scene * @param[out] map_tracksOut: output with only the common tracks */ static bool GetTracksInImages ( const std::set<size_t> & set_imageIndex, const STLMAPTracks & map_tracksIn, STLMAPTracks & map_tracksOut ) { map_tracksOut.clear(); // Go along the tracks for ( const auto & iterT : map_tracksIn ) { // Look if the track contains the provided view index & save the point ids submapTrack map_temp; bool bTest = true; for (auto iterIndex = set_imageIndex.begin(); iterIndex != set_imageIndex.end() && bTest; ++iterIndex) { auto iterSearch = iterT.second.find(*iterIndex); if (iterSearch != iterT.second.end()) map_temp[iterSearch->first] = iterSearch->second; else bTest = false; } if (!map_temp.empty() && map_temp.size() == set_imageIndex.size()) map_tracksOut[iterT.first] = std::move(map_temp); } return !map_tracksOut.empty(); } /// Return the tracksId as a set (sorted increasing) static void GetTracksIdVector ( const STLMAPTracks & map_tracks, std::set<size_t> * set_tracksIds ) { set_tracksIds->clear(); for ( const auto & iterT : map_tracks ) { set_tracksIds->insert(iterT.first); } } /// Get feature index PerView and TrackId static bool GetFeatIndexPerViewAndTrackId ( const STLMAPTracks & map_tracks, const std::set<size_t> & set_trackId, size_t nImageIndex, std::vector<size_t> * pvec_featIndex ) { for (const size_t & trackId: set_trackId) { STLMAPTracks::const_iterator iterT = map_tracks.find(trackId); if (iterT != map_tracks.end()) { //try to find imageIndex const submapTrack & map_ref = iterT->second; submapTrack::const_iterator iterSearch = map_ref.find(nImageIndex); if (iterSearch != map_ref.end()) { pvec_featIndex->emplace_back(iterSearch->second); } } } return !pvec_featIndex->empty(); } struct FunctorMapFirstEqual { size_t id; FunctorMapFirstEqual(size_t val):id(val){}; bool operator()(const std::pair<size_t, submapTrack > & val) { return (id == val.first); } }; /** * @brief Convert a trackId to a vector of indexed Matches. * * @param[in] map_tracks: set of tracks with only 2 elements * (image A and image B) in each submapTrack. * @param[in] vec_filterIndex: the track indexes to retrieve. * Only track indexes contained in this filter vector are kept. * @param[out] pvec_index: list of matches * (feature index in image A, feature index in image B). * * @warning The input tracks must be composed of only two images index. * @warning Image index are considered sorted (increasing order). */ static void TracksToIndexedMatches ( const STLMAPTracks & map_tracks, const std::vector<IndexT> & vec_filterIndex, std::vector<IndMatch> * pvec_index ) { std::vector<IndMatch> & vec_indexref = *pvec_index; vec_indexref.clear(); for ( const auto & filter_index : vec_filterIndex ) { // Retrieve the track information from the current index i. auto itF = find_if(map_tracks.begin(), map_tracks.end(), FunctorMapFirstEqual( filter_index ) ) ; // The current track. const submapTrack & map_ref = itF->second; // We have 2 elements for a track. assert(map_ref.size() == 2); const IndexT indexI = (map_ref.begin())->second; const IndexT indexJ = (++map_ref.begin())->second; vec_indexref.emplace_back(indexI, indexJ); } } /// Return the occurrence of tracks length. static void TracksLength ( const STLMAPTracks & map_tracks, std::map<size_t, size_t> & map_Occurence_TrackLength ) { for ( const auto & iterT : map_tracks ) { const size_t trLength = iterT.second.size(); if (map_Occurence_TrackLength.end() == map_Occurence_TrackLength.find(trLength)) { map_Occurence_TrackLength[trLength] = 1; } else { map_Occurence_TrackLength[trLength] += 1; } } } /// Return a set containing the image Id considered in the tracks container. static void ImageIdInTracks ( const STLMAPTracks & map_tracks, std::set<size_t> & set_imagesId ) { for ( const auto & iterT : map_tracks ) { const submapTrack & map_ref = iterT.second; for ( const auto & iter : map_ref ) { set_imagesId.insert(iter.first); } } } }; } // namespace tracks } // namespace aspOpenMVG #endif // OPENMVG_TRACKS_TRACKS_HPP ================================================ FILE: src/asp/OpenMVG/triangulation.cpp ================================================ // Copyright (c) 2010 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #include <asp/OpenMVG/projection.hpp> #include <asp/OpenMVG/triangulation.hpp> namespace aspOpenMVG { // HZ 12.2 pag.312 void TriangulateDLT(const Mat34 &P1, const Vec2 &x1, const Mat34 &P2, const Vec2 &x2, Vec4 *X_homogeneous) { Mat4 design; for (int i = 0; i < 4; ++i) { design(0,i) = x1[0] * P1(2,i) - P1(0,i); design(1,i) = x1[1] * P1(2,i) - P1(1,i); design(2,i) = x2[0] * P2(2,i) - P2(0,i); design(3,i) = x2[1] * P2(2,i) - P2(1,i); } Nullspace(&design, X_homogeneous); } void TriangulateDLT(const Mat34 &P1, const Vec2 &x1, const Mat34 &P2, const Vec2 &x2, Vec3 *X_euclidean) { Vec4 X_homogeneous; TriangulateDLT(P1, x1, P2, x2, &X_homogeneous); HomogeneousToEuclidean(X_homogeneous, X_euclidean); } } // namespace aspOpenMVG ================================================ FILE: src/asp/OpenMVG/triangulation.hpp ================================================ // Copyright (c) 2010 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_MULTIVIEW_TRIANGULATION_HPP #define OPENMVG_MULTIVIEW_TRIANGULATION_HPP #include <asp/OpenMVG/numeric.h> namespace aspOpenMVG { /** * @brief Linear DLT triangulation * @brief P1 First camera projection matrix * @param P2 Second camera projection matrix * @param x1 Point in first camera * @param x2 Point in second camera * @param[out] X_homogeneous Homogeneous triangulated point * @see HZ 12.2 pag.312 * @ref Multiple View Geometry - Richard Hartley, Andrew Zisserman - second edition */ void TriangulateDLT( const Mat34 &P1, const Vec2 &x1, const Mat34 &P2, const Vec2 &x2, Vec4 *X_homogeneous ); /** * @brief Linear DLT triangulation * @brief P1 First camera projection matrix * @param P2 Second camera projection matrix * @param x1 Point in first camera * @param x2 Point in second camera * @param[out] X_euclidean Euclidean triangulated point * @see HZ 12.2 pag.312 * @ref Multiple View Geometry - Richard Hartley, Andrew Zisserman - second edition */ void TriangulateDLT( const Mat34 &P1, const Vec2 &x1, const Mat34 &P2, const Vec2 &x2, Vec3 *X_euclidean ); } // namespace aspOpenMVG #endif // OPENMVG_MULTIVIEW_TRIANGULATION_HPP ================================================ FILE: src/asp/OpenMVG/triangulation_nview.cpp ================================================ // Copyright (c) 2010 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #include <asp/OpenMVG/projection.hpp> #include <asp/OpenMVG/triangulation_nview.hpp> namespace aspOpenMVG { void TriangulateNView(const Mat2X &x, const std::vector< Mat34 > &Ps, Vec4 *X) { const Mat2X::Index nviews = x.cols(); assert(static_cast<size_t>(nviews) == Ps.size()); Mat design = Mat::Zero(3*nviews, 4 + nviews); for (int i = 0; i < nviews; i++) { design.block<3, 4>(3*i, 0) = -Ps[i]; design(3*i + 0, 4 + i) = x(0, i); design(3*i + 1, 4 + i) = x(1, i); design(3*i + 2, 4 + i) = 1.0; } Vec X_and_alphas; Nullspace(&design, &X_and_alphas); *X = X_and_alphas.head(4); } using Mat23 = Eigen::Matrix<double, 2, 3>; inline Mat23 SkewMatMinimal(const Vec2 &x) { Mat23 skew; skew << 0, -1, x(1), 1, 0, -x(0); return skew; } void TriangulateNViewAlgebraic(const Mat2X &x, const std::vector< Mat34 > &Ps, Vec4 *X) { const Mat2X::Index nviews = x.cols(); assert(static_cast<size_t>(nviews) == Ps.size()); Mat design(2*nviews, 4); for (int i = 0; i < nviews; i++) { design.block<2, 4>(2*i, 0) = SkewMatMinimal(x.col(i)) * Ps[i]; } Nullspace(&design, X); } void Triangulation::add ( const Mat34& projMatrix, const Vec2 & p ) { views.emplace_back( projMatrix, p ); } size_t Triangulation::size() const { return views.size(); } void Triangulation::clear() { views.clear(); } double Triangulation::error(const Vec3 &X) const { double squared_reproj_error = 0.0; for (std::size_t i=0;i<views.size();i++) { const Mat34& PMat = views[i].first; const Vec2 & xy = views[i].second; squared_reproj_error += (xy - Project(PMat, X)).norm(); } return squared_reproj_error; } // Camera triangulation using the iterated linear method Vec3 Triangulation::compute(int iter) const { const int nviews = int(views.size()); assert(nviews>=2); // Iterative weighted linear least squares Mat3 AtA; Vec3 Atb, X; Vec weights = Vec::Constant(nviews,1.0); for (int it=0;it<iter;++it) { AtA.fill(0.0); Atb.fill(0.0); for (int i=0;i<nviews;++i) { const Mat34& PMat = views[i].first; const Vec2 & p = views[i].second; const double w = weights[i]; Vec3 v1, v2; for (int j=0;j<3;j++) { v1[j] = w * ( PMat(0,j) - p(0) * PMat(2,j) ); v2[j] = w * ( PMat(1,j) - p(1) * PMat(2,j) ); Atb[j] += w * ( v1[j] * ( p(0) * PMat(2,3) - PMat(0,3) ) + v2[j] * ( p(1) * PMat(2,3) - PMat(1,3) ) ); } for (int k=0;k<3;k++) { for (int j=0;j<=k;j++) { const double v = v1[j] * v1[k] + v2[j] * v2[k]; AtA(j,k) += v; if (j<k) AtA(k,j) += v; } } } X = AtA.inverse() * Atb; // Compute reprojection error, min and max depth, and update weights zmin = std::numeric_limits<double>::max(); zmax = - std::numeric_limits<double>::max(); err = 0.0; for (int i=0;i<nviews;++i) { const Mat34& PMat = views[i].first; const Vec2 & p = views[i].second; const Vec3 xProj = PMat * X.homogeneous(); const double z = xProj(2); if (z < zmin) zmin = z; else if (z > zmax) zmax = z; err += (p - xProj.hnormalized()).norm(); // residual error weights[i] = 1.0 / z; } } return X; } } // namespace aspOpenMVG ================================================ FILE: src/asp/OpenMVG/triangulation_nview.hpp ================================================ // Copyright (c) 2010 libmv authors. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Copyright (c) 2012, 2013 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_MULTIVIEW_TRIANGULATION_NVIEW_HPP #define OPENMVG_MULTIVIEW_TRIANGULATION_NVIEW_HPP #include <asp/OpenMVG/numeric.h> namespace aspOpenMVG { /// Compute a 3D position of a point from several images of it. In particular, /// compute the projective point X in R^4 such that x = PX. /// Algorithm is the standard DLT; for derivation see appendix of Keir's thesis. void TriangulateNView( const Mat2X &x, // x's are 2D coordinates (x,y,1) in each image const std::vector< Mat34 > &Ps, // Ps are projective cameras Vec4 *X); // This method uses the algebraic distance approximation. // Note that this method works better when the 2D points are normalized // with an isotopic normalization. void TriangulateNViewAlgebraic( const Mat2X &x, // x's are 2D coordinates (x,y,1) in each image const std::vector< Mat34 > &Ps, // Ps are projective cameras. Vec4 *X); //Iterated linear method class Triangulation { public: size_t size() const; void clear(); void add ( const Mat34& projMatrix, const Vec2 & p ); // Return squared L2 sum of error double error(const Vec3 &X) const; // Compute the corresponding 3D point Vec3 compute(int iter = 3) const; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Accessors // These values are defined after a successful call to compute double minDepth() const { return zmin; } double maxDepth() const { return zmax; } double error() const { return err; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Data members protected: mutable double zmin; // min depth, mutable since modified in compute(...) const; mutable double zmax; // max depth, mutable since modified in compute(...) const; mutable double err; // re-projection error, mutable since modified in compute(...) const; std::vector< std::pair<Mat34, Vec2> > views; // Proj matrix and associated image point }; } // namespace aspOpenMVG #endif // OPENMVG_MULTIVIEW_TRIANGULATION_NVIEW_HPP ================================================ FILE: src/asp/OpenMVG/types.hpp ================================================ // Copyright (c) 2015 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_TYPES_HPP #define OPENMVG_TYPES_HPP #include <Eigen/Core> #include <cstdint> #include <limits> #include <map> #include <set> #include <vector> /** * @brief Main namespace of openMVG API */ namespace aspOpenMVG { /// Portable type used to store an index using IndexT = uint32_t; /// Portable value used to save an undefined index value static const IndexT UndefinedIndexT = std::numeric_limits<IndexT>::max(); /// Standard Pair of IndexT using Pair = std::pair<IndexT, IndexT>; /// Set of Pair using Pair_Set = std::set<Pair>; /// Vector of Pair using Pair_Vec = std::vector<Pair>; } // namespace aspOpenMVG #endif // OPENMVG_TYPES_HPP ================================================ FILE: src/asp/OpenMVG/union_find.hpp ================================================ // Copyright (c) 2016 Pierre MOULON. // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef OPENMVG_TRACKS_UNION_FIND_DISJOINT_SET_HPP #define OPENMVG_TRACKS_UNION_FIND_DISJOINT_SET_HPP #include <numeric> #include <vector> namespace aspOpenMVG { // Union-Find/Disjoint-Set data structure //-- // A disjoint-set data structure also called a union–find data structure // or merge–find set, is a data structure that keeps track of a set of elements // partitioned into a number of disjoint (non-overlapping) subsets. // It supports two operations: // - Find: Determine which subset a particular element is in. // - It returns an item from this set that serves as its "representative"; // - Union: Join two subsets into a single subset. // Sometime a Connected method is implemented: // - Connected: // - By comparing the result of two Find operations, one can determine whether // two elements are in the same subset. //-- struct UnionFind { // Represent the DS/UF forest thanks to two array: // A parent 'pointer tree' where each node holds a reference to its parent node std::vector<unsigned int> m_cc_parent; // A rank array used for union by rank std::vector<unsigned int> m_cc_rank; // A 'size array' to know the size of each connected component std::vector<unsigned int> m_cc_size; // Init the UF structure with num_cc nodes void InitSets ( const unsigned int num_cc ) { // all set size are 1 (independent nodes) m_cc_size.resize(num_cc, 1); // Parents id have their own CC id {0,n} m_cc_parent.resize(num_cc); std::iota(m_cc_parent.begin(), m_cc_parent.end(), 0); // Rank array (0) m_cc_rank.resize(num_cc, 0); } // Return the number of nodes that have been initialized in the UF tree unsigned int GetNumNodes() const { return m_cc_size.size(); } // Return the representative set id of I nth component unsigned int Find ( unsigned int i ) { // Recursively set all branch as children of root (Path compression) if (m_cc_parent[i] != i) m_cc_parent[i] = Find(m_cc_parent[i]); return m_cc_parent[i]; } // Replace sets containing I and J with their union void Union ( unsigned int i, unsigned int j ) { i = Find(i); j = Find(j); if (i==j) { // Already in the same set. Nothing to do return; } // x and y are not already in same set. Merge them. // Perform an union by rank: // - always attach the smaller tree to the root of the larger tree if (m_cc_rank[i] < m_cc_rank[j]) { m_cc_parent[i] = j; m_cc_size[j] += m_cc_size[i]; } else { m_cc_parent[j] = i; m_cc_size[i] += m_cc_size[j]; if (m_cc_rank[i] > m_cc_rank[j]) ++m_cc_rank[i]; } } }; } // namespace aspOpenMVG #endif // OPENMVG_TRACKS_UNION_FIND_DISJOINT_SET_HPP ================================================ FILE: src/asp/PcAlign/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspPcAlign "${ASP_PC_ALIGN_SRC_FILES}" "${ASP_PC_ALIGN_TEST_FILES}" "${ASP_PC_ALIGN_LIB_DEPENDENCIES}") # This must be built with C++14 as otherwise it fails. Must be set # after the standard is set for the entire library. set_source_files_properties( pc_align_fgr.cc PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF # Keep consistent if desired COMPILE_FLAGS "-std=c++14" ) ================================================ FILE: src/asp/PcAlign/MaskedImageAlgs.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file MaskedImageAlgs.cc /// /// Algorithms that operate on masked float images. All computations are with /// double precision, for better accuracy. /// #include <asp/PcAlign/MaskedImageAlgs.h> #include <vw/Image/PixelMask.h> #include <vw/Math/Functors.h> #include <vw/Math/Statistics.h> #include <vw/Core/Exception.h> #include <omp.h> namespace vw { // Find the valid pixels. Use long long, to avoid integer overflow. long long validCount(vw::ImageView<vw::PixelMask<float>> const& img) { long long count = 0; for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { if (is_valid(img(col, row))) count++; } } return count; } // Compute the median of the valid pixels double maskedMedian(vw::ImageView<vw::PixelMask<float>> const& img) { // Allocate enough space first std::vector<float> vals(img.cols()*img.rows()); vals.clear(); for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { if (is_valid(img(col, row))) vals.push_back(img(col, row).child()); } } if (vals.empty()) vw::vw_throw(vw::ArgumentErr() << "No valid pixels found in median calculation.\n"); return vw::math::destructive_median(vals); } // Comput normalized median absolute deviation double normalizedMad(vw::ImageView<vw::PixelMask<float>> const& img, double median) { // Compute the median absolute deviation std::vector<float> vals(img.cols()*img.rows()); vals.clear(); for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { if (is_valid(img(col, row))) vals.push_back(std::abs(img(col, row).child() - median)); } } if (vals.empty()) vw::vw_throw(vw::ArgumentErr() << "No valid pixels found in MAD calculation.\n"); double mad = vw::math::destructive_median(vals); // The normalization factor is to make this equivalent to the standard deviation return 1.4826 * mad; } // Find the mean of valid pixels double maskedMean(vw::ImageView<vw::PixelMask<float>> const& img) { double sum = 0.0; long long count = 0; for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { if (is_valid(img(col, row))) { sum += img(col, row).child(); count++; } } } if (count == 0) return 0.0; return sum / count; } // Find the std dev of valid pixels double maskedStdDev(vw::ImageView<vw::PixelMask<float>> const& img, double mean) { double sum = 0.0; long long count = 0; for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { if (is_valid(img(col, row))) { sum += (img(col, row).child() - mean) * (img(col, row).child() - mean); count++; } } } if (count == 0) return 0.0; return sqrt(sum / count); } // Filter outside this range void rangeFilter(vw::ImageView<vw::PixelMask<float>> & diff, double min_val, double max_val) { #pragma omp parallel for for (int col = 0; col < diff.cols(); col++) { for (int row = 0; row < diff.rows(); row++) { if (is_valid(diff(col, row)) && (diff(col, row).child() < min_val || diff(col, row).child() > max_val)) diff(col, row).invalidate(); } } } // Invalidate pixels in first image that are invalid in second image void intersectValid(vw::ImageView<vw::PixelMask<float>> & img1, vw::ImageView<vw::PixelMask<float>> const& img2) { #pragma omp parallel for for (int col = 0; col < img1.cols(); col++) { for (int row = 0; row < img1.rows(); row++) { if (!is_valid(img2(col, row))) img1(col, row).invalidate(); } } } // Filter by normalized median absolute deviation with given factor void madFilter(vw::ImageView<vw::PixelMask<float>> & diff, double outlierFactor) { double median = maskedMedian(diff); double mad = normalizedMad(diff, median); double min_val = median - outlierFactor * mad; double max_val = median + outlierFactor * mad; rangeFilter(diff, min_val, max_val); } // Group y-values into bins based on their corresponding x-values and computes // a statistic (like mean, sum, etc.) for each bin. This reimplements // scipy.stats.binned_statistic. Do not return bin number, as we don't need it. // Also some stats that are not needed were not implemented. void binnedStatistics(vw::ImageView<vw::PixelMask<float>> const& x, vw::ImageView<vw::PixelMask<float>> const& y, std::string stat, int nbins, vw::Vector2 const& bin_range, // Outputs std::vector<double> & bin_stat, std::vector<double> & bin_edges, std::vector<double> & bin_centers) { // x and y must have the same size if (x.cols() != y.cols() || x.rows() != y.rows()) vw::vw_throw(vw::ArgumentErr() << "The x and y images must have the same size.\n"); double bin_width = (bin_range[1] - bin_range[0]) / nbins; // Resize output vectors bin_stat.resize(nbins); bin_edges.resize(nbins + 1); bin_centers.resize(nbins); for (int i = 0; i <= nbins; i++) bin_edges[i] = bin_range[0] + i * bin_width; // To get the bin center shift right by half a bin width. Skip the last edge. // There are as many bin centers as there are bins for (int i = 0; i < nbins; i++) bin_centers[i] = bin_edges[i] + bin_width / 2.0; // Accumulate the values in each bin. It is enough to keep this as float. std::vector<std::vector<float>> bin_values(nbins); for (int col = 0; col < x.cols(); col++) { for (int row = 0; row < x.rows(); row++) { if (!is_valid(x(col, row)) || !is_valid(y(col, row))) continue; // Skip invalid pixels // Skip values outside range if (x(col, row).child() < bin_range[0] || x(col, row).child() > bin_range[1]) continue; // Bin index int bin_index = (int)std::floor((x(col, row).child() - bin_range[0]) / bin_width); if (bin_index >= nbins) // This can happen due to numerical errors bin_index = nbins - 1; if (bin_index < 0) bin_index = 0; bin_values[bin_index].push_back(y(col, row).child()); } } // Compute the statistic for each bin #pragma omp parallel for for (int i = 0; i < nbins; i++) { if (bin_values[i].empty()) { bin_stat[i] = 0; continue; } if (stat == "mean") bin_stat[i] = vw::math::mean(bin_values[i]); else if (stat == "count") bin_stat[i] = bin_values[i].size(); else if (stat == "median") bin_stat[i] = vw::math::destructive_median(bin_values[i]); else vw::vw_throw(vw::ArgumentErr() << "Invalid statistic: " << stat << ".\n"); } } } // end namespace vw ================================================ FILE: src/asp/PcAlign/MaskedImageAlgs.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NASA Vision Workbench is licensed under the Apache License, // Version 2.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file MaskedImageAlgs.h /// /// Algorithms that operate on masked float images. All computations are with /// double precision, for better accuracy. /// #ifndef __ASP_PC_ALIGN_MASKEDIMAGEALGS_H__ #define __ASP_PC_ALIGN_MASKEDIMAGEALGS_H__ #include <vw/Image/ImageView.h> namespace vw { // Find the valid pixels. Use long long, to avoid integer overflow. long long validCount(vw::ImageView<vw::PixelMask<float>> const& img); // Compute the median of the valid pixels double maskedMedian(vw::ImageView<vw::PixelMask<float>> const& img); // Comput normalized median absolute deviation double normalizedMad(vw::ImageView<vw::PixelMask<float>> const& img, double median); // Find the mean of valid pixels double maskedMean(vw::ImageView<vw::PixelMask<float>> const& img); // Find the std dev of valid pixels double maskedStdDev(vw::ImageView<vw::PixelMask<float>> const& img, double mean); // Filter outside this range void rangeFilter(vw::ImageView<vw::PixelMask<float>> & diff, double min_val, double max_val); // Invalidate pixels in first image that are invalid in second image void intersectValid(vw::ImageView<vw::PixelMask<float>> & img1, vw::ImageView<vw::PixelMask<float>> const& img2); // Filter by normalized median absolute deviation with given factor void madFilter(vw::ImageView<vw::PixelMask<float>> & diff, double outlierFactor); // Group y-values into bins based on their corresponding x-values and computes // a statistic (like mean, sum, etc.) for each bin. This reimplements // scipy.stats.binned_statistic. Do not return bin number, as we don't need it. // Also some stats that are not needed were not implemented. void binnedStatistics(vw::ImageView<vw::PixelMask<float>> const& x, vw::ImageView<vw::PixelMask<float>> const& y, std::string stat, int nbins, vw::Vector2 const& bin_range, // Outputs std::vector<double> & bin_stat, std::vector<double> & bin_edges, std::vector<double> & bin_centers); } // end namespace vw #endif // __ASP_PC_ALIGN_MASKEDIMAGEALGS_H__ ================================================ FILE: src/asp/PcAlign/NuthAlignment.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // C++ implementation of the Nuth and Kaab alignment method from: // https://github.com/dshean/demcoreg/tree/master // Paper: https://tc.copernicus.org/articles/5/271/2011/ // TODO(oalexan1): Is it worth reading ref and source as double? // TODO(oalexan1): Implement tilt correction. // TODO(oalexan1): What to do about opt.res, opt.polyorder. #include <asp/PcAlign/NuthAlignment.h> #include <asp/PcAlign/NuthAlignmentParse.h> #include <asp/PcAlign/NuthFit.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Core/Exception.h> #include <vw/Core/Stopwatch.h> #include <vw/Math/Functors.h> #include <vw/Math/Statistics.h> #include <asp/PcAlign/MaskedImageAlgs.h> #include <asp/PcAlign/SlopeAspect.h> #include <vw/Core/Settings.h> #include <vw/Math/RandomSet.h> #include <vw/Math/Geometry.h> #include <Eigen/Core> #include <omp.h> #include <iostream> #include <vector> #include <cmath> #include <thread> #include <sstream> namespace asp { inline double DegToRad(double deg) { return deg * M_PI / 180.0; } // Put the above logic in a function that prepares the data. void prepareData(NuthOptions const& opt, vw::ImageView<vw::PixelMask<float>> & ref, vw::ImageView<vw::PixelMask<float>> & src, double & ref_nodata, double & src_nodata, vw::cartography::GeoReference & ref_georef, vw::cartography::GeoReference & src_georef) { // The DEMs must have a georeference bool has_ref_georef = vw::cartography::read_georeference(ref_georef, opt.ref); bool has_src_georef = vw::cartography::read_georeference(src_georef, opt.src); if (!has_ref_georef || !has_src_georef) vw::vw_throw(vw::ArgumentErr() << "The input DEMs must have georeferences.\n"); // The georeferences must be in projected coordinates if (!ref_georef.is_projected() || !src_georef.is_projected()) vw::vw_throw(vw::ArgumentErr() << "The input DEMs must be in a projected coordinate system, in units of meter. " << "Use gdalwarp with the option -r cubic to reproject them. " << "Consider using an equidistant or UTM projection.\n"); // We don't support datum changes if (std::abs(ref_georef.datum().semi_major_axis() - src_georef.datum().semi_major_axis()) > 0.1 || std::abs(ref_georef.datum().semi_minor_axis() - src_georef.datum().semi_minor_axis()) > 0.1 || ref_georef.datum().meridian_offset() != src_georef.datum().meridian_offset()) vw::vw_throw(vw::NoImplErr() << "The input DEMs must have the same datum radii and meridian " << "Use gdalwarp -r cubic to reproject to a shared datum."); // Reference and source DEM resolutions double ref_tr = ref_georef.transform()(0, 0); double src_tr = src_georef.transform()(0, 0); // Sanity check. This code was not tested with different grid sizes in x and y. double ref_tr_y = ref_georef.transform()(1, 1); double src_tr_y = src_georef.transform()(1, 1); double ref_err = std::abs(std::abs(ref_tr_y/ref_tr) - 1.0); double src_err = std::abs(std::abs(src_tr_y/src_tr) - 1.0); if (ref_err > 1e-2 || src_err > 1e-2) vw::vw_throw(vw::NoImplErr() << "The input DEM grid sizes in x and y do not agree. Please reproject " << "the DEMs with gdalwarp -r cubic.\n"); // Prefer the reference resolution to be smaller if (ref_tr > src_tr) vw::vw_out(vw::WarningMessage) << "The reference DEM grid size is larger than of the source DEM. " << "This may lead to suboptimal results. It is strongly suggest to " << "swap or regrid the reference and source DEMs.\n"; // The (1, 1) value in both transforms must be negative, as otherwise this a // non-standard transform that we do not handle. if (ref_georef.transform()(1, 1) >= 0 || src_georef.transform()(1, 1) >= 0) vw::vw_throw(vw::ArgumentErr() << "The input DEMs must have y direction pointing down, so the second coordinate " << " of the pixel size in the geoheader be negative. The provided input DEMs " << " are not standard and are not supported.\n"); // Read the no-data values vw::DiskImageResourceGDAL ref_rsrc(opt.ref), src_rsrc(opt.src); ref_nodata = -std::numeric_limits<double>::max(); src_nodata = ref_nodata; if (ref_rsrc.has_nodata_read()) ref_nodata = ref_rsrc.nodata_read(); if (src_rsrc.has_nodata_read()) src_nodata = src_rsrc.nodata_read(); // Read the ref and source images fully in memory, for speed ref = copy(create_mask(vw::DiskImageView<float>(opt.ref), ref_nodata)); // Get a handle to the source image on disk. We will warp it and read it in memory // as needed, when it is being shifted. src = copy(create_mask(vw::DiskImageView<float>(opt.src), src_nodata)); // TODO(oalexan1): Crop the reference given the extent of the source // and estimated max movement. #if 0 // Estimate the ground resolution double gridx = 0.0, gridy = 0.0; int sample_rate = std::min(ref.cols(), ref.rows()) / 50; if (sample_rate < 1) sample_rate = 1; asp::calcGsd(vw::apply_mask(ref, ref_nodata), ref_georef, ref_nodata, sample_rate, sample_rate, gridx, gridy); double res = (gridx + gridy) / 2.0; if (res <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Could not estimate the DEM grid size. Check if your input clouds " "are dense enough and with solid overlap.\n"); int max_horiz_offset_px = int(max_horiz_offset/res) + 1; #endif } // Warp the source DEM to the reference DEM's georef, while applying a // translation defined in the projected space of the reference DEM. void shiftWarp(int ref_cols, int ref_rows, vw::ImageView<vw::PixelMask<float>> const& src, vw::cartography::GeoReference const& ref_georef, vw::cartography::GeoReference const& src_georef, double dx_total, double dy_total, double dz_total, // Outputs vw::ImageView<vw::PixelMask<float>> & src_warp) { // Set up the interpolation vw::PixelMask<float> nodata_val; nodata_val.invalidate(); auto nodata_ext = vw::ValueEdgeExtension<vw::PixelMask<float>>(nodata_val); vw::ImageViewRef<vw::PixelMask<float>> src_interp = vw::interpolate(src, vw::BicubicInterpolation(), nodata_ext); src_warp.set_size(ref_cols, ref_rows); vw::cartography::GeoTransform gt(ref_georef, src_georef); // Interpolate #pragma omp parallel for for (int col = 0; col < ref_cols; col++) { for (int row = 0; row < ref_rows; row++) { vw::Vector2 ref_pix(col, row); // Convert to projected coordinates vw::Vector2 proj_pt = ref_georef.pixel_to_point(ref_pix); // We want to shift src by this much in projected coordinates // So shift this proj pt in reverse and find the corresponding pixel in src proj_pt -= vw::Vector2(dx_total, dy_total); // Convert back to pixel coordinates, in the ref domain, as that // is where all operations take place. ref_pix = ref_georef.point_to_pixel(proj_pt); // go to src domain vw::Vector2 src_pix = gt.forward(ref_pix); src_warp(col, row) = src_interp(src_pix[0], src_pix[1]); // Add the vertical offset src_warp(col, row) += dz_total; } } return; } // Convert a translation in projected coordinates that aligns the source to the // reference to a rotation + translation transform in ECEF. Make use of the // filtered differences we employed to find the translation. void calcEcefTransform(vw::ImageView<vw::PixelMask<float>> const& ref, vw::ImageView<vw::PixelMask<float>> const& diff, vw::cartography::GeoReference const& ref_georef, double dx_total, double dy_total, double dz_total, bool compute_translation_only, // Outputs Eigen::MatrixXd & ecef_transform) { // This takes time, so put a note vw::vw_out() << "Calculating the ECEF transform.\n"; std::vector<vw::Vector3> ref_pts, src_pts; // The images can be huge. A sample is enough here. int col_rate = std::max(ref.cols() / 1000, 1); int row_rate = std::max(ref.rows() / 1000, 1); // Report progress vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc = 1.0 / (double(ref.cols())/col_rate); tpc.report_progress(0); #pragma omp parallel for for (int col = 0; col < ref.cols(); col += col_rate) { for (int row = 0; row < ref.rows(); row += row_rate) { vw::Vector2 ref_pix(col, row); vw::PixelMask<float> ht = ref(col, row); if (!is_valid(ht)) continue; if (!is_valid(diff(col, row))) continue; // Convert to projected coordinates, then to ECEF vw::Vector2 ref_pt = ref_georef.pixel_to_point(ref_pix); vw::Vector2 ref_lon_lat = ref_georef.point_to_lonlat(ref_pt); vw::Vector3 ref_ecef = ref_georef.datum().geodetic_to_cartesian (vw::Vector3(ref_lon_lat[0], ref_lon_lat[1], ht.child())); // Same for the source. Must go back to the source domain, in x, y, z. vw::Vector2 src_pt = ref_pt - vw::Vector2(dx_total, dy_total); vw::Vector2 src_lon_lat = ref_georef.point_to_lonlat(src_pt); vw::Vector3 src_ecef = ref_georef.datum().geodetic_to_cartesian (vw::Vector3(src_lon_lat[0], src_lon_lat[1], ht.child() - dz_total)); #pragma omp critical { ref_pts.push_back(ref_ecef); src_pts.push_back(src_ecef); } } #pragma omp critical { tpc.report_progress(inc); } } tpc.report_finished(); // This will not be robust unless we have a lot of samples int minSamples = 10; if (ref_pts.size() < minSamples) vw::vw_throw(vw::ArgumentErr() << "Too few valid samples to compute the ECEF transform.\n"); // A subset should be enough std::vector<int> sampleIndices; int maxSamples = 100000; vw::math::pick_random_indices_in_range(ref_pts.size(), maxSamples, sampleIndices); // Keep only the samples in the vectors. Copy in-place. int numSamples = sampleIndices.size(); for (int i = 0; i < numSamples; i++) { ref_pts[i] = ref_pts[sampleIndices[i]]; src_pts[i] = src_pts[sampleIndices[i]]; } ref_pts.resize(numSamples); src_pts.resize(numSamples); // It is safe to assume by now that there are no outliers in the data, given // how much filtering we did. vw::Matrix<double, 3, 3> rotation; vw::Vector<double, 3> translation; double scale = 1.0; std::string transform_type = "rigid"; if (compute_translation_only) transform_type = "translation"; vw::math::find_3D_transform_no_outliers(src_pts, ref_pts, rotation, translation, scale, // outputs transform_type); // We do a rigid transform, as that's all Nuth supports. if (scale != 1.0) vw::vw_throw(vw::NoImplErr() << "Found an unexpected scale factor.\n"); // Copy the rotation and translation ecef_transform.setIdentity(4, 4); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { ecef_transform(i, j) = rotation(i, j); } } for (int i = 0; i < 3; i++) ecef_transform(i, 3) = translation[i]; return; } // Compute the Nuth offset. By now the DEMs have been regrided to the same // resolution and use the same projection. All data is kept as float, // but the calculations are done in double precision, for accuracy. void computeNuthOffset(NuthOptions const& opt, vw::ImageView<vw::PixelMask<float>> const& ref, vw::ImageView<vw::PixelMask<float>> const& src, vw::cartography::GeoReference const& ref_georef, vw::cartography::GeoReference const& src_georef, double ref_nodata, double src_nodata, double max_horiz_offset, double max_vert_offset, vw::Vector2 const& slope_lim, double dx_total, double dy_total, double dz_total, // Outputs vw::ImageView<vw::PixelMask<float>> & diff, vw::Vector3 & fit_params, double & median_diff) { // Find shifted src, and interpolate it onto same grid as ref. vw::ImageView<vw::PixelMask<float>> src_warp; shiftWarp(ref.cols(), ref.rows(), src, ref_georef, src_georef, dx_total, dy_total, dz_total, src_warp); // output // Ref and src must have the same size if (ref.cols() != src_warp.cols() || ref.rows() != src_warp.rows()) vw::vw_throw(vw::ArgumentErr() << "The reference and source DEMs must have the same size.\n"); // Find the diff diff.set_size(src_warp.cols(), src_warp.rows()); for (int col = 0; col < src_warp.cols(); col++) { for (int row = 0; row < src_warp.rows(); row++) { diff(col, row) = src_warp(col, row) - ref(col, row); } } // Filter out diff whose magnitude is greater than max_vert_offset // Apply normalized mad filter with given factor double outlierFactor = 3.0; vw::rangeFilter(diff, -max_vert_offset, max_vert_offset); vw::madFilter(diff, outlierFactor); // Calculate the slope and aspect of the src_warp_copy DEM vw::ImageView<vw::PixelMask<float>> slope, aspect; vw::cartography::calcSlopeAspect(src_warp, ref_georef, slope, aspect); // Filter slopes by range vw::rangeFilter(slope, slope_lim[0], slope_lim[1]); // Invalidate diffs with invalid slope or aspect vw::intersectValid(diff, slope); vw::intersectValid(diff, aspect); // Important sanity check int minCount = 100; if (validCount(diff) < minCount) vw::vw_throw(vw::ArgumentErr() << "Too little valid data left after filtering.\n"); // Find the initial guess to fit_params median_diff = vw::maskedMedian(diff); // will return double median_slope = vw::maskedMedian(slope); double c_seed = (median_diff/tan(DegToRad(median_slope))); fit_params = vw::Vector3(0, 0, c_seed); // will update later and return // For invalid diff make the slope and aspect invalid vw::intersectValid(slope, diff); vw::intersectValid(aspect, diff); // Form xdata and ydata. We don't bother removing the flagged invalid pixels. // xdata = aspect[common_mask].data // ydata = (diff[common_mask]/np.tan(np.deg2rad(slope[common_mask]))).data // Make xdata an alias, to save on memory vw::ImageView<vw::PixelMask<float>> & xdata = aspect; vw::ImageView<vw::PixelMask<float>> ydata(src_warp.cols(), src_warp.rows()); for (int col = 0; col < src_warp.cols(); col++) { for (int row = 0; row < src_warp.rows(); row++) { ydata(col, row).invalidate(); if (is_valid(diff(col, row)) && is_valid(slope(col, row)) && slope(col, row).child() != 0) { ydata(col, row) = diff(col, row).child() / tan(DegToRad(slope(col, row).child())); ydata(col, row).validate(); } } } // Filter outliers in y by mean and std dev outlierFactor = 3.0; double mean_y = vw::maskedMean(ydata); double std_dev_y = vw::maskedStdDev(ydata, mean_y); double rmin = mean_y - outlierFactor * std_dev_y; double rmax = mean_y + outlierFactor * std_dev_y; // Filter y by range, and then apply to x vw::rangeFilter(ydata, rmin, rmax); vw::intersectValid(xdata, ydata); // Prepare for binning int numBins = 360; vw::Vector2 binRange(0.0, numBins); // Bin counts. Keep these are double as they are small. std::vector<double> bin_count, bin_edges, bin_centers; vw::binnedStatistics(xdata, ydata, "count", numBins, binRange, bin_count, bin_edges, bin_centers); // outputs // Bin medians std::vector<double> bin_median; vw::binnedStatistics(xdata, ydata, "median", numBins, binRange, bin_median, bin_edges, bin_centers); // outputs // Find the best fit. This refines fit_params. asp::nuthFit(bin_count, bin_centers, bin_median, opt.inner_iter, opt.num_threads, fit_params); } // End function computeNuthOffset // Compute the Nuth alignment transform in projected coordinates and then // convert it to an ECEF transform. Eigen::MatrixXd nuthAlignment(std::string const& ref_file, std::string const& src_file, std::string const& out_prefix, double max_displacement, int num_iterations, int num_threads, bool compute_translation_only, std::string const& nuth_options) { // Pass some of these directly to opt NuthOptions opt; opt.ref = ref_file; opt.src = src_file; opt.out_prefix = out_prefix; opt.max_displacement = max_displacement; opt.max_iter = num_iterations; opt.num_threads = num_threads; opt.compute_translation_only = compute_translation_only; // Parse the others from nuth_options, or defaults are used. int argc = 0; std::vector<char*> argv; std::vector<std::string> argv_str; formArgcArgv(nuth_options, argc, argv, argv_str); handleNuthArgs(argc, &argv[0], opt); // If no iterations, return the identity Eigen::MatrixXd ecef_transform = Eigen::MatrixXd::Identity(4, 4); if (opt.max_iter == 0) return ecef_transform; // Load and prepare the data vw::ImageView<vw::PixelMask<float>> ref, src; double ref_nodata = -std::numeric_limits<double>::max(); double src_nodata = ref_nodata; vw::cartography::GeoReference ref_georef, src_georef; // start stopwatch prepareData(opt, ref, src, ref_nodata, src_nodata, ref_georef, src_georef); // Initialize double dx_total = 0, dy_total = 0, dz_total = 0; vw::Vector3 fit_params; double median_diff = 0.0; // will be returned int iter = 1; double change_len = -1.0; vw::ImageView<vw::PixelMask<float>> diff; vw::vw_out() << "Iteration and change in transform (meters)\n"; while (1) { // Compute the Nuth offset computeNuthOffset(opt, ref, src, ref_georef, src_georef, ref_nodata, src_nodata, opt.max_horiz_offset, opt.max_vert_offset, opt.slope_lim, dx_total, dy_total, dz_total, diff, fit_params, median_diff); // outputs // Note: minus signs here since we are computing dz = src-ref, but adjusting src double dx = -fit_params[0] * sin(DegToRad(fit_params[1])); double dy = -fit_params[0] * cos(DegToRad(fit_params[1])); double dz = -median_diff; dx_total += dx; dy_total += dy; dz_total += dz; change_len = vw::math::norm_2(vw::Vector3(dx, dy, dz)); vw::vw_out() << iter << '\t' << change_len << "\n"; iter++; if (iter > opt.max_iter) { vw::vw_out() << "Reached the maximum number of iterations, before convergence.\n"; break; } if (change_len < opt.tol) { vw::vw_out() << "Reached the prescribed tolerance.\n"; break; } } // Warning. Not sure if it should be an error. double horiz_total = vw::math::norm_2(vw::Vector2(dx_total, dy_total)); if (horiz_total > opt.max_horiz_offset) vw::vw_out(vw::WarningMessage) << "Total horizontal offset is: " << horiz_total << " meters. It exceeds the " << "specified max horizontal offset: " << opt.max_horiz_offset << " meters. Consider increasing the --max-horizontal-offset value.\n"; // Compute the ECEF transform calcEcefTransform(ref, diff, ref_georef, dx_total, dy_total, dz_total, opt.compute_translation_only, ecef_transform); // output return ecef_transform; } #if 0 // Write the cropped and warped ref { vw::TerminalProgressCallback ref_tpc("asp", ": "); bool has_ref_no_data = true; std::string ref_crop_file = opt.out_prefix + "-ref-crop.tif"; vw::vw_out() << "Writing: " << ref_crop_file << "\n"; vw::cartography::block_write_gdal_image(ref_crop_file, vw::apply_mask(ref_dem, ref_nodata), has_ref_georef, ref_georef, has_ref_no_data, ref_nodata, opt, ref_tpc); } // Write the cropped src { vw::TerminalProgressCallback src_tpc("asp", ": "); bool has_src_no_data = true; std::string src_crop_file = opt.out_prefix + "-src-crop.tif"; vw::vw_out() << "Writing: " << src_crop_file << "\n"; vw::cartography::block_write_gdal_image(src_crop_file, vw::apply_mask(src_trans, src_nodata), has_src_georef, ref_georef, has_src_no_data, src_nodata, opt, src_tpc); } // Write the slope { vw::TerminalProgressCallback src_tpc("asp", ": "); bool has_src_no_data = true, has_src_georef = true; std::string src_slope_file = opt.out_prefix + "-src-slope.tif"; vw::vw_out() << "Writing: " << src_slope_file << "\n"; vw::cartography::block_write_gdal_image(src_slope_file, vw::apply_mask(slope, src_nodata), has_src_georef, ref_georef, has_src_no_data, src_nodata, opt, src_tpc); } // Write the aspect { vw::TerminalProgressCallback src_tpc("asp", ": "); bool has_src_no_data = true, has_src_georef = true; std::string src_aspect_file = opt.out_prefix + "-src-aspect.tif"; vw::vw_out() << "Writing: " << src_aspect_file << "\n"; vw::cartography::block_write_gdal_image(src_aspect_file, vw::apply_mask(aspect, src_nodata), has_src_georef, ref_georef, has_src_no_data, src_nodata, opt, src_tpc); } #endif } // end namespace asp ================================================ FILE: src/asp/PcAlign/NuthAlignment.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file NuthAlignment.h /// Nuth and Kaab alignment. #ifndef __ASP_PC_ALIGN_NUTH_ALIGNMENT_H__ #define __ASP_PC_ALIGN_NUTH_ALIGNMENT_H__ #include <Eigen/Dense> #include <vector> namespace asp { Eigen::MatrixXd nuthAlignment(std::string const& ref_file, std::string const& src_file, std::string const& output_prefix, double max_displacement, int num_iterations, int num_threads, bool compute_translation_only, std::string const& nuth_options); } // end namespace asp #endif // __ASP_PC_ALIGN_NUTH_ALIGNMENT_H__ ================================================ FILE: src/asp/PcAlign/NuthAlignmentParse.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/PcAlign/NuthAlignmentParse.h> #include <asp/Core/AspProgramOptions.h> #include <vw/Core/Exception.h> #include <vw/Core/Log.h> #include <vw/FileIO/DiskImageView.h> #include <boost/program_options.hpp> #include <omp.h> #include <iostream> #include <vector> #include <cmath> #include <thread> #include <sstream> #include <limits> namespace po = boost::program_options; namespace asp { // Parse the arguments. Some were set by now directly into opt. void handleNuthArgs(int argc, char *argv[], NuthOptions& opt) { double nan = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options("General options"); general_options.add_options() ("slope-lim", po::value(&opt.slope_lim)->default_value(vw::Vector2(0.1, 40.0), "0.1, 40.0"), "Minimum and maximum surface slope limits to consider (degrees).") ("tol", po::value(&opt.tol)->default_value(0.01), "Stop when the addition to the computed translation at given iteration has magnitude " "below this tolerance (meters).") ("max-horizontal-offset", po::value(&opt.max_horiz_offset)->default_value(nan), "Maximum expected horizontal translation magnitude (meters). Used to filter outliers.") ("max-vertical-offset", po::value(&opt.max_vert_offset)->default_value(nan), "Maximum expected vertical translation (meters). Used to filter outliers.") ("num-inner-iter", po::value(&opt.inner_iter)->default_value(10), "Maximum number of iterations for the inner loop, when finding the best " "fit parameters for the current translation.") // The options below are not yet supported ("tiltcorr", po::bool_switch(&opt.tiltcorr)->default_value(false), "After a preliminary translation, fit a polynomial to residual elevation offsets " "and remove.") ("res", po::value(&opt.res)->default_value("mean"), "Regrid the input DEMs to this resolution given the resolutions of input datasets. " " NuthOptions: min, max, mean, common_scale_factor.") ("poly-order", po::value(&opt.poly_order)->default_value(1), "Specify the order of the polynomial fit.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage; // not used bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.out_prefix == "") vw::vw_throw(vw::ArgumentErr() << "The output prefix was not set.\n"); // The ref and src DEMs must be provided if (opt.ref == "" || opt.src == "") vw::vw_throw(vw::ArgumentErr() << "The reference and source DEMs must be provided.\n"); // The poly order must be positive if (opt.poly_order < 1) vw::vw_throw(vw::ArgumentErr() << "The polynomial order must be at least 1.\n"); // The tol must be positive if (opt.tol <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The tolerance must be positive.\n"); // If horizontal and vertical offset are NaN (so, not set), use max_displacement if (std::isnan(opt.max_horiz_offset)) opt.max_horiz_offset = opt.max_displacement; if (std::isnan(opt.max_vert_offset)) opt.max_vert_offset = opt.max_displacement; // All these offsets must be positive if (opt.max_displacement <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The maximum displacement must be positive.\n"); if (opt.max_horiz_offset <= 0.0 || opt.max_vert_offset <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The maximum horizontal and vertical offsets must be positive.\n"); // Check that res is one of the allowed values if (opt.res != "min" && opt.res != "max" && opt.res != "mean" && opt.res != "common_scale_factor") vw::vw_throw(vw::ArgumentErr() << "Unknown value for --res: " << opt.res << ".\n"); // Check that slope limits are positive and in the right order if (opt.slope_lim[0] <= 0.0 || opt.slope_lim[1] <= 0.0 || opt.slope_lim[0] >= opt.slope_lim[1]) vw::vw_throw(vw::ArgumentErr() << "The slope limits must be positive and in increasing order.\n"); if (opt.tiltcorr) vw::vw_throw(vw::NoImplErr() << "Tilt correction is not implemented yet.\n"); // TODO(oalexan1): Sort out the number of threads. Now it comes from .vwrc if // not set. // Set the number of threads for OpenMP. int processor_count = std::thread::hardware_concurrency(); omp_set_dynamic(0); omp_set_num_threads(processor_count); vw::vw_out() << "Using " << processor_count << " threads with OpenMP.\n"; } // Given a command-line string, form argc and argv. In addition to pointers, // will also store the strings in argv_str, to ensure permanence. void formArgcArgv(std::string const& cmd, int & argc, std::vector<char*> & argv, std::vector<std::string> & argv_str) { // Break by space and read into argv argv_str.clear(); argv_str.push_back("nuthAlignment"); // program name std::istringstream iss(cmd); std::string word; while (iss >> word) argv_str.push_back(word); argc = argv_str.size(); argv.resize(argc); for (int i = 0; i < argc; i++) argv[i] = &argv_str[i][0]; return; } } // end namespace asp ================================================ FILE: src/asp/PcAlign/NuthAlignmentParse.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_PCALIGN_NUTH_ALIGNMENT_PARSE_H #define ASP_PCALIGN_NUTH_ALIGNMENT_PARSE_H #include <string> #include <vector> #include <vw/Math/Vector.h> #include <vw/FileIO/GdalWriteOptions.h> namespace asp { // Definition of the options struct struct NuthOptions: vw::GdalWriteOptions { std::string ref, src, out_prefix, res; int poly_order, max_iter, inner_iter; double tol, max_horiz_offset, max_vert_offset, max_displacement; bool tiltcorr, compute_translation_only; vw::Vector2 slope_lim; NuthOptions() {} }; // Parse the arguments. Some were set by now directly into opt. void handleNuthArgs(int argc, char *argv[], NuthOptions& opt); // Given a command-line string, form argc and argv. In addition to pointers, // will also store the strings in argv_str, to ensure permanence. void formArgcArgv(std::string const& cmd, int & argc, std::vector<char*> & argv, std::vector<std::string> & argv_str); } // end namespace asp #endif // ASP_PCALIGN_NUTH_ALIGNMENT_PARSE_H ================================================ FILE: src/asp/PcAlign/NuthFit.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/PcAlign/NuthFit.h> #include <ceres/ceres.h> /// Best fit function for Nuth alignment with Ceres namespace asp { // Function for fitting Nuth and Kaab (2011) // Can use phasor addition, but need to change conversion to offset dx and dy // https://stackoverflow.com/questions/12397412/i-know-scipy-curve-fit-can-do-better?rq=1 inline double nuth_func(double x, double a, double b, double c) { return a * cos((b-x) * M_PI / 180.0) + c; } // Cost functor for Nuth and Kaab function struct NuthResidual { NuthResidual(double x, double y): m_x(x), m_y(y) {} bool operator()(double const * const * params, double * residuals) const { // params[0][0] = a, params[0][1] = b, params[0][2] = c double predicted = nuth_func(m_x, params[0][0], params[0][1], params[0][2]); residuals[0] = predicted - m_y; return true; } // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* CreateNuthCostFunction(double x, double y) { ceres::DynamicNumericDiffCostFunction<NuthResidual>* cost_function = new ceres::DynamicNumericDiffCostFunction<NuthResidual>(new NuthResidual(x, y)); // The residual size is 1 cost_function->SetNumResiduals(1); // Add a parameter block for each parameter cost_function->AddParameterBlock(3); return cost_function; } double m_x, m_y; }; // End class NuthResidual // Form a Ceres optimization problem. Will fit a curve to bin centers and bin // medians, while taking into acount the bin count and min_bin_sample_count. void nuthFit(std::vector<double> const& bin_count, std::vector<double> const& bin_centers, std::vector<double> const& bin_median, int inner_iter, int num_threads, vw::Vector3 & fit_params) { ceres::Problem problem; int min_bin_sample_count = 9; int numBins = bin_centers.size(); // Add residuals for (int i = 0; i < numBins; i++) { // Skip bin count less than min_bin_sample_count if (bin_count[i] < min_bin_sample_count) continue; // The residual is the difference between the data and the model // fit = optimization.curve_fit(nuth_func, bin_centers, bin_med, fit_params)[0] ceres::CostFunction* cost_function = NuthResidual::CreateNuthCostFunction(bin_centers[i], bin_median[i]); // A lot of outlier removal took place. Likely there is no need for // a robust loss function. ceres::LossFunction* loss_function = NULL; problem.AddResidualBlock(cost_function, loss_function, &fit_params[0]); } ceres::Solver::Options options; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.parameter_tolerance = 1e-12; options.max_num_iterations = inner_iter; options.max_num_consecutive_invalid_steps = std::max(5, inner_iter/5); // try hard options.minimizer_progress_to_stdout = false; // verbose options.num_threads = num_threads; options.linear_solver_type = ceres::SPARSE_SCHUR; ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); // vw::vw_out() << summary.FullReport() << "\n"; // verbose } // End function nuthFit } // end namespace asp ================================================ FILE: src/asp/PcAlign/NuthFit.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file NuthFit.h /// Best fit function for Nuth alignment. #ifndef __ASP_PC_ALIGN_NUTH_FIT_H__ #define __ASP_PC_ALIGN_NUTH_FIT_H__ #include <vw/Math/Vector.h> #include <vector> namespace asp { // Form a Ceres optimization problem. Will fit a curve to bin centers and bin // medians, while taking into acount the bin count and min_bin_sample_count. void nuthFit(std::vector<double> const& bin_count, std::vector<double> const& bin_centers, std::vector<double> const& bin_median, int inner_iter, int num_threads, vw::Vector3 & fit_params); } // end namespace asp #endif // __ASP_PC_ALIGN_NUTH_FIT_H__ ================================================ FILE: src/asp/PcAlign/SlopeAspect.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NASA Vision Workbench is licensed under the Apache License, // Version 2.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/PcAlign/SlopeAspect.h> #include <omp.h> namespace vw { namespace cartography { // Calculate the DEM slope and aspect in degrees at a given location. // The code below is adapted from GDAL. // https://github.com/OSGeo/gdal/blob/46412f0fb7df3f0f71c6c31ff0ae97b7cef6fa61/apps/gdaldem_lib.cpp#L1284C1-L1301C1 //https://github.com/OSGeo/gdal/blob/46412f0fb7df3f0f71c6c31ff0ae97b7cef6fa61/apps/gdaldem_lib.cpp#L1363 // It looks to be an approximation of the Zevenbergen and Thorne method, not the // real thing. Using same logic for consistency. inline void SlopeAspectZevenbergenThorneAlg(vw::ImageView<vw::PixelMask<float>> const& dem, vw::cartography::GeoReference const& georef, int col, int row, vw::PixelMask<float> & slope, vw::PixelMask<float> & aspect) { // The slope and aspect start as invalid slope.invalidate(); aspect.invalidate(); int num_cols = dem.cols(), num_rows = dem.rows(); // If the pixel is at the border, return invalid if (col <= 0 || row <= 0 || col >= num_cols - 1 || row >= num_rows - 1) return; // Form the afWin vector with the pixel values std::vector<double> afWin(9); int count = 0; for (int irow = -1; irow <= 1; irow++) { for (int icol = -1; icol <= 1; icol++) { auto val = dem(col + icol, row + irow); // If invalid, return invalid right away. Note how we check here only // either icol or irow being zero, as we don't use the diagonal values. // The original Zevenbergen and Thorne method uses those values, // but the GDAL implementation does not. if (!is_valid(val) && (icol == 0 || irow == 0)) return; afWin[count] = val.child(); count++; } } // To find the local grid size in x, convert pixels to projected coordinates. vw::Vector2 left_pt = georef.pixel_to_point(vw::Vector2(col - 1, row)); vw::Vector2 right_pt = georef.pixel_to_point(vw::Vector2(col + 1, row)); double grid_x = vw::math::norm_2(right_pt - left_pt) / 2.0; // Same for y vw::Vector2 top_pt = georef.pixel_to_point(vw::Vector2(col, row - 1)); vw::Vector2 bottom_pt = georef.pixel_to_point(vw::Vector2(col, row + 1)); double grid_y = vw::math::norm_2(bottom_pt - top_pt) / 2.0; // Compute the slope double dx = (afWin[3] - afWin[5]) / grid_x; double dy = (afWin[7] - afWin[1]) / grid_y; double key = dx * dx + dy * dy; // The division by 2 is needed because that's how centered differences are found slope = atan(sqrt(key)/2.0) * 180.0 / M_PI; slope.validate(); // Compute the aspect // TODO(oalexan1): It is not clear if need to divide by grid_x or grid_y here. // The GDAL code does not, but I think it should. These grid sizes are usually // about the same in projected coordinates, so likely it does not matter. dx = afWin[5] - afWin[3]; dy = afWin[7] - afWin[1]; if (dx == 0 && dy == 0) { aspect.invalidate(); return; } double a = atan2(dy, -dx) * 180.0 / M_PI; // Using the logic for when psData->bAngleAsAzimuth is true if (a > 90.0) a = 450.0 - a; else a = 90.0 - a; if (a >= 360.0) a -= 360.0; aspect = a; aspect.validate(); } // Calculate the DEM slope and aspect in degrees. Use the same logic as gdaldem. void calcSlopeAspect(vw::ImageView<vw::PixelMask<float>> const& dem, vw::cartography::GeoReference const& georef, // Outputs vw::ImageView<vw::PixelMask<float>> & slope, vw::ImageView<vw::PixelMask<float>> & aspect) { // Allocate space for the output slope and aspect slope.set_size(dem.cols(), dem.rows()); aspect.set_size(dem.cols(), dem.rows()); #pragma omp parallel for for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { SlopeAspectZevenbergenThorneAlg(dem, georef, col, row, slope(col, row), aspect(col, row)); // outputs } } } }} // end namespace vw::cartography ================================================ FILE: src/asp/PcAlign/SlopeAspect.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NASA Vision Workbench is licensed under the Apache License, // Version 2.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_PC_ALIGN_SLOPE_ASPECT_H__ #define __ASP_PC_ALIGN_SLOPE_ASPECT_H__ #include <vw/Image/ImageView.h> #include <vw/Image/PixelMask.h> #include <vw/Cartography/GeoReference.h> namespace vw { namespace cartography { // Calculate the DEM slope and aspect in degrees. Use the same logic as gdaldem. void calcSlopeAspect(vw::ImageView<vw::PixelMask<float>> const& dem, vw::cartography::GeoReference const& georef, // Outputs vw::ImageView<vw::PixelMask<float>> & slope, vw::ImageView<vw::PixelMask<float>> & aspect); }} // namespace vw::cartography #endif // __ASP_PC_ALIGN_SLOPE_ASPECT_H__ ================================================ FILE: src/asp/PcAlign/pc_align_ceres.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Implement least square alignment using the Ceres solver. #include <asp/PcAlign/pc_align_ceres.h> #include <asp/PcAlign/pc_align_utils.h> #include <asp/Core/EigenUtils.h> #include <ceres/ceres.h> #include <ceres/loss_function.h> namespace asp { using namespace vw; // Discrepancy between a 3D point with the rotation to be solved // applied to it, and its projection straight down onto the DEM. Used // with the least squares method of finding the best transform between // clouds. struct PointToDemError { PointToDemError(Vector3 const& point, ImageViewRef<vw::PixelMask<float> > const& dem, cartography::GeoReference const& geo): m_point(point), m_dem(dem), m_geo(geo){} template <typename F> bool operator()(const F* const transform, const F* const scale, F* residuals) const { // Default residuals are zero, if we can't project into the DEM residuals[0] = F(0.0); // Extract the translation, and rotation Vector3 translation; Quat rotation; extract_rotation_translation(transform, rotation, translation); Vector3 trans_point = scale[0]*rotation.rotate(m_point) + translation; // Convert from GDC to GCC Vector3 llh = m_geo.datum().cartesian_to_geodetic(trans_point); // lon-lat-height // Interpolate the point at this location double dem_height_here; if (!interp_dem_height(m_dem, m_geo, llh, dem_height_here)) { // If we did not intersect the DEM, record a flag error value here. residuals[0] = F(0.0); return true; } residuals[0] = llh[2] - dem_height_here; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(Vector3 const& point, vw::ImageViewRef<vw::PixelMask<float> > const& dem, vw::cartography::GeoReference const& geo){ return (new ceres::NumericDiffCostFunction<PointToDemError, ceres::CENTRAL, 1, 6, 1> (new PointToDemError(point, dem, geo))); } Vector3 m_point; ImageViewRef< PixelMask<float> > const & m_dem; // alias cartography::GeoReference const & m_geo; // alias }; /// Compute alignment using least squares Eigen::MatrixXd least_squares_alignment(DP const& source_point_cloud, // Should not be modified vw::Vector3 const& point_cloud_shift, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef< PixelMask<float> > const& dem_ref, std::string const& alignment_method, int num_iter, int num_threads) { ceres::Problem problem; // The final transform as a axis angle and translation pair std::vector<double> transform(6, 0.0); double scale = 1.0; // Add a residual block for every source point const std::int64_t num_pts = source_point_cloud.features.cols(); // Loop through every point in the point cloud for (std::int64_t i = 0; i < num_pts; i++){ // Extract and un-shift the point to get the real GCC coordinate Vector3 gcc_coord = get_cloud_gcc_coord(source_point_cloud, point_cloud_shift, i); ceres::CostFunction* cost_function = PointToDemError::Create(gcc_coord, dem_ref, dem_georef); ceres::LossFunction* loss_function = new ceres::CauchyLoss(0.5); // NULL; problem.AddResidualBlock(cost_function, loss_function, &transform[0], &scale); } // End loop through all points if (alignment_method == "least-squares") { // Only solve for rotation and translation problem.SetParameterBlockConstant(&scale); } ceres::Solver::Options options; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.max_num_iterations = num_iter; options.minimizer_progress_to_stdout = 1; options.num_threads = num_threads; options.linear_solver_type = ceres::SPARSE_SCHUR; // Solve the problem ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); vw_out() << summary.FullReport() << "\n" << std::endl; Quat rotation; Vector3 translation; extract_rotation_translation(&transform[0], rotation, translation); vw::Matrix<double,3,3> rot_matrix = rotation.rotation_matrix(); Eigen::MatrixXd T = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1); for (int row = 0; row < DIM; row++){ for (int col = 0; col < DIM; col++){ T(row, col) = scale*rot_matrix(col, row); } } for (int row = 0; row < DIM; row++) T(row, DIM) = translation[row]; // This transform is in the world coordinate system (as that's the natural // coord system for the DEM). Transform it to the internal shifted coordinate // system. T = apply_shift(T, point_cloud_shift); return T; } } // end namespace asp ================================================ FILE: src/asp/PcAlign/pc_align_ceres.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file pc_align_ceres.h /// #ifndef __ASP_TOOLS_PC_ALIGN_CERES_H__ #define __ASP_TOOLS_PC_ALIGN_CERES_H__ #include <asp/PcAlign/pc_align_utils.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/Image/ImageViewRef.h> #include <vw/Image/PixelMask.h> #include <vw/Math/Quaternion.h> namespace asp { /// Compute least squares alignment, using Ceres Eigen::MatrixXd least_squares_alignment(DP const& source_point_cloud, // Should not be modified vw::Vector3 const& point_cloud_shift, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef<vw::PixelMask<float> > const& dem_ref, std::string const& alignment_method, int num_iter, int num_threads); } #endif //__ASP_TOOLS_PC_ALIGN_CERES_H__ ================================================ FILE: src/asp/PcAlign/pc_align_fgr.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Implement least square alignment using the FGR method #include <asp/PcAlign/pc_align_fgr.h> #include <asp/PcAlign/pc_align_utils.h> #include <asp/Core/EigenUtils.h> // Can't do much about external warnings except hide them #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include <FastGlobalRegistration/app.h> #pragma GCC diagnostic pop namespace asp { using namespace vw; // Parse a string like: // div_factor: 1.4 use_absolute_scale: 0 max_corr_dist: 0.025 iteration_number: 100 tuple_scale: 0.95 tuple_max_cnt: 10000 void parse_fgr_options(std::string const & options, double & div_factor, bool & use_absolute_scale, double & max_corr_dist, int & iteration_number, float & tuple_scale, int & tuple_max_cnt){ // Initialize the outputs div_factor = -1; use_absolute_scale = false; max_corr_dist = -1; iteration_number = -1; tuple_scale = -1; tuple_max_cnt = -1; std::istringstream is(options); std::string name, val; while( is >> name >> val){ if (name.find("div_factor") != std::string::npos) div_factor = atof(val.c_str()); if (name.find("use_absolute_scale") != std::string::npos) use_absolute_scale = atof(val.c_str()); if (name.find("max_corr_dist") != std::string::npos) max_corr_dist = atof(val.c_str()); if (name.find("iteration_number") != std::string::npos) iteration_number = atof(val.c_str()); if (name.find("tuple_scale") != std::string::npos) tuple_scale = atof(val.c_str()); if (name.find("tuple_max_cnt") != std::string::npos) tuple_max_cnt = atof(val.c_str()); } // Sanity check if (div_factor <= 0 || max_corr_dist < 0 || iteration_number < 0 || tuple_scale <= 0 || tuple_max_cnt <= 0) { vw_throw( ArgumentErr() << "Could not parse correctly --fgr-options."); } } // Convert a point clould to the format expected by FGR void export_to_fgr(DP const & data, fgr::Points& pts, fgr::Feature & feat){ pts.clear(); feat.clear(); for (int c = 0; c < data.features.cols(); c++){ Eigen::Vector3f pts_v; for (int r = 0; r < 3; r++) pts_v[r] = data.features(r, c); pts.push_back(pts_v); // fgr expects features in addition to points. This works well enough, // but need to get to the bottom of whether they are necessary. feat.push_back(pts_v); } } /// Compute alignment using FGR Eigen::MatrixXd fgr_alignment(DP const & source_point_cloud, DP const & ref_point_cloud, std::string const& fgr_options) { // Parse the options and initialize the FGR object double div_factor; bool use_absolute_scale; double max_corr_dist; int iteration_number; float tuple_scale; int tuple_max_cnt; parse_fgr_options(fgr_options, div_factor, use_absolute_scale, max_corr_dist, iteration_number, tuple_scale, tuple_max_cnt); fgr::CApp app(div_factor, use_absolute_scale, max_corr_dist, iteration_number, tuple_scale, tuple_max_cnt); // Intermediate data fgr::Points pts; fgr::Feature feat; // Pass the reference cloud to FGR export_to_fgr(ref_point_cloud, pts, feat); app.LoadFeature(pts, feat); // Pass the source cloud to FGR export_to_fgr(source_point_cloud, pts, feat); app.LoadFeature(pts, feat); // Perform alignment app.NormalizePoints(); app.AdvancedMatching(); app.OptimizePairwise(true); Eigen::Matrix4f S = app.GetOutputTrans(); // Export the transform Eigen::MatrixXd T = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1); if (T.cols() != S.cols() || T.rows() != S.rows()) vw_throw( LogicErr() << "Error: size mis-match in FGR.\n"); for (int row = 0; row < T.rows(); row++) { for (int col = 0; col < T.cols(); col++) { T(row, col) = S(row, col); } } return T; } } // end namespace asp ================================================ FILE: src/asp/PcAlign/pc_align_fgr.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file pc_align_fgr.h /// #ifndef __ASP_TOOLS_PC_ALIGN_FGR_H__ #define __ASP_TOOLS_PC_ALIGN_FGR_H__ #include <asp/PcAlign/pc_align_utils.h> namespace asp { /// Compute alignment using FGR Eigen::MatrixXd fgr_alignment(DP const & source_point_cloud, DP const & ref_point_cloud, std::string const& fgr_options); } #endif //__ASP_TOOLS_PC_ALIGN_FGR_H__ ================================================ FILE: src/asp/PcAlign/pc_align_utils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // This tool uses libpointmatcher for alignment. BSD license. // https://github.com/ethz-asl/libpointmatcher #include <asp/PcAlign/pc_align_utils.h> #include <asp/Core/EigenUtils.h> #include <asp/Core/PointUtils.h> #include <asp/Core/PointCloudRead.h> #include <asp/Core/PdalUtils.h> #include <vw/Cartography/PointImageManipulation.h> #include <vw/Image/Filter.h> #include <pdal/PDALUtils.hpp> #include <pointmatcher/PointMatcher.h> namespace asp { using namespace vw; /// Apply a transform to the first three coordinates of the cloud struct TransformPC: public vw::UnaryReturnSameType { Eigen::MatrixXd m_T; TransformPC(Eigen::MatrixXd const& T): m_T(T){} inline vw::Vector<double> operator()(vw::Vector<double> const& pt) const { vw::Vector<double> P = pt; // local copy vw::Vector3 xyz = subvector(P, 0, 3); if (xyz == vw::Vector3()) return P; // invalid point vw::Vector3 Q = apply_transform_to_vec(m_T, xyz); subvector(P, 0, 3) = Q; return P; } }; // Generate labels compatible with libpointmatcher PLabels form_labels(int dim) { PLabels labels; typedef typename PointMatcher<double>::DataPoints::Label Label; for (int i=0; i < dim; i++) { std::string text; text += char('x' + i); labels.push_back(Label(text, 1)); } labels.push_back(Label("pad", 1)); return labels; } // Load xyz points from disk into a matrix with 4 columns. Last column is just ones. void load_cloud_as_mat(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::BBox2 const& copc_win, bool copc_read_all, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, bool & is_lola_rdr_format, double & median_longitude, bool verbose, Eigen::MatrixXd & data) { if (verbose) vw::vw_out() << "Reading: " << file_name << std::endl; // Remote files should not be checked for existence if (!asp::is_las(file_name) || !pdal::Utils::isRemote(file_name)) PointMatcherSupport::validateFile(file_name); // We will over-write this below for CSV and DEM files where // longitude is available. median_longitude = 0.0; std::string file_type = get_cloud_type(file_name); if (file_type == "DEM") load_dem(file_name, num_points_to_load, lonlat_box, calc_shift, shift, verbose, data); else if (file_type == "PC") load_pc(file_name, num_points_to_load, lonlat_box, calc_shift, shift, geo, verbose, data); else if (file_type == "LAS") load_las(file_name, num_points_to_load, lonlat_box, copc_win, copc_read_all, calc_shift, shift, geo, verbose, data); else if (file_type == "CSV") { bool verbose = true; load_csv(file_name, num_points_to_load, lonlat_box, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, median_longitude, verbose, data); } else { vw::vw_throw(vw::ArgumentErr() << "Unknown file type: " << file_name << "\n"); } if (data.cols() == 0) vw::vw_throw(vw::ArgumentErr() << "File: " << file_name << " has 0 valid points.\n"); if (verbose) vw::vw_out() << "Loaded points: " << data.cols() << std::endl; return; } // Load xyz points from disk in libpointmatcher's format. void load_cloud(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::BBox2 const& copc_win, bool copc_read_all, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, bool & is_lola_rdr_format, double & median_longitude, bool verbose, typename PointMatcher<double>::DataPoints & data) { data.featureLabels = form_labels(DIM); load_cloud_as_mat(file_name, num_points_to_load, lonlat_box, copc_win, copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, median_longitude, verbose, data.features); } // Calculate the lon-lat bounding box of the points and bias it based // on max displacement (which is in meters). This is used to throw // away points in the other cloud which are not within this box. // Handle the situation when there is an initial transform applied // to the source points. void calc_extended_lonlat_bbox(vw::cartography::GeoReference const& geo, int num_sample_pts, CsvConv const& csv_conv, std::string const& file_name, double max_disp, Eigen::MatrixXd const & transform, vw::BBox2 const& copc_win, bool copc_read_all, bool need_projwin, vw::cartography::GeoReference const& projwin_georef, vw::BBox2 & out_box, vw::BBox2 & trans_out_box, vw::BBox2 & needed_projwin) { // Initialize out_box = vw::BBox2(); trans_out_box = vw::BBox2(); needed_projwin = vw::BBox2(); // If the user does not want to use the max-displacement parameter, // or if there is no datum to use to convert to/from lon/lat, // there is not much we can do. if (max_disp < 0.0 || geo.datum().name() == UNSPECIFIED_DATUM) return; PointMatcher<double>::DataPoints points; double median_longitude = 0.0; // to convert back from xyz to lonlat bool verbose = false; bool calc_shift = false; // won't shift the points vw::Vector3 shift = vw::Vector3(0, 0, 0); vw::BBox2 dummy_box; bool is_lola_rdr_format = false; // will be overwritten // Load a sample of points, hopefully enough to estimate the box reliably. load_cloud(file_name, num_sample_pts, dummy_box, copc_win, copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, median_longitude, verbose, points); bool has_transform = (transform != Eigen::MatrixXd::Identity(DIM + 1, DIM + 1)); // For the first point, figure out how much shift in lonlat a small // shift in XYZ produces. We will use this to expand out from the // test points when computing the bounding box. vw::Vector3 p1; vw::BBox2 box1, box1_trans; for (int row = 0; row < DIM; row++) p1[row] = points.features(row, 0); for (int x = -1; x <= 1; x += 2) { for (int y = -1; y <= 1; y += 2) { for (int z = -1; z <= 1; z += 2) { vw::Vector3 q = p1 + vw::Vector3(x, y, z)*max_disp; vw::Vector3 llh = geo.datum().cartesian_to_geodetic(q); llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjust box1.grow(subvector(llh, 0, 2)); // Do the same thing in transformed coordinates if (has_transform) { vw::Vector3 qT = apply_transform_to_vec(transform, q); vw::Vector3 llhT = geo.datum().cartesian_to_geodetic(qT); llhT[0] += 360.0*round((median_longitude - llhT[0])/360.0); // 360 deg adjust box1_trans.grow(subvector(llhT, 0, 2)); } } } } const double EXPANSION_MARGIN = 1.05; // Pad the size a little bit just to be safe. const double rad_lon = EXPANSION_MARGIN * box1.width () / 2.0; const double rad_lat = EXPANSION_MARGIN * box1.height () / 2.0; const double rad_lonT = EXPANSION_MARGIN * box1_trans.width () / 2.0; const double rad_latT = EXPANSION_MARGIN * box1_trans.height() / 2.0; // Make a box around each point the size of the box we computed earlier and // keep growing the output bounding box. for (int col = 0; col < points.features.cols(); col++) { vw::Vector3 p; for (int row = 0; row < DIM; row++) p[row] = points.features(row, col); vw::Vector3 q = p; vw::Vector3 llh = geo.datum().cartesian_to_geodetic(q); llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjust vw::BBox2 b(llh[0]-rad_lon, llh[1]-rad_lat, rad_lon*2, 2*rad_lat); out_box.grow(b); if (need_projwin) needed_projwin.grow(projwin_georef.lonlat_to_point(subvector(llh, 0, 2))); // Do the same thing in transformed coordinates if (has_transform) { vw::Vector3 qT = apply_transform_to_vec(transform, q); vw::Vector3 llhT = geo.datum().cartesian_to_geodetic(qT); llhT[0] += 360.0*round((median_longitude - llhT[0])/360.0); // 360 deg adjust vw::BBox2 bT(llhT[0]-rad_lonT, llhT[1]-rad_latT, 2*rad_lonT, 2*rad_latT); trans_out_box.grow(bT); if (need_projwin) needed_projwin.grow(projwin_georef.lonlat_to_point(subvector(llhT, 0, 2))); } } if (!has_transform) trans_out_box = out_box; // Here we assume needed_projwin is in units of meter, so in projected // (non-geographic) space if (need_projwin && max_disp > 0) needed_projwin.expand(max_disp); return; } // Sometime the box we computed with cartesian_to_geodetic is offset // from the box computed with pixel_to_lonlat by 360 degrees. // Fix that. void adjust_lonlat_bbox(std::string const& file_name, vw::BBox2 & box) { using namespace vw; // Can only adjust DEM boxes if (get_cloud_type(file_name) != "DEM") return; cartography::GeoReference georef; bool has_georef = cartography::read_georeference(georef, file_name); if (!has_georef) vw_throw(ArgumentErr() << "DEM: " << file_name << " does not have a georeference.\n"); DiskImageView<float> dem(file_name); BBox2 box2 = georef.pixel_to_lonlat_bbox(bounding_box(dem)); double mean_lon = (box.min().x() + box.max().x())/2.0; double mean_lon2 = (box2.min().x() + box2.max().x())/2.0; double lon_offset = mean_lon2 - mean_lon; lon_offset = 360.0*round(lon_offset/360.0); box += Vector2(lon_offset, 0); } double calc_mean(std::vector<double> const& errs, int len) { // Check that len is valid if (len < 0 || len > static_cast<int>(errs.size())) vw::vw_throw(vw::ArgumentErr() << "Invalid length in calc_mean.\n"); double mean = 0.0; for (int i = 0; i < len; i++) { mean += errs[i]; } if (len == 0) return 0; return mean/len; } double calc_stddev(std::vector<double> const& errs) { int len = errs.size(); if (len == 0) return 0; double mean = calc_mean(errs, len); double variance_sum = 0.0; for (int i = 0; i < len; i++) variance_sum += (errs[i] - mean) * (errs[i] - mean); return std::sqrt(variance_sum / len); } double calc_rmse(std::vector<double> const& errs) { int len = errs.size(); double sum = 0.0; for (int i = 0; i < len; i++) sum += errs[i] * errs[i]; if (len == 0) return 0; return sqrt(sum/len); } // Compute the translation vector from the source points (before any initial alignment // applied to them), and the source points after alignment. void calc_translation_vec(Eigen::MatrixXd const& initT, DP const& source, DP const& trans_source, vw::Vector3 & shift, // from planet center to current origin vw::cartography::Datum const& datum, vw::Vector3 & source_ctr_vec, vw::Vector3 & source_ctr_llh, vw::Vector3 & trans_xyz, vw::Vector3 & trans_ned, vw::Vector3 & trans_llh, vw::Matrix3x3 & NedToEcef) { // The center of gravity of the source points (after the initial transform is applied to them) Eigen::VectorXd source_ctr = source.features.rowwise().sum() / source.features.cols(); // Undo the initial transform, if any Eigen::MatrixXd invInitT = initT.inverse(); source_ctr = invInitT*source_ctr; // The center of gravity of the source points after aligning to the reference cloud Eigen::VectorXd trans_source_ctr = trans_source.features.rowwise().sum() / trans_source.features.cols(); // Copy to VW's vectors vw::Vector3 trans_source_ctr_vec; for (int row = 0; row < DIM; row++) { source_ctr_vec[row] = source_ctr(row, 0); trans_source_ctr_vec[row] = trans_source_ctr(row, 0); } // Make these vectors in reference to the center of the planet source_ctr_vec += shift; trans_source_ctr_vec += shift; trans_xyz = trans_source_ctr_vec - source_ctr_vec; source_ctr_llh = datum.cartesian_to_geodetic(source_ctr_vec); vw::Vector3 trans_source_ctr_llh = datum.cartesian_to_geodetic(trans_source_ctr_vec); trans_llh = trans_source_ctr_llh - source_ctr_llh; // The matrix to go from the NED coordinate system to the ECEF coordinate system NedToEcef = datum.lonlat_to_ned_matrix(source_ctr_llh); trans_ned = inverse(NedToEcef)*trans_xyz; } // Calculate the maximum displacement from the source points (after // any initial transform is applied to them) to the source points // after alignment with the reference. double calc_max_displacement(DP const& source, DP const& trans_source) { double max_obtained_disp = 0.0; int numPts = source.features.cols(); for (int col = 0; col < numPts; col++) { vw::Vector3 s, t; for (int row = 0; row < DIM; row++) { s[row] = source.features(row, col); t[row] = trans_source.features(row, col); } max_obtained_disp = std::max(max_obtained_disp, norm_2(s - t)); } return max_obtained_disp; } /// Save a transformed point cloud with N bands template<int n> // Number of bands void save_trans_point_cloud_n(vw::GdalWriteOptions const& opt, vw::cartography::GeoReference const& geo, std::string input_file, std::string output_file, Eigen::MatrixXd const& T) { // We will try to save the transformed cloud with a georef. Try to get it from // the input cloud, or otherwise from the "global" georef. vw::cartography::GeoReference curr_geo; bool has_georef = vw::cartography::read_georeference(curr_geo, input_file); if (!has_georef && geo.datum().name() != UNSPECIFIED_DATUM) { has_georef = true; curr_geo = geo; } // There is no nodata bool has_nodata = false; double nodata = -std::numeric_limits<float>::max(); // smallest float vw::ImageViewRef<vw::Vector<double, n>> point_cloud; if constexpr (n == 3) point_cloud = read_asp_point_cloud_3(input_file); else if constexpr (n == 4) point_cloud = read_asp_point_cloud_4(input_file); else if constexpr (n == 6) point_cloud = read_asp_point_cloud_6(input_file); vw::cartography::block_write_gdal_image(output_file, per_pixel_filter(point_cloud, TransformPC(T)), has_georef, curr_geo, has_nodata, nodata, opt, vw::TerminalProgressCallback("asp", "\t--> ")); } /// Apply a given transform to the point cloud in input file, /// and save it. /// Note: We transform the entire point cloud, not just the resampled /// version used in alignment. void save_trans_point_cloud(vw::GdalWriteOptions const& opt, std::string input_file, std::string out_prefix, vw::BBox2 const& copc_win, bool copc_read_all, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, Eigen::MatrixXd const& T) { std::string file_type = get_cloud_type(input_file); std::string output_file; if (file_type == "CSV") output_file = out_prefix + ".csv"; else if (file_type == "LAS") output_file = out_prefix + boost::filesystem::path(input_file).extension().string(); else output_file = out_prefix + ".tif"; vw::vw_out() << "Writing: " << output_file << std::endl; if (file_type == "DEM") { // TODO(oalexan1): This must be a function. vw::cartography::GeoReference dem_geo; bool has_georef = vw::cartography::read_georeference(dem_geo, input_file); if (!has_georef) vw_throw(vw::ArgumentErr() << "DEM: " << input_file << " does not have a georeference.\n"); vw::DiskImageView<float> dem(input_file); double nodata = std::numeric_limits<double>::quiet_NaN(); { boost::shared_ptr<vw::DiskImageResource> dem_rsrc (new vw::DiskImageResourceGDAL(input_file)); if (dem_rsrc->has_nodata_read()) nodata = dem_rsrc->nodata_read(); } vw::ImageViewRef<vw::Vector3> point_cloud = geodetic_to_cartesian(dem_to_geodetic(create_mask(dem, nodata), dem_geo), dem_geo.datum()); // Save the georeference with the cloud, to help point2dem later bool has_nodata2 = false; // the cloud should not use DEM nodata vw::cartography::block_write_gdal_image(output_file, per_pixel_filter(point_cloud, TransformPC(T)), has_georef, dem_geo, has_nodata2, nodata, opt, vw::TerminalProgressCallback("asp", "\t--> ")); } else if (file_type == "PC") { // Need this logic because we cannot open an image // with n channels without knowing n beforehand. // TODO(oalexan1): This must be a function. int nc = vw::get_num_channels(input_file); switch (nc) { case 3: save_trans_point_cloud_n<3>(opt, geo, input_file, output_file, T); break; case 4: save_trans_point_cloud_n<4>(opt, geo, input_file, output_file, T); break; case 6: save_trans_point_cloud_n<6>(opt, geo, input_file, output_file, T); break; default: vw_throw(vw::ArgumentErr() << "The point cloud from " << input_file << " has " << nc << " channels, which is not supported.\n"); } } else if (file_type == "LAS") { asp::apply_transform_to_las(input_file, output_file, copc_win, copc_read_all, T); } else if (file_type == "CSV") { // Write a CSV file in format consistent with the input CSV file. // TODO(oalexan1): This must be a function. vw::BBox2 empty_box, copc_win; bool verbose = false, copc_read_all = false; bool calc_shift = true; vw::Vector3 shift; bool is_lola_rdr_format; double median_longitude; DP point_cloud; load_cloud(input_file, std::numeric_limits<int>::max(), empty_box, copc_win, copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, median_longitude, verbose, point_cloud); std::ofstream outfile(output_file.c_str()); outfile.precision(16); // Write the header line if (csv_conv.is_configured()) { outfile << "# " << csv_conv.write_header_string(","); outfile << std::endl; } else { if (is_lola_rdr_format) outfile << "# longitude,latitude,radius (km)" << std::endl; else outfile << "# latitude,longitude,height above datum (meters)" << std::endl; } // Save the datum, may be useful to know what it was if (geo.datum().name() != UNSPECIFIED_DATUM) { outfile << "# " << geo.datum() << std::endl; outfile << "# Projection: " << geo.get_wkt() << std::endl; } int numPts = point_cloud.features.cols(); vw::TerminalProgressCallback tpc("asp", "\t--> "); int hundred = 100; int spacing = std::max(numPts/hundred, 1); double inc_amount = 1.0 / hundred; for (int col = 0; col < numPts; col++) { Eigen::VectorXd V(DIM + 1); for (int row = 0; row < DIM; row++) V[row] = point_cloud.features(row, col) + shift[row]; V[DIM] = 1; // Apply the transform V = T*V; vw::Vector3 P; for (int row = 0; row < DIM; row++) P[row] = V[row]; if (csv_conv.is_configured()) { vw::Vector3 csv = csv_conv.cartesian_to_csv(P, geo, median_longitude); outfile << csv[0] << ',' << csv[1] << ',' << csv[2] << std::endl; } else { vw::Vector3 llh = geo.datum().cartesian_to_geodetic(P); // lon-lat-height llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjustment if (is_lola_rdr_format) outfile << llh[0] << ',' << llh[1] << ',' << norm_2(P)/1000.0 << std::endl; else outfile << llh[1] << ',' << llh[0] << ',' << llh[2] << std::endl; } if (col%spacing == 0) tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); outfile.close(); } else { vw_throw(vw::ArgumentErr() << "Unknown file type: " << input_file << "\n"); } } // end save_trans_point_cloud InterpolationReadyDem load_interpolation_ready_dem(std::string const& dem_path, vw::cartography::GeoReference & georef) { // Load the georeference from the DEM bool has_georef = vw::cartography::read_georeference(georef, dem_path); if (!has_georef) vw::vw_throw(vw::ArgumentErr() << "DEM: " << dem_path << " does not have a georeference.\n"); // Set up file handle to the DEM and read the nodata value vw::DiskImageView<float> dem(dem_path); double nodata = std::numeric_limits<double>::quiet_NaN(); { boost::shared_ptr<vw::DiskImageResource> dem_rsrc(new vw::DiskImageResourceGDAL(dem_path)); if (dem_rsrc->has_nodata_read()) nodata = dem_rsrc->nodata_read(); } // Set up interpolation + mask view of the DEM vw::ImageViewRef<vw::PixelMask<float>> masked_dem = create_mask(dem, nodata); return InterpolationReadyDem(interpolate(masked_dem)); } /// Try to read the georef/datum info, need it to read CSV files. void read_georef(std::vector<std::string> const& clouds, std::string const& datum_str, std::string const& csv_srs, double semi_major_axis, double semi_minor_axis, std::string & csv_format_str, asp::CsvConv& csv_conv, vw::cartography::GeoReference& geo) { // Use an initialized datum for the georef, so later we can check // if we manage to populate it. { vw::cartography::Datum datum(UNSPECIFIED_DATUM, "User Specified Spheroid", "Reference Meridian", 1, 1, 0); geo.set_datum(datum); } // First, get the datum from the DEM if available. bool is_good = false; std::string dem_file = ""; for (size_t it = 0; it < clouds.size(); it++) { if (asp::get_cloud_type(clouds[it]) == "DEM") { dem_file = clouds[it]; break; } } if (dem_file != "") { vw::cartography::GeoReference local_geo; bool have_georef = vw::cartography::read_georeference(local_geo, dem_file); if (!have_georef) vw::vw_throw(vw::ArgumentErr() << "DEM: " << dem_file << " does not have a georeference.\n"); geo = local_geo; is_good = true; } // Then, try to set it from the pc file if available. // Either one, or both or neither of the pc files may have a georef. std::string pc_file = ""; for (size_t it = 0; it < clouds.size(); it++) { if (is_good) break; if (asp::get_cloud_type(clouds[it]) == "PC") { vw::cartography::GeoReference local_geo; if (vw::cartography::read_georeference(local_geo, clouds[it])) { pc_file = clouds[it]; geo = local_geo; vw::vw_out() << "Detected datum from " << pc_file << ":\n" << geo.datum() << std::endl; is_good = true; break; } } } // Then, try to set it from the las file if available. // Either one, or both or neither of the las files may have a georef. std::string las_file = ""; for (size_t it = 0; it < clouds.size(); it++) { if (is_good) break; if (asp::get_cloud_type(clouds[it]) == "LAS") { vw::cartography::GeoReference local_geo; if (asp::georef_from_las(clouds[it], local_geo)) { las_file = clouds[it]; geo = local_geo; vw::vw_out() << "Detected datum from " << las_file << ":\n" << geo.datum() << std::endl; is_good = true; } } } // We should have read in the datum from an input file, but check to see if // we should override it with input parameters. if (datum_str != "") { // If the user set the datum, use it. vw::cartography::Datum datum; datum.set_well_known_datum(datum_str); geo.set_datum(datum); is_good = true; } else if (semi_major_axis > 0 && semi_minor_axis > 0) { // Otherwise, if the user set the semi-axes, use that. vw::cartography::Datum datum("User Specified Datum", "User Specified Spheroid", "Reference Meridian", semi_major_axis, semi_minor_axis, 0.0); geo.set_datum(datum); is_good = true; } // This must be the last as it has priority. Add to the georef based on --csv-srs. if (csv_conv.parse_georef(geo)) is_good = true; if (is_good) vw::vw_out() << "Will use datum (for CSV files): " << geo.datum() << std::endl; // A lot of care is needed below. if (!is_good && (csv_format_str == "" || csv_conv.get_format() != asp::CsvConv::XYZ)) { // There is no DEM/LAS to read the datum from, and the user either // did not specify the CSV format (then we set it to lat, lon, // height), or it is specified as containing lat, lon, rather than xyz. bool has_csv = false; for (size_t it = 0; it < clouds.size(); it++) has_csv = has_csv || (asp::get_cloud_type(clouds[it]) == "CSV"); if (has_csv) { // We are in trouble, will not be able to convert input lat, lon, to xyz. vw::vw_throw(vw::ArgumentErr() << "Cannot detect the datum. " << "Please specify it via --csv-srs or --datum or " << "--semi-major-axis and --semi-minor-axis.\n"); } else { // The inputs have no georef. Will have to write xyz. vw::vw_out() << "No datum specified. Will write output CSV files " << "in the x,y,z format." << std::endl; csv_format_str = "1:x 2:y 3:z"; csv_conv.parse_csv_format(csv_format_str, csv_srs); is_good = true; } } if (!is_good) vw::vw_throw(vw::InputErr() << "The datum is required and could not be set.\n"); return; } void extract_rotation_translation(const double * transform, vw::Quat & rotation, vw::Vector3 & translation) { vw::Vector3 axis_angle; for (int i = 0; i < 3; i++) { translation[i] = transform[i]; axis_angle[i] = transform[i+3]; } rotation = vw::math::axis_angle_to_quaternion(axis_angle); } /// Extracts the full GCC coordinate of a single point from a LibPointMatcher point cloud. /// - The shift converts from the normalized coordinate to the actual GCC coordinate. /// - No bounds checking is performed on the point index. Vector3 get_cloud_gcc_coord(DP const& point_cloud, vw::Vector3 const& shift, int index) { Vector3 gcc_coord; for (int row = 0; row < DIM; ++row) gcc_coord[row] = point_cloud.features(row, index) + shift[row]; return gcc_coord; } bool interp_dem_height(vw::ImageViewRef<vw::PixelMask<float> > const& dem, vw::cartography::GeoReference const & georef, vw::Vector3 const & lonlat, double & dem_height) { // Convert the lon/lat location into a pixel in the DEM. vw::Vector2 pix; try { pix = georef.lonlat_to_pixel(subvector(lonlat, 0, 2)); } catch(...) { return false; } double c = pix[0], r = pix[1]; // Quit if the pixel falls outside the DEM. if (c < 0 || c >= dem.cols()-1 || // TODO: This ought to be an image class function r < 0 || r >= dem.rows()-1) return false; // Interpolate the DEM height at the pixel location vw::PixelMask<float> v = dem(c, r); if (!is_valid(v)) return false; dem_height = v.child(); return true; } // Consider a 4x4 matrix T which implements a rotation + translation // y = A*x + b. Consider a point s in space close to the points // x. We want to make that the new origin, so the points x get // closer to origin. In the coordinates (x2 = x - s, y2 = y - s) the // transform becomes y2 + s = A*(x2 + s) + b, or // y2 = A*x2 + b + A*s - s. Encode the obtained transform into another // 4x4 matrix T2. Eigen::MatrixXd apply_shift(Eigen::MatrixXd const& T, vw::Vector3 const& shift) { VW_ASSERT(T.cols() == 4 && T.rows() == 4, vw::ArgumentErr() << "Expected square matrix of size 4."); Eigen::MatrixXd A = T.block(0, 0, 3, 3); Eigen::MatrixXd b = T.block(0, 3, 3, 1); Eigen::MatrixXd s = b; for (int i = 0; i < 3; i++) s(i, 0) = shift[i]; Eigen::MatrixXd b2 = b + A*s - s; Eigen::MatrixXd T2 = T; T2.block(0, 3, 3, 1) = b2; return T2; } /// Filters out all points from point_cloud with an error entry higher than cutoff void filterPointsByError(DP & point_cloud, Eigen::MatrixXd &errors, double cutoff) { DP input_copy = point_cloud; // Make a copy of the input DP object // Init LPM data structure const int input_point_count = point_cloud.features.cols(); if (errors.cols() != input_point_count) vw_throw(LogicErr() << "Error: error size does not match point count size!\n"); point_cloud.features.conservativeResize(DIM+1, input_point_count); point_cloud.featureLabels = asp::form_labels(DIM); // Loop through all the input points and copy them to the output if they pass the test std::int64_t points_count = 0; for (std::int64_t col = 0; col < input_point_count; ++col) { if (errors(0,col) > cutoff) continue; // Error too high, don't add this point // Copy this point to the output LPM structure for (std::int64_t row = 0; row < DIM; row++) point_cloud.features(row, points_count) = input_copy.features(row, col); point_cloud.features(DIM, points_count) = 1; // Extend to be a homogenous coordinate ++points_count; // Update output point count } // End loop through points // Finalize the LPM data structure point_cloud.features.conservativeResize(Eigen::NoChange, points_count); } } // end namespace asp ================================================ FILE: src/asp/PcAlign/pc_align_utils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // This tool uses libpointmatcher for alignment, // https://github.com/ethz-asl/libpointmatcher // Copyright (c) 2010--2012, // Francois Pomerleau and Stephane Magnenat, ASL, ETHZ, Switzerland // You can contact the authors at <f dot pomerleau at gmail dot com> and // <stephane at magnenat dot net> #ifndef __PC_ALIGN_UTILS_H__ #define __PC_ALIGN_UTILS_H__ #include <Eigen/Dense> #include <vw/FileIO/DiskImageView.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Math/Quaternion.h> #include <vw/FileIO/GdalWriteOptions.h> #include <vw/Image/Interpolation.h> #include <limits> #include <cstring> #include <pointmatcher/PointMatcher.h> namespace asp { // Forward declaration - full definition in EigenUtils.h class CsvConv; // This file contains helper functions for the pc_align tool. // Some of these could probably be moved elsewhere, but many of them depend on // libpointmatcher object types. typedef PointMatcher<double> PM; typedef PM::DataPoints DP; typedef PointMatcher<double>::DataPoints::Labels PLabels; const std::string UNSPECIFIED_DATUM = "unspecified_datum"; // Generate labels compatible with libpointmatcher PLabels form_labels(int dim); // Load xyz points from disk into a matrix with 4 columns. Last column is just ones. void load_cloud_as_mat(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::BBox2 const& copc_win, bool copc_read_all, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, bool & is_lola_rdr_format, double & median_longitude, bool verbose, Eigen::MatrixXd & data); /// Load a file from disk and convert to libpointmatcher's format void load_cloud(std::string const& file_name, std::int64_t num_points_to_load, vw::BBox2 const& lonlat_box, vw::BBox2 const& copc_win, bool copc_read_all, bool calc_shift, vw::Vector3 & shift, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, bool & is_lola_rdr_format, double & median_longitude, bool verbose, typename PointMatcher<double>::DataPoints & data); /// Calculate the lon-lat bounding box of the points and bias it based /// on max displacement (which is in meters). This is used to throw /// away points in the other cloud which are not within this box. /// Return a version of it with given transform applied to it. /// Also may calculate a proj win if needed. void calc_extended_lonlat_bbox(vw::cartography::GeoReference const& geo, int num_sample_pts, CsvConv const& csv_conv, std::string const& file_name, double max_disp, Eigen::MatrixXd const & transform, vw::BBox2 const& copc_win, bool copc_read_all, bool need_projwin, vw::cartography::GeoReference const& projwin_georef, vw::BBox2 & out_box, vw::BBox2 & trans_out_box, vw::BBox2 & needed_projwin); /// Compute the mean value of an std::vector out to a length double calc_mean(std::vector<double> const& errs, int len); /// Compute the standard deviation of an std::vector double calc_stddev(std::vector<double> const& errs); /// Compute the root mean square error of an std::vector double calc_rmse(std::vector<double> const& errs); /// Calculate translation vector between the centers two point clouds void calc_translation_vec(Eigen::MatrixXd const& initT, DP const& source, DP const& trans_source, vw::Vector3 & shift, // from planet center to current origin vw::cartography::Datum const& datum, vw::Vector3 & source_ctr_vec, vw::Vector3 & source_ctr_llh, vw::Vector3 & trans_xyz, vw::Vector3 & trans_ned, vw::Vector3 & trans_llh, vw::Matrix3x3 & NedToEcef); /// Calculate max distance between any two points of two point clouds. double calc_max_displacement(DP const& source, DP const& trans_source); /// Apply a transformation matrix to a Vector3 in homogenous coordinates vw::Vector3 apply_transform(Eigen::MatrixXd const& T, vw::Vector3 const& P); /// Apply a given transform to the point cloud in input file, and save it. /// - Note: We transform the entire point cloud, not just the resampled /// version used in alignment. void save_trans_point_cloud(vw::GdalWriteOptions const& opt, std::string input_file, std::string out_prefix, vw::BBox2 const& copc_win, bool copc_read_all, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, Eigen::MatrixXd const& T); /// A type for interpolation from a masked DEM object. typedef vw::InterpolationView<vw::EdgeExtensionView<vw::ImageViewRef<vw::PixelMask<float>>, vw::ConstantEdgeExtension>, vw::BilinearInterpolation> InterpolationReadyDem; /// Get ready to interpolate points on a DEM existing on disk. InterpolationReadyDem load_interpolation_ready_dem(std::string const& dem_path, vw::cartography::GeoReference & georef); // Extract rotation and translation from a vector of 6 elements void extract_rotation_translation(const double * transform, vw::Quat & rotation, vw::Vector3 & translation); vw::Vector3 get_cloud_gcc_coord(DP const& point_cloud, vw::Vector3 const& shift, int index); /// Interpolates the DEM height at the input coordinate. /// - Returns false if the coordinate falls outside the valid DEM area. bool interp_dem_height(vw::ImageViewRef<vw::PixelMask<float>> const& dem, vw::cartography::GeoReference const& georef, vw::Vector3 const& lonlat, double & dem_height); /// Consider a 4x4 matrix T which implements a rotation + translation /// y = A*x + b. Consider a point s in space close to the points /// x. We want to make that the new origin, so the points x get /// closer to origin. In the coordinates (x2 = x - s, y2 = y - s) the /// transform becomes y2 + s = A*(x2 + s) + b, or /// y2 = A*x2 + b + A*s - s. Encode the obtained transform into another 4x4 matrix T2. Eigen::MatrixXd apply_shift(Eigen::MatrixXd const& T, vw::Vector3 const& shift); // Sometime the box we computed with cartesian_to_geodetic is offset // from the box computed with pixel_to_lonlat by 360 degrees. // Fix that. void adjust_lonlat_bbox(std::string const& file_name, vw::BBox2 & box); /// Try to read the georef/datum info, need it to read CSV files. void read_georef(std::vector<std::string> const& clouds, std::string const& datum_str, std::string const& csv_srs, double semi_major_axis, double semi_minor_axis, std::string & csv_format_str, asp::CsvConv& csv_conv, vw::cartography::GeoReference& geo); /// Filters out all points from point_cloud with an error entry higher than cutoff void filterPointsByError(DP & point_cloud, Eigen::MatrixXd &errors, double cutoff); } #endif // #define __PC_ALIGN_UTILS_H__ ================================================ FILE: src/asp/PclIO/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspPclIO "${ASP_PCLIO_SRC_FILES}" "${ASP_PCLIO_TEST_FILES}" "${ASP_PCLIO_LIB_DEPENDENCIES}") ================================================ FILE: src/asp/PclIO/PclIO.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Interface with PCL. #include <vw/Image/ImageViewRef.h> #include <vw/FileIO/FileUtils.h> #include <asp/PclIO/PclIO.h> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> namespace fs = boost::filesystem; namespace asp { void writeCloud(vw::ImageViewRef<vw::Vector<double, 4>> cloud, vw::ImageViewRef<float> out_texture, vw::ImageViewRef<float> weight, std::string const& cloud_file) { std::string ext = fs::path(cloud_file).extension().string(); boost::algorithm::to_lower(ext); if (ext != ".pcd" && ext != ".ply") vw::vw_throw(vw::ArgumentErr() << "The input point cloud extension must be .pcd or .ply."); // Create the output directory vw::create_out_dir(cloud_file); // Save the cloud std::cout << "Writing: " << cloud_file << std::endl; bool write_ply = (ext == ".ply"); if (write_ply) { // Write ply pcl::PointCloud<pcl::PointXYZI> pc; pc.width = std::int64_t(cloud.cols()) * std::int64_t(cloud.rows()); // avoid int overflow pc.height = 1; pc.points.resize(std::int64_t(pc.width) * std::int64_t(pc.height)); // avoid overflow std::int64_t count = 0; for (std::int64_t col = 0; col < cloud.cols(); col++) { for (std::int64_t row = 0; row < cloud.rows(); row++) { vw::Vector<double, 4> const& Q = cloud(col, row); // alias if (subvector(Q, 0, 3) != vw::Vector3() && weight(col, row) > 0) { pc.points[count].x = Q[0]; pc.points[count].y = Q[1]; pc.points[count].z = Q[2]; pc.points[count].intensity = out_texture(col, row); // intensity count++; } } } pc.width = count; pc.points.resize(pc.width * pc.height); pcl::io::savePLYFileBinary(cloud_file, pc); } else { // Write pcd pcl::PointCloud<pcl::PointNormal> pc; pc.width = std::int64_t(cloud.cols()) * std::int64_t(cloud.rows()); pc.height = 1; pc.points.resize(pc.width * pc.height); std::int64_t count = 0; for (std::int64_t col = 0; col < cloud.cols(); col++) { for (std::int64_t row = 0; row < cloud.rows(); row++) { vw::Vector<double, 4> const& Q = cloud(col, row); // alias if (subvector(Q, 0, 3) != vw::Vector3() && weight(col, row) > 0) { pc.points[count].x = Q[0]; pc.points[count].y = Q[1]; pc.points[count].z = Q[2]; // As expected by VoxBlox pc.points[count].normal_x = out_texture(col, row); // intensity pc.points[count].normal_y = weight(col, row); // weight pc.points[count].normal_z = Q[3]; // intersection error pc.points[count].curvature = 0; // ensure initialization count++; } } } pc.width = count; pc.points.resize(pc.width * pc.height); pcl::io::savePCDFileBinary(cloud_file, pc); } return; } } // end namespace asp ================================================ FILE: src/asp/PclIO/PclIO.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file PclIo.h /// #ifndef __ASP_PCLIO_PCLIO_H__ #define __ASP_PCLIO_PCLIO_H__ #include <string> #include <vw/Image/ImageViewRef.h> namespace asp { void writeCloud(vw::ImageViewRef<vw::Vector<double, 4>> cloud, vw::ImageViewRef<float> out_texture, vw::ImageViewRef<float> weight, std::string const& cloud_file); } // end namespace asp #endif//__ASP_PCLIO_PCLIO_H__ ================================================ FILE: src/asp/Python/CMakeLists.txt ================================================ # Python # Install all of the python files. set(PYTHON_FILES asp_alg_utils.py asp_image_utils.py asp_cmd_utils.py asp_string_utils.py asp_file_utils.py asp_system_utils.py asp_geo_utils.py asp_stereo_utils.py asp_rig_utils.py asp_dist_utils.py) foreach(p ${PYTHON_FILES}) INSTALL(FILES ${p} DESTINATION libexec) endforeach() ================================================ FILE: src/asp/Python/asp_alg_utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ Misc functions implementing algorithms. """ from __future__ import print_function import sys, os, re, string, time, math class BBox: def __init__(self, x, y, width, height): self.x = x self.y = y self.width = width self.height = height def add_collar(self, size): '''Expands the BBox in all directions by the given size''' self.x -= size self.y -= size self.width += 2*size self.height += 2*size def name_str(self): return "%i_%i_%i_%i" % (self.x, self.y, self.width, self.height) def as_array(self): '''Return the upper-left corner and dimensions of the crop box in an array of strings.''' return [str(self.x), str(self.y), str(self.width), str(self.height)] def __str__(self): return 'BBox('+ str(self.x) +', '+ str(self.y) +', '+ str(self.width) +', '+ str(self.height) +')' def dirToTile(dir): ''' From run/run-512_0_512_512 extract the bbox 512 0 512 512. ''' # Split by _ and - parts = re.split('[-_]', dir) # Must be at least 4 of them if len(parts) < 4: raise Exception('Could not extract bbox from ' + dir) # Last 4 parts are the bbox bbox = BBox(int(parts[-4]), int(parts[-3]), int(parts[-2]), int(parts[-1])) return bbox def readDirList(out_prefix): '''Read the subdirectories for parallel_stereo.''' dirList = out_prefix + '-dirList.txt' # Must exist if not os.path.exists(dirList): raise Exception('Incomplete parallel_stereo run. Cannot find: ' + dirList) # Read and parse the tiles f = open(dirList, 'r') lines = f.readlines() f.close() dirs = [] for line in lines: line = line.strip() # Remove empty lines if line == '': continue dirs.append(line) return dirs def readTiles(out_prefix): '''Read the tiles corresponding to parallel_stereo subdirectories.''' dirs = readDirList(out_prefix) tiles = [] for dir in dirs: dir = dir.strip() if dir == '': continue tiles.append(dirToTile(dir)) return tiles def intersect_boxes(A, B): axmin = A.x; axmax = A.x + A.width; aymin = A.y; aymax = A.y + A.height bxmin = B.x; bxmax = B.x + B.width; bymin = B.y; bymax = B.y + B.height xmin = max(axmin, bxmin); xmax = min(axmax, bxmax) ymin = max(aymin, bymin); ymax = min(aymax, bymax) C = BBox(0, 0, 0, 0) C.x = xmin; C.width = xmax - xmin if (C.width < 0): C.width = 0 C.y = ymin; C.height = ymax - ymin if (C.height < 0): C.height = 0 return C def generateTileDir(startX, startY, stopX, stopY): """Generate the name of a tile based on its location""" tileString = 'tile_' + str(startX) + '_' + str(startY) + '_' + str(stopX) + '_' + str(stopY) return tileString def generateTileName(startX, startY, stopX, stopY): """Generate the name of a tile based on its location""" return generateTileDir(startX, startY, stopX, stopY) + ".tif" # Split a segment of of given length in pieces of about given size. # All pieces are about the same length. def genSegmentList(length, size, padding): if length <= 0: length = 1 if size <= 0: size = 1 num = int(math.ceil(length/float(size))) # if in doubt, make pieces smaller if num <= 0: num = 1 goodSize = int(math.floor(length/float(num))) if goodSize <= 0: goodSize = 1 # numBig segments will have length goodSize + 1, and the rest will have length goodSize numBig = length - goodSize*num count = 0 L = [0] for c in range(0, num): if count < numBig: curLen = goodSize + 1 else: curLen = goodSize count = count + 1 pos = L[-1] + curLen L.append(pos) return L def isVrt(filename): ''' Peek at the first line and see if it this is a vrt. ''' if (not os.path.exists(filename)) or os.path.isdir(filename): return False try: with open(filename, 'r', encoding='utf-8') as f: line = f.readline().lower() if line.startswith('<vrtdataset'): return True except: # Binary files will be handled here return False return False ================================================ FILE: src/asp/Python/asp_cmd_utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # TODO: Move this to asp_system_utils """General systems related utilities""" from __future__ import print_function import sys, os, re, shutil, subprocess, string, time, errno, multiprocessing, shlex def wipe_option(options, opt, n): # In the array 'options', find the entry with value 'opt'. # Wipe this entry and the next n values. while opt in options: r = options.index(opt) if r < len(options): del options[r] # rm 'opt' for i in range(n): if r < len(options): del options[r] def replace_opt_val(argv, opt, old_val, new_val): # In the array 'options', find the entry with value 'opt'. # If the value that follows is 'old_val', replace it with 'new_val'. # Find the index of opt in argv try: r = argv.index(opt) except: return argv # There must be another value after the option if r+1 >= len(argv): raise CmdRunException("Option " + opt + " has no value") # Replace the value if argv[r+1] == str(old_val): argv[r+1] = str(new_val) return argv def option_val(argv, opt): # Find the value that follows the option 'opt' in the array 'argv'. # If the value is not found, return None. try: r = argv.index(opt) except: return None # There must be another value after the option if r+1 >= len(argv): return None # Return the value return argv[r+1] class CmdRunException(Exception): '''Exception type indicating an error with a cmd call''' pass def isCmdOption(arg): """Returns True if the string is a command line option, False otherwise (if it is an argument)""" # An option must start with '-' and not consist of all numbers if ( arg.startswith('-') and not re.match(r'^-[0-9.]+$', arg) ): return True else: return False # Utilities to ensure that the Python parser does not garble negative # values such as '-365' into '-3'. escapeStr='esc_rand_str' def escape_vals(vals): for index, val in enumerate(vals): p = re.match(r"^-[\.\d]", val) if p: vals[index] = escapeStr + val return vals def unescape_vals(vals): for index, val in enumerate(vals): p = re.match(r"^" + escapeStr + "(-.*?)$", val) if p: vals[index] = p.group(1) return vals def clean_args(args): '''Fix various problems that can happen in the input args''' args = unescape_vals(args) argsout = [] return args def get_option(options, opt, n): # In the array 'options', find and return the entry with value 'opt' # and the next n values. output = [] r = options.index(opt) if r < len(options): output.append(options[r]) for i in range(1,n+1): if r+i < len(options): output.append(options[r+i]) return output def set_option(options, opt, new_values): '''In the array 'options', find the entry with value 'opt'. Replace the next values with new_values.''' if opt in options: # The option is already included, update its value. r = options.index(opt) if r < len(options): r += 1 for i in new_values: if r < len(options): options[r] = str(i) r += 1 else: # The option is not present, add it. options.append(opt) for i in new_values: options.append(str(i)) ================================================ FILE: src/asp/Python/asp_dist_utils.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2026, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ Utility functions for stereo_dist (distributed stereo processing). """ import sys, subprocess, os, math, shlex import asp_system_utils from asp_stereo_utils import Step, readDistTileList def tileGridSize(tiles): '''Given a list of (BBox, padding) tuples from readDistTileList, return (num_cols, num_rows) of the tile grid.''' xs = set(tile.x for (tile, padding) in tiles) ys = set(tile.y for (tile, padding) in tiles) return (len(xs), len(ys)) def numMosaicJobs(nodesListPath, numProcesses): '''Compute the number of parallel dem_mosaic jobs for DEM assembly. Uses nodes * processes, capped at 32.''' numNodes = asp_system_utils.getNumNodesInList(nodesListPath) if numProcesses is not None and numProcesses > 0: numJobs = numNodes * numProcesses else: numJobs = numNodes * asp_system_utils.get_num_cpus() return min(numJobs, 32) def buildMosaicBlockLists(outPrefix, numJobs, suffix='DEM'): '''Partition tile raster files into blocks for parallel mosaicking. Reads the distributed tile list, collects existing files with the given suffix (e.g., DEM, DRG, IntersectionErr), divides the tile grid into blocks, writes per-block list files, and returns a list of (blockListFile, blockOutputFile) tuples.''' # Read the list of tiles tiles = readDistTileList(outPrefix) numTiles = len(tiles) if numTiles == 0: raise Exception('No tiles found in tile list.') # Collect files with given suffix that exist demFiles = [] for (tile, padding) in tiles: tileSubdir = outPrefix + '-' + tile.name_str() tilePrefix = tileSubdir + '/' + os.path.basename(outPrefix) demFile = tilePrefix + '-' + suffix + '.tif' if os.path.exists(demFile): demFiles.append(demFile) if len(demFiles) == 0: raise Exception('No ' + suffix + ' files found in tile directories.') print('Found ' + str(len(demFiles)) + ' ' + suffix + ' files to mosaic.') # Compute tile grid size and number of parallel jobs (numCols, numRows) = tileGridSize(tiles) print('Tile grid: ' + str(numCols) + ' cols x ' + str(numRows) + ' rows') # Each block must have at least 2 tiles. Use this to limit the number of jobs maxJobs = (numCols * numRows) // 2 numJobs = max(min(numJobs, maxJobs), 1) print('Num mosaic jobs: ' + str(numJobs)) # Divide tile grid into blocks matching the aspect ratio aspect = float(numCols) / float(max(numRows, 1)) blockCols = int(round(math.sqrt(numJobs * aspect))) blockRows = int(round(numJobs / float(max(blockCols, 1)))) blockCols = max(blockCols, 1) blockRows = max(blockRows, 1) blockCols = min(blockCols, numCols) blockRows = min(blockRows, numRows) print('Block grid: ' + str(blockCols) + ' x ' + str(blockRows) + ' = ' + str(blockCols * blockRows) + ' blocks') # Compute tiles per block in each dimension tilesPerBlockX = int(math.ceil(numCols / blockCols)) tilesPerBlockY = int(math.ceil(numRows / blockRows)) print('Tiles per block: ' + str(tilesPerBlockX) + ' x ' + str(tilesPerBlockY)) # Build sorted lists of distinct tile starting corner coordinates tileStartCornerX = sorted(set(tile.x for (tile, padding) in tiles)) tileStartCornerY = sorted(set(tile.y for (tile, padding) in tiles)) # Build a map from (x, y) origin to file path demMap = {} for (tile, padding) in tiles: tileSubdir = outPrefix + '-' + tile.name_str() tilePrefix = tileSubdir + '/' + os.path.basename(outPrefix) demFile = tilePrefix + '-' + suffix + '.tif' if os.path.exists(demFile): demMap[(tile.x, tile.y)] = demFile # Keep track of each partial DEM mosaic name and of the list of DEMs # that goes into making it. masterList = [] # Assign tiles to blocks. For each block, find which tile grid columns # and rows it covers, convert grid indices to pixel origins via # tileStartCornerX/Y, and look up the DEM file in demMap. for by in range(blockRows): for bx in range(blockCols): # Range of tile indices for this block colStart = bx * tilesPerBlockX colEnd = min((bx + 1) * tilesPerBlockX, numCols) rowStart = by * tilesPerBlockY rowEnd = min((by + 1) * tilesPerBlockY, numRows) blockDems = [] for ci in range(colStart, colEnd): for ri in range(rowStart, rowEnd): # Tile corner in pixel coordinates key = (tileStartCornerX[ci], tileStartCornerY[ri]) if key in demMap: # Collect DEMs that exist blockDems.append(demMap[key]) # Skip empty blocks if len(blockDems) == 0: continue # Write this block's DEM list file blockIndex = len(masterList) blockDemListFile = (outPrefix + '-mosaicBlock_' + str(blockIndex) + '_' + suffix + '.txt') blockOutputDem = (outPrefix + '-mosaicBlock_' + str(blockIndex) + '-' + suffix + '.tif') with open(blockDemListFile, 'w') as f: for d in blockDems: f.write(d + '\n') masterList.append((blockDemListFile, blockOutputDem)) print('Block ' + str(blockIndex) + ' (' + str(bx) + ', ' + str(by) + '): ' + str(len(blockDems)) + ' DEMs, list: ' + blockDemListFile) return masterList def queryMapproject(dem, image, camera, outputImage, extraArgs): '''Run mapproject_single --query-projection and return parsed settings.''' queryArgs = ['--query-projection', '--write-wkt', dem, image] if camera: queryArgs.append(camera) queryArgs.append(outputImage) queryArgs += extraArgs sep = "," return asp_system_utils.run_and_parse_output( 'mapproject_single', queryArgs, sep, verbose=False) def runMapprojection(opt, settings, outPrefix, entryPoint): '''Mapproject both input images onto the DEM with a common projection, grid size, and bounding box. Return the paths to the mapprojected images. If entryPoint > 0, skip mapprojection and just return the expected paths, verifying that the mapprojected images already exist.''' in_file1 = settings['in_file1'][0] in_file2 = settings['in_file2'][0] cam_file1 = settings['cam_file1'][0] cam_file2 = settings['cam_file2'][0] leftMap = outPrefix + '-left_map.tif' rightMap = outPrefix + '-right_map.tif' # If resuming from a later entry point, just verify the mapprojected # images exist and return their paths. if entryPoint > Step.pprc: for f in [leftMap, rightMap]: if not os.path.exists(f): raise Exception('Mapprojected image not found: ' + f + '. Run from entry point 0 first.') print('Skipping mapprojection (entry point > ' + str(Step.pprc) + ').') return (leftMap, rightMap) # Create the output directory if needed outDir = os.path.dirname(outPrefix) if outDir and not os.path.exists(outDir): os.makedirs(outDir) # Step 1: Query left image to get auto projection, GSD, and bounding box. # If --t_srs is provided, use it for the left query too. leftExtraArgs = [] if opt.t_srs is not None: leftExtraArgs = ['--t_srs', opt.t_srs] print('Querying projection for the left image.') leftQuery = queryMapproject(opt.dem, in_file1, cam_file1, leftMap, leftExtraArgs) leftGsd = float(leftQuery['pixel_size'][0]) leftWkt = leftQuery['projection_wkt_file'][0] leftXmin = float(leftQuery['proj_box_xmin'][0]) leftYmin = float(leftQuery['proj_box_ymin'][0]) leftXmax = float(leftQuery['proj_box_xmax'][0]) leftYmax = float(leftQuery['proj_box_ymax'][0]) print('Left GSD: ' + str(leftGsd)) print('Left WKT: ' + leftWkt) print('Left proj box: ' + str(leftXmin) + ' ' + str(leftYmin) + ' ' + str(leftXmax) + ' ' + str(leftYmax)) # Step 2: Query right image with the left projection forced print('Querying projection for the right image.') rightQuery = queryMapproject(opt.dem, in_file2, cam_file2, rightMap, ['--t_srs', leftWkt]) rightGsd = float(rightQuery['pixel_size'][0]) rightXmin = float(rightQuery['proj_box_xmin'][0]) rightYmin = float(rightQuery['proj_box_ymin'][0]) rightXmax = float(rightQuery['proj_box_xmax'][0]) rightYmax = float(rightQuery['proj_box_ymax'][0]) print('Right GSD: ' + str(rightGsd)) print('Right proj box: ' + str(rightXmin) + ' ' + str(rightYmin) + ' ' + str(rightXmax) + ' ' + str(rightYmax)) # Step 3: Use the finer (smaller) GSD gsd = min(abs(leftGsd), abs(rightGsd)) # Step 4: Intersect the two bounding boxes xmin = max(leftXmin, rightXmin) ymin = max(leftYmin, rightYmin) xmax = min(leftXmax, rightXmax) ymax = min(leftYmax, rightYmax) if xmin >= xmax or ymin >= ymax: raise Exception('The two images do not overlap in projected space.') # Step 5: Override with user-provided values if opt.tr is not None: gsd = opt.tr print('Using input GSD: ' + str(gsd)) else: print('Using min estim GSD: ' + str(gsd)) if opt.t_projwin is not None: xmin = opt.t_projwin[0] ymin = opt.t_projwin[1] xmax = opt.t_projwin[2] ymax = opt.t_projwin[3] print('Using input box: ' + str(xmin) + ' ' + str(ymin) + ' ' + str(xmax) + ' ' + str(ymax)) else: print('Using intersection box: ' + str(xmin) + ' ' + str(ymin) + ' ' + str(xmax) + ' ' + str(ymax)) if opt.t_srs is not None: leftWkt = opt.t_srs print('Using input projection: ' + leftWkt) # Step 6: Run mapproject on both images with common parameters commonArgs = ['--t_srs', leftWkt, '--tr', str(gsd), '--t_projwin', str(xmin), str(ymin), str(xmax), str(ymax)] mapprojectPath = asp_system_utils.bin_path('mapproject') for (image, camera, outputPath, label) in \ [(in_file1, cam_file1, leftMap, 'left'), (in_file2, cam_file2, rightMap, 'right')]: cmd = [mapprojectPath] + commonArgs + [opt.dem, image] if camera: cmd.append(camera) cmd.append(outputPath) if opt.nodes_list: cmd += ['--nodes-list', opt.nodes_list] print('Mapprojecting ' + label + ' image.') if opt.verbose or opt.dryrun: print(' '.join(cmd)) if not opt.dryrun: subprocess.check_call(cmd) return (leftMap, rightMap) def mapprojAndUpdateArgs(opt, settings, outPrefix, sep): '''Mapproject both images onto the DEM with consistent parameters, then rebuild the argument list to use the mapprojected images instead of the originals. Return updated (args, settings, outPrefix).''' (leftMap, rightMap) = runMapprojection(opt, settings, outPrefix, opt.entry_point) # Care is needed when the images are .cub so have the cameras embedded. For RPC, # the mapprojected images will be .tif but will hve internally the cameras, so no # need for extra args. in_file1 = settings['in_file1'][0] in_file2 = settings['in_file2'][0] cam_file1 = settings['cam_file1'][0] cam_file2 = settings['cam_file2'][0] if settings['stereo_session'][0] == 'isis': if not cam_file1: cam_file1 = in_file1 if not cam_file2: cam_file2 = in_file2 # named_options has all the options and values we need to pass through named_opts = settings.get('named_options', ['']) if named_opts == ['']: named_opts = [] args = [leftMap, rightMap] if cam_file1: args.append(cam_file1) if cam_file2: args.append(cam_file2) args.append(outPrefix) args += named_opts # Add the DEM for the stereo pipeline, if not already present if '--dem' not in args: args.extend(['--dem', opt.dem]) # Re-parse with updated args. Likely redundant, but good to have as a # sanity check that we reconnected correctly the args. settings = asp_system_utils.run_and_parse_output("stereo_parse", args, sep, opt.verbose) outPrefix = settings['out_prefix'][0] return (args, settings, outPrefix) def runStereoTiles(opt, args, outPrefix, tileEntryPoint, tileStopPoint): '''Run stereo_tile on all tiles using GNU Parallel.''' tiles = readDistTileList(outPrefix) numTiles = len(tiles) if numTiles == 0: raise Exception('No tiles found in tile list.') print('Running stereo_tile on ' + str(numTiles) + ' tiles.') # Write argument file (one tile index per line) argumentFilePath = outPrefix + '-tileArgs.txt' with open(argumentFilePath, 'w') as f: for i in range(numTiles): f.write(str(i) + '\n') # Set up GNU parallel arguments parallelArgs = ['--will-cite', '--env', 'ASP_DEPS_DIR', '--env', 'PATH', '--env', 'LD_LIBRARY_PATH', '--env', 'ASP_LIBRARY_PATH', '--env', 'ISISROOT'] if opt.parallel_options is not None: parallelArgs += opt.parallel_options.split(' ') # Determine number of processes numProcesses = opt.processes if numProcesses is None: numProcesses = asp_system_utils.get_num_cpus() # Build stereo_tile command with placeholder for tile index pythonPath = sys.executable stereoTilePath = asp_system_utils.libexec_path('stereo_tile') commandList = [pythonPath, stereoTilePath, '--tile-index', '{1}', '--entry-point', str(tileEntryPoint), '--stop-point', str(tileStopPoint)] if opt.dem: commandList += ['--dem', opt.dem] if opt.point2dem_options: commandList += ['--point2dem-options', opt.point2dem_options] if opt.verbose: commandList.append('--verbose') if opt.dryrun: commandList.append('--dry-run') commandList += args # Append the run directory so the child can chdir to it runDir = asp_system_utils.escape_token(os.getcwd()) commandList += ['--run-dir', runDir] # Prepend parallel args to command fullCommandList = parallelArgs + commandList if opt.dryrun: print('Run GNU parallel with ' + str(numProcesses) + ' processes') print('Command: ' + ' '.join(fullCommandList)) return asp_system_utils.runInGnuParallel(numProcesses, argumentFilePath, fullCommandList, opt.nodes_list, opt.verbose) def runBlockMosaic(opt, masterFile): '''Run dem_mosaic in parallel on blocks via stereo_tile --dem-mosaic-index.''' # Count blocks in master file with open(masterFile, 'r') as f: lines = [l.strip() for l in f if l.strip()] numBlocks = len(lines) if numBlocks == 0: raise Exception('No blocks in master file: ' + masterFile) print('Running dem_mosaic on ' + str(numBlocks) + ' blocks.') # Write argument file (one block index per line, 0-based) argumentFilePath = masterFile.replace('.txt', '-args.txt') with open(argumentFilePath, 'w') as f: for i in range(numBlocks): f.write(str(i) + '\n') # Set up GNU parallel arguments parallelArgs = ['--will-cite', '--env', 'ASP_DEPS_DIR', '--env', 'PATH', '--env', 'LD_LIBRARY_PATH', '--env', 'ASP_LIBRARY_PATH', '--env', 'ISISROOT'] if opt.parallel_options is not None: parallelArgs += opt.parallel_options.split(' ') # Determine number of processes numProcesses = opt.processes if numProcesses is None: numProcesses = asp_system_utils.get_num_cpus() # Build stereo_tile command with --dem-mosaic-index placeholder pythonPath = sys.executable stereoTilePath = asp_system_utils.libexec_path('stereo_tile') commandList = [pythonPath, stereoTilePath, '--dem-mosaic-index', '{1}', '--dem-mosaic-master', masterFile] if opt.verbose: commandList.append('--verbose') if opt.dryrun: commandList.append('--dry-run') # Append the run directory so the child can chdir to it runDir = asp_system_utils.escape_token(os.getcwd()) commandList += ['--run-dir', runDir] # Prepend parallel args to command fullCommandList = parallelArgs + commandList if opt.dryrun: print('Run GNU parallel with ' + str(numProcesses) + ' processes') print('Command: ' + ' '.join(fullCommandList)) return asp_system_utils.runInGnuParallel(numProcesses, argumentFilePath, fullCommandList, opt.nodes_list, opt.verbose) def mosaicProduct(opt, outPrefix, numJobs, suffix): '''Mosaic blocks of per-tile products (DEM, DRG, or IntersectionErr) in parallel, then mosaic the block results into a final output.''' # Partition tile files into blocks for parallel mosaicking masterList = buildMosaicBlockLists(outPrefix, numJobs, suffix) # Write master file having the list of lists to mosaic masterFile = outPrefix + '-mosaicMaster_' + suffix + '.txt' with open(masterFile, 'w') as f: for (listFile, outputFile) in masterList: f.write(listFile + ' ' + outputFile + '\n') print('Wrote master mosaic file: ' + masterFile + ' with ' + str(len(masterList)) + ' blocks') # Run parallel dem_mosaic per block runBlockMosaic(opt, masterFile) # Final merge of block files blockFiles = [outputFile for (listFile, outputFile) in masterList] blockFiles = [f for f in blockFiles if os.path.exists(f)] if len(blockFiles) == 0: raise Exception('No block ' + suffix + ' files were produced.') finalFile = outPrefix + '-' + suffix + '.tif' print('Merging ' + str(len(blockFiles)) + ' block ' + suffix + ' files into ' + finalFile) demMosaicPath = asp_system_utils.bin_path('dem_mosaic') commandList = [demMosaicPath] + blockFiles + ['-o', finalFile] if not opt.dryrun: if opt.verbose: print(' '.join(commandList)) subprocess.call(commandList) # Clean up partial block mosaics and helper lists print('Removing partial ' + suffix + ' mosaics and helper lists.') for (listFile, outputFile) in masterList: if os.path.exists(outputFile): os.remove(outputFile) if os.path.exists(listFile): os.remove(listFile) # Remove the args file created by runBlockMosaic argsFile = masterFile.replace('.txt', '-args.txt') if os.path.exists(argsFile): os.remove(argsFile) if os.path.exists(masterFile): os.remove(masterFile) def mosaicDems(opt, outPrefix): '''Mosaic per-tile DEMs, and optionally DRG and IntersectionErr files.''' numJobs = numMosaicJobs(opt.nodes_list, opt.processes) # Always mosaic DEMs mosaicProduct(opt, outPrefix, numJobs, 'DEM') # Mosaic ortho images if --orthoimage was requested if opt.point2dem_options and '--orthoimage' in opt.point2dem_options: mosaicProduct(opt, outPrefix, numJobs, 'DRG') # Mosaic error images if --errorimage was requested if opt.point2dem_options and '--errorimage' in opt.point2dem_options: mosaicProduct(opt, outPrefix, numJobs, 'IntersectionErr') ================================================ FILE: src/asp/Python/asp_file_utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ General functions for handling files """ from __future__ import print_function import sys, os, re, shutil, subprocess, string, time, errno def createFolder(path): """Creates a folder if it does not already exist""" if path == '': return if not os.path.exists(path): os.makedirs(path) def removeIfExists(path): """Removes a file if it exists""" try: os.remove(path) except OSError as e: if e.errno != errno.ENOENT: # Continue if the error is "no such file or directory" raise # Re-raise the exception if a different error occurred def removeFolderIfExists(directory): """Removes a directory and everything in it""" try: shutil.rmtree(directory) except OSError as e: if e.errno != errno.ENOENT: # Continue if the error is "no such file or directory" raise # Re-raise the exception if a different error occurred def replaceExtensionAndFolder(inputPath, outputFolder, newExtension): """Convenience function to replace the extension and the folder of a file path""" newExt = os.path.splitext(inputPath)[0] + newExtension return os.path.join(outputFolder, os.path.basename(newExt)) def fileIsNonZero(path): '''Return true if the file exists and is non-empty''' if os.path.isfile(path) and (os.path.getsize(path) > 0): return True else: return False def getFileLineCount(filePath): """Counts up the number of lines in a file""" f = open(filePath) i = 0 for line in f: i = i + 1 return i def tarFileList(fileList, outputPath, compress=True, replacementNameList=None): """Creates a tar file containing a list of files with no absolute paths""" # An extra set of commands is needed to strip the absolute path name from each stored file tag = '-vcf' if compress: tag = '-jvcf' cmd = 'tar ' + tag + ' ' + outputPath if not replacementNameList: # Add all the files as they are for f in fileList: cmd = cmd + ' -C ' + os.path.dirname(f) + ' ' + os.path.basename(f) # Add the current path else: # Use the replacement names for the files for (f, r) in zip(fileList, replacementNameList): os.rename(f, r) # Temporarily replace the file path cmd = cmd + ' -C ' + os.path.dirname(r) + ' ' + os.path.basename(r) # Add the new path # Command set up, now run it! print(cmd) os.system(cmd) if replacementNameList: # Move all the files back to their original locations for (f, r) in zip(fileList, replacementNameList): os.rename(r, f) ================================================ FILE: src/asp/Python/asp_geo_utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ Functions for working with images containing geo metadata. """ from __future__ import print_function import sys, os, glob, re, shutil, string, time, errno, subprocess import asp_string_utils, asp_image_utils, asp_system_utils def getGdalInfoTagValue(text, tag): """Gets the value of a gdal parameter in a [""] tag or None if it is absent.""" try: lineAfterTag = asp_string_utils.getLineAfterText(text, tag) # The remaining line should look like this: ",25], commaPos = lineAfterTag.find(',') bracketPos = lineAfterTag.find(']') # The value is always returned as a string return asp_string_utils.convertToFloatIfNumber(lineAfterTag[commaPos+1:bracketPos]) except Exception: # Requested tag was not found return None def convertCoordinate(input_srs_string, output_srs_string, x, y): '''Convert a single 2D coordinate between proj.4 coordinate systems.''' cmd = [asp_system_utils.which('gdaltransform'), '-s_srs', input_srs_string, '-t_srs', output_srs_string] p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, encoding = 'utf8') input_str = str(x) + " " + str(y) out, err = p.communicate(input = input_str) parts = out.split() return (float(parts[0]), float(parts[1])) def getLonLatProjString(inputString): '''Given a projected proj4 string, get the longlat proj4 string''' if '+proj=longlat' in inputString: return inputString # The output string is longlat projection plus certain allowed proj4 keys. outputString = '+proj=longlat' keywords = ['+datum', '+ellps', '+no_defs', '+a', '+b'] parts = inputString.split() for p in parts: for k in keywords: if k in p: outputString += ' ' + p break return outputString # This can take a while if stats are requested def getImageGeoInfo(imagePath, getStats=True): """Obtains some image geo information from gdalinfo in dictionary format""" if not os.path.exists(imagePath): raise Exception('Error: input file ' + imagePath + ' does not exist!') outputDict = {} # Call command line tool silently cmd = [asp_system_utils.which('gdalinfo'), imagePath, '-proj4'] if getStats: cmd.append('-stats') p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) textOutput, err = p.communicate() # Get the size in pixels imageSizeLine = asp_string_utils.getLineAfterText(textOutput, 'Size is ') sizeVals = imageSizeLine.split(',') outputDict['image_size'] = (int(sizeVals[0]), int(sizeVals[1])) # Get origin location and pixel size originLine = asp_string_utils.getLineAfterText(textOutput, 'Origin = ') pixelSizeLine = asp_string_utils.getLineAfterText(textOutput, 'Pixel Size = ') originVals = asp_string_utils.getNumbersInParentheses(originLine) pixelSizeVals = asp_string_utils.getNumbersInParentheses(pixelSizeLine) outputDict['origin'] = originVals outputDict['pixel_size'] = pixelSizeVals # Get bounding box in projected coordinates upperLeftLine = asp_string_utils.getLineAfterText(textOutput, 'Upper Left') lowerRightLine = asp_string_utils.getLineAfterText(textOutput, 'Lower Right') (minX, maxY) = asp_string_utils.getNumbersInParentheses(upperLeftLine) (maxX, minY) = asp_string_utils.getNumbersInParentheses(lowerRightLine) outputDict['projection_bounds'] = (minX, maxX, minY, maxY) outputDict['projection_center'] = ( (minX+maxX)/2.0, (minY+maxY)/2.0 ) # Get some proj4 values outputDict['standard_parallel_1'] = getGdalInfoTagValue(textOutput, 'standard_parallel_1') outputDict['central_meridian'] = getGdalInfoTagValue(textOutput, 'central_meridian') # Get the projection type projStart = textOutput.find('PROJ.4 string is:') nextLine = textOutput.find("'", projStart)+1 endLine = textOutput.find("'", nextLine) outputDict['proj_string'] = textOutput[nextLine:endLine] outputDict['projection'] = 'UNKNOWN' if '+proj=eqc' in textOutput: outputDict['projection'] = 'EQUIRECTANGULAR' elif ('+proj=ster' in textOutput) or ('+proj=stere' in textOutput): outputDict['projection'] = 'POLAR STEREOGRAPHIC' outputDict['lonlat_bounds'] = outputDict['projection_bounds'] if '+proj=longlat' not in outputDict['proj_string']: longlatString = getLonLatProjString(outputDict['proj_string']) ul = convertCoordinate(outputDict['proj_string'], longlatString, minX, maxY) br = convertCoordinate(outputDict['proj_string'], longlatString, maxX, minY) outputDict['lonlat_bounds'] = (ul[0], br[0], br[1], ul[1]) # Extract this variable which ASP inserts into its point cloud files try: pointOffsetLine = asp_string_utils.getLineAfterText(textOutput, 'POINT_OFFSET=') # Tag name must be synced with C++ code offsetValues = pointOffsetLine.split(' ') outputDict['point_offset'] = (float(offsetValues[0]), float(offsetValues[1]), float(offsetValues[2])) except: pass # In most cases this line will not be present # TODO: Currently this does not find much information, and there # is another function in image_utils dedicated to returning statistics. if getStats: # List of dictionaries per band outputDict['band_info'] = [] # Populate band information band = 1 while (True): # Loop until we run out of bands bandString = 'Band ' + str(band) + ' Block=' bandLoc = textOutput.find(bandString) if bandLoc < 0: # Ran out of bands break # Found the band, read pertinent information bandInfo = {} # Get the type string bandLine = asp_string_utils.getLineAfterText(textOutput, bandString) typePos = bandLine.find('Type=') commaPos = bandLine.find(',') typeName = bandLine[typePos+5:commaPos-1] bandInfo['type'] = typeName outputDict['band_info'] = bandInfo band = band + 1 # Move on to the next band return outputDict def doesImageHaveGeoData(imagePath): '''Returns true if a file has geo data associated with it''' if not os.path.exists(imagePath): raise Exception('Image file ' + imagePath + ' not found!') # Call command line tool silently cmd = [asp_system_utils.which('gdalinfo'), imagePath, '-proj4'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) textOutput, err = p.communicate() # For now we just do a very simple check if "Coordinate System is `'" in textOutput: return False else: return True # This is a very handy function but it requires a C++ tool! # #def getGeoTiffBoundingBox(geoTiffPath): # """Returns (minLon, maxLon, minLat, maxLat) for a geotiff image""" # # if not os.path.exists(geoTiffPath): # raise Exception('Input file does not exist: ' + geoTiffPath) # # # Call command line tool silently # cmd = ['geoRefTool', '--printBounds', geoTiffPath] # p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) # textOutput, err = p.communicate() # # # Check that the call did not fail # if (textOutput.find('Failed') >= 0): # raise Exception('Error: getGeoTiffBoundingBox failed on input image: ' + geoTiffPath) # # # Parse the output # try: # minLat = float( asp_string_utils.getLineAfterText(textOutput, 'Min latitude =') ) # maxLat = float( asp_string_utils.getLineAfterText(textOutput, 'Max latitude =') ) # minLon = float( asp_string_utils.getLineAfterText(textOutput, 'Min longitude =') ) # maxLon = float( asp_string_utils.getLineAfterText(textOutput, 'Max longitude =') ) # except Exception as e: # print 'In file: ' + geoTiffPath # print 'In text:' # print textOutput # raise e # # return (minLon, maxLon, minLat, maxLat) # #========================================================================= # Start ISIS functions def getProjectedBoundsFromIsisLabel(filePath): '''Function to read the projected coordinates bounding box from an ISIS label file''' if not os.path.exists(filePath): raise Exception('Error, missing label file path!') # Read all the values! minX = None maxY = None pixRes = None numRows = None numCols = None f = open(filePath, 'r') for line in f: if ('UpperLeftCornerX' in line): s = asp_string_utils.getLineAfterText(line, '=') endPos = s.find('<') if (endPos >= 0): minX = float(s[:endPos-1]) else: minX = float(s) continue if ('UpperLeftCornerY' in line): s = asp_string_utils.getLineAfterText(line, '=') endPos = s.find('<') if (endPos >= 0): maxY = float(s[:endPos-1]) else: maxY = float(s) continue if ('PixelResolution' in line): s = asp_string_utils.getLineAfterText(line, '=') endPos = s.find('<') if (endPos >= 0): pixRes = float(s[:endPos-1]) else: pixRes = float(s) continue if (' Samples =' in line): s = asp_string_utils.getLineAfterText(line, '=') numCols = float(s) continue if (' Lines =' in line): s = asp_string_utils.getLineAfterText(line, '=') numRows = float(s) continue f.close() if (not minX) or (not maxY) or (not pixRes) or (not numRows) or (not numCols): raise Exception('Failed to find projected bounds in file ' + filePath) # Compute the other bounds maxX = minX + pixRes*numCols minY = maxY - pixRes*numRows return (minX, maxX, minY, maxY) def getProjectionFromIsisLabel(filePath): '''Function to read the projection type from an ISIS label file''' if not os.path.exists(filePath): raise Exception('Error, missing label file path!') f = open(filePath, 'r') for line in f: if ('MAP_PROJECTION_TYPE =' in line) or ('ProjectionName =' in line): line = line.replace('"','') # Strip quotes projType = asp_string_utils.getLineAfterText(line, '=').strip() f.close() return projType f.close() raise Exception('Unable to find projection type in file ' + filePath) def getBoundingBoxFromIsisLabel(filePath): '''Function to read the bounding box from an ISIS label file''' if not os.path.exists(filePath): raise Exception('Error, missing label file path!') numFound = 0 f = open(filePath, 'r') for line in f: if ('MINIMUM_LATITUDE' in line) or ('MinimumLatitude' in line): s = asp_string_utils.getLineAfterText(line, '=') endPos = s.find('<') if (endPos >= 0): minLat = float(s[:endPos-1]) else: minLat = float(s) numFound = numFound + 1 continue if ('MAXIMUM_LATITUDE' in line) or ('MaximumLatitude' in line): s = asp_string_utils.getLineAfterText(line, '=') endPos = s.find('<') if (endPos >= 0): maxLat = float(s[:endPos-1]) else: maxLat = float(s) numFound = numFound + 1 continue if ('EASTERNMOST_LONGITUDE' in line) or ('MAXIMUM_LONGITUDE' in line) or ('MaximumLongitude' in line): s = asp_string_utils.getLineAfterText(line, '=') endPos = s.find('<') # Check for unit name if (endPos >= 0): maxLon = float(s[:endPos-1]) else: maxLon = float(s) numFound = numFound + 1 continue if ('WESTERNMOST_LONGITUDE' in line) or ('MINIMUM_LONGITUDE' in line) or ('MinimumLongitude' in line): s = asp_string_utils.getLineAfterText(line, '=') endPos = s.find('<') # Check for unit name if (endPos >= 0): minLon = float(s[:endPos-1]) else: minLon = float(s) numFound = numFound + 1 continue if numFound == 4: break f.close() if numFound < 4: raise Exception('Failed to find lat/lon bounds in file ' + filePath) return (minLon, maxLon, minLat, maxLat) # TODO: Create a real bounding box class or something def getIsisBoundingBox(cubePath): """Returns (minLon, maxLon, minLat, maxLat) for an ISIS compatible object""" # Get the cube size, then request the positions of the four corners cubeSize = getImageSize(cubePath) # Note that the underlying ISIS tool is one-based points = [] firstPt = getPixelLocInCube(cubePath, 1, 1, )['gdc'] points.append(getPixelLocInCube(cubePath, cubeSize[0], 1, )['gdc']) points.append(getPixelLocInCube(cubePath, 1, cubeSize[1])['gdc']) points.append(getPixelLocInCube(cubePath, cubeSize[0], cubeSize[1])['gdc']) # Go through the four corners and get the bounding box minLon = firstPt[0] maxLon = firstPt[0] minLat = firstPt[1] maxLat = firstPt[1] for p in points: if p[0] < minLon: minLon = p[0] if p[0] > maxLon: maxLon = p[0] if p[1] < minLat: minLat = p[1] if p[1] > maxLat: maxLat = p[1] return (minLon, maxLon, minLat, maxLat) def getCubeCenterLatitude(cubePath, workDir='tmp'): """Calls caminfo on a cube and returns the CenterLatitude value""" # Make sure the requested file is present if not os.path.exists(cubePath): raise Exception('File ' + cubePath + ' does not exist!') # Call caminfo (from ISIS) on the input cube to find out the CenterLatitude value camInfoOuputPath = workDir + "/camInfoOutput.txt" cmd = 'caminfo from=' + cubePath + ' to=' + camInfoOuputPath print (cmd) os.system(cmd) if not os.path.exists(camInfoOuputPath): raise Exception('Call to caminfo failed on file ' + cubePath) # Read in the output file to extract the CenterLatitude value centerLatitude = -9999 infoFile = open(camInfoOuputPath, 'r') for line in infoFile: if (line.find('CenterLatitude') >= 0): centerLatitude = asp_string_utils.getNumberAfterEqualSign(line, ) break # Make sure we found the desired value if (centerLatitude == -9999) or (asp_string_utils.isString(centerLatitude)): raise Exception("Unable to find CenterLatitude from file " + cubePath) # Clean up temporary file os.remove(camInfoOuputPath) return centerLatitude # End ISIS related functions #====================================================================== def getImageBoundingBox(filePath): """Returns (minLon, maxLon, minLat, maxLat) for a georeferenced image file""" extension = os.path.splitext(filePath)[1] if asp_image_utils.isIsisFile(filePath): return getIsisBoundingBox(filePath) else: # Handle all other types return getGeoTiffBoundingBox(filePath) # Any other file types will end up raising some sort of exception # This function is not used. If it gets used, see the function with # same name in parallel_stereo. It is essential to add to the lines # below the line "<SourceProperties" element, as done there, to avoid # the "too many open files" problem when there are more than 1024 # tiles. def build_vrt(fullImageSize, tileLocs, tilePaths, outputPath): """Generates a VRT file from a set of image tiles and their locations in the output image""" outputFolder = os.path.dirname(outputPath) f = open(outputPath, 'w') f.write("<VRTDataset rasterXSize=\"%i\" rasterYSize=\"%i\">\n" % (int(fullImageSize[0]),int(fullImageSize[1])) ) # Write whole image size # ## If a tile is missing, for example, in the case we ## skipped it when it does not intersect user's crop box, ## substitute it with a different one, to ensure the mosaic ## does not have holes. --> Does this make sense? #goodFilename = "" #for tile in tiles: # Find the first valid tile (we don't care which one) # directory = settings['out_prefix'][0] + tile.name_str() # filename = directory + "/" + tile.name_str() + tile_postfix # if os.path.isfile(filename): # goodFilename = filename # break #if goodFilename == "": # raise Exception('No tiles were generated') # Read some metadata from one of the tiles gdalInfo = getImageGeoInfo(tilePaths[0]) num_bands = len(gdalInfo['band_info']) data_type = gdalInfo['band_info'][0]['type'] # This special metadata value is only used for ASP stereo point cloud files! if 'point_offset' in gdalInfo: f.write(" <Metadata>\n <MDI key=\"" + 'POINT_OFFSET' + "\">" + gdalInfo['point_offset'][0] + "</MDI>\n </Metadata>\n") # Write each band for b in range( 1, num_bands + 1 ): f.write(" <VRTRasterBand dataType=\"%s\" band=\"%i\">\n" % (data_type, b) ) # Write band data type and index for tile, tileLoc in zip(tilePaths, tileLocs): filename = tile imageSize = getImageSize(filename) # Get the image size for this tile ## Replace missing tile paths with the good tile we found earlier #if not os.path.isfile(filename): filename = goodFilename relative = os.path.relpath(filename, outputPath) # Relative path from the output file to the input tile f.write(" <SimpleSource>\n") f.write(" <SourceFilename relativeToVRT=\"1\">%s</SourceFilename>\n" % relative) # Write relative path f.write(" <SourceBand>%i</SourceBand>\n" % b) f.write(" <SrcRect xOff=\"%i\" yOff=\"%i\" xSize=\"%i\" ySize=\"%i\"/>\n" % (tileLoc[0], tileLoc[1], imageSize[0], imageSize[1]) ) # Source ROI (entire tile) f.write(" <DstRect xOff=\"%i\" yOff=\"%i\" xSize=\"%i\" ySize=\"%i\"/>\n" % (tileLoc[0], tileLoc[1], imageSize[0], imageSize[1]) ) # Output ROI (entire tile) f.write(" </SimpleSource>\n") f.write(" </VRTRasterBand>\n") f.write("</VRTDataset>\n") f.close() ================================================ FILE: src/asp/Python/asp_image_utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ Basic functions for working with images on disk. """ from __future__ import print_function import sys, os, re, subprocess, string, time, errno import asp_string_utils def stripRgbImageAlphaChannel(inputPath, outputPath): """Makes an RGB copy of an RBGA image""" cmd = 'gdal_translate ' + inputPath + ' ' + outputPath + ' -b 1 -b 2 -b 3 -co "COMPRESS=LZW" -co "TILED=YES" -co "BLOCKXSIZE=256" -co "BLOCKYSIZE=256"' print (cmd) os.system(cmd) def getImageSize(imagePath): """Returns the size [samples, lines] in an image""" # Make sure the input file exists if not os.path.exists(imagePath): raise Exception('Image file ' + imagePath + ' not found!') # Use subprocess to suppress the command output cmd = ['gdalinfo', imagePath] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) textOutput, err = p.communicate() # Extract the size from the text sizePos = textOutput.find('Size is') endPos = textOutput.find('\n', sizePos+7) sizeStr = textOutput[sizePos+7:endPos] sizeStrs = sizeStr.strip().split(',') numSamples = int(sizeStrs[0]) numLines = int(sizeStrs[1]) size = [numSamples, numLines] return size def isIsisFile(filePath): """Returns True if the file is an ISIS file, False otherwise.""" # Currently we treat all files with .cub extension as ISIS files extension = os.path.splitext(filePath)[1] return (extension == '.cub') def getImageStats(imagePath): """Obtains some image statistics from gdalinfo""" if not os.path.exists(imagePath): raise Exception('Image file ' + imagePath + ' not found!') # Call command line tool silently cmd = ['gdalinfo', imagePath, '-stats'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) textOutput, err = p.communicate() # Statistics are computed separately for each band bandStats = [] band = 0 while (True): # Loop until we run out of bands # Look for the stats line for this band bandString = 'Band ' + str(band+1) + ' Block=' bandLoc = textOutput.find(bandString) if bandLoc < 0: return bandStats # Quit if we did not find it # Now parse out the statistics for this band bandMaxStart = textOutput.find('STATISTICS_MAXIMUM=', bandLoc) bandMeanStart = textOutput.find('STATISTICS_MEAN=', bandLoc) bandMinStart = textOutput.find('STATISTICS_MINIMUM=', bandLoc) bandStdStart = textOutput.find('STATISTICS_STDDEV=', bandLoc) bandMax = asp_string_utils.getNumberAfterEqualSign(textOutput, bandMaxStart) bandMean = asp_string_utils.getNumberAfterEqualSign(textOutput, bandMeanStart) bandMin = asp_string_utils.getNumberAfterEqualSign(textOutput, bandMinStart) bandStd = asp_string_utils.getNumberAfterEqualSign(textOutput, bandStdStart) # Add results to the output list bandStats.append( (bandMin, bandMax, bandMean, bandStd) ) band = band + 1 # Move to the next band ================================================ FILE: src/asp/Python/asp_rig_utils.py ================================================ #!/usr/bin/python import sys, os, re, subprocess, shutil, subprocess, glob import numpy as np if sys.version_info < (3, 0, 0): print('\nERROR: Must use Python 3.0 or greater.') sys.exit(1) def check_for_sub_images(images): """ If a an image like img.png is present, and also img_sub2.tif, the latter are likely unintended, and the tool must refuse to run. """ # Put them all in a set without the extension base_names = dict() for image in images: base_name = os.path.splitext(image)[0] base_names[base_name] = image # For any _sub images, check if the base image is present. # A sub image matches _sub[0-9]+ for base_name in base_names: m = re.match(r"^(.*)_sub[0-9]+$", base_name) if m: full_base_name = m.group(1) if full_base_name in base_names: full_img = base_names[full_base_name] img = base_names[base_name] raise Exception("Found images:\n\t" + full_img + "\n\t" + img + \ "\nThis is likely not intended and the sub-images were " "likely created with stereo_gui. Remove the sub-images.") def create_index_dict(lst): """ Create a dictionary mapping each element in the input list to its index in the list. """ index_dict = {} for index, value in enumerate(lst): index_dict[value] = index return index_dict def read_list(file): ''' Read entries from a file. Ignore empty lines. ''' vals = [] with open(file, 'r') as f: for line in f.readlines(): line = line.rstrip() if line == "": continue vals.append(line) return vals def read_image_pairs(file1, file2): """ Given two input lists, returns a list of tuples where each tuple contains one element from the first list and one element from the second list. """ list1 = read_list(file1) list2 = read_list(file2) if len(list1) != len(list2): raise Exception("The two input lists must have the same length.") pairs = [] for it in range(len(list1)): pairs.append((list1[it], list2[it])) return pairs def mkdir_p(path): if path == "": return # this can happen when path is os.path.dirname("myfile.txt") try: os.makedirs(path) except OSError: if os.path.isdir(path): pass else: raise Exception("Could not make directory " + path + " as a file with this name exists.") def which(program): """ Find the absolute path to a program based on the PATH environment variable. If not found, return None. """ def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) fpath, fname = os.path.split(program) if fpath: if is_exe(program): return program else: for path in os.environ["PATH"].split(os.pathsep): path = path.strip('"') exe_file = os.path.join(path, program) if is_exe(exe_file): return exe_file return None def find_tool(tool_base_dir, tool): """ Find a given program either in the given dir, or based on PATH. """ tool_path = tool_base_dir + "/bin/" + tool if not os.path.exists(tool_path): print("Could not find " + tool_path) tool_path = which(tool) if tool_path is None: raise Exception("Could not find " + tool + " in the PATH either.") else: print("Using: " + tool_path) return tool_path def add_missing_quotes(vals): """ Given a list of strings, protect each one having spaces with quotes, if not present. """ out_vals = [] for val in vals: if (' ' in val or '\t' in val) and (val[0] != '\'' and val[0] != '"'): val = '\'' + val + '\'' out_vals.append(val) return out_vals def run_cmd(cmd, quit_on_failure = True): """ Run a command. Print the output in real time. """ # This is a bugfix for not printing quotes around strings with spaces fmt_cmd = add_missing_quotes(cmd) print(" ".join(fmt_cmd)) # Note how we redirect stderr to stdout p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) # Print the standard output in real time status = 0 while True: out = p.stdout.readline() if not out: break # finished the run # Print the line but wipe the extra whitespace print(out.rstrip()) status = p.poll() # Sometimes status is None which appears to be a bug in Python. # Let that pass. Only if the status is a valid integer and non-zero, # then quit on failure if requested to do so. if status is not None and status != 0 and quit_on_failure: print("Failed execution of: " + " ".join(cmd) + " with status " + str(status)) sys.exit(1) return status def readConfigVals(handle, tag, num_vals): """ Read a tag and vals. If num_vals > 0, expecting to read this many vals. """ vals = [] while True: line = handle.readline() # Wipe everything after pound but keep the newline, # as otherwise this will be treated as the last line match = re.match(r"^(.*?)\#.*?\n", line) if match: line = match.group(1) + "\n" if len(line) == 0: # Last line, lacks a newline break line = line.rstrip() # wipe newline if len(line) == 0: continue # Split by commas and/or spaces vals = re.split(r'[,\s]+', line) # Quietly gloss over ref_sensor_name, as we don't need it. if len(vals) > 0 and vals[0] == 'ref_sensor_name:': continue if len(vals) == 0 or vals[0] != tag: raise Exception("Failed to read entry for: " + tag) vals = vals[1:] if num_vals > 0 and len(vals) != num_vals: raise Exception("Failed to read " + str(num_vals) + " values.") # Done break # Return the handle as well, as it changed return (vals, handle) def parseRigConfig(rig_config_file): '''Parse a rig set. This function does not implement the rig structure. The individual sensors are read without any knowledge of a rig or set of rigs. That because that functionality is not needed. It is implemented in C++, however.''' cameras = [] with open(rig_config_file, "r") as handle: while True: camera = {} (vals, handle) = readConfigVals(handle, 'sensor_name:', 1) if len(vals) == 0: break # end of file camera["sensor_name"] = vals[0] (vals, handle) = readConfigVals(handle, "focal_length:", 1) camera["focal_length"] = vals[0] (vals, handle) = readConfigVals(handle, "optical_center:", 2) camera["optical_center"] = vals (vals, handle) = readConfigVals(handle, "distortion_coeffs:", -1) # var length camera["distortion_coeffs"] = vals if (len(vals) != 0 and len(vals) != 1 and len(vals) != 4 and len(vals) != 5): raise Exception("Expecting 0, 1, 4, or 5 distortion coefficients") (vals, handle) = readConfigVals(handle, "distortion_type:", 1) if len(camera["distortion_coeffs"]) == 0 and vals[0] != "no_distortion": raise Exception("When there are no distortion coefficients, distortion " + \ "type must be: no_distortion") # For backward compatibility, the fisheye distortion type with one # coefficient is accepted and converted to fov. if len(camera["distortion_coeffs"]) == 1: if vals[0] == "fisheye": vals[0] = "fov" if vals[0] != "fov": raise Exception("When there is 1 distortion coefficient, distortion " + \ "type must be: fov or fisheye") if len(camera["distortion_coeffs"]) == 4 and \ vals[0] != "radtan" and vals[0] != "fisheye": raise Exception("When there are 4 distortion coefficients, distortion " + \ "type must be: radtan or fisheye") if len(camera["distortion_coeffs"]) == 5 and vals[0] != "radtan": raise Exception("When there are 4 or 5 distortion coefficients, " + \ "distortion type must be: radtan") camera["distortion_type"] = vals[0] (vals, handle) = readConfigVals(handle, "image_size:", 2) camera["image_size"] = vals (vals, handle) = readConfigVals(handle, "distorted_crop_size:", 2) camera["distorted_crop_size"] = vals (vals, handle) = readConfigVals(handle, "undistorted_image_size:", 2) camera["undistorted_image_size"] = vals (vals, handle) = readConfigVals(handle, "ref_to_sensor_transform:", -1) camera["ref_to_sensor_transform"] = vals (vals, handle) = readConfigVals(handle, "depth_to_image_transform:", -1) camera["depth_to_image_transform"] = vals (vals, handle) = readConfigVals(handle, "ref_to_sensor_timestamp_offset:", 1) camera["ref_to_sensor_timestamp_offset"] = vals[0] cameras.append(camera) if len(cameras) == 0: raise Exception("No sensors found in " + rig_config_file) return cameras def imageExtension(images): ''' Get the image extensions for all images. Check that there is only one. ''' extensions = set() for image in images: path, ext = os.path.splitext(image) extensions.add(ext) if len(extensions) > 1: raise Exception("Input images have a mix of filename extensions. Use just one.") if len(extensions) == 0: raise Exception("The input image set is invalid.") return list(extensions)[0] def parse_cameras(image_list, subset_list, rig_sensor, # These indices will start from 1, if specified first_image_index = None, last_image_index = None): # If desired to process only a subset subset = set() if subset_list != "": lines = read_list(subset_list) for line in lines: subset.add(line) # Read the limage file lines = read_list(image_list) images = [] world_to_cam = [] image_count = 0 # Below, the count of the first image will be 1 for line in lines: m = re.match(r"^(.*?)\#", line) if m: # Wipe comments line = m.group(1) line = line.rstrip() if len(line) == 0: continue vals = line.split() if len(vals) < 13: raise Exception("Could not parse: " + image_list) image = vals[0] vals = vals[1:13] if (len(subset) > 0) and (image not in subset): # Use only the subset continue # Use only desired sensor curr_sensor = os.path.basename(os.path.dirname(image)) if curr_sensor != rig_sensor: continue image_count += 1 # If to use only a range if first_image_index is not None and last_image_index is not None: if image_count < first_image_index or image_count > last_image_index: continue # Put the values in a matrix M = np.identity(4) val_count = 0 # Read rotation for row in range(3): for col in range(3): M[row][col] = float(vals[val_count]) val_count = val_count + 1 # Read translation for row in range(3): M[row][3] = float(vals[val_count]) val_count = val_count + 1 images.append(image) world_to_cam.append(M) return (images, world_to_cam) def undistort_images(args, rig_sensor, images, tools_base_dir, extension, extra_opts, suff): # Form the list of distorted images dist_image_list = args.out_dir + "/" + rig_sensor + "/distorted_index.txt" mkdir_p(os.path.dirname(dist_image_list)) print("Writing: " + dist_image_list) dist_images = [] with open(dist_image_list, 'w') as f: for image in images: dist_images.append(image) f.write(image + "\n") # Form the list of unundistorted images undist_dir = args.out_dir + "/" + rig_sensor + "/undistorted" + suff if os.path.isdir(undist_dir): # Wipe the existing directory, as it may have stray files print("Removing recursively old directory: " + undist_dir) shutil.rmtree(undist_dir) undist_image_list = undist_dir + "/index.txt" mkdir_p(undist_dir) print("Writing: " + undist_image_list) undistorted_images = [] with open(undist_image_list, 'w') as f: for image in dist_images: image = undist_dir + "/" + os.path.basename(image) # Use desired extension. For example, texrecon seems to want .jpg. In stereo # one prefers .tif, as that one is lossless. path, ext = os.path.splitext(image) image = path + extension undistorted_images.append(image) f.write(image + "\n") undist_intrinsics = undist_dir + "/undistorted_intrinsics.txt" cmd = [tools_base_dir + "/bin/undistort_image_texrecon", "--image_list", dist_image_list, "--output_list", undist_image_list, "--rig_config", args.rig_config, "--rig_sensor", rig_sensor, "--undistorted_crop_win", args.undistorted_crop_win, "--undistorted_intrinsics", undist_intrinsics] + \ extra_opts print("Undistorting " + rig_sensor + " images.") run_cmd(cmd) return (undist_intrinsics, undistorted_images, undist_dir) def read_intrinsics(intrinsics_file): if not os.path.exists(intrinsics_file): raise Exception("Missing file: " + intrinsics_file) with open(intrinsics_file, "r") as f: for line in f: if re.match(r"^\s*\#", line): continue # ignore the comments vals = line.split() if len(vals) < 5: raise Exception("Expecting 5 parameters in " + intrinsics_file) widx = float(vals[0]) widy = float(vals[1]) f = float(vals[2]) cx = float(vals[3]) cy = float(vals[4]) return(widx, widy, f, cx, cy) # If no luck raise Exception("Could not read intrinsics from: " + intrinsics_file) def write_tsai_camera_file(tsai_file, f, cx, cy, cam_to_world): """ Write a tsai camera file understandable by ASP. Assume that the intrinsics f, cx, cy are in units of pixels, and the pitch is 1, and that there is no distortion. """ print("Writing: " + tsai_file) M = cam_to_world # to save on typing with open(tsai_file, "w") as g: g.write("VERSION_3\n") g.write("fu = %0.17g\n" % f) g.write("fv = %0.17g\n" % f) g.write("cu = %0.17g\n" % cx) g.write("cv = %0.17g\n" % cy) g.write("u_direction = 1 0 0\n") g.write("v_direction = 0 1 0\n") g.write("w_direction = 0 0 1\n") g.write("C = %0.17g %0.17g %0.17g\n" % (M[0][3], M[1][3], M[2][3])) g.write("R = %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n" % (M[0][0], M[0][1], M[0][2], M[1][0], M[1][1], M[1][2], M[2][0], M[2][1], M[2][2])) g.write("pitch = 1\n") g.write("NULL\n") def write_cam_to_world_matrix(cam_to_world_file, cam_to_world): print("Writing: " + cam_to_world_file) M = cam_to_world # to save on typing with open(cam_to_world_file, "w") as g: g.write(("%0.17g %0.17g %0.17g %0.17g\n" + \ "%0.17g %0.17g %0.17g %0.17g\n" + \ "%0.17g %0.17g %0.17g %0.17g\n" + \ "%0.17g %0.17g %0.17g %0.17g\n") % (M[0][0], M[0][1], M[0][2], M[0][3], M[1][0], M[1][1], M[1][2], M[1][3], M[2][0], M[2][1], M[2][2], M[2][3], M[3][0], M[3][1], M[3][2], M[3][3])) def findSensorNames(images, rig_config, image_sensor_list): """ Find the sensor name for each image. Either must have a list that specifies the sensor name, or the sensor name must be in the image name or directory name. """ # Will return a dictionary called img_sensor_dict img_sensor_dict = {} # Put the sensor names in a set sensor_names = set() for sensor_id in range(len(rig_config)): sensor_name = rig_config[sensor_id]['sensor_name'] print("Sensor name: " + sensor_name) sensor_names.add(sensor_name) # First check if image_sensor_list exists, then first entry # is image name, and second is sensor name. Read # both the images and corresponding sensor names. if image_sensor_list != "": with open(image_sensor_list, 'r') as fh: images = [] for line in fh: vals = line.split() if len(vals) < 2: raise Exception("Each line in the image sensor list must have " + \ "at least two entries: image name and sensor name.") img_sensor_dict[vals[0]] = vals[1] images.append(vals[0]) else: # Infer based on image / directory names for image in images: cam_type = "" try: cam_type = os.path.basename(os.path.dirname(image)) except: pass # See if the directory name is sensor name if cam_type in sensor_names: img_sensor_dict[image] = cam_type continue # See if the image name has the sensor name success = False for cam_type in sensor_names: if cam_type in image: img_sensor_dict[image] = cam_type success = True break if not success: raise Exception("Could not find the sensor name for image: " + image + \ "\nCheck your images and the naming conventions.") return (images, img_sensor_dict) def genCalibrationFile(args, rig_config, sym_images): """ Generate the calibration file for the rig. """ calib_file = args.out_dir + "/" + "theia_calibration.json" print("Writing Theia calibration file: " + calib_file) with open(calib_file, "w") as fh: fh.write("{\n") fh.write('"priors" : [\n') for sensor_id in range(len(rig_config)): sensor_name = rig_config[sensor_id]['sensor_name'] num_images = len(sym_images[sensor_name]) if num_images == 0: continue for it in range(num_images): image = os.path.basename(sym_images[sensor_name][it]) fh.write('{"CameraIntrinsicsPrior" : {\n') fh.write('"image_name" : "' + image + '",\n') fh.write('"width" : ' + rig_config[sensor_id]['image_size'][0] + ",\n") fh.write('"height" : ' + rig_config[sensor_id]['image_size'][1] + ",\n") fh.write('"focal_length" : ' + rig_config[sensor_id]["focal_length"] + ",\n") fh.write('"principal_point" : [' + \ rig_config[sensor_id]["optical_center"][0] + ", " + \ rig_config[sensor_id]["optical_center"][1] + "],\n") dist_coeffs = rig_config[sensor_id]["distortion_coeffs"] if rig_config[sensor_id]['distortion_type'] == 'no_distortion': fh.write('"camera_intrinsics_type" : "PINHOLE"\n') elif rig_config[sensor_id]['distortion_type'] == 'fov': fh.write('"radial_distortion_1" : ' + \ dist_coeffs[0] + ",\n") fh.write('"camera_intrinsics_type" : "FOV"\n') elif rig_config[sensor_id]['distortion_type'] == 'fisheye': # Theia expects the fisheye model to have 4 distortion coefficients. k1 = dist_coeffs[0] k2 = dist_coeffs[1] k3 = dist_coeffs[2] k4 = dist_coeffs[3] fh.write('"radial_distortion_coeffs" : [' + \ k1 + ", " + k2 + ", " + k3 + ", " + k4 + "],\n") fh.write('"camera_intrinsics_type" : "FISHEYE"\n') elif rig_config[sensor_id]['distortion_type'] == 'radtan': # Distortion coeffs convention copied from # camera_params.cc. JSON format from # calibration_test.json in TheiaSFM. k1 = dist_coeffs[0] k2 = dist_coeffs[1] p1 = dist_coeffs[2] p2 = dist_coeffs[3] k3 = '0' if len(dist_coeffs) == 5: k3 = dist_coeffs[4] fh.write('"radial_distortion_coeffs" : [' + \ k1 + ", " + k2 + ", " + k3 + "],\n") fh.write('"tangential_distortion_coeffs" : [' + \ p1 + ", " + p2 + "],\n") fh.write('"camera_intrinsics_type" : "PINHOLE_RADIAL_TANGENTIAL"\n') else: raise Exception("Unknown distortion type: " + \ rig_config[sensor_id]['distortion_type']) if it < num_images - 1 or sensor_id < len(rig_config) - 1: fh.write("}},\n") else: fh.write("}}\n") fh.write("]\n") fh.write("}\n") return calib_file ================================================ FILE: src/asp/Python/asp_stereo_utils.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ from __future__ import print_function import sys, optparse, subprocess, re, os, math, time, glob import fcntl # for file locking import os.path as P from asp_system_utils import * from asp_alg_utils import * import asp_system_utils, asp_string_utils, asp_cmd_utils asp_system_utils.verify_python_version_is_supported() # For consistency with C++ VW_CORRELATION_BM = '0' VW_CORRELATION_SGM = '1' VW_CORRELATION_MGM = '2' VW_CORRELATION_FINAL_MGM = '3' VW_CORRELATION_OTHER = '4' def stereo_alg_to_num(alg): '''Convert, for example, 'asp_mgm' to '2'. This function has a C++ analog in stereo.cc.''' alg = alg.lower() if alg.startswith('0') or alg.startswith('asp_bm'): return VW_CORRELATION_BM if alg.startswith('1') or alg.startswith('asp_sgm'): return VW_CORRELATION_SGM if alg.startswith('2') or alg.startswith('asp_mgm'): return VW_CORRELATION_MGM if alg.startswith('3') or alg.startswith('asp_final_mgm'): return VW_CORRELATION_FINAL_MGM # Use an external algorithm return VW_CORRELATION_OTHER class Step: # The ids of individual stereo steps pprc = 0 corr = 1 blend = 2 rfne = 3 fltr = 4 tri = 5 clean = 6 # parallel_stereo stops here dem = 7 # only used by stereo_dist mosaic = 8 # only used by stereo_dist def stereoProgName(step): ''' Return the stereo program name for a given step. ''' if step == Step.pprc: return 'stereo_pprc' elif step == Step.corr: return 'stereo_corr' elif step == Step.blend: return 'stereo_blend' elif step == Step.rfne: return 'stereo_rfne' elif step == Step.fltr: return 'stereo_fltr' elif step == Step.tri: return 'stereo_tri' elif step == Step.clean: # Add this for convenience, when querying the latest stage in the status file return 'stereo_parse' else: return 'stereo_unknown' # This is a bugfix for OpenBLAS on the Mac. It cannot handle # too many threads. Never use more than 128 threads in either # case, as openblas can't handle it. def reduce_num_threads(cmd): # This is only needed if the user specified --threads if '--threads' not in cmd: return cmd num_threads_arr = asp_cmd_utils.get_option(cmd, '--threads', 1) if len(num_threads_arr) > 1: num_threads = int(num_threads_arr[1]) else: num_threads = 1 prog = cmd[0] if os.path.basename(prog) == 'stereo_pprc' and sys.platform == 'darwin': os.environ['OPENBLAS_NUM_THREADS'] = '1' num_threads = min(num_threads, get_num_cpus()) num_threads = min(num_threads, 4) num_threads = min(num_threads, 128) num_threads = max(num_threads, 1) asp_cmd_utils.set_option(cmd, '--threads', [num_threads]) return cmd def stereo_run(prog, args, opt, **kw): '''Run a stereo executable. Output is shown on screen as it happens. Optional kw args: extra_args (list), msg (string for error message).''' extra_args = kw.get('extra_args', []) msg = kw.get('msg', prog) binpath = bin_path(prog) call = [binpath] + args + extra_args call = reduce_num_threads(call) # On Linux estimate the memory usage and runtime if 'linux' in sys.platform and prog == 'stereo_corr' and \ hasattr(opt, 'mem_usage') and opt.mem_usage: call = ['/usr/bin/time', '-f', '"elapsed=%E mem=%M (kb) time_stereo_corr"'] + call print(" ".join(call)) if opt.dryrun or opt.verbose: print(" ".join(call)) if opt.dryrun: return try: t_start = time.time() code = subprocess.call(call) if opt.verbose: wall_s = time.time() - t_start print('Wall time (s): {0:.1f}\n'.format(wall_s)) except OSError as e: raise Exception('%s: %s' % (binpath, e)) if code != 0: raise Exception('Stereo step ' + msg + ' failed') def run_sparse_disp(args, opt): settings = run_and_parse_output( "stereo_parse", args, ",", opt.verbose ) left_img = settings["trans_left_image"] right_img = settings["trans_right_image"] out_prefix = settings["out_prefix"] sparse_args = left_img + right_img + out_prefix + ['--nodata-value', str(0)] if opt.sparse_disp_options is not None: sparse_args += opt.sparse_disp_options.split() # Pass the number of threads to sparse_disp # sparse_disp_options should trump if not any('--processes' in s for s in sparse_args): num_threads = 0 if hasattr(opt, 'threads') and opt.threads is not None and opt.threads > 0: num_threads = opt.threads if hasattr(opt, 'threads_single') and \ (opt.threads_single is not None) and \ (opt.threads_single > 0): num_threads = opt.threads_single if num_threads > 0: sparse_args += ['--processes', str(num_threads)] # If the user set ASP_PYTHON_MODULES_PATH using the custom ASP python installation script, # set the LD_LIBRARY_PATH and PYTHON_PATH accordingly. Otherwise the user's default # Python installation will be used. if os.environ.get('ASP_PYTHON_MODULES_PATH') is not None: if os.environ.get('LD_LIBRARY_PATH') is None: os.environ['LD_LIBRARY_PATH'] = os.environ.get('ASP_PYTHON_MODULES_PATH') else: os.environ['LD_LIBRARY_PATH'] = os.environ.get('LD_LIBRARY_PATH') + \ ":" + os.environ.get('ASP_PYTHON_MODULES_PATH') if os.environ.get('PYTHONPATH') is None: os.environ['PYTHONPATH'] = os.environ.get('ASP_PYTHON_MODULES_PATH') else: os.environ['PYTHONPATH'] = os.environ.get('ASP_PYTHON_MODULES_PATH') + ":" + \ os.environ.get('PYTHONPATH') print('Running sparse disp with arguments: ' + str(sparse_args) +'\nand options: ' + str(opt)) stereo_run('sparse_disp', sparse_args, opt, msg='%d: Low-res correlation with sparse_disp' % Step.corr) # Do low-res correlation. def calc_lowres_disp(args, opt, sep, resume = False): will_run = True if resume: settings = run_and_parse_output("stereo_parse", args, ",", opt.verbose) out_prefix = settings["out_prefix"][0] d_sub = out_prefix + '-D_sub.tif' d_sub_spread = out_prefix + '-D_sub_spread.tif' if (opt.seed_mode != 3): if asp_system_utils.is_valid_image(d_sub): will_run = False else: print("Will recreate: " + d_sub) else: if asp_system_utils.is_valid_image(d_sub) and \ asp_system_utils.is_valid_image(d_sub_spread): will_run = False else: print("Will recreate: " + d_sub + " and " + d_sub_spread) if will_run: if (opt.seed_mode == 3): # This uses the python sparse_disp tool run_sparse_disp(args, opt) else: local_args = args[:] # deep copy to use locally local_args.extend(['--compute-low-res-disparity-only']) # invoke here stereo_run to be able to see the output on screen stereo_run('stereo_corr', local_args, opt, msg='') # Attach a georef to D_sub and D_sub_spread if appropriate local_args = args[:] # deep copy to use locally local_args.append('--attach-georeference-to-lowres-disparity') run_and_parse_output("stereo_parse", local_args, sep, opt.verbose) def parse_corr_seed_mode(filename): mode = None # Extract corr-seed-mode from filename. if not os.path.isfile(filename): return mode # Care with encoding fh = open(filename, 'r', encoding='utf8', errors='ignore') for line in fh: line = re.sub(r'\#.*?$', '', line) # wipe comments matches = re.match(r'^\s*corr-seed-mode\s+(\d+)', line) if matches: mode = int(matches.group(1)) fh.close() return mode def resolve_seed_mode(opt, args): '''Resolve corr-seed-mode from CLI, stereo file, or default. Sets opt.seed_mode and appends --corr-seed-mode to args.''' if opt.seed_mode is None: opt.seed_mode = parse_corr_seed_mode(opt.stereo_file) if opt.seed_mode is None: opt.seed_mode = 1 args.extend(['--corr-seed-mode', str(opt.seed_mode)]) def run_multiview(prog_name, args, extra_args, entry_point, stop_point, verbose, settings): # Invoke multiview stereo processing, either using 'stereo', or # using 'parallel_stereo', depending on the caller of this function. # Doing multi-view stereo amounts to doing all the steps of stereo # save for triangulation for stereo pairs made up of first image # and another image in the sequence. Then, triangulation is done # using all images. The precise stereo command to use for each # pair was already generated by stereo_parse, and here we extract # it from 'settings'. # We must respect caller's entry and stop points. # Must make sure to use the same Python invoked by parent python_path = sys.executable # Run all steps but tri for s in sorted(settings.keys()): m = re.match(r'multiview_command', s) if not m: continue local_args = settings[s][:] # the current two-image stereo command local_args[0] = prog_name local_entry = entry_point local_stop = stop_point if local_stop > Step.tri: local_stop = Step.tri local_args.extend(['--entry-point', str(local_entry)]) local_args.extend(['--stop-point', str(local_stop)]) local_args.extend(extra_args) cmd = [python_path] + local_args # Go on even if some of the runs fail try: asp_system_utils.generic_run(cmd, verbose) except: pass # Run tri local_args = [prog_name] local_args.extend(args) local_entry = Step.tri local_stop = stop_point local_args.extend(['--entry-point', str(local_entry)]) local_args.extend(['--stop-point', str(local_stop)]) local_args.extend(extra_args) cmd = [python_path] + local_args asp_system_utils.generic_run(cmd, verbose) # Here we ensure that in the run directory # the L.tif file is present, by sym-linking # from the subdirectory of one of the pairs. # It is nice to have L.tif for when we later # do point2dem PC.tif --orthoimage L.tif # The code below amounts to: # ln -s out_prefix-pair1/1-L.tif out_prefix-L.tif out_prefix = settings['out_prefix'][0] sym_f = out_prefix + '-L.tif' if not os.path.lexists(sym_f): files = glob.glob(out_prefix + '-pair*/*-L.tif') if len(files) > 0: f = files[0] run_dir = os.path.dirname(out_prefix) rel_f = os.path.relpath(f, run_dir) os.symlink(rel_f, sym_f) def stereoTilesIndex(out_prefix): ''' Form the index of tiles. ''' return out_prefix + "-tiles-index.txt" def stereoStatusFile(out_prefix): ''' The file having the status of how many tiles were successfully processed. ''' return out_prefix + "-stereo-status.txt" def numTiles(out_prefix): ''' Return the total number of tiles for current stage of processing. ''' tiles_index = stereoTilesIndex(out_prefix) num_tiles = 0 if not os.path.exists(tiles_index): return num_tiles # Read this file and count how many lines with open(tiles_index, 'r') as f: lines = f.readlines() num_tiles = len(lines) return num_tiles def updateNumDoneTiles(out_prefix, latest_stage_name, reset): ''' Update the number of done tiles for current stage of processing. Care is taken that multiple processes can both update the same status file without conflicts. ''' num_tiles = numTiles(out_prefix) status_file = stereoStatusFile(out_prefix) if latest_stage_name in ['stereo_pprc', 'stereo_fltr']: # There is no tiling for these stages num_tiles = 1 # If this is a sym link, wipe it. Symlinks can happen if resuming from a prev run. if os.path.islink(status_file): os.unlink(status_file) # Ensure file exists so r+ mode does not fail if not os.path.exists(status_file): with open(status_file, 'a') as f: pass # Open handle for both reading and writing with open(status_file, 'r+') as f: # Get exclusive lock to prevent race conditions # lockf is used for better compatibility with network storage fcntl.lockf(f, fcntl.LOCK_EX) try: # read current status lines = f.readlines() stage_name = "" num_done = 0 if len(lines) > 1: # First line is a comment, second one has the data statusParts = lines[1].strip().split(' ') if len(statusParts) > 1: stage_name = statusParts[0] num_done = int(statusParts[1]) # update logic if stage_name != latest_stage_name or reset: num_done = 0 stage_name = latest_stage_name if not reset: num_done += 1 # Write new status f.seek(0) # return to start of file f.truncate() # wipe old data f.write("# processingStep numDoneTiles numTotalTiles\n") f.write(f"{stage_name} {num_done} {num_tiles}\n") # Ensure data reaches the disk/server before unlocking f.flush() os.fsync(f.fileno()) # It is helpful to print this info, but not for pprc, etc. if num_tiles > 1: print(f"Processing status: {stage_name} {num_done} / {num_tiles} tiles") finally: # release the lock fcntl.lockf(f, fcntl.LOCK_UN) def produce_tiles(opt, args, settings, tile_w, tile_h): ''' Generate a list of bounding boxes for each output tile. Use stereo_parse for that. Skip the tiles that have no valid low-res disparity (D_sub.tif). ''' # This cannot happen before we know trans_left_image_size key = 'trans_left_image_size' if key not in settings: raise Exception("Cannot produce tiles until L.tif is known.") sep = "," tile_opt = ['--parallel-tile-size', str(tile_w), str(tile_h)] verbose = False num_pairs = int(settings['num_stereo_pairs'][0]) # for multiview if opt.seed_mode != 0 and num_pairs == 1: # D_sub must exist d_sub_file = settings['out_prefix'][0] + '-D_sub.tif' if not os.path.exists(d_sub_file): print("WARNING: The file " + d_sub_file + " does not exist. " + \ "Will not be able to exclude tiles with no data.") # Create the tiles with stereo_parse This can handle D_sub. run_and_parse_output("stereo_parse", args + tile_opt, sep, verbose) tiles = readTiles(settings['out_prefix'][0]) return tiles def tile_dir(prefix, tile): return prefix + '-' + tile.name_str() def use_padded_tiles(settings): ''' Tiles with padding are needed for local epipolar alignment and for non-asp_bm stereo algorithms. ''' alg = stereo_alg_to_num(settings['stereo_algorithm'][0]) return (alg > VW_CORRELATION_BM or settings['alignment_method'][0] == 'local_epipolar') def grow_crop_tile_maybe(settings, prog, tile): ''' The tile, perhaps with padding added, and perhaps cropped to desired region, on which to run one of the stereo tools. ''' # Make a local copy of the tile, as we may grow it local_tile = BBox(tile.x, tile.y, tile.width, tile.height) if use_padded_tiles(settings) and prog == 'stereo_corr': collar_size = int(settings['collar_size'][0]) local_tile.add_collar(collar_size) # Will do only the tiles intersecting user's crop window. w = settings['transformed_window'] user_crop_win = BBox(int(w[0]), int(w[1]), int(w[2]), int(w[3])) crop_box = intersect_boxes(user_crop_win, local_tile) if crop_box.width <= 0 or crop_box.height <= 0: return [] # Don't need to process this return crop_box def build_vrt(prog, opt, args, settings, georef, postfix, tile_postfix, contract_tiles=False): '''Generate a VRT file to treat the separate image tiles as one large image.''' image_size = settings["trans_left_image_size"] vrt_file = settings['out_prefix'][0]+postfix print("Writing: " + vrt_file) f = open(vrt_file,'w') f.write("<VRTDataset rasterXSize=\"%i\" rasterYSize=\"%i\">\n" % (int(image_size[0]),int(image_size[1]))) # Write the datum, projection, and georeference transform in XML format f.write(" <SRS>" + georef["WKT"] + "</SRS>\n") f.write(" <GeoTransform>" + georef["GeoTransform"] + "</GeoTransform>\n") # Locate a known good tile tiles = produce_tiles(opt, args, settings, opt.job_size_w, opt.job_size_h) goodFilename = "" for tile in tiles: directory = tile_dir(settings['out_prefix'][0], tile) filename = directory + "/" + tile.name_str() + tile_postfix if os.path.isfile(filename): goodFilename = filename break if goodFilename == "": raise Exception('No tiles were generated.') # Do gdalinfo on the good tile to get metadata args = [goodFilename] sep = "=" gdal_settings = run_and_parse_output("gdalinfo", args, sep, opt.verbose) # Extract the data type (e.g., Float32 or Float64) data_type = "Float32" for s in gdal_settings: val = " ".join(gdal_settings[s]) m = re.match(r'^.*? Type (\w+)', val) if m: data_type = m.group(1) break # Extract the block size, e.g., 256x256, from 'Band 2 Block=256x256' BlockXSize = 0 BlockYSize = 0 for s in gdal_settings: val = " ".join(gdal_settings[s]) if re.match(r"^\s*Band\s+\d", s): m = re.match(r'^\s*(\d+)x(\d+)', val) if m: BlockXSize = m.group(1) BlockYSize = m.group(2) break # Extract no-data value, if present has_nodata = False key = 'NoData Value' nodata_value = 0 if key in gdal_settings: has_nodata = True nodata_value = gdal_settings[key][0] # Find how many bands are in the file num_bands = 0 for s in gdal_settings: m = re.match(r'^.*?Band\s+(\d+)', s) if m: b = int(m.group(1)) if num_bands < b: num_bands = b # Copy some keys over to the vrt keys = ["POINT_OFFSET", "AREA_OR_POINT", "BAND1", "BAND2", "BAND3", "BAND4", "BAND5", "BAND6"] for key in keys: if key in gdal_settings: f.write(" <Metadata>\n <MDI key=\"" + key + "\">" + gdal_settings[key][0] + "</MDI>\n </Metadata>\n") # Write each band for b in range(1, num_bands + 1): f.write(" <VRTRasterBand dataType=\"%s\" band=\"%i\">\n" % (data_type,b)) for tile in tiles: directory = tile_dir(settings['out_prefix'][0], tile) filename = directory + "/" + tile.name_str() + tile_postfix # Handle non-existent tiles if not os.path.isfile(filename): continue # Leave empty relative = os.path.relpath(filename, os.path.dirname(settings['out_prefix'][0])) f.write(" <SimpleSource>\n") f.write(" <SourceFilename relativeToVRT=\"1\">%s</SourceFilename>\n" % relative) f.write(" <SourceBand>%i</SourceBand>\n" % b) # Bugfix for the "too many open files" problem. # Per https://lists.osgeo.org/pipermail/gdal-dev/2017-October/047370.html adjusted_tile = grow_crop_tile_maybe(settings, prog, tile) f.write((' <SourceProperties RasterXSize="%i" RasterYSize="%i" ' + \ 'DataType="%s" BlockXSize="%s" BlockYSize="%s"/>\n') \ % (adjusted_tile.width, adjusted_tile.height, data_type, BlockXSize, BlockYSize)) min_x = 0 min_y = 0 if (contract_tiles): # Need to account for the padding pad_amount = int(settings['collar_size'][0]) user_min_x = int(settings['transformed_window'][0]) user_min_y = int(settings['transformed_window'][1]) # For the tiles not starting at zero, account for the fact that they # have padding at the top and/or right of the images. if (tile.x > user_min_x): min_x += pad_amount if (tile.y > user_min_y): min_y += pad_amount f.write(' <SrcRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>\n' % (min_x, min_y, tile.width, tile.height)) f.write(' <DstRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>\n' % (tile.x, tile.y, tile.width, tile.height)) f.write(" </SimpleSource>\n") # End tile loop if has_nodata: f.write(" <NoDataValue>" + nodata_value + "</NoDataValue>\n") f.write(" </VRTRasterBand>\n") # End band loop f.write("</VRTDataset>\n") f.close() # We will not symlink PC.tif and RD.tif which will be VRT files, # and neither the log files. We will symlink L.txt and R.txt. skip_symlink_expr = r'^.*?-(PC\.tif|RD\.tif|log.*?\.txt)$' def create_subdirs_symlink(opt, args, settings): '''Create tile subdirectories and symlink files from parent run directory. Return the created subdirectories.''' out_prefix = settings['out_prefix'][0] tiles = produce_tiles(opt, args, settings, opt.job_size_w, opt.job_size_h) subdirs = readDirList(out_prefix) try: parentDir = os.path.dirname(out_prefix) mkdir_p(parentDir) except: pass for tile_id in range(len(subdirs)): tile = tiles[tile_id] subdir = subdirs[tile_id] tile_prefix = subdir + "/" + tile.name_str() if opt.dryrun: print("mkdir -p %s" % subdir) print("Soft linking via %s %s" % (tile_prefix, out_prefix)) continue mkdir_p(subdir) files = glob.glob(out_prefix + '*') for f in files: if os.path.isdir(f): continue rel_src = os.path.relpath(f, subdir) m = re.match(skip_symlink_expr, rel_src) if m: continue dst_f = f.replace(out_prefix, tile_prefix) if os.path.lexists(dst_f): continue os.symlink(rel_src, dst_f) return subdirs def rename_files(settings, subdirs, postfix_in, postfix_out): '''Rename tile_dir/file_in.tif to tile_dir/file_out.tif. Skip symlinks, such as when this directory was processed before.''' for subdir in subdirs: tile = dirToTile(subdir) prefix = subdir + "/" + tile.name_str() filename_in = prefix + postfix_in filename_out = prefix + postfix_out if os.path.isfile(filename_in) and (not os.path.islink(filename_in)): if os.path.exists(filename_out): os.remove(filename_out) os.rename(filename_in, filename_out) def set_collar_size(new_collar_size, args, settings): '''Set collar_size to a new value, and update the settings and args.''' collar_size = new_collar_size asp_cmd_utils.set_option(args, '--sgm-collar-size', [str(collar_size)]) settings['collar_size'] = [str(collar_size)] return (settings, args) def normal_run(prog, opt, args, out_prefix, **kw): '''Job launch wrapper for a non-tile stereo call.''' binpath = bin_path(prog) call = [binpath] call.extend(args) if opt.threads_single is not None: asp_cmd_utils.wipe_option(call, '--threads', 1) call.extend(['--threads', str(opt.threads_single)]) call = reduce_num_threads(call) if opt.dryrun: print('%s' % ' '.join(call)) return if prog != "stereo_tri": resetStatus = True updateNumDoneTiles(out_prefix, prog, resetStatus) if opt.verbose: print('%s' % ' '.join(call)) try: status = subprocess.call(call) except OSError as e: raise Exception('%s: %s' % (binpath, e)) if status != 0: raise Exception('Stereo step ' + kw['msg'] + ' failed') if status == 0 and prog != "stereo_tri": resetStatus = False updateNumDoneTiles(out_prefix, prog, resetStatus) def readDistTileList(outPrefix): '''Read the distributed tile list file. Return list of (BBox, padding) tuples.''' tileListFile = outPrefix + '-distTileList.txt' if not os.path.exists(tileListFile): raise Exception('Tile list file not found: ' + tileListFile) tiles = [] with open(tileListFile, 'r') as f: for line in f: line = line.strip() if not line: continue parts = line.split() if len(parts) != 5: raise Exception('Invalid tile list line: ' + line) x, y, width, height, padding = [int(p) for p in parts] tiles.append((BBox(x, y, width, height), padding)) return tiles ================================================ FILE: src/asp/Python/asp_string_utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ Functions to help with string parsing. """ from __future__ import print_function import sys, os, re, string, time, shlex def isNumber(text): """Returns True if the text is a number""" try: float(text) except ValueError: # Not a number return False return True # No error, the number must have converted def convertToFloatIfNumber(text): """If the text is a number returns float(text), otherwise just text""" try: a = float(text) except ValueError: # Not a number return text return a # No error, the number must have converted def getLineAfterText(text, prefix, startPos=0, includeText=False): """Extracts the remainder of a line after a prefix""" # StartPos = index in the text to start looking at # Find the prefix prefixLoc = text.find(prefix, startPos) if prefixLoc < 0: raise Exception('Desired text not found: ' + prefix) # Find the bounds after the prefix prefixEnd = prefixLoc + len(prefix) nextEnd = text.find('\n', prefixEnd) if nextEnd == -1: # If there was no trailing \n, use one past last character. nextEnd = len(text) # Check that we found the bounds if (prefixEnd < startPos) or (nextEnd <= prefixEnd): raise Exception('Desired text not found: ' + prefix) # Extract the text if includeText: return text[prefixLoc:nextEnd] else: return text[prefixEnd:nextEnd] def getNumbersInParentheses(text): """Returns all sets of numbers in parentheses""" numberSets = [] # Find all number sets in the text parenGroups = re.findall( r'\([ \d.,-]*\)', text) for p in parenGroups: numberText = p[1:-1] # Remove () numberList = numberText.split(',') numbers = [] for n in numberList: # Convert strings to floats numbers.append(float(n)) numberSets.append(numbers) # Add this set of numbers to output list # If only one set of numbers return a list if len(numberSets) == 1: return numberSets[0] else: # Otherwise return a list of lists return numberSets def getNumberAfterEqualSign(text, lineStart=0): """Extracts a number after an '=' sign on a line""" # LineStart = index in the text to start looking at numberText = getLineAfterText(text, '=', lineStart, False) return convertToFloatIfNumber(numberText) # The following functions are useful for going between string and list # representations of command line arguments def isString(a): """Returns true if the object is a string""" # Python 2/3 compatibilty try: basestring except NameError: basestring = str return isinstance(a, basestring) def argListToString(argList): """Converts a list of arguments into a single argument string""" string = "" for arg in argList: stringVersion = str(arg) # Wrap arguments with spaces in them in "" so they stay together if stringVersion.find(' ') >= 0: stringVersion = '"' + stringVersion + '" ' if string == "": string = stringVersion else: string = string + ' ' + stringVersion return string def stringToArgList(string): """Converts a single argument string into a list of arguments""" return shlex.split(string) ================================================ FILE: src/asp/Python/asp_system_utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ General system related utilities """ from __future__ import print_function import sys, os, re, shutil, subprocess, string, time, errno, multiprocessing, signal import os.path as P import asp_string_utils, asp_cmd_utils # This is explained further down if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] def raise_error(msg, code=-1): '''Exit the program with an error message''' print('Error: ' + msg, file=sys.stderr) sys.exit(code) def verify_python_version_is_supported(): '''Verifies that a supported version of Python is being used.''' if sys.version_info < (3, 0, 0): print('\nERROR: Must use Python version >= 3.0.') sys.exit(1) # Print the version of the ASP programs def print_version_and_exit(): prog = libexec_path("stereo_parse") # get the full path cmd = prog + " --version" os.system(cmd) sys.exit(0) def get_prog_version(prog): '''Get the version of a command line program.''' try: p = subprocess.Popen([prog,"--version"], stdout=subprocess.PIPE, universal_newlines=True) out, err = p.communicate() except: raise Exception("Could not find: " + prog) if p.returncode != 0 and ('stereo_parse' not in prog): # Our own stereo_parse returns 1 even if the version check # succeeded. Too much work would be needed to fix that, so # just ignore the return status in that case. raise Exception("Checking " + prog + " version caused errors") # This is a fix for sometimes GNU Parallel printing a warning at the beginning for line in out.split("\n"): m = re.match(r"^.*?warning", line, re.IGNORECASE) if m: continue # This covers a version with no dots and a version like 3.0.1-alpha. # This is a fragile code. m = re.match(r"^.*? (\d[^\s]+)", line) if m: return m.group(1) raise Exception("Could not find version in: " + out) return "" def get_asp_version(): '''Returns the current ASP version number''' prog = libexec_path("stereo_parse") # get the full path return get_prog_version(prog) def get_num_cpus(): """Return the number of CPUs on the current machine.""" import sys if sys.version_info < (2, 6, 0): num_cpus = 8 else: from multiprocessing import cpu_count num_cpus = cpu_count() return num_cpus def checkIfToolExists(toolName): """Returns true if the system knows about the utility with this name (it is on the PATH).""" # Look for the tool using the 'which' command cmd = ['which', toolName] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) translateOut, err = p.communicate() # Check if that command failed to find the file failString = 'no ' + toolName + ' in (' if translateOut.find(failString) >= 0: raise Exception('Missing required executable "' + toolName + \ '", please add it to your PATH.') else: return True # Find if a program is in the path. Some ASP tools are in libexec, hence the # option lookInLibexec. # TODO: This logic needs serious cleanup, but while making sure that nothing breaks. def which(program, lookInLibexec = False): if not lookInLibexec: checkIfToolExists(program) def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) fpath, fname = os.path.split(program) if fpath: if is_exe(program): return program else: paths = [] for path in os.environ["PATH"].split(os.pathsep): path = path.strip('"') paths.append(path) for path in paths: exe_file = os.path.join(path, program) if is_exe(exe_file): return exe_file if lookInLibexec: for path in paths: exe_file = os.path.join(os.path.dirname(path), 'libexec', program) if is_exe(exe_file): return exe_file raise Exception('Missing required executable "' + program + '", please add it to your PATH.') return None def getNumNodesInList(nodesListPath): """Get number of Pleiades nodes listed in a file""" if nodesListPath is None: return 1 # local machine # Count the number of nodes without repetition # (need this for Pleiades). nodes = {} num_nodes = 0 try: fileHandle = open(nodesListPath, "r") for line in fileHandle: if re.match(r'^\s*$', line): continue # skip empty lines matches = re.match(r'^\s*([^\s]*)', line) if matches: nodes[matches.group(1)] = 1 num_nodes = len(nodes) except Exception as e: # Fail on exception raise_error(e) if num_nodes == 0: raise Exception('The list of computing nodes is empty') return num_nodes def check_parallel_version(): # This error will never be reached for users of our packaged final # product as that one bundles 'parallel' with it. ver = get_prog_version('parallel') if ver < '20170722': raise_error("Expecting a version of GNU parallel >= 20170722.") # Add simple quotes around each argument which has quotes or spaces # and which is not already quoted. This is a bugfix for 3D CRS specified via # --t_srs, and for arguments having spaces. def escape_token(token): has_issues = ('"' in token or ' ' in token or '\t' in token) has_simple_quotes = token.startswith('\'') and token.endswith('\'') has_double_quotes = token.startswith('"') and token.endswith('"') if has_issues and not has_simple_quotes and not has_double_quotes: token = '\'' + token + '\'' return token def runInGnuParallel(numParallelProcesses, argumentFilePath, args, nodeListPath=None, verbose=False): """Use GNU Parallel to spread task across multiple computers and processes""" # Make sure GNU parallel is installed if not checkIfToolExists('parallel'): raise Exception('Need GNU Parallel to distribute the jobs.') # Ensure our 'parallel' is not out of date check_parallel_version() # Use GNU parallel with given number of processes. Let output be # interspersed, read input series from file Start in the same directory on # remote machines. Ensure that vital env variables are copied over. # We do not use the GNU Parallel --workdir option, as this tool cannot # handle spaces in the path. Instead, each caller of this function must # handle the workdir itself. See for example the mapproject program. cmd = ['parallel', '--will-cite', '-u', '--env', 'PATH', '--env', 'PYTHONPATH', '--env', 'ISISROOT', '--env', 'ASP_LIBRARY_PATH', '--env', 'ISISDATA', '-a', argumentFilePath] # Add number of processes if specified (default is one job per CPU core) if numParallelProcesses is not None: cmd += ['-P', str(numParallelProcesses)] # Add list of nodes as argument to the parallel tool if it is available if nodeListPath is not None: cmd += ['--sshloginfile', nodeListPath] # Append any additional arguments to parallel cmd += args if verbose: # Echo the command line call we are about to make print(" ".join(cmd)) # This is a bugfix for RHEL 8. The 'parallel' program fails to start with ASP's # libs, so temporarily hide them. if 'LD_LIBRARY_PATH' in os.environ: os.environ['ASP_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH'] os.environ['LD_LIBRARY_PATH'] = '' # Handle spaces and quotes for i in range(len(cmd)): cmd[i] = escape_token(cmd[i]) returnCode = subprocess.call(cmd) # Undo the above if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] return returnCode # When user-exposed ASP executables are installed, they are in # 'bin'. Otherwise, in dev mode, they are in the same dir as __file__. # We prefer absolute paths below, in case some intermediate directories # do not exist. def bin_path(prog, **kw): currpath = kw.get('path', P.dirname(P.abspath(__file__))) binpath = os.path.abspath(P.join(currpath, '..', 'bin', prog)) if not P.isfile(binpath): binpath = os.path.abspath(P.join(currpath, '..', 'Tools', prog)) if not P.isfile(binpath): binpath = os.path.abspath(P.join(currpath, prog)) return binpath # When hidden ASP executables are installed, they are in # 'libexec'. Otherwise, in dev mode, they are in the same dir as # __file__. If no luck at all, search in 'bin'. def libexec_path(prog, **kw): currpath = kw.get('path', P.dirname(P.abspath(__file__))) libexecpath = os.path.abspath(P.join(currpath, '..', 'libexec', prog)) if not P.isfile(libexecpath): libexecpath = os.path.abspath(P.join(currpath, '..', 'Tools', prog)) if not P.isfile(libexecpath): libexecpath = os.path.abspath(P.join(currpath, prog)) if not P.isfile(libexecpath): libexecpath = os.path.abspath(P.join(currpath, '..', 'bin', prog)) if not P.isfile(libexecpath): # Could not find prog in ''libexec' or 'bin' either. We will # come here only for executables like gdalinfo that will be # packages in the release, but are not yet in dev mode. Just # print a warning and hope this tool is somewhere in user's # path. print("Could not find: " + libexecpath) libexecpath = which(prog) if libexecpath is None: raise Exception('Could not find: ' + prog) print("Using instead: " + libexecpath) return libexecpath # mkdir without throw def mkdir_p(path): try: os.makedirs(path) except OSError: pass # Execute a given command stored in the libexec directory and parse # its output. The output format is expected to be lines of # comma-separated values. The first value on each line becomes the # output variable name, the other values are read into the array of # variable values. def run_and_parse_output(cmd, args, sep, verbose, return_full_lines = False, **kw): libexecpath = libexec_path(cmd) call = [libexecpath] call.extend(args) if verbose: print (asp_string_utils.argListToString(call)) try: p = subprocess.Popen(call, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) except OSError as e: raise Exception('%s: %s' % (libexecpath, e)) (stdout, stderr) = p.communicate() p.wait() if p.returncode != 0: if stdout is not None: stdout = stdout.rstrip() print(stdout) if stderr is not None: stderr = stderr.rstrip() print(stderr) raise Exception('Failed executing: ' + " ".join(call)) data = {} if verbose: if stdout is not None: print(stdout) if stderr is not None: print(stderr) count = 0 for line in stdout.split('\n'): # Do not usually print warnings as they are verbose, and this function # is invoked often. The main processes (such as stereo_pprc) will print # the warnings. if verbose and re.match(r"^Warning", line): print(line) if return_full_lines: data[count] = line # return the entire line count += 1 else: if sep in line: keywords = line.split(sep) for index, item in enumerate(keywords): # Strip whitespace from ends keywords[index] = item.strip(' \t\n\r') data[keywords[0]] = keywords[1:] return data def run_with_return_code(cmd, verbose=False): # TODO: Wipe this and use instead executeCommand. if verbose: print (asp_string_utils.argListToString(cmd)) try: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) except OSError as e: print('Error: %s: %s' % ( asp_string_utils.argListToString(cmd), e)) (stdout, stderr) = p.communicate() p.wait() if p.returncode != 0 and verbose: if stdout is not None: print(stdout) if stderr is not None: print(stderr) print ('Failed executing: ' + " ".join(cmd)) return p.returncode def is_valid_image(filename): """See if the current image file exists and is valid.""" if not os.path.exists(filename): return False verbose = False ans = run_with_return_code(['gdalinfo', filename], verbose) if ans == 0: return True return False # For timeout def timeout_alarm_handler(signum, frame): raise Exception("Timeout reached!") # TODO: Improve this function a bit def executeCommand(cmd, outputPath=None, # If given, throw if the file is not created. Don't run if it already exists. suppressOutput=False, # If true, don't print anything! redo=False, # If true, run even if outputPath already exists. noThrow=False, # If true, don't throw if output is missing numAttempts = 1, # How many attempts to use sleepTime = 60, # How much to sleep between attempts timeout = -1, # After how long to timeout in seconds realTimeOutput = False # If to print what the command is doing in real time ): '''Executes a command with multiple options''' # Initialize outputs out = "" status = 0 err = "" if cmd == '': # An empty task return (out, err, status) # Convert the input to list format if needed if asp_string_utils.isString(cmd): cmd = asp_string_utils.stringToArgList(cmd) for attempt in range(numAttempts): # Run the command if conditions are met if redo or (outputPath is None) or (not os.path.exists(outputPath)): if not suppressOutput: print (asp_string_utils.argListToString(cmd)) if timeout > 0: print("Will enforce timeout of " + str(timeout) + " seconds.") signal.signal(signal.SIGALRM, timeout_alarm_handler) signal.alarm(timeout) try: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) if realTimeOutput and (not suppressOutput): # Print in real time what is going on, and return nothing in out and err while True: curr_out = p.stdout.readline() # TODO(oalexan1): It appears that quering p.stderr makes this not # work in real time, so may need to turn off the line below. # This will however break code which depends on things kept in # the error string. curr_err = p.stderr.readline() out += curr_out err += curr_err if curr_out == '' and p.poll() is not None: break if curr_out: print(curr_out.strip()) status = p.poll() else: # Collect the output and error out, err = p.communicate() status = p.returncode if timeout > 0: signal.alarm(0) # reset the alarm except Exception as e: out = "" err = ('Error: %s: %s' % (asp_string_utils.argListToString(cmd), e)) if timeout > 0: # this module is generally not available, so this use is very niche import psutil def kill_proc_tree(pid, including_parent=True): parent = psutil.Process(pid) for child in parent.children(recursive=True): print("Killing: " + str(child)) child.kill() if including_parent: print("Killing: " + str(parent)) parent.kill() pid = psutil.Process(p.pid) try: kill_proc_tree(p.pid) except: pass status = 1 if not noThrow: raise Exception(err) if out is None: out = "" if err is None: err = "" if (not suppressOutput) and (not realTimeOutput): print (out + '\n' + err) if status == 0: break if numAttempts <= 1: break if attempt < numAttempts - 1: print("attempt: " + str(attempt)) print("ran: " + asp_string_utils.argListToString(cmd) ) print("out = " + out) print("err = " + err) print("status = " + str(status)) print("Will sleep for " + str(sleepTime) + " seconds") time.sleep(sleepTime) else: # Output file already exists, don't re-run out = "" err = "" status = 0 # Optionally check that the output file was created if outputPath and (not os.path.exists(outputPath)) and (not noThrow): raise asp_cmd_utils.CmdRunException('Failed to create output file: ' + outputPath) return (out, err, status) # A very simple wrapper around subprocess def generic_run(cmd, verbose): cmd_str = asp_string_utils.argListToString(cmd) if verbose: print(cmd_str) try: code = subprocess.call(cmd) except OSError as e: raise Exception('%s: %s' % (cmd_str, e)) if code != 0: raise Exception('Failed to run: ' + cmd_str) def findTheiaInstallDir(): """ Find the Theia installation directory. For packaged builds, this will be based on the path to the current executable. For a dev build, it is easier to use the ISISROOT environment variable, which is usually set. """ installDir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))) if not os.path.exists(installDir + "/bin/build_reconstruction"): if 'ISISROOT' in os.environ: installDir = os.environ['ISISROOT'] if not os.path.exists(installDir + "/bin/build_reconstruction"): raise Exception("Cannot find the Theia build_reconstruction binary. " + \ "Set the environment variable ISISROOT to point to the " + \ "installation directory for ASP dependencies, including Theia.") return installDir ================================================ FILE: src/asp/Python/scale_linescan.py ================================================ #!/usr/bin/env python3 # Take a csm linescan json file, and make it work for an image with the # resolution that is 2x finer. This expects as input the number of columns # (samples) and rows (lines) in the image to be used with the rescaled output # camera. These are roughly 2x the width and height specified in the input # camera. # Usage: scale_linescan.py <in.json> <out.json> <out samples> <out lines> # This camera should be refined with jitter_solve. # This is a research script that is not officially supported. import sys, json, os, re import numpy as np def read_json(file): # Read into string print("Reading: ", file) with open(file, 'r') as f: data = f.read() # Find first occurrence of open brace. This is needed because the CSM # state has some text before the JSON object. pos = data.find('{') # Do substring from pos to the end, if pos was found header = "" if pos != -1: header = data[:pos] # save the header data = data[pos:] # parse the json from data j = json.loads(data) # # Print all keys in the json # print("will print all keys in the json") # # for key in j.keys(): # # print(key) return (header, j) def multiply(j, key, factor): """ Multiply the values in the list j[key] by factor. j gets modified in place. """ if key in j: if isinstance(j[key], list): j[key] = [x * factor for x in j[key]] elif isinstance(j[key], (int, float)): j[key] *= factor else: raise KeyError(f"Key '{key}' not found or is not a list in the JSON object.") def process_json(j, outSamples, outLines): j["m_nSamples"] = outSamples j["m_nLines"] = outLines multiply(j, "m_iTransS", 2.0) multiply(j, "m_iTransL", 2.0) multiply(j, "m_detectorLineOrigin", 2.0) multiply(j, "m_detectorSampleOrigin", 2.0) # These need to be divided by 2.0 multiply(j, "m_intTimes", 0.5) multiply(j, "m_gsd", 0.5) def write_json(file, header, j): # Convert the json to string data = json.dumps(j, indent = 2, sort_keys=True) # Create the directory having the output file, if it does not exist outDir = os.path.dirname(file) if not os.path.exists(outDir): os.makedirs(outDir) # Write the header and the json data to the file print("Writing: ", file) with open(file, 'w') as f: f.write(header + data + "\n") # Check if we have at least one input file if len(sys.argv) != 5: print("Usage: scale_linescan.py <in.json> <out.json> <out samples> <out lines>") sys.exit(1) # Load the first file inFile = sys.argv[1] outFile = sys.argv[2] outSamples = int(sys.argv[3]) outLines = int(sys.argv[4]) header, j = read_json(inFile) process_json(j, outSamples, outLines) write_json(outFile, header, j) ================================================ FILE: src/asp/Rig/BasicAlgs.cc ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/BasicAlgs.h> #include <glog/logging.h> #include <boost/filesystem.hpp> #include <fstream> #include <iostream> #include <iomanip> namespace fs = boost::filesystem; namespace rig { // Convert keypoints to Eigen format void vec2eigen(std::vector<std::pair<float, float>> const& vec, Eigen::Matrix2Xd & mat) { mat = Eigen::MatrixXd(2, vec.size()); for (size_t it = 0; it < vec.size(); it++) { mat.col(it) = Eigen::Vector2d(vec[it].first, vec[it].second); } } // Convert keypoints from Eigen format void eigen2vec(Eigen::Matrix2Xd const& mat, std::vector<std::pair<float, float>> & vec) { vec.clear(); vec.resize(mat.cols()); for (size_t it = 0; it < vec.size(); it++) vec.at(it) = std::make_pair<float, float>(mat(0, it), mat(1, it)); } // Read a vector of strings from a file, with spaces and newlines // acting as separators. Store them in a set. void readList(std::string const& file, std::set<std::string> & list) { list.clear(); std::ifstream fh(file); std::string val; while (fh >> val) list.insert(val); fh.close(); } // Replace .<extension> with <suffix> std::string changeFileSuffix(std::string filename, std::string new_suffix) { // Find the last '.' character in the filename size_t last_dot = filename.find_last_of("."); if (last_dot == std::string::npos) { // No dot found, return original filename return filename; } else { // Replace extension with new suffix std::string new_filename = filename.substr(0, last_dot) + new_suffix; return new_filename; } } std::string print_vec(double a) { char st[256]; snprintf(st, sizeof(st), "%7.4f", a); return std::string(st); } std::string print_vec(Eigen::Vector3d a) { char st[256]; snprintf(st, sizeof(st), "%7.4f %7.4f %7.4f", a[0], a[1], a[2]); return std::string(st); } } // end namespace rig ================================================ FILE: src/asp/Rig/BasicAlgs.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_BASIC_ALGS_H #define ASP_RIG_BASIC_ALGS_H // Some low-level algorithms #include <glog/logging.h> #include <Eigen/Geometry> #include <map> #include <algorithm> #include <set> #include <vector> namespace rig { // Look up a map value and throw an error when not found template<class A, class B> B mapVal(std::map<A, B> const& map, A const& a) { auto it = map.find(a); if (it == map.end()) LOG(FATAL) << "Cannot look up expected map value.\n"; return it->second; } // Get a map value while being const-correct and also checking that the value exists. template <class T> T getMapValue(std::vector<std::map<int, std::map<int, T>>> const& pid_cid_fid, size_t pid, int cid, int fid) { if (pid_cid_fid.size() <= pid) LOG(FATAL) << "Current pid is out of range.\n"; auto& cid_fid_map = pid_cid_fid[pid]; // alias auto cid_it = cid_fid_map.find(cid); if (cid_it == cid_fid_map.end()) LOG(FATAL) << "Current cid it out of range.\n"; auto& fid_map = cid_it->second; // alias auto fid_it = fid_map.find(fid); if (fid_it == fid_map.end()) LOG(FATAL) << "Current fid is out of range.\n"; return fid_it->second; } // Set a map value while taking care that the place for it exists. template <class T> void setMapValue(std::vector<std::map<int, std::map<int, T>>> & pid_cid_fid, size_t pid, int cid, int fid, int val) { if (pid_cid_fid.size() <= pid) LOG(FATAL) << "Current pid is out of range.\n"; auto& cid_fid_map = pid_cid_fid[pid]; // alias auto cid_it = cid_fid_map.find(cid); if (cid_it == cid_fid_map.end()) LOG(FATAL) << "Current cid it out of range.\n"; auto& fid_map = cid_it->second; // alias auto fid_it = fid_map.find(fid); if (fid_it == fid_map.end()) LOG(FATAL) << "Current fid is out of range.\n"; fid_it->second = val; } // Maximum value in a map template<typename K, typename V> V maxMapVal(const std::map<K,V> &map) { if (map.empty()) LOG(FATAL) << "Cannot find the maximum value in an empty map.\n"; auto key = std::max_element(map.begin(), map.end(), [](std::pair<K,V> const &x, std::pair<K,V> const &y) { return x.second < y.second; }); return key->second; } // Convert keypoints to Eigen format void vec2eigen(std::vector<std::pair<float, float>> const& vec, Eigen::Matrix2Xd & mat); // Convert keypoints from Eigen format void eigen2vec(Eigen::Matrix2Xd const& mat, std::vector<std::pair<float, float>> & vec); // Read a vector of strings from a file, with spaces and newlines // acting as separators. Store them in a set. void readList(std::string const& file, std::set<std::string> & list); // Replace .<extension> with <suffix> std::string changeFileSuffix(std::string filename, std::string new_suffix); std::string print_vec(double a); std::string print_vec(Eigen::Vector3d a); } // end namespace rig #endif // ASP_RIG_BASIC_ALGS_H ================================================ FILE: src/asp/Rig/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspRig "${ASP_RIG_SRC_FILES}" "${ASP_RIG_TEST_FILES}" "${ASP_RIG_LIB_DEPENDENCIES}") #target_link_libraries(AspRig ${SOLVER_LIBRARIES}) ================================================ FILE: src/asp/Rig/CameraImage.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_CAMERA_IMAGE_H #define ASP_RIG_CAMERA_IMAGE_H #include <opencv2/imgproc.hpp> #include <Eigen/Core> #include <Eigen/Geometry> namespace rig { // A class to encompass all known information about a camera image struct cameraImage { // An index to look up the type of camera. This will equal the // value ref_camera_type if and only if this is a reference // camera. int camera_type; // The timestamp for this camera (in floating point seconds since epoch) // measured by the clock/cpu which is particular to this camera. double timestamp; // The timestamp with an adjustment added to it to be in // reference camera time double ref_timestamp; // The timestamp of the closest cloud for this image, measured // with the same clock as the 'timestamp' value. double cloud_timestamp; // Indices to look up the reference cameras bracketing this camera // in time in array ref_timestamps. These can have the same value // for the reference camera and for the last camera if its time // stamp is also the last ref cam timestamp, as then there's no more // indices. this is a reference camera. int beg_ref_index; int end_ref_index; // The image for this camera, in grayscale cv::Mat image; // The corresponding depth cloud, for an image + depth camera. // Will be empty and uninitialized for a camera lacking depth. cv::Mat depth_cloud; // These will be populated automatically if missing std::string image_name, depth_name; }; // A struct to collect together some attributes of an image or depth cloud // (stored as an image with 3 channels) struct ImageMessage { cv::Mat image; double timestamp; std::string name; Eigen::Affine3d world_to_cam; }; } // namespace rig #endif // ASP_RIG_CAMERA_IMAGE_H ================================================ FILE: src/asp/Rig/Detector.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/Detector.h> #include <opencv2/xfeatures2d.hpp> #include <gflags/gflags.h> #include <glog/logging.h> #include <Eigen/Core> #include <iostream> #include <vector> // Customize the feature detectors. DEFINE_int32(detection_retries, 5, "Number of attempts to acquire the desired number of features with the detector."); // SURF detector DEFINE_int32(min_surf_features, 1000, "Minimum number of features to be computed using SURF."); DEFINE_int32(max_surf_features, 5000, "Maximum number of features to be computed using SURF."); DEFINE_double(min_surf_threshold, 1.1, "Minimum threshold for feature detection using SURF."); DEFINE_double(default_surf_threshold, 10, "Default threshold for feature detection using SURF."); DEFINE_double(max_surf_threshold, 1000, "Maximum threshold for feature detection using SURF."); namespace rig { DynamicDetector::DynamicDetector(int min_features, int max_features, int max_retries, double min_thresh, double default_thresh, double max_thresh): min_features_(min_features), max_features_(max_features), max_retries_(max_retries), min_thresh_(min_thresh), default_thresh_(default_thresh), max_thresh_(max_thresh), dynamic_thresh_(default_thresh) {} void DynamicDetector::GetDetectorParams(int & min_features, int & max_features, int & max_retries, double & min_thresh, double & default_thresh, double & max_thresh) { min_features = min_features_; max_features = max_features_; max_retries = max_retries_; min_thresh = min_thresh_; default_thresh = default_thresh_; max_thresh = max_thresh_; } void DynamicDetector::Detect(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints, cv::Mat* keypoints_description) { // Sometimes we want a placeholder detector for initialization. Yet // that one cannot be used until it is configured. if (default_thresh_ <= 0) LOG(FATAL) << "The detector parameters have not been set."; for (unsigned int i = 0; i < max_retries_; i++) { keypoints->clear(); DetectImpl(image, keypoints); if (keypoints->size() < min_features_) TooFew(); else if (keypoints->size() > max_features_) TooMany(); else break; } ComputeImpl(image, keypoints, keypoints_description); } class SurfDynamicDetector : public DynamicDetector { public: SurfDynamicDetector(int min_features, int max_features, int max_retries, double min_thresh, double default_thresh, double max_thresh) : DynamicDetector(min_features, max_features, max_retries, min_thresh, default_thresh, max_thresh) { surf_ = cv::xfeatures2d::SURF::create(dynamic_thresh_); } virtual void DetectImpl(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints) { surf_->detect(image, *keypoints); } virtual void ComputeImpl(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints, cv::Mat* keypoints_description) { surf_->compute(image, *keypoints, *keypoints_description); } virtual void TooMany(void) { dynamic_thresh_ *= 1.1; if (dynamic_thresh_ > max_thresh_) dynamic_thresh_ = max_thresh_; surf_->setHessianThreshold(static_cast<float>(dynamic_thresh_)); } virtual void TooFew(void) { dynamic_thresh_ *= 0.9; if (dynamic_thresh_ < min_thresh_) dynamic_thresh_ = min_thresh_; surf_->setHessianThreshold(static_cast<float>(dynamic_thresh_)); } private: cv::Ptr<cv::xfeatures2d::SURF> surf_; }; FeatureDetector::FeatureDetector(std::string const& detector_name, int min_features, int max_features, int retries, double min_thresh, double default_thresh, double max_thresh) { detector_ = NULL; Reset(detector_name, min_features, max_features, retries, min_thresh, default_thresh, max_thresh); } void FeatureDetector::GetDetectorParams(int & min_features, int & max_features, int & max_retries, double & min_thresh, double & default_thresh, double & max_thresh) { if (detector_ == NULL) LOG(FATAL) << "The detector was not set."; detector_->GetDetectorParams(min_features, max_features, max_retries, min_thresh, default_thresh, max_thresh); } FeatureDetector::~FeatureDetector(void) { if (detector_ != NULL) { delete detector_; detector_ = NULL; } } void FeatureDetector::Reset(std::string const& detector_name, int min_features, int max_features, int retries, double min_thresh, double default_thresh, double max_thresh) { detector_name_ = detector_name; if (detector_ != NULL) { delete detector_; detector_ = NULL; } // Populate the defaults if (max_features <= 0) { if (detector_name == "SURF") { min_features = FLAGS_min_surf_features; max_features = FLAGS_max_surf_features; retries = FLAGS_detection_retries; min_thresh = FLAGS_min_surf_threshold; default_thresh = FLAGS_default_surf_threshold; max_thresh = FLAGS_max_surf_threshold; } else { LOG(FATAL) << "Unimplemented feature detector: " << detector_name; } } if (detector_name == "SURF") detector_ = new SurfDynamicDetector(min_features, max_features, retries, min_thresh, default_thresh, max_thresh); else LOG(FATAL) << "Unimplemented feature detector: " << detector_name; } void FeatureDetector::Detect(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints, cv::Mat* keypoints_description) { if (detector_ == NULL) LOG(FATAL) << "The detector was not initialized."; detector_->Detect(image, keypoints, keypoints_description); // Normalize the image points relative to the center of the image for (cv::KeyPoint& key : *keypoints) { key.pt.x -= image.cols/2.0; key.pt.y -= image.rows/2.0; } } } // end namespace rig ================================================ FILE: src/asp/Rig/Detector.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_DETECTOR_H #define ASP_RIG_DETECTOR_H #include <vw/InterestPoint/InterestPoint.h> #include <opencv2/features2d/features2d.hpp> #include <Eigen/Core> #include <vector> #include <string> #include <map> namespace rig { typedef std::pair<std::vector<vw::ip::InterestPoint>, std::vector<vw::ip::InterestPoint>> MATCH_PAIR; typedef std::map<std::pair<int, int>, rig::MATCH_PAIR> MATCH_MAP; class DynamicDetector { public: DynamicDetector(int min_features, int max_features, int retries, double min_thresh, double default_thresh, double max_thresh); virtual ~DynamicDetector(void) {} void Detect(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints, cv::Mat* keypoints_description); virtual void DetectImpl(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints) = 0; virtual void ComputeImpl(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints, cv::Mat* keypoints_description) = 0; virtual void TooFew(void) = 0; virtual void TooMany(void) = 0; void GetDetectorParams(int & min_features, int & max_features, int & max_retries, double & min_thresh, double & default_thresh, double & max_thresh); protected: unsigned int min_features_, max_features_, max_retries_; double min_thresh_, default_thresh_, max_thresh_, dynamic_thresh_; }; class FeatureDetector { private: DynamicDetector* detector_; std::string detector_name_; // A feature detector cannot be copied, since it has a pointer FeatureDetector(FeatureDetector &); FeatureDetector& operator=(const FeatureDetector&); public: // Here on purpose invalid values are set, so the user explicitly sets them. FeatureDetector(std::string const& detector_name = "SURF", int min_features = 0, int max_features = 0, int retries = 0, double min_thresh = 0, double default_thresh = 0, double max_thresh = 0); ~FeatureDetector(void); void Reset(std::string const& detector_name, int min_features = 0, int max_features = 0, int retries = 0, double min_thresh = 0, double default_thresh = 0, double max_thresh = 0); void Detect(const cv::Mat& image, std::vector<cv::KeyPoint>* keypoints, cv::Mat* keypoints_description); std::string GetDetectorName() const {return detector_name_;} void GetDetectorParams(int & min_features, int & max_features, int & max_retries, double & min_thresh, double & default_thresh, double & max_thresh); friend bool operator== (FeatureDetector const& A, FeatureDetector const& B) { return (A.detector_name_ == B.detector_name_); } }; } // namespace rig #endif // ASP_RIG_DETECTOR_H ================================================ FILE: src/asp/Rig/ImageLookup.cc ================================================ /* Copyright (c) 2021-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/ImageLookup.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/InterpolationUtils.h> #include <asp/Rig/TransformUtils.h> #include <asp/Core/Nvm.h> #include <asp/Rig/RigImageIO.h> #include <vw/Core/Log.h> #include <glog/logging.h> #include <boost/filesystem.hpp> #include <iostream> #include <fstream> #include <iomanip> namespace fs = boost::filesystem; namespace rig { // Sort by timestamps adjusted to be relative to the ref camera clock. // Additionally sort by image name, so that the order is deterministic. bool timestampLess(cameraImage i, cameraImage j) { return (i.ref_timestamp < j.ref_timestamp) || (i.ref_timestamp == j.ref_timestamp && i.image_name < j.image_name); } // Find an image at the given timestamp or right after it. We assume // that during repeated calls to this function we always travel // forward in time, and we keep track of where we are in the bag using // the variable start_pos that we update as we go. bool lookupImage(// Inputs double desired_time, MsgMap const& msgs, // Outputs cv::Mat& image, std::string & image_name, MsgMapIter& start_pos, double& found_time) { // Initialize the outputs. Note that start_pos is passed in from outside. image = cv::Mat(); image_name = ""; found_time = -1.0; int num_msgs = msgs.size(); double prev_image_time = -1.0; for (auto local_pos = start_pos; local_pos != msgs.end(); local_pos++) { start_pos = local_pos; // save this for exporting rig::ImageMessage const& imgMsg = local_pos->second; // alias found_time = imgMsg.timestamp; // Sanity check: We must always travel forward in time if (found_time < prev_image_time) { LOG(FATAL) << "Found images not in chronological order.\n" << std::fixed << std::setprecision(17) << "Times in wrong order: " << prev_image_time << ' ' << found_time << ".\n"; continue; } prev_image_time = found_time; if (found_time >= desired_time) { // Found the desired data. Do a deep copy, to not depend on the // original structure. imgMsg.image.copyTo(image); image_name = imgMsg.name; return true; } } return false; } // A function to extract poses, filenames, and timestamps from read data. void lookupFilesPoses(// Inputs rig::RigSet const& R, std::vector<std::map<double, rig::ImageMessage>> const& image_maps, std::vector<std::map<double, rig::ImageMessage>> const& depth_maps, // Outputs std::vector<double>& ref_timestamps, std::vector<Eigen::Affine3d> & world_to_ref) { // Sanity checks if (image_maps.size() != depth_maps.size() || image_maps.size() != R.cam_names.size()) LOG(FATAL) << "Bookkeeping failure in lookupFilesPoses()\n"; // Wipe the outputs ref_timestamps.clear(); world_to_ref.clear(); int num_cams = R.cam_names.size(); for (size_t cam_type = 0; cam_type < image_maps.size(); cam_type++) { auto const& image_map = image_maps[cam_type]; for (auto it = image_map.begin(); it != image_map.end(); it++) { // Collect the ref cam timestamps, world_to_ref, in chronological order if (R.isRefSensor(R.cam_names[cam_type])) { world_to_ref.push_back(it->second.world_to_cam); ref_timestamps.push_back(it->second.timestamp); } } } } // Look up each ref cam image by timestamp, with the rig assumption. In between // any two ref cam timestamps, which are no further from each other than the // bracket length, look up one or more images of each of the other camera types // in the rig. If more than one choice, and bracket_single_image is true, choose // the one closest to the midpoint of the two bracketing ref cam timestamps. // This way there's more wiggle room later if one attempts to modify the // timestamp offset. // TODO(oalexan1): This is messy code but was developed with much testing, // and it works. If it is to be cleaned up, it should be done with care. // Especially the cases when the other cameras have exactly the same timestamp // as the ref cam are tricky, and it gets even trickier at the last timestamp. // Also need to consider the case when timestamp_offsets_max_change is true. void lookupImagesAndBrackets(// Inputs double bracket_len, double timestamp_offsets_max_change, bool bracket_single_image, rig::RigSet const& R, std::vector<double> const& ref_timestamps, std::vector<MsgMap> const& image_data, std::vector<MsgMap> const& depth_data, // Outputs std::vector<rig::cameraImage>& cams, std::vector<double>& min_timestamp_offset, std::vector<double>& max_timestamp_offset) { vw::vw_out() << "Looking up the images and bracketing the timestamps." << std::endl; int num_ref_cams = ref_timestamps.size(); int num_cam_types = R.cam_names.size(); // Sanity checks if (R.cam_names.size() != image_data.size()) LOG(FATAL) << "Expecting as many sensors as image datasets for them.\n"; if (R.cam_names.size() != depth_data.size()) LOG(FATAL) << "Expecting as many sensors as depth datasets for them.\n"; // Initialize the outputs cams.clear(); min_timestamp_offset.resize(num_cam_types, -1.0e+100); max_timestamp_offset.resize(num_cam_types, 1.0e+100); // A lot of care is needed with positions. This remembers how we travel in time // for each camera type so we have fewer messages to search. // But if a mistake is done below it will mess up this bookkeeping. std::vector<MsgMapIter> image_start_positions(num_cam_types); std::vector<MsgMapIter> depth_start_positions(num_cam_types); for (int cam_it = 0; cam_it < num_cam_types; cam_it++) { image_start_positions[cam_it] = image_data[cam_it].begin(); depth_start_positions[cam_it] = depth_data[cam_it].begin(); } double big = std::numeric_limits<double>::max(); // Populate the data for each camera image for (int beg_ref_it = 0; beg_ref_it < num_ref_cams; beg_ref_it++) { // For when we have last ref timestamp and last other cam timestamp and they are equal int end_ref_it = beg_ref_it + 1; bool last_timestamp = (end_ref_it == num_ref_cams); if (last_timestamp) end_ref_it = beg_ref_it; for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { std::vector<rig::cameraImage> local_cams; bool success = false; // The ref cam does not need bracketing, but the others need to be bracketed // by ref cam, so there are two cases to consider. if (R.isRefSensor(R.cam_names[cam_type])) { // Case of ref sensor rig::cameraImage cam; cam.camera_type = cam_type; cam.timestamp = ref_timestamps[beg_ref_it]; cam.ref_timestamp = cam.timestamp; // the time offset is 0 between ref and itself cam.beg_ref_index = beg_ref_it; cam.end_ref_index = beg_ref_it; // same index for beg and end // Start looking up the image timestamp from this position. Some care // is needed here as we advance in time in image_start_positions[cam_type]. double found_time = -1.0; // This has to succeed since this timestamp came from an existing image bool have_lookup = rig::lookupImage(cam.timestamp, image_data[cam_type], // Outputs cam.image, cam.image_name, image_start_positions[cam_type], // this will move forward found_time); if (!have_lookup) LOG(FATAL) << std::fixed << std::setprecision(17) << "Cannot look up camera at time " << cam.timestamp << ".\n"; // The exact time is expected if (found_time != cam.timestamp) LOG(FATAL) << std::fixed << std::setprecision(17) << "Cannot look up camera at time " << cam.timestamp << ".\n"; success = true; local_cams.push_back(cam); } else { // Case of not ref sensor // Need care here since sometimes ref_cam and current cam can have // exactly the same timestamp, so then bracketing should succeed. // Convert the bracketing timestamps to current cam's time double ref_to_cam_offset = R.ref_to_cam_timestamp_offsets[cam_type]; double beg_timestamp = ref_timestamps[beg_ref_it] + ref_to_cam_offset; double end_timestamp = ref_timestamps[end_ref_it] + ref_to_cam_offset; if (end_timestamp == beg_timestamp && last_timestamp) // necessary adjustment end_timestamp = std::nextafter(end_timestamp, big); if (end_timestamp <= beg_timestamp) LOG(FATAL) << "Ref timestamps must be in strictly increasing order.\n"; // Find the image timestamp closest to the midpoint of the brackets. This will give // more room to vary the timestamp later. double mid_timestamp = (beg_timestamp + end_timestamp)/2.0; // Search forward in time from image_start_positions[cam_type]. // We will update that too later. One has to be very careful // with it so it does not go too far forward in time // so that at the next iteration we are passed what we // search for. MsgMapIter start_pos = image_start_positions[cam_type]; // care here double curr_timestamp = beg_timestamp; // start here double found_time = -1.0; std::vector<double> found_times; std::vector<cv::Mat> found_images; std::vector<std::string> found_image_names; while (1) { // Stop when we are past the end of the bracket if (found_time > end_timestamp) break; cv::Mat image; std::string image_name; bool have_lookup = rig::lookupImage(curr_timestamp, image_data[cam_type], // Outputs image, image_name, // care here, start_pos moves forward start_pos, // found_time will be updated now found_time); // Need not succeed, but then there's no need to go on as we // are at the end if (!have_lookup) break; // Check if the found time is in the bracket. Note how we allow // found_time == beg_timestamp if there's no other choice. bool is_in_bracket = (beg_timestamp <= found_time && found_time < end_timestamp); double curr_dist = std::abs(found_time - mid_timestamp); // Must respect the bracket length, unless best time equals beg time, // as then the bracketing is not going to be used. bool fail_bracket_len = ((found_time > beg_timestamp && end_timestamp - beg_timestamp > bracket_len)); if (is_in_bracket && !fail_bracket_len) { // Update the start position for the future only if this is a good // solution. Otherwise we may have moved too far. image_start_positions[cam_type] = start_pos; // Record the found image found_images.push_back(cv::Mat()); image.copyTo(found_images.back()); found_times.push_back(found_time); found_image_names.push_back(image_name); } // Go forward in time. We count on the fact that // lookupImage() looks forward from given guess. // Careful here with the api of std::nextafter(). curr_timestamp = std::nextafter(found_time, big); } // end while loop if (bracket_single_image) { // Must pick only one image, which is closest to the midpoint cv::Mat best_image; std::string best_image_name; double best_dist = 1.0e+100; double best_time = -1.0; best_dist = 1.0e+100; // loop over found images to find the closest one to the midpoint. Save // that as best image, and update best_time and best_image_name, and best_dist. for (size_t i = 0; i < found_times.size(); i++) { double curr_dist = std::abs(found_times[i] - mid_timestamp); if (curr_dist < best_dist) { best_dist = curr_dist; best_time = found_times[i]; found_images[i].copyTo(best_image); best_image_name = found_image_names[i]; } } if (best_time < 0.0) continue; // bracketing failed // Make the vector of found images contain only the best image found_images.resize(1); found_times.resize(1); found_image_names.resize(1); best_image.copyTo(found_images[0]); found_times[0] = best_time; found_image_names[0] = best_image_name; } // Iterate ove found_times and add to local_cams for (size_t i = 0; i < found_times.size(); i++) { rig::cameraImage cam; cam.camera_type = cam_type; cam.timestamp = found_times[i]; cam.ref_timestamp = found_times[i] - ref_to_cam_offset; cam.beg_ref_index = beg_ref_it; cam.end_ref_index = end_ref_it; found_images[i].copyTo(cam.image); cam.image_name = found_image_names[i]; local_cams.push_back(cam); } success = (local_cams.size() > 0); } // end case of not ref sensor if (!success) continue; // Iterate over the local_cams and update the timestamp offset bounds for (size_t i = 0; i < local_cams.size(); i++) { auto & cam = local_cams[i]; if (!R.isRefSensor(R.cam_names[cam_type])) { // Not a ref sensor double ref_to_cam_offset = R.ref_to_cam_timestamp_offsets[cam_type]; // Assuming the option --bracket_single_image is used, // cam.timestamp was chosen as centrally as possible so that // ref_timestamps[beg_ref_it] + ref_to_cam_offset <= cam.timestamp // and // cam.timestamp <= ref_timestamps[end_ref_it] + ref_to_cam_offset // Find the range of potential future values of ref_to_cam_offset so that // cam.timestamp still respects these bounds. min_timestamp_offset[cam_type] = std::max(min_timestamp_offset[cam_type], cam.timestamp - ref_timestamps[end_ref_it]); max_timestamp_offset[cam_type] = std::min(max_timestamp_offset[cam_type], cam.timestamp - ref_timestamps[beg_ref_it]); } // Look up the closest depth in time (either before or after cam.timestamp) // This need not succeed. cam.cloud_timestamp = -1.0; // will change if (!depth_data.empty()) rig::lookupImage(cam.timestamp, // start looking from this time forward depth_data[cam_type], // Outputs cam.depth_cloud, cam.depth_name, depth_start_positions[cam_type], // this will move forward cam.cloud_timestamp); // found time cams.push_back(cam); } // end loop over local_cams } // end loop over camera types } // end loop over ref images // Adjust for timestamp_offsets_max_change. Printing the bounds is useful if // the timestamps can be allowed to change. Turn off printing this for now, as // it is rather confusing. // vw::vw_out() << "If optimizing the timestamp offset, its bounds must be, per sensor:\n"; for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { if (R.isRefSensor(R.cam_names[cam_type])) continue; // bounds don't make sense here min_timestamp_offset[cam_type] = std::max(min_timestamp_offset[cam_type], R.ref_to_cam_timestamp_offsets[cam_type] - timestamp_offsets_max_change); max_timestamp_offset[cam_type] = std::min(max_timestamp_offset[cam_type], R.ref_to_cam_timestamp_offsets[cam_type] + timestamp_offsets_max_change); // Tighten the range a bit to ensure we don't exceed things when we add and // subtract timestamps later. Note that timestamps are measured in seconds // and fractions of a second since epoch and can be quite large so precision // loss can easily happen. double delta = (max_timestamp_offset[cam_type] - min_timestamp_offset[cam_type]); delta = std::max(std::min(delta/10.0, 1.0e-5), 0.0); min_timestamp_offset[cam_type] += delta; max_timestamp_offset[cam_type] -= delta; // Print the timestamp offset allowed ranges // vw::vw_out() << std::setprecision(8) << R.cam_names[cam_type] // << ": [" << min_timestamp_offset[cam_type] // << ", " << max_timestamp_offset[cam_type] << "]\n"; } } // Assuming that the rig constraint is not used, initialize the 'cams' structure // by copying each image and its other data in that structure as expected // by later code. See also lookupImagesAndBrackets() when some selection based // on bracketing takes place. void lookupImagesNoBrackets(// Inputs rig::RigSet const& R, std::vector<MsgMap> const& image_data, std::vector<MsgMap> const& depth_data, // Outputs std::vector<rig::cameraImage>& cams, std::vector<double>& min_timestamp_offset, std::vector<double>& max_timestamp_offset) { vw::vw_out() << "Looking up the images." << std::endl; int num_cam_types = R.cam_names.size(); // Initialize the outputs cams.clear(); min_timestamp_offset.resize(num_cam_types, -1.0e+100); max_timestamp_offset.resize(num_cam_types, 1.0e+100); // A lot of care is needed with positions. This remembers how we travel in time // for each camera type so we have fewer messages to search. // But if a mistake is done below it will mess up this bookkeeping. std::vector<MsgMapIter> image_start_positions(num_cam_types); std::vector<MsgMapIter> depth_start_positions(num_cam_types); for (int cam_it = 0; cam_it < num_cam_types; cam_it++) { image_start_positions[cam_it] = image_data[cam_it].begin(); depth_start_positions[cam_it] = depth_data[cam_it].begin(); } // Populate the data for each camera image for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { int cam_it = -1; for (auto map_it = image_data[cam_type].begin(); map_it != image_data[cam_type].end(); map_it++) { cam_it++; rig::cameraImage cam; cam.camera_type = cam_type; cam.timestamp = (map_it->second).timestamp; cam.ref_timestamp = cam.timestamp; // no rig, so no timestamp offset // These two values below should not be needed with no rig cam.beg_ref_index = cam_it; cam.end_ref_index = cam_it; // Start looking up the image timestamp from this position. Some care // is needed here as we advance in time in image_start_positions[cam_type]. double found_time = -1.0; // This has to succeed since this timestamp originally came from an existing image bool have_lookup = rig::lookupImage(cam.timestamp, image_data[cam_type], // Outputs cam.image, cam.image_name, image_start_positions[cam_type], // this will move forward found_time); if (!have_lookup) LOG(FATAL) << std::fixed << std::setprecision(17) << "Cannot look up camera at time " << cam.timestamp << ".\n"; // The exact time is expected if (found_time != cam.timestamp) LOG(FATAL) << std::fixed << std::setprecision(17) << "Cannot look up camera at time " << cam.timestamp << ".\n"; // Look up the closest cloud in time (either before or after cam.timestamp) // This need not succeed. cam.cloud_timestamp = -1.0; // will change if (!depth_data.empty()) rig::lookupImage(cam.timestamp, // start looking from this time forward depth_data[cam_type], // Outputs cam.depth_cloud, cam.depth_name, depth_start_positions[cam_type], // this will move forward cam.cloud_timestamp); // found time // Accept this camera cams.push_back(cam); } // end loop over camera types } // end loop over ref images return; } // Look up images, with or without the rig constraint. See individual functions // below for more details. void lookupImagesOneRig(// Inputs bool no_rig, double bracket_len, double timestamp_offsets_max_change, bool bracket_single_image, rig::RigSet const& R, std::vector<MsgMap> const& image_maps, std::vector<MsgMap> const& depth_maps, // Outputs std::vector<double> & ref_timestamps, std::vector<Eigen::Affine3d> & world_to_ref, std::vector<rig::cameraImage> & cams, std::vector<Eigen::Affine3d> & world_to_cam, std::vector<double> & min_timestamp_offset, std::vector<double> & max_timestamp_offset) { rig::lookupFilesPoses(// Inputs R, image_maps, depth_maps, // Outputs ref_timestamps, world_to_ref); if (!no_rig) lookupImagesAndBrackets(// Inputs bracket_len, timestamp_offsets_max_change, bracket_single_image, R, ref_timestamps, image_maps, depth_maps, // Outputs cams, min_timestamp_offset, max_timestamp_offset); else lookupImagesNoBrackets(// Inputs R, image_maps, depth_maps, // Outputs cams, min_timestamp_offset, max_timestamp_offset); // See how many timestamps we have for each camera std::map<int, int> num_images; int num_cam_types = R.cam_names.size(); for (int cam_type_it = 0; cam_type_it < num_cam_types; cam_type_it++) num_images[cam_type_it] = 0; for (size_t cam_it = 0; cam_it < cams.size(); cam_it++) num_images[cams[cam_it].camera_type]++; bool is_good = true; for (int cam_type_it = 0; cam_type_it < num_cam_types; cam_type_it++) { vw::vw_out() << "Number of images for sensor: " << R.cam_names[cam_type_it] << ": " << num_images[cam_type_it] << std::endl; if (num_images[cam_type_it] == 0) is_good = false; } if (!is_good) vw::vw_out(vw::WarningMessage) << "Could not find images for all sensors.\n"; // The images may need to be resized to be the same // size as in the calibration file. Sometimes the full-res images // can be so blurry that interest point matching fails, hence the // resizing. for (size_t it = 0; it < cams.size(); it++) rig::adjustImageSize(R.cam_params[cams[it].camera_type], cams[it].image); // Sort by the timestamp in reference camera time. This is essential // for matching each image to other images close in time. Note // that this does not affect the book-keeping of beg_ref_index // and end_ref_it in this vector because those indices point to // world_to_ref and ref_timestamp, which do not change. // Note that this happens for each rig. So, different rigs // have the ref timestamps individually sorted, and later // these will be concatenated. std::sort(cams.begin(), cams.end(), rig::timestampLess); // Parse the transform from the world to each cam, which were known // on input. Later, if use_initial_rig_transform is specified, // these will be computed based on the rig. Since // image_maps[cam_type] is sorted chronologically, travel in time // along at as we move along the cams array. Use the two arrays // below to remember where we left off. // TODO(oalexan1): This is fragile. It relies on cams being sorted by time. // Make the cams array have a world_to_cam entry and remove the loop below. world_to_cam.resize(cams.size()); std::vector<MsgMapIter> beg_pos(num_cam_types); std::vector<MsgMapIter> end_pos(num_cam_types); for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { beg_pos[cam_type] = image_maps[cam_type].begin(); end_pos[cam_type] = image_maps[cam_type].end(); } for (size_t cam_it = 0; cam_it < cams.size(); cam_it++) { int cam_type = cams[cam_it].camera_type; for (auto pos = beg_pos[cam_type]; pos != end_pos[cam_type]; pos++) { if (cams[cam_it].timestamp == pos->first) { world_to_cam[cam_it] = (pos->second).world_to_cam; beg_pos[cam_type] = pos; // save for next time break; } } } return; } // Look up images for a set of rigs. This requires looking up images for individual rigs, // then concatenating the results and adjusting the book-keeping. void lookupImages(// Inputs bool no_rig, double bracket_len, double timestamp_offsets_max_change, bool bracket_single_image, rig::RigSet const& R, std::vector<MsgMap> const& image_maps, std::vector<MsgMap> const& depth_maps, // Outputs std::vector<double> & ref_timestamps, std::vector<Eigen::Affine3d> & world_to_ref, std::vector<rig::cameraImage> & cams, std::vector<Eigen::Affine3d> & world_to_cam, std::vector<double> & min_timestamp_offset, std::vector<double> & max_timestamp_offset) { // Wipe the outputs ref_timestamps.clear(); world_to_ref.clear(); cams.clear(); world_to_cam.clear(); min_timestamp_offset.clear(); max_timestamp_offset.clear(); for (size_t rig_id = 0; rig_id < R.cam_set.size(); rig_id++) { // Create a single rig rig::RigSet sub_rig = R.subRig(rig_id); // Prepare the inputs for the subrig std::vector<MsgMap> sub_image_maps; std::vector<MsgMap> sub_depth_maps; for (size_t sub_it = 0; sub_it < sub_rig.cam_names.size(); sub_it++) { std::string sensor_name = sub_rig.cam_names[sub_it]; int rig_set_it = R.sensorIndex(sensor_name); // index in the larger rig sub_image_maps.push_back(image_maps[rig_set_it]); sub_depth_maps.push_back(depth_maps[rig_set_it]); } std::vector<double> sub_ref_timestamps; std::vector<Eigen::Affine3d> sub_world_to_ref; std::vector<rig::cameraImage> sub_cams; std::vector<Eigen::Affine3d> sub_world_to_cam; std::vector<double> sub_min_timestamp_offset; std::vector<double> sub_max_timestamp_offset; // Do the work for the subrig lookupImagesOneRig(// Inputs no_rig, bracket_len, timestamp_offsets_max_change, bracket_single_image, sub_rig, sub_image_maps, sub_depth_maps, // Outputs sub_ref_timestamps, sub_world_to_ref, sub_cams, sub_world_to_cam, sub_min_timestamp_offset, sub_max_timestamp_offset); // Save the endpoints for ref timestamps and all cams, before concatenation size_t prev_ref_end = ref_timestamps.size(); size_t prev_end = cams.size(); // Append the answers ref_timestamps.insert(ref_timestamps.end(), sub_ref_timestamps.begin(), sub_ref_timestamps.end()); world_to_ref.insert(world_to_ref.end(), sub_world_to_ref.begin(), sub_world_to_ref.end()); cams.insert(cams.end(), sub_cams.begin(), sub_cams.end()); world_to_cam.insert(world_to_cam.end(), sub_world_to_cam.begin(), sub_world_to_cam.end()); min_timestamp_offset.insert(min_timestamp_offset.end(), sub_min_timestamp_offset.begin(), sub_min_timestamp_offset.end()); max_timestamp_offset.insert(max_timestamp_offset.end(), sub_max_timestamp_offset.begin(), sub_max_timestamp_offset.end()); // Update the bookkeeping in 'cams' for (size_t cam_it = prev_end; cam_it < cams.size(); cam_it++) { // Find the current sensor index in the larger rig set int subrig_sensor_index = cams[cam_it].camera_type; std::string subrig_sensor = sub_rig.cam_names[subrig_sensor_index]; int rig_sensor_index = R.sensorIndex(subrig_sensor); cams[cam_it].camera_type = rig_sensor_index; // Update the pointers to indices in ref_timestamps cams[cam_it].beg_ref_index += prev_ref_end; cams[cam_it].end_ref_index += prev_ref_end; } } return; } // Find pointers to the camera and reference images that bracket the // camera image. Great care is needed here. Two cases are considered, // if there is a rig or not. If no_rig is true, then the reference images are // the same as the camera images. void calcBracketing(// Inputs bool no_rig, int cid, int cam_type, std::vector<rig::cameraImage> const& cams, std::vector<double> const& ref_timestamps, rig::RigSet const& R, // Will not be changed but need access std::vector<double> & world_to_cam_vec, std::vector<double> & world_to_ref_vec, std::vector<double> & ref_to_cam_vec, std::vector<double> & ref_identity_vec, std::vector<double> & right_identity_vec, // Outputs double* & beg_cam_ptr, double* & end_cam_ptr, double* & ref_to_cam_ptr, double & beg_ref_timestamp, double & end_ref_timestamp, double & cam_timestamp) { if (!no_rig) { // Model the rig, use timestamps int beg_ref_index = cams[cid].beg_ref_index; int end_ref_index = cams[cid].end_ref_index; // Left bracketing ref cam for a given cam. For a ref cam, this is itself. beg_cam_ptr = &world_to_ref_vec[rig::NUM_RIGID_PARAMS * beg_ref_index]; // Right bracketing camera. When the cam is the ref type, // or when this cam is the last one and has exactly // same timestamp as the ref cam, this is not used. if (R.isRefSensor(R.cam_names[cam_type]) || beg_ref_index == end_ref_index) end_cam_ptr = &right_identity_vec[0]; else end_cam_ptr = &world_to_ref_vec[rig::NUM_RIGID_PARAMS * end_ref_index]; // The beg and end timestamps will be the same only for the // ref cam or for last non-ref cam whose timestamp is same // as ref cam timestamp which is also last. beg_ref_timestamp = ref_timestamps[beg_ref_index]; end_ref_timestamp = ref_timestamps[end_ref_index]; cam_timestamp = cams[cid].timestamp; // uses current camera's clock } else { // No rig. Then, beg_cam_ptr is just current camera, not the // ref bracketing cam, end_cam_ptr is the identity. The timestamps // will be the same, so the camera brackets itself. cam_timestamp = cams[cid].timestamp; beg_ref_timestamp = cam_timestamp; end_ref_timestamp = cam_timestamp; // Note how we use world_to_cam_vec and not world_to_ref_vec for // the beg cam. The end cam is unused. beg_cam_ptr = &world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid]; end_cam_ptr = &right_identity_vec[0]; } // Transform from reference camera to given camera. Won't be used when // FLAGS_no_rig is true or when the cam is of ref type. if (no_rig || R.isRefSensor(R.cam_names[cam_type])) ref_to_cam_ptr = &ref_identity_vec[0]; else ref_to_cam_ptr = &ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type]; return; } } // end namespace rig ================================================ FILE: src/asp/Rig/ImageLookup.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_IMAGE_LOOKUP_H #define ASP_RIG_IMAGE_LOOKUP_H #include <opencv2/calib3d/calib3d.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/core/utility.hpp> #include <Eigen/Core> #include <Eigen/Geometry> #include <boost/shared_ptr.hpp> #include <map> #include <set> #include <string> #include <vector> namespace rig { // Forward declaration class CameraParameters; } namespace asp { class nvmData; } namespace rig { // Forward declarations class cameraImage; class ImageMessage; class RigSet; // Look up images, with or without the rig constraint. See individual // functions below for more details. typedef std::map<double, rig::ImageMessage> MsgMap; typedef MsgMap::const_iterator MsgMapIter; void lookupImages(// Inputs bool no_rig, double bracket_len, double timestamp_offsets_max_change, bool bracket_single_image, rig::RigSet const& R, std::vector<MsgMap> const& image_maps, std::vector<MsgMap> const& depth_maps, // Outputs std::vector<double> & ref_timestamps, std::vector<Eigen::Affine3d> & world_to_ref, std::vector<rig::cameraImage> & cams, std::vector<Eigen::Affine3d> & world_to_cam, std::vector<double> & min_timestamp_offset, std::vector<double> & max_timestamp_offset); // Find pointers to the camera and reference images that bracket the // camera image. Great care is needed here. Two cases are considered, // if there is a rig or not. If no_rig is true, then the reference images are // the same as the camera images. void calcBracketing(// Inputs bool no_rig, int cid, int cam_type, std::vector<rig::cameraImage> const& cams, std::vector<double> const& ref_timestamps, rig::RigSet const& R, // Will not be changed but need access std::vector<double> & world_to_cam_vec, std::vector<double> & world_to_ref_vec, std::vector<double> & ref_to_cam_vec, std::vector<double> & ref_identity_vec, std::vector<double> & right_identity_vec, // Outputs double* & beg_cam_ptr, double* & end_cam_ptr, double* & ref_to_cam_ptr, double & beg_ref_timestamp, double & end_ref_timestamp, double & cam_timestamp); } // namespace rig #endif // ASP_RIG_IMAGE_LOOKUP_H ================================================ FILE: src/asp/Rig/InterestPoint.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Core/Nvm.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/InterestPoint.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/RigThread.h> #include <asp/Rig/Detector.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/InterpolationUtils.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/ImageLookup.h> #include <asp/Rig/Tracks.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/NvmUtils.h> #include <asp/Rig/RigIo.h> #include <asp/Rig/Triangulation.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Math/RandomSet.h> #include <opencv2/xfeatures2d.hpp> #include <opencv2/highgui.hpp> #include <opencv2/calib3d/calib3d.hpp> // Get rid of warnings beyond our control #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic push #include <OpenMVG/projection.hpp> #include <OpenMVG/triangulation_nview.hpp> #include <OpenMVG/tracks.hpp> #pragma GCC diagnostic pop #include <boost/filesystem.hpp> #include <iostream> #include <fstream> #include <iomanip> namespace fs = boost::filesystem; // SIFT is doing so much better than SURF for haz cam images. DEFINE_string(feature_detector, "SIFT", "The feature detector to use. SIFT or SURF."); DEFINE_int32(sift_nFeatures, 10000, "Number of SIFT features."); DEFINE_int32(sift_nOctaveLayers, 3, "Number of SIFT octave layers."); DEFINE_double(sift_contrastThreshold, 0.02, "SIFT contrast threshold"); // decrease for more ip DEFINE_double(sift_edgeThreshold, 10, "SIFT edge threshold."); DEFINE_double(sift_sigma, 1.6, "SIFT sigma."); DEFINE_int32(max_pairwise_matches, 2000, "Maximum number of pairwise matches in an image pair to keep."); DEFINE_double(goodness_ratio, 0.8, "A smaller value keeps fewer but more reliable float descriptor matches."); namespace rig { // Copy IP information from an OpenCV KeyPoint object. void setFromCvKeypoint(Eigen::Vector2d const& key, cv::Mat const& cv_descriptor, vw::ip::InterestPoint& ip) { ip.x = key[0]; ip.y = key[1]; ip.ix = round(ip.x); ip.iy = round(ip.y); ip.interest = 0; ip.octave = 0; ip.scale_lvl = 1; ip.scale = 1; ip.orientation = 0; ip.polarity = false; if (cv_descriptor.rows != 1 || cv_descriptor.cols < 2) LOG(FATAL) << "The descriptors must be in one row, and have at least two columns."; ip.descriptor.set_size(cv_descriptor.cols); for (size_t it = 0; it < ip.descriptor.size(); it++) { ip.descriptor[it] = cv_descriptor.at<float>(0, it); } } void detectFeatures(const cv::Mat& image, bool verbose, // Outputs cv::Mat* descriptors, Eigen::Matrix2Xd* keypoints) { bool histogram_equalization = false; // If using histogram equalization, need an extra image to store it cv::Mat* image_ptr = const_cast<cv::Mat*>(&image); cv::Mat hist_image; if (histogram_equalization) { cv::equalizeHist(image, hist_image); image_ptr = &hist_image; } std::vector<cv::KeyPoint> storage; if (FLAGS_feature_detector == "SIFT") { cv::Ptr<cv::SIFT> sift = cv::SIFT::create(FLAGS_sift_nFeatures, FLAGS_sift_nOctaveLayers, FLAGS_sift_contrastThreshold, FLAGS_sift_edgeThreshold, FLAGS_sift_sigma); sift->detect(image, storage); sift->compute(image, storage, *descriptors); } else if (FLAGS_feature_detector == "SURF") { rig::FeatureDetector detector("SURF"); detector.Detect(*image_ptr, &storage, descriptors); // Undo the shift in the detector for (cv::KeyPoint& key : storage) { key.pt.x += image.cols / 2.0; key.pt.y += image.rows / 2.0; } } else { LOG(FATAL) << "Unknown feature detector: " << FLAGS_feature_detector; } if (verbose) std::cout << "Features detected " << storage.size() << std::endl; // Copy to data structures expected by subsequent code keypoints->resize(2, storage.size()); Eigen::Vector2d output; for (size_t j = 0; j < storage.size(); j++) { keypoints->col(j) = Eigen::Vector2d(storage[j].pt.x, storage[j].pt.y); } } void reduceMatches(std::vector<vw::ip::InterestPoint> & left_ip, std::vector<vw::ip::InterestPoint> & right_ip) { // pick a random subset std::vector<int> subset; vw::math::pick_random_indices_in_range(left_ip.size(), FLAGS_max_pairwise_matches, subset); std::sort(subset.begin(), subset.end()); // sort the indices (not strictly necessary) std::vector<vw::ip::InterestPoint> left_ip_full, right_ip_full; left_ip_full.swap(left_ip); right_ip_full.swap(right_ip); left_ip.resize(FLAGS_max_pairwise_matches); right_ip.resize(FLAGS_max_pairwise_matches); for (size_t it = 0; it < subset.size(); it++) { left_ip[it] = left_ip_full[subset[it]]; right_ip[it] = right_ip_full[subset[it]]; } } // descriptor is what opencv descriptor was used to make the descriptors // the descriptor maps are the features in the two images // matches is output to contain the matching features between the two images void FindMatches(const cv::Mat & img1_descriptor_map, const cv::Mat & img2_descriptor_map, std::vector<cv::DMatch> * matches) { CHECK(img1_descriptor_map.depth() == img2_descriptor_map.depth()) << "Mixed descriptor types. Did you mash BRISK with SIFT/SURF?"; // Check for early exit conditions matches->clear(); if (img1_descriptor_map.rows == 0 || img2_descriptor_map.rows == 0) return; // Traditional floating point descriptor cv::FlannBasedMatcher matcher; std::vector<std::vector<cv::DMatch> > possible_matches; matcher.knnMatch(img1_descriptor_map, img2_descriptor_map, possible_matches, 2); matches->clear(); matches->reserve(possible_matches.size()); for (std::vector<cv::DMatch> const& best_pair : possible_matches) { if (best_pair.size() == 1) { // This was the only best match, push it. matches->push_back(best_pair.at(0)); } else { // Push back a match only if it is 25% better than the next best. if (best_pair.at(0).distance < FLAGS_goodness_ratio * best_pair.at(1).distance) { matches->push_back(best_pair[0]); } } } } // This really likes haz cam first and nav cam second // Note: The function matchFeaturesWithCams() is used instead. void matchFeatures(std::mutex* match_mutex, int left_image_index, int right_image_index, cv::Mat const& left_descriptors, cv::Mat const& right_descriptors, Eigen::Matrix2Xd const& left_keypoints, Eigen::Matrix2Xd const& right_keypoints, bool verbose, // output MATCH_PAIR* matches) { std::vector<cv::DMatch> cv_matches; rig::FindMatches(left_descriptors, right_descriptors, &cv_matches); std::vector<cv::Point2f> left_vec; std::vector<cv::Point2f> right_vec; for (size_t j = 0; j < cv_matches.size(); j++) { int left_ip_index = cv_matches.at(j).queryIdx; int right_ip_index = cv_matches.at(j).trainIdx; // Get the keypoints from the good matches left_vec.push_back(cv::Point2f(left_keypoints.col(left_ip_index)[0], left_keypoints.col(left_ip_index)[1])); right_vec.push_back(cv::Point2f(right_keypoints.col(right_ip_index)[0], right_keypoints.col(right_ip_index)[1])); } if (left_vec.empty()) return; // These may need some tweaking but works reasonably well. double ransacReprojThreshold = 20.0; cv::Mat inlier_mask; int maxIters = 10000; double confidence = 0.8; // affine2D works better than homography // cv::Mat H = cv::findHomography(left_vec, right_vec, cv::RANSAC, // ransacReprojThreshold, inlier_mask, maxIters, confidence); cv::Mat H = cv::estimateAffine2D(left_vec, right_vec, inlier_mask, cv::RANSAC, ransacReprojThreshold, maxIters, confidence); std::vector<vw::ip::InterestPoint> left_ip, right_ip; for (size_t j = 0; j < cv_matches.size(); j++) { if (inlier_mask.at<uchar>(j, 0) == 0) continue; int left_ip_index = cv_matches.at(j).queryIdx; int right_ip_index = cv_matches.at(j).trainIdx; cv::Mat left_desc = left_descriptors.row(left_ip_index); cv::Mat right_desc = right_descriptors.row(right_ip_index); vw::ip::InterestPoint left; setFromCvKeypoint(left_keypoints.col(left_ip_index), left_desc, left); vw::ip::InterestPoint right; setFromCvKeypoint(right_keypoints.col(right_ip_index), right_desc, right); left_ip.push_back(left); right_ip.push_back(right); } // Update the shared variable using a lock match_mutex->lock(); // Print the verbose message inside the lock, otherwise the text // may get messed up. if (verbose) std::cout << "Number of matches for pair " << left_image_index << ' ' << right_image_index << ": " << left_ip.size() << std::endl; if (FLAGS_max_pairwise_matches >= 0 && (int)left_ip.size() > FLAGS_max_pairwise_matches) reduceMatches(left_ip, right_ip); *matches = std::make_pair(left_ip, right_ip); match_mutex->unlock(); } // Match features while assuming that the input cameras can be used to filter out // outliers by reprojection error. // TODO(oalexan1): This can be fragile. What if input cameras have poor pointing info? void matchFeaturesWithCams(std::mutex* match_mutex, int left_image_index, int right_image_index, rig::CameraParameters const& left_params, rig::CameraParameters const& right_params, bool filter_matches_using_cams, Eigen::Affine3d const& left_world_to_cam, Eigen::Affine3d const& right_world_to_cam, double reprojection_error, cv::Mat const& left_descriptors, cv::Mat const& right_descriptors, Eigen::Matrix2Xd const& left_keypoints, Eigen::Matrix2Xd const& right_keypoints, bool verbose, // output MATCH_PAIR* matches) { // Match by using descriptors first std::vector<cv::DMatch> cv_matches; rig::FindMatches(left_descriptors, right_descriptors, &cv_matches); // Do filtering std::vector<cv::Point2f> left_vec; std::vector<cv::Point2f> right_vec; std::vector<cv::DMatch> filtered_cv_matches; for (size_t j = 0; j < cv_matches.size(); j++) { int left_ip_index = cv_matches.at(j).queryIdx; int right_ip_index = cv_matches.at(j).trainIdx; // We may not always have the cameras to use in filtering if (filter_matches_using_cams) { Eigen::Vector2d dist_left_ip(left_keypoints.col(left_ip_index)[0], left_keypoints.col(left_ip_index)[1]); Eigen::Vector2d dist_right_ip(right_keypoints.col(right_ip_index)[0], right_keypoints.col(right_ip_index)[1]); Eigen::Vector2d undist_left_ip; Eigen::Vector2d undist_right_ip; left_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C> (dist_left_ip, &undist_left_ip); right_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C> (dist_right_ip, &undist_right_ip); Eigen::Vector3d X = rig::TriangulatePair(left_params.GetFocalLength(), right_params.GetFocalLength(), left_world_to_cam, right_world_to_cam, undist_left_ip, undist_right_ip); // Project back into the cameras Eigen::Vector3d left_cam_X = left_world_to_cam * X; Eigen::Vector2d undist_left_pix = left_params.GetFocalVector().cwiseProduct(left_cam_X.hnormalized()); Eigen::Vector2d dist_left_pix; left_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED>(undist_left_pix, &dist_left_pix); Eigen::Vector3d right_cam_X = right_world_to_cam * X; Eigen::Vector2d undist_right_pix = right_params.GetFocalVector().cwiseProduct(right_cam_X.hnormalized()); Eigen::Vector2d dist_right_pix; right_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED>(undist_right_pix, &dist_right_pix); // Filter out points whose reprojection error is too big bool is_good = ((dist_left_ip - dist_left_pix).norm() <= reprojection_error && (dist_right_ip - dist_right_pix).norm() <= reprojection_error); // If any values above are Inf or NaN, is_good will be false as well if (!is_good) continue; } // Get the keypoints from the good matches left_vec.push_back(cv::Point2f(left_keypoints.col(left_ip_index)[0], left_keypoints.col(left_ip_index)[1])); right_vec.push_back(cv::Point2f(right_keypoints.col(right_ip_index)[0], right_keypoints.col(right_ip_index)[1])); filtered_cv_matches.push_back(cv_matches[j]); } if (left_vec.empty()) return; // Filter using geometry constraints // These may need some tweaking but works reasonably well. double ransacReprojThreshold = 20.0; cv::Mat inlier_mask; int maxIters = 10000; double confidence = 0.8; // affine2D works better than homography // cv::Mat H = cv::findHomography(left_vec, right_vec, cv::RANSAC, // ransacReprojThreshold, inlier_mask, maxIters, confidence); cv::Mat H = cv::estimateAffine2D(left_vec, right_vec, inlier_mask, cv::RANSAC, ransacReprojThreshold, maxIters, confidence); std::vector<vw::ip::InterestPoint> left_ip, right_ip; for (size_t j = 0; j < filtered_cv_matches.size(); j++) { int left_ip_index = filtered_cv_matches.at(j).queryIdx; int right_ip_index = filtered_cv_matches.at(j).trainIdx; if (inlier_mask.at<uchar>(j, 0) == 0) continue; cv::Mat left_desc = left_descriptors.row(left_ip_index); cv::Mat right_desc = right_descriptors.row(right_ip_index); vw::ip::InterestPoint left; setFromCvKeypoint(left_keypoints.col(left_ip_index), left_desc, left); vw::ip::InterestPoint right; setFromCvKeypoint(right_keypoints.col(right_ip_index), right_desc, right); left_ip.push_back(left); right_ip.push_back(right); } if (FLAGS_max_pairwise_matches >= 0 && (int)left_ip.size() > FLAGS_max_pairwise_matches) reduceMatches(left_ip, right_ip); // Update the shared variable using a lock match_mutex->lock(); // Print the verbose message inside the lock, otherwise the text // may get messed up. if (verbose) std::cout << "Number of matches for pair " << left_image_index << ' ' << right_image_index << ": " << left_ip.size() << std::endl; *matches = std::make_pair(left_ip, right_ip); match_mutex->unlock(); } // Add keypoints from a map, appending to existing keypoints. Take into // account how this map's cid gets transformed to the new map cid. // Note that keypoint_offsets are applied before the cid2cid transform gets used! // This is very error-prone! // TODO(oalexan1): addKeypoints() can be merged into addMatchPairs(). // Just add keypoints and update the counter as they are found. void addKeypoints(// Append from these rig::PidCidFid const& pid_to_cid_fid, rig::CidToKeypointMatVec const& cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, int cid_shift, size_t num_out_cams, // Outputs, append to these std::vector<int> & keypoint_count, KeyPointMap & merged_keypoint_map) { // Sanity checks if (num_out_cams != keypoint_count.size()) LOG(FATAL) << "Keypoint count was not initialized correctly.\n"; if (num_out_cams != merged_keypoint_map.size()) LOG(FATAL) << "Keypoint map was not initialized correctly.\n"; if (num_out_cams != rig::maxMapVal(cid2cid) + 1) LOG(FATAL) << "Unexpected value for the size of the output map.\n"; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { auto const& cid_fid = pid_to_cid_fid[pid]; // alias for (auto map_it = cid_fid.begin(); map_it != cid_fid.end(); map_it++) { int cid = -1; // will change soon std::pair<float, float> K; bool ans = updateCidFindKeypoint(map_it, cid_to_keypoint_map, cid2cid, keypoint_offsets, cid_shift, cid, K); if (!ans) continue; // Insert K in the keypoint map and increment the count, // unless it already exists auto & key_map = merged_keypoint_map.at(cid); // alias, will be changed if (key_map.find(K) != key_map.end()) continue; // exists already key_map[K] = keypoint_count[cid]; keypoint_count[cid]++; } } return; } // Break up each track of keypoints of length N into N pairs, (T0, // T1), (T1, T2), ,, . (T(N-1), T0). Find their indices in the merged // set of keypoints. Repeat this for each input map to merge and // accumulate the pairs. Later these will be combined into new tracks // and any repeated data will be fused. This is very tied to the // addKeypoints() function. // Note that keypoint_offsets are applied before the cid2cid transform gets used! // This is very error-prone! // TODO(oalexan1): Remove that logic and the shift // as well from this function to make it easier to understand. // TODO(oalexan1): Incorporate here the addKeypoints() logic which // mirrors a lot of this. // TODO(oalexan1): Test at some point using this to rebuild and merge the tracks in // a merged map. The concern is that it will result in conflicting tracks // which will be removed, so this should be an option. void addMatchPairs(// Append from these rig::PidCidFid const& pid_to_cid_fid, rig::CidToKeypointMatVec const& cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, KeyPointMap const& merged_keypoint_map, int cid_shift, size_t num_out_cams, aspOpenMVG::matching::PairWiseMatches & match_map) { // append here // Sanity checks if (num_out_cams != merged_keypoint_map.size()) LOG(FATAL) << "Keypoint map was not initialized correctly.\n"; if (num_out_cams != rig::maxMapVal(cid2cid) + 1) LOG(FATAL) << "Unexpected value for the size of the output map.\n"; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { auto const& cid_fid = pid_to_cid_fid[pid]; // alias for (auto map_it1 = cid_fid.begin(); map_it1 != cid_fid.end(); map_it1++) { // First element in the pair int cid1 = -1; // will change soon std::pair<float, float> K1; bool ans = updateCidFindKeypoint(map_it1, cid_to_keypoint_map, cid2cid, keypoint_offsets, cid_shift, cid1, K1); // output if (!ans) continue; // Find the second element in the pair. If at the end of the track, // and the track length is more than 2, use the earliest element. auto map_it2 = map_it1; map_it2++; if (map_it2 == cid_fid.end()) { if (cid_fid.size() <= 2) continue; // Already added (T0, T1), no need to add (T1, T0). map_it2 = cid_fid.begin(); } int cid2 = -1; // will change soon std::pair<float, float> K2; ans = updateCidFindKeypoint(map_it2, cid_to_keypoint_map, cid2cid, keypoint_offsets, cid_shift, cid2, K2); // output if (!ans) continue; // No point in adding a match from an image to itself if (cid1 == cid2) continue; // Find the fid indices auto it1 = merged_keypoint_map.at(cid1).find(K1); auto it2 = merged_keypoint_map.at(cid2).find(K2); if (it1 == merged_keypoint_map.at(cid1).end() || it2 == merged_keypoint_map.at(cid2).end()) LOG(FATAL) << "Could not look up a keypoint. That is unexpected.\n"; int fid1 = it1->second; int fid2 = it2->second; // Append the pair std::vector<aspOpenMVG::matching::IndMatch> & mvg_matches = match_map[std::make_pair(cid1, cid2)]; // alias mvg_matches.push_back(aspOpenMVG::matching::IndMatch(fid1, fid2)); } // end iterating over the track } return; } // Helper function to add an ip to the keypoint map if not there. // In either case find its fid, which is the keypoint map value. void findFid(std::pair<float, float> const & ip, int cid, // Outputs KeyPointMap & keypoint_map, std::vector<int> & fid_count, int & fid) { fid = -1; // initialize the output auto it = keypoint_map[cid].find(ip); if (it != keypoint_map[cid].end()) { fid = it->second; } else { keypoint_map[cid][ip] = fid_count[cid]; fid = fid_count[cid]; fid_count[cid]++; } return; } // Create keypoint_vec from keypoint_map. That just reorganizes the data // to the format expected later. void keypointMapToVec(KeyPointMap const& keypoint_map, KeypointVec & keypoint_vec) { size_t num_images = keypoint_map.size(); keypoint_vec.clear(); keypoint_vec.resize(num_images); for (size_t cid = 0; cid < num_images; cid++) { auto const& map = keypoint_map[cid]; // alias keypoint_vec[cid].resize(map.size()); for (auto ip_it = map.begin(); ip_it != map.end(); ip_it++) { auto const& ip = ip_it->first; // alias int fid = ip_it->second; keypoint_vec[cid][fid] = ip; } } } // Detects features, matches them between image pairs, and builds tracks. // // This function handles the entire feature detection and matching pipeline: // 1. Detects keypoints and descriptors in all images using multiple threads. // 2. Determines which image pairs to match (based on overlap or input pairs). // 3. Matches features between pairs, filtering with camera geometry if enabled. // 4. Optionally saves matches to disk. // 5. Builds keypoint maps and feature-ID (fid) counts. // 6. Builds connectivity tracks (pid_to_cid_fid) from the pairwise matches. void detectMatchFeatures(// Inputs std::vector<rig::cameraImage> const& cams, std::vector<rig::CameraParameters> const& cam_params, std::string const& out_dir, bool save_matches, bool filter_matches_using_cams, std::vector<Eigen::Affine3d> const& world_to_cam, int num_overlaps, std::vector<std::pair<int, int>> const& input_image_pairs, int initial_max_reprojection_error, int num_match_threads, bool verbose, // Outputs KeyPointMap & keypoint_map, std::vector<int> & fid_count, rig::PidCidFid & pid_to_cid_fid) { // Initialize outputs size_t num_images = cams.size(); keypoint_map.clear(); fid_count.clear(); pid_to_cid_fid.clear(); keypoint_map.resize(num_images); fid_count.resize(num_images, 0); // Important: initialize count to 0 // Detect features using multiple threads. Too many threads may result // in high memory usage. std::cout << "Using " << num_match_threads << " threads for feature detection/matching.\n"; std::cout << "Detecting features." << std::endl; std::vector<cv::Mat> cid_to_descriptor_map; rig::CidToKeypointMatVec cid_to_keypoint_map; cid_to_descriptor_map.resize(num_images); cid_to_keypoint_map.resize(num_images); { // Make the thread pool go out of scope when not needed to not use up memory rig::ThreadPool thread_pool(num_match_threads); for (size_t it = 0; it < num_images; it++) { thread_pool.AddTask (&rig::detectFeatures, // multi-threaded // NOLINT // rig::detectFeatures( // single-threaded // NOLINT cams[it].image, verbose, &cid_to_descriptor_map[it], &cid_to_keypoint_map[it]); } thread_pool.Join(); } // Find which image pairs to match std::vector<std::pair<int, int>> image_pairs; if (!input_image_pairs.empty()) { // Use provided image pairs instead of num_overlaps image_pairs = input_image_pairs; } else { for (size_t it1 = 0; it1 < num_images; it1++) { int end = std::min(num_images, it1 + num_overlaps + 1); for (size_t it2 = it1 + 1; it2 < end; it2++) { image_pairs.push_back(std::make_pair(it1, it2)); } } } MATCH_MAP matches; { // Deallocate local variables as soon as they are not needed std::cout << "Matching features." << std::endl; rig::ThreadPool thread_pool(num_match_threads); std::mutex match_mutex; for (size_t pair_it = 0; pair_it < image_pairs.size(); pair_it++) { auto pair = image_pairs[pair_it]; int left_image_it = pair.first, right_image_it = pair.second; thread_pool.AddTask (&rig::matchFeaturesWithCams, // multi-threaded // NOLINT // rig::matchFeaturesWithCams( // single-threaded // NOLINT &match_mutex, left_image_it, right_image_it, cam_params[cams[left_image_it].camera_type], cam_params[cams[right_image_it].camera_type], filter_matches_using_cams, world_to_cam[left_image_it], world_to_cam[right_image_it], initial_max_reprojection_error, cid_to_descriptor_map[left_image_it], cid_to_descriptor_map[right_image_it], cid_to_keypoint_map[left_image_it], cid_to_keypoint_map[right_image_it], verbose, &matches[pair]); } thread_pool.Join(); } cid_to_keypoint_map = rig::CidToKeypointMatVec(); // wipe, no longer needed cid_to_descriptor_map = std::vector<cv::Mat>(); // Wipe, no longer needed if (save_matches) { if (out_dir.empty()) LOG(FATAL) << "Cannot save matches if no output directory was provided.\n"; std::string match_dir = out_dir + "/matches"; rig::createDir(match_dir); for (auto it = matches.begin(); it != matches.end(); it++) { std::pair<int, int> cid_pair = it->first; rig::MATCH_PAIR const& match_pair = it->second; int left_cid = cid_pair.first; int right_cid = cid_pair.second; std::string const& left_image = cams[left_cid].image_name; // alias std::string const& right_image = cams[right_cid].image_name; // alias bool matches_as_txt = false; std::string match_file = vw::ip::match_filename(match_dir + "/run", left_image, right_image, matches_as_txt); std::cout << "Writing: " << left_image << " " << right_image << " " << match_file << std::endl; vw::ip::write_match_file(match_file, match_pair.first, match_pair.second, matches_as_txt); } } // Collect all keypoints in keypoint_map, and put the fid (indices of keypoints) in // match_map. It will be used to find the tracks. aspOpenMVG::matching::PairWiseMatches match_map; for (auto it = matches.begin(); it != matches.end(); it++) { std::pair<int, int> const& cid_pair = it->first; // alias int left_cid = cid_pair.first; int right_cid = cid_pair.second; rig::MATCH_PAIR const& match_pair = it->second; // alias std::vector<vw::ip::InterestPoint> const& left_ip_vec = match_pair.first; std::vector<vw::ip::InterestPoint> const& right_ip_vec = match_pair.second; for (size_t ip_it = 0; ip_it < left_ip_vec.size(); ip_it++) { auto left_ip = std::make_pair(left_ip_vec[ip_it].x, left_ip_vec[ip_it].y); auto right_ip = std::make_pair(right_ip_vec[ip_it].x, right_ip_vec[ip_it].y); // Add an ip to the keypoint map if not there. In either case find its fid. int left_fid = -1, right_fid = -1; findFid(left_ip, left_cid, keypoint_map, fid_count, left_fid); // may change findFid(right_ip, right_cid, keypoint_map, fid_count, right_fid); // may change match_map[cid_pair].push_back(aspOpenMVG::matching::IndMatch(left_fid, right_fid)); } } matches.clear(); matches = MATCH_MAP(); // mo longer needed // If feature A in image I matches feather B in image J, which // matches feature C in image K, then (A, B, C) belong together in // a track, and will have a single triangulated xyz. Build such a track. buildTracks(match_map, pid_to_cid_fid); std::cout << "Tracks obtained after matching: " << pid_to_cid_fid.size() << std::endl; match_map = aspOpenMVG::matching::PairWiseMatches(); // wipe this, no longer needed } void detectAddFeatures(// Inputs std::vector<rig::cameraImage> const& cams, std::vector<rig::CameraParameters> const& cam_params, std::string const& out_dir, bool save_matches, bool filter_matches_using_cams, std::vector<Eigen::Affine3d> const& world_to_cam, int num_overlaps, std::vector<std::pair<int, int>> const& input_image_pairs, int initial_max_reprojection_error, int num_match_threads, bool read_nvm_no_shift, bool no_nvm_matches, bool verbose, // Outputs rig::KeypointVec & keypoint_vec, rig::PidCidFid & pid_to_cid_fid, std::vector<Eigen::Vector3d> & xyz_vec, asp::nvmData & nvm) { // Wipe the outputs keypoint_vec.clear(); pid_to_cid_fid.clear(); xyz_vec.clear(); if (!no_nvm_matches) std::cout << "Tracks read from disk: " << nvm.pid_to_cid_fid.size() << std::endl; // Sanity check: the offsets from the nvm must agree with the optical centers // The offsets may be empty if the cameras were read from a list if (!read_nvm_no_shift && !no_nvm_matches && !nvm.optical_centers.empty()) { for (size_t cid = 0; cid < cams.size(); cid++) { Eigen::Vector2d offset = cam_params[cams[cid].camera_type].GetOpticalOffset(); auto it = nvm.optical_centers.find(cams[cid].image_name); if (it == nvm.optical_centers.end()) continue; // offsets may be missing when extra images are added Eigen::Vector2d nvm_offset = it->second; if ((offset - nvm_offset).norm() > 1e-8) LOG(FATAL) << "Optical centers read from the nvm file do not agree with the " << "ones from the rig configuration for image: " << cams[cid].image_name << ".\n"; } } size_t num_images = cams.size(); if (num_overlaps == 0 && !no_nvm_matches) { // Add the optical center shift, if needed // Here keypoint_offsets are for the cid in the order in cams, not in nvm. // TODO(oalexan1): This is confusing and needs to be dealt with at some point. std::vector<Eigen::Vector2d> keypoint_offsets(num_images); for (int cid = 0; cid < num_images; cid++) { if (read_nvm_no_shift) keypoint_offsets[cid] = Eigen::Vector2d(0, 0); else keypoint_offsets[cid] = cam_params[cams[cid].camera_type].GetOpticalOffset(); } // If we do not need to create new matches, just reorganize the ones read in // and quit. rig::transformNvm(cams, keypoint_offsets, nvm, pid_to_cid_fid, keypoint_vec, xyz_vec); // outputs nvm = asp::nvmData(); // no longer needed return; } // Detect and match features KeyPointMap keypoint_map; std::vector<int> fid_count; detectMatchFeatures(// Inputs cams, cam_params, out_dir, save_matches, filter_matches_using_cams, world_to_cam, num_overlaps, input_image_pairs, initial_max_reprojection_error, num_match_threads, verbose, // Outputs keypoint_map, fid_count, pid_to_cid_fid); // Append tracks being read from nvm. This turned out to work better than to try // to merge these tracks with the ones from the pairwise matching above, as the latter // would make many good tracks disappear. if (!no_nvm_matches) { // Find how to map each cid from nvm to cid in 'cams'. std::map<int, int> nvm_cid_to_cams_cid; rig::findCidReorderMap(nvm, cams, nvm_cid_to_cams_cid); // output // Add the optical center shift, if needed. std::vector<Eigen::Vector2d> keypoint_offsets(nvm.cid_to_filename.size()); for (size_t nvm_cid = 0; nvm_cid < nvm.cid_to_filename.size(); nvm_cid++) { // This is a bugfix. The transformAppendNvm() function below // expects that keypoint_offsets be indexed by nvm_cid and not // reordered cid in cams. // TODO(oalexan1): This is confusing. The keypoint offsets in transformAppendNvm() // better be applied after nvm_cid_to_cams_cid is applied. Also merge // with function transformNvm() and remove the latter. auto it = nvm_cid_to_cams_cid.find(nvm_cid); if (it == nvm_cid_to_cams_cid.end()) { // This nvm_cid does not exist in cams. A warning about that // was given in findCidReorderMap(). Give a value to this // but it won't be used. keypoint_offsets[nvm_cid] = Eigen::Vector2d(0, 0); continue; } int cams_cid = it->second; if (read_nvm_no_shift) keypoint_offsets[nvm_cid] = Eigen::Vector2d(0, 0); else keypoint_offsets[nvm_cid] = cam_params[cams[cams_cid].camera_type].GetOpticalOffset(); } // Add the nvm matches. Unlike the transformNvm() function above, // the keypoints are shared with the newly created matches. Later // that will be used to remove duplicates. int cid_shift = 0; // part of the API rig::transformAppendNvm(nvm.pid_to_cid_fid, nvm.cid_to_keypoint_map, nvm_cid_to_cams_cid, keypoint_offsets, cid_shift, num_images, fid_count, keypoint_map, pid_to_cid_fid); // append } // Create keypoint_vec from keypoint_map. That just reorganizes the data // to the format expected later. keypointMapToVec(keypoint_map, keypoint_vec); // De-allocate data not needed anymore nvm = asp::nvmData(); // no longer needed keypoint_map.clear(); keypoint_map.shrink_to_fit(); // Remove duplicate tracks. Those can happen since additional tracks being // created in matching can duplicate tracks read from disk. Ideally also // shorter tracks contained in longer tracks should be removed, and tracks // that can be merged without conflicts should be merged. rmDuplicateTracks(pid_to_cid_fid); return; } } // end namespace rig ================================================ FILE: src/asp/Rig/InterestPoint.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_INTEREST_POINT_H #define ASP_RIG_INTEREST_POINT_H #include <asp/Rig/RigTypeDefs.h> #include <asp/Rig/Detector.h> #include <vw/InterestPoint/InterestPoint.h> #include <opencv2/imgproc.hpp> #include <glog/logging.h> #include <Eigen/Core> #include <Eigen/Geometry> #include <string> #include <vector> #include <map> #include <mutex> #include <utility> namespace rig { class CameraParameters; } namespace aspOpenMVG { namespace matching { class PairWiseMatches; } } namespace asp { class nvmData; } namespace rig { class cameraImage; class RigSet; class ImageMessage; // Copy IP information from an OpenCV KeyPoint object. void setFromCvKeypoint(Eigen::Vector2d const& key, cv::Mat const& cv_descriptor, vw::ip::InterestPoint& ip); void detectFeatures(const cv::Mat& image, bool verbose, // Outputs cv::Mat* descriptors, Eigen::Matrix2Xd* keypoints); // This really likes haz cam first and nav cam second void matchFeatures(std::mutex* match_mutex, int left_image_index, int right_image_index, cv::Mat const& left_descriptors, cv::Mat const& right_descriptors, Eigen::Matrix2Xd const& left_keypoints, Eigen::Matrix2Xd const& right_keypoints, bool verbose, // Output MATCH_PAIR* matches); // Create keypoint_vec from keypoint_map. void keypointMapToVec(KeyPointMap const& keypoint_map, KeypointVec & keypoint_vec); void detectAddFeatures(// Inputs std::vector<rig::cameraImage> const& cams, std::vector<rig::CameraParameters> const& cam_params, std::string const& out_dir, bool save_matches, bool filter_matches_using_cams, std::vector<Eigen::Affine3d> const& world_to_cam, int num_overlaps, std::vector<std::pair<int, int>> const& input_image_pairs, int initial_max_reprojection_error, int num_match_threads, bool read_nvm_no_shift, bool no_nvm_matches, bool verbose, // Outputs rig::KeypointVec & keypoint_vec, rig::PidCidFid & pid_to_cid_fid, std::vector<Eigen::Vector3d> & xyz_vec, asp::nvmData & nvm); // For nvm data that has the keypoints shifted relative to the optical // center, undo this shift when 'undo_shift' is true. So, add the optical center. // When 'undo_shift' is false, subtract the optical center. void shiftKeypoints(bool undo_shift, rig::RigSet const& R, asp::nvmData & nvm); // output // Break up each track of keypoints of length N into N pairs, (T0, // T1), (T1, T2), ,, . (T(N-1), T0). Find their indices in the merged // set of keypoints. Repeat this for each input map to merge and // accumulate the pairs. Later these will be combined into new tracks // and any repeated data will be fused. This is very tied to the // addKeypoints() function. // Note that keypoint_offsets are applied before the cid2cid transform gets used! // This is very error-prone! void addMatchPairs(// Append from these rig::PidCidFid const& pid_to_cid_fid, rig::CidToKeypointMatVec const& cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, KeyPointMap const& merged_keypoint_map, int cid_shift, size_t num_out_cams, aspOpenMVG::matching::PairWiseMatches & match_map); // append here // Given some tracks read from nvm from disk, append the ones from // nvm. Some remapping is needed. given that 'fid' values already // exist for the given tracks and that the nvm read from disk // may have the images in different order. New keypoints are recorded // with the help of fid_count and merged_keypoint_map. // Note that keypoint_offsets are applied before the cid2cid transform gets used! // This is very error-prone! void transformAppendNvm(// Append from these rig::PidCidFid const& nvm_pid_to_cid_fid, rig::CidToKeypointMatVec const& nvm_cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, int cid_shift, size_t num_out_cams, // Outputs, append to these std::vector<int> & fid_count, KeyPointMap & merged_keypoint_map, rig::PidCidFid & pid_to_cid_fid); // Add keypoints from a map, appending to existing keypoints. Take into // account how this map's cid gets transformed to the new map cid. // Note that keypoint_offsets are applied before the cid2cid transform gets used! // This is very error-prone! void addKeypoints(// Append from these rig::PidCidFid const& pid_to_cid_fid, rig::CidToKeypointMatVec const& cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, int cid_shift, size_t num_out_cams, // Outputs, append to these std::vector<int> & keypoint_count, KeyPointMap & merged_keypoint_map); void savePairwiseConvergenceAngles(// Inputs rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, std::vector<Eigen::Vector3d> const& xyz_vec, PidCidFidMap const& pid_cid_fid_inlier, std::string const& conv_angles_file); } // namespace rig #endif // ASP_RIG_INTEREST_POINT_H ================================================ FILE: src/asp/Rig/InterpolationUtils.cc ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/InterpolationUtils.h> #include <glog/logging.h> #include <iostream> namespace rig { // Given two poses aff0 and aff1, and 0 <= alpha <= 1, do linear interpolation. Eigen::Affine3d linearInterp(double alpha, Eigen::Affine3d const& aff0, Eigen::Affine3d const& aff1) { Eigen::Quaternion<double> rot0(aff0.linear()); Eigen::Quaternion<double> rot1(aff1.linear()); Eigen::Vector3d trans0 = aff0.translation(); Eigen::Vector3d trans1 = aff1.translation(); Eigen::Affine3d result; result.translation() = (1.0 - alpha) * trans0 + alpha * trans1; result.linear() = rot0.slerp(alpha, rot1).toRotationMatrix(); return result; } // Given two poses aff0 and aff1, and t0 <= t <= t1, do linear interpolation. Eigen::Affine3d linearInterp(double t0, double t, double t1, Eigen::Affine3d const& aff0, Eigen::Affine3d const& aff1) { bool is_good = ((t0 <= t) && (t <= t1)); if (!is_good) LOG(FATAL) << "Incorrect bounds in interpolation.\n"; double den = t1 - t0; if (den == 0.0) den = 1.0; double alpha = (t - t0) / den; if (alpha < 0.0 || alpha > 1.0) LOG(FATAL) << "Out of bounds in interpolation.\n"; return rig::linearInterp(alpha, aff0, aff1); } // Given a set of poses indexed by time, interpolate or extrapolate // (within range of bracket_len) at a set of target timestamps. Go // forward in time both in the input and the target, which makes the // complexity linear rather than quadratic. void interpOrExtrap(std::map<double, Eigen::Affine3d> const& input_poses, std::map<double, std::string> const& target, double bracket_len, bool nearest_neighbor_interp, // Outputs std::vector<std::string> & found_images, std::vector<Eigen::Affine3d> & found_poses) { found_images.clear(); found_poses.clear(); double beg_timestamp = input_poses.begin()->first; double end_timestamp = input_poses.rbegin()->first; // Iterate over all timestamps to interpolate at, and simultaneously // over the existing images to interpolate into, both in increasing // order of time. This makes complexity linear rather than // quadratic. This is possible because both the inputs and outputs // are sorted by time. Some care is needed. auto start = input_poses.begin(); // track where we are in the input for (auto curr_it = target.begin(); curr_it != target.end(); curr_it++) { double curr_timestamp = curr_it->first; std::string const& image_file = curr_it->second; if (curr_timestamp < beg_timestamp - bracket_len || curr_timestamp > end_timestamp + bracket_len) { std::cout << "Warning: Image " << image_file << " is either earlier or later by --bracket_len amount " << bracket_len << " from the range of timestamps of existing " << "images. Ignoring it.\n"; continue; } Eigen::Affine3d found_pose; if (curr_timestamp <= beg_timestamp) { // Use extrapolation found_pose = input_poses.begin()->second; // pose for earliest time } else if (curr_timestamp >= end_timestamp) { found_pose = input_poses.rbegin()->second; // pose for the latest tame } else { // Use interpolation bool success = false; for (auto map_it = start; map_it != input_poses.end(); map_it++) { // Find the right bracketing iterator auto right_map_it = map_it; right_map_it++; if (right_map_it == input_poses.end()) right_map_it = map_it; // fall back to left if at the end double left_timestamp = map_it->first; double right_timestamp = right_map_it->first; if (left_timestamp > curr_timestamp) { // Went too far break; } // Update this for next time. It always moves forward in time, // and points to a location left of current timestamp. start = map_it; bool is_good = (curr_timestamp <= right_timestamp); if (!is_good) continue; // too early double min_dist = std::min(std::abs(left_timestamp - curr_timestamp), std::abs(right_timestamp - curr_timestamp)); if (min_dist > bracket_len) { std::cout << "Timestamp of image " << image_file << " differs by " << min_dist << " seconds from the one " << "of existing images, which is more than the " << "--bracket_len value of " << bracket_len << ". Ignoring it.\n"; continue; } if (nearest_neighbor_interp) { // Use the nearest neighbor if (std::abs(left_timestamp - curr_timestamp) <= std::abs(right_timestamp - curr_timestamp)) { curr_timestamp = left_timestamp; } else { curr_timestamp = right_timestamp; } } // Interpolate at desired time found_pose = rig::linearInterp(left_timestamp, curr_timestamp, right_timestamp, map_it->second, right_map_it->second); found_images.push_back(image_file); found_poses.push_back(found_pose); success = true; break; } if (!success) { std::cout << "Warning: Cannot compute camera pose for image " << image_file << ". Ignoring it.\n"; } } } } } // end namespace rig ================================================ FILE: src/asp/Rig/InterpolationUtils.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_INTERPOLATION_UTILS_H #define ASP_RIG_INTERPOLATION_UTILS_H #include <Eigen/Core> #include <Eigen/Geometry> #include <vector> #include <map> namespace rig { // Given two poses aff0 and aff1, and 0 <= alpha <= 1, do linear interpolation. Eigen::Affine3d linearInterp(double alpha, Eigen::Affine3d const& aff0, Eigen::Affine3d const& aff1); // Given two poses aff0 and aff1, and t0 <= t <= t1, do linear interpolation. Eigen::Affine3d linearInterp(double t0, double t, double t1, Eigen::Affine3d const& aff0, Eigen::Affine3d const& aff1); // Given a set of poses indexed by time, interpolate or extrapolate // (within range of bracket_len) at a set of target timestamps. Go // forward in time both in the input and the target, which makes the // complexity linear rather than quadratic. void interpOrExtrap(std::map<double, Eigen::Affine3d> const& input_poses, std::map<double, std::string> const& target, double bracket_len, bool nearest_neighbor, // Outputs std::vector<std::string> & found_images, std::vector<Eigen::Affine3d> & found_poses); } // namespace rig #endif // ASP_RIG_INTERPOLATION_UTILS_H ================================================ FILE: src/asp/Rig/MergeMaps.cc ================================================ /* Copyright (c) 2017-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/MergeMaps.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/ImageLookup.h> #include <asp/Rig/Tracks.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/Ransac.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/InterestPoint.h> #include <asp/Rig/RigOutlier.h> #include <asp/Rig/Triangulation.h> #include <asp/Core/Nvm.h> #include <asp/Rig/RigTypeDefs.h> #include <asp/Rig/RigIo.h> #include <ceres/ceres.h> #include <gflags/gflags.h> #include <glog/logging.h> // Get rid of warning beyond our control #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic push #include <OpenMVG/projection.hpp> #include <OpenMVG/triangulation_nview.hpp> #include <OpenMVG/numeric.h> #include <OpenMVG/tracks.hpp> #pragma GCC diagnostic pop #include <Eigen/Core> #include <Eigen/Geometry> #include <opencv2/features2d/features2d.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <set> #include <thread> #include <vector> #include <mutex> #include <fstream> namespace rig { // TODO(oalexan1): This code is not used but may be useful one day // As result of matching some images in A to some images in B, we must // now merge some tracks in A with some tracks in B, as those tracks // correspond physically to the same point in space. A track in // C.pid_to_cid_fid_ tells us which track in A.pid_to_cid_fid_ is tied // with which track in B.pid_to_cid_fid_. If it turns out one track in // A should be merged with multiple tracks in B or vice-versa, select // just one candidate from each map, based on who got most votes. Note // that here it is easier to work with A.cid_fid_to_pid_ rather than // A.pid_to_cid_fid_. void FindPidCorrespondences(rig::PidCidFid const& A_cid_fid_to_pid, rig::PidCidFid const& B_cid_fid_to_pid, rig::PidCidFid const& C_pid_to_cid_fid, int num_acid, // How many images are in A std::map<int, int> * A2B, std::map<int, int> * B2A) { A2B->clear(); B2A->clear(); std::map<int, std::map<int, int>> VoteMap; for (int pid = 0; pid < static_cast<int>(C_pid_to_cid_fid.size()); pid++) { // This track has some cid indices from A (those < num_acid) // and some from B (those >= num_acid). Ignore all other combinations. auto const& cid_fid_c = C_pid_to_cid_fid[pid]; // alias for (auto it_a = cid_fid_c.begin(); it_a != cid_fid_c.end(); it_a++) { for (auto it_b = it_a; it_b != cid_fid_c.end(); it_b++) { int cid_a = it_a->first, fid_a = it_a->second; int cid_b = it_b->first, fid_b = it_b->second; if (cid_a >= num_acid) continue; if (cid_b < num_acid) continue; // Subtract num_acid from cid_b so it becomes a cid in B. cid_b -= num_acid; auto it_fida = A_cid_fid_to_pid[cid_a].find(fid_a); if (it_fida == A_cid_fid_to_pid[cid_a].end()) continue; auto it_fidb = B_cid_fid_to_pid[cid_b].find(fid_b); if (it_fidb == B_cid_fid_to_pid[cid_b].end()) continue; int pid_a = it_fida->second; int pid_b = it_fidb->second; VoteMap[pid_a][pid_b]++; } } } // For each pid in A, keep the pid in B with most votes std::map<int, std::map<int, int>> B2A_Version0; // still not fully one-to-one for (auto it_a = VoteMap.begin(); it_a != VoteMap.end(); it_a++) { auto & M = it_a->second; // all pid_b corresp to given pid_a with their votes int pid_a = it_a->first; int best_pid_b = -1; int max_vote = -1; for (auto it_b = M.begin(); it_b != M.end(); it_b++) { int pid_b = it_b->first; int vote = it_b->second; if (vote > max_vote) { best_pid_b = pid_b; max_vote = vote; } } B2A_Version0[best_pid_b][pid_a] = max_vote; } // And vice-versa for (auto it_b = B2A_Version0.begin(); it_b != B2A_Version0.end(); it_b++) { int pid_b = it_b->first; auto & M = it_b->second; int best_pid_a = -1; int max_vote = -1; for (auto it_a = M.begin(); it_a != M.end(); it_a++) { int pid_a = it_a->first; int vote = it_a->second; if (vote > max_vote) { best_pid_a = pid_a; max_vote = vote; } } (*A2B)[best_pid_a] = pid_b; // track from A and track from B (*B2A)[pid_b] = best_pid_a; // track from B and track from A } } // Merge the camera poses from both maps using the cid2cid map of // indices. By now the poses are in the same coordinate system but // some show up in both maps. void MergePoses(std::map<int, int> & cid2cid, std::vector<Eigen::Affine3d> & world_to_cam) { // The total number of output cameras (last new cid value + 1) int num_out_cams = rig::maxMapVal(cid2cid) + 1; // Each blob will be original cids that end up being a single cid // after identifying repeat images. std::vector<std::set<int>> blobs(num_out_cams); for (size_t cid = 0; cid < world_to_cam.size(); cid++) blobs[cid2cid[cid]].insert(cid); // To merge world_to_cam, find the average rotation and translation // from the two maps. std::vector<Eigen::Affine3d> world_to_cam2(num_out_cams); for (size_t c = 0; c < blobs.size(); c++) { if (blobs[c].size() == 1) { world_to_cam2[c] = world_to_cam[*blobs[c].begin()]; } else { int num = blobs[c].size(); // All cams to merge get equal weight std::vector<double> W(num, 1.0/num); std::vector<Eigen::Quaternion<double>> Q(num); world_to_cam2[c].translation() << 0.0, 0.0, 0.0; int pos = -1; for (auto it = blobs[c].begin(); it != blobs[c].end(); it++) { pos++; int cid = *it; Q[pos] = Eigen::Quaternion<double>(world_to_cam[cid].linear()); world_to_cam2[c].translation() += W[pos]*world_to_cam[cid].translation(); } Eigen::Quaternion<double> S = rig::slerp_n(W, Q); world_to_cam2[c].linear() = S.toRotationMatrix(); } } // Return the updated poses world_to_cam = world_to_cam2; return; } // Choose the images to match and load them. It is assumed that in image_files // we have the images from the first and then he second maps to merge. void setupLoadMatchingImages(std::vector<std::string> const& image_files, rig::RigSet const& R, std::string const& image_sensor_list, int map1_len, int map2_len, int num_image_overlaps_at_endpoints, // Outputs std::vector<std::pair<int, int>> & image_pairs, std::vector<rig::cameraImage> & cams) { // sanity check if (map1_len + map2_len != image_files.size()) LOG(FATAL) << "Book-keeping error, total number of images is not right.\n"; // Initialize the outputs image_pairs.clear(); cams.resize(image_files.size()); std::set<int> map1_search, map2_search; // use sets to avoid duplicates int num = num_image_overlaps_at_endpoints; // Images in map1 to search for matches in map2 for (int cid = 0; cid < num; cid++) if (cid < map1_len) map1_search.insert(cid); for (int cid = map1_len-num; cid < map1_len; cid++) if (cid >= 0) map1_search.insert(cid); // Images in map2 to search for matches in map1. Add map1_len since we will // match map1 and map2 inside of the merged map. for (int cid = 0; cid < num; cid++) if (cid < map2_len) map2_search.insert(map1_len + cid); for (int cid = map2_len-num; cid < map2_len; cid++) if (cid >= 0) map2_search.insert(map1_len + cid); // The indices in the merged map between which we need matches. Do not match // an image with itself. That can happen if the maps to merge // have shared images. for (auto it1 = map1_search.begin(); it1 != map1_search.end() ; it1++) { for (auto it2 = map2_search.begin(); it2 != map2_search.end(); it2++) { if (*it1 == *it2) LOG(FATAL) << "Book-keeping failure in map merging."; if (image_files[*it1] == image_files[*it2]) continue; image_pairs.push_back(std::make_pair(*it1, *it2)); } } // Allocate a structure having an entry for all images, but load // only those for which we need to find matches. if (!map1_search.empty() && !map2_search.empty()) std::cout << "Loading images to match." << std::endl; // Infer the sensor type (and timestamp, which is not used) std::vector<int> cam_types; std::vector<double> timestamps; bool flexible_strategy = true; // can handle with and without separate attributes rig::readImageSensorTimestamp(image_sensor_list, image_files, R.cam_names, flexible_strategy, // Outputs cam_types, timestamps); for (size_t cid = 0; cid < image_files.size(); cid++) { auto & c = cams[cid]; // alias // Populate most fields. All we need is the image data and camera type. c.image_name = image_files[cid]; c.camera_type = cam_types[cid]; c.timestamp = timestamps[cid]; if (map1_search.find(cid) != map1_search.end() || map2_search.find(cid) != map2_search.end()) { c.image = cv::imread(c.image_name, cv::IMREAD_GRAYSCALE); } } } // Compute the transform from the B map to the A map by finding the median // transform based on the shared images Eigen::Affine3d computeTransformFromBToA(const asp::nvmData& A, const asp::nvmData& B) { // Calc all transforms from B poses to A poses std::vector<Eigen::MatrixXd> B2A_vec; // Put the B poses in a map std::map<std::string, Eigen::Affine3d> B_world2cam; for (size_t cid = 0; cid < B.world_to_cam.size(); cid++) B_world2cam[B.cid_to_filename[cid]] = B.world_to_cam[cid]; // Find the transform from B to A based on shared poses for (size_t cid = 0; cid < A.cid_to_filename.size(); cid++) { auto b_it = B_world2cam.find(A.cid_to_filename[cid]); if (b_it == B_world2cam.end()) continue; auto const& A_world2cam = A.world_to_cam[cid]; auto const& B_world2cam = b_it->second; // Go from world of B to world of A B2A_vec.push_back(((A_world2cam.inverse()) * B_world2cam).matrix()); } // Find the median transform, for robustness Eigen::Affine3d B2A_trans; B2A_trans.matrix() = rig::median_matrix(B2A_vec); return B2A_trans; } // Given a set of points in 3D, heuristically estimate what it means // for two points to be "not far" from each other. The logic is to // find a bounding box of an inner cluster and multiply that by 0.1. double estimateCloseDistance(std::vector<Eigen::Vector3d> const& vec) { Eigen::Vector3d range; int num_pts = vec.size(); if (num_pts <= 0) LOG(FATAL) << "Empty set of points.\n"; // to avoid a segfault std::vector<double> vals(num_pts); for (int it = 0; it < range.size(); it++) { // iterate in each coordinate // Sort all values in given coordinate for (int p = 0; p < num_pts; p++) vals[p] = vec[p][it]; std::sort(vals.begin(), vals.end()); // Find some percentiles int min_p = round(num_pts*0.25); int max_p = round(num_pts*0.75); if (min_p >= num_pts) min_p = num_pts - 1; if (max_p >= num_pts) max_p = num_pts - 1; double min_val = vals[min_p], max_val = vals[max_p]; range[it] = 0.1*(max_val - min_val); } // Find the average of all ranges double range_val = 0.0; for (int it = 0; it < range.size(); it++) range_val += range[it]; range_val /= range.size(); return range_val; } // This fitting functor attempts to find a rotation + translation + scale transformation // between two vectors of points. struct TranslationRotationScaleFittingFunctor { typedef Eigen::Affine3d result_type; // A transformation requires 3 inputs and 3 outputs to make a fit. size_t min_elements_needed_for_fit() const { return 3; } result_type operator() (std::vector<Eigen::Vector3d> const& in_vec, std::vector<Eigen::Vector3d> const& out_vec) const { // check consistency if (in_vec.size() != out_vec.size()) LOG(FATAL) << "There must be as many inputs as outputs to be " << "able to compute a transform between them.\n"; if (in_vec.size() < min_elements_needed_for_fit()) LOG(FATAL) << "Cannot compute a transformation. Insufficient data.\n"; Eigen::Matrix3Xd in_mat = Eigen::MatrixXd(3, in_vec.size()); Eigen::Matrix3Xd out_mat = Eigen::MatrixXd(3, in_vec.size()); for (size_t it = 0; it < in_vec.size(); it++) { in_mat.col(it) = in_vec[it]; out_mat.col(it) = out_vec[it]; } result_type out_trans; rig::Find3DAffineTransform(in_mat, out_mat, &out_trans); return out_trans; } }; // How well does the given transform do to map p1 to p2. struct TransformError { double operator() (Eigen::Affine3d const& T, Eigen::Vector3d const& p1, Eigen::Vector3d const& p2) const { return (T*p1 - p2).norm(); } }; // Estimate the transform from B_xyz_vec to A_xyz_vec using RANSAC. // A lot of outliers are possible. Eigen::Affine3d findMapToMapTransform(const std::vector<Eigen::Vector3d>& A_xyz_vec, const std::vector<Eigen::Vector3d>& B_xyz_vec, const double close_dist) { double inlier_threshold = estimateCloseDistance(A_xyz_vec); if (close_dist > 0.0) inlier_threshold = close_dist; // user-set value std::cout << "3D points are declared to be rather close if their distance is " << inlier_threshold << " meters (option --close_dist). " << "Using this as inlier threshold.\n"; int num_iterations = 1000; int min_num_output_inliers = A_xyz_vec.size()/2; bool reduce_min_num_output_inliers_if_no_fit = true; // If too many outliers bool increase_threshold_if_no_fit = false; // better fail than give bad results std::vector<size_t> inlier_indices; Eigen::Affine3d B2A_trans; try { RandomSampleConsensus<TranslationRotationScaleFittingFunctor, TransformError> ransac(TranslationRotationScaleFittingFunctor(), TransformError(), num_iterations, inlier_threshold, min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit, increase_threshold_if_no_fit); B2A_trans = ransac(B_xyz_vec, A_xyz_vec); inlier_indices = ransac.inlier_indices(B2A_trans, B_xyz_vec, A_xyz_vec); } catch(std::exception const& e) { LOG(FATAL) << e.what() << "\n" << "Consider adjusting --close_dist or " << "taking a closer look at your maps. They should have " << "mostly images with non-small baseline."; } std::cout << "Number of RANSAC inliers: " << inlier_indices.size() << " (" << (100.0 * inlier_indices.size()) / A_xyz_vec.size() << " %)\n"; return B2A_trans; } // Find how to map cids which may have repetition, to new unique cid. // Also sort the new cid by image name. void findCidToCid(std::vector<std::string> const& cid_to_filename, std::map<int, int> & cid2cid, int & num_out_cams) { // Wipe the outputs cid2cid.clear(); num_out_cams = 0; std::vector<std::string> sorted = cid_to_filename; // make a copy std::sort(sorted.begin(), sorted.end()); // The new index of each image after rm repetitions std::map<std::string, int> image2cid; for (size_t cid = 0; cid < sorted.size(); cid++) { std::string img = sorted[cid]; if (image2cid.find(img) == image2cid.end()) { image2cid[img] = num_out_cams; num_out_cams++; } } // The index of the cid after removing the repetitions for (size_t cid = 0; cid < cid_to_filename.size(); cid++) cid2cid[cid] = image2cid[cid_to_filename[cid]]; if (num_out_cams != rig::maxMapVal(cid2cid) + 1) // sanity check LOG(FATAL) << "Book-keeping error in findCidToCid().\n"; } // Merge the camera names using cid2cid, which remaps the cid to remove repetitions // and sort the images by time. void mergeCameraNames(std::vector<std::string> & cid_to_filename, const std::map<int, int> & cid2cid, int num_out_cams) { std::vector<std::string> cid_to_filename2(num_out_cams); for (size_t cid = 0; cid < cid_to_filename.size(); cid++) { auto it = cid2cid.find(cid); if (it == cid2cid.end()) LOG(FATAL) << "cid2cid does not contain cid " << cid << ".\n"; cid_to_filename2.at(it->second) = cid_to_filename[cid]; } cid_to_filename = cid_to_filename2; } // Merge the camera poses using cid2cid, which remaps the cids to remove repetitions. void mergeCameraPoses(std::vector<rig::cameraImage> &C_cams, std::map<int, int> const& cid2cid, int num_out_cams) { std::vector<rig::cameraImage> merged_cams(num_out_cams); for (size_t cid = 0; cid < C_cams.size(); cid++) { auto it = cid2cid.find(cid); if (it == cid2cid.end()) LOG(FATAL) << "cid2cid does not contain cid " << cid << ".\n"; merged_cams[it->second] = C_cams[cid]; } C_cams = merged_cams; } // Merge two maps. See sfm_merge.cc. Approach: Find matches among // several images in map A and several in map B, based on // num_image_overlaps_at_endpoints. Then build tracks (so merging the // pairwise matches into tracks). If a track is partially in A and // partially in B, (with at least two features in each), that makes it // possible to find a triangulated point in A and one in B for that // track. Doing RANSAC between them will find the transform from B to // A. Then merge the transformed poses, remove the repeated images, // and concatenate and remove repetitions from tracks. If the // -fast_merge flag is used, find the transform between the maps using // shared poses. It is assumed features in keypoint maps are not // shifted relative to the optical center. The caller is responsible // to ensure that. // TODO(oalexan1): Modularize and move to some new tracks.cc file, // together with other logic from interest_point.cc. void MergeMaps(asp::nvmData const& A, asp::nvmData const& B, rig::RigSet const& R, int num_image_overlaps_at_endpoints, bool fast_merge, bool no_transform, double close_dist, std::string const& image_sensor_list, int num_threads, asp::nvmData & C) { // output merged map // Wipe the output C = asp::nvmData(); if (fast_merge && num_image_overlaps_at_endpoints > 0) { std::cout << "Setting number of image overlaps at end points to zero, " << "as fast merging is used.\n"; num_image_overlaps_at_endpoints = 0; } // Merge things that make sense to merge and are easy to do. Later // some of these will be shrunk if the input maps have shared data. int num_acid = A.cid_to_filename.size(); int num_bcid = B.cid_to_filename.size(); int num_ccid = num_acid + num_bcid; // Concatenate the images from A and B into C. C.cid_to_filename.clear(); C.cid_to_filename.insert(C.cid_to_filename.end(), A.cid_to_filename.begin(), A.cid_to_filename.end()); C.cid_to_filename.insert(C.cid_to_filename.end(), B.cid_to_filename.begin(), B.cid_to_filename.end()); std::vector<rig::cameraImage> C_cams; std::vector<std::pair<int, int>> image_pairs; setupLoadMatchingImages(C.cid_to_filename, R, image_sensor_list, num_acid, num_bcid, num_image_overlaps_at_endpoints, image_pairs, C_cams); // Outputs Eigen::Affine3d B2A_trans = Eigen::Affine3d::Identity(); if (fast_merge || no_transform) { // This will be empty, as we add no new features, during merging, // but ensure it has the right size. C.cid_to_keypoint_map.clear(); C.cid_to_keypoint_map.resize(C.cid_to_filename.size()); // Compute the transform from the B map to the A map by finding the median // transform based on the shared images if (!no_transform) B2A_trans = computeTransformFromBToA(A, B); } else { // Find corresponding triangulated points between the maps which will // result in the transform between them. // Find features among matching images std::string out_dir = ""; bool save_matches = false; int num_overlaps = 0; // will use image_pairs rig::KeypointVec C_keypoint_vec; int initial_max_reprojection_error = -1; // won't be used bool verbose = false; bool filter_matches_using_cams = false; // do not have a single camera set yet bool read_nvm_no_shift = true; // not used, part of the api bool no_nvm_matches = true; // not used, part of the api asp::nvmData empty_nvm; // not used, part of the api C.world_to_cam.resize(C.cid_to_filename.size()); // won't be used std::cout << "Number of image pairs to match: " << image_pairs.size() << std::endl; std::vector<Eigen::Vector3d> local_xyz_vec; // not used rig::detectAddFeatures(// Inputs C_cams, R.cam_params, out_dir, save_matches, filter_matches_using_cams, C.world_to_cam, num_overlaps, image_pairs, initial_max_reprojection_error, num_threads, read_nvm_no_shift, no_nvm_matches, verbose, // Outputs C_keypoint_vec, C.pid_to_cid_fid, local_xyz_vec, empty_nvm); // Split intro corresponding tracks in the two maps rig::PidCidFid A_pid_to_cid_fid, B_pid_to_cid_fid; rig::KeypointVec A_keypoint_vec, B_keypoint_vec; std::vector<rig::cameraImage> A_cams, B_cams; rig::splitTracksOneToOne(// Inputs num_acid, C.pid_to_cid_fid, C_keypoint_vec, C_cams, // Outputs A_pid_to_cid_fid, B_pid_to_cid_fid, A_keypoint_vec, B_keypoint_vec, A_cams, B_cams); #if 1 // TODO(oalexan1): This should be a function called findMatchingTriPoints(). // Flag as outliers features outside of the distorted crop box PidCidFidMap A_pid_cid_fid_inlier, B_pid_cid_fid_inlier; rig::flagOutlierByExclusionDist(// Inputs R.cam_params, A_cams, A_pid_to_cid_fid, A_keypoint_vec, // Outputs A_pid_cid_fid_inlier); rig::flagOutlierByExclusionDist(// Inputs R.cam_params, B_cams, B_pid_to_cid_fid, B_keypoint_vec, // Outputs B_pid_cid_fid_inlier); // Find triangulated points std::vector<Eigen::Vector3d> A_xyz_vec, B_xyz_vec; // triangulated points go here rig::multiViewTriangulation(// Inputs R.cam_params, A_cams, A.world_to_cam, A_pid_to_cid_fid, A_keypoint_vec, // Outputs A_pid_cid_fid_inlier, A_xyz_vec); rig::multiViewTriangulation(// Inputs R.cam_params, B_cams, B.world_to_cam, B_pid_to_cid_fid, B_keypoint_vec, // Outputs B_pid_cid_fid_inlier, B_xyz_vec); // Keep only the good points int count = 0; for (size_t pid = 0; pid < A_xyz_vec.size(); pid++) { if (!rig::isGoodTri(A_xyz_vec[pid]) || !rig::isGoodTri(B_xyz_vec[pid])) continue; A_xyz_vec[count] = A_xyz_vec[pid]; B_xyz_vec[count] = B_xyz_vec[pid]; count++; } A_xyz_vec.resize(count); B_xyz_vec.resize(count); #endif // Use the triangulated points and RANSAC to find the B to A transform B2A_trans = findMapToMapTransform(A_xyz_vec, B_xyz_vec, close_dist); // Convert keypoints to nvm format, updating C.cid_to_keypoint_map. C.cid_to_keypoint_map.resize(C.cid_to_filename.size()); for (size_t cid = 0; cid < C.cid_to_filename.size(); cid++) rig::vec2eigen(C_keypoint_vec[cid], C.cid_to_keypoint_map[cid]); C_keypoint_vec = rig::KeypointVec (); // wipe this } // end finding the transform using matches // In either case print the found transform std::cout << "Affine transform from second map to first map:\n"; std::cout << "Rotation + scale:\n" << B2A_trans.linear() << "\n"; std::cout << "Translation: " << B2A_trans.translation().transpose() << "\n"; // Bring the B map cameras in the A map coordinate system. Do not modify // B.world_to_cam, but make a copy of it in B_trans_world2cam. std::vector<Eigen::Affine3d> B_trans_world2cam = B.world_to_cam; rig::TransformCameras(B2A_trans, B_trans_world2cam); // Append all to the C map. Note how we use the transformed B. C.world_to_cam.clear(); C.world_to_cam.insert(C.world_to_cam.end(), A.world_to_cam.begin(), A.world_to_cam.end()); C.world_to_cam.insert(C.world_to_cam.end(), B_trans_world2cam.begin(), B_trans_world2cam.end()); // Find how to map cid to new cid which will not have // repetition. Also sort by image name. std::map<int, int> cid2cid; int num_out_cams = 0; findCidToCid(C.cid_to_filename, cid2cid, num_out_cams); // Update C.world_to_cam by merging poses for same images in the two maps MergePoses(cid2cid, C.world_to_cam); // Merge the camera names too, based on cid2cid mergeCameraNames(C.cid_to_filename, cid2cid, num_out_cams); #if 1 // By now we have 3 maps: A, B, and the new one in C having shared // tracks. Each of these has its own images and indices, and C // has repeated indices too, and need to merge them all into // a single set of tracks. We will not merge tracks, just remove // duplicates. // Factor this block out and call it mergeTracks(). // Note that keypoint_offsets are applied before the cid2cid transform gets used! // There must be enough for all the input cameras. // This is very error-prone! std::vector<Eigen::Vector2d> keypoint_offsets(num_acid + num_bcid, Eigen::Vector2d(0, 0)); KeyPointMap merged_keypoint_map(num_out_cams); std::vector<int> find_count(num_out_cams, 0); // how many keypoints so far rig::PidCidFid merged_pid_to_cid_fid; // Add A int cid_shift = 0; // A and C start with same images, so no shift rig::transformAppendNvm(A.pid_to_cid_fid, A.cid_to_keypoint_map, cid2cid, keypoint_offsets, cid_shift, num_out_cams, // Append below find_count, merged_keypoint_map, merged_pid_to_cid_fid); // Add B cid_shift = num_acid; // the B map starts later rig::transformAppendNvm(B.pid_to_cid_fid, B.cid_to_keypoint_map, cid2cid, keypoint_offsets, cid_shift, num_out_cams, // Append below find_count, merged_keypoint_map, merged_pid_to_cid_fid); // Add C cid_shift = 0; // no shift, C is consistent with itself rig::transformAppendNvm(C.pid_to_cid_fid, C.cid_to_keypoint_map, cid2cid, keypoint_offsets, cid_shift, num_out_cams, // Append below find_count, merged_keypoint_map, merged_pid_to_cid_fid); // Overwrite C.pid_to_cid_fid after the merge C.pid_to_cid_fid = merged_pid_to_cid_fid; merged_pid_to_cid_fid = rig::PidCidFid(); // Remove duplicate tracks rig::rmDuplicateTracks(C.pid_to_cid_fid); // Update C.cid_to_keypoint_map. This has the same data as // merged_keypoint_map but need to reverse key and value and use // an Eigen::Matrix. C.cid_to_keypoint_map.clear(); C.cid_to_keypoint_map.resize(num_out_cams); for (int cid = 0; cid < num_out_cams; cid++) { auto const& map = merged_keypoint_map[cid]; // alias C.cid_to_keypoint_map[cid] = Eigen::MatrixXd(2, map.size()); for (auto map_it = map.begin(); map_it != map.end(); map_it++) { std::pair<float, float> const& K = map_it->first; int fid = map_it->second; C.cid_to_keypoint_map.at(cid).col(fid) = Eigen::Vector2d(K.first, K.second); } } #endif // Merge the camera poses as well (remove duplicates) mergeCameraPoses(C_cams, cid2cid, num_out_cams); // Create C_keypoint_vec. Same info as C.cid_to_keypoint_map but different structure. rig::KeypointVec C_keypoint_vec; C_keypoint_vec.resize(num_out_cams); for (int cid = 0; cid < num_out_cams; cid++) rig::eigen2vec(C.cid_to_keypoint_map[cid], C_keypoint_vec[cid]); // Flag outliers PidCidFidMap C_pid_cid_fid_inlier; rig::flagOutlierByExclusionDist(// Inputs R.cam_params, C_cams, C.pid_to_cid_fid, C_keypoint_vec, // Outputs C_pid_cid_fid_inlier); // Triangulate the merged tracks with merged cameras rig::multiViewTriangulation(// Inputs R.cam_params, C_cams, C.world_to_cam, C.pid_to_cid_fid, C_keypoint_vec, // Outputs C_pid_cid_fid_inlier, C.pid_to_xyz); // TODO(oalexan1): Should one remove outliers from tri points // and C.pid_to_cid_fid? } } ================================================ FILE: src/asp/Rig/MergeMaps.h ================================================ #ifndef ASP_RIG_MERGE_MAPS_H #define ASP_RIG_MERGE_MAPS_H #include <string> namespace rig { class CameraParameters; } namespace asp { class nvmData; } namespace rig { class RigSet; // Merge two maps void MergeMaps(asp::nvmData const& A_in, asp::nvmData const& B_in, rig::RigSet const& R, int num_image_overlaps_at_endpoints, bool fast_merge, bool no_transform, double close_dist, std::string const& image_sensor_list, int num_threads, asp::nvmData & C_out); } // namespace rig #endif // ASP_RIG_MERGE_MAPS_H ================================================ FILE: src/asp/Rig/NvmUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/NvmUtils.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/Triangulation.h> #include <asp/Rig/RigTypeDefs.h> #include <asp/OpenMVG/tracks.hpp> #include <glog/logging.h> #include <iostream> #include <string> #include <set> namespace rig { // The nvm file produced by Theia can have files in arbitrary order. Find the map // which will help bring the cid in the correct order. void findCidReorderMap(asp::nvmData const& nvm, std::vector<rig::cameraImage> const& cams, // output std::map<int, int> & nvm_cid_to_cams_cid) { // Wipe the output nvm_cid_to_cams_cid.clear(); // First find how to map each cid from nvm to cid in 'cams'. std::map<std::string, int> nvm_image_name_to_cid; for (size_t nvm_cid = 0; nvm_cid < nvm.cid_to_filename.size(); nvm_cid++) { nvm_image_name_to_cid[nvm.cid_to_filename[nvm_cid]] = nvm_cid; } std::set<std::string> cam_set; for (size_t cid = 0; cid < cams.size(); cid++) { std::string const& image_name = cams[cid].image_name; cam_set.insert(image_name); auto nvm_it = nvm_image_name_to_cid.find(image_name); if (nvm_it == nvm_image_name_to_cid.end()) LOG(FATAL) << "Could not look up image: " << image_name << " in the input nvm file. Likely the input reconstruction " << "is incomplete.\n"; int nvm_cid = nvm_it->second; nvm_cid_to_cams_cid[nvm_cid] = cid; } // This is an important sanity check. Warn the user when not all images // from the NVM file are among the ones being used. if (cams.size() < nvm.cid_to_filename.size()) { std::cout << "Warning: Some input images are not present among the images being used. " << "Perhaps they were removed during bracketing. Only images bracketed in time " << "by reference sensor images can be used. Excluded images:\n"; for (size_t nvm_it = 0; nvm_it < nvm.cid_to_filename.size(); nvm_it++) { if (cam_set.find(nvm.cid_to_filename[nvm_it]) == cam_set.end()) std::cout << nvm.cid_to_filename[nvm_it] << std::endl; } } return; } // For nvm data that has the keypoints shifted relative to the optical // center, undo this shift when 'undo_shift' is true. So, add the optical center. // When 'undo_shift' is false, subtract the optical center. void shiftKeypoints(bool undo_shift, rig::RigSet const& R, asp::nvmData & nvm) { // output for (size_t cid = 0; cid < nvm.cid_to_filename.size(); cid++) { std::string const& image_name = nvm.cid_to_filename[cid]; // alias auto it = nvm.optical_centers.find(image_name); if (it == nvm.optical_centers.end()) LOG(FATAL) << "Could not find optical center for image: " << image_name << ".\n"; Eigen::Vector2d keypoint_offset = it->second; int num_fid = nvm.cid_to_keypoint_map[cid].cols(); for (int fid = 0; fid < num_fid; fid++) { if (undo_shift) nvm.cid_to_keypoint_map.at(cid).col(fid) += keypoint_offset; else nvm.cid_to_keypoint_map.at(cid).col(fid) -= keypoint_offset; } } return; } // Transform nvm matches. Account for the fact that the nvm file will // likely have the images in different order than in the 'cams' // vector, and may have more such images, as later we may have used // bracketing to thin them out. Also many need to add a keypoint // offset. // TODO(oalexan1): Integrate this with transformAppendNvm(). void transformNvm(// Inputs std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Vector2d> const& keypoint_offsets, asp::nvmData const& nvm, // Outputs rig::PidCidFid & pid_to_cid_fid, rig::KeypointVec & keypoint_vec, std::vector<Eigen::Vector3d> & xyz_vec) { // Sanity checks if (!keypoint_vec.empty() && keypoint_vec.size() != cams.size()) LOG(FATAL) << "There must be as many sets of keypoints as images, or none at all.\n"; if (nvm.pid_to_cid_fid.size() != nvm.pid_to_xyz.size()) LOG(FATAL) << "There must be as many tracks as triangulated points for them.\n"; // Wipe the outputs pid_to_cid_fid.clear(); keypoint_vec.clear(); keypoint_vec.resize(cams.size()); xyz_vec.clear(); // Find how to map each cid from nvm to cid in 'cams'. std::map<int, int> nvm_cid_to_cams_cid; rig::findCidReorderMap(nvm, cams, nvm_cid_to_cams_cid); // output // Get new pid_to_cid_fid and keypoint_vec. Note that we ignore the triangulated // points in nvm.pid_to_xyz. Triangulation will be redone later. for (size_t pid = 0; pid < nvm.pid_to_cid_fid.size(); pid++) { // Ignore triangulated points that are NaN, Inf, or (0, 0, 0). if (!rig::isGoodTri(nvm.pid_to_xyz[pid])) continue; std::map<int, int> out_cid_fid; for (auto cid_fid = nvm.pid_to_cid_fid[pid].begin(); cid_fid != nvm.pid_to_cid_fid[pid].end(); cid_fid++) { int nvm_cid = cid_fid->first; int nvm_fid = cid_fid->second; Eigen::Vector2d keypoint = nvm.cid_to_keypoint_map.at(nvm_cid).col(nvm_fid); // Find cid value in 'cams' based on cid value in the nvm auto it = nvm_cid_to_cams_cid.find(nvm_cid); if (it == nvm_cid_to_cams_cid.end()) continue; // this image may not have been within brackets and was thrown out int cid = it->second; // Add the optical center shift, if needed keypoint += keypoint_offsets[cid]; int fid = keypoint_vec[cid].size(); // this is before we add the keypoint out_cid_fid[cid] = fid; // After the push back, size is fid + 1 keypoint_vec[cid].push_back(std::make_pair(keypoint[0], keypoint[1])); } // Keep only the tracks with at least two matches, and corresponding xyz if (out_cid_fid.size() > 1) { pid_to_cid_fid.push_back(out_cid_fid); xyz_vec.push_back(nvm.pid_to_xyz[pid]); } } // end iterating over nvm pid } // Helper function to find a keypoint for given iterator and update cid in the merged // map with repetitions removed (via cid2cid). bool updateCidFindKeypoint(std::map<int, int>::const_iterator map_it, rig::CidToKeypointMatVec const& cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, int cid_shift, // outputs int & cid, std::pair<float, float> & K) { // Start with the cid in the input map cid = map_it->first; int fid = map_it->second; Eigen::Vector2d const& P = cid_to_keypoint_map.at(cid).col(fid); // alias K = std::pair<float, float>(P[0], P[1]); // the keypoint // Let the cid value point to the merged map, before removing repetitions cid += cid_shift; // only for map B that gets appended, which starts later // Add the keypoint offset, using the updated cid K.first += keypoint_offsets.at(cid)[0]; K.second += keypoint_offsets.at(cid)[1]; // cid gets replaced by cid2cid[cid], the value after removing repetitions auto it = cid2cid.find(cid); if (it == cid2cid.end()) return false; // cid2cid is missing this keypoint, just ignore it cid = it->second; return true; } // Given some tracks read from nvm from disk, append the ones from // nvm. Some remapping is needed. given that 'fid' values already // exist for the given tracks and that the nvm read from disk // may have the images in different order. New keypoints are recorded // with the help of fid_count and merged_keypoint_map. // Note that keypoint_offsets are applied before the cid2cid transform gets used! // This is very error-prone! // TODO(oalexan1): cid_shift and keypoint_offsets should be applied outside // this function as they make it hard to understand. void transformAppendNvm(// Append from these rig::PidCidFid const& nvm_pid_to_cid_fid, rig::CidToKeypointMatVec const& nvm_cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, int cid_shift, size_t num_out_cams, // Outputs, append to these std::vector<int> & fid_count, KeyPointMap & merged_keypoint_map, rig::PidCidFid & pid_to_cid_fid) { // Sanity checks if (num_out_cams != fid_count.size()) LOG(FATAL) << "Keypoint count was not initialized correctly.\n"; if (num_out_cams != merged_keypoint_map.size()) LOG(FATAL) << "Keypoint map was not initialized correctly.\n"; if (num_out_cams < rig::maxMapVal(cid2cid) + 1) LOG(FATAL) << "Unexpected value for the size of the output map.\n"; for (size_t pid = 0; pid < nvm_pid_to_cid_fid.size(); pid++) { std::map<int, int> out_cid_fid; auto const& cid_fid = nvm_pid_to_cid_fid[pid]; // alias for (auto map_it = cid_fid.begin(); map_it != cid_fid.end(); map_it++) { int cid = -1; // will change soon std::pair<float, float> K; bool ans = updateCidFindKeypoint(map_it, nvm_cid_to_keypoint_map, cid2cid, keypoint_offsets, cid_shift, cid, K); if (!ans) continue; // could not lookup cid in cid2cid // TODO(oalexan1): Use below the function findFid(), with testing. // Insert K in the keypoint map and increment the count, // unless it already exists. In either case get the fid. auto key_it = merged_keypoint_map.at(cid).find(K); int fid = -1; if (key_it != merged_keypoint_map.at(cid).end()) { fid = key_it->second; } else { // fid is the last count, then increment the count fid = fid_count[cid]; merged_keypoint_map.at(cid)[K] = fid_count[cid]; fid_count[cid]++; } // Create the track out_cid_fid[cid] = fid; } // Append the transformed track if (out_cid_fid.size() > 1) pid_to_cid_fid.push_back(out_cid_fid); } return; } } // end namespace rig ================================================ FILE: src/asp/Rig/NvmUtils.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #pragma once #include <asp/Core/Nvm.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/RigTypeDefs.h> #include <Eigen/Core> #include <Eigen/Geometry> #include <map> #include <vector> #include <string> #include <OpenMVG/tracks.hpp> namespace rig { // Helper function to find a keypoint for given iterator and update cid in the merged // map with repetitions removed (via cid2cid). bool updateCidFindKeypoint(std::map<int, int>::const_iterator map_it, rig::CidToKeypointMatVec const& cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, int cid_shift, // outputs int & cid, std::pair<float, float> & K); // The nvm file produced by Theia can have files in arbitrary order. Find the map // which will help bring the cid in the correct order. void findCidReorderMap(asp::nvmData const& nvm, std::vector<rig::cameraImage> const& cams, // output std::map<int, int> & nvm_cid_to_cams_cid); // For nvm data that has the keypoints shifted relative to the optical // center, undo this shift when 'undo_shift' is true. So, add the optical center. // When 'undo_shift' is false, subtract the optical center. void shiftKeypoints(bool undo_shift, rig::RigSet const& R, asp::nvmData & nvm); // output // Transform nvm matches. Account for the fact that the nvm file will // likely have the images in different order than in the 'cams' // vector, and may have more such images, as later we may have used // bracketing to thin them out. Also many need to add a keypoint // offset. // TODO(oalexan1): Integrate this with transformAppendNvm(). void transformNvm(// Inputs std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Vector2d> const& keypoint_offsets, asp::nvmData const& nvm, // Outputs rig::PidCidFid & pid_to_cid_fid, rig::KeypointVec & keypoint_vec, std::vector<Eigen::Vector3d> & xyz_vec); // Given some tracks read from nvm from disk, append the ones from // nvm. Some remapping is needed. given that 'fid' values already // exist for the given tracks and that the nvm read from disk // may have the images in different order. New keypoints are recorded // with the help of fid_count and merged_keypoint_map. // Note that keypoint_offsets are applied before the cid2cid transform gets used! // This is very error-prone! // TODO(oalexan1): cid_shift and keypoint_offsets should be applied outside // this function as they make it hard to understand. void transformAppendNvm(// Append from these rig::PidCidFid const& nvm_pid_to_cid_fid, rig::CidToKeypointMatVec const& nvm_cid_to_keypoint_map, std::map<int, int> const& cid2cid, std::vector<Eigen::Vector2d> const& keypoint_offsets, int cid_shift, size_t num_out_cams, // Outputs, append to these std::vector<int> & fid_count, KeyPointMap & merged_keypoint_map, rig::PidCidFid & pid_to_cid_fid); } // end namespace rig ================================================ FILE: src/asp/Rig/Ransac.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/Ransac.h> #include <glog/logging.h> #include <iostream> #include <set> #include <functional> namespace rig { // Get a given number of unique random integers within a given range // (inclusive). It is very important that the generator be stored // outside, so we don't always initialize it to the same value. That // would result in same random numbers each time this function is // called which is very undesirable. void get_n_unique_integers(int min_val, int max_val, int num, std::mt19937 * generator, std::vector<int> * values) { // Sanity check if (max_val - min_val + 1 < num) { LOG(FATAL) << "Cannot get " << num << " unique integers in [" << min_val << ", " << max_val << "]" << std::endl; } values->clear(); std::set<int> done; std::uniform_int_distribution <int> distribution(min_val, max_val); while (1) { if (values->size() == static_cast<size_t>(num)) break; int val = distribution(*generator); // If this was encountered, skip it if (done.find(val) != done.end()) continue; done.insert(val); values->push_back(val); } } } // end namespace rig ================================================ FILE: src/asp/Rig/Ransac.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_RANSAC_H #define ASP_RIG_RANSAC_H #include <glog/logging.h> #include <iostream> #include <ctime> #include <climits> #include <string> #include <vector> #include <random> #include <limits> namespace rig { void get_n_unique_integers(int min_val, int max_val, int num, std::mt19937 * generator, std::vector<int> * values); /// RANSAC Driver class template <class FittingFuncT, class ErrorFuncT> class RandomSampleConsensus { const FittingFuncT& m_fitting_func; const ErrorFuncT & m_error_func; int m_num_iterations; double m_inlier_threshold; int m_min_num_output_inliers; bool m_reduce_min_num_output_inliers_if_no_fit; bool m_increase_threshold_if_no_fit; std::mt19937 m_generator; public: // Returns the list of inliers. template <class ContainerT1, class ContainerT2> void inliers(typename FittingFuncT::result_type const& H, std::vector<ContainerT1> const& p1, std::vector<ContainerT2> const& p2, std::vector<ContainerT1> & inliers1, std::vector<ContainerT2> & inliers2) const { inliers1.clear(); inliers2.clear(); for (size_t i = 0; i < p1.size(); i++) { if (m_error_func(H, p1[i], p2[i]) < m_inlier_threshold) { inliers1.push_back(p1[i]); inliers2.push_back(p2[i]); } } } // Returns the list of inlier indices. template <class ContainerT1, class ContainerT2> std::vector<size_t> inlier_indices(typename FittingFuncT::result_type const& H, std::vector<ContainerT1> const& p1, std::vector<ContainerT2> const& p2) const { std::vector<size_t> result; for (size_t i = 0; i < p1.size(); i++) if (m_error_func(H, p1[i], p2[i]) < m_inlier_threshold) result.push_back(i); return result; } void reduce_min_num_output_inliers() { m_min_num_output_inliers = static_cast<int>(m_min_num_output_inliers/1.5); } /// Constructor - Stores all the inputs in member variables RandomSampleConsensus(FittingFuncT const& fitting_func, ErrorFuncT const& error_func, int num_iterations, double inlier_threshold, int min_num_output_inliers, bool reduce_min_num_output_inliers_if_no_fit, bool increase_threshold_if_no_fit): m_fitting_func(fitting_func), m_error_func(error_func), m_num_iterations(num_iterations), m_inlier_threshold(inlier_threshold), m_min_num_output_inliers(min_num_output_inliers), m_reduce_min_num_output_inliers_if_no_fit(reduce_min_num_output_inliers_if_no_fit), m_increase_threshold_if_no_fit(increase_threshold_if_no_fit), m_generator(0) // use a fixed seed to give reproducible results {} /// As attempt_ransac but keep trying with smaller numbers of required inliers. template <class ContainerT1, class ContainerT2> typename FittingFuncT::result_type operator()(std::vector<ContainerT1> const& p1, std::vector<ContainerT2> const& p2) { // Try to fit using RANSAC. Perform repeated fits with smaller // m_min_num_output_inliers if the fit fails and // m_reduce_min_num_output_inliers_if_no_fit is true. typename FittingFuncT::result_type H; bool success = false; int orig_num_inliers = m_min_num_output_inliers; // Try various attempts while getting ever more generous with the // threshold and the number of liners. for each of these, there // will be m_num_iterations attempts. for (int attempt_thresh = 0; attempt_thresh < 10; attempt_thresh++) { for (int attempt_inlier = 0; attempt_inlier < 10; attempt_inlier++) { try { H = attempt_ransac(p1, p2); success = true; break; } catch (const std::exception& e) { std::cout << e.what() << "\n"; if (!m_reduce_min_num_output_inliers_if_no_fit) break; reduce_min_num_output_inliers(); // A similarity transform needs at least 3 samples if (m_min_num_output_inliers < 3) break; std::cout << "Attempting RANSAC with " << m_min_num_output_inliers << " output inliers.\n"; } } if (success) break; if (!m_increase_threshold_if_no_fit) break; m_min_num_output_inliers = orig_num_inliers; // restore this m_inlier_threshold *= 1.5; std::cout << "Increasing the inlier threshold to: " << m_inlier_threshold << ".\n"; } if (!success) throw std::runtime_error("RANSAC was unable to find a fit that matched the supplied data."); return H; } /// Run RANSAC on two input data lists using the current parameters. template <class ContainerT1, class ContainerT2> typename FittingFuncT::result_type attempt_ransac(std::vector<ContainerT1> const& p1, std::vector<ContainerT2> const& p2) { if (p1.empty()) LOG(FATAL) << "RANSAC error. Insufficient data.\n"; if (p1.size() != p2.size()) LOG(FATAL) << "RANSAC error. Data vectors are not the same size.\n"; int min_elems_for_fit = m_fitting_func.min_elements_needed_for_fit(); if (static_cast<int>(p1.size()) < min_elems_for_fit) LOG(FATAL) << "RANSAC error. Not enough potential matches for this fitting functor.\n"; // This one we want to catch. if (m_min_num_output_inliers < min_elems_for_fit) throw std::runtime_error("RANSAC error. Number of requested inliers is less than " "min number of elements needed for fit.\n"); typename FittingFuncT::result_type best_H; std::vector<ContainerT1> try1; std::vector<ContainerT2> try2; std::vector<int> random_indices(min_elems_for_fit); int num_inliers = 0; double min_err = std::numeric_limits<double>::max(); for (int iteration = 0; iteration < m_num_iterations; iteration++) { // Get min_elems_for_fit points at random, taking care not to // select the same point twice. int num = p1.size(); get_n_unique_integers(0, num - 1, min_elems_for_fit, &m_generator, &random_indices); // Resizing below is essential, as by now their size may have changed try1.resize(min_elems_for_fit); try2.resize(min_elems_for_fit); for (int i = 0; i < min_elems_for_fit; i++) { try1[i] = p1[random_indices[i]]; try2[i] = p2[random_indices[i]]; } // 1. Compute the fit using these samples. typename FittingFuncT::result_type H = m_fitting_func(try1, try2); // 2. Find all the inliers for this fit. inliers(H, p1, p2, try1, try2); // 3. Skip this model if too few inliers. if (static_cast<int>(try1.size()) < m_min_num_output_inliers) continue; // 4. Re-estimate the model using the inliers. H = m_fitting_func(try1, try2); // 5. Find the mean error for the inliers. double err_val = 0.0; for (size_t i = 0; i < try1.size(); i++) err_val += m_error_func(H, try1[i], try2[i]); err_val /= try1.size(); // 6. Save this model if its error is lowest so far. if (err_val < min_err) { min_err = err_val; best_H = H; num_inliers = try1.size(); } } if (num_inliers < m_min_num_output_inliers) { // Here throw, to be able to catch it in the caller. std::ostringstream os; os << "RANSAC was unable to find a fit with " << m_min_num_output_inliers << " inliers."; throw std::runtime_error(os.str()); } return best_H; } }; // End of RandomSampleConsensus class definition // Helper function to instantiate a RANSAC class object and immediately call it template <class ContainerT1, class ContainerT2, class FittingFuncT, class ErrorFuncT> typename FittingFuncT::result_type ransac(std::vector<ContainerT1> const& p1, std::vector<ContainerT2> const& p2, FittingFuncT const& fitting_func, ErrorFuncT const& error_func, int num_iterations, double inlier_threshold, int min_num_output_inliers, bool reduce_min_num_output_inliers_if_no_fit, bool increase_threshold_if_no_fit) { RandomSampleConsensus < FittingFuncT, ErrorFuncT> ransac_instance(fitting_func, error_func, num_iterations, inlier_threshold, min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit, increase_threshold_if_no_fit); return ransac_instance(p1, p2); } } // end namespace rig #endif // ASP_RIG_RANSAC_H ================================================ FILE: src/asp/Rig/RigCameraParams.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/RigRpcDistortion.h> #include <Eigen/Dense> #include <gflags/gflags.h> #include <iostream> #include <glog/logging.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp> #include <opencv2/core/eigen.hpp> #include <opencv2/calib3d/calib3d.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <fstream> #include <iostream> rig::CameraParameters::CameraParameters(Eigen::Vector2i const& image_size, Eigen::Vector2d const& focal_length, Eigen::Vector2d const& optical_center, Eigen::VectorXd const& distortion, DistortionType distortion_type) { SetDistortedSize(image_size); SetDistortedCropSize(image_size); SetUndistortedSize(image_size); m_focal_length = focal_length; m_optical_offset = optical_center; m_crop_offset.setZero(); SetDistortion(distortion); m_distortion_type = distortion_type; } void rig::CameraParameters::SetDistortedSize(Eigen::Vector2i const& image_size) { m_distorted_image_size = image_size; m_distorted_half_size = image_size.cast<double>() / 2.0; } const Eigen::Vector2i& rig::CameraParameters::GetDistortedSize() const { return m_distorted_image_size; } const Eigen::Vector2d& rig::CameraParameters::GetDistortedHalfSize() const { return m_distorted_half_size; } void rig::CameraParameters::SetDistortedCropSize(Eigen::Vector2i const& crop_size) { m_distorted_crop_size = crop_size; } const Eigen::Vector2i& rig::CameraParameters::GetDistortedCropSize() const { return m_distorted_crop_size; } void rig::CameraParameters::SetUndistortedSize(Eigen::Vector2i const& image_size) { m_undistorted_size = image_size; m_undistorted_half_size = image_size.cast<double>() / 2.0; } const Eigen::Vector2i& rig::CameraParameters::GetUndistortedSize() const { return m_undistorted_size; } const Eigen::Vector2d& rig::CameraParameters::GetUndistortedHalfSize() const { return m_undistorted_half_size; } void rig::CameraParameters::SetCropOffset(Eigen::Vector2i const& crop) { m_crop_offset = crop; } const Eigen::Vector2i& rig::CameraParameters::GetCropOffset() const { return m_crop_offset; } void rig::CameraParameters::SetOpticalOffset(Eigen::Vector2d const& offset) { m_optical_offset = offset; } const Eigen::Vector2d& rig::CameraParameters::GetOpticalOffset() const { return m_optical_offset; } void rig::CameraParameters::SetFocalLength(Eigen::Vector2d const& f) { m_focal_length = f; } double rig::CameraParameters::GetFocalLength() const { return m_focal_length.mean(); } const Eigen::Vector2d& rig::CameraParameters::GetFocalVector() const { return m_focal_length; } void rig::CameraParameters::SetDistortion(Eigen::VectorXd const& distortion) { // Reset this. Will be needed only with RPC distortion. m_rpc = rig::RPCLensDistortion(); m_distortion_coeffs = distortion; // Ensure variables are initialized m_distortion_precalc1 = 0; m_distortion_precalc2 = 0; m_distortion_precalc3 = 0; switch (m_distortion_coeffs.size()) { case 0: // No lens distortion! break; case 1: // FOV model // inverse alpha m_distortion_precalc1 = 1 / distortion[0]; // Inside tangent function m_distortion_precalc2 = 2 * tan(distortion[0] / 2); break; case 4: // Fall through intended. case 5: // Tsai model // There doesn't seem like there are any precalculations we can use. break; default: m_rpc.set_distortion_parameters(m_distortion_coeffs); } } const Eigen::VectorXd& rig::CameraParameters::GetDistortion() const { return m_distortion_coeffs; } // Typedefs for distortion and Jacobian of distortion function signatures typedef std::function<Eigen::Vector2d(Eigen::Vector2d const&, Eigen::VectorXd const&)> FunT; typedef std::function<Eigen::VectorXd(Eigen::Vector2d const&, Eigen::VectorXd const&, double, FunT)> JacT; // Apply the fisheye distortion model. Input and output are normalized pixels. Eigen::Vector2d fishEyeDistortionNorm(Eigen::Vector2d const& P, Eigen::VectorXd const& dist) { double k1 = dist[0]; double k2 = dist[1]; double k3 = dist[2]; double k4 = dist[3]; double x = P[0]; double y = P[1]; double r2 = x*x + y*y; double r = sqrt(r2); double theta = atan(r); double theta1 = theta*theta; // theta^2 double theta2 = theta1*theta1; // theta^4 double theta3 = theta2*theta1; // theta^6 double theta4 = theta2*theta2; // theta^8 double theta_d = theta*(1 + k1*theta1 + k2*theta2 + k3*theta3 + k4*theta4); // Careful with the case where r is very small double scale = 1.0; if (r > 1e-8) scale = theta_d / r; return Eigen::Vector2d(x*scale, y*scale); } // Find the Jacobian of a function at a given point using numerical differentiation. // A good value for the step is 1e-6. Note that above we use a tolerance of 1e-8 // when dividing floating point values, which is way smaller than this step. Eigen::VectorXd numericalJacobian(Eigen::Vector2d const& P, Eigen::VectorXd const& dist, double step, FunT func) { // The Jacobian has 4 elements. Eigen::VectorXd jacobian(4); // First column Eigen::Vector2d JX = (func(P + Eigen::Vector2d(step, 0), dist) - func(P - Eigen::Vector2d(step, 0), dist)) / (2*step); // Second column Eigen::Vector2d JY = (func(P + Eigen::Vector2d(0, step), dist) - func(P - Eigen::Vector2d(0, step), dist)) / (2*step); // Put in the jacobian matrix jacobian[0] = JX[0]; jacobian[1] = JY[0]; jacobian[2] = JX[1]; jacobian[3] = JY[1]; return jacobian; } // Find X solving func(X) - Y = 0. Use the Newton-Raphson method. // Update X as X - (func(X) - Y) * J^-1, where J is the Jacobian of func(X). Eigen::Vector2d newtonRaphson(Eigen::Vector2d const& Y, Eigen::VectorXd const& distortion, FunT func, JacT jac) { // The step for differentiating the function (1e-6) should be larger // than the tolerance for finding the function value (1e-8). double step = 1e-6; // Initial guess for the root Eigen::Vector2d X = Y; int count = 1, maxTries = 20; while (count < maxTries) { Eigen::Vector2d F = func(X, distortion) - Y; // Compute the Jacobian Eigen::VectorXd J(4); J = jac(X, distortion, step, func); // Find the determinant double det = J[0]*J[3] - J[1]*J[2]; if (fabs(det) < 1e-6) { // Near-zero determinant. Cannot continue. Return most recent result. return X; } Eigen::Vector2d DX; DX[0] = (J[3]*F[0] - J[1]*F[1]) / det; DX[1] = (J[0]*F[1] - J[2]*F[0]) / det; // Update X X -= DX; // If DX is small enough, we are done if (DX.norm() < 1e-6) return X; count++; } return X; } void rig::CameraParameters::DistortCentered(Eigen::Vector2d const& undistorted_c, Eigen::Vector2d* distorted_c) const { // We assume that input x and y are pixel values that have // undistorted_len_x/2.0 and undistorted_len_y/2.0 subtracted from // them. The outputs will have distorted_len_x/2.0 and // distorted_len_y/2.0 subtracted from them. if (m_distortion_coeffs.size() == 0) { // There is no distortion *distorted_c = undistorted_c + m_optical_offset - m_distorted_half_size; } else if (m_distortion_coeffs.size() == 1) { // This is the FOV model Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length); double ru = norm.norm(); double rd = atan(ru * m_distortion_precalc2) * m_distortion_precalc1; double conv; if (ru > 1e-8) { conv = rd / ru; } else { conv = 1; } *distorted_c = (m_optical_offset - m_distorted_half_size) + conv * norm.cwiseProduct(m_focal_length); } else if (m_distortion_coeffs.size() == 4 && m_distortion_type == FISHEYE_DISTORTION) { // Fisheye lens distortion // https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html Note: The // function cv::fisheye::distortPoints() assumes that the inputs have the // image midpoint subtracted and are divided by the focal length, while its // output are pixels that are not centered. // Normalize the pixel Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length); // Apply the distortion to the normalized pixel *distorted_c = fishEyeDistortionNorm(norm, m_distortion_coeffs); // Scale by the focal length and add the optical offset *distorted_c = distorted_c->cwiseProduct(m_focal_length) + (m_optical_offset - m_distorted_half_size); } else if (m_distortion_coeffs.size() == 4 || m_distortion_coeffs.size() == 5) { // Tsai lens distortion (radial-tangential, implemented in OpenCV) double k1 = m_distortion_coeffs[0]; double k2 = m_distortion_coeffs[1]; double p1 = m_distortion_coeffs[2]; double p2 = m_distortion_coeffs[3]; double k3 = 0; if (m_distortion_coeffs.size() == 5) k3 = m_distortion_coeffs[4]; // To relative coordinates Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length); double r2 = norm.squaredNorm(); // Radial distortion double radial_dist = 1 + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2 * r2; *distorted_c = radial_dist * norm; // Tangential distortion *distorted_c += Eigen::Vector2d(2 * p1 * norm[0] * norm[1] + p2 * (r2 + 2 * norm[0] * norm[0]), p1 * (r2 + 2 * norm[1] * norm[1]) + 2 * p2 * norm[0] * norm[1]); // Back to absolute coordinates *distorted_c = distorted_c->cwiseProduct(m_focal_length) + (m_optical_offset - m_distorted_half_size); } else { // RPC // Normalize the pixel Eigen::Vector2d norm = undistorted_c.cwiseQuotient(m_focal_length); // Apply the distortion to the normalized pixel *distorted_c = rig::compute_rpc(norm, m_distortion_coeffs); // Scale by the focal length and add the optical offset *distorted_c = distorted_c->cwiseProduct(m_focal_length) + (m_optical_offset - m_distorted_half_size); } } void rig::CameraParameters::UndistortCentered(Eigen::Vector2d const& distorted_c, Eigen::Vector2d *undistorted_c) const { if (m_distortion_coeffs.size() == 0) { // No lens distortion *undistorted_c = distorted_c - (m_optical_offset - m_distorted_half_size); } else if (m_distortion_coeffs.size() == 1) { // FOV lens distortion Eigen::Vector2d norm = (distorted_c - (m_optical_offset - m_distorted_half_size)).cwiseQuotient(m_focal_length); double rd = norm.norm(); double ru = tan(rd * m_distortion_coeffs[0]) / m_distortion_precalc2; double conv = 1.0; if (rd > 1e-8) conv = ru / rd; *undistorted_c = conv * norm.cwiseProduct(m_focal_length); } else if (m_distortion_coeffs.size() == 4 && m_distortion_type == FISHEYE_DISTORTION) { // Center and normalize Eigen::Vector2d norm = (distorted_c - (m_optical_offset - m_distorted_half_size)).cwiseQuotient(m_focal_length); // Find the normalized undistorted pixel using Newton-Raphson Eigen::Vector2d U = newtonRaphson(norm, m_distortion_coeffs, fishEyeDistortionNorm, numericalJacobian); // Undo the normalization *undistorted_c = U.cwiseProduct(m_focal_length); } else if (m_distortion_coeffs.size() == 4 || m_distortion_coeffs.size() == 5) { // Tsai lens distortion (radial-tangential) // TODO(oalexan1): Must test this! There is apparently an issue with // the OpenCV implementation! Must use the numerical Jacobian here! cv::Mat src(1, 1, CV_64FC2); cv::Mat dst(1, 1, CV_64FC2); Eigen::Map<Eigen::Vector2d> src_map(src.ptr<double>()), dst_map(dst.ptr<double>()); cv::Mat dist_int_mat(3, 3, cv::DataType<double>::type), undist_int_mat(3, 3, cv::DataType<double>::type); cv::Mat cvdist; cv::eigen2cv(m_distortion_coeffs, cvdist); cv::eigen2cv(GetIntrinsicMatrix<DISTORTED>(), dist_int_mat); cv::eigen2cv(GetIntrinsicMatrix<UNDISTORTED>(), undist_int_mat); src_map = distorted_c + m_distorted_half_size; // Note: cv::undistortPoints() has an error of about half a pixel // TODO(oalexan1): Need to investigate this further, and maybe // change the implementation to using Newton-Raphson. cv::undistortPoints(src, dst, dist_int_mat, cvdist, cv::Mat(), undist_int_mat); *undistorted_c = dst_map - m_undistorted_half_size; } else { // RPC lens distortion // Center and normalize Eigen::Vector2d norm = (distorted_c - (m_optical_offset - m_distorted_half_size)).cwiseQuotient(m_focal_length); // Find the normalized undistorted pixel using Newton-Raphson Eigen::Vector2d U = newtonRaphson(norm, m_distortion_coeffs, rig::compute_rpc, numericalJacobian); // Undo the normalization *undistorted_c = U.cwiseProduct(m_focal_length); } } // The 'scale' variable is useful when we have the distortion model for a given // image, and want to apply it to a version of that image at a different resolution, // with 'scale' being the ratio of the width of the image at different resolution // and the one at the resolution at which the distortion model is computed. void rig::CameraParameters::GenerateRemapMaps(cv::Mat* remap_map, double scale) { remap_map->create(scale*m_undistorted_size[1], scale*m_undistorted_size[0], CV_32FC2); Eigen::Vector2d undistorted, distorted; for (undistorted[1] = 0; undistorted[1] < scale*m_undistorted_size[1]; undistorted[1]++) { for (undistorted[0] = 0; undistorted[0] < scale*m_undistorted_size[0]; undistorted[0]++) { Convert<UNDISTORTED, DISTORTED>(undistorted/scale, &distorted); remap_map->at<cv::Vec2f>(undistorted[1], undistorted[0])[0] = scale*distorted[0]; remap_map->at<cv::Vec2f>(undistorted[1], undistorted[0])[1] = scale*distorted[1]; } } } namespace rig { // Conversion function helpers #define DEFINE_CONVERSION(TYPEA, TYPEB) \ template <> \ void rig::CameraParameters::Convert<TYPEA, TYPEB>(Eigen::Vector2d const& input, Eigen::Vector2d *output) const DEFINE_CONVERSION(RAW, DISTORTED) { *output = input - m_crop_offset.cast<double>(); } DEFINE_CONVERSION(DISTORTED, RAW) { *output = input + m_crop_offset.cast<double>(); } DEFINE_CONVERSION(UNDISTORTED_C, DISTORTED_C) { DistortCentered(input, output); } DEFINE_CONVERSION(DISTORTED_C, UNDISTORTED_C) { UndistortCentered(input, output); } DEFINE_CONVERSION(UNDISTORTED, UNDISTORTED_C) { *output = input - m_undistorted_half_size; } DEFINE_CONVERSION(UNDISTORTED_C, UNDISTORTED) { *output = input + m_undistorted_half_size; } DEFINE_CONVERSION(DISTORTED, UNDISTORTED) { Convert<DISTORTED_C, UNDISTORTED_C>(input - m_distorted_half_size, output); *output += m_undistorted_half_size; } DEFINE_CONVERSION(UNDISTORTED, DISTORTED) { Eigen::Vector2d centered_output; Convert<UNDISTORTED, UNDISTORTED_C>(input, output); Convert<UNDISTORTED_C, DISTORTED_C>(*output, ¢ered_output); *output = centered_output + m_distorted_half_size; } DEFINE_CONVERSION(DISTORTED, DISTORTED_C) { *output = input - m_distorted_half_size; } DEFINE_CONVERSION(DISTORTED, UNDISTORTED_C) { Convert<DISTORTED_C, UNDISTORTED_C>(input - m_distorted_half_size, output); } DEFINE_CONVERSION(UNDISTORTED_C, DISTORTED) { Convert<UNDISTORTED_C, DISTORTED_C>(input, output); *output += m_distorted_half_size; } DEFINE_CONVERSION(UNDISTORTED, DISTORTED_C) { Eigen::Vector2d centered_output; Convert<UNDISTORTED, UNDISTORTED_C>(input, output); Convert<UNDISTORTED_C, DISTORTED_C>(*output, ¢ered_output); *output = centered_output; } #undef DEFINE_CONVERSION // Helper functions to give the intrinsic matrix #define DEFINE_INTRINSIC(TYPE) \ template <> \ Eigen::Matrix3d rig::CameraParameters::GetIntrinsicMatrix<TYPE>() const DEFINE_INTRINSIC(RAW) { Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal(); k.block<2, 1>(0, 2) = m_optical_offset + m_crop_offset.cast<double>(); return k; } DEFINE_INTRINSIC(DISTORTED) { Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal(); k.block<2, 1>(0, 2) = m_optical_offset; return k; } DEFINE_INTRINSIC(DISTORTED_C) { Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal(); k.block<2, 1>(0, 2) = m_optical_offset - m_distorted_half_size; return k; } DEFINE_INTRINSIC(UNDISTORTED) { Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal(); k.block<2, 1>(0, 2) = m_undistorted_half_size; return k; } DEFINE_INTRINSIC(UNDISTORTED_C) { Eigen::Matrix3d k = m_focal_length.homogeneous().asDiagonal(); return k; } #undef DEFINE_INTRINSIC } // end namespace rig ================================================ FILE: src/asp/Rig/RigCameraParams.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_CAMERA_PARAMS_H #define ASP_RIG_CAMERA_PARAMS_H #include <asp/Rig/RigRpcDistortion.h> #include <Eigen/Core> #include <string> #include <vector> #include <algorithm> // Forward declare mat type so that we don't have to include OpenCV if we're // not going to use it. namespace cv { class Mat; } // end namespace cv // Functionality for undistorting and re-distorting images namespace rig { // Definition of camera frames // // RAW - This is how the image came to us. // DISTORTED - Similar to RAW, but we've cropped out everything that is // non-image // DISTORTED_C - Same as DISTORTED, but the origin is the center of the image // UNDISTORTED - A new camera frame that is create by remove lens distortion // and placing the optical center directly center of the image. // UNDISTORTED_C - Same as UNDISTORTED, but the origin is the center of the image enum { RAW, DISTORTED, DISTORTED_C, UNDISTORTED, UNDISTORTED_C }; enum DistortionType { NO_DISTORTION, // no distortion params FOV_DISTORTION, // 1 distortion param FISHEYE_DISTORTION, // 4 distortion params RADTAN_DISTORTION, // 4 or 5 distortion params RPC_DISTORTION // many distortion params }; // These are the names of the distortion models as strings in the config files const std::string NO_DISTORTION_STR = "no_distortion"; const std::string FOV_DISTORTION_STR = "fov"; const std::string FISHEYE_DISTORTION_STR = "fisheye"; const std::string RADTAN_DISTORTION_STR = "radtan"; const std::string RPC_DISTORTION_STR = "rpc"; class CameraParameters { public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW; CameraParameters() {} // empty constructor; will create an undefined model CameraParameters(Eigen::Vector2i const& image_size, Eigen::Vector2d const& focal_length, Eigen::Vector2d const& optical_center, Eigen::VectorXd const& distortion, DistortionType distortion_type); // Used to create a remap table. This table is the same size as the // UNDISTORTED image, where every pixel's value is the corresponding pixel // location in the DISTORTED image. void GenerateRemapMaps(cv::Mat* remap_map, double scale = 1.0); // Conversion utilities template <int SRC, int DEST> void Convert(Eigen::Vector2d const& input, Eigen::Vector2d *output) const { throw("Please use the explicitly specified conversions by using the correct enum."); } // Utility to create intrinsic matrix for the correct coordinate frame template <int FRAME> Eigen::Matrix3d GetIntrinsicMatrix() const { throw("Please use the explicitly specified frame by using the correct enum."); } // Image size info. We don't give direct access because if the size // changes, we need to recompute some temporary variables. // These apply to coordinate frames DISTORTED, DISTORTED_C void SetDistortedSize(Eigen::Vector2i const& image_size); const Eigen::Vector2i& GetDistortedSize() const; const Eigen::Vector2d& GetDistortedHalfSize() const; // Domain of validity of distortion model (normally all image) // Centered around image center. void SetDistortedCropSize(Eigen::Vector2i const& crop_size); const Eigen::Vector2i& GetDistortedCropSize() const; // These apply to UNDISTORTED, UNDISTORTED_C void SetUndistortedSize(Eigen::Vector2i const& image_size); const Eigen::Vector2i& GetUndistortedSize() const; const Eigen::Vector2d& GetUndistortedHalfSize() const; // Start of DISTORTED inside RAW frame void SetCropOffset(Eigen::Vector2i const& crop); const Eigen::Vector2i& GetCropOffset() const; // Optical offset in DISTORTED frame void SetOpticalOffset(Eigen::Vector2d const& offset); const Eigen::Vector2d& GetOpticalOffset() const; // Helper functions for focal length. Unless pixels are square, // the focal length in x may differ than the one in y. Note that // they are equal for undistorted images. Note that // GetFocalLength() returns the mean of the two focal lengths // while GetFocalVector() returns the vector. void SetFocalLength(Eigen::Vector2d const&); double GetFocalLength() const; const Eigen::Vector2d& GetFocalVector() const; // This will change the lens distortion type based on the size of the // vector. Size 0, no lens distortion, Size 1, FOV, Size 4 or 5, TSAI. void SetDistortion(Eigen::VectorXd const& distortion); const Eigen::VectorXd& GetDistortion() const; rig::RPCLensDistortion m_rpc; // Comparison operator friend bool operator== (CameraParameters const& A, CameraParameters const& B) { return (A.m_crop_offset == B.m_crop_offset && A.m_distorted_image_size == B.m_distorted_image_size && A.m_distorted_crop_size == B.m_distorted_crop_size && A.m_undistorted_size == B.m_undistorted_size && A.m_distorted_half_size == B.m_distorted_half_size && A.m_focal_length == B.m_focal_length && A.m_optical_offset == B.m_optical_offset && A.m_distortion_coeffs == B.m_distortion_coeffs && A.m_distortion_type == B.m_distortion_type && A.m_distortion_precalc1 == B.m_distortion_precalc1 && A.m_distortion_precalc2 == B.m_distortion_precalc2 && A.m_distortion_precalc3 == B.m_distortion_precalc3); } // Make this public to not have to use set and get functions DistortionType m_distortion_type; private: // Converts UNDISTORTED_C to DISTORTED_C void DistortCentered(Eigen::Vector2d const& undistorted_c, Eigen::Vector2d* distorted_c) const; // Converts DISTORTED_C to UNDISTORTED_C void UndistortCentered(Eigen::Vector2d const& distorted_c, Eigen::Vector2d* undistorted_c) const; // Members Eigen::Vector2i m_crop_offset; // Start of DISTORTED in RAW frame Eigen::Vector2i m_distorted_image_size; // Applies to DISTORTED, DISTORTED_C // Domain of validity of distortion model (normally all image). // Centered at the image center. Eigen::Vector2i m_distorted_crop_size; // Applies to UNDISTORTED, UNDISTORTED_C, this is bigger than distorted image // size because we need to expand the sensor to capture the unravelling from // lens distortion removal. Eigen::Vector2i m_undistorted_size; Eigen::Vector2d m_distorted_half_size, m_undistorted_half_size; // Focal length, in pixels Eigen::Vector2d m_focal_length; // Optical offset in DISTORTED frame Eigen::Vector2d m_optical_offset; // Distortion coefficients are in an arbitrary sized vector. The length of // the vector tells us what lens distortion model we are using. Length 0 = // No lens distortion, ideal camera. Length 1 = FOV model, Length 4: // fisheye or TSAI/OpenCV model, Length 5 = TSAI/OpenCV model. Eigen::VectorXd m_distortion_coeffs; double m_distortion_precalc1, m_distortion_precalc2, m_distortion_precalc3; }; #define DECLARE_CONVERSION(TYPEA, TYPEB) \ template <> \ void CameraParameters::Convert<TYPEA, TYPEB>(Eigen::Vector2d const& input, Eigen::Vector2d *output) const DECLARE_CONVERSION(RAW, DISTORTED); DECLARE_CONVERSION(DISTORTED, RAW); DECLARE_CONVERSION(UNDISTORTED_C, DISTORTED_C); DECLARE_CONVERSION(UNDISTORTED_C, DISTORTED); DECLARE_CONVERSION(UNDISTORTED_C, UNDISTORTED); DECLARE_CONVERSION(UNDISTORTED, UNDISTORTED_C); DECLARE_CONVERSION(UNDISTORTED, DISTORTED); DECLARE_CONVERSION(UNDISTORTED, DISTORTED_C); DECLARE_CONVERSION(DISTORTED, DISTORTED_C); DECLARE_CONVERSION(DISTORTED_C, UNDISTORTED_C); DECLARE_CONVERSION(DISTORTED, UNDISTORTED); DECLARE_CONVERSION(DISTORTED, UNDISTORTED_C); #undef DECLARE_CONVERSION #define DECLARE_INTRINSIC(TYPE) \ template <> \ Eigen::Matrix3d CameraParameters::GetIntrinsicMatrix<TYPE>() const DECLARE_INTRINSIC(RAW); DECLARE_INTRINSIC(DISTORTED); DECLARE_INTRINSIC(DISTORTED_C); DECLARE_INTRINSIC(UNDISTORTED); DECLARE_INTRINSIC(UNDISTORTED_C); #undef DECLARE_INTRINSIC } // namespace rig #endif // ASP_RIG_CAMERA_PARAMS_H ================================================ FILE: src/asp/Rig/RigCameraUtils.cc ================================================ /* Copyright (c) 2017-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigCameraUtils.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/SystemUtils.h> #include <vw/Camera/PinholeModel.h> #include <vw/Camera/LensDistortion.h> #include <vw/Core/Exception.h> #include <vw/Core/Log.h> #include <boost/filesystem.hpp> #include <glog/logging.h> #include <Eigen/Dense> #include <string> #include <set> namespace fs = boost::filesystem; namespace rig { // Write a line of the form: name = a b c void write_param_vec(std::string const& param_name, std::ofstream & os, Eigen::VectorXd const& vals) { os << param_name << " = "; for (size_t p = 0; p < vals.size(); p++){ os << vals[p]; if (p + 1 < vals.size()) os << " "; // write a whitespace after each number except the last } os << "\n"; } // For an image like image_dir/my_cam/image.png, create the file // out_dir/image.tsai. std::string pinholeFile(std::string const& out_dir, std::string const& sensor_name, std::string const& image_file) { std::string base = fs::path(image_file).stem().string(); // Ensure that the sensor name is part of the pinhole file name, // to ensure uniqueness. if (base.find(sensor_name) == std::string::npos) base = base + "_" + sensor_name; return out_dir + "/" + sensor_name + "/" + base + ".tsai"; } // A utility for creating a pinhole camera model void createPinholeCamera(rig::CameraParameters const& cam_params, Eigen::Affine3d const& world_to_cam, vw::camera::PinholeModel& pinhole_cam) { // Go from world_to_cam to cam_to_world Eigen::MatrixXd T = world_to_cam.inverse().matrix(); vw::Matrix3x3 R; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) R(r, c) = T(r, c); vw::Vector3 C; for (int r = 0; r < 3; r++) C[r] = T(r, 3); double fu = cam_params.GetFocalVector()[0]; double fv = cam_params.GetFocalVector()[1]; double cu = cam_params.GetOpticalOffset()[0]; double cv = cam_params.GetOpticalOffset()[1]; auto dist = cam_params.GetDistortion(); boost::shared_ptr<vw::camera::LensDistortion> distortion; if (dist.size() == 0) { distortion.reset(new vw::camera::NullLensDistortion()); } else if (dist.size() == 1) { vw::Vector<double> params(dist.size()); for (int i = 0; i < dist.size(); i++) params[i] = dist[i]; distortion.reset(new vw::camera::FovLensDistortion(params)); } else if (dist.size() == 4 && cam_params.m_distortion_type == rig::FISHEYE_DISTORTION) { vw::Vector<double> params(dist.size()); for (int i = 0; i < dist.size(); i++) params[i] = dist[i]; distortion.reset(new vw::camera::FisheyeLensDistortion(params)); } else if (dist.size() == 4 || dist.size() == 5) { // Tsai distortion model always has 5 parameters vw::Vector<double> params(5); for (int i = 0; i < dist.size(); i++) params[i] = dist[i]; // If having only 4 parameters, add zero for (int i = dist.size(); i < 5; i++) params[i] = 0; distortion.reset(new vw::camera::TsaiLensDistortion(params)); } else if (dist.size() > 5 && cam_params.m_distortion_type == rig::RPC_DISTORTION) { // RPC vw::Vector<double> params(dist.size()); for (int i = 0; i < dist.size(); i++) params[i] = dist[i]; distortion.reset(new vw::camera::RPCLensDistortion(params)); } else { LOG(FATAL) << "Expecting 0, 1, 4, or 5 distortion coefficients.\n"; } // We assume the focal length and optical center are already in pixels, so the // pitch is 1.0. double pitch = 1.0; pinhole_cam = vw::camera::PinholeModel(C, R, fu, fv, cu, cv, distortion.get(), pitch); } // A utility for saving a camera in a format ASP understands void writePinholeCamera(rig::CameraParameters const& cam_params, Eigen::Affine3d const& world_to_cam, std::string const& filename) { // Go from world_to_cam to cam_to_world Eigen::MatrixXd T = world_to_cam.inverse().matrix(); // Must create the directory having the output file std::string out_dir = fs::path(filename).parent_path().string(); rig::createDir(out_dir); std::ofstream ofs(filename); ofs.precision(17); ofs << "VERSION_4\n"; ofs << "PINHOLE\n"; ofs << "fu = " << cam_params.GetFocalVector()[0] << "\n"; ofs << "fv = " << cam_params.GetFocalVector()[1] << "\n"; ofs << "cu = " << cam_params.GetOpticalOffset()[0] << "\n"; ofs << "cv = " << cam_params.GetOpticalOffset()[1] << "\n"; ofs << "u_direction = 1 0 0\n"; ofs << "v_direction = 0 1 0\n"; ofs << "w_direction = 0 0 1\n"; ofs << "C = " << T(0, 3) << ' ' << T(1, 3) << ' ' << T(2, 3) << "\n"; ofs << "R = " << T(0, 0) << ' ' << T(0, 1) << ' ' << T(0, 2) << ' ' << T(1, 0) << ' ' << T(1, 1) << ' ' << T(1, 2) << ' ' << T(2, 0) << ' ' << T(2, 1) << ' ' << T(2, 2) << "\n"; // We assume the focal length and optical center are already in pixels, so the // pitch is 1.0. ofs << "pitch = 1\n"; auto dist = cam_params.GetDistortion(); // Dist size is 0, 1, 4, or 5 if (dist.size() == 0) { ofs << "NULL\n"; } else if (dist.size() == 1) { ofs << "FOV\n"; ofs << "k1 = " << dist[0] << "\n"; } else if (dist.size() == 4 && cam_params.m_distortion_type == rig::FISHEYE_DISTORTION) { ofs << "FISHEYE\n"; ofs << "k1 = " << dist[0] << "\n"; ofs << "k2 = " << dist[1] << "\n"; ofs << "k3 = " << dist[2] << "\n"; ofs << "k4 = " << dist[3] << "\n"; } else if (dist.size() == 4 || dist.size() == 5) { ofs << "TSAI\n"; ofs << "k1 = " << dist[0] << "\n"; ofs << "k2 = " << dist[1] << "\n"; ofs << "p1 = " << dist[2] << "\n"; ofs << "p2 = " << dist[3] << "\n"; if (dist.size() > 4) ofs << "k3 = " << dist[4] << "\n"; } else if (dist.size() > 5 && cam_params.m_distortion_type == rig::RPC_DISTORTION) { // RPC ofs << "RPC\n"; Eigen::VectorXd num_x, den_x, num_y, den_y; rig::unpack_params(dist, num_x, den_x, num_y, den_y); rig::prepend_1(den_x); rig::prepend_1(den_y); write_param_vec("distortion_num_x", ofs, num_x); write_param_vec("distortion_den_x", ofs, den_x); write_param_vec("distortion_num_y", ofs, num_y); write_param_vec("distortion_den_y", ofs, den_y); } else { LOG(FATAL) << "Expecting 0, 1, 4, or 5 distortion coefficients.\n"; } ofs.close(); } // Save the optimized cameras in ASP's Pinhole format. void writePinholeCameras(std::vector<std::string> const& cam_names, std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, std::string const& out_dir) { // Sanity checks if (world_to_cam.size() != cams.size()) LOG(FATAL) << "Expecting as many world-to-camera transforms as cameras.\n"; std::string pinhole_dir = out_dir + "/pinhole"; std::cout << "Writing pinhole cameras to: " << pinhole_dir << std::endl; std::vector<std::string> pinholeCamFiles; for (size_t cid = 0; cid < cams.size(); cid++) { std::string const& image_file = cams[cid].image_name; int cam_type = cams[cid].camera_type; std::string sensor_name = cam_names[cam_type]; std::string camFile = pinholeFile(pinhole_dir, sensor_name, image_file); rig::writePinholeCamera(cam_params[cam_type], world_to_cam[cid], camFile); pinholeCamFiles.push_back(camFile); } // Must ensure that all camera names without directory are unique std::set<std::string> base_names; for (size_t it = 0; it < pinholeCamFiles.size(); it++) { std::string base_name = fs::path(pinholeCamFiles[it]).filename().string(); if (base_names.find(base_name) != base_names.end()) LOG(FATAL) << "Non-unique camera name (without directory): " << base_name << ". It will not be possible to use these cameras with bundle_adjust.\n"; base_names.insert(base_name); } // Also save their list. Useful for bundle adjustment. std::string camera_list = out_dir + "/camera_list.txt"; std::string dir = fs::path(camera_list).parent_path().string(); rig::createDir(dir); std::cout << "Writing: " << camera_list << std::endl; std::ofstream ofs(camera_list.c_str()); for (size_t it = 0; it < pinholeCamFiles.size(); it++) ofs << pinholeCamFiles[it] << "\n"; ofs.close(); return; } // Calculate camera center and ray direction in world coordinates from a distorted pixel void calcCamCtrDir(rig::CameraParameters const& cam_params, Eigen::Vector2d const& dist_pix, Eigen::Affine3d const& world_to_cam, // Output Eigen::Vector3d& cam_ctr, Eigen::Vector3d& world_ray) { // Undistort the pixel Eigen::Vector2d undist_centered_pix; cam_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C>(dist_pix, &undist_centered_pix); // Ray from camera going through the undistorted and centered pixel Eigen::Vector3d cam_ray(undist_centered_pix.x() / cam_params.GetFocalVector()[0], undist_centered_pix.y() / cam_params.GetFocalVector()[1], 1.0); cam_ray.normalize(); Eigen::Affine3d cam_to_world = world_to_cam.inverse(); world_ray = cam_to_world.linear() * cam_ray; cam_ctr = cam_to_world.translation(); } } // end namespace rig ================================================ FILE: src/asp/Rig/RigCameraUtils.h ================================================ /* Copyright (c) 2017-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_CAMERA_UTILS_H #define ASP_RIG_CAMERA_UTILS_H #include <Eigen/Core> #include <Eigen/Geometry> #include <string> #include <vector> #include <algorithm> // forward decl namespace vw { namespace camera { class PinholeModel; }} // namespace vw::camera namespace rig { class CameraParameters; class cameraImage; // A utility for creating a pinhole camera model void createPinholeCamera(rig::CameraParameters const& cam_params, Eigen::Affine3d const& world_to_cam, vw::camera::PinholeModel& pinhole_cam); // A utility for saving a camera in a format ASP understands. For now do not save // the distortion. void writePinholeCamera(rig::CameraParameters const& cam_params, Eigen::Affine3d const& world_to_cam, std::string const& filename); // Save the optimized cameras in ASP's Pinhole format. For now do not save // the distortion model. void writePinholeCameras(std::vector<std::string> const& cam_names, std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, std::string const& out_dir); // Calculate camera center and ray direction in world coordinates from a distorted pixel void calcCamCtrDir(rig::CameraParameters const& cam_params, Eigen::Vector2d const& dist_pix, Eigen::Affine3d const& world_to_cam, // Output Eigen::Vector3d& cam_ctr, Eigen::Vector3d& world_ray); } // namespace rig #endif // ASP_RIG_CAMERA_UTILS_H ================================================ FILE: src/asp/Rig/RigConfig.cc ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigConfig.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/SystemUtils.h> #include <vw/Core/Log.h> #include <vw/Core/Exception.h> #include <opencv2/calib3d.hpp> #include <boost/filesystem.hpp> #include <iostream> #include <set> #include <fstream> #include <iomanip> namespace fs = boost::filesystem; namespace rig { void RigSet::validate() const { if (cam_set.empty()) vw::vw_throw(vw::IOErr() << "Found an empty set of rigs.\n"); size_t num_cams = 0; std::set<std::string> all_cams; // checks for duplicates for (size_t rig_it = 0; rig_it < cam_set.size(); rig_it++) { if (cam_set[rig_it].empty()) vw::vw_throw(vw::IOErr() << "Found a rig with no cams.\n"); num_cams += cam_set[rig_it].size(); for (size_t cam_it = 0; cam_it < cam_set[rig_it].size(); cam_it++) all_cams.insert(cam_set[rig_it][cam_it]); } if (num_cams != all_cams.size() || num_cams != cam_names.size()) vw::vw_throw(vw::IOErr() << "Found a duplicate sensor name in the rig set.\n"); if (num_cams != ref_to_cam_trans.size()) vw::vw_throw(vw::IOErr() << "Number of sensors is not equal to number of ref-to-cam transforms.\n"); if (num_cams != depth_to_image.size()) vw::vw_throw(vw::IOErr() << "Number of sensors is not equal to number of depth-to-image " << "transforms.\n"); if (num_cams != ref_to_cam_timestamp_offsets.size()) vw::vw_throw(vw::IOErr() << "Number of sensors is not equal to number of ref-to-cam " << "timestamp offsets.\n"); if (num_cams != cam_params.size()) vw::vw_throw(vw::IOErr() << "Number of sensors is not equal to number of camera models.\n"); for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) { if (isRefSensor(cam_names[cam_it]) && ref_to_cam_timestamp_offsets[cam_it] != 0) vw::vw_throw(vw::IOErr() << "The timestamp offsets for the reference sensors must be always 0.\n"); } for (size_t i = 0; i < this->cam_params.size(); i++) { auto const& params = this->cam_params[i]; if (params.GetDistortedSize()[0] <= 1 || params.GetDistortedSize()[1] <= 1) vw::vw_throw(vw::IOErr() << "The image size must be at least 2 x 2.\n"); if (params.GetFocalLength() == 0) vw::vw_throw(vw::IOErr() << "The focal length must be non-zero.\n"); } for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) { if (isRefSensor(cam_names[cam_it]) && ref_to_cam_trans[cam_it].matrix() != Eigen::Affine3d::Identity().matrix()) vw::vw_throw(vw::IOErr() << "The transform from the reference sensor to itself must be the identity.\n"); } } // We assume the first encountered sensor is the ref sensor. This is enforced // on reading the rig. bool RigSet::isRefSensor(std::string const& cam_name) const { for (size_t rig_it = 0; rig_it < cam_set.size(); rig_it++) if (cam_set[rig_it][0] == cam_name) return true; return false; } // A ref sensor is the first sensor on each rig bool RigSet::isRefSensor(int cam_id) const { return isRefSensor(cam_names[cam_id]); } // Return the id of the rig given the index of the sensor // in cam_names. int RigSet::rigId(int cam_id) const { if (cam_id < 0 || cam_id >= cam_names.size()) vw::vw_throw(vw::IOErr() << "Out of bounds sensor id.\n"); std::string cam_name = cam_names[cam_id]; for (size_t rig_it = 0; rig_it < cam_set.size(); rig_it++) { for (size_t cam_it = 0; cam_it < cam_set[rig_it].size(); cam_it++) { if (cam_set[rig_it][cam_it] == cam_name) { return rig_it; } } } // Should not arrive here vw::vw_throw(vw::IOErr() << "Could not look up in the rig the sensor: " << cam_name << "\n"); return -1; } // The name of the ref sensor for the rig having the given sensor id. We assume // the first encountered sensor is the ref sensor. This is enforced on reading // the rig. std::string RigSet::refSensor(int cam_id) const { return cam_set[rigId(cam_id)][0]; } // Index in the list of sensors of the sensor with given name int RigSet::sensorIndex(std::string const& sensor_name) const { auto it = std::find(cam_names.begin(), cam_names.end(), sensor_name); if (it == cam_names.end()) vw::vw_throw(vw::IOErr() << "Could not find sensor in rig. That is unexpected. Offending sensor: " << sensor_name << ".\n"); return it - cam_names.begin(); } // Given the id of a sensor, find the id of the ref sensor for the rig // having this sensor int RigSet::refSensorId(int cam_id) const { return sensorIndex(refSensor(cam_id)); } // Create a rig set having a single rig RigSet RigSet::subRig(int rig_id) const { if (rig_id < 0 || rig_id >= cam_set.size()) vw::vw_throw(vw::IOErr() << "Out of range in rig set.\n"); RigSet sub_rig; sub_rig.cam_set.push_back(cam_set[rig_id]); // Add the relevant portion of each rig member for (size_t subrig_it = 0; subrig_it < cam_set[rig_id].size(); subrig_it++) { std::string sensor_name = cam_set[rig_id][subrig_it]; int rig_index = sensorIndex(sensor_name); sub_rig.cam_names.push_back(cam_names[rig_index]); sub_rig.ref_to_cam_trans.push_back(ref_to_cam_trans[rig_index]); sub_rig.depth_to_image.push_back(depth_to_image[rig_index]); sub_rig.ref_to_cam_timestamp_offsets.push_back(ref_to_cam_timestamp_offsets[rig_index]); sub_rig.cam_params.push_back(cam_params[rig_index]); } sub_rig.validate(); return sub_rig; } // Save the optimized rig configuration void writeRigConfig(std::string const& rig_config, bool model_rig, RigSet const& R) { R.validate(); // Ensure that the output directory exists std::string out_dir = fs::path(rig_config).parent_path().string(); rig::createDir(out_dir); vw::vw_out() << "Writing: " << rig_config << "\n"; std::ofstream f; f.open(rig_config.c_str(), std::ios::binary | std::ios::out); if (!f.is_open()) vw::vw_throw(vw::IOErr() << "Cannot open file for writing: " << rig_config << "\n"); f.precision(17); for (size_t cam_type = 0; cam_type < R.cam_params.size(); cam_type++) { if (R.isRefSensor(R.cam_names[cam_type])) { if (cam_type > 0) f << "\n"; // add an empty line for clarity f << "ref_sensor_name: " << R.cam_names[cam_type] << "\n"; } f << "\n"; f << "sensor_name: " << R.cam_names[cam_type] << "\n"; f << "focal_length: " << R.cam_params[cam_type].GetFocalLength() << "\n"; Eigen::Vector2d c = R.cam_params[cam_type].GetOpticalOffset(); f << "optical_center: " << c[0] << " " << c[1] << "\n"; Eigen::VectorXd D = R.cam_params[cam_type].GetDistortion(); f << "distortion_coeffs: "; for (int d = 0; d < D.size(); d++) { f << D[d]; if (d + 1 < D.size()) f << " "; } f << "\n"; auto dist_type = R.cam_params[cam_type].m_distortion_type; if (D.size() == 0 && dist_type == rig::NO_DISTORTION) f << "distortion_type: " << rig::NO_DISTORTION_STR << "\n"; else if (D.size() == 1 && dist_type == rig::FOV_DISTORTION) f << "distortion_type: " << rig::FOV_DISTORTION_STR << "\n"; // Both fisheye and radtan distortion can have 4 coefficients else if (D.size() == 4 && dist_type == rig::FISHEYE_DISTORTION) f << "distortion_type: " << rig::FISHEYE_DISTORTION_STR << "\n"; else if (D.size() >= 4 && D.size() <= 5 && dist_type == rig::RADTAN_DISTORTION) f << "distortion_type: " << rig::RADTAN_DISTORTION_STR << "\n"; else if (D.size() > 5 && dist_type == rig::RPC_DISTORTION) f << "distortion_type: " << rig::RPC_DISTORTION_STR << "\n"; else vw::vw_throw(vw::IOErr() << "Expecting 0, 1, 4, 5, or more distortion coefficients. Got: " << D.size() << ".\n"); Eigen::Vector2i image_size = R.cam_params[cam_type].GetDistortedSize(); f << "image_size: " << image_size[0] << ' ' << image_size[1] << "\n"; Eigen::Vector2i distorted_crop_size = R.cam_params[cam_type].GetDistortedCropSize(); f << "distorted_crop_size: " << distorted_crop_size[0] << ' ' << distorted_crop_size[1] << "\n"; Eigen::Vector2i undist_size = R.cam_params[cam_type].GetUndistortedSize(); f << "undistorted_image_size: " << undist_size[0] << ' ' << undist_size[1] << "\n"; Eigen::Affine3d T; if (model_rig) T = R.ref_to_cam_trans[cam_type]; else T = Eigen::Affine3d::Identity(); // write something valid f << "ref_to_sensor_transform: " << rig::affineToStr(T) << "\n"; f << "depth_to_image_transform: " << rig::affineToStr(R.depth_to_image[cam_type]) << "\n"; f << "ref_to_sensor_timestamp_offset: " << R.ref_to_cam_timestamp_offsets[cam_type] << "\n"; } f.close(); } // Read real values after given tag. Ignore comments, so any line starting // with #, and empty lines. If desired_num_vals >=0, validate that we // read the desired number. void readConfigVals(std::ifstream & f, std::string const& tag, int desired_num_vals, Eigen::VectorXd & vals) { // Clear the output vals.resize(0); std::vector<double> local_vals; // std::vector has push_back() std::string line; while (getline(f, line)) { // Remove everything after any point sign bool have_comment = (line.find('#') != line.npos); if (have_comment) { std::string new_line; for (size_t c = 0; c < line.size(); c++) { if (line[c] == '#') break; // got to the pound sign new_line += line[c]; } line = new_line; } // Here must remove anything after the pound sign if (line.empty() || line[0] == '#') continue; // Remove commas that occasionally appear in the file for (size_t c = 0; c < line.size(); c++) { if (line[c] == ',') line[c] = ' '; } std::istringstream iss(line); std::string token; iss >> token; std::string val; while (iss >> val) local_vals.push_back(atof(val.c_str())); if (token == "") continue; // likely just whitespace is present on the line if (token != tag) vw::vw_throw(vw::IOErr() << "Could not read value for: " << tag << "\n"); // Copy to Eigen::VectorXd vals.resize(local_vals.size()); for (int it = 0; it < vals.size(); it++) vals[it] = local_vals[it]; if (desired_num_vals >= 0 && vals.size() != desired_num_vals) vw::vw_throw(vw::IOErr() << "Read an incorrect number of values for: " << tag << "\n"); return; } vw::vw_throw(vw::IOErr() << "Could not read value for: " << tag << "\n"); } // Read strings separated by spaces after given tag. Ignore comments, so any line starting // with #, and empty lines. If desired_num_vals >=0, validate that we // read the desired number. void readConfigVals(std::ifstream & f, std::string const& tag, int desired_num_vals, std::vector<std::string> & vals) { // Clear the output vals.resize(0); std::string line; while (getline(f, line)) { if (line.empty() || line[0] == '#') continue; std::istringstream iss(line); std::string token; iss >> token; std::string val; while (iss >> val) { vals.push_back(val); } if (token != tag) vw::vw_throw(vw::IOErr() << "Could not read value for: " << tag << "\n"); if (desired_num_vals >= 0 && vals.size() != desired_num_vals) vw::vw_throw(vw::IOErr() << "Read an incorrect number of values for: " << tag << "\n"); return; } vw::vw_throw(vw::IOErr() << "Could not read value for: " << tag << "\n"); } // Read a rig configuration. Check if the transforms among the sensors // on the rig is not 0, in that case will use it. void readRigConfig(std::string const& rig_config, bool have_rig_transforms, RigSet & R) { // To check for duplicate sensors std::set<std::string> ref_sensors, sensors; try { // Initialize the outputs R = RigSet(); // Open the file vw::vw_out() << "Reading: " << rig_config << "\n"; std::ifstream f; f.open(rig_config.c_str(), std::ios::in); if (!f.is_open()) vw::vw_throw(vw::IOErr() << "Cannot open file: " << rig_config << "\n"); int ref_sensor_count = 0; Eigen::VectorXd vals; std::vector<std::string> str_vals; // It is assumed in several places that the first encountered // sensor is the ref sensor. // Read each sensor bool is_ref_sensor = false; std::string ref_sensor_name; while (1) { int curr_pos = f.tellg(); // where we are in the file // Read the reference sensor try { readConfigVals(f, "ref_sensor_name:", 1, str_vals); ref_sensor_name = str_vals[0]; ref_sensor_count++; // found a ref sensor R.cam_set.resize(ref_sensor_count); is_ref_sensor = true; // Check for duplicate ref sensor if (ref_sensors.find(ref_sensor_name) != ref_sensors.end()) vw::vw_throw(vw::IOErr() << "Found a duplicate reference sensor: " << ref_sensor_name << "\n"); ref_sensors.insert(ref_sensor_name); } catch (...) { // No luck, go back to the line we tried to read, and continue reading other fields f.seekg(curr_pos, std::ios::beg); } try { readConfigVals(f, "sensor_name:", 1, str_vals); } catch (...) { // Likely no more sensors break; } std::string sensor_name = str_vals[0]; // The first sensor must be the ref sensor if (is_ref_sensor && sensor_name != ref_sensor_name) vw::vw_throw(vw::IOErr() << "The first sensor in each rig must be the reference sensor. " << "Check the rig configuration file.\n"); is_ref_sensor = false; // reset if (ref_sensor_name == "") vw::vw_throw(vw::IOErr() << "The reference sensor name must be the first entry in " << "the rig configuration file.\n"); // Check for duplicate sensor if (sensors.find(sensor_name) != sensors.end()) vw::vw_throw(vw::IOErr() << "Found a duplicate sensor: " << sensor_name << "\n"); sensors.insert(sensor_name); // It is convenient to store each sensor in cam_set, which has the rig set structure, // and in R.cam_names, which is enough for almost all processing. R.cam_set.back().push_back(sensor_name); R.cam_names.push_back(sensor_name); readConfigVals(f, "focal_length:", 1, vals); Eigen::Vector2d focal_length(vals[0], vals[0]); readConfigVals(f, "optical_center:", 2, vals); Eigen::Vector2d optical_center(vals[0], vals[1]); // Read distortion rig::DistortionType dist_type = rig::NO_DISTORTION; readConfigVals(f, "distortion_coeffs:", -1, vals); if (vals.size() != 0 && vals.size() != 1 && vals.size() != 4 && vals.size() < 5) vw::vw_throw(vw::IOErr() << "Expecting 0, 1, 4, 5, or more distortion coefficients.\n"); Eigen::VectorXd distortion = vals; readConfigVals(f, "distortion_type:", 1, str_vals); if (distortion.size() == 0 && str_vals[0] != rig::NO_DISTORTION_STR) vw::vw_throw(vw::IOErr() << "When there are no distortion coefficients, distortion type must be: " << rig::NO_DISTORTION_STR << "\n"); // For backward compatibility, accept rig::FISHEYE_DISTORTION_STR with 1 distortion coefficient, but use the FOV model if (distortion.size() == 1 && str_vals[0] == rig::FISHEYE_DISTORTION_STR) str_vals[0] = rig::FOV_DISTORTION_STR; // Validation if (distortion.size() == 1 && str_vals[0] != rig::FOV_DISTORTION_STR) vw::vw_throw(vw::IOErr() << "When there is 1 distortion coefficient, distortion type must be: " << rig::FOV_DISTORTION_STR << "\n"); if (distortion.size() == 4 && str_vals[0] != rig::FISHEYE_DISTORTION_STR && str_vals[0] != rig::RADTAN_DISTORTION_STR) vw::vw_throw(vw::IOErr() << "When there are 4 distortion coefficients, distortion type " << "must be: " << rig::FISHEYE_DISTORTION_STR << " or " << rig::RADTAN_DISTORTION_STR << "\n"); if (distortion.size() == 5 && str_vals[0] != rig::RADTAN_DISTORTION_STR) vw::vw_throw(vw::IOErr() << "When there are 5 distortion coefficient, distortion type must be: " << rig::RADTAN_DISTORTION_STR << "\n"); if ((distortion.size() > 5) && str_vals[0] != rig::RPC_DISTORTION_STR) vw::vw_throw(vw::IOErr() << "When there are more than 5 distortion coefficients, distortion " << "type must be: " << rig::RPC_DISTORTION_STR << "\n"); // Set distortion type based on str_vals[0] if (str_vals[0] == rig::NO_DISTORTION_STR) dist_type = rig::NO_DISTORTION; else if (str_vals[0] == rig::FOV_DISTORTION_STR) dist_type = rig::FOV_DISTORTION; else if (str_vals[0] == rig::FISHEYE_DISTORTION_STR) dist_type = rig::FISHEYE_DISTORTION; else if (str_vals[0] == rig::RADTAN_DISTORTION_STR) dist_type = rig::RADTAN_DISTORTION; else if (str_vals[0] == rig::RPC_DISTORTION_STR) dist_type = rig::RPC_DISTORTION; else vw::vw_throw(vw::IOErr() << "Unknown distortion type: " << str_vals[0] << "\n"); readConfigVals(f, "image_size:", 2, vals); Eigen::Vector2i image_size(vals[0], vals[1]); readConfigVals(f, "distorted_crop_size:", 2, vals); Eigen::Vector2i distorted_crop_size(vals[0], vals[1]); readConfigVals(f, "undistorted_image_size:", 2, vals); Eigen::Vector2i undistorted_image_size(vals[0], vals[1]); rig::CameraParameters params(image_size, focal_length, optical_center, distortion, dist_type); params.SetDistortedCropSize(distorted_crop_size); params.SetUndistortedSize(undistorted_image_size); R.cam_params.push_back(params); readConfigVals(f, "ref_to_sensor_transform:", 12, vals); R.ref_to_cam_trans.push_back(vecToAffine(vals)); // Sanity check if (have_rig_transforms) { if (R.ref_to_cam_trans.back().matrix() == 0 * R.ref_to_cam_trans.back().matrix()) vw::vw_throw(vw::IOErr() << "Failed to read valid transforms between the sensors on the rig\n"); // Put a warning if the transform is the identity matrix if the sensor // is not the ref one if (sensor_name != ref_sensor_name && R.ref_to_cam_trans.back().matrix() == Eigen::Affine3d::Identity().matrix()) vw::vw_out(vw::WarningMessage) << "A non-reference sensor on the rig has the identity as the " << "sensor transform. Sensor name: " << sensor_name << "\n"; // The determinant of the transform must be 1. double scale = pow(R.ref_to_cam_trans.back().linear().determinant(), 1.0 / 3.0); if (std::abs(scale - 1.0) > 1e-6) vw::vw_throw(vw::IOErr() << "The determinant of the ref-to-sensor transform must be 1.\n"); } readConfigVals(f, "depth_to_image_transform:", 12, vals); R.depth_to_image.push_back(vecToAffine(vals)); readConfigVals(f, "ref_to_sensor_timestamp_offset:", 1, vals); double timestamp_offset = vals[0]; R.ref_to_cam_timestamp_offsets.push_back(timestamp_offset); } } catch(std::exception const& e) { vw::vw_throw(vw::IOErr() << e.what() << "\n"); } R.validate(); return; } } // end namespace rig ================================================ FILE: src/asp/Rig/RigConfig.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_RIG_CONFIG_H #define ASP_RIG_RIG_CONFIG_H // A structure to hold info about a set of rigs #include <asp/Rig/RigCameraParams.h> #include <Eigen/Geometry> #include <map> #include <vector> namespace rig { struct RigSet { // For rig i, cam_set[i] will list the sensor/camera names in that rig. // cam_set[i][0] is the reference sensor. All sensor // names are unique. For convenience, this is also duplicated // as 'cam_names', where all sensors are concatenated. That vector // is often more convenient. std::vector<std::vector<std::string>> cam_set; // Must be in one-to-one correspondence with all vectors below. std::vector<std::string> cam_names; // A transform from a reference sensor to a sensor in the rig // (including to itself, that's the identity transform). This // concatenates all such transforms for all rigs, in the order // given by concatenating cam_set[0], cam_set[1], etc. std::vector<Eigen::Affine3d> ref_to_cam_trans; // Depth-to-image transform for each sensor. It is the identity // if there are no depth transforms. One per sensor. All // concatenated. std::vector<Eigen::Affine3d> depth_to_image; // The value to add to each ref sensor time to get a given sensor // time. One per sensor. All concatenated. std::vector<double> ref_to_cam_timestamp_offsets; // Each sensor's intrinsics. All concatenated. std::vector<rig::CameraParameters> cam_params; // If this sensor is a reference sensor for one of the rig. bool isRefSensor(std::string const& sensor_name) const; // If this sensor is a reference sensor for one of the rig. bool isRefSensor(int cam_id) const; // Return the id of the rig given the index of the camera // in cam_names. int rigId(int cam_id) const; // The name of the ref sensor for the rig having the given sensor id std::string refSensor(int cam_id) const; // Index in the list of sensors of the sensor with given name int sensorIndex(std::string const& sensor_name) const; // Given the id of a sensor, find the id of the ref sensor for the rig // having this sensor int refSensorId(int cam_id) const; // Create a rig set having a single rig RigSet subRig(int rig_id) const; // Sanity checks void validate() const; }; // Save the optimized rig configuration void writeRigConfig(std::string const& out_dir, bool model_rig, RigSet const& R); // Read a rig configuration. Check if the transforms among the sensors // on the rig is not 0, in that case will use it. void readRigConfig(std::string const& rig_config, bool have_rig_transforms, RigSet & R); } // end namespace rig #endif // ASP_RIG_RIG_CONFIG_H ================================================ FILE: src/asp/Rig/RigCostFunction.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/RigCostFunction.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/ImageLookup.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/RigUtils.h> #include <iostream> #include <iomanip> namespace rig { // If applicable, set up the parameters block to fix the rig translations and/or rotations void setUpFixRigOptions(bool no_rig, bool fix_rig_translations, bool fix_rig_rotations, ceres::SubsetManifold*& constant_transform_manifold) { constant_transform_manifold = NULL; int beg = 0, end = 0; if (!no_rig && fix_rig_translations) { beg = 0; end = 3; } if (!no_rig && fix_rig_rotations) { if (!fix_rig_translations) beg = 3; // only fix rotation end = rig::NUM_RIGID_PARAMS; } // Make a vector that goes from beg to end with increment 1 std::vector<int> fixed_indices; for (int it = beg; it < end; it++) fixed_indices.push_back(it); if (!fixed_indices.empty()) constant_transform_manifold = new ceres::SubsetManifold(rig::NUM_RIGID_PARAMS, fixed_indices); } ceres::LossFunction* GetLossFunction(std::string cost_fun, double th) { // Convert to lower-case std::transform(cost_fun.begin(), cost_fun.end(), cost_fun.begin(), ::tolower); ceres::LossFunction* loss_function = NULL; if (cost_fun == "l2") loss_function = NULL; else if (cost_fun == "huber") loss_function = new ceres::HuberLoss(th); else if (cost_fun == "cauchy") loss_function = new ceres::CauchyLoss(th); else if (cost_fun == "l1") loss_function = new ceres::SoftLOneLoss(th); else LOG(FATAL) << "Unknown cost function: " + cost_fun; return loss_function; } BracketedCamError::BracketedCamError(Eigen::Vector2d const& meas_dist_pix, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes, rig::CameraParameters const& cam_params): m_meas_dist_pix(meas_dist_pix), m_left_ref_stamp(left_ref_stamp), m_right_ref_stamp(right_ref_stamp), m_cam_stamp(cam_stamp), m_block_sizes(block_sizes), m_cam_params(cam_params), m_num_focal_lengths(1) { // Sanity check if (m_block_sizes.size() != 8 || m_block_sizes[0] != NUM_RIGID_PARAMS || m_block_sizes[1] != NUM_RIGID_PARAMS || m_block_sizes[2] != NUM_RIGID_PARAMS || m_block_sizes[3] != NUM_XYZ_PARAMS || m_block_sizes[4] != NUM_SCALAR_PARAMS || m_block_sizes[5] != m_num_focal_lengths || m_block_sizes[6] != NUM_OPT_CTR_PARAMS || m_block_sizes[7] != 1) { // This will be overwritten shortly LOG(FATAL) << "BracketedCamError: The block sizes were not set up properly.\n"; } // Set the correct distortion size. This cannot be done in the interface for now. m_block_sizes[7] = m_cam_params.GetDistortion().size(); } // Call to work with ceres::DynamicNumericDiffCostFunction. bool BracketedCamError::operator()(double const* const* parameters, double* residuals) const { Eigen::Affine3d world_to_cam_trans = calcWorldToCamBase(parameters[0], // beg_world_to_ref_t parameters[1], // end_world_to_ref_t parameters[2], // ref_to_cam_trans m_left_ref_stamp, m_right_ref_stamp, parameters[4][0], // ref_to_cam_offset m_cam_stamp); // World point Eigen::Vector3d X(parameters[3][0], parameters[3][1], parameters[3][2]); // Make a deep copy which we will modify rig::CameraParameters cam_params = m_cam_params; Eigen::Vector2d focal_vector = Eigen::Vector2d(parameters[5][0], parameters[5][0]); Eigen::Vector2d optical_center(parameters[6][0], parameters[6][1]); Eigen::VectorXd distortion(m_block_sizes[7]); for (int i = 0; i < m_block_sizes[7]; i++) distortion[i] = parameters[7][i]; cam_params.SetFocalLength(focal_vector); cam_params.SetOpticalOffset(optical_center); cam_params.SetDistortion(distortion); // Convert world point to given cam coordinates X = world_to_cam_trans * X; // Project into the image Eigen::Vector2d undist_pix = cam_params.GetFocalVector().cwiseProduct(X.hnormalized()); Eigen::Vector2d curr_dist_pix; cam_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED> (undist_pix, &curr_dist_pix); // Compute the residuals residuals[0] = curr_dist_pix[0] - m_meas_dist_pix[0]; residuals[1] = curr_dist_pix[1] - m_meas_dist_pix[1]; return true; } // Factory to hide the construction of the CostFunction object from the client code. ceres::CostFunction* BracketedCamError::Create(Eigen::Vector2d const& meas_dist_pix, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes, rig::CameraParameters const& cam_params) { ceres::DynamicNumericDiffCostFunction<BracketedCamError>* cost_function = new ceres::DynamicNumericDiffCostFunction<BracketedCamError> (new BracketedCamError(meas_dist_pix, left_ref_stamp, right_ref_stamp, cam_stamp, block_sizes, cam_params)); cost_function->SetNumResiduals(NUM_PIX_PARAMS); // The camera wrapper knows all of the block sizes to add, except // for distortion, which is last for (size_t i = 0; i + 1 < block_sizes.size(); i++) // note the i + 1 cost_function->AddParameterBlock(block_sizes[i]); // The distortion block size is added separately as it is variable cost_function->AddParameterBlock(cam_params.GetDistortion().size()); return cost_function; } BracketedDepthError::BracketedDepthError(double weight, Eigen::Vector3d const& meas_depth_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes): m_weight(weight), m_meas_depth_xyz(meas_depth_xyz), m_left_ref_stamp(left_ref_stamp), m_right_ref_stamp(right_ref_stamp), m_cam_stamp(cam_stamp), m_block_sizes(block_sizes) { // Sanity check if (m_block_sizes.size() != 7 || m_block_sizes[0] != NUM_RIGID_PARAMS || m_block_sizes[1] != NUM_RIGID_PARAMS || m_block_sizes[2] != NUM_RIGID_PARAMS || (m_block_sizes[3] != NUM_RIGID_PARAMS && m_block_sizes[3] != NUM_AFFINE_PARAMS) || m_block_sizes[4] != NUM_SCALAR_PARAMS || m_block_sizes[5] != NUM_XYZ_PARAMS || m_block_sizes[6] != NUM_SCALAR_PARAMS) { LOG(FATAL) << "BracketedDepthError: The block sizes were not set up properly.\n"; } } // Call to work with ceres::DynamicNumericDiffCostFunction. bool BracketedDepthError::operator()(double const* const* parameters, double* residuals) const { // Current world to camera transform Eigen::Affine3d world_to_cam_trans = calcWorldToCamBase(parameters[0], // beg_world_to_ref_t parameters[1], // end_world_to_ref_t parameters[2], // ref_to_cam_trans m_left_ref_stamp, m_right_ref_stamp, parameters[6][0], // ref_to_cam_offset m_cam_stamp); // The current transform from the depth point cloud to the camera image Eigen::Affine3d depth_to_image; if (m_block_sizes[3] == NUM_AFFINE_PARAMS) array_to_affine_transform(depth_to_image, parameters[3]); else array_to_rigid_transform(depth_to_image, parameters[3]); // Apply the scale double depth_to_image_scale = parameters[4][0]; depth_to_image.linear() *= depth_to_image_scale; // Convert from depth cloud coordinates to cam coordinates Eigen::Vector3d M = depth_to_image * m_meas_depth_xyz; // Convert to world coordinates M = world_to_cam_trans.inverse() * M; // Triangulated world point Eigen::Vector3d X(parameters[5][0], parameters[5][1], parameters[5][2]); // Compute the residuals for (size_t it = 0; it < NUM_XYZ_PARAMS; it++) { residuals[it] = m_weight * (X[it] - M[it]); } return true; } // Factory to hide the construction of the CostFunction object from the client code. ceres::CostFunction* BracketedDepthError::Create(double weight, Eigen::Vector3d const& meas_depth_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes) { ceres::DynamicNumericDiffCostFunction<BracketedDepthError>* cost_function = new ceres::DynamicNumericDiffCostFunction<BracketedDepthError> (new BracketedDepthError(weight, meas_depth_xyz, left_ref_stamp, right_ref_stamp, cam_stamp, block_sizes)); // The residual size is always the same. cost_function->SetNumResiduals(NUM_XYZ_PARAMS); for (size_t i = 0; i < block_sizes.size(); i++) cost_function->AddParameterBlock(block_sizes[i]); return cost_function; } BracketedDepthMeshError::BracketedDepthMeshError(double weight, Eigen::Vector3d const& meas_depth_xyz, Eigen::Vector3d const& mesh_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes): m_weight(weight), m_meas_depth_xyz(meas_depth_xyz), m_mesh_xyz(mesh_xyz), m_left_ref_stamp(left_ref_stamp), m_right_ref_stamp(right_ref_stamp), m_cam_stamp(cam_stamp), m_block_sizes(block_sizes) { // Sanity check if (m_block_sizes.size() != 6 || m_block_sizes[0] != NUM_RIGID_PARAMS || m_block_sizes[1] != NUM_RIGID_PARAMS || m_block_sizes[2] != NUM_RIGID_PARAMS || (m_block_sizes[3] != NUM_RIGID_PARAMS && m_block_sizes[3] != NUM_AFFINE_PARAMS) || m_block_sizes[4] != NUM_SCALAR_PARAMS || m_block_sizes[5] != NUM_SCALAR_PARAMS) { LOG(FATAL) << "BracketedDepthMeshError: The block sizes were not set up properly.\n"; } } // Call to work with ceres::DynamicNumericDiffCostFunction. bool BracketedDepthMeshError::operator()(double const* const* parameters, double* residuals) const { // Current world to camera transform Eigen::Affine3d world_to_cam_trans = calcWorldToCamBase(parameters[0], // beg_world_to_ref_t parameters[1], // end_world_to_ref_t parameters[2], // ref_to_cam_trans m_left_ref_stamp, m_right_ref_stamp, parameters[5][0], // ref_to_cam_offset m_cam_stamp); // The current transform from the depth point cloud to the camera image Eigen::Affine3d depth_to_image; if (m_block_sizes[3] == NUM_AFFINE_PARAMS) array_to_affine_transform(depth_to_image, parameters[3]); else array_to_rigid_transform(depth_to_image, parameters[3]); // Apply the scale double depth_to_image_scale = parameters[4][0]; depth_to_image.linear() *= depth_to_image_scale; // Convert from depth cloud coordinates to cam coordinates Eigen::Vector3d M = depth_to_image * m_meas_depth_xyz; // Convert to world coordinates M = world_to_cam_trans.inverse() * M; // Compute the residuals for (size_t it = 0; it < NUM_XYZ_PARAMS; it++) { residuals[it] = m_weight * (m_mesh_xyz[it] - M[it]); } return true; } // Factory to hide the construction of the CostFunction object from the client code. ceres::CostFunction* BracketedDepthMeshError::Create(double weight, Eigen::Vector3d const& meas_depth_xyz, Eigen::Vector3d const& mesh_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes) { ceres::DynamicNumericDiffCostFunction<BracketedDepthMeshError>* cost_function = new ceres::DynamicNumericDiffCostFunction<BracketedDepthMeshError> (new BracketedDepthMeshError(weight, meas_depth_xyz, mesh_xyz, left_ref_stamp, right_ref_stamp, cam_stamp, block_sizes)); // The residual size is always the same. cost_function->SetNumResiduals(NUM_XYZ_PARAMS); for (size_t i = 0; i < block_sizes.size(); i++) cost_function->AddParameterBlock(block_sizes[i]); return cost_function; } XYZError::XYZError(Eigen::Vector3d const& ref_xyz, std::vector<int> const& block_sizes, double weight): m_ref_xyz(ref_xyz), m_block_sizes(block_sizes), m_weight(weight) { // Sanity check if (m_block_sizes.size() != 1 || m_block_sizes[0] != NUM_XYZ_PARAMS) LOG(FATAL) << "XYZError: The block sizes were not set up properly.\n"; } // Call to work with ceres::DynamicNumericDiffCostFunction. // Takes array of arrays as parameters. // TODO(oalexan1): May want to use the analytical Ceres cost function bool XYZError::operator()(double const* const* parameters, double* residuals) const { // Compute the residuals for (int it = 0; it < NUM_XYZ_PARAMS; it++) residuals[it] = m_weight * (parameters[0][it] - m_ref_xyz[it]); return true; } // Factory to hide the construction of the CostFunction object from the client code. ceres::CostFunction* XYZError::Create(Eigen::Vector3d const& ref_xyz, std::vector<int> const& block_sizes, double weight) { ceres::DynamicNumericDiffCostFunction<XYZError>* cost_function = new ceres::DynamicNumericDiffCostFunction<XYZError> (new XYZError(ref_xyz, block_sizes, weight)); // The residual size is always the same cost_function->SetNumResiduals(NUM_XYZ_PARAMS); // The camera wrapper knows all of the block sizes to add. for (size_t i = 0; i < block_sizes.size(); i++) { cost_function->AddParameterBlock(block_sizes[i]); } return cost_function; } // This cost function is for the --height-from-dem option. Unlike XYZError, it // uses an uncertainty, rather than a weight. HeightsFromDemError::HeightsFromDemError(Eigen::Vector3d const& dem_xyz, double uncertainty): m_dem_xyz(dem_xyz), m_uncertainty(uncertainty) { } bool HeightsFromDemError::operator()(double const* const* parameters, double* residuals) const { Eigen::Vector3d tri_xyz(parameters[0][0], parameters[0][1], parameters[0][2]); // Constrain all XYZ coordinates to the DEM position (following bundle_adjust logic) for (int it = 0; it < NUM_XYZ_PARAMS; it++) residuals[it] = (tri_xyz[it] - m_dem_xyz[it]) / m_uncertainty; return true; } // Factory to hide the construction of the CostFunction object from the client code. ceres::CostFunction* HeightsFromDemError::Create(Eigen::Vector3d const& dem_xyz, double uncertainty) { ceres::DynamicNumericDiffCostFunction<HeightsFromDemError>* cost_function = new ceres::DynamicNumericDiffCostFunction<HeightsFromDemError> (new HeightsFromDemError(dem_xyz, uncertainty)); // The residual size is 3 (all XYZ coordinates constrained to DEM) cost_function->SetNumResiduals(NUM_XYZ_PARAMS); // Add the triangulated point parameter block (3 parameters: x, y, z) cost_function->AddParameterBlock(NUM_XYZ_PARAMS); return cost_function; } CamPositionErr::CamPositionErr(const double * init_world_to_cam, double uncertainty): m_uncertainty(uncertainty) { // Make a copy, as later the value at the pointer will change m_init_position = calc_cam_position(init_world_to_cam); } bool CamPositionErr::operator()(double const* const* parameters, double* residuals) const { Eigen::Vector3d curr_cam_position = calc_cam_position(parameters[0]); for (size_t p = 0; p < NUM_XYZ_PARAMS; p++) residuals[p] = (curr_cam_position[p] - m_init_position[p]) / m_uncertainty; for (size_t p = NUM_XYZ_PARAMS; p < rig::NUM_RIGID_PARAMS; p++) residuals[p] = 0; // for rotations return true; } // Factory to hide the construction of the CostFunction object from the client code. ceres::CostFunction* CamPositionErr::Create(const double * init_world_to_cam, double uncertainty) { ceres::DynamicNumericDiffCostFunction<CamPositionErr>* cost_function = new ceres::DynamicNumericDiffCostFunction<CamPositionErr> (new CamPositionErr(init_world_to_cam, uncertainty)); // The residual size is always the same cost_function->SetNumResiduals(rig::NUM_RIGID_PARAMS); // The camera wrapper knows all of the block sizes to add. // The full parameter has the rotation too. cost_function->AddParameterBlock(rig::NUM_RIGID_PARAMS); return cost_function; } } // end namespace rig ================================================ FILE: src/asp/Rig/RigCostFunction.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_COST_FUNCTION_H #define ASP_RIG_COST_FUNCTION_H #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/RigTypeDefs.h> #include <asp/Rig/RigData.h> #include <asp/Rig/RigOptions.h> #include <ceres/ceres.h> #include <ceres/dynamic_numeric_diff_cost_function.h> #include <ceres/loss_function.h> #include <Eigen/Core> #include <Eigen/Geometry> #include <vector> #include <string> namespace rig { // Forward declarations class cameraImage; class RigSet; // If applicable, set up the parameters block to fix the rig translations and/or rotations void setUpFixRigOptions(bool no_rig, bool fix_rig_translations, bool fix_rig_rotations, ceres::SubsetManifold*& constant_transform_manifold); ceres::LossFunction* GetLossFunction(std::string cost_fun, double th); // An error function minimizing the error of projecting // an xyz point into a camera that is bracketed by // two reference cameras. The precise timestamp offset // between them is also floated. struct BracketedCamError { EIGEN_MAKE_ALIGNED_OPERATOR_NEW BracketedCamError(Eigen::Vector2d const& meas_dist_pix, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes, rig::CameraParameters const& cam_params); // Call to work with ceres::DynamicNumericDiffCostFunction. bool operator()(double const* const* parameters, double* residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(Eigen::Vector2d const& meas_dist_pix, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes, rig::CameraParameters const& cam_params); private: Eigen::Vector2d m_meas_dist_pix; // Measured distorted current camera pixel double m_left_ref_stamp, m_right_ref_stamp; // left and right ref cam timestamps double m_cam_stamp; // Current cam timestamp std::vector<int> m_block_sizes; rig::CameraParameters m_cam_params; int m_num_focal_lengths; }; // End class BracketedCamError // An error function minimizing the product of a given weight and the // error between a triangulated point and a measured depth point. The // depth point needs to be transformed to world coordinates first. For // that one has to do pose interpolation. struct BracketedDepthError { EIGEN_MAKE_ALIGNED_OPERATOR_NEW BracketedDepthError(double weight, Eigen::Vector3d const& meas_depth_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes); // Call to work with ceres::DynamicNumericDiffCostFunction. bool operator()(double const* const* parameters, double* residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(double weight, Eigen::Vector3d const& meas_depth_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes); private: double m_weight; // How much weight to give to this constraint Eigen::Vector3d m_meas_depth_xyz; // Measured depth measurement double m_left_ref_stamp, m_right_ref_stamp; // left and right ref cam timestamps double m_cam_stamp; // Current cam timestamp std::vector<int> m_block_sizes; }; // End class BracketedDepthError // An error function minimizing the product of a given weight and the // error between a mesh point and a transformed measured depth point. The // depth point needs to be transformed to world coordinates first. For // that one has to do pose interpolation. struct BracketedDepthMeshError { EIGEN_MAKE_ALIGNED_OPERATOR_NEW BracketedDepthMeshError(double weight, Eigen::Vector3d const& meas_depth_xyz, Eigen::Vector3d const& mesh_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes); // Call to work with ceres::DynamicNumericDiffCostFunction. bool operator()(double const* const* parameters, double* residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(double weight, Eigen::Vector3d const& meas_depth_xyz, Eigen::Vector3d const& mesh_xyz, double left_ref_stamp, double right_ref_stamp, double cam_stamp, std::vector<int> const& block_sizes); private: double m_weight; // How much weight to give to this constraint Eigen::Vector3d m_meas_depth_xyz; // Measured depth measurement Eigen::Vector3d m_mesh_xyz; // Point on preexisting mesh double m_left_ref_stamp, m_right_ref_stamp; // left and right ref cam timestamps double m_cam_stamp; // Current cam timestamp std::vector<int> m_block_sizes; }; // End class BracketedDepthMeshError // An error function minimizing a weight times the distance from a // variable xyz point to a fixed reference xyz point. struct XYZError { EIGEN_MAKE_ALIGNED_OPERATOR_NEW XYZError(Eigen::Vector3d const& ref_xyz, std::vector<int> const& block_sizes, double weight); // Call to work with ceres::DynamicNumericDiffCostFunction. // Takes array of arrays as parameters. // TODO(oalexan1): May want to use the analytical Ceres cost function bool operator()(double const* const* parameters, double* residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(Eigen::Vector3d const& ref_xyz, std::vector<int> const& block_sizes, double weight); private: Eigen::Vector3d m_ref_xyz; // reference xyz std::vector<int> m_block_sizes; double m_weight; }; // End class XYZError /// A Ceres cost function. The residual is the difference between the initial /// position and optimized position, divided by given uncertainty. The variable /// has the rotations as well, but those are ignored. struct CamPositionErr { EIGEN_MAKE_ALIGNED_OPERATOR_NEW CamPositionErr(const double * init_world_to_cam, double uncertainty); bool operator()(double const* const* parameters, double* residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(const double * init_world_to_cam, double uncertainty); Eigen::Vector3d m_init_position; double m_uncertainty; }; /// A Ceres cost function for constraining triangulated points to DEM positions. /// The residuals are the differences between the triangulated point coordinates /// and the point projected vertically onto the DEM from that location, divided /// by the uncertainty. All three coordinates (X, Y, Z) are constrained /// following bundle_adjust logic. struct HeightsFromDemError { EIGEN_MAKE_ALIGNED_OPERATOR_NEW HeightsFromDemError(Eigen::Vector3d const& dem_xyz, double uncertainty); bool operator()(double const* const* parameters, double* residuals) const; // Factory to hide the construction of the CostFunction object from the client code. static ceres::CostFunction* Create(Eigen::Vector3d const& dem_xyz, double uncertainty); Eigen::Vector3d m_dem_xyz; double m_uncertainty; }; } // namespace rig #endif // ASP_RIG_COST_FUNCTION_H ================================================ FILE: src/asp/Rig/RigData.cc ================================================ // Structured to hold rig data for i/o and for optimization // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/RigData.h> #include <asp/Rig/TransformUtils.h> namespace rig { // Must call this before running the optimization to populate the OptState structure void toOptState(const Extrinsics& extrinsics, const RigSet& R, OptState& state, bool no_rig, bool affine_depth_to_image, int num_depth_params) { // Convert world_to_ref transforms state.world_to_ref_vec.resize(extrinsics.world_to_ref.size() * rig::NUM_RIGID_PARAMS); for (size_t cid = 0; cid < extrinsics.world_to_ref.size(); cid++) rig::rigid_transform_to_array(extrinsics.world_to_ref[cid], &state.world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]); // Convert world_to_cam transforms (only if no_rig) if (no_rig) { state.world_to_cam_vec.resize(extrinsics.world_to_cam.size() * rig::NUM_RIGID_PARAMS); for (size_t cid = 0; cid < extrinsics.world_to_cam.size(); cid++) rig::rigid_transform_to_array(extrinsics.world_to_cam[cid], &state.world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid]); } // Convert ref_to_cam transforms from R state.ref_to_cam_vec.resize(R.ref_to_cam_trans.size() * rig::NUM_RIGID_PARAMS); for (size_t cam_type = 0; cam_type < R.ref_to_cam_trans.size(); cam_type++) rig::rigid_transform_to_array(R.ref_to_cam_trans[cam_type], &state.ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type]); // Convert depth_to_image transforms from R (affine or rigid) state.depth_to_image_vec.resize(R.depth_to_image.size() * num_depth_params); for (size_t cam_type = 0; cam_type < R.depth_to_image.size(); cam_type++) { if (affine_depth_to_image) rig::affine_transform_to_array(R.depth_to_image[cam_type], &state.depth_to_image_vec[num_depth_params * cam_type]); else rig::rigid_transform_to_array(R.depth_to_image[cam_type], &state.depth_to_image_vec[num_depth_params * cam_type]); } // Copy intrinsics from R to state int num_cam_types = R.cam_names.size(); state.focal_lengths.resize(num_cam_types); state.optical_centers.resize(num_cam_types); state.distortions.resize(num_cam_types); for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { state.focal_lengths[cam_type] = R.cam_params[cam_type].GetFocalLength(); state.optical_centers[cam_type] = R.cam_params[cam_type].GetOpticalOffset(); state.distortions[cam_type] = R.cam_params[cam_type].GetDistortion(); } // Setup identity transforms for ref cam and right bracketing cam placeholders. // These need to have different pointers because CERES wants it that way. Eigen::Affine3d identity = Eigen::Affine3d::Identity(); state.ref_identity_vec.resize(rig::NUM_RIGID_PARAMS); state.right_identity_vec.resize(rig::NUM_RIGID_PARAMS); rig::rigid_transform_to_array(identity, &state.ref_identity_vec[0]); rig::rigid_transform_to_array(identity, &state.right_identity_vec[0]); } // Must all this after optimization to update the Extrinsics structure void fromOptState(const OptState& state, Extrinsics& extrinsics, RigSet& R, bool no_rig, bool affine_depth_to_image, int num_depth_params) { // Convert world_to_ref transforms size_t num_world_to_ref = state.world_to_ref_vec.size() / rig::NUM_RIGID_PARAMS; extrinsics.world_to_ref.resize(num_world_to_ref); for (size_t cid = 0; cid < num_world_to_ref; cid++) rig::array_to_rigid_transform(extrinsics.world_to_ref[cid], &state.world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]); // Convert world_to_cam transforms (only if no_rig) if (no_rig) { size_t num_world_to_cam = state.world_to_cam_vec.size() / rig::NUM_RIGID_PARAMS; extrinsics.world_to_cam.resize(num_world_to_cam); for (size_t cid = 0; cid < num_world_to_cam; cid++) rig::array_to_rigid_transform(extrinsics.world_to_cam[cid], &state.world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid]); } // Convert ref_to_cam transforms back to R size_t num_ref_to_cam = state.ref_to_cam_vec.size() / rig::NUM_RIGID_PARAMS; R.ref_to_cam_trans.resize(num_ref_to_cam); for (size_t cam_type = 0; cam_type < num_ref_to_cam; cam_type++) rig::array_to_rigid_transform(R.ref_to_cam_trans[cam_type], &state.ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type]); // Convert depth_to_image transforms back to R (affine or rigid) size_t num_depth_to_image = state.depth_to_image_vec.size() / num_depth_params; R.depth_to_image.resize(num_depth_to_image); for (size_t cam_type = 0; cam_type < num_depth_to_image; cam_type++) { if (affine_depth_to_image) rig::array_to_affine_transform(R.depth_to_image[cam_type], &state.depth_to_image_vec[num_depth_params * cam_type]); else rig::array_to_rigid_transform(R.depth_to_image[cam_type], &state.depth_to_image_vec[num_depth_params * cam_type]); } // Copy optimized intrinsics from state back to R int num_cam_types = R.cam_names.size(); for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { R.cam_params[cam_type].SetFocalLength(Eigen::Vector2d(state.focal_lengths[cam_type], state.focal_lengths[cam_type])); R.cam_params[cam_type].SetOpticalOffset(state.optical_centers[cam_type]); R.cam_params[cam_type].SetDistortion(state.distortions[cam_type]); } } } // namespace rig ================================================ FILE: src/asp/Rig/RigData.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_RIG_RIG_DATA_H__ #define __ASP_RIG_RIG_DATA_H__ #include <asp/Rig/RigConfig.h> #include <Eigen/Core> #include <Eigen/Geometry> #include <vector> // Structured to hold rig data for i/o and for optimization namespace rig { // Structured extrinsics data (human-readable, used for I/O and logic) struct Extrinsics { // Camera extrinsics as Affine3d transforms std::vector<Eigen::Affine3d> world_to_ref; std::vector<Eigen::Affine3d> world_to_cam; }; // Optimization state (flattened data for Ceres parameter blocks). Must be populated // before optimization, and data from it must be exported after optimization. struct OptState { // Camera extrinsics (flattened to vector<double> for Ceres) std::vector<double> world_to_cam_vec; std::vector<double> world_to_ref_vec; std::vector<double> ref_to_cam_vec; std::vector<double> ref_identity_vec; std::vector<double> right_identity_vec; // Camera intrinsics std::vector<double> focal_lengths; std::vector<Eigen::Vector2d> optical_centers; std::vector<Eigen::VectorXd> distortions; // Depth-to-image transforms (flattened) std::vector<double> depth_to_image_vec; }; // Convert from structured extrinsics to optimization state void toOptState(const Extrinsics& extrinsics, const RigSet& R, OptState& state, bool no_rig, bool affine_depth_to_image, int num_depth_params); // Convert from optimization state back to structured extrinsics void fromOptState(const OptState& state, Extrinsics& extrinsics, RigSet& R, bool no_rig, bool affine_depth_to_image, int num_depth_params); } // namespace rig #endif // __ASP_RIG_RIG_DATA_H__ ================================================ FILE: src/asp/Rig/RigDem.cc ================================================ /* Copyright (c) 2017-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigDem.h> #include <asp/Rig/RigCameraUtils.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Core/BundleAdjustUtils.h> #include <asp/Core/ImageUtils.h> #include <vw/Image/ImageChannels.h> #include <vw/Image/Interpolation.h> #include <vw/Core/Log.h> #include <vw/Core/Stopwatch.h> #include <vw/Cartography/CameraBBox.h> #include <vw/Cartography/GeoReference.h> #include <vw/Core/ProgressCallback.h> // This has logic that makes heavy use of both rig and asp functionality namespace rig { // Update triangulated points with DEM heights (rig-specific version). See the // There is a version of this with the same name for bundle adjustment. Triangulated // points will also be overwritten by DEM points for each successfully found DEM point. void updateTriPtsFromDem(std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, rig::KeypointVec const& keypoint_vec, std::string const& dem_filename, // Outputs std::vector<Eigen::Vector3d> & xyz_vec_orig, std::vector<Eigen::Vector3d> & xyz_vec, std::vector<Eigen::Vector3d> & dem_xyz_vec) { // Load DEM for height constraints vw::vw_out() << "Updating triangulated points with DEM heights.\n"; vw::cartography::GeoReference dem_georef; vw::ImageViewRef<vw::PixelMask<double>> masked_dem; asp::create_masked_dem(dem_filename, dem_georef, masked_dem); // Initialize output int num_tri_points = pid_to_cid_fid.size(); dem_xyz_vec.resize(num_tri_points, Eigen::Vector3d(0, 0, 0)); // Create interpolated DEM for pixel lookups vw::PixelMask<double> invalid_val; vw::ImageViewRef<vw::PixelMask<double>> interp_dem = vw::interpolate(masked_dem, vw::BilinearInterpolation(), vw::ValueEdgeExtension<vw::PixelMask<float>>(invalid_val)); // Progress reporting vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0 / std::max(1, num_tri_points); tpc.report_progress(0); for (int pid = 0; pid < num_tri_points; pid++) { tpc.report_incremental_progress(inc_amount); // Get the initial triangulated point as a guess vw::Vector3 xyz_guess(xyz_vec_orig[pid][0], xyz_vec_orig[pid][1], xyz_vec_orig[pid][2]); // Skip invalid initial points if (xyz_guess == vw::Vector3(0, 0, 0)) continue; vw::Vector3 accum_xyz(0, 0, 0); int num_intersections = 0; // Iterate through all camera observations for this triangulated point for (const auto& cid_fid: pid_to_cid_fid[pid]) { int cid = cid_fid.first; int fid = cid_fid.second; // Skip outliers if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) continue; // Get the distorted pixel observation std::pair<float, float> kp_pair = keypoint_vec[cid][fid]; Eigen::Vector2d dist_pix(kp_pair.first, kp_pair.second); // Calculate camera center and ray direction Eigen::Vector3d cam_ctr, cam_dir; rig::calcCamCtrDir(cam_params[cams[cid].camera_type], dist_pix, world_to_cam[cid], cam_ctr, cam_dir); // Convert Eigen types to VW types for DEM intersection vw::Vector3 cam_ctr_vw(cam_ctr[0], cam_ctr[1], cam_ctr[2]); vw::Vector3 ray_dir_vw(cam_dir[0], cam_dir[1], cam_dir[2]); // Intersect ray with DEM bool treat_nodata_as_zero = false; bool has_intersection = false; double height_error_tol = 0.001; // 1 mm double max_abs_tol = 1e-14; double max_rel_tol = 1e-14; int num_max_iter = 25; vw::Vector3 dem_xyz = vw::cartography::camera_pixel_to_dem_xyz (cam_ctr_vw, ray_dir_vw, vw::pixel_cast<vw::PixelMask<float>>(masked_dem), dem_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); if (!has_intersection) continue; accum_xyz += dem_xyz; num_intersections++; } // Average the successful intersections vw::Vector3 dem_xyz(0, 0, 0); if (num_intersections > 0) dem_xyz = accum_xyz / double(num_intersections); if (dem_xyz == vw::Vector3(0, 0, 0)) continue; // Skip invalid points // Project vertically onto DEM vw::Vector3 observation = dem_xyz; if (asp::updatePointHeightFromDem(dem_georef, interp_dem, observation)) dem_xyz = observation; // Convert from VW to Eigen dem_xyz_vec[pid] = Eigen::Vector3d(dem_xyz[0], dem_xyz[1], dem_xyz[2]); // If dem_xyz_vec[pid] is not zero, also overwrite xyz_vec and xyz_vec_orig, // so the triangulated points can start on the DEM if (dem_xyz_vec[pid] != Eigen::Vector3d(0, 0, 0)) { xyz_vec[pid] = dem_xyz_vec[pid]; xyz_vec_orig[pid] = dem_xyz_vec[pid]; } } tpc.report_finished(); } } // namespace rig ================================================ FILE: src/asp/Rig/RigDem.h ================================================ /* Copyright (c) 2017-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_DEM_H #define ASP_RIG_DEM_H #include <asp/Rig/RigTypeDefs.h> #include <Eigen/Core> #include <Eigen/Geometry> #include <vector> #include <string> namespace rig { // Forward declarations class CameraParameters; class cameraImage; // Update triangulated points with DEM heights (rig-specific version). See the // There is a version of this with the same name for bundle adjustment. Triangulated // points will also be overwritten by DEM points for each successfully found DEM point. // There is a version of this with the same name for bundle adjustment. void updateTriPtsFromDem(std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, rig::KeypointVec const& keypoint_vec, std::string const& dem_filename, // Outputs std::vector<Eigen::Vector3d> & xyz_vec_orig, std::vector<Eigen::Vector3d> & xyz_vec, std::vector<Eigen::Vector3d> & dem_xyz_vec); } // namespace rig #endif // ASP_RIG_DEM_H ================================================ FILE: src/asp/Rig/RigImageIO.cc ================================================ /* Copyright (c) 2021-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigImageIO.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/OpenCVUtils.h> #include <vw/Core/Log.h> #include <glog/logging.h> #include <boost/filesystem.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/imgcodecs.hpp> #include <iostream> #include <fstream> #include <iomanip> namespace fs = boost::filesystem; namespace rig { // The images from the bag may need to be resized to be the same // size as in the calibration file. Sometimes the full-res images // can be so blurry that interest point matching fails, hence the // resizing. // Similar logic to deal with differences between image size and calibrated size // is used further down this code. void adjustImageSize(rig::CameraParameters const& cam_params, cv::Mat & image) { int64_t raw_image_cols = image.cols; int64_t raw_image_rows = image.rows; int64_t calib_image_cols = cam_params.GetDistortedSize()[0]; int64_t calib_image_rows = cam_params.GetDistortedSize()[1]; int64_t factor = raw_image_cols / calib_image_cols; // If the raw image has size 0, skip, but give a warning. This happens // when the image is not found. If prior interest point matches exist, // the workflow can still continue. if (raw_image_cols == 0 || raw_image_rows == 0) { LOG(WARNING) << "Image has size 0, skipping."; return; } if ((raw_image_cols != calib_image_cols * factor) || (raw_image_rows != calib_image_rows * factor)) { LOG(FATAL) << "Image width and height are: " << raw_image_cols << ' ' << raw_image_rows << "\n" << "Calibrated image width and height are: " << calib_image_cols << ' ' << calib_image_rows << "\n" << "These must be equal up to an integer factor.\n"; } if (factor != 1) { // TODO(oalexan1): This kind of resizing may be creating aliased images. cv::Mat local_image; cv::resize(image, local_image, cv::Size(), 1.0/factor, 1.0/factor, cv::INTER_AREA); local_image.copyTo(image); } // Check if (image.cols != calib_image_cols || image.rows != calib_image_rows) LOG(FATAL) << "The images have the wrong size."; } // Read an image with 3 floats per pixel. OpenCV's imread() cannot do that. void readXyzImage(std::string const& filename, cv::Mat & img) { std::ifstream f; f.open(filename.c_str(), std::ios::binary | std::ios::in); if (!f.is_open()) LOG(FATAL) << "Cannot open file for reading: " << filename << "\n"; int rows, cols, channels; // TODO(oalexan1): Replace below with int32_t and check that it is same thing. f.read((char*)(&rows), sizeof(rows)); // NOLINT f.read((char*)(&cols), sizeof(cols)); // NOLINT f.read((char*)(&channels), sizeof(channels)); // NOLINT img = cv::Mat::zeros(rows, cols, CV_32FC3); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { cv::Vec3f P; // TODO(oalexan1): See if using reinterpret_cast<char*> does the same // thing. for (int c = 0; c < channels; c++) f.read((char*)(&P[c]), sizeof(P[c])); // NOLINT img.at<cv::Vec3f>(row, col) = P; } } return; } void readImageEntry(// Inputs std::string const& image_file, Eigen::Affine3d const& world_to_cam, std::vector<std::string> const& cam_names, int cam_type, double timestamp, int num_overlaps, // Outputs std::vector<std::map<double, rig::ImageMessage>> & image_maps, std::vector<std::map<double, rig::ImageMessage>> & depth_maps) { // Aliases std::map<double, ImageMessage> & image_map = image_maps[cam_type]; std::map<double, ImageMessage> & depth_map = depth_maps[cam_type]; if (image_map.find(timestamp) != image_map.end()) vw::vw_out(vw::WarningMessage) << "Duplicate timestamp " << std::setprecision(17) << timestamp << " for sensor id " << cam_type << "\n"; // Read the image as grayscale, in order for feature matching to work. // Non-byte images need to normalized to [0, 255] and converted to byte type. // If num_overlaps is 0, no feature matching will happen, so no need to read // the images. if (num_overlaps > 0) { bool hasByte = asp::hasByteChannels(image_file); if (hasByte) { image_map[timestamp].image = cv::imread(image_file, cv::IMREAD_GRAYSCALE); } else { vw::vw_out() << "Non-byte image detected. Will normalize.\n"; vw::ImageViewRef<vw::PixelMask<float>> masked_image; asp::normalizeImage(image_file, masked_image); asp::maskedToScaledByteCvImage(masked_image, image_map[timestamp].image); } } // Populate the other fields image_map[timestamp].name = image_file; image_map[timestamp].timestamp = timestamp; image_map[timestamp].world_to_cam = world_to_cam; // Sanity check if (depth_map.find(timestamp) != depth_map.end()) vw::vw_out(vw::WarningMessage) << "Duplicate timestamp " << std::setprecision(17) << timestamp << " for sensor id " << cam_type << "\n"; // Read the depth data, if present std::string depth_file = fs::path(image_file).replace_extension(".pc").string(); if (fs::exists(depth_file)) { //vw::vw_out() << "Reading: " << depth_file << std::endl; rig::readXyzImage(depth_file, depth_map[timestamp].image); depth_map[timestamp].name = depth_file; depth_map[timestamp].timestamp = timestamp; } } // Write an image with 3 floats per pixel. OpenCV's imwrite() cannot do that. void saveXyzImage(std::string const& filename, cv::Mat const& img) { if (img.depth() != CV_32F) LOG(FATAL) << "Expecting an image with float values.\n"; if (img.channels() != 3) LOG(FATAL) << "Expecting 3 channels.\n"; std::ofstream f; f.open(filename.c_str(), std::ios::binary | std::ios::out); if (!f.is_open()) LOG(FATAL) << "Cannot open file for writing: " << filename << "\n"; // Assign these to explicit variables so we know their type and size in bytes // TODO(oalexan1): Replace below with int32_t and check that it is same thing. int rows = img.rows, cols = img.cols, channels = img.channels(); // TODO(oalexan1): Avoid C-style cast. Test if // reinterpret_cast<char*> does the same thing. f.write((char*)(&rows), sizeof(rows)); // NOLINT f.write((char*)(&cols), sizeof(cols)); // NOLINT f.write((char*)(&channels), sizeof(channels)); // NOLINT for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { cv::Vec3f const& P = img.at<cv::Vec3f>(row, col); // alias // TODO(oalexan1): See if using reinterpret_cast<char*> does the same // thing. for (int c = 0; c < channels; c++) f.write((char*)(&P[c]), sizeof(P[c])); // NOLINT } } return; } // Save images and depth clouds to disk void saveImagesAndDepthClouds(std::vector<rig::cameraImage> const& cams) { for (size_t it = 0; it < cams.size(); it++) { std::cout << "Writing: " << cams[it].image_name << std::endl; cv::imwrite(cams[it].image_name, cams[it].image); if (cams[it].depth_cloud.cols > 0 && cams[it].depth_cloud.rows > 0) { std::cout << "Writing: " << cams[it].depth_name << std::endl; rig::saveXyzImage(cams[it].depth_name, cams[it].depth_cloud); } } return; } // Save the list of images, for use with bundle_adjust. void saveImageList(std::vector<rig::cameraImage> const& cams, std::string const& image_list) { // Create the directory having image_list std::string dir = fs::path(image_list).parent_path().string(); rig::createDir(dir); std::cout << "Writing: " << image_list << std::endl; std::ofstream ofs(image_list.c_str()); for (size_t it = 0; it < cams.size(); it++) ofs << cams[it].image_name << std::endl; ofs.close(); return; } } // namespace rig ================================================ FILE: src/asp/Rig/RigImageIO.h ================================================ /* Copyright (c) 2021-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_RIG_IMAGE_IO_H #define ASP_RIG_RIG_IMAGE_IO_H #include <string> #include <vector> #include <map> #include <opencv2/core.hpp> #include <Eigen/Geometry> namespace rig { class CameraParameters; struct ImageMessage; struct cameraImage; // The images from the bag may need to be resized to be the same // size as in the calibration file. void adjustImageSize(rig::CameraParameters const& cam_params, cv::Mat & image); // Read an image with 3 floats per pixel. OpenCV's imread() cannot do that. void readXyzImage(std::string const& filename, cv::Mat & img); // Write an image with 3 floats per pixel. // // This is used for saving 3D point cloud data (XYZ) as an image. // OpenCV's imwrite() cannot do this. void saveXyzImage(std::string const& filename, cv::Mat const& img); // Read an image and potentially its depth cloud void readImageEntry(// Inputs std::string const& image_file, Eigen::Affine3d const& world_to_cam, std::vector<std::string> const& cam_names, int cam_type, double timestamp, int num_overlaps, // Outputs std::vector<std::map<double, rig::ImageMessage>> & image_maps, std::vector<std::map<double, rig::ImageMessage>> & depth_maps); // Save images and their corresponding depth clouds to disk. void saveImagesAndDepthClouds(std::vector<rig::cameraImage> const& cams); // Save the list of images, for use with bundle_adjust. void saveImageList(std::vector<rig::cameraImage> const& cams, std::string const& image_list); } // namespace rig #endif // ASP_RIG_RIG_IMAGE_IO_H ================================================ FILE: src/asp/Rig/RigIo.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/RigIo.h> #include <asp/Rig/RigImageIO.h> #include <asp/Rig/RigParseUtils.h> #include <asp/Rig/Detector.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/InterpolationUtils.h> #include <asp/Rig/TransformUtils.h> #include <asp/Core/Nvm.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Core/Log.h> #include <boost/filesystem.hpp> #include <opencv2/imgcodecs.hpp> #include <glog/logging.h> #include <fstream> #include <iostream> #include <iomanip> #include <string> #include <vector> #include <set> namespace fs = boost::filesystem; namespace rig { // For each image, find its sensor name and timestamp. The info can be in a list or // from the file or directory structure. If flexible_strategy is true, then // can try from list first, and if that fails, then from file/directory structure. void readImageSensorTimestamp(std::string const& image_sensor_list, std::vector<std::string> const& image_files, std::vector<std::string> const& cam_names, bool flexible_strategy, // Outputs std::vector<int> & cam_types, std::vector<double> & timestamps) { // Parse the image sensor list if it is not empty bool success = false; if (image_sensor_list != "") { bool success = parseImageSensorList(image_sensor_list, image_files, cam_names, flexible_strategy, cam_types, timestamps); // outputs if (success) return; if (!success && !flexible_strategy) LOG(FATAL) << "Cannot parse the image sensor list: " << image_sensor_list << "\n"; } // Clear the outputs cam_types.clear(); cam_types.resize(image_files.size()); timestamps.clear(); timestamps.resize(image_files.size()); for (size_t it = 0; it < image_files.size(); it++) { int cam_type = 0; double timestamp = 0.0; try { std::string group; // not used findCamTypeAndTimestamp(image_files[it], cam_names, cam_type, timestamp, group); // outputs } catch (std::exception const& e) { LOG(FATAL) << "Could not infer sensor type and image timestamp. See the naming " << "convention, and check your images. Detailed message:\n" << e.what(); } cam_types[it] = cam_type; timestamps[it] = timestamp; } } // Add poses for the extra desired images based on interpolation, extrapolation, // and/or the rig transform. void calcExtraPoses(std::string const& extra_list, bool use_initial_rig_transforms, double bracket_len, bool nearest_neighbor_interp, rig::RigSet const& R, // Append here std::vector<std::string> & cid_to_filename, std::vector<int> & cam_types, std::vector<double> & timestamps, std::vector<Eigen::Affine3d> & world_to_cam) { // Put the existing poses in a map std::map<int, std::map<double, Eigen::Affine3d>> existing_world_to_cam; std::set<std::string> existing_images; for (size_t image_it = 0; image_it < cid_to_filename.size(); image_it++) { auto const& image_file = cid_to_filename[image_it]; existing_images.insert(image_file); int cam_type = cam_types[image_it]; double timestamp = timestamps[image_it]; Eigen::Affine3d world2cam = world_to_cam[image_it]; existing_world_to_cam[cam_type][timestamp] = world2cam; if (use_initial_rig_transforms) { // Use the rig constraint to find the poses for the other sensors on the rig // First go to the ref sensor double ref_timestamp = timestamp - R.ref_to_cam_timestamp_offsets[cam_type]; // Careful here with transform directions and order Eigen::Affine3d cam_to_ref = R.ref_to_cam_trans[cam_type].inverse(); Eigen::Affine3d world_to_ref = cam_to_ref * world2cam; // Now do all the sensors on that rig. Note how we do the reverse of the above // timestamp and camera operations, but not just for the given cam_type, // but for any sensor on the rig. for (size_t sensor_it = 0; sensor_it < R.ref_to_cam_trans.size(); sensor_it++) { if (R.rigId(sensor_it) != R.rigId(cam_type)) continue; // stay within the current rig // Initialize the map if needed if (existing_world_to_cam.find(sensor_it) == existing_world_to_cam.end()) existing_world_to_cam[sensor_it] = std::map<double, Eigen::Affine3d>(); // Add an entry, unless one already exists std::map<double, Eigen::Affine3d> & map = existing_world_to_cam[sensor_it]; // alias // TODO(oalexan1): Any issues with numerical precision of timestamps? double curr_timestamp = ref_timestamp + R.ref_to_cam_timestamp_offsets[sensor_it]; if (map.find(curr_timestamp) == map.end()) existing_world_to_cam[sensor_it][curr_timestamp] = R.ref_to_cam_trans[sensor_it] * world_to_ref; } } } // Read the extra image names. Ignore the ones already existing. std::ifstream f(extra_list.c_str()); std::vector<std::string> extra_images; if (!f.is_open()) LOG(FATAL) << "Cannot open file for reading: " << extra_list << "\n"; std::string line; while (getline(f, line)) { if (line.empty() || line[0] == '#') continue; std::string image_file; std::istringstream iss(line); if (!(iss >> image_file)) LOG(FATAL) << "Cannot parse the image file in: " << extra_list << "\n"; if (existing_images.find(image_file) != existing_images.end()) continue; // this image already exists extra_images.push_back(image_file); } // Infer the timestamp and sensor type for the extra images std::vector<int> extra_cam_types; std::vector<double> extra_timestamps; bool flexible_strategy = true; // can handle with and without separate attributes readImageSensorTimestamp(extra_list, extra_images, R.cam_names, flexible_strategy, extra_cam_types, extra_timestamps); // outputs // Save the new images in a map, to ensure they are sorted. // Also need maps for cam types and timestamps, to be able to associate // image names with these std::map<int, std::map<double, std::string>> extra_map; std::map<std::string, int> extra_cam_types_map; std::map<std::string, double> extra_timestamps_map; for (size_t image_it = 0; image_it < extra_images.size(); image_it++) { std::string image_file = extra_images[image_it]; int cam_type = extra_cam_types[image_it]; double curr_timestamp = extra_timestamps[image_it]; extra_map[cam_type][curr_timestamp] = image_file; extra_cam_types_map[image_file] = cam_type; extra_timestamps_map[image_file] = curr_timestamp; } // Iterate over each sensor type and interpolate or extrapolate into existing data for (auto sensor_it = extra_map.begin(); sensor_it != extra_map.end(); sensor_it++) { int cam_type = sensor_it->first; std::map<double, std::string> & target_map = sensor_it->second; // alias // Look up existing poses to be used for interpolation/extrapolation auto & input_map = existing_world_to_cam[cam_type]; // alias if (input_map.empty()) { std::string msg = std::string("Cannot find camera poses for sensor: ") + R.cam_names[cam_type] + " as the data is insufficient.\n"; if (!use_initial_rig_transforms) msg += std::string("If the rig configuration file has an initial rig, consider ") + "using the option --use_initial_rig_transforms.\n"; vw::vw_out() << msg; continue; } std::vector<std::string> found_images; std::vector<Eigen::Affine3d> found_poses; interpOrExtrap(input_map, target_map, bracket_len, nearest_neighbor_interp, found_images, found_poses); // outputs for (size_t found_it = 0; found_it < found_images.size(); found_it++) { cid_to_filename.push_back(found_images[found_it]); world_to_cam.push_back(found_poses[found_it]); // Add the cam type and timestamp auto type_it = extra_cam_types_map.find(found_images[found_it]); if (type_it == extra_cam_types_map.end()) LOG(FATAL) << "Cannot find cam type for image: " << found_images[found_it] << "\n"; cam_types.push_back(type_it->second); auto time_it = extra_timestamps_map.find(found_images[found_it]); if (time_it == extra_timestamps_map.end()) LOG(FATAL) << "Cannot find timestamp for image: " << found_images[found_it] << "\n"; timestamps.push_back(time_it->second); } } } void readCameraPoses(std::string const& camera_poses_file, asp::nvmData & nvm) { // Clear the outputs nvm = asp::nvmData(); // Open the file vw::vw_out() << "Reading: " << camera_poses_file << std::endl; std::ifstream f(camera_poses_file.c_str()); if (!f.is_open()) LOG(FATAL) << "Cannot open file for reading: " << camera_poses_file << "\n"; std::string line; while (getline(f, line)) { if (line.empty() || line[0] == '#') continue; std::string image_file; std::istringstream iss(line); if (!(iss >> image_file)) LOG(FATAL) << "Cannot parse the image file in: " << camera_poses_file << "\n"; // Read the camera to world transform Eigen::VectorXd vals(12); double val = -1.0; int count = 0; while (iss >> val) { if (count >= 12) break; vals[count] = val; count++; } if (count != 12) LOG(FATAL) << "Expecting 12 values for the transform on line:\n" << line << "\n"; Eigen::Affine3d world2cam = vecToAffine(vals); nvm.world_to_cam.push_back(world2cam); nvm.cid_to_filename.push_back(image_file); } } // Read camera information and images from a list or from an NVM file. Can // interpolate/extrapolate poses for data from an extra list. Only later we will // consider if the features are shifted or not in the nvm. void readListOrNvm(// Inputs std::string const& camera_poses_list, std::string const& nvm_file, std::string const& image_sensor_list, std::string const& extra_list, bool use_initial_rig_transforms, double bracket_len, bool nearest_neighbor_interp, bool read_nvm_no_shift, int num_overlaps, rig::RigSet const& R, // Outputs asp::nvmData & nvm, std::vector<std::map<double, rig::ImageMessage>> & image_maps, std::vector<std::map<double, rig::ImageMessage>> & depth_maps) { // Wipe the outputs image_maps.clear(); depth_maps.clear(); image_maps.resize(R.cam_names.size()); depth_maps.resize(R.cam_names.size()); if (int(camera_poses_list.empty()) + int(nvm_file.empty()) != 1) LOG(FATAL) << "Must specify precisely one of --camera-poses or --nvm.\n"; if (camera_poses_list != "") { rig::readCameraPoses(// Inputs camera_poses_list, // Outputs nvm); } else { asp::readNvm(nvm_file, nvm.cid_to_keypoint_map, nvm.cid_to_filename, nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam, nvm.focal_lengths); if (!read_nvm_no_shift) { std::string offsets_file = asp::offsetsFilename(nvm_file); asp::readNvmOffsets(offsets_file, nvm.optical_centers); // Must have as many offsets as images if (nvm.optical_centers.size() != nvm.cid_to_filename.size()) LOG(FATAL) << "Expecting as many optical centers as images.\n"; } } // Infer the timestamp and sensor type from list or directory structure std::vector<int> cam_types; std::vector<double> timestamps; bool flexible_strategy = false; readImageSensorTimestamp(image_sensor_list, nvm.cid_to_filename, R.cam_names, flexible_strategy, cam_types, timestamps); // outputs // Extra poses need be be added right after reading the original ones, // to ensure the same book-keeping is done for all of them. The extra // entries do not mess up the bookkeeping of pid_to_cid_fid, etc, // if their cid is larger than the ones read from NVM. if (extra_list != "") calcExtraPoses(extra_list, use_initial_rig_transforms, bracket_len, nearest_neighbor_interp, R, // Append here nvm.cid_to_filename, cam_types, timestamps, nvm.world_to_cam); if (num_overlaps > 0) vw::vw_out() << "Reading the images.\n"; else vw::vw_out() << "Not reading the images as no feature matching will be done.\n"; for (size_t it = 0; it < nvm.cid_to_filename.size(); it++) readImageEntry(nvm.cid_to_filename[it], nvm.world_to_cam[it], R.cam_names, cam_types[it], timestamps[it], num_overlaps, // Outputs image_maps, depth_maps); return; } // Given all the merged and filtered tracks in pid_cid_fid, for each // image pair cid1 and cid2 with cid1 < cid2 < cid1 + num_overlaps + 1, // save the matches of this pair which occur in the set of tracks. void saveInlierMatchPairs(// Inputs std::vector<rig::cameraImage> const& cams, int num_overlaps, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, PidCidFidMap const& pid_cid_fid_inlier, std::string const& out_dir) { MATCH_MAP matches; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { for (auto cid_fid1 = pid_to_cid_fid[pid].begin(); cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) { int cid1 = cid_fid1->first; int fid1 = cid_fid1->second; for (auto cid_fid2 = pid_to_cid_fid[pid].begin(); cid_fid2 != pid_to_cid_fid[pid].end(); cid_fid2++) { int cid2 = cid_fid2->first; int fid2 = cid_fid2->second; // When num_overlaps == 0, we save only matches read from nvm rather // ones made wen this tool was run. bool is_good = (cid1 < cid2 && (num_overlaps == 0 || cid2 < cid1 + num_overlaps + 1)); if (!is_good) continue; // Consider inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1) || !rig::getMapValue(pid_cid_fid_inlier, pid, cid2, fid2)) continue; auto cid_pair = std::make_pair(cid1, cid2); vw::ip::InterestPoint ip1(keypoint_vec[cid1][fid1].first, keypoint_vec[cid1][fid1].second); vw::ip::InterestPoint ip2(keypoint_vec[cid2][fid2].first, keypoint_vec[cid2][fid2].second); matches[cid_pair].first.push_back(ip1); matches[cid_pair].second.push_back(ip2); } } } // End iterations over pid for (auto it = matches.begin(); it != matches.end(); it++) { auto & cid_pair = it->first; rig::MATCH_PAIR const& match_pair = it->second; int left_cid = cid_pair.first; int right_cid = cid_pair.second; std::string match_dir = out_dir + "/matches"; rig::createDir(match_dir); bool matches_as_txt = false; std::string match_file = vw::ip::match_filename(match_dir + "/run", cams[left_cid].image_name, cams[right_cid].image_name, matches_as_txt); std::cout << "Writing: " << match_file << std::endl; vw::ip::write_match_file(match_file, match_pair.first, match_pair.second, matches_as_txt); } // The image names (without directory) must be unique, or else bundle // adjustment will fail. std::set<std::string> base_names; for (size_t it = 0; it < cams.size(); it++) { std::string base_name = fs::path(cams[it].image_name).filename().string(); if (base_names.find(base_name) != base_names.end()) LOG(FATAL) << "Non-unique image name (without directory): " << base_name << ". It will not be possible to use these matches with bundle_adjust."; base_names.insert(base_name); } } // end function saveInlierMatchPairs // Find convergence angles between every pair of images and save to disk their // percentiles assumed that the cameras in world_to_cam are up-to-date given the // current state of optimization, and that the residuals (including the // reprojection errors) have also been updated beforehand. void savePairwiseConvergenceAngles(// Inputs rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, std::vector<Eigen::Vector3d> const& xyz_vec, PidCidFidMap const& pid_cid_fid_inlier, std::string const& conv_angles_file) { rig::PairwiseConvergenceAngles conv_angles; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { for (auto cid_fid1 = pid_to_cid_fid[pid].begin(); cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) { int cid1 = cid_fid1->first; int fid1 = cid_fid1->second; // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1)) continue; Eigen::Vector3d cam_ctr1 = (world_to_cam[cid1].inverse()) * Eigen::Vector3d(0, 0, 0); Eigen::Vector3d ray1 = xyz_vec[pid] - cam_ctr1; ray1.normalize(); for (auto cid_fid2 = pid_to_cid_fid[pid].begin(); cid_fid2 != pid_to_cid_fid[pid].end(); cid_fid2++) { int cid2 = cid_fid2->first; int fid2 = cid_fid2->second; // Look at each cid and next cids if (cid2 <= cid1) continue; // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid2, fid2)) continue; Eigen::Vector3d cam_ctr2 = (world_to_cam[cid2].inverse()) * Eigen::Vector3d(0, 0, 0); Eigen::Vector3d ray2 = xyz_vec[pid] - cam_ctr2; ray2.normalize(); // Calculate the convergence angle double conv_angle = (180.0 / M_PI) * acos(ray1.dot(ray2)); if (std::isnan(conv_angle) || std::isinf(conv_angle)) continue; // Add to the image pair std::pair<int, int> pair(cid1, cid2); conv_angles[pair].push_back(conv_angle); } } } // Sort the convergence angles per pair std::cout << "Writing: " << conv_angles_file << std::endl; std::ofstream ofs(conv_angles_file.c_str()); ofs << "# Convergence angle percentiles (in degrees) for each image pair having matches\n"; ofs << "# left_image right_image 25% 50% 75% num_matches\n"; ofs.precision(17); for (auto it = conv_angles.begin(); it != conv_angles.end(); it++) { // Sort the values first std::vector<double> & vals = it->second; // alias std::sort(vals.begin(), vals.end()); int len = vals.size(); int cid1 = (it->first).first; int cid2 = (it->first).second; ofs << cams[cid1].image_name << ' ' << cams[cid2].image_name << ' ' << vals[0.25 * len] << ' ' << vals[0.5 * len] << ' ' << vals[0.75*len] << ' ' << len << std::endl; } ofs.close(); return; } // end function savePairwiseConvergenceAngles } // namespace rig ================================================ FILE: src/asp/Rig/RigIo.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_RIG_IO_H #define ASP_RIG_RIG_IO_H #include <asp/Rig/RigTypeDefs.h> #include <string> #include <vector> #include <map> #include <opencv2/core/mat.hpp> #include <Eigen/Core> #include <Eigen/Geometry> // Forward declarations of types from other headers namespace rig { struct cameraImage; class RigSet; struct ImageMessage; } namespace asp { class nvmData; } namespace rig { // For each image, find its sensor name and timestamp. The info can be in a list or // from the file or directory structure. If flexible_strategy is true, then // can try from list first, and if that fails, then from file/directory structure. void readImageSensorTimestamp(std::string const& image_sensor_list, std::vector<std::string> const& image_files, std::vector<std::string> const& cam_names, bool flexible_strategy, // Outputs std::vector<int> & cam_types, std::vector<double> & timestamps); void readCameraPoses(// Inputs std::string const& camera_poses_file, // Outputs asp::nvmData & nvm); // Read camera information and images from a list or from an NVM file. // Can interpolate/extrapolate poses for data from an extra list. // Only later we will consider if the features are shifted or not in the nvm. void readListOrNvm(// Inputs std::string const& camera_poses_list, std::string const& nvm_file, std::string const& image_sensor_list, std::string const& extra_list, bool use_initial_rig_transforms, double bracket_len, bool nearest_neighbor_interp, bool read_nvm_no_shift, int num_overlaps, rig::RigSet const& R, // Outputs asp::nvmData & nvm, std::vector<std::map<double, rig::ImageMessage>> & image_maps, std::vector<std::map<double, rig::ImageMessage>> & depth_maps); // Save the inlier matches for each image pair to disk. // // Given all the merged and filtered tracks, this function iterates through // them and extracts the pairwise matches that belong to inlier tracks, // saving them to .match files. void saveInlierMatchPairs(// Inputs std::vector<rig::cameraImage> const& cams, int num_overlaps, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, PidCidFidMap const& pid_cid_fid_inlier, std::string const& out_dir); // Find convergence angles between every pair of images and save // their percentiles to disk. void savePairwiseConvergenceAngles(// Inputs rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, std::vector<Eigen::Vector3d> const& xyz_vec, PidCidFidMap const& pid_cid_fid_inlier, std::string const& conv_angles_file); } // end namespace rig #endif // ASP_RIG_RIG_IO_H ================================================ FILE: src/asp/Rig/RigMath.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/RigMath.h> #include <Eigen/SVD> #include <glog/logging.h> #include <iostream> #include <vector> #include <algorithm> #include <cmath> namespace rig { // Implement some heuristic to find the maximum rotation angle that can result // from applying the given transform. It is assumed that the transform is not // too different from the identity. double maxRotationAngle(Eigen::Affine3d const& T) { Eigen::Vector3d angles = T.linear().eulerAngles(0, 1, 2); // Angles close to +/-pi can result even if the matrix is close to identity for (size_t it = 0; it < 3; it++) angles[it] = std::min(std::abs(angles[it]), std::abs(M_PI - std::abs(angles[it]))); double angle_norm = (180.0 / M_PI) * angles.norm(); return angle_norm; } // Compute the azimuth and elevation for a (normal) vector void normalToAzimuthAndElevation(Eigen::Vector3d const& normal, double& azimuth, double& elevation) { if (normal.x() == 0 && normal.y() == 0) { azimuth = 0.0; if (normal.z() >= 0.0) elevation = M_PI / 2.0; else elevation = -M_PI / 2.0; } else { azimuth = atan2(normal.y(), normal.x()); elevation = atan2(normal.z(), Eigen::Vector2d(normal.x(), normal.y()).norm()); } } // Compute a normal vector based on the azimuth and elevation angles void azimuthAndElevationToNormal(Eigen::Vector3d& normal, double azimuth, double elevation) { double ca = cos(azimuth), sa = sin(azimuth); double ce = cos(elevation), se = sin(elevation); normal = Eigen::Vector3d(ca * ce, sa * ce, se); } // Snap the normal to the plane (and the plane itself) to make // all angles multiple of 45 degrees with the coordinate axes. void snapPlaneNormal(Eigen::Vector3d& plane_normal) { double azimuth, elevation; normalToAzimuthAndElevation(plane_normal, azimuth, elevation); // Snap to multiple of 45 degrees double radian45 = M_PI / 4.0; azimuth = radian45 * round(azimuth / radian45); elevation = radian45 * round(elevation / radian45); azimuthAndElevationToNormal(plane_normal, azimuth, elevation); } // Find the best fitting plane to a set of points void bestFitPlane(const std::vector<Eigen::Vector3d>& points, Eigen::Vector3d& centroid, Eigen::Vector3d& plane_normal) { // Copy coordinates to matrix in Eigen format size_t num_points = points.size(); Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> coord(3, num_points); for (size_t i = 0; i < num_points; i++) coord.col(i) = points[i]; // calculate centroid centroid = Eigen::Vector3d(coord.row(0).mean(), coord.row(1).mean(), coord.row(2).mean()); // subtract centroid for (size_t it = 0; it < 3; it++) coord.row(it).array() -= centroid(it); // We only need the left-singular matrix here // https://math.stackexchange.com/questions/99299/best-fitting-plane-given-a-set-of-points auto svd = coord.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV); plane_normal = svd.matrixU().rightCols<1>(); } // Gamma correction for x between 0 and 1. // https://en.wikipedia.org/wiki/SRGB#Specification_of_the_transformation double gamma(double x) { // return pow(x, 1.0/2.6); if (x <= 0.0031308) return 12.92 * x; return 1.055 * pow(x, 1.0 / 2.4) - 0.055; } double inv_gamma(double x) { // return pow(x, 2.6); if (x <= 0.04045) return x / 12.92; return pow((x + 0.055) / (1.055), 2.4); } // Apply the inverse gamma transform to images, multiply them by // max_iso_times_exposure/ISO/exposure_time to adjust for // lightning differences, then apply the gamma transform back. void exposureCorrection(double max_iso_times_exposure, double iso, double exposure, cv::Mat const& input_image, cv::Mat& output_image) { double scale = max_iso_times_exposure / iso / exposure; // Make an image of the same type input_image.copyTo(output_image); // Apply the inverse gamma correction, multiply by scale, // and apply the correction back #pragma omp parallel for for (int row = 0; row < input_image.rows; row++) { for (int col = 0; col < input_image.cols; col++) { cv::Vec3b b = input_image.at<cv::Vec3b>(row, col); cv::Vec3b c; for (int color = 0; color < 3; color++) { double x = 255.0 * gamma(inv_gamma(static_cast<double>(b[color]) / 255.0) * scale); c[color] = std::min(round(x), 255.0); } output_image.at<cv::Vec3b>(row, col) = c; } } } } // namespace rig ================================================ FILE: src/asp/Rig/RigMath.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_RIG_MATH_H #define ASP_RIG_RIG_MATH_H #include <Eigen/Core> #include <Eigen/Geometry> #include <opencv2/core/core.hpp> #include <vector> namespace rig { // Implement some heuristic to find the maximum rotation angle that can result // from applying the given transform. It is assumed that the transform is not // too different from the identity. double maxRotationAngle(Eigen::Affine3d const& T); // Compute the azimuth and elevation for a (normal) vector void normalToAzimuthAndElevation(Eigen::Vector3d const& normal, double& azimuth, double& elevation); // Compute a normal vector based on the azimuth and elevation angles void azimuthAndElevationToNormal(Eigen::Vector3d& normal, double azimuth, double elevation); // Snap the normal to the plane (and the plane itself) to make // all angles multiple of 45 degrees with the coordinate axes. void snapPlaneNormal(Eigen::Vector3d& plane_normal); // Find the best fitting plane to a set of points void bestFitPlane(const std::vector<Eigen::Vector3d>& points, Eigen::Vector3d& centroid, Eigen::Vector3d& plane_normal); // Gamma and inverse gamma functions // https://en.wikipedia.org/wiki/SRGB#Specification_of_the_transformation double gamma(double x); double inv_gamma(double x); // Apply the inverse gamma transform to images, multiply them by // max_iso_times_exposure/ISO/exposure_time to adjust for // lightning differences, then apply the gamma transform back. void exposureCorrection(double max_iso_times_exposure, double iso, double exposure, cv::Mat const& input_image, cv::Mat& output_image); } // namespace rig #endif // ASP_RIG_RIG_MATH_H ================================================ FILE: src/asp/Rig/RigOptimizer.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/RigOptimizer.h> #include <asp/Rig/RigCostFunction.h> #include <asp/Rig/RigCameraUtils.h> #include <asp/Rig/RigDem.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/ImageLookup.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/RigUtils.h> #include <asp/Rig/TextureProcessing.h> #include <asp/Rig/Triangulation.h> #include <asp/Rig/RigOutlier.h> #include <asp/Core/ImageUtils.h> #include <ceres/ceres.h> #include <ceres/dynamic_numeric_diff_cost_function.h> #include <ceres/loss_function.h> #include <iomanip> #include <iostream> #include <set> namespace rig { // A struct to hold the block sizes for the various cost functions struct RigBlockSizes { std::vector<int> image_block_sizes; std::vector<int> depth_block_sizes; std::vector<int> depth_mesh_block_sizes; std::vector<int> xyz_block_sizes; }; // Set up block sizes for various cost functions void set_up_block_sizes(int num_depth_params, RigBlockSizes& block_sizes) { // Wipe the outputs block_sizes.image_block_sizes.clear(); block_sizes.depth_block_sizes.clear(); block_sizes.depth_mesh_block_sizes.clear(); block_sizes.xyz_block_sizes.clear(); int num_focal_lengths = 1; // The x and y focal length are assumed to be the same int num_distortion_params = 1; // will be overwritten later // Set up the variable blocks to optimize for BracketedCamError block_sizes.image_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.image_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.image_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.image_block_sizes.push_back(rig::NUM_XYZ_PARAMS); block_sizes.image_block_sizes.push_back(rig::NUM_SCALAR_PARAMS); block_sizes.image_block_sizes.push_back(num_focal_lengths); block_sizes.image_block_sizes.push_back(rig::NUM_OPT_CTR_PARAMS); block_sizes.image_block_sizes.push_back(num_distortion_params); // Set up variable blocks to optimize for BracketedDepthError block_sizes.depth_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.depth_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.depth_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.depth_block_sizes.push_back(num_depth_params); block_sizes.depth_block_sizes.push_back(rig::NUM_SCALAR_PARAMS); block_sizes.depth_block_sizes.push_back(rig::NUM_XYZ_PARAMS); block_sizes.depth_block_sizes.push_back(rig::NUM_SCALAR_PARAMS); // Set up the variable blocks to optimize for BracketedDepthMeshError block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_RIGID_PARAMS); block_sizes.depth_mesh_block_sizes.push_back(num_depth_params); block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_SCALAR_PARAMS); block_sizes.depth_mesh_block_sizes.push_back(rig::NUM_SCALAR_PARAMS); // Set up the variable blocks to optimize for the mesh xyz block_sizes.xyz_block_sizes.push_back(rig::NUM_XYZ_PARAMS); } // Evaluate the residuals before and after optimization void evalResiduals(// Inputs std::string const& tag, std::vector<std::string> const& residual_names, std::vector<double> const& residual_scales, // Outputs ceres::Problem & problem, std::vector<double>& residuals) { double total_cost = 0.0; ceres::Problem::EvaluateOptions eval_options; eval_options.num_threads = 1; eval_options.apply_loss_function = false; // want raw residuals problem.Evaluate(eval_options, &total_cost, &residuals, NULL, NULL); // Sanity checks, after the residuals are created if (residuals.size() != residual_names.size()) LOG(FATAL) << "There must be as many residual names as residual values."; if (residuals.size() != residual_scales.size()) LOG(FATAL) << "There must be as many residual values as residual scales."; // Compensate for the scale for (size_t it = 0; it < residuals.size(); it++) residuals[it] /= residual_scales[it]; rig::calcResidualStats(residuals, residual_names, tag); return; } void addRigReprojCostFun(// Observation Eigen::Vector2d const& dist_ip, double beg_ref_timestamp, double end_ref_timestamp, double cam_timestamp, // Params and variables std::vector<int> const& image_block_sizes, rig::CameraParameters const& cam_params, Eigen::VectorXd& distortion_vec, double* distortion_placeholder_ptr, double* beg_cam_ptr, double* end_cam_ptr, double* ref_to_cam_ptr, double* xyz_ptr, double* timestamp_offset_ptr, double* focal_length_ptr, double* optical_center_ptr, rig::RigSet const& R, int cam_type, std::string const& image_name, std::set<std::string> const& intrinsics_to_float, std::set<std::string> const& camera_poses_to_float, std::set<std::string> const& fixed_images, std::set<double*>& fixed_parameters, ceres::SubsetManifold* constant_transform_manifold, double min_timestamp_offset, double max_timestamp_offset, // Flags bool no_rig, bool fix_rig_translations, bool fix_rig_rotations, bool float_timestamp_offsets, double robust_threshold, // Output ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { ceres::CostFunction* bracketed_cost_function = rig::BracketedCamError::Create(dist_ip, beg_ref_timestamp, end_ref_timestamp, cam_timestamp, image_block_sizes, cam_params); ceres::LossFunction* bracketed_loss_function = rig::GetLossFunction("cauchy", robust_threshold); // Handle the case of no distortion double * distortion_ptr = NULL; if (distortion_vec.size() > 0) distortion_ptr = &distortion_vec[0]; else distortion_ptr = distortion_placeholder_ptr; residual_names.push_back(R.cam_names[cam_type] + "_pix_x"); residual_names.push_back(R.cam_names[cam_type] + "_pix_y"); residual_scales.push_back(1.0); residual_scales.push_back(1.0); problem.AddResidualBlock (bracketed_cost_function, bracketed_loss_function, beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, xyz_ptr, timestamp_offset_ptr, focal_length_ptr, optical_center_ptr, distortion_ptr); // See which intrinsics to float if (intrinsics_to_float.find("focal_length") == intrinsics_to_float.end()) problem.SetParameterBlockConstant(focal_length_ptr); if (intrinsics_to_float.find("optical_center") == intrinsics_to_float.end()) problem.SetParameterBlockConstant(optical_center_ptr); if (intrinsics_to_float.find("distortion") == intrinsics_to_float.end() || distortion_vec.size() == 0) problem.SetParameterBlockConstant(distortion_ptr); if (!no_rig) { // See if to float the beg camera, which here will point to the ref cam if (camera_poses_to_float.find(R.refSensor(cam_type)) == camera_poses_to_float.end()) problem.SetParameterBlockConstant(beg_cam_ptr); } else { // There is no rig. Then beg_cam_ptr refers to camera // for cams[cid], and not to its ref bracketing cam. // See if the user wants it floated. if (camera_poses_to_float.find(R.cam_names[cam_type]) == camera_poses_to_float.end()) problem.SetParameterBlockConstant(beg_cam_ptr); } // The end cam floats only if the ref cam can float and end cam brackets // a non-ref cam and we have a rig. if (camera_poses_to_float.find(R.refSensor(cam_type)) == camera_poses_to_float.end() || R.isRefSensor(R.cam_names[cam_type]) || no_rig) problem.SetParameterBlockConstant(end_cam_ptr); // ref_to_cam is kept fixed at the identity if the cam is the ref type or // no rig if (camera_poses_to_float.find(R.cam_names[cam_type]) == camera_poses_to_float.end() || R.isRefSensor(R.cam_names[cam_type]) || no_rig) { problem.SetParameterBlockConstant(ref_to_cam_ptr); fixed_parameters.insert(ref_to_cam_ptr); } // See if to fix the rig translation or rotation components if ((fix_rig_translations || fix_rig_rotations) && fixed_parameters.find(ref_to_cam_ptr) == fixed_parameters.end()) problem.SetManifold(ref_to_cam_ptr, constant_transform_manifold); // See if to fix some images. For that, an image must be in the list, // and its camera must be either of ref type or there must be no rig. if (!fixed_images.empty() && (fixed_images.find(image_name) != fixed_images.end()) && (R.isRefSensor(R.cam_names[cam_type]) || no_rig)) problem.SetParameterBlockConstant(beg_cam_ptr); if (!float_timestamp_offsets || R.isRefSensor(R.cam_names[cam_type]) || no_rig) { // Either we don't float timestamp offsets at all, or the cam is the ref type, // or with no extrinsics, when it can't float anyway. problem.SetParameterBlockConstant(timestamp_offset_ptr); } else { problem.SetParameterLowerBound(timestamp_offset_ptr, 0, min_timestamp_offset); problem.SetParameterUpperBound(timestamp_offset_ptr, 0, max_timestamp_offset); } } // Ensure that the depth points agree with triangulated points void addRigDepthTriCostFun(// Observation Eigen::Vector3d const& depth_xyz, double beg_ref_timestamp, double end_ref_timestamp, double cam_timestamp, // Params & Variables std::vector<int> const& depth_block_sizes, int num_depth_params, double* beg_cam_ptr, double* end_cam_ptr, double* ref_to_cam_ptr, double* depth_to_image_ptr, double* depth_to_image_scale_ptr, double* xyz_ptr, double* timestamp_offset_ptr, rig::RigSet const& R, int cam_type, std::set<std::string> const& depth_to_image_transforms_to_float, // Flags bool float_scale, bool affine_depth_to_image, double depth_tri_weight, double robust_threshold, // Output ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { ceres::CostFunction* bracketed_depth_cost_function = rig::BracketedDepthError::Create(depth_tri_weight, depth_xyz, beg_ref_timestamp, end_ref_timestamp, cam_timestamp, depth_block_sizes); ceres::LossFunction* bracketed_depth_loss_function = rig::GetLossFunction("cauchy", robust_threshold); residual_names.push_back("depth_tri_x_m"); residual_names.push_back("depth_tri_y_m"); residual_names.push_back("depth_tri_z_m"); residual_scales.push_back(depth_tri_weight); residual_scales.push_back(depth_tri_weight); residual_scales.push_back(depth_tri_weight); problem.AddResidualBlock (bracketed_depth_cost_function, bracketed_depth_loss_function, beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, depth_to_image_ptr, depth_to_image_scale_ptr, xyz_ptr, timestamp_offset_ptr); // Note that above we already considered fixing some params. // We won't repeat that code here. // If we model an affine depth to image, fix its scale here, // it will change anyway as part of depth_to_image_vec. if (!float_scale || affine_depth_to_image) { problem.SetParameterBlockConstant(depth_to_image_scale_ptr); } if (depth_to_image_transforms_to_float.find(R.cam_names[cam_type]) == depth_to_image_transforms_to_float.end()) problem.SetParameterBlockConstant(depth_to_image_ptr); } // Try to make each mesh intersection agree with corresponding depth // measurement, if it exists void addRigDepthMeshCostFun(// Observation Eigen::Vector3d const& depth_xyz, Eigen::Vector3d const& mesh_xyz, double beg_ref_timestamp, double end_ref_timestamp, double cam_timestamp, // Params & Variables std::vector<int> const& depth_mesh_block_sizes, int num_depth_params, double* beg_cam_ptr, double* end_cam_ptr, double* ref_to_cam_ptr, double* depth_to_image_ptr, double* depth_to_image_scale_ptr, double* timestamp_offset_ptr, rig::RigSet const& R, int cam_type, std::set<std::string> const& depth_to_image_transforms_to_float, // Flags bool float_scale, bool affine_depth_to_image, double depth_mesh_weight, double robust_threshold, // Output ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { ceres::CostFunction* bracketed_depth_mesh_cost_function = rig::BracketedDepthMeshError::Create (depth_mesh_weight, depth_xyz, mesh_xyz, beg_ref_timestamp, end_ref_timestamp, cam_timestamp, depth_mesh_block_sizes); ceres::LossFunction* bracketed_depth_mesh_loss_function = rig::GetLossFunction("cauchy", robust_threshold); residual_names.push_back("depth_mesh_x_m"); residual_names.push_back("depth_mesh_y_m"); residual_names.push_back("depth_mesh_z_m"); residual_scales.push_back(depth_mesh_weight); residual_scales.push_back(depth_mesh_weight); residual_scales.push_back(depth_mesh_weight); problem.AddResidualBlock (bracketed_depth_mesh_cost_function, bracketed_depth_mesh_loss_function, beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, depth_to_image_ptr, depth_to_image_scale_ptr, timestamp_offset_ptr); // Note that above we already fixed some of these variables. // Repeat the fixing of depth variables, however, as the previous block // may not take place. if (!float_scale || affine_depth_to_image) problem.SetParameterBlockConstant(depth_to_image_scale_ptr); if (depth_to_image_transforms_to_float.find(R.cam_names[cam_type]) == depth_to_image_transforms_to_float.end()) problem.SetParameterBlockConstant(depth_to_image_ptr); } void addRigMeshTriCostFun(Eigen::Vector3d const& avg_mesh_xyz, std::vector<int> const& xyz_block_sizes, double mesh_tri_weight, double robust_threshold, double* xyz_ptr, ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { // Try to make the triangulated point agree with the mesh intersection ceres::CostFunction* mesh_cost_function = rig::XYZError::Create(avg_mesh_xyz, xyz_block_sizes, mesh_tri_weight); ceres::LossFunction* mesh_loss_function = rig::GetLossFunction("cauchy", robust_threshold); problem.AddResidualBlock(mesh_cost_function, mesh_loss_function, xyz_ptr); residual_names.push_back("mesh_tri_x_m"); residual_names.push_back("mesh_tri_y_m"); residual_names.push_back("mesh_tri_z_m"); residual_scales.push_back(mesh_tri_weight); residual_scales.push_back(mesh_tri_weight); residual_scales.push_back(mesh_tri_weight); } void addRigHeightsFromDemCostFun(Eigen::Vector3d const& dem_xyz, double uncertainty, double robust_threshold, double* xyz_ptr, ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { // Create the DEM constraint cost function ceres::CostFunction* dem_cost_function = rig::HeightsFromDemError::Create(dem_xyz, uncertainty); ceres::LossFunction* dem_loss_function = NULL; if (robust_threshold > 0.0) dem_loss_function = new ceres::CauchyLoss(robust_threshold); problem.AddResidualBlock(dem_cost_function, dem_loss_function, xyz_ptr); residual_names.push_back("dem_x_m"); residual_names.push_back("dem_y_m"); residual_names.push_back("dem_z_m"); double scale = 1.0/uncertainty; residual_scales.push_back(scale); residual_scales.push_back(scale); residual_scales.push_back(scale); } void addRigTriCostFun(Eigen::Vector3d const& xyz_orig, std::vector<int> const& xyz_block_sizes, double tri_weight, double robust_threshold, double* xyz_ptr, ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { // Try to make the triangulated points (and hence cameras) not move too far ceres::CostFunction* tri_cost_function = rig::XYZError::Create(xyz_orig, xyz_block_sizes, tri_weight); ceres::LossFunction* tri_loss_function = rig::GetLossFunction("cauchy", robust_threshold); problem.AddResidualBlock(tri_cost_function, tri_loss_function, xyz_ptr); residual_names.push_back("tri_x_m"); residual_names.push_back("tri_y_m"); residual_names.push_back("tri_z_m"); residual_scales.push_back(tri_weight); residual_scales.push_back(tri_weight); residual_scales.push_back(tri_weight); } // Add the camera position constraints for the ref cams void addRigCamPosCostFun(// Observation std::vector<rig::cameraImage> const& cams, // Params & Variables rig::RigSet const& R, std::set<std::string> const& camera_poses_to_float, std::vector<double> const& ref_timestamps, std::vector<double>& world_to_cam_vec, std::vector<double>& world_to_ref_vec, std::vector<double>& ref_to_cam_vec, std::vector<double>& ref_identity_vec, std::vector<double>& right_identity_vec, // Flags bool no_rig, double camera_position_uncertainty, // Output ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { for (size_t cid = 0; cid < cams.size(); cid++) { int cam_type = cams[cid].camera_type; auto const& sensor_name = R.cam_names[cam_type]; if (camera_poses_to_float.find(sensor_name) == camera_poses_to_float.end()) continue; // sensor not floated if (!no_rig && !R.isRefSensor(sensor_name)) continue; // only ref sensors are floated in a rig // Find timestamps and pointers to bracketing cameras ref_to_cam transform. // This strongly depends on whether we are using a rig or not. double beg_ref_timestamp = -1.0, end_ref_timestamp = -1.0, cam_timestamp = -1.0; double *beg_cam_ptr = NULL, *end_cam_ptr = NULL, *ref_to_cam_ptr = NULL; rig::calcBracketing(// Inputs no_rig, cid, cam_type, cams, ref_timestamps, R, world_to_cam_vec, world_to_ref_vec, ref_to_cam_vec, ref_identity_vec, right_identity_vec, // Outputs beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, beg_ref_timestamp, end_ref_timestamp, cam_timestamp); ceres::CostFunction* cam_pos_cost_function = rig::CamPositionErr::Create(beg_cam_ptr, camera_position_uncertainty); ceres::LossFunction* cam_pos_loss_function = NULL; // no robust threshold problem.AddResidualBlock(cam_pos_cost_function, cam_pos_loss_function, beg_cam_ptr); residual_names.push_back(sensor_name + "_pos_x"); residual_names.push_back(sensor_name + "_pos_y"); residual_names.push_back(sensor_name + "_pos_z"); residual_names.push_back(sensor_name + "_q_x"); residual_names.push_back(sensor_name + "_q_y"); residual_names.push_back(sensor_name + "_q_z"); residual_names.push_back(sensor_name + "_q_w"); // Record the uncertainty scaling factor in residual scales residual_scales.push_back(1.0/camera_position_uncertainty); residual_scales.push_back(1.0/camera_position_uncertainty); residual_scales.push_back(1.0/camera_position_uncertainty); residual_scales.push_back(1.0); // Rotations will not be constrained residual_scales.push_back(1.0); residual_scales.push_back(1.0); residual_scales.push_back(1.0); } } // Set up the optimization problem for rig calibration void setupRigOptProblem(// Inputs std::vector<cameraImage> const& cams, RigSet& R, std::vector<double> const& ref_timestamps, OptState& state, std::vector<double>& depth_to_image_scales, KeypointVec const& keypoint_vec, rig::PidCidFid const& pid_to_cid_fid, rig::PidCidFidMap const& pid_cid_fid_inlier, rig::PidCidFidToMeshXyz const& pid_cid_fid_mesh_xyz, std::vector<Eigen::Vector3d> const& pid_mesh_xyz, std::vector<Eigen::Vector3d>& xyz_vec, std::vector<Eigen::Vector3d> const& xyz_vec_orig, std::vector<Eigen::Vector3d> const& dem_xyz_vec, rig::RigBlockSizes const& block_sizes, int num_depth_params, std::vector<double> const& min_timestamp_offset, std::vector<double> const& max_timestamp_offset, RigOptions const& opt, // Outputs rig::PidCidFidMap& pid_cid_fid_to_residual_index, ceres::Problem& problem, std::vector<std::string>& residual_names, std::vector<double>& residual_scales) { bool has_mesh = (opt.mesh != ""); // For when we don't have distortion but must get a pointer to // distortion for the interface double distortion_placeholder = 0.0; // Prepare for the case of fixed rig translations and/or rotations std::set<double*> fixed_parameters; // to avoid double fixing ceres::SubsetManifold* constant_transform_manifold = nullptr; rig::setUpFixRigOptions(opt.no_rig, opt.fix_rig_translations, opt.fix_rig_rotations, constant_transform_manifold); for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) continue; // Find timestamps and pointers to bracketing cameras ref_to_cam transform. // This strongly depends on whether we are using a rig or not. int cam_type = cams[cid].camera_type; double beg_ref_timestamp = -1.0, end_ref_timestamp = -1.0, cam_timestamp = -1.0; double *beg_cam_ptr = NULL, *end_cam_ptr = NULL, *ref_to_cam_ptr = NULL; rig::calcBracketing(// Inputs opt.no_rig, cid, cam_type, cams, ref_timestamps, R, state.world_to_cam_vec, state.world_to_ref_vec, state.ref_to_cam_vec, state.ref_identity_vec, state.right_identity_vec, // Outputs beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, beg_ref_timestamp, end_ref_timestamp, cam_timestamp); Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second); // Remember the index of the pixel residuals about to create pid_cid_fid_to_residual_index[pid][cid][fid] = residual_names.size(); // Add pixel reprojection error cost function rig::addRigReprojCostFun(dist_ip, beg_ref_timestamp, end_ref_timestamp, cam_timestamp, block_sizes.image_block_sizes, R.cam_params[cam_type], state.distortions[cam_type], &distortion_placeholder, beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, &xyz_vec[pid][0], &R.ref_to_cam_timestamp_offsets[cam_type], &state.focal_lengths[cam_type], &state.optical_centers[cam_type][0], R, cam_type, cams[cid].image_name, opt.intrinsics_to_float[cam_type], opt.camera_poses_to_float, opt.fixed_images, fixed_parameters, constant_transform_manifold, min_timestamp_offset[cam_type], max_timestamp_offset[cam_type], opt.no_rig, opt.fix_rig_translations, opt.fix_rig_rotations, opt.float_timestamp_offsets, opt.robust_threshold, problem, residual_names, residual_scales); // Add the depth to triangulated point constraint Eigen::Vector3d depth_xyz(0, 0, 0); bool have_depth_tri_constraint = (opt.depth_tri_weight > 0 && rig::depthValue(cams[cid].depth_cloud, dist_ip, depth_xyz)); if (have_depth_tri_constraint) rig::addRigDepthTriCostFun(depth_xyz, beg_ref_timestamp, end_ref_timestamp, cam_timestamp, block_sizes.depth_block_sizes, num_depth_params, beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, &state.depth_to_image_vec[num_depth_params * cam_type], &depth_to_image_scales[cam_type], &xyz_vec[pid][0], &R.ref_to_cam_timestamp_offsets[cam_type], R, cam_type, opt.depth_to_image_transforms_to_float, opt.float_scale, opt.affine_depth_to_image, opt.depth_tri_weight, opt.robust_threshold, problem, residual_names, residual_scales); // Add the depth to mesh constraint bool have_depth_mesh_constraint = false; depth_xyz = Eigen::Vector3d(0, 0, 0); Eigen::Vector3d mesh_xyz(0, 0, 0); if (has_mesh) { mesh_xyz = rig::getMapValue(pid_cid_fid_mesh_xyz, pid, cid, fid); have_depth_mesh_constraint = (opt.depth_mesh_weight > 0 && mesh_xyz != rig::badMeshXyz() && rig::depthValue(cams[cid].depth_cloud, dist_ip, depth_xyz)); } if (have_depth_mesh_constraint) rig::addRigDepthMeshCostFun(depth_xyz, mesh_xyz, beg_ref_timestamp, end_ref_timestamp, cam_timestamp, block_sizes.depth_mesh_block_sizes, num_depth_params, beg_cam_ptr, end_cam_ptr, ref_to_cam_ptr, &state.depth_to_image_vec[num_depth_params * cam_type], &depth_to_image_scales[cam_type], &R.ref_to_cam_timestamp_offsets[cam_type], R, cam_type, opt.depth_to_image_transforms_to_float, opt.float_scale, opt.affine_depth_to_image, opt.depth_mesh_weight, opt.robust_threshold, problem, residual_names, residual_scales); } // end iterating over all cid for given pid // The constraints below will be for each triangulated point. Skip such a // point if all rays converging to it come from outliers. bool isTriInlier = false; for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; if (rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) { isTriInlier = true; break; // found it to be an inlier, no need to do further checking } } // Add mesh-to-triangulated point constraint. Only apply for inlier points. bool have_mesh_tri_constraint = false; Eigen::Vector3d avg_mesh_xyz(0, 0, 0); if (has_mesh && isTriInlier) { avg_mesh_xyz = pid_mesh_xyz.at(pid); if (opt.mesh_tri_weight > 0 && avg_mesh_xyz != rig::badMeshXyz()) have_mesh_tri_constraint = true; } if (have_mesh_tri_constraint) rig::addRigMeshTriCostFun(avg_mesh_xyz, block_sizes.xyz_block_sizes, opt.mesh_tri_weight, opt.robust_threshold, &xyz_vec[pid][0], problem, residual_names, residual_scales); bool haveDem = (!opt.heights_from_dem.empty() && opt.heights_from_dem_uncertainty > 0.0 && pid < dem_xyz_vec.size() && dem_xyz_vec[pid].norm() > 0 && xyz_vec[pid].norm() > 0); // Add the constraint that the triangulated point does not go too far. // This is exclusive with the dem and mesh constraints. if (opt.tri_weight > 0.0 && isTriInlier && !haveDem && !have_mesh_tri_constraint) rig::addRigTriCostFun(xyz_vec_orig[pid], block_sizes.xyz_block_sizes, opt.tri_weight, opt.tri_robust_threshold, &xyz_vec[pid][0], problem, residual_names, residual_scales); // Add DEM constraints if requested and if we have valid DEM point and // triangulated point. if (haveDem && isTriInlier) rig::addRigHeightsFromDemCostFun(dem_xyz_vec[pid], opt.heights_from_dem_uncertainty, opt.heights_from_dem_robust_threshold, &xyz_vec[pid][0], problem, residual_names, residual_scales); } // end iterating over pid // Add the camera position constraints for the ref cams. Need to respect // the fact that opt.camera_position_uncertainty type is a vector of vectors. if (opt.camera_position_uncertainty.size() > 0) rig::addRigCamPosCostFun(cams, R, opt.camera_poses_to_float, ref_timestamps, state.world_to_cam_vec, state.world_to_ref_vec, state.ref_to_cam_vec, state.ref_identity_vec, state.right_identity_vec, opt.no_rig, opt.camera_position_uncertainty[0][0], problem, residual_names, residual_scales); } // Run an optimization pass for rig calibration void runOptPass(int pass, int num_depth_params, rig::RigOptions const& opt, std::vector<rig::cameraImage> const& imgData, std::vector<double> const& ref_timestamps, rig::KeypointVec const& keypoint_vec, rig::PidCidFid const& pid_to_cid_fid, std::vector<double> const& min_timestamp_offset, std::vector<double> const& max_timestamp_offset, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, // Outputs std::vector<double> & depth_to_image_scales, rig::Extrinsics & cams, rig::RigSet & R, std::vector<Eigen::Vector3d> & xyz_vec, rig::PidCidFidMap & pid_cid_fid_inlier) { // Set up the block sizes rig::RigBlockSizes block_sizes; rig::set_up_block_sizes(num_depth_params, block_sizes); // Optimization state local to this pass. Must update the state from // extrinsics and rig config, run the optimization, then update back the extrinsics. rig::OptState state; rig::toOptState(cams, R, state, opt.no_rig, opt.affine_depth_to_image, num_depth_params); // Update cams.world_to_cam from current state. This is strictly necessary // only when the rig is on, as then this data must be derived from the rig // and the transforms for the reference sensor. rig::calcWorldToCam(// Inputs opt.no_rig, imgData, state.world_to_ref_vec, ref_timestamps, state.ref_to_cam_vec, state.world_to_cam_vec, R.ref_to_cam_timestamp_offsets, // Output cams.world_to_cam); // Triangulate, unless desired to reuse the initial points if (!opt.use_initial_triangulated_points) rig::multiViewTriangulation(// Inputs R.cam_params, imgData, cams.world_to_cam, pid_to_cid_fid, keypoint_vec, // Outputs pid_cid_fid_inlier, xyz_vec); // This is a copy which won't change std::vector<Eigen::Vector3d> xyz_vec_orig; if (opt.tri_weight > 0.0) { // Better copy manually to ensure no shallow copy xyz_vec_orig.resize(xyz_vec.size()); for (size_t pt_it = 0; pt_it < xyz_vec.size(); pt_it++) { for (int coord_it = 0; coord_it < 3; coord_it++) { xyz_vec_orig[pt_it][coord_it] = xyz_vec[pt_it][coord_it]; } } } // Compute where each ray intersects the mesh rig::PidCidFidToMeshXyz pid_cid_fid_mesh_xyz; std::vector<Eigen::Vector3d> pid_mesh_xyz; if (opt.mesh != "") rig::meshTriangulations(// Inputs R.cam_params, imgData, cams.world_to_cam, pid_to_cid_fid, pid_cid_fid_inlier, keypoint_vec, opt.min_ray_dist, opt.max_ray_dist, mesh, bvh_tree, // Outputs pid_cid_fid_mesh_xyz, pid_mesh_xyz); // Update triangulated points with DEM heights if requested std::vector<Eigen::Vector3d> dem_xyz_vec; if (opt.heights_from_dem != "") rig::updateTriPtsFromDem(R.cam_params, imgData, cams.world_to_cam, pid_to_cid_fid, pid_cid_fid_inlier, keypoint_vec, opt.heights_from_dem, // Outputs xyz_vec_orig, xyz_vec, dem_xyz_vec); // For a given fid = pid_to_cid_fid[pid][cid], the value // pid_cid_fid_to_residual_index[pid][cid][fid] will be the index in the array // of residuals (look only at pixel residuals). This structure is populated // only for inliers, so its total number of elements changes at each pass. rig::PidCidFidMap pid_cid_fid_to_residual_index; pid_cid_fid_to_residual_index.resize(pid_to_cid_fid.size()); // Form the problem ceres::Problem problem; std::vector<std::string> residual_names; std::vector<double> residual_scales; rig::setupRigOptProblem(imgData, R, ref_timestamps, state, depth_to_image_scales, keypoint_vec, pid_to_cid_fid, pid_cid_fid_inlier, pid_cid_fid_mesh_xyz, pid_mesh_xyz, xyz_vec, xyz_vec_orig, dem_xyz_vec, block_sizes, num_depth_params, min_timestamp_offset, max_timestamp_offset, opt, // Outputs pid_cid_fid_to_residual_index, problem, residual_names, residual_scales); // Evaluate the residuals before optimization std::vector<double> residuals; rig::evalResiduals("before opt", residual_names, residual_scales, problem, residuals); if (pass == 0) rig::writeResiduals(opt.out_prefix, "initial", R.cam_names, imgData, keypoint_vec, pid_to_cid_fid, pid_cid_fid_inlier, pid_cid_fid_to_residual_index, residuals); // Solve the problem ceres::Solver::Options options; ceres::Solver::Summary summary; options.linear_solver_type = ceres::ITERATIVE_SCHUR; options.num_threads = opt.num_threads; options.max_num_iterations = opt.num_iterations; options.minimizer_progress_to_stdout = true; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.parameter_tolerance = opt.parameter_tolerance; ceres::Solve(options, &problem, &summary); // The optimization is done. Convert state back to extrinsics and R (includes intrinsics). rig::fromOptState(state, cams, R, opt.no_rig, opt.affine_depth_to_image, num_depth_params); // Update cams.world_to_cam from optimized state. This is strictly necessary // only when the rig is on, as then this data must be derived from the rig // and the transforms for the reference sensor. rig::calcWorldToCam(// Inputs opt.no_rig, imgData, state.world_to_ref_vec, ref_timestamps, state.ref_to_cam_vec, state.world_to_cam_vec, R.ref_to_cam_timestamp_offsets, // Output cams.world_to_cam); // Evaluate the residuals after optimization rig::evalResiduals("after opt", residual_names, residual_scales, problem, residuals); // Flag outliers after this pass using the computed residuals rig::flagOutliers(// Inputs opt.min_triangulation_angle, opt.max_reprojection_error, pid_to_cid_fid, keypoint_vec, cams.world_to_cam, xyz_vec, pid_cid_fid_to_residual_index, residuals, // Outputs pid_cid_fid_inlier); rig::writeResiduals(opt.out_prefix, "final", R.cam_names, imgData, keypoint_vec, pid_to_cid_fid, pid_cid_fid_inlier, pid_cid_fid_to_residual_index, residuals); } } // end namespace rig ================================================ FILE: src/asp/Rig/RigOptimizer.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_OPTIMIZER_H #define ASP_RIG_OPTIMIZER_H #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/RigTypeDefs.h> #include <asp/Rig/RigData.h> #include <asp/Rig/TextureProcessing.h> #include <Eigen/Core> #include <Eigen/Geometry> #include <vector> #include <string> namespace rig { // Forward declarations class cameraImage; class RigSet; class RigOptions; // Run an optimization pass for rig calibration void runOptPass(int pass, int num_depth_params, rig::RigOptions const& opt, std::vector<rig::cameraImage> const& imgData, std::vector<double> const& ref_timestamps, rig::KeypointVec const& keypoint_vec, rig::PidCidFid const& pid_to_cid_fid, std::vector<double> const& min_timestamp_offset, std::vector<double> const& max_timestamp_offset, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, // Outputs std::vector<double> & depth_to_image_scales, rig::Extrinsics & cams, rig::RigSet & R, std::vector<Eigen::Vector3d> & xyz_vec, rig::PidCidFidMap & pid_cid_fid_inlier); } // namespace rig #endif // ASP_RIG_OPTIMIZER_H ================================================ FILE: src/asp/Rig/RigOptions.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file RigOptions.h /// /// Options structure for rig_calibrator, inheriting common options from BaBaseOptions. #ifndef __ASP_RIG_OPTIONS_H__ #define __ASP_RIG_OPTIONS_H__ #include <asp/Core/BaBaseOptions.h> #include <set> #include <string> namespace rig { struct RigOptions: public asp::BaBaseOptions { std::string rig_config, image_sensor_list, intrinsics_to_float_str, camera_poses_to_float_str, depth_to_image_transforms_to_float_str, mesh, hugin_file, xyz_file, camera_poses, extra_list, out_texture_dir; double bracket_len, depth_tri_weight, mesh_tri_weight, depth_mesh_weight, timestamp_offsets_max_change, initial_max_reprojection_error, max_reprojection_error, min_ray_dist, max_ray_dist; int num_overlaps, num_match_threads; bool fix_rig_translations, fix_rig_rotations, float_scale, float_timestamp_offsets, use_initial_triangulated_points, affine_depth_to_image, registration, skip_post_registration, no_rig, no_nvm_matches, use_initial_rig_transforms, bracket_single_image, nearest_neighbor_interp, read_nvm_no_shift, save_nvm_no_shift, save_matches, export_to_voxblox, save_pinhole_cameras, save_transformed_depth_clouds, verbose; // Parsed options std::vector<std::set<std::string>> intrinsics_to_float; std::set<std::string> camera_poses_to_float; std::set<std::string> depth_to_image_transforms_to_float; std::set<std::string> fixed_images; RigOptions(): asp::BaBaseOptions(), bracket_len(0.6), depth_tri_weight(1000.0), mesh_tri_weight(0.0), depth_mesh_weight(0.0), timestamp_offsets_max_change(1.0), initial_max_reprojection_error(300.0), max_reprojection_error(25.0), min_ray_dist(0.0), max_ray_dist(100.0), num_overlaps(0), num_match_threads(8), fix_rig_translations(false), fix_rig_rotations(false), float_scale(false), float_timestamp_offsets(false), use_initial_triangulated_points(false), affine_depth_to_image(false), registration(false), skip_post_registration(false), no_rig(false), no_nvm_matches(false), use_initial_rig_transforms(false), bracket_single_image(false), nearest_neighbor_interp(false), read_nvm_no_shift(false), save_nvm_no_shift(false), save_matches(false), export_to_voxblox(false), save_pinhole_cameras(false), save_transformed_depth_clouds(false), verbose(false) {}; }; } // namespace rig #endif // __ASP_RIG_OPTIONS_H__ ================================================ FILE: src/asp/Rig/RigOutlier.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/RigOutlier.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/BasicAlgs.h> #include <iostream> #include <iomanip> namespace rig { void flagOutlierByExclusionDist(// Inputs std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, // Outputs PidCidFidMap & pid_cid_fid_inlier) { // Initialize the output pid_cid_fid_inlier.resize(pid_to_cid_fid.size()); // Iterate though interest point matches int num_excl = 0; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; int cam_type = cams[cid].camera_type; // Initially there are inliers only pid_cid_fid_inlier[pid][cid][fid] = 1; // Flag as outliers pixels at the image boundary. Eigen::Vector2d dist_pix(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second); Eigen::Vector2i dist_size = cam_params[cam_type].GetDistortedSize(); Eigen::Vector2i dist_crop_size = cam_params[cam_type].GetDistortedCropSize(); // Note that if dist_crop_size equals dist_size, which is image // size, no outliers are flagged if (std::abs(dist_pix[0] - dist_size[0] / 2.0) > dist_crop_size[0] / 2.0 || std::abs(dist_pix[1] - dist_size[1] / 2.0) > dist_crop_size[1] / 2.0) { rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0); num_excl++; } } } std::cout << "Removed " << num_excl << " features based on distorted_crop_size region.\n"; return; } // Flag outliers by triangulation angle and reprojection error. It is // assumed that the cameras in world_to_cam are up-to-date given the // current state of optimization, and that the residuals (including // the reprojection errors) have also been updated beforehand. void flagOutliers(// Inputs double min_triangulation_angle, double max_reprojection_error, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, std::vector<Eigen::Affine3d> const& world_to_cam, std::vector<Eigen::Vector3d> const& xyz_vec, PidCidFidMap const& pid_cid_fid_to_residual_index, std::vector<double> const& residuals, // Outputs PidCidFidMap & pid_cid_fid_inlier) { // Must deal with outliers by triangulation angle before // removing outliers by reprojection error, as the latter will // exclude some rays which form the given triangulated points. int num_outliers_small_angle = 0; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { // Find the largest angle among any two intersecting rays double max_rays_angle = 0.0; bool point_checked = false; for (auto cid_fid1 = pid_to_cid_fid[pid].begin(); cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) { int cid1 = cid_fid1->first; int fid1 = cid_fid1->second; // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1)) continue; Eigen::Vector3d cam_ctr1 = (world_to_cam[cid1].inverse()) * Eigen::Vector3d(0, 0, 0); Eigen::Vector3d ray1 = xyz_vec[pid] - cam_ctr1; ray1.normalize(); for (auto cid_fid2 = pid_to_cid_fid[pid].begin(); cid_fid2 != pid_to_cid_fid[pid].end(); cid_fid2++) { int cid2 = cid_fid2->first; int fid2 = cid_fid2->second; // Look at each cid and next cids if (cid2 <= cid1) continue; // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid2, fid2)) continue; point_checked = true; Eigen::Vector3d cam_ctr2 = (world_to_cam[cid2].inverse()) * Eigen::Vector3d(0, 0, 0); Eigen::Vector3d ray2 = xyz_vec[pid] - cam_ctr2; ray2.normalize(); double curr_angle = (180.0 / M_PI) * acos(ray1.dot(ray2)); if (std::isnan(curr_angle) || std::isinf(curr_angle)) continue; max_rays_angle = std::max(max_rays_angle, curr_angle); } } if (max_rays_angle >= min_triangulation_angle) continue; // This is a good triangulated point, with large angle of convergence if (!point_checked) continue; // this point was an outlier to start with // Flag as outliers all the features for this cid and increment the counter num_outliers_small_angle++; for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0); } } std::cout << std::setprecision(4) << "Removed " << num_outliers_small_angle << " triangulated points out of " << pid_to_cid_fid.size() << " (" << (100.0 * num_outliers_small_angle) / pid_to_cid_fid.size() << ")" << " by ray convergence angle.\n"; int num_outliers_reproj = 0; int num_total_features = 0; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) continue; num_total_features++; // Find the pixel residuals size_t residual_index = rig::getMapValue(pid_cid_fid_to_residual_index, pid, cid, fid); if (residuals.size() <= residual_index + 1) LOG(FATAL) << "Too few residuals.\n"; double res_x = residuals[residual_index + 0]; double res_y = residuals[residual_index + 1]; // NaN values will never be inliers if the comparison is set as below bool is_good = (Eigen::Vector2d(res_x, res_y).norm() <= max_reprojection_error); if (!is_good) { num_outliers_reproj++; rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0); } } } std::cout << std::setprecision(4) << "Removed " << num_outliers_reproj << " outlier features using reprojection error, out of " << num_total_features << " (" << (100.0 * num_outliers_reproj) / num_total_features << "%)\n"; return; } } // end namespace rig ================================================ FILE: src/asp/Rig/RigOutlier.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_RIG_OUTLIER_H #define ASP_RIG_RIG_OUTLIER_H #include <asp/Rig/RigTypeDefs.h> #include <vector> #include <Eigen/Core> #include <Eigen/Geometry> namespace rig { class CameraParameters; class cameraImage; void flagOutlierByExclusionDist(// Inputs std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, // Outputs PidCidFidMap & pid_cid_fid_inlier); void flagOutliers(// Inputs double min_triangulation_angle, double max_reprojection_error, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, std::vector<Eigen::Affine3d> const& world_to_cam, std::vector<Eigen::Vector3d> const& xyz_vec, PidCidFidMap const& pid_cid_fid_to_residual_index, std::vector<double> const& residuals, // Outputs PidCidFidMap & pid_cid_fid_inlier); } // namespace rig #endif // ASP_RIG_RIG_OUTLIER_H ================================================ FILE: src/asp/Rig/RigParseOptions.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file RigParseOptions.cc /// /// Parse and validate rig_calibrator command-line options. #include <asp/Rig/RigParseOptions.h> #include <asp/Rig/RigThread.h> #include <asp/Rig/RigParseUtils.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Core/AspProgramOptions.h> #include <vw/Core/Exception.h> #include <vw/Core/StringUtils.h> #include <boost/program_options.hpp> #include <glog/logging.h> namespace po = boost::program_options; namespace rig { // Parse camera_position_uncertainty_str if non-empty void handleCamPosUncertainty(RigOptions& opt) { if (opt.camera_position_uncertainty_str.empty()) return; std::string sep = ","; std::vector<double> vals = vw::str_to_std_vec(opt.camera_position_uncertainty_str, sep); // Check if values were parsed if (vals.empty()) vw::vw_throw(vw::ArgumentErr() << "Camera position uncertainty string is invalid.\n"); // If size is 1, add a second value equal to the first. Only the first will be used, // but need to respect the api. if (vals.size() == 1) vals.push_back(vals[0]); // Validate that values are positive if (vals[0] <= 0.0 || vals[1] <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Camera position uncertainty values must be positive.\n"); opt.camera_position_uncertainty.resize(1); opt.camera_position_uncertainty[0] = vw::Vector2(vals[0], vals[1]); } void handleRigArgs(int argc, char *argv[], RigOptions& opt) { po::options_description general_options(""); general_options.add_options() ("rig-config", po::value(&opt.rig_config)->default_value(""), "Read the rig configuration from this file.") ("nvm", po::value(&opt.nvm)->default_value(""), "Read images and camera poses from this nvm file, as exported by Theia.") ("image-sensor-list", po::value(&opt.image_sensor_list)->default_value(""), "Read image name, sensor name, and timestamp, from each line in this list. " "Alternatively, a directory structure can be used.") ("robust-threshold", po::value(&opt.robust_threshold)->default_value(0.5), "Residual pixel errors and 3D point residuals (the latter multiplied by " "corresponding weight) much larger than this will be logarithmically attenuated " "to affect less the cost function.") ("num-iterations", po::value(&opt.num_iterations)->default_value(100), "How many solver iterations to perform in calibration.") ("bracket-len", po::value(&opt.bracket_len)->default_value(0.6), "Lookup non-reference cam images only between consecutive ref cam images whose " "distance in time is no more than this (in seconds), after adjusting for the " "timestamp offset between these cameras. It is assumed the rig moves slowly and " "uniformly during this time. A large value here will make the calibrator compute " "a poor solution but a small value may prevent enough images being bracketed. See " "also --bracket-single-image.") ("intrinsics-to-float", po::value(&opt.intrinsics_to_float_str)->default_value(""), "Specify which intrinsics to float for each sensor. Example: " "'cam1:focal_length,optical_center,distortion cam2:focal_length'.") ("camera-poses-to-float", po::value(&opt.camera_poses_to_float_str)->default_value(""), "Specify the cameras for which sensors can have their poses floated. Example: " "'cam1 cam3'. The documentation has more details.") ("depth-to-image-transforms-to-float", po::value(&opt.depth_to_image_transforms_to_float_str)->default_value(""), "Specify for which sensors to float the depth-to-image transform (if depth data " "exists). Example: 'cam1 cam3'.") ("fix-rig-translations", po::bool_switch(&opt.fix_rig_translations)->default_value(false), "Fix the translation component of the transforms between the sensors on a rig. " "Works only when --no-rig is not set.") ("fix-rig-rotations", po::bool_switch(&opt.fix_rig_rotations)->default_value(false), "Fix the rotation component of the transforms between the sensors on a rig. Works " "only when --no-rig is not set.") ("float-scale", po::bool_switch(&opt.float_scale)->default_value(false), "If to optimize the scale of the clouds, part of depth-to-image transform. If kept " "fixed, the configuration of cameras should adjust to respect the given scale. This " "parameter should not be used with --affine-depth-to-image when the transform is " "affine, rather than rigid and a scale.") ("float-timestamp-offsets", po::bool_switch(&opt.float_timestamp_offsets)->default_value(false), "If to optimize the timestamp offsets among the cameras. This is experimental.") ("timestamp-offsets-max-change", po::value(&opt.timestamp_offsets_max_change)->default_value(1.0), "If floating the timestamp offsets, do not let them change by more than this " "(measured in seconds). Existing image bracketing acts as an additional constraint.") ("tri-weight", po::value(&opt.tri_weight)->default_value(0.1), "The weight to give to the constraint that optimized triangulated points stay " "close to original triangulated points. A positive value will help ensure the " "cameras do not move too far, but a large value may prevent convergence. This " "does not get set for triangulated points at which --heights-from-dem or --mesh " "constraints are applied.") ("tri-robust-threshold", po::value(&opt.tri_robust_threshold)->default_value(0.1), "The robust threshold to use with the triangulation weight. Must be positive.") ("use-initial-triangulated-points", po::bool_switch(&opt.use_initial_triangulated_points)->default_value(false), "Use the triangulated points from the input nvm file. Together with --tri-weight, " "this ensures the cameras do not move too far from the initial solution. This will " "fail if additional interest point matches are created with --num-overlaps. If " "registration is used, the initial triangulated points are transformed appropriately.") ("depth-tri-weight", po::value(&opt.depth_tri_weight)->default_value(1000.0), "The weight to give to the constraint that depth measurements agree with triangulated " "points. Use a bigger number as depth errors are usually on the order of 0.01 meters " "while reprojection errors are on the order of 1 pixel.") ("mesh", po::value(&opt.mesh)->default_value(""), "Use this mesh to help constrain the calibration (in .ply format). Must use a " "positive --mesh-tri-weight.") ("mesh-tri-weight", po::value(&opt.mesh_tri_weight)->default_value(0.0), "A larger value will give more weight to the constraint that triangulated points " "stay close to the mesh. Not suggested by default.") ("depth-mesh-weight", po::value(&opt.depth_mesh_weight)->default_value(0.0), "A larger value will give more weight to the constraint that the depth clouds stay " "close to the mesh. Not suggested by default.") ("camera-position-uncertainty", po::value(&opt.camera_position_uncertainty_str)->default_value(""), "Camera position uncertainty (1 sigma, in meters). This strongly constrains the " "movement of cameras, potentially at the expense of accuracy. Specify a single value.") ("heights-from-dem", po::value(&opt.heights_from_dem)->default_value(""), "Use this DEM to constrain the triangulated points. The uncertainty of the DEM is " "specified via --heights-from-dem-uncertainty.") ("heights-from-dem-uncertainty", po::value(&opt.heights_from_dem_uncertainty)->default_value(-1.0), "Uncertainty (in meters, 1 sigma) for --heights-from-dem. A smaller value constrains " "more the triangulated points to the DEM specified via --heights-from-dem.") ("heights-from-dem-robust-threshold", po::value(&opt.heights_from_dem_robust_threshold)->default_value(0.1), "Robust threshold for residual errors in triangulated points relative to DEM " "specified via --heights-from-dem. This is applied after the point differences " "are divided by --heights-from-dem-uncertainty. It will attenuate large height " "differences. Set to 0 to turn off.") ("affine-depth-to-image", po::bool_switch(&opt.affine_depth_to_image)->default_value(false), "Assume that the depth-to-image transform for each depth + image camera is an " "arbitrary affine transform rather than scale * rotation + translation.") ("num-passes", po::value(&opt.num_passes)->default_value(2), "How many passes of optimization to do. Outliers will be removed after every pass. " "Each pass will start with the previously optimized solution as an initial guess. " "Mesh intersections (if applicable) and ray triangulation will be recomputed before " "each pass.") ("initial-max-reprojection-error", po::value(&opt.initial_max_reprojection_error)->default_value(300.0), "If filtering outliers, remove interest points for which the reprojection error, in " "pixels, is larger than this. This filtering happens when matches are created, before " "cameras are optimized, and a big value should be used if the initial cameras are not " "trusted.") ("max-reprojection-error", po::value(&opt.max_reprojection_error)->default_value(25.0), "If filtering outliers, remove interest points for which the reprojection error, in " "pixels, is larger than this. This filtering happens after each optimization pass " "finishes, unless disabled. It is better to not filter too aggressively unless " "confident of the solution.") ("min-triangulation-angle", po::value(&opt.min_triangulation_angle)->default_value(0.01), "If filtering outliers, remove triangulated points for which all rays converging to " "it make an angle (in degrees) less than this. Note that some cameras in the rig may " "be very close to each other relative to the triangulated points, so care is needed " "here.") ("out-texture-dir", po::value(&opt.out_texture_dir)->default_value(""), "If non-empty and if an input mesh was provided, project the camera images using the " "optimized poses onto the mesh and write the obtained .obj files in the given " "directory.") ("min-ray-dist", po::value(&opt.min_ray_dist)->default_value(0.0), "The minimum search distance from a starting point along a ray when intersecting the " "ray with a mesh, in meters (if applicable).") ("max-ray-dist", po::value(&opt.max_ray_dist)->default_value(100.0), "The maximum search distance from a starting point along a ray when intersecting the " "ray with a mesh, in meters (if applicable).") ("registration", po::bool_switch(&opt.registration)->default_value(false), "If true, and registration control points for the sparse map exist and are specified " "by --hugin-file and --xyz-file, register all camera poses and the rig transforms " "before starting the optimization. For now, the depth-to-image transforms do not " "change as result of this, which may be a problem. To apply the registration only, " "use zero iterations.") ("hugin-file", po::value(&opt.hugin_file)->default_value(""), "The path to the hugin .pto file used for registration.") ("xyz-file", po::value(&opt.xyz_file)->default_value(""), "The path to the xyz file used for registration.") ("skip-post-registration", po::bool_switch(&opt.skip_post_registration)->default_value(false), "If true and registration to world coordinates takes place, do not apply the " "registration again after the cameras are optimized. This is usually not recommended, " "unless one is quite confident that other constraints (such as using --tri-weight or " "--mesh-tri-weight) are sufficient to keep the cameras from drifting.") ("parameter-tolerance", po::value(&opt.parameter_tolerance)->default_value(1e-12), "Stop when the optimization variables change by less than this.") ("no-rig", po::bool_switch(&opt.no_rig)->default_value(false), "Do not assumes the cameras are on a rig. Hence the pose of any camera of any sensor " "type may vary on its own and not being tied to other sensor types. See also " "--camera-poses-to-float.") ("out-dir,o", po::value(&opt.out_prefix)->default_value(""), "Save in this directory the camera intrinsics and extrinsics. See also " "--save-images-and-depth-clouds, --save-matches, --verbose, and --in-dir.") ("no-nvm-matches", po::bool_switch(&opt.no_nvm_matches)->default_value(false), "Do not read interest point matches from the nvm file. So read only camera poses. " "This implies --num-overlaps is positive, to be able to find new matches.") ("camera-poses", po::value(&opt.camera_poses)->default_value(""), "Read the images and world-to-camera poses from this list. The same format is used " "when this tool saves the updated poses in the output directory. It is preferred to " "read the camera poses with the --nvm option, as then interest point matches will be " "read as well.") ("num-overlaps", po::value(&opt.num_overlaps)->default_value(0), "Match an image with this many images (of all camera types) following it in " "increasing order of timestamp value. Set to a positive value only if desired to find " "more interest point matches than read from the input nvm file. Not suggested by " "default.") ("use-initial-rig-transforms", po::bool_switch(&opt.use_initial_rig_transforms)->default_value(false), "Use the transforms between the sensors (ref_to_sensor_transform) of the rig " "specified via --rig-config to initialize all non-reference camera poses based on the " "reference camera poses and the rig transforms. If this option is not set, derive the " "rig transforms from the poses of individual cameras.") ("bracket-single-image", po::bool_switch(&opt.bracket_single_image)->default_value(false), "If more than one image from a given sensor is acquired between two consecutive " "reference sensor images, as measured by timestamps, keep only one, choosing the image " "that is closest to the midpoint of the interval formed by reference sensor " "timestamps. Only applicable without --no-rig.") ("extra-list", po::value(&opt.extra_list)->default_value(""), "Add to the SfM solution the camera poses for the additional images/depth clouds in " "this list. Use bilinear interpolation of poses in time and nearest neighbor " "extrapolation (within --bracket-len) and/or the rig constraint to find the new poses " "(will be followed by bundle adjustment refinement). This can give incorrect results " "if the new images are not very similar or not close in time to the existing ones. " "This list can contain entries for the data already present.") ("fixed-image-list", po::value(&opt.fixed_image_list_str)->default_value(""), "A file having a list of images, one per line, whose cameras will be fixed during " "optimization.") ("nearest-neighbor-interp", po::bool_switch(&opt.nearest_neighbor_interp)->default_value(false), "Use nearest neighbor interpolation (in time) when inserting extra camera poses.") ("read-nvm-no-shift", po::bool_switch(&opt.read_nvm_no_shift)->default_value(false), "Read an nvm file assuming that interest point matches were not shifted to the " "origin.") ("save-nvm-no-shift", po::bool_switch(&opt.save_nvm_no_shift)->default_value(false), "Save the optimized camera poses and inlier interest point matches to " "<out dir>/cameras_no_shift.nvm. Interest point matches are not offset relative to " "the optical center, which is not standard, but which allows this file to be " "self-contained and for the matches to be drawn with stereo_gui.") ("save-matches", po::bool_switch(&opt.save_matches)->default_value(false), "Save the inlier interest point matches. stereo_gui can be used to visualize these.") ("export-to-voxblox", po::bool_switch(&opt.export_to_voxblox)->default_value(false), "Save the depth clouds and optimized transforms needed to create a mesh with voxblox " "(if depth clouds exist).") ("save-pinhole-cameras", po::bool_switch(&opt.save_pinhole_cameras)->default_value(false), "Save the optimized cameras in ASP's Pinhole format. The distortion model gets saved " "if it is of radtan type (OpenCV radial-tangential distortion model).") ("save-transformed-depth-clouds", po::bool_switch(&opt.save_transformed_depth_clouds)->default_value(false), "Save the depth clouds with the camera transform applied to them to make them be in " "world coordinates.") ("num-threads", po::value(&opt.num_threads)->default_value(rig::defaultNumThreads()), "Number of threads to use.") ("num-match-threads", po::value(&opt.num_match_threads)->default_value(8), "How many threads to use in feature detection/matching. A large number can use a lot " "of memory.") ("verbose", po::bool_switch(&opt.verbose)->default_value(false), "Print a lot of verbose information about how matching goes."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Parse and validate camera position uncertainty handleCamPosUncertainty(opt); // Validation will happen in parameterValidation() } void parameterValidation(RigOptions const& opt) { if (opt.robust_threshold <= 0.0) LOG(FATAL) << "The robust threshold must be positive.\n"; if (opt.bracket_len <= 0.0) LOG(FATAL) << "Bracket length must be positive."; if (opt.num_overlaps < 1 && (opt.nvm == "" || opt.no_nvm_matches)) LOG(FATAL) << "No nvm file was specified or it is not desired to read its matches. " << "Then must set a positive --num-overlaps to be able to find new " << "interest point matches."; if (opt.timestamp_offsets_max_change < 0) LOG(FATAL) << "The timestamp offsets must be non-negative."; if (opt.min_triangulation_angle <= 0.0) LOG(FATAL) << "The min triangulation angle must be positive.\n"; if (opt.depth_tri_weight < 0.0) LOG(FATAL) << "The depth weight must non-negative.\n"; if (opt.mesh_tri_weight < 0.0) LOG(FATAL) << "The mesh weight must non-negative.\n"; if (opt.depth_mesh_weight < 0.0) LOG(FATAL) << "The depth mesh weight must non-negative.\n"; if (opt.tri_weight < 0.0) LOG(FATAL) << "The triangulation weight must non-negative.\n"; if (opt.tri_weight > 0.0 && opt.tri_robust_threshold <= 0.0) LOG(FATAL) << "The triangulation robust threshold must be positive.\n"; // Validate heights-from-dem options if (!opt.heights_from_dem.empty() && opt.heights_from_dem_uncertainty <= 0.0) LOG(FATAL) << "The value of --heights-from-dem-uncertainty must be positive.\n"; if (opt.heights_from_dem.empty() && opt.heights_from_dem_uncertainty > 0.0) LOG(FATAL) << "The value of --heights-from-dem-uncertainty is set, " << "but --heights-from-dem is not set.\n"; if (opt.heights_from_dem_robust_threshold <= 0.0) LOG(FATAL) << "The value of --heights-from-dem-robust-threshold must be positive.\n"; // Validate mesh and DEM exclusivity if (!opt.mesh.empty() && !opt.heights_from_dem.empty()) LOG(FATAL) << "Cannot use both --mesh and --heights-from-dem simultaneously. " << "These constraints may conflict as they both try to constrain triangulated points " << "to different external reference positions.\n"; if (opt.registration && (opt.xyz_file.empty() || opt.hugin_file.empty())) LOG(FATAL) << "In order to register the map, the hugin and xyz file must be specified."; if (opt.float_scale && opt.affine_depth_to_image) LOG(FATAL) << "The options --float-scale and --affine-depth-to-image should not be used " << "together. If the latter is used, the scale is always floated.\n"; if (opt.no_rig && opt.float_timestamp_offsets) LOG(FATAL) << "Cannot float timestamps with option --no-rig.\n"; if (opt.out_prefix == "") LOG(FATAL) << "The output directory was not specified.\n"; if (opt.out_texture_dir != "" && opt.mesh == "") LOG(FATAL) << "Cannot project camera images onto a mesh if a mesh was not provided.\n"; if (opt.rig_config == "") LOG(FATAL) << "Must specify the initial rig configuration via --rig-config.\n"; if (opt.camera_poses != "" && opt.nvm != "") LOG(FATAL) << "Cannot specify both --nvm and --camera-poses.\n"; if (opt.camera_poses == "" && opt.nvm == "") LOG(FATAL) << "Must specify the cameras via --nvm or --camera-poses.\n"; if (opt.num_overlaps > 0 && opt.use_initial_triangulated_points) LOG(FATAL) << "Cannot use the initial triangulated points if new matches are created.\n"; return; } void parseAuxRigOptions(RigOptions& opt, RigSet const& R) { rig::parse_intrinsics_to_float(opt.intrinsics_to_float_str, R.cam_names, opt.intrinsics_to_float); rig::parse_camera_names(R.cam_names, opt.camera_poses_to_float_str, opt.camera_poses_to_float); rig::parse_camera_names(R.cam_names, opt.depth_to_image_transforms_to_float_str, opt.depth_to_image_transforms_to_float); // Read a list of images to keep fixed, if provided if (!opt.fixed_image_list_str.empty()) rig::readList(opt.fixed_image_list_str, opt.fixed_images); } } // end namespace rig ================================================ FILE: src/asp/Rig/RigParseOptions.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file RigParseOptions.h /// /// Parse and validate rig_calibrator command-line options. #ifndef __ASP_RIG_RIG_PARSE_OPTIONS_H__ #define __ASP_RIG_RIG_PARSE_OPTIONS_H__ #include <asp/Rig/RigOptions.h> namespace rig { struct RigSet; // Process the rig_calibrator options using boost::program_options void handleRigArgs(int argc, char *argv[], RigOptions& opt); // Validate rig_calibrator options void parameterValidation(RigOptions const& opt); // Parse auxiliary rig options void parseAuxRigOptions(RigOptions& opt, RigSet const& R); } // namespace rig #endif // __ASP_RIG_RIG_PARSE_OPTIONS_H__ ================================================ FILE: src/asp/Rig/RigParseUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/RigParseUtils.h> #include <asp/Rig/SystemUtils.h> #include <vw/Core/Log.h> #include <glog/logging.h> #include <boost/filesystem.hpp> #include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <algorithm> namespace fs = boost::filesystem; namespace rig { // Find cam type based on cam name void camTypeFromName(std::string const& cam_name, std::vector<std::string> const& cam_names, int& cam_type) { cam_type = 0; // initialize for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) { if (cam_names[cam_it] == cam_name) { cam_type = cam_it; return; } } throw std::string("Could not determine the sensor type for: " + cam_name); } // The parent subdirectory. Example: mydir/nav_cam/file.jpg will return // 'nav_cam'. std::string parentSubdir(std::string const& image_file) { return fs::path(image_file).parent_path().filename().string(); } // Given a file with name // <dir><text><digits>.<digits><text>ref_cam<text>.jpg // or // <dir>/<cam name>/<digits>.<digits>.jpg // find the cam type // Return the index in the basename where the cam name starts or std::string::npos // if not found. size_t findCamType(std::string const& image_file, std::vector<std::string> const& cam_names, // Output int & cam_type) { // Initialize the output cam_type = 0; std::string basename = fs::path(image_file).filename().string(); // Try to find the cam name from the basename // Convention: my_images/<text>10004.6<text>ref_cam<text>.jpg, // where ref_cam is the cam name. bool found_cam_name = false; std::string cam_name; size_t cam_name_pos = std::string::npos; for (size_t cam_it = 0; cam_it < cam_names.size(); cam_it++) { auto pos_it = basename.find(cam_names[cam_it]); if (pos_it != std::string::npos) { cam_name = cam_names[cam_it]; found_cam_name = true; cam_name_pos = pos_it; break; } } // Infer cam name based on name of parent directory if (!found_cam_name) { try { // The cam name is the subdir having the images cam_name = rig::parentSubdir(image_file); found_cam_name = true; } catch (std::string const& e) {} } // Find the sensor id (type) camTypeFromName(cam_name, cam_names, cam_type); // If no luck, cannot continue. In this case the user is supposed to provide // --image_sensor_list. if (!found_cam_name) LOG(FATAL) << "Could not determine the sensor type for: " << image_file << ". Check your rig configuration, or provide --image_sensor_list.\n"; return cam_name_pos; } // Must keep only alphanumeric characters in the s void removeNonAlphaNum(std::string & s) { for (size_t it = 0; it < s.size(); it++) { if ((s[it] < '0' || s[it] > '9') && (s[it] < 'a' || s[it] > 'z') && (s[it] < 'A' || s[it] > 'Z')) { s = s.substr(0, it) + s.substr(it+1); it--; } } } // Given a file with name // <dir>/<text><digits>.<digits><text>ref_cam<text>.jpg // or // <dir>/<cam name>/<digits>.<digits>.jpg // find the cam name and the timestamp. // Can also handle: // <dir>/<group><separator><digits>.<digits><text>ref_cam<text>.jpg // when it parses the group. void findCamTypeAndTimestamp(std::string const& image_file, std::vector<std::string> const& cam_names, // Outputs int & cam_type, double & timestamp, std::string & group) { // Initialize the outputs cam_type = -1; timestamp = 0.0; group = ""; size_t cam_name_pos = rig::findCamType(image_file, cam_names, cam_type); std::string basename = fs::path(image_file).filename().string(); // Eliminate the text starting with the sensor name, if we have // the sensor name as part of the image name. if (cam_name_pos != std::string::npos) basename = basename.substr(0, cam_name_pos); // Eliminate all non-digits at the end of the basename for (size_t it = basename.size(); it > 0; it--) { if (basename[it-1] < '0' || basename[it-1] > '9') { basename = basename.substr(0, it-1); } else { break; } } // Search backward until finding a non-digit or a second dot. // The entry before that is the group, and after is the timestamp. int num_dots = 0; for (size_t it = basename.size(); it > 0; it--) { if (basename[it-1] == '.') num_dots++; if (num_dots >= 2) { basename = basename.substr(it); break; } if (basename[it-1] != '.' && (basename[it-1] < '0' || basename[it-1] > '9')) { group = basename.substr(0, it); basename = basename.substr(it); break; } } removeNonAlphaNum(group); // Read the last sequence of digits, followed potentially by a dot and more // digits. Remove anything after <digits>.<digits>. bool have_dot = false; std::string timestamp_str; bool found_digits = false; for (size_t it = 0; it < basename.size(); it++) { if (!found_digits && (basename[it] < '0' || basename[it] > '9')) continue; // Not a digit yet, keep going found_digits = true; if (basename[it] == '.') { if (have_dot) break; // We have seen a dot already, ignore the rest have_dot = true; timestamp_str += basename[it]; continue; } if (basename[it] < '0' || basename[it] > '9') break; // Not a digit, ignore the rest timestamp_str += basename[it]; } if (timestamp_str.empty()) throw (std::string("Image name (without directory) must have digits as part of ") + std::string("their name, which will be converted to a timestamp.")); // Having the timestamp extracted from the image name is convenient though it // requires some care. This is well-documented. timestamp = atof(timestamp_str.c_str()); } // Given a file with name // <dir>/<group><separator><separator>ref_cam<text>.ext // parse the group and the cam index. void findCamTypeAndGroup(std::string const& image_file, std::vector<std::string> const& cam_names, // Outputs int & cam_type, std::string & group) { // Initialize the outputs cam_type = -1; group = ""; size_t cam_name_pos = rig::findCamType(image_file, cam_names, cam_type); std::string basename = fs::path(image_file).filename().string(); // Eliminate the text starting with the sensor name, if we have // the sensor name as part of the image name. if (cam_name_pos != std::string::npos) group = basename.substr(0, cam_name_pos); removeNonAlphaNum(group); // The group must be non-empty if (group.empty()) LOG(FATAL) << "Could not parse the group from: " << image_file << "\n"; } // Parse a file each line of which contains a filename, a sensor name, and a timestamp. // Then reorder the data based on input file names. bool parseImageSensorList(std::string const& image_sensor_list, std::vector<std::string> const& image_files, std::vector<std::string> const& cam_names, bool flexible_strategy, // Outputs std::vector<int> & cam_types, std::vector<double> & timestamps) { // Wipe the outputs cam_types.clear(); cam_types.resize(image_files.size()); timestamps.clear(); timestamps.resize(image_files.size()); // Open the file std::ifstream f(image_sensor_list.c_str()); if (!f.is_open()) { if (flexible_strategy) return false; else LOG(FATAL) << "Cannot open file for reading: " << image_sensor_list << "\n"; } vw::vw_out() << "Reading: " << image_sensor_list << "\n"; // Go from cam name to cam type std::map<std::string, int> cam_name_to_type; for (size_t it = 0; it < cam_names.size(); it++) cam_name_to_type[cam_names[it]] = it; // Must put the data to read in maps, as they may not be in the same // order as in the input image_files that we must respect. std::map<std::string, int> image_to_cam_type; std::map<std::string, double> image_to_timestamp; std::string line; while (getline(f, line)) { // if line starts with comment or has only white spaces, skip it if (line.empty() || line[0] == '#') continue; if (line.find_first_not_of(" \t\n\v\f\r") == std::string::npos) continue; std::string image_file; double timestamp = 0.0; std::string cam_name; std::istringstream iss(line); if (!(iss >> image_file >> cam_name >> timestamp)) { if (flexible_strategy) return false; else LOG(FATAL) << "Cannot parse: " << image_sensor_list << "\n"; } // Must not have duplicate image_file if (image_to_cam_type.find(image_file) != image_to_cam_type.end()) LOG(FATAL) << "Duplicate image file: " << image_file << " in: " << image_sensor_list << "\n"; if (image_to_timestamp.find(image_file) != image_to_timestamp.end()) LOG(FATAL) << "Duplicate image file: " << image_file << " in: " << image_sensor_list << "\n"; // Look up the sensor name auto it = cam_name_to_type.find(cam_name); if (it == cam_name_to_type.end()) LOG(FATAL) << "Cannot find sensor name: " << cam_name << "\n"; image_to_cam_type[image_file] = it->second; image_to_timestamp[image_file] = timestamp; } // Must now add them in the order of image_files for (size_t img_it = 0; img_it < image_files.size(); img_it++) { auto type_it = image_to_cam_type.find(image_files[img_it]); auto time_it = image_to_timestamp.find(image_files[img_it]); if (type_it == image_to_cam_type.end() || time_it == image_to_timestamp.end()) LOG(FATAL) << "Cannot find image file: " << image_files[img_it] << " in list: " << image_sensor_list << "\n"; cam_types[img_it] = type_it->second; timestamps[img_it] = time_it->second; } return true; } // A little function to replace separators with space. Note that the backslash // is a separator, in case, it used as a continuation line. void replace_separators_with_space(std::string & str) { std::string sep = "\\:, \t\r\n"; for (size_t it = 0; it < sep.size(); it++) std::replace(str.begin(), str.end(), sep[it], ' '); } // A function to parse a string like // 'cam1:focal_length,optical_center,distortion cam2:focal_length' and // extract the intrinsics to float. Separators can be space, comma, // colon. void parse_intrinsics_to_float(std::string const& intrinsics_to_float_str, std::vector<std::string> const& cam_names, std::vector<std::set<std::string>>& intrinsics_to_float) { // Wipe the output intrinsics_to_float.clear(); std::string input_str = intrinsics_to_float_str; // so we can edit it replace_separators_with_space(input_str); std::istringstream iss(input_str); std::string curr_cam = ""; std::string val; // Temporary map of sets for collection. This will ensure variable order // of inputs is supported. std::map<std::string, std::set<std::string>> local_map; while (iss >> val) { // See if this is a camera name bool have_cam_name = false; for (size_t it = 0; it < cam_names.size(); it++) { if (val == cam_names[it]) { curr_cam = val; have_cam_name = true; break; } } if (have_cam_name) // recorded the camera name continue; if (val != "focal_length" && val != "optical_center" && val != "distortion") LOG(FATAL) << "Unexpected value when parsing intrinsics to float: " << val << "\n"; if (curr_cam == "") LOG(FATAL) << "Incorrectly set option for floating intrinsics.\n"; local_map[curr_cam].insert(val); } // Export this intrinsics_to_float.resize(cam_names.size()); for (size_t it = 0; it < cam_names.size(); it++) intrinsics_to_float[it] = local_map[cam_names[it]]; } // A function to split a string like 'haz_cam sci_cam' into // its two constituents and validate against the list of known cameras. void parse_camera_names(std::vector<std::string> const& cam_names, std::string const& depth_to_image_transforms_to_float_str, std::set<std::string>& depth_to_image_transforms_to_float) { // Wipe the output depth_to_image_transforms_to_float.clear(); std::string input_str = depth_to_image_transforms_to_float_str; // so we can edit it replace_separators_with_space(input_str); std::istringstream iss(input_str); std::string curr_cam = ""; std::string val; while (iss >> val) { bool have_cam_name = false; for (size_t it = 0; it < cam_names.size(); it++) { if (val == cam_names[it]) { have_cam_name = true; break; } } if (!have_cam_name) LOG(FATAL) << "Error: A specified sensor name is not among the known sensors. " << "Offending camera: " << val << "\n"; depth_to_image_transforms_to_float.insert(val); } return; } // Extract from a string of the form someDir/1234.5678.jpg the number 123.456. double fileNameToTimestamp(std::string const& file_name) { size_t beg = file_name.rfind("/"); size_t end = file_name.rfind("."); if (beg == std::string::npos || end == std::string::npos || beg > end) { std::cout << "Could not parse file name: " + file_name; exit(1); } std::string frameStr = file_name.substr(beg + 1, end - beg - 1); return atof(frameStr.c_str()); } // Convert a string of space-separated numbers to a vector void strToVec(std::string const& str, std::vector<double> & vec) { vec.clear(); std::istringstream iss(str); double val = 0.0; while (iss >> val) vec.push_back(val); } // Extract control points and the images they correspond 2 from // a Hugin project file void ParseHuginControlPoints(std::string const& hugin_file, std::vector<std::string> * images, Eigen::MatrixXd * points) { // Initialize the outputs (*images).clear(); *points = Eigen::MatrixXd(6, 0); // this will be resized as points are added std::ifstream hf(hugin_file.c_str()); if (!hf.good()) LOG(FATAL) << "ParseHuginControlPoints(): Could not open hugin file: " << hugin_file; int num_points = 0; std::string line; while (getline(hf, line)) { // Parse for images if (line.find("i ") == 0) { size_t it = line.find("n\""); if (it == std::string::npos) LOG(FATAL) << "ParseHuginControlPoints(): Invalid line: " << line; it += 2; std::string image; while (it < line.size() && line[it] != '"') { image += line[it]; it++; } (*images).push_back(image); } // Parse control points if (line.find("c ") == 0) { // First wipe all letters std::string orig_line = line; char * ptr = const_cast<char*>(line.c_str()); for (size_t i = 0; i < line.size(); i++) { // Wipe some extra chars if ( (ptr[i] >= 'a' && ptr[i] <= 'z') || (ptr[i] >= 'A' && ptr[i] <= 'Z') ) ptr[i] = ' '; } // Out of a line like: // c n0 N1 x367 y240 X144.183010710425 Y243.04008545843 t0 // we store the numbers, 0, 1, 367, 240, 144.183010710425 243.04008545843 // as a column. // The stand for left image cid, right image cid, // left image x, left image y, right image x, right image y. double a, b, c, d, e, f; if (sscanf(ptr, "%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &e, &f) != 6) LOG(FATAL) << "ParseHuginControlPoints(): Could not scan line: " << line; // The left and right images must be different if (a == b) LOG(FATAL) << "The left and right images must be distinct. " << "Offending line in " << hugin_file << " is:\n" << orig_line << "\n"; num_points++; (*points).conservativeResize(Eigen::NoChange_t(), num_points); (*points).col(num_points - 1) << a, b, c, d, e, f; } } return; } // A little helper function bool is_blank(std::string const& line) { return (line.find_first_not_of(" \t\n\v\f\r") == std::string::npos); } // Parse a file having on each line xyz coordinates void ParseXYZ(std::string const& xyz_file, Eigen::MatrixXd * xyz) { // Initialize the outputs *xyz = Eigen::MatrixXd(3, 1); std::ifstream hf(xyz_file.c_str()); if (!hf.good()) LOG(FATAL) << "ParseXYZ(): Could not open hugin file: " << xyz_file; int num_points = 0; std::string line; while (getline(hf, line)) { // Ignore lines starting with comments and empty lines if (line.find("#") == 0 || is_blank(line)) continue; // Apparently sometimes empty lines show up as if of length 1 if (line.size() == 1) continue; // Replace commas with spaces char * ptr = const_cast<char*>(line.c_str()); for (size_t c = 0; c < line.size(); c++) if (ptr[c] == ',') ptr[c] = ' '; double x, y, z; if (sscanf(line.c_str(), "%lf %lf %lf", &x, &y, &z) != 3) LOG(FATAL) << "ParseXYZ(): Could not scan line: '" << line << "'\n"; num_points++; (*xyz).conservativeResize(Eigen::NoChange_t(), num_points); (*xyz).col(num_points-1) << x, y, z; } } } // namespace rig ================================================ FILE: src/asp/Rig/RigParseUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_RIG_PARSE_UTILS_H #define ASP_RIG_RIG_PARSE_UTILS_H #include <Eigen/Core> #include <string> #include <vector> #include <set> #include <map> namespace rig { // Given a file with name // <dir><text><digits>.<digits><text>ref_cam<text>.jpg // or // <dir>/<cam name>/<digits>.<digits>.jpg // find the cam type // Return the index in the basename where the cam name starts or std::string::npos if not found. size_t findCamType(std::string const& image_file, std::vector<std::string> const& cam_names, // Output int & cam_type); // Must keep only alphanumeric characters in the s void removeNonAlphaNum(std::string & s); // Given a file with name // <dir><text><digits>.<digits><text>ref_cam<text>.jpg // or // <dir>/<cam name>/<digits>.<digits>.jpg // find the cam name and the timestamp. // Can also handle: // <dir>/<group><separator><digits>.<digits><text>ref_cam<text>.jpg // when it parses the group. void findCamTypeAndTimestamp(std::string const& image_file, std::vector<std::string> const& cam_names, // Outputs int & cam_type, double & timestamp, std::string & group); // Given a file with name // <dir>/<group><separator><separator>ref_cam<text>.ext // parse the group and the cam index. void findCamTypeAndGroup(std::string const& image_file, std::vector<std::string> const& cam_names, // Outputs int & cam_type, std::string & group); // Parse a file each line of which contains a filename, a sensor name, and a timestamp. // Then reorder the data based on input file names. bool parseImageSensorList(std::string const& image_sensor_list, std::vector<std::string> const& image_files, std::vector<std::string> const& cam_names, bool flexible_strategy, // Outputs std::vector<int> & cam_types, std::vector<double> & timestamps); // A little function to replace separators with space. Note that the backslash // is a separator, in case, it used as a continuation line. void replace_separators_with_space(std::string & str); // A function to parse a string like // 'cam1:focal_length,optical_center,distortion cam2:focal_length' and // extract the intrinsics to float. Separators can be space, comma, // colon. void parse_intrinsics_to_float(std::string const& intrinsics_to_float_str, std::vector<std::string> const& cam_names, std::vector<std::set<std::string>>& intrinsics_to_float); // A function to split a string like 'haz_cam sci_cam' into // its two constituents and validate against the list of known cameras. void parse_camera_names(std::vector<std::string> const& cam_names, std::string const& depth_to_image_transforms_to_float_str, std::set<std::string>& depth_to_image_transforms_to_float); // Extract from a string of the form someDir/1234.5678.jpg the number 123.456. double fileNameToTimestamp(std::string const& file_name); // Convert a string of space-separated numbers to a vector void strToVec(std::string const& str, std::vector<double> & vec); // Extract control points and the images they correspond 2 from // a Hugin project file void ParseHuginControlPoints(std::string const& hugin_file, std::vector<std::string> * images, Eigen::MatrixXd * points); // Parse a file having on each line xyz coordinates void ParseXYZ(std::string const& xyz_file, Eigen::MatrixXd * xyz); } // namespace rig #endif // ASP_RIG_RIG_PARSE_UTILS_H ================================================ FILE: src/asp/Rig/RigRpcDistortion.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigRpcDistortion.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/RigUtils.h> #include <ceres/ceres.h> #include <ceres/rotation.h> #include <ceres/problem.h> #include <ceres/solver.h> #include <ceres/cost_function.h> #include <ceres/loss_function.h> #include <ceres/dynamic_numeric_diff_cost_function.h> #include <ceres/numeric_diff_cost_function.h> #include <ceres/autodiff_cost_function.h> #include <Eigen/Dense> #include <glog/logging.h> #include <fstream> #include <iostream> #include <iomanip> namespace rig { const int PIXEL_SIZE = 2; int rpc_degree(int num_dist_params) { return static_cast<int>(round(sqrt(2.0 * num_dist_params + 5.0) / 2.0 - 1.5)); } int num_dist_params(int rpc_degree) { return 2*(rpc_degree+1)*(rpc_degree+2)-2; } // See if the current set of parameters have the right size to be usable // with some RPC model void validate_distortion_params(int num_params) { int deg = rpc_degree(num_params); if (num_dist_params(deg) != num_params || deg <= 0 || std::isnan(deg)) throw "Incorrect number of RPC coefficients."; } // A little function to append zeros to a Vector. void append_zeros_to_vector(Eigen::VectorXd & vec, int num) { int len = vec.size(); // Create a vector big enough to store the output Eigen::VectorXd out_vec; out_vec.resize(len + num); // Copy current elements for (int it = 0; it < len; it++) out_vec[it] = vec[it]; // Fill the rest with zeros for (int it = len; it < len + num; it++) out_vec[it] = 0.0; vec = out_vec; } // Prepend a 1 to a vector void prepend_1(Eigen::VectorXd & vec) { int old_len = vec.size(); Eigen::VectorXd old_vec = vec; vec.resize(old_len + 1); vec[0] = 1.0; for (int it = 0; it < old_len; it++) vec[it + 1] = old_vec[it]; } // Remove 1 from first position in a vector void remove_1(Eigen::VectorXd & vec) { int old_len = vec.size(); if (old_len <= 0) throw "Found an unexpected empty vector."; Eigen::VectorXd old_vec = vec; vec.resize(old_len - 1); for (int it = 0; it < old_len - 1; it++) vec[it] = old_vec[it + 1]; } Eigen::VectorXd subvector(Eigen::VectorXd const& vec, int start, int len) { if (start + len > vec.size()) throw "Out of range in subvector()."; Eigen::VectorXd subvec(len); for (int it = 0; it < len; it++) subvec[it] = vec[start + it]; return subvec; } void set_subvector(Eigen::VectorXd & vec, int start, int len, Eigen::VectorXd const& subvec) { if (start + len > vec.size()) throw "Out of range in set_subvector().\n"; if (len != subvec.size()) throw "Size mismatch in set_subvector()."; for (int it = 0; it < len; it++) vec[start + it] = subvec[it]; } // Compute the RPC model with given coefficients at the given point. Recall that // RPC is ratio of two polynomials in x and y. This assumes centered pixels that // are normalized by the focal length. Eigen::Vector2d compute_rpc(Eigen::Vector2d const& p, Eigen::VectorXd const& coeffs) { validate_distortion_params(coeffs.size()); int rpc_deg = rpc_degree(coeffs.size()); double x = p[0]; double y = p[1]; // Precompute x^n and y^m values std::vector<double> powx(rpc_deg + 1), powy(rpc_deg + 1); double valx = 1.0, valy = 1.0; for (int deg = 0; deg <= rpc_deg; deg++) { powx[deg] = valx; valx *= x; powy[deg] = valy; valy *= y; } // Evaluate the RPC expression. The denominator always has a 1 as // the 0th coefficient. int coeff_index = 0; // Loop four times, for output first coordinate numerator and // denominator, then for output second coordinate numerator and // denominator. double vals[] = {0.0, 1.0, 0.0, 1.0}; for (int count = 0; count < 4; count++) { int start = 0; // starting degree for numerator if (count == 1 || count == 3) start = 1; // starting degree for denominator for (int deg = start; deg <= rpc_deg; deg++) { for (int i = 0; i <= deg; i++) { // Add coeff * x^(deg-i) * y^i vals[count] += coeffs[coeff_index] * powx[deg - i] * powy[i]; coeff_index++; } } } if (coeff_index != static_cast<int>(coeffs.size())) throw "Book-keeping failure in RPCLensDistortion."; return Eigen::Vector2d(vals[0]/vals[1], vals[2]/vals[3]); } // Put the vectors of numerator and denominator coefficients for the x and y // coordinates into a single vector. void pack_params(Eigen::VectorXd& params, Eigen::VectorXd const& num_x, Eigen::VectorXd const& den_x, Eigen::VectorXd const& num_y, Eigen::VectorXd const& den_y) { int num_len = num_x.size(); int den_len = den_x.size(); if (num_len != den_len + 1 || num_len != static_cast<int>(num_y.size()) || den_len != static_cast<int>(den_y.size())) throw "Book-keeping failure in RPCLensDistortion."; params.resize(2*num_len + 2*den_len); set_subvector(params, 0, num_len, num_x); set_subvector(params, num_len, den_len, den_x); set_subvector(params, num_len + den_len, num_len, num_y); set_subvector(params, num_len + den_len + num_len, den_len, den_y); validate_distortion_params(params.size()); } void unpack_params(Eigen::VectorXd const& params, Eigen::VectorXd& num_x, Eigen::VectorXd& den_x, Eigen::VectorXd& num_y, Eigen::VectorXd& den_y) { validate_distortion_params(params.size()); int num_params = params.size(); int num_len = (num_params + 2)/4; int den_len = num_len - 1; // because the denominator always starts with 1. num_x = subvector(params, 0, num_len); den_x = subvector(params, num_len, den_len); num_y = subvector(params, num_len + den_len, num_len); den_y = subvector(params, num_len + den_len + num_len, den_len); } // RPC lens distortion of arbitrary degree. // For a given undistorted centered pixel (x, y), compute // (P1num(x, y)/P1den(x, y), P2num(x, y)/P2den(x, y)) // where these polynomials are of at most given degree, // and P1den(0, 0) = P2den(0, 0) = 1. // Undistortion is computed numerically. RPCLensDistortion::RPCLensDistortion() { m_rpc_degree = 0; } RPCLensDistortion::RPCLensDistortion(Eigen::VectorXd const& params): m_distortion(params) { validate_distortion_params(params.size()); m_rpc_degree = rpc_degree(params.size()); } void RPCLensDistortion::set_distortion_parameters(Eigen::VectorXd const& params) { validate_distortion_params(params.size()); m_distortion = params; m_rpc_degree = rpc_degree(params.size()); } Eigen::VectorXd RPCLensDistortion::distortion_parameters() const { return m_distortion; } // Make RPC coefficients so that the RPC transform is the identity. // The vector params must already have the right size. void RPCLensDistortion::init_as_identity(Eigen::VectorXd& params) { validate_distortion_params(params.size()); for (size_t it = 0; it < params.size(); it++) params[it] = 0.0; Eigen::VectorXd num_x, den_x, num_y, den_y; unpack_params(params, num_x, den_x, num_y, den_y); // Initialize the transform (x, y) -> (x, y), which is // ( (0 + 1*x + 0*y)/(1 + 0*x + 0*y), (0 + 0*x + 1*y)/(1 + 0*x + 0*y) ) // hence set num_x and num_y accordingly. As always, we do not // store the 1 values in the denominator. num_x[1] = 1; num_y[2] = 1; pack_params(params, num_x, den_x, num_y, den_y); } // Form the identity transform void RPCLensDistortion::reset(int rpc_degree) { if (rpc_degree <= 0) throw "The RPC degree must be positive."; m_rpc_degree = rpc_degree; int num_params = rig::num_dist_params(rpc_degree); m_distortion.resize(num_params); init_as_identity(m_distortion); } // Given the RPC coefficients corresponding to the four polynomials, // increase the degree of each polynomial by 1 and set the new // coefficients to 0. void RPCLensDistortion::increment_degree(Eigen::VectorXd& params) { validate_distortion_params(params.size()); Eigen::VectorXd num_x, den_x, num_y, den_y; unpack_params(params, num_x, den_x, num_y, den_y); int r = rpc_degree(params.size()); // The next monomials to add will be // x^(r+1), x^r*y, ..., x*y^r, y^(r+1) // and there are r + 2 of them. // Set their coefficients to zero. int num = r + 2; append_zeros_to_vector(num_x, num); append_zeros_to_vector(den_x, num); append_zeros_to_vector(num_y, num); append_zeros_to_vector(den_y, num); pack_params(params, num_x, den_x, num_y, den_y); } // An error function minimizing the fit of an RPC model, that is, // minimizing norm of dist_pix - RPC_model(undist_pix). struct RpcFitError { EIGEN_MAKE_ALIGNED_OPERATOR_NEW RpcFitError(Eigen::Vector2d const& undist_pix, Eigen::Vector2d const& dist_pix, std::vector<int> const& block_sizes): m_undist_pix(undist_pix), m_dist_pix(dist_pix), m_block_sizes(block_sizes) { // Sanity check if (block_sizes.size() != 1) throw "RpcFitError: The block sizes were not set up properly.\n"; validate_distortion_params(block_sizes[0]); } // Call to work with ceres::DynamicNumericDiffCostFunction. bool operator()(double const* const* parameters, double* residuals) const { int num_coeffs = m_block_sizes[0]; Eigen::VectorXd coeffs(num_coeffs); for (int it = 0; it < num_coeffs; it++) coeffs[it] = parameters[0][it]; // distort // this is wrong! Eigen::Vector2d rpc_dist = compute_rpc(m_undist_pix, coeffs); for (int it = 0; it < PIXEL_SIZE; it++) residuals[it] = rpc_dist[it] - m_dist_pix[it]; return true; } // Factory to hide the construction of the CostFunction object from the client code. // TODO(oalexan1): Use analytical diff cost function static ceres::CostFunction* Create(Eigen::Vector2d const& undist_pix, Eigen::Vector2d const& dist_pix, std::vector<int> const& block_sizes) { ceres::DynamicNumericDiffCostFunction<RpcFitError>* cost_function = new ceres::DynamicNumericDiffCostFunction<RpcFitError> (new RpcFitError(undist_pix, dist_pix, block_sizes)); cost_function->SetNumResiduals(PIXEL_SIZE); for (size_t i = 0; i < block_sizes.size(); i++) cost_function->AddParameterBlock(block_sizes[i]); return cost_function; } private: Eigen::Vector2d m_undist_pix, m_dist_pix; std::vector<int> m_block_sizes; }; // End class RpcFitError // Evaluate the residuals before and after optimization void evalRpcResiduals(// Inputs std::string const& tag, std::vector<std::string> const& residual_names, // Outputs ceres::Problem& problem, std::vector<double>& residuals) { double total_cost = 0.0; ceres::Problem::EvaluateOptions eval_options; eval_options.num_threads = 1; eval_options.apply_loss_function = false; // want raw residuals problem.Evaluate(eval_options, &total_cost, &residuals, NULL, NULL); // Sanity checks, after the residuals are created if (residuals.size() != residual_names.size()) throw "There must be as many residual names as residual values."; calcResidualStats(residuals, residual_names, tag); return; } // Collect a set of pairs of centered and normalized distorted and undistorted // pixels. Sample uniformly the distorted pixels within the image box. void genDistUndistPairs(int num_samples, rig::CameraParameters const& cam_params, std::vector<Eigen::Vector2d>& undist_centered_pixels, std::vector<Eigen::Vector2d>& dist_centered_pixels) { dist_centered_pixels.clear(); undist_centered_pixels.clear(); Eigen::Vector2i dist_size = cam_params.GetDistortedSize(); Eigen::Vector2i dist_crop_size = cam_params.GetDistortedCropSize(); Eigen::Vector2i undist_size = cam_params.GetUndistortedSize(); Eigen::Vector2d dist_half_size = cam_params.GetDistortedHalfSize(); Eigen::Vector2d undist_half_size = cam_params.GetUndistortedHalfSize(); Eigen::Vector2d optical_offset = cam_params.GetOpticalOffset(); Eigen::Vector2d focal_length = cam_params.GetFocalVector(); for (int ix = 0; ix < num_samples; ix++) { double x = (dist_size[0] - 1.0) * double(ix) / (num_samples - 1.0); for (int iy = 0; iy < num_samples; iy++) { double y = (dist_size[1] - 1.0) * double(iy) / (num_samples - 1.0); Eigen::Vector2d dist_pix(x, y); // Find the centered distorted pixel Eigen::Vector2d dist_ctr_pix; cam_params.Convert<rig::DISTORTED, rig::DISTORTED_C> (dist_pix, &dist_ctr_pix); // Find the centered undistorted pixel Eigen::Vector2d undist_ctr_pix; cam_params.Convert<rig::DISTORTED_C, rig::UNDISTORTED_C> (dist_ctr_pix, &undist_ctr_pix); // TODO(oalexan1): Dist back with OpenCV and compare with undist_pix! // // Exclude points based on dist_crop_size. // // Note that if dist_crop_size equals dist_size, which is image // // size, no points are excluded. // if (std::abs(dist_pix[0] - dist_size[0] / 2.0) > dist_crop_size[0] / 2.0 || // std::abs(dist_pix[1] - dist_size[1] / 2.0) > dist_crop_size[1] / 2.0) // continue; // Ensure that these pixels are centered. Here we use the same // convention as in camera_params.cc. //undist_pix -= undist_half_size; //dist_pix -= dist_half_size; // Normalize the undistorted and distorted pixels. Use the logic from // DistortCentered() in camera_params.cc. undist_ctr_pix = undist_ctr_pix.cwiseQuotient(focal_length); dist_ctr_pix = dist_ctr_pix - (optical_offset - dist_half_size); dist_ctr_pix = dist_ctr_pix.cwiseQuotient(focal_length); dist_centered_pixels.push_back(dist_ctr_pix); undist_centered_pixels.push_back(undist_ctr_pix); } } return; } void fitCurrDegRPC(std::vector<Eigen::Vector2d> const& undist_centered_pixels, std::vector<Eigen::Vector2d> const& dist_centered_pixels, int num_opt_threads, int num_iterations, double parameter_tolerance, bool verbose, Eigen::VectorXd & rpc_coeffs) { std::vector<int> block_sizes; block_sizes.push_back(rpc_coeffs.size()); // Form the problem ceres::Problem problem; std::vector<std::string> residual_names; for (size_t it = 0; it < undist_centered_pixels.size(); it++) { ceres::CostFunction* rpc_cost_fun = RpcFitError::Create(undist_centered_pixels[it], dist_centered_pixels[it], block_sizes); // Note that we do not use a robust threshold, so we want the RPC // to work on the entire domain. ceres::LossFunction* rpc_loss_fun = NULL; residual_names.push_back("normalized_pix_x"); residual_names.push_back("normalized_pix_y"); problem.AddResidualBlock(rpc_cost_fun, rpc_loss_fun, &rpc_coeffs[0]); } if (verbose) { Eigen::VectorXd num_x, den_x, num_y, den_y; unpack_params(rpc_coeffs, num_x, den_x, num_y, den_y); std::cout << "input num_x " << num_x.transpose() << std::endl; std::cout << "input den_x " << den_x.transpose() << std::endl; std::cout << "input num_y " << num_y.transpose() << std::endl; std::cout << "input den_y " << den_y.transpose() << std::endl; } std::vector<double> residuals; evalRpcResiduals("before opt", residual_names, problem, residuals); // Solve the problem ceres::Solver::Options options; ceres::Solver::Summary summary; options.linear_solver_type = ceres::ITERATIVE_SCHUR; options.num_threads = num_opt_threads; // The result is more predictable with one thread options.max_num_iterations = num_iterations; options.minimizer_progress_to_stdout = true; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.parameter_tolerance = parameter_tolerance; if (!verbose) options.logging_type = ceres::SILENT; ceres::Solve(options, &problem, &summary); if (verbose) { Eigen::VectorXd num_x, den_x, num_y, den_y; unpack_params(rpc_coeffs, num_x, den_x, num_y, den_y); std::cout << "output num_x " << num_x.transpose() << std::endl; std::cout << "output den_x " << den_x.transpose() << std::endl; std::cout << "output num_y " << num_y.transpose() << std::endl; std::cout << "output den_y " << den_y.transpose() << std::endl; } evalRpcResiduals("after opt", residual_names, problem, residuals); } void fitRpcDist(int rpc_degree, int num_samples, rig::CameraParameters const& cam_params, int num_opt_threads, int num_iterations, double parameter_tolerance, bool verbose, // Output Eigen::VectorXd & rpc_dist_coeffs) { std::vector<Eigen::Vector2d> undist_centered_pixels, dist_centered_pixels; genDistUndistPairs(num_samples, cam_params, // Outputs undist_centered_pixels, dist_centered_pixels); std::cout << "Found " << dist_centered_pixels.size() << " pixel correspondences " << "between undistorted and distorted images." << std::endl; // First fit RPC of degree 1. Then refine to degree 2, etc, till desired rpc_degree. // That is more likely to be successful than aiming right way for the full solution. int initial_rpc_degree = 1; int init_num_params = num_dist_params(initial_rpc_degree); // Set up the initial guess for the variable of optimization rpc_dist_coeffs = Eigen::VectorXd::Zero(init_num_params); RPCLensDistortion::init_as_identity(rpc_dist_coeffs); // this changes rpc_dist_coeffs std::cout << "\nComputing RPC distortion." << std::endl; for (int deg = 1; deg <= rpc_degree; deg++) { if (deg >= 2) { // Use the previously solved model as an initial guess. Increment its degree by adding // to the polynomials new powers of given degree with zero coefficient in front. RPCLensDistortion::increment_degree(rpc_dist_coeffs); } std::cout << "Fitting RPC distortion of degree " << deg << std::endl; fitCurrDegRPC(undist_centered_pixels, dist_centered_pixels, num_opt_threads, num_iterations, parameter_tolerance, verbose, rpc_dist_coeffs); } } // TODO(oalexan1): This needs more work void evalRpcDistUndist(int num_samples, rig::CameraParameters const& cam_params, RPCLensDistortion const& rpc) { std::vector<Eigen::Vector2d> undist_centered_pixels, dist_centered_pixels; genDistUndistPairs(num_samples, cam_params, // Outputs undist_centered_pixels, dist_centered_pixels); double max_err = 0.0; for (size_t it = 0; it < undist_centered_pixels.size(); it++) { // Eigen::Vector2d pix = rpc.distort_centered(undist_centered_pixels[it]); // Eigen::Vector2d pix2 = rpc.undistort_centered(pix); // max_err = std::max(max_err, (undist_centered_pixels[it] - pix2).norm()); } std::cout << "Max distort_undistort error: " << max_err << std::endl; } } // end namespace rig ================================================ FILE: src/asp/Rig/RigRpcDistortion.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_RPC_DISTORTION_H #define ASP_RIG_RPC_DISTORTION_H #include <Eigen/Core> #include <string> #include <vector> namespace rig { // forward declaration class CameraParameters; } namespace rig { class RPCLensDistortion { int m_rpc_degree; Eigen::VectorXd m_distortion; public: explicit RPCLensDistortion(); // NOLINT explicit RPCLensDistortion(Eigen::VectorXd const& params); void reset(int rpc_degree); // Form the identity transform Eigen::VectorXd distortion_parameters() const; void set_image_size(Eigen::Vector2i const& image_size); void set_distortion_parameters(Eigen::VectorXd const& params); int num_dist_params() const { return m_distortion.size(); } Eigen::Vector2d distorted_coordinates(Eigen::Vector2d const& p) const; void write(std::ostream& os) const; void read(std::istream& os); static std::string class_name() { return "RPC"; } std::string name () const { return class_name(); } static void init_as_identity(Eigen::VectorXd & params); static void increment_degree(Eigen::VectorXd & params); Eigen::VectorXd dist_undist_params(); //Eigen::Vector2d distort_centered(Eigen::Vector2d const& p) const; }; void unpack_params(Eigen::VectorXd const& params, Eigen::VectorXd& num_x, Eigen::VectorXd& den_x, Eigen::VectorXd& num_y, Eigen::VectorXd& den_y); void fitRpcDist(int rpc_degree, int num_samples, rig::CameraParameters const& cam_params, int num_opt_threads, int num_iterations, double parameter_tolerance, bool verbose, // Output Eigen::VectorXd & rpc_dist_coeffs); void evalRpcDistUndist(int num_samples, rig::CameraParameters const& cam_params, RPCLensDistortion const& rpc); // Compute the RPC model with given coefficients at the given point. Recall that // RPC is ratio of two polynomials in x and y. This assumes centered pixels that // are normalized by the focal length. Eigen::Vector2d compute_rpc(Eigen::Vector2d const& p, Eigen::VectorXd const& coeffs); // Prepend a 1 to a vector void prepend_1(Eigen::VectorXd & vec); } #endif // ASP_RIG_RPC_DISTORTION_H ================================================ FILE: src/asp/Rig/RigThread.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigThread.h> #include <vw/Core/Exception.h> #include <sys/time.h> #include <thread> namespace rig { int defaultNumThreads() { return (std::thread::hardware_concurrency() == 0 ? 8 : std::thread::hardware_concurrency()); } void* HolderFunction(void* ptr) { rig::ThreadPool::VarsTuple* vars = reinterpret_cast<rig::ThreadPool::VarsTuple*>(ptr); // Run the function std::get<0>(*vars)(); // Set out boolean so someone can know they can delete this std::get<3>(*vars) = true; // Signal that we are finished pthread_mutex_lock(std::get<1>(*vars)); pthread_cond_signal(std::get<2>(*vars)); pthread_mutex_unlock(std::get<1>(*vars)); return NULL; } ThreadPool::ThreadPool(int num_threads): max_concurrent_jobs_(num_threads) { pthread_mutex_init(&cond_mutex_, NULL); pthread_cond_init(&cond_, NULL); if (max_concurrent_jobs_ <= 0) vw::vw_throw(vw::ArgumentErr() << "Thread pool without threads created.\n"); } ThreadPool::~ThreadPool() { Join(); pthread_cond_destroy(&cond_); pthread_mutex_destroy(&cond_mutex_); } void ThreadPool::Join() { while (threads_.size()) { pthread_join(threads_.front(), NULL); threads_.pop_front(); var_bindings_.pop_front(); } } void ThreadPool::WaitTillJobOpening() { while (threads_.size() >= max_concurrent_jobs_) { // Wait for a condition event to signal a free job or time out // after one second. I do a time out because somehow I still have // a deadlock. I think it occurs if a task just finishes faster // than we can get back into a state to wait for condition. pthread_mutex_lock(&cond_mutex_); struct timeval tv; struct timespec ts; gettimeofday(&tv, NULL); ts.tv_sec = tv.tv_sec + 1; ts.tv_nsec = 0; pthread_cond_timedwait(&cond_, &cond_mutex_, &ts); pthread_mutex_unlock(&cond_mutex_); // Iterate through and clean out all the finished jobs std::list<pthread_t>::iterator thread_it = threads_.begin(); std::list<VarsTuple>::iterator vars_it = var_bindings_.begin(); while (thread_it != threads_.end()) { if (std::get<3>(*vars_it)) { // Thread says it has finished. Join. pthread_join(*thread_it, NULL); thread_it = threads_.erase(thread_it); vars_it = var_bindings_.erase(vars_it); } else { thread_it++; vars_it++; } } } } } // end namespace rig ================================================ FILE: src/asp/Rig/RigThread.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_THREAD_H #define ASP_RIG_THREAD_H #include <gflags/gflags.h> #include <pthread.h> #include <list> #include <functional> #define GOOGLE_ALLOW_RVALUE_REFERENCES_PUSH #define GOOGLE_ALLOW_RVALUE_REFERENCES_POP GOOGLE_ALLOW_RVALUE_REFERENCES_PUSH namespace rig { int defaultNumThreads(); void* HolderFunction(void* ptr); class ThreadPool { public: typedef std::tuple<std::function<void(void)>, pthread_mutex_t*, pthread_cond_t*, bool> VarsTuple; ThreadPool(int num_threads); ~ThreadPool(); // The following identifies this thread as non copyable and non // moveable. Our threads are holding pointers to this exact // object. ThreadPool(const ThreadPool&) = delete; ThreadPool& operator=(const ThreadPool&) = delete; // This pushes back a function and it's arguments to be // executed. This method will block if the number of threads is // already maxed. You can also push back mixed types of functions. // // Example: // void Monkey(std::vector const& input, int val, std::vector * output); // ThreadPool pool; // pool.AddTask(Monkey, std::ref(input), 3, &output); // // If you don't use a std::ref as in the above example, the input // will be copied. Other alternatives are to use a pointer. template <typename Function, typename... Args> void AddTask(Function&& f, Args&&... args) { WaitTillJobOpening(); // Bind up the function the user has given us var_bindings_.emplace_back(std::bind(f, args...), &cond_mutex_, &cond_, false); // Create the thread and start doing work threads_.push_back(pthread_t()); pthread_create(&threads_.back(), NULL, HolderFunction, &var_bindings_.back()); } void Join(); private: void WaitTillJobOpening(); size_t max_concurrent_jobs_; std::list<pthread_t> threads_; std::list<VarsTuple> var_bindings_; pthread_mutex_t cond_mutex_; pthread_cond_t cond_; }; } // namespace rig GOOGLE_ALLOW_RVALUE_REFERENCES_POP #endif // ASP_RIG_THREAD_H ================================================ FILE: src/asp/Rig/RigTypeDefs.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_TYPE_DEFS_H #define ASP_RIG_TYPE_DEFS_H #include <map> #include <vector> #include <Eigen/Core> #include <Eigen/Geometry> // A small header to hold type definitions for the rig calibrator namespace rig { // Vector of keypoints for each image typedef std::vector<std::vector<std::pair<float, float>>> KeypointVec; // A map from keypoint coordinates to its index in the KeypointVec typedef std::vector<std::map<std::pair<float, float>, int>> KeyPointMap; // Maps Point ID -> Camera ID -> Feature ID typedef std::vector<std::map<int, int>> PidCidFid; // PidCidFid with extra info typedef std::vector<std::map<int, std::map<int, int>>> PidCidFidMap; // Maps Point ID -> Camera ID -> Feature ID -> 3D Mesh Intersection Point typedef std::vector<std::map<int, std::map<int, Eigen::Vector3d>>> PidCidFidToMeshXyz; // Vector of Eigen Matrices holding keypoints (NVM format) typedef std::vector<Eigen::Matrix2Xd> CidToKeypointMatVec; // Maps Image ID pair -> List of convergence angles typedef std::map<std::pair<int, int>, std::vector<double>> PairwiseConvergenceAngles; } // namespace rig #endif // ASP_RIG_TYPE_DEFS_H ================================================ FILE: src/asp/Rig/RigUtils.cc ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/SystemUtils.h> #include <asp/Rig/RigUtils.h> #include <asp/Rig/RigParseUtils.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/InterpolationUtils.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/happly.h> // for saving ply files as meshes #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/RigMath.h> #include <asp/Core/Nvm.h> #include <glog/logging.h> #include <boost/filesystem.hpp> #include <pcl/io/ply_io.h> #include <pcl/io/pcd_io.h> #include <iostream> #include <fstream> #include <iomanip> // TODO(oalexan1): This file needs to be broken up namespace rig { // Read a 4x4 pose matrix of doubles from disk void readPoseMatrix(cv::Mat& pose, std::string const& filename) { pose = cv::Mat::zeros(4, 4, CV_64F); std::ifstream ifs(filename.c_str(), std::ifstream::in); for (int row = 0; row < 4; row++) { for (int col = 0; col < 4; col++) { double val; if (!(ifs >> val)) LOG(FATAL) << "Could not read a 4x4 matrix from: " << filename; pose.at<double>(row, col) = val; } } } // Read an affine matrix with double values bool readAffine(Eigen::Affine3d& T, std::string const& filename) { Eigen::MatrixXd M(4, 4); std::ifstream ifs(filename.c_str(), std::ifstream::in); for (int row = 0; row < 4; row++) { for (int col = 0; col < 4; col++) { double val; if (!(ifs >> val)) return false; M(row, col) = val; } } T.linear() = M.block<3, 3>(0, 0); T.translation() = M.block<3, 1>(0, 3); return true; } // Write a matrix with double values void writeMatrix(Eigen::MatrixXd const& M, std::string const& filename) { // std::cout << "Writing: " << filename << std::endl; std::ofstream ofs(filename.c_str()); ofs.precision(17); ofs << M << "\n"; ofs.close(); } // Save a file with x, y, z rows if point_size is 3, and also a color // if point_size is 4. void writeCloud(std::vector<float> const& points, size_t point_size, std::string const& filename) { size_t num_points = points.size() / point_size; if (point_size * num_points != points.size()) LOG(FATAL) << "Book-keeping failure."; // std::cout << "Writing: " << filename << "\n"; std::ofstream fh(filename.c_str()); fh.precision(17); for (size_t it = 0; it < num_points; it++) { for (size_t ch = 0; ch < point_size; ch++) { fh << points[point_size * it + ch]; if (ch + 1 < point_size) fh << " "; else fh << "\n"; } } fh.close(); } // Return the type of an opencv matrix std::string matType(cv::Mat const& mat) { int type = mat.type(); std::string r; uchar depth = type & CV_MAT_DEPTH_MASK; uchar chans = 1 + (type >> CV_CN_SHIFT); switch (depth) { case CV_8U: r = "8U"; break; case CV_8S: r = "8S"; break; case CV_16U: r = "16U"; break; case CV_16S: r = "16S"; break; case CV_32S: r = "32S"; break; case CV_32F: r = "32F"; break; case CV_64F: r = "64F"; break; default: r = "User"; break; } r += "C"; r += (chans + '0'); return r; } void StampedPoseStorage::addPose(Eigen::Affine3d const& pose, double timestamp) { int bin_index = floor(timestamp); m_poses[bin_index][timestamp] = pose; } bool StampedPoseStorage::interpPose(double input_timestamp, double max_gap, Eigen::Affine3d& out_pose) const { bool is_success = false; if (m_poses.empty()) return is_success; // Look for the nearest pose with timestamp <= input_timestamp. double low_timestamp = -1.0; Eigen::Affine3d low_pose; // Traverse the bins in decreasing order of bin key. for (int bin_iter = floor(input_timestamp); bin_iter >= m_poses.begin()->first; bin_iter--) { auto bin_ptr = m_poses.find(bin_iter); if (bin_ptr == m_poses.end()) continue; // empty bin // Found a bin. Study it in decreasing order of timestamps. auto& bin = bin_ptr->second; for (auto it = bin.rbegin(); it != bin.rend(); it++) { double timestamp = it->first; if (timestamp <= input_timestamp) { low_timestamp = timestamp; low_pose = it->second; is_success = true; break; } } if (is_success) break; } if (!is_success) return false; // Failed // Found the lower bound. Now go forward in time. Here the logic is // the reverse of the above. is_success = false; double high_timestamp = -1.0; Eigen::Affine3d high_pose; for (int bin_iter = floor(input_timestamp); bin_iter <= m_poses.rbegin()->first; bin_iter++) { auto bin_ptr = m_poses.find(bin_iter); if (bin_ptr == m_poses.end()) continue; // empty bin // Found a bin. Study it in increasing order of timestamps. auto& bin = bin_ptr->second; for (auto it = bin.begin(); it != bin.end(); it++) { double timestamp = it->first; if (timestamp >= input_timestamp) { high_timestamp = timestamp; high_pose = it->second; is_success = true; break; } } if (is_success) break; } if (!is_success || high_timestamp - low_timestamp > max_gap) { return false; // Failed } if (!(low_timestamp <= input_timestamp && input_timestamp <= high_timestamp)) LOG(FATAL) << "Book-keeping failure in pose interpolation."; double alpha = (input_timestamp - low_timestamp) / (high_timestamp - low_timestamp); if (high_timestamp == low_timestamp) alpha = 0.0; // handle division by zero out_pose = rig::linearInterp(alpha, low_pose, high_pose); return is_success; } void StampedPoseStorage::clear() { m_poses.clear(); } bool StampedPoseStorage::empty() const { return m_poses.empty(); } void readCameraPoses(std::string const& filename, std::map<double, double>& haz_depth_to_image_timestamps, std::map<std::string, std::map<double, Eigen::Affine3d> >& world_to_cam_poses) { haz_depth_to_image_timestamps.clear(); world_to_cam_poses.clear(); std::ifstream ifs(filename.c_str()); std::string line; while (std::getline(ifs, line)) { std::istringstream is(line); std::string str; if (!(is >> str)) continue; if (str == "nav_cam" || str == "sci_cam" || str == "haz_cam") { double timestamp; if (!(is >> timestamp)) continue; Eigen::MatrixXd M(4, 4); for (int row = 0; row < 4; row++) { for (int col = 0; col < 4; col++) { if (!(is >> M(row, col))) LOG(FATAL) << "Failure reading: " << filename; } } world_to_cam_poses[str][timestamp].matrix() = M; } else if (str == "haz_depth_to_image") { double depth_time, image_time; if (!(is >> depth_time >> image_time)) LOG(FATAL) << "Failure reading: " << filename; haz_depth_to_image_timestamps[depth_time] = image_time; } } ifs.close(); } // Scale an image to correct for lightning variations by taking into // account that JPEG images have gamma correction applied to them. // See https://en.wikipedia.org/wiki/Gamma_correction. void scaleImage(double max_iso_times_exposure, double iso, double exposure, cv::Mat const& input_image, cv::Mat& output_image) { double scale = pow(max_iso_times_exposure / iso / exposure, 1.0 / 2.2); int same_type = -1; double offset = 0.0; input_image.convertTo(output_image, same_type, scale, offset); } // Given two bounds, pick two timestamps within these bounds, the one // closest to the left bound and the one to the right bound. Take into // account that the timestamps may need to have an offset added to // them. Assume that the input timestamps are sorted in increasing order. // TODO(oalexan1): May have to add a constraint to only pick // a timestamp if not further from the bound than a given value. void pickTimestampsInBounds(std::vector<double> const& timestamps, double left_bound, double right_bound, double offset, std::vector<double>& out_timestamps) { out_timestamps.clear(); // Start by simply collecting all timestamps between the given // bounds. Much easier to understand than if doing something more // fancy. std::vector<double> local_timestamps; for (size_t it = 0; it < timestamps.size(); it++) { double timestamp = timestamps[it]; if (timestamp + offset >= left_bound && timestamp + offset < right_bound) { local_timestamps.push_back(timestamp); } } if (local_timestamps.size() < 1) { // Nothing to pick return; } if (local_timestamps.size() == 1) { // Only one is present out_timestamps.push_back(local_timestamps[0]); return; } // Add the ones at the ends out_timestamps.push_back(local_timestamps[0]); out_timestamps.push_back(local_timestamps.back()); return; } // Read the images, depth clouds, and their metadata // Save the properties of images. Use space as separator. void saveCameraPoses(std::string const& out_dir, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam) { rig::createDir(out_dir); std::string image_list = out_dir + "/cameras.txt"; std::cout << "Writing: " << image_list << std::endl; std::ofstream f; f.open(image_list.c_str(), std::ios::binary | std::ios::out); if (!f.is_open()) LOG(FATAL) << "Cannot open file for writing: " << image_list << "\n"; f.precision(17); f << "# image_file world_to_camera_transform\n"; for (size_t it = 0; it < cams.size(); it++) { // Convert an affine transform to a 4x4 matrix Eigen::MatrixXd T = world_to_cam[it].matrix(); // Save the rotation and translation of T f << cams[it].image_name << " " << rig::affineToStr(world_to_cam[it]) << "\n"; } f.close(); } // Check if first three coordinates of a vector are 0. That would make it invalid. bool invalidXyz(cv::Vec3f const& p) { return (p[0] == 0) && (p[1] == 0) && (p[2] == 0); } // Add a given vertex to the ply file unless already present void add_vertex(cv::Vec3f const& V, double intensity, std::pair<int, int> const& pix, // NOLINT std::map<std::pair<int, int>, size_t>& pix_to_vertex, // NOLINT size_t& vertex_count, // NOLINT std::vector<std::array<double, 3>>& vertices, // NOLINT std::vector<std::array<double, 3>>& colors) { // NOLINT // Do not add the invalid zero vertex if (invalidXyz(V)) return; if (pix_to_vertex.find(pix) != pix_to_vertex.end()) return; // Vertex already exists std::array<double, 3> point = {V[0], V[1], V[2]}; std::array<double, 3> color = {intensity/255.0, intensity/255.0, intensity/255.0}; vertices.push_back(point); colors.push_back(color); // Record the map from the pixel to its location pix_to_vertex[pix] = vertex_count; vertex_count++; } void applyTransformToCloud(cv::Mat const& in_cloud, Eigen::Affine3d const& cam_to_world, cv::Mat & out_cloud) { if (in_cloud.channels() != 3) LOG(FATAL) << "Expecting an xyz point cloud.\n"; out_cloud = cv::Mat::zeros(in_cloud.rows, in_cloud.cols, CV_32FC3); for (int row = 0; row < in_cloud.rows; row++) { for (int col = 0; col < in_cloud.cols; col++) { cv::Vec3f xyz = in_cloud.at<cv::Vec3f>(row, col); if (invalidXyz(xyz)) { // Invalid points stay invalid out_cloud.at<cv::Vec3f>(row, col) = xyz; continue; } // Transform to world coordinates Eigen::Vector3d P(xyz[0], xyz[1], xyz[2]); P = cam_to_world * P; for (size_t c = 0; c < 3; c++) out_cloud.at<cv::Vec3f>(row, col)[c] = P[c]; } } } // Apply a transform to a point cloud to make it go from camera coordinates to world // coordinates and save it as a ply file. void saveTransformedMesh(cv::Mat const& depthMat, cv::Mat const& intensity, Eigen::Affine3d const& depth_to_world, std::string const& plyFileName) { // Sanity check if (depthMat.cols != intensity.cols || depthMat.rows != intensity.rows) LOG(FATAL) << "The depth cloud and its intensity must have same size.\n"; // Apply the transform. cv::Mat transMat; applyTransformToCloud(depthMat, depth_to_world, transMat); size_t vertex_count = 0; std::map<std::pair<int, int>, size_t> pix_to_vertex; // map from pixel to vertex indices std::vector<std::array<double, 3>> vertices; std::vector<std::array<double, 3>> colors; std::vector<std::vector<size_t>> faces; for (int row = 0; row < transMat.rows - 1; row++) { for (int col = 0; col < transMat.cols - 1; col++) { std::pair<int, int> pix_ul = std::make_pair(row, col); std::pair<int, int> pix_ur = std::make_pair(row + 1, col); std::pair<int, int> pix_ll = std::make_pair(row, col + 1); std::pair<int, int> pix_lr = std::make_pair(row + 1, col + 1); cv::Vec3f UL = transMat.at<cv::Vec3f>(pix_ul.first, pix_ul.second); cv::Vec3f UR = transMat.at<cv::Vec3f>(pix_ur.first, pix_ur.second); cv::Vec3f LL = transMat.at<cv::Vec3f>(pix_ll.first, pix_ll.second); cv::Vec3f LR = transMat.at<cv::Vec3f>(pix_lr.first, pix_lr.second); double inten_UL = intensity.at<uchar>(pix_ul.first, pix_ul.second); double inten_UR = intensity.at<uchar>(pix_ur.first, pix_ur.second); double inten_LL = intensity.at<uchar>(pix_ll.first, pix_ll.second); double inten_LR = intensity.at<uchar>(pix_lr.first, pix_lr.second); // Add three vertices of a face add_vertex(UL, inten_UL, pix_ul, pix_to_vertex, vertex_count, vertices, colors); add_vertex(UR, inten_UR, pix_ur, pix_to_vertex, vertex_count, vertices, colors); add_vertex(LL, inten_LL, pix_ll, pix_to_vertex, vertex_count, vertices, colors); // Note how we add only valid faces, so all three vertices must be valid (non-zero) if (!invalidXyz(UL) && !invalidXyz(UR) && !invalidXyz(LL) && inten_UL >= 0 && inten_UR >= 0 && inten_LL >= 0) { std::vector<size_t> face = {pix_to_vertex[pix_ul], pix_to_vertex[pix_ur], pix_to_vertex[pix_ll]}; faces.push_back(face); } // Add the other face, forming a full grid cell add_vertex(UR, inten_UR, pix_ur, pix_to_vertex, vertex_count, vertices, colors); add_vertex(LR, inten_LR, pix_lr, pix_to_vertex, vertex_count, vertices, colors); add_vertex(LL, inten_LL, pix_ll, pix_to_vertex, vertex_count, vertices, colors); if (!invalidXyz(UR) && !invalidXyz(LR) && !invalidXyz(LL) && inten_UR >= 0 && inten_LR >= 0 && inten_LL >= 0) { std::vector<size_t> face = {pix_to_vertex[pix_ur], pix_to_vertex[pix_lr], pix_to_vertex[pix_ll]}; faces.push_back(face); } } } // Form and save the ply happly::PLYData ply; ply.addVertexPositions(vertices); ply.addVertexColors(colors); ply.addFaceIndices(faces); std::cout << "Writing: " << plyFileName << std::endl; ply.write(plyFileName, happly::DataFormat::ASCII); } // Save the depth clouds and optimized transforms needed to create a mesh with voxblox // (if depth clouds exist). void exportToVoxblox(std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const& cam_images, std::vector<Eigen::Affine3d> const& depth_to_image, std::vector<Eigen::Affine3d> const& world_to_cam, std::string const& out_dir) { if (cam_images.size() != world_to_cam.size()) LOG(FATAL) << "There must be as many camera images as camera poses.\n"; if (cam_names.size() != depth_to_image.size()) LOG(FATAL) << "Must have as many camera types as depth-to-image transforms.\n"; if (out_dir.empty()) LOG(FATAL) << "The output directory is empty.\n"; std::string voxblox_dir = out_dir + "/voxblox"; rig::createDir(voxblox_dir); std::cout << "Saving voxblox data to: " << voxblox_dir << "\n"; char timestamp_buffer[1000]; // Must take a pass for each camera type, and then visit // all images while ignoring those of a different type. There are very // few camera types, so this is not unreasonable. // Keep the 2D image structure of the cloud. Replace the invalid // entries with Inf. double inf = std::numeric_limits<double>::infinity(); for (size_t cam_type = 0; cam_type < cam_names.size(); cam_type++) { std::string voxblox_subdir = voxblox_dir + "/" + cam_names[cam_type]; rig::createDir(voxblox_subdir); int num_saved_clouds = 0; std::string index_file = voxblox_subdir + "/index.txt"; std::cout << "Writing: " << index_file << std::endl; std::ofstream ofs(index_file.c_str()); for (size_t cid = 0; cid < cam_images.size(); cid++) { if (cam_images[cid].camera_type != cam_type) continue; int depth_cols = cam_images[cid].depth_cloud.cols; int depth_rows = cam_images[cid].depth_cloud.rows; if (depth_cols == 0 || depth_rows == 0) continue; // skip empty clouds // Sanity check if (depth_cols != cam_images[cid].image.cols || depth_rows != cam_images[cid].image.rows) LOG(FATAL) << "Found a depth cloud and corresponding image with " << "mismatching dimensions.\n"; // Must use the 10.7f format for the timestamp as everywhere else in the code, // as it is in double precision. double timestamp = cam_images[cid].timestamp; snprintf(timestamp_buffer, sizeof(timestamp_buffer), "%10.7f", timestamp); // Sanity check if (cam_images[cid].image.channels() != 1) LOG(FATAL) << "Expecting a grayscale input image.\n"; // Form the pcl point cloud. Add the first band of the image as an intensity. // TODO(oalexan1): Make this a subroutine pcl::PointCloud<pcl::PointNormal> pc; pc.width = depth_cols; pc.height = depth_rows; pc.points.resize(std::int64_t(pc.width) * std::int64_t(pc.height)); // avoid overflow int count = 0; for (int row = 0; row < depth_rows; row++) { for (int col = 0; col < depth_cols; col++) { cv::Vec3f xyz = cam_images[cid].depth_cloud.at<cv::Vec3f>(row, col); Eigen::Vector3d P; if (xyz == cv::Vec3f(0, 0, 0)) { P = Eigen::Vector3d(inf, inf, inf); } else{ // Transform from depth cloud coordinates to camera coordinates // (later voxblox will transform to world coordinates) P = Eigen::Vector3d(xyz[0], xyz[1], xyz[2]); P = depth_to_image[cam_images[cid].camera_type] * P; } pc.points[count].x = P[0]; pc.points[count].y = P[1]; pc.points[count].z = P[2]; pc.points[count].normal_x = cam_images[cid].image.at<uchar>(row, col); // intensity pc.points[count].normal_y = 1.0; // weight pc.points[count].normal_y = 1.0; // intersection err pc.points[count].normal_y = 0.0; // ensure initialization count++; } } // Save the transform std::string transform_file = voxblox_subdir + "/" + timestamp_buffer + "_cam2world.txt"; ofs << transform_file << "\n"; // save its name in the index rig::writeMatrix(world_to_cam[cid].inverse().matrix(), transform_file); // Save the pcd file std::string cloud_file = voxblox_subdir + "/" + timestamp_buffer + ".pcd"; //std::cout << "Writing: " << cloud_file << std::endl; ofs << cloud_file << "\n"; // save its name in the index pcl::io::savePCDFileBinary(cloud_file, pc); // writing binary is much faster than ascii num_saved_clouds++; } if (num_saved_clouds == 0) std::cout << "No depth clouds were saved for camera: " << cam_names[cam_type] << ". Empty index file: " << index_file << ".\n"; } // end loop over camera types return; } // Save the depth clouds and optimized transforms needed to create a mesh with voxblox // (if depth clouds exist). void saveTransformedDepthClouds(std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const& cam_images, std::vector<Eigen::Affine3d> const& depth_to_image, std::vector<Eigen::Affine3d> const& world_to_cam, std::string const& out_dir) { if (cam_images.size() != world_to_cam.size()) LOG(FATAL) << "There must be as many camera images as camera poses.\n"; if (cam_names.size() != depth_to_image.size()) LOG(FATAL) << "Must have as many camera types as depth-to-image transforms.\n"; if (out_dir.empty()) LOG(FATAL) << "The output directory is empty.\n"; std::string trans_depth_dir = out_dir + "/trans_depth"; rig::createDir(trans_depth_dir); char timestamp_buffer[1000]; // Must take a pass for each camera type, and then visit // all images while ignoring those of a different type. There are very // few camera types, so this is not unreasonable. for (size_t cam_type = 0; cam_type < cam_names.size(); cam_type++) { std::string trans_depth_subdir = trans_depth_dir + "/" + cam_names[cam_type]; rig::createDir(trans_depth_subdir); for (size_t cid = 0; cid < cam_images.size(); cid++) { if (cam_images[cid].camera_type != cam_type) continue; int depth_cols = cam_images[cid].depth_cloud.cols; int depth_rows = cam_images[cid].depth_cloud.rows; if (depth_cols == 0 || depth_rows == 0) continue; // skip empty clouds // Sanity check if (depth_cols != cam_images[cid].image.cols || depth_rows != cam_images[cid].image.rows) LOG(FATAL) << "Found a depth cloud and corresponding image with mismatching dimensions.\n"; // Must use the 10.7f format for the timestamp as everywhere else in the code, // as it is in double precision. double timestamp = cam_images[cid].timestamp; snprintf(timestamp_buffer, sizeof(timestamp_buffer), "%10.7f", timestamp); // Sanity check if (cam_images[cid].image.channels() != 1) LOG(FATAL) << "Expecting a grayscale input image.\n"; // Save the pcd file std::string cloud_file = trans_depth_subdir + "/" + timestamp_buffer + ".ply"; // To go from the depth cloud to world coordinates need to first to go from depth // to image coordinates, then from image to world. Eigen::Affine3d depth_to_world = (world_to_cam[cid].inverse()) * depth_to_image[cam_images[cid].camera_type]; saveTransformedMesh(cam_images[cid].depth_cloud, cam_images[cid].image, depth_to_world, cloud_file); } } } // Find the depth measurement. Use nearest neighbor interpolation // to look into the depth cloud. bool depthValue(// Inputs cv::Mat const& depth_cloud, Eigen::Vector2d const& dist_ip, // Output Eigen::Vector3d& depth_xyz) { depth_xyz = Eigen::Vector3d(0, 0, 0); // initialize if (depth_cloud.cols == 0 && depth_cloud.rows == 0) return false; // empty cloud int col = round(dist_ip[0]); int row = round(dist_ip[1]); if (col < 0 || row < 0 || col > depth_cloud.cols || row > depth_cloud.rows) LOG(FATAL) << "Out of range in the depth cloud."; // After rounding one may hit the bound if (col == depth_cloud.cols || row == depth_cloud.rows) return false; cv::Vec3f cv_depth_xyz = depth_cloud.at<cv::Vec3f>(row, col); // Skip invalid measurements if (cv_depth_xyz == cv::Vec3f(0, 0, 0)) return false; depth_xyz = Eigen::Vector3d(cv_depth_xyz[0], cv_depth_xyz[1], cv_depth_xyz[2]); return true; } // Write the inliers in nvm format. The keypoints are shifted relative to the // optical center, as written by Theia if shift_keypoints is specified. This // handles properly the case when a (cid, fid) shows up in many tracks. void writeInliersToNvm(std::string const& nvm_file, bool shift_keypoints, std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::KeypointVec const& keypoint_vec, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, std::vector<Eigen::Vector3d> const& xyz_vec) { // Sanity checks if (world_to_cam.size() != cams.size()) LOG(FATAL) << "Expecting as many world-to-camera transforms as cameras.\n"; if (world_to_cam.size() != keypoint_vec.size()) LOG(FATAL) << "Expecting as many sets of keypoints as cameras.\n"; if (pid_to_cid_fid.size() != pid_cid_fid_inlier.size()) LOG(FATAL) << "Expecting as many inlier flags as there are tracks.\n"; if (pid_to_cid_fid.size() != xyz_vec.size()) LOG(FATAL) << "Expecting as many tracks as there are triangulated points.\n"; // Initialize the keypoints in expected format. Copy the filenames // and focal lengths. rig::CidToKeypointMatVec cid_to_keypoint_map(keypoint_vec.size()); std::vector<std::string> cid_to_filename(keypoint_vec.size()); for (size_t cid = 0; cid < cams.size(); cid++) { cid_to_keypoint_map[cid] = Eigen::MatrixXd(2, keypoint_vec[cid].size()); cid_to_filename[cid] = cams[cid].image_name; } // Copy over only inliers, and tracks of length >= 2. rig::PidCidFid nvm_pid_to_cid_fid; std::vector<Eigen::Vector3d> nvm_pid_to_xyz; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { std::map<int, int> nvm_cid_fid; for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; // Keep inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) continue; Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second); // Offset relative to the optical center if (shift_keypoints) dist_ip -= cam_params[cams[cid].camera_type].GetOpticalOffset(); // Add this to the keypoint map for cid in the location at fid_count[cid] cid_to_keypoint_map.at(cid).col(fid) = dist_ip; nvm_cid_fid[cid] = fid; } // Keep only tracks with at least two points if (nvm_cid_fid.size() > 1) { nvm_pid_to_cid_fid.push_back(nvm_cid_fid); nvm_pid_to_xyz.push_back(xyz_vec[pid]); } } asp::writeNvm(cid_to_keypoint_map, cid_to_filename, nvm_pid_to_cid_fid, nvm_pid_to_xyz, world_to_cam, nvm_file); // Write the optical center per image if (shift_keypoints) { // Remove .nvm and add new suffix std::string offset_path = changeFileSuffix(nvm_file, "_offsets.txt"); std::cout << "Writing optical center per image: " << offset_path << std::endl; std::ofstream offset_fh(offset_path.c_str()); offset_fh.precision(17); // Save with the highest precision for (size_t cid = 0; cid < cid_to_filename.size(); cid++) { auto const& optical_center = cam_params[cams[cid].camera_type].GetOpticalOffset(); offset_fh << cid_to_filename[cid] << " " << optical_center[0] << " " << optical_center[1] << "\n"; } } } // Calculate the rmse residual for each residual type. void calcResidualStats(std::vector<double> const& residuals, std::vector<std::string> const& residual_names, std::string const& tag) { size_t num = residuals.size(); if (num != residual_names.size()) LOG(FATAL) << "There must be as many residuals as residual names."; std::map<std::string, std::vector<double>> stats; for (size_t it = 0; it < residuals.size(); it++) stats[residual_names[it]] = std::vector<double>(); // initialize for (size_t it = 0; it < residuals.size(); it++) stats[residual_names[it]].push_back(std::abs(residuals[it])); std::cout << "The 25, 50, 75, and 100th percentile residual stats " << tag << std::endl; for (auto it = stats.begin(); it != stats.end(); it++) { std::string const& name = it->first; std::vector<double> vals = stats[name]; // make a copy std::sort(vals.begin(), vals.end()); int len = vals.size(); int it1 = static_cast<int>(0.25 * len); int it2 = static_cast<int>(0.50 * len); int it3 = static_cast<int>(0.75 * len); int it4 = static_cast<int>(len - 1); if (len == 0) std::cout << name << ": " << "none"; else std::cout << std::setprecision(5) << name << ": " << vals[it1] << ' ' << vals[it2] << ' ' << vals[it3] << ' ' << vals[it4]; std::cout << " (" << len << " residuals)" << std::endl; } } // Write the inlier residuals. Create one output file for each camera type. // The format of each file is: // dist_pixel_x, dist_pixel_y, norm(residual_x, residual_y) void writeResiduals(std::string const& out_dir, std::string const & prefix, std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const& cams, rig::KeypointVec const& keypoint_vec, rig::PidCidFid const& pid_to_cid_fid, rig::PidCidFidMap const& pid_cid_fid_inlier, rig::PidCidFidMap const& pid_cid_fid_to_residual_index, std::vector<double> const& residuals) { if (pid_to_cid_fid.size() != pid_cid_fid_inlier.size()) LOG(FATAL) << "Expecting as many inlier flags as there are tracks.\n"; typedef std::tuple<double, double, double> Triplet; std::vector<std::vector<Triplet>> res_vec(cam_names.size()); // Create the pixel and residual triplet for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; // Keep inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) continue; // Pixel value Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second); // Find the pixel residuals size_t residual_index = rig::getMapValue(pid_cid_fid_to_residual_index, pid, cid, fid); if (residuals.size() <= residual_index + 1) LOG(FATAL) << "Too few residuals.\n"; double res_x = residuals[residual_index + 0]; double res_y = residuals[residual_index + 1]; double res = Eigen::Vector2d(res_x, res_y).norm(); int cam_type = cams[cid].camera_type; res_vec[cam_type].push_back(Triplet(dist_ip.x(), dist_ip.y(), res)); } } // Save these to disk rig::createDir(out_dir); for (size_t cam_type = 0; cam_type < cam_names.size(); cam_type++) { std::string out_file = out_dir + "/" + cam_names[cam_type] + "-" + prefix + "-residuals.txt"; std::cout << "Writing: " << out_file << std::endl; std::ofstream ofs (out_file.c_str()); ofs.precision(17); ofs << "# pixel_x pixel_y residual\n"; // stereo_gui will use this for (size_t rit = 0; rit < res_vec[cam_type].size(); rit++) { auto const& T = res_vec[cam_type][rit]; ofs << std::get<0>(T) << ' ' << std::get<1>(T) << ' ' << std::get<2>(T) << std::endl; } } return; } } // end namespace rig ================================================ FILE: src/asp/Rig/RigUtils.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_RIG_UTILS_H #define ASP_RIG_RIG_UTILS_H #include <asp/Rig/RigTypeDefs.h> #include <opencv2/calib3d/calib3d.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/core/utility.hpp> #include <Eigen/Core> #include <Eigen/Geometry> #include <boost/shared_ptr.hpp> #include <map> #include <set> #include <string> #include <vector> // Forward declarations namespace rig { class CameraParameters; class cameraImage; class ImageMessage; class RigSet; const std::string NO_DEPTH_FILE = "no_depth_file"; // Read a 4x4 pose matrix of doubles from disk void readPoseMatrix(cv::Mat& pose, std::string const& filename); // Read an affine matrix with double values bool readAffine(Eigen::Affine3d& T, std::string const& filename); // Write a matrix with double values void writeMatrix(Eigen::MatrixXd const& M, std::string const& filename); void writeCloud(std::vector<float> const& points, size_t point_size, std::string const& filename); // Return the type of an opencv matrix std::string matType(cv::Mat const& mat); // A class to store timestamped poses, implementing O(log(n)) linear // interpolation at a desired timestamp. For fast access, keep the // poses in bins obtained by flooring the timestamp, which is measured // in seconds. It is assumed that there are a handful of poses // measured every second, so in each bin. When bins get large, or too // many bins are empty, the efficiency of this algorithm goes down. class StampedPoseStorage { public: void addPose(Eigen::Affine3d const& pose, double timestamp); // Find the interpolated pose by looking up the two poses with // closest timestamps that are below and above input_timestamp. If // the gap between those timestamps is more than max_gap, return // failure, as then likely the interpolation result is not accurate. bool interpPose(double input_timestamp, double max_gap, Eigen::Affine3d& out_pose) const; void clear(); bool empty() const; private: std::map<int, std::map<double, Eigen::Affine3d>> m_poses; }; // A little holding structure for nav, sci, and haz poses struct CameraPoses { std::map<double, double> haz_depth_to_image_timestamps; std::map<std::string, std::map<double, Eigen::Affine3d>> world_to_cam_poses; }; // Some small utilities for writing a file having poses for nav, sci, and haz cam, // and also the depth timestamp corresponding to given haz intensity timestamp void writeCameraPoses(std::string const& filename, std::map<double, double> const& haz_depth_to_image_timestamps, std::map<std::string, std::map<double, Eigen::Affine3d>> const& world_to_cam_poses); void readCameraPoses(std::string const& filename, std::map<double, double>& haz_depth_to_image_timestamps, std::map<std::string, std::map<double, Eigen::Affine3d>>& world_to_cam_poses); // Scale an image to correct for lightning variations by taking into // account that JPEG images have gamma correction applied to them. // See https://en.wikipedia.org/wiki/Gamma_correction. void scaleImage(double max_iso_times_exposure, double iso, double exposure, cv::Mat const& input_image, cv::Mat& output_image); // Given two bounds, pick two timestamps within these bounds, the one // closest to the left bound and the one to the right bound. Take into // account that the timestamps may need to have an offset added to // them. Assume that the input timestamps are sorted in increasing order. // TODO(oalexan1): May have to add a constraint to only pick // a timestamp if not further from the bound than a given value. void pickTimestampsInBounds(std::vector<double> const& timestamps, double left_bound, double right_bound, double offset, std::vector<double>& out_timestamps); // Must always have NUM_EXIF the last. enum ExifData { TIMESTAMP = 0, EXPOSURE_TIME, ISO, APERTURE, FOCAL_LENGTH, NUM_EXIF }; // Find the depth measurement. Use nearest neighbor interpolation // to look into the depth cloud. bool depthValue(// Inputs cv::Mat const& depth_cloud, Eigen::Vector2d const& dist_ip, // Output Eigen::Vector3d& depth_xyz); // Forward declaration struct cameraImage; // Read the images, depth clouds, and their metadata // Save the properties of images. Use space as separator. void saveCameraPoses(std::string const& out_dir, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam); // Save the depth clouds and optimized transforms needed to create a mesh with voxblox // (if depth clouds exist). void exportToVoxblox(std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const& cam_images, std::vector<Eigen::Affine3d> const& depth_to_image, std::vector<Eigen::Affine3d> const& world_to_cam, std::string const& out_dir); void saveTransformedDepthClouds(std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const& cam_images, std::vector<Eigen::Affine3d> const& depth_to_image, std::vector<Eigen::Affine3d> const& world_to_cam, std::string const& out_dir); // Write the inliers in nvm format. The keypoints are shifted relative to the // optical center, as written by Theia if shift_keypoints is specified. This // handles properly the case when a (cid, fid) shows up in many tracks. void writeInliersToNvm(std::string const& nvm_file, bool shift_keypoints, std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::KeypointVec const& keypoint_vec, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, std::vector<Eigen::Vector3d> const& xyz_vec); // Calculate the rmse residual for each residual type. void calcResidualStats(std::vector<double> const& residuals, std::vector<std::string> const& residual_names, std::string const& tag); // Write the inlier residuals. Create one output file for each camera type. // The format of each file is: // dist_pixel_x, dist_pixel_y, norm(residual_x, residual_y) void writeResiduals(std::string const& out_dir, std::string const & prefix, std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const& cams, rig::KeypointVec const& keypoint_vec, rig::PidCidFid const& pid_to_cid_fid, rig::PidCidFidMap const& pid_cid_fid_inlier, rig::PidCidFidMap const& pid_cid_fid_to_residual_index, std::vector<double> const& residuals); } // namespace rig #endif // ASP_RIG_RIG_UTILS_H ================================================ FILE: src/asp/Rig/SystemUtils.cc ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/SystemUtils.h> #include <boost/filesystem.hpp> #include <glog/logging.h> namespace rig { // Create a directory recursively, unless it exists already. This works like mkdir -p. void createDir(std::string const& dir) { if (dir == "") return; // This can be useful if dir was created with parent_path(). if (!boost::filesystem::exists(dir)) { if (!boost::filesystem::create_directories(dir) || !boost::filesystem::is_directory(dir)) LOG(FATAL) << "Failed to create directory: " << dir << "\n"; } } } // end namespace rig ================================================ FILE: src/asp/Rig/SystemUtils.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_SYSTEM_UTILS_H #define ASP_RIG_SYSTEM_UTILS_H #include <string> namespace rig { // Create a directory recursively, unless it exists already. This works like mkdir -p. void createDir(std::string const& dir); } // namespace rig #endif // ASP_RIG_SYSTEM_UTILS_H ================================================ FILE: src/asp/Rig/TextureProcessing.cc ================================================ /* Copyright (c) 2021-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/TextureProcessing.h> #include <asp/Rig/RigCameraUtils.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/BasicAlgs.h> // OpenCV includes #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc.hpp> // Eigen includes #include <Eigen/Geometry> #include <Eigen/Core> #include <glog/logging.h> // Boost includes #include <boost/filesystem.hpp> // texrecon includes #include <mve/image_io.h> #include <mve/image_tools.h> #include <tex/defines.h> #include <tex/obj_model.h> #include <util/file_system.h> // System includes #include <string> #include <map> #include <iostream> #include <fstream> #include <utility> #include <set> // TODO(oalexan1): Consider applying TILE_PADDING not to at the atlas // forming stage, when the patch is padded, but earlier, right when // the patch is created from a mesh triangle. That will ensure that // while the same overall buffer is used, the padding region will have // actual image samples, which may improve the rendering in meshlab // when one zooms out, where now for some reason the triangle edges // show up. Can test the output with the test_texture_gen tool. namespace rig { void loadMeshBuildTree(std::string const& mesh_file, mve::TriangleMesh::Ptr& mesh, std::shared_ptr<mve::MeshInfo>& mesh_info, std::shared_ptr<tex::Graph>& graph, std::shared_ptr<BVHTree>& bvh_tree) { std::cout << "Loading mesh: " << mesh_file << std::endl; mesh = mve::geom::load_ply_mesh(mesh_file); mesh_info = std::shared_ptr<mve::MeshInfo>(new mve::MeshInfo(mesh)); tex::prepare_mesh(mesh_info.get(), mesh); std::size_t const num_faces = mesh->get_faces().size() / 3; if (num_faces > std::numeric_limits<std::uint32_t>::max()) throw std::runtime_error("Exeeded maximal number of faces"); // TODO(oalexan1): Is this necessary? graph = std::shared_ptr<tex::Graph>(new tex::Graph(num_faces)); tex::build_adjacency_graph(mesh, *mesh_info.get(), graph.get()); util::WallTimer timer; std::vector<unsigned int> const& faces = mesh->get_faces(); std::vector<math::Vec3f> const& vertices = mesh->get_vertices(); std::cout << "Number of faces: " << faces.size() / 3 << " faces.\n"; bvh_tree = std::shared_ptr<BVHTree>(new BVHTree(faces, vertices)); std::cout << "Building the tree took: " << timer.get_elapsed() / 1000.0 << " seconds\n"; } Eigen::Vector3d vec3f_to_eigen(math::Vec3f const& v) { Eigen::Vector3d V; for (size_t it = 0; it < 3; it++) V[it] = v[it]; return V; } math::Vec3f eigen_to_vec3f(Eigen::Vector3d const& V) { math::Vec3f v; for (size_t it = 0; it < 3; it++) v[it] = V[it]; return v; } void formMtl(std::string const& out_prefix, std::string& mtl_str) { std::ostringstream ofs; ofs << "newmtl material0000\n"; ofs << "Ka 0.200000 0.200000 0.200000\n"; ofs << "Kd 1.000000 1.000000 1.000000\n"; ofs << "Ks 1.000000 1.000000 1.000000\n"; ofs << "Tr 0.000000\n"; ofs << "illum 2\n"; ofs << "Ns 0.000000\n"; ofs << "map_Kd " << out_prefix << ".png\n"; mtl_str = ofs.str(); } void formObjCustomUV(mve::TriangleMesh::ConstPtr mesh, std::vector<Eigen::Vector3i> const& face_vec, std::map<int, Eigen::Vector2d> const& uv_map, std::string const& out_prefix, std::string& obj_str) { // Get handles to the vertices and vertex normals std::vector<math::Vec3f> const& vertices = mesh->get_vertices(); std::vector<math::Vec3f> const& mesh_normals = mesh->get_vertex_normals(); if (vertices.size() != mesh_normals.size()) LOG(FATAL) << "A mesh must have as many vertices as vertex normals."; // The uv_map assigns to each of the mesh vertices that is visible // in the texture its (u, v) pair. Find the map from each vertex // index to the index in the list of (u, v) pairs. std::map<int, int> vertex_to_uv; int64_t count = 0; for (auto it = uv_map.begin(); it != uv_map.end(); it++) { vertex_to_uv[it->first] = count; count++; } std::ostringstream out; out << "mtllib " << out_prefix << ".mtl\n"; out << std::setprecision(16); for (std::size_t i = 0; i < vertices.size(); i++) { out << "v " << vertices[i][0] << " " << vertices[i][1] << " " << vertices[i][2] << "\n"; } for (auto it = uv_map.begin(); it != uv_map.end(); it++) out << "vt " << (it->second)[0] << " " << (it->second)[1] << "\n"; for (std::size_t i = 0; i < mesh_normals.size(); i++) out << "vn " << mesh_normals[i][0] << " " << mesh_normals[i][1] << " " << mesh_normals[i][2] << "\n"; int64_t OBJ_INDEX_OFFSET = 1; // have indices start from 1 for (std::size_t j = 0; j < face_vec.size(); j++) { out << "f"; for (std::size_t k = 0; k < 3; ++k) { out << " " << face_vec[j][k] + OBJ_INDEX_OFFSET << "/" << vertex_to_uv[face_vec[j][k]] + OBJ_INDEX_OFFSET << "/" << face_vec[j][k] + OBJ_INDEX_OFFSET; } out << "\n"; } obj_str = out.str(); } // Project texture and find the UV coordinates void projectTexture(mve::TriangleMesh::ConstPtr mesh, std::shared_ptr<BVHTree> bvh_tree, cv::Mat const& image, Eigen::Affine3d const& world_to_cam, rig::CameraParameters const& cam_params, // outputs std::vector<double>& smallest_cost_per_face, std::vector<Eigen::Vector3i>& face_vec, std::map<int, Eigen::Vector2d>& uv_map) { // Wipe the outputs face_vec.clear(); uv_map.clear(); // Compute camera center from world_to_cam transform Eigen::Vector3d cam_ctr = world_to_cam.inverse().translation(); // Here need to take into account that for real (not simulated) // images the camera may have been calibrated at 1/4 the original // image resolution. We will use the calibrated dimensions when // normalizing u and v, because when projecting 3D points in the // camera we will the calibrated camera model. int64_t raw_image_cols = image.cols; int64_t raw_image_rows = image.rows; int64_t calib_image_cols = cam_params.GetDistortedSize()[0]; int64_t calib_image_rows = cam_params.GetDistortedSize()[1]; int64_t factor = raw_image_cols / calib_image_cols; if ((raw_image_cols != calib_image_cols * factor) || (raw_image_rows != calib_image_rows * factor)) { LOG(FATAL) << "Published image width and height are: " << raw_image_cols << ' ' << raw_image_rows << "\n" << "Calibrated image width and height are: " << calib_image_cols << ' ' << calib_image_rows << "\n" << "These must be equal up to an integer factor.\n"; } std::vector<math::Vec3f> const& vertices = mesh->get_vertices(); std::vector<math::Vec3f> const& mesh_normals = mesh->get_vertex_normals(); if (vertices.size() != mesh_normals.size()) LOG(FATAL) << "A mesh must have as many vertices as vertex normals."; std::vector<unsigned int> const& faces = mesh->get_faces(); std::vector<math::Vec3f> const& face_normals = mesh->get_face_normals(); if (smallest_cost_per_face.size() != faces.size()) LOG(FATAL) << "There must be one cost value per face."; #pragma omp parallel for for (std::size_t face_id = 0; face_id < faces.size() / 3; face_id++) { math::Vec3f const& v1 = vertices[faces[3 * face_id + 0]]; math::Vec3f const& v2 = vertices[faces[3 * face_id + 1]]; math::Vec3f const& v3 = vertices[faces[3 * face_id + 2]]; math::Vec3f const& face_normal = face_normals[face_id]; math::Vec3f const face_center = (v1 + v2 + v3) / 3.0f; // Do some geometric checks and compute the cost for this face and camera Eigen::Vector3d cam_to_face_vec = (vec3f_to_eigen(face_center) - cam_ctr).normalized(); Eigen::Vector3d face_to_cam_vec = -cam_to_face_vec; double face_normal_to_cam_dot_prod = face_to_cam_vec.dot(vec3f_to_eigen(face_normal)); if (face_normal_to_cam_dot_prod <= 0.0) continue; // The face points away from the camera // Angle between face normal and ray from face center to camera center // is bigger than 75 degrees. // TODO(oalexan1): Make this a parameter. // TODO(oalexan1): Filter by distance from each of // v1, v2, v3 to view_pos. double face_normal_to_cam_angle = std::acos(face_normal_to_cam_dot_prod); // radians if (face_normal_to_cam_angle > 75.0 * M_PI / 180.0) continue; // The further a camera is and the bigger then angle between the // camera direction and the face normal, the less we want this // camera's texture for this triangle. double cost_val = face_normal_to_cam_angle + (vec3f_to_eigen(face_center) - cam_ctr).norm(); if (cost_val >= smallest_cost_per_face[face_id]) { continue; } // A mesh triangle is visible if rays from its vertices do not // intersect the mesh somewhere else before hitting the camera, // and hit the camera inside the image bounds. bool visible = true; math::Vec3f const* samples[] = {&v1, &v2, &v3}; std::vector<Eigen::Vector2d> UV; for (std::size_t vertex_it = 0; vertex_it < 3; vertex_it++) { BVHTree::Ray ray; ray.origin = *samples[vertex_it]; ray.dir = eigen_to_vec3f(cam_ctr) - ray.origin; ray.tmax = ray.dir.norm(); ray.tmin = ray.tmax * 0.0001f; ray.dir.normalize(); BVHTree::Hit hit; if (bvh_tree->intersect(ray, &hit)) { visible = false; break; } // Triangle vertex in world coordinates Eigen::Vector3d world_pt = vec3f_to_eigen(*samples[vertex_it]); // Transform the vertex to camera coordinates Eigen::Vector3d cam_pt = world_to_cam * world_pt; // Skip points that project behind the camera if (cam_pt.z() <= 0) { visible = false; break; } // Get the undistorted pixel Eigen::Vector2d undist_centered_pix = cam_params.GetFocalVector().cwiseProduct(cam_pt.hnormalized()); if (std::abs(undist_centered_pix[0]) > cam_params.GetUndistortedHalfSize()[0] || std::abs(undist_centered_pix[1]) > cam_params.GetUndistortedHalfSize()[1]) { // If we are out of acceptable undistorted region, there's some uncertainty whether // the distortion computation in the next operation will work, so quit early. visible = false; break; } // Get the distorted pixel value Eigen::Vector2d dist_pix; cam_params.Convert<rig::UNDISTORTED_C, rig::DISTORTED> (undist_centered_pix, &dist_pix); // Skip pixels that don't project in the window of dimensions // dist_crop_size centered at the image center. Note that // dist_crop_size is read from the camera configuration, and is // normally either the full image or something smaller if the // user restricts the domain of validity of the distortion // model. Eigen::Vector2i dist_size = cam_params.GetDistortedSize(); Eigen::Vector2i dist_crop_size = cam_params.GetDistortedCropSize(); if (std::abs(dist_pix[0] - dist_size[0] / 2.0) > dist_crop_size[0] / 2.0 || std::abs(dist_pix[1] - dist_size[1] / 2.0) > dist_crop_size[1] / 2.0) { visible = false; break; } // Find the u, v coordinates of each vertex double u = dist_pix.x() / calib_image_cols; // TODO(oalexan1): Maybe use: // v = (calib_image_rows - 1 - dist_pix.y())/image_rows ? double v = 1.0 - dist_pix.y() / calib_image_rows; UV.push_back(Eigen::Vector2d(u, v)); } if (!visible) continue; #pragma omp critical { // Here we integrate the results from each loop iteration so have // to use a lock (critical section). // Sanity check, to ensure nothing got mixed up with the multiple // threads if (cost_val >= smallest_cost_per_face[face_id]) LOG(FATAL) << "Book-keeping error in estimating cost per face."; smallest_cost_per_face[face_id] = cost_val; for (std::size_t vertex_it = 0; vertex_it < 3; vertex_it++) uv_map[faces[3 * face_id + vertex_it]] = UV[vertex_it]; face_vec.push_back(Eigen::Vector3i(faces[3 * face_id + 0], faces[3 * face_id + 1], faces[3 * face_id + 2])); } } // End loop over mesh faces } // Intersect ray with a mesh. Return true on success. bool ray_mesh_intersect(Eigen::Vector2d const& dist_pix, rig::CameraParameters const& cam_params, Eigen::Affine3d const& world_to_cam, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, double min_ray_dist, double max_ray_dist, // Output Eigen::Vector3d& intersection) { // Initialize the output intersection = Eigen::Vector3d(0.0, 0.0, 0.0); // Calculate camera center and ray direction Eigen::Vector3d cam_ctr, world_ray; rig::calcCamCtrDir(cam_params, dist_pix, world_to_cam, cam_ctr, world_ray); // Set up the ray structure for the mesh BVHTree::Ray bvh_ray; bvh_ray.origin = rig::eigen_to_vec3f(cam_ctr); bvh_ray.dir = rig::eigen_to_vec3f(world_ray); bvh_ray.dir.normalize(); bvh_ray.tmin = min_ray_dist; bvh_ray.tmax = max_ray_dist; // Intersect the ray with the mesh BVHTree::Hit hit; if (bvh_tree->intersect(bvh_ray, &hit)) { double cam_to_mesh_dist = hit.t; intersection = cam_ctr + cam_to_mesh_dist * world_ray; return true; } return false; } // Project and save a mesh as an obj file to out_prefix.obj, // out_prefix.mtl, out_prefix.png. void meshProject(mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, cv::Mat const& image, Eigen::Affine3d const& world_to_cam, rig::CameraParameters const& cam_params, std::string const& out_prefix) { // Create the output directory, if needed std::string out_dir = boost::filesystem::path(out_prefix).parent_path().string(); if (out_dir != "") rig::createDir(out_dir); std::vector<Eigen::Vector3i> face_vec; std::map<int, Eigen::Vector2d> uv_map; std::vector<unsigned int> const& faces = mesh->get_faces(); int64_t num_faces = faces.size(); std::vector<double> smallest_cost_per_face(num_faces, 1.0e+100); // Find the UV coordinates and the faces having them rig::projectTexture(mesh, bvh_tree, image, world_to_cam, cam_params, smallest_cost_per_face, face_vec, uv_map); // Strip the directory name, according to .obj file conventions. std::string suffix = boost::filesystem::path(out_prefix).filename().string(); std::string obj_str; rig::formObjCustomUV(mesh, face_vec, uv_map, suffix, obj_str); std::string mtl_str; rig::formMtl(suffix, mtl_str); std::string obj_file = out_prefix + ".obj"; std::cout << "Writing: " << obj_file << std::endl; std::ofstream obj_handle(obj_file); obj_handle << obj_str; obj_handle.close(); std::string mtl_file = out_prefix + ".mtl"; std::cout << "Writing: " << mtl_file << std::endl; std::ofstream mtl_handle(mtl_file); mtl_handle << mtl_str; mtl_handle.close(); std::string texture_file = out_prefix + ".png"; std::cout << "Writing: " << texture_file << std::endl; cv::imwrite(texture_file, image); } // Project given images with optimized cameras onto mesh. It is // assumed that the most up-to-date cameras were copied/interpolated // form the optimizer structures into the world_to_cam vector. void meshProjectCameras(std::vector<std::string> const& cam_names, std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cam_images, std::vector<Eigen::Affine3d> const& world_to_cam, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, std::string const& out_dir) { if (cam_names.size() != cam_params.size()) LOG(FATAL) << "There must be as many camera names as sets of camera parameters.\n"; if (cam_images.size() != world_to_cam.size()) LOG(FATAL) << "There must be as many camera images as camera poses.\n"; if (out_dir.empty()) LOG(FATAL) << "The output directory is empty.\n"; char filename_buffer[1000]; for (size_t cid = 0; cid < cam_images.size(); cid++) { double timestamp = cam_images[cid].timestamp; int cam_type = cam_images[cid].camera_type; // Must use the 10.7f format for the timestamp as everywhere else in the code snprintf(filename_buffer, sizeof(filename_buffer), "%s/%10.7f_%s", out_dir.c_str(), timestamp, cam_names[cam_type].c_str()); std::string out_prefix = filename_buffer; // convert to string std::cout << "Creating texture for: " << out_prefix << std::endl; meshProject(mesh, bvh_tree, cam_images[cid].image, world_to_cam[cid], cam_params[cam_type], out_prefix); } } // Intersect them with a mesh instead, and average those intersections. // This will be used to for a mesh-to-triangulated-points constraint. void meshTriangulations(std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, rig::KeypointVec const& keypoint_vec, double min_ray_dist, double max_ray_dist, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, // Outputs rig::PidCidFidToMeshXyz & pid_cid_fid_mesh_xyz, std::vector<Eigen::Vector3d> & pid_mesh_xyz) { // Initialize the outputs pid_cid_fid_mesh_xyz.resize(pid_to_cid_fid.size()); pid_mesh_xyz.resize(pid_to_cid_fid.size()); for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { Eigen::Vector3d avg_mesh_xyz(0, 0, 0); int num_intersections = 0; for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; // Initialize this pid_cid_fid_mesh_xyz[pid][cid][fid] = rig::badMeshXyz(); // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) continue; // Intersect the ray with the mesh Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second); Eigen::Vector3d mesh_xyz(0.0, 0.0, 0.0); bool have_mesh_intersection = rig::ray_mesh_intersect(dist_ip, cam_params[cams[cid].camera_type], world_to_cam[cid], mesh, bvh_tree, min_ray_dist, max_ray_dist, // Output mesh_xyz); if (have_mesh_intersection) { pid_cid_fid_mesh_xyz[pid][cid][fid] = mesh_xyz; avg_mesh_xyz += mesh_xyz; num_intersections += 1; } } // Average the intersections of all rays with the mesh if (num_intersections >= 1) avg_mesh_xyz /= num_intersections; else avg_mesh_xyz = rig::badMeshXyz(); pid_mesh_xyz[pid] = avg_mesh_xyz; } return; } } // namespace rig ================================================ FILE: src/asp/Rig/TextureProcessing.h ================================================ /* Copyright (c) 2021-2026, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_TEXTURE_PROCESSING_H #define ASP_RIG_TEXTURE_PROCESSING_H #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/RigUtils.h> #include <asp/Rig/CameraImage.h> #include <Eigen/Geometry> #include <Eigen/Core> // texrecon includes #include <mve/mesh_io_ply.h> #include <mve/mesh_info.h> #include <mve/mesh.h> #include <mve/image.h> #include <acc/bvh_tree.h> #include <tex/timer.h> #include <tex/texturing.h> #include <tex/tri.h> #include <tex/texture_patch.h> #include <tex/rectangular_bin.h> #include <tex/material_lib.h> #include <util/exception.h> #include <math/vector.h> // OpenCV #include <opencv2/highgui/highgui.hpp> #include <vector> #include <map> #include <limits> #include <string> typedef acc::BVHTree<unsigned int, math::Vec3f> BVHTree; namespace rig { // Small utilities inline Eigen::Vector3d badMeshXyz() { return Eigen::Vector3d(1.0e+100, 1.0e+100, 1.0e+100); } Eigen::Vector3d vec3f_to_eigen(math::Vec3f const& v); math::Vec3f eigen_to_vec3f(Eigen::Vector3d const& V); // Load and prepare a mesh void loadMeshBuildTree(std::string const& mesh_file, mve::TriangleMesh::Ptr& mesh, std::shared_ptr<mve::MeshInfo>& mesh_info, std::shared_ptr<tex::Graph>& graph, std::shared_ptr<BVHTree>& bvh_tree); // Put an textured mesh obj file in a string void formObjCustomUV(mve::TriangleMesh::ConstPtr mesh, std::vector<Eigen::Vector3i> const& face_vec, std::map<int, Eigen::Vector2d> const& uv_map, std::string const& out_prefix, std::string& obj_str); void formMtl(std::string const& out_prefix, std::string& mtl_str); // Find where ray emanating from a distorted pixel intersects a mesh. Return true // on success. bool ray_mesh_intersect(Eigen::Vector2d const& dist_pix, rig::CameraParameters const& cam_params, Eigen::Affine3d const& world_to_cam, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, double min_ray_dist, double max_ray_dist, // Output Eigen::Vector3d& intersection); void meshProject(mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, cv::Mat const& image, Eigen::Affine3d const& world_to_cam, rig::CameraParameters const& cam_params, std::string const& out_prefix); void meshProjectCameras(std::vector<std::string> const& cam_names, std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cam_images, std::vector<Eigen::Affine3d> const& world_to_cam, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, std::string const& out_dir); void meshTriangulations(// Inputs std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, rig::KeypointVec const& keypoint_vec, double min_ray_dist, double max_ray_dist, mve::TriangleMesh::Ptr const& mesh, std::shared_ptr<BVHTree> const& bvh_tree, // Outputs rig::PidCidFidToMeshXyz & pid_cid_fid_mesh_xyz, std::vector<Eigen::Vector3d> & pid_mesh_xyz); } // namespace rig #endif // ASP_RIG_TEXTURE_PROCESSING_H ================================================ FILE: src/asp/Rig/Tracks.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ // TODO(oalexan1): Move here track logic from interest_point.cc. #include <asp/Rig/CameraImage.h> #include <asp/Rig/Tracks.h> #include <asp/Rig/RigTypeDefs.h> // Get rid of warning beyond our control #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic push #include <OpenMVG/numeric.h> #include <OpenMVG/projection.hpp> #include <OpenMVG/triangulation_nview.hpp> #include <asp/OpenMVG/tracks.hpp> #pragma GCC diagnostic pop #include <glog/logging.h> #include <set> #include <vector> #include <map> namespace rig { // Given tracks in a map C that has images from one map A followed by // images from second map named B, split the tracks that have at least // two features in each map into tracks for the two maps. For the // second one, need to shift the cid to start from 0 rather than from // end of first map. The resulting vectors of tracks must be in // one-to-one correspondence. void splitTracksOneToOne(// Inputs int num_acid, // number of images in map A rig::PidCidFid const& C_pid_to_cid_fid, rig::KeypointVec const& C_keypoint_vec, std::vector<rig::cameraImage> const& C_cams, // Outputs rig::PidCidFid & A_pid_to_cid_fid, rig::PidCidFid & B_pid_to_cid_fid, rig::KeypointVec & A_keypoint_vec, rig::KeypointVec & B_keypoint_vec, std::vector<rig::cameraImage> & A_cams, std::vector<rig::cameraImage> & B_cams) { // Wipe the outputs A_pid_to_cid_fid.clear(); B_pid_to_cid_fid.clear(); A_keypoint_vec.clear(); B_keypoint_vec.clear(); A_cams.clear(); B_cams.clear(); for (size_t pid = 0; pid < C_pid_to_cid_fid.size(); pid++) { auto & cid_fid = C_pid_to_cid_fid[pid]; std::map<int, int> A_cid_fid, B_cid_fid; for (auto map_it = cid_fid.begin(); map_it != cid_fid.end(); map_it++) { int cid = map_it->first; int fid = map_it->second; if (cid < num_acid) A_cid_fid[cid] = fid; // belongs to A else B_cid_fid[cid - num_acid] = fid; // belongs to B } if (A_cid_fid.size() > 1 && B_cid_fid.size() > 1) { // This is a shared track, that we break in two. Each obtained track // must have at least two images. A_pid_to_cid_fid.push_back(A_cid_fid); B_pid_to_cid_fid.push_back(B_cid_fid); } } // Break up the keypoint vec and the images for (size_t cid = 0; cid < C_keypoint_vec.size(); cid++) { if (cid < num_acid) { A_keypoint_vec.push_back(C_keypoint_vec[cid]); A_cams.push_back(C_cams[cid]); } else { B_keypoint_vec.push_back(C_keypoint_vec[cid]); B_cams.push_back(C_cams[cid]); } } return; } // Build tracks from pairs void buildTracks(aspOpenMVG::matching::PairWiseMatches const& match_map, rig::PidCidFid & pid_to_cid_fid) { // output pid_to_cid_fid.clear(); // wipe the output aspOpenMVG::tracks::TracksBuilder trackBuilder; trackBuilder.Build(match_map); // Build: Efficient fusion of correspondences trackBuilder.Filter(); // Filter: Remove tracks that have conflict // trackBuilder.ExportToStream(std::cout); // Export tracks as a map (each entry is a sequence of imageId and featureIndex): // {TrackIndex => {(imageIndex, featureIndex), ... ,(imageIndex, featureIndex)} aspOpenMVG::tracks::STLMAPTracks map_tracks; trackBuilder.ExportToSTL(map_tracks); trackBuilder = aspOpenMVG::tracks::TracksBuilder(); // wipe it if (map_tracks.empty()) LOG(FATAL) << "No tracks left after filtering. Perhaps images " << "are too dis-similar?\n"; // Populate the filtered tracks size_t num_elems = map_tracks.size(); pid_to_cid_fid.clear(); pid_to_cid_fid.resize(num_elems); size_t curr_id = 0; for (auto itr = map_tracks.begin(); itr != map_tracks.end(); itr++) { for (auto itr2 = (itr->second).begin(); itr2 != (itr->second).end(); itr2++) { pid_to_cid_fid[curr_id][itr2->first] = itr2->second; } curr_id++; } return; } // Remove duplicate tracks. There can still be two tracks with one contained // in the other or otherwise having shared elements. void rmDuplicateTracks(rig::PidCidFid & pid_to_cid_fid) { int num_tracks = pid_to_cid_fid.size(); // vector to set, and back std::set<std::map<int, int>> track_set(pid_to_cid_fid.begin(), pid_to_cid_fid.end()); pid_to_cid_fid.assign(track_set.begin(), track_set.end()); int diff = num_tracks - int(pid_to_cid_fid.size()); std::cout << "Removed " << diff << " duplicate tracks (" << 100.0 * double(diff)/double(num_tracks) << "%)\n"; } } // end namespace rig ================================================ FILE: src/asp/Rig/Tracks.h ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef ASP_RIG_TRACKS_H #define ASP_RIG_TRACKS_H #include <set> #include <vector> #include <map> #include <asp/Rig/RigTypeDefs.h> // TODO(oalexan1): Move here all tracks logic from interest_point.cc. namespace aspOpenMVG { namespace matching { class PairWiseMatches; } } namespace rig { class cameraImage; void buildTracks(aspOpenMVG::matching::PairWiseMatches const& match_map, rig::PidCidFid & pid_to_cid_fid); // Remove duplicate tracks. There can still be two tracks with one contained // in the other or otherwise having shared elements. void rmDuplicateTracks(rig::PidCidFid & pid_to_cid_fid); // See tracks.cc for the doc void splitTracksOneToOne(// Inputs int num_acid, // number of images in map A rig::PidCidFid const& C_pid_to_cid_fid, rig::KeypointVec const& C_keypoint_vec, std::vector<rig::cameraImage> const& C_cams, // Outputs rig::PidCidFid & A_pid_to_cid_fid, rig::PidCidFid & B_pid_to_cid_fid, rig::KeypointVec & A_keypoint_vec, rig::KeypointVec & B_keypoint_vec, std::vector<rig::cameraImage> & A_cams, std::vector<rig::cameraImage> & B_cams); } // namespace rig #endif // ASP_RIG_TRACKS_H ================================================ FILE: src/asp/Rig/TransformUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/TransformUtils.h> #include <asp/Rig/InterpolationUtils.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/Triangulation.h> #include <asp/Rig/RigParseUtils.h> #include <glog/logging.h> #include <string> #include <vector> #include <iostream> #include <fstream> #include <set> #include <string> namespace rig { // Save an affine transform represented as a matrix to a string. std::string affineToStr(Eigen::Affine3d const& M) { Eigen::MatrixXd T = M.matrix(); std::ostringstream os; os.precision(17); os << T(0, 0) << " " << T(0, 1) << " " << T(0, 2) << " " << T(1, 0) << " " << T(1, 1) << " " << T(1, 2) << " " << T(2, 0) << " " << T(2, 1) << " " << T(2, 2) << " " << T(0, 3) << " " << T(1, 3) << " " << T(2, 3); return os.str(); } // Form an affine transform from 12 values Eigen::Affine3d vecToAffine(Eigen::VectorXd const& vals) { if (vals.size() != 12) LOG(FATAL) << "An affine transform must have 12 parameters.\n"; Eigen::Affine3d M = Eigen::Affine3d::Identity(); Eigen::MatrixXd T = M.matrix(); int count = 0; // linear part T(0, 0) = vals[count++]; T(0, 1) = vals[count++]; T(0, 2) = vals[count++]; T(1, 0) = vals[count++]; T(1, 1) = vals[count++]; T(1, 2) = vals[count++]; T(2, 0) = vals[count++]; T(2, 1) = vals[count++]; T(2, 2) = vals[count++]; // translation part T(0, 3) = vals[count++]; T(1, 3) = vals[count++]; T(2, 3) = vals[count++]; M.matrix() = T; return M; } // Calculate interpolated world to reference sensor transform. Take into account // that the timestamp is for a sensor which may not be the reference one, so // an offset needs to be applied. If beg_ref_stamp equals end_ref_stamp, // end_world_to_ref_t is ignored. Eigen::Affine3d calc_interp_world_to_ref(const double* beg_world_to_ref_t, const double* end_world_to_ref_t, double beg_ref_stamp, double end_ref_stamp, double ref_to_cam_offset, double cam_stamp) { Eigen::Affine3d beg_world_to_ref_aff; array_to_rigid_transform(beg_world_to_ref_aff, beg_world_to_ref_t); Eigen::Affine3d end_world_to_ref_aff; array_to_rigid_transform(end_world_to_ref_aff, end_world_to_ref_t); // Handle the degenerate case if (end_ref_stamp == beg_ref_stamp) return beg_world_to_ref_aff; // Covert from cam time to ref time and normalize. It is very // important that below we subtract the big numbers from each // other first, which are the timestamps, then subtract whatever // else is necessary. Otherwise we get problems with numerical // precision with CERES. double alpha = ((cam_stamp - beg_ref_stamp) - ref_to_cam_offset) / (end_ref_stamp - beg_ref_stamp); if (alpha < 0.0 || alpha > 1.0) LOG(FATAL) << "Out of bounds in interpolation.\n"; // Interpolate at desired time Eigen::Affine3d interp_world_to_ref_aff = rig::linearInterp(alpha, beg_world_to_ref_aff, end_world_to_ref_aff); return interp_world_to_ref_aff; } // Calculate interpolated world to camera transform. Use the // convention that if beg_ref_stamp == end_ref_stamp, then only // beg_world_to_ref_t is used, while end_world_to_ref_t is // ignored. For the reference camera it is also expected that // ref_to_cam_aff is the identity. This saves some code duplication // later as the ref cam need not be treated separately. Eigen::Affine3d calcWorldToCamBase(const double* beg_world_to_ref_t, const double* end_world_to_ref_t, const double* ref_to_cam_trans, double beg_ref_stamp, double end_ref_stamp, double ref_to_cam_offset, double cam_stamp) { Eigen::Affine3d ref_to_cam_aff; array_to_rigid_transform(ref_to_cam_aff, // output ref_to_cam_trans); Eigen::Affine3d interp_world_to_ref_aff = calc_interp_world_to_ref(beg_world_to_ref_t, end_world_to_ref_t, beg_ref_stamp, end_ref_stamp, ref_to_cam_offset, cam_stamp); return ref_to_cam_aff * interp_world_to_ref_aff; } // Compute the transforms from the world to every camera, based on the rig transforms. void calcWorldToCamWithRig(// Inputs bool have_rig, std::vector<rig::cameraImage> const& cams, std::vector<double> const& world_to_ref_vec, std::vector<double> const& ref_timestamps, std::vector<double> const& ref_to_cam_vec, std::vector<double> const& ref_to_cam_timestamp_offsets, // Output std::vector<Eigen::Affine3d>& world_to_cam) { if (ref_to_cam_vec.size() / rig::NUM_RIGID_PARAMS != ref_to_cam_timestamp_offsets.size()) LOG(FATAL) << "Must have as many transforms to reference as timestamp offsets.\n"; if (world_to_ref_vec.size() / rig::NUM_RIGID_PARAMS != ref_timestamps.size()) LOG(FATAL) << "Must have as many reference timestamps as reference cameras.\n"; // What is stored in "cams" is completely different when a rig is not used, // even one is available and is good, so then this code will give wrong results. if (!have_rig) LOG(FATAL) << "calcWorldToCamWithRig: Must have a rig.\n"; world_to_cam.resize(cams.size()); for (size_t it = 0; it < cams.size(); it++) { int beg_index = cams[it].beg_ref_index; int end_index = cams[it].end_ref_index; int cam_type = cams[it].camera_type; world_to_cam[it] = rig::calcWorldToCamBase (&world_to_ref_vec[rig::NUM_RIGID_PARAMS * beg_index], &world_to_ref_vec[rig::NUM_RIGID_PARAMS * end_index], &ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type], ref_timestamps[beg_index], ref_timestamps[end_index], ref_to_cam_timestamp_offsets[cam_type], cams[it].timestamp); } return; } // A version of the above with the data stored differently void calcWorldToCamWithRig(// Inputs bool have_rig, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_ref, std::vector<double> const& ref_timestamps, std::vector<Eigen::Affine3d> const& ref_to_cam, std::vector<double> const& ref_to_cam_timestamp_offsets, // Output std::vector<Eigen::Affine3d>& world_to_cam) { int num_cam_types = ref_to_cam.size(); std::vector<double> ref_to_cam_vec(num_cam_types * rig::NUM_RIGID_PARAMS); for (int cam_type = 0; cam_type < num_cam_types; cam_type++) rig::rigid_transform_to_array (ref_to_cam[cam_type], &ref_to_cam_vec[rig::NUM_RIGID_PARAMS * cam_type]); int num_ref_cams = world_to_ref.size(); if (world_to_ref.size() != ref_timestamps.size()) LOG(FATAL) << "Must have as many ref cam timestamps as ref cameras.\n"; std::vector<double> world_to_ref_vec(num_ref_cams * rig::NUM_RIGID_PARAMS); for (int cid = 0; cid < num_ref_cams; cid++) rig::rigid_transform_to_array(world_to_ref[cid], &world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]); calcWorldToCamWithRig(// Inputs have_rig, cams, world_to_ref_vec, ref_timestamps, ref_to_cam_vec, ref_to_cam_timestamp_offsets, // Output world_to_cam); } // Calculate world_to_cam transforms from their representation in a // vector, rather than using reference cameras, extrinsics and // timestamp interpolation. Only for use with --no_rig, when // each camera varies independently. void calcWorldToCamNoRig(// Inputs std::vector<rig::cameraImage> const& cams, std::vector<double> const& world_to_cam_vec, // Output std::vector<Eigen::Affine3d>& world_to_cam) { if (world_to_cam_vec.size() != cams.size() * rig::NUM_RIGID_PARAMS) LOG(FATAL) << "Incorrect size for world_to_cam_vec.\n"; for (size_t cid = 0; cid < cams.size(); cid++) rig::array_to_rigid_transform(world_to_cam[cid], // output &world_to_cam_vec[rig::NUM_RIGID_PARAMS * cid]); } // Use one of the two implementations above. Care is needed as when // there are no extrinsics, each camera is on its own, so the input is // in world_to_cam_vec and not in world_to_ref_vec void calcWorldToCam(// Inputs bool no_rig, std::vector<rig::cameraImage> const& cams, std::vector<double> const& world_to_ref_vec, std::vector<double> const& ref_timestamps, std::vector<double> const& ref_to_cam_vec, std::vector<double> const& world_to_cam_vec, std::vector<double> const& ref_to_cam_timestamp_offsets, // Output std::vector<Eigen::Affine3d>& world_to_cam) { if (!no_rig) calcWorldToCamWithRig(// Inputs !no_rig, cams, world_to_ref_vec, ref_timestamps, ref_to_cam_vec, ref_to_cam_timestamp_offsets, // Output world_to_cam); else calcWorldToCamNoRig(// Inputs cams, world_to_cam_vec, // Output world_to_cam); return; } // Extract a affine transform to an array of length NUM_AFFINE_PARAMS void affine_transform_to_array(Eigen::Affine3d const& aff, double* arr) { Eigen::MatrixXd M = aff.matrix(); int count = 0; // The 4th row always has 0, 0, 0, 1 for (int row = 0; row < 3; row++) { for (int col = 0; col < 4; col++) { arr[count] = M(row, col); count++; } } } // Convert an array of length NUM_AFFINE_PARAMS to a affine // transform. Normalize the quaternion to make it into a rotation. void array_to_affine_transform(Eigen::Affine3d& aff, const double* arr) { Eigen::MatrixXd M = Eigen::Matrix<double, 4, 4>::Identity(); int count = 0; // The 4th row always has 0, 0, 0, 1 for (int row = 0; row < 3; row++) { for (int col = 0; col < 4; col++) { M(row, col) = arr[count]; count++; } } aff.matrix() = M; } // Find the median of some matrices, by finding the median for each entry Eigen::MatrixXd median_matrix(std::vector<Eigen::MatrixXd> const& transforms) { // Sanity checks if (transforms.empty()) LOG(FATAL) << "Cannot find the median of an empty set of matrices.\n"; for (size_t cam_it = 0; cam_it < transforms.size(); cam_it++) { if (transforms[cam_it].rows() != 4 || transforms[cam_it].cols() != 4) LOG(FATAL) << "Expecting square matrices of size 4 in the median computation.\n"; } Eigen::MatrixXd median_trans = Eigen::MatrixXd::Zero(4, 4); for (int col = 0; col < 4; col++) { for (int row = 0; row < 4; row++) { std::vector<double> vals; for (size_t cam_it = 0; cam_it < transforms.size(); cam_it++) vals.push_back(transforms[cam_it](col, row)); median_trans(col, row) = vals[vals.size()/2]; } } return median_trans; } // Given the transforms from each camera to the world and their timestamps, // find an initial guess for the relationship among the sensors on the rig. // Note that strictly speaking the transforms in world_to_ref_vec are among // those in world_to_cam, but we don't have a way of looking them up in that // vector. void calc_rig_trans(std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_ref, std::vector<Eigen::Affine3d> const& world_to_cam, std::vector<double> const& ref_timestamps, rig::RigSet & R) { // update this // Sanity check if (cams.size() != world_to_cam.size()) LOG(FATAL) << "There must be as many world to cam transforms as metadata sets for them.\n"; int num_ref_cams = world_to_ref.size(); if (world_to_ref.size() != ref_timestamps.size()) LOG(FATAL) << "Must have as many ref cam timestamps as ref cameras.\n"; std::vector<double> world_to_ref_vec(num_ref_cams * rig::NUM_RIGID_PARAMS); for (int cid = 0; cid < num_ref_cams; cid++) rig::rigid_transform_to_array(world_to_ref[cid], &world_to_ref_vec[rig::NUM_RIGID_PARAMS * cid]); // Resize the output int num_cam_types = R.cam_names.size(); R.ref_to_cam_trans.resize(num_cam_types); // Calc all transforms std::map<int, std::vector<Eigen::MatrixXd>> transforms_map; for (size_t cam_it = 0; cam_it < cams.size(); cam_it++) { int beg_index = cams[cam_it].beg_ref_index; int end_index = cams[cam_it].end_ref_index; int cam_type = cams[cam_it].camera_type; if (R.isRefSensor(R.cam_names[cam_type])) { // The identity transform, from the ref sensor to itself transforms_map[cam_type].push_back(Eigen::MatrixXd::Identity(4, 4)); } else { // We have world_to_ref transform at times bracketing current time, // and world_to_cam at current time. Interp world_to_ref // at current time, then find ref_to_cam. Eigen::Affine3d interp_world_to_ref_aff = rig::calc_interp_world_to_ref (&world_to_ref_vec[rig::NUM_RIGID_PARAMS * beg_index], &world_to_ref_vec[rig::NUM_RIGID_PARAMS * end_index], ref_timestamps[beg_index], ref_timestamps[end_index], R.ref_to_cam_timestamp_offsets[cam_type], cams[cam_it].timestamp); Eigen::Affine3d ref_to_cam_aff = world_to_cam[cam_it] * (interp_world_to_ref_aff.inverse()); transforms_map[cam_type].push_back(ref_to_cam_aff.matrix()); } } // Find median, for robustness for (auto it = transforms_map.begin(); it != transforms_map.end(); it++) { int cam_type = it->first; auto & transforms = it->second; if (transforms.empty()) LOG(FATAL) << "No poses were found for rig sensor with id: " << cam_type << "\n"; Eigen::MatrixXd median_trans = median_matrix(transforms); R.ref_to_cam_trans[cam_type].matrix() = median_trans; R.ref_to_cam_trans[cam_type].linear() /= pow(R.ref_to_cam_trans[cam_type].linear().determinant(), 1.0 / 3.0); } return; } // Extract a rigid transform to an array of length NUM_RIGID_PARAMS void rigid_transform_to_array(Eigen::Affine3d const& aff, double* arr) { for (size_t it = 0; it < 3; it++) arr[it] = aff.translation()[it]; Eigen::Quaterniond R(aff.linear()); arr[3] = R.x(); arr[4] = R.y(); arr[5] = R.z(); arr[6] = R.w(); } // Convert an array of length NUM_RIGID_PARAMS to a rigid // transform. Normalize the quaternion to make it into a rotation. void array_to_rigid_transform(Eigen::Affine3d& aff, const double* arr) { for (size_t it = 0; it < 3; it++) aff.translation()[it] = arr[it]; Eigen::Quaterniond R(arr[6], arr[3], arr[4], arr[5]); R.normalize(); aff = Eigen::Affine3d(Eigen::Translation3d(arr[0], arr[1], arr[2])) * Eigen::Affine3d(R); } // A function to compute the camera position in world coordinates given // the world_to_cam array Eigen::Vector3d calc_cam_position(double const* world_to_cam) { Eigen::Affine3d world_to_cam_aff; array_to_rigid_transform(world_to_cam_aff, world_to_cam); Eigen::Vector3d t(world_to_cam_aff.translation()); Eigen::Vector3d camera_center = -world_to_cam_aff.rotation().inverse() * t; return camera_center; } // Compute the n-weight slerp, analogous to the linear combination // W[0]*Q[0] + ... + W[n-1]*Q[n-1]. This is experimental. // We assume the sum of weights is 1. // TODO(oalexan1): Move this to transform_utils.cc. Eigen::Quaternion<double> slerp_n(std::vector<double> const& W, std::vector<Eigen::Quaternion<double>> const& Q) { if (W.size() != Q.size()) LOG(FATAL) << "Expecting as many quaternions as weights."; if (Q.empty()) LOG(FATAL) << "Expecting at least one quaternion and weight."; if (Q.size() == 1) return Q[0]; if (Q.size() == 2) { if (!(std::abs(W[0] + W[1] - 1.0) < 1e-6 && W[0] >= 0 && W[1] >= 0)) LOG(FATAL) << "Expecting the weights to be >= 0 and sum up to 1."; return Q[0].slerp(W[1], Q[1]); } // Call recursively this function with fewer terms double sum = W[0] + W[1]; if (sum == 0) sum = 1.0; Eigen::Quaternion<double> q = Q[0].slerp(W[1]/sum, Q[1]); std::vector<double> W2 = W; std::vector<Eigen::Quaternion<double>> Q2 = Q; W2.erase(W2.begin()); Q2.erase(Q2.begin()); W2[0] = sum; Q2[0] = q; return slerp_n(W2, Q2); } // Given two sets of 3D points, find the rotation + translation + scale // which best maps the first set to the second. // Source: http://en.wikipedia.org/wiki/Kabsch_algorithm // TODO(oalexan1): Use the version robust to outliers! void Find3DAffineTransform(Eigen::Matrix3Xd const & in, Eigen::Matrix3Xd const & out, Eigen::Affine3d* result) { // Default output result->linear() = Eigen::Matrix3d::Identity(3, 3); result->translation() = Eigen::Vector3d::Zero(); if (in.cols() != out.cols()) LOG(FATAL) << "Find3DAffineTransform(): input data mis-match."; // Local copies we can modify Eigen::Matrix3Xd local_in = in, local_out = out; // First find the scale, by finding the ratio of sums of some distances, // then bring the datasets to the same scale. double dist_in = 0, dist_out = 0; for (int col = 0; col < local_in.cols()-1; col++) { dist_in += (local_in.col(col+1) - local_in.col(col)).norm(); dist_out += (local_out.col(col+1) - local_out.col(col)).norm(); } if (dist_in <= 0 || dist_out <= 0) return; double scale = dist_out/dist_in; local_out /= scale; // Find the centroids then shift to the origin Eigen::Vector3d in_ctr = Eigen::Vector3d::Zero(); Eigen::Vector3d out_ctr = Eigen::Vector3d::Zero(); for (int col = 0; col < local_in.cols(); col++) { in_ctr += local_in.col(col); out_ctr += local_out.col(col); } in_ctr /= local_in.cols(); out_ctr /= local_out.cols(); for (int col = 0; col < local_in.cols(); col++) { local_in.col(col) -= in_ctr; local_out.col(col) -= out_ctr; } // SVD Eigen::Matrix3d Cov = local_in * local_out.transpose(); Eigen::JacobiSVD<Eigen::Matrix3d> svd(Cov, Eigen::ComputeFullU | Eigen::ComputeFullV); // Find the rotation double d = (svd.matrixV() * svd.matrixU().transpose()).determinant(); if (d > 0) d = 1.0; else d = -1.0; Eigen::Matrix3d I = Eigen::Matrix3d::Identity(3, 3); I(2, 2) = d; Eigen::Matrix3d R = svd.matrixV() * I * svd.matrixU().transpose(); // The final transform result->linear() = scale * R; result->translation() = scale*(out_ctr - R*in_ctr); } // Apply a given transform to the given set of cameras. // We assume that the transform is of the form // T(x) = scale * rotation * x + translation void TransformCameras(Eigen::Affine3d const& T, std::vector<Eigen::Affine3d> &world_to_cam) { // Inverse of rotation component double scale = pow(T.linear().determinant(), 1.0 / 3.0); Eigen::MatrixXd Tinv = (T.linear()/scale).inverse(); for (size_t cid = 0; cid < world_to_cam.size(); cid++) { world_to_cam[cid].linear() = world_to_cam[cid].linear()*Tinv; world_to_cam[cid].translation() = scale*world_to_cam[cid].translation() - world_to_cam[cid].linear()*T.translation(); } } // Apply same transform as above to points void TransformPoints(Eigen::Affine3d const& T, std::vector<Eigen::Vector3d> *xyz) { for (size_t pid = 0; pid < (*xyz).size(); pid++) (*xyz)[pid] = T * (*xyz)[pid]; } // Apply a given transform to the specified xyz points, and adjust accordingly the cameras // for consistency. We assume that the transform is of the form // A(x) = scale * rotation * x + translation void TransformCamerasAndPoints(Eigen::Affine3d const& A, std::vector<Eigen::Affine3d> *cid_to_cam_t, std::vector<Eigen::Vector3d> *xyz) { TransformCameras(A, *cid_to_cam_t); TransformPoints(A, xyz); } // Apply a registration transform to a rig. The only thing that // changes is scale, as the rig transforms are between coordinate // systems of various cameras. void TransformRig(Eigen::Affine3d const& T, std::vector<Eigen::Affine3d> & ref_to_cam_trans) { double scale = pow(T.linear().determinant(), 1.0 / 3.0); for (size_t cam_type = 0; cam_type < ref_to_cam_trans.size(); cam_type++) ref_to_cam_trans[cam_type].translation() *= scale; } // Find the name of the camera type of the images used in registration. // The registration images must all be acquired with the same sensor. std::string registrationCamName(std::string const& hugin_file, std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const & cams) { std::vector<std::string> images; Eigen::MatrixXd user_ip; Eigen::MatrixXd user_xyz; ParseHuginControlPoints(hugin_file, &images, &user_ip); // Must create a map from the image name in cams to sensor type std::map<std::string, int> image_to_cam_type; for (size_t cid = 0; cid < cams.size(); cid++) image_to_cam_type[cams[cid].image_name] = cams[cid].camera_type; std::set<std::string> sensors; for (size_t cid = 0; cid < images.size(); cid++) { // Find the image in the map auto it = image_to_cam_type.find(images[cid]); if (it == image_to_cam_type.end()) LOG(FATAL) << "Cannot find image: " << images[cid] << " from the Hugin file having control points in the input SfM map.\n"; sensors.insert(cam_names.at(it->second)); } if (sensors.size() != 1) LOG(FATAL) << "All images used in registration must be for the same sensor. " << "Check the registration file: " << hugin_file << ".\n"; return *sensors.begin(); } // Find the 3D transform from an abstract coordinate system to the // world, given control points (pixel matches) and corresponding 3D // measurements. It is assumed all images are acquired with the same camera. Eigen::Affine3d registrationTransform(std::string const& hugin_file, std::string const& xyz_file, rig::CameraParameters const& cam_params, std::vector<std::string> const& cid_to_filename, std::vector<Eigen::Affine3d> const& world_to_cam_trans) { // Get the interest points in the images, and their positions in // the world coordinate system, as supplied by a user. // Parse and concatenate that information from multiple files. std::vector<std::string> images; Eigen::MatrixXd user_ip; Eigen::MatrixXd user_xyz; ParseHuginControlPoints(hugin_file, &images, &user_ip); ParseXYZ(xyz_file, &user_xyz); int num_points = user_ip.cols(); if (num_points != user_xyz.cols()) LOG(FATAL) << "Could not parse an equal number of control " << "points and xyz coordinates. Their numbers are " << num_points << " vs " << user_xyz.cols() << ".\n"; std::map<std::string, int> filename_to_cid; for (size_t cid = 0; cid < cid_to_filename.size(); cid++) filename_to_cid[cid_to_filename[cid]] = cid; // Wipe images that are missing from the map std::map<int, int> cid2cid; int good_cid = 0; for (size_t cid = 0; cid < images.size(); cid++) { std::string image = images[cid]; if (filename_to_cid.find(image) == filename_to_cid.end()) { LOG(WARNING) << "Will ignore image missing from map: " << image; continue; } cid2cid[cid] = good_cid; images[good_cid] = images[cid]; good_cid++; } images.resize(good_cid); // Remove points corresponding to images missing from map int good_pid = 0; for (int pid = 0; pid < num_points; pid++) { int id1 = user_ip(0, pid); int id2 = user_ip(1, pid); if (cid2cid.find(id1) == cid2cid.end() || cid2cid.find(id2) == cid2cid.end()) { continue; } user_ip.col(good_pid) = user_ip.col(pid); user_xyz.col(good_pid) = user_xyz.col(pid); good_pid++; } user_ip.conservativeResize(Eigen::NoChange_t(), good_pid); user_xyz.conservativeResize(Eigen::NoChange_t(), good_pid); num_points = good_pid; for (int pid = 0; pid < num_points; pid++) { int id1 = user_ip(0, pid); int id2 = user_ip(1, pid); if (cid2cid.find(id1) == cid2cid.end() || cid2cid.find(id2) == cid2cid.end()) LOG(FATAL) << "Book-keeping failure in registration."; user_ip(0, pid) = cid2cid[id1]; user_ip(1, pid) = cid2cid[id2]; } if (num_points < 3) LOG(FATAL) << "Must have at least 3 points to apply registration. Got: " << num_points << "\n"; // Iterate over the control points in the hugin file. Copy the // control points to the list of user keypoints, and create the // corresponding user_pid_to_cid_fid. rig::CidToKeypointMatVec user_cid_to_keypoint_map; std::vector<std::map<int, int> > user_pid_to_cid_fid; user_cid_to_keypoint_map.resize(cid_to_filename.size()); user_pid_to_cid_fid.resize(num_points); for (int pid = 0; pid < num_points; pid++) { // Left and right image indices int id1 = user_ip(0, pid); int id2 = user_ip(1, pid); // Sanity check if (id1 < 0 || id2 < 0 || id1 >= static_cast<int>(images.size()) || id2 >= static_cast<int>(images.size())) LOG(FATAL) << "Invalid image indices in the hugin file: " << id1 << ' ' << id2; // Find the corresponding indices in the map where these keypoints will go to if (filename_to_cid.find(images[id1]) == filename_to_cid.end()) LOG(FATAL) << "File missing from map: " << images[id1]; if (filename_to_cid.find(images[id2]) == filename_to_cid.end()) LOG(FATAL) << "File missing from map: " << images[id2]; int cid1 = filename_to_cid[images[id1]]; int cid2 = filename_to_cid[images[id2]]; // Append to the keypoints for cid1 Eigen::Matrix<double, 2, -1> &M1 = user_cid_to_keypoint_map[cid1]; // alias Eigen::Matrix<double, 2, -1> N1(M1.rows(), M1.cols()+1); N1 << M1, user_ip.block(2, pid, 2, 1); // left image pixel x and pixel y M1.swap(N1); // Append to the keypoints for cid2 Eigen::Matrix<double, 2, -1> &M2 = user_cid_to_keypoint_map[cid2]; // alias Eigen::Matrix<double, 2, -1> N2(M2.rows(), M2.cols()+1); N2 << M2, user_ip.block(4, pid, 2, 1); // right image pixel x and pixel y M2.swap(N2); // The corresponding user_pid_to_cid_fid user_pid_to_cid_fid[pid][cid1] = user_cid_to_keypoint_map[cid1].cols()-1; user_pid_to_cid_fid[pid][cid2] = user_cid_to_keypoint_map[cid2].cols()-1; } // Apply undistortion Eigen::Vector2d output; for (size_t cid = 0; cid < user_cid_to_keypoint_map.size(); cid++) { for (int i = 0; i < user_cid_to_keypoint_map[cid].cols(); i++) { cam_params.Convert<rig::DISTORTED, rig::UNDISTORTED_C> (user_cid_to_keypoint_map[cid].col(i), &output); user_cid_to_keypoint_map[cid].col(i) = output; } } // Triangulate to find the coordinates of the current points // in the virtual coordinate system std::vector<Eigen::Vector3d> unreg_pid_to_xyz; bool rm_invalid_xyz = false; // there should be nothing to remove hopefully rig::Triangulate(rm_invalid_xyz, cam_params.GetFocalLength(), world_to_cam_trans, user_cid_to_keypoint_map, &user_pid_to_cid_fid, &unreg_pid_to_xyz); double mean_err = 0; for (int i = 0; i < user_xyz.cols(); i++) { Eigen::Vector3d a = unreg_pid_to_xyz[i]; Eigen::Vector3d b = user_xyz.col(i); mean_err += (a-b).norm(); } mean_err /= user_xyz.cols(); std::cout << "Mean absolute error before registration: " << mean_err << " meters" << std::endl; std::cout << "Un-transformed computed xyz -- measured xyz -- error diff -- error norm (meters)" << std::endl; for (int i = 0; i < user_xyz.cols(); i++) { Eigen::Vector3d a = unreg_pid_to_xyz[i]; Eigen::Vector3d b = user_xyz.col(i); std::cout << print_vec(a) << " -- " << print_vec(b) << " -- " << print_vec(a-b) << " -- " << print_vec((a - b).norm()) << std::endl; } // Find the transform from the computed map coordinate system // to the world coordinate system. int np = unreg_pid_to_xyz.size(); Eigen::Matrix3Xd in(3, np); for (int i = 0; i < np; i++) in.col(i) = unreg_pid_to_xyz[i]; Eigen::Affine3d registration_trans; Find3DAffineTransform(in, user_xyz, ®istration_trans); mean_err = 0.0; for (int i = 0; i < user_xyz.cols(); i++) mean_err += (registration_trans*in.col(i) - user_xyz.col(i)).norm(); mean_err /= user_xyz.cols(); // Print some info to stdout. If moving this to vw_out(), test if it plays well // with Eigen data, or if custom formatting is needed. double scale = pow(registration_trans.linear().determinant(), 1.0 / 3.0); std::cout << "Registration transform (to measured world coordinates)." << std::endl; std::cout << "Rotation:\n" << registration_trans.linear() / scale << std::endl; std::cout << "Scale:\n" << scale << std::endl; std::cout << "Translation:\n" << registration_trans.translation().transpose() << std::endl; std::cout << "Mean absolute error after registration: " << mean_err << " meters" << std::endl; std::cout << "Transformed computed xyz -- measured xyz -- " << "error diff - error norm (meters)" << std::endl; for (int i = 0; i < user_xyz.cols(); i++) { Eigen::Vector3d a = registration_trans*in.col(i); Eigen::Vector3d b = user_xyz.col(i); int id1 = user_ip(0, i); int id2 = user_ip(1, i); std::cout << print_vec(a) << " -- " << print_vec(b) << " -- " << print_vec(a - b) << " -- " << print_vec((a - b).norm()) << " -- " << images[id1] << ' ' << images[id2] << std::endl; } return registration_trans; } // Apply a transform to inlier triangulated points void transformInlierTriPoints(// Inputs Eigen::Affine3d const& trans, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, std::vector<Eigen::Vector3d> & xyz_vec) { // output if (pid_to_cid_fid.size() != pid_cid_fid_inlier.size()) LOG(FATAL) << "Expecting as many inlier flags as there are tracks.\n"; if (pid_to_cid_fid.size() != xyz_vec.size()) LOG(FATAL) << "Expecting as many tracks as there are triangulated points.\n"; for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { bool isInlierXyz = false; for (auto cid_fid1 = pid_to_cid_fid[pid].begin(); cid_fid1 != pid_to_cid_fid[pid].end(); cid_fid1++) { int cid1 = cid_fid1->first; int fid1 = cid_fid1->second; // Deal with inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid1, fid1)) continue; isInlierXyz = true; break; } if (isInlierXyz) xyz_vec[pid] = trans * xyz_vec[pid]; } return; } // TODO(oalexan1): Test this with multiple rigs. It should work. // TODO(oalexan1): Need to fix ref_cam_type. // Apply registration to each camera, rig (if present), and depth-to-image, if desired void applyRegistration(bool no_rig, bool scale_depth, std::string const & hugin_file, std::string const & xyz_file, std::vector<bool> const & has_depth, std::vector<rig::cameraImage> const & cams, // Outputs Eigen::Affine3d & registration_trans, std::vector<Eigen::Affine3d> & world_to_ref, std::vector<Eigen::Affine3d> & world_to_cam, rig::RigSet & R) { if (R.cam_params.size() != has_depth.size()) LOG(FATAL) << "Number of camera types must equal the number of depth flags."; // All cameras used in registration must be from the same sensor. // That is enforced in registrationCamName(). std::string reg_cam_name = rig::registrationCamName(hugin_file, R.cam_names, cams); int reg_cam_index = R.sensorIndex(reg_cam_name); // Find the image files. These are one-to-one with world_to_cam. std::vector<std::string> image_files; for (size_t cid = 0; cid < cams.size(); cid++) image_files.push_back(cams[cid].image_name); // Find the registration transform. // TODO(oalexan1): Pass to this the whole set of cameras and camera // params, as it need not be the first rig images that are used. registration_trans = rig::registrationTransform(hugin_file, xyz_file, R.cam_params[reg_cam_index], image_files, world_to_cam); // Apply the transform to world_to_ref and world_to_cam rig::TransformCameras(registration_trans, world_to_ref); rig::TransformCameras(registration_trans, world_to_cam); // Transform the rig if (!no_rig) rig::TransformRig(registration_trans, R.ref_to_cam_trans); // Transform the depth-to-image transforms, if desired if (scale_depth) { double scale = pow(registration_trans.linear().determinant(), 1.0 / 3.0); int num_cam_types = R.cam_params.size(); for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { if (has_depth[cam_type]) { R.depth_to_image[cam_type].linear() *= scale; R.depth_to_image[cam_type].translation() *= scale; } } } return; } } // end namespace rig ================================================ FILE: src/asp/Rig/TransformUtils.h ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #ifndef TRANSFORM_UTILS_H_ #define TRANSFORM_UTILS_H_ #include <asp/Rig/RigTypeDefs.h> #include <vector> #include <string> #include <map> #include <Eigen/Core> #include <Eigen/Geometry> namespace rig { class CameraParameters; } namespace rig { const int NUM_SCALAR_PARAMS = 1; // Used to float single-value params // NOLINT const int NUM_OPT_CTR_PARAMS = 2; // optical center in x and y // NOLINT const int NUM_PIX_PARAMS = 2; // NOLINT const int NUM_XYZ_PARAMS = 3; // NOLINT const int NUM_RIGID_PARAMS = 7; // quaternion (4) + translation (3) // NOLINT const int NUM_AFFINE_PARAMS = 12; // 3x3 matrix (9) + translation (3) // NOLINT class cameraImage; class RigSet; // Save an affine transform represented as a matrix to a string. std::string affineToStr(Eigen::Affine3d const& M); // Form an affine transform from 12 values Eigen::Affine3d vecToAffine(Eigen::VectorXd const& vals); // Calculate interpolated world to reference sensor transform. Take into account // that the timestamp is for a sensor which may not be the reference one, so // an offset needs to be applied. If beg_ref_stamp equals end_ref_stamp, // end_world_to_ref_t is ignored. Eigen::Affine3d calc_interp_world_to_ref(const double* beg_world_to_ref_t, const double* end_world_to_ref_t, double beg_ref_stamp, double end_ref_stamp, double ref_to_cam_offset, double cam_stamp); // Calculate interpolated world to camera transform. Use the // convention that if beg_ref_stamp == end_ref_stamp only // beg_world_to_ref_t is used, while end_world_to_ref_t is // ignored. For the reference camera it is also expected that // ref_to_cam_aff is the identity. This saves some code duplication // later as the ref cam need not be treated separately. Eigen::Affine3d calcWorldToCamBase(const double* beg_world_to_ref_t, const double* end_world_to_ref_t, const double* ref_to_cam_trans, double beg_ref_stamp, double end_ref_stamp, double ref_to_cam_offset, double cam_stamp); // Find the median of some matrices, by finding the median for each entry Eigen::MatrixXd median_matrix(std::vector<Eigen::MatrixXd> const& transforms); // Given the transforms from each camera to the world and their timestamps, // find an initial guess for the relationship among the sensors on the rig. // Note that strictly speaking the transforms in world_to_ref_vec are among // those in world_to_cam, but we don't have a way of looking them up in that // vector. void calc_rig_trans(std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_ref, std::vector<Eigen::Affine3d> const& world_to_cam, std::vector<double> const& ref_timestamps, rig::RigSet & R); // update this // Compute the transforms from the world to every camera, based on the rig transforms. void calcWorldToCamWithRig(// Inputs bool have_rig, std::vector<rig::cameraImage> const& cams, std::vector<double> const& world_to_ref_vec, std::vector<double> const& ref_timestamps, std::vector<double> const& ref_to_cam_vec, std::vector<double> const& ref_to_cam_timestamp_offsets, // Output std::vector<Eigen::Affine3d>& world_to_cam); // A version of the above with the data stored differently void calcWorldToCamWithRig(// Inputs bool have_rig, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_ref, std::vector<double> const& ref_timestamps, std::vector<Eigen::Affine3d> const& ref_to_cam, std::vector<double> const& ref_to_cam_timestamp_offsets, // Output std::vector<Eigen::Affine3d>& world_to_cam); void calcWorldToCamNoRig(// Inputs std::vector<rig::cameraImage> const& cams, std::vector<double> const& world_to_cam_vec, // Output std::vector<Eigen::Affine3d>& world_to_cam); void calcWorldToCam(// Inputs bool no_rig, std::vector<rig::cameraImage> const& cams, std::vector<double> const& world_to_ref_vec, std::vector<double> const& ref_timestamps, std::vector<double> const& ref_to_cam_vec, std::vector<double> const& world_to_cam_vec, std::vector<double> const& ref_to_cam_timestamp_offsets, // Output std::vector<Eigen::Affine3d>& world_to_cam); void affine_transform_to_array(Eigen::Affine3d const& aff, double* arr); void array_to_affine_transform(Eigen::Affine3d& aff, const double* arr); // Extract a rigid transform to an array of length NUM_RIGID_PARAMS void rigid_transform_to_array(Eigen::Affine3d const& aff, double* arr); // Convert an array of length NUM_RIGID_PARAMS to a rigid // transform. Normalize the quaternion to make it into a rotation. void array_to_rigid_transform(Eigen::Affine3d& aff, const double* arr); // A function to compute the camera position in world coordinates given // the world_to_cam array Eigen::Vector3d calc_cam_position(double const* world_to_cam); // Compute the n-weight slerp, analogous to the linear combination // W[0]*Q[0] + ... + W[n-1]*Q[n-1]. This is experimental. // We assume the sum of weights is 1. // TODO(oalexan1): Move this to transform_utils.cc. Eigen::Quaternion<double> slerp_n(std::vector<double> const& W, std::vector<Eigen::Quaternion<double>> const& Q); // Given two sets of 3D points, find the rotation + translation + scale // which best maps the first set to the second. // Source: http://en.wikipedia.org/wiki/Kabsch_algorithm // TODO(oalexan1): Use the version robust to outliers! void Find3DAffineTransform(Eigen::Matrix3Xd const & in, Eigen::Matrix3Xd const & out, Eigen::Affine3d* result); // Extract control points and the images they correspond 2 from // a hugin project file void ParseHuginControlPoints(std::string const& hugin_file, std::vector<std::string> * images, Eigen::MatrixXd * points); // Parse a file having on each line xyz coordinates void ParseXYZ(std::string const& xyz_file, Eigen::MatrixXd * xyz); // Apply a given transform to the given set of cameras. // We assume that the transform is of the form // T(x) = scale * rotation * x + translation void TransformCameras(Eigen::Affine3d const& T, std::vector<Eigen::Affine3d> &world_to_cam); // Apply same transform as above to points void TransformPoints(Eigen::Affine3d const& T, std::vector<Eigen::Vector3d> *xyz); // Apply a given transform to the specified xyz points, and adjust accordingly the cameras // for consistency. We assume that the transform is of the form // A(x) = scale * rotation * x + translation void TransformCamerasAndPoints(Eigen::Affine3d const& A, std::vector<Eigen::Affine3d> *cid_to_cam_t, std::vector<Eigen::Vector3d> *xyz); // Apply a registration transform to a rig. The only thing that // changes is scale, as the rig transforms are between coordinate // systems of various cameras. void TransformRig(Eigen::Affine3d const& T, std::vector<Eigen::Affine3d> & ref_to_cam_trans); // Find the name of the camera of the images used in registration. // The registration images must all be acquired with the same sensor. std::string registrationCamName(std::string const& hugin_file, std::vector<std::string> const& cam_names, std::vector<rig::cameraImage> const & cams); // Find the 3D transform from an abstract coordinate system to the world, given // control points (pixel matches) and corresponding 3D measurements. It is // assumed all images are acquired with the same camera. Eigen::Affine3d registrationTransform(std::string const& hugin_file, std::string const& xyz_file, rig::CameraParameters const& cam_params, std::vector<std::string> const& cid_to_filename, std::vector<Eigen::Affine3d> const& world_to_cam_trans); // Apply a transform to inlier triangulated points void transformInlierTriPoints(// Inputs Eigen::Affine3d const& trans, rig::PidCidFid const& pid_to_cid_fid, PidCidFidMap const& pid_cid_fid_inlier, std::vector<Eigen::Vector3d> & xyz_vec); // output // TODO(oalexan1): Test this with multiple rigs. It should work. // TODO(oalexan1): Need to fix ref_cam_type. // Apply registration to each camera, rig (if present), and depth-to-image, if desired void applyRegistration(bool no_rig, bool scale_depth, std::string const & hugin_file, std::string const & xyz_file, std::vector<bool> const & has_depth, std::vector<rig::cameraImage> const & cams, // Outputs Eigen::Affine3d & registration_trans, std::vector<Eigen::Affine3d> & world_to_ref, std::vector<Eigen::Affine3d> & world_to_cam, rig::RigSet & R); } // end namespace rig #endif // TRANSFORM_UTILS_H_ ================================================ FILE: src/asp/Rig/Triangulation.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Rig/Triangulation.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/RigCameraParams.h> #include <asp/OpenMVG/projection.hpp> #include <asp/OpenMVG/triangulation_nview.hpp> namespace rig { void Triangulate(bool rm_invalid_xyz, double focal_length, std::vector<Eigen::Affine3d> const& world_to_cam, rig::CidToKeypointMatVec const& cid_to_keypoint_map, rig::PidCidFid * pid_to_cid_fid, std::vector<Eigen::Vector3d> * pid_to_xyz) { Eigen::Matrix3d k; k << focal_length, 0, 0, 0, focal_length, 0, 0, 0, 1; // Build p matrices for all of the cameras. aspOpenMVG::Triangulation // will be holding pointers to all of the cameras. std::vector<aspOpenMVG::Mat34> cid_to_p(world_to_cam.size()); for (size_t cid = 0; cid < cid_to_p.size(); cid++) { aspOpenMVG::P_From_KRt(k, world_to_cam[cid].linear(), world_to_cam[cid].translation(), &cid_to_p[cid]); } pid_to_xyz->resize(pid_to_cid_fid->size()); for (int pid = pid_to_cid_fid->size() - 1; pid >= 0; pid--) { aspOpenMVG::Triangulation tri; for (std::pair<int, int> const& cid_fid : pid_to_cid_fid->at(pid)) { tri.add(cid_to_p[cid_fid.first], // they're holding a pointer to this cid_to_keypoint_map[cid_fid.first].col(cid_fid.second)); } Eigen::Vector3d solution = tri.compute(); if (rm_invalid_xyz && (std::isnan(solution[0]) || tri.minDepth() < 0)) { pid_to_xyz->erase(pid_to_xyz->begin() + pid); pid_to_cid_fid->erase(pid_to_cid_fid->begin() + pid); } else { pid_to_xyz->at(pid) = solution; } } } // Triangulate rays emanating from given undistorted and centered pixels Eigen::Vector3d TriangulatePair(double focal_length1, double focal_length2, Eigen::Affine3d const& world_to_cam1, Eigen::Affine3d const& world_to_cam2, Eigen::Vector2d const& pix1, Eigen::Vector2d const& pix2) { Eigen::Matrix3d k1; k1 << focal_length1, 0, 0, 0, focal_length1, 0, 0, 0, 1; Eigen::Matrix3d k2; k2 << focal_length2, 0, 0, 0, focal_length2, 0, 0, 0, 1; aspOpenMVG::Mat34 cid_to_p1, cid_to_p2; aspOpenMVG::P_From_KRt(k1, world_to_cam1.linear(), world_to_cam1.translation(), &cid_to_p1); aspOpenMVG::P_From_KRt(k2, world_to_cam2.linear(), world_to_cam2.translation(), &cid_to_p2); aspOpenMVG::Triangulation tri; tri.add(cid_to_p1, pix1); tri.add(cid_to_p2, pix2); Eigen::Vector3d solution = tri.compute(); return solution; } // Triangulate n rays emanating from given undistorted and centered pixels Eigen::Vector3d Triangulate(std::vector<double> const& focal_length_vec, std::vector<Eigen::Affine3d> const& world_to_cam_vec, std::vector<Eigen::Vector2d> const& pix_vec) { if (focal_length_vec.size() != world_to_cam_vec.size() || focal_length_vec.size() != pix_vec.size()) LOG(FATAL) << "All inputs to Triangulate() must have the same size."; if (focal_length_vec.size() <= 1) LOG(FATAL) << "At least two rays must be passed to Triangulate()."; aspOpenMVG::Triangulation tri; for (size_t it = 0; it < focal_length_vec.size(); it++) { Eigen::Matrix3d k; k << focal_length_vec[it], 0, 0, 0, focal_length_vec[it], 0, 0, 0, 1; aspOpenMVG::Mat34 cid_to_p; aspOpenMVG::P_From_KRt(k, world_to_cam_vec[it].linear(), world_to_cam_vec[it].translation(), &cid_to_p); tri.add(cid_to_p, pix_vec[it]); } Eigen::Vector3d solution = tri.compute(); return solution; } void multiViewTriangulation(// Inputs std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, // Outputs PidCidFidMap & pid_cid_fid_inlier, std::vector<Eigen::Vector3d> & xyz_vec) { if (cams.size() != world_to_cam.size()) LOG(FATAL) << "Expecting as many images as cameras.\n"; xyz_vec.clear(); xyz_vec.resize(pid_to_cid_fid.size()); for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) xyz_vec[pid] = Eigen::Vector3d(0, 0, 0); // initialize to 0 for (size_t pid = 0; pid < pid_to_cid_fid.size(); pid++) { std::vector<double> focal_length_vec; std::vector<Eigen::Affine3d> world_to_cam_aff_vec; std::vector<Eigen::Vector2d> pix_vec; for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; // Triangulate inliers only if (!rig::getMapValue(pid_cid_fid_inlier, pid, cid, fid)) continue; Eigen::Vector2d dist_ip(keypoint_vec[cid][fid].first, keypoint_vec[cid][fid].second); Eigen::Vector2d undist_ip; cam_params[cams[cid].camera_type].Convert<rig::DISTORTED, rig::UNDISTORTED_C> (dist_ip, &undist_ip); focal_length_vec.push_back(cam_params[cams[cid].camera_type].GetFocalLength()); world_to_cam_aff_vec.push_back(world_to_cam[cid]); pix_vec.push_back(undist_ip); } if (pix_vec.size() < 2) { // If after outlier filtering less than two rays are left, can't triangulate. // Must set all features for this pid to outliers. for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0); } // Nothing else to do continue; } // Triangulate n rays emanating from given undistorted and centered pixels xyz_vec[pid] = rig::Triangulate(focal_length_vec, world_to_cam_aff_vec, pix_vec); bool bad_xyz = false; for (int c = 0; c < xyz_vec[pid].size(); c++) { if (std::isinf(xyz_vec[pid][c]) || std::isnan(xyz_vec[pid][c])) bad_xyz = true; } if (bad_xyz) { // if triangulation failed, must set all features for this pid to outliers. for (auto cid_fid = pid_to_cid_fid[pid].begin(); cid_fid != pid_to_cid_fid[pid].end(); cid_fid++) { int cid = cid_fid->first; int fid = cid_fid->second; rig::setMapValue(pid_cid_fid_inlier, pid, cid, fid, 0); } } } // end iterating over triangulated points return; } // A triangulated point that is equal to (0, 0, 0), inf, or NaN, is not good. bool isGoodTri(Eigen::Vector3d const& P) { for (int c = 0; c < P.size(); c++) { if (std::isinf(P[c]) || std::isnan(P[c])) return false; } if (P[0] == 0 && P[1] == 0 && P[2] == 0) return false; return true; } } // end namespace rig ================================================ FILE: src/asp/Rig/Triangulation.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef ASP_RIG_TRIANGULATION_H #define ASP_RIG_TRIANGULATION_H #include <asp/Rig/RigTypeDefs.h> #include <vector> #include <map> #include <Eigen/Core> #include <Eigen/Geometry> #include <asp/Rig/CameraImage.h> #include <asp/Rig/RigCameraParams.h> namespace rig { // Triangulate a 3D point from multiple 2D observations and camera poses. This // version takes a single focal length and a map of camera IDs to keypoints. void Triangulate(bool rm_invalid_xyz, double focal_length, std::vector<Eigen::Affine3d> const& world_to_cam, rig::CidToKeypointMatVec const& cid_to_keypoint_map, rig::PidCidFid * pid_to_cid_fid, std::vector<Eigen::Vector3d> * pid_to_xyz); // Triangulate rays emanating from given undistorted and centered pixels for a // pair of cameras. Eigen::Vector3d TriangulatePair(double focal_length1, double focal_length2, Eigen::Affine3d const& world_to_cam1, Eigen::Affine3d const& world_to_cam2, Eigen::Vector2d const& pix1, Eigen::Vector2d const& pix2); // Triangulate n rays emanating from given undistorted and centered pixels. This // version takes vectors of focal lengths, camera poses, and pixels. Eigen::Vector3d Triangulate(std::vector<double> const& focal_length_vec, std::vector<Eigen::Affine3d> const& world_to_cam_vec, std::vector<Eigen::Vector2d> const& pix_vec); // Perform multi-view triangulation to compute 3D points from 2D keypoints // across multiple cameras. void multiViewTriangulation(std::vector<rig::CameraParameters> const& cam_params, std::vector<rig::cameraImage> const& cams, std::vector<Eigen::Affine3d> const& world_to_cam, rig::PidCidFid const& pid_to_cid_fid, rig::KeypointVec const& keypoint_vec, // Outputs PidCidFidMap & pid_cid_fid_inlier, std::vector<Eigen::Vector3d> & xyz_vec); // A triangulated point that is equal to (0, 0, 0), inf, or NaN, is not good bool isGoodTri(Eigen::Vector3d const& P); } // end namespace rig #endif // ASP_RIG_TRIANGULATION_H ================================================ FILE: src/asp/Rig/happly.h ================================================ #pragma once /* A header-only implementation of the .ply file format. * https://github.com/nmwsharp/happly * By Nicholas Sharp - nsharp@cs.cmu.edu * * Version 2, July 20, 2019 */ /* MIT License Copyright (c) 2018 Nick Sharp Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // clang-format off /* === Changelog === Significant changes to the file recorded here. - Version 5 (Aug 22, 2020) Minor: skip blank lines before properties in ASCII files - Version 4 (Sep 11, 2019) Change internal list format to be flat. Other small perf fixes and cleanup. - Version 3 (Aug 1, 2019) Add support for big endian and obj_info - Version 2 (July 20, 2019) Catch exceptions by const reference. - Version 1 (undated) Initial version. Unnamed changes before version numbering. */ // clang-format on #include <array> #include <cctype> #include <fstream> #include <iostream> #include <limits> #include <memory> #include <sstream> #include <string> #include <type_traits> #include <vector> #include <climits> // General namespace wrapping all Happly things. namespace happly { // Enum specifying binary or ASCII filetypes. Binary can be little-endian // (default) or big endian. enum class DataFormat { ASCII, Binary, BinaryBigEndian }; // Type name strings // clang-format off template <typename T> std::string typeName() { return "unknown"; } template<> inline std::string typeName<int8_t>() { return "char"; } template<> inline std::string typeName<uint8_t>() { return "uchar"; } template<> inline std::string typeName<int16_t>() { return "short"; } template<> inline std::string typeName<uint16_t>() { return "ushort"; } template<> inline std::string typeName<int32_t>() { return "int"; } template<> inline std::string typeName<uint32_t>() { return "uint"; } template<> inline std::string typeName<float>() { return "float"; } template<> inline std::string typeName<double>() { return "double"; } // Template hackery that makes getProperty<T>() and friends pretty while automatically picking up smaller types namespace { // A pointer for the equivalent/smaller equivalent of a type (eg. when a double is requested a float works too, etc) // long int is intentionally absent to avoid platform confusion template <class T> struct TypeChain { bool hasChildType = false; typedef T type; }; template <> struct TypeChain<int64_t> { bool hasChildType = true; typedef int32_t type; }; template <> struct TypeChain<int32_t> { bool hasChildType = true; typedef int16_t type; }; template <> struct TypeChain<int16_t> { bool hasChildType = true; typedef int8_t type; }; template <> struct TypeChain<uint64_t> { bool hasChildType = true; typedef uint32_t type; }; template <> struct TypeChain<uint32_t> { bool hasChildType = true; typedef uint16_t type; }; template <> struct TypeChain<uint16_t> { bool hasChildType = true; typedef uint8_t type; }; template <> struct TypeChain<double> { bool hasChildType = true; typedef float type; }; template <class T> struct CanonicalName { typedef T type; }; template <> struct CanonicalName<char> { typedef int8_t type; }; template <> struct CanonicalName<unsigned char> { typedef uint8_t type; }; template <> struct CanonicalName<size_t> { typedef std::conditional<std::is_same<std::make_signed<size_t>::type, int>::value, uint32_t, uint64_t>::type type; }; // Used to change behavior of >> for 8bit ints, which does not do what we want. template <class T> struct SerializeType { typedef T type; }; template <> struct SerializeType<uint8_t> { typedef int32_t type; }; template <> struct SerializeType< int8_t> { typedef int32_t type; }; // Give address only if types are same (used below when conditionally copying data) // last int/char arg is to resolve ambiguous overloads, just always pass 0 and the int version will be preferred template <typename S, typename T> S* addressIfSame(T&, char) { throw std::runtime_error("tried to take address for types that are not same"); return nullptr;} template <typename S> S* addressIfSame(S& t, int) {return &t;} // clang-format on } // namespace /** * @brief A generic property, which is associated with some element. Can be plain Property or a ListProperty, of some * type. Generally, the user should not need to interact with these directly, but they are exposed in case someone * wants to get clever. */ class Property { public: /** * @brief Create a new Property with the given name. * * @param name_ */ Property(const std::string& name_) : name(name_){}; virtual ~Property(){}; std::string name; /** * @brief Reserve memory. * * @param capacity Expected number of elements. */ virtual void reserve(size_t capacity) = 0; /** * @brief (ASCII reading) Parse out the next value of this property from a list of tokens. * * @param tokens The list of property tokens for the element. * @param currEntry Index in to tokens, updated after this property is read. */ virtual void parseNext(const std::vector<std::string>& tokens, size_t& currEntry) = 0; /** * @brief (binary reading) Copy the next value of this property from a stream of bits. * * @param stream Stream to read from. */ virtual void readNext(std::istream& stream) = 0; /** * @brief (binary reading) Copy the next value of this property from a stream of bits. * * @param stream Stream to read from. */ virtual void readNextBigEndian(std::istream& stream) = 0; /** * @brief (reading) Write a header entry for this property. * * @param outStream Stream to write to. */ virtual void writeHeader(std::ostream& outStream) = 0; /** * @brief (ASCII writing) write this property for some element to a stream in plaintext * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataASCII(std::ostream& outStream, size_t iElement) = 0; /** * @brief (binary writing) copy the bits of this property for some element to a stream * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataBinary(std::ostream& outStream, size_t iElement) = 0; /** * @brief (binary writing) copy the bits of this property for some element to a stream * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataBinaryBigEndian(std::ostream& outStream, size_t iElement) = 0; /** * @brief Number of element entries for this property * * @return */ virtual size_t size() = 0; /** * @brief A string naming the type of the property * * @return */ virtual std::string propertyTypeName() = 0; }; namespace { /** * Check if the platform is little endian. * (not foolproof, but will work on most platforms) * * @return true if little endian */ bool isLittleEndian() { int32_t oneVal = 0x1; char* numPtr = (char*)&oneVal; return (numPtr[0] == 1); } /** * Swap endianness. * * @param value Value to swap. * * @return Swapped value. */ template <typename T> T swapEndian(T val) { char* bytes = reinterpret_cast<char*>(&val); for (unsigned int i = 0; i < sizeof(val) / 2; i++) { std::swap(bytes[sizeof(val) - 1 - i], bytes[i]); } return val; } // Unpack flattened list from the convention used in TypedListProperty template <typename T> std::vector<std::vector<T>> unflattenList(const std::vector<T>& flatList, const std::vector<size_t> flatListStarts) { size_t outerCount = flatListStarts.size() - 1; // Put the output here std::vector<std::vector<T>> outLists(outerCount); if (outerCount == 0) { return outLists; // quick out for empty } // Copy each sublist for (size_t iOuter = 0; iOuter < outerCount; iOuter++) { size_t iFlatStart = flatListStarts[iOuter]; size_t iFlatEnd = flatListStarts[iOuter + 1]; outLists[iOuter].insert(outLists[iOuter].begin(), flatList.begin() + iFlatStart, flatList.begin() + iFlatEnd); } return outLists; } }; // namespace /** * @brief A property which takes a single value (not a list). */ template <class T> class TypedProperty : public Property { public: /** * @brief Create a new Property with the given name. * * @param name_ */ TypedProperty(const std::string& name_) : Property(name_) { if (typeName<T>() == "unknown") { // TODO should really be a compile-time error throw std::runtime_error("Attempted property type does not match any type defined by the .ply format."); } }; /** * @brief Create a new property and initialize with data. * * @param name_ * @param data_ */ TypedProperty(const std::string& name_, const std::vector<T>& data_) : Property(name_), data(data_) { if (typeName<T>() == "unknown") { throw std::runtime_error("Attempted property type does not match any type defined by the .ply format."); } }; virtual ~TypedProperty() override{}; /** * @brief Reserve memory. * * @param capacity Expected number of elements. */ virtual void reserve(size_t capacity) override { data.reserve(capacity); } /** * @brief (ASCII reading) Parse out the next value of this property from a list of tokens. * * @param tokens The list of property tokens for the element. * @param currEntry Index in to tokens, updated after this property is read. */ virtual void parseNext(const std::vector<std::string>& tokens, size_t& currEntry) override { data.emplace_back(); std::istringstream iss(tokens[currEntry]); typename SerializeType<T>::type tmp; // usually the same type as T iss >> tmp; data.back() = tmp; currEntry++; }; /** * @brief (binary reading) Copy the next value of this property from a stream of bits. * * @param stream Stream to read from. */ virtual void readNext(std::istream& stream) override { data.emplace_back(); stream.read((char*)&data.back(), sizeof(T)); } /** * @brief (binary reading) Copy the next value of this property from a stream of bits. * * @param stream Stream to read from. */ virtual void readNextBigEndian(std::istream& stream) override { data.emplace_back(); stream.read((char*)&data.back(), sizeof(T)); data.back() = swapEndian(data.back()); } /** * @brief (reading) Write a header entry for this property. * * @param outStream Stream to write to. */ virtual void writeHeader(std::ostream& outStream) override { outStream << "property " << typeName<T>() << " " << name << "\n"; } /** * @brief (ASCII writing) write this property for some element to a stream in plaintext * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataASCII(std::ostream& outStream, size_t iElement) override { outStream.precision(std::numeric_limits<T>::max_digits10); outStream << static_cast<typename SerializeType<T>::type>(data[iElement]); // case is usually a no-op } /** * @brief (binary writing) copy the bits of this property for some element to a stream * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataBinary(std::ostream& outStream, size_t iElement) override { outStream.write((char*)&data[iElement], sizeof(T)); } /** * @brief (binary writing) copy the bits of this property for some element to a stream * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataBinaryBigEndian(std::ostream& outStream, size_t iElement) override { auto value = swapEndian(data[iElement]); outStream.write((char*)&value, sizeof(T)); } /** * @brief Number of element entries for this property * * @return */ virtual size_t size() override { return data.size(); } /** * @brief A string naming the type of the property * * @return */ virtual std::string propertyTypeName() override { return typeName<T>(); } /** * @brief The actual data contained in the property */ std::vector<T> data; }; /** * @brief A property which is a list of value (eg, 3 doubles). Note that lists are always variable length per-element. */ template <class T> class TypedListProperty : public Property { public: /** * @brief Create a new Property with the given name. * * @param name_ */ TypedListProperty(const std::string& name_, int listCountBytes_) : Property(name_), listCountBytes(listCountBytes_) { if (typeName<T>() == "unknown") { throw std::runtime_error("Attempted property type does not match any type defined by the .ply format."); } flattenedIndexStart.push_back(0); }; /** * @brief Create a new property and initialize with data * * @param name_ * @param data_ */ TypedListProperty(const std::string& name_, const std::vector<std::vector<T>>& data_) : Property(name_) { if (typeName<T>() == "unknown") { throw std::runtime_error("Attempted property type does not match any type defined by the .ply format."); } // Populate list with data flattenedIndexStart.push_back(0); for (const std::vector<T>& vec : data_) { for (const T& val : vec) { flattenedData.emplace_back(val); } flattenedIndexStart.push_back(flattenedData.size()); } }; virtual ~TypedListProperty() override{}; /** * @brief Reserve memory. * * @param capacity Expected number of elements. */ virtual void reserve(size_t capacity) override { flattenedData.reserve(3 * capacity); // optimize for triangle meshes flattenedIndexStart.reserve(capacity + 1); } /** * @brief (ASCII reading) Parse out the next value of this property from a list of tokens. * * @param tokens The list of property tokens for the element. * @param currEntry Index in to tokens, updated after this property is read. */ virtual void parseNext(const std::vector<std::string>& tokens, size_t& currEntry) override { std::istringstream iss(tokens[currEntry]); size_t count; iss >> count; currEntry++; size_t currSize = flattenedData.size(); size_t afterSize = currSize + count; flattenedData.resize(afterSize); for (size_t iFlat = currSize; iFlat < afterSize; iFlat++) { std::istringstream iss(tokens[currEntry]); typename SerializeType<T>::type tmp; // usually the same type as T iss >> tmp; flattenedData[iFlat] = tmp; currEntry++; } flattenedIndexStart.emplace_back(afterSize); } /** * @brief (binary reading) Copy the next value of this property from a stream of bits. * * @param stream Stream to read from. */ virtual void readNext(std::istream& stream) override { // Read the size of the list size_t count = 0; stream.read(((char*)&count), listCountBytes); // Read list elements size_t currSize = flattenedData.size(); size_t afterSize = currSize + count; flattenedData.resize(afterSize); if (count > 0) { stream.read((char*)&flattenedData[currSize], count * sizeof(T)); } flattenedIndexStart.emplace_back(afterSize); } /** * @brief (binary reading) Copy the next value of this property from a stream of bits. * * @param stream Stream to read from. */ virtual void readNextBigEndian(std::istream& stream) override { // Read the size of the list size_t count = 0; stream.read(((char*)&count), listCountBytes); if (listCountBytes == 8) { count = (size_t)swapEndian((uint64_t)count); } else if (listCountBytes == 4) { count = (size_t)swapEndian((uint32_t)count); } else if (listCountBytes == 2) { count = (size_t)swapEndian((uint16_t)count); } // Read list elements size_t currSize = flattenedData.size(); size_t afterSize = currSize + count; flattenedData.resize(afterSize); if (count > 0) { stream.read((char*)&flattenedData[currSize], count * sizeof(T)); } flattenedIndexStart.emplace_back(afterSize); // Swap endian order of list elements for (size_t iFlat = currSize; iFlat < afterSize; iFlat++) { flattenedData[iFlat] = swapEndian(flattenedData[iFlat]); } } /** * @brief (reading) Write a header entry for this property. Note that we already use "uchar" for the list count type. * * @param outStream Stream to write to. */ virtual void writeHeader(std::ostream& outStream) override { // NOTE: We ALWAYS use uchar as the list count output type outStream << "property list uchar " << typeName<T>() << " " << name << "\n"; } /** * @brief (ASCII writing) write this property for some element to a stream in plaintext * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataASCII(std::ostream& outStream, size_t iElement) override { size_t dataStart = flattenedIndexStart[iElement]; size_t dataEnd = flattenedIndexStart[iElement + 1]; // Get the number of list elements as a uchar, and ensure the value fits size_t dataCount = dataEnd - dataStart; if (dataCount > std::numeric_limits<uint8_t>::max()) { throw std::runtime_error( "List property has an element with more entries than fit in a uchar. See note in README."); } outStream << dataCount; outStream.precision(std::numeric_limits<T>::max_digits10); for (size_t iFlat = dataStart; iFlat < dataEnd; iFlat++) { outStream << " " << static_cast<typename SerializeType<T>::type>(flattenedData[iFlat]); // cast is usually a no-op } } /** * @brief (binary writing) copy the bits of this property for some element to a stream * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataBinary(std::ostream& outStream, size_t iElement) override { size_t dataStart = flattenedIndexStart[iElement]; size_t dataEnd = flattenedIndexStart[iElement + 1]; // Get the number of list elements as a uchar, and ensure the value fits size_t dataCount = dataEnd - dataStart; if (dataCount > std::numeric_limits<uint8_t>::max()) { throw std::runtime_error( "List property has an element with more entries than fit in a uchar. See note in README."); } uint8_t count = static_cast<uint8_t>(dataCount); outStream.write((char*)&count, sizeof(uint8_t)); outStream.write((char*)&flattenedData[dataStart], count * sizeof(T)); } /** * @brief (binary writing) copy the bits of this property for some element to a stream * * @param outStream Stream to write to. * @param iElement index of the element to write. */ virtual void writeDataBinaryBigEndian(std::ostream& outStream, size_t iElement) override { size_t dataStart = flattenedIndexStart[iElement]; size_t dataEnd = flattenedIndexStart[iElement + 1]; // Get the number of list elements as a uchar, and ensure the value fits size_t dataCount = dataEnd - dataStart; if (dataCount > std::numeric_limits<uint8_t>::max()) { throw std::runtime_error( "List property has an element with more entries than fit in a uchar. See note in README."); } uint8_t count = static_cast<uint8_t>(dataCount); outStream.write((char*)&count, sizeof(uint8_t)); for (size_t iFlat = dataStart; iFlat < dataEnd; iFlat++) { T value = swapEndian(flattenedData[iFlat]); outStream.write((char*)&value, sizeof(T)); } } /** * @brief Number of element entries for this property * * @return */ virtual size_t size() override { return flattenedIndexStart.size() - 1; } /** * @brief A string naming the type of the property * * @return */ virtual std::string propertyTypeName() override { return typeName<T>(); } /** * @brief The (flattened) data for the property, as formed by concatenating all of the individual element lists * together. */ std::vector<T> flattenedData; /** * @brief Indices in to flattenedData. The i'th element gives the index in to flattenedData where the element's data * begins. A final entry is included which is the length of flattenedData. Size is N_elem + 1. */ std::vector<size_t> flattenedIndexStart; /** * @brief The number of bytes used to store the count for lists of data. */ int listCountBytes = -1; }; /** * @brief Helper function to construct a new property of the appropriate type. * * @param name The name of the property to construct. * @param typeStr A string naming the type according to the format. * @param isList Is this a plain property, or a list property? * @param listCountTypeStr If a list property, the type of the count varible. * * @return A new Property with the proper type. */ inline std::unique_ptr<Property> createPropertyWithType(const std::string& name, const std::string& typeStr, bool isList, const std::string& listCountTypeStr) { // == Figure out how many bytes the list count field has, if this is a list type // Note: some files seem to use signed types here, we read the width but always parse as if unsigned int listCountBytes = -1; if (isList) { if (listCountTypeStr == "uchar" || listCountTypeStr == "uint8" || listCountTypeStr == "char" || listCountTypeStr == "int8") { listCountBytes = 1; } else if (listCountTypeStr == "ushort" || listCountTypeStr == "uint16" || listCountTypeStr == "short" || listCountTypeStr == "int16") { listCountBytes = 2; } else if (listCountTypeStr == "uint" || listCountTypeStr == "uint32" || listCountTypeStr == "int" || listCountTypeStr == "int32") { listCountBytes = 4; } else { throw std::runtime_error("Unrecognized list count type: " + listCountTypeStr); } } // = Unsigned int // 8 bit unsigned if (typeStr == "uchar" || typeStr == "uint8") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<uint8_t>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<uint8_t>(name)); } } // 16 bit unsigned else if (typeStr == "ushort" || typeStr == "uint16") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<uint16_t>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<uint16_t>(name)); } } // 32 bit unsigned else if (typeStr == "uint" || typeStr == "uint32") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<uint32_t>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<uint32_t>(name)); } } // = Signed int // 8 bit signed if (typeStr == "char" || typeStr == "int8") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<int8_t>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<int8_t>(name)); } } // 16 bit signed else if (typeStr == "short" || typeStr == "int16") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<int16_t>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<int16_t>(name)); } } // 32 bit signed else if (typeStr == "int" || typeStr == "int32") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<int32_t>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<int32_t>(name)); } } // = Float // 32 bit float else if (typeStr == "float" || typeStr == "float32") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<float>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<float>(name)); } } // 64 bit float else if (typeStr == "double" || typeStr == "float64") { if (isList) { return std::unique_ptr<Property>(new TypedListProperty<double>(name, listCountBytes)); } else { return std::unique_ptr<Property>(new TypedProperty<double>(name)); } } else { throw std::runtime_error("Data type: " + typeStr + " cannot be mapped to .ply format"); } } /** * @brief An element (more properly an element type) in the .ply object. Tracks the name of the elemnt type (eg, * "vertices"), the number of elements of that type (eg, 1244), and any properties associated with that element (eg, * "position", "color"). */ class Element { public: /** * @brief Create a new element type. * * @param name_ Name of the element type (eg, "vertices") * @param count_ Number of instances of this element. */ Element(const std::string& name_, size_t count_) : name(name_), count(count_) {} std::string name; size_t count; std::vector<std::unique_ptr<Property>> properties; /** * @brief Check if a property exists. * * @param target The name of the property to get. * * @return Whether the target property exists. */ bool hasProperty(const std::string& target) { for (std::unique_ptr<Property>& prop : properties) { if (prop->name == target) { return true; } } return false; } /** * @brief Check if a property exists with the requested type. * * @tparam T The type of the property * @param target The name of the property to get. * * @return Whether the target property exists. */ template <class T> bool hasPropertyType(const std::string& target) { for (std::unique_ptr<Property>& prop : properties) { if (prop->name == target) { TypedProperty<T>* castedProp = dynamic_cast<TypedProperty<T>*>(prop.get()); if (castedProp) { return true; } return false; } } return false; } /** * @brief A list of the names of all properties * * @return Property names */ std::vector<std::string> getPropertyNames() { std::vector<std::string> names; for (std::unique_ptr<Property>& p : properties) { names.push_back(p->name); } return names; } /** * @brief Low-level method to get a pointer to a property. Users probably don't need to call this. * * @param target The name of the property to get. * * @return A (unique_ptr) pointer to the property. */ std::unique_ptr<Property>& getPropertyPtr(const std::string& target) { for (std::unique_ptr<Property>& prop : properties) { if (prop->name == target) { return prop; } } throw std::runtime_error("PLY parser: element " + name + " does not have property " + target); } /** * @brief Add a new (plain, not list) property for this element type. * * @tparam T The type of the property * @param propertyName The name of the property * @param data The data for the property. Must have the same length as the number of elements. */ template <class T> void addProperty(const std::string& propertyName, const std::vector<T>& data) { if (data.size() != count) { throw std::runtime_error("PLY write: new property " + propertyName + " has size which does not match element"); } // If there is already some property with this name, remove it for (size_t i = 0; i < properties.size(); i++) { if (properties[i]->name == propertyName) { properties.erase(properties.begin() + i); i--; } } // Copy to canonical type. Often a no-op, but takes care of standardizing widths across platforms. std::vector<typename CanonicalName<T>::type> canonicalVec(data.begin(), data.end()); properties.push_back( std::unique_ptr<Property>(new TypedProperty<typename CanonicalName<T>::type>(propertyName, canonicalVec))); } /** * @brief Add a new list property for this element type. * * @tparam T The type of the property (eg, "double" for a list of doubles) * @param propertyName The name of the property * @param data The data for the property. Outer vector must have the same length as the number of elements. */ template <class T> void addListProperty(const std::string& propertyName, const std::vector<std::vector<T>>& data) { if (data.size() != count) { throw std::runtime_error("PLY write: new property " + propertyName + " has size which does not match element"); } // If there is already some property with this name, remove it for (size_t i = 0; i < properties.size(); i++) { if (properties[i]->name == propertyName) { properties.erase(properties.begin() + i); i--; } } // Copy to canonical type. Often a no-op, but takes care of standardizing widths across platforms. std::vector<std::vector<typename CanonicalName<T>::type>> canonicalListVec; for (const std::vector<T>& subList : data) { canonicalListVec.emplace_back(subList.begin(), subList.end()); } properties.push_back(std::unique_ptr<Property>( new TypedListProperty<typename CanonicalName<T>::type>(propertyName, canonicalListVec))); } /** * @brief Get a vector of a data from a property for this element. Automatically promotes to larger types. Throws if * requested data is unavailable. * * @tparam T The type of data requested * @param propertyName The name of the property to get. * * @return The data. */ template <class T> std::vector<T> getProperty(const std::string& propertyName) { // Find the property std::unique_ptr<Property>& prop = getPropertyPtr(propertyName); // Get a copy of the data with auto-promoting type magic return getDataFromPropertyRecursive<T, T>(prop.get()); } /** * @brief Get a vector of a data from a property for this element. Unlike getProperty(), only returns if the ply * record contains a type that matches T exactly. Throws if * requested data is unavailable. * * @tparam T The type of data requested * @param propertyName The name of the property to get. * * @return The data. */ template <class T> std::vector<T> getPropertyType(const std::string& propertyName) { // Find the property std::unique_ptr<Property>& prop = getPropertyPtr(propertyName); TypedProperty<T>* castedProp = dynamic_cast<TypedProperty<T>*>(prop); if (castedProp) { return castedProp->data; } // No match, failure throw std::runtime_error("PLY parser: property " + prop->name + " is not of type type " + typeName<T>() + ". Has type " + prop->propertyTypeName()); } /** * @brief Get a vector of lists of data from a property for this element. Automatically promotes to larger types. * Throws if requested data is unavailable. * * @tparam T The type of data requested * @param propertyName The name of the property to get. * * @return The data. */ template <class T> std::vector<std::vector<T>> getListProperty(const std::string& propertyName) { // Find the property std::unique_ptr<Property>& prop = getPropertyPtr(propertyName); // Get a copy of the data with auto-promoting type magic return getDataFromListPropertyRecursive<T, T>(prop.get()); } /** * @brief Get a vector of a data from a property for this element. Unlike getProperty(), only returns if the ply * record contains a type that matches T exactly. Throws if * requested data is unavailable. * * @tparam T The type of data requested * @param propertyName The name of the property to get. * * @return The data. */ template <class T> std::vector<std::vector<T>> getListPropertyType(const std::string& propertyName) { // Find the property std::unique_ptr<Property>& prop = getPropertyPtr(propertyName); TypedListProperty<T>* castedProp = dynamic_cast<TypedListProperty<T>*>(prop); if (castedProp) { return unflattenList(castedProp->flattenedData, castedProp->flattenedIndexStart); } // No match, failure throw std::runtime_error("PLY parser: list property " + prop->name + " is not of type " + typeName<T>() + ". Has type " + prop->propertyTypeName()); } /** * @brief Get a vector of lists of data from a property for this element. Automatically promotes to larger types. * Unlike getListProperty(), this method will additionally convert between types of different sign (eg, requesting and * int32 would get data from a uint32); doing so naively converts between signed and unsigned types. This is typically * useful for data representing indices, which might be stored as signed or unsigned numbers. * * @tparam T The type of data requested * @param propertyName The name of the property to get. * * @return The data. */ template <class T> std::vector<std::vector<T>> getListPropertyAnySign(const std::string& propertyName) { // Find the property std::unique_ptr<Property>& prop = getPropertyPtr(propertyName); // Get a copy of the data with auto-promoting type magic try { // First, try the usual approach, looking for a version of the property with the same signed-ness and possibly // smaller size return getDataFromListPropertyRecursive<T, T>(prop.get()); } catch (const std::runtime_error& orig_e) { // If the usual approach fails, look for a version with opposite signed-ness try { // This type has the oppopsite signeness as the input type typedef typename CanonicalName<T>::type Tcan; typedef typename std::conditional<std::is_signed<Tcan>::value, typename std::make_unsigned<Tcan>::type, typename std::make_signed<Tcan>::type>::type OppsignType; return getDataFromListPropertyRecursive<T, OppsignType>(prop.get()); } catch (const std::runtime_error&) { throw orig_e; } throw orig_e; } } /** * @brief Performs sanity checks on the element, throwing if any fail. */ void validate() { // Make sure no properties have duplicate names, and no names have whitespace for (size_t iP = 0; iP < properties.size(); iP++) { for (char c : properties[iP]->name) { if (std::isspace(c)) { throw std::runtime_error("Ply validate: illegal whitespace in name " + properties[iP]->name); } } for (size_t jP = iP + 1; jP < properties.size(); jP++) { if (properties[iP]->name == properties[jP]->name) { throw std::runtime_error("Ply validate: multiple properties with name " + properties[iP]->name); } } } // Make sure all properties have right length for (size_t iP = 0; iP < properties.size(); iP++) { if (properties[iP]->size() != count) { throw std::runtime_error("Ply validate: property has wrong size. " + properties[iP]->name + " does not match element size."); } } } /** * @brief Writes out this element's information to the file header. * * @param outStream The stream to use. */ void writeHeader(std::ostream& outStream) { outStream << "element " << name << " " << count << "\n"; for (std::unique_ptr<Property>& p : properties) { p->writeHeader(outStream); } } /** * @brief (ASCII writing) Writes out all of the data for every element of this element type to the stream, including * all contained properties. * * @param outStream The stream to write to. */ void writeDataASCII(std::ostream& outStream) { // Question: what is the proper output for an element with no properties? Here, we write a blank line, so there is // one line per element no matter what. for (size_t iE = 0; iE < count; iE++) { for (size_t iP = 0; iP < properties.size(); iP++) { properties[iP]->writeDataASCII(outStream, iE); if (iP < properties.size() - 1) { outStream << " "; } } outStream << "\n"; } } /** * @brief (binary writing) Writes out all of the data for every element of this element type to the stream, including * all contained properties. * * @param outStream The stream to write to. */ void writeDataBinary(std::ostream& outStream) { for (size_t iE = 0; iE < count; iE++) { for (size_t iP = 0; iP < properties.size(); iP++) { properties[iP]->writeDataBinary(outStream, iE); } } } /** * @brief (binary writing) Writes out all of the data for every element of this element type to the stream, including * all contained properties. * * @param outStream The stream to write to. */ void writeDataBinaryBigEndian(std::ostream& outStream) { for (size_t iE = 0; iE < count; iE++) { for (size_t iP = 0; iP < properties.size(); iP++) { properties[iP]->writeDataBinaryBigEndian(outStream, iE); } } } /** * @brief Helper function which does the hard work to implement type promotion for data getters. Throws if type * conversion fails. * * @tparam D The desired output type * @tparam T The current attempt for the actual type of the property * @param prop The property to get (does not delete nor share pointer) * * @return The data, with the requested type */ template <class D, class T> std::vector<D> getDataFromPropertyRecursive(Property* prop) { typedef typename CanonicalName<T>::type Tcan; { // Try to return data of type D from a property of type T TypedProperty<Tcan>* castedProp = dynamic_cast<TypedProperty<Tcan>*>(prop); if (castedProp) { // Succeeded, return a buffer of the data (copy while converting type) std::vector<D> castedVec; castedVec.reserve(castedProp->data.size()); for (Tcan& v : castedProp->data) { castedVec.push_back(static_cast<D>(v)); } return castedVec; } } TypeChain<Tcan> chainType; if (chainType.hasChildType) { return getDataFromPropertyRecursive<D, typename TypeChain<Tcan>::type>(prop); } else { // No smaller type to try, failure throw std::runtime_error("PLY parser: property " + prop->name + " cannot be coerced to requested type " + typeName<D>() + ". Has type " + prop->propertyTypeName()); } } /** * @brief Helper function which does the hard work to implement type promotion for list data getters. Throws if type * conversion fails. * * @tparam D The desired output type * @tparam T The current attempt for the actual type of the property * @param prop The property to get (does not delete nor share pointer) * * @return The data, with the requested type */ template <class D, class T> std::vector<std::vector<D>> getDataFromListPropertyRecursive(Property* prop) { typedef typename CanonicalName<T>::type Tcan; TypedListProperty<Tcan>* castedProp = dynamic_cast<TypedListProperty<Tcan>*>(prop); if (castedProp) { // Succeeded, return a buffer of the data (copy while converting type) // Convert to flat buffer of new type std::vector<D>* castedFlatVec = nullptr; std::vector<D> castedFlatVecCopy; // we _might_ make a copy here, depending on is_same below if (std::is_same<std::vector<D>, std::vector<Tcan>>::value) { // just use the array we already have castedFlatVec = addressIfSame<std::vector<D>>(castedProp->flattenedData, 0 /* dummy arg to disambiguate */); } else { // make a copy castedFlatVecCopy.reserve(castedProp->flattenedData.size()); for (Tcan& v : castedProp->flattenedData) { castedFlatVecCopy.push_back(static_cast<D>(v)); } castedFlatVec = &castedFlatVecCopy; } // Unflatten and return return unflattenList(*castedFlatVec, castedProp->flattenedIndexStart); } TypeChain<Tcan> chainType; if (chainType.hasChildType) { return getDataFromListPropertyRecursive<D, typename TypeChain<Tcan>::type>(prop); } else { // No smaller type to try, failure throw std::runtime_error("PLY parser: list property " + prop->name + " cannot be coerced to requested type list " + typeName<D>() + ". Has type list " + prop->propertyTypeName()); } } }; // Some string helpers namespace { inline std::string trimSpaces(const std::string& input) { size_t start = 0; while (start < input.size() && input[start] == ' ') start++; size_t end = input.size(); while (end > start && (input[end - 1] == ' ' || input[end - 1] == '\n' || input[end - 1] == '\r')) end--; return input.substr(start, end - start); } inline std::vector<std::string> tokenSplit(const std::string& input) { std::vector<std::string> result; size_t curr = 0; size_t found = 0; while ((found = input.find_first_of(' ', curr)) != std::string::npos) { std::string token = input.substr(curr, found - curr); token = trimSpaces(token); if (token.size() > 0) { result.push_back(token); } curr = found + 1; } std::string token = input.substr(curr); token = trimSpaces(token); if (token.size() > 0) { result.push_back(token); } return result; } inline bool startsWith(const std::string& input, const std::string& query) { return input.compare(0, query.length(), query) == 0; } }; // namespace /** * @brief Primary class; represents a set of data in the .ply format. */ class PLYData { public: /** * @brief Create an empty PLYData object. */ PLYData(){}; /** * @brief Initialize a PLYData by reading from a file. Throws if any failures occur. * * @param filename The file to read from. * @param verbose If true, print useful info about the file to stdout */ PLYData(const std::string& filename, bool verbose = false) { using std::cout; using std::endl; using std::string; using std::vector; if (verbose) cout << "PLY parser: Reading ply file: " << filename << endl; // Open a file in binary always, in case it turns out to have binary data. std::ifstream inStream(filename, std::ios::binary); if (inStream.fail()) { throw std::runtime_error("PLY parser: Could not open file " + filename); } parsePLY(inStream, verbose); if (verbose) { cout << " - Finished parsing file." << endl; } } /** * @brief Initialize a PLYData by reading from a stringstream. Throws if any failures occur. * * @param inStream The stringstream to read from. * @param verbose If true, print useful info about the file to stdout */ PLYData(std::istream& inStream, bool verbose = false) { using std::cout; using std::endl; if (verbose) cout << "PLY parser: Reading ply file from stream" << endl; parsePLY(inStream, verbose); if (verbose) { cout << " - Finished parsing stream." << endl; } } /** * @brief Perform sanity checks on the file, throwing if any fail. */ void validate() { for (size_t iE = 0; iE < elements.size(); iE++) { for (char c : elements[iE].name) { if (std::isspace(c)) { throw std::runtime_error("Ply validate: illegal whitespace in element name " + elements[iE].name); } } for (size_t jE = iE + 1; jE < elements.size(); jE++) { if (elements[iE].name == elements[jE].name) { throw std::runtime_error("Ply validate: duplcate element name " + elements[iE].name); } } } // Do a quick validation sanity check for (Element& e : elements) { e.validate(); } } /** * @brief Write this data to a .ply file. * * @param filename The file to write to. * @param format The format to use (binary or ascii?) */ void write(const std::string& filename, DataFormat format = DataFormat::ASCII) { outputDataFormat = format; validate(); // Open stream for writing std::ofstream outStream(filename, std::ios::out | std::ios::binary); if (!outStream.good()) { throw std::runtime_error("Ply writer: Could not open output file " + filename + " for writing"); } writePLY(outStream); } /** * @brief Write this data to an output stream * * @param outStream The output stream to write to. * @param format The format to use (binary or ascii?) */ void write(std::ostream& outStream, DataFormat format = DataFormat::ASCII) { outputDataFormat = format; validate(); writePLY(outStream); } /** * @brief Get an element type by name ("vertices") * * @param target The name of the element type to get * * @return A reference to the element type. */ Element& getElement(const std::string& target) { for (Element& e : elements) { if (e.name == target) return e; } throw std::runtime_error("PLY parser: no element with name: " + target); } /** * @brief Check if an element type exists * * @param target The name to check for. * * @return True if exists. */ bool hasElement(const std::string& target) { for (Element& e : elements) { if (e.name == target) return true; } return false; } /** * @brief A list of the names of all elements * * @return Element names */ std::vector<std::string> getElementNames() { std::vector<std::string> names; for (Element& e : elements) { names.push_back(e.name); } return names; } /** * @brief Add a new element type to the object * * @param name The name of the new element type ("vertices"). * @param count The number of elements of this type. */ void addElement(const std::string& name, size_t count) { elements.emplace_back(name, count); } // === Common-case helpers /** * @brief Common-case helper get mesh vertex positions * * @param vertexElementName The element name to use (default: "vertex") * * @return A vector of vertex positions. */ std::vector<std::array<double, 3>> getVertexPositions(const std::string& vertexElementName = "vertex") { std::vector<double> xPos = getElement(vertexElementName).getProperty<double>("x"); std::vector<double> yPos = getElement(vertexElementName).getProperty<double>("y"); std::vector<double> zPos = getElement(vertexElementName).getProperty<double>("z"); std::vector<std::array<double, 3>> result(xPos.size()); for (size_t i = 0; i < result.size(); i++) { result[i][0] = xPos[i]; result[i][1] = yPos[i]; result[i][2] = zPos[i]; } return result; } /** * @brief Common-case helper get mesh vertex colors * * @param vertexElementName The element name to use (default: "vertex") * * @return A vector of vertex colors (unsigned chars [0,255]). */ std::vector<std::array<unsigned char, 3>> getVertexColors(const std::string& vertexElementName = "vertex") { std::vector<unsigned char> r = getElement(vertexElementName).getProperty<unsigned char>("red"); std::vector<unsigned char> g = getElement(vertexElementName).getProperty<unsigned char>("green"); std::vector<unsigned char> b = getElement(vertexElementName).getProperty<unsigned char>("blue"); std::vector<std::array<unsigned char, 3>> result(r.size()); for (size_t i = 0; i < result.size(); i++) { result[i][0] = r[i]; result[i][1] = g[i]; result[i][2] = b[i]; } return result; } /** * @brief Common-case helper to get face indices for a mesh. If not template type is given, size_t is used. Naively * converts to requested signedness, which may lead to unexpected values if an unsigned type is used and file contains * negative values. * * @return The indices into the vertex elements for each face. Usually 0-based, though there are no formal rules. */ template <typename T = size_t> std::vector<std::vector<T>> getFaceIndices() { for (const std::string& f : std::vector<std::string>{"face"}) { for (const std::string& p : std::vector<std::string>{"vertex_indices", "vertex_index"}) { try { return getElement(f).getListPropertyAnySign<T>(p); } catch (const std::runtime_error&) { // that's fine } } } throw std::runtime_error("PLY parser: could not find face vertex indices attribute under any common name."); } /** * @brief Common-case helper set mesh vertex positons. Creates vertex element, if necessary. * * @param vertexPositions A vector of vertex positions */ void addVertexPositions(std::vector<std::array<double, 3>>& vertexPositions) { std::string vertexName = "vertex"; size_t N = vertexPositions.size(); // Create the element if (!hasElement(vertexName)) { addElement(vertexName, N); } // De-interleave std::vector<double> xPos(N); std::vector<double> yPos(N); std::vector<double> zPos(N); for (size_t i = 0; i < vertexPositions.size(); i++) { xPos[i] = vertexPositions[i][0]; yPos[i] = vertexPositions[i][1]; zPos[i] = vertexPositions[i][2]; } // Store getElement(vertexName).addProperty<double>("x", xPos); getElement(vertexName).addProperty<double>("y", yPos); getElement(vertexName).addProperty<double>("z", zPos); } /** * @brief Common-case helper set mesh vertex colors. Creates a vertex element, if necessary. * * @param colors A vector of vertex colors (unsigned chars [0,255]). */ void addVertexColors(std::vector<std::array<unsigned char, 3>>& colors) { std::string vertexName = "vertex"; size_t N = colors.size(); // Create the element if (!hasElement(vertexName)) { addElement(vertexName, N); } // De-interleave std::vector<unsigned char> r(N); std::vector<unsigned char> g(N); std::vector<unsigned char> b(N); for (size_t i = 0; i < colors.size(); i++) { r[i] = colors[i][0]; g[i] = colors[i][1]; b[i] = colors[i][2]; } // Store getElement(vertexName).addProperty<unsigned char>("red", r); getElement(vertexName).addProperty<unsigned char>("green", g); getElement(vertexName).addProperty<unsigned char>("blue", b); } /** * @brief Common-case helper set mesh vertex colors. Creates a vertex element, if necessary. * * @param colors A vector of vertex colors as floating point [0,1] values. Internally converted to [0,255] chars. */ void addVertexColors(std::vector<std::array<double, 3>>& colors) { std::string vertexName = "vertex"; size_t N = colors.size(); // Create the element if (!hasElement(vertexName)) { addElement(vertexName, N); } auto toChar = [](double v) { if (v < 0.0) v = 0.0; if (v > 1.0) v = 1.0; return static_cast<unsigned char>(v * 255.); }; // De-interleave std::vector<unsigned char> r(N); std::vector<unsigned char> g(N); std::vector<unsigned char> b(N); for (size_t i = 0; i < colors.size(); i++) { r[i] = toChar(colors[i][0]); g[i] = toChar(colors[i][1]); b[i] = toChar(colors[i][2]); } // Store getElement(vertexName).addProperty<unsigned char>("red", r); getElement(vertexName).addProperty<unsigned char>("green", g); getElement(vertexName).addProperty<unsigned char>("blue", b); } /** * @brief Common-case helper to set face indices. Creates a face element if needed. The input type will be casted to a * 32 bit integer of the same signedness. * * @param indices The indices into the vertex list around each face. */ template <typename T> void addFaceIndices(std::vector<std::vector<T>>& indices) { std::string faceName = "face"; size_t N = indices.size(); // Create the element if (!hasElement(faceName)) { addElement(faceName, N); } // Cast to 32 bit typedef typename std::conditional<std::is_signed<T>::value, int32_t, uint32_t>::type IndType; std::vector<std::vector<IndType>> intInds; for (std::vector<T>& l : indices) { std::vector<IndType> thisInds; for (T& val : l) { IndType valConverted = static_cast<IndType>(val); if (valConverted != val) { throw std::runtime_error("Index value " + std::to_string(val) + " could not be converted to a .ply integer without loss of data. Note that .ply " "only supports 32-bit ints."); } thisInds.push_back(valConverted); } intInds.push_back(thisInds); } // Store getElement(faceName).addListProperty<IndType>("vertex_indices", intInds); } /** * @brief Comments for the file. When writing, each entry will be written as a sequential comment line. */ std::vector<std::string> comments; /** * @brief obj_info comments for the file. When writing, each entry will be written as a sequential comment line. */ std::vector<std::string> objInfoComments; private: std::vector<Element> elements; const int majorVersion = 1; // I'll buy you a drink if these ever get bumped const int minorVersion = 0; DataFormat inputDataFormat = DataFormat::ASCII; // set when reading from a file DataFormat outputDataFormat = DataFormat::ASCII; // option for writing files // === Reading === /** * @brief Parse a PLY file from an input stream * * @param inStream * @param verbose */ void parsePLY(std::istream& inStream, bool verbose) { // == Process the header parseHeader(inStream, verbose); // === Parse data from a binary file if (inputDataFormat == DataFormat::Binary) { parseBinary(inStream, verbose); } // === Parse data from an binary file else if (inputDataFormat == DataFormat::BinaryBigEndian) { parseBinaryBigEndian(inStream, verbose); } // === Parse data from an ASCII file else if (inputDataFormat == DataFormat::ASCII) { parseASCII(inStream, verbose); } } /** * @brief Read the header for a file * * @param inStream * @param verbose */ void parseHeader(std::istream& inStream, bool verbose) { using std::cout; using std::endl; using std::string; using std::vector; // First two lines are predetermined { // First line is magic constant string plyLine; std::getline(inStream, plyLine); if (trimSpaces(plyLine) != "ply") { throw std::runtime_error("PLY parser: File does not appear to be ply file. First line should be 'ply'"); } } { // second line is version string styleLine; std::getline(inStream, styleLine); vector<string> tokens = tokenSplit(styleLine); if (tokens.size() != 3) throw std::runtime_error("PLY parser: bad format line"); std::string formatStr = tokens[0]; std::string typeStr = tokens[1]; std::string versionStr = tokens[2]; // "format" if (formatStr != "format") throw std::runtime_error("PLY parser: bad format line"); // ascii/binary if (typeStr == "ascii") { inputDataFormat = DataFormat::ASCII; if (verbose) cout << " - Type: ascii" << endl; } else if (typeStr == "binary_little_endian") { inputDataFormat = DataFormat::Binary; if (verbose) cout << " - Type: binary" << endl; } else if (typeStr == "binary_big_endian") { inputDataFormat = DataFormat::BinaryBigEndian; if (verbose) cout << " - Type: binary big endian" << endl; } else { throw std::runtime_error("PLY parser: bad format line"); } // version if (versionStr != "1.0") { throw std::runtime_error("PLY parser: encountered file with version != 1.0. Don't know how to parse that"); } if (verbose) cout << " - Version: " << versionStr << endl; } // Consume header line by line while (inStream.good()) { string line; std::getline(inStream, line); // Parse a comment if (startsWith(line, "comment")) { string comment = line.substr(8); if (verbose) cout << " - Comment: " << comment << endl; comments.push_back(comment); continue; } // Parse an obj_info comment if (startsWith(line, "obj_info")) { string infoComment = line.substr(9); if (verbose) cout << " - obj_info: " << infoComment << endl; objInfoComments.push_back(infoComment); continue; } // Parse an element else if (startsWith(line, "element")) { vector<string> tokens = tokenSplit(line); if (tokens.size() != 3) throw std::runtime_error("PLY parser: Invalid element line"); string name = tokens[1]; size_t count; std::istringstream iss(tokens[2]); iss >> count; elements.emplace_back(name, count); if (verbose) cout << " - Found element: " << name << " (count = " << count << ")" << endl; continue; } // Parse a property list else if (startsWith(line, "property list")) { vector<string> tokens = tokenSplit(line); if (tokens.size() != 5) throw std::runtime_error("PLY parser: Invalid property list line"); if (elements.size() == 0) throw std::runtime_error("PLY parser: Found property list without previous element"); string countType = tokens[2]; string type = tokens[3]; string name = tokens[4]; elements.back().properties.push_back(createPropertyWithType(name, type, true, countType)); if (verbose) cout << " - Found list property: " << name << " (count type = " << countType << ", data type = " << type << ")" << endl; continue; } // Parse a property else if (startsWith(line, "property")) { vector<string> tokens = tokenSplit(line); if (tokens.size() != 3) throw std::runtime_error("PLY parser: Invalid property line"); if (elements.size() == 0) throw std::runtime_error("PLY parser: Found property without previous element"); string type = tokens[1]; string name = tokens[2]; elements.back().properties.push_back(createPropertyWithType(name, type, false, "")); if (verbose) cout << " - Found property: " << name << " (type = " << type << ")" << endl; continue; } // Parse end of header else if (startsWith(line, "end_header")) { break; } // Error! else { throw std::runtime_error("Unrecognized header line: " + line); } } } /** * @brief Read the actual data for a file, in ASCII * * @param inStream * @param verbose */ void parseASCII(std::istream& inStream, bool verbose) { using std::string; using std::vector; // Read all elements for (Element& elem : elements) { if (verbose) { std::cout << " - Processing element: " << elem.name << std::endl; } for (size_t iP = 0; iP < elem.properties.size(); iP++) { elem.properties[iP]->reserve(elem.count); } for (size_t iEntry = 0; iEntry < elem.count; iEntry++) { string line; std::getline(inStream, line); // Some .ply files seem to include empty lines before the start of property data (though this is not specified // in the format description). We attempt to recover and parse such files by skipping any empty lines. if (!elem.properties.empty()) { // if the element has no properties, the line _should_ be blank, presumably while (line.empty()) { // skip lines until we hit something nonempty std::getline(inStream, line); } } vector<string> tokens = tokenSplit(line); size_t iTok = 0; for (size_t iP = 0; iP < elem.properties.size(); iP++) { elem.properties[iP]->parseNext(tokens, iTok); } } } } /** * @brief Read the actual data for a file, in binary. * * @param inStream * @param verbose */ void parseBinary(std::istream& inStream, bool verbose) { if (!isLittleEndian()) { throw std::runtime_error("binary reading assumes little endian system"); } using std::string; using std::vector; // Read all elements for (Element& elem : elements) { if (verbose) { std::cout << " - Processing element: " << elem.name << std::endl; } for (size_t iP = 0; iP < elem.properties.size(); iP++) { elem.properties[iP]->reserve(elem.count); } for (size_t iEntry = 0; iEntry < elem.count; iEntry++) { for (size_t iP = 0; iP < elem.properties.size(); iP++) { elem.properties[iP]->readNext(inStream); } } } } /** * @brief Read the actual data for a file, in binary. * * @param inStream * @param verbose */ void parseBinaryBigEndian(std::istream& inStream, bool verbose) { if (!isLittleEndian()) { throw std::runtime_error("binary reading assumes little endian system"); } using std::string; using std::vector; // Read all elements for (Element& elem : elements) { if (verbose) { std::cout << " - Processing element: " << elem.name << std::endl; } for (size_t iP = 0; iP < elem.properties.size(); iP++) { elem.properties[iP]->reserve(elem.count); } for (size_t iEntry = 0; iEntry < elem.count; iEntry++) { for (size_t iP = 0; iP < elem.properties.size(); iP++) { elem.properties[iP]->readNextBigEndian(inStream); } } } } // === Writing === /** * @brief write a PLY file to an output stream * * @param outStream */ void writePLY(std::ostream& outStream) { writeHeader(outStream); // Write all elements for (Element& e : elements) { if (outputDataFormat == DataFormat::Binary) { if (!isLittleEndian()) { throw std::runtime_error("binary writing assumes little endian system"); } e.writeDataBinary(outStream); } else if (outputDataFormat == DataFormat::BinaryBigEndian) { if (!isLittleEndian()) { throw std::runtime_error("binary writing assumes little endian system"); } e.writeDataBinaryBigEndian(outStream); } else if (outputDataFormat == DataFormat::ASCII) { e.writeDataASCII(outStream); } } } /** * @brief Write out a header for a file * * @param outStream */ void writeHeader(std::ostream& outStream) { // Magic line outStream << "ply\n"; // Type line outStream << "format "; if (outputDataFormat == DataFormat::Binary) { outStream << "binary_little_endian "; } else if (outputDataFormat == DataFormat::BinaryBigEndian) { outStream << "binary_big_endian "; } else if (outputDataFormat == DataFormat::ASCII) { outStream << "ascii "; } // Version number outStream << majorVersion << "." << minorVersion << "\n"; // Write comments bool hasHapplyComment = false; std::string happlyComment = "Written with hapPLY (https://github.com/nmwsharp/happly)"; for (const std::string& comment : comments) { if (comment == happlyComment) hasHapplyComment = true; outStream << "comment " << comment << "\n"; } if (!hasHapplyComment) { outStream << "comment " << happlyComment << "\n"; } // Write obj_info comments for (const std::string& comment : objInfoComments) { outStream << "obj_info " << comment << "\n"; } // Write elements (and their properties) for (Element& e : elements) { e.writeHeader(outStream); } // End header outStream << "end_header\n"; } }; } // namespace happly ================================================ FILE: src/asp/Rig/theia_flags.txt ================================================ ############### Input/Output ############### # Input/output files. # Set these if a matches file is not present. Images should be a filepath with a # wildcard e.g., /home/my_username/my_images/*.jpg # These should be left empty if specified on the command line. --images= --output_matches_file= # If a matches file has already been created, set the filepath here. This avoids # having to recompute all features and matches. # This should be left empty if specified on the command line. --matches_file= # The calibration file indicates possibly known calibration e.g, from EXIF or # explicit calibration. Theia attempts to extract EXIF focal lengths if calibration # is not supplied for a given image. # These should be left empty if specified on the command line. --calibration_file= --output_reconstruction= ############### Multithreading ############### # Set to the number of threads you want to use. --num_threads=16 ############### Feature Extraction ############### --descriptor=SIFT --feature_density=NORMAL ############### Matching Options ############### # Perform matching out-of-core. If set to true, the matching_working_directory # must be set to a valid, writable directory (the directory will be created if # it does not exits) Set to false to perform all-in-memory matching. --match_out_of_core=true # During feature matching, features are saved to disk so that out-of-core # matching may be performed. This directory specifies which directory those # features should be saved to. # This should be left empty if specified on the command line. --matching_working_directory= # During feature matching we utilize an LRU cache for out-of-core matching. The size # of that cache (in terms of number of images) is controlled by this parameter. The # higher this number the more memory is required. --matching_max_num_images_in_cache=128 --matching_strategy=CASCADE_HASHING --lowes_ratio=0.8 --min_num_inliers_for_valid_match=5 # NOTE: This threshold is relative to an image with a width of 1024 pixels. It # will be scaled appropriately based on the image resolutions. This allows a # single threshold to be used for images with different resolutions. --max_sampson_error_for_verified_match=10.0 --bundle_adjust_two_view_geometry=true --keep_only_symmetric_matches=true # Global descriptor extractor settings. The global image descriptors are used to # speed up matching by selected the K most similar images for each image, and # only performing feature matching with these images. --num_nearest_neighbors_for_global_descriptor_matching=100 --num_gmm_clusters_for_fisher_vector=16 --max_num_features_for_fisher_vector_training=1000000 ############### General SfM Options ############### --reconstruction_estimator=GLOBAL --min_track_length=2 --max_track_length=50 --reconstruct_largest_connected_component=true # Set to true if all views were captured with the same camera. If true, then a # single set of camera intrinsic parameters will be used for all views in the # reconstruction. --shared_calibration=false # If set to true, only views with known calibration are reconstructed. --only_calibrated_views=true ############### Global SfM Options ############### --global_position_estimator=LEAST_UNSQUARED_DEVIATION --global_rotation_estimator=ROBUST_L1L2 # The value below should be bigger to filter less --post_rotation_filtering_degrees=20 # This refinement is very unstable for rotation-only motions so # it is advised that this is set to false for these motions. --refine_relative_translations_after_rotation_estimation=false # If true, only cameras that are well-conditioned for position estimation will # be used for global position estimation --extract_maximal_rigid_subgraph=false # Filter the relative translations with the 1DSfM filter to remove potential # outliers in the relative pose measurements. --filter_relative_translations_with_1dsfm=true # Nonlinear position estimation options --position_estimation_min_num_tracks_per_view=0 --position_estimation_robust_loss_width=0.1 # If true, perform a single iteration of bundle adjustment only on the camera # positions and 3D points (rotation and camera intrinsics are held # constant). This helps often to constrain inaccurate intrinsics. --refine_camera_positions_and_points_after_position_estimation=true # After estimating camera poses, we perform trianguation, then BA, # then filter out bad points. This controls how many times we repeat # this process. --num_retriangulation_iterations=1 ############### Incremental SfM Options ############### # NOTE: This threshold is relative to an image with a width of 1024 pixels. It # will be scaled appropriately based on the image resolutions. This allows a # single threshold to be used for images with different resolutions. --absolute_pose_reprojection_error_threshold=10 --partial_bundle_adjustment_num_views=20 --full_bundle_adjustment_growth_percent=5 --min_num_absolute_pose_inliers=30 ############### Bundle Adjustment Options ############### # Set this parameter to a value other than NONE if you want to utilize a robust # cost function during bundle adjustment. This can increase robustness to outliers # during the optimization. --bundle_adjustment_robust_loss_function=CAUCHY # Set this value to the determine the reprojection error in pixels at which # robustness begins (if a robust cost function is being used). --bundle_adjustment_robust_loss_width=2.0 # Set this parameter to change which camera intrinsics should be # optimized. Valid options are NONE, ALL, FOCAL_LENGTH, PRINCIPAL_POINTS, # RADIAL_DISTORTION, ASPECT_RATIO, and SKEW. This parameter can be set using a # bitmask (with no spaces) e.g., FOCAL_LENGTH|RADIAL_DISTORTION --intrinsics_to_optimize=NONE # After BA, remove any points that have a reprojection error greater # than this. --max_reprojection_error_pixels=50.0 ############### Track Subsampling Options ############### # If true, the estimated tracks are subsampled for bundle adjustment to increase # the efficiency of BA. Tracks are chosen in a way which attempts to constraint # BA as best as possible. This has been shown to provide a significant speedup # without reducing the accuracy much (in fact, it increases the accuracy in some # cases). --subsample_tracks_for_bundle_adjustment=false # Subsampled tracks are chosen with a probability related to their track # length. We limit the effect of long tracks by capping the track length at this # value for the purpose of selecting tracks. --track_subset_selection_long_track_length_threshold=10 # Tracks are chosen in a way that ensures each view is spatially # constrained. Tracks are first binned in an image grid and the top ranked track # is chosen for optimization from each grid cell to ensure good spatial coverage # of the image. The grid cells are set to be this size. --track_selection_image_grid_cell_size_pixels=100 # Tracks are chosen such that each image observes at least this many tracks # which are being optimized. This ensures that each image is well-constrained. --min_num_optimized_tracks_per_view=100 ############### Triangulation Options ############### --min_triangulation_angle_degrees=0.2 --triangulation_reprojection_error_pixels=50.0 --bundle_adjust_tracks=true ############### Logging Options ############### # Logging verbosity. --logtostderr # Increase this number to get more verbose logging. --v=1 ================================================ FILE: src/asp/Sessions/BundleAdjustParse.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file BundleAdjustParse.cc. // Parse and validate bundle_adjust options. This makes use of StereoSession so // must be in this directory. #include <asp/Sessions/BundleAdjustParse.h> #include <asp/Core/StereoSettings.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Core/Bathymetry.h> #include <asp/Core/FileUtils.h> #include <asp/Core/PointUtils.h> #include <vw/Cartography/DatumUtils.h> #include <vw/FileIO/FileUtils.h> #include <vw/FileIO/FileTypes.h> #include <vw/FileIO/MatrixIO.h> #include <boost/filesystem.hpp> #include <boost/program_options.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; namespace asp { // Validate the bundle_adjust options. This modifies the options structure. void loadValidateBaOptions(po::variables_map const& vm, bool inline_adjustments, asp::BaOptions &opt) { // Create the output directory vw::create_out_dir(opt.out_prefix); // These must be done early boost::to_lower(opt.stereo_session); boost::to_lower(opt.cost_function); // Separate out GCP files bool rm_from_input_list = true; opt.gcp_files = vw::get_files_with_ext(opt.image_files, ".gcp", rm_from_input_list); // Handle the situation when the images and cameras are in lists if (!opt.image_list.empty()) { // Read the images and cameras and put them in 'images_or_cams' to be parsed later if (!opt.image_files.empty()) vw::vw_throw(vw::ArgumentErr() << "The option --image-list was specified, but also " << "images or cameras on the command line.\n"); // Read image and camera lists. Consider he case of sharing intrinsics per sensor. read_image_cam_lists(opt.image_list, opt.camera_list, opt.image_files, opt.camera_files, opt.intrinsics_options); // outputs } else { // The images and cameras are passed on the command line std::vector<std::string> images_or_cams = opt.image_files; bool ensure_equal_sizes = true; asp::separate_images_from_cameras(images_or_cams, opt.image_files, opt.camera_files, // outputs ensure_equal_sizes); } // Sanity checks if (!opt.mapprojected_data_list.empty() && opt.image_list.empty()) vw::vw_throw(vw::ArgumentErr() << "Found --mapprojected-data-list, " << "but not --image-list.\n"); if (!opt.mapprojected_data.empty() && !opt.mapprojected_data_list.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --mapprojected-data and " << "--mapprojected-data-list.\n"); // Sanity checks asp::check_for_duplicates(opt.image_files, opt.camera_files, opt.out_prefix); if (opt.image_files.size() != (int)opt.camera_files.size()) { vw::vw_out() << "Detected " << opt.image_files.size() << " images and " << opt.camera_files.size() << " cameras.\n"; vw::vw_throw(vw::ArgumentErr() << "Must have as many cameras as images.\n"); } if (opt.image_files.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing input image files.\n"); // Guess the session if not provided. Do this as soon as we have // the cameras figured out. asp::SessionPtr session(NULL); if (opt.stereo_session.empty()) session = asp::StereoSessionFactory::create (opt.stereo_session, // may change opt, opt.image_files[0], opt.image_files[0], opt.camera_files[0], opt.camera_files[0], opt.out_prefix); // Reusing match files implies that we skip matching if (opt.clean_match_files_prefix != "" || opt.match_files_prefix != "" || opt.isis_cnet != "" || opt.nvm != "") opt.skip_matching = true; // If opt.output_cnet_type is not set, set it to the same format as the input if (opt.output_cnet_type == "") { if (opt.isis_cnet != "") opt.output_cnet_type = "isis-cnet"; else if (opt.nvm != "") opt.output_cnet_type = "nvm"; else opt.output_cnet_type = "match-files"; } // Sanity check in case the user set this option manually. if (opt.output_cnet_type != "match-files" && opt.output_cnet_type != "isis-cnet" && opt.output_cnet_type != "nvm") vw::vw_throw(vw::ArgumentErr() << "Unknown value for --output-cnet-type: " << opt.output_cnet_type << ".\n"); // When skipping matching, we are already forced to reuse match // files based on the logic in the code, but here enforce it // explicitly anyway. if (opt.skip_matching) opt.force_reuse_match_files = true; // Must specify either csv_srs or csv_proj4_str, but not both. The latter is // for backward compatibility. if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --csv-srs and --csv-proj4.\n"); if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty()) opt.csv_srs = opt.csv_proj4_str; // Sanity checks for solving for intrinsics if (opt.intrinsics_options.share_intrinsics_per_sensor && !opt.solve_intrinsics) vw::vw_throw(vw::ArgumentErr() << "Must set --solve-intrinsics to solve for intrinsics per sensor.\n"); if (opt.solve_intrinsics && !inline_adjustments) { vw::vw_out() << "Solving for intrinsics, so assuming --inline-adjustments.\n"; inline_adjustments = true; } // Work out the camera model type. This must happen before early. // Cameras are not loaded yet. // TODO(oalexan1): Maybe we need to load cameras by now? opt.camera_type = BaCameraType_Other; if (inline_adjustments) { if ((opt.stereo_session == "pinhole") || (opt.stereo_session == "nadirpinhole")) opt.camera_type = BaCameraType_Pinhole; else if (opt.stereo_session == "opticalbar") opt.camera_type = BaCameraType_OpticalBar; else if (opt.stereo_session == "csm") opt.camera_type = BaCameraType_CSM; else vw::vw_throw(vw::ArgumentErr() << "Cannot use inline adjustments with session: " << opt.stereo_session << ".\n"); } // Solving for intrinsics requires working harder to push the error down if (opt.solve_intrinsics && vm["parameter-tolerance"].defaulted()) opt.parameter_tolerance = 1e-12; // Sharing intrinsics per sensor is not supported with reference terrain. // It would be too much work to fix the BaDispXyzError() cost function in that // case. Would need to handle all intrinsics being shared, only shared per sensor, // and none being shared. Same with random passes, there also new logic is needed. if (opt.intrinsics_options.share_intrinsics_per_sensor) { if (opt.reference_terrain != "") vw::vw_throw(vw::ArgumentErr() << "Cannot share intrinsics per sensor with " << "--reference-terrain.\n"); if (opt.num_random_passes > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot share intrinsics per sensor with " << "--num-random-passes.\n"); } bool external_matches = (!opt.clean_match_files_prefix.empty() || !opt.match_files_prefix.empty()); if (external_matches && (opt.isis_cnet != "" || opt.nvm != "")) vw::vw_throw(vw::ArgumentErr() << "Cannot use more than one of: ISIS cnet, nvm file, " << "match files.\n"); if (opt.transform_cameras_using_gcp && (!inline_adjustments) && (opt.camera_type != BaCameraType_Pinhole)) { vw::vw_throw(vw::ArgumentErr() << "Transforming cameras using GCP works only for pinhole " << "cameras and with the --inline-adjustments flag.\n"); } if (opt.overlap_list_file != "" && opt.overlap_limit > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both the overlap limit and the overlap list.\n"); if (opt.overlap_list_file != "" && opt.match_first_to_last > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both the overlap limit and --match-first-to-last.\n"); if (opt.overlap_limit < 0) vw::vw_throw(vw::ArgumentErr() << "Must allow search for matches between " << "at least each image and its subsequent one.\n"); if (int(opt.overlap_list_file != "") + int(!vm["auto-overlap-buffer"].defaulted()) + int(opt.auto_overlap_params != "") + int(opt.overlap_limit > 0) > 1) vw::vw_throw(vw::ArgumentErr() << "Cannot specify more than one of --overlap-list, " << "--auto-overlap-params, --overlap-limit, and --auto-overlap-buffer.\n"); // By default, try to match all of the images if (opt.overlap_limit == 0) opt.overlap_limit = opt.image_files.size(); opt.have_overlap_list = false; if (opt.overlap_list_file != "") { opt.have_overlap_list = true; if (!fs::exists(opt.overlap_list_file)) vw::vw_throw(vw::ArgumentErr() << "The overlap list does not exist.\n"); opt.overlap_list.clear(); std::string image1, image2; std::ifstream ifs(opt.overlap_list_file.c_str()); while (ifs >> image1 >> image2) { opt.overlap_list.insert(std::make_pair(image1, image2)); opt.overlap_list.insert(std::make_pair(image2, image1)); } ifs.close(); } else if (!vm["auto-overlap-buffer"].defaulted()) { opt.have_overlap_list = true; auto_build_overlap_list(opt, opt.auto_overlap_buffer); } // The third alternative, --auto-overlap-params will be handled when we have cameras if (opt.camera_weight < 0.0) vw::vw_throw(vw::ArgumentErr() << "The camera weight must be non-negative.\n"); if (opt.rotation_weight < 0.0) vw::vw_throw(vw::ArgumentErr() << "The rotation weight must be non-negative.\n"); if (opt.camera_position_weight < 0.0) vw::vw_throw(vw::ArgumentErr() << "The camera position weight must be non-negative.\n"); if (opt.tri_weight < 0.0) vw::vw_throw(vw::ArgumentErr() << "The triangulation weight must be non-negative.\n"); // NOTE(oalexan1): The reason min_triangulation_angle cannot be 0 is deep inside // StereoModel.cc. Better keep it this way than make too many changes there. if (opt.min_triangulation_angle <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The minimum triangulation angle must be positive.\n"); // TODO: Make sure the normal model loading catches this error. //if (opt.create_pinhole && !vw::has_pinhole_extension(opt.camera_files[0])) // vw::vw_throw(vw::ArgumentErr() // << "Cannot use special pinhole handling with non-pinhole input!\n"); if ((opt.camera_type == BaCameraType_Other) && opt.solve_intrinsics) vw::vw_throw(vw::ArgumentErr() << "Solving for intrinsic parameters is only supported with " << "pinhole, optical bar, and CSM cameras.\n"); if ((opt.camera_type!=BaCameraType_Pinhole) && opt.approximate_pinhole_intrinsics) vw::vw_throw(vw::ArgumentErr() << "Cannot approximate intrinsics unless using pinhole cameras.\n"); if (opt.approximate_pinhole_intrinsics && opt.solve_intrinsics) vw::vw_throw(vw::ArgumentErr() << "Cannot approximate intrinsics while solving for them.\n"); if (opt.camera_type != BaCameraType_Other && opt.camera_type != BaCameraType_Pinhole && opt.camera_type != BaCameraType_CSM && opt.input_prefix != "") vw::vw_throw(vw::ArgumentErr() << "Can only use initial adjustments with camera type " << "'pinhole', 'csm', or 'other'. Here likely having optical bar cameras.\n"); vw::string_replace(opt.remove_outliers_params_str, ",", " "); // replace any commas opt.remove_outliers_params = vw::str_to_vec<vw::Vector<double, 4>>(opt.remove_outliers_params_str); // Ensure good order if (opt.lon_lat_limit != vw::BBox2(0,0,0,0)) { if (opt.lon_lat_limit.min().y() > opt.lon_lat_limit.max().y()) std::swap(opt.lon_lat_limit.min().y(), opt.lon_lat_limit.max().y()); if (opt.lon_lat_limit.min().x() > opt.lon_lat_limit.max().x()) std::swap(opt.lon_lat_limit.min().x(), opt.lon_lat_limit.max().x()); } if (!opt.camera_position_file.empty() && opt.csv_format_str == "") vw::vw_throw(vw::ArgumentErr() << "When using a camera position file, the csv-format " << "option must be set.\n"); if (opt.max_pairwise_matches < 0) vw::vw_throw(vw::ArgumentErr() << "The value of --max-pairwise-matches must be non-negative.\n"); if (opt.max_pairwise_matches == 0) vw::vw_out(vw::WarningMessage) << "Setting --max-pairwise-matches to 0 will result in no matches being " << "loaded. Only GCP will constrain the solution.\n"; // Copy the IP settings to the global stereo_settings() object opt.copy_to_asp_settings(); // Try to infer the datum, if possible, from the images. For // example, Cartosat-1 has that info in the Tif file. bool have_datum = false; // For pinhole session the guessed datum may be unreliable, so warn only bool warn_only = (opt.stereo_session.find("pinhole") != std::string::npos); vw::cartography::GeoReference georef; for (size_t it = 0; it < opt.image_files.size(); it++) { bool is_good = vw::cartography::read_georeference(georef, opt.image_files[it]); // Must check the consistency of the datums if (is_good && have_datum) vw::checkDatumConsistency(opt.datum, georef.datum(), warn_only); if (is_good && !have_datum) { opt.datum = georef.datum(); opt.datum_str = opt.datum.name(); have_datum = true; } } // Try to infer the datum from the reference terrain if (opt.reference_terrain != "") { std::string file_type = asp::get_cloud_type(opt.reference_terrain); if (file_type == "DEM") { vw::cartography::GeoReference georef; bool is_good = vw::cartography::read_georeference(georef, opt.reference_terrain); if (!is_good) vw::vw_throw(vw::ArgumentErr() << "The reference terrain DEM does not have a georeference.\n"); // Ensure the datum read from the DEM agrees with the one from the cameras/user if (is_good && have_datum) vw::checkDatumConsistency(opt.datum, georef.datum(), warn_only); if (opt.datum_str == "") { opt.datum = georef.datum(); opt.datum_str = opt.datum.name(); have_datum = true; } } } if (opt.robust_threshold <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The value of --robust-threshold must be positive.\n"); if (opt.tri_robust_threshold <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The value of --tri-robust-threshold must be positive.\n"); if (opt.camera_position_robust_threshold <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The value of --camera-position-robust-threshold " << "must be positive.\n"); // This is a bug fix. The user by mistake passed in an empty height-from-dem string. if (!vm["heights-from-dem"].defaulted() && opt.heights_from_dem.empty()) vw::vw_throw(vw::ArgumentErr() << "The value of --heights-from-dem is empty. " << "Then it must not be set at all.\n"); if (!vm["heights-from-dem-uncertainty"].defaulted() && vm["heights-from-dem"].defaulted()) vw::vw_throw(vw::ArgumentErr() << "The value of --heights-from-dem-uncertainty is set, " << "but --heights-from-dem is not set.\n"); if (!vm["heights-from-dem"].defaulted() && opt.heights_from_dem_uncertainty <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The value of --heights-from-dem-uncertainty must be " << "positive.\n"); if (opt.heights_from_dem_robust_threshold <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The value of --heights-from-robust-threshold must be " << "positive.\n"); bool have_dem = (!opt.heights_from_dem.empty()); // Try to infer the datum from the heights-from-dem std::string dem_file; if (opt.heights_from_dem != "") dem_file = opt.heights_from_dem; if (dem_file != "") { std::string file_type = asp::get_cloud_type(dem_file); if (file_type == "DEM") { vw::cartography::GeoReference georef; bool is_good = vw::cartography::read_georeference(georef, dem_file); if (!is_good) vw::vw_throw(vw::ArgumentErr() << "The DEM " << dem_file << " does not have a georeference.\n"); // Must check the consistency of the datums if (have_datum) vw::checkDatumConsistency(opt.datum, georef.datum(), warn_only); if (opt.datum_str == "") { opt.datum = georef.datum(); opt.datum_str = opt.datum.name(); have_datum = true; } } } // Set the datum, either based on what the user specified or the axes vw::cartography::Datum user_datum; bool have_user_datum = false; if (opt.datum_str != "") { try { user_datum.set_well_known_datum(opt.datum_str); have_user_datum = true; } catch(...) { // Whatever datum name we had, it was bad, so we'll make more attempts below opt.datum_str = ""; have_user_datum = false; } } else if (opt.semi_major > 0 && opt.semi_minor > 0) { // Otherwise, if the user set the semi-axes, use that. user_datum = vw::cartography::Datum("User Specified Datum", "User Specified Spheroid", "Reference Meridian", opt.semi_major, opt.semi_minor, 0.0); have_user_datum = true; } // Must check the consistency of the datums if (have_datum && have_user_datum) vw::checkDatumConsistency(opt.datum, user_datum, warn_only); if (!have_datum && have_user_datum) { opt.datum = user_datum; have_datum = true; } if (opt.datum_str.empty() && have_datum) opt.datum_str = opt.datum.name(); // Try to find the datum from the cameras. vw::cartography::Datum cam_datum; bool have_cam_datum = asp::datum_from_camera(opt.image_files[0], opt.camera_files[0], // Outputs opt.stereo_session, session, cam_datum); // Must check the consistency of the datums. Skip that for pinhole cameras // if we already have a prior datum, as the result of that could be wrong // and it would just confuse the user. bool have_pinhole = (opt.stereo_session.find("pinhole") != std::string::npos); if (have_cam_datum && have_datum && !have_pinhole) vw::checkDatumConsistency(opt.datum, cam_datum, have_pinhole); // Otherwise try to set the datum based on cameras. It will not work for Pinhole. if (!have_datum && have_cam_datum) { opt.datum = cam_datum; opt.datum_str = opt.datum.name(); have_datum = true; } // Many times the datum is mandatory if (!have_datum) { if (!opt.gcp_files.empty() || !opt.camera_position_file.empty()) vw::vw_throw(vw::ArgumentErr() << "When ground control points or a camera position " << "file are used, option --datum must be specified.\n"); if (opt.elevation_limit[0] < opt.elevation_limit[1]) vw::vw_throw(vw::ArgumentErr() << "When filtering by elevation limit, option --datum must be specified.\n"); } if (have_datum) vw::vw_out() << "Datum:\n" << opt.datum << "\n"; else vw::vw_out() << "No datum specified or detected.\n"; if (opt.apply_initial_transform_only && opt.initial_transform_file == "") vw::vw_throw(vw::IOErr() << "Cannot use --apply-initial-transform-only " << "without --initial-transform.\n"); if (opt.apply_initial_transform_only) { if (opt.solve_intrinsics) { vw::vw_out() << "Not solving for intrinsics, as --apply-initial-transform-only " << "was set.\n"; opt.solve_intrinsics = false; } } if (opt.initial_transform_file != "") { vw::vw_out() << "Reading the alignment transform from: " << opt.initial_transform_file << "\n"; vw::read_matrix_as_txt(opt.initial_transform_file, opt.initial_transform); if (opt.initial_transform.cols() != 4 || opt.initial_transform.rows() != 4) vw::vw_throw(vw::ArgumentErr() << "Could not read the initial transform.\n"); vw::vw_out() << "Initial transform:\n" << opt.initial_transform << "\n"; } // Parse the indices of cameras not to float if (opt.fixed_cameras_indices_str != "") { opt.fixed_cameras_indices.clear(); std::istringstream is(opt.fixed_cameras_indices_str); int val; while (is >> val) { opt.fixed_cameras_indices.insert(val); if (val < 0 || val >= (int)opt.image_files.size()) vw::vw_throw(vw::IOErr() << "The camera index to keep fixed " << val << " is out of bounds.\n"); } } if (!opt.fixed_cameras_indices.empty() && !opt.fixed_image_list_str.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --fixed-camera-indices and " << "--fixed-image-list.\n"); if (!opt.fixed_image_list_str.empty()) { opt.fixed_cameras_indices.clear(); std::vector<std::string> fixed_images; asp::read_list(opt.fixed_image_list_str, fixed_images); // Find the indices of all images std::map<std::string, int> all_indices; for (size_t image_it = 0; image_it < opt.image_files.size(); image_it++) all_indices[opt.image_files[image_it]] = image_it; // Find the indices of images to fix for (size_t image_it = 0; image_it < fixed_images.size(); image_it++) { auto map_it = all_indices.find(fixed_images[image_it]); if (map_it == all_indices.end()) vw::vw_throw(vw::ArgumentErr() << "Could not find image " << fixed_images[image_it] << " read via --fixed-image-list among the input images.\n"); opt.fixed_cameras_indices.insert(map_it->second); } } // Handle fixed distortion indices std::string sep = ","; auto v = vw::str_to_std_vec(opt.fixed_distortion_indices_str, sep); // Copy from doubles to int opt.fixed_distortion_indices.clear(); for (size_t i = 0; i < v.size(); i++) { if (int(v[i]) != v[i]) vw::vw_throw(vw::ArgumentErr() << "The distortion indices to keep fixed must be integers.\n"); opt.fixed_distortion_indices.push_back(int(v[i])); } // Sanity check for (size_t i = 0; i < opt.fixed_distortion_indices.size(); i++) { if (opt.fixed_distortion_indices[i] < 0) vw::vw_throw(vw::ArgumentErr() << "The distortion indices to keep fixed must be non-negative.\n"); } // Non-empty fixed_distortion_indices only makes sense when solving for intrinsics if (!opt.fixed_distortion_indices.empty() && !opt.solve_intrinsics) vw::vw_throw(vw::ArgumentErr() << "The option --fixed-distortion-indices requires " << "the option --solve-intrinsics.\n"); if (opt.reference_terrain != "") { std::string file_type = asp::get_cloud_type(opt.reference_terrain); if (file_type == "CSV" && opt.csv_format_str == "") vw::vw_throw(vw::ArgumentErr() << "When using a csv reference terrain, " << "must specify the csv-format.\n"); if (!have_datum) vw::vw_throw(vw::ArgumentErr() << "When using a reference terrain, must specify the datum.\n"); if (opt.disparity_list == "") vw::vw_throw(vw::ArgumentErr() << "When using a reference terrain, must specify a list " << "of disparities.\n"); if (opt.max_disp_error <= 0) vw::vw_throw(vw::ArgumentErr() << "Must specify --max-disp-error in pixels as a positive value.\n"); if (opt.reference_terrain_weight < 0) vw::vw_throw(vw::ArgumentErr() << "The value of --reference-terrain-weight must be non-negative.\n"); } if (opt.match_files_prefix != "" && opt.clean_match_files_prefix != "") vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --match-files-prefix and " << "--clean-match-files-prefix.\n"); if (int(opt.proj_win != vw::BBox2(0, 0, 0, 0)) + int(!opt.proj_str.empty()) == 1) vw::vw_throw(vw::ArgumentErr() << "Must specify both or neither of --proj-win and --proj-str.\n"); if (int(opt.transform_cameras_using_gcp) + int(opt.transform_cameras_with_shared_gcp) + int(opt.init_camera_using_gcp) > 1) vw::vw_throw(vw::ArgumentErr() << "Cannot specify more than one of --transform-cameras-using-gcp, " << "--transform-cameras-with-shared-gcp, --init-camera-using-gcp.\n"); if (opt.propagate_errors && !have_datum) vw::vw_throw(vw::ArgumentErr() << "Cannot propagate errors without a datum. Set --datum.\n"); if (opt.update_isis_cubes_with_csm_state) { // This must happen after the session was auto-detected. bool have_csm = (opt.stereo_session == "csm"); bool have_cub_input = boost::iends_with(boost::to_lower_copy(opt.image_files[0]), ".cub"); if (!have_csm || !have_cub_input) vw::vw_throw(vw::ArgumentErr() << "Cannot update ISIS cubes with CSM state " << "unless using the CSM session with ISIS .cub images.\n"); } // Prepare for computing footprints of images. Do this before loading all // cameras, which can take time. So fail early if things are not working. opt.pct_for_overlap = -1.0; if (opt.auto_overlap_params != "") { std::istringstream is(opt.auto_overlap_params); if (!(is >> opt.dem_file_for_overlap >> opt.pct_for_overlap)) vw::vw_throw(vw::ArgumentErr() << "Could not parse correctly option --auto-overlap-params.\n"); // Can also keep track of how many images to overlap with opt.overlap_limit = opt.image_files.size(); int val = 0; if (is >> val) opt.overlap_limit = val; try { vw::DiskImageView<float> dem(opt.dem_file_for_overlap); } catch (const vw::Exception& e) { vw::vw_throw(vw::ArgumentErr() << "Could not load DEM: " << opt.dem_file_for_overlap << "\n"); } if (opt.pct_for_overlap < 0 || opt.overlap_limit < 0) vw::vw_throw(vw::ArgumentErr() << "Invalid value for --auto-overlap-params.\n"); } // If opt.camera_position_uncertainty is non-empty, read this file. It // has the image name and the uncertainty in the camera position. bool have_camera_position_uncertainty = !opt.camera_position_uncertainty_str.empty(); if (have_camera_position_uncertainty) asp::handleCameraPositionUncertainty(opt, have_datum); // Set camera weight to 0 if camera position weight is positive if (opt.camera_position_weight > 0) { if (opt.camera_weight > 0) { vw::vw_out() << "Setting --camera-weight to 0 as --camera-position-weight " << "is positive.\n"; opt.camera_weight = 0; } } if (opt.use_llh_error && !have_datum) vw::vw_throw(vw::ArgumentErr() << "Cannot use --use-lon-lat-height-gcp-error without a datum. Set --datum.\n"); if ((opt.calc_normalization_bounds || opt.calc_ip) && (opt.stop_after_stats || opt.stop_after_matching)) vw::vw_throw(vw::ArgumentErr() << "Cannot use --calc-normalization-bounds or --calc-ip with " << "--stop-after-stats or --stop-after-matching.\n"); // Handle bathy options asp::bathyChecks(session->name(), asp::stereo_settings(), opt.image_files.size()); if (asp::doBathy(asp::stereo_settings())) asp::readBathyData(opt.image_files.size(), asp::stereo_settings().bathy_mask_list, asp::stereo_settings().bathy_plane, asp::stereo_settings().bathy_plane_list, asp::stereo_settings().refraction_index, opt.bathy_data); return; } // Process the bundle_adjust options and sanity checks void handleBaArgs(int argc, char *argv[], asp::BaOptions& opt) { const double nan = std::numeric_limits<double>::quiet_NaN(); std::string intrinsics_to_float_str, intrinsics_to_share_str, intrinsics_limit_str; bool inline_adjustments = false; int max_iterations_tmp = -1; po::options_description general_options(""); general_options.add_options() ("output-prefix,o", po::value(&opt.out_prefix), "Prefix for output filenames.") ("cost-function", po::value(&opt.cost_function)->default_value("Cauchy"), "Choose a cost function from: Cauchy, PseudoHuber, Huber, L1, L2, Trivial.") ("robust-threshold", po::value(&opt.robust_threshold)->default_value(0.5), "Set the threshold for robust cost functions. Increasing this makes the solver focus harder on the larger errors.") ("inline-adjustments", po::bool_switch(&inline_adjustments)->default_value(false), "If this is set, and the input cameras are of the pinhole or panoramic type, apply " "the adjustments directly to the cameras, rather than saving them separately as " ".adjust files.") ("approximate-pinhole-intrinsics", po::bool_switch(&opt.approximate_pinhole_intrinsics)->default_value(false), "If it reduces computation time, approximate the lens distortion model.") ("solve-intrinsics", po::bool_switch(&opt.solve_intrinsics)->default_value(false)->implicit_value(true), "Optimize intrinsic camera parameters. Only used for pinhole, optical bar, and CSM " "(frame and linescan) cameras. This implies --inline-adjustments.") ("intrinsics-to-float", po::value(&intrinsics_to_float_str)->default_value(""), "If solving for intrinsics and is desired to float only a few of them, specify here, " "in quotes, one or more of: focal_length, optical_center, other_intrinsics " "(distortion). Not specifying anything will float all of them. Also can specify 'all' " "or 'none'. See the documentation for when intrinsics are optimized per sensor.") ("intrinsics-to-share", po::value(&intrinsics_to_share_str)->default_value(""), "If solving for intrinsics and is desired to share only a few of them across all " "cameras, specify here, in quotes, one or more of: focal_length, optical_center, " "other_intrinsics (distortion). By default all of the intrinsics are shared, so to " "not share any of them pass in an empty string. Also can specify 'all' or 'none'. If " "sharing intrinsics per sensor, this option is ignored, as then the sharing is more " "fine-grained.") ("intrinsics-limits", po::value(&intrinsics_limit_str)->default_value(""), "Specify minimum and maximum ratios for the intrinsic parameters. Values must be in " "min max pairs and are applied in the order [focal length, optical center, other " "intrinsics] until all of the limits are used. Check the documentation to determine " "how many intrinsic parameters are used for your cameras.") ("camera-position-uncertainty", po::value(&opt.camera_position_uncertainty_str)->default_value(""), "A file having on each line the image name and the horizontal and vertical camera " "position uncertainty (1 sigma, in meters). This strongly constrains the movement of " "cameras, potentially at the expense of accuracy. To have the same uncertainties for " "all cameras, pass instead of a file name two values separated by a comma (no " "spaces). See the documentation for an example. See also " "--camera-position-uncertainty-power.") ("camera-position-uncertainty-power", po::value(&opt.camera_position_uncertainty_power)->default_value(2.0), "A higher value makes the cost function rise more steeply when " "--camera-position-uncertainty is close to being violated. This is an advanced " "option. The default should be good enough.") ("camera-positions", po::value(&opt.camera_position_file)->default_value(""), "CSV file containing estimated position of each camera in ECEF coordinates. For this " "to work well the camera must travel not along linear path, as this data will be used " "to find an alignment transform. Only used with the inline-adjustments setting to " "initialize global camera coordinates. If used, the csv-format setting must also be " "set. The 'file' field is searched for strings that are found in the input image " "files to match locations to cameras.") ("init-camera-using-gcp", po::bool_switch(&opt.init_camera_using_gcp)->default_value(false)->implicit_value(true), "Given an image, a pinhole camera lacking correct position and orientation, and a GCP " "file, find the pinhole camera with given intrinsics most consistent with the GCP.") ("transform-cameras-with-shared-gcp", po::bool_switch(&opt.transform_cameras_with_shared_gcp)->default_value(false)->implicit_value(true), "Given at least 3 GCP, with each seen in at least 2 images, find the triangulated " "positions based on pixels values in the GCP, and apply a rotation + translation + " "scale transform to the entire camera system so that the triangulated points get " "mapped to the ground coordinates in the GCP.") ("transform-cameras-using-gcp", po::bool_switch(&opt.transform_cameras_using_gcp)->default_value(false)->implicit_value(true), "Given a set of GCP, with at least two images having at least three GCP each (but " "with each GCP not shared among the images), transform the cameras to ground " "coordinates. This is not as robust as --transform-cameras-with-shared-gcp.") ("disable-pinhole-gcp-init", po::bool_switch(&opt.disable_pinhole_gcp_init)->default_value(false)->implicit_value(true), "Do not try to initialize the positions of pinhole cameras based on input GCPs. This " "ignored as is now the default. See also: --init-camera-using-gcp.") ("input-adjustments-prefix", po::value(&opt.input_prefix), "Prefix to read initial adjustments from, written by a previous invocation of " "this program.") ("initial-transform", po::value(&opt.initial_transform_file)->default_value(""), "Before optimizing the cameras, apply to them the 4x4 rotation + translation transform " "from this file. The transform is in respect to the planet center, such as written by " "pc_align's source-to-reference or reference-to-source alignment transform. Set the " "number of iterations to 0 to stop at this step. If --input-adjustments-prefix is " "specified, the transform gets applied after the adjustments are read.") ("fixed-camera-indices", po::value(&opt.fixed_cameras_indices_str)->default_value(""), "A list of indices, in quotes and starting from 0, with space as separator, corresponding to cameras to keep fixed during the optimization process.") ("fixed-image-list", po::value(&opt.fixed_image_list_str)->default_value(""), "A file having a list of images (separated by spaces or newlines) whose cameras should be fixed during optimization.") ("fix-gcp-xyz", po::bool_switch(&opt.fix_gcp_xyz)->default_value(false)->implicit_value(true), "If the GCP are highly accurate, use this option to not float them during the optimization.") ("csv-format", po::value(&opt.csv_format_str)->default_value(""), asp::csv_opt_caption().c_str()) ("csv-srs", po::value(&opt.csv_srs)->default_value(""), "The PROJ or WKT string for interpreting the entries in input CSV files.") ("reference-terrain", po::value(&opt.reference_terrain)->default_value(""), "An externally provided trustworthy 3D terrain, either as a DEM or as a lidar file, " "very close (after alignment) to the stereo result from the given images and cameras " "that can be used as a reference, to optimize the intrinsics of the " "cameras.") ("max-num-reference-points", po::value(&opt.max_num_reference_points)->default_value(100000000), "Maximum number of (randomly picked) points from the reference terrain to use.") ("disparity-list", po::value(&opt.disparity_list)->default_value(""), "The unaligned disparity files to use when optimizing the intrinsics based on a " "reference terrain. Specify them as a list in quotes separated by spaces. First file " "is for the first two images, second is for the second and third images, etc. If an " "image pair has no disparity file, use 'none'.") ("max-disp-error", po::value(&opt.max_disp_error)->default_value(-1), "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.") ("reference-terrain-weight", po::value(&opt.reference_terrain_weight)->default_value(1.0), "How much weight to give to the cost function terms involving the reference terrain.") ("heights-from-dem", po::value(&opt.heights_from_dem)->default_value(""), "Assuming the cameras have already been bundle-adjusted and aligned to a " "known DEM, constrain the triangulated points to be close to this DEM. See also " "--heights-from-dem-uncertainty.") ("heights-from-dem-uncertainty", po::value(&opt.heights_from_dem_uncertainty)->default_value(-1.0), "The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value " "constrains more the triangulated points to the DEM specified via --heights-from-dem.") ("heights-from-dem-robust-threshold", po::value(&opt.heights_from_dem_robust_threshold)->default_value(0.1), "The robust threshold to use to keep the triangulated points close to the DEM if " "specified via --heights-from-dem. This is applied after the point differences " "are divided by --heights-from-dem-uncertainty. It will attenuate large height " "difference outliers. It is suggested to not modify this value, and adjust instead " "--heights-from-dem-uncertainty.") ("mapproj-dem", po::value(&opt.mapproj_dem)->default_value(""), "If specified, mapproject every pair of matched interest points onto this DEM " "and compute their distance, then percentiles of such distances for each image " "vs the rest and each image pair. This is done after bundle adjustment " "and outlier removal. Measured in meters. Not related to --mapprojected-data.") ("weight-image", po::value(&opt.weight_image)->default_value(""), "Given a georeferenced image with float values, for each initial triangulated " "point find its location in the image and closest pixel value. Multiply the " "reprojection errors in the cameras for this point by this weight value. The solver " "will focus more on optimizing points with a higher weight. Points that fall " "outside the image and weights that are non-positive, NaN, or equal to nodata " "will be ignored.") ("datum", po::value(&opt.datum_str)->default_value(""), "Use this datum. Needed only for ground control points, a camera position file, or " "for RPC sessions. 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).") ("semi-major-axis", po::value(&opt.semi_major)->default_value(0), "Explicitly set the datum semi-major axis in meters (see above).") ("semi-minor-axis", po::value(&opt.semi_minor)->default_value(0), "Explicitly set the datum semi-minor axis in meters (see above).") ("session-type,t", po::value(&opt.stereo_session)->default_value(""), "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.") ("min-matches", po::value(&opt.min_matches)->default_value(5), "Set the minimum number of matches between images that will be considered.") ("max-pairwise-matches", po::value(&opt.max_pairwise_matches)->default_value(10000), "Reduce the number of matches per pair of images to at most this " "number, by selecting a random subset, if needed. This happens " "when setting up the optimization, and before outlier filtering. " "Set to 0 to load no matches (use with GCP only).") ("ip-detect-method", po::value(&opt.ip_detect_method)->default_value(0), "Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.") ("epipolar-threshold", po::value(&opt.epipolar_threshold)->default_value(-1), "Maximum distance from the epipolar line to search for IP matches. Default: automatic calculation. A higher values will result in more matches.") ("ip-inlier-factor", po::value(&opt.ip_inlier_factor)->default_value(0.2), "A higher factor will result in more interest points, but perhaps also more outliers.") ("ip-uniqueness-threshold", po::value(&opt.ip_uniqueness_thresh)->default_value(0.8), "A higher threshold will result in more interest points, but perhaps less unique ones.") ("ip-side-filter-percent", po::value(&opt.ip_edge_buffer_percent)->default_value(-1), "Remove matched IPs this percentage from the image left/right sides.") ("normalize-ip-tiles", po::bool_switch(&opt.ip_normalize_tiles)->default_value(false)->implicit_value(true), "Individually normalize tiles used for IP detection.") ("num-obalog-scales", po::value(&opt.num_scales)->default_value(-1), "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.") ("nodata-value", po::value(&opt.nodata_value)->default_value(nan), "Pixels with values less than or equal to this number are treated as no-data. This overrides the no-data values from input images.") ("num-iterations", po::value(&opt.num_iterations)->default_value(1000), "Set the maximum number of iterations.") ("max-iterations", po::value(&max_iterations_tmp)->default_value(1000), "Set the maximum number of iterations.") // alias for num-iterations ("parameter-tolerance", po::value(&opt.parameter_tolerance)->default_value(1e-8), "Stop when the relative error in the variables being optimized is less than this. " "When --solve-intrinsics is used, the default is 1e-12.") ("overlap-limit", po::value(&opt.overlap_limit)->default_value(0), "Limit the number of subsequent images to search for matches to the current image to this value. By default match all images.") ("overlap-list", po::value(&opt.overlap_list_file)->default_value(""), "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.") ("auto-overlap-params", po::value(&opt.auto_overlap_params)->default_value(""), "Determine which camera images overlap by finding the bounding boxes of their ground " "footprints given the specified DEM, expanding them by a given percentage, and see if " "those intersect. A higher percentage should be used when there is more uncertainty " "about the input camera poses. As of the 10/2025 build, a third parameter can be " "provided to limit the number of subsequent images that overlap to this many. " "Example: 'dem.tif 15.0 6'. Using this with --mapprojected-data will restrict the " "matching only to the ground-level overlap regions (expanded by this percentage). As " "of the 10/2025 build, this works also with --match-first-to-last.") ("auto-overlap-buffer", po::value(&opt.auto_overlap_buffer)->default_value(-1.0), "Try to automatically determine which images overlap. Used only if " "this option is explicitly set. Only supports Worldview style XML " "camera files. The lon-lat footprints of the cameras are expanded " "outwards on all sides by this value (in degrees), before checking " "if they intersect.") ("image-list", po::value(&opt.image_list)->default_value(""), "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.") ("camera-list", po::value(&opt.camera_list)->default_value(""), "A file containing the list of cameras, when they are too many to specify on " "the command line. If the images have embedded camera information, such as for ISIS, " "this file may be omitted, or specify the image names instead of camera names.") ("mapprojected-data-list", po::value(&opt.mapprojected_data_list)->default_value(""), "A file containing the list of mapprojected images and the DEM " "(see --mapprojected-data), when they are too many to specify on the command line. " "The DEM is optional (since the 1/2026 build) if it can be looked up in the " "geoheaders of the mapprojected images. If provided, the DEM must be the last entry.") ("position-filter-dist", po::value(&opt.position_filter_dist)->default_value(-1), "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.") ("match-first-to-last", po::bool_switch(&opt.match_first_to_last)->default_value(false)->implicit_value(true), "Match the first several images to last several images by extending the logic of " "--overlap-limit past the last image to the earliest ones. As of the 10/2025 build, " "this works also with --auto-overlap-params.") ("camera-position-weight", po::value(&opt.camera_position_weight)->default_value(0.0), "A soft constraint to keep the camera positions close to the original values. " "It is meant to prevent a wholesale shift of the cameras. It can impede " "the reduction in reprojection errors. It adjusts to the ground sample distance " "and the number of interest points in the images. The computed " "discrepancy is attenuated with --camera-position-robust-threshold. " "See --camera-position-uncertainty for a hard constraint.") ("camera-position-robust-threshold", po::value(&opt.camera_position_robust_threshold)->default_value(0.1), "The robust threshold to attenuate large discrepancies between initial and optimized " "camera positions with the option --camera-position-weight. This is less than " "--robust-threshold, as the primary goal is to reduce pixel reprojection errors, even " "if that results in big differences in the camera positions. It is suggested to not " "modify this value, and adjust instead --camera-position-weight.") ("rotation-weight", po::value(&opt.rotation_weight)->default_value(0.0), "A higher weight will penalize more rotation deviations from the original " "configuration.") ("camera-weight", po::value(&opt.camera_weight)->default_value(0.0), "The weight to give to the constraint that the camera positions/orientations " "stay close to the original values. A higher weight means that the values will " "change less. This option is deprecated. Use instead --camera-position-weight " "and --tri-weight.") ("tri-weight", po::value(&opt.tri_weight)->default_value(0.1), "The weight to give to the constraint that optimized triangulated points stay " "close to original triangulated points. A positive value will help ensure the " "cameras do not move too far, but a large value may prevent convergence. It is " "suggested to use here 0.1 to 0.5. This will be divided by ground sample distance " "(GSD) to convert this constraint to pixel units, since the reprojection errors " "are in pixels. See also --tri-robust-threshold. Does not apply to GCP or points " "constrained by a DEM.") ("tri-robust-threshold", po::value(&opt.tri_robust_threshold)->default_value(0.1), "The robust threshold to attenuate large differences between initial and optimized " "triangulation points, after multiplying them by --tri-weight and dividing by GSD. " "This is less than --robust-threshold, as the primary goal is to reduce pixel " "reprojection errors, even if that results in big differences in the triangulated " "points. It is suggested to not modify this value, and adjust instead --tri-weight.") ("isis-cnet", po::value(&opt.isis_cnet)->default_value(""), "Read a control network having interest point matches from this binary file " "in the ISIS jigsaw format. This can be used with any images and cameras " "supported by ASP. For Pinhole cameras, the (optimized) camera poses will be " "read/written to NVM as well. See also --output-cnet-type.") ("nvm", po::value(&opt.nvm)->default_value(""), "Read a control network having interest point matches from this file in the NVM " "format. This can be used with any images and cameras supported by ASP. For Pinhole " "or CSM frame cameras, the (optimized) camera poses will be read from / written to " "NVM as well. See also --output-cnet-type, --no-poses-from-nvm.") ("output-cnet-type", po::value(&opt.output_cnet_type)->default_value(""), "The format in which to save the control network of interest point matches. " "Options: 'match-files' (match files in ASP's format), 'isis-cnet' (ISIS " "jigsaw format), 'nvm' (plain text VisualSfM NVM format). If not set, the same " "format as for the input is used.") ("no-poses-from-nvm", po::bool_switch(&opt.no_poses_from_nvm)->default_value(false)->implicit_value(true), "Do not read the camera poses from the NVM file or write them to such a file. " "Applicable only with the option --nvm and Pinhole camera models.") ("overlap-exponent", po::value(&opt.overlap_exponent)->default_value(0.0), "If a feature is seen in n >= 2 images, give it a weight proportional with " "(n-1)^exponent.") ("ip-per-tile", po::value(&opt.ip_per_tile)->default_value(0), "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.") ("ip-per-image", po::value(&opt.ip_per_image)->default_value(0), "How many interest points to detect in each image (default: automatic determination). " "Can set either this or --ip-per-tile.") ("num-passes", po::value(&opt.num_passes)->default_value(2), "How many passes of bundle adjustment to do, with given number of iterations in each " "pass. For more than one pass, outliers will be removed between passes using " "--remove-outliers-params, and re-optimization will take place. Residual files and a " "copy of the match files with the outliers removed (*-clean.match) will be written to " "disk.") ("num-random-passes", po::value(&opt.num_random_passes)->default_value(0), "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.") ("remove-outliers-params", po::value(&opt.remove_outliers_params_str)->default_value("75.0 3.0 5.0 8.0", "'pct factor err1 err2'"), "Outlier removal based on percentage, when more than one bundle adjustment pass is " "used. Triangulated points (that are not GCP) with reprojection error in pixels " "larger than min(max('pct'-th percentile * 'factor', err1), err2) will be removed as " "outliers. Hence, never remove errors smaller than err1 but always remove those " "bigger than err2. Specify as a list in quotes. Also remove outliers based on " "distribution of interest point matches and triangulated points.") ("max-gcp-reproj-err", po::value(&opt.max_gcp_reproj_err)->default_value(-1.0), "If positive, after each pass remove GCP whose mean reprojection error " "(averaged over all cameras seeing that point) is more than this, in pixels.") ("elevation-limit", po::value(&opt.elevation_limit)->default_value(vw::Vector2(0,0), "auto"), "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.") // Note that we count later on the default for lon_lat_limit being BBox2(0,0,0,0). ("lon-lat-limit", po::value(&opt.lon_lat_limit)->default_value(vw::BBox2(0,0,0,0), "auto"), "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.") ("match-files-prefix", po::value(&opt.match_files_prefix)->default_value(""), "Use the match files from this prefix instead of the current output prefix. See the " "naming convention in the documentation. This implies --skip-matching. The order of " "images in each interest point match file need not be the same as for input images. " "See also --clean-match-files-prefix. Only one of these two options can be specified.") ("clean-match-files-prefix", po::value(&opt.clean_match_files_prefix)->default_value(""), "Use as input the *-clean.match files with this prefix (this had the " "outliers filtered out by bundle_adjust). See also --match-files-prefix.") ("update-isis-cubes-with-csm-state", po::bool_switch(&opt.update_isis_cubes_with_csm_state)->default_value(false)->implicit_value(true), "Save the model state of optimized CSM cameras as part of the .cub files. Any prior " "version and any SPICE data will be deleted. Mapprojected images obtained with prior " "version of the cameras must no longer be used in stereo.") ("save-adjusted-rpc", po::bool_switch(&opt.save_adjusted_rpc)->default_value(false)->implicit_value(true), "In addition to external adjustments to the input cameras, save RPC cameras with " "the adjustments applied to them, in XML format. This recomputes the RPC models.") ("enable-rough-homography", po::bool_switch(&opt.enable_rough_homography)->default_value(false)->implicit_value(true), "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.") ("skip-rough-homography", po::bool_switch(&opt.skip_rough_homography)->default_value(false)->implicit_value(true), "Skip the step of performing datum-based rough homography. This obsolete option is ignored as is the default.") ("enable-tri-ip-filter", po::bool_switch(&opt.enable_tri_filtering)->default_value(false)->implicit_value(true), "Enable triangulation-based interest points filtering. This is best used with reasonably reliable input cameras.") ("disable-tri-ip-filter", po::bool_switch(&opt.disable_tri_filtering)->default_value(false)->implicit_value(true), "Disable triangulation-based interest points filtering. This obsolete option is ignored as is the default.") ("no-datum", po::bool_switch(&opt.no_datum)->default_value(false)->implicit_value(true), "Do not assume a reliable datum exists, such as for irregularly shaped bodies.") ("individually-normalize", po::bool_switch(&opt.individually_normalize)->default_value(false)->implicit_value(true), "Individually normalize the input images instead of using common values.") ("ip-triangulation-max-error", po::value(&opt.ip_triangulation_max_error)->default_value(-1), "When matching IP, filter out any pairs with a triangulation error higher than this.") ("ip-num-ransac-iterations", po::value(&opt.ip_num_ransac_iterations)->default_value(1000), "How many RANSAC iterations to do in interest point matching.") ("min-triangulation-angle", po::value(&opt.min_triangulation_angle)->default_value(0.1), "Filter as outlier any triangulation point for which all rays converging to " "it have an angle less than this (measured in degrees). This happens on " "loading the match files and after each optimization pass. This should be used " "cautiously with very uncertain input cameras.") ("max-triangulation-angle", po::value(&opt.max_triangulation_angle)->default_value(-1.0), "Filter as outlier any triangulation points for which the maximum angle of rays " "converging to it are more than this (measured in degrees). Set to a positive value.") ("forced-triangulation-distance", po::value(&opt.forced_triangulation_distance)->default_value(-1), "When triangulation fails, for example, when input cameras are inaccurate, " "artificially create a triangulation point this far ahead of the camera, " "in units of meter. Can also set a small --min-triangulation-angle in this case.") ("use-lon-lat-height-gcp-error", po::bool_switch(&opt.use_llh_error)->default_value(false)->implicit_value(true), "When having GCP (or a DEM constraint), constrain the triangulated points in the " "longitude, latitude, and height space, instead of ECEF. The standard deviations " "in the GCP file (or DEM uncertainty) are applied accordingly.") ("mapprojected-data", po::value(&opt.mapprojected_data)->default_value(""), "Given map-projected versions of the input images and the DEM they were mapprojected " "onto, create interest point matches between the mapprojected images. Unproject and " "save those matches, then continue with bundle adjustment. Existing match files will " "be reused. Specify the mapprojected images and the DEM as a string in quotes, " "separated by spaces. The DEM is optional (since the 1/2026 build) if it can be " "looked up in the geoheaders of the mapprojected images. If provided, the DEM must " "be the last file. It is suggested to use this with --auto-overlap-params.") ("matches-per-tile", po::value(&opt.matches_per_tile)->default_value(0), "How many interest point matches to compute in each image tile (of size " "normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger " "than this. See also --matches-per-tile-params.") ("save-cnet-as-gcp", po::bool_switch(&opt.save_cnet_as_gcp)->default_value(false)->implicit_value(true), "Save the optimized control network, after outlier filtering, in the " "format used by ground control points (GCP), including any input GCP. " "The xyz sigma is 1 meter for regular non-GCP triangulated points and the " "value of --heights-from-dem-uncertainty for DEM-constrained points.") ("num-parallel-jobs", po::value(&opt.num_parallel_jobs)->default_value(1), "The number of bundle_adjustment processes being run in parallel over all nodes.") ("job-id", po::value(&opt.job_id)->default_value(0), "The id of this parallel bundle adjustment job.") ("force-reuse-match-files", po::bool_switch(&opt.force_reuse_match_files)->default_value(false)->implicit_value(true), "Force reusing the match files even if older than the images or cameras. " "Then the order of images in each interest point match file need not be the same " "as for input images. Additional match files will be created if needed.") ("skip-matching", po::bool_switch(&opt.skip_matching)->default_value(false)->implicit_value(true), "Only use the match files that can be loaded from disk. This implies --force-reuse-match-files.") ("matches-as-txt", po::bool_switch(&asp::stereo_settings().matches_as_txt)->default_value(false)->implicit_value(true), "Read and write match files as plain text instead of binary. See the documentation for details.") ("save-intermediate-cameras", po::bool_switch(&opt.save_intermediate_cameras)->default_value(false)->implicit_value(true), "Save the values for the cameras at each iteration.") ("apply-initial-transform-only", po::bool_switch(&opt.apply_initial_transform_only)->default_value(false)->implicit_value(true), "Apply to the cameras the transform given by --initial-transform. " "No iterations, GCP loading, image matching, or report generation " "take place. Using --num-iterations 0 and without this option " "will create those.") ("proj-win", po::value(&opt.proj_win)->default_value(vw::BBox2(0,0,0,0), "auto"), "Flag as outliers input triangulated points not in this proj win (box in projected " "units as provided by --proj_str). This should be generous if the input cameras have " "significant errors.") ("proj-str", po::value(&opt.proj_str)->default_value(""), "To be used in conjunction with --proj-win.") ("matches-per-tile-params", po::value(&opt.matches_per_tile_params)->default_value(vw::Vector2(1024, 1280), "1024 1280"), "To be used with --matches-per-tile. The first value is the image tile size for both " "images. A larger second value allows each right tile to further expand to this size, " "resulting in the tiles overlapping. This may be needed if the homography alignment " "between these images is not great, as this transform is used to pair up left and " "right image tiles.") ("propagate-errors", po::bool_switch(&opt.propagate_errors)->default_value(false)->implicit_value(true), "Propagate the errors from the input cameras to the triangulated points for all pairs " "of match points, and produce a report having the median, mean, standard deviation, " "and number of samples for each camera pair.") ("horizontal-stddev", po::value(&opt.horizontal_stddev)->default_value(0), "If positive, propagate this stddev of horizontal ground plane camera uncertainty " "through triangulation for all cameras. To be used with --propagate-errors.") ("min-distortion", po::value(&opt.min_distortion)->default_value(1e-7), "Distortion parameters that are optimized and that are smaller in magnitude than this " "value are set to this value. This is to ensure the parameters are big enough to be " "optimized. Can be negative. This is affected by --fixed-distortion-indices. Applies " "to Pinhole cameras (all distortion models) and CSM (radial-tangential distortion " "only). Does not apply to optical bar models. See also --fixed-distortion-indices.") ("fixed-distortion-indices", po::value(&opt.fixed_distortion_indices_str)->default_value(""), "A sequence indices, separated by commas (with no spaces) starting from 0, " "corresponding to lens distortion parameters to keep fixed, if --solve-intrinsics is " "invoked. These will not be changed by the --min-distortion setting. Sample input: " "0,3,4. The order of distortion parameters is as saved in output camera files. " "For example, for radial-tangential distortion, the order is k1, k2, p1, p2, k3.") ("flann-method", po::value(&opt.flann_method)->default_value("auto"), "Choose the FLANN method for matching interest points. Options: 'kmeans': " "slower but deterministic, 'kdtree': faster (up to 6x) but not deterministic " "(starting with FLANN 1.9.2). The default ('auto') is to use 'kmeans' for " "25,000 features or less and 'kdtree' otherwise. This does not apply to ORB " "feature matching.") ("csv-proj4", po::value(&opt.csv_proj4_str)->default_value(""), "An alias for --csv-srs, for backward compatibility.") ("save-vwip", po::bool_switch(&opt.save_vwip)->default_value(false)->implicit_value(true), "Save .vwip files (interest point matches per image, before matching). This option " "is currently ignored as .vwip are always saved.") ("ip-nodata-radius", po::value(&opt.ip_nodata_radius)->default_value(4), "Remove IP near nodata with this radius, in pixels.") ("accept-provided-mapproj-dem", po::bool_switch(&asp::stereo_settings().accept_provided_mapproj_dem)->default_value(false)->implicit_value(true), "Accept the DEM provided on the command line as the one mapprojection was done with, " "even if it disagrees with the DEM recorded in the geoheaders of input images.") ("stop-after-statistics", po::bool_switch(&opt.stop_after_stats)->default_value(false)->implicit_value(true), "Quit after computing image statistics.") ("stop-after-matching", po::bool_switch(&opt.stop_after_matching)->default_value(false)->implicit_value(true), "Quit after writing all match files.") ("calc-normalization-bounds", po::bool_switch(&opt.calc_normalization_bounds)->default_value(false)->implicit_value(true), "This is called in parallel_bundle_adjust just once to calculate all image bounds " "for normalization, after statistics were computed by separate processes.") ("calc-ip", po::bool_switch(&opt.calc_ip)->default_value(false)->implicit_value(true), "Compute interest points for each image. This is before interest point matching." "This is called by parallel_bundle_adjust with multiple processes.") ("ip-debug-images", po::bool_switch(&opt.ip_debug_images)->default_value(false)->implicit_value(true), "Write debug images to disk when detecting and matching interest points.") ("query-num-image-pairs", po::bool_switch(&opt.query_num_image_pairs)->default_value(false)->implicit_value(true), "Print how many image pairs need to find matches for, and exit.") // For bathymetry correction ("bathy-mask-list", po::value(&asp::stereo_settings().bathy_mask_list)->default_value(""), "A file having a list of mask files to use for bathymetry. Specify one per line. " "Must be one per input image and 1-to-1 with the images. Pixels classified as " "water must have non-positive value or be no-data in the mask, while land pixels " "must have positive value. This is preliminary work. This program does not yet " "model bathymetry.") ("bathy-plane", po::value(&asp::stereo_settings().bathy_plane), "Path to a file containing a plane approximating the water surface, for " "bathymetry correction with underwater terrain. This corrects camera rays passing " "through water using Snell's law. If multiple images are used and they have " "different water surfaces use --bathy-plane-list. Use together with " "--refraction-index. See also --bathy-mask-list.") ("bathy-plane-list", po::value(&asp::stereo_settings().bathy_plane_list)->default_value(""), "Path to a file containing a list of bathy plane files for bathymetry correction, " "if more than one. Set one plane file per line. Must specify one plane per input " "image, in the same order. Use with --bathy-mask-list and --refraction-index.") ("refraction-index", po::value(&asp::stereo_settings().refraction_index)->default_value(0), "The index of refraction of water to be used in bathymetry correction. " "Must be specified and bigger than 1. This index can be computed with " "the refr_index program.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input-files", po::value(&opt.image_files)); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("<images> <cameras> <optional ground control points> -o <output prefix> [options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Do this check first, as the output prefix is needed to log to file. This // will be triggered when called with no arguments, so print the general // options, which functions as the help message. if (opt.out_prefix.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing the output prefix.\n" << usage << general_options); // Turn on logging to file. Do this early. asp::log_to_file(argc, argv, "", opt.out_prefix); // This is a little clumsy, but need to see whether the user set --max-iterations // or --num-iterations. They are aliases to each other. if (!vm["max-iterations"].defaulted() && !vm["num-iterations"].defaulted()) vw::vw_throw(vw::ArgumentErr() << "Cannot set both --num-iterations and --max-iterations.\n"); if (!vm["max-iterations"].defaulted()) opt.num_iterations = max_iterations_tmp; // Validate the options. This also populates some fields in opt, // such as opt.intrinsics_options.share_intrinsics_per_sensor. asp::loadValidateBaOptions(vm, inline_adjustments, opt); // This better happen here so that do not need to carry all these strings around. // TODO(oalexan1): Merge this into loadValidateBaOptions. load_intrinsics_options(opt.solve_intrinsics, !vm["intrinsics-to-share"].defaulted(), intrinsics_to_float_str, intrinsics_to_share_str, opt.intrinsics_options); asp::parse_intrinsics_limits(intrinsics_limit_str, opt.intrinsics_limits); } } // end namespace asp ================================================ FILE: src/asp/Sessions/BundleAdjustParse.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Parse and validate bundle_adjust options. This makes use of StereoSession so // must be in this directory. #ifndef __ASP_SESSION_BUNDLE_ADJUST_PARSE_H__ #define __ASP_SESSION_BUNDLE_ADJUST_PARSE_H__ #include <asp/Camera/BundleAdjustOptions.h> namespace asp { // Process the bundle_adjust options and sanity checks void handleBaArgs(int argc, char *argv[], asp::BaOptions& opt); } // end namespace asp #endif // __ASP_SESSION_BUNDLE_ADJUST_PARSE_H__ ================================================ FILE: src/asp/Sessions/BundleAdjustSession.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file BundleAdjustSession.cc // Bundle adjustment functions that need StereoSession #include <asp/Core/ImageNormalization.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/FileUtils.h> #include <asp/Camera/BundleAdjustOptions.h> #include <asp/Sessions/BundleAdjustSession.h> #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Cartography/GeoTransform.h> #include <set> namespace asp { using namespace vw; // Create matches among the mapprojected images (or use any such matches created // beforehand manually by the user), and undo the mapprojection. All matches are // saved to files. void matchesFromMapprojImages(int i, int j, asp::BaOptions& opt, asp::SessionPtr session, std::vector<std::string> const& map_files, std::string mapproj_dem, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef<vw::PixelMask<double>> & interp_dem, std::string const& match_filename) { vw::cartography::GeoReference georef1, georef2; vw_out() << "Reading georef from " << map_files[i] << ' ' << map_files[j] << std::endl; bool is_good1 = vw::cartography::read_georeference(georef1, map_files[i]); bool is_good2 = vw::cartography::read_georeference(georef2, map_files[j]); if (!is_good1 || !is_good2) vw_throw(ArgumentErr() << "Error: Cannot read georeference.\n"); std::string image1_path = opt.image_files[i]; std::string image2_path = opt.image_files[j]; if (boost::filesystem::exists(match_filename)) { vw_out() << "Using cached match file: " << match_filename << "\n"; return; } // TODO(oalexan1): What if mapprojection was done with a different camera // model? Such as RPC vs DG? Also must check the DEM and adjust prefix! Same // as when undoing mapprojection during stereo. if (opt.skip_matching) return; // If the match file does not exist, create it. The user can create this manually // too. bool matches_as_txt = asp::stereo_settings().matches_as_txt; std::string map_match_file = ip::match_filename(opt.out_prefix, map_files[i], map_files[j], matches_as_txt); try { asp::matchIp(opt.out_prefix, opt.enable_rough_homography, opt.pct_for_overlap, session, map_files[i], map_files[j], NULL, NULL, // no cameras map_match_file); } catch (const std::exception& e) { vw_out() << "Could not find interest points between images " << map_files[i] << " and " << map_files[j] << std::endl; vw_out(WarningMessage) << e.what() << std::endl; return; } //End try/catch if (!boost::filesystem::exists(map_match_file)) { vw_out() << "Missing: " << map_match_file << "\n"; return; } vw_out() << "Reading: " << map_match_file << std::endl; std::vector<ip::InterestPoint> ip1, ip2; std::vector<ip::InterestPoint> ip1_cam, ip2_cam; ip::read_match_file(map_match_file, ip1, ip2, matches_as_txt); // Undo the map-projection vw::CamPtr left_map_proj_cam, right_map_proj_cam; session->read_mapproj_cams(map_files[i], map_files[j], opt.camera_files[i], opt.camera_files[j], mapproj_dem, session->name(), left_map_proj_cam, right_map_proj_cam); for (size_t ip_iter = 0; ip_iter < ip1.size(); ip_iter++) { vw::ip::InterestPoint P1 = ip1[ip_iter]; vw::ip::InterestPoint P2 = ip2[ip_iter]; if (!asp::projected_ip_to_raw_ip(P1, interp_dem, left_map_proj_cam, georef1, dem_georef)) continue; if (!asp::projected_ip_to_raw_ip(P2, interp_dem, right_map_proj_cam, georef2, dem_georef)) continue; ip1_cam.push_back(P1); ip2_cam.push_back(P2); } vw::vw_out() << "Saving " << ip1_cam.size() << " matches.\n"; vw::vw_out() << "Writing: " << match_filename << std::endl; vw::ip::write_match_file(match_filename, ip1_cam, ip2_cam, matches_as_txt); } // End function matchesFromMapprojImages() void findPairwiseMatches(asp::BaOptions & opt, // will change std::vector<std::string> const& map_files, std::string const& mapproj_dem, std::vector<vw::Vector3> const& estimated_camera_gcc, bool need_no_matches) { bool matches_as_txt = asp::stereo_settings().matches_as_txt; int num_images = opt.image_files.size(); const bool got_est_cam_positions = (estimated_camera_gcc.size() == static_cast<size_t>(num_images)); // When prior matches are used, accept them in any order bool external_matches = (!opt.clean_match_files_prefix.empty() || !opt.match_files_prefix.empty() || opt.skip_matching); // Make a list of all the image pairs to find matches for. When using external // matches, try to read read both image1__image2 and image2__image1 matches. std::vector<std::pair<int,int>> all_pairs; if (!need_no_matches) asp::determineImagePairs(// Inputs opt.overlap_limit, opt.match_first_to_last, external_matches, opt.image_files, got_est_cam_positions, opt.position_filter_dist, estimated_camera_gcc, opt.have_overlap_list, opt.overlap_list, // Output all_pairs); // Need this information in parallel_bundle_adjust for load balancing. if (opt.query_num_image_pairs) { vw::vw_out() << "num_image_pairs," << all_pairs.size() << "\n"; exit(0); } // Assign the pairs (match files) which this job should compute, when called // from parallel_bundle_adjust. TODO(oalexan1): It is hard to understand the // logic here. size_t per_job = all_pairs.size() / opt.num_parallel_jobs; // Round down size_t remainder = all_pairs.size() % opt.num_parallel_jobs; size_t curr_job_start_index = 0, curr_job_num_tasks = 0; for (size_t i = 0; i <= opt.job_id; i++) { curr_job_num_tasks = per_job; if (i < remainder) curr_job_num_tasks++; curr_job_start_index += curr_job_num_tasks; } curr_job_start_index -= curr_job_num_tasks; // Sanity check if (opt.num_parallel_jobs == 1) { if (curr_job_start_index != 0 || curr_job_num_tasks != all_pairs.size()) vw::vw_throw(vw::ArgumentErr() << "Book-keeping failure in bundle_adjust.\n"); } std::vector<std::pair<int,int>> curr_job_pairs; for (size_t i = 0; i < curr_job_num_tasks; i++) curr_job_pairs.push_back(all_pairs[i+curr_job_start_index]); // When using --match-files-prefix or --clean-match-files-prefix, form the // list of match files, rather than searching for them exhaustively on disk, // which can get very slow. std::set<std::string> existing_files; if (external_matches && !need_no_matches) { std::string prefix = asp::matchMultiPrefix(opt.clean_match_files_prefix, opt.match_files_prefix, opt.out_prefix); vw_out() << "Computing the list of existing match files.\n"; asp::listExistingMatchFiles(prefix, matches_as_txt, existing_files); } vw::cartography::GeoReference dem_georef; ImageViewRef<PixelMask<double>> interp_dem; if (mapproj_dem != "") asp::create_interp_dem(mapproj_dem, dem_georef, interp_dem); // Process the selected pairs // TODO(oalexan1): This block must be a function. for (size_t k = 0; k < curr_job_pairs.size(); k++) { if (need_no_matches) continue; const int i = curr_job_pairs[k].first; const int j = curr_job_pairs[k].second; std::string const& image1_path = opt.image_files[i]; // alias std::string const& image2_path = opt.image_files[j]; // alias std::string const& camera1_path = opt.camera_files[i]; // alias std::string const& camera2_path = opt.camera_files[j]; // alias // See if perhaps to load match files from a different source std::string match_file = asp::matchFileMultiPrefix(opt.clean_match_files_prefix, opt.match_files_prefix, opt.out_prefix, image1_path, image2_path, matches_as_txt); // The external match file does not exist, don't try to load it if (external_matches && existing_files.find(match_file) == existing_files.end()) continue; opt.match_files[std::make_pair(i, j)] = match_file; // If we skip matching (which is the case, among other situations, when // using external matches), there's no point in checking if the match // files are recent. bool inputs_changed = false; if (!opt.skip_matching) { inputs_changed = (!asp::first_is_newer(match_file, image1_path, image2_path, camera1_path, camera2_path)); // We make an exception and not rebuild if explicitly asked if (asp::stereo_settings().force_reuse_match_files && boost::filesystem::exists(match_file)) inputs_changed = false; } if (!inputs_changed) { vw_out() << "\t--> Using cached match file: " << match_file << "\n"; continue; } // Read no-data boost::shared_ptr<DiskImageResource> rsrc1(vw::DiskImageResourcePtr(image1_path)), rsrc2(vw::DiskImageResourcePtr(image2_path)); if ((rsrc1->channels() > 1) || (rsrc2->channels() > 1)) vw_throw(ArgumentErr() << "Error: Input images can only have a single channel!\n\n"); float nodata1, nodata2; asp::get_nodata_values(rsrc1, rsrc2, asp::stereo_settings().nodata_value, nodata1, nodata2); // Set up the stereo session asp::SessionPtr session(asp::StereoSessionFactory::create(opt.stereo_session, // may change opt, image1_path, image2_path, camera1_path, camera2_path, opt.out_prefix)); // Find matches between image pairs. This may not always succeed. try { if (opt.mapprojected_data == "") asp::matchIp(opt.out_prefix, opt.enable_rough_homography, opt.pct_for_overlap, session, image1_path, image2_path, opt.camera_models[i].get(), opt.camera_models[j].get(), match_file); else asp::matchesFromMapprojImages(i, j, opt, session, map_files, mapproj_dem, dem_georef, interp_dem, match_file); // Compute the coverage fraction std::vector<ip::InterestPoint> ip1, ip2; ip::read_match_file(match_file, ip1, ip2, matches_as_txt); int right_ip_width = rsrc1->cols() * static_cast<double>(100-opt.ip_edge_buffer_percent)/100.0; Vector2i ip_size(right_ip_width, rsrc1->rows()); double ip_coverage = asp::calc_ip_coverage_fraction(ip2, ip_size); vw_out() << "IP coverage fraction = " << ip_coverage << std::endl; } catch (const std::exception& e) { vw_out() << "Could not find interest points between images " << opt.image_files[i] << " and " << opt.image_files[j] << std::endl; vw_out(WarningMessage) << e.what() << std::endl; } //End try/catch } // End loop through all input image pairs } // end function findPairwiseMatches() } // End namespace asp ================================================ FILE: src/asp/Sessions/BundleAdjustSession.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file BundleAdjustSession.h // Bundle adjustment functions that need StereoSession #ifndef __BUNDLE_ADJUST_SESSION_H__ #define __BUNDLE_ADJUST_SESSION_H__ #include <vw/Cartography/GeoReference.h> #include <vw/Image/ImageViewRef.h> #include <vw/Image/PixelMask.h> #include <boost/shared_ptr.hpp> #include <string> namespace vw { namespace camera { class CameraModel; } } namespace asp { class BaOptions; class StereoSession; typedef boost::shared_ptr<StereoSession> SessionPtr; // Create matches among the mapprojected images (or use any such matches created // beforehand manually by the user), and undo the mapprojection. All matches are // saved to files. void matchesFromMapprojImages(int i, int j, asp::BaOptions& opt, asp::SessionPtr session, std::vector<std::string> const& map_files, std::string mapproj_dem, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef<vw::PixelMask<double>> & interp_dem, std::string const& match_filename); void findPairwiseMatches(asp::BaOptions & opt, // will change std::vector<std::string> const& map_files, std::string const& mapproj_dem, std::vector<vw::Vector3> const& estimated_camera_gcc, bool need_no_matches); } // end namespace asp #endif // __BUNDLE_ADJUST_SESSION_H__ ================================================ FILE: src/asp/Sessions/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspSessions "${ASP_SESSIONS_SRC_FILES}" "${ASP_SESSIONS_TEST_FILES}" "${ASP_SESSIONS_LIB_DEPENDENCIES}") ================================================ FILE: src/asp/Sessions/CameraModelLoader.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraModelLoader.cc /// #include <asp/Core/StereoSettings.h> #include <asp/Camera/CsmModel.h> #include <asp/Camera/LinescanDGModel.h> #include <asp/Camera/LinescanSpotModel.h> #include <asp/Camera/LinescanPeruSatModel.h> #include <asp/Camera/LinescanPleiadesModel.h> #include <asp/Camera/LinescanASTERModel.h> #include <asp/Sessions/CameraModelLoader.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/RPC_XML.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/Equation.h> #include <asp/IsisIO/IsisCameraModel.h> #endif // ASP_HAVE_PKG_ISIS #include <vw/Camera/CameraUtilities.h> #include <vw/Core/Exception.h> #include <vw/Core/Log.h> #include <vw/FileIO/FileUtils.h> #include <vw/Math/EulerAngles.h> #include <vw/Math/Matrix.h> #include <vw/Camera/OpticalBarModel.h> #include <vw/Core/Stopwatch.h> #include <vw/FileIO/FileTypes.h> #include <xercesc/util/PlatformUtils.hpp> #include <boost/date_time/posix_time/posix_time.hpp> #include <map> #include <utility> #include <string> #include <ostream> #include <limits> namespace asp { CameraModelLoader::CameraModelLoader() { xercesc::XMLPlatformUtils::Initialize(); } CameraModelLoader::~CameraModelLoader() { xercesc::XMLPlatformUtils::Terminate(); } boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_pinhole_camera_model(std::string const& path) const { return vw::camera::load_pinhole_camera_model(path); } // Load an RPC camera file // - TODO: Move to another file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_rpc_camera_model(std::string const& path) const { // Try the default loading method RPCModel* rpc_model = NULL; try { RPCXML rpc_xml; // This is for reading XML files rpc_xml.read_from_file(path); rpc_model = new RPCModel(*rpc_xml.rpc_ptr()); // Copy the value } catch (...) { } if (!rpc_model) { // The default loading method failed, try the backup method. rpc_model = new RPCModel(path); // Invoke the GDAL driver for the image file } // We don't catch an error here because the user will need to // know of a failure at this point. return boost::shared_ptr<asp::RPCModel>(rpc_model); } // Load a DG camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_dg_camera_model(std::string const& path) const { // Redirect to the call from LinescanDGModel.h file return vw::CamPtr(load_dg_camera_model_from_xml(path)); } // Load a spot5 camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_spot5_camera_model(std::string const& path) const { vw::Stopwatch sw; sw.start(); vw::CamPtr ans = load_spot5_csm_camera_model_from_xml(path); sw.stop(); vw::vw_out() << "Load time: " << sw.elapsed_seconds() << " seconds.\n"; return ans; } // Load a PeruSat linescan camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_perusat_camera_model(std::string const& path) const { return vw::CamPtr(load_perusat_camera_model_from_xml(path)); } // Load a Pleiades linescan camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_pleiades_camera_model(std::string const& path) const { return vw::CamPtr(load_pleiades_camera_model_from_xml(path)); } // Load a SPOT 6/7 linescan camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_spot_camera_model(std::string const& path) const { return vw::CamPtr(load_spot_camera_model_from_xml(path)); } // Load a ASTER camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_ASTER_camera_model(std::string const& path) const { return vw::CamPtr(load_ASTER_camera_model_from_xml(path)); } // Load an ISIS camera model boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_isis_camera_model(std::string const& path) const { #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 return vw::CamPtr(new vw::camera::IsisCameraModel(path)); #endif // If ISIS was not enabled in the build, just throw an exception. vw::vw_throw(vw::NoImplErr() << "Cannot load ISIS files because ISIS was not enabled in the build.\n"); } // End function load_isis_camera_model() // Load an optical bar camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_optical_bar_camera_model(std::string const& path) const { return vw::CamPtr(new vw::camera::OpticalBarModel(path)); } // Load a CSM camera file boost::shared_ptr<vw::camera::CameraModel> CameraModelLoader::load_csm_camera_model(std::string const& path) const { boost::shared_ptr<asp::CsmModel> cam_ptr(new asp::CsmModel()); if (vw::has_isd_extension(path)) { // Load a .json file cam_ptr->load_model(path); return vw::CamPtr(cam_ptr); } // The CSM model is embedded in the cub file #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 std::string modelState = asp::isis::csmStateFromIsisCube(path); bool recreateModel = true; cam_ptr->setModelFromStateString(modelState, recreateModel); #endif // ASP_HAVE_PKG_ISIS return vw::CamPtr(cam_ptr); } } // end namespace asp ================================================ FILE: src/asp/Sessions/CameraModelLoader.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraModelLoader.h /// #ifndef __STEREO_SESSION_CAMERAMODELLOADER_H__ #define __STEREO_SESSION_CAMERAMODELLOADER_H__ #include <vw/Camera/CameraModel.h> namespace asp { class CameraModelLoader { public: // Setup/teardown code is handled here // - Currently this just means the Xerces XML init/deinit functions. CameraModelLoader(); ~CameraModelLoader(); // TODO: Add a generic loading function. // Camera model loading functions vw::CamPtr load_rpc_camera_model (std::string const& path) const; vw::CamPtr load_dg_camera_model (std::string const& path) const; vw::CamPtr load_pinhole_camera_model (std::string const& path) const; vw::CamPtr load_isis_camera_model (std::string const& path) const; vw::CamPtr load_spot5_camera_model (std::string const& path) const; vw::CamPtr load_perusat_camera_model (std::string const& path) const; vw::CamPtr load_pleiades_camera_model (std::string const& path) const; vw::CamPtr load_spot_camera_model (std::string const& path) const; vw::CamPtr load_ASTER_camera_model (std::string const& path) const; vw::CamPtr load_optical_bar_camera_model(std::string const& path) const; vw::CamPtr load_csm_camera_model (std::string const& path) const; }; // End class CameraModelLoader } // end namespace asp #endif // __STEREO_SESSION_CAMERAMODELLOADER_H__ ================================================ FILE: src/asp/Sessions/CameraUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// Camera utilities that need the stereo session /// \file CameraUtils.cc #include <asp/Core/StereoSettings.h> #include <asp/Core/AspStringUtils.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/DemUtils.h> #include <asp/Core/FileUtils.h> #include <asp/Core/ImageUtils.h> #include <vw/Cartography/Map2CamTrans.h> #include <vw/Core/Exception.h> #include <vw/Camera/PinholeModel.h> #include <vw/Camera/CameraUtilities.h> #include <vw/InterestPoint/InterestPoint.h> #include <vw/Core/Stopwatch.h> #include <boost/filesystem.hpp> #include <omp.h> #include <string> #include <iostream> namespace fs = boost::filesystem; namespace asp { void load_camera(std::string const& image_file, std::string const& camera_file, std::string const& out_prefix, vw::GdalWriteOptions const& opt, bool approximate_pinhole_intrinsics, bool quiet, // Outputs asp::SessionPtr & session, std::string & stereo_session, vw::CamPtr & camera_model, bool & single_threaded_camera) { // Must have a try block, as otherwise OpenMP crashes the program // as the caller seems unable to catch the exception from threads. try { std::string input_dem = ""; // No DEM bool allow_map_promote = false; if (session.get() == NULL) { session = asp::StereoSessionFactory::create (stereo_session, // may change opt, image_file, image_file, camera_file, camera_file, out_prefix, input_dem, allow_map_promote, quiet); // This is necessary to avoid a crash with ISIS cameras which is single-threaded // TODO(oalexan1): Check this value for csm cameras embedded in ISIS images. single_threaded_camera = (!session->supports_multi_threading()); } bool local_quiet = true; // To not print messages about loading each camera camera_model = session->camera_model(image_file, camera_file, local_quiet); if (approximate_pinhole_intrinsics) { boost::shared_ptr<vw::camera::PinholeModel> pinhole_ptr = boost::dynamic_pointer_cast<vw::camera::PinholeModel>(camera_model); // Must be non-null if (pinhole_ptr.get() == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting a pinhole camera model.\n"); // Replace lens distortion with fast approximation bool force_conversion = false; *pinhole_ptr.get() = vw::camera::fitPinholeModel(pinhole_ptr.get(), vw::file_image_size(image_file), "TsaiLensDistortion", force_conversion); } } catch (const std::exception& e) { vw::vw_out() << e.what() << "\n"; } } // Load cameras from given image and camera files. Load them in parallel except // for ISIS which is not thread-safe. void load_cameras(std::vector<std::string> const& image_files, std::vector<std::string> const& camera_files, std::string const& out_prefix, vw::GdalWriteOptions const& opt, bool approximate_pinhole_intrinsics, // Outputs std::string & stereo_session, bool & single_threaded_camera, std::vector<vw::CamPtr> & camera_models) { // Print a message as this may take a while vw::vw_out() << "Loading the cameras.\n"; vw::Stopwatch sw; sw.start(); // Sanity check if (image_files.size() != camera_files.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting as many images as cameras.\n"); camera_models.resize(image_files.size(), vw::CamPtr(NULL)); // First invocation. Will create the session. Will update // single_threaded_camera, and stereo_session. All subsequent invocations will // not change these so will be thread-safe. asp::SessionPtr session(NULL); // will change single_threaded_camera = false; // may change bool quiet = false; int i = 0; load_camera(image_files[i], camera_files[i], out_prefix, opt, approximate_pinhole_intrinsics, quiet, session, stereo_session, camera_models[i], single_threaded_camera); quiet = true; if (!single_threaded_camera) { // Use OpenMP to load the cameras in parallel #pragma omp parallel for for (size_t i = 0; i < image_files.size(); i++) load_camera(image_files[i], camera_files[i], out_prefix, opt, approximate_pinhole_intrinsics, quiet, session, stereo_session, camera_models[i], single_threaded_camera); // Check that the cameras got loaded for (size_t i = 0; i < camera_models.size(); i++) { if (camera_models[i].get() == NULL) vw::vw_throw(vw::ArgumentErr() << "Failed to load all camera models.\n"); } } else { // Load the cameras one by one. This is needed for ISIS cameras. for (size_t i = 0; i < image_files.size(); i++) load_camera(image_files[i], camera_files[i], out_prefix, opt, approximate_pinhole_intrinsics, quiet, session, stereo_session, camera_models[i], single_threaded_camera); } sw.stop(); vw::vw_out() << "Loading cameras elapsed time: " << sw.elapsed_seconds() << " seconds.\n"; return; } // Guess the based on camera position. Usually one arrives here for pinhole // cameras. This function is to be used when anything else fails. bool guessDatum(double cam_center_radius, vw::cartography::Datum & datum) { bool success = false; // Datums for Earth, Mars, and Moon vw::cartography::Datum earth("WGS84"); vw::cartography::Datum mars("D_MARS"); vw::cartography::Datum moon("D_MOON"); double km = 1000.0; if (cam_center_radius > earth.semi_major_axis() - 100*km && cam_center_radius < earth.semi_major_axis() + 5000*km) { datum = earth; success = true; } else if (cam_center_radius > mars.semi_major_axis() - 100*km && cam_center_radius < mars.semi_major_axis() + 1500*km) { datum = mars; success = true; } else if (cam_center_radius > moon.semi_major_axis() - 100*km && cam_center_radius < moon.semi_major_axis() + 1000*km) { datum = moon; success = true; } return success; } // Find the datum based on cameras. Return true on success. Otherwise don't set it. bool datum_from_camera(std::string const& image_file, std::string const& camera_file, std::string & stereo_session, // may change asp::SessionPtr & session, // may be null on input // Outputs vw::cartography::Datum & datum) { std::string out_prefix = "run"; // Look for a non-pinhole camera, as a pinhole camera does not have a datum bool success = false; double cam_center_radius = 0.0; if (session.get() == NULL) { // If a session was not passed in, create it here. std::string input_dem = ""; // No DEM bool allow_map_promote = false, quiet = true; session = asp::StereoSessionFactory::create(stereo_session, // may change vw::GdalWriteOptions(), image_file, image_file, camera_file, camera_file, out_prefix, input_dem, allow_map_promote, quiet); } bool use_sphere_for_non_earth = true; auto cam = session->camera_model(image_file, camera_file); datum = session->get_datum(cam.get(), use_sphere_for_non_earth); success = session->have_datum(); // TODO(oalexan1): Must have the function get_datum() return success or not. // That must be checked at each location. then the block below can be removed. if (!success && !asp::stereo_settings().no_datum && !stereo_settings().correlator_mode) { double cam_center_radius = norm_2(cam->camera_center(vw::Vector2())); success = guessDatum(cam_center_radius, datum); if (success) vw::vw_out() << "Guessed the datum from camera position.\n"; } return success; } // Validate that key exists in the map and the value is a vector of 4 entries, // each equal to "0". void validateCropWin(std::string const& key, std::string const& file, std::map<std::string, std::vector<std::string>> const& vals) { if (vals.find(key) == vals.end()) vw::vw_throw(vw::ArgumentErr() << "Missing entry for " << key << " in " << file << ".\n"); std::vector<std::string> const& v = vals.find(key)->second; if (v.size() != 4) vw::vw_throw(vw::ArgumentErr() << "Expecting 4 entries for " << key << " in " << file << ".\n"); for (int i = 0; i < 4; i++) if (v[i] != "0") vw::vw_throw(vw::ArgumentErr() << "Cannot use a run produced with cropped images.\n"); } // Given a list of stereo prefixes, extract the indices of the left and right // images in the full list of images, the alignment transforms, disparities, // and sessions. void parseStereoRuns(std::string const& prefix_file, std::vector<std::string> const& all_image_files, // Outputs std::vector<int> & left_indices, std::vector<int> & right_indices, std::vector<asp::SessionPtr> & sessions, std::vector<vw::TransformPtr> & left_trans, std::vector<vw::TransformPtr> & right_trans, std::vector<std::string> & disp_files) { // Must have at least one stereo run if (prefix_file.empty()) vw::vw_throw(vw::ArgumentErr() << "No list of stereo runs was specified.\n"); // Wipe the outputs left_indices.clear(); right_indices.clear(); sessions.clear(); left_trans.clear(); right_trans.clear(); disp_files.clear(); // Read the list of stereo prefixes std::vector<std::string> prefix_list; asp::read_list(prefix_file, prefix_list); if (prefix_list.empty()) vw::vw_throw(vw::ArgumentErr() << "Expecting at least one stereo prefix.\n"); // For each left and right image in the stereo run, find the index in // the input cameras, and the transforms. for (size_t i = 0; i < prefix_list.size(); i++) { std::string stereo_prefix = prefix_list[i]; std::string info_file = stereo_prefix + "-info.txt"; // If it does not exist, the run is invalid if (!fs::exists(info_file)) vw::vw_throw(vw::ArgumentErr() << "Missing: " << info_file << ". Invalid stereo run.\n"); std::map<std::string, std::vector<std::string>> vals; asp::parseKeysVals(info_file, vals); // Must not have a run with crop wins validateCropWin("left_image_crop_win:", info_file, vals); validateCropWin("right_image_crop_win:", info_file, vals); // This DEM is nonempty if the images are mapprojected std::string input_dem; auto dem_val = vals.find("input_dem:"); if (dem_val != vals.end() && !dem_val->second.empty()) input_dem = dem_val->second[0]; // Must have only two images in each run auto img_val = vals.find("images:"); if (img_val == vals.end()) vw::vw_throw(vw::ArgumentErr() << "Missing left_image_path in " << info_file << ".\n"); auto images = img_val->second; if (images.size() > 2) vw::vw_throw(vw::ArgumentErr() << "Cannot handle multiview stereo runs.\n"); if (images.size() != 2) vw::vw_throw(vw::ArgumentErr() << "Expecting two images in " << info_file << ".\n"); // Find the camera files auto cam_val = vals.find("cameras:"); if (cam_val == vals.end()) vw::vw_throw(vw::ArgumentErr() << "Missing camera_files in " << info_file << ".\n"); auto cameras = cam_val->second; if (cameras.size() != 2) vw::vw_throw(vw::ArgumentErr() << "Expecting two camera files in " << info_file << ".\n"); // Find the raw images, for when the images are mapprojected std::vector<std::string> raw_images = images; for (size_t i = 0; i < images.size(); i++) { if (input_dem.empty()) continue; std::string img = images[i]; // Read the raw image name from the mapprojection metadata. std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key; std::string adj, raw_img, cam_type, cam_file, dem; asp::read_mapproj_header(img, adj_key, img_key, cam_type_key, cam_file_key, dem_key, adj, raw_img, cam_type, cam_file, dem); if (raw_img.empty()) vw::vw_throw(vw::ArgumentErr() << "Failed to find the raw image name in " << "the geoheader of " << img << ".\n"); raw_images[i] = raw_img; } // Each raw image must be among the input images int left_index = -1, right_index = -1; for (size_t i = 0; i < all_image_files.size(); i++) { if (all_image_files[i] == raw_images[0]) left_index = i; if (all_image_files[i] == raw_images[1]) right_index = i; } // If not found, that's a failure if (left_index < 0 || right_index < 0) vw::vw_throw(vw::ArgumentErr() << "Some images for the stereo run: " << stereo_prefix << " are not among the input images for the jitter solver.\n"); auto session_val = vals.find("stereo_session:"); if (session_val == vals.end() || session_val->second.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing stereo_session in " << info_file << ".\n"); std::string stereo_session = session_val->second[0]; auto alignment_val = vals.find("alignment_method:"); if (alignment_val == vals.end() || alignment_val->second.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing alignment_method in " << info_file << ".\n"); std::string curr_alignment_method = alignment_val->second[0]; // For epipolar alignment, the transforms need a different approach if (curr_alignment_method == "epipolar") vw::vw_throw(vw::ArgumentErr() << "Cannot use a run produced with epipolar alignment.\n"); // Temporarily replace the alignment method so we can fetch the transform std::string orig_alignment_method = asp::stereo_settings().alignment_method; asp::stereo_settings().alignment_method = curr_alignment_method; // The prefix from the info file must agree with the one passed in auto prefix_val = vals.find("output_prefix:"); if (prefix_val == vals.end() || prefix_val->second.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing output_prefix in " << info_file << ".\n"); if (prefix_val->second[0] != stereo_prefix) vw::vw_throw(vw::ArgumentErr() << "Mismatch between output prefix in " << info_file << " and the stereo prefix.\n"); vw::GdalWriteOptions opt; asp::SessionPtr session (asp::StereoSessionFactory::create(stereo_session, // may change opt, images[0], images[1], cameras[0], cameras[1], stereo_prefix, input_dem)); std::string disp_file = stereo_prefix + "-F.tif"; if (!fs::exists(disp_file)) vw::vw_throw(vw::ArgumentErr() << "Missing: " << disp_file << ". Invalid stereo run.\n"); // Must not have an -L_cropped.tif file as then cannot use the run. // Same for -R_cropped.tif and for L.tsai and R.tsai. std::string left_cropped = stereo_prefix + "-L-cropped.tif"; std::string right_cropped = stereo_prefix + "-R-cropped.tif"; if (fs::exists(left_cropped) || fs::exists(right_cropped)) vw::vw_throw(vw::ArgumentErr() << "Cannot use a run produced with cropped images.\n"); std::string left_tsai = stereo_prefix + "-L.tsai"; std::string right_tsai = stereo_prefix + "-R.tsai"; if (fs::exists(left_tsai) || fs::exists(right_tsai)) vw::vw_throw(vw::ArgumentErr() << "Cannot use a run produced with epipolar alignment.\n"); // Add to the indices and transforms left_indices.push_back(left_index); right_indices.push_back(right_index); sessions.push_back(session); left_trans.push_back(session->tx_left()); right_trans.push_back(session->tx_right()); disp_files.push_back(disp_file); // Put back the original alignment method asp::stereo_settings().alignment_method = orig_alignment_method; } // end loop through stereo prefixes } // Computes a Map2CamTrans given a DEM, image, and a sensor model. Can take a // DEM height instead of a DEM file. vw::TransformPtr transformFromMapProject(std::string dem_path, const std::string &img_file_path, vw::CamPtr map_proj_model_ptr, vw::GdalWriteOptions const& options, std::string const& tag, std::string const& out_prefix, double dem_height) { // If the input DEM is empty, the dem height must not be nan if (dem_path.empty() && std::isnan(dem_height)) vw::vw_throw(vw::ArgumentErr() << "Must provide either a DEM file or a DEM height."); // But must have just one if (!dem_path.empty() && !std::isnan(dem_height)) vw::vw_throw(vw::ArgumentErr() << "Must provide either a DEM file or a DEM height, not both."); vw::DiskImageView<float> img(img_file_path); vw::cartography::GeoReference image_georef; if (!read_georeference(image_georef, img_file_path)) vw::vw_throw(vw::ArgumentErr() << "Missing georeference in image: " << img_file_path); // For an orthoimage without a DEM, prepare one, unless it was already made. // The produced dem will be at location dem_path. if (!std::isnan(dem_height)) asp::setupOrCheckDem(options, img, image_georef, tag, out_prefix, dem_height, dem_path); // Read in data necessary for the Map2CamTrans object vw::cartography::GeoReference dem_georef; if (!read_georeference(dem_georef, dem_path)) vw::vw_throw(vw::ArgumentErr() << "No georeference found in DEM: " << dem_path); bool call_from_mapproject = false; return vw::TransformPtr(new vw::cartography::Map2CamTrans(map_proj_model_ptr.get(), image_georef, dem_georef, dem_path, vw::Vector2(img.cols(), img.rows()), call_from_mapproject)); } } // end namespace asp ================================================ FILE: src/asp/Sessions/CameraUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file CameraUtils.h /// Camera utilities that need the stereo session #ifndef __STEREO_SESSION_CAMERA_UTILS_H__ #define __STEREO_SESSION_CAMERA_UTILS_H__ #include <vector> #include <string> #include <vw/Camera/CameraModel.h> #include <vw/Math/Transform.h> #include <vw/FileIO/GdalWriteOptions.h> #include <vw/FileIO/DiskImageView.h> namespace vw { namespace cartography { class Datum; } namespace ip { class InterestPoint; } } namespace asp { class StereoSession; typedef boost::shared_ptr<StereoSession> SessionPtr; // Load cameras from given image and camera files void load_cameras(std::vector<std::string> const& image_files, std::vector<std::string> const& camera_files, std::string const& out_prefix, vw::GdalWriteOptions const& opt, bool approximate_pinhole_intrinsics, // Outputs std::string & stereo_session, // may change bool & single_threaded_cameras, std::vector<vw::CamPtr> & camera_models); // Guess the based on camera position. Usually one arrives here for pinhole // cameras. bool guessDatum(double cam_center_radius, vw::cartography::Datum & datum); // Find the datum based on cameras. Return true on success. bool datum_from_camera(std::string const& image_file, std::string const& camera_file, std::string & stereo_session, // may change asp::SessionPtr & session, // may be null on input // Outputs vw::cartography::Datum & datum); // Given a list of stereo prefixes, extract some info about them void parseStereoRuns(std::string const& prefix_file, std::vector<std::string> const& all_image_files, // Outputs std::vector<int> & left_indices, std::vector<int> & right_indices, std::vector<asp::SessionPtr> & sessions, std::vector<vw::TransformPtr> & left_trans, std::vector<vw::TransformPtr> & right_trans, std::vector<std::string> & disp_files); // Computes a Map2CamTrans given a DEM, image, and a sensor model. Can take a // DEM height instead of a DEM file. vw::TransformPtr transformFromMapProject(std::string dem_path, const std::string &img_file_path, vw::CamPtr map_proj_model_ptr, vw::GdalWriteOptions const& options, std::string const& tag, std::string const& out_prefix, double dem_height); } // end namespace asp #endif // __STEREO_SESSION_CAMERA_UTILS_H__ ================================================ FILE: src/asp/Sessions/StereoSession.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSession.cc /// #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisCameraModel.h> #endif // ASP_HAVE_PKG_ISIS #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/StereoSettings.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/CsmModel.h> #include <asp/Core/AspStringUtils.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/BaseCameraUtils.h> #include <asp/Core/AlignmentUtils.h> #include <vw/Core/Exception.h> #include <vw/Core/Log.h> #include <vw/Math/Vector.h> #include <vw/Math/Functors.h> #include <vw/Math/Geometry.h> #include <vw/Image/PixelMask.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Cartography/Map2CamTrans.h> #include <vw/Cartography/DatumUtils.h> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/path.hpp> #include <map> #include <utility> #include <string> using namespace vw; using namespace vw::cartography; namespace fs = boost::filesystem; namespace asp { // Pass over all the string variables we use void StereoSession::initialize(vw::GdalWriteOptions const& options, std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, std::string const& out_prefix, std::string const& input_dem) { m_options = options; m_left_image_file = left_image_file; m_right_image_file = right_image_file; m_left_camera_file = left_camera_file; m_right_camera_file = right_camera_file; m_out_prefix = out_prefix; m_input_dem = input_dem; // Read the cameras used in mapprojection if (isMapProjected()) read_mapproj_cams(m_left_image_file, m_right_image_file, m_left_camera_file, m_right_camera_file, m_input_dem, this->name(), m_left_map_proj_model, m_right_map_proj_model); } // Read keywords that describe how the images were map-projected. // Do sanity checks. void read_mapproj_header_session(std::string const& map_file, std::string const& input_cam_file, std::string const& input_dem, std::string const& session_name, // Outputs std::string & adj_prefix, std::string & image_file, std::string & cam_type, std::string & cam_file, std::string & dem_file) { // Call a lower-level function to do the reading std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key; asp::read_mapproj_header(map_file, adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key, adj_prefix, image_file, cam_type, cam_file, dem_file); // Sanity checks bool has_geoheader_cam_type = true; if (cam_type == "") { // If cam_type is empty, and session name is XmapY, use cam type Y. std::string tri_cam_type, mapproj_cam_type; asp::parseCamTypes(session_name, tri_cam_type, mapproj_cam_type); vw::vw_out(WarningMessage) << "Assuming mapprojection was done with camera type: " << mapproj_cam_type << "\n"; cam_type = mapproj_cam_type; has_geoheader_cam_type = false; } bool has_geoheader_image = true; if (image_file == "") { image_file = map_file; // should be enough to load the camera has_geoheader_image = false; } // This is very hard to get right if (cam_file == "") { if (has_geoheader_cam_type && has_geoheader_image) { // The mapprojection info was saved, but the camera file was empty. // Then, the image file before mapprojection should have the camera. cam_file = image_file; } else { // The mapprojection info was not saved. Use the user-supplied // camera. cam_file = input_cam_file; } } if (dem_file == "") { vw::vw_out(WarningMessage) << "Missing field value for: " << dem_file_key << " in " << map_file << ".\n"; dem_file = input_dem; // should be enough to load the DEM vw::vw_out(WarningMessage) << "Using DEM: " << dem_file << " instead.\n"; } vw::Vector2 heights = asp::stereo_settings().ortho_heights; bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1])); // TODO(oalexan1): When do not have heights, the dem_file must be non-empty // and must exist. // The DEM the user provided better be the one used for map projection. // Give an error, as the results can be very different with the wrong DEM. if (input_dem != dem_file && !asp::stereo_settings().accept_provided_mapproj_dem && !have_heights) vw::vw_throw(ArgumentErr() << "The DEM used for map projection is different from the one " << "provided currently.\n" << "Mapprojection DEM: " << dem_file << "\n" << "Current DEM: " << input_dem << "\n" << "To override this error, use: --accept-provided-mapproj-dem.\n" << "Or, to change the DEM name in the geoheader of mapprojected images, run\n" << " image_calc -c var_0 --mo DEM_FILE=myDem.tif in.tif -o out.tif -d float32\n" << "but only if sure that the DEMs are equivalent.\n"); // If this is set to none, it means no bundle-adjust prefix was used if (adj_prefix == "NONE") adj_prefix = ""; } // When loading camera models from the image files, we either use the sensor // model for the current session type or else the RPC model which is often // used as an approximation. If that fails, create a new session from scratch // and load the camera model with that. void StereoSession::read_mapproj_cam(std::string const& image_file, std::string const& cam_file, std::string const& adj_prefix, std::string const& cam_type, vw::CamPtr & map_proj_cam) { const Vector2 zero_pixel_offset(0,0); try { if (cam_type == "rpc") { map_proj_cam = load_rpc_camera_model(image_file, cam_file, adj_prefix, zero_pixel_offset); } else { // Use the native model map_proj_cam = load_camera_model(image_file, cam_file, adj_prefix, zero_pixel_offset); } } catch (std::exception const& e) { std::string msg = e.what(); vw_out() << "Creating a new session to load the mapprojected camera model.\n"; std::string session_type = cam_type; std::string out_prefix; try { asp::SessionPtr session(asp::StereoSessionFactory::create (session_type, // may change m_options, image_file, image_file, cam_file, cam_file, out_prefix)); map_proj_cam = session->load_camera_model(image_file, cam_file, adj_prefix, zero_pixel_offset); } catch (std::exception const& e) { vw_throw(ArgumentErr() << "Failed to load the camera model from " << cam_file << " for image: " << image_file << ".\n" << "First error message: " << msg << "\n" << "Second error message: " << e.what() << "\n"); } } return; } // Read the cameras used to undo the mapprojection. The header file of the // mapprojected images contain a lot of info that we load along the way, // including the bundle adjust prefix that was used to create these images, // which may be different than the one used later for triangulation. void StereoSession::read_mapproj_cams(std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, std::string const& input_dem, std::string const& session_name, vw::CamPtr & left_map_proj_cam, vw::CamPtr & right_map_proj_cam) { std::string l_adj_prefix, r_adj_prefix, l_image_file, r_image_file, l_cam_type, r_cam_type, l_cam_file, r_cam_file, l_dem_file, r_dem_file; vw::Vector2 heights = asp::stereo_settings().ortho_heights; bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1])); if (have_heights) { // For ortho-ready images it is assumed the mapprojection was done // with the original cameras and no bundle adjustment prefix was used. l_cam_file = left_camera_file; r_cam_file = right_camera_file; l_cam_type = session_name; r_cam_type = session_name; // If not having cameras, use the images if (l_cam_file == "") l_cam_file = left_image_file; if (r_cam_file == "") r_cam_file = right_image_file; } else { // Load the name of the camera model, session, and DEM used in mapprojection // based on the record in that image. Load the bundle adjust prefix from the // mapprojected image. It can be empty, when such a prefix was not used in // mapprojection. read_mapproj_header_session(left_image_file, left_camera_file, input_dem, session_name, l_adj_prefix, l_image_file, l_cam_type, l_cam_file, l_dem_file); read_mapproj_header_session(right_image_file, right_camera_file, input_dem, session_name, r_adj_prefix, r_image_file, r_cam_type, r_cam_file, r_dem_file); } vw_out() << "Images before mapprojection: " << l_image_file << ' ' << r_image_file << "\n"; vw_out() << "Mapprojection cameras: " << l_cam_file << ' ' << r_cam_file << "\n"; vw_out() << "Mapprojected images bundle adjustment prefixes: " << l_adj_prefix << ' ' << r_adj_prefix << "\n"; vw_out() << "Mapprojection cam types: " << l_cam_type << ' ' << r_cam_type << "\n"; // Load either the current session camera type, or rpc, or form a new session. read_mapproj_cam(l_image_file, l_cam_file, l_adj_prefix, l_cam_type, left_map_proj_cam); read_mapproj_cam(r_image_file, r_cam_file, r_adj_prefix, r_cam_type, right_map_proj_cam); VW_ASSERT(left_map_proj_cam.get() && right_map_proj_cam.get(), ArgumentErr() << "StereoSession: Unable to locate map " << "projection camera model inside input files."); // Double check that we can read the DEM and that it has cartographic information. if (input_dem.empty() && !have_heights) vw_throw(ArgumentErr() << "StereoSession: An input DEM is required."); if (!boost::filesystem::exists(input_dem) && !have_heights) vw_throw(ArgumentErr() << "StereoSession: DEM '" << input_dem << "' does not exist."); } // Default implementation of this function. Derived classes will probably override this. void StereoSession::camera_models(boost::shared_ptr<vw::camera::CameraModel> &cam1, boost::shared_ptr<vw::camera::CameraModel> &cam2) { cam1 = camera_model(m_left_image_file, m_left_camera_file); cam2 = camera_model(m_right_image_file, m_right_camera_file); } // This will be overridden in some sessions bool StereoSession::have_datum() const { return !asp::stereo_settings().no_datum && !stereo_settings().correlator_mode; } // Returns the target datum to use for a given camera model. // Can be overridden by derived classes. // If no success finding the datum, will return WGS84. // TODO(oalexan1): This must return a flag indicating if the datum was found. vw::cartography::Datum StereoSession::get_datum(const vw::camera::CameraModel* cam, bool use_sphere_for_non_earth) const { if (!stereo_settings().datum.empty()) return vw::cartography::Datum(stereo_settings().datum); // For ISIS, can query the camera. This code is invoked for stereo with // mapprojected ISIS cameras, as that use the mapprojected session, and not // the ISIS one. In the latter case the ISIS session has this own // implementation of this function. #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 vw::camera::IsisCameraModel const* isis_cam = dynamic_cast<vw::camera::IsisCameraModel const*>(unadjusted_model(cam)); if (isis_cam != NULL) return isis_cam->get_datum_isis(use_sphere_for_non_earth); #endif // ASP_HAVE_PKG_ISIS // Do same for csm asp::CsmModel const* csm_cam = dynamic_cast<asp::CsmModel const*>(unadjusted_model(cam)); if (csm_cam != NULL) return csm_cam->get_datum_csm("unknown", use_sphere_for_non_earth); // Same for RPC asp::RPCModel const* rpc_cam = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(cam)); if (rpc_cam != NULL) return rpc_cam->datum(); // TODO(oalexan1): Need to find a systematic way of handling all // these cases. // Otherwise guess the datum based on the camera position. // If no luck, it will return the default WGS84 datum. // TODO(oalexan1): This may result in a bad datum for other planets. double cam_center_radius = norm_2(cam->camera_center(vw::Vector2())); vw::cartography::Datum datum; asp::guessDatum(cam_center_radius, datum); return datum; } // Peek inside the images and camera models and return the datum and projection, // or at least the datum, packaged in a georef. // If no success finding the datum, will return WGS84. vw::cartography::GeoReference StereoSession::get_georef() { vw::cartography::GeoReference georef; // First try to see if the image is map-projected. bool has_georef = read_georeference(georef, m_left_image_file); bool has_datum = false; vw::cartography::Datum datum; if (!stereo_settings().correlator_mode) { has_datum = true; vw::CamPtr cam = this->camera_model(m_left_image_file, m_left_camera_file); // Spherical datum for non-Earth, as done usually. Used // consistently this way in bundle adjustment and stereo. bool use_sphere_for_non_earth = true; datum = this->get_datum(cam.get(), use_sphere_for_non_earth); } // Sanity check if (has_georef && has_datum) { // This check is very important, as it prevents a mixup of datums from // different planets. The guessed datum may be unreliable, so always warn only. bool warn_only = true; vw::checkDatumConsistency(georef.datum(), datum, warn_only); } if (!has_georef) { // The best we can do is to get the datum, even non-projected // images have that. Create however a fake valid georeference to // go with this datum, otherwise we can't read the datum when we // needed it later. georef = vw::cartography::GeoReference(); Matrix3x3 transform = georef.transform(); // assume these are degrees, does not mater much, but it needs be small enough double small = 1e-8; transform(0,0) = small; // grid in x transform(1,1) = -small; // grid in y; y always goes down transform(0,2) = 0; // origin x transform(1,2) = 0; // origin y georef.set_transform(transform); georef.set_geographic(); // default projection if (has_datum) georef.set_datum(datum); } return georef; } boost::shared_ptr<vw::camera::CameraModel> StereoSession::camera_model(std::string const& image_file, std::string const& camera_file, bool quiet) { // TODO(oalexan1): ba_prefix better be passed from outside std::string ba_prefix = asp::stereo_settings().bundle_adjust_prefix; if (stereo_settings().correlator_mode) { // No cameras exist, so make some dummy cameras. Recall that we // set the session to rpc in this mode so that it is assumed that // the cameras may hiding in the images rather than kept // separately. In this mode the cameras should not actually get // used. vw::Vector<double, 20> v; v[0] = 1.0; // to a void a zero denominator vw::Vector2 v2(1.0, 1.0); // to avoid division by 0 vw::Vector3 v3(1.0, 1.0, 1.0); boost::shared_ptr<vw::camera::CameraModel> cam(new RPCModel(vw::cartography::Datum("WGS84"), v, v, v, v, v2, v2, v3, v3)); return cam; } // If the desired camera is already loaded, do not load it again. std::pair<std::string, std::string> image_cam_pair = std::make_pair(image_file, camera_file); auto map_it = m_camera_model.find(image_cam_pair); if (map_it != m_camera_model.end()) return map_it->second; // Sometime when we do many attempts at loading cameras we don't want to print // this message. if (!quiet) vw_out() << "Loading camera model: " << image_file << ' ' << camera_file << "\n"; // Retrieve the pixel offset (if any) to cropped images vw::Vector2 pixel_offset = camera_pixel_offset(isMapProjected(), m_left_image_file, m_right_image_file, image_file); vw::CamPtr cam; if (camera_file == "") // No camera file provided, use the image file. cam = load_camera_model(image_file, image_file, ba_prefix, pixel_offset); else // Camera file provided cam = load_camera_model(image_file, camera_file, ba_prefix, pixel_offset); { // Save the camera model in the map to not load it again. Ensure thread safety. vw::Mutex::Lock lock(m_camera_mutex); m_camera_model[image_cam_pair] = cam; } return cam; } ImageViewRef<PixelMask<Vector2f>> StereoSession::pre_pointcloud_hook(std::string const& input_file) { return DiskImageView<PixelMask<Vector2f> >(input_file); } std::string StereoSession::left_cropped_image(bool do_crop) const{ std::string cropped_image = m_left_image_file; if (do_crop) { // In stereo_dist_mode, the cropped and normalized image is L.tif, L-cropped.tif is skipped if (stereo_settings().stereo_dist_mode) cropped_image = m_out_prefix + "-L.tif"; else cropped_image = m_out_prefix + "-L-cropped.tif"; } std::cout << "left_cropped_image: " << cropped_image << "\n"; return cropped_image; } std::string StereoSession::right_cropped_image(bool do_crop) const{ std::string cropped_image = m_right_image_file; if (do_crop) { // In stereo_dist_mode, the cropped and normalized image is R.tif, R-cropped.tif is skipped if (stereo_settings().stereo_dist_mode) cropped_image = m_out_prefix + "-R.tif"; else cropped_image = m_out_prefix + "-R-cropped.tif"; } std::cout << "right_cropped_image: " << cropped_image << "\n"; return cropped_image; } bool StereoSession::do_crop_left() const { return stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0); } bool StereoSession::do_crop_right() const { return stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0); } // Apply epipolar alignment to images, if the camera models are pinhole. This will // be reimplemented in StereoSessionPinhole. void StereoSession:: epipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image, vw::ImageViewRef<vw::PixelMask<float>> right_masked_image, vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata, // Outputs vw::ImageViewRef<vw::PixelMask<float>> & Limg, vw::ImageViewRef<vw::PixelMask<float>> & Rimg) { vw_throw(ArgumentErr() << "Epipolar alignment is only implemented for pinhole cameras."); } void StereoSession::get_input_image_crops(vw::BBox2i &left_image_crop, vw::BBox2i &right_image_crop) const { // Set the ROIs to the entire image if the input crop windows are not set. Vector2i left_size = file_image_size(m_left_image_file); Vector2i right_size = file_image_size(m_right_image_file); if (do_crop_left()) left_image_crop = stereo_settings().left_image_crop_win; else left_image_crop = BBox2i(0, 0, left_size [0], left_size [1]); if (do_crop_right()) right_image_crop = stereo_settings().right_image_crop_win; else right_image_crop = BBox2i(0, 0, right_size[0], right_size[1]); } vw::TransformPtr StereoSession::tx_left_homography() const { vw::Matrix<double> tx = asp::alignmentMatrix(m_out_prefix, asp::stereo_settings().alignment_method, "left"); return vw::TransformPtr(new vw::HomographyTransform(tx)); } vw::TransformPtr StereoSession::tx_right_homography() const { vw::Matrix<double> tx = asp::alignmentMatrix(m_out_prefix, asp::stereo_settings().alignment_method, "right"); return vw::TransformPtr(new vw::HomographyTransform(tx)); } vw::TransformPtr StereoSession::tx_identity() const { Matrix<double> tx = math::identity_matrix<3>(); return vw::TransformPtr(new vw::HomographyTransform(tx)); } vw::TransformPtr StereoSession::tx_left_map_trans() const { bool crop_left = do_crop_left(); std::string left_map_proj_image = this->left_cropped_image(crop_left); if (!m_left_map_proj_model) vw_throw(ArgumentErr() << "Map projection model not loaded for image " << left_map_proj_image); return asp::transformFromMapProject(m_input_dem, left_map_proj_image, m_left_map_proj_model, m_options, "left", m_out_prefix, asp::stereo_settings().ortho_heights[0]); } vw::TransformPtr StereoSession::tx_right_map_trans() const { bool crop_right = do_crop_right(); std::string right_map_proj_image = this->right_cropped_image(crop_right); if (!m_right_map_proj_model) vw_throw(ArgumentErr() << "Map projection model not loaded for image " << right_map_proj_image); return asp::transformFromMapProject(m_input_dem, right_map_proj_image, m_right_map_proj_model, m_options, "right", m_out_prefix, asp::stereo_settings().ortho_heights[1]); } // Load an RPC model. Any adjustment in ba_prefix and pixel_offset // will be applied. boost::shared_ptr<vw::camera::CameraModel> StereoSession::load_rpc_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, Vector2 pixel_offset) const { std::string err1, err2; try { if (camera_file != "") return load_adjusted_model(m_camera_loader.load_rpc_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } catch(std::exception const& e1) { err1 = e1.what(); } try { return load_adjusted_model(m_camera_loader.load_rpc_camera_model(image_file), image_file, camera_file, ba_prefix, pixel_offset); } catch(std::exception const& e2) { err2 = e2.what(); } // For Cartosat, GDAL chokes. The user must move {image}_RPC_ORG.TXT // to {image}_RPC.TXT std::string truncated = fs::path(image_file).replace_extension("").string(); std::string org_file = truncated + "_RPC_ORG.TXT"; std::string rpc_file = truncated + "_RPC.TXT"; std::string msg = ""; if (boost::filesystem::exists(org_file)) msg = "Detected file: " + org_file + ". If this is Cartosat data, any such files " "must be moved to names like " + rpc_file + " by overwriting those files if necessary.\n"; // Raise a custom exception if both failed vw_throw(ArgumentErr() << "Unable to load RPC model from either " << image_file << " or " << camera_file << ".\n" << err1 << "\n" << err2 << "\n" << msg); } // End function load_rpc_camera_model } // End namespace asp ================================================ FILE: src/asp/Sessions/StereoSession.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSession.h /// #ifndef __STEREO_SESSION_H__ #define __STEREO_SESSION_H__ #include <asp/Sessions/CameraModelLoader.h> #include <vw/Cartography/GeoReference.h> #include <vw/Camera/CameraModel.h> #include <vw/Image/ImageViewBase.h> #include <vw/Image/ImageViewRef.h> #include <vw/Image/PixelMask.h> #include <vw/Image/Transform.h> #include <vw/FileIO/GdalWriteOptions.h> #include <boost/shared_ptr.hpp> // Forward declarations namespace vw { namespace ip { struct InterestPoint; } } namespace asp { typedef vw::Vector<vw::float32,6> Vector6f; // Forward declarations class StereoSessionFactory; /// Stereo Sessions define for different missions or satellites how to: /// * Initialize, normalize, and align the input imagery /// * Extract the camera model /// * Custom code needed for correlation, filtering, and triangulation. class StereoSession { friend class StereoSessionFactory; // Needed so the factory can call initialize() public: virtual ~StereoSession() {} /// Simple typedef of a factory function that creates a StereoSession instance typedef StereoSession* (*construct_func)(); /// General init function. void initialize(vw::GdalWriteOptions const& options, std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, std::string const& out_prefix, std::string const& input_dem); // The next set of functions describe characteristics of the derived session class. // - These could be made in to some sort of static constant if needed. virtual bool isMapProjected() const { return false; } virtual bool have_datum() const; virtual bool supports_multi_threading () const { return true; } /// Helper function that retrieves both cameras. virtual void camera_models(vw::CamPtr &cam1, vw::CamPtr &cam2); /// Method that produces a Camera Model from input files. virtual vw::CamPtr camera_model(std::string const& image_file, std::string const& camera_file = "", bool quiet = false); /// Method to help determine what session we actually have virtual std::string name() const = 0; /// Specialization for how interest points are found bool ip_matching(std::string const& input_file1, std::string const& input_file2, vw::Vector2 const& uncropped_image_size, Vector6f const& stats1, Vector6f const& stats2, float nodata1, float nodata2, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, std::string const& match_filename, std::string const left_ip_file = "", std::string const right_ip_file = "", vw::BBox2i const& bbox1 = vw::BBox2i(), vw::BBox2i const& bbox2 = vw::BBox2i()); // Returns the target datum to use for a given camera model. // Can be overridden by derived classes. virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam, bool use_sphere_for_non_earth) const; // Peek inside the images and camera models and return the datum and projection, // or at least the datum, packaged in a georef. virtual vw::cartography::GeoReference get_georef(); /// Get the crop ROI applied to the two input images. void get_input_image_crops(vw::BBox2i &left_image_crop, vw::BBox2i &right_image_crop) const; virtual vw::TransformPtr tx_left () const {return tx_left_homography ();} // Default implementation virtual vw::TransformPtr tx_right() const {return tx_right_homography();} // All of the "hook" functions below have default implementations // that just copy the inputs to the outputs! /// Stage 1: Preprocessing /// /// Pre file is a pair of images. (ImageView<PixelT>) /// Post file is a grayscale images. (ImageView<PixelGray<float>>) virtual void preprocessing_hook(bool adjust_left_image_size, std::string const& input_file1, std::string const& input_file2, std::string & output_file1, std::string & output_file2); /// Stage 4: Point cloud generation /// /// Pre file is a disparity map. (ImageView<PixelDisparity<float>>) /// Post file is point image. (ImageView<Vector3>) virtual vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> pre_pointcloud_hook(std::string const& input_file); // Return the left and right cropped images. These are the same as // the input images unless the cropping is on. std::string left_cropped_image(bool do_crop) const; std::string right_cropped_image(bool do_crop) const; // Helper functions to check if cropping is enabled bool do_crop_left() const; bool do_crop_right() const; std::string left_aligned_bathy_mask() const; std::string right_aligned_bathy_mask() const; void read_aligned_bathy_masks (vw::ImageViewRef< vw::PixelMask<float>> & left_aligned_bathy_mask_image, vw::ImageViewRef< vw::PixelMask<float>> & right_aligned_bathy_mask_image); // Align the bathy masks. This will be called in stereo_pprc and, if needed, // in stereo_tri void align_bathy_masks(vw::GdalWriteOptions const& options); // Read a camera used in mapprojection void read_mapproj_cam(std::string const& image_file, std::string const& cam_file, std::string const& adj_prefix, std::string const& cam_type, vw::CamPtr & map_proj_cam); // Read cameras used in mapprojection void read_mapproj_cams(std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, std::string const& input_dem, std::string const& session_name, vw::CamPtr & left_map_proj_cam, vw::CamPtr & right_map_proj_cam); /// Function to load a specific type of camera model with a pixel offset. virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const = 0; protected: // Variables vw::GdalWriteOptions m_options; std::string m_left_image_file, m_right_image_file; std::string m_left_camera_file, m_right_camera_file; std::string m_out_prefix, m_input_dem; /// Object to help with camera model loading, mostly used by derived classes. CameraModelLoader m_camera_loader; /// Storage for the camera models used to map project the input images. /// - Not used in non map-projected sessions. vw::CamPtr m_left_map_proj_model, m_right_map_proj_model; protected: // Prepare input images for preprocessing: load images, handle cropping, // get nodata values. Return 'true' if cached outputs exist and we can // skip reprocessing. bool prepareInputImages(vw::GdalWriteOptions & options, std::string const & left_input_file, std::string const & right_input_file, std::string & left_output_file, std::string & right_output_file, std::string & left_cropped_file, std::string & right_cropped_file, vw::ImageViewRef<float> & left_cropped_image, vw::ImageViewRef<float> & right_cropped_image, float & left_nodata_value, float & right_nodata_value, bool & has_left_georef, bool & has_right_georef, vw::cartography::GeoReference & left_georef, vw::cartography::GeoReference & right_georef); // These are all the currently supported transformation types vw::TransformPtr tx_identity () const; // Not left or right specific vw::TransformPtr tx_left_homography () const; vw::TransformPtr tx_right_homography() const; vw::TransformPtr tx_left_map_trans () const; vw::TransformPtr tx_right_map_trans () const; /// Load an RPC camera model with a pixel offset /// - We define it here so it can be used for reading RPC map projection models and also /// so it does not get duplicated in derived RPC sessions. vw::CamPtr load_rpc_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const; void read_bathy_masks(float & left_bathy_nodata, float & right_bathy_nodata, vw::ImageViewRef< vw::PixelMask<float>> & left_bathy_mask, vw::ImageViewRef< vw::PixelMask<float>> & right_bathy_mask); std::string left_cropped_bathy_mask() const; std::string right_cropped_bathy_mask() const; // Apply epipolar alignment to images, if the camera models are pinhole. This will // be reimplemented in StereoSessionPinhole. virtual void epipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image, vw::ImageViewRef<vw::PixelMask<float>> right_masked_image, vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata, // Outputs vw::ImageViewRef<vw::PixelMask<float>> & Limg, vw::ImageViewRef<vw::PixelMask<float>> & Rimg); // Find the masked images and stats. Handles ISIS special pixels if needed. void calcStatsMaskedImages(// Inputs vw::ImageViewRef<float> const& left_cropped_image, vw::ImageViewRef<float> const& right_cropped_image, float left_nodata_value, float right_nodata_value, std::string const& left_input_file, std::string const& right_input_file, std::string const& left_cropped_file, std::string const& right_cropped_file, // Outputs vw::ImageViewRef<vw::PixelMask<float>> & left_masked_image, vw::ImageViewRef<vw::PixelMask<float>> & right_masked_image, vw::Vector6f & left_stats, vw::Vector6f & right_stats) const; // Find ip matches and determine the alignment matrices void imageAlignment(// Inputs std::string const& out_prefix, std::string const& left_cropped_file, std::string const& right_cropped_file, std::string const& left_uncropped_file, vw::Vector6f const& left_stats, vw::Vector6f const& right_stats, float left_nodata_value, float right_nodata_value, vw::CamPtr left_cam, vw::CamPtr right_cam, bool adjust_left_image_size, // In-out vw::Matrix<double> & align_left_matrix, vw::Matrix<double> & align_right_matrix, vw::Vector2i & left_size, vw::Vector2i & right_size); // Cache here the camera when loaded. Use a mutex to protect the cache. vw::Mutex m_camera_mutex; std::map<std::pair<std::string, std::string>, vw::CamPtr> m_camera_model; }; typedef boost::shared_ptr<StereoSession> SessionPtr; // A wrapper around ip matching. Can also work with NULL cameras // TODO(oalexan1): See if it is possible to not use the stereo session here. void matchIp(std::string const& out_prefix, bool enable_rough_homography, double pct_for_overlap, asp::SessionPtr session, std::string const& image1_path, std::string const& image2_path, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, std::string const& match_filename); // Compute list of matched IP between two images with no cameras void matchIpNoCams(std::string const& image1, std::string const& image2, std::string const& output_prefix, std::vector<vw::ip::InterestPoint> & matched_ip1, std::vector<vw::ip::InterestPoint> & matched_ip2); } // end namespace asp #endif // __STEREO_SESSION_H__ ================================================ FILE: src/asp/Sessions/StereoSessionASTER.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionASTER.cc /// #include <asp/Camera/LinescanASTERModel.h> #include <asp/Sessions/StereoSessionASTER.h> #include <vw/Camera/CameraModel.h> namespace asp { boost::shared_ptr<vw::camera::CameraModel> StereoSessionASTER::load_camera_model (std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_ASTER_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } } // End namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionASTER.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionASTER.h /// /// This a session to support ASTER satellite images. #ifndef __STEREO_SESSION_ASTER_H__ #define __STEREO_SESSION_ASTER_H__ #include <asp/Sessions/StereoSessionGdal.h> namespace asp { /// Session class for ASTER images. class StereoSessionASTER: public StereoSessionGdal { public: StereoSessionASTER(){} virtual ~StereoSessionASTER(){} virtual std::string name() const { return "aster"; } /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionASTER); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const; }; } // End namespace asp #endif//__STEREO_SESSION_ASTER_H__ ================================================ FILE: src/asp/Sessions/StereoSessionBathy.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionBathy.cc /// #include <asp/Sessions/StereoSession.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/Bathymetry.h> #include <asp/Core/FileUtils.h> #include <asp/Core/AlignmentUtils.h> #include <vw/Core/Log.h> #include <vw/Image/PixelMask.h> #include <vw/FileIO/DiskImageView.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/FileUtils.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Math/Geometry.h> #include <boost/filesystem/operations.hpp> using namespace vw; using namespace vw::cartography; namespace asp { // Crop the bathy mask to match the crop window. This only does the cropping and // does not interpret which pixels are land or water. That is handled later by // read_bathy_mask() when the cropped mask is read. void crop_bathy_mask(vw::GdalWriteOptions const& options, std::string const& input_mask_file, std::string const& input_image_file, BBox2i const& crop_win, std::string const& cropped_mask_file) { if (input_mask_file == "") vw_throw(ArgumentErr() << "Required bathy mask file was not specified."); // Sanity check, input image and mask must have same size DiskImageView<float> input_image(input_image_file); DiskImageView<float> input_bathy_mask(input_mask_file); if (input_bathy_mask.cols() != input_image.cols() || input_bathy_mask.rows() != input_image.rows()) vw_throw(ArgumentErr() << "Input image and input bathy mask don't have the same dimensions."); // Read nodata from the file. If absent, default to 0 (water pixels have // non-positive values). The full masking logic is in read_bathy_mask(). float mask_nodata_value = 0.0f; vw::read_nodata_val(input_mask_file, mask_nodata_value); vw::cartography::GeoReference georef; bool has_georef = read_georeference(georef, input_image_file); bool has_mask_nodata = true; vw_out() << "\t--> Writing cropped mask: " << cropped_mask_file << "\n"; block_write_gdal_image(cropped_mask_file, crop(input_bathy_mask, crop_win), has_georef, crop(georef, crop_win), has_mask_nodata, mask_nodata_value, options, TerminalProgressCallback("asp", "\t: ")); } void StereoSession::read_aligned_bathy_masks (vw::ImageViewRef<vw::PixelMask<float>> & left_aligned_bathy_mask_image, vw::ImageViewRef<vw::PixelMask<float>> & right_aligned_bathy_mask_image) { float left_nodata = -std::numeric_limits<float>::max(); float right_nodata = -std::numeric_limits<float>::max(); left_aligned_bathy_mask_image = vw::read_bathy_mask(left_aligned_bathy_mask(), left_nodata); right_aligned_bathy_mask_image = vw::read_bathy_mask(right_aligned_bathy_mask(), right_nodata); } std::string StereoSession::left_cropped_bathy_mask() const { if (!asp::doBathy(asp::stereo_settings())) vw_throw(ArgumentErr() << "The left cropped bathy mask is requested when " << "bathymetry mode is not on."); bool crop_left = do_crop_left(); if (!crop_left) return stereo_settings().left_bathy_mask; return this->m_out_prefix + "-L_cropped_bathy_mask.tif"; } std::string StereoSession::right_cropped_bathy_mask() const { if (!asp::doBathy(asp::stereo_settings())) vw_throw(ArgumentErr() << "The right cropped bathy mask is requested when " << "bathymetry mode is not on."); bool crop_right = do_crop_right(); if (!crop_right) return stereo_settings().right_bathy_mask; return this->m_out_prefix + "-R_cropped_bathy_mask.tif"; } std::string StereoSession::left_aligned_bathy_mask() const { return m_out_prefix + "-L_aligned_bathy_mask.tif"; } std::string StereoSession::right_aligned_bathy_mask() const { return m_out_prefix + "-R_aligned_bathy_mask.tif"; } // Align the bathy masks. This will be called in stereo_pprc and, if // needed, in stereo_tri. Skip this if the masks already exit and are // not older than the images. This code mirrors very closely the logic // for how the images are aligned. // TODO(oalexan1): Such duplication of logic is not good. void StereoSession::align_bathy_masks(vw::GdalWriteOptions const& options) { bool do_bathy = asp::doBathy(asp::stereo_settings()); if (!do_bathy) return; // Check the timestamp of aligned masks std::vector<std::string> check_files; check_files.push_back(m_left_image_file); check_files.push_back(m_right_image_file); check_files.push_back(m_left_camera_file); check_files.push_back(m_right_camera_file); check_files.push_back(stereo_settings().left_bathy_mask); check_files.push_back(stereo_settings().right_bathy_mask); bool crop_left = do_crop_left(); bool crop_right = do_crop_right(); bool rebuild = (!first_is_newer(left_aligned_bathy_mask(), check_files) || !first_is_newer(right_aligned_bathy_mask(), check_files)); if (!rebuild && !crop_left && !crop_right) { try { vw_log().console_log().rule_set().add_rule(-1, "fileio"); DiskImageView<float> left_bathy_mask (left_aligned_bathy_mask()); DiskImageView<float> right_bathy_mask(right_aligned_bathy_mask()); vw_out(InfoMessage) << "\t--> Using cached aligned bathy masks.\n"; vw_settings().reload_config(); return; // no need to rebuild, the results exit and are good } catch (vw::ArgumentErr const& e) { // This throws on a corrupted file. vw_settings().reload_config(); } catch (vw::IOErr const& e) { vw_settings().reload_config(); } } // End check for existing output files // See if to crop the masks if (crop_left) { DiskImageView<float> left_orig_image(m_left_image_file); BBox2i left_win = stereo_settings().left_image_crop_win; left_win.crop(bounding_box(left_orig_image)); crop_bathy_mask(options, stereo_settings().left_bathy_mask, m_left_image_file, left_win, left_cropped_bathy_mask()); } if (crop_right) { DiskImageView<float> right_orig_image(m_right_image_file); BBox2i right_win = stereo_settings().right_image_crop_win; right_win.crop(bounding_box(right_orig_image)); crop_bathy_mask(options, stereo_settings().right_bathy_mask, m_right_image_file, right_win, right_cropped_bathy_mask()); } // Read the unaligned cropped masks ImageViewRef<PixelMask<float>> left_bathy_mask, right_bathy_mask; float left_bathy_nodata = -std::numeric_limits<float>::max(); float right_bathy_nodata = -std::numeric_limits<float>::max(); StereoSession::read_bathy_masks(left_bathy_nodata, right_bathy_nodata, left_bathy_mask, right_bathy_mask); // Use no-data in interpolation and edge extension. PixelMask<float>bathy_nodata_pix(0); bathy_nodata_pix.invalidate(); ValueEdgeExtension<PixelMask<float>> bathy_ext_nodata(bathy_nodata_pix); // Get the aligned size from the images already aligned Vector2i left_size; std::string left_aligned_file = this->m_out_prefix + "-L.tif"; if (boost::filesystem::exists(left_aligned_file)) left_size = file_image_size(left_aligned_file); else vw_throw(NoImplErr() << "Could not read: " << left_aligned_file); // Read alignment matrices vw::Matrix<double> align_left_matrix = asp::alignmentMatrix(this->m_out_prefix, asp::stereo_settings().alignment_method, "left"); vw::Matrix<double> align_right_matrix = asp::alignmentMatrix(this->m_out_prefix, asp::stereo_settings().alignment_method, "right"); // Generate aligned versions of the masks according to the options. ImageViewRef<PixelMask<float>> left_aligned_bathy_mask, right_aligned_bathy_mask; if (stereo_settings().alignment_method == "homography" || stereo_settings().alignment_method == "affineepipolar" || stereo_settings().alignment_method == "local_epipolar") { left_aligned_bathy_mask = transform(left_bathy_mask, HomographyTransform(align_left_matrix), left_size.x(), left_size.y()); // Note how we use left_size and not right_size right_aligned_bathy_mask = transform(right_bathy_mask, HomographyTransform(align_right_matrix), left_size.x(), left_size.y()); } else if (stereo_settings().alignment_method == "none") { // No alignment left_aligned_bathy_mask = left_bathy_mask; right_aligned_bathy_mask = right_bathy_mask; } // End of image alignment block bool has_bathy_nodata = true; float output_nodata = -32768.0; // Read the georef of the cropped left and right images saved before the masks vw::cartography::GeoReference left_georef, right_georef; bool has_left_georef = read_georeference(left_georef, this->left_cropped_image(crop_left)); bool has_right_georef = read_georeference(right_georef, this->right_cropped_image(crop_right)); std::string left_aligned_bathy_mask_file = StereoSession::left_aligned_bathy_mask(); vw_out() << "\t--> Writing: " << left_aligned_bathy_mask_file << "\n"; block_write_gdal_image(left_aligned_bathy_mask_file, apply_mask(left_aligned_bathy_mask, left_bathy_nodata), has_left_georef, left_georef, has_bathy_nodata, left_bathy_nodata, options, TerminalProgressCallback("asp","\t L bathy mask: ")); // Use same logic as when the right aligned image is written if (stereo_settings().alignment_method == "none") { std::string right_aligned_bathy_mask_file = StereoSession::right_aligned_bathy_mask(); vw_out() << "\t--> Writing: " << right_aligned_bathy_mask_file << "\n"; block_write_gdal_image(right_aligned_bathy_mask_file, apply_mask(right_aligned_bathy_mask, right_bathy_nodata), has_right_georef, right_georef, has_bathy_nodata, right_bathy_nodata, options, TerminalProgressCallback("asp","\t R bathy mask: ")); } else { std::string right_aligned_bathy_mask_file = StereoSession::right_aligned_bathy_mask(); vw_out() << "\t--> Writing: " << right_aligned_bathy_mask_file << "\n"; block_write_gdal_image(right_aligned_bathy_mask_file, apply_mask(crop(edge_extend(right_aligned_bathy_mask, bathy_ext_nodata), // Note how we use the left aligned mask bbox bounding_box(left_aligned_bathy_mask)), right_bathy_nodata), has_right_georef, right_georef, has_bathy_nodata, right_bathy_nodata, options, TerminalProgressCallback("asp","\t R bathy mask: ")); } } void StereoSession::read_bathy_masks(float & left_bathy_nodata, float & right_bathy_nodata, vw::ImageViewRef<vw::PixelMask<float>> & left_bathy_mask, vw::ImageViewRef<vw::PixelMask<float>> & right_bathy_mask) { left_bathy_mask = vw::read_bathy_mask(left_cropped_bathy_mask(), left_bathy_nodata); right_bathy_mask = vw::read_bathy_mask(right_cropped_bathy_mask(), right_bathy_nodata); // The left image (after crop) better needs to have the same dims // as the left mask after crop, and same for the right bool crop_left = do_crop_left(); bool crop_right = do_crop_right(); DiskImageView<float> left_image(this->left_cropped_image(crop_left)); DiskImageView<float> right_image(this->right_cropped_image(crop_right)); if (left_bathy_mask.cols() != left_image.cols() || left_bathy_mask.rows() != left_image.rows() || right_bathy_mask.cols() != right_image.cols() || right_bathy_mask.rows() != right_image.rows()) { vw_throw(ArgumentErr() << "The dimensions of bathymetry masks don't agree " << "with the image sizes (after crop win, if applicable)."); } } } // End namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionFactory.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionFactory.cc #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Sessions/StereoSessionMapProj.h> #include <asp/Sessions/StereoSessionIsis.h> #include <asp/Sessions/StereoSessionNadirPinhole.h> #include <asp/Sessions/StereoSessionPinhole.h> #include <asp/Sessions/StereoSessionRPC.h> #include <asp/Sessions/StereoSessionASTER.h> #include <asp/Camera/SPOT_XML.h> #include <asp/Camera/ASTER_XML.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #include <asp/Core/StereoSettings.h> #include <asp/Core/ImageUtils.h> #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisInterface.h> #endif // ASP_HAVE_PKG_ISIS #include <vw/FileIO/DiskImageResourceRaw.h> #include <vw/Camera/CameraUtilities.h> #include <vw/Camera/OpticalBarModel.h> #include <vw/FileIO/FileTypes.h> namespace asp { // Parse the ortho heights (terrain heights) from the cameras, if they exist. // If opt_heights is already set, it has priority. Otherwise this will // populate those heights from the cameras. void handleOrthoHeights(std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, bool total_quiet, vw::Vector2 & opt_heights) { bool quiet = true; StereoSessionRPC session; vw::CamPtr cam1 = session.camera_model(left_image_file, left_camera_file, quiet); vw::CamPtr cam2 = session.camera_model(right_image_file, right_camera_file, quiet); asp::RPCModel const* rpc1 = dynamic_cast<asp::RPCModel const*>(vw::camera::unadjusted_model(cam1.get())); asp::RPCModel const* rpc2 = dynamic_cast<asp::RPCModel const*>(vw::camera::unadjusted_model(cam2.get())); if ((rpc1 == NULL) != (rpc2 == NULL)) vw::vw_throw(vw::ArgumentErr() << "Expecting both or neither cameras to be RPC.\n"); if (rpc1 == NULL || rpc2 == NULL) return; double cam_ht1 = rpc1->m_terrain_height; double cam_ht2 = rpc2->m_terrain_height; // Left if (!std::isnan(opt_heights[0]) && !std::isnan(cam_ht1) && opt_heights[0] != cam_ht1 && !total_quiet) vw::vw_out() << "Will use first entry in --ortho-heights instead of " << "the corresponding entry in the left camera file.\n"; if (std::isnan(opt_heights[0]) && !std::isnan(cam_ht1)) opt_heights[0] = cam_ht1; // Right if (!std::isnan(opt_heights[1]) && !std::isnan(cam_ht2) && opt_heights[1] != cam_ht2 && !total_quiet) vw::vw_out() << "Will use second entry in --ortho-heights instead of " << "the corresponding entry in the right camera file.\n"; if (std::isnan(opt_heights[1]) && !std::isnan(cam_ht2)) opt_heights[1] = cam_ht2; } SessionPtr StereoSessionFactory::create(std::string & session_type, // in-out vw::GdalWriteOptions const& options, std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, std::string const& out_prefix, std::string const& input_dem, bool allow_map_promote, bool total_quiet) { // Known user session types are: // DG, RPC, ISIS, Pinhole, NadirPinhole, OpticalBar, etc. // // Hidden sessions are: // DGMapRPC, Blank (Guessing) // Try to guess the session if not provided std::string actual_session_type = session_type; bool quiet = true; boost::to_lower(actual_session_type); if (actual_session_type.empty()) { if (vw::has_pinhole_extension(left_camera_file) || vw::has_pinhole_extension(right_camera_file)) { // There can be several types of .tsai files std::string error_pinhole, error_opticalbar; try { boost::shared_ptr<vw::camera::CameraModel> P = vw::camera::load_pinhole_camera_model(left_camera_file); actual_session_type = "pinhole"; }catch (std::exception & e) { error_pinhole = e.what(); try { vw::camera::OpticalBarModel P; P.read(left_camera_file); actual_session_type = "opticalbar"; }catch (std::exception & e) { error_opticalbar = e.what(); vw_throw(vw::NoImplErr() << "Could not read the camera model " << left_camera_file << " as pinhole. " << "The error was: " << error_pinhole << "\n" << "Could not read it as opticalbar model either, the error was: " << error_opticalbar); } } } else if (vw::has_isd_extension(left_camera_file) || vw::has_isd_extension(right_camera_file)) { actual_session_type = "csm"; #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 } else if (boost::iends_with(boost::to_lower_copy(left_image_file), ".cub") && left_camera_file == "" && asp::isis::IsisCubeHasCsmBlob(left_image_file)) { // The image has a CSM blob and there is no separate camera file actual_session_type = "csm"; } else if (boost::iends_with(boost::to_lower_copy(left_camera_file), ".cub") && asp::isis::IsisCubeHasCsmBlob(left_camera_file)) { // The camera file has a CSM blob actual_session_type = "csm"; #endif // ASP_HAVE_PKG_ISIS } else if (boost::iends_with(boost::to_lower_copy(left_image_file ), ".cub") || boost::iends_with(boost::to_lower_copy(right_image_file ), ".cub") || boost::iends_with(boost::to_lower_copy(left_camera_file ), ".cub") || boost::iends_with(boost::to_lower_copy(right_camera_file), ".cub")) { actual_session_type = "isis"; } else if (boost::iends_with(boost::to_lower_copy(left_camera_file ), ".dim") || boost::iends_with(boost::to_lower_copy(right_camera_file), ".dim")) { actual_session_type = "spot5"; } else if (boost::iends_with(boost::to_lower_copy(left_camera_file ), ".xml") || boost::iends_with(boost::to_lower_copy(right_camera_file), ".xml")) { // Here we have several options for .xml files. Note that a // Digital Globe xml file has both linescan and RPC // models. The logic below favors the linescan sensor. if (actual_session_type.empty()) { // TODO(oalexan1): Try to peek in the xml file instead of doing this exhaustive // checking. // Try DG exact linescan model try { StereoSessionDG session; boost::shared_ptr<vw::camera::CameraModel> left_model = session.camera_model(left_image_file, left_camera_file, quiet), right_model = session.camera_model(right_image_file, right_camera_file, quiet); actual_session_type = "dg"; } catch (...) {} } if (actual_session_type.empty()) { // Try PeruSat exact linescan model try { StereoSessionPeruSat session; boost::shared_ptr<vw::camera::CameraModel> left_model = session.camera_model(left_image_file, left_camera_file, quiet), right_model = session.camera_model(right_image_file, right_camera_file, quiet); actual_session_type = "perusat"; } catch (...) {} } if (actual_session_type.empty()) { // Try SPOT 6/7 exact linescan model (before Pleiades, same DIMAP V2 family) try { StereoSessionSpot67 session; boost::shared_ptr<vw::camera::CameraModel> left_model = session.camera_model(left_image_file, left_camera_file, quiet), right_model = session.camera_model(right_image_file, right_camera_file, quiet); actual_session_type = "spot"; } catch (...) {} } if (actual_session_type.empty()) { // Try Pleiades exact linescan model try { StereoSessionPleiades session; boost::shared_ptr<vw::camera::CameraModel> left_model = session.camera_model(left_image_file, left_camera_file, quiet), right_model = session.camera_model(right_image_file, right_camera_file, quiet); actual_session_type = "pleiades"; } catch (...) {} } if (actual_session_type.empty()) { // Try the ASTER exact linescan model try { StereoSessionASTER session; boost::shared_ptr<vw::camera::CameraModel> left_model = session.camera_model(left_image_file, left_camera_file, quiet), right_model = session.camera_model(right_image_file, right_camera_file, quiet); actual_session_type = "aster"; } catch (...) {} } } // end considering the xml extension case // Try RPC, which can either have xml cameras or no cameras at all (if embedded // in the tif files). if (actual_session_type.empty()) { try { StereoSessionRPC session; boost::shared_ptr<vw::camera::CameraModel> left_model = session.camera_model(left_image_file, left_camera_file, quiet), right_model = session.camera_model(right_image_file, right_camera_file, quiet); actual_session_type = "rpc"; } catch (...) {} } } // If the session name starts with rpc, read the ortho heights, if available. if (boost::to_lower_copy(actual_session_type).find("rpc") == 0) handleOrthoHeights(left_image_file, right_image_file, left_camera_file, right_camera_file, total_quiet, asp::stereo_settings().ortho_heights); vw::Vector2 heights = asp::stereo_settings().ortho_heights; bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1])); if (allow_map_promote) { // The case of images mapprojected onto some surface of constant height if (have_heights) { size_t pos = actual_session_type.find("map"); if (pos != std::string::npos) actual_session_type = actual_session_type.substr(0, pos); // wipe map and after actual_session_type = actual_session_type + "map" + actual_session_type; } // Read the camera model type from the mapprojection metadata. std::string l_cam_type; if (!input_dem.empty()) { std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key; std::string adj, img, cam_file, dem; asp::read_mapproj_header(left_image_file, adj_key, img_key, cam_type_key, cam_file_key, dem_key, adj, img, l_cam_type, cam_file, dem); } if (!input_dem.empty() && actual_session_type == "dg") { // User says DG but also gives a DEM. // Mapprojection can happen either with DG or RPC cameras if (l_cam_type == "dg") actual_session_type = "dgmapdg"; else actual_session_type = "dgmaprpc"; // used also when l_cam_type is empty } if (!input_dem.empty() && actual_session_type == "rpc") { // User says RPC but also gives a DEM. actual_session_type = "rpcmaprpc"; } if (!input_dem.empty() && actual_session_type == "pinhole") { // User says PINHOLE but also gives a DEM. actual_session_type = "pinholemappinhole"; } if (!input_dem.empty() && actual_session_type == "opticalbar") { // User says OPTICAL BAR but also gives a DEM. actual_session_type = "opticalbarmapopticalbar"; } if (!input_dem.empty() && actual_session_type == "csm") { // User says CSM but also gives a DEM. // Mapprojection can happen either with CSM or RPC cameras if (l_cam_type == "rpc") actual_session_type = "csmmaprpc"; else actual_session_type = "csmmapcsm"; // used also when l_cam_type is empty } if (!input_dem.empty() && actual_session_type == "isis") { // User says ISIS but also gives a DEM. actual_session_type = "isismapisis"; } if (!input_dem.empty() && actual_session_type == "spot5") { // User says SPOT5 but also gives a DEM. actual_session_type = "spot5maprpc"; } if (!input_dem.empty() && actual_session_type == "aster") { // User says ASTER but also gives a DEM. // Mapprojection can happen either with ASTER or RPC cameras if (l_cam_type == "aster") actual_session_type = "astermapaster"; else actual_session_type = "astermaprpc"; // used also when l_cam_type is empty } if (!input_dem.empty() && actual_session_type == "pleiades") { // User says Pleiades but also gives a DEM. actual_session_type = "pleiadesmappleiades"; } if (!input_dem.empty() && actual_session_type == "spot") { // User says SPOT 6/7 but also gives a DEM. actual_session_type = "spotmapspot"; } // Quietly switch from nadirpinhole to pinhole for mapprojected images if (!input_dem.empty() && actual_session_type == "nadirpinhole") { // User says nadirpinhole but also gives a DEM. actual_session_type = "pinholemappinhole"; } } // End map promotion section // For ISIS and CSM sessions with mapprojected images, camera files must be // provided separately. Unlike RPC/DG where camera info is embedded in the // image header, ISIS and CSM cameras are in external files (.cub or .json). // This catches both cam2map asp_map=true cubes (no embedded camera) and the // case of .tif images mapprojected with ISIS/CSM cameras. if (!input_dem.empty() && (actual_session_type == "isismapisis" || actual_session_type == "csmmapcsm") && (left_camera_file.empty() || right_camera_file.empty()) && !asp::stereo_settings().correlator_mode) vw_throw(vw::ArgumentErr() << "The input images are mapprojected. Camera files must be " << "provided as the 3rd and 4th arguments.\n"); if (!input_dem.empty() && actual_session_type == "perusat") { // User says PeruSat-1 or Pleiades but also gives a DEM, so the images were mapprojected. // If the mapprojection was done with the exact model, stereo becomes // painfully slow. If it was done with the RPC model, things become hard // to manage, and stereo needs to know both the exact and RPC model // and those are in different files. Hence, just don't allow mapprojected // images in this case. vw_throw(vw::NoImplErr() << "Stereo with mapprojected images and the " << "PeruSat-1 linescan model is not implemented. " << "Use instead the RPC model."); } // We should know the session type by now. VW_ASSERT(!actual_session_type.empty(), vw::ArgumentErr() << "Could not determine stereo session type. " << "Please set it explicitly with the --session-type option.\n"); if (!total_quiet) vw::vw_out() << "Using session: " << actual_session_type << "\n"; // Compare the current session name to all recognized types // - Only one of these will ever get triggered SessionPtr session; if (actual_session_type == "dg") session = StereoSessionDG::construct(); else if (actual_session_type == "dgmaprpc") session = StereoSessionDGMapRPC::construct(); else if (actual_session_type == "dgmapdg") session = StereoSessionDGMapDG::construct(); else if (actual_session_type == "nadirpinhole") session = StereoSessionNadirPinhole::construct(); else if (actual_session_type == "pinhole") session = StereoSessionPinhole::construct(); else if (actual_session_type == "rpc") session = StereoSessionRPC::construct(); else if (actual_session_type == "rpcmaprpc") session = StereoSessionRPCMapRPC::construct(); else if (actual_session_type == "pinholemappinhole") session = StereoSessionPinholeMapPinhole::construct(); else if (actual_session_type == "opticalbarmapopticalbar") session = StereoSessionBarMapBar::construct(); else if (actual_session_type == "spot5maprpc") session = StereoSessionSpot5MapRPC::construct(); else if (actual_session_type == "astermapaster") session = StereoSessionASTERMapASTER::construct(); else if (actual_session_type == "astermaprpc") session = StereoSessionASTERMapRPC::construct(); else if (actual_session_type == "pleiadesmappleiades") session = StereoSessionPleiadesMapPleiades::construct(); else if (actual_session_type == "spotmapspot") session = StereoSessionSpot67MapSpot67::construct(); #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 else if (actual_session_type == "isis") session = StereoSessionIsis::construct(); else if (actual_session_type == "isismapisis") session = StereoSessionIsisMapIsis::construct(); #endif else if (actual_session_type == "spot5") session = StereoSessionSpot::construct(); else if (actual_session_type == "perusat") session = StereoSessionPeruSat::construct(); else if (actual_session_type == "spot") session = StereoSessionSpot67::construct(); else if (actual_session_type == "pleiades") session = StereoSessionPleiades::construct(); else if (actual_session_type == "aster") session = StereoSessionASTER::construct(); else if (actual_session_type == "opticalbar") session = StereoSessionOpticalBar::construct(); else if (actual_session_type == "csm") session = StereoSessionCsm::construct(); else if (actual_session_type == "csmmapcsm") session = StereoSessionCsmMapCsm::construct(); else if (actual_session_type == "csmmaprpc") session = StereoSessionCsmMapRpc::construct(); if (!session) vw_throw(vw::NoImplErr() << "Unsupported stereo session type: " << actual_session_type); session->initialize(options, // Initialize the new object left_image_file, right_image_file, left_camera_file, right_camera_file, out_prefix, input_dem); session_type = session->name(); // update the session name return session; } // End function create() } // end namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionFactory.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionFactory.h /// #ifndef __STEREO_SESSION_FACTORY_H__ #define __STEREO_SESSION_FACTORY_H__ #include <asp/Sessions/StereoSession.h> #include <vw/FileIO/DiskImageResource.h> #include <vw/Cartography/GeoReference.h> namespace asp { class StereoSessionFactory { public: /// Given the input arguments, selects the correct type of StereoSession and initializes it. static SessionPtr create(std::string & session_type, // in-out variable vw::GdalWriteOptions const& options, std::string const& left_image_file = "", std::string const& right_image_file = "", std::string const& left_camera_file = "", std::string const& right_camera_file = "", std::string const& out_prefix = "", std::string const& input_dem = "", bool allow_map_promote=true, // If true, allow isis to become isismapisis based on dem availability bool total_quiet = false); private: StereoSessionFactory() {} // Prevent construction of static-only class }; // End class StereoSessionFactory } // end namespace asp #endif // __STEREO_SESSION_FACTORY_H__ ================================================ FILE: src/asp/Sessions/StereoSessionGdal.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionGdal.cc /// #include <asp/Core/StereoSettings.h> #include <asp/Core/AffineEpipolar.h> #include <asp/Core/FileUtils.h> #include <asp/Sessions/StereoSessionGdal.h> #include <asp/Sessions/StereoSessionASTER.h> #include <asp/Sessions/StereoSessionNadirPinhole.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/RPC_XML.h> #include <vw/Image/ImageMath.h> #include <vw/Image/Manipulation.h> #include <vw/Image/MaskViews.h> #include <vw/Image/Transform.h> #include <vw/Math/Matrix.h> #include <vw/Cartography/Datum.h> #include <boost/shared_ptr.hpp> #include <boost/filesystem/operations.hpp> namespace fs = boost::filesystem; #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace vw; namespace asp { /// Returns the target datum to use for a given camera model vw::cartography::Datum StereoSessionCsm::get_datum(const vw::camera::CameraModel* cam, bool use_sphere_for_non_earth) const { // Peek at the .cub file to get the planet name without reading // it as an ISIS camera (which can fail unless the ISISDATA // folder exists, and for CSM that is not guaranteed.) // The CSM camera .json file itself lacks this information. std::string spheroid_name = asp::read_target_name(m_left_image_file); const asp::CsmModel * csm_cam = dynamic_cast<const asp::CsmModel*>(vw::camera::unadjusted_model(cam)); VW_ASSERT(csm_cam != NULL, vw::ArgumentErr() << "Could not load a CSM camera.\n"); return csm_cam->get_datum_csm(spheroid_name, use_sphere_for_non_earth); } } // End namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionGdal.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionGdal.h /// /// #ifndef __STEREO_SESSION_GDAL_H__ #define __STEREO_SESSION_GDAL_H__ #include <asp/Sessions/StereoSession.h> #include <asp/Core/BaseCameraUtils.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/RPC_XML.h> #include <asp/Camera/CsmModel.h> namespace asp { /// Generic stereoSession implementation for images which we can /// read/write with GDAL. This class adds a "preprocessing hook" /// which aligns and normalizes the images using the specified /// methods. Derived classes need to set up camera model loading. class StereoSessionGdal: public StereoSession { public: StereoSessionGdal(){} virtual ~StereoSessionGdal(){} virtual std::string name() const = 0; }; //---------------------------------------------------------- // Stereo session for Digital Globe images. class StereoSessionDG: public StereoSessionGdal { public: StereoSessionDG(){} virtual ~StereoSessionDG(){} virtual std::string name() const { return "dg"; } /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionDG);} protected: /// Function to load a camera model of the particular type. virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_dg_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; //---------------------------------------------------------- /// Stereo session for optical bar cameras such as Corona and Hexagon. class StereoSessionOpticalBar: public StereoSessionGdal { public: StereoSessionOpticalBar(){} virtual ~StereoSessionOpticalBar(){} virtual std::string name() const { return "opticalbar"; } /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionOpticalBar);} protected: /// Function to load a camera model of the particular type. virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_optical_bar_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; //---------------------------------------------------------- /// Stereo session for CSM camera models that use GDAL compatible image files. /// - CSM files can also be used with ISIS image data, in which case /// they use StereoSessionIsis. class StereoSessionCsm: public StereoSessionGdal { // TODO(oalexan1): Should one deal with ISIS special pixels like for ISIS? public: StereoSessionCsm(){} virtual ~StereoSessionCsm(){} virtual std::string name() const { return "csm"; } /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionCsm);} /// Returns the target datum to use for a given camera model virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam, bool use_sphere_for_non_earth) const; protected: /// Function to load a camera model of the particular type. virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_csm_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// StereoSession instance for processing SPOT5 data. class StereoSessionSpot: public StereoSessionGdal { public: StereoSessionSpot(){} virtual ~StereoSessionSpot(){} virtual std::string name() const { return "spot5"; } /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionSpot); } protected: /// Function to load a camera model of the particular type. virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const{ return load_adjusted_model(m_camera_loader.load_spot5_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// StereoSession instance for processing PeruSat data. class StereoSessionPeruSat: public StereoSessionGdal { public: StereoSessionPeruSat(){} virtual ~StereoSessionPeruSat(){} virtual std::string name() const { return "perusat"; } /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionPeruSat); } protected: /// Function to load a camera model of the particular type. virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const{ return load_adjusted_model(m_camera_loader.load_perusat_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// StereoSession instance for processing Pleiades data. class StereoSessionPleiades: public StereoSessionGdal { public: StereoSessionPleiades(){} virtual ~StereoSessionPleiades(){} virtual std::string name() const { return "pleiades"; } /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionPleiades); } protected: /// Function to load a camera model of the particular type. virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const{ return load_adjusted_model(m_camera_loader.load_pleiades_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// StereoSession instance for processing SPOT 6/7 data. /// Uses the same camera model as Pleiades NEO. class StereoSessionSpot67: public StereoSessionPleiades { public: StereoSessionSpot67(){} virtual ~StereoSessionSpot67(){} virtual std::string name() const { return "spot"; } static SessionPtr construct() { return SessionPtr(new StereoSessionSpot67); } protected: virtual vw::CamPtr load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const{ return load_adjusted_model(m_camera_loader.load_spot_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; } // End namespace asp #endif//__STEREO_SESSION_GDAL_H__ ================================================ FILE: src/asp/Sessions/StereoSessionIo.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionIo.cc /// #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/IsisIO/IsisSpecialPixels.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/Bathymetry.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/FileUtils.h> #include <asp/Core/AlignmentUtils.h> #include <vw/Core/Log.h> #include <vw/Core/Stopwatch.h> #include <vw/Image/PixelMask.h> #include <vw/FileIO/DiskImageResource.h> #include <vw/FileIO/DiskImageView.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/ImageChannelRead.h> #include <vw/FileIO/FileUtils.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Math/Geometry.h> using namespace vw; using namespace vw::cartography; namespace fs = boost::filesystem; namespace asp { // Find the masked images and stats. Handles ISIS special pixels if needed. void StereoSession:: calcStatsMaskedImages(// Inputs vw::ImageViewRef<float> const& left_cropped_image, vw::ImageViewRef<float> const& right_cropped_image, float left_nodata_value, float right_nodata_value, std::string const& left_input_file, std::string const& right_input_file, std::string const& left_cropped_file, std::string const& right_cropped_file, // Outputs vw::ImageViewRef<vw::PixelMask<float>> & left_masked_image, vw::ImageViewRef<vw::PixelMask<float>> & right_masked_image, vw::Vector6f & left_stats, vw::Vector6f & right_stats) const { // Form the masked imagess left_masked_image = create_mask(left_cropped_image, left_nodata_value); right_masked_image = create_mask(right_cropped_image, right_nodata_value); // Handle ISIS special pixels for .cub files (isis and csm sessions) bool isIsis = (fs::path(left_input_file).extension() == ".cub"); if (isIsis) adjustIsisImage(left_input_file, left_nodata_value, left_masked_image); if (fs::path(right_input_file).extension() == ".cub") adjustIsisImage(right_input_file, right_nodata_value, right_masked_image); // In --stereo-dist-mode, want the stats from the original images which should already exist std::string left_file, right_file; if (!asp::stereo_settings().stereo_dist_mode) { left_file = left_cropped_file; right_file = right_cropped_file; } else { left_file = left_input_file; right_file = right_input_file; } // For ISIS, do not exceed min and max as there could be special pixels bool adjust_min_max_with_std = isIsis && !stereo_settings().force_use_entire_range; // Compute input image statistics vw::Stopwatch sw1; sw1.start(); left_stats = gather_stats(left_masked_image, this->m_out_prefix, left_file, asp::stereo_settings().force_reuse_match_files, adjust_min_max_with_std); sw1.stop(); vw_out() << "Left image stats time: " << sw1.elapsed_seconds() << "\n"; vw::Stopwatch sw2; sw2.start(); right_stats = gather_stats(right_masked_image, this->m_out_prefix, right_file, asp::stereo_settings().force_reuse_match_files, adjust_min_max_with_std); sw2.stop(); vw_out() << "Right image stats time: " << sw2.elapsed_seconds() << "\n"; } // Default preprocessing hook. Some sessions may override it. void StereoSession::preprocessing_hook(bool adjust_left_image_size, std::string const& left_input_file, std::string const& right_input_file, std::string & left_output_file, std::string & right_output_file) { // Handle skip_image_normalization mode. Create symlinks instead of normalized // images, but still compute stats further down (needed for subpixel modes 2 // and 3). The validation for this mode was done earlier in stereo_pprc.cc. if (stereo_settings().skip_image_normalization) { vw_out(WarningMessage) << "Skipping image normalization.\n"; createSymLinks(left_input_file, right_input_file, m_out_prefix, left_output_file, right_output_file); } std::string left_cropped_file, right_cropped_file; ImageViewRef<float> left_cropped_image, right_cropped_image; vw::GdalWriteOptions options; float left_nodata_value, right_nodata_value; bool has_left_georef, has_right_georef; vw::cartography::GeoReference left_georef, right_georef; bool exit_early = StereoSession::prepareInputImages(options, left_input_file, right_input_file, left_output_file, right_output_file, left_cropped_file, right_cropped_file, left_cropped_image, right_cropped_image, left_nodata_value, right_nodata_value, has_left_georef, has_right_georef, left_georef, right_georef); if (exit_early) return; // For skip_image_normalization, use L.tif/R.tif paths for stats file naming // so that later stages (stereo_rfne) can find them. if (stereo_settings().skip_image_normalization) { left_cropped_file = left_output_file; right_cropped_file = right_output_file; } ImageViewRef<PixelMask<float>> left_masked_image, right_masked_image; Vector6f left_stats, right_stats; // Set up the image masks and compute the stats. If the user provided a custom // no-data value, values no more than that have been masked by now in // prepareInputImages. this->calcStatsMaskedImages(// Inputs left_cropped_image, right_cropped_image, left_nodata_value, right_nodata_value, left_input_file, right_input_file, left_cropped_file, right_cropped_file, // Outputs left_masked_image, right_masked_image, left_stats, right_stats); // If the user only wanted stats, stop here. Doing exit(0) seems to be simpler // than tracing back a flag. This is needed for stereo_dist. if (stereo_settings().stop_after_stats) { vw_out() << "Stopping after computing image statistics.\n"; exit(0); } // For skip_image_normalization, we created symlinks above and computed stats. // No alignment or image writing is needed. if (stereo_settings().skip_image_normalization) return; // Initialize the alignment matrices Matrix<double> align_left_matrix = math::identity_matrix<3>(); Matrix<double> align_right_matrix = math::identity_matrix<3>(); ImageViewRef<PixelMask<float>> Limg, Rimg; bool isis_session = (this->name() == "isis" || this->name() == "isismapisis"); // Use no-data in interpolation and edge extension // TODO(oalexan1): Maybe using 0 for nodata_pix is not good. May need to use // -32768.0. PixelMask<float>nodata_pix(0); nodata_pix.invalidate(); ValueEdgeExtension<PixelMask<float>> ext_nodata(nodata_pix); // Generate aligned versions of the input images according to the options vw_out() << "\t--> Applying alignment method: " << stereo_settings().alignment_method << "\n"; if (stereo_settings().alignment_method == "epipolar") { if (isis_session) vw_throw(NoImplErr() << "StereoSessionISIS does not support epipolar rectification"); epipolar_alignment(left_masked_image, right_masked_image, ext_nodata, // Outputs Limg, Rimg); } else if (stereo_settings().alignment_method == "homography" || stereo_settings().alignment_method == "affineepipolar" || stereo_settings().alignment_method == "local_epipolar") { // Load the cameras boost::shared_ptr<camera::CameraModel> left_cam, right_cam; this->camera_models(left_cam, right_cam); // Get the image sizes. Later alignment options can choose to // change this parameters (such as affine epipolar alignment). Vector2i left_size(left_cropped_image.cols(), left_cropped_image.rows()); Vector2i right_size(right_cropped_image.cols(), right_cropped_image.rows()); imageAlignment(// Inputs m_out_prefix, left_cropped_file, right_cropped_file, left_input_file, left_stats, right_stats, left_nodata_value, right_nodata_value, left_cam, right_cam, adjust_left_image_size, // In-out align_left_matrix, align_right_matrix, left_size, right_size); // Apply the alignment transform to both input images Limg = transform(left_masked_image, HomographyTransform(align_left_matrix), left_size.x(), left_size.y()); Rimg = transform(right_masked_image, HomographyTransform(align_right_matrix), right_size.x(), right_size.y()); } else { // No alignment, just provide the original files. if (!asp::stereo_settings().stereo_dist_mode) { Limg = left_masked_image; Rimg = right_masked_image; } else { // Do the delayed cropping. This allows writing the cropped images // only after normalization avoiding an unnecessary write. Limg = crop(left_masked_image, asp::stereo_settings().left_image_crop_win); Rimg = crop(right_masked_image, asp::stereo_settings().right_image_crop_win); // Also crop the georefs left_georef = crop(left_georef, asp::stereo_settings().left_image_crop_win); right_georef = crop(right_georef, asp::stereo_settings().right_image_crop_win); } } // End of image alignment block // Apply our normalization options. bool use_percentile_stretch = false; bool do_not_exceed_min_max = isis_session; // for isis, do not exceed min/max // TODO(oalexan1): Should one add above "csm" and "csmmapcsm" / "csmmaprpc"? asp::normalize_images(stereo_settings().force_use_entire_range, stereo_settings().individually_normalize, use_percentile_stretch, do_not_exceed_min_max, left_stats, right_stats, Limg, Rimg); // The output no-data value must be < 0 as we scale the images to [0, 1]. bool has_nodata = true; float output_nodata = -32768.0; vw_out() << "\t--> Writing pre-aligned images.\n"; vw_out() << "\t--> Writing: " << left_output_file << "\n"; vw::Stopwatch sw3; sw3.start(); block_write_gdal_image(left_output_file, apply_mask(Limg, output_nodata), has_left_georef, left_georef, has_nodata, output_nodata, options, TerminalProgressCallback("asp","\t L: ")); sw3.stop(); vw_out() << "Writing left image elapsed time: " << sw3.elapsed_seconds() << " s\n"; vw_out() << "\t--> Writing: " << right_output_file << "\n"; vw::Stopwatch sw4; sw4.start(); // With no alignment, do not crop the right image to have the same dimensions // as the left image. Since there is no alignment, and images may not be // georeferenced, we do not know what portion of the right image corresponds // best to the left image, so cropping may throw away an area where the left // and right images overlap. if (stereo_settings().alignment_method != "none") Rimg = crop(edge_extend(Rimg, ext_nodata), bounding_box(Limg)); block_write_gdal_image(right_output_file, apply_mask(Rimg, output_nodata), has_right_georef, right_georef, has_nodata, output_nodata, options, TerminalProgressCallback("asp","\t R: ")); sw4.stop(); vw_out() << "Writing right image elapsed time: " << sw4.elapsed_seconds() << " s\n"; // For bathy runs only if (asp::doBathy(asp::stereo_settings())) this->align_bathy_masks(options); } // End function preprocessing_hook bool StereoSession::prepareInputImages(vw::GdalWriteOptions & options, std::string const & left_input_file, std::string const & right_input_file, std::string & left_output_file, std::string & right_output_file, std::string & left_cropped_file, std::string & right_cropped_file, vw::ImageViewRef<float> & left_cropped_image, vw::ImageViewRef<float> & right_cropped_image, float & left_nodata_value, float & right_nodata_value, bool & has_left_georef, bool & has_right_georef, vw::cartography::GeoReference & left_georef, vw::cartography::GeoReference & right_georef) { // Retrieve nodata values and let the handles go out of scope right away. // For this to work the ISIS type must be registered with the // DiskImageResource class. This happens in "stereo.cc", so // these calls will create DiskImageResourceIsis objects. { boost::shared_ptr<DiskImageResource> left_rsrc (DiskImageResourcePtr(left_input_file)), right_rsrc(DiskImageResourcePtr(right_input_file)); asp::get_nodata_values(left_rsrc, right_rsrc, stereo_settings().nodata_value, left_nodata_value, right_nodata_value); } // Set output file paths left_output_file = this->m_out_prefix + "-L.tif"; right_output_file = this->m_out_prefix + "-R.tif"; // Enforce no predictor in compression, it works badly with L.tif and R.tif. options = this->m_options; options.gdal_options["PREDICTOR"] = "1"; // Read the georef if available in the input images has_left_georef = read_georeference(left_georef, left_input_file); has_right_georef = read_georeference(right_georef, right_input_file); if (stereo_settings().alignment_method != "none") { // If any alignment at all happens, the georef will be messed up. has_left_georef = false; has_right_georef = false; } bool crop_left = do_crop_left(); bool crop_right = do_crop_right(); // For --stereo-dist-mode will do the cropping when we normalize to avoid // an extra write. if (asp::stereo_settings().stereo_dist_mode) { crop_left = false; crop_right = false; } // Here either the input image or the cropped images will be returned, // depending on whether the crop actually happens left_cropped_file = this->left_cropped_image(crop_left); right_cropped_file = this->right_cropped_image(crop_right); // If the output files already exist and are newer than the input files, and // we don't crop both left and right images, then there is nothing to do here. // Note: Must make sure all outputs are initialized before we get to this part // where we exit early. For stereo dist mode the L.tif and R.tif do not exist // yet as those would be per-tile. std::vector<std::string> check_files; check_files.push_back(left_input_file); check_files.push_back(right_input_file); check_files.push_back(m_left_camera_file); check_files.push_back(m_right_camera_file); bool rebuild = (!asp::stereo_settings().stereo_dist_mode) && (!first_is_newer(left_output_file, check_files) || !first_is_newer(right_output_file, check_files)); bool do_bathy = asp::doBathy(asp::stereo_settings()); if (do_bathy) { rebuild = (rebuild || (!first_is_newer(left_aligned_bathy_mask(), check_files) || !first_is_newer(right_aligned_bathy_mask(), check_files))); } // Consider the case of multi-band images if (!rebuild) { int lc = vw::get_num_channels(left_input_file); int rc = vw::get_num_channels(right_input_file); if (lc > 1 || rc > 1) { vw_out(vw::WarningMessage) << "Always recomputing the inputs for multi-band images as the " << "provided band may change.\n"; rebuild = true; } } // These will throw if the files do not exist if (!rebuild && !crop_left && !crop_right) { try { vw_log().console_log().rule_set().add_rule(-1, "fileio"); if (!asp::stereo_settings().stereo_dist_mode) { DiskImageView<float> out_left (left_output_file); DiskImageView<float> out_right(right_output_file); } if (do_bathy) { DiskImageView<float> left_bathy_mask (left_aligned_bathy_mask()); DiskImageView<float> right_bathy_mask(right_aligned_bathy_mask()); } if (!asp::stereo_settings().stereo_dist_mode) vw_out(InfoMessage) << "\t--> Using cached normalized input images.\n"; vw_settings().reload_config(); if (!asp::stereo_settings().stereo_dist_mode) return true; // Return true if we exist early since the images exist } catch (vw::ArgumentErr const& e) { // This throws on a corrupted file. vw_settings().reload_config(); } catch (vw::IOErr const& e) { vw_settings().reload_config(); } } // End check for existing output files // Load the desired band. Subtract 1 to make it start from 0. int ch = asp::stereo_settings().band - 1; ImageViewRef<float> left_orig_image = vw::read_float_channel(left_input_file, ch); ImageViewRef<float> right_orig_image = vw::read_float_channel(right_input_file, ch); // If the user provided a custom no-data value, values no more than that are // masked. float user_nodata = stereo_settings().nodata_value; if (!std::isnan(user_nodata)) { left_orig_image = apply_mask(create_mask_less_or_equal(left_orig_image, user_nodata), user_nodata); right_orig_image = apply_mask(create_mask_less_or_equal(right_orig_image, user_nodata), user_nodata); } // See if to crop the images if (crop_left) { // Crop and save the left image to left_cropped_file has_left_georef = read_georeference(left_georef, left_input_file); bool has_nodata = true; BBox2i left_win = stereo_settings().left_image_crop_win; left_win.crop(bounding_box(left_orig_image)); // Return a handle to the cropped image left_cropped_image = crop(left_orig_image, left_win); if (stereo_settings().left_image_clip != "") { // Replace the crop with a given clip. This is a very rarely used option. // It can be handy when investigating CCD artifacts correction. left_cropped_image = DiskImageView<float>(stereo_settings().left_image_clip); if (left_cropped_image.cols() != left_win.width() || left_cropped_image.rows() != left_win.height()) { vw_throw(ArgumentErr() << "The image specified via --left-image-clip has different " << "dimensions than set via --left-image-crop-win."); } } // Crop the georef as well vw_out() << "\t--> Writing cropped image: " << left_cropped_file << "\n"; block_write_gdal_image(left_cropped_file, left_cropped_image, has_left_georef, crop(left_georef, left_win), has_nodata, left_nodata_value, options, TerminalProgressCallback("asp", "\t: ")); } else { // Return a handle to the desired channel of the input image left_cropped_image = left_orig_image; } if (crop_right) { // Crop the right image and write to right_cropped_file has_right_georef = read_georeference(right_georef, right_input_file); bool has_nodata = true; BBox2i right_win = stereo_settings().right_image_crop_win; right_win.crop(bounding_box(right_orig_image)); // Return a handle to the cropped image right_cropped_image = crop(right_orig_image, right_win); if (stereo_settings().right_image_clip != "") { // Replace the crop with a given clip. This is a very rarely used option. // It can be handy when investigating CCD artifacts correction. right_cropped_image = DiskImageView<float>(stereo_settings().right_image_clip); if (right_cropped_image.cols() != right_win.width() || right_cropped_image.rows() != right_win.height()) { vw_throw(ArgumentErr() << "The image specified via --right-image-clip has different " << "dimensions than set via --right-image-crop-win."); } } // Crop the georef as well vw_out() << "\t--> Writing cropped image: " << right_cropped_file << "\n"; block_write_gdal_image(right_cropped_file, right_cropped_image, has_right_georef, crop(right_georef, right_win), has_nodata, right_nodata_value, options, TerminalProgressCallback("asp", "\t: ")); } else { // Return a handle to the desired channel of the input image right_cropped_image = right_orig_image; } // Re-read the georef, since it may have changed above. has_left_georef = read_georeference(left_georef, left_cropped_file); has_right_georef = read_georeference(right_georef, right_cropped_file); if (stereo_settings().alignment_method != "none") { // If any alignment at all happens, the georef will be messed up. has_left_georef = false; has_right_georef = false; } return false; // don't exit early } } // End namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionIp.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Keep here interest-point matching logic for StereoSession, as this logic // can be slow to compile. /// \file StereoSessionIp.cc /// #include <asp/Core/InterestPointMatching.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/AffineEpipolar.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/FileUtils.h> #include <asp/Camera/RPCModel.h> #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/ImageUtils.h> #include <vw/Core/Exception.h> #include <vw/Core/Log.h> #include <vw/Math/Vector.h> #include <vw/Image/PixelMask.h> #include <vw/FileIO/DiskImageResource.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/FileIO/MatrixIO.h> #include <vw/Cartography/GeoTransform.h> #include <boost/filesystem/operations.hpp> #include <string> using namespace vw; using namespace vw::cartography; namespace fs = boost::filesystem; namespace asp { // A default IP matching implementation that derived classes can use bool StereoSession::ip_matching(std::string const& input_file1, std::string const& input_file2, vw::Vector2 const& uncropped_image_size, Vector6f const& stats1, Vector6f const& stats2, float nodata1, float nodata2, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, std::string const& match_filename, std::string const left_ip_file, std::string const right_ip_file, vw::BBox2i const& bbox1, vw::BBox2i const& bbox2) { vw_out() << "\t--> Matching interest points in StereoSession.\n"; // Sanity checks. Must be here since we will use this code in stereo and bundle_adjust. if (asp::stereo_settings().matches_per_tile > 0) { if (asp::stereo_settings().ip_per_tile < asp::stereo_settings().matches_per_tile || asp::stereo_settings().ip_per_image > 0) vw::vw_throw(vw::ArgumentErr() << "When setting --matches-per-tile, must set --ip-per-tile to at least " << "a factor of that, and do not set --ip-per-image.\n"); Vector2i params = asp::stereo_settings().matches_per_tile_params; if (params[0] <= 0 || params[1] < params[0] || params[1] > 2 * params[0]) vw::vw_throw(vw::ArgumentErr() << "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"); } bool inlier = false; // Try to give a useful error message if things fail std::string err = ""; try { // If we crop the images we must always create new matching files. // Otherwise, do not rebuild with externally provided match files, // or if a match file newer than the image and cameras is found in // the output directory. bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); bool rebuild = (!asp::first_is_newer(match_filename, input_file1, input_file2, m_left_camera_file, m_right_camera_file)); if (!crop_left && !crop_right && (stereo_settings().force_reuse_match_files || stereo_settings().clean_match_files_prefix != "" || stereo_settings().match_files_prefix != "")) rebuild = false; if (crop_left || crop_right) rebuild = true; if (boost::filesystem::exists(match_filename) && !rebuild) { vw_out() << "\t--> Using cached match file: " << match_filename << "\n"; return true; } // If any cropping is done, or if the vwip file is old, or of using rough // homography, then remove the old vwip files. if (boost::filesystem::exists(left_ip_file) && (crop_left || crop_right || !asp::first_is_newer(left_ip_file, input_file1) || !asp::stereo_settings().skip_rough_homography)) boost::filesystem::remove(left_ip_file); if (boost::filesystem::exists(right_ip_file) && (crop_left || crop_right || !asp::first_is_newer(right_ip_file, input_file2) || !asp::stereo_settings().skip_rough_homography)) boost::filesystem::remove(right_ip_file); if (boost::filesystem::exists(match_filename)) { vw_out() << "Removing old match file: " << match_filename << "\n"; // It is hoped the logic before here was such that we will not // wipe external match files given by --match-files-prefix or // --clean-match-files-prefix. boost::filesystem::remove(match_filename); } // Create DiskImageResource objects. It is a little messy to make sure // it works with SPOT5 which will not work without the camera file // but the camera file does not match if the image is cropped. // Ideally there would be a function to make this cleaner. boost::shared_ptr<DiskImageResource> rsrc1, rsrc2; if (input_file1 == m_left_image_file) rsrc1 = vw::DiskImageResourcePtr(m_left_image_file); else // Tiff input rsrc1 = vw::DiskImageResourcePtr(input_file1); if (input_file2 == m_right_image_file) rsrc2 = vw::DiskImageResourcePtr(m_right_image_file); else // Tiff input rsrc2 = vw::DiskImageResourcePtr(input_file2); // Open the images ImageViewRef<float> image1 = DiskImageView<float>(rsrc1); ImageViewRef<float> image2 = DiskImageView<float>(rsrc2); // If the user provided a custom no-data value, values no more than that are // masked. Otherwise, only values equal to no-data are masked. ImageViewRef<PixelMask<float>> masked_image1, masked_image2; float user_nodata = stereo_settings().nodata_value; if (!std::isnan(user_nodata)) { masked_image1 = create_mask_less_or_equal(image1, user_nodata); masked_image2 = create_mask_less_or_equal(image2, user_nodata); } else { // Mask the no-data values in the images masked_image1 = create_mask(image1, nodata1); masked_image2 = create_mask(image2, nodata2); } // Get normalized versions of the images for OpenCV based methods. // Similar logic is used in bundle_adjust per image. if (asp::openCvDetectMethod()) { vw_out() << "\t--> Normalizing images for IP detection using stats " << stats1 << "\n"; asp::normalize_images(stereo_settings().force_use_entire_range, stereo_settings().individually_normalize, asp::openCvDetectMethod(), asp::doNotExceedMinMax(), stats1, stats2, masked_image1, masked_image2); } bool have_datum = this->have_datum(); // If cameras are null then we cannot use them if (cam1 == NULL || cam2 == NULL) have_datum = false; // Jobs set to 2x the number of cores. This is just in case all jobs are not equal. // The total number of interest points will be divided up among the jobs. size_t number_of_jobs = vw_settings().default_num_threads() * 2; if (vw_settings().default_num_threads() == 1) // the user wants one thread number_of_jobs = 1; #if __APPLE__ // Fix due to OpenBLAS crashing and/or giving different results // each time. // TODO(oalexan1): Revisit this. number_of_jobs = std::min(int(vw_settings().default_num_threads()), 1); vw_out() << "\t Using " << number_of_jobs << " thread(s) for matching.\n"; #endif if (have_datum) { // Run an IP matching function that takes the camera and datum info into account bool use_sphere_for_non_earth = true; // Assume Mars is a sphere cartography::Datum datum = this->get_datum(cam1, use_sphere_for_non_earth); // This is a bugfix. For RPC models, we must never intersect with // a datum whose height is outside of the domain of applicability // of the RPC model, as that can lead to very incorrect results. const asp::RPCModel *rpc_cam = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(cam1)); if (rpc_cam != NULL) { Vector3 lonlatheight_offset = rpc_cam->lonlatheight_offset(); Vector3 lonlatheight_scale = rpc_cam->lonlatheight_scale(); double mid_ht = lonlatheight_offset[2]; double min_ht = mid_ht - lonlatheight_scale[2]; double max_ht = mid_ht + lonlatheight_scale[2]; if (max_ht < 0) vw_out() << "Warning: The RPC model maximum height is below the zero datum.\n"; if (min_ht > 0) vw_out() << "Warning: The RPC model minimum height is above the zero datum.\n"; if (max_ht < 0 || min_ht > 0) { vw_out() << "RPC model min and max heights above datum: " << min_ht << ' ' << max_ht << " meters.\n"; vw_out() << "Adjusting the datum to compensate, for the purpose of alignment.\n"; vw_out() << "The new datum height will be at " << mid_ht << " meters relative to the previous one.\n"; vw_out() << "Old datum: " << datum << "\n"; datum = vw::cartography::Datum(datum.name(), datum.spheroid_name(), datum.meridian_name(), datum.semi_major_axis() + mid_ht, datum.semi_minor_axis() + mid_ht, datum.meridian_offset()); vw_out() << "New datum: " << datum << "\n"; } } // End RPC case // A smaller value here makes IP more unique, but also fewer double ip_uniqueness_thresh = stereo_settings().ip_uniqueness_thresh; // TODO: Improve calculation of epipolar parameter! // This computes a distance used for throwing out interest points. // - It has to be computed using the entire (not cropped) image size! // A larger value will keep more (but of lower quality) points. double epipolar_threshold = norm_2(uncropped_image_size)/15; if (stereo_settings().epipolar_threshold > 0) epipolar_threshold = stereo_settings().epipolar_threshold; vw_out() << "\t Using epipolar threshold = " << epipolar_threshold << "\n"; vw_out() << "\t IP uniqueness threshold = " << ip_uniqueness_thresh << "\n"; vw_out() << "\t Datum: " << datum << "\n"; inlier = match_ip_with_datum(!supports_multi_threading(), !stereo_settings().skip_rough_homography, cam1, cam2, apply_mask(masked_image1, nodata1), apply_mask(masked_image2, nodata2), asp::stereo_settings().ip_per_tile, datum, match_filename, number_of_jobs, epipolar_threshold, ip_uniqueness_thresh, left_ip_file, right_ip_file, nodata1, nodata2); } else { // No datum // Run a simpler purely image-based matching function double ip_inlier_factor = stereo_settings().ip_inlier_factor; // --ip-inlier-factor is 0.2 in bundle_adjust and stereo. // The default value below should be 200. Lower values were observed // to filter too many inliers. int inlier_threshold = round(1000.0 * ip_inlier_factor); // HACK: If the otherwise unused epipolar threshold is set, use it as // the inlier threshold. // TODO(oalexan1): This may need to be removed. if (stereo_settings().epipolar_threshold > 0) inlier_threshold = stereo_settings().epipolar_threshold; vw_out() << "\t Not using a datum in interest point matching.\n"; bool use_cached_ip = true; // When ip should not be cached they were already wiped inlier = homography_ip_matching(apply_mask(masked_image1, nodata1), apply_mask(masked_image2, nodata2), asp::stereo_settings().ip_per_tile, inlier_threshold, match_filename, number_of_jobs, left_ip_file, right_ip_file, use_cached_ip, nodata1, nodata2, bbox1, bbox2); } } catch (std::exception const& e) { err = e.what(); } if (!inlier || err != "") { boost::filesystem::remove(match_filename); std::string msg = "Unable to find enough interest point matches in the images. " "Check if the images are similar enough in illumination and if they have " "enough overlap.\n"; if (err != "") msg += "A more technical error message is as follows.\n" + err; vw_throw(IOErr() << msg); } return inlier; } // End function ip_matching() // Find ip matches and determine the alignment matrices void StereoSession::imageAlignment(// Inputs std::string const& out_prefix, std::string const& left_cropped_file, std::string const& right_cropped_file, std::string const& left_uncropped_file, vw::Vector6f const& left_stats, vw::Vector6f const& right_stats, float left_nodata_value, float right_nodata_value, vw::CamPtr left_cam, vw::CamPtr right_cam, bool adjust_left_image_size, // In-out vw::Matrix<double> & align_left_matrix, vw::Matrix<double> & align_right_matrix, vw::Vector2i & left_size, vw::Vector2i & right_size) { // Define the file name containing IP match information. bool matches_as_txt = stereo_settings().matches_as_txt; std::string match_filename = asp::stereoMatchFile(left_cropped_file, right_cropped_file, out_prefix, matches_as_txt); std::string left_ip_filename = ip::ip_filename(out_prefix, left_cropped_file); std::string right_ip_filename = ip::ip_filename(out_prefix, right_cropped_file); // Detect matching interest points between the left and right input images. // The output is written directly to a file. DiskImageView<float> left_orig_image(left_uncropped_file); vw::Vector2 uncropped_left_image_size = bounding_box(left_orig_image).size(); this->ip_matching(left_cropped_file, right_cropped_file, uncropped_left_image_size, left_stats, right_stats, left_nodata_value, right_nodata_value, left_cam.get(), right_cam.get(), match_filename, left_ip_filename, right_ip_filename); // Load the interest points results from the file we just wrote std::vector<ip::InterestPoint> left_ip, right_ip; vw::vw_out() << "Reading match file: " << match_filename << "\n"; ip::read_match_file(match_filename, left_ip, right_ip, matches_as_txt); // Compute the appropriate alignment matrix based on the input points if (stereo_settings().alignment_method == "homography") { bool tight_inlier_threshold = false; left_size = homography_rectification(adjust_left_image_size, tight_inlier_threshold, left_size, right_size, left_ip, right_ip, align_left_matrix, align_right_matrix); vw_out() << "\t--> Aligning right image to left using matrices:\n" << "\t " << align_left_matrix << "\n" << "\t " << align_right_matrix << "\n"; } else { // affineepipolar and local_epipolar bool crop_to_shared_area = true; left_size = affine_epipolar_rectification(left_size, right_size, stereo_settings().global_alignment_threshold, stereo_settings().alignment_num_ransac_iterations, left_ip, right_ip, crop_to_shared_area, align_left_matrix, align_right_matrix); vw_out() << "\t--> Aligning left and right images using affine matrices:\n" << "\t " << submatrix(align_left_matrix, 0,0,2,3) << "\n" << "\t " << submatrix(align_right_matrix,0,0,2,3) << "\n"; } // Write out both computed matrices to disk write_matrix_as_txt(out_prefix + "-align-L.txt", align_left_matrix); write_matrix_as_txt(out_prefix + "-align-R.txt", align_right_matrix); // Because the images are now aligned they are the same size right_size = left_size; } // A wrapper around ip matching. Can also work with NULL cameras. Various settings // are passed in via asp::stereo_settings(). // TODO(oalexan1): It is not clear the stereo session is needed for ip matching. void matchIp(std::string const& out_prefix, bool enable_rough_homography, double pct_for_overlap, asp::SessionPtr session, std::string const& image1_path, std::string const& image2_path, vw::camera::CameraModel* cam1, vw::camera::CameraModel* cam2, std::string const& match_filename) { boost::shared_ptr<DiskImageResource> rsrc1(vw::DiskImageResourcePtr(image1_path)), rsrc2(vw::DiskImageResourcePtr(image2_path)); if ((rsrc1->channels() > 1) || (rsrc2->channels() > 1)) vw_throw(ArgumentErr() << "Error: Input images can only have a single channel!\n\n"); float nodata1, nodata2; asp::get_nodata_values(rsrc1, rsrc2, asp::stereo_settings().nodata_value, nodata1, nodata2); // IP matching may not succeed for all pairs // Get masked views of the images to get statistics from. If the user provided // a custom no-data value, values no more than that are masked. Otherwise only // the exact no-data values are masked. ImageViewRef<float> image1_view = DiskImageView<float>(rsrc1); ImageViewRef<float> image2_view = DiskImageView<float>(rsrc2); ImageViewRef<PixelMask<float>> masked_image1, masked_image2; float user_nodata = asp::stereo_settings().nodata_value; if (!std::isnan(user_nodata)) { masked_image1 = create_mask_less_or_equal(image1_view, user_nodata); masked_image2 = create_mask_less_or_equal(image2_view, user_nodata); } else { masked_image1 = create_mask(image1_view, nodata1); masked_image2 = create_mask(image2_view, nodata2); } // Since we computed statistics earlier, this will just be loading files. vw::Vector<vw::float32,6> image1_stats, image2_stats; image1_stats = asp::gather_stats(masked_image1, out_prefix, image1_path, asp::stereo_settings().force_reuse_match_files); image2_stats = asp::gather_stats(masked_image2, out_prefix, image2_path, asp::stereo_settings().force_reuse_match_files); // Rough homography cannot use / cache vwip std::string vwip_file1, vwip_file2; if (enable_rough_homography) { vw::vw_out(vw::WarningMessage) << "Option --enable-rough-homography is set. Will not save interest " << "point matches per image before matching (vwip), as these depend " << "on the pair of images used.\n"; } else { vwip_file1 = ip::ip_filename(out_prefix, image1_path); vwip_file2 = ip::ip_filename(out_prefix, image2_path); } // For mapprojected images and given the overlap params, // can restrict the matching to a smaller region. vw::BBox2 bbox1, bbox2; if (pct_for_overlap >= 0 && cam1 == NULL && cam2 == NULL) { vw::cartography::GeoReference georef1, georef2; bool has_georef1 = vw::cartography::read_georeference(georef1, image1_path); bool has_georef2 = vw::cartography::read_georeference(georef2, image2_path); if (has_georef1 && has_georef2) { bbox1 = vw::bounding_box(masked_image1); bbox2 = vw::bounding_box(masked_image2); // Expand the boxes by pct expand_box_by_pct(bbox1, pct_for_overlap); expand_box_by_pct(bbox2, pct_for_overlap); // Transform each box to the other image's pixel coordinates vw::cartography::GeoTransform trans(georef1, georef2); vw::BBox2 trans_bbox1 = trans.forward_bbox(bbox1); vw::BBox2 trans_bbox2 = trans.reverse_bbox(bbox2); // The first box will be the 2nd transformed box, then cropped // to bounding box of first image bbox1 = trans_bbox2; bbox1.crop(bounding_box(masked_image1)); // Same logic for the second box. bbox2 = trans_bbox1; bbox2.crop(bounding_box(masked_image2)); } } // The match files (.match) are cached unless the images or camera // are newer than them. session->ip_matching(image1_path, image2_path, Vector2(masked_image1.cols(), masked_image1.rows()), image1_stats, image2_stats, nodata1, nodata2, cam1, cam2, match_filename, vwip_file1, vwip_file2, bbox1, bbox2); } // Compute list of matched IP between two images with no cameras void matchIpNoCams(std::string const& image1, std::string const& image2, std::string const& output_prefix, std::vector<vw::ip::InterestPoint> & matched_ip1, std::vector<vw::ip::InterestPoint> & matched_ip2) { // Alias for interest point matching settings auto & ip_opt = asp::stereo_settings(); // These need to be passed to the ip matching function ip_opt.correlator_mode = true; // no cameras ip_opt.alignment_method = "none"; // no alignment; a homography transform will be used bool matches_as_txt = ip_opt.matches_as_txt; // for loading matches std::string match_file = vw::ip::match_filename(output_prefix, image1, image2, matches_as_txt); asp::SessionPtr session(NULL); std::string stereo_session = "pinhole", input_dem = ""; bool allow_map_promote = false, total_quiet = true; vw::GdalWriteOptions gdal_opt; session = asp::StereoSessionFactory::create (stereo_session, // may change gdal_opt, image1, image2, image1, image2, output_prefix, input_dem, allow_map_promote, total_quiet); vw::camera::CameraModel* cam1 = NULL, *cam2 = NULL; bool enable_rough_homography = false; double pct_for_overlap = -1.0; asp::matchIp(output_prefix, enable_rough_homography, pct_for_overlap, session, image1, image2, cam1, cam2, match_file); // Read the match files from disk vw::vw_out() << "Reading matches from: " << match_file << "\n"; vw::ip::read_match_file(match_file, matched_ip1, matched_ip2, matches_as_txt); return; } } // End namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionIsis.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionIsis.cc /// #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/Sessions/StereoSessionIsis.h> #include <asp/IsisIO/IsisCameraModel.h> #include <asp/Core/BaseCameraUtils.h> #include <vw/Camera/CameraModel.h> #include <vw/Cartography/Datum.h> #include <boost/shared_ptr.hpp> using namespace vw; using namespace vw::camera; using namespace vw::cartography; namespace asp { bool StereoSessionIsis::supports_multi_threading () const { return false; } /// Returns the target datum to use for a given camera model. Note the parameter /// use_sphere_for_non_earth. During alignment, we'd like to use the most /// accurate non-spherical datum, hence radii[2]. However, for the purpose of /// creating a DEM on non-Earth planets people usually just use a spherical /// datum, which we'll do as well. Maybe at some point this needs to change. vw::cartography::Datum StereoSessionIsis::get_datum(const vw::camera::CameraModel* cam, bool use_sphere_for_non_earth) const { const IsisCameraModel * isis_cam = dynamic_cast<const IsisCameraModel*>(vw::camera::unadjusted_model(cam)); VW_ASSERT(isis_cam != NULL, ArgumentErr() << "StereoSessionISIS: Invalid camera.\n"); return isis_cam->get_datum_isis(use_sphere_for_non_earth); } boost::shared_ptr<vw::camera::CameraModel> StereoSessionIsis::load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, Vector2 pixel_offset) const { // If the camera file is empty, then we assume the image file has the camera. std::string l_cam = camera_file; if (l_cam.empty()) l_cam = image_file; return load_adjusted_model(m_camera_loader.load_isis_camera_model(l_cam), image_file, camera_file, ba_prefix, pixel_offset); } } #endif // ASP_HAVE_PKG_ISIS ================================================ FILE: src/asp/Sessions/StereoSessionIsis.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionIsis.h /// #ifndef __STEREO_SESSION_ISIS_H__ #define __STEREO_SESSION_ISIS_H__ #include <asp/Sessions/StereoSession.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 namespace asp { /// Derived StereoSession class for ISIS images class StereoSessionIsis: public StereoSession { public: virtual ~StereoSessionIsis() {} virtual std::string name() const { return "isis"; } virtual bool supports_multi_threading() const; /// Returns the target datum to use for a given camera model virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam, bool use_sphere_for_non_earth) const; /// Simple factory function static SessionPtr construct() { return SessionPtr(new StereoSessionIsis); } protected: /// Function to load a camera model of the particular type virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const; }; } // end namespace asp #endif // ASP_HAVE_PKG_ISIS #endif // __STEREO_SESSION_ISIS_H__ ================================================ FILE: src/asp/Sessions/StereoSessionMapProj.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionMapProj.h /// /// This a session that support RPC Mapproject DG images. It is built /// entirely so that left and right TX are objects and not TransformRefs. #ifndef __STEREO_SESSION_MAPPROJ_H__ #define __STEREO_SESSION_MAPPROJ_H__ #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionGdal.h> #include <asp/Sessions/StereoSessionPinhole.h> #include <asp/Camera/CsmModel.h> #include <asp/Core/BaseCameraUtils.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #include <vw/Image/Transform.h> namespace asp { /// Parent class for all map projected types /// - All map projected types inherit from the Gdal session since /// our map projected images are tiff files. class StereoSessionMapProj: public StereoSessionGdal { public: StereoSessionMapProj(){}; virtual ~StereoSessionMapProj(){}; virtual std::string name() const = 0; virtual bool isMapProjected() const { return true; } virtual vw::TransformPtr tx_left () const {return tx_left_map_trans ();} virtual vw::TransformPtr tx_right() const {return tx_right_map_trans();} }; /// Specialization of the StereoSessionGDAL class to use RPC /// map-projected inputs with the DG sensor model. class StereoSessionDGMapRPC: public StereoSessionMapProj { public: StereoSessionDGMapRPC(){}; virtual ~StereoSessionDGMapRPC(){}; virtual std::string name() const { return "dgmaprpc"; } static SessionPtr construct() { return SessionPtr(new StereoSessionDGMapRPC); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_dg_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use DG /// map-projected inputs with the DG sensor model. class StereoSessionDGMapDG: public StereoSessionMapProj { public: StereoSessionDGMapDG(){}; virtual ~StereoSessionDGMapDG(){}; virtual std::string name() const { return "dgmapdg"; } static SessionPtr construct() { return SessionPtr(new StereoSessionDGMapDG); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_dg_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use RPC /// map-projected inputs with the RPC sensor model. class StereoSessionRPCMapRPC: public StereoSessionMapProj { public: StereoSessionRPCMapRPC(){}; virtual ~StereoSessionRPCMapRPC(){}; virtual std::string name() const { return "rpcmaprpc"; } static SessionPtr construct() { return SessionPtr(new StereoSessionRPCMapRPC); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_rpc_camera_model(image_file, camera_file, ba_prefix, pixel_offset); } }; #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 /// Specialization of the StereoSessionGDAL class to use (ISIS) /// map-projected inputs with the ISIS sensor model. class StereoSessionIsisMapIsis: public StereoSessionMapProj { public: StereoSessionIsisMapIsis() {}; virtual ~StereoSessionIsisMapIsis(){}; virtual std::string name() const { return "isismapisis"; } virtual bool supports_multi_threading() const { return false; } static SessionPtr construct() { return SessionPtr(new StereoSessionIsisMapIsis); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_isis_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; #endif // defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 /// Specialization of the StereoSessionGDAL class to use Pinhole /// map-projected inputs with the Pinhole sensor model. class StereoSessionPinholeMapPinhole: public StereoSessionMapProj{ public: StereoSessionPinholeMapPinhole() {} virtual ~StereoSessionPinholeMapPinhole() {} virtual std::string name() const { return "pinholemappinhole"; } static SessionPtr construct() { return SessionPtr(new StereoSessionPinholeMapPinhole); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return asp::load_adj_pinhole_model(image_file, camera_file, m_left_image_file, m_right_image_file, m_left_camera_file, m_right_camera_file, ba_prefix, isMapProjected()); } }; /// Specialization of the StereoSessionGDAL class to use optical bar /// map-projected inputs with the optical bar sensor model. class StereoSessionBarMapBar: public StereoSessionMapProj{ public: StereoSessionBarMapBar() {} virtual ~StereoSessionBarMapBar() {} virtual std::string name() const { return "opticalbarmapopticalbar"; } static SessionPtr construct() { return SessionPtr(new StereoSessionBarMapBar); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_optical_bar_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use CSM /// map-projected inputs with the CSM sensor model. class StereoSessionCsmMapCsm: public StereoSessionMapProj{ public: StereoSessionCsmMapCsm() {} virtual ~StereoSessionCsmMapCsm() {} virtual std::string name() const { return "csmmapcsm"; } static SessionPtr construct() { return SessionPtr(new StereoSessionCsmMapCsm); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_csm_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use RPC /// map-projected inputs with the CSM sensor model. The /// loading of the camera model used to undo the mapprojection /// happens in read_mapproj_cams(). class StereoSessionCsmMapRpc: public StereoSessionMapProj{ public: StereoSessionCsmMapRpc() {} virtual ~StereoSessionCsmMapRpc() {} virtual std::string name() const { return "csmmaprpc"; } static SessionPtr construct() { return SessionPtr(new StereoSessionCsmMapRpc); } protected: /// Function to load a camera model of the particular type, for /// the purpose of triangulation. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_csm_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use RPC /// map-projected inputs with the SPOT5 sensor model. class StereoSessionSpot5MapRPC: public StereoSessionMapProj { public: StereoSessionSpot5MapRPC(){}; virtual ~StereoSessionSpot5MapRPC(){}; virtual std::string name() const { return "spot5maprpc"; } static SessionPtr construct() { return SessionPtr(new StereoSessionSpot5MapRPC); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_spot5_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use RPC /// map-projected inputs with the ASTER sensor model. class StereoSessionASTERMapRPC: public StereoSessionMapProj { public: StereoSessionASTERMapRPC(){}; virtual ~StereoSessionASTERMapRPC(){}; virtual std::string name() const { return "astermaprpc"; } static SessionPtr construct() { return SessionPtr(new StereoSessionASTERMapRPC); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_ASTER_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use ASTER /// map-projected inputs with the ASTER sensor model. class StereoSessionASTERMapASTER: public StereoSessionMapProj { public: StereoSessionASTERMapASTER(){}; virtual ~StereoSessionASTERMapASTER(){}; virtual std::string name() const { return "astermapaster"; } static SessionPtr construct() { return SessionPtr(new StereoSessionASTERMapASTER); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_ASTER_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization of the StereoSessionGDAL class to use Pleiades /// map-projected inputs with the Pleiades sensor model. class StereoSessionPleiadesMapPleiades: public StereoSessionMapProj { public: StereoSessionPleiadesMapPleiades(){}; virtual ~StereoSessionPleiadesMapPleiades(){}; virtual std::string name() const { return "pleiadesmappleiades"; } static SessionPtr construct() { return SessionPtr(new StereoSessionPleiadesMapPleiades); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_pleiades_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; /// Specialization for SPOT 6/7 map-projected inputs. class StereoSessionSpot67MapSpot67: public StereoSessionMapProj { public: StereoSessionSpot67MapSpot67(){}; virtual ~StereoSessionSpot67MapSpot67(){}; virtual std::string name() const { return "spotmapspot"; } static SessionPtr construct() { return SessionPtr(new StereoSessionSpot67MapSpot67); } protected: virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_adjusted_model(m_camera_loader.load_spot_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } }; } #endif//__STEREO_SESSION_MAPPROJ_H__ ================================================ FILE: src/asp/Sessions/StereoSessionNadirPinhole.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionNadirPinhole.cc /// #include <vw/Image/ImageMath.h> #include <vw/Image/Manipulation.h> #include <vw/Image/MaskViews.h> #include <vw/Image/Transform.h> #include <vw/Math/Matrix.h> #include <vw/Cartography/Datum.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/AffineEpipolar.h> #include <asp/Sessions/StereoSessionGdal.h> #include <asp/Sessions/StereoSessionASTER.h> #include <asp/Sessions/StereoSessionNadirPinhole.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/RPC_XML.h> #include <boost/shared_ptr.hpp> #include <boost/filesystem/operations.hpp> namespace fs = boost::filesystem; #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace vw; using namespace asp; namespace asp { std::string StereoSessionNadirPinhole::name() const { return "nadirpinhole"; } SessionPtr StereoSessionNadirPinhole::construct() { return SessionPtr(new StereoSessionNadirPinhole); } // Must override the StereoSessionPinhole function bool StereoSessionNadirPinhole::have_datum() const { return StereoSession::have_datum(); } } // End namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionNadirPinhole.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionNadirPinhole.h /// /// This is a specialization for downward facing pinhole camera model /// on Earth. In other word images that we are sure not going to be /// looking at the horizon. If that is the case, we can be smarter /// about interest point gathering. #ifndef __STEREO_SESSION_NADIR_PINHOLE_H__ #define __STEREO_SESSION_NADIR_PINHOLE_H__ #include <asp/Sessions/StereoSessionPinhole.h> namespace asp { class StereoSessionNadirPinhole: public StereoSessionPinhole{ public: virtual ~StereoSessionNadirPinhole() {} // Unlike the pinhole session, this one normally has a datum virtual bool have_datum() const; virtual std::string name() const; static SessionPtr construct(); }; } #endif//__STEREO_SESSION_NADIR_PINHOLE_H__ ================================================ FILE: src/asp/Sessions/StereoSessionPinhole.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionPinhole.cc /// #include <asp/Sessions/StereoSessionPinhole.h> #include <asp/Core/BaseCameraUtils.h> #include <asp/Core/StereoSettings.h> #include <vw/Math/BBox.h> #include <vw/Math/Geometry.h> #include <vw/Math/Matrix.h> #include <vw/Math/RANSAC.h> #include <vw/Math/Vector.h> #include <vw/Image/ImageViewRef.h> #include <vw/Image/MaskViews.h> #include <vw/Camera/CameraUtilities.h> #include <vw/Camera/EpipolarUtils.h> #include <vw/Stereo/DisparityMap.h> #include <boost/shared_ptr.hpp> #include <boost/filesystem/operations.hpp> namespace fs = boost::filesystem; using namespace vw; using namespace vw::camera; // This class assumes pinhole cameras with no datum, such as on a rover. // For pinhole satellite images the nadirpinhole mode is suggested. namespace asp { vw::CamPtr load_adj_pinhole_model(std::string const& image_file, std::string const& camera_file, std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, std::string const& ba_prefix, bool isMapProjected) { // Unfortunately the pinhole case is more complicated since the left // and right files are inter-dependent. // Retrieve the pixel offset (if any) to cropped images vw::Vector2 pixel_offset = asp::camera_pixel_offset(isMapProjected, left_image_file, right_image_file, image_file); if (stereo_settings().alignment_method != "epipolar") { // Not epipolar, just load the camera model. return asp::load_adjusted_model( vw::camera::load_pinhole_camera_model(camera_file), image_file, camera_file, ba_prefix, pixel_offset); } // Otherwise handle the epipolar case bool is_left_camera = true; if (image_file == left_image_file) is_left_camera = true; else if (image_file == right_image_file) is_left_camera = false; else vw::vw_throw(vw::ArgumentErr() << "StereoSessionPinhole: supplied camera model filename " << "does not match the name supplied in the constructor."); std::string lcase_file = boost::to_lower_copy(left_camera_file); if (boost::ends_with(lcase_file, ".pinhole") || boost::ends_with(lcase_file, ".tsai")) { // Use PinholeModel epipolar code PinholeModel left_pin (left_camera_file ); PinholeModel right_pin(right_camera_file); // Create epipolar rectified camera views boost::shared_ptr<PinholeModel> epipolar_left_pin (new PinholeModel); boost::shared_ptr<PinholeModel> epipolar_right_pin(new PinholeModel); epipolar(left_pin, right_pin, *epipolar_left_pin, *epipolar_right_pin); // Expand epipolar cameras to contain the entire source images. Vector2i left_size = file_image_size(left_image_file ); Vector2i right_size = file_image_size(right_image_file); Vector2i epi_size1, epi_size2; // TODO: Use these! resize_epipolar_cameras_to_fit(left_pin, right_pin, *(epipolar_left_pin.get()), *(epipolar_right_pin.get()), BBox2i(Vector2i(0,0), left_size), BBox2i(Vector2i(0,0), right_size), epi_size1, epi_size2); // Left camera if (is_left_camera) return asp::load_adjusted_model(epipolar_left_pin, image_file, camera_file, ba_prefix, pixel_offset); // Right camera return asp::load_adjusted_model(epipolar_right_pin, image_file, camera_file, ba_prefix, pixel_offset); } else { // Not PinholeModel, use CAHV epipolar code. // Fetch CAHV version of the two input pinhole files boost::shared_ptr<CAHVModel> left_cahv = vw::camera::load_cahv_pinhole_camera_model(left_image_file, left_camera_file ); boost::shared_ptr<CAHVModel> right_cahv = vw::camera::load_cahv_pinhole_camera_model(right_image_file, right_camera_file); // Create epipolar rectified camera views boost::shared_ptr<CAHVModel> epipolar_left_cahv (new CAHVModel); boost::shared_ptr<CAHVModel> epipolar_right_cahv(new CAHVModel); epipolar(*(left_cahv.get()), *(right_cahv.get()), *epipolar_left_cahv, *epipolar_right_cahv); // Left camera if (is_left_camera) return asp::load_adjusted_model(epipolar_left_cahv, image_file, camera_file, ba_prefix, pixel_offset); // Right camera return asp::load_adjusted_model(epipolar_right_cahv, image_file, camera_file, ba_prefix, pixel_offset); } } // The pinhole session is used with rovers and other non-satellite cameras, // so there is no datum, unless explicitly provided. bool StereoSessionPinhole::have_datum() const { return !stereo_settings().datum.empty() && StereoSession::have_datum(); } boost::shared_ptr<vw::camera::CameraModel> StereoSessionPinhole::load_camera_model (std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, Vector2 pixel_offset) const { return load_adj_pinhole_model(image_file, camera_file, m_left_image_file, m_right_image_file, m_left_camera_file, m_right_camera_file, ba_prefix, isMapProjected()); } // Apply epipolar alignment to images, if the camera models are pinhole void StereoSessionPinhole:: epipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image, vw::ImageViewRef<vw::PixelMask<float>> right_masked_image, vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata, // Outputs vw::ImageViewRef<vw::PixelMask<float>> & Limg, vw::ImageViewRef<vw::PixelMask<float>> & Rimg) { // Load the two images and fetch the two camera models boost::shared_ptr<camera::CameraModel> left_cam, right_cam; std::string lcase_file = boost::to_lower_copy(m_left_camera_file); if (boost::ends_with(lcase_file, ".pinhole") || boost::ends_with(lcase_file, ".tsai")) { // This loads epipolar-aligned camera models. // - The out sizes incorporate the crop amount if any, the camera models Vector2i left_out_size, right_out_size; load_camera_models(left_cam, right_cam, left_out_size, right_out_size); // Get the input image crop regions, if any. BBox2i left_image_in_roi, right_image_in_roi; get_input_image_crops(left_image_in_roi, right_image_in_roi); // Write out the camera models used to generate the aligned images. // - Currently this won't work if we used .adjust files from bundle_adjust. PinholeModel* left_pin_model = dynamic_cast<PinholeModel*>(left_cam.get ()); PinholeModel* right_pin_model = dynamic_cast<PinholeModel*>(right_cam.get()); if (left_pin_model) left_pin_model->write(m_out_prefix + "-L.tsai"); if (right_pin_model) right_pin_model->write(m_out_prefix + "-R.tsai"); // Transform the input images to be as if they were captured by the // epipolar-aligned camera models, aligning the two images. epipolar_transformed_images(m_left_camera_file, m_right_camera_file, left_cam, right_cam, left_masked_image, right_masked_image, left_image_in_roi, right_image_in_roi, left_out_size, right_out_size, Limg, Rimg, ext_nodata); } else { // Handle CAHV derived models camera_models(left_cam, right_cam); epipolar_transformed_cahv_images(m_left_camera_file, m_right_camera_file, left_cam, right_cam, left_masked_image, right_masked_image, Limg, Rimg, ext_nodata); } } void StereoSessionPinhole::get_unaligned_camera_models( boost::shared_ptr<vw::camera::CameraModel> &left_cam, boost::shared_ptr<vw::camera::CameraModel> &right_cam, std::string ba_prefix) const{ // Retrieve the pixel offset (if any) to cropped images vw::Vector2 left_pixel_offset = camera_pixel_offset(isMapProjected(), m_left_image_file, m_right_image_file, m_left_image_file); vw::Vector2 right_pixel_offset = camera_pixel_offset(isMapProjected(), m_left_image_file, m_right_image_file, m_right_image_file); // Load the camera models adjusted for cropping left_cam = load_adjusted_model(vw::camera::load_pinhole_camera_model(m_left_camera_file), m_left_image_file, m_left_camera_file, ba_prefix, left_pixel_offset); right_cam = load_adjusted_model(vw::camera::load_pinhole_camera_model(m_right_camera_file), m_right_image_file, m_right_camera_file, ba_prefix, right_pixel_offset); } void StereoSessionPinhole::camera_models(boost::shared_ptr<vw::camera::CameraModel> &cam1, boost::shared_ptr<vw::camera::CameraModel> &cam2) { vw::Vector2i left_out_size, right_out_size; load_camera_models(cam1, cam2, left_out_size, right_out_size); } void StereoSessionPinhole::load_camera_models( boost::shared_ptr<vw::camera::CameraModel> &left_cam, boost::shared_ptr<vw::camera::CameraModel> &right_cam, Vector2i &left_out_size, Vector2i &right_out_size) { std::string lcase_file = boost::to_lower_copy(m_left_camera_file); if ( (stereo_settings().alignment_method != "epipolar") || ( !boost::ends_with(lcase_file, ".pinhole") && !boost::ends_with(lcase_file, ".tsai" ) ) ) { // Non-PinholeModel and non-epipolar case, just use the simpler handling method // and leave the sizes unset, they won't be used. left_cam = camera_model(m_left_image_file, m_left_camera_file ); right_cam = camera_model(m_right_image_file, m_right_camera_file); return; } // The case of epipolar alignment is more complicated. The camera models // returned do not include a crop offset, but the aligned camera // models have been shifted so that they are aligned after the crop // has been applied. PinholeModel left_pin (m_left_camera_file ); PinholeModel right_pin(m_right_camera_file); // Create epipolar rectified camera views boost::shared_ptr<PinholeModel> epipolar_left_pin (new PinholeModel); boost::shared_ptr<PinholeModel> epipolar_right_pin(new PinholeModel); epipolar(left_pin, right_pin, *epipolar_left_pin, *epipolar_right_pin); // Get the input image crop regions, if any. BBox2i left_bbox, right_bbox; get_input_image_crops(left_bbox, right_bbox); // Shift the epipolar cameras to line up with the top left corner of the image and also // get the pixel sizes of -L.tif and -R.tif. // - These camera model still represent the entire image as if no cropping occurred. resize_epipolar_cameras_to_fit(left_pin, right_pin, *(epipolar_left_pin.get()), *(epipolar_right_pin.get()), left_bbox, right_bbox, left_out_size, right_out_size); // The pinhole epipolar case is incompatible with adjustment files so they are not loaded. left_cam = epipolar_left_pin; right_cam = epipolar_right_pin; } // Return the left transform used in alignment vw::TransformPtr StereoSessionPinhole::tx_left() const { // TODO(oalexan1): Find a relevant test case then wipe the commented-out logic // below. // A very annoying feature of epipolar alignment is that the cameras // returned in this mode already have alignment applied to them. // See StereoSessionPinhole::load_camera_models() above. // Then, the alignment need not happen in here, so we always return // tx_left_homography(), even though for epipolar alignment that // becomes the identity matrix instead of the expected alignment // transform. // It has to be that way since the cameras are aligned. Otherwise, // since triangulation is done with aligned cameras, if tx_left() // would return unaligned pixels, the results end up wrong. // That was likely a clever optimization, but it wreaks havoc with // usual conventions. It also results in having two camera loaders, // namely camera_models() and get_unaligned_camera_models(). // All this must be wiped and one must go back to the normal way of // doing things consistent with the other modes. It would require // very careful understanding of the many camera loading functions // in this class, which have repeated logic, and how they deal with // alignment and crop windows. Lots of work. // So, for now leave things so that this class is consistent with // itself for epipolar alignment, and the produced triangulated // point cloud is correct, even though that is not consistent // with the usual way of doing things. //if (stereo_settings().alignment_method != "epipolar") return StereoSession::tx_left_homography(); // see above // Comment out the logic below, per the text above. // TODO(oalexan1): Figure out if things can work without casting // away the const. //vw::TransformPtr trans_left, trans_right; //((StereoSessionPinhole*)this)->pinhole_cam_trans(trans_left, trans_right); //return trans_left; } // Return the right transform used in alignment vw::TransformPtr StereoSessionPinhole::tx_right() const { //if (stereo_settings().alignment_method != "epipolar") return StereoSession::tx_right_homography(); // see above // See the lengthy rant in tx_left() above. // TODO(oalexan1): Figure out if things can work without casting // away the const. //vw::TransformPtr trans_left, trans_right; //((StereoSessionPinhole*)this)->pinhole_cam_trans(trans_left, trans_right); //return trans_right; } void StereoSessionPinhole::pinhole_cam_trans(vw::TransformPtr & left_trans, vw::TransformPtr & right_trans) { // Load the epipolar aligned camera models boost::shared_ptr<camera::CameraModel> left_aligned_model, right_aligned_model; // TODO(oalexan1): Models must be loaded by now, presumably. Then // pinhole_cam_trans can be const, and we don't to cast away the const in tx_left() // and tx_right() above. this->camera_models(left_aligned_model, right_aligned_model); boost::shared_ptr<camera::CameraModel> left_input_model, right_input_model; std::string ba_prefix = asp::stereo_settings().bundle_adjust_prefix; this->get_unaligned_camera_models(left_input_model, right_input_model, ba_prefix); // Check the type, CAHV* type models are not supported! typedef vw::camera::PinholeModel PinModel; PinModel* left_in_ptr = dynamic_cast<PinModel*>(&(*left_input_model)); if (!left_in_ptr) vw_throw(NoImplErr() << "Detected CAHV-type cameras. Use an alignment " << "method different than 'epipolar'.\n" ); // Set up transform objects left_trans.reset (new PinholeCamTrans(*dynamic_cast<PinModel*>(&(*left_input_model)), *dynamic_cast<PinModel*>(&(*left_aligned_model)))); right_trans.reset(new PinholeCamTrans(*dynamic_cast<PinModel*>(&(*right_input_model)), *dynamic_cast<PinModel*>(&(*right_aligned_model)))); } } // end namespace asp ================================================ FILE: src/asp/Sessions/StereoSessionPinhole.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionPinhole.h /// #ifndef __STEREO_SESSION_PINHOLE_H__ #define __STEREO_SESSION_PINHOLE_H__ #include <asp/Sessions/StereoSession.h> #include <vw/Camera/CameraTransform.h> #include <vw/Camera/PinholeModel.h> namespace asp { // Pinhole camera model loading function which handles the case of epipolar alignment. vw::CamPtr load_adj_pinhole_model(std::string const& image_file, std::string const& camera_file, std::string const& left_image_file, std::string const& right_image_file, std::string const& left_camera_file, std::string const& right_camera_file, std::string const& ba_prefix, bool isMapProjected); typedef vw::camera::CameraTransform<vw::camera::PinholeModel, vw::camera::PinholeModel> PinholeCamTrans; typedef boost::shared_ptr<PinholeCamTrans> PinholeCamTransPtr; class StereoSessionPinhole: public StereoSession { public: StereoSessionPinhole() {} virtual ~StereoSessionPinhole() {} virtual std::string name() const { return "pinhole"; } // The pinhole session is used with rovers and other non-satellite cameras, // so there is no datum, unless explicitly provided. virtual bool have_datum() const; static SessionPtr construct() { return SessionPtr(new StereoSessionPinhole); } /// Override this function to make sure it properly generates the /// aligned camera models. virtual void camera_models(boost::shared_ptr<vw::camera::CameraModel> &cam1, boost::shared_ptr<vw::camera::CameraModel> &cam2); /// Specialized function to load both camera models and find their output sizes void load_camera_models(boost::shared_ptr<vw::camera::CameraModel> &left_cam, boost::shared_ptr<vw::camera::CameraModel> &right_cam, vw::Vector2i &left_out_size, vw::Vector2i &right_out_size); /// Return the input camera models with no alignment applied. /// - This only matters in the epipolar alignment case, where the normal camera model /// functions return the aligned camera models. void get_unaligned_camera_models(boost::shared_ptr<vw::camera::CameraModel> &left_cam, boost::shared_ptr<vw::camera::CameraModel> &right_cam, std::string ba_prefix) const; /// Transforms from the aligned image coordinates back to coordinates in the camera models. /// - Note that for epipolar aligned images these return identity transforms since the /// epipolar aligned images are consisted with the (new epipolar) camera models returned /// from this class. virtual vw::TransformPtr tx_left () const; virtual vw::TransformPtr tx_right() const; /// Get the transforms from the unaligned input images to the epipolar aligned images. /// - CAHV* type models are not currently supported! void pinhole_cam_trans(vw::TransformPtr & left_trans, vw::TransformPtr & right_trans); protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const; // Apply epipolar alignment to images, if the camera models are pinhole virtual void epipolar_alignment(vw::ImageViewRef<vw::PixelMask<float>> left_masked_image, vw::ImageViewRef<vw::PixelMask<float>> right_masked_image, vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata, // Outputs vw::ImageViewRef<vw::PixelMask<float>> & Limg, vw::ImageViewRef<vw::PixelMask<float>> & Rimg); }; } #endif // __STEREO_SESSION_PINHOLE_H__ ================================================ FILE: src/asp/Sessions/StereoSessionRPC.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file StereoSessionRPC.h /// #ifndef __STEREO_SESSION_RPC_H__ #define __STEREO_SESSION_RPC_H__ #include <asp/Camera/RPCStereoModel.h> #include <asp/Sessions/StereoSessionGdal.h> namespace asp { /// Derived StereoSession class using the RPC camera model. class StereoSessionRPC: public StereoSessionGdal { public: StereoSessionRPC(){}; virtual ~StereoSessionRPC(){}; virtual std::string name() const { return "rpc"; } /// Simple factory function. static SessionPtr construct() { return SessionPtr(new StereoSessionRPC); } /// Returns the target datum to use for a given camera model. virtual vw::cartography::Datum get_datum(const vw::camera::CameraModel* cam, bool use_sphere_for_non_earth) const { const asp::RPCModel *rpc_cam = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(cam)); if (rpc_cam == NULL) vw::vw_throw(vw::ArgumentErr() << "Could not get an RPC camera model as expected."); // The RPC model knows its datum return rpc_cam->datum(); } protected: /// Function to load a camera model of the particular type. virtual boost::shared_ptr<vw::camera::CameraModel> load_camera_model(std::string const& image_file, std::string const& camera_file, std::string const& ba_prefix, vw::Vector2 pixel_offset) const { return load_rpc_camera_model(image_file, camera_file, ba_prefix, pixel_offset); } }; // End class StereoSessionRPC } // namespace asp #endif // __STEREO_SESSION_RPC_H__ ================================================ FILE: src/asp/Sessions/tests/TestInstantiation.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Sessions/StereoSessionGdal.h> #include <asp/Sessions/StereoSessionMapProj.h> #include <asp/Sessions/StereoSessionRPC.h> #include <asp/Sessions/StereoSessionIsis.h> #include <asp/Sessions/StereoSessionPinhole.h> #include <asp/Sessions/StereoSessionNadirPinhole.h> #include <asp/asp_config.h> #include <test/Helpers.h> using namespace vw; using namespace asp; // This is to make sure the developers provide types for their // sessions. The test is to see if this even compiles. Not if it // runs. (It doesn't) template <typename T> class InstantiationTest : public ::testing::Test { public: typedef T SessionT; InstantiationTest() {} virtual void SetUp() {} SessionT session; }; typedef ::testing::Types<StereoSessionDG, StereoSessionDGMapRPC, StereoSessionRPC, #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 StereoSessionIsis, #endif StereoSessionPinhole, StereoSessionNadirPinhole> SessionTypes; TYPED_TEST_CASE( InstantiationTest, SessionTypes ); TYPED_TEST( InstantiationTest, Typedefs ) { try { // Verify object for left transform vw::TransformPtr left_tx = this->session.tx_left(); // Verify object for right transform vw::TransformPtr right_tx = this->session.tx_right(); } catch ( const vw::Exception& e ) {} } TEST( Instantiation, Names ) { std::vector<StereoSession*> sessions; vw::GdalWriteOptions opt; sessions.push_back( StereoSessionDG::construct() ); sessions.push_back( StereoSessionDGMapRPC::construct() ); sessions.push_back( StereoSessionRPC::construct() ); #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 sessions.push_back( StereoSessionIsis::construct() ); #endif sessions.push_back( StereoSessionPinhole::construct() ); sessions.push_back( StereoSessionNadirPinhole::construct() ); for ( size_t i = 0; i < sessions.size(); i++ ) { EXPECT_TRUE( sessions[i] ); } std::set<std::string> names; for ( size_t i = 0; i < sessions.size(); i++ ) { EXPECT_EQ( names.end(), names.find( sessions[i]->name() ) ); names.insert( sessions[i]->name() ); } EXPECT_EQ( names.size(), sessions.size() ); for ( size_t i = 0; i < sessions.size(); i++ ) { delete sessions[i]; } } ================================================ FILE: src/asp/Sessions/tests/TestStereoSessionASTER.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Sessions/StereoSessionASTER.h> #include <asp/Camera/XMLBase.h> #include <asp/Camera/ASTER_XML.h> #include <boost/shared_ptr.hpp> #include <test/Helpers.h> #include <vw/Stereo/StereoModel.h> #include <vw/Cartography/GeoTransform.h> using namespace vw; using namespace asp; using namespace xercesc; using namespace vw::test; //TODO: Run tests! /* TEST(StereoSessionAster, CreateCamera) { StereoSessionDG session; boost::shared_ptr<camera::CameraModel> cam1( session.camera_model("", "dg_example1.xml") ), cam2( session.camera_model("", "dg_example2.xml") ); ASSERT_TRUE( cam1.get() != 0 ); ASSERT_TRUE( cam2.get() != 0 ); Vector2 m1(13864, 5351), m2(15045, 5183); m1 *= 2; m2 *= 2; stereo::StereoModel sm(cam1.get(), cam2.get()); double error; Vector3 pos = sm(m1,m2,error); EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters. EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera. // Verify that projection back into the camera hits the right // spot. It will slightly be wrong due to the above triangulation error. #if __GNUC__ #if __x86_64__ || __ppc64__ EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 ); #else EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 ); #endif #endif // A more accurate test is just to project out and back into the same camera for ( size_t i = 0; i < 30000; i += 500 ) { for ( size_t j = 0; j < 24000; j += 500 ) { EXPECT_VECTOR_NEAR( Vector2(i,j), cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) + 2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ), 1e-1 / *pixels* /); } } // Create a camera that only has a single TLC entry. It will throw // an error in the event that first line time and TLC entry lookup // don't agree. That should be good enough for a test. EXPECT_NO_THROW( boost::shared_ptr<camera::CameraModel> cam3( session.camera_model("", "dg_example3.xml") ) ); } TEST(StereoSessionDG, ProjectRPC) { XMLPlatformUtils::Initialize(); // Read the RPC RPCXML xml; xml.read_from_file( "dg_example1.xml" ); boost::shared_ptr<RPCModel> rpc_model( new RPCModel(*xml.rpc_ptr()) ); // Read the Digital Globe camera model StereoSessionDG session; boost::shared_ptr<camera::CameraModel> dg_model( session.camera_model("", "dg_example1.xml") ); // Verify the measurement between the two cameras cartography::Datum datum("WGS84"); // This should be 0,0 Vector3 xyz = datum.geodetic_to_cartesian( Vector3(-105.42399,39.833107,2595.9) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 35170, 0 xyz = datum.geodetic_to_cartesian( Vector3(-105.35823,39.842179,2441.3) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 35170, 23708 xyz = datum.geodetic_to_cartesian( Vector3(-105.35795,39.803541,2612.6) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 0, 23708 xyz = datum.geodetic_to_cartesian( Vector3(-105.42418,39.793464,2801.8) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); } */ ================================================ FILE: src/asp/Sessions/tests/TestStereoSessionDG.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Sessions/StereoSessionGdal.h> #include <asp/Camera/XMLBase.h> #include <asp/Camera/RPC_XML.h> #include <asp/Camera/RPCModel.h> #include <boost/shared_ptr.hpp> #include <test/Helpers.h> #include <vw/Stereo/StereoModel.h> #include <vw/Cartography/GeoTransform.h> using namespace vw; using namespace asp; using namespace xercesc; using namespace vw::test; TEST(StereoSessionDG, CreateCamera) { StereoSessionDG session; boost::shared_ptr<camera::CameraModel> cam1( session.camera_model("", "dg_example1.xml") ), cam2( session.camera_model("", "dg_example2.xml") ); ASSERT_TRUE( cam1.get() != 0 ); ASSERT_TRUE( cam2.get() != 0 ); Vector2 m1(13864, 5351), m2(15045, 5183); m1 *= 2; m2 *= 2; stereo::StereoModel sm(cam1.get(), cam2.get()); double error; Vector3 pos = sm(m1,m2,error); EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters. EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera. // Verify that projection back into the camera hits the right // spot. It will slightly be wrong due to the above triangulation error. #if __GNUC__ #if __x86_64__ || __ppc64__ EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 ); #else EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 ); #endif #endif // A more accurate test is just to project out and back into the same camera for ( size_t i = 0; i < 30000; i += 500 ) { for ( size_t j = 0; j < 24000; j += 500 ) { EXPECT_VECTOR_NEAR( Vector2(i,j), cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) + 2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ), 1e-1 /*pixels*/); } } // Create a camera that only has a single TLC entry. It will throw // an error in the event that first line time and TLC entry lookup // don't agree. That should be good enough for a test. EXPECT_NO_THROW( boost::shared_ptr<camera::CameraModel> cam3( session.camera_model("", "dg_example3.xml") ) ); } TEST(StereoSessionDG, ProjectRPC) { XMLPlatformUtils::Initialize(); // Read the RPC RPCXML xml; xml.read_from_file( "dg_example1.xml" ); boost::shared_ptr<RPCModel> rpc_model( new RPCModel(*xml.rpc_ptr()) ); // Read the Digital Globe camera model StereoSessionDG session; boost::shared_ptr<camera::CameraModel> dg_model( session.camera_model("", "dg_example1.xml") ); // Verify the measurement between the two cameras cartography::Datum datum("WGS84"); // This should be 0,0 Vector3 xyz = datum.geodetic_to_cartesian( Vector3(-105.42399,39.833107,2595.9) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 35170, 0 xyz = datum.geodetic_to_cartesian( Vector3(-105.35823,39.842179,2441.3) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 35170, 23708 xyz = datum.geodetic_to_cartesian( Vector3(-105.35795,39.803541,2612.6) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 0, 23708 xyz = datum.geodetic_to_cartesian( Vector3(-105.42418,39.793464,2801.8) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); } ================================================ FILE: src/asp/Sessions/tests/TestStereoSessionDGMapRPC.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Sessions/StereoSessionMapProj.h> #include <asp/Camera/RPC_XML.h> #include <asp/Camera/RPCModel.h> #include <boost/shared_ptr.hpp> #include <test/Helpers.h> #include <vw/Stereo/StereoModel.h> #include <vw/Cartography/GeoReferenceUtils.h> using namespace vw; using namespace asp; using namespace vw::test; TEST(StereoSessionDGMapRPC, TransformCycle) { // Generate GeoReference projection that matches something that the // RPC models in dg_example1 and dg_example4 see. cartography::GeoReference lowres_georef; // WGS84 lowres_georef.set_equirectangular( 37.745, -103.29, 37 ); Matrix<double> tx = math::identity_matrix<3>(); tx(0,0) = tx(1,1) = 500; tx(0,2) = tx(1,2) = -1000; lowres_georef.set_transform( tx ); // Make low res images. We have to overcrop, otherwise the bicubic // interpolation of the DEM will have edge effects. cartography::GeoReference lowres_overcrop_georef = lowres_georef; tx(0,2) = tx(1,2) = -2000; lowres_overcrop_georef.set_transform( tx ); ImageView<float> lowres_overcrop_image(8,8); double dem_height = 2287; // Average height of this area fill( lowres_overcrop_image, dem_height ); UnlinkName lowres_dem_name( "lowres_dem.tif" ); write_gdal_image(lowres_dem_name, lowres_overcrop_image, lowres_overcrop_georef, GdalWriteOptions()); // Make hires images cartography::GeoReference hires_georef = lowres_georef; tx(0,0) = tx(1,1) = 100; tx(0,2) = tx(1,2) = -1000; hires_georef.set_transform( tx ); ImageView<float> hires_image(20,20); fill( hires_image, 1 ); ImageView<float> lowres_image(4,4); fill( lowres_image, 2 ); UnlinkName left_image_name("faked_left.tif"), right_image_name("faked_right.tif"); write_gdal_image(left_image_name, lowres_image, lowres_georef, GdalWriteOptions()); write_gdal_image(right_image_name, hires_image, hires_georef, GdalWriteOptions()); // Create session vw::GdalWriteOptions opt; StereoSessionDGMapRPC session; session.initialize( opt, left_image_name, right_image_name, "dg_example1.xml", "dg_example4.xml", "debug/debug", lowres_dem_name); RPCXML left_xml, right_xml; left_xml.read_from_file( "dg_example1.xml" ); right_xml.read_from_file( "dg_example4.xml" ); vw::TransformPtr left_tx = session.tx_left(); vw::TransformPtr right_tx = session.tx_right(); cartography::Datum datum; // Verify that LX matches what we got by hand. for ( size_t j = 0; j < 4; j++ ) { for ( size_t i = 0; i < 4; i++ ) { Vector3 lonlatheight; subvector(lonlatheight,0,2) = lowres_georef.pixel_to_lonlat( Vector2(i,j) ); lonlatheight.z() = dem_height; Vector3 xyz = datum.geodetic_to_cartesian( lonlatheight ); EXPECT_VECTOR_NEAR( left_xml.rpc_ptr()->point_to_pixel( xyz ), left_tx->reverse( Vector2(i,j) ), 1e-1 ); } } // Verify that RX matches what we got by hand for ( size_t j = 0; j < 20; j++ ) { for ( size_t i = 0; i < 20; i++ ) { Vector3 lonlatheight; subvector(lonlatheight,0,2) = hires_georef.pixel_to_lonlat( Vector2(i,j) ); lonlatheight.z() = dem_height; Vector3 xyz = datum.geodetic_to_cartesian( lonlatheight ); EXPECT_VECTOR_NEAR( right_xml.rpc_ptr()->point_to_pixel( xyz ), right_tx->reverse( Vector2(i,j) ), 1e-1 ); } } } ================================================ FILE: src/asp/Sessions/tests/TestStereoSessionRPC.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Sessions/StereoSessionRPC.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/RPCStereoModel.h> #include <asp/Camera/RPC_XML.h> #include <test/Helpers.h> using namespace vw; using namespace asp; using namespace xercesc; // Placeholder test for when we have a real test case TEST( StereoSessionRPC, Dummy ) { EXPECT_TRUE(true); } ================================================ FILE: src/asp/Sessions/tests/TestStereoSessionSpot.cxx ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Sessions/StereoSessionGdal.h> #include <asp/Camera/XMLBase.h> #include <asp/Camera/SPOT_XML.h> #include <boost/shared_ptr.hpp> #include <test/Helpers.h> #include <vw/Stereo/StereoModel.h> #include <vw/Cartography/GeoTransform.h> using namespace vw; using namespace asp; using namespace xercesc; using namespace vw::test; //TODO: Run tests! /* TEST(StereoSessionSpot, CreateCamera) { StereoSessionDG session; boost::shared_ptr<camera::CameraModel> cam1( session.camera_model("", "dg_example1.xml") ), cam2( session.camera_model("", "dg_example2.xml") ); ASSERT_TRUE( cam1.get() != 0 ); ASSERT_TRUE( cam2.get() != 0 ); Vector2 m1(13864, 5351), m2(15045, 5183); m1 *= 2; m2 *= 2; stereo::StereoModel sm(cam1.get(), cam2.get()); double error; Vector3 pos = sm(m1,m2,error); EXPECT_LT( error, 5.0 ); // Triangulation should be better than 5 meters. EXPECT_LT( norm_2(pos), norm_2(cam1->camera_center(m1)) ); // Point should be below camera. // Verify that projection back into the camera hits the right // spot. It will slightly be wrong due to the above triangulation error. #if __GNUC__ #if __x86_64__ || __ppc64__ EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 4 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 4 ); #else EXPECT_VECTOR_NEAR( m1, cam1->point_to_pixel( pos ), 9 ); EXPECT_VECTOR_NEAR( m2, cam2->point_to_pixel( pos ), 25 ); #endif #endif // A more accurate test is just to project out and back into the same camera for ( size_t i = 0; i < 30000; i += 500 ) { for ( size_t j = 0; j < 24000; j += 500 ) { EXPECT_VECTOR_NEAR( Vector2(i,j), cam1->point_to_pixel( cam1->camera_center(Vector2(i,j)) + 2e4 * cam1->pixel_to_vector( Vector2(i,j) ) ), 1e-1 / *pixels* /); } } // Create a camera that only has a single TLC entry. It will throw // an error in the event that first line time and TLC entry lookup // don't agree. That should be good enough for a test. EXPECT_NO_THROW( boost::shared_ptr<camera::CameraModel> cam3( session.camera_model("", "dg_example3.xml") ) ); } TEST(StereoSessionDG, ProjectRPC) { XMLPlatformUtils::Initialize(); // Read the RPC RPCXML xml; xml.read_from_file( "dg_example1.xml" ); boost::shared_ptr<RPCModel> rpc_model( new RPCModel(*xml.rpc_ptr()) ); // Read the Digital Globe camera model StereoSessionDG session; boost::shared_ptr<camera::CameraModel> dg_model( session.camera_model("", "dg_example1.xml") ); // Verify the measurement between the two cameras cartography::Datum datum("WGS84"); // This should be 0,0 Vector3 xyz = datum.geodetic_to_cartesian( Vector3(-105.42399,39.833107,2595.9) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 35170, 0 xyz = datum.geodetic_to_cartesian( Vector3(-105.35823,39.842179,2441.3) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 35170, 23708 xyz = datum.geodetic_to_cartesian( Vector3(-105.35795,39.803541,2612.6) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); // This should be 0, 23708 xyz = datum.geodetic_to_cartesian( Vector3(-105.42418,39.793464,2801.8) ); EXPECT_VECTOR_NEAR( rpc_model->point_to_pixel( xyz ), dg_model->point_to_pixel( xyz ), 25 ); } */ ================================================ FILE: src/asp/Sessions/tests/dg_example1.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <isd> <IMD> <VERSION>AA</VERSION> <BANDID>P</BANDID> <NUMROWS>23708</NUMROWS> <NUMCOLUMNS>35170</NUMCOLUMNS> <RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL> <BITSPERPIXEL>16</BITSPERPIXEL> <COMPRESSIONTYPE>None</COMPRESSIONTYPE> <OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT> <IMAGE> <SATID>Imaginary1</SATID> <MODE>FullSwath</MODE> <SCANDIRECTION>Forward</SCANDIRECTION> <TLCTIME>1959-11-25T17:39:48.740958Z</TLCTIME> <NUMTLC>2</NUMTLC> <TLCLISTList> <TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST> <TLCLIST>2.370800000000000e+04 1.975667000000000e+00</TLCLIST> </TLCLISTList> <FIRSTLINETIME>1959-11-25T17:39:48.740958Z</FIRSTLINETIME> <AVGLINERATE>1.200000000000000e+04</AVGLINERATE> <EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION> <MINCOLLECTEDROWGSD>7.290000000000000e-01</MINCOLLECTEDROWGSD> <MAXCOLLECTEDROWGSD>7.320000000000000e-01</MAXCOLLECTEDROWGSD> <MEANCOLLECTEDROWGSD>7.310000000000000e-01</MEANCOLLECTEDROWGSD> <MINCOLLECTEDCOLGSD>6.720000000000000e-01</MINCOLLECTEDCOLGSD> <MAXCOLLECTEDCOLGSD>6.720000000000000e-01</MAXCOLLECTEDCOLGSD> <MEANCOLLECTEDCOLGSD>6.720000000000000e-01</MEANCOLLECTEDCOLGSD> <MEANCOLLECTEDGSD>7.010000000000000e-01</MEANCOLLECTEDGSD> <ROWUNCERTAINTY>5.732000000000000e+01</ROWUNCERTAINTY> <COLUNCERTAINTY>3.417000000000000e+01</COLUNCERTAINTY> <MINSUNAZ>1.619000000000000e+02</MINSUNAZ> <MAXSUNAZ>1.620000000000000e+02</MAXSUNAZ> <MEANSUNAZ>1.619000000000000e+02</MEANSUNAZ> <MINSUNEL>2.750000000000000e+01</MINSUNEL> <MAXSUNEL>2.770000000000000e+01</MAXSUNEL> <MEANSUNEL>2.760000000000000e+01</MEANSUNEL> <MINSATAZ>2.660000000000000e+01</MINSATAZ> <MAXSATAZ>2.720000000000000e+01</MAXSATAZ> <MEANSATAZ>2.690000000000000e+01</MEANSATAZ> <MINSATEL>5.200000000000000e+01</MINSATEL> <MAXSATEL>5.320000000000000e+01</MAXSATEL> <MEANSATEL>5.260000000000000e+01</MEANSATEL> <MININTRACKVIEWANGLE>3.240000000000000e+01</MININTRACKVIEWANGLE> <MAXINTRACKVIEWANGLE>3.270000000000000e+01</MAXINTRACKVIEWANGLE> <MEANINTRACKVIEWANGLE>3.260000000000000e+01</MEANINTRACKVIEWANGLE> <MINCROSSTRACKVIEWANGLE>1.170000000000000e+01</MINCROSSTRACKVIEWANGLE> <MAXCROSSTRACKVIEWANGLE>1.210000000000000e+01</MAXCROSSTRACKVIEWANGLE> <MEANCROSSTRACKVIEWANGLE>1.190000000000000e+01</MEANCROSSTRACKVIEWANGLE> <MINOFFNADIRVIEWANGLE>3.440000000000000e+01</MINOFFNADIRVIEWANGLE> <MAXOFFNADIRVIEWANGLE>3.440000000000000e+01</MAXOFFNADIRVIEWANGLE> <MEANOFFNADIRVIEWANGLE>3.440000000000000e+01</MEANOFFNADIRVIEWANGLE> <PNIIRS>4.200000000000000e+00</PNIIRS> <CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER> <RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL> <TDILEVEL>32</TDILEVEL> <POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC> <ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC> </IMAGE> </IMD> <EPH> <SATID>Imaginary1</SATID> <GENERATIONTIME>1959-11-25T19:05:33.862633Z</GENERATIONTIME> <STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME> <NUMPOINTS>840</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <EPHEMLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </EPHEMLISTList> </EPH> <ATT> <SATID>Imaginary1</SATID> <GENERATIONTIME>1959-11-30T00:18:13.000000Z</GENERATIONTIME> <STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME> <NUMPOINTS>840</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <ATTLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </ATTLISTList> </ATT> <TIL>monkey</TIL> <GEO> <EFFECTIVETIME>1959-09-18T00:00:00.000000Z</EFFECTIVETIME> <MODELGENERATIONTIME>1959-12-16T00:00:00.000000Z</MODELGENERATIONTIME> <SATID>Imaginary1</SATID> <PRINCIPAL_DISTANCE> <GENERATIONTIME>1959-12-05T00:00:00.000000Z</GENERATIONTIME> <PD>7.949165000000000e+03</PD> </PRINCIPAL_DISTANCE> <OPTICAL_DISTORTION> <GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME> <POLYORDER>0</POLYORDER> <ALIST>0.000000000000000e+00</ALIST> <BLIST>0.000000000000000e+00</BLIST> </OPTICAL_DISTORTION> <PERSPECTIVE_CENTER> <GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME> <CX>0.000000000000000e+00</CX> <CY>0.000000000000000e+00</CY> <CZ>0.000000000000000e+00</CZ> </PERSPECTIVE_CENTER> <CAMERA_ATTITUDE> <GENERATIONTIME>1959-06-08T00:00:00.000000Z</GENERATIONTIME> <QCS1>0.000000000000000e+00</QCS1> <QCS2>0.000000000000000e+00</QCS2> <QCS3>0.000000000000000e+00</QCS3> <QCS4>1.000000000000000e+00</QCS4> </CAMERA_ATTITUDE> <DETECTOR_MOUNTING> <GENERATIONTIME>1959-12-16T00:00:00.000000Z</GENERATIONTIME> <BAND_P> <BANDID>P</BANDID> <DETECTOR_ARRAY> <DETARRID>1</DETARRID> <DETORIGINX>5.372000000000000e-02</DETORIGINX> <DETORIGINY>1.407119300000000e+02</DETORIGINY> <DETROTANGLE>0.000000000000000e+00</DETROTANGLE> <DETPITCH>8.000000000000000e-03</DETPITCH> </DETECTOR_ARRAY> </BAND_P> </DETECTOR_MOUNTING> </GEO> <RPB> <SATID>IMAGINE01</SATID> <BANDID>P</BANDID> <SPECID>RPC00Y</SPECID> <IMAGE> <LINEOFFSET>11856</LINEOFFSET> <SAMPOFFSET>17564</SAMPOFFSET> <LATOFFSET>3.974540000000000e+01</LATOFFSET> <LONGOFFSET>-1.052903000000000e+02</LONGOFFSET> <HEIGHTOFFSET>2281</HEIGHTOFFSET> <LINESCALE>12384</LINESCALE> <SAMPSCALE>17927</SAMPSCALE> <LATSCALE>1.003000000000000e-01</LATSCALE> <LONGSCALE>1.345000000000000e-01</LONGSCALE> <HEIGHTSCALE>637</HEIGHTSCALE> <LINENUMCOEFList> <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> </LINENUMCOEFList> <LINEDENCOEFList> <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> </LINEDENCOEFList> <SAMPNUMCOEFList> <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> </SAMPNUMCOEFList> <SAMPDENCOEFList> <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> </SAMPDENCOEFList> </IMAGE> </RPB> </isd> ================================================ FILE: src/asp/Sessions/tests/dg_example2.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <isd> <IMD> <BANDID>P</BANDID> <PANSHARPENALGORITHM>None</PANSHARPENALGORITHM> <NUMROWS>27576</NUMROWS> <NUMCOLUMNS>35170</NUMCOLUMNS> <PRODUCTLEVEL>Stereo 1B</PRODUCTLEVEL> <PRODUCTTYPE>Stereo</PRODUCTTYPE> <NUMBEROFLOOKS>2</NUMBEROFLOOKS> <RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL> <BITSPERPIXEL>16</BITSPERPIXEL> <COMPRESSIONTYPE>None</COMPRESSIONTYPE> <OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT> <IMAGE> <SATID>Imaginary1</SATID> <MODE>FullSwath</MODE> <SCANDIRECTION>Forward</SCANDIRECTION> <TLCTIME>1432-11-25T17:40:29.834958Z</TLCTIME> <NUMTLC>2</NUMTLC> <TLCLISTList> <TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST> <TLCLIST>2.789200000000000e+04 2.324333000000000e+00</TLCLIST> </TLCLISTList> <FIRSTLINETIME>1432-11-25T17:40:29.834958Z</FIRSTLINETIME> <AVGLINERATE>1.200000000000000e+04</AVGLINERATE> <EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION> <MINCOLLECTEDROWGSD>5.080000000000000e-01</MINCOLLECTEDROWGSD> <MAXCOLLECTEDROWGSD>5.080000000000000e-01</MAXCOLLECTEDROWGSD> <MEANCOLLECTEDROWGSD>5.080000000000000e-01</MEANCOLLECTEDROWGSD> <MINCOLLECTEDCOLGSD>5.240000000000000e-01</MINCOLLECTEDCOLGSD> <MAXCOLLECTEDCOLGSD>5.250000000000000e-01</MAXCOLLECTEDCOLGSD> <MEANCOLLECTEDCOLGSD>5.250000000000000e-01</MEANCOLLECTEDCOLGSD> <MEANCOLLECTEDGSD>5.160000000000000e-01</MEANCOLLECTEDGSD> <ROWUNCERTAINTY>1.600000000000000e+01</ROWUNCERTAINTY> <COLUNCERTAINTY>3.055000000000000e+01</COLUNCERTAINTY> <MINSUNAZ>1.621000000000000e+02</MINSUNAZ> <MAXSUNAZ>1.621000000000000e+02</MAXSUNAZ> <MEANSUNAZ>1.621000000000000e+02</MEANSUNAZ> <MINSUNEL>2.760000000000000e+01</MINSUNEL> <MAXSUNEL>2.770000000000000e+01</MAXSUNEL> <MEANSUNEL>2.760000000000000e+01</MEANSUNEL> <MINSATAZ>7.400000000000000e+01</MINSATAZ> <MAXSATAZ>8.270000000000000e+01</MAXSATAZ> <MEANSATAZ>7.830000000000000e+01</MEANSATAZ> <MINSATEL>7.750000000000000e+01</MINSATEL> <MAXSATEL>7.820000000000000e+01</MAXSATEL> <MEANSATEL>7.790000000000001e+01</MEANSATEL> <MININTRACKVIEWANGLE>4.000000000000000e+00</MININTRACKVIEWANGLE> <MAXINTRACKVIEWANGLE>4.300000000000000e+00</MAXINTRACKVIEWANGLE> <MEANINTRACKVIEWANGLE>4.100000000000000e+00</MEANINTRACKVIEWANGLE> <MINCROSSTRACKVIEWANGLE>1.030000000000000e+01</MINCROSSTRACKVIEWANGLE> <MAXCROSSTRACKVIEWANGLE>1.070000000000000e+01</MAXCROSSTRACKVIEWANGLE> <MEANCROSSTRACKVIEWANGLE>1.050000000000000e+01</MEANCROSSTRACKVIEWANGLE> <MINOFFNADIRVIEWANGLE>1.130000000000000e+01</MINOFFNADIRVIEWANGLE> <MAXOFFNADIRVIEWANGLE>1.130000000000000e+01</MAXOFFNADIRVIEWANGLE> <MEANOFFNADIRVIEWANGLE>1.130000000000000e+01</MEANOFFNADIRVIEWANGLE> <PNIIRS>4.600000000000000e+00</PNIIRS> <CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER> <RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL> <TDILEVEL>32</TDILEVEL> <POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC> <ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC> </IMAGE> </IMD> <EPH> <SATID>Imaginary1</SATID> <GENERATIONTIME>1432-11-25T19:05:33.862633Z</GENERATIONTIME> <STARTTIME>1432-11-25T17:40:21.387413Z</STARTTIME> <NUMPOINTS>931</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <EPHEMLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </EPHEMLISTList> </EPH> <ATT> <SATID>Imaginary1</SATID> <GENERATIONTIME>1432-11-30T00:18:13.000000Z</GENERATIONTIME> <STARTTIME>1432-11-25T17:40:21.387413Z</STARTTIME> <NUMPOINTS>931</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <ATTLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </ATTLISTList> </ATT> <TIL> <BANDID>P</BANDID> <NUMTILES>1</NUMTILES> <TILESIZEX>35170</TILESIZEX> <TILESIZEY>27576</TILESIZEY> <TILEUNITS>Pixels</TILEUNITS> <TILEOVERLAP>3545</TILEOVERLAP> <TILE> <FILENAME>07NOV25174027-P1BS_R1C1-005728210010_01_P001.TIF</FILENAME> <ULCOLOFFSET>0</ULCOLOFFSET> <ULROWOFFSET>0</ULROWOFFSET> <URCOLOFFSET>35169</URCOLOFFSET> <URROWOFFSET>0</URROWOFFSET> <LRCOLOFFSET>35169</LRCOLOFFSET> <LRROWOFFSET>27575</LRROWOFFSET> <LLCOLOFFSET>0</LLCOLOFFSET> <LLROWOFFSET>27575</LLROWOFFSET> <ULLON>-1.053955881000000e+02</ULLON> <ULLAT>3.980947709000000e+01</ULLAT> <URLON>-1.051834485800000e+02</URLON> <URLAT>3.981066533000000e+01</URLAT> <LRLON>-1.051836261900000e+02</LRLON> <LRLAT>3.968439626000000e+01</LRLAT> <LLLON>-1.053955469800000e+02</LLLON> <LLLAT>3.968329551000000e+01</LLLAT> </TILE> </TIL> <GEO> <EFFECTIVETIME>1432-09-18T00:00:00.000000Z</EFFECTIVETIME> <MODELGENERATIONTIME>1432-12-16T00:00:00.000000Z</MODELGENERATIONTIME> <SATID>Imaginary1</SATID> <GEOMODELLEVEL>LV1B</GEOMODELLEVEL> <PRINCIPAL_DISTANCE> <GENERATIONTIME>1432-12-05T00:00:00.000000Z</GENERATIONTIME> <PD>7.949165000000000e+03</PD> </PRINCIPAL_DISTANCE> <OPTICAL_DISTORTION> <GENERATIONTIME>2000-01-01T00:00:00.000000Z</GENERATIONTIME> <POLYORDER>0</POLYORDER> <ALIST>0.000000000000000e+00</ALIST> <BLIST>0.000000000000000e+00</BLIST> </OPTICAL_DISTORTION> <PERSPECTIVE_CENTER> <GENERATIONTIME>2000-01-01T00:00:00.000000Z</GENERATIONTIME> <CX>0.000000000000000e+00</CX> <CY>0.000000000000000e+00</CY> <CZ>0.000000000000000e+00</CZ> </PERSPECTIVE_CENTER> <CAMERA_ATTITUDE> <GENERATIONTIME>1432-06-08T00:00:00.000000Z</GENERATIONTIME> <QCS1>0.000000000000000e+00</QCS1> <QCS2>0.000000000000000e+00</QCS2> <QCS3>0.000000000000000e+00</QCS3> <QCS4>1.000000000000000e+00</QCS4> </CAMERA_ATTITUDE> <DETECTOR_MOUNTING> <GENERATIONTIME>1432-12-16T00:00:00.000000Z</GENERATIONTIME> <BAND_P> <BANDID>P</BANDID> <DETECTOR_ARRAY> <DETARRID>1</DETARRID> <DETORIGINX>5.372000000000000e-02</DETORIGINX> <DETORIGINY>1.407119300000000e+02</DETORIGINY> <DETROTANGLE>0.000000000000000e+00</DETROTANGLE> <DETPITCH>8.000000000000000e-03</DETPITCH> </DETECTOR_ARRAY> </BAND_P> </DETECTOR_MOUNTING> </GEO> </isd> ================================================ FILE: src/asp/Sessions/tests/dg_example3.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <isd> <IMD> <VERSION>Monkey</VERSION> <BANDID>P</BANDID> <NUMROWS>54272</NUMROWS> <NUMCOLUMNS>35840</NUMCOLUMNS> <BITSPERPIXEL>16</BITSPERPIXEL> <COMPRESSIONTYPE>JPEG2000</COMPRESSIONTYPE> <OUTPUTFORMAT>NITF21NCDRD</OUTPUTFORMAT> <IMAGE> <SATID>WV01</SATID> <MODE>FullSwath</MODE> <SCANDIRECTION>Forward</SCANDIRECTION> <TLCTIME>1959-11-15T22:24:14.209479Z</TLCTIME> <NUMTLC>1</NUMTLC> <TLCLISTList> <TLCLIST>1.010200000000000e+05 0.000000000000000e+00</TLCLIST> </TLCLISTList> <FIRSTLINETIME>1959-11-15T22:24:10.000312Z</FIRSTLINETIME> <AVGLINERATE>2.400000000000000e+04</AVGLINERATE> <EXPOSUREDURATION>1.333330000000000e-03</EXPOSUREDURATION> <MINCOLLECTEDROWGSD>5.820000000000000e-01</MINCOLLECTEDROWGSD> <MAXCOLLECTEDROWGSD>5.830000000000000e-01</MAXCOLLECTEDROWGSD> <MEANCOLLECTEDROWGSD>5.820000000000000e-01</MEANCOLLECTEDROWGSD> <MINCOLLECTEDCOLGSD>6.760000000000000e-01</MINCOLLECTEDCOLGSD> <MAXCOLLECTEDCOLGSD>6.820000000000001e-01</MAXCOLLECTEDCOLGSD> <MEANCOLLECTEDCOLGSD>6.790000000000000e-01</MEANCOLLECTEDCOLGSD> <MEANCOLLECTEDGSD>6.290000000000000e-01</MEANCOLLECTEDGSD> <MEANPRODUCTROWGSD>5.860000000000000e-01</MEANPRODUCTROWGSD> <MEANPRODUCTCOLGSD>6.770000000000000e-01</MEANPRODUCTCOLGSD> <MEANPRODUCTGSD>6.300000000000000e-01</MEANPRODUCTGSD> <ROWUNCERTAINTY>3.294000000000000e+01</ROWUNCERTAINTY> <COLUNCERTAINTY>7.561000000000000e+01</COLUNCERTAINTY> <MINSUNAZ>1.870000000000000e+02</MINSUNAZ> <MAXSUNAZ>1.871000000000000e+02</MAXSUNAZ> <MEANSUNAZ>1.871000000000000e+02</MEANSUNAZ> <MINSUNEL>4.390000000000000e+01</MINSUNEL> <MAXSUNEL>4.410000000000000e+01</MAXSUNEL> <MEANSUNEL>4.400000000000000e+01</MEANSUNEL> <MINSATAZ>2.570000000000000e+02</MINSATAZ> <MAXSATAZ>2.595000000000000e+02</MAXSATAZ> <MEANSATAZ>2.582000000000000e+02</MEANSATAZ> <MINSATEL>5.860000000000000e+01</MINSATEL> <MAXSATEL>5.950000000000000e+01</MAXSATEL> <MEANSATEL>5.910000000000000e+01</MEANSATEL> <MININTRACKVIEWANGLE>-1.780000000000000e+01</MININTRACKVIEWANGLE> <MAXINTRACKVIEWANGLE>-1.650000000000000e+01</MAXINTRACKVIEWANGLE> <MEANINTRACKVIEWANGLE>-1.710000000000000e+01</MEANINTRACKVIEWANGLE> <MINCROSSTRACKVIEWANGLE>-2.370000000000000e+01</MINCROSSTRACKVIEWANGLE> <MAXCROSSTRACKVIEWANGLE>-2.230000000000000e+01</MAXCROSSTRACKVIEWANGLE> <MEANCROSSTRACKVIEWANGLE>-2.300000000000000e+01</MEANCROSSTRACKVIEWANGLE> <MINOFFNADIRVIEWANGLE>2.830000000000000e+01</MINOFFNADIRVIEWANGLE> <MAXOFFNADIRVIEWANGLE>2.830000000000000e+01</MAXOFFNADIRVIEWANGLE> <MEANOFFNADIRVIEWANGLE>2.830000000000000e+01</MEANOFFNADIRVIEWANGLE> <PNIIRS>4.700000000000000e+00</PNIIRS> <CLOUDCOVER>2.000000000000000e-02</CLOUDCOVER> <RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL> <POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC> <ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC> <REVNUMBER>26387</REVNUMBER> </IMAGE> </IMD> <EPH> <SATID>Imaginary1</SATID> <GENERATIONTIME>1959-11-15T23:10:47.429131Z</GENERATIONTIME> <STARTTIME>1959-11-15T22:23:59.803099Z</STARTTIME> <NUMPOINTS>1031</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <EPHEMLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </EPHEMLISTList> </EPH> <ATT> <SATID>Imaginary1</SATID> <GENERATIONTIME>1959-11-15T23:10:43.000000Z</GENERATIONTIME> <STARTTIME>1959-11-15T22:23:59.803099Z</STARTTIME> <NUMPOINTS>1031</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <ATTLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </ATTLISTList> </ATT> <TIL>Today I learned</TIL> <GEO> <EFFECTIVETIME>1960-03-18T00:00:00.000000Z</EFFECTIVETIME> <MODELGENERATIONTIME>1958-12-16T00:00:00.000000Z</MODELGENERATIONTIME> <SATID>Imaginary1</SATID> <PRINCIPAL_DISTANCE> <GENERATIONTIME>1958-12-05T00:00:00.000000Z</GENERATIONTIME> <PD>7.949165000000000e+03</PD> </PRINCIPAL_DISTANCE> <OPTICAL_DISTORTION> <GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME> <POLYORDER>0</POLYORDER> <ALIST>0.000000000000000e+00</ALIST> <BLIST>0.000000000000000e+00</BLIST> </OPTICAL_DISTORTION> <PERSPECTIVE_CENTER> <GENERATIONTIME>1956-01-01T00:00:00.000000Z</GENERATIONTIME> <CX>0.000000000000000e+00</CX> <CY>0.000000000000000e+00</CY> <CZ>0.000000000000000e+00</CZ> </PERSPECTIVE_CENTER> <CAMERA_ATTITUDE> <GENERATIONTIME>1958-06-08T00:00:00.000000Z</GENERATIONTIME> <QCS1>0.000000000000000e+00</QCS1> <QCS2>0.000000000000000e+00</QCS2> <QCS3>0.000000000000000e+00</QCS3> <QCS4>1.000000000000000e+00</QCS4> </CAMERA_ATTITUDE> <DETECTOR_MOUNTING> <GENERATIONTIME>1958-12-16T00:00:00.000000Z</GENERATIONTIME> <BAND_P> <BANDID>P</BANDID> <DETECTOR_ARRAY> <DETARRID>1</DETARRID> <DETORIGINX>5.372000000000000e-02</DETORIGINX> <DETORIGINY>1.407119300000001e+02</DETORIGINY> <DETROTANGLE>0.000000000000000e+00</DETROTANGLE> <DETPITCH>8.000000000000000e-03</DETPITCH> </DETECTOR_ARRAY> </BAND_P> </DETECTOR_MOUNTING> </GEO> <RPB> <SATID>Imaginary1</SATID> <BANDID>P</BANDID> <SPECID>RPC00B</SPECID> <IMAGE> <ERRBIAS>2.248000000000000e+01</ERRBIAS> <ERRRAND>1.700000000000000e-01</ERRRAND> <LINEOFFSET>26709</LINEOFFSET> <SAMPOFFSET>17600</SAMPOFFSET> <LATOFFSET>6.936799999999999e+01</LATOFFSET> <LONGOFFSET>-1.503627000000000e+02</LONGOFFSET> <HEIGHTOFFSET>171</HEIGHTOFFSET> <LINESCALE>26801</LINESCALE> <SAMPSCALE>18028</SAMPSCALE> <LATSCALE>1.452000000000000e-01</LATSCALE> <LONGSCALE>3.025000000000000e-01</LONGSCALE> <HEIGHTSCALE>500</HEIGHTSCALE> <LINENUMCOEFList> <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> </LINENUMCOEFList> <LINEDENCOEFList> <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> </LINEDENCOEFList> <SAMPNUMCOEFList> <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> </SAMPNUMCOEFList> <SAMPDENCOEFList> <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> </SAMPDENCOEFList> </IMAGE> </RPB> </isd> ================================================ FILE: src/asp/Sessions/tests/dg_example4.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <isd> <IMD> <VERSION>AA</VERSION> <BANDID>P</BANDID> <NUMROWS>23708</NUMROWS> <NUMCOLUMNS>35170</NUMCOLUMNS> <RADIOMETRICLEVEL>Corrected</RADIOMETRICLEVEL> <BITSPERPIXEL>16</BITSPERPIXEL> <COMPRESSIONTYPE>None</COMPRESSIONTYPE> <OUTPUTFORMAT>GeoTIFF</OUTPUTFORMAT> <IMAGE> <SATID>Imaginary1</SATID> <MODE>FullSwath</MODE> <SCANDIRECTION>Forward</SCANDIRECTION> <TLCTIME>1959-11-25T17:39:48.740958Z</TLCTIME> <NUMTLC>2</NUMTLC> <TLCLISTList> <TLCLIST>0.000000000000000e+00 0.000000000000000e+00</TLCLIST> <TLCLIST>2.370800000000000e+04 1.975667000000000e+00</TLCLIST> </TLCLISTList> <FIRSTLINETIME>1959-11-25T17:39:48.740958Z</FIRSTLINETIME> <AVGLINERATE>1.200000000000000e+04</AVGLINERATE> <EXPOSUREDURATION>2.666670000000000e-03</EXPOSUREDURATION> <MINCOLLECTEDROWGSD>7.290000000000000e-01</MINCOLLECTEDROWGSD> <MAXCOLLECTEDROWGSD>7.320000000000000e-01</MAXCOLLECTEDROWGSD> <MEANCOLLECTEDROWGSD>7.310000000000000e-01</MEANCOLLECTEDROWGSD> <MINCOLLECTEDCOLGSD>6.720000000000000e-01</MINCOLLECTEDCOLGSD> <MAXCOLLECTEDCOLGSD>6.720000000000000e-01</MAXCOLLECTEDCOLGSD> <MEANCOLLECTEDCOLGSD>6.720000000000000e-01</MEANCOLLECTEDCOLGSD> <MEANCOLLECTEDGSD>7.010000000000000e-01</MEANCOLLECTEDGSD> <ROWUNCERTAINTY>5.732000000000000e+01</ROWUNCERTAINTY> <COLUNCERTAINTY>3.417000000000000e+01</COLUNCERTAINTY> <MINSUNAZ>1.619000000000000e+02</MINSUNAZ> <MAXSUNAZ>1.620000000000000e+02</MAXSUNAZ> <MEANSUNAZ>1.619000000000000e+02</MEANSUNAZ> <MINSUNEL>2.750000000000000e+01</MINSUNEL> <MAXSUNEL>2.770000000000000e+01</MAXSUNEL> <MEANSUNEL>2.760000000000000e+01</MEANSUNEL> <MINSATAZ>2.660000000000000e+01</MINSATAZ> <MAXSATAZ>2.720000000000000e+01</MAXSATAZ> <MEANSATAZ>2.690000000000000e+01</MEANSATAZ> <MINSATEL>5.200000000000000e+01</MINSATEL> <MAXSATEL>5.320000000000000e+01</MAXSATEL> <MEANSATEL>5.260000000000000e+01</MEANSATEL> <MININTRACKVIEWANGLE>3.240000000000000e+01</MININTRACKVIEWANGLE> <MAXINTRACKVIEWANGLE>3.270000000000000e+01</MAXINTRACKVIEWANGLE> <MEANINTRACKVIEWANGLE>3.260000000000000e+01</MEANINTRACKVIEWANGLE> <MINCROSSTRACKVIEWANGLE>1.170000000000000e+01</MINCROSSTRACKVIEWANGLE> <MAXCROSSTRACKVIEWANGLE>1.210000000000000e+01</MAXCROSSTRACKVIEWANGLE> <MEANCROSSTRACKVIEWANGLE>1.190000000000000e+01</MEANCROSSTRACKVIEWANGLE> <MINOFFNADIRVIEWANGLE>3.440000000000000e+01</MINOFFNADIRVIEWANGLE> <MAXOFFNADIRVIEWANGLE>3.440000000000000e+01</MAXOFFNADIRVIEWANGLE> <MEANOFFNADIRVIEWANGLE>3.440000000000000e+01</MEANOFFNADIRVIEWANGLE> <PNIIRS>4.200000000000000e+00</PNIIRS> <CLOUDCOVER>0.000000000000000e+00</CLOUDCOVER> <RESAMPLINGKERNEL>CC</RESAMPLINGKERNEL> <TDILEVEL>32</TDILEVEL> <POSITIONKNOWLEDGESRC>R</POSITIONKNOWLEDGESRC> <ATTITUDEKNOWLEDGESRC>R</ATTITUDEKNOWLEDGESRC> </IMAGE> </IMD> <EPH> <SATID>Imaginary1</SATID> <GENERATIONTIME>1959-11-25T19:05:33.862633Z</GENERATIONTIME> <STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME> <NUMPOINTS>840</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <EPHEMLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </EPHEMLISTList> </EPH> <ATT> <SATID>Imaginary1</SATID> <GENERATIONTIME>1959-11-30T00:18:13.000000Z</GENERATIONTIME> <STARTTIME>1959-11-25T17:39:40.987511Z</STARTTIME> <NUMPOINTS>840</NUMPOINTS> <TIMEINTERVAL>2.000000000000000e-02</TIMEINTERVAL> <ATTLISTList> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> </ATTLISTList> </ATT> <TIL>monkey</TIL> <GEO> <EFFECTIVETIME>1959-09-18T00:00:00.000000Z</EFFECTIVETIME> <MODELGENERATIONTIME>1959-12-16T00:00:00.000000Z</MODELGENERATIONTIME> <SATID>Imaginary1</SATID> <PRINCIPAL_DISTANCE> <GENERATIONTIME>1959-12-05T00:00:00.000000Z</GENERATIONTIME> <PD>7.949165000000000e+03</PD> </PRINCIPAL_DISTANCE> <OPTICAL_DISTORTION> <GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME> <POLYORDER>0</POLYORDER> <ALIST>0.000000000000000e+00</ALIST> <BLIST>0.000000000000000e+00</BLIST> </OPTICAL_DISTORTION> <PERSPECTIVE_CENTER> <GENERATIONTIME>1958-01-01T00:00:00.000000Z</GENERATIONTIME> <CX>0.000000000000000e+00</CX> <CY>0.000000000000000e+00</CY> <CZ>0.000000000000000e+00</CZ> </PERSPECTIVE_CENTER> <CAMERA_ATTITUDE> <GENERATIONTIME>1959-06-08T00:00:00.000000Z</GENERATIONTIME> <QCS1>0.000000000000000e+00</QCS1> <QCS2>0.000000000000000e+00</QCS2> <QCS3>0.000000000000000e+00</QCS3> <QCS4>1.000000000000000e+00</QCS4> </CAMERA_ATTITUDE> <DETECTOR_MOUNTING> <GENERATIONTIME>1959-12-16T00:00:00.000000Z</GENERATIONTIME> <BAND_P> <BANDID>P</BANDID> <DETECTOR_ARRAY> <DETARRID>1</DETARRID> <DETORIGINX>5.372000000000000e-02</DETORIGINX> <DETORIGINY>1.407119300000000e+02</DETORIGINY> <DETROTANGLE>0.000000000000000e+00</DETROTANGLE> <DETPITCH>8.000000000000000e-03</DETPITCH> </DETECTOR_ARRAY> </BAND_P> </DETECTOR_MOUNTING> </GEO> <RPB> <SATID>IMAGINE01</SATID> <BANDID>P</BANDID> <SPECID>RPC00Y</SPECID> <IMAGE> <LINEOFFSET>11856</LINEOFFSET> <SAMPOFFSET>17564</SAMPOFFSET> <LATOFFSET>3.774540000000000e+01</LATOFFSET> <LONGOFFSET>-1.032903000000000e+02</LONGOFFSET> <HEIGHTOFFSET>2287</HEIGHTOFFSET> <LINESCALE>12383</LINESCALE> <SAMPSCALE>17929</SAMPSCALE> <LATSCALE>1.003050000000000e-01</LATSCALE> <LONGSCALE>1.345060000000000e-01</LONGSCALE> <HEIGHTSCALE>638</HEIGHTSCALE> <LINENUMCOEFList> <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> </LINENUMCOEFList> <LINEDENCOEFList> <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> </LINEDENCOEFList> <SAMPNUMCOEFList> <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> </SAMPNUMCOEFList> <SAMPDENCOEFList> <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> </SAMPDENCOEFList> </IMAGE> </RPB> </isd> ================================================ FILE: src/asp/SfS/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspSfS "${ASP_SfS_SRC_FILES}" "${ASP_SfS_TEST_FILES}" "${ASP_SfS_LIB_DEPENDENCIES}") ================================================ FILE: src/asp/SfS/SfsArgs.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/SfS/SfsArgs.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/StereoSettings.h> #include <asp/SfS/SfsUtils.h> #include <asp/Core/FileUtils.h> #include <asp/SfS/SfsModel.h> #include <vw/FileIO/FileUtils.h> #include <boost/program_options.hpp> #include <boost/filesystem.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; namespace asp { void handleSfsArgs(int argc, char *argv[], SfsOptions& opt) { double nan = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options(""); general_options.add_options() ("input-dem,i", po::value(&opt.input_dem), "The input DEM to refine using SfS.") ("image-list", po::value(&opt.image_list)->default_value(""), "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.") ("camera-list", po::value(&opt.camera_list)->default_value(""), "A file containing the list of cameras, when they are too many to specify on the " "command line. If the images have embedded camera information, such as for ISIS, " "this file must be empty but must be specified if --image-list is specified.") ("output-prefix,o", po::value(&opt.out_prefix), "Prefix for output filenames.") ("max-iterations,n", po::value(&opt.max_iterations)->default_value(10), "Set the maximum number of iterations. Normally 5-10 iterations is enough, even " "when convergence is not reached, as the solution usually improves quickly at " "first and only very fine refinements happen later.") ("reflectance-type", po::value(&opt.reflectance_type)->default_value(1), "Reflectance type: 0 = Lambertian, 1 = Lunar-Lambert, 2 = Hapke, 3 = Experimental " "extension of Lunar-Lambert, 4 = Charon model (a variation of Lunar-Lambert).") ("smoothness-weight", po::value(&opt.smoothness_weight)->default_value(0.04), "The weight given to the cost function term which consists of sums of squares of " "second-order derivatives. A larger value will result in a smoother solution with " "fewer artifacts. See also --gradient-weight.") ("initial-dem-constraint-weight", po::value(&opt.initial_dem_constraint_weight)->default_value(0), "A larger value will try harder to keep the SfS-optimized DEM closer to the initial " "guess DEM. A value between 0.0001 and 0.001 may work, unless your initial DEM is " "very unreliable.") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Use the camera adjustments obtained by previously running bundle_adjust with this " "output prefix.") ("input-albedo", po::value(&opt.input_albedo), "The input albedo image, if known. Must have same dimensions as the input DEM. " "Otherwise it is initialized to 1. Can be refined with --float-albedo.") ("float-albedo", po::bool_switch(&opt.float_albedo)->default_value(false)->implicit_value(true), "Float the albedo for each pixel. Will give incorrect results if only one image is " "present. The albedo is normalized, its nominal value is 1.") ("float-exposure", po::bool_switch(&opt.float_exposure)->default_value(false)->implicit_value(true), "Float the exposure for each image. Will give incorrect results if only one image is " "present. It usually gives marginal results.") ("model-shadows", po::bool_switch(&opt.model_shadows)->default_value(false)->implicit_value(true), "Model the fact that some points on the DEM are in the shadow (occluded from the Sun).") ("save-sim-intensity-only", po::bool_switch(&opt.save_sim_intensity_only)->default_value(false)->implicit_value(true), "Save the simulated image intensities at each DEM pixel for the given DEM, images, " "cameras, and reflectance model, without refining the DEM. The output files are " "of the form <output prefix>-*-sim-intensity.tif. The image exposures " "will be computed along the way unless specified via --image-exposures-prefix, and " "will be saved in either case to <output prefix>-exposures.txt. Same for haze, if " "applicable. See also: --save-meas-intensity-only.") ("save-meas-intensity-only", po::bool_switch(&opt.save_meas_intensity_only)->default_value(false)->implicit_value(true), "Save the measured image intensities at each DEM pixel for the given DEM, " "images, and cameras, without refining the DEM. The output files are " "of the form <output prefix>-*-meas-intensity.tif. See also: " "--save-sim-intensity-only.") ("ref-map", po::value(&opt.ref_map)->default_value(""), "Save the simulated or measured intensity images to the extent given by this " "mapprojected image. For use with --save-sim-intensity-only and " "--save-meas-intensity-only.") ("estimate-exposure-haze-albedo", po::bool_switch(&opt.estim_exposure_haze_albedo)->default_value(false)->implicit_value(true), "Estimate the exposure for each image, the haze for each image (if --num-haze-coeffs " "is positive), and the global low-resolution albedo (if --float-albedo is on), then " "quit. This operation samples the input DEM based on --num-samples-for-estim. The " "produced estimated exposure, haze, and initial albedo are described in the doc. This " "is invoked automatically by parallel_sfs before running sfs proper, unless these " "quantities are provided as inputs.") ("compute-exposures-only", po::bool_switch(&opt.compute_exposures_only)->default_value(false)->implicit_value(true), "This older option is equivalent to --estimate-exposure-haze-albedo.") ("estimate-height-errors", po::bool_switch(&opt.estimate_height_errors)->default_value(false)->implicit_value(true), "Estimate the SfS DEM height uncertainty (in meters). This option is obsolete. Use " "--save-variances instead. This older implementation works by finding the height " "perturbation at each grid point which will make at least one of the simulated " "images at that point change by more than twice the discrepancy between the " "unperturbed simulated image and the measured image. The SfS DEM must be provided " "via the -i option. The number of iterations, blending parameters (--blending-dist, " "etc.), and smoothness weight are ignored. Results are not computed at image pixels " "in shadow. This produces <output prefix>-height-error.tif. No SfS DEM is computed. " "See also --height-error-params. This uncertainty may be overly optimistic.") ("height-error-params", po::value(&opt.height_error_params)->default_value(vw::Vector2(5.0, 100.0), "5.0 100"), "Specify the largest height deviation to examine (in meters), and how many samples to use from 0 to that height.") ("sun-positions", po::value(&opt.sun_positions_list)->default_value(""), "A file having on each line an image name and three values in double precision " "specifying the Sun position in meters in ECEF coordinates (origin is planet center). " "Use a space as separator. If not provided, these will be read from the camera files " "for ISIS and CSM models.") ("sun-angles", po::value(&opt.sun_angles_list)->default_value(""), "A file having on each line an image name and two values in double precision " "specifying the Sun azimuth and elevation in degrees, relative to the center point of " "the input DEM. Use a space as separator. This is an alternative to --sun-positions.") ("shadow-thresholds", po::value(&opt.shadow_thresholds)->default_value(""), "Optional shadow thresholds for the input images (a list of real values in quotes, " "one per image). See also --shadow-threshold.") ("shadow-threshold", po::value(&opt.shadow_threshold)->default_value(-1), "A shadow threshold to apply to all images. Must be positive. Areas that " "are in shadow in all images will result in a blurred version of the input DEM, " "influenced by the --smoothness-weight.") ("custom-shadow-threshold-list", po::value(&opt.custom_shadow_threshold_list)->default_value(""), "A list having one image and one shadow threshold per line. For the images specified " "here, override the shadow threshold supplied by other means with this value.") ("low-light-threshold", po::value(&opt.low_light_threshold)->default_value(-1.0), "A threshold for low-light pixels. If positive, pixels with intensity between " "this and the shadow threshold will be given less weight, if other images have higher " "intensity values at the same ground point. This helps fix seams. See also " "--low-light-weight-power and --low-light-blur-sigma.") ("low-light-weight-power", po::value(&opt.low_light_weight_power)->default_value(4.0), "With the option --low-light-threshold, the weight of a low-light pixel is inversely " "proportional with the discrepancy between the simulated and observed pixel value, " "raised to this power.") ("low-light-blur-sigma", po::value(&opt.low_light_blur_sigma)->default_value(3.0), "With the option --low-light-threshold, apply a Gaussian blur with this sigma to the " "low-light weight image, to make it continuous.") ("erode-seams", po::bool_switch(&opt.erode_seams)->default_value(false)->implicit_value(true), "Be more aggressive in removing seam artifacts, even if this results in erosion of valid " "terrain.") ("max-valid-image-vals", po::value(&opt.max_valid_image_vals)->default_value(""), "Optional values for the largest valid image value in each image (a list of real " "values in quotes, one per image).") ("robust-threshold", po::value(&opt.robust_threshold)->default_value(-1.0), "If positive, set the threshold for the robust measured-to-simulated intensity " "difference (using the Cauchy loss). Any difference much larger than this will be " "penalized. A good value may be 5% to 25% of the average image value or the same " "fraction of the computed image exposure values.") ("albedo-constraint-weight", po::value(&opt.albedo_constraint_weight)->default_value(0), "If floating the albedo, a larger value will try harder to keep the optimized albedo " "close to the initial albedo. See also --input-albedo and --albedo-robust-threshold.") ("albedo-robust-threshold", po::value(&opt.albedo_robust_threshold)->default_value(0), "If floating the albedo and this threshold is positive, apply a Cauchy loss with this " "threshold to the product of the albedo difference and the albedo constraint weight.") ("skip-images", po::value(&opt.skip_images_str)->default_value(""), "Skip images with these indices (indices start from 0).") ("save-dem-with-nodata", po::bool_switch(&opt.save_dem_with_nodata)->default_value(false)->implicit_value(true), "Save a copy of the DEM while using a no-data value at a DEM grid point where all " "images show shadows. To be used if shadow thresholds are set.") ("use-approx-camera-models", po::bool_switch(&opt.use_approx_camera_models)->default_value(false)->implicit_value(true), "Use approximate camera models for speed. Only with ISIS .cub cameras.") ("crop-input-images", po::bool_switch(&opt.crop_input_images)->default_value(false)->implicit_value(true), "Crop the images to a region that was computed to be large enough, and keep them " "fully in memory, for speed. This is the default in the latest builds.") ("blending-dist", po::value(&opt.blending_dist)->default_value(0), "Give less weight to image pixels close to no-data or boundary values. Enabled only " "when crop-input-images is true, for performance reasons. Blend over this many pixels.") ("blending-power", po::value(&opt.blending_power)->default_value(2.0), "A higher value will result in smoother blending.") ("min-blend-size", po::value(&opt.min_blend_size)->default_value(0), "Do not apply blending in shadowed areas for which both the width and height are less " "than this.") ("allow-borderline-data", po::bool_switch(&opt.allow_borderline_data)->default_value(false)->implicit_value(true), "At the border of the region where there are no lit pixels in any images, do not let " "the blending weights decay to 0. This noticeably improves the level of detail. The " "sfs_blend tool may need to be used to further tune this region.") ("steepness-factor", po::value(&opt.steepness_factor)->default_value(1.0), "Try to make the terrain steeper by this factor. This is not recommended in regular use.") ("curvature-in-shadow", po::value(&opt.curvature_in_shadow)->default_value(0.0), "Attempt to make the curvature of the DEM (the Laplacian) at points in shadow in all " "images equal to this value, which should make the DEM curve down.") ("curvature-in-shadow-weight", po::value(&opt.curvature_in_shadow_weight)->default_value(0.0), "The weight to give to the curvature in shadow constraint.") ("lit-curvature-dist", po::value(&opt.lit_curvature_dist)->default_value(0.0), "If using a curvature in shadow, start phasing it in this far from the shadow boundary " "in the lit region (in units of pixels).") ("shadow-curvature-dist", po::value(&opt.shadow_curvature_dist)->default_value(0.0), "If using a curvature in shadow, have it fully phased in this far from shadow boundary " "in the shadow region (in units of pixels).") ("image-exposures-prefix", po::value(&opt.image_exposures_prefix)->default_value(""), "Use this prefix to optionally read initial exposures (filename is " "<prefix>-exposures.txt).") ("model-coeffs-prefix", po::value(&opt.model_coeffs_prefix)->default_value(""), "Use this prefix to optionally read model coefficients from a file (filename is <prefix>-model_coeffs.txt).") ("model-coeffs", po::value(&opt.model_coeffs)->default_value(""), "Use the reflectance model coefficients specified as a list of numbers in quotes. " "Lunar-Lambertian: O, A, B, C, e.g., '1 -0.019 0.000242 -0.00000146'. Hapke: omega, b, " "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'.") ("num-haze-coeffs", po::value(&opt.num_haze_coeffs)->default_value(0), "Set this to 1 to model the problem as image = exposure * albedo * reflectance + " "haze, where haze is a single value for each image.") ("float-haze", po::bool_switch(&opt.float_haze)->default_value(false)->implicit_value(true), "If specified, float the haze coefficients as part of the optimization, if " "--num-haze-coeffs is 1.") ("haze-prefix", po::value(&opt.image_haze_prefix)->default_value(""), "Use this prefix to read initial haze values (filename is <haze-prefix>-haze.txt). " "The file format is the same as what the tool writes itself, when triggered by the " "earlier options. If haze is modeled, it will be initially set to 0 unless read from " "such a file, and will be floated or not depending on whether --float-haze is on. " "The final haze values will be saved to <output prefix>-haze.txt.") ("num-samples-for-estim", po::value(&opt.num_samples_for_estim)->default_value(200), "Number of samples to use for estimating the exposure, haze, and albedo. A large " "value will result in a more accurate estimate, but will take a lot more memory.") ("init-dem-height", po::value(&opt.init_dem_height)->default_value(nan), "Use this value for initial DEM heights (measured in meters, relative to the datum). " "An input DEM still needs to be provided for georeference information.") ("crop-win", po::value(&opt.crop_win)->default_value(vw::BBox2i(0, 0, 0, 0), "xoff yoff xsize ysize"), "Crop the input DEM to this region before continuing.") ("nodata-value", po::value(&opt.nodata_val)->default_value(nan), "Use this as the DEM no-data value, over-riding what is in the initial guess DEM.") ("fix-dem", po::bool_switch(&opt.fix_dem)->default_value(false)->implicit_value(true), "Do not float the DEM at all. Useful when floating the model params.") ("read-exposures", po::bool_switch(&opt.read_exposures)->default_value(false)->implicit_value(true), "If specified, read the image exposures with the current output prefix. Useful with a " "repeat invocation.") ("read-haze", po::bool_switch(&opt.read_haze)->default_value(false)->implicit_value(true), "If specified, read the haze values with the current output prefix.") ("read-albedo", po::bool_switch(&opt.read_albedo)->default_value(false)->implicit_value(true), "If specified, read the computed albedo with the current output prefix.") ("float-reflectance-model", po::bool_switch(&opt.float_reflectance_model)->default_value(false)->implicit_value(true), "Allow the coefficients of the reflectance model to float (not recommended).") ("integrability-constraint-weight", po::value(&opt.integrability_weight)->default_value(0.0), "Use the integrability constraint from Horn 1990 with this value of its weight.") ("smoothness-weight-pq", po::value(&opt.smoothness_weight_pq)->default_value(0.00), "Smoothness weight for p and q, when the integrability constraint " "is used. A larger value will result in a smoother solution " "(experimental).") ("query", po::bool_switch(&opt.query)->default_value(false)->implicit_value(true), "Print some info and exit. Invoked from parallel_sfs.") ("session-type,t", po::value(&opt.stereo_session)->default_value(""), "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.") ("gradient-weight", po::value(&opt.gradient_weight)->default_value(0.0), "The weight given to the cost function term which consists of sums of squares of " "first-order derivatives. A larger value will result in shallower slopes but less " "noise. This can be used in conjunction with --smoothness-weight. It is suggested to " "experiment with this with a value of 0.0001 - 0.01, while reducing the smoothness " "weight to a very small value.") ("save-sparingly", po::bool_switch(&opt.save_sparingly)->default_value(false)->implicit_value(true), "Avoid saving any results except the adjustments and the DEM, as that's a lot of files.") ("save-variances", po::bool_switch(&opt.save_variances)->default_value(false)->implicit_value(true), "Save the variance of the DEM for each pixel. If --float-albedo is on, also save the " "variance of the albedo. Note that computing the albedo variance can be ill-posed if " "--float-haze and/or --float-exposure is also on.") ("save-covariances", po::bool_switch(&opt.save_covariances)->default_value(false)->implicit_value(true), "In addition to saving the variance of the DEM (and albedo) at each pixel (as for " "--save-variances), also save the covariance between each DEM pixel and its four " "horizontal and vertical neighbors, and the same for the albedo if --float-albedo " "is on.") ("camera-position-step-size", po::value(&opt.camera_position_step_size)->default_value(1.0), "Larger step size will result in more aggressiveness in varying the camera position " "if it is being floated (which may result in a better solution or in divergence)."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input-images", po::value(&opt.input_images)); po::positional_options_description positional_desc; positional_desc.add("input-images", -1); std::string usage("-i <input DEM> -n <max iterations> -o <output prefix> <images> [other options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Sanity checks. Put this early, before separating images from cameras, as that // function can print a message not reflecting the true issue of missing the DEM. if (opt.input_dem.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing the input DEM.\n"); // Always crop the input images. This has been validated enough that it works well. // There is no reason to fully load images in memory except for computing exposures, // when this option will be disabled automatically. opt.crop_input_images = true; // Separate the cameras from the images std::vector<std::string> inputs = opt.input_images; if (!opt.image_list.empty()) { // Read the images and cameras and put them in 'inputs' to be parsed later if (opt.camera_list.empty()) vw::vw_throw(vw::ArgumentErr() << "The option --image-list must be invoked together with --camera-list.\n"); if (!inputs.empty()) vw::vw_throw(vw::ArgumentErr() << "The option --image-list was specified, but also " << "images or cameras on the command line.\n"); asp::read_list(opt.image_list, inputs); std::vector<std::string> tmp; asp::read_list(opt.camera_list, tmp); for (size_t it = 0; it < tmp.size(); it++) inputs.push_back(tmp[it]); } bool ensure_equal_sizes = true; asp::separate_images_from_cameras(inputs, opt.input_images, opt.input_cameras, // outputs ensure_equal_sizes); if (opt.out_prefix.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing output prefix.\n" << usage << general_options); if (opt.max_iterations < 0) vw::vw_throw(vw::ArgumentErr() << "The number of iterations must be non-negative.\n" << usage << general_options); if (opt.input_images.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing input images.\n" << usage << general_options); if (opt.smoothness_weight < 0) vw::vw_throw(vw::ArgumentErr() << "Expecting a non-negative smoothness weight.\n"); if (opt.gradient_weight < 0) vw::vw_throw(vw::ArgumentErr() << "Expecting a non-negative gradient weight.\n"); if (opt.integrability_weight < 0) vw::vw_throw(vw::ArgumentErr() << "Expecting a non-negative integrability weight.\n"); if (opt.float_haze && opt.num_haze_coeffs == 0) vw::vw_throw(vw::ArgumentErr() << "Haze cannot be floated unless there is at least one haze coefficient.\n"); if (opt.image_haze_prefix != "" && opt.num_haze_coeffs == 0) vw::vw_throw(vw::ArgumentErr() << "Haze cannot be read unless there is at least one haze coefficient.\n"); // There can be 0 or 1 haze coefficients. The modeling of more than one haze // coefficient needs to be looked into. if (opt.num_haze_coeffs < 0 || opt.num_haze_coeffs > g_max_num_haze_coeffs) vw::vw_throw(vw::ArgumentErr() << "Expecting up to " << g_max_num_haze_coeffs << " haze coefficients.\n"); // Curvature in shadow params if (opt.curvature_in_shadow < 0.0 || opt.curvature_in_shadow_weight < 0.0) vw::vw_throw(vw::ArgumentErr() << "Cannot have negative curvature in shadow or its weight.\n"); if (opt.lit_curvature_dist < 0.0 || opt.shadow_curvature_dist < 0.0) vw::vw_throw(vw::ArgumentErr() << "Cannot have negative curvature distances.\n"); if (opt.curvature_in_shadow > 0.0 && opt.shadow_curvature_dist + opt.lit_curvature_dist <= 0.0) vw::vw_throw(vw::ArgumentErr() << "When modeling curvature in shadow, expecting a " << "positive value of shadow-curvature-dist or list-curvature-dist.\n"); if (opt.steepness_factor <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The steepness factor must be positive.\n"); // The options --compute-exposures-only and --estimate-exposure-haze-albedo // are equivalent. if (opt.compute_exposures_only) opt.estim_exposure_haze_albedo = true; if (opt.estim_exposure_haze_albedo) opt.compute_exposures_only = true; if (opt.compute_exposures_only || opt.estim_exposure_haze_albedo) { if (opt.use_approx_camera_models || opt.crop_input_images) { vw::vw_out(vw::WarningMessage) << "When computing exposures only, not using approximate camera models or " << "cropping input images.\n"; // Turn off various settings that are needed only when doing iterations opt.use_approx_camera_models = false; opt.crop_input_images = false; opt.blending_dist = 0; opt.allow_borderline_data = false; opt.low_light_threshold = -1.0; opt.erode_seams = false; } if (!opt.crop_win.empty()) { vw::vw_throw(vw::ArgumentErr() << "When computing exposures only, cannot crop the " << "input DEM as that will give wrong results. Use the full DEM.\n"); } } if (opt.blending_dist > 0 && !opt.crop_input_images) vw::vw_throw(vw::ArgumentErr() << "A blending distance is only supported with --crop-input-images.\n"); if (opt.allow_borderline_data && !opt.crop_input_images) vw::vw_throw(vw::ArgumentErr() << "Option --allow-borderline-data needs option " << "--crop-input-images.\n"); if (opt.allow_borderline_data && opt.blending_dist <= 0) vw::vw_throw(vw::ArgumentErr() << "Option --allow-borderline-data needs a positive --blending-dist.\n"); // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); // Parse the shadow thresholds std::istringstream ist(opt.shadow_thresholds); opt.shadow_threshold_vec.clear(); float val; while (ist >> val) opt.shadow_threshold_vec.push_back(val); if (!opt.shadow_threshold_vec.empty() && opt.shadow_threshold_vec.size() != opt.input_images.size()) vw::vw_throw(vw::ArgumentErr() << "If specified, there must be as many shadow thresholds as images.\n"); // See if to use opt.shadow_threshold. if (opt.shadow_threshold > 0) { if (!opt.shadow_threshold_vec.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --shadow-threshold and --shadow-thresholds.\n"); while (opt.shadow_threshold_vec.size() < opt.input_images.size()) opt.shadow_threshold_vec.push_back(opt.shadow_threshold); } // Default thresholds are the smallest float. // Maybe it should be 0? if (opt.shadow_threshold_vec.empty()) { for (size_t i = 0; i < opt.input_images.size(); i++) { opt.shadow_threshold_vec.push_back(-std::numeric_limits<float>::max()); } } // Override some shadow thresholds with custom versions if (!opt.custom_shadow_threshold_list.empty()) { std::map<std::string, double> custom_thresh; std::ifstream ifs(opt.custom_shadow_threshold_list); std::string image; double val; while (ifs >> image >> val) custom_thresh[image] = val; if (custom_thresh.empty()) vw::vw_throw(vw::ArgumentErr() << "Could not read any data from: " << opt.custom_shadow_threshold_list << "\n"); for (size_t it = 0; it < opt.input_images.size(); it++) { auto key = custom_thresh.find(opt.input_images[it]); if (key != custom_thresh.end()) { vw::vw_out() << "Over-riding the shadow threshold for " << opt.input_images[it] << " with: " << key->second << std::endl; opt.shadow_threshold_vec[it] = key->second; } } } // If the low-light-threshold is specified, ensure it is above all shadow thresholds, // and that the shadow thresholds are positive. if (opt.low_light_threshold > 0) { for (size_t i = 0; i < opt.input_images.size(); i++) { if (opt.shadow_threshold_vec[i] < 0) vw::vw_throw(vw::ArgumentErr() << "When --low-light-threshold is set, all shadow thresholds " << "must be set and non-negative.\n"); if (opt.low_light_threshold <= opt.shadow_threshold_vec[i]) vw::vw_throw(vw::ArgumentErr() << "The low-light-threshold must be larger than all " << "shadow thresholds.\n"); } if (!opt.allow_borderline_data) vw::vw_throw(vw::ArgumentErr() << "When using --low-light-threshold, must set --allow-borderline-data.\n"); } if (opt.low_light_weight_power <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Expecting a positive --low-light-weight-power.\n"); if (opt.low_light_blur_sigma <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Expecting a positive --low-light-blur-sigma.\n"); if (opt.erode_seams && opt.low_light_threshold <= 0.0) vw::vw_throw(vw::ArgumentErr() << "When using --erode-seams, must set a positive --low-light-threshold.\n"); // Parse max valid image vals std::istringstream ism(opt.max_valid_image_vals); opt.max_valid_image_vals_vec.clear(); while (ism >> val) opt.max_valid_image_vals_vec.push_back(val); if (!opt.max_valid_image_vals_vec.empty() && opt.max_valid_image_vals_vec.size() != opt.input_images.size()) vw::vw_throw(vw::ArgumentErr() << "If specified, there must be as many max valid image vals as images.\n"); if (opt.max_valid_image_vals_vec.empty()) { for (size_t i = 0; i < opt.input_images.size(); i++) { opt.max_valid_image_vals_vec.push_back(std::numeric_limits<float>::max()); } } // --read-exposures defines where exposures are read from. Put this as a warning, // otherwise parallel_sfs won't run. if (opt.image_exposures_prefix != "" && opt.read_exposures && opt.image_exposures_prefix != opt.out_prefix) vw::vw_out(vw::WarningMessage) << "Reading exposures with prefix: " << opt.out_prefix << " rather than: " << opt.image_exposures_prefix << ".\n"; if (opt.read_exposures) opt.image_exposures_prefix = opt.out_prefix; // Same for haze. This one parallel_sfs does not precompute. This may change. if (opt.image_haze_prefix != "" && opt.read_haze) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --haze-prefix and --read-haze.\n"); // If have opt.read_haze, use the current prefix if (opt.read_haze) opt.image_haze_prefix = opt.out_prefix; // Same for albedo if (opt.input_albedo != "" && opt.read_albedo) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --input-albedo and --read-albedo.\n"); // If have opt.read_albedo, use the current prefix albedo if (opt.read_albedo) opt.input_albedo = opt.out_prefix + "-albedo-final.tif"; // Initial image exposures, if provided. First read them in a map, // as perhaps the initial exposures were created using more images // than what we have here. // TODO(oalexan1): This must be a function. std::string exposure_file = asp::exposureFileName(opt.image_exposures_prefix); opt.image_exposures_vec.clear(); std::map<std::string, double> img2exp; std::string name; double dval; std::ifstream ise(exposure_file.c_str()); int exp_count = 0; while (ise >> name >> dval) { img2exp[name] = dval; exp_count++; } ise.close(); if (exp_count > 0) { vw::vw_out() << "Reading exposures from: " << exposure_file << std::endl; for (size_t i = 0; i < opt.input_images.size(); i++) { std::string img = opt.input_images[i]; std::map<std::string, double>::iterator it = img2exp.find(img); if (it == img2exp.end()) { vw::vw_throw(vw::ArgumentErr() << "Could not find the exposure for image: " << img << ".\n"); } double exp_val = it->second; // vw::vw_out() << "Exposure for " << img << ": " << exp_val << std::endl; opt.image_exposures_vec.push_back(exp_val); } } if (opt.image_exposures_prefix != "" && exp_count == 0) vw::vw_throw(vw::ArgumentErr() << "Could not find the exposures file: " << exposure_file << ".\n"); if (opt.steepness_factor != 1.0) vw::vw_out() << "Making the terrain artificially steeper by factor: " << opt.steepness_factor << ".\n"; // Initial image haze, if provided. First read them in a map, // as perhaps the initial haze were created using more images // than what we have here. // TODO(oalexan1): This must be a function. if (opt.num_haze_coeffs > 0) { std::string haze_file = asp::hazeFileName(opt.image_haze_prefix); opt.image_haze_vec.clear(); std::map<std::string, std::vector<double>> img2haze; std::ifstream ish(haze_file.c_str()); int haze_count = 0; while (1) { std::string line; std::getline(ish, line); std::istringstream hstream(line); if (! (hstream >> name)) break; std::vector<double> haze_vec; while (hstream >> dval) haze_vec.push_back(dval); if (haze_vec.empty()) break; haze_count++; // Pad the haze vec while (haze_vec.size() < g_max_num_haze_coeffs) haze_vec.push_back(0); img2haze[name] = haze_vec; // All haze coefficients beyond the first num_haze_coeffs must // be zero, as that means we are reading results written with // different number of haze coeffs. for (size_t hiter = opt.num_haze_coeffs; hiter < g_max_num_haze_coeffs; hiter++) { if (haze_vec[hiter] != 0) vw::vw_throw(vw::ArgumentErr() << "Found unexpected non-zero haze coefficient: " << haze_vec[hiter] << ".\n"); } } ish.close(); if (opt.image_haze_prefix != "" && haze_count == 0) vw::vw_throw(vw::ArgumentErr() << "Could not find the haze file: " << haze_file << ".\n"); if (haze_count > 0) { vw::vw_out() << "Reading haze file: " << haze_file << std::endl; for (size_t i = 0; i < opt.input_images.size(); i++) { std::string img = opt.input_images[i]; std::map< std::string, std::vector<double>>::iterator it = img2haze.find(img); if (it == img2haze.end()) { vw::vw_throw(vw::ArgumentErr() << "Could not find the haze for image: " << img << ".\n"); } std::vector<double> haze_vec = it->second; // vw::vw_out() << "Haze for " << img << ":"; //for (size_t hiter = 0; hiter < haze_vec.size(); hiter++) // vw::vw_out() << " " << haze_vec[hiter]; //vw::vw_out() << "\n"; opt.image_haze_vec.push_back(haze_vec); } } } // Initial model coeffs, if passed on the command line if (opt.model_coeffs != "") { vw::vw_out() << "Parsing model coefficients: " << opt.model_coeffs << std::endl; std::istringstream is(opt.model_coeffs); double val; while (is >> val) opt.model_coeffs_vec.push_back(val); } // Initial model coefficients, if provided in the file if (opt.model_coeffs_prefix != "") { std::string model_coeffs_file = asp::modelCoeffsFileName(opt.model_coeffs_prefix); vw::vw_out() << "Reading model coefficients from file: " << model_coeffs_file << std::endl; std::ifstream ism(model_coeffs_file.c_str()); opt.model_coeffs_vec.clear(); while (ism >> dval) opt.model_coeffs_vec.push_back(dval); ism.close(); if (opt.model_coeffs_vec.empty()) { vw::vw_throw(vw::ArgumentErr() << "Could not read model coefficients from: " << model_coeffs_file << ".\n"); } } if (!opt.model_coeffs_vec.empty()) { // Pad with zeros if needed, as the Lunar Lambertian has 4 params, while Hapke has 5 of them. // the Charon one has 2. while (opt.model_coeffs_vec.size() < g_num_model_coeffs) opt.model_coeffs_vec.push_back(0); if (opt.model_coeffs_vec.size() != g_num_model_coeffs) vw::vw_throw(vw::ArgumentErr() << "If specified, there must be " << g_num_model_coeffs << " coefficients.\n"); } // Sanity check if (opt.camera_position_step_size <= 0) { vw::vw_throw(vw::ArgumentErr() << "Expecting a positive value for camera-position-step-size.\n"); } // Need this to be able to load adjusted camera models. That will happen // in the stereo session. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; if (opt.input_images.size() <= 1 && opt.float_albedo && opt.initial_dem_constraint_weight <= 0 && opt.albedo_constraint_weight <= 0.0) vw::vw_throw(vw::ArgumentErr() << "Floating the albedo is ill-posed for just one image without " << "the initial DEM constraint or the albedo constraint.\n"); if (opt.input_images.size() <= 1 && opt.float_exposure && opt.initial_dem_constraint_weight <= 0) vw::vw_throw(vw::ArgumentErr() << "Floating the exposure is ill-posed for just one image.\n"); // Start with given images to skip. Later, for each dem clip, we may // skip more, if those images do not overlap with the clip. opt.skip_images.clear(); if (opt.skip_images_str != "") { std::istringstream is(opt.skip_images_str); int val; while (is >> val) opt.skip_images.insert(val); } // estimate height errors and integrability constraint are mutually exclusive if (opt.estimate_height_errors && opt.integrability_weight > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot estimate height errors when using the integrability constraint.\n"); if (opt.estimate_height_errors && opt.model_shadows) vw::vw_throw(vw::ArgumentErr() << "Cannot estimate height error when modeling shadows."); if (opt.estimate_height_errors && opt.save_variances) vw::vw_throw(vw::ArgumentErr() << "Cannot estimate height errors with --save-variances."); if (opt.estimate_height_errors && opt.save_covariances) vw::vw_throw(vw::ArgumentErr() << "Cannot estimate height errors with --save-covariances."); if (opt.save_sim_intensity_only || opt.save_meas_intensity_only || opt.estimate_height_errors) { // No iterations opt.max_iterations = 0; // Need the exact cameras as they span the full DEM if (opt.use_approx_camera_models || opt.crop_input_images) { opt.use_approx_camera_models = false; opt.crop_input_images = false; } if (opt.num_haze_coeffs > 0 && opt.image_haze_vec.empty()) vw::vw_throw(vw::ArgumentErr() << "Expecting the haze to be computed and passed in.\n"); } // Cannot have both sun positions and sun angles if (opt.sun_positions_list.size() > 0 && opt.sun_angles_list.size() > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both sun positions and sun angles.\n"); if (!opt.ref_map.empty()) { // --ref-map is to be used only with --save-sim-intensity-only or // --save-meas-intensity-only if (!opt.save_sim_intensity_only && !opt.save_meas_intensity_only) vw::vw_throw(vw::ArgumentErr() << "--ref-map is to be used only with --save-sim-intensity-only or " << "--save-meas-intensity-only.\n"); // This is also incompatible with non-empty crop win if (!opt.crop_win.empty()) vw::vw_throw(vw::ArgumentErr() << "--ref-map is incompatible with --crop-win.\n"); } // If --save-covariances is on, also turn on --save-variances if (opt.save_covariances) opt.save_variances = true; // If --save-variances is on and --float-albedo is on, warn if either --float-haze // or --float-exposures is also on, as this may make the albedo variance ill-posed. if (opt.save_variances && opt.float_albedo) { if (opt.float_haze || opt.float_exposure) vw::vw_out(vw::WarningMessage) << "Computing the albedo variance may be ill-posed when " << "floating haze or exposures.\n"; } } // end function handleSfsArgs } // end namespace asp ================================================ FILE: src/asp/SfS/SfsArgs.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __ASP_SFS_SFS_ARGS_H__ #define __ASP_SFS_SFS_ARGS_H__ #include <asp/SfS/SfsOptions.h> namespace asp { // Function to handle command line arguments void handleSfsArgs(int argc, char *argv[], SfsOptions& opt); } // end namespace asp #endif // __ASP_SFS_SFS_ARGS_H__ ================================================ FILE: src/asp/SfS/SfsCamera.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsCamera.cc // A camera approximation used by SfS around a small DEM region. It works // by tabulation. #include <asp/SfS/SfsCamera.h> #include <vw/Image/Interpolation.h> namespace asp { using namespace vw; ApproxCameraModel::ApproxCameraModel(vw::CamPtr const& exact_camera, BBox2i img_bbox, ImageView<double> const& dem, vw::cartography::GeoReference const& geo, double nodata_val, vw::Mutex & camera_mutex): m_geo(geo), m_camera_mutex(camera_mutex), m_exact_camera(exact_camera), m_img_bbox(img_bbox), m_model_is_valid(true) { int big = 1e+8; m_uncompValue = Vector2(-big, -big); // Compute the mean DEM height. We expect all DEM entries to be valid. m_mean_ht = 0; double num = 0.0; for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (dem(col, row) == nodata_val) vw_throw(ArgumentErr() << "ApproxCameraModel: Expecting a DEM without nodata values.\n"); m_mean_ht += dem(col, row); num += 1.0; } } if (num > 0) m_mean_ht /= num; // The area we're supposed to work around m_point_box = m_geo.pixel_to_point_bbox(bounding_box(dem)); double wx = m_point_box.width(), wy = m_point_box.height(); m_approx_table_gridx = wx/std::max(dem.cols(), 1); m_approx_table_gridy = wy/std::max(dem.rows(), 1); if (m_approx_table_gridx == 0 || m_approx_table_gridy == 0) { vw_throw(ArgumentErr() << "ApproxCameraModel: Expecting a positive grid size.\n"); } // Expand the box, as later the DEM will change. double extra = 0.5; m_point_box.min().x() -= extra*wx; m_point_box.max().x() += extra*wx; m_point_box.min().y() -= extra*wy; m_point_box.max().y() += extra*wy; wx = m_point_box.width(); wy = m_point_box.height(); vw_out() << "Approximation proj box: " << m_point_box << std::endl; // We will tabulate the point_to_pixel function at a multiple of // the grid, and we'll use interpolation for anything in // between. //m_approx_table_gridx /= 2.0; m_approx_table_gridy /= 2.0; // fine m_approx_table_gridx *= 2.0; m_approx_table_gridy *= 2.0; // Coarse. Good enough. int numx = wx/m_approx_table_gridx; int numy = wy/m_approx_table_gridy; vw_out() << "Lookup table dimensions: " << numx << ' ' << numy << std::endl; m_begX = 0; m_endX = numx-1; m_begY = 0; m_endY = numy-1; // Mark all values as uncomputed and invalid m_pixel_to_vec_mat.set_size(numx, numy); m_point_to_pix_mat.set_size(numx, numy); for (int x = 0; x < numx; x++) { for (int y = 0; y < numy; y++) { m_point_to_pix_mat(x, y) = m_uncompValue; m_point_to_pix_mat(x, y).invalidate(); } } // Fill in the table. Find along the way the mean direction from // the camera to the ground. Invalid values will be masked. m_count = 0; m_mean_dir = Vector3(); comp_entries_in_table(); m_mean_dir /= std::max(1, m_count); m_mean_dir = m_mean_dir/norm_2(m_mean_dir); m_crop_box.crop(m_img_bbox); return; } // End constructor void ApproxCameraModel::comp_entries_in_table() const { for (int x = m_begX; x <= m_endX; x++) { for (int y = m_begY; y <= m_endY; y++) { // This will be useful when we invoke this function repeatedly if (m_point_to_pix_mat(x, y).child() != m_uncompValue) { continue; } Vector2 pt(m_point_box.min().x() + x*m_approx_table_gridx, m_point_box.min().y() + y*m_approx_table_gridy); Vector2 lonlat = m_geo.point_to_lonlat(pt); Vector3 xyz = m_geo.datum().geodetic_to_cartesian (Vector3(lonlat[0], lonlat[1], m_mean_ht)); bool success = true; Vector2 pix; Vector3 vec; try { pix = m_exact_camera->point_to_pixel(xyz); //if (true || m_img_bbox.contains(pix)) // Need to think more here vec = m_exact_camera->pixel_to_vector(pix); //else // success = false; } catch(...) { success = false; } if (success) { m_pixel_to_vec_mat(x, y) = vec; m_point_to_pix_mat(x, y) = pix; m_pixel_to_vec_mat(x, y).validate(); m_point_to_pix_mat(x, y).validate(); m_mean_dir += vec; // only when the point projects inside the camera? if (m_img_bbox.contains(pix)) m_crop_box.grow(pix); m_count++; } else { m_pixel_to_vec_mat(x, y).invalidate(); m_point_to_pix_mat(x, y).invalidate(); } } } return; } // We have tabulated point_to_pixel at the mean dem height. // Look-up point_to_pixel for the current point by first // intersecting the ray from the current point to the camera // with the datum at that height. We don't know that ray, // so we iterate to find it. vw::Vector2 ApproxCameraModel::point_to_pixel(Vector3 const& xyz) const { // TODO: What happens if we use bicubic interpolation? InterpolationView<EdgeExtensionView<ImageView<PixelMask<Vector3>>, ConstantEdgeExtension>, BilinearInterpolation> pixel_to_vec_interp = interpolate(m_pixel_to_vec_mat, BilinearInterpolation(), ConstantEdgeExtension()); InterpolationView<EdgeExtensionView<ImageView<PixelMask<Vector2>>, ConstantEdgeExtension>, BilinearInterpolation> point_to_pix_interp = interpolate(m_point_to_pix_mat, BilinearInterpolation(), ConstantEdgeExtension()); Vector3 dir = m_mean_dir; Vector2 pix; double major_radius = m_geo.datum().semi_major_axis() + m_mean_ht; double minor_radius = m_geo.datum().semi_minor_axis() + m_mean_ht; for (size_t i = 0; i < 10; i++) { Vector3 S = xyz - 1.1*major_radius*dir; // push the point outside the sphere if (norm_2(S) <= major_radius) // point is inside the sphere return m_exact_camera->point_to_pixel(xyz); Vector3 datum_pt = vw::cartography::datum_intersection(major_radius, minor_radius, S, dir); Vector3 llh = m_geo.datum().cartesian_to_geodetic(datum_pt); Vector2 pt = m_geo.lonlat_to_point(subvector(llh, 0, 2)); // Indices double x = (pt.x() - m_point_box.min().x())/m_approx_table_gridx; double y = (pt.y() - m_point_box.min().y())/m_approx_table_gridy; bool out_of_range = (x < m_begX || x >= m_endX-1 || y < m_begY || y >= m_endY-1); // If out of range, return the exact result. This should be very slow. // The hope is that it will be very rare. if (out_of_range) return m_exact_camera->point_to_pixel(xyz); PixelMask<Vector3> masked_dir = pixel_to_vec_interp(x, y); PixelMask<Vector2> masked_pix = point_to_pix_interp(x, y); if (is_valid(masked_dir) && is_valid(masked_pix)) { dir = masked_dir.child(); pix = masked_pix.child(); } else { return m_exact_camera->point_to_pixel(xyz); } } return pix; } std::string ApproxCameraModel::type() const{ return "ApproxSfSCamera"; } // This is used rarely. Return the exact camera vector. Vector3 ApproxCameraModel::pixel_to_vector(Vector2 const& pix) const { vw::Mutex::Lock lock(m_camera_mutex); return m_exact_camera->pixel_to_vector(pix); } // Return the exact camera center Vector3 ApproxCameraModel::camera_center(Vector2 const& pix) const { vw::Mutex::Lock lock(m_camera_mutex); return m_exact_camera->camera_center(pix); } // Return the exact camera pose Quat ApproxCameraModel::camera_pose(Vector2 const& pix) const { vw::Mutex::Lock lock(m_camera_mutex); return m_exact_camera->camera_pose(pix); } // The range of pixels in the image we are actually expected to use. // Note that the function returns an alias, so that we can modify the // crop box from outside. BBox2 & ApproxCameraModel::crop_box() { m_crop_box.crop(m_img_bbox); return m_crop_box; } bool ApproxCameraModel::model_is_valid() { return m_model_is_valid; } vw::CamPtr ApproxCameraModel::exact_camera() const { return m_exact_camera; } } // end namespace asp ================================================ FILE: src/asp/SfS/SfsCamera.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsCamera.h // A camera approximation used by SfS around a small DEM region #ifndef __ASP_SFS_SFS_CAMERA_H__ #define __ASP_SFS_SFS_CAMERA_H__ #include <vw/Image/ImageView.h> #include <vw/Image/PixelMask.h> #include <vw/Camera/CameraModel.h> #include <vw/Core/Thread.h> #include <vw/Cartography/GeoReference.h> namespace asp { class ApproxCameraModel: public vw::camera::CameraModel { private: mutable vw::Vector3 m_mean_dir; // mean vector from camera to ground vw::cartography::GeoReference m_geo; double m_mean_ht; mutable vw::ImageView<vw::PixelMask<vw::Vector3>> m_pixel_to_vec_mat; mutable vw::ImageView<vw::PixelMask<vw::Vector2>> m_point_to_pix_mat; double m_approx_table_gridx, m_approx_table_gridy; vw::Mutex& m_camera_mutex; vw::Vector2 m_uncompValue; mutable int m_begX, m_endX, m_begY, m_endY; mutable int m_count; vw::BBox2i m_img_bbox; mutable vw::BBox2 m_point_box, m_crop_box; bool m_model_is_valid; vw::CamPtr m_exact_camera; void comp_entries_in_table() const; public: ApproxCameraModel(vw::CamPtr const& exact_camera, vw::BBox2i img_bbox, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, double nodata_val, vw::Mutex& camera_mutex); virtual ~ApproxCameraModel() {} virtual vw::Vector2 point_to_pixel(vw::Vector3 const& xyz) const override; virtual vw::Vector3 pixel_to_vector(vw::Vector2 const& pix) const override; virtual vw::Vector3 camera_center(vw::Vector2 const& pix) const override; virtual vw::Quat camera_pose(vw::Vector2 const& pix) const override; virtual std::string type() const override; vw::BBox2& crop_box(); bool model_is_valid(); vw::CamPtr exact_camera() const; }; } // end namespace asp #endif // __ASP_SFS_SFS_CAMERA_H__ ================================================ FILE: src/asp/SfS/SfsCostFun.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsCostFun.cc // Cost function logic for SfS #include <asp/SfS/SfsCostFun.h> #include <asp/SfS/SfsUtils.h> #include <asp/Core/BaseCameraUtils.h> #include <asp/SfS/SfsOptions.h> #include <asp/SfS/SfsImageProc.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisCameraModel.h> #endif // ASP_HAVE_PKG_ISIS #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Image/ImageChannels.h> #include <vw/Core/ProgressCallback.h> #include <vw/Core/Thread.h> #include <boost/filesystem/path.hpp> #include <set> namespace fs = boost::filesystem; namespace asp { // A callback to invoke at every iteration of ceres // Constructor to initialize references to the necessary data SfsCallback:: SfsCallback(asp::SfsOptions const& opt, vw::ImageView<double>& dem, vw::ImageView<vw::Vector2>& pq, vw::ImageView<double>& albedo, vw::cartography::GeoReference const& geo, asp::ReflParams const& refl_params, std::vector<vw::Vector3> const& sunPosition, std::vector<vw::BBox2i> const& crop_boxes, std::vector<asp::MaskedImgRefT> const& masked_images, std::vector<asp::DblImgT> const& blend_weights, bool blend_weight_is_ground_weight, std::vector<vw::CamPtr>& cameras, double& dem_nodata_val, float& img_nodata_val, std::vector<double>& exposures, std::vector<std::vector<double>>& haze, double& max_dem_height, double& gridx, double& gridy, std::vector<double> & refl_coeffs): opt(opt), dem(dem), pq(pq), albedo(albedo), geo(geo), refl_params(refl_params), sunPosition(sunPosition), crop_boxes(crop_boxes), masked_images(masked_images), blend_weights(blend_weights), blend_weight_is_ground_weight(blend_weight_is_ground_weight), cameras(cameras), dem_nodata_val(dem_nodata_val), img_nodata_val(img_nodata_val), exposures(exposures), haze(haze), max_dem_height(max_dem_height), gridx(gridx), gridy(gridy), refl_coeffs(refl_coeffs), iter(-1), final_iter(false) {} ceres::CallbackReturnType SfsCallback::operator()(const ceres::IterationSummary& summary) { iter++; vw::vw_out() << "Finished iteration: " << iter << "\n"; if (!opt.save_sim_intensity_only && !opt.save_meas_intensity_only) asp::saveExposures(opt.out_prefix, opt.input_images, exposures); if (opt.num_haze_coeffs > 0 && !opt.save_sim_intensity_only && !opt.save_meas_intensity_only) asp::saveHaze(opt.out_prefix, opt.input_images, haze); std::string model_coeffs_file = asp::modelCoeffsFileName(opt.out_prefix); if (!opt.save_sim_intensity_only && !opt.save_meas_intensity_only) { // Not needed, usually // vw::vw_out() << "Writing: " << model_coeffs_file << "\n"; // std::ofstream mcf(model_coeffs_file.c_str()); // mcf.precision(17); // for (size_t coeff_iter = 0; coeff_iter < refl_coeffs.size(); coeff_iter++) // mcf << refl_coeffs[coeff_iter] << " "; // mcf << "\n"; // mcf.close(); } std::ostringstream os; if (!final_iter) os << "-iter" << iter; else os << "-final"; std::string iter_str = os.str(); // The DEM with no-data where there are no valid image pixels vw::ImageView<double> dem_nodata; if (opt.save_dem_with_nodata) { dem_nodata = vw::ImageView<double>(dem.cols(), dem.rows()); vw::fill(dem_nodata, dem_nodata_val); } bool has_georef = true, has_nodata = true; vw::TerminalProgressCallback tpc("asp", ": "); if ((!opt.save_sparingly || final_iter) && !opt.save_sim_intensity_only && !opt.save_meas_intensity_only) { std::string out_dem_file = opt.out_prefix + "-DEM" + iter_str + ".tif"; vw::vw_out() << "Writing: " << out_dem_file << "\n"; vw::cartography::block_write_gdal_image(out_dem_file, vw::pixel_cast<float>(dem), has_georef, geo, has_nodata, dem_nodata_val, opt, tpc); } if ((!opt.save_sparingly || (final_iter && opt.float_albedo)) && !opt.save_sim_intensity_only && !opt.save_meas_intensity_only) { std::string out_albedo_file; // For the final albedo do not use comp-albedo, as there is only one. // Only for intermediate iterations we contrast the computed albedo vs // the measured one. if (!final_iter) out_albedo_file = opt.out_prefix + "-comp-albedo" + iter_str + ".tif"; else out_albedo_file = opt.out_prefix + "-albedo" + iter_str + ".tif"; vw::vw_out() << "Writing: " << out_albedo_file << "\n"; vw::cartography::block_write_gdal_image(out_albedo_file, vw::pixel_cast<float>(albedo), has_georef, geo, has_nodata, dem_nodata_val, opt, tpc); } // Print reflectance and other things for (size_t image_iter = 0; image_iter < masked_images.size(); image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; MaskedDblImgT reflectance, intensity, sim_intensity; vw::ImageView<double> ground_weight; std::string out_camera_file = asp::bundle_adjust_file_name(opt.out_prefix, opt.input_images[image_iter], opt.input_cameras[image_iter]); if (opt.save_sparingly && !opt.save_dem_with_nodata) continue; // don't write too many things // Manufacture an output prefix for the other data associated with this camera std::string iter_str2 = fs::path(out_camera_file).replace_extension("").string(); iter_str2 += iter_str; // Compute reflectance and intensity with optimized DEM int sample_col_rate = 1, sample_row_rate = 1; bool show_progress = false; computeReflectanceAndIntensity(dem, pq, geo, opt.model_shadows, show_progress, max_dem_height, gridx, gridy, sample_col_rate, sample_row_rate, sunPosition[image_iter], refl_params, crop_boxes[image_iter], masked_images[image_iter], blend_weights[image_iter], blend_weight_is_ground_weight, cameras[image_iter], reflectance, intensity, ground_weight, &refl_coeffs[0], opt); // dem_nodata equals to dem if the image has valid pixels and no shadows if (opt.save_dem_with_nodata) { for (int col = 0; col < reflectance.cols(); col++) { for (int row = 0; row < reflectance.rows(); row++) { if (vw::is_valid(reflectance(col, row))) dem_nodata(col, row) = dem(col, row); } } } if (opt.save_sparingly) continue; // Find the simulated intensity sim_intensity.set_size(reflectance.cols(), reflectance.rows()); for (int col = 0; col < sim_intensity.cols(); col++) { for (int row = 0; row < sim_intensity.rows(); row++) { sim_intensity(col, row) = calcSimIntensity(albedo(col, row), reflectance(col, row), exposures[image_iter], opt.steepness_factor, &haze[image_iter][0], opt.num_haze_coeffs); } } std::string out_meas_intensity_file = iter_str2 + "-meas-intensity.tif"; vw::vw_out() << "Writing: " << out_meas_intensity_file << "\n"; vw::cartography::block_write_gdal_image(out_meas_intensity_file, vw::apply_mask(intensity, img_nodata_val), has_georef, geo, has_nodata, img_nodata_val, opt, tpc); std::string out_sim_intensity_file = iter_str2 + "-sim-intensity.tif"; vw::vw_out() << "Writing: " << out_sim_intensity_file << "\n"; vw::cartography::block_write_gdal_image(out_sim_intensity_file, vw::apply_mask(sim_intensity, img_nodata_val), has_georef, geo, has_nodata, img_nodata_val, opt, tpc); if (opt.save_sim_intensity_only || opt.save_meas_intensity_only) continue; // don't write too many things // Not needed usually // std::string out_weight_file = iter_str2 + "-blending-weight.tif"; // vw::vw_out() << "Writing: " << out_weight_file << "\n"; // vw::cartography::block_write_gdal_image(out_weight_file, ground_weight, // has_georef, geo, has_nodata, img_nodata_val, // opt, tpc); std::string out_reflectance_file = iter_str2 + "-reflectance.tif"; vw::vw_out() << "Writing: " << out_reflectance_file << "\n"; vw::cartography::block_write_gdal_image(out_reflectance_file, vw::apply_mask(reflectance, img_nodata_val), has_georef, geo, has_nodata, img_nodata_val, opt, tpc); // Find the measured normalized albedo, after correcting for // reflectance. Do not save this for the final iteration. This is a debug product // that is enabled only if not saving sparingly. if (!final_iter) { vw::ImageView<double> measured_albedo; measured_albedo.set_size(reflectance.cols(), reflectance.rows()); for (int col = 0; col < measured_albedo.cols(); col++) { for (int row = 0; row < measured_albedo.rows(); row++) { if (!vw::is_valid(reflectance(col, row))) measured_albedo(col, row) = 1; else measured_albedo(col, row) = calcAlbedo(intensity(col, row), reflectance(col, row), exposures[image_iter], opt.steepness_factor, &haze[image_iter][0], opt.num_haze_coeffs); } } std::string out_albedo_file = iter_str2 + "-meas-albedo.tif"; vw::vw_out() << "Writing: " << out_albedo_file << "\n"; vw::cartography::block_write_gdal_image(out_albedo_file, measured_albedo, has_georef, geo, has_nodata, 0, opt, tpc); } vw::vw_out() << "Exposure for image " << image_iter << ": " << exposures[image_iter] << "\n"; if (opt.num_haze_coeffs > 0) { vw::vw_out() << "Haze for image " << image_iter << ":"; for (size_t hiter = 0; hiter < haze[image_iter].size(); hiter++) { vw::vw_out() << " " << haze[image_iter][hiter]; } vw::vw_out() << "\n"; } } // end loop through images if (opt.save_dem_with_nodata && (!opt.save_sparingly || final_iter)) { std::string out_dem_nodata_file = opt.out_prefix + "-DEM-nodata" + iter_str + ".tif"; vw::vw_out() << "Writing: " << out_dem_nodata_file << "\n"; vw::TerminalProgressCallback tpc("asp", ": "); vw::cartography::block_write_gdal_image(out_dem_nodata_file, vw::pixel_cast<float>(dem_nodata), has_georef, geo, has_nodata, dem_nodata_val, opt, tpc); } return ceres::SOLVER_CONTINUE; } // end callback function void SfsCallback::set_final_iter(bool is_final_iter) { final_iter = is_final_iter; } // See SmoothnessError() for the definitions of bottom, top, etc. template <typename F, typename G> inline bool calc_intensity_residual(SfsOptions const& opt, const F* const exposure, const F* const haze, const G* const left, const G* const center, const G* const right, const G* const bottom, const G* const top, bool use_pq, const G* const pq, // dem partial derivatives const G* const albedo, const G* const refl_coeffs, int col, int row, vw::ImageView<double> const & dem, // alias vw::cartography::GeoReference const & geo, // alias bool model_shadows, double camera_position_step_size, double const & max_dem_height, // alias double gridx, double gridy, ReflParams const & refl_params, // alias vw::Vector3 const & sunPosition, // alias vw::BBox2i crop_box, MaskedImgRefT const & image, // alias DblImgT const & blend_weight, // alias bool blend_weight_is_ground_weight, vw::CamPtr const & camera, // alias F* residuals) { // Default residuals. Using here 0 rather than some big number tuned out to // work better than the alternative. residuals[0] = F(0.0); try { vw::PixelMask<double> reflectance(0), intensity(0); double ground_weight = 0; // Need to be careful not to access an array which does not exist G p = 0, q = 0; if (use_pq) { p = pq[0]; q = pq[1]; } bool success = calcPixReflectanceInten(left[0], center[0], right[0], bottom[0], top[0], use_pq, p, q, col, row, dem, geo, model_shadows, max_dem_height, gridx, gridy, sunPosition, refl_params, crop_box, image, blend_weight, blend_weight_is_ground_weight, camera, reflectance, intensity, ground_weight, refl_coeffs, opt); if (success && vw::is_valid(intensity) && vw::is_valid(reflectance)) residuals[0] = ground_weight * (intensity - calcSimIntensity(albedo[0], reflectance.child(), exposure[0], opt.steepness_factor, haze, opt.num_haze_coeffs)); } catch (...) { // To be able to handle robustly DEMs that extend beyond the camera, // always return true when we fail to project, but with zero residual. // This needs more study. residuals[0] = F(0.0); return true; } return true; } // Discrepancy between measured and computed intensity. See the formula above. struct IntensityError { IntensityError(SfsOptions const& opt, int col, int row, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, bool model_shadows, double camera_position_step_size, double const& max_dem_height, // note: this is an alias double gridx, double gridy, ReflParams const& refl_params, vw::Vector3 const& sunPosition, vw::BBox2i const& crop_box, MaskedImgRefT const& image, DblImgT const& blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr const& camera): m_opt(opt), m_col(col), m_row(row), m_dem(dem), m_geo(geo), m_model_shadows(model_shadows), m_camera_position_step_size(camera_position_step_size), m_max_dem_height(max_dem_height), m_gridx(gridx), m_gridy(gridy), m_refl_params(refl_params), m_sunPosition(sunPosition), m_crop_box(crop_box), m_image(image), m_blend_weight(blend_weight), m_blend_weight_is_ground_weight(blend_weight_is_ground_weight), m_camera(camera) {} // See SmoothnessError() for the definitions of bottom, top, etc. template <typename F> bool operator()(const F* const exposure, const F* const haze, const F* const left, const F* const center, const F* const right, const F* const bottom, const F* const top, const F* const albedo, const F* const refl_coeffs, F* residuals) const { // For this error we do not use p and q, hence just use a placeholder. bool use_pq = false; const F * const pq = NULL; return calc_intensity_residual(m_opt, exposure, haze, left, center, right, bottom, top, use_pq, pq, albedo, refl_coeffs, m_col, m_row, m_dem, // alias m_geo, // alias m_model_shadows, m_camera_position_step_size, m_max_dem_height, // alias m_gridx, m_gridy, m_refl_params, // alias m_sunPosition, // alias m_crop_box, m_image, // alias m_blend_weight, // alias m_blend_weight_is_ground_weight, m_camera, // alias residuals); } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(SfsOptions const& opt, int col, int row, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, bool model_shadows, double camera_position_step_size, double const& max_dem_height, // alias double gridx, double gridy, ReflParams const& refl_params, vw::Vector3 const& sunPosition, vw::BBox2i const& crop_box, MaskedImgRefT const& image, DblImgT const& blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr const& camera) { return (new ceres::NumericDiffCostFunction<IntensityError, ceres::CENTRAL, 1, 1, g_max_num_haze_coeffs, 1, 1, 1, 1, 1, 1, g_num_model_coeffs> (new IntensityError(opt, col, row, dem, geo, model_shadows, camera_position_step_size, max_dem_height, gridx, gridy, refl_params, sunPosition, crop_box, image, blend_weight, blend_weight_is_ground_weight, camera))); } SfsOptions const& m_opt; int m_col, m_row; vw::ImageView<double> const & m_dem; // alias vw::cartography::GeoReference const & m_geo; // alias bool m_model_shadows; double m_camera_position_step_size; double const & m_max_dem_height; // alias double m_gridx, m_gridy; asp::ReflParams const & m_refl_params; // alias vw::Vector3 const & m_sunPosition; // alias vw::BBox2i m_crop_box; MaskedImgRefT const & m_image; // alias DblImgT const & m_blend_weight; // alias bool m_blend_weight_is_ground_weight; vw::CamPtr const & m_camera; // alias }; // A variation of the intensity error where only the DEM is floated. This // produces the same results as IntensityError (when most quantities are passed // as variables that are later fixed), but uses notably less memory. struct IntensityErrorFloatDemOnly { IntensityErrorFloatDemOnly(SfsOptions const& opt, int col, int row, vw::ImageView<double> const& dem, double albedo, double * refl_coeffs, double * exposure, double * haze, vw::cartography::GeoReference const& geo, bool model_shadows, double camera_position_step_size, double const& max_dem_height, // note: this is an alias double gridx, double gridy, ReflParams const& refl_params, vw::Vector3 const& sunPosition, vw::BBox2i const& crop_box, MaskedImgRefT const& image, DblImgT const& blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr const& camera): m_opt(opt), m_col(col), m_row(row), m_dem(dem), m_albedo(albedo), m_refl_coeffs(refl_coeffs), m_exposure(exposure), m_haze(haze), m_geo(geo), m_model_shadows(model_shadows), m_camera_position_step_size(camera_position_step_size), m_max_dem_height(max_dem_height), m_gridx(gridx), m_gridy(gridy), m_refl_params(refl_params), m_sunPosition(sunPosition), m_crop_box(crop_box), m_image(image), m_blend_weight(blend_weight), m_blend_weight_is_ground_weight(blend_weight_is_ground_weight), m_camera(camera) {} // See SmoothnessError() for the definitions of bottom, top, etc. template <typename F> bool operator()(const F* const left, const F* const center, const F* const right, const F* const bottom, const F* const top, F* residuals) const { // For this error we do not use p and q, hence just use a placeholder. bool use_pq = false; const F * const pq = NULL; return calc_intensity_residual(m_opt, m_exposure, m_haze, left, center, right, bottom, top, use_pq, pq, &m_albedo, m_refl_coeffs, m_col, m_row, m_dem, // alias m_geo, // alias m_model_shadows, m_camera_position_step_size, m_max_dem_height, // alias m_gridx, m_gridy, m_refl_params, // alias m_sunPosition, // alias m_crop_box, m_image, // alias m_blend_weight, // alias m_blend_weight_is_ground_weight, m_camera, // alias residuals); } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(SfsOptions const& opt, int col, int row, vw::ImageView<double> const& dem, double albedo, double * refl_coeffs, double * exposure, double * haze, vw::cartography::GeoReference const& geo, bool model_shadows, double camera_position_step_size, double const& max_dem_height, // alias double gridx, double gridy, ReflParams const& refl_params, vw::Vector3 const& sunPosition, vw::BBox2i const& crop_box, MaskedImgRefT const& image, DblImgT const& blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr const& camera) { return (new ceres::NumericDiffCostFunction<IntensityErrorFloatDemOnly, ceres::CENTRAL, 1, 1, 1, 1, 1, 1> (new IntensityErrorFloatDemOnly(opt, col, row, dem, albedo, refl_coeffs, exposure, haze, geo, model_shadows, camera_position_step_size, max_dem_height, gridx, gridy, refl_params, sunPosition, crop_box, image, blend_weight, blend_weight_is_ground_weight, camera))); } SfsOptions const & m_opt; int m_col, m_row; vw::ImageView<double> const & m_dem; // alias double m_albedo; double * m_refl_coeffs; double * m_exposure; double * m_haze; vw::cartography::GeoReference const & m_geo; // alias bool m_model_shadows; double m_camera_position_step_size; double const & m_max_dem_height; // alias double m_gridx, m_gridy; asp::ReflParams const & m_refl_params; // alias vw::Vector3 const & m_sunPosition; // alias vw::BBox2i m_crop_box; MaskedImgRefT const & m_image; // alias DblImgT const & m_blend_weight; // alias bool m_blend_weight_is_ground_weight; vw::CamPtr const & m_camera; // alias }; // end class IntensityErrorFloatDemOnly // A variant of the intensity error when we float the partial derivatives // in x and in y of the dem, which we call p and q. // TODO(oalexan1): Validate again if this gives better results as compared to // usual intensity error. struct IntensityErrorPQ { IntensityErrorPQ(SfsOptions const& opt, int col, int row, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, bool model_shadows, double camera_position_step_size, double const& max_dem_height, // note: this is an alias double gridx, double gridy, ReflParams const& refl_params, vw::Vector3 const& sunPosition, vw::BBox2i const& crop_box, MaskedImgRefT const& image, DblImgT const& blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr const& camera): m_opt(opt), m_col(col), m_row(row), m_dem(dem), m_geo(geo), m_model_shadows(model_shadows), m_camera_position_step_size(camera_position_step_size), m_max_dem_height(max_dem_height), m_gridx(gridx), m_gridy(gridy), m_refl_params(refl_params), m_sunPosition(sunPosition), m_crop_box(crop_box), m_image(image), m_blend_weight(blend_weight), m_blend_weight_is_ground_weight(blend_weight_is_ground_weight), m_camera(camera) {} // See SmoothnessError() for the definitions of bottom, top, etc. template <typename F> bool operator()(const F* const exposure, const F* const haze, const F* const center_h, const F* const pq, // array of length 2 const F* const albedo, const F* const refl_coeffs, F* residuals) const { bool use_pq = true; F v = 0; return calc_intensity_residual(m_opt, exposure, haze, &v, center_h, &v, &v, &v, use_pq, pq, albedo, refl_coeffs, m_col, m_row, m_dem, // alias m_geo, // alias m_model_shadows, m_camera_position_step_size, m_max_dem_height, // alias m_gridx, m_gridy, m_refl_params, // alias m_sunPosition, // alias m_crop_box, m_image, // alias m_blend_weight, // alias m_blend_weight_is_ground_weight, m_camera, // alias residuals); } // Factory to hide the construction of the CostFunction object from the client // code. static ceres::CostFunction* Create(SfsOptions const& opt, int col, int row, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, bool model_shadows, double camera_position_step_size, double const& max_dem_height, // alias double gridx, double gridy, ReflParams const& refl_params, vw::Vector3 const& sunPosition, vw::BBox2i const& crop_box, MaskedImgRefT const& image, DblImgT const& blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr const& camera) { return (new ceres::NumericDiffCostFunction<IntensityErrorPQ, ceres::CENTRAL, 1, 1, g_max_num_haze_coeffs, 1, 2, 1, g_num_model_coeffs> (new IntensityErrorPQ(opt, col, row, dem, geo, model_shadows, camera_position_step_size, max_dem_height, gridx, gridy, refl_params, sunPosition, crop_box, image, blend_weight, blend_weight_is_ground_weight, camera))); } SfsOptions const & m_opt; int m_col, m_row; vw::ImageView<double> const & m_dem; // alias vw::cartography::GeoReference const & m_geo; // alias bool m_model_shadows; double m_camera_position_step_size; double const & m_max_dem_height; // alias double m_gridx, m_gridy; ReflParams const & m_refl_params; // alias vw::Vector3 const & m_sunPosition; // alias vw::BBox2i m_crop_box; MaskedImgRefT const & m_image; // alias DblImgT const & m_blend_weight; // alias bool m_blend_weight_is_ground_weight; vw::CamPtr const & m_camera; // alias }; // Discrepancy between measured and computed intensity. Assume fixed reflectance, // as this is only an initial estimate. See calcSimIntensity() for the formula. struct IntensityErrorFixedReflectance { IntensityErrorFixedReflectance(vw::PixelMask<float> const& intensity, vw::PixelMask<float> const& reflectance, int num_haze_coeffs, double steepness_factor): m_intensity(intensity), m_reflectance(reflectance), m_num_haze_coeffs(num_haze_coeffs), m_steepness_factor(steepness_factor) {} template <typename F> bool operator()(const F* const exposure, const F* const haze, const F* const albedo, F* residuals) const { if (!vw::is_valid(m_intensity) || !vw::is_valid(m_reflectance)) { residuals[0] = 0; return true; } residuals[0] = calcSimIntensity(albedo[0], m_reflectance, exposure[0], m_steepness_factor, haze, m_num_haze_coeffs) - m_intensity; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(vw::PixelMask<float> const& intensity, vw::PixelMask<float> const& reflectance, int num_haze_coeffs, double steepness_factor) { return (new ceres::NumericDiffCostFunction<IntensityErrorFixedReflectance, ceres::CENTRAL, // residual, exposure, haze, albedo 1, 1, g_max_num_haze_coeffs, 1> (new IntensityErrorFixedReflectance(intensity, reflectance, num_haze_coeffs, steepness_factor))); } vw::PixelMask<float> m_intensity, m_reflectance; int m_num_haze_coeffs; double m_steepness_factor; }; // The smoothness error is the sum of squares of // the 4 second order partial derivatives, with a weight: // error = smoothness_weight * (u_xx^2 + u_xy^2 + u_yx^2 + u_yy^2) // We will use finite differences to compute these. // Consider a grid point and its neighbors, 9 points in all. // // bl = u(c-1, r+1) bottom = u(c, r+1) br = u(c+1,r+1) // left = u(c-1, r) center = u(c, r) right = u(c+1,r) // tl = u(c-1, r-1) top = u(c, r-1) tr = u(c+1,r-1) // // See https://en.wikipedia.org/wiki/Finite_difference // for the obtained formulas. struct SmoothnessError { SmoothnessError(double smoothness_weight, double gridx, double gridy): m_smoothness_weight(smoothness_weight), m_gridx(gridx), m_gridy(gridy) {} template <typename T> bool operator()(const T* const bl, const T* const bottom, const T* const br, const T* const left, const T* const center, const T* const right, const T* const tl, const T* const top, const T* const tr, T* residuals) const { // Normalize by grid size seems to make the functional less // sensitive to the actual grid size used. residuals[0] = (left[0] + right[0] - 2*center[0])/m_gridx/m_gridx; // u_xx residuals[1] = (br[0] + tl[0] - bl[0] - tr[0])/4.0/m_gridx/m_gridy; // u_xy residuals[2] = residuals[1]; // u_yx residuals[3] = (bottom[0] + top[0] - 2*center[0])/m_gridy/m_gridy; // u_yy for (int i = 0; i < 4; i++) residuals[i] *= m_smoothness_weight; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double smoothness_weight, double gridx, double gridy) { return (new ceres::NumericDiffCostFunction<SmoothnessError, ceres::CENTRAL, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1> (new SmoothnessError(smoothness_weight, gridx, gridy))); } double m_smoothness_weight, m_gridx, m_gridy; }; // The gradient error is the sum of squares of // the first order partial derivatives, with a weight: // error = gradient_weight * (u_x^2 + u_y^2) // We will use finite differences to compute these. See // SmoothnessError() for more details. struct GradientError { GradientError(double gradient_weight, double gridx, double gridy): m_gradient_weight(gradient_weight), m_gridx(gridx), m_gridy(gridy) {} template <typename T> bool operator()(const T* const bottom, const T* const left, const T* const center, const T* const right, const T* const top, T* residuals) const { // This results in a smoother solution than using centered differences residuals[0] = (right[0] - center[0])/m_gridx; // u_x residuals[1] = (center[0] - left[0])/m_gridx; // u_x residuals[2] = (top[0] - center[0])/m_gridy; // u_y residuals[3] = (center[0] - bottom[0])/m_gridy; // u_y for (int i = 0; i < 4; i++) residuals[i] *= m_gradient_weight; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double gradient_weight, double gridx, double gridy) { return (new ceres::NumericDiffCostFunction<GradientError, ceres::CENTRAL, 4, 1, 1, 1, 1, 1> (new GradientError(gradient_weight, gridx, gridy))); } double m_gradient_weight, m_gridx, m_gridy; }; // Try to make the DEM in shadow have positive curvature. The error term is // (curvature_weight *(terrain_xx + terrain_xy - curvature))^2 in the shadow, // and not used in lit areas. struct CurvatureInShadowError { CurvatureInShadowError(double curvature_in_shadow, double curvature_in_shadow_weight, double gridx, double gridy): m_curvature_in_shadow(curvature_in_shadow), m_curvature_in_shadow_weight(curvature_in_shadow_weight), m_gridx(gridx), m_gridy(gridy) {} template <typename T> bool operator()(const T* const bottom, const T* const left, const T* const center, const T* const right, const T* const top, T* residuals) const { // Normalize by grid size seems to make the functional less // sensitive to the actual grid size used. double u_xx = (left[0] + right[0] - 2*center[0])/m_gridx/m_gridx; // u_xx double u_yy = (bottom[0] + top[0] - 2*center[0])/m_gridy/m_gridy; // u_yy residuals[0] = m_curvature_in_shadow_weight*(u_xx + u_yy - m_curvature_in_shadow); return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double curvature_in_shadow, double curvature_in_shadow_weight, double gridx, double gridy) { return (new ceres::NumericDiffCostFunction<CurvatureInShadowError, ceres::CENTRAL, 1, 1, 1, 1, 1, 1> (new CurvatureInShadowError(curvature_in_shadow, curvature_in_shadow_weight, gridx, gridy))); } double m_curvature_in_shadow, m_curvature_in_shadow_weight, m_gridx, m_gridy; }; struct SmoothnessErrorPQ { SmoothnessErrorPQ(double smoothness_weight_pq, double gridx, double gridy): m_smoothness_weight_pq(smoothness_weight_pq), m_gridx(gridx), m_gridy(gridy) {} template <typename T> bool operator()(const T* const bottom_pq, const T* const left_pq, const T* const right_pq, const T* const top_pq, T* residuals) const { // Normalize by grid size seems to make the functional less // sensitive to the actual grid size used. residuals[0] = (right_pq[0] - left_pq[0])/(2*m_gridx); // p_x residuals[1] = (top_pq[0] - bottom_pq[0])/(2*m_gridy); // p_y residuals[2] = (right_pq[1] - left_pq[1])/(2*m_gridx); // q_x residuals[3] = (top_pq[1] - bottom_pq[1])/(2*m_gridy); // q_y for (int i = 0; i < 4; i++) residuals[i] *= m_smoothness_weight_pq; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double smoothness_weight_pq, double gridx, double gridy) { return (new ceres::NumericDiffCostFunction<SmoothnessErrorPQ, ceres::CENTRAL, 4, 2, 2, 2, 2> (new SmoothnessErrorPQ(smoothness_weight_pq, gridx, gridy))); } double m_smoothness_weight_pq, m_gridx, m_gridy; }; // The integrability error is the discrepancy between the // independently optimized gradients p and q, and the partial // derivatives of the dem, here denoted by u. // error = integrability_weight * ((u_x - p)^2 + (u_y - q)^2) // See SmoothnessError for the notation below. struct IntegrabilityError { IntegrabilityError(double integrability_weight, double gridx, double gridy): m_integrability_weight(integrability_weight), m_gridx(gridx), m_gridy(gridy) {} template <typename T> bool operator()(const T* const bottom, const T* const left, const T* const right, const T* const top, const T* const pq, T* residuals) const { residuals[0] = (right[0] - left[0])/(2*m_gridx) - pq[0]; residuals[1] = (top[0] - bottom[0])/(2*m_gridy) - pq[1]; for (int i = 0; i < 2; i++) residuals[i] *= m_integrability_weight; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double integrability_weight, double gridx, double gridy) { return (new ceres::NumericDiffCostFunction<IntegrabilityError, ceres::CENTRAL, 2, 1, 1, 1, 1, 2> (new IntegrabilityError(integrability_weight, gridx, gridy))); } double m_integrability_weight, m_gridx, m_gridy; }; // A cost function that will penalize deviating too much from the original DEM height. struct HeightChangeError { HeightChangeError(double orig_height, double initial_dem_constraint_weight): m_orig_height(orig_height), m_initial_dem_constraint_weight(initial_dem_constraint_weight) {} template <typename T> bool operator()(const T* const center, T* residuals) const { residuals[0] = (center[0] - m_orig_height)*m_initial_dem_constraint_weight; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double orig_height, double initial_dem_constraint_weight) { return (new ceres::NumericDiffCostFunction<HeightChangeError, ceres::CENTRAL, 1, 1> (new HeightChangeError(orig_height, initial_dem_constraint_weight))); } double m_orig_height, m_initial_dem_constraint_weight; }; // A cost function that will penalize deviating too much from the initial albedo. struct AlbedoChangeError { AlbedoChangeError(double initial_albedo, double albedo_constraint_weight): m_initial_albedo(initial_albedo), m_albedo_constraint_weight(albedo_constraint_weight) {} template <typename T> bool operator()(const T* const center, T* residuals) const { residuals[0] = (center[0] - m_initial_albedo)*m_albedo_constraint_weight; return true; } // Factory to hide the construction of the CostFunction object from // the client code. static ceres::CostFunction* Create(double initial_albedo, double albedo_constraint_weight) { return (new ceres::NumericDiffCostFunction<AlbedoChangeError, ceres::CENTRAL, 1, 1> (new AlbedoChangeError(initial_albedo, albedo_constraint_weight))); } double m_initial_albedo, m_albedo_constraint_weight; }; // TODO(oalexan1): This should be modularized void sfsCostFun(// Fixed quantities double gridx, double gridy, double smoothness_weight, double max_dem_height, double dem_nodata_val, float img_nodata_val, bool blend_weight_is_ground_weight, vw::cartography::GeoReference const & geo, std::vector<vw::BBox2i> const & crop_boxes, std::vector<MaskedImgRefT> const & masked_images, std::vector<DblImgT> const & blend_weights, asp::ReflParams const & refl_params, std::vector<vw::Vector3> const & sunPosition, vw::ImageView<double> const & orig_dem, vw::ImageView<int> const & lit_image_mask, vw::ImageView<double> const & curvature_in_shadow_weight, // Variable quantities asp::SfsOptions & opt, vw::ImageView<double> & dem, vw::ImageView<double> & albedo, std::vector<vw::CamPtr> & cameras, std::vector<double> & exposures, std::vector<std::vector<double>> & haze, std::vector<double> & refl_coeffs, vw::ImageView<vw::Vector2> & pq, ceres::Problem & problem) { int num_images = opt.input_images.size(); // See if a given image is used in at least one clip or skipped in // all of them std::vector<bool> use_image(num_images, false); int num_used = 0; for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) == opt.skip_images.end()) { use_image[image_iter] = true; num_used++; } } // We define p and q as the partial derivatives in x in y of the dem. // When using the integrability constraint, they are floated as variables // in their own right, while constrained to not go too far from the DEM. if (opt.integrability_weight > 0) { pq.set_size(dem.cols(), dem.rows()); for (int col = 1; col < dem.cols()-1; col++) { for (int row = 1; row < dem.rows()-1; row++) { pq(col, row)[0] = (dem(col+1, row) - dem(col-1, row))/(2*gridx); // right - left pq(col, row)[1] = (dem(col, row-1) - dem(col, row+1))/(2*gridy); // top - bottom } } } // Use a simpler cost function if only the DEM is floated. This results in // notably reduced memory usage but no gain in speed. bool float_dem_only = true; if (opt.float_albedo || opt.float_exposure || opt.fix_dem || opt.float_reflectance_model || opt.float_haze || opt.integrability_weight > 0) { float_dem_only = false; } // Add a residual block for every grid point not at the boundary int bd = 1; for (int col = bd; col < dem.cols() - bd; col++) { for (int row = bd; row < dem.rows() - bd; row++) { // Intensity error for each image for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; ceres::LossFunction* loss_function_img = NULL; if (opt.robust_threshold > 0) loss_function_img = new ceres::CauchyLoss(opt.robust_threshold); if (float_dem_only) { ceres::CostFunction* cost_function_img = IntensityErrorFloatDemOnly::Create(opt, col, row, dem, albedo(col, row), &refl_coeffs[0], &exposures[image_iter], &haze[image_iter][0], geo, opt.model_shadows, opt.camera_position_step_size, max_dem_height, gridx, gridy, refl_params, sunPosition[image_iter], crop_boxes[image_iter], masked_images[image_iter], blend_weights[image_iter], blend_weight_is_ground_weight, cameras[image_iter]); problem.AddResidualBlock(cost_function_img, loss_function_img, &dem(col-1, row), // left &dem(col, row), // center &dem(col+1, row), // right &dem(col, row+1), // bottom &dem(col, row-1)); // top } else if (opt.integrability_weight == 0) { ceres::CostFunction* cost_function_img = IntensityError::Create(opt, col, row, dem, geo, opt.model_shadows, opt.camera_position_step_size, max_dem_height, gridx, gridy, refl_params, sunPosition[image_iter], crop_boxes[image_iter], masked_images[image_iter], blend_weights[image_iter], blend_weight_is_ground_weight, cameras[image_iter]); problem.AddResidualBlock(cost_function_img, loss_function_img, &exposures[image_iter], // exposure &haze[image_iter][0], // haze &dem(col-1, row), // left &dem(col, row), // center &dem(col+1, row), // right &dem(col, row+1), // bottom &dem(col, row-1), // top &albedo(col, row), // albedo &refl_coeffs[0]); } else { // Use the integrability constraint ceres::CostFunction* cost_function_img = IntensityErrorPQ::Create(opt, col, row, dem, geo, opt.model_shadows, opt.camera_position_step_size, max_dem_height, gridx, gridy, refl_params, sunPosition[image_iter], crop_boxes[image_iter], masked_images[image_iter], blend_weights[image_iter], blend_weight_is_ground_weight, cameras[image_iter]); problem.AddResidualBlock(cost_function_img, loss_function_img, &exposures[image_iter], // exposure &haze[image_iter][0], // haze &dem(col, row), // center &pq(col, row)[0], // pq &albedo(col, row), // albedo &refl_coeffs[0]); // reflectance } } // end iterating over images // Smoothness penalty. We always add this, even if the smoothness weight is 0, // to make Ceres not complain about blocks not being set. ceres::LossFunction* loss_function_sm = NULL; ceres::CostFunction* cost_function_sm = SmoothnessError::Create(smoothness_weight, gridx, gridy); problem.AddResidualBlock(cost_function_sm, loss_function_sm, &dem(col-1, row+1), // bottom left &dem(col, row+1), // bottom &dem(col+1, row+1), // bottom right &dem(col-1, row), // left &dem(col, row), // center &dem(col+1, row), // right &dem(col-1, row-1), // top left &dem(col, row-1), // top &dem(col+1, row-1)); // top right // Add curvature in shadow. Note that we use a per-pixel curvature_in_shadow_weight, // to gradually phase it in to avoid artifacts. if (opt.curvature_in_shadow_weight > 0.0 && curvature_in_shadow_weight(col, row) > 0) { ceres::LossFunction* loss_function_cv = NULL; ceres::CostFunction* cost_function_cv = CurvatureInShadowError::Create(opt.curvature_in_shadow, curvature_in_shadow_weight(col, row), gridx, gridy); problem.AddResidualBlock(cost_function_cv, loss_function_cv, &dem(col, row+1), // bottom &dem(col-1, row), // left &dem(col, row), // center &dem(col+1, row), // right &dem(col, row-1)); // top } // Add gradient weight if (opt.gradient_weight > 0.0) { ceres::LossFunction* loss_function_grad = NULL; ceres::CostFunction* cost_function_grad = GradientError::Create(opt.gradient_weight, gridx, gridy); problem.AddResidualBlock(cost_function_grad, loss_function_grad, &dem(col, row+1), // bottom &dem(col-1, row), // left &dem(col, row), // center &dem(col+1, row), // right &dem(col, row-1)); // top } if (opt.integrability_weight > 0) { ceres::LossFunction* loss_function_int = NULL; ceres::CostFunction* cost_function_int = IntegrabilityError::Create(opt.integrability_weight, gridx, gridy); problem.AddResidualBlock(cost_function_int, loss_function_int, &dem(col, row+1), // bottom &dem(col-1, row), // left &dem(col+1, row), // right &dem(col, row-1), // top &pq (col, row)[0]); // pq if (opt.smoothness_weight_pq > 0) { ceres::LossFunction* loss_function_sm_pq = NULL; ceres::CostFunction* cost_function_sm_pq = SmoothnessErrorPQ::Create(opt.smoothness_weight_pq, gridx, gridy); problem.AddResidualBlock(cost_function_sm_pq, loss_function_sm_pq, &pq(col, row+1)[0], // bottom &pq(col-1, row)[0], // left &pq(col+1, row)[0], // right &pq(col, row-1)[0]); // top } } // Deviation from prescribed height constraint if (opt.initial_dem_constraint_weight > 0) { ceres::LossFunction* loss_function_hc = NULL; ceres::CostFunction* cost_function_hc = HeightChangeError::Create(orig_dem(col, row), opt.initial_dem_constraint_weight); problem.AddResidualBlock(cost_function_hc, loss_function_hc, &dem(col, row)); } // Deviation from prescribed albedo if (opt.float_albedo > 0 && opt.albedo_constraint_weight > 0) { ceres::LossFunction* loss_function_hc = NULL; if (opt.albedo_robust_threshold > 0) loss_function_hc = new ceres::CauchyLoss(opt.albedo_robust_threshold); ceres::CostFunction* cost_function_hc = AlbedoChangeError::Create(albedo(col, row), opt.albedo_constraint_weight); problem.AddResidualBlock(cost_function_hc, loss_function_hc, &albedo(col, row)); } // end if float albedo } // end row iter } // end col iter // DEM at the boundary must be fixed for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (col == 0 || col == dem.cols() - 1 || row == 0 || row == dem.rows() - 1) { problem.SetParameterBlockConstant(&dem(col, row)); } } } if (opt.fix_dem) { for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) problem.SetParameterBlockConstant(&dem(col, row)); } } if (opt.initial_dem_constraint_weight <= 0 && num_used <= 1) { if (opt.float_albedo && opt.albedo_constraint_weight <= 0) { vw::vw_out() << "No DEM or albedo constraint is used, and there is at most one " << "usable image. Fixing the albedo.\n"; opt.float_albedo = false; } // If there's just one image, don't float the exposure, as the // problem is under-determined. If we float the albedo, we will // implicitly float the exposure, hence keep the exposure itself // fixed. if (opt.float_exposure) { vw::vw_out() << "No DEM constraint is used, and there is at most one " << "usable image. Fixing the exposure.\n"; opt.float_exposure = false; } } // If to float the albedo if (!float_dem_only) { for (int col = 1; col < dem.cols() - 1; col++) { for (int row = 1; row < dem.rows() - 1; row++) { if (!opt.float_albedo && num_used > 0) problem.SetParameterBlockConstant(&albedo(col, row)); } } } if (!float_dem_only) { // If floating the DEM only, none of the below parameters are even added to the problem, // it does not make sense to check to keep them fixed or floating them. if (!opt.float_exposure) { for (int image_iter = 0; image_iter < num_images; image_iter++) { if (use_image[image_iter]) problem.SetParameterBlockConstant(&exposures[image_iter]); } } if (!opt.float_haze) { for (int image_iter = 0; image_iter < num_images; image_iter++) { if (use_image[image_iter]) problem.SetParameterBlockConstant(&haze[image_iter][0]); } } // If to float the reflectance model coefficients if (!opt.float_reflectance_model && num_used > 0) problem.SetParameterBlockConstant(&refl_coeffs[0]); } } // end function formCostFun() // Find the best-fit exposure and haze given the input sampled image and reflectance. // Also find the sampled albedo along the way. The albedo will be optimized // only if --float-albedo is on. Otherwise it will be kept at the nominal value. void estimExposureHazeAlbedo(SfsOptions & opt, std::vector<MaskedImgRefT> const& masked_images, std::vector<DblImgT> const& blend_weights, bool blend_weight_is_ground_weight, vw::ImageView<double> const& dem, double mean_albedo, vw::cartography::GeoReference const& geo, std::vector<vw::CamPtr> const& cameras, double & max_dem_height, std::vector<vw::BBox2i> const& crop_boxes, std::vector<vw::Vector3> const& sunPosition, asp::ReflParams const& refl_params, double gridx, double gridy) { vw::vw_out() << "Estimating the exposure, haze, albedo.\n"; if (!opt.float_albedo) vw::vw_out() << "The albedo is fixed.\n"; // Sample large DEMs int sample_col_rate = 0, sample_row_rate = 0; asp::calcSampleRates(dem, opt.num_samples_for_estim, sample_col_rate, sample_row_rate); int num_images = opt.input_images.size(); std::vector<double> local_exposures_vec(num_images, 0), local_haze_vec(num_images, 0); std::vector<MaskedDblImgT> reflectance(num_images), intensity(num_images); int num_sampled_cols = 0, num_sampled_rows = 0; for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; vw::ImageView<double> ground_weight; vw::ImageView<vw::Vector2> pq; // no need for these just for initialization bool show_progress = false; computeReflectanceAndIntensity(dem, pq, geo, opt.model_shadows, show_progress, max_dem_height, gridx, gridy, sample_col_rate, sample_row_rate, sunPosition[image_iter], refl_params, crop_boxes[image_iter], masked_images[image_iter], blend_weights[image_iter], blend_weight_is_ground_weight, cameras[image_iter], reflectance[image_iter], intensity[image_iter], ground_weight, &opt.model_coeffs_vec[0], opt); num_sampled_cols = reflectance[image_iter].cols(); num_sampled_rows = reflectance[image_iter].rows(); } // Create the inital albedo image, of same size as sampled intensity vw::ImageView<double> albedo(num_sampled_cols, num_sampled_rows); for (int col = 0; col < albedo.cols(); col++) { for (int row = 0; row < albedo.rows(); row++) { albedo(col, row) = mean_albedo; } } // Create the image of valid pixels, so where albedo was solved for vw::ImageView<int> valid_mask(num_sampled_cols, num_sampled_rows); for (int col = 0; col < valid_mask.cols(); col++) { for (int row = 0; row < valid_mask.rows(); row++) { valid_mask(col, row) = 0; } } // Create the problem ceres::Problem problem; // Add a residual block for every pixel in each image for (int image_iter = 0; image_iter < num_images; image_iter++) { for (int col = 0; col < intensity[image_iter].cols(); col++) { for (int row = 0; row < intensity[image_iter].rows(); row++) { // Skip invalid pixels, such as at boundary. The albedo will be kept // to its initial value at these pixels. if (!vw::is_valid(intensity[image_iter](col, row)) || !vw::is_valid(reflectance[image_iter](col, row))) continue; // Mark this albedo pixel as valid valid_mask(col, row) = 1; ceres::CostFunction* cost_function_img = IntensityErrorFixedReflectance::Create(intensity[image_iter](col, row), reflectance[image_iter](col, row), opt.num_haze_coeffs, opt.steepness_factor); ceres::LossFunction* loss_function_img = NULL; if (opt.robust_threshold > 0) loss_function_img = new ceres::CauchyLoss(opt.robust_threshold); problem.AddResidualBlock(cost_function_img, loss_function_img, &opt.image_exposures_vec[image_iter], &opt.image_haze_vec[image_iter][0], &albedo(col, row)); // If zero haze coefficients are used, fix the haze if (opt.num_haze_coeffs == 0) problem.SetParameterBlockConstant(&opt.image_haze_vec[image_iter][0]); if (!opt.float_albedo) problem.SetParameterBlockConstant(&albedo(col, row)); } // end row } // end col } // end image_iter // Deviation from prescribed albedo at each albedo pixel if (opt.float_albedo > 0 && opt.albedo_constraint_weight > 0) { for (int col = 0; col < albedo.cols(); col++) { for (int row = 0; row < albedo.rows(); row++) { ceres::LossFunction* loss_function_hc = NULL; if (opt.albedo_robust_threshold > 0) loss_function_hc = new ceres::CauchyLoss(opt.albedo_robust_threshold); ceres::CostFunction* cost_function_hc = AlbedoChangeError::Create(albedo(col, row), opt.albedo_constraint_weight); problem.AddResidualBlock(cost_function_hc, loss_function_hc, &albedo(col, row)); } // end row } // end col } // Ceres options ceres::Solver::Options options; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.max_num_iterations = opt.max_iterations; options.minimizer_progress_to_stdout = 1; options.num_threads = opt.num_threads; options.linear_solver_type = ceres::SPARSE_SCHUR; // Solve the problem ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); vw::vw_out() << summary.FullReport() << "\n"; if (opt.float_albedo) { // In-fill the albedo image to reduce boundary artifacts inFillImage3x3(albedo, valid_mask); // Up-sample the estimated albedo to full-res dimensions with bilinear // interpolation. This is not needed and not used if albedo is not floated. bool has_georef = true; bool has_nodata = true; double albedo_nodata_val = -1e+6; // large but reasonable vw::TerminalProgressCallback tpc("asp", ": "); std::string albedo_file = opt.out_prefix + "-albedo-estim.tif"; vw::vw_out() << "Up-sampling the estimated albedo to input DEM dimensions.\n"; vw::vw_out() << "Writing: " << albedo_file << "\n"; // Note: This logic produces junk if the SfsInterpView is initialized on a // separate line and then passed to block_write_gdal_image(). Not clear why. vw::cartography::block_write_gdal_image(albedo_file, SfsInterpView(dem.cols(), dem.rows(), sample_col_rate, sample_row_rate, albedo), has_georef, geo, has_nodata, albedo_nodata_val, opt, tpc); } // The haze and exposures will be saved outside this function. return; } // Check if a parameter block is valid (exists and is not constant) bool isValidBlock(ceres::Problem const& problem, double const* block) { return problem.HasParameterBlock(block) && !problem.IsParameterBlockConstant(block); } // Setup the blocks for covariance calculation. Keep on appending to // parameter_blocks. Need dx and dy for when doing covariances with neighbors. // Use a set to avoid duplicates. void setupCovarCalc(vw::ImageView<double> const& image, ceres::Problem const& problem, std::vector<int> const& dx, std::vector<int> const& dy, std::set<const double*> &block_set) { for (int col = 0; col < image.cols(); col++) { for (int row = 0; row < image.rows(); row++) { for (size_t i = 0; i < dx.size(); i++) { int c = col + dx[i]; int r = row + dy[i]; if (c < 0 || c >= image.cols() || r < 0 || r >= image.rows()) continue; // Add to a set, to avoid duplicates if (isValidBlock(problem, &image(c, r))) block_set.insert(&image(c, r)); } } } } // Compute the DEM covariance for the given problem, and also the albedo covariance, // if --float-albedo is on. If --save-covariances is on, also save covariances // of each DEM pixel with the four horizontal and vertical neighbors. Same for // albedo. bool calcSfsCovariances(SfsOptions const& opt, vw::ImageView<double> const& dem, vw::ImageView<double> const& albedo, ceres::Problem &problem, std::vector<int> const& dx, std::vector<int> const& dy, ceres::Covariance &covariance) { // output if (opt.save_covariances) vw::vw_out() << "Computing covariances.\n"; else vw::vw_out() << "Computing variances.\n"; // Collect unique parameter blocks using a set std::set<const double*> block_set; setupCovarCalc(dem, problem, dx, dy, block_set); if (opt.float_albedo) setupCovarCalc(albedo, problem, dx, dy, block_set); // Convert the set of pointers to a vector for CERES std::vector<const double*> parameter_blocks(block_set.begin(), block_set.end()); if (!covariance.Compute(parameter_blocks, &problem)) { vw::vw_out(vw::WarningMessage) << "The CERES solver failed to compute the covariances. If --float-albedo is on, " << "consider disabling one or both of --float-haze and --float-exposures, " << "and perhaps increasing --albedo-constraint-weight, to make the problem better " << "determined.\n"; return false; } return true; } // Save the variances and/or covariances of a given parameter set. Cast to float // upon saving. void saveSfsCovariances(SfsOptions const& opt, vw::ImageView<double> const& values, std::string const& file_prefix, std::vector<std::string> const& suffixes, std::vector<int> const& dx, std::vector<int> const& dy, vw::cartography::GeoReference const& geo, double nodata_val, ceres::Problem &problem, ceres::Covariance &covariance) { bool has_georef = true, has_nodata = true; // Iterate over all the files we need to save for (size_t i = 0; i < suffixes.size(); i++) { vw::ImageView<double> cov_image(values.cols(), values.rows()); vw::fill(cov_image, nodata_val); for (int col = 0; col < values.cols(); col++) { for (int row = 0; row < values.rows(); row++) { int c = col + dx[i]; int r = row + dy[i]; if (c < 0 || c >= values.cols() || r < 0 || r >= values.rows()) continue; if (!isValidBlock(problem, &values(col, row)) || !isValidBlock(problem, &values(c, r))) continue; double cov = 0.0; if (covariance.GetCovarianceBlock(&values(col, row), &values(c, r), &cov)) cov_image(col, row) = cov; } } // Set variance to nodata within 3 pixels of the boundary as it is somewhat // inaccurate due to boundary conditions, and can result in tiling artifacts in // parallel_sfs. int margin = 3; for (int col = 0; col < cov_image.cols(); col++) { for (int row = 0; row < cov_image.rows(); row++) { if (col < margin || col >= cov_image.cols() - margin || row < margin || row >= cov_image.rows() - margin) cov_image(col, row) = nodata_val; } } std::string out_file = file_prefix + suffixes[i]; vw::vw_out() << "Writing: " << out_file << "\n"; vw::TerminalProgressCallback tpc("asp", ": "); vw::cartography::block_write_gdal_image(out_file, vw::pixel_cast<float>(cov_image), has_georef, geo, has_nodata, nodata_val, opt, tpc); } } // Compute and save the covariances void calcSaveSfsCovariances(SfsOptions const& opt, vw::ImageView<double> const& dem, vw::ImageView<double> const& albedo, ceres::Problem &problem, vw::cartography::GeoReference const& geo, double dem_nodata_val) { // The variance is for a pixel with itself. For covariance will need the neighbors. std::vector<int> dx = {0}, dy = {0}; if (opt.save_covariances) { dx = {0, 2, -1, 1, 0}; // central-difference dy = {0, 0, 1, 1, 2}; // self, dr0_dc2, dr1_dcn1, dr1_dc1, dr2_dc0 } ceres::Covariance::Options covariance_options; covariance_options.num_threads = opt.num_threads; ceres::Covariance covariance(covariance_options); // Set up the calculation for all covariances. But then save them individually. if (!calcSfsCovariances(opt, dem, albedo, problem, dx, dy, covariance)) return; // File name suffixes for variance and covariances. Indices match dx/dy. std::vector<std::string> suffixes = {"-variance.tif"}; if (opt.save_covariances) suffixes = { // self, dr0_dc2, dr1_dcn1, dr1_dc1, dr2_dc0 "-variance.tif", "-dr0_dc2-covariance.tif", "-dr1_dcn1-covariance.tif", "-dr1_dc1-covariance.tif", "-dr2_dc0-covariance.tif", }; // Save DEM variance and covariances saveSfsCovariances(opt, dem, opt.out_prefix + "-DEM", suffixes, dx, dy, geo, dem_nodata_val, problem, covariance); // Save albedo variance and covariances if (opt.float_albedo) saveSfsCovariances(opt, albedo, opt.out_prefix + "-albedo", suffixes, dx, dy, geo, dem_nodata_val, problem, covariance); } } // end namespace asp ================================================ FILE: src/asp/SfS/SfsCostFun.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsCostFun.h // Cost function logic for SfS #ifndef __ASP_SFS_SFS_COST_FUN_H__ #define __ASP_SFS_SFS_COST_FUN_H__ #include <asp/SfS/SfsErrorEstim.h> #include <asp/SfS/SfsModel.h> #include <vw/Image/ImageView.h> #include <vw/Image/PixelMask.h> #include <vw/Camera/CameraModel.h> #include <vw/Cartography/GeoReference.h> #include <ceres/ceres.h> #include <ceres/loss_function.h> namespace asp { class SfsOptions; // A function to invoke at every iteration of ceres. class SfsCallback: public ceres::IterationCallback { public: // Constructor to initialize references to the necessary data SfsCallback(asp::SfsOptions const& opt, vw::ImageView<double>& dem, vw::ImageView<vw::Vector2>& pq, vw::ImageView<double>& albedo, vw::cartography::GeoReference const& geo, asp::ReflParams const& refl_params, std::vector<vw::Vector3> const& sunPosition, std::vector<vw::BBox2i> const& crop_boxes, std::vector<asp::MaskedImgRefT> const& masked_images, std::vector<asp::DblImgT> const& blend_weights, bool blend_weight_is_ground_weight, std::vector<vw::CamPtr>& cameras, double& dem_nodata_val, float& img_nodata_val, std::vector<double>& exposures, std::vector<std::vector<double>>& haze, double& max_dem_height, double& gridx, double& gridy, std::vector<double> & refl_coeffs); virtual ceres::CallbackReturnType operator()(const ceres::IterationSummary& summary) override; void set_final_iter(bool is_final_iter); private: // Class members storing references to the data asp::SfsOptions const& opt; vw::ImageView<double>& dem; vw::ImageView<vw::Vector2>& pq; vw::ImageView<double>& albedo; vw::cartography::GeoReference const& geo; asp::ReflParams const& refl_params; std::vector<vw::Vector3> const& sunPosition; std::vector<vw::BBox2i> const& crop_boxes; std::vector<asp::MaskedImgRefT> const& masked_images; std::vector<asp::DblImgT> const& blend_weights; bool blend_weight_is_ground_weight; std::vector<vw::CamPtr>& cameras; double& dem_nodata_val; float& img_nodata_val; std::vector<double>& exposures; std::vector<std::vector<double>>& haze; double& max_dem_height; double& gridx; double& gridy; std::vector<double> refl_coeffs; int iter; bool final_iter; }; // Form the SfS cost function void sfsCostFun(// Fixed quantities double gridx, double gridy, double smoothness_weight, double max_dem_height, double dem_nodata_val, float img_nodata_val, bool blend_weight_is_ground_weight, vw::cartography::GeoReference const & geo, std::vector<vw::BBox2i> const & crop_boxes, std::vector<MaskedImgRefT> const & masked_images, std::vector<DblImgT> const & blend_weights, asp::ReflParams const & refl_params, std::vector<vw::Vector3> const & sunPosition, vw::ImageView<double> const & orig_dem, vw::ImageView<int> const & lit_image_mask, vw::ImageView<double> const & curvature_in_shadow_weight, // Variable quantities asp::SfsOptions & opt, vw::ImageView<double> & dem, vw::ImageView<double> & albedo, std::vector<vw::CamPtr> & cameras, std::vector<double> & exposures, std::vector<std::vector<double>> & haze, std::vector<double> & refl_coeffs, vw::ImageView<vw::Vector2> & pq, ceres::Problem & problem); // Find the best-fit exposure and haze given the input sampled image and reflectance. // Also find the sampled albedo along the way. The albedo will be optimized // only if --float-albedo is on. Otherwise it will be kept at the nominal value. void estimExposureHazeAlbedo(SfsOptions & opt, std::vector<MaskedImgRefT> const& masked_images, std::vector<DblImgT> const& blend_weights, bool blend_weight_is_ground_weight, vw::ImageView<double> const& dem, double mean_albedo, vw::cartography::GeoReference const& geo, std::vector<vw::CamPtr> const& cameras, double & max_dem_height, std::vector<vw::BBox2i> const& crop_boxes, std::vector<vw::Vector3> const& sunPosition, asp::ReflParams const& refl_params, double gridx, double gridy); // Compute and save the covariances void calcSaveSfsCovariances(SfsOptions const& opt, vw::ImageView<double> const& dem, vw::ImageView<double> const& albedo, ceres::Problem &problem, vw::cartography::GeoReference const& geo, double dem_nodata_val); } // end namespace asp #endif // __ASP_SFS_SFS_COST_FUN_H__ ================================================ FILE: src/asp/SfS/SfsErrorEstim.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsErrorEstim.cc // SfS error estimation methods #include <asp/SfS/SfsErrorEstim.h> #include <asp/SfS/SfsModel.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Core/Log.h> #include <vw/Core/ProgressCallback.h> #include <vw/FileIO/FileUtils.h> #include <string> #include <map> namespace asp { // Use this struct to keep track of height errors. HeightErrEstim:: HeightErrEstim(int num_cols, int num_rows, int num_height_samples_in, double max_height_error_in, double nodata_height_val_in, vw::ImageView<double> const* albedo_in) { num_height_samples = num_height_samples_in; // TODO(oalexan1): This must be a parameter max_height_error = max_height_error_in; // TODO(oalexan1): This must be a parameter nodata_height_val = nodata_height_val_in; albedo = albedo_in; image_iter = 0; // will be modified later height_error_vec.set_size(num_cols, num_rows); for (int col = 0; col < num_cols; col++) { for (int row = 0; row < num_rows; row++) { height_error_vec(col, row)[0] = -max_height_error; height_error_vec(col, row)[1] = max_height_error; } } } // end constructor // Given the normal (height) to the SfS DEM, find how different // a height can be from this before the computed intensity // due to that height is bigger than max_intensity_err. void estimateHeightError(vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, vw::Vector3 const& cameraPosition, vw::Vector3 const& sunPosition, asp::ReflParams const& refl_params, const double * refl_coeffs, double meas_intensity, double max_intensity_err, int col, int row, double grid_x, double grid_y, int image_iter, asp::SfsOptions const& opt, vw::ImageView<double> const& albedo, asp::HeightErrEstim * heightErrEstim) { // Look at the neighbors int cols[] = {col - 1, col, col, col + 1}; int rows[] = {row, row - 1, row + 1, row}; for (int it = 0; it < 4; it++) { int colx = cols[it], rowx = rows[it]; // Can't be at edges as need to compute normals if (colx <= 0 || rowx <= 0 || colx >= dem.cols() - 1 || rowx >= dem.rows() - 1) continue; // Perturb the height down and up for (int sign = -1; sign <= 1; sign += 2) { for (int height_it = 0; height_it < heightErrEstim->num_height_samples; height_it++) { double dh = sign * heightErrEstim->max_height_error * double(height_it)/double(heightErrEstim->num_height_samples); if (sign == -1) { if (dh < heightErrEstim->height_error_vec(colx, rowx)[0]) { // We already determined dh can't go as low, so stop here break; } } else if (sign == 1) { if (dh > heightErrEstim->height_error_vec(colx, rowx)[1]) { break; } } // Determine where to add the dh. Recall that we compute the intensity // at (col, row), while perturbing the dem height at (colx, rowx) double left_dh = 0, center_dh = 0, right_dh = 0, bottom_dh = 0, top_dh = 0; if (colx == col - 1 && rowx == row) left_dh = dh; else if (colx == col && rowx == row) center_dh = dh; // won't be reached else if (colx == col + 1 && rowx == row) right_dh = dh; else if (colx == col && rowx == row + 1) bottom_dh = dh; else if (colx == col && rowx == row - 1) top_dh = dh; double left_h = dem(col - 1, row) + left_dh; double center_h = dem(col, row) + center_dh; double right_h = dem(col + 1, row) + right_dh; double bottom_h = dem(col, row + 1) + bottom_dh; double top_h = dem(col, row - 1) + top_dh; vw::Vector3 xyz, normal; bool use_pq = false; double p = 0.0, q = 0.0; calcPointAndNormal(col, row, left_h, center_h, right_h, bottom_h, top_h, use_pq, p, q, geo, grid_x, grid_y, xyz, normal); vw::PixelMask<double> reflectance = asp::calcReflectance(cameraPosition, normal, xyz, sunPosition, refl_params, refl_coeffs); reflectance.validate(); double sim_intensity = asp::calcSimIntensity(albedo(col, row), reflectance, opt.image_exposures_vec[image_iter], opt.steepness_factor, &opt.image_haze_vec[image_iter][0], opt.num_haze_coeffs); if (std::abs(sim_intensity - meas_intensity) > max_intensity_err) { // We exceeded the error budget, record the dh at which it happens if (sign == -1) { heightErrEstim->height_error_vec(colx, rowx)[0] = dh; } else if (sign == 1) { heightErrEstim->height_error_vec(colx, rowx)[1] = dh; } break; } } } } return; } // end function estimateHeightError // Estimate the height error at each DEM pixel based on estimates for each image void combineHeightErrors(boost::shared_ptr<HeightErrEstim> const& heightErrEstim, SfsOptions const& opt, vw::cartography::GeoReference const& geo) { // Find the height error from the range of heights vw::ImageView<float> height_error; height_error.set_size(heightErrEstim->height_error_vec.cols(), heightErrEstim->height_error_vec.rows()); for (int col = 0; col < height_error.cols(); col++) { for (int row = 0; row < height_error.rows(); row++) { height_error(col, row) = std::max(-heightErrEstim->height_error_vec(col, row)[0], heightErrEstim->height_error_vec(col, row)[1]); // When we are stuck at the highest error that means we could not find it if (height_error(col, row) == heightErrEstim->max_height_error) height_error(col, row) = heightErrEstim->nodata_height_val; } } vw::TerminalProgressCallback tpc("asp", ": "); bool has_georef = true, has_nodata = true; std::string height_error_file = opt.out_prefix + "-height-error.tif"; vw::vw_out() << "Writing: " << height_error_file << std::endl; vw::cartography::block_write_gdal_image(height_error_file, height_error, has_georef, geo, has_nodata, heightErrEstim->nodata_height_val, opt, tpc); } } // end namespace asp ================================================ FILE: src/asp/SfS/SfsErrorEstim.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsErrorEstim.h // SfS error estimation methods #ifndef __ASP_SFS_SFS_ERROR_ESTIM_H__ #define __ASP_SFS_SFS_ERROR_ESTIM_H__ #include <asp/SfS/SfsOptions.h> #include <vw/Image/ImageView.h> #include <vw/Cartography/GeoReference.h> #include <boost/shared_ptr.hpp> namespace asp { class ReflParams; // Use this struct to keep track of height errors. struct HeightErrEstim { HeightErrEstim(int num_cols, int num_rows, int num_height_samples_in, double max_height_error_in, double nodata_height_val_in, vw::ImageView<double> const* albedo_in); int num_height_samples; vw::ImageView<double> const* albedo; vw::ImageView<vw::Vector2> height_error_vec; int image_iter; double max_height_error; double nodata_height_val; }; // Given the normal (height) to the SfS DEM, find how different // a height can be from this before the computed intensity // due to that height is bigger than max_intensity_err. void estimateHeightError(vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, vw::Vector3 const& cameraPosition, vw::Vector3 const& sunPosition, asp::ReflParams const& refl_params, const double * refl_coeffs, double meas_intensity, double max_intensity_err, int col, int row, double grid_x, double grid_y, int image_iter, asp::SfsOptions const& opt, vw::ImageView<double> const& albedo, asp::HeightErrEstim * heightErrEstim); // Estimate the height error at each DEM pixel based on estimates for each image void combineHeightErrors(boost::shared_ptr<HeightErrEstim> const& heightErrEstim, SfsOptions const& opt, vw::cartography::GeoReference const& geo); } // end namespace asp #endif // __ASP_SFS_SFS_ERROR_ESTIM_H__ ================================================ FILE: src/asp/SfS/SfsImageProc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file SfsImageProc.cc /// Image processing routines for SfS #include <asp/SfS/SfsImageProc.h> #include <asp/SfS/SfsOptions.h> #include <asp/Core/BaseCameraUtils.h> #include <vw/Core/Log.h> #include <vw/Camera/CameraModel.h> #include <vw/Cartography/GeoReference.h> #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/DiskImageView.h> #include <vw/FileIO/GdalWriteOptions.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Image/Transform.h> #include <vw/Image/InpaintView.h> #include <vw/Image/Filter.h> #include <vw/Image/NoDataAlg.h> #include <vw/Image/DistanceFunction.h> #include <vw/Core/ProgressCallback.h> #include <boost/filesystem.hpp> #include <string> namespace fs = boost::filesystem; using namespace vw; namespace asp { // Calculate exposure and haze, and decide if an image should be skipped. void calcExposureHazeSkipImages(// Inputs asp::MaskedDblImgT const& intensity, asp::MaskedDblImgT const& reflectance, double mean_albedo, int image_iter, std::vector<std::string> const& input_images, // In-out std::vector<double> & local_exposures_vec, std::vector<double> & local_haze_vec, std::set<int> & skip_images) { // TODO: Below is not the optimal way of finding the exposure! // Find it as the analytical minimum using calculus. double imgmean, imgstd, refmean, refstd; asp::calcJointStats(intensity, reflectance, imgmean, imgstd, refmean, refstd); double haze = 0.0; if (imgmean > 0 && refmean > 0) { double exposure = imgmean/refmean/mean_albedo; local_exposures_vec[image_iter] = exposure; local_haze_vec[image_iter] = haze; } else { // Skip images with bad exposure. Apparently there is no good // imagery in the area. skip_images.insert(image_iter); // log out the skipped image path and the image_iter for it vw_out() << "Skipped image " << image_iter << ": " << input_images[image_iter] << " with no data for this DEM.\n"; } } // Compute mean and standard deviation of two images. Do it where both are valid. void calcJointStats(MaskedDblImgT const& I1, MaskedDblImgT const& I2, double & mean1, double & std1, double & mean2, double & std2) { if (I1.cols() != I2.cols() || I1.rows() != I2.rows()) vw_throw(ArgumentErr() << "Expecting two input images of same size.\n"); mean1 = 0; std1 = 0; mean2 = 0; std2 = 0; double sum1 = 0.0, sum2 = 0.0, sum1_sq = 0.0, sum2_sq = 0.0, count = 0.0; for (int col = 0; col < I1.cols(); col++) { for (int row = 0; row < I1.rows(); row++) { if (!is_valid(I1(col, row)) || !is_valid(I2(col, row))) continue; count++; double val1 = I1(col, row); sum1 += val1; sum1_sq += val1*val1; double val2 = I2(col, row); sum2 += val2; sum2_sq += val2*val2; } } if (count > 0) { mean1 = sum1/count; std1 = sqrt(sum1_sq/count - mean1*mean1); mean2 = sum2/count; std2 = sqrt(sum2_sq/count - mean2*mean2); } return; } // Given a set of images of same dimensions, find the per-pixel maximum. void maxImage(int cols, int rows, std::set<int> const& skip_images, std::vector<vw::ImageView<double>> const& images, ImageView<double> & max_image) { int num_images = images.size(); max_image.set_size(cols, rows); for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { max_image(col, row) = 0.0; } } for (int image_iter = 0; image_iter < num_images; image_iter++) { if (skip_images.find(image_iter) != skip_images.end()) continue; auto & img = images[image_iter]; // alias if (img.cols() <= 0 || img.rows() <= 0) continue; if (img.cols() != cols || img.rows() != rows) vw::vw_throw(vw::ArgumentErr() << "The input DEM and computed extended images " << "must have the same dimensions.\n"); for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { max_image(col, row) = std::max(max_image(col, row), img(col, row)); } } } return; } // Max image function, but with masked pixels void maxImage(int cols, int rows, std::set<int> const& skip_images, std::vector<MaskedDblImgT> const& images, vw::ImageView<double> & max_image) { int num_images = images.size(); max_image.set_size(cols, rows); for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { // Initialize to 0 max_image(col, row) = 0.0; // Iterate over images, except the skipped ones for (int image_iter = 0; image_iter < num_images; image_iter++) { if (skip_images.find(image_iter) != skip_images.end()) continue; // Skip if meas intensity is invalid if (!is_valid(images[image_iter](col, row))) continue; double inten = images[image_iter](col, row).child(); if (inten > max_image(col, row)) max_image(col, row) = inten; } } } } double maxDemHeight(vw::ImageView<double> const& dem) { double max_dem_height = -std::numeric_limits<double>::max(); for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (dem(col, row) > max_dem_height) { max_dem_height = dem(col, row); } } } return max_dem_height; } // TODO(oalexan1): The albedo must have its own no-data value. // Must check the albedo has everywhere valid values. double meanAlbedo(vw::ImageView<double> const& dem, vw::ImageView<double> const& albedo, double dem_nodata_val) { double mean_albedo = 0.0, albedo_count = 0.0; for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (dem(col, row) != dem_nodata_val) { mean_albedo += albedo(col, row); albedo_count += 1.0; } } } if (albedo_count > 0) mean_albedo /= albedo_count; else mean_albedo = 0.0; // Or some other sensible default return mean_albedo; } // Given an image with float pixels, find the pixels where the image // value is non-positive but some of its neighbors have positive // values. Create an image which has the value 1 at such pixels and // whose values linearly decrease to 0 both in the direction of pixels // with positive and non-positive input values. void boundaryWeight(int blending_dist, ImageView<double> const & image, // inputs ImageView<double> & boundary_weight) { // output double blending_dist_sq = blending_dist * blending_dist; int max_dist_int = ceil(blending_dist); // an int overestimate // Initialize the output to 0 int cols = image.cols(), rows = image.rows(); boundary_weight.set_size(cols, rows); for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { boundary_weight(col, row) = 0.0; } } for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { // Look for a boundary pixel, which is a pixel with non-positive // value but with neighbors with positive value if (image(col, row) > 0) continue; bool is_bd_pix = false; for (int c = col - 1; c <= col + 1; c++) { for (int r = row - 1; r <= row + 1; r++) { if (c < 0 || c >= cols || r < 0 || r >= rows) continue; if (image(c, r) > 0) { is_bd_pix = true; break; // found it } } if (is_bd_pix) break; // found it } if (!is_bd_pix) continue; // did not find it // Found the boundary pixel. Increase the weight in the circular // neighborhood. It will decay to 0 at the boundary of this // neighborhood. for (int c = col - max_dist_int; c <= col + max_dist_int; c++) { for (int r = row - max_dist_int; r <= row + max_dist_int; r++) { if (c < 0 || c >= cols || r < 0 || r >= rows) continue; // Cast to double before multiplying to avoid integer overflow double dsq = double(c - col) * double(c - col) + double(r - row) * double(r - row); // Too far if (dsq >= blending_dist_sq) continue; double d = sqrt(dsq); d = blending_dist - d; // get a cone pointing up, with base at height 0. d /= double(blending_dist); // make it between 0 and 1 d = std::max(d, 0.0); // should not be necessary // Add its contribution boundary_weight(c, r) = std::max(boundary_weight(c, r), d); } } } } return; } // Given an image with non-negative values, create another image // which is 1 where the input image has positive values, and decays // to 0 linearly beyond that. void extendedWeight(int blending_dist, ImageView<double> const & image, // inputs ImageView<double> & extended_weight) { // output int cols = image.cols(), rows = image.rows(); extended_weight.set_size(cols, rows); for (int col = 0; col < image.cols(); col++) { for (int row = 0; row < image.rows(); row++) { extended_weight(col, row) = (image(col, row) > 0); } } double blending_dist_sq = blending_dist * blending_dist; int max_dist_int = ceil(blending_dist); // an int overestimate for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { // Look for a boundary pixel, which is a pixel with zero // weight but with neighbors with positive weight if (image(col, row) > 0) continue; bool is_bd_pix = false; for (int c = col - 1; c <= col + 1; c++) { for (int r = row - 1; r <= row + 1; r++) { if (c < 0 || c >= cols || r < 0 || r >= rows) continue; if (image(c, r) > 0) { is_bd_pix = true; break; // found it } } if (is_bd_pix) break; // found it } if (!is_bd_pix) continue; // did not find it // Found the boundary pixel. Increase the weight in the // circular neighborhood. It will still be below 1 // and decay to 0 at the boundary of this neighborhood. for (int c = col - max_dist_int; c <= col + max_dist_int; c++) { for (int r = row - max_dist_int; r <= row + max_dist_int; r++) { if (c < 0 || c >= cols || r < 0 || r >= rows) continue; // Cast to double before multiplying to avoid integer overflow double dsq = double(c - col) * double(c - col) + double(r - row) * double(r - row); // Too far if (dsq >= blending_dist_sq) continue; double d = sqrt(dsq); d = blending_dist - d; // get a cone pointing up, with base at height 0. d /= double(blending_dist); // make it between 0 and 1 d = std::max(d, 0.0); // should not be necessary // Add its contribution extended_weight(c, r) = std::max(extended_weight(c, r), d); } } } } return; } // Saves the weights corresponding to mapprojected images void saveWeights(std::set<int> const& skip_images, std::string const& out_prefix, std::vector<std::string> const& input_images, std::vector<std::string> const& input_cameras, std::string const& tag, std::vector<vw::ImageView<double>> const& ground_weights, vw::cartography::GeoReference const& geo, vw::GdalWriteOptions const& opt) { int num_images = input_images.size(); float img_nodata_val = -std::numeric_limits<float>::max(); // part of api for (int image_iter = 0; image_iter < num_images; image_iter++) { if (skip_images.find(image_iter) != skip_images.end()) continue; std::string out_camera_file = asp::bundle_adjust_file_name(out_prefix, input_images[image_iter], input_cameras[image_iter]); std::string local_prefix = fs::path(out_camera_file).replace_extension("").string(); bool has_georef = true, has_nodata = false; std::string ground_weight_file = local_prefix + "-" + tag + "_weight.tif"; vw_out() << "Writing: " << ground_weight_file << std::endl; vw::cartography::block_write_gdal_image(ground_weight_file, ground_weights[image_iter], has_georef, geo, has_nodata, img_nodata_val, opt, TerminalProgressCallback("asp", ": ")); } } // Adjust the weights at the boundary of the max-lit region // so they don't decay to 0, as there we need all the image data // we get, and there's no concern that we'll create a seam // with some other better data. Weights which are already 0 by then // but are non-zero close to that interface get grown too, depending, // on how close they get to that interface. // We do not recompute these weights as the DEM changes, which is an approximation. void adjustBorderlineDataWeights(int cols, int rows, int blending_dist, double blending_power, vw::GdalWriteOptions const& opt, vw::cartography::GeoReference const& geo, std::set<int> const& skip_images, std::string const& out_prefix, // for debug data std::vector<std::string> const& input_images, std::vector<std::string> const& input_cameras, std::vector<vw::ImageView<double>> & ground_weights) { int num_images = ground_weights.size(); // Find the max per-pixel weight ImageView<double> max_weight; maxImage(cols, rows, skip_images, ground_weights, max_weight); // output // Find a weight which is 1 at the max-lit/unlit interface and decaying linearly // to 0. ImageView<double> boundary_weight; boundaryWeight(blending_dist, max_weight, // inputs boundary_weight); // output // Weights at the boundary of the max lit mosaic are not allowed to decay // all the way to 0 as they are not needed for blending there, and // just result in blur. for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { if (max_weight(col, row) <= 0 || boundary_weight(col, row) <= 0) continue; // not in the region of interest for (int image_iter = 0; image_iter < num_images; image_iter++) { if (skip_images.find(image_iter) != skip_images.end()) continue; // Undo the power in the weight being passed in double ground_wt = ground_weights[image_iter](col, row); if (ground_wt <= 0.0) continue; double max_wt = max_weight(col, row); ground_wt = pow(ground_wt, 1.0/blending_power); max_wt = pow(max_wt, 1.0/blending_power); // The closer one is to the max-lit boundary, the more this // weight is important ground_wt = std::max(ground_wt, ground_wt / max_wt); ground_wt = std::min(ground_wt, 1.0); // not necessary // put back the power ground_wt = pow(ground_wt, blending_power); // Put back the weight ground_weights[image_iter](col, row) = ground_wt; } } } // TODO(oalexan1): Must make sure to make the images have // non-negative but valid values where the weights are positive and // invalid values where they are zero. bool save_debug_info = false; if (save_debug_info) { bool has_georef = true, has_nodata = false; float img_nodata_val = -std::numeric_limits<float>::max(); // part of api std::string max_weight_file = out_prefix + "-max_weight.tif"; vw_out() << "Writing: " << max_weight_file << std::endl; vw::cartography::block_write_gdal_image(max_weight_file, max_weight, has_georef, geo, has_nodata, img_nodata_val, opt, TerminalProgressCallback("asp", ": ")); std::string boundary_weight_file = out_prefix + "-boundary_weight.tif"; vw_out() << "Writing: " << boundary_weight_file << std::endl; vw::cartography::block_write_gdal_image(boundary_weight_file, boundary_weight, has_georef, geo, has_nodata, img_nodata_val, opt, TerminalProgressCallback("asp", ": ")); // Save the adjusted ground weights saveWeights(skip_images, out_prefix, input_images, input_cameras, "ground", ground_weights, geo, opt); } // end saving debug info return; } // Find the blending weight for an image. This is 1 inside the lit area and away // from any edges or shadows, then linearly decrease to 0 towards such edges, // and then is raised to a power to change how it decays to 0. // Do not make these decrease around holes smaller than min_blend_size, // TODO(oalexan1): Grassfire weights use the Manhattan distance, which // result in noisy weights. The Euclidean distance to boundary would work // better. vw::ImageView<double> blendingWeights(MaskedImgRefT const& img, double blending_dist, double blending_power, int min_blend_size) { // if (img.cols() <= 2 || img.rows() <= 2) { // // The image is too small to have good weights. grassfire crashes. // ImageView<double> weights(img.cols(), img.rows()); // for (int col = 0; col < weights.cols(); col++) { // for (int row = 0; row < weights.rows(); row++) { // weights(col, row) = 0; // } // } // return weights; // } ImageView<double> weights; // The copying seems necessary at each stage to get the correct answer if (min_blend_size <= 0) weights = grassfire(img); else weights = vw::copy(grassfire(vw::copy(vw::fill_holes_grass(vw::copy(img), min_blend_size)))); // We will later count on this precise logic. for (int col = 0; col < weights.cols(); col++) { for (int row = 0; row < weights.rows(); row++) { weights(col, row) = pow(std::min(weights(col, row)/blending_dist, 1.0), blending_power); } } return weights; } // Find the points on a given DEM that are shadowed by other points of // the DEM. Start marching from the point on the DEM on a ray towards // the sun in small increments, until hitting the maximum DEM height. bool isInShadow(int col, int row, Vector3 const& sunPos, ImageView<double> const& dem, double max_dem_height, double gridx, double gridy, cartography::GeoReference const& geo) { // Here bicubic interpolation won't work. It is easier to interpret // the DEM as piecewise-linear when dealing with rays intersecting // it. InterpolationView<EdgeExtensionView< ImageView<double>, ConstantEdgeExtension >, BilinearInterpolation> interp_dem = interpolate(dem, BilinearInterpolation(), ConstantEdgeExtension()); // The xyz position at the center grid point Vector2 dem_llh = geo.pixel_to_lonlat(Vector2(col, row)); Vector3 dem_lonlat_height = Vector3(dem_llh(0), dem_llh(1), dem(col, row)); Vector3 xyz = geo.datum().geodetic_to_cartesian(dem_lonlat_height); // Normalized direction from the view point Vector3 dir = sunPos - xyz; if (dir == Vector3()) return false; dir = dir/norm_2(dir); // The projection of dir onto the tangent plane at xyz, // that is, the "horizontal" component at the current sphere surface. Vector3 dir2 = dir - dot_prod(dir, xyz)*xyz/dot_prod(xyz, xyz); // Ensure that we advance by at most half a grid point each time double delta = 0.5*std::min(gridx, gridy)/std::max(norm_2(dir2), 1e-16); // Go along the ray. Don't allow the loop to go forever. for (int i = 1; i < 10000000; i++) { Vector3 ray_P = xyz + i * delta * dir; Vector3 ray_llh = geo.datum().cartesian_to_geodetic(ray_P); if (ray_llh[2] > max_dem_height) { // We're above the highest terrain, no point in continuing return false; } // Compensate for any longitude 360 degree offset, e.g., 270 deg vs -90 deg ray_llh[0] += 360.0*round((dem_llh[0] - ray_llh[0])/360.0); Vector2 ray_pix = geo.lonlat_to_pixel(Vector2(ray_llh[0], ray_llh[1])); if (ray_pix[0] < 0 || ray_pix[0] > dem.cols() - 1 || ray_pix[1] < 0 || ray_pix[1] > dem.rows() - 1) { return false; // got out of the DEM, no point continuing } // Dem height at the current point on the ray double dem_h = interp_dem(ray_pix[0], ray_pix[1]); if (ray_llh[2] < dem_h) { // The ray goes under the DEM, so we are in shadow. return true; } } return false; } void areInShadow(Vector3 const& sunPos, ImageView<double> const& dem, double gridx, double gridy, cartography::GeoReference const& geo, ImageView<float> & shadow) { // Find the max DEM height double max_dem_height = -std::numeric_limits<double>::max(); for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (dem(col, row) > max_dem_height) { max_dem_height = dem(col, row); } } } shadow.set_size(dem.cols(), dem.rows()); for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { shadow(col, row) = isInShadow(col, row, sunPos, dem, max_dem_height, gridx, gridy, geo); } } } // Prototype code to identify permanently shadowed areas // and deepen the craters there. Needs to be integrated // and tested with various shapes of the deepened crater. void deepenCraters(std::string const& dem_file, std::vector<std::string> const& image_files, double sigma, std::string const& max_img_file, std::string const& grass_file, std::string const& out_dem_file) { float dem_nodata_val = -std::numeric_limits<float>::max(); if (vw::read_nodata_val(dem_file, dem_nodata_val)) vw_out() << "Dem nodata: " << dem_nodata_val << "\n"; ImageView<PixelMask<float>> dem (create_mask(DiskImageView<float>(dem_file), dem_nodata_val)); vw::cartography::GeoReference georef; if (!read_georeference(georef, dem_file)) vw_throw(ArgumentErr() << "The input DEM " << dem_file << " has no georeference.\n"); // The maximum of all valid pixel values with no-data where there is no-valid data. ImageView<PixelMask<float>> max_img(dem.cols(), dem.rows()); for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { max_img(col, row) = dem_nodata_val; max_img(col, row).invalidate(); } } for (int i = 1; i < image_files.size(); i++) { std::string img_file = image_files[i]; float img_nodata_val = -std::numeric_limits<float>::max(); if (vw::read_nodata_val(img_file, img_nodata_val)) { vw_out() << "Img nodata: " << img_nodata_val << std::endl; } ImageView<PixelMask<float>> img(create_mask(DiskImageView<float>(img_file), img_nodata_val)); if (img.cols() != dem.cols() || img.rows() != dem.rows()) { vw_throw(ArgumentErr() << "Images and DEM must have same size.\n"); } for (int col = 0; col < img.cols(); col++) { for (int row = 0; row < img.rows(); row++) { // Nothing to do if the current image has invalid data if (!is_valid(img(col, row))) continue; // If the output image is not valid yet, copy the current image's valid pixel if (!is_valid(max_img(col, row) && img(col, row).child() > 0)) { max_img(col, row) = img(col, row); continue; } // Now both the current image and the output image are valid if (img(col, row).child() > max_img(col, row).child() && img(col, row).child() > 0) { max_img(col, row) = img(col, row); } } } } // At the boundary the intensity is always invalid, but that is due to // computational limitations. Make it valid if we can. // TODO: Test here that the image has at least 3 rows and 3 cols! for (int col = 0; col < max_img.cols(); col++) { for (int row = 0; row < max_img.rows(); row++) { if ((col == 0 || col == max_img.cols() - 1) || (row == 0 || row == max_img.rows() - 1)) { int next_col = col, next_row = row; if (col == 0) next_col = 1; if (col == max_img.cols() - 1) next_col = max_img.cols() - 2; if (row == 0) next_row = 1; if (row == max_img.rows() - 1) next_row = max_img.rows() - 2; if (!is_valid(max_img(col, row)) && is_valid(max_img(next_col, next_row))) max_img(col, row) = max_img(next_col, next_row); } } } GdalWriteOptions opt; bool has_nodata = true, has_georef = true; TerminalProgressCallback tpc("", "\t--> "); vw_out() << "Writing: " << max_img_file << "\n"; block_write_gdal_image(max_img_file, apply_mask(max_img, dem_nodata_val), has_georef, georef, has_nodata, dem_nodata_val, opt, tpc); ImageView<double> grass = grassfire(notnodata(select_channel(max_img, 0), dem_nodata_val)); // Scale as craters are shallow. // TODO: Need to think of a better algorithm! for (int col = 0; col < grass.cols(); col++) { for (int row = 0; row < grass.rows(); row++) { grass(col, row) *= 0.2; } } // Blur with a given sigma ImageView<double> blurred_grass; if (sigma > 0) blurred_grass = gaussian_filter(grass, sigma); else blurred_grass = copy(grass); vw_out() << "Writing: " << grass_file << "\n"; bool grass_has_nodata = false; block_write_gdal_image(grass_file, blurred_grass, has_georef, georef, grass_has_nodata, dem_nodata_val, opt, tpc); // Bias the DEM by that grassfire height deepening the craters for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (is_valid(dem(col, row))) { dem(col, row).child() -= blurred_grass(col, row); } } } vw_out() << "Writing: " << out_dem_file << "\n"; block_write_gdal_image(out_dem_file, apply_mask(dem, dem_nodata_val), has_georef, georef, has_nodata, dem_nodata_val, opt, tpc); } // Sample large DEMs. Keep about num_samples row and column samples. void calcSampleRates(vw::ImageViewRef<double> const& dem, int num_samples, int & sample_col_rate, int & sample_row_rate) { if (num_samples <= 0) vw_throw(ArgumentErr() << "Expecting a positive number of samples.\n"); sample_col_rate = std::max((int)round(dem.cols()/double(num_samples)), 1); sample_row_rate = std::max((int)round(dem.rows()/double(num_samples)), 1); } // Compute a full-resolution image by specific interpolation into a low-resolution // one. The full-res image may not fit in memory, so we need to compute it in tiles. // See computeReflectanceAndIntensity() for low-res vs full-res relationship. SfsInterpView::SfsInterpView(int full_res_cols, int full_res_rows, int sample_col_rate, int sample_row_rate, vw::ImageView<float> const& lowres_img): m_full_res_cols(full_res_cols), m_full_res_rows(full_res_rows), m_sample_col_rate(sample_col_rate), m_sample_row_rate(sample_row_rate), m_lowres_img(lowres_img) { } // Per-pixel operation not implemented SfsInterpView::pixel_type SfsInterpView::operator()(double/*i*/, double/*j*/, vw::int32/*p*/) const { vw::vw_throw(vw::NoImplErr() << "SfsInterpView::operator()(...) is not implemented"); return SfsInterpView::pixel_type(); } // Per-tile operation SfsInterpView::prerasterize_type SfsInterpView::prerasterize(vw::BBox2i const& bbox) const { vw::InterpolationView<vw::EdgeExtensionView<vw::ImageView<float>, vw::ConstantEdgeExtension>, vw::BilinearInterpolation> interp_lowres_img = vw::interpolate(m_lowres_img, vw::BilinearInterpolation(), vw::ConstantEdgeExtension()); // Great care is needed here to reverse the resampling done in // computeReflectanceAndIntensity. vw::ImageView<result_type> tile(bbox.width(), bbox.height()); for (int col = bbox.min().x(); col < bbox.max().x(); col++) { for (int row = bbox.min().y(); row < bbox.max().y(); row++) { double valx = (col - 1.0) / double(m_sample_col_rate) + 1.0; double valy = (row - 1.0) / double(m_sample_row_rate) + 1.0; tile(col - bbox.min().x(), row - bbox.min().y()) = interp_lowres_img(valx, valy); } } return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } // Factor out the logic for updating masks and weights void updateMasksWeights(SfsOptions const& opt, int num_images, std::vector<vw::BBox2i> const& crop_boxes, std::vector<vw::ImageView<double>> & ground_weights, float & img_nodata_val, std::vector<MaskedImgRefT> & masked_images, std::vector<vw::ImageView<double>> & blend_weights) { // Redo the image masks. Unlike before, the shadow threshold is set to 0 // to allow shadow pixels. The weights will control how much of these // are actually used. This approach is better than a hard cutoff with the mask. for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; std::string img_file = opt.input_images[image_iter]; vw::read_nodata_val(img_file, img_nodata_val); float shadow_thresh = 0.0; // Note how the shadow thresh is now 0, unlike before // Make a copy in memory for faster access if (!crop_boxes[image_iter].empty()) { vw::ImageView<float> cropped_img = crop(DiskImageView<float>(img_file), crop_boxes[image_iter]); masked_images[image_iter] = create_pixel_range_mask2(cropped_img, std::max(img_nodata_val, shadow_thresh), opt.max_valid_image_vals_vec[image_iter]); // Overwrite the blending weights with ground weights blend_weights[image_iter] = copy(ground_weights[image_iter]); } } ground_weights.clear(); // not needed anymore } // Pixels in low-light are given less weight if at the same location // there exist pixels in other images with stronger light. This if a fix // for seams. Must be used only in clips known to have seams. void handleLowLight(SfsOptions const& opt, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, std::vector<MaskedDblImgT> const& meas_intensities, std::vector<MaskedDblImgT> const& sim_intensities, std::vector<vw::ImageView<double>> & blend_weights) { int num_images = meas_intensities.size(); // Find the max meas image vw::ImageView<double> max_intensity; maxImage(dem.cols(), dem.rows(), opt.skip_images, meas_intensities, max_intensity); // output // Find the error images and median error std::vector<ImageView<double>> err(num_images); std::vector<double> errs; for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; err[image_iter].set_size(dem.cols(), dem.rows()); for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { // Initalize these to 0, except for skipped images err[image_iter](col, row) = 0.0; // Find the meas and comp intensities auto meas_intensity = meas_intensities[image_iter](col, row); auto sim_intensity = sim_intensities[image_iter](col, row); // Set to zero if either intensity is invalid or meas intensity is below // shadow threshold if (!is_valid(meas_intensity) || !is_valid(sim_intensity) || meas_intensity.child() <= opt.shadow_threshold_vec[image_iter]) { err[image_iter](col, row) = 0.0; continue; } double curr_err = std::abs(meas_intensity.child() - sim_intensity.child()); errs.push_back(curr_err); err[image_iter](col, row) = curr_err; } } } double median_err = 0.0; if (!errs.empty()) median_err = vw::math::destructive_median(errs); // Find the adjustment weights for low light std::vector<ImageView<double>> adj_weights(num_images); for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; adj_weights[image_iter].set_size(dem.cols(), dem.rows()); for (int col = 0; col < adj_weights[image_iter].cols(); col++) { for (int row = 0; row < adj_weights[image_iter].rows(); row++) { // Initalize these to 1, except for skipped images adj_weights[image_iter](col, row) = 1.0; // Where the blend weights are 0, this weight will be 0 too if (blend_weights[image_iter](col, row) == 0.0) { adj_weights[image_iter](col, row) = 0.0; continue; } // Find the curr intensity double curr_intensity = meas_intensities[image_iter](col, row).child(); // Skip if curr intensity equals max intensity, to respect // --adjust-borderline-data if (curr_intensity == max_intensity(col, row) && !opt.erode_seams) continue; // Skip if meas intensity is above the low light threshold if (curr_intensity > opt.low_light_threshold) continue; double err_ratio = 1.0; double curr_err = err[image_iter](col, row); if (curr_err > 0.0 && curr_err >= median_err) err_ratio = median_err / curr_err; // Need to raise this to a power, to greatly decrease the weight adj_weights[image_iter](col, row) = pow(err_ratio, opt.low_light_weight_power); } } } // Blur the adjustment weights. This may cause some erosion // TODO(oalexan1): How to do a more surgical job here? Now the adjusted weights // attenuated due to this blur multiply weights attenuated in the blend_weights. for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; adj_weights[image_iter] = gaussian_filter(adj_weights[image_iter], opt.low_light_blur_sigma); } // Adjust the blending weights by multiplying them with the adj weights for low light. for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; for (int col = 0; col < blend_weights[image_iter].cols(); col++) { for (int row = 0; row < blend_weights[image_iter].rows(); row++) { blend_weights[image_iter](col, row) *= adj_weights[image_iter](col, row); } } } // This is helpful for debugging seams issues if (false) { asp::saveWeights(opt.skip_images, opt.out_prefix, opt.input_images, opt.input_cameras, "adj", adj_weights, geo, vw::GdalWriteOptions(opt)); asp::saveWeights(opt.skip_images, opt.out_prefix, opt.input_images, opt.input_cameras, "blend", blend_weights, geo, vw::GdalWriteOptions(opt)); } } // end function handleLowLight // This will adjust the weights to account for borderline pixels and low-light conditions. // The blend weights and masked images are modified in place. void handleBorderlineAndLowLight(SfsOptions & opt, int num_images, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, std::vector<BBox2i> const& crop_boxes, std::vector<MaskedDblImgT> const& meas_intensities, std::vector<MaskedDblImgT> const& sim_intensities, // Outputs float & img_nodata_val, std::vector<MaskedImgRefT> & masked_images, std::vector<vw::ImageView<double>> & blend_weights, bool & blend_weight_is_ground_weight, std::vector<ImageView<double>> & ground_weights) { // Use the ground weights from now on instead of in-camera blending weights. // Will overwrite the weights below. blend_weight_is_ground_weight = true; // TODO(oalexan1): These weights should be created before any calculation // of intensity. As of now, they kick after that, and before iterative // SfS. Must check the effect of that. Should result in minor changes to // exposure only. int cols = dem.cols(), rows = dem.rows(); asp::adjustBorderlineDataWeights(cols, rows, opt.blending_dist, opt.blending_power, vw::GdalWriteOptions(opt), // slice geo, opt.skip_images, opt.out_prefix, opt.input_images, opt.input_cameras, ground_weights); // output // Recreate the the masked images and overwrite the blending weights asp::updateMasksWeights(opt, num_images, crop_boxes, ground_weights, img_nodata_val, masked_images, blend_weights); // Handle --low-light-threshold option if (opt.low_light_threshold > 0.0) handleLowLight(opt, dem, geo, meas_intensities, sim_intensities, blend_weights); } // end function handleBorderlineAndLowLight // Find the clamped signed distance to the boundary. Here it is assumed that // there is a region in which lit_grass_dist is positive, while in its // complement the shadow_grass_dist is positive. The boundary is where both are // no more than 1 in value. Likely this logic could be made more generic. vw::ImageView<double> calcClampedBdDist(vw::ImageView<float> const& lit_grass_dist, vw::ImageView<float> const& shadow_grass_dist, double lit_blend_length, double shadow_blend_length) { if (lit_grass_dist.cols() != shadow_grass_dist.cols() || lit_grass_dist.rows() != shadow_grass_dist.rows()) vw::vw_throw(vw::ArgumentErr() << "Input images to calcClampedBdDist must have the same dimensions."); vw::ImageView<double> dist_to_bd; dist_to_bd.set_size(lit_grass_dist.cols(), lit_grass_dist.rows()); for (int col = 0; col < lit_grass_dist.cols(); col++) { for (int row = 0; row < lit_grass_dist.rows(); row++) { if (lit_grass_dist(col, row) > 1.5 * lit_blend_length) { // Too far in the lit region dist_to_bd(col, row) = lit_blend_length; // clamp at the blending length continue; } if (shadow_grass_dist(col, row) > 1.5 * shadow_blend_length) { // Too far in the shadow region dist_to_bd(col, row) = -shadow_blend_length; continue; } // Find the shortest Euclidean distance to the no-data region. double max_dist = std::max(lit_blend_length, shadow_blend_length); double signed_dist = 0.0; if (lit_grass_dist(col, row) > 0) { signed_dist = lit_blend_length; } else if (shadow_grass_dist(col, row) > 0) { signed_dist = -shadow_blend_length; } for (int col2 = std::max(0.0, col - max_dist); col2 <= std::min(lit_grass_dist.cols() - 1.0, col + max_dist); col2++) { // Estimate the range of rows for the circle with given radius // at given col value. double ht_val = ceil(sqrt(double(max_dist * max_dist) - double((col - col2) * (col - col2)))); for (int row2 = std::max(0.0, row - ht_val); row2 <= std::min(lit_grass_dist.rows() - 1.0, row + ht_val); row2++) { if (lit_grass_dist(col2, row2) > 1 || shadow_grass_dist(col2, row2) > 1) continue; // not at the boundary // See if the current point is closer than anything so far double curr_dist = sqrt(double(col - col2) * (col - col2) + double(row - row2) * (row - row2)); if (lit_grass_dist(col, row) > 0) { if (curr_dist < signed_dist) signed_dist = curr_dist; } else if (shadow_grass_dist(col, row) > 0) { if (curr_dist < -signed_dist) signed_dist = -curr_dist; } } } // The closest we've got dist_to_bd(col, row) = signed_dist; } } return dist_to_bd; } // Calc the weight for option --curvature-in-shadow-weight void calcCurvatureInShadowWeight(asp::SfsOptions const& opt, vw::ImageView<int> const& lit_image_mask, vw::cartography::GeoReference const& geo, vw::ImageView<double> & curvature_in_shadow_weight) { TerminalProgressCallback tpc("asp", ": "); bool has_georef = true, has_nodata = false; double nodata_val = -1; // will not be used std::string lit_image_mask_file = opt.out_prefix + "-lit_image_mask.tif"; vw_out() << "Writing: " << lit_image_mask_file << std::endl; block_write_gdal_image(lit_image_mask_file, lit_image_mask, has_georef, geo, has_nodata, nodata_val, opt, tpc); // Form the curvature_in_shadow_weight image. It will start at 0 // at distance opt.lit_curvature_dist from the shadow // boundary in the lit area, and then reach value // opt.curvature_in_shadow_weight when at distance // opt.shadow_curvature_dist from the boundary in the shadowed // area. This is done to avoid boundary artifacts. double max_dist = std::max(opt.lit_curvature_dist, opt.shadow_curvature_dist); vw::bounded_signed_dist<int>(vw::create_mask(lit_image_mask, 0), max_dist, curvature_in_shadow_weight); // Do further adjustments for (int col = 0; col < curvature_in_shadow_weight.cols(); col++) { for (int row = 0; row < curvature_in_shadow_weight.rows(); row++) { double val = curvature_in_shadow_weight(col, row); val = std::min(val, opt.lit_curvature_dist); val = std::max(val, -opt.shadow_curvature_dist); val = (opt.lit_curvature_dist - val) / (opt.lit_curvature_dist + opt.shadow_curvature_dist); curvature_in_shadow_weight(col, row) = val * opt.curvature_in_shadow_weight; } } std::string curvature_in_shadow_weight_file = opt.out_prefix + "-curvature_in_shadow_weight.tif"; vw_out() << "Writing: " << curvature_in_shadow_weight_file << std::endl; block_write_gdal_image(curvature_in_shadow_weight_file, curvature_in_shadow_weight, has_georef, geo, has_nodata, nodata_val, opt, tpc); } // end computing curvature_in_shadow_weight // Save the measured and computed intensity images void saveIntensities(SfsOptions const& opt, std::string const& input_image, std::string const& input_camera, vw::cartography::GeoReference const& geo, MaskedDblImgT const& meas_intensity, MaskedDblImgT const& sim_intensity, float img_nodata_val) { bool has_georef = true, has_nodata = true; std::string out_camera_file = asp::bundle_adjust_file_name(opt.out_prefix, input_image, input_camera); std::string local_prefix = fs::path(out_camera_file).replace_extension("").string(); if (opt.save_meas_intensity_only) { std::string out_meas_intensity_file = local_prefix + "-meas-intensity.tif"; vw::vw_out() << "Writing: " << out_meas_intensity_file << "\n"; vw::TerminalProgressCallback tpc("asp", ": "); vw::cartography::block_write_gdal_image(out_meas_intensity_file, vw::apply_mask(meas_intensity, img_nodata_val), has_georef, geo, has_nodata, img_nodata_val, opt, tpc); } if (opt.save_sim_intensity_only) { std::string out_sim_intensity_file = local_prefix + "-sim-intensity.tif"; vw::vw_out() << "Writing: " << out_sim_intensity_file << "\n"; vw::TerminalProgressCallback tpc("asp", ": "); vw::cartography::block_write_gdal_image(out_sim_intensity_file, vw::apply_mask(sim_intensity, img_nodata_val), has_georef, geo, has_nodata, img_nodata_val, opt, tpc); } } // Given the albedo image, and the valid mask, in-fill from valid pixels to // invalid ones using 3x3 neighborhood averaging. Do a single pass. This is // mostly to resolve boundary issues. This updates the mask as well. void inFillImage3x3(vw::ImageView<double> & image, vw::ImageView<int> & valid_mask) { // Check that these two have the same size if (image.cols() != valid_mask.cols() || image.rows() != valid_mask.rows()) { vw::vw_throw(vw::ArgumentErr() << "inFillImage3x3(): image and valid_mask must have the same size.\n"); } int cols = image.cols(); int rows = image.rows(); // Make a copy of the input that will be kept constant during the iterations vw::ImageView<double> image_copy = image; vw::ImageView<int> valid_mask_copy = valid_mask; for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { if (valid_mask_copy(col, row) == 1) continue; double sum = 0.0; int count = 0; // Check the 3x3 neighborhood for (int ncol = -1; ncol <= 1; ncol++) { for (int nrow = -1; nrow <= 1; nrow++) { int c = col + ncol; int r = row + nrow; if (c < 0 || c >= cols || r < 0 || r >= rows) continue; if (valid_mask_copy(c, r) == 1) { sum += image_copy(c, r); count++; } } } if (count > 0) { image(col, row) = sum / double(count); valid_mask(col, row) = 1; } } // end row } // end col } // end function inFillImage3x3() } // end namespace asp ================================================ FILE: src/asp/SfS/SfsImageProc.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file SfsImageProc.h /// Image processing routines for SfS #ifndef __SFS_IMAGE_PROC_H__ #define __SFS_IMAGE_PROC_H__ #include <vw/Image/ImageViewRef.h> #include <vw/Image/PerPixelViews.h> #include <string> #include <vector> #include <set> namespace vw { class GdalWriteOptions; namespace cartography { class GeoReference; } } namespace asp { class SfsOptions; typedef vw::ImageViewRef<vw::PixelMask<float>> MaskedImgRefT; typedef vw::ImageView<vw::PixelMask<double>> MaskedDblImgT; typedef vw::ImageView<double> DblImgT; // Calculate exposure and haze, and decide if an image should be skipped. void calcExposureHazeSkipImages(// Inputs asp::MaskedDblImgT const& intensity, asp::MaskedDblImgT const& reflectance, double mean_albedo, int image_iter, std::vector<std::string> const& input_images, // In-out std::vector<double> & local_exposures_vec, std::vector<double> & local_haze_vec, std::set<int> & skip_images); // Compute mean and standard deviation of two images. Do it where both are valid. void calcJointStats(MaskedDblImgT const& I1, MaskedDblImgT const& I2, double & mean1, double & std1, double & mean2, double & std2); void maxImage(int cols, int rows, std::set<int> const& skip_images, std::vector<vw::ImageView<double>> const& images, vw::ImageView<double> & max_image); // Find the per-pixel maximum of a set of masked images void maxImage(int cols, int rows, std::set<int> const& skip_images, std::vector<MaskedDblImgT> const& meas_intensities, vw::ImageView<double> & max_intensity); // See the .cc file for the documentation. void adjustBorderlineDataWeights(int cols, int rows, int blending_dist, double blending_power, vw::GdalWriteOptions const& opt, vw::cartography::GeoReference const& geo, std::set<int> const& skip_images, std::string const& out_prefix, // for debug data std::vector<std::string> const& input_images, std::vector<std::string> const& input_cameras, std::vector<vw::ImageView<double>> & ground_weights); // This will adjust the weights to account for borderline pixels and low-light conditions. // The blend weights and masked images are modified in place. void handleBorderlineAndLowLight(SfsOptions & opt, int num_images, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, std::vector<vw::BBox2i> const& crop_boxes, std::vector<MaskedDblImgT> const& meas_intensities, std::vector<MaskedDblImgT> const& sim_intensities, // Outputs float & img_nodata_val, std::vector<MaskedImgRefT> & masked_images, std::vector<vw::ImageView<double>> & blend_weights, bool & blend_weight_is_ground_weight, std::vector<vw::ImageView<double>> & ground_weights); // See the .cc file for the documentation. vw::ImageView<double> blendingWeights(MaskedImgRefT const& img, double blending_dist, double blending_power, int min_blend_size); // Find the points on a given DEM that are shadowed by other points of // the DEM. Start marching from the point on the DEM on a ray towards // the sun in small increments, until hitting the maximum DEM height. bool isInShadow(int col, int row, vw::Vector3 const& sunPos, vw::ImageView<double> const& dem, double max_dem_height, double gridx, double gridy, vw::cartography::GeoReference const& geo); void areInShadow(vw::Vector3 const& sunPos, vw::ImageView<double> const& dem, double gridx, double gridy, vw::cartography::GeoReference const& geo, vw::ImageView<float> & shadow); // Prototype code to identify permanently shadowed areas // and deepen the craters there. Needs to be integrated // and tested with various shapes of the deepened crater. void deepenCraters(std::string const& dem_file, std::vector<std::string> const& image_files, double sigma, std::string const& max_img_file, std::string const& grass_file, std::string const& out_dem_file); // Sample large DEMs. Keep about num_samples row and column samples. void calcSampleRates(vw::ImageViewRef<double> const& dem, int num_samples, int & sample_col_rate, int & sample_row_rate); // TODO(oalexan1): The albedo must have its own no-data value. // Must check the albedo has everywhere valid values. double meanAlbedo(vw::ImageView<double> const& dem, vw::ImageView<double> const& albedo, double dem_nodata_val); double maxDemHeight(vw::ImageView<double> const& dem); // Find the clamped signed distance to the boundary. Here it is assumed that // there is a region in which lit_grass_dist is positive, while in its // complement the shadow_grass_dist is positive. The boundary is where both are // no more than 1 in value. Likely this logic could be made more generic. vw::ImageView<double> calcClampedBdDist(vw::ImageView<float> const& lit_grass_dist, vw::ImageView<float> const& shadow_grass_dist, double lit_blend_length, double shadow_blend_length); // Calc the weight for option --curvature-in-shadow-weight void calcCurvatureInShadowWeight(asp::SfsOptions const& opt, vw::ImageView<int> const& lit_image_mask, vw::cartography::GeoReference const& geo, vw::ImageView<double> & curvature_in_shadow_weight); // Save the measured and computed intensity images void saveIntensities(SfsOptions const& opt, std::string const& input_image, std::string const& input_camera, vw::cartography::GeoReference const& geo, MaskedDblImgT const& meas_intensity, MaskedDblImgT const& sim_intensity, float img_nodata_val); // Given the albedo image, and the valid mask, in-fill from valid pixels to // invalid ones using 3x3 neighborhood averaging. Do a single pass. This is // mostly to resolve boundary issues. This updates the mask as well. void inFillImage3x3(vw::ImageView<double> & image, vw::ImageView<int> & valid_mask); // Compute a full-resolution image by specific interpolation into a low-resolution // one. The full-res image may not fit in memory, so we need to compute it in tiles. // See computeReflectanceAndIntensity() for low-res vs full-res relationship. class SfsInterpView: public vw::ImageViewBase<SfsInterpView> { int m_full_res_cols, m_full_res_rows; int m_sample_col_rate, m_sample_row_rate; vw::ImageView<float> const& m_lowres_img; typedef float PixelT; public: SfsInterpView(int full_res_cols, int full_res_rows, int sample_col_rate, int sample_row_rate, vw::ImageView<float> const& lowres_img); typedef PixelT pixel_type; typedef PixelT result_type; typedef vw::ProceduralPixelAccessor<SfsInterpView> pixel_accessor; inline vw::int32 cols() const { return m_full_res_cols; } inline vw::int32 rows() const { return m_full_res_rows; } inline vw::int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } pixel_type operator()(double/*i*/, double/*j*/, vw::int32/*p*/ = 0) const; typedef vw::CropView<vw::ImageView<pixel_type>> prerasterize_type; prerasterize_type prerasterize(vw::BBox2i const& bbox) const; template <class DestT> inline void rasterize(DestT const& dest, vw::BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; } // end namespace asp #endif // __SFS_IMAGE_PROC_H__ ================================================ FILE: src/asp/SfS/SfsModel.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsModel.cc // Modeling reflectance, intensity, albedo for SfS #include <asp/SfS/SfsModel.h> #include <asp/SfS/SfsOptions.h> #include <asp/SfS/SfsErrorEstim.h> #include <asp/SfS/SfsImageProc.h> #include <vw/Cartography/GeoReference.h> #include <vw/Image/Interpolation.h> namespace asp { using namespace vw; // Computes the Lambertian reflectance model (cosine of the light // direction and the normal to the Moon) Vector3 sunpos: the 3D // coordinates of the Sun relative to the center of the Moon Vector2 // lon_lat is a 2D vector. First element is the longitude and the // second the latitude. // Author: Ara Nefian double LambertianReflectance(Vector3 sunPos, Vector3 xyz, Vector3 normal) { double reflectance; Vector3 sunDirection = normalize(sunPos-xyz); reflectance = sunDirection[0]*normal[0] + sunDirection[1]*normal[1] + sunDirection[2]*normal[2]; return reflectance; } double LunarLambertianReflectance(Vector3 const& sunPos, Vector3 const& viewPos, Vector3 const& xyz, Vector3 const& normal, double phaseCoeffC1, double phaseCoeffC2, double & alpha, const double * refl_coeffs) { double len = dot_prod(normal, normal); if (abs(len - 1.0) > 1.0e-4) vw::vw_throw(vw::ArgumentErr() << "Expecting unit normal in the reflectance computation.\n"); // Compute mu_0 = cosine of the angle between the light direction and the surface normal. //sun coordinates relative to the xyz point on the Moon surface Vector3 sunDirection = normalize(sunPos-xyz); double mu_0 = dot_prod(sunDirection, normal); // Compute mu = cosine of the angle between the viewer direction and the surface normal. // viewer coordinates relative to the xyz point on the Moon surface Vector3 viewDirection = normalize(viewPos-xyz); double mu = dot_prod(viewDirection,normal); // Compute the phase angle (alpha) between the viewing direction and the light // source direction double deg_alpha; double cos_alpha; double tol = 1e-8; cos_alpha = dot_prod(sunDirection, viewDirection); if ((cos_alpha > 1 + tol) || (cos_alpha < -1 - tol)) vw::vw_throw(vw::ArgumentErr() << "cos(alpha) error.\n"); alpha = acos(cos_alpha); // phase angle in radians deg_alpha = alpha*180.0/M_PI; // phase angle in degrees // Bob Gaskell's model // L = exp(-deg_alpha/60.0); // Alfred McEwen's model double O = refl_coeffs[0]; // 1 double A = refl_coeffs[1]; //-0.019; double B = refl_coeffs[2]; // 0.000242;//0.242*1e-3; double C = refl_coeffs[3]; // -0.00000146;//-1.46*1e-6; double L = O + A*deg_alpha + B*deg_alpha*deg_alpha + C*deg_alpha*deg_alpha*deg_alpha; double reflectance = 2*L*mu_0/(mu_0+mu) + (1-L)*mu_0; if (mu_0 + mu == 0 || reflectance != reflectance) return 0.0; // Attempt to compensate for points on the terrain being too bright // if the sun is behind the spacecraft as seen from those points. reflectance *= (exp(-phaseCoeffC1*alpha) + phaseCoeffC2); return reflectance; } // Hapke's model. See: An Experimental Study of Light Scattering by Large, // Irregular Particles Audrey F. McGuire, Bruce W. Hapke. 1995. The reflectance // used is R(g), in equation above Equation 21. The p(g) function is given by // Equation (14), yet this one uses an old convention. The updated p(g) is given // in: Spectrophotometric properties of materials observed by Pancam on the Mars // Exploration Rovers: 1. Spirit. JR Johnson, 2006. We Use the two-term p(g), // and the parameter c, not c'=1-c. We also use the values of w(=omega), b, and // c from that table. // Note that we use the updated Hapke model, having the term B(g). This one is // given in "Modeling spectral and bidirectional reflectance", Jacquemoud, 1992. // It has the params B0 and h. The ultimate reference is probably Hapke, 1986, // having all pieces in one place, but that one is not available. // We use mostly the parameter values for omega, b, c, B0 and h from: Surface // reflectance of Mars observed by CRISM/MRO: 2. Estimation of surface // photometric properties in Gusev Crater and Meridiani Planum by J. Fernando. // See equations (1), (2) and (4) in that paper. // Example values for the params: w=omega=0.68, b=0.17, c=0.62, B0=0.52, h=0.52. // We don't use equation (3) from that paper, we use instead what they call // the formula H93, which is the H(x) from McGuire and Hapke 1995 mentioned // above. See the complete formulas below. // The Fernando paper has a factor S, which is not present in the 1992 // Jacquemoud paper, so we don't use it either here. double HapkeReflectance(Vector3 const& sunPos, Vector3 const& viewPos, Vector3 const& xyz, Vector3 const& normal, double phaseCoeffC1, double phaseCoeffC2, double & alpha, const double * refl_coeffs) { double len = dot_prod(normal, normal); if (abs(len - 1.0) > 1.0e-4) vw::vw_throw(vw::ArgumentErr() << "Expecting unit normal in the reflectance computation.\n"); //compute mu_0 = cosine of the angle between the light direction and the surface normal. //sun coordinates relative to the xyz point on the Moon surface Vector3 sunDirection = normalize(sunPos-xyz); double mu_0 = dot_prod(sunDirection, normal); //compute mu = cosine of the angle between the viewer direction and the surface normal. //viewer coordinates relative to the xyz point on the Moon surface Vector3 viewDirection = normalize(viewPos-xyz); double mu = dot_prod(viewDirection,normal); //compute the phase angle (g) between the viewing direction and the light source direction // in radians double cos_g = dot_prod(sunDirection, viewDirection); double g = acos(cos_g); // phase angle in radians // Hapke params double omega = std::abs(refl_coeffs[0]); // also known as w double b = std::abs(refl_coeffs[1]); double c = std::abs(refl_coeffs[2]); // The older Hapke model lacks the B0 and h terms double B0 = std::abs(refl_coeffs[3]); double h = std::abs(refl_coeffs[4]); // Does not matter, we'll factor out the constant scale as camera exposures anyway double J = 1.0; // The P(g) term double Pg = (1.0 - c) * (1.0 - b*b) / pow(1.0 + 2.0*b*cos_g + b*b, 1.5) + c * (1.0 - b*b) / pow(1.0 - 2.0*b*cos_g + b*b, 1.5); // The B(g) term double Bg = B0 / (1.0 + (1.0/h)*tan(g/2.0)); double H_mu0 = (1.0 + 2*mu_0) / (1.0 + 2*mu_0 * sqrt(1.0 - omega)); double H_mu = (1.0 + 2*mu) / (1.0 + 2*mu * sqrt(1.0 - omega)); // The reflectance double R = (J*omega/4.0/M_PI) * (mu_0/(mu_0+mu)) * ((1.0 + Bg)*Pg + H_mu0*H_mu - 1.0); return R; } // Use the following model: // Reflectance = f(alpha) * A * mu_0 /(mu_0 + mu) + (1-A) * mu_0 // The value of A is either 1 (the so-called lunar-model), or A=0.7. // f(alpha) = 0.63. double CharonReflectance(Vector3 const& sunPos, Vector3 const& viewPos, Vector3 const& xyz, Vector3 const& normal, double phaseCoeffC1, double phaseCoeffC2, double & alpha, const double * refl_coeffs) { double len = dot_prod(normal, normal); if (abs(len - 1.0) > 1.0e-4) vw::vw_throw(vw::ArgumentErr() << "Expecting unit normal in the reflectance computation.\n"); //compute mu_0 = cosine of the angle between the light direction and the surface normal. //sun coordinates relative to the xyz point on the Moon surface Vector3 sunDirection = normalize(sunPos-xyz); double mu_0 = dot_prod(sunDirection, normal); //compute mu = cosine of the angle between the viewer direction and the surface normal. //viewer coordinates relative to the xyz point on the Moon surface Vector3 viewDirection = normalize(viewPos-xyz); double mu = dot_prod(viewDirection,normal); // Charon model params double A = std::abs(refl_coeffs[0]); // albedo double f_alpha = std::abs(refl_coeffs[1]); // phase function double reflectance = f_alpha*A*mu_0 / (mu_0 + mu) + (1.0 - A)*mu_0; if (mu_0 + mu == 0 || reflectance != reflectance) { return 0.0; } return reflectance; } // Lunar-Lambertian with duplicated coefficients that could be optimized separately. // This is experimental. double ExperimentalLunarLambertianReflectance(Vector3 const& sunPos, Vector3 const& viewPos, Vector3 const& xyz, Vector3 const& normal, double phaseCoeffC1, double phaseCoeffC2, double & alpha, const double * refl_coeffs) { double reflectance; double len = dot_prod(normal, normal); if (std::abs(len - 1.0) > 1.0e-4) vw::vw_throw(vw::ArgumentErr() << "Expecting unit normal in the reflectance computation.\n"); // Compute mu_0 = cosine of the angle between the light direction and the surface normal. // sun coordinates relative to the xyz point on the Moon surface // Vector3 sunDirection = -normalize(sunPos-xyz); Vector3 sunDirection = normalize(sunPos-xyz); double mu_0 = dot_prod(sunDirection, normal); //compute mu = cosine of the angle between the viewer direction and the surface normal. //viewer coordinates relative to the xyz point on the Moon surface Vector3 viewDirection = normalize(viewPos-xyz); double mu = dot_prod(viewDirection,normal); //compute the phase angle (alpha) between the viewing direction and the light source direction double deg_alpha; double cos_alpha; double tol = 1e-8; cos_alpha = dot_prod(sunDirection,viewDirection); if (cos_alpha > 1 + tol || cos_alpha < -1 - tol) vw::vw_throw(vw::ArgumentErr() << "cos_alpha error\n"); alpha = acos(cos_alpha); // phase angle in radians deg_alpha = alpha*180.0/M_PI; // phase angle in degrees //Alfred McEwen's model double O1 = refl_coeffs[0]; // 1 double A1 = refl_coeffs[1]; // -0.019; double B1 = refl_coeffs[2]; // 0.000242;//0.242*1e-3; double C1 = refl_coeffs[3]; // -0.00000146;//-1.46*1e-6; double D1 = refl_coeffs[4]; double E1 = refl_coeffs[5]; double F1 = refl_coeffs[6]; double G1 = refl_coeffs[7]; double O2 = refl_coeffs[8]; // 1 double A2 = refl_coeffs[9]; // -0.019; double B2 = refl_coeffs[10]; // 0.000242;//0.242*1e-3; double C2 = refl_coeffs[11]; // -0.00000146;//-1.46*1e-6; double D2 = refl_coeffs[12]; double E2 = refl_coeffs[13]; double F2 = refl_coeffs[14]; double G2 = refl_coeffs[15]; double L1 = O1 + A1*deg_alpha + B1*deg_alpha*deg_alpha + C1*deg_alpha*deg_alpha*deg_alpha; double K1 = D1 + E1*deg_alpha + F1*deg_alpha*deg_alpha + G1*deg_alpha*deg_alpha*deg_alpha; if (K1 == 0) K1 = 1; double L2 = O2 + A2*deg_alpha + B2*deg_alpha*deg_alpha + C2*deg_alpha*deg_alpha*deg_alpha; double K2 = D2 + E2*deg_alpha + F2*deg_alpha*deg_alpha + G2*deg_alpha*deg_alpha*deg_alpha; if (K2 == 0) K2 = 1; reflectance = 2*L1*mu_0/(mu_0+mu)/K1 + (1-L2)*mu_0/K2; if (mu_0 + mu == 0 || reflectance != reflectance) return 0.0; // Attempt to compensate for points on the terrain being too bright // if the sun is behind the spacecraft as seen from those points. reflectance *= (exp(-phaseCoeffC1*alpha) + phaseCoeffC2); return reflectance; } // Computes the ground reflectance with a desired reflectance model. double calcReflectance(vw::Vector3 const& cameraPosition, vw::Vector3 const& normal, Vector3 const& xyz, vw::Vector3 const& sun_position, ReflParams const& refl_params, const double * refl_coeffs) { double phase_angle = 0.0; double input_img_reflectance = 0.0; switch (refl_params.reflectanceType) { case LUNAR_LAMBERT: input_img_reflectance = LunarLambertianReflectance(sun_position, cameraPosition, xyz, normal, refl_params.phaseCoeffC1, refl_params.phaseCoeffC2, phase_angle, // output refl_coeffs); break; case ARBITRARY_MODEL: input_img_reflectance = ExperimentalLunarLambertianReflectance(sun_position, cameraPosition, xyz, normal, refl_params.phaseCoeffC1, refl_params.phaseCoeffC2, phase_angle, // output refl_coeffs); break; case HAPKE: input_img_reflectance = HapkeReflectance(sun_position, cameraPosition, xyz, normal, refl_params.phaseCoeffC1, refl_params.phaseCoeffC2, phase_angle, // output refl_coeffs); break; case CHARON: input_img_reflectance = CharonReflectance(sun_position, cameraPosition, xyz, normal, refl_params.phaseCoeffC1, refl_params.phaseCoeffC2, phase_angle, // output refl_coeffs); break; case LAMBERT: input_img_reflectance = LambertianReflectance(sun_position, xyz, normal); break; default: input_img_reflectance = 1; } return input_img_reflectance; } // Simulated model-based intensity: // albedo * nonlinReflectance(reflectance_i, exposures[i], haze, num_haze_coeffs) + haze[0] // Cost function is the squared difference between measured and computed intensity: // sum_i | I_i - sim_intensity_i|^2 double calcSimIntensity(double albedo, double reflectance, double exposure, double steepness_factor, double const* haze, int num_haze_coeffs) { return albedo * nonlinReflectance(reflectance, exposure, steepness_factor, haze, num_haze_coeffs) + haze[0]; } // Calc albedo given the intensity. // albedo = (intensity - haze[0]) / nonlin_ref. // See also calcSimIntensity(). double calcAlbedo(double intensity, double reflectance, double exposure, double steepness_factor, double const* haze, int num_haze_coeffs) { // First, subtract the base haze coefficient double adjusted_intensity = intensity - haze[0]; // Calculate the nonlinear reflectance first double nonlin_ref = nonlinReflectance(reflectance, exposure, steepness_factor, haze, num_haze_coeffs); // Protect against division by zero if (nonlin_ref == 0.0) return 0.0; return adjusted_intensity / nonlin_ref; } // Reflectance formula that is nonlinear if there is more than one haze coefficient // (that is experimental). double nonlinReflectance(double reflectance, double exposure, double steepness_factor, double const* haze, int num_haze_coeffs) { // Make the exposure smaller. This will result in higher reflectance // to compensate, as intensity = exposure * reflectance, hence // steeper terrain. Things become more complicated if the haze // and nonlinear reflectance is modeled. This is not on by default. exposure /= steepness_factor; double r = reflectance; // for short if (num_haze_coeffs == 0) return exposure * r; // Linear model if (num_haze_coeffs == 1) return exposure * r; // Also linear model, haze[0] is added after albedo multiplication if (num_haze_coeffs == 2) return exposure * r /(haze[1]*r + 1); if (num_haze_coeffs == 3) return exposure * (r + haze[2])/(haze[1]*r + 1); if (num_haze_coeffs == 4) return exposure * (haze[3]*r*r + r + haze[2])/(haze[1]*r + 1); if (num_haze_coeffs == 5) return exposure * (haze[3]*r*r + r + haze[2])/(haze[4]*r*r + haze[1]*r + 1); if (num_haze_coeffs == 6) return exposure * (haze[5]*r*r*r + haze[3]*r*r + r + haze[2])/(haze[4]*r*r + haze[1]*r + 1); vw_throw(ArgumentErr() << "Invalid value for the number of haze coefficients.\n"); return 0; } // Calculate current ECEF position and normal vector for a given DEM pixel. // This is an auxiliary function needed to compute the reflectance. void calcPointAndNormal(int col, int row, double left_h, double center_h, double right_h, double bottom_h, double top_h, bool use_pq, double p, double q, // dem partial derivatives vw::cartography::GeoReference const& geo, double gridx, double gridy, // Outputs vw::Vector3 & xyz, vw::Vector3 & normal) { if (use_pq) { // p is defined as (right_h - left_h)/(2*gridx) // so, also, p = (right_h - center_h)/gridx // Hence, we get the formulas below in terms of p and q. right_h = center_h + gridx*p; left_h = center_h - gridx*p; top_h = center_h + gridy*q; bottom_h = center_h - gridy*q; } // The xyz position at the center grid point vw::Vector2 lonlat = geo.pixel_to_lonlat(Vector2(col, row)); double h = center_h; vw::Vector3 lonlat3(lonlat(0), lonlat(1), h); xyz = geo.datum().geodetic_to_cartesian(lonlat3); // The xyz position at the left grid point lonlat = geo.pixel_to_lonlat(Vector2(col-1, row)); h = left_h; lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h); vw::Vector3 left = geo.datum().geodetic_to_cartesian(lonlat3); // The xyz position at the right grid point lonlat = geo.pixel_to_lonlat(Vector2(col+1, row)); h = right_h; lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h); vw::Vector3 right = geo.datum().geodetic_to_cartesian(lonlat3); // The xyz position at the bottom grid point lonlat = geo.pixel_to_lonlat(Vector2(col, row+1)); h = bottom_h; lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h); vw::Vector3 bottom = geo.datum().geodetic_to_cartesian(lonlat3); // The xyz position at the top grid point lonlat = geo.pixel_to_lonlat(Vector2(col, row-1)); h = top_h; lonlat3 = vw::Vector3(lonlat(0), lonlat(1), h); vw::Vector3 top = geo.datum().geodetic_to_cartesian(lonlat3); // four-point normal (centered) vw::Vector3 dx = right - left; vw::Vector3 dy = bottom - top; normal = -normalize(cross_prod(dx, dy)); // so normal points up } // Compute the reflectance and intensity at a single pixel. Compute the slope and/or // height error estimation if the pointer is not NULL. bool calcPixReflectanceInten(double left_h, double center_h, double right_h, double bottom_h, double top_h, bool use_pq, double p, double q, // dem partial derivatives int col, int row, DblImgT const& dem, vw::cartography::GeoReference const& geo, bool model_shadows, double max_dem_height, double gridx, double gridy, vw::Vector3 const & sunPosition, asp::ReflParams const & refl_params, vw::BBox2i const & crop_box, MaskedImgRefT const & image, DblImgT const & blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr camera, vw::PixelMask<double> & reflectance, vw::PixelMask<double> & intensity, double & ground_weight, double const * refl_coeffs, asp::SfsOptions const & opt, asp::HeightErrEstim * heightErrEstim) { // Set output values reflectance = 0.0; reflectance.invalidate(); intensity = 0.0; intensity.invalidate(); ground_weight = 0.0; if (col >= dem.cols() - 1 || row >= dem.rows() - 1) return false; if (crop_box.empty()) return false; vw::Vector3 xyz, normal; asp::calcPointAndNormal(col, row, left_h, center_h, right_h, bottom_h, top_h, use_pq, p, q, geo, gridx, gridy, xyz, normal); // Update the camera position for the given pixel (camera position // is pixel-dependent for linescan cameras). vw::Vector2 pix; vw::Vector3 cameraPosition; try { pix = camera->point_to_pixel(xyz); // Need camera center only for Lunar Lambertian if (refl_params.reflectanceType != LAMBERT) cameraPosition = camera->camera_center(pix); } catch (...) { reflectance = 0.0; reflectance.invalidate(); intensity = 0.0; intensity.invalidate(); ground_weight = 0.0; return false; } reflectance = asp::calcReflectance(cameraPosition, normal, xyz, sunPosition, refl_params, refl_coeffs); reflectance.validate(); // Since our image is cropped pix -= crop_box.min(); // Check for out of range if (pix[0] < 0 || pix[0] >= image.cols() - 1 || pix[1] < 0 || pix[1] >= image.rows() - 1) { reflectance = 0.0; reflectance.invalidate(); intensity = 0.0; intensity.invalidate(); ground_weight = 0.0; return false; } vw::InterpolationView<vw::EdgeExtensionView<MaskedImgRefT, vw::ConstantEdgeExtension>, vw::BilinearInterpolation> interp_image = vw::interpolate(image, vw::BilinearInterpolation(), vw::ConstantEdgeExtension()); intensity = interp_image(pix[0], pix[1]); // this interpolates if (blend_weight_is_ground_weight) { if (blend_weight.cols() != dem.cols() || blend_weight.rows() != dem.rows()) vw::vw_throw(vw::ArgumentErr() << "Ground weight must have the same size as the DEM.\n"); ground_weight = blend_weight(col, row); } else { vw::InterpolationView<vw::EdgeExtensionView<DblImgT, vw::ConstantEdgeExtension>, vw::BilinearInterpolation> interp_weight = vw::interpolate(blend_weight, vw::BilinearInterpolation(), vw::ConstantEdgeExtension()); if (blend_weight.cols() > 0 && blend_weight.rows() > 0) // The weight may not exist ground_weight = interp_weight(pix[0], pix[1]); // this interpolates else ground_weight = 1.0; } // Note that we allow negative reflectance for valid intensity. It will hopefully guide // the SfS solution the right way. if (!is_valid(intensity)) { reflectance = 0.0; reflectance.invalidate(); intensity = 0.0; intensity.invalidate(); ground_weight = 0.0; return false; } if (model_shadows) { bool inShadow = asp::isInShadow(col, row, sunPosition, dem, max_dem_height, gridx, gridy, geo); if (inShadow) { // The reflectance is valid, it is just zero reflectance = 0; reflectance.validate(); } } if (heightErrEstim != NULL && is_valid(intensity) && is_valid(reflectance)) { int image_iter = heightErrEstim->image_iter; ImageView<double> const& albedo = *heightErrEstim->albedo; // alias double sim_intensity = calcSimIntensity(albedo(col, row), reflectance, opt.image_exposures_vec[image_iter], opt.steepness_factor, &opt.image_haze_vec[image_iter][0], opt.num_haze_coeffs); // We use twice the discrepancy between the computed and measured intensity // as a measure for how far is overall the computed intensity allowed // to diverge from the measured intensity double max_intensity_err = 2.0 * std::abs(intensity.child() - sim_intensity); estimateHeightError(dem, geo, cameraPosition, sunPosition, refl_params, refl_coeffs, intensity.child(), max_intensity_err, col, row, gridx, gridy, image_iter, opt, albedo, heightErrEstim); } return true; } // The value stored in the output intensity(i, j) is the one at entry // (i - 1) * sample_col_rate + 1, (j - 1) * sample_row_rate + 1 // in the full image. For i = 0 or j = 0 invalid values are stored. void computeReflectanceAndIntensity(DblImgT const& dem, vw::ImageView<vw::Vector2> const& pq, vw::cartography::GeoReference const& geo, bool model_shadows, bool show_progress, double & max_dem_height, // alias double gridx, double gridy, int sample_col_rate, int sample_row_rate, vw::Vector3 const& sunPosition, asp::ReflParams const& refl_params, vw::BBox2i const& crop_box, asp::MaskedImgRefT const & image, asp::DblImgT const & blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr camera, MaskedDblImgT & reflectance, MaskedDblImgT & intensity, DblImgT & ground_weight, double const * refl_coeffs, asp::SfsOptions const & opt, asp::HeightErrEstim * heightErrEstim) { // Update max_dem_height. This can change as the DEM is being optimized. max_dem_height = -std::numeric_limits<double>::max(); if (model_shadows) { #pragma omp parallel for num_threads(opt.num_threads) for (int col = 0; col < dem.cols(); col += sample_col_rate) { for (int row = 0; row < dem.rows(); row += sample_row_rate) { if (dem(col, row) > max_dem_height) { max_dem_height = dem(col, row); } } } } // See how many samples we end up having further down. Must start counting // from 1, just as we do in that loop. int num_sample_cols = 0, num_sample_rows = 0; for (int col = 1; col < dem.cols() - 1; col += sample_col_rate) num_sample_cols++; for (int row = 1; row < dem.rows() - 1; row += sample_row_rate) num_sample_rows++; // Add 2 for book-keeping purposes, to ensure that when the sampling rate // is 1, we get as many cols and rows as the DEM has. num_sample_cols += 2; num_sample_rows += 2; // Important sanity check if (sample_col_rate == 1 && num_sample_cols != dem.cols()) vw::vw_throw(vw::LogicErr() << "Book-keeping error in computing reflectance and intensity.\n"); if (sample_row_rate == 1 && num_sample_rows != dem.rows()) vw::vw_throw(vw::LogicErr() << "Book-keeping error in computing reflectance and intensity.\n"); // Init the reflectance and intensity as invalid. Do it at all grid // points, not just where we sample, to ensure that these quantities // are fully initialized. reflectance.set_size(num_sample_cols, num_sample_rows); intensity.set_size(num_sample_cols, num_sample_rows); ground_weight.set_size(num_sample_cols, num_sample_rows); #pragma omp parallel for num_threads(opt.num_threads) for (int col = 0; col < num_sample_cols; col++) { for (int row = 0; row < num_sample_rows; row++) { reflectance(col, row).invalidate(); intensity(col, row).invalidate(); ground_weight(col, row) = 0.0; } } // end iterations over cols // Set up a terminal progress callback. Will be used only if showing progress. vw::TerminalProgressCallback tpc("asp", "meas inten: "); double inc = 1.0 / num_sample_cols; if (show_progress) tpc.report_incremental_progress(0.0); // Need to very carefully distinguish below between col and col_sample, // and between row and row_sample. These are same only if the sampling // rate is 1. Here we start at col and row equal to 1 to be able to properly // find the neighbors and surface normal. bool use_pq = (pq.cols() > 0 && pq.rows() > 0); #pragma omp parallel for num_threads(opt.num_threads) for (int col = 1; col < dem.cols() - 1; col += sample_col_rate) { int col_sample = (col-1)/sample_col_rate + 1; for (int row = 1; row < dem.rows() - 1; row += sample_row_rate) { int row_sample = (row-1)/sample_row_rate + 1; double pval = 0, qval = 0; if (use_pq) { pval = pq(col, row)[0]; qval = pq(col, row)[1]; } asp::calcPixReflectanceInten(dem(col-1, row), dem(col, row), dem(col+1, row), dem(col, row+1), dem(col, row-1), use_pq, pval, qval, col, row, dem, geo, model_shadows, max_dem_height, gridx, gridy, sunPosition, refl_params, crop_box, image, blend_weight, blend_weight_is_ground_weight, camera, reflectance(col_sample, row_sample), intensity(col_sample, row_sample), ground_weight(col_sample, row_sample), refl_coeffs, opt, heightErrEstim); } // Show progress if requested if (show_progress) { #pragma omp critical { tpc.report_incremental_progress(inc); } } } // end iterations over cols if (show_progress) tpc.report_finished(); return; } // Initalize the reflectance parameters based on user input void setupReflectance(asp::ReflParams & refl_params, asp::SfsOptions & opt) { if (opt.reflectance_type == 0) refl_params.reflectanceType = LAMBERT; else if (opt.reflectance_type == 1) refl_params.reflectanceType = LUNAR_LAMBERT; else if (opt.reflectance_type == 2) refl_params.reflectanceType = HAPKE; else if (opt.reflectance_type == 3) refl_params.reflectanceType = ARBITRARY_MODEL; else if (opt.reflectance_type == 4) refl_params.reflectanceType = CHARON; else vw_throw(ArgumentErr() << "Expecting Lambertian or Lunar-Lambertian reflectance."); refl_params.phaseCoeffC1 = 0; refl_params.phaseCoeffC2 = 0; // Default model coefficients, unless they were read already if (opt.model_coeffs_vec.empty()) { opt.model_coeffs_vec.resize(g_num_model_coeffs); if (refl_params.reflectanceType == LUNAR_LAMBERT || refl_params.reflectanceType == ARBITRARY_MODEL) { // Lunar lambertian or its crazy experimental generalization opt.model_coeffs_vec.resize(g_num_model_coeffs); opt.model_coeffs_vec[0] = 1; opt.model_coeffs_vec[1] = -0.019; opt.model_coeffs_vec[2] = 0.000242; //0.242*1e-3; opt.model_coeffs_vec[3] = -0.00000146; //-1.46*1e-6; opt.model_coeffs_vec[4] = 1; opt.model_coeffs_vec[5] = 0; opt.model_coeffs_vec[6] = 0; opt.model_coeffs_vec[7] = 0; opt.model_coeffs_vec[8] = 1; opt.model_coeffs_vec[9] = -0.019; opt.model_coeffs_vec[10] = 0.000242; //0.242*1e-3; opt.model_coeffs_vec[11] = -0.00000146; //-1.46*1e-6; opt.model_coeffs_vec[12] = 1; opt.model_coeffs_vec[13] = 0; opt.model_coeffs_vec[14] = 0; opt.model_coeffs_vec[15] = 0; } else if (refl_params.reflectanceType == HAPKE) { opt.model_coeffs_vec[0] = 0.68; // omega (also known as w) opt.model_coeffs_vec[1] = 0.17; // b opt.model_coeffs_vec[2] = 0.62; // c opt.model_coeffs_vec[3] = 0.52; // B0 opt.model_coeffs_vec[4] = 0.52; // h } else if (refl_params.reflectanceType == CHARON) { opt.model_coeffs_vec.resize(g_num_model_coeffs); opt.model_coeffs_vec[0] = 0.7; // A opt.model_coeffs_vec[1] = 0.63; // f(alpha) } else if (refl_params.reflectanceType != LAMBERT) { vw_throw(ArgumentErr() << "The Hapke model coefficients were not set. " << "Use the --model-coeffs option."); } } } // TODO(oalexan1): Should one mark the no-data values rather than setting // them to 0? void calcSimIntensity(vw::ImageView<double> const& albedo, MaskedDblImgT const& reflectance, double exposure, double steepness_factor, std::vector<double> const& haze, int num_haze_coeffs, int num_threads, bool show_progress, MaskedDblImgT & sim_intensity) { // Init the output image sim_intensity.set_size(reflectance.cols(), reflectance.rows()); // Set up a terminal progress callback. Will be used only if showing progress. vw::TerminalProgressCallback tpc("asp", "sim inten: "); double inc = 1.0 / sim_intensity.cols(); if (show_progress) tpc.report_incremental_progress(0.0); #pragma omp parallel for num_threads(num_threads) for (int col = 0; col < sim_intensity.cols(); col++) { for (int row = 0; row < sim_intensity.rows(); row++) { sim_intensity(col, row) = calcSimIntensity(albedo(col, row), reflectance(col, row), exposure, steepness_factor, &haze[0], num_haze_coeffs); } // Show progress if requested if (show_progress) { #pragma omp critical { tpc.report_incremental_progress(inc); } } } // end iterations over cols if (show_progress) tpc.report_finished(); } // end function calcSimIntensity // This function computes / saves measured and simulated intensities, and // handles related estimations. If opt.allow_borderline_data is true, create for // each image that will not be skipped a weight matrix with dimensions equal to // DEM dimensions, that will be used instead of weights in the camera image // space. These are balanced among each other and give more weight to barely lit // and unlit nearby pixels. void calcIntenEstimHeights(SfsOptions & opt, vw::ImageView<double> const& dem, vw::ImageView<double> const& albedo, vw::cartography::GeoReference const& geo, bool show_progress, double max_dem_height, double gridx, double gridy, std::vector<vw::Vector3> const& sunPosition, asp::ReflParams const& refl_params, std::vector<vw::BBox2i> const& crop_boxes, std::vector<MaskedImgRefT> const& masked_images, std::vector<vw::ImageView<double>> const& blend_weights, bool blend_weight_is_ground_weight, std::vector<vw::CamPtr> const& cameras, float img_nodata_val, // Outputs vw::ImageView<int> & lit_image_mask, std::vector<vw::ImageView<double>> & ground_weights, std::vector<MaskedDblImgT> & meas_intensities, std::vector<MaskedDblImgT> & sim_intensities) { int num_images = opt.input_images.size(); // Save the computed and actual intensity, and for most of these quit MaskedDblImgT reflectance, meas_intensity, sim_intensity; vw::ImageView<double> ground_weight; vw::ImageView<Vector2> pq; // no need for these just for initialization int sample_col_rate = 1, sample_row_rate = 1; auto heightErrEstim = boost::shared_ptr<HeightErrEstim>(NULL); if (opt.estimate_height_errors) { double max_height_error = opt.height_error_params[0]; int num_height_samples = opt.height_error_params[1]; vw_out() << "Maximum height error to examine: " << max_height_error << "\n"; vw_out() << "Number of samples to use from 0 to that height: " << num_height_samples << "\n"; double nodata_height_val = -1.0; heightErrEstim = boost::shared_ptr<HeightErrEstim> (new HeightErrEstim(dem.cols(), dem.rows(), num_height_samples, max_height_error, nodata_height_val, &albedo)); } if (show_progress) vw::vw_out() << "Computing measured and simulated intensities.\n"; for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.estimate_height_errors) heightErrEstim->image_iter = image_iter; // Find the reflectance and measured intensity. Note that this function is // needed even if only saving the simulated intensity, as it computes // the reflectance image which is a necessary input for the simulated // intensity calculation. asp::computeReflectanceAndIntensity(dem, pq, geo, opt.model_shadows, show_progress, max_dem_height, gridx, gridy, sample_col_rate, sample_row_rate, sunPosition[image_iter], refl_params, crop_boxes[image_iter], masked_images[image_iter], blend_weights[image_iter], blend_weight_is_ground_weight, cameras[image_iter], reflectance, meas_intensity, ground_weight, &opt.model_coeffs_vec[0], opt, heightErrEstim.get()); // Find the simulated intensity only when needed if (opt.save_sim_intensity_only || opt.low_light_threshold > 0.0) asp::calcSimIntensity(albedo, reflectance, opt.image_exposures_vec[image_iter], opt.steepness_factor, opt.image_haze_vec[image_iter], opt.num_haze_coeffs, opt.num_threads, show_progress, sim_intensity); // Save some quantities if needed if (opt.skip_images.find(image_iter) == opt.skip_images.end() && (opt.allow_borderline_data || opt.low_light_threshold > 0.0)) ground_weights[image_iter] = copy(ground_weight); // save the weight if (opt.skip_images.find(image_iter) == opt.skip_images.end() && opt.low_light_threshold > 0.0) { // Save the measured and computed intensities. Avoid doing this in // general as they can be large, if the input DEM is large. meas_intensities[image_iter] = copy(meas_intensity); sim_intensities[image_iter] = copy(sim_intensity); } if (opt.curvature_in_shadow_weight > 0.0) { if (meas_intensity.cols() != lit_image_mask.cols() || meas_intensity.rows() != lit_image_mask.rows()) vw_throw(ArgumentErr() << "Intensity image dimensions disagree with DEM clip dimensions.\n"); for (int col = 0; col < lit_image_mask.cols(); col++) { for (int row = 0; row < lit_image_mask.rows(); row++) { if (is_valid(meas_intensity(col, row)) || col == 0 || col == lit_image_mask.cols() - 1 || row == 0 || row == lit_image_mask.rows() - 1) { // Boundary pixels are declared lit. Otherwise they are always // unlit due to the peculiarities of how the intensity is found // at the boundary. lit_image_mask(col, row) = 1; } } } } if (opt.save_sim_intensity_only || opt.save_meas_intensity_only) asp::saveIntensities(opt, opt.input_images[image_iter], opt.input_cameras[image_iter], geo, meas_intensity, sim_intensity, img_nodata_val); } // End iterating over images if (opt.estimate_height_errors) asp::combineHeightErrors(heightErrEstim, opt, geo); } } // end namespace asp ================================================ FILE: src/asp/SfS/SfsModel.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsModel.h // Modeling reflectance, intensity, albedo for SfS #ifndef __ASP_SFS_SFS_MODEL_H__ #define __ASP_SFS_SFS_MODEL_H__ #include <asp/SfS/SfsImageProc.h> #include <vw/Camera/CameraModel.h> #include <vw/Image/MaskViews.h> #include <vw/Image/ImageViewRef.h> #include <vw/Math/Vector.h> namespace vw { namespace cartography { class GeoReference; }} // namespace vw::cartography namespace asp { // Maximum number of reflectance model and haze coefficients const size_t g_num_model_coeffs = 16; const size_t g_max_num_haze_coeffs = 6; enum REFL_TYPE {NO_REFL = 0, LAMBERT, LUNAR_LAMBERT, HAPKE, ARBITRARY_MODEL, CHARON}; class HeightErrEstim; class SfsOptions; struct ReflParams { int reflectanceType; // Two parameters used in the formula for the Lunar-Lambertian // reflectance double phaseCoeffC1, phaseCoeffC2; }; // Reflectance formula that is nonlinear if there is more than one haze coefficient // (that is experimental). double nonlinReflectance(double reflectance, double exposure, double steepness_factor, double const* haze, int num_haze_coeffs); // Computes the ground reflectance with a desired reflectance model. double calcReflectance(vw::Vector3 const& cameraPosition, vw::Vector3 const& normal, vw::Vector3 const& xyz, vw::Vector3 const& sun_position, ReflParams const& refl_params, const double * refl_coeffs); // Computed intensity: // albedo * nonlinReflectance(reflectance_i, exposures[i], haze, num_haze_coeffs) + haze[0] // Cost function: // sum_i | I_i - sim_intensity_i|^2 double calcSimIntensity(double albedo, double reflectance, double exposure, double steepness_factor, double const* haze, int num_haze_coeffs); // TODO(oalexan1): Should one mark the no-data values rather than setting // them to 0? void calcSimIntensity(vw::ImageView<double> const& albedo, MaskedDblImgT const& reflectance, double exposure, double steepness_factor, std::vector<double> const& haze, int num_haze_coeffs, int num_threads, bool show_progress, MaskedDblImgT & sim_intensity); // Calc albedo given the intensity. See calcSimIntensity(). double calcAlbedo(double intensity, double reflectance, double exposure, double steepness_factor, double const* haze, int num_haze_coeffs); // Calculate current ECEF position and normal vector for a given DEM pixel. // This is an auxiliary function needed to compute the reflectance. void calcPointAndNormal(int col, int row, double left_h, double center_h, double right_h, double bottom_h, double top_h, bool use_pq, double p, double q, // dem partial derivatives vw::cartography::GeoReference const& geo, double gridx, double gridy, // Outputs vw::Vector3 & xyz, vw::Vector3 & normal); // Compute the reflectance and intensity at a single pixel. Compute the slope and/or // height error estimation if the pointer is not NULL. bool calcPixReflectanceInten(double left_h, double center_h, double right_h, double bottom_h, double top_h, bool use_pq, double p, double q, // dem partial derivatives int col, int row, DblImgT const& dem, vw::cartography::GeoReference const& geo, bool model_shadows, double max_dem_height, double gridx, double gridy, vw::Vector3 const & sunPosition, asp::ReflParams const & refl_params, vw::BBox2i const & crop_box, MaskedImgRefT const & image, DblImgT const & blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr camera, vw::PixelMask<double> & reflectance, vw::PixelMask<double> & intensity, double & ground_weight, double const * refl_coeffs, asp::SfsOptions const & opt, asp::HeightErrEstim * heightErrEstim = NULL); // The value stored in the output intensity(i, j) is the one at entry // (i - 1) * sample_col_rate + 1, (j - 1) * sample_row_rate + 1 // in the full image. For i = 0 or j = 0 invalid values are stored. void computeReflectanceAndIntensity(DblImgT const& dem, vw::ImageView<vw::Vector2> const& pq, vw::cartography::GeoReference const& geo, bool model_shadows, bool show_progress, double & max_dem_height, // alias double gridx, double gridy, int sample_col_rate, int sample_row_rate, vw::Vector3 const& sunPosition, asp::ReflParams const& refl_params, vw::BBox2i const& crop_box, asp::MaskedImgRefT const & image, asp::DblImgT const & blend_weight, bool blend_weight_is_ground_weight, vw::CamPtr camera, MaskedDblImgT & reflectance, MaskedDblImgT & intensity, DblImgT & ground_weight, double const * refl_coeffs, asp::SfsOptions const & opt, asp::HeightErrEstim * heightErrEstim = NULL); // Initalize the reflectance parameters based on user input void setupReflectance(asp::ReflParams & refl_params, asp::SfsOptions & opt); // This function computes / saves measured and simulated intensities, and // handles related estimations. If opt.allow_borderline_data is true, create for // each image that will not be skipped a weight matrix with dimensions equal to // DEM dimensions, that will be used instead of weights in the camera image // space. These are balanced among each other and give more weight to barely lit // and unlit nearby pixels. void calcIntenEstimHeights(SfsOptions & opt, vw::ImageView<double> const& dem, vw::ImageView<double> const& albedo, vw::cartography::GeoReference const& geo, bool show_progress, double max_dem_height, double gridx, double gridy, std::vector<vw::Vector3> const& sunPosition, asp::ReflParams const& refl_params, std::vector<vw::BBox2i> const& crop_boxes, std::vector<MaskedImgRefT> const& masked_images, std::vector<vw::ImageView<double>> const& blend_weights, bool blend_weight_is_ground_weight, std::vector<vw::CamPtr> const& cameras, float img_nodata_val, // Outputs vw::ImageView<int> & lit_image_mask, std::vector<vw::ImageView<double>> & ground_weights, std::vector<MaskedDblImgT> & meas_intensities, std::vector<MaskedDblImgT> & sim_intensities); } // end namespace asp #endif // __ASP_SFS_SFS_MODEL_H__ ================================================ FILE: src/asp/SfS/SfsOptions.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsOptions.vv // Command-line options for sfs #include <asp/SfS/SfsOptions.h> #include <string> #include <map> namespace asp { SfsOptions::SfsOptions(): max_iterations(0), reflectance_type(0), blending_dist(0), blending_power(2.0), min_blend_size(0), num_haze_coeffs(0), num_samples_for_estim(0), float_albedo(false), float_exposure(false), model_shadows(false), save_sim_intensity_only(false), save_meas_intensity_only(false), estimate_height_errors(false), compute_exposures_only(false), estim_exposure_haze_albedo(false), save_dem_with_nodata(false), use_approx_camera_models(false), crop_input_images(false), allow_borderline_data(false), fix_dem(false), float_reflectance_model(false), query(false), save_sparingly(false), float_haze(false), save_variances(false), save_covariances(false), smoothness_weight(0), steepness_factor(1.0), curvature_in_shadow(0), curvature_in_shadow_weight(0.0), lit_curvature_dist(0.0), shadow_curvature_dist(0.0), gradient_weight(0.0), integrability_weight(0), smoothness_weight_pq(0), initial_dem_constraint_weight(0.0), albedo_constraint_weight(0.0), albedo_robust_threshold(0.0), camera_position_step_size(1.0), low_light_threshold(0.0), low_light_weight_power(4.0), low_light_blur_sigma(0.0), crop_win(vw::BBox2i(0, 0, 0, 0)) {} } // end namespace asp ================================================ FILE: src/asp/SfS/SfsOptions.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsOptions.h // Command-line options for sfs #ifndef __ASP_SFS_SFS_OPTIONS_H__ #define __ASP_SFS_SFS_OPTIONS_H__ #include <vw/FileIO/GdalWriteOptions.h> #include <set> namespace asp { struct SfsOptions: public vw::GdalWriteOptions { std::string input_dem, image_list, camera_list, out_prefix, stereo_session, bundle_adjust_prefix, input_albedo; std::vector<std::string> input_images, input_cameras; 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; std::vector<float> shadow_threshold_vec, max_valid_image_vals_vec; std::vector<double> image_exposures_vec; std::vector<std::vector<double>> image_haze_vec; std::vector<double> model_coeffs_vec; std::set<int> skip_images; int max_iterations, reflectance_type, blending_dist, min_blend_size, num_haze_coeffs, num_samples_for_estim; bool float_albedo, float_exposure, model_shadows, save_sim_intensity_only, save_meas_intensity_only, estimate_height_errors, compute_exposures_only, estim_exposure_haze_albedo, save_dem_with_nodata, use_approx_camera_models, crop_input_images, allow_borderline_data, fix_dem, float_reflectance_model, query, save_sparingly, float_haze, read_exposures, read_haze, read_albedo, erode_seams, save_variances, save_covariances; double smoothness_weight, steepness_factor, gradient_weight, blending_power, integrability_weight, smoothness_weight_pq, init_dem_height, nodata_val, initial_dem_constraint_weight, albedo_constraint_weight, albedo_robust_threshold, camera_position_step_size, robust_threshold, shadow_threshold, low_light_threshold, low_light_weight_power, low_light_blur_sigma, curvature_in_shadow, curvature_in_shadow_weight, lit_curvature_dist, shadow_curvature_dist; vw::BBox2 crop_win; vw::Vector2 height_error_params; SfsOptions(); }; } // end namespace asp #endif // __ASP_SFS_SFS_OPTIONS_H__ ================================================ FILE: src/asp/SfS/SfsUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsUtils.cc // Basic utilities for SfS #include <asp/SfS/SfsUtils.h> #include <asp/Camera/CsmModel.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisCameraModel.h> #endif // ASP_HAVE_PKG_ISIS #include <vw/Core/CmdUtils.h> #include <string> #include <map> namespace asp { using namespace vw; // Find lon-lat-height in the center of the DEM void calcDemCenterLonLatHeight(vw::ImageView<double> const& dem, double nodata_val, vw::cartography::GeoReference const& georef, vw::Vector3 & llh) { int cols = dem.cols(), rows = dem.rows(); if (cols <= 0 || rows <= 0) vw_throw(ArgumentErr() << "Expecting a non-empty DEM.\n"); vw::Vector2 ll = georef.pixel_to_lonlat(Vector2(cols/2.0, rows/2.0)); double height = dem(cols/2.0, rows/2.0); if (height == nodata_val) height = 0.0; llh = vw::Vector3(ll[0], ll[1], height); } // Find the sun azimuth and elevation at the lon-lat position of the // center of the DEM. The result can change depending on the DEM. void sunAngles(ImageView<double> const& dem, double nodata_val, vw::cartography::GeoReference const& georef, vw::Vector3 const& sun_pos, double & azimuth, double & elevation) { // Find lon-lat-height in the center of the DEM vw::Vector3 llh; calcDemCenterLonLatHeight(dem, nodata_val, georef, llh); vw::Vector3 xyz = georef.datum().geodetic_to_cartesian(llh); // point on the planet vw::Vector3 sun_dir = sun_pos - xyz; sun_dir = sun_dir / norm_2(sun_dir); // normalize // Find the sun direction in the North-East-Down coordinate system vw::Matrix3x3 Ned2Ecef = georef.datum().lonlat_to_ned_matrix(llh); vw::Vector3 sun_dir_ned = inverse(Ned2Ecef) * sun_dir; if (sun_dir_ned[0] == 0 && sun_dir_ned[1] == 0) azimuth = 0; else azimuth = (180.0/M_PI) * atan2(sun_dir_ned[1], sun_dir_ned[0]); // azimuth = atan(E/N) in the NED system // So, when N = 1 and E = 0, azimuth is 0. double L = norm_2(subvector(sun_dir_ned, 0, 2)); elevation = (180.0/M_PI) * atan2(-sun_dir_ned[2], L); } // Convert azimuth and elevation in degrees to Sun position in meters vw::Vector3 angelsToSunPosition(double azimuth, double elevation, const vw::Vector3& xyz, const vw::Matrix3x3& Ned2Ecef) { // Convert to radians azimuth *= M_PI/180.0; elevation *= M_PI/180.0; // Find the Sun direction in NED double n = cos(azimuth) * cos(elevation); double e = sin(azimuth) * cos(elevation); double d = -sin(elevation); // Convert the direction to ECEF vw::Vector3 sun_dir = Ned2Ecef * vw::Vector3(n, e, d); // The distance to the Sun double sun_dist = 149597870700.0; // meters // Add to xyz the direction multiplied by the distance return xyz + sun_dist * sun_dir; } // Read sun positions from a file void readSunPositions(std::string const& sun_positions_list, std::vector<std::string> const& input_images, vw::ImageView<double> const& dem, double nodata_val, vw::cartography::GeoReference const& georef, std::vector<vw::Vector3> & sun_positions) { // Initialize the sun position with something (the planet center) int num_images = input_images.size(); sun_positions.resize(num_images); for (int it = 0; it < num_images; it++) sun_positions[it] = vw::Vector3(); // First read the positions in a map, as they may be out of order std::map<std::string, vw::Vector3> sun_positions_map; std::ifstream ifs(sun_positions_list.c_str()); std::string filename; double x, y, z; while (ifs >> filename >> x >> y >> z) sun_positions_map[filename] = vw::Vector3(x, y, z); // Put the sun positions in sun_positions. for (int it = 0; it < num_images; it++) { auto map_it = sun_positions_map.find(input_images[it]); if (map_it == sun_positions_map.end()) vw_throw(ArgumentErr() << "Could not read the Sun position from file: " << sun_positions_list << " for image: " << input_images[it] << ".\n"); sun_positions[it] = map_it->second; } } // Read the sun angles (azimuth and elevation) and convert them to sun positions. void readSunAngles(std::string const& sun_positions_list, std::vector<std::string> const& input_images, vw::ImageView<double> const& dem, double nodata_val, vw::cartography::GeoReference const& georef, std::vector<vw::Vector3> & sun_positions) { // Find lon-lat-height in the center of the DEM vw::Vector3 llh; calcDemCenterLonLatHeight(dem, nodata_val, georef, llh); // Point on the planet vw::Vector3 xyz = georef.datum().geodetic_to_cartesian(llh); // Find the sun direction in the North-East-Down coordinate system vw::Matrix3x3 Ned2Ecef = georef.datum().lonlat_to_ned_matrix(llh); // Initialize the sun position with something (the planet center) int num_images = input_images.size(); sun_positions.resize(num_images); for (int it = 0; it < num_images; it++) sun_positions[it] = vw::Vector3(); // First read the positions in a map, as they may be out of order std::map<std::string, vw::Vector3> sun_positions_map; std::ifstream ifs(sun_positions_list.c_str()); std::string filename; double azimuth, elevation; while (ifs >> filename >> azimuth >> elevation) sun_positions_map[filename] = angelsToSunPosition(azimuth, elevation, xyz, Ned2Ecef); // Put the sun positions in sun_positions. for (int it = 0; it < num_images; it++) { auto map_it = sun_positions_map.find(input_images[it]); if (map_it == sun_positions_map.end()) vw::vw_throw(vw::ArgumentErr() << "Could not read the Sun position from file: " << sun_positions_list << " for image: " << input_images[it] << ".\n"); sun_positions[it] = map_it->second; } } // Query an ISIS or CSM camera to find the Sun position vw::Vector3 sunPositionFromCamera(vw::CamPtr camera) { // Remove any adjustment to get to the camera proper vw::CamPtr ucam = unadjusted_model(camera); #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 // Try isis vw::camera::IsisCameraModel* isis_cam = dynamic_cast<vw::camera::IsisCameraModel*>(ucam.get()); if (isis_cam != NULL) return isis_cam->sun_position(); #endif // ASP_HAVE_PKG_ISIS // Try csm asp::CsmModel* csm_cam = dynamic_cast<asp::CsmModel*>(ucam.get()); if (csm_cam != NULL) return csm_cam->sun_position(); // No luck. Later there will be a complaint. return vw::Vector3(); } std::string exposureFileName(std::string const& prefix) { return prefix + "-exposures.txt"; } std::string hazeFileName(std::string const& prefix) { return prefix + "-haze.txt"; } std::string modelCoeffsFileName(std::string const& prefix) { return prefix + "-model_coeffs.txt"; } std::string skippedImagesFileName(std::string const& prefix) { return prefix + "-skipped_images.txt"; } std::string usedImagesFileName(std::string const& prefix) { return prefix + "-used_images.txt"; } // Save the exposures to a file void saveExposures(std::string const& out_prefix, std::vector<std::string> const& input_images, std::vector<double> const& exposures) { std::string exposure_file = exposureFileName(out_prefix); vw_out() << "Writing: " << exposure_file << std::endl; std::ofstream exf(exposure_file.c_str()); exf.precision(17); for (size_t image_iter = 0; image_iter < exposures.size(); image_iter++) exf << input_images[image_iter] << " " << exposures[image_iter] << "\n"; exf.close(); } // Save the haze to a file void saveHaze(std::string const& out_prefix, std::vector<std::string> const& input_images, std::vector<std::vector<double>> const& haze) { std::string haze_file = hazeFileName(out_prefix); vw_out() << "Writing: " << haze_file << std::endl; std::ofstream hzf(haze_file.c_str()); hzf.precision(17); for (size_t image_iter = 0; image_iter < haze.size(); image_iter++) { hzf << input_images[image_iter]; for (size_t hiter = 0; hiter < haze[image_iter].size(); hiter++) hzf << " " << haze[image_iter][hiter]; hzf << "\n"; } hzf.close(); } // Save the skipped images list, these images had no/bad exposure // so no good data for the DEM in them void saveSkippedImages(std::string const& out_prefix, std::vector<std::string> const& input_images) { std::string skipped_file = skippedImagesFileName(out_prefix); vw_out() << "Writing: " << skipped_file << std::endl; std::ofstream skippedfile(skipped_file.c_str()); for (const auto& image : input_images) skippedfile << image << "\n"; } // Save the used images list, these images had good exposure void saveUsedImages(std::string const& out_prefix, std::vector<std::string> const& input_images) { std::string used_file = usedImagesFileName(out_prefix); vw_out() << "Writing: " << used_file << std::endl; std::ofstream usedfile(used_file.c_str()); for (const auto& image : input_images) usedfile << image << "\n"; } // Get the memory usage for the given process. This is for debugging, not used // in production code. It does not work on OSX. void callTop() { std::ostringstream os; int pid = getpid(); os << pid; std::string cmd = "top -b -n 1 | grep -i ' sfs' | grep -i '" + os.str() + "'"; std::string ans = vw::exec_cmd(cmd.c_str()); vw_out() << "Memory usage: " << cmd << " " << ans << "\n"; } } // end namespace asp ================================================ FILE: src/asp/SfS/SfsUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file SfsUtils.h // Basic utilities for SfS #ifndef __ASP_SFS_SFS_UTILS_H__ #define __ASP_SFS_SFS_UTILS_H__ #include <vw/Cartography/GeoReference.h> #include <vw/Image/ImageView.h> #include <vw/Camera/CameraModel.h> namespace asp { // Find the Sun azimuth and elevation at the lon-lat position of the // center of the DEM. The result can change depending on the DEM. void sunAngles(vw::ImageView<double> const& dem, double nodata_val, vw::cartography::GeoReference const& georef, vw::Vector3 const& sun_pos, double & azimuth, double & elevation); // Read sun positions from a file void readSunPositions(std::string const& sun_positions_list, std::vector<std::string> const& input_images, vw::ImageView<double> const& dem, double nodata_val, vw::cartography::GeoReference const& georef, std::vector<vw::Vector3> & sun_positions); // Read the sun angles (azimuth and elevation) and convert them to sun positions. void readSunAngles(std::string const& sun_positions_list, std::vector<std::string> const& input_images, vw::ImageView<double> const& dem, double nodata_val, vw::cartography::GeoReference const& georef, std::vector<vw::Vector3> & sun_positions); // Query an ISIS or CSM camera to find the Sun position vw::Vector3 sunPositionFromCamera(vw::CamPtr camera); std::string exposureFileName(std::string const& prefix); std::string hazeFileName(std::string const& prefix); std::string modelCoeffsFileName(std::string const& prefix); std::string skippedImagesFileName(std::string const& prefix); std::string usedImagesFileName(std::string const& prefix); // Save the exposures to a file void saveExposures(std::string const& out_prefix, std::vector<std::string> const& input_images, std::vector<double> const& exposures); // Save the haze to a file void saveHaze(std::string const& out_prefix, std::vector<std::string> const& input_images, std::vector<std::vector<double>> const& haze); // Save the skipped images list to a file void saveSkippedImages(std::string const& out_prefix, std::vector<std::string> const& input_images); // Save the used images list to a file void saveUsedImages(std::string const& out_prefix, std::vector<std::string> const& input_images); } // end namespace asp #endif // __ASP_SFS_SFS_UTILS_H__ ================================================ FILE: src/asp/SfmView/CMakeLists.txt ================================================ # Use wrapper function at this level to avoid code duplication add_library_wrapper(AspSfmView "${ASP_SFMVIEW_SRC_FILES}" "${ASP_SFMVIEW_TEST_FILES}" "${ASP_SFMVIEW_LIB_DEPENDENCIES}") # Need this for QT to work. set_target_properties(AspSfmView PROPERTIES AUTOMOC TRUE) ================================================ FILE: src/asp/SfmView/GlCommon.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_GL_COMMON_H__ #define __ASP_SFMVIEW_GL_COMMON_H__ // OpenGL via Qt #include <QOpenGLExtraFunctions> #include <QOpenGLContext> #include <stdexcept> #include <string> // Get GL functions from the current Qt GL context (Qt6). inline QOpenGLExtraFunctions* glFunctions() { return QOpenGLContext::currentContext()->extraFunctions(); } namespace sfm { enum MouseEventType { MOUSE_EVENT_PRESS, MOUSE_EVENT_RELEASE, MOUSE_EVENT_MOVE, MOUSE_EVENT_WHEEL_UP, MOUSE_EVENT_WHEEL_DOWN }; enum MouseButton { MOUSE_BUTTON_NONE = 0, MOUSE_BUTTON_LEFT = 1 << 0, MOUSE_BUTTON_RIGHT = 1 << 1, MOUSE_BUTTON_MIDDLE = 1 << 2 }; struct MouseEvent { MouseEventType type; MouseButton button; int button_mask; int x; int y; }; } // namespace sfm #endif // __ASP_SFMVIEW_GL_COMMON_H__ ================================================ FILE: src/asp/SfmView/GlContext.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/GlContext.h> #include <algorithm> #include <iostream> namespace sfm { void CamTrackball::set_camera(SfmCamera* camera) { this->cam = camera; } Eigen::Vector3f CamTrackball::get_campos(void) const { return this->tb_center + this->tb_tocam * this->tb_radius; } Eigen::Vector3f CamTrackball::get_viewdir(void) const { return -this->tb_tocam; } Eigen::Vector3f const& CamTrackball::get_upvec(void) const { return this->tb_upvec; } CamTrackball::CamTrackball(void) { this->cam = nullptr; this->tb_radius = 1.0f; this->tb_center = Eigen::Vector3f::Zero(); this->tb_tocam = Eigen::Vector3f(0.0f, 0.0f, 1.0f); this->tb_upvec = Eigen::Vector3f(0.0f, 1.0f, 0.0f); } bool CamTrackball::consume_event(MouseEvent const& event) { bool is_handled = false; if (event.type == MOUSE_EVENT_PRESS) { if (event.button == MOUSE_BUTTON_LEFT) { this->rot_mouse_x = event.x; this->rot_mouse_y = event.y; this->rot_tb_tocam = this->tb_tocam; this->rot_tb_upvec = this->tb_upvec; } else if (event.button == MOUSE_BUTTON_MIDDLE) { this->zoom_mouse_y = event.y; this->zoom_tb_radius = this->tb_radius; } is_handled = true; } else if (event.type == MOUSE_EVENT_MOVE) { if (event.button_mask & MOUSE_BUTTON_LEFT) { if (event.x == this->rot_mouse_x && event.y == this->rot_mouse_y) { this->tb_tocam = this->rot_tb_tocam; this->tb_upvec = this->rot_tb_upvec; } else { this->handle_tb_rotation(event.x, event.y); } is_handled = true; } if (event.button_mask & MOUSE_BUTTON_MIDDLE) { int mouse_diff = this->zoom_mouse_y - event.y; float zoom_speed = this->zoom_tb_radius / 100.0f; float cam_diff = (float)mouse_diff * zoom_speed; float new_radius = this->zoom_tb_radius + cam_diff; this->tb_radius = sfm::clamp(new_radius, this->cam->z_near, this->cam->z_far); is_handled = true; } } else if (event.type == MOUSE_EVENT_WHEEL_UP) { this->tb_radius = this->tb_radius + this->tb_radius / 10.0f; this->tb_radius = std::min(this->cam->z_far, this->tb_radius); is_handled = true; } else if (event.type == MOUSE_EVENT_WHEEL_DOWN) { this->tb_radius = this->tb_radius - this->tb_radius / 10.0f; this->tb_radius = std::max(this->cam->z_near, this->tb_radius); is_handled = true; } return is_handled; } void CamTrackball::handle_tb_rotation(int x, int y) { // Get ball normals. Eigen::Vector3f bn_start = this->get_ball_normal( this->rot_mouse_x, this->rot_mouse_y); Eigen::Vector3f bn_now = this->get_ball_normal(x, y); // Rotation axis and angle. Eigen::Vector3f axis = bn_now.cross(bn_start); float angle = std::acos(bn_now.dot(bn_start)); // Rotate axis to world coords. Build inverse viewing matrix from // values stored at the time of mouse click. Eigen::Matrix4f cam_to_world; Eigen::Vector3f campos = this->tb_center + this->rot_tb_tocam * this->tb_radius; Eigen::Vector3f viewdir = -this->rot_tb_tocam; cam_to_world = sfm::matrix_inverse_viewtrans( campos, viewdir, this->rot_tb_upvec); axis = sfm::mult_homogeneous(cam_to_world, axis, 0.0f); axis.normalize(); // Rotate camera and up vector around axis. Eigen::Matrix3f rot = matrix_rotation_from_axis_angle(axis, angle); this->tb_tocam = rot * this->rot_tb_tocam; this->tb_upvec = rot * this->rot_tb_upvec; } Eigen::Vector3f CamTrackball::get_ball_normal(int x, int y) { // Calculate normal on unit sphere. Eigen::Vector3f sn; sn[0] = 2.0f * (float)x / (float)(this->cam->width - 1) - 1.0f; sn[1] = 1.0f - 2.0f * (float)y / (float)(this->cam->height - 1); float z2 = 1.0f - sn[0] * sn[0] - sn[1] * sn[1]; sn[2] = z2 > 0.0f ? std::sqrt(z2) : 0.0f; return sn.normalized(); } // GlContext void GlContext::init(void) { this->controller.set_camera(&this->camera); this->init_impl(); } void GlContext::resize(int new_width, int new_height) { std::swap(new_width, this->width); std::swap(new_height, this->height); this->resize_impl(new_width, new_height); } void GlContext::paint(void) { this->paint_impl(); } bool GlContext::mouse_event(MouseEvent const& event) { bool is_handled = this->controller.consume_event(event); this->update_camera(); return is_handled; } void GlContext::resize_impl(int /*old_width*/, int /*old_height*/) { glFunctions()->glViewport(0, 0, this->width, this->height); this->camera.width = this->width; this->camera.height = this->height; float aspect = (float)this->width / (float)this->height; float minside = 0.05f; if (this->width > this->height) { this->camera.top = minside; this->camera.right = minside * aspect; } else { this->camera.top = minside / aspect; this->camera.right = minside; } this->camera.update_proj_mat(); } void GlContext::update_camera(void) { this->camera.pos = this->controller.get_campos(); this->camera.viewing_dir = this->controller.get_viewdir(); this->camera.up_vec = this->controller.get_upvec(); this->camera.update_view_mat(); } } ================================================ FILE: src/asp/SfmView/GlContext.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_GL_CONTEXT_H__ #define __ASP_SFMVIEW_GL_CONTEXT_H__ #include <asp/SfmView/SfmMath.h> #include <asp/SfmView/GlCommon.h> namespace sfm { // Trackball camera control that consumes mouse events. class CamTrackball { public: CamTrackball(void); void set_camera(SfmCamera* camera); bool consume_event(MouseEvent const& event); Eigen::Vector3f get_campos(void) const; Eigen::Vector3f get_viewdir(void) const; Eigen::Vector3f const& get_upvec(void) const; private: void handle_tb_rotation(int x, int y); Eigen::Vector3f get_ball_normal(int x, int y); SfmCamera* cam; float tb_radius; Eigen::Vector3f tb_center; Eigen::Vector3f tb_tocam; Eigen::Vector3f tb_upvec; int rot_mouse_x; int rot_mouse_y; Eigen::Vector3f rot_tb_tocam; Eigen::Vector3f rot_tb_upvec; float zoom_tb_radius; int zoom_mouse_y; }; // Rendering context with trackball camera control. // Subclass and override init_impl, resize_impl, paint_impl. class GlContext { public: virtual ~GlContext(void) {} void init(void); void resize(int new_width, int new_height); void paint(void); bool mouse_event(MouseEvent const& event); protected: virtual void init_impl(void) = 0; virtual void resize_impl(int old_width, int old_height); virtual void paint_impl(void) = 0; void update_camera(void); SfmCamera camera; CamTrackball controller; int width = 0; int height = 0; }; } #endif // __ASP_SFMVIEW_GL_CONTEXT_H__ ================================================ FILE: src/asp/SfmView/GlWidget.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/GlCommon.h> #include <asp/SfmView/GlWidget.h> #include <QApplication> #include <ctime> #include <iostream> GlWidget::GlWidget(QWidget *parent): QOpenGLWidget(parent), context(nullptr), gl_width(500), gl_height(500), cx_init(false) { this->setFocusPolicy(Qt::StrongFocus); this->makeCurrent(); this->device_pixel_ratio = static_cast<QGuiApplication*>( QApplication::instance())->devicePixelRatio(); // This timer triggers a repaint after all events in the window system's // event queue have been processed. Thus a snappy 3D view is provided. this->repaint_timer = new QTimer(this); this->repaint_timer->setSingleShot(true); connect(this->repaint_timer, SIGNAL(timeout()), this, SLOT(repaint())); } GlWidget::~GlWidget(void) { } void GlWidget::initializeGL() { } void GlWidget::resizeGL(int width, int height) { width *= this->device_pixel_ratio; height *= this->device_pixel_ratio; this->gl_width = width; this->gl_height = height; if (this->context != nullptr) this->context->resize(width, height); } void GlWidget::paintGL() { if (this->context == 0) return; // Current context may need initialization. if (this->cx_init) { if (this->init_set.find(this->context) == this->init_set.end()) { this->context->init(); this->context->resize(this->gl_width, this->gl_height); this->init_set.insert(this->context); // Mark initialized } this->cx_init = false; } // Paint it! this->context->paint(); } QSize GlWidget::minimumSizeHint() const { return QSize(50, 50); } QSize GlWidget::sizeHint() const { return QSize(400, 400); } void GlWidget::repaint_async(void) { // Don't issue an immediate repaint but let the timer trigger // a repaint after all events have been processed. if (this->repaint_timer->isActive()) return; this->repaint_timer->start(); } void GlWidget::set_context(sfm::GlContext* context) { this->context = context; this->cx_init = true; } void GlWidget::mousePressEvent(QMouseEvent *event) { this->makeCurrent(); sfm::MouseEvent e; e.type = sfm::MOUSE_EVENT_PRESS; e.button = (sfm::MouseButton)event->button(); e.button_mask = event->buttons(); e.x = event->localPos().x() * this->device_pixel_ratio; e.y = event->localPos().y() * this->device_pixel_ratio; this->context->mouse_event(e); this->repaint_async(); } void GlWidget::mouseReleaseEvent(QMouseEvent *event) { this->makeCurrent(); sfm::MouseEvent e; e.type = sfm::MOUSE_EVENT_RELEASE; e.button = (sfm::MouseButton)event->button(); e.button_mask = event->buttons(); e.x = event->localPos().x() * this->device_pixel_ratio; e.y = event->localPos().y() * this->device_pixel_ratio; this->context->mouse_event(e); this->repaint_async(); } void GlWidget::mouseMoveEvent(QMouseEvent *event) { this->makeCurrent(); sfm::MouseEvent e; e.type = sfm::MOUSE_EVENT_MOVE; e.button = (sfm::MouseButton)event->button(); e.button_mask = event->buttons(); e.x = event->localPos().x() * this->device_pixel_ratio; e.y = event->localPos().y() * this->device_pixel_ratio; this->context->mouse_event(e); this->repaint_async(); } void GlWidget::wheelEvent(QWheelEvent* event) { this->makeCurrent(); sfm::MouseEvent e; if (event->angleDelta().y() < 0) e.type = sfm::MOUSE_EVENT_WHEEL_DOWN; else e.type = sfm::MOUSE_EVENT_WHEEL_UP; e.button = sfm::MOUSE_BUTTON_NONE; e.button_mask = event->buttons(); e.x = event->position().x() * this->device_pixel_ratio; e.y = event->position().y() * this->device_pixel_ratio; this->context->mouse_event(e); this->repaint_async(); } ================================================ FILE: src/asp/SfmView/GlWidget.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_GL_WIDGET_H__ #define __ASP_SFMVIEW_GL_WIDGET_H__ #include <asp/SfmView/GlContext.h> #include <QtOpenGLWidgets/QOpenGLWidget> #include <QMouseEvent> #include <QTimer> #include <set> class GlWidget: public QOpenGLWidget { Q_OBJECT public: GlWidget(QWidget* parent = nullptr); ~GlWidget(); void set_context(sfm::GlContext* context); QSize minimumSizeHint() const; QSize sizeHint() const; public slots: void repaint_async(void); protected: void initializeGL(void); void paintGL(void); void resizeGL(int width, int height); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void wheelEvent(QWheelEvent* event); private: sfm::GlContext* context; int gl_width; int gl_height; qreal device_pixel_ratio; bool cx_init; std::set<sfm::GlContext*> init_set; QTimer* repaint_timer; }; #endif // __ASP_SFMVIEW_GL_WIDGET_H__ ================================================ FILE: src/asp/SfmView/MeshRenderer.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/MeshRenderer.h> #include <stdexcept> namespace sfm { // VertexBuffer VertexBuffer::Ptr VertexBuffer::create() { Ptr vb(new VertexBuffer); vb->buf.create(); return vb; } void VertexBuffer::set_data(GLfloat const* data, GLsizei elems, GLint vpv) { this->datatype = GL_FLOAT; this->vpv = vpv; this->elems = elems; this->buf.setUsagePattern(QOpenGLBuffer::StaticDraw); this->buf.bind(); this->buf.allocate(data, elems * vpv * sizeof(GLfloat)); } void VertexBuffer::set_indices(GLuint const* data, GLsizei num_indices) { this->buf = QOpenGLBuffer(QOpenGLBuffer::IndexBuffer); this->buf.create(); this->datatype = GL_UNSIGNED_INT; this->vpv = 3; this->elems = num_indices; this->buf.setUsagePattern(QOpenGLBuffer::StaticDraw); this->buf.bind(); this->buf.allocate(data, num_indices * sizeof(GLuint)); } // VertexArray VertexArray::VertexArray(void) { this->vao.create(); this->primitive = GL_TRIANGLES; } VertexArray::~VertexArray(void) { this->vao.destroy(); } void VertexArray::set_primitive(GLuint primitive) { this->primitive = primitive; } void VertexArray::set_vertex_vbo(VertexBuffer::Ptr vbo) { this->vert_vbo = vbo; } void VertexArray::set_index_vbo(VertexBuffer::Ptr vbo) { this->index_vbo = vbo; } void VertexArray::add_vbo(VertexBuffer::Ptr vbo, std::string const& name) { this->vbo_list.push_back(std::make_pair(vbo, name)); } void VertexArray::set_shader(QOpenGLShaderProgram* shader) { this->shader = shader; } void VertexArray::reset_vertex_array(void) { this->vert_vbo.reset(); this->index_vbo.reset(); this->vbo_list.clear(); this->vao.destroy(); this->vao.create(); } void VertexArray::assign_attrib(BoundVBO const& bound_vbo) { VertexBuffer::Ptr vbo = bound_vbo.first; std::string const& name = bound_vbo.second; GLint location = this->shader->attributeLocation(name.c_str()); if (location < 0) return; vbo->buf.bind(); glFunctions()->glVertexAttribPointer(location, vbo->vpv, vbo->datatype, GL_TRUE, 0, nullptr); glFunctions()->glEnableVertexAttribArray(location); } void VertexArray::draw(void) { if (this->vert_vbo == nullptr) throw std::runtime_error("No vertex VBO set!"); if (this->shader == nullptr) throw std::runtime_error("No shader program set!"); auto f = glFunctions(); this->vao.bind(); this->shader->bind(); this->assign_attrib(BoundVBO(this->vert_vbo, SFM_ATTRIB_POSITION)); for (std::size_t i = 0; i < this->vbo_list.size(); ++i) this->assign_attrib(this->vbo_list[i]); if (this->index_vbo != nullptr) { this->index_vbo->buf.bind(); f->glDrawElements(this->primitive, this->index_vbo->elems, GL_UNSIGNED_INT, nullptr); } else { f->glDrawArrays(this->primitive, 0, this->vert_vbo->elems); } this->shader->release(); this->vao.release(); } // MeshRenderer void MeshRenderer::set_mesh(sfm::TriangleMesh::ConstPtr mesh) { if (mesh == nullptr) throw std::invalid_argument("Got null mesh"); this->reset_vertex_array(); sfm::TriangleMesh::VertexList const& verts(mesh->get_vertices()); sfm::TriangleMesh::FaceList const& faces(mesh->get_faces()); sfm::TriangleMesh::NormalList const& vnormals(mesh->get_vertex_normals()); sfm::TriangleMesh::ColorList const& vcolors(mesh->get_vertex_colors()); sfm::TriangleMesh::TexCoordList const& vtexuv(mesh->get_vertex_texcoords()); { VertexBuffer::Ptr vbo = VertexBuffer::create(); vbo->set_data(&verts[0][0], (GLsizei)verts.size(), 3); this->set_vertex_vbo(vbo); } if (!faces.empty()) { VertexBuffer::Ptr vbo = VertexBuffer::create(); vbo->set_indices(&faces[0], (GLsizei)faces.size()); this->set_index_vbo(vbo); } if (!vnormals.empty()) { VertexBuffer::Ptr vbo = VertexBuffer::create(); vbo->set_data(&vnormals[0][0], (GLsizei)vnormals.size(), 3); this->add_vbo(vbo, SFM_ATTRIB_NORMAL); } if (!vcolors.empty()) { VertexBuffer::Ptr vbo = VertexBuffer::create(); vbo->set_data(&vcolors[0][0], (GLsizei)vcolors.size(), 4); this->add_vbo(vbo, SFM_ATTRIB_COLOR); } if (!vtexuv.empty()) { VertexBuffer::Ptr vbo = VertexBuffer::create(); vbo->set_data(&vtexuv[0][0], (GLsizei)vtexuv.size(), 2); this->add_vbo(vbo, SFM_ATTRIB_TEXCOORD); } } MeshRenderer::Ptr MeshRenderer::create(sfm::TriangleMesh::ConstPtr mesh) { return Ptr(new MeshRenderer(mesh)); } MeshRenderer::MeshRenderer(sfm::TriangleMesh::ConstPtr mesh) { this->set_mesh(mesh); } } ================================================ FILE: src/asp/SfmView/MeshRenderer.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_MESH_RENDERER_H__ #define __ASP_SFMVIEW_MESH_RENDERER_H__ #include <asp/SfmView/SfmMath.h> #include <asp/SfmView/GlCommon.h> #include <QOpenGLBuffer> #include <QOpenGLShaderProgram> #include <QOpenGLVertexArrayObject> #include <memory> #include <string> #include <utility> #include <vector> #define SFM_ATTRIB_POSITION "pos" #define SFM_ATTRIB_NORMAL "normal" #define SFM_ATTRIB_COLOR "color" #define SFM_ATTRIB_TEXCOORD "texuv" namespace sfm { // VBO wrapper: QOpenGLBuffer plus metadata for vertex attributes. struct VertexBuffer { typedef std::shared_ptr<VertexBuffer> Ptr; QOpenGLBuffer buf; GLenum datatype = GL_FLOAT; GLint vpv = 0; // values per vertex GLsizei elems = 0; // number of elements static Ptr create(); void set_data(GLfloat const* data, GLsizei elems, GLint vpv); void set_indices(GLuint const* data, GLsizei num_indices); }; // OpenGL vertex array object (VAO) abstraction. class VertexArray { public: typedef std::shared_ptr<VertexArray> Ptr; typedef std::pair<VertexBuffer::Ptr, std::string> BoundVBO; typedef std::vector<BoundVBO> VBOList; virtual ~VertexArray(void); void set_primitive(GLuint primitive); void set_shader(QOpenGLShaderProgram* shader); void set_vertex_vbo(VertexBuffer::Ptr vbo); void set_index_vbo(VertexBuffer::Ptr vbo); void add_vbo(VertexBuffer::Ptr vbo, std::string const& name); void reset_vertex_array(void); void draw(void); protected: VertexArray(void); void assign_attrib(BoundVBO const& bound_vbo); private: QOpenGLVertexArrayObject vao; GLuint primitive; QOpenGLShaderProgram* shader; VertexBuffer::Ptr vert_vbo; VertexBuffer::Ptr index_vbo; VBOList vbo_list; }; // Takes a TriangleMesh and creates VBOs for rendering. class MeshRenderer: public VertexArray { public: typedef std::shared_ptr<MeshRenderer> Ptr; static Ptr create(sfm::TriangleMesh::ConstPtr mesh); void set_mesh(sfm::TriangleMesh::ConstPtr mesh); private: MeshRenderer(sfm::TriangleMesh::ConstPtr mesh); }; } #endif // __ASP_SFMVIEW_MESH_RENDERER_H__ ================================================ FILE: src/asp/SfmView/SceneManager.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/SceneManager.h> SceneManager::SceneManager(void) { } SceneManager::~SceneManager(void) { } SceneManager& SceneManager::get(void) { static SceneManager instance; return instance; } void SceneManager::select_scene(sfm::Scene::Ptr scene) { this->scene = scene; emit this->scene_selected(scene); } void SceneManager::select_view(sfm::View::Ptr view) { this->view = view; emit this->view_selected(view); } sfm::Scene::Ptr SceneManager::get_scene(void) { return this->scene; } void SceneManager::reset_scene(void) { this->select_scene(sfm::Scene::Ptr()); } void SceneManager::reset_view(void) { this->select_view(sfm::View::Ptr()); } ================================================ FILE: src/asp/SfmView/SceneManager.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_SCENE_MANAGER_H__ #define __ASP_SFMVIEW_SCENE_MANAGER_H__ #include <asp/SfmView/SfmUtils.h> #include <QObject> // Singleton signal hub for scene and view selection. // SfmMainWindow selects the scene, SceneOverview selects views. class SceneManager: public QObject { Q_OBJECT private: sfm::Scene::Ptr scene; sfm::View::Ptr view; signals: void scene_selected(sfm::Scene::Ptr scene); void view_selected(sfm::View::Ptr view); public: SceneManager(void); ~SceneManager(void); static SceneManager& get(void); void select_scene(sfm::Scene::Ptr scene); void select_view(sfm::View::Ptr view); sfm::Scene::Ptr get_scene(void); void reset_scene(void); void reset_view(void); }; #endif // __ASP_SFMVIEW_SCENE_MANAGER_H__ ================================================ FILE: src/asp/SfmView/SceneOverview.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/SceneManager.h> #include <asp/SfmView/SceneOverview.h> #include <QVBoxLayout> QSize SceneOverview::sizeHint(void) const { return QSize(175, 0); } SceneOverview::SceneOverview(QWidget* parent): QWidget(parent) { this->viewlist = new QListWidget(); this->viewlist->setEnabled(false); QVBoxLayout* vbox = new QVBoxLayout(this); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); vbox->addWidget(this->viewlist); this->connect(this->viewlist, SIGNAL(currentRowChanged(int)), this, SLOT(on_row_changed(int))); this->connect(&SceneManager::get(), SIGNAL(scene_selected(sfm::Scene::Ptr)), this, SLOT(on_scene_changed(sfm::Scene::Ptr))); } void SceneOverview::on_scene_changed(sfm::Scene::Ptr scene) { this->viewlist->clear(); this->viewlist->setEnabled(false); if (scene == nullptr) return; sfm::Scene::ViewList& sl(scene->get_views()); if (sl.empty()) { QListWidgetItem* item = new QListWidgetItem("Scene has no views!"); item->setData(Qt::UserRole, -1); this->viewlist->addItem(item); } else { this->viewlist->setEnabled(true); } for (std::size_t i = 0; i < sl.size(); ++i) { sfm::View::Ptr view(sl[i]); if (view == nullptr) continue; this->add_view_to_layout(i, view); } } void SceneOverview::add_view_to_layout(std::size_t id, sfm::View::Ptr view) { if (view == nullptr) return; std::string const& view_name = view->get_name(); bool cam_valid = view->get_camera().flen != 0.0f; QString name = QString(view_name.c_str()); QListWidgetItem* item = new QListWidgetItem(name); if (!cam_valid) item->setBackground(QColor(255, 221, 221)); item->setData(Qt::UserRole, (int)id); this->viewlist->addItem(item); } void SceneOverview::on_row_changed(int id) { if (id < 0) return; QListWidgetItem* item = this->viewlist->item(id); std::size_t view_id = (std::size_t)item->data(Qt::UserRole).toInt(); sfm::Scene::Ptr scene(SceneManager::get().get_scene()); sfm::View::Ptr view(scene->get_view_by_id(view_id)); SceneManager::get().select_view(view); } ================================================ FILE: src/asp/SfmView/SceneOverview.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_SCENE_OVERVIEW_H__ #define __ASP_SFMVIEW_SCENE_OVERVIEW_H__ #include <asp/SfmView/SfmUtils.h> #include <QListWidget> class SceneOverview: public QWidget { Q_OBJECT protected slots: void on_scene_changed(sfm::Scene::Ptr scene); void on_row_changed(int id); private: void add_view_to_layout(std::size_t id, sfm::View::Ptr view); QListWidget* viewlist; public: SceneOverview(QWidget* parent); QSize sizeHint(void) const; }; #endif // __ASP_SFMVIEW_SCENE_OVERVIEW_H__ ================================================ FILE: src/asp/SfmView/SceneRenderer.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/SceneManager.h> #include <asp/SfmView/SceneRenderer.h> #include <QOpenGLShaderProgram> #include <iostream> #include <limits> // GLSL shaders. Colors are baked into mesh vertices: green for the ground grid, // white for camera frusta, yellow for view direction, RGB for camera coordinate // axes. static char const* const WIREFRAME_VERT = "#version 330 core\n" "in vec4 pos;\n" "in vec4 color;\n" "out vec4 ocolor;\n" "uniform mat4 viewmat;\n" "uniform mat4 projmat;\n" "void main(void) {\n" " ocolor = color;\n" " gl_Position = projmat * (viewmat * pos);\n" "}\n"; static char const* const WIREFRAME_FRAG = "#version 330 core\n" "in vec4 ocolor;\n" "layout(location=0) out vec4 frag_color;\n" "void main(void) {\n" " gl_FragDepth = gl_FragCoord.z;\n" " frag_color = ocolor;\n" "}\n"; void SceneRenderer::load_shaders(void) { if (!this->wireframe_shader) { this->wireframe_shader = new QOpenGLShaderProgram(); this->wireframe_shader->addShaderFromSourceCode( QOpenGLShader::Vertex, WIREFRAME_VERT); this->wireframe_shader->addShaderFromSourceCode( QOpenGLShader::Fragment, WIREFRAME_FRAG); this->wireframe_shader->link(); } } void SceneRenderer::send_uniform(sfm::SfmCamera const& cam) { this->wireframe_shader->bind(); // Eigen column-major matches GL column-major, so transpose=false GLint loc_view = this->wireframe_shader->uniformLocation("viewmat"); if (loc_view >= 0) glFunctions()->glUniformMatrix4fv(loc_view, 1, GL_FALSE, cam.view.data()); GLint loc_proj = this->wireframe_shader->uniformLocation("projmat"); if (loc_proj >= 0) glFunctions()->glUniformMatrix4fv(loc_proj, 1, GL_FALSE, cam.proj.data()); } SceneRenderer::SceneRenderer(GlWidget* gl_widget) { this->gl_widget = gl_widget; this->action_frusta = new QAction("Draw camera frusta"); this->action_frusta->setCheckable(true); this->action_frusta->setChecked(true); this->action_viewdir = new QAction("Draw viewing direction"); this->action_viewdir->setCheckable(true); this->action_viewdir->setChecked(true); this->action_ground = new QAction("Draw ground plane"); this->action_ground->setCheckable(true); this->action_ground->setChecked(true); this->frusta_size_slider = new QSlider(); this->frusta_size_slider->setMinimum(1); this->frusta_size_slider->setMaximum(100); this->frusta_size_slider->setValue(10); this->frusta_size_slider->setOrientation(Qt::Horizontal); this->connect(&SceneManager::get(), SIGNAL(scene_selected(sfm::Scene::Ptr)), this, SLOT(on_scene_changed())); this->connect(&SceneManager::get(), SIGNAL(view_selected(sfm::View::Ptr)), this, SLOT(reset_viewdir_renderer())); this->connect(this->frusta_size_slider, SIGNAL(valueChanged(int)), this, SLOT(reset_frusta_renderer())); this->connect(this->frusta_size_slider, SIGNAL(valueChanged(int)), this->gl_widget, SLOT(repaint())); this->connect(this->action_frusta, SIGNAL(toggled(bool)), this->gl_widget, SLOT(repaint())); this->connect(this->action_viewdir, SIGNAL(toggled(bool)), this->gl_widget, SLOT(repaint())); this->connect(this->action_ground, SIGNAL(toggled(bool)), this->gl_widget, SLOT(repaint())); } QAction* SceneRenderer::get_action_frusta(void) { return this->action_frusta; } QAction* SceneRenderer::get_action_viewdir(void) { return this->action_viewdir; } QAction* SceneRenderer::get_action_ground(void) { return this->action_ground; } QSlider* SceneRenderer::get_frusta_size_slider(void) { return this->frusta_size_slider; } void SceneRenderer::set_scene(sfm::Scene::Ptr scene) { this->scene = scene; this->gl_widget->repaint(); } void SceneRenderer::set_view(sfm::View::Ptr view) { this->view = view; this->gl_widget->repaint(); } void SceneRenderer::reset_scene(void) { this->scene = nullptr; this->view = nullptr; this->gl_widget->repaint(); } void SceneRenderer::on_scene_changed(void) { this->orig_cam_centers.clear(); this->orig_cam2world_vec.clear(); this->frusta_renderer.reset(); this->ground_renderer.reset(); } void SceneRenderer::reset_frusta_renderer(void) { this->frusta_renderer.reset(); this->ground_renderer.reset(); } void SceneRenderer::reset_ground_renderer(void) { this->ground_renderer.reset(); } void SceneRenderer::reset_viewdir_renderer(void) { this->viewdir_renderer.reset(); } void SceneRenderer::init_impl(void) { this->load_shaders(); } void SceneRenderer::resize_impl(int old_width, int old_height) { this->sfm::GlContext::resize_impl(old_width, old_height); } void SceneRenderer::paint_impl(void) { this->update_camera(); glFunctions()->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glFunctions()->glDepthFunc(GL_LESS); glFunctions()->glEnable(GL_DEPTH_TEST); glFunctions()->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glFunctions()->glClearDepthf(1.0f); glFunctions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); this->send_uniform(this->camera); if (this->action_frusta->isChecked()) { if (this->frusta_renderer == nullptr) this->create_frusta_renderer(); if (this->frusta_renderer != nullptr) this->frusta_renderer->draw(); } if (this->action_ground->isChecked()) { if (this->ground_renderer == nullptr) this->create_ground_renderer(); if (this->ground_renderer != nullptr) this->ground_renderer->draw(); } if (this->action_viewdir->isChecked()) { if (this->viewdir_renderer == nullptr) this->create_viewdir_renderer(); if (this->viewdir_renderer != nullptr) this->viewdir_renderer->draw(); } } // Add a camera frustum wireframe to a mesh. void add_camera_to_mesh(sfm::SfmCameraInfo const& camera, float size, sfm::TriangleMesh::Ptr mesh) { Eigen::Vector4f const frustum_start_color(1.0f, 1.0f, 1.0f, 1.0f); Eigen::Vector4f const frustum_end_color(1.0f, 1.0f, 1.0f, 1.0f); sfm::TriangleMesh::VertexList& verts = mesh->get_vertices(); sfm::TriangleMesh::ColorList& colors = mesh->get_vertex_colors(); sfm::TriangleMesh::FaceList& faces = mesh->get_faces(); Eigen::Matrix4f ctw = camera.fill_cam_to_world(); Eigen::Vector3f cam_x = sfm::mult_homogeneous(ctw, Eigen::Vector3f(1.0f, 0.0f, 0.0f), 0.0f); Eigen::Vector3f cam_y = sfm::mult_homogeneous(ctw, Eigen::Vector3f(0.0f, 1.0f, 0.0f), 0.0f); Eigen::Vector3f cam_z = sfm::mult_homogeneous(ctw, Eigen::Vector3f(0.0f, 0.0f, 1.0f), 0.0f); Eigen::Vector3f campos = sfm::mult_homogeneous(ctw, Eigen::Vector3f(0.0f, 0.0f, 0.0f), 1.0f); std::size_t idx = verts.size(); verts.push_back(campos); colors.push_back(frustum_start_color); for (int j = 0; j < 4; ++j) { Eigen::Vector3f corner = campos + size * cam_z + cam_x * size / (2.0f * camera.flen) * (j & 1 ? -1.0f : 1.0f) + cam_y * size / (2.0f * camera.flen) * (j & 2 ? -1.0f : 1.0f); verts.push_back(corner); colors.push_back(frustum_end_color); faces.push_back(idx + 0); faces.push_back(idx + 1 + j); } faces.push_back(idx + 1); faces.push_back(idx + 2); faces.push_back(idx + 2); faces.push_back(idx + 4); faces.push_back(idx + 4); faces.push_back(idx + 3); faces.push_back(idx + 3); faces.push_back(idx + 1); verts.push_back(campos); verts.push_back(campos + (size * 0.5f) * cam_x); verts.push_back(campos); verts.push_back(campos + (size * 0.5f) * cam_y); verts.push_back(campos); verts.push_back(campos + (size * 0.5f) * cam_z); colors.push_back(Eigen::Vector4f(1.0f, 0.0f, 0.0f, 1.0f)); colors.push_back(Eigen::Vector4f(1.0f, 0.0f, 0.0f, 1.0f)); colors.push_back(Eigen::Vector4f(0.0f, 1.0f, 0.0f, 1.0f)); colors.push_back(Eigen::Vector4f(0.0f, 1.0f, 0.0f, 1.0f)); colors.push_back(Eigen::Vector4f(0.0f, 0.0f, 1.0f, 1.0f)); colors.push_back(Eigen::Vector4f(0.0f, 0.0f, 1.0f, 1.0f)); faces.push_back(idx + 5); faces.push_back(idx + 6); faces.push_back(idx + 7); faces.push_back(idx + 8); faces.push_back(idx + 9); faces.push_back(idx + 10); } // Find shortest distance from camera center to the origin double find_shortest_distance(std::vector<Eigen::Vector3d> centers) { if (centers.size() == 0) return 1.0; double shortest = centers[0].norm(); for (std::size_t i = 1; i < centers.size(); i++) { double dist = centers[i].norm(); if (dist < shortest) shortest = dist; } return shortest; } // Function to find the mean camera position Eigen::Vector3d find_mean_camera_pos(std::vector<Eigen::Vector3d> const& centers) { if (centers.size() == 0) return Eigen::Vector3d::Zero(); Eigen::Vector3d mean = Eigen::Vector3d::Zero(); for (std::size_t i = 0; i < centers.size(); i++) mean += centers[i]; mean /= (double)centers.size(); return mean; } // Collect the cam2world matrices and camera centers in vectors. void extractSfmCameraPoses(sfm::Scene::ViewList const& views, // Outputs std::vector<Eigen::Vector3d>& cam_centers, std::vector<Eigen::Matrix3d>& cam2world_vec) { cam_centers.clear(); cam2world_vec.clear(); for (std::size_t i = 0; i < views.size(); i++) { if (views[i].get() == nullptr) { std::cerr << "Error: Empty camera.\n"; continue; } sfm::SfmCameraInfo const& cam = views[i]->get_camera(); // alias // The cameras store trans = -inverse(camera2world) * camera_center // and rot = inverse(camera2world). // We need to invert the camera2world matrix to get the camera center. // So, need to find: // and camera2world = transpose(rot) // camera_center = -camera2world * trans // cam.rot is row-major double[9], map it as row-major then convert Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>> world2cam_rm(cam.rot); Eigen::Matrix3d world2cam = world2cam_rm; // copy to column-major Eigen::Vector3d t = Eigen::Map<const Eigen::Vector3d>(cam.trans); Eigen::Matrix3d cam2world = world2cam.transpose(); Eigen::Vector3d ctr = -(cam2world * t); cam_centers.push_back(ctr); cam2world_vec.push_back(cam2world); } return; } // Apply the camera2world transforms and camera centers to the cameras void applySfmCameraPoses(std::vector<Eigen::Vector3d> const& cam_centers, std::vector<Eigen::Matrix3d> const& cam2world_vec, sfm::Scene::ViewList& views) { for (std::size_t i = 0; i < views.size(); i++) { if (views[i].get() == nullptr) { std::cerr << "Error: Empty camera.\n"; continue; } sfm::SfmCameraInfo cam = views[i]->get_camera(); // Compute T = -cam2world^T * C and copy to the camera Eigen::Vector3d t = -(cam2world_vec[i].transpose() * cam_centers[i]); for (int coord = 0; coord < 3; coord++) cam.trans[coord] = t[coord]; // Compute R = cam2world^T and copy to cam.rot (row-major double[9]) Eigen::Matrix3d R = cam2world_vec[i].transpose(); for (int row = 0; row < 3; row++) for (int col = 0; col < 3; col++) cam.rot[row * 3 + col] = R(row, col); views[i]->set_camera(cam); views[i]->set_dirty(false); } return; } // Given a vector, find a rotation matrix that rotates the vector to the y-axis. void completeVectorToRotation(Eigen::Vector3d& y, Eigen::Matrix3d& R) { int largest_comp = 0; for (int i = 1; i < 3; i++) { if (std::abs(y[i]) > std::abs(y[largest_comp])) largest_comp = i; } int j = largest_comp + 1; if (j == 3) j = 0; Eigen::Vector3d x = Eigen::Vector3d::Zero(); x[j] = y[largest_comp]; x[largest_comp] = -y[j]; if (std::abs(y[largest_comp]) == 0.0) { // Handle degenerate case, will return the identity matrix x = Eigen::Vector3d(1.0, 0.0, 0.0); y = Eigen::Vector3d(0.0, 1.0, 0.0); } x.normalize(); y.normalize(); // Find z as the cross product of x and y Eigen::Vector3d z = x.cross(y); z.normalize(); // Find the matrix with x, y, z as columns for (int row = 0; row < 3; row++) { R(row, 0) = x[row]; R(row, 1) = y[row]; R(row, 2) = z[row]; } return; } // Find the bounding box of the camera centers void bdBox(Eigen::Matrix3d const& EcefToGL, std::vector<Eigen::Vector3d>& cam_centers, // Outputs double& x_min, double& x_max, double& y_min, double& y_max, double& z_min, double& z_max) { double big = std::numeric_limits<double>::max(); x_min = big; y_min = big; z_min = big; x_max = -big; y_max = -big; z_max = -big; for (std::size_t i = 0; i < cam_centers.size(); i++) { Eigen::Vector3d trans_center = EcefToGL * cam_centers[i]; x_min = std::min(x_min, trans_center[0]); x_max = std::max(x_max, trans_center[0]); y_min = std::min(y_min, trans_center[1]); y_max = std::max(y_max, trans_center[1]); z_min = std::min(z_min, trans_center[2]); z_max = std::max(z_max, trans_center[2]); } } // Compute a ground plane, scale the orbital camera positions relative // to the plane, then plot the cameras and the ground plane. void SceneRenderer::create_frusta_renderer(void) { if (this->scene == nullptr) return; sfm::Scene::ViewList& views(this->scene->get_views()); // Cache the original poses on first call. Cleared by on_scene_changed(). if (this->orig_cam_centers.empty()) extractSfmCameraPoses(views, this->orig_cam_centers, this->orig_cam2world_vec); if (this->orig_cam_centers.empty()) { std::cerr << "Error: No cameras found.\n"; return; } // Work on copies so the originals are never modified. // All position arithmetic is done in double. Camera centers start // at orbital radii (millions of meters), which would lose precision // in the float GL pipeline. We normalize by dividing by the orbital // radius, rotate into the GL frame, then center and scale the // bounding box to ~[-1, 1]. Float is used only at render time, // when values are already O(1). std::vector<Eigen::Vector3d> cam_centers = this->orig_cam_centers; std::vector<Eigen::Matrix3d> cam2world_vec = this->orig_cam2world_vec; // Divide by orbital radius to bring positions from millions to ~1.0 double shortest_dist = find_shortest_distance(cam_centers); shortest_dist = std::max(shortest_dist, 0.0001); // avoid division by zero for (size_t cam = 0; cam < cam_centers.size(); cam++) cam_centers[cam] = cam_centers[cam] / shortest_dist; // Use the mean camera direction (from planet center) as the ground // plane normal. Build a rotation that maps this to the GL y-axis, // so the ground plane becomes the x-z plane (GL convention: y up). Eigen::Vector3d mean_cam_center = find_mean_camera_pos(cam_centers); Eigen::Vector3d y = mean_cam_center; // will change below Eigen::Matrix3d GLToEcef; completeVectorToRotation(y, GLToEcef); Eigen::Matrix3d EcefToGL = GLToEcef.transpose(); // Bounding box in the GL frame double x_min = 0, x_max = 0, y_min = 0, y_max = 0, z_min = 0, z_max = 0; bdBox(EcefToGL, cam_centers, x_min, x_max, y_min, y_max, z_min, z_max); double len = std::max(x_max - x_min, std::max(y_max - y_min, z_max - z_min)); if (len == 0.0) len = 1.0; // avoid division by zero double x_mid = (x_min + x_max)/2.0; double y_mid = (y_min + y_max)/2.0; double z_mid = (z_min + z_max)/2.0; // Center and scale to ~[-1, 1], then shift for visual placement double GL_cam_shift_y = 0.2; // cameras above the ground plane double GL_ground_shift_y = -0.8; for (std::size_t i = 0; i < cam_centers.size(); i++) { Eigen::Vector3d cam_center = cam_centers[i]; Eigen::Vector3d trans_center = EcefToGL * cam_center; trans_center[0] = (trans_center[0] - x_mid)/len; trans_center[1] = (trans_center[1] - y_mid)/len + GL_cam_shift_y; trans_center[2] = (trans_center[2] - z_mid)/len; cam_centers[i] = GLToEcef * trans_center; } if (z_max - z_min > x_max - x_min) { // Rotate around the y axis by 90 degrees to show the cameras // side-by-side as seen in the OpenGL default coordinate system. Eigen::Matrix3d R90; R90 << 0, 0, -1, 0, 1, 0, 1, 0, 0; EcefToGL = R90 * EcefToGL; } // Rotate the camera positions and orientations double GL_cam_shift_z = -0.5; // Move the cameras a bit to the back for (std::size_t i = 0; i < cam_centers.size(); i++) { cam_centers[i] = EcefToGL * cam_centers[i]; cam_centers[i][2] += GL_cam_shift_z; cam2world_vec[i] = EcefToGL * cam2world_vec[i]; } // Apply the camera positions and orientations to the views applySfmCameraPoses(cam_centers, cam2world_vec, views); // Plot the cameras as meshes sfm::TriangleMesh::Ptr mesh = sfm::TriangleMesh::create(); sfm::TriangleMesh::VertexList& verts(mesh->get_vertices()); sfm::TriangleMesh::FaceList& faces(mesh->get_faces()); sfm::TriangleMesh::ColorList& colors(mesh->get_vertex_colors()); Eigen::Vector4f color(0.0f, 1.0f, 0.0f, 1.0f); // green float size = this->frusta_size_slider->value() / 100.0f; for (std::size_t i = 0; i < views.size(); i++) { if (views[i].get() == nullptr) { std::cerr << "Error: Empty camera.\n"; continue; } sfm::SfmCameraInfo const& cam = views[i]->get_camera(); if (cam.flen == 0.0f) { std::cerr << "Error: SfmCamera focal length is 0.\n"; continue; } add_camera_to_mesh(cam, size, mesh); } this->frusta_renderer = sfm::MeshRenderer::create(mesh); this->frusta_renderer->set_shader(this->wireframe_shader); this->frusta_renderer->set_primitive(GL_LINES); } void SceneRenderer::create_ground_renderer(void) { sfm::TriangleMesh::Ptr mesh = sfm::TriangleMesh::create(); sfm::TriangleMesh::VertexList& verts(mesh->get_vertices()); sfm::TriangleMesh::FaceList& faces(mesh->get_faces()); sfm::TriangleMesh::ColorList& colors(mesh->get_vertex_colors()); Eigen::Vector4f color(0.0f, 1.0f, 0.0f, 1.0f); // green // Draw a ground plane as (x, z) in [-1, 1] x [-1, 1] at some height y. double GL_ground_shift_y = -0.8; double d = 10.0; for (size_t i = 1; i <= 22; i++) { double x[2], z[2]; if (i <= 11) { z[0] = 2.0*(i - 6.0)/d; z[1] = z[0]; x[0] = -1.0; x[1] = 1.0; } else { x[0] = 2.0*(i - 11 - 6.0)/d; x[1] = x[0]; z[0] = -1.0; z[1] = 1.0; } Eigen::Vector3f v1((float)x[0], (float)GL_ground_shift_y, (float)z[0]); Eigen::Vector3f v2((float)x[1], (float)GL_ground_shift_y, (float)z[1]); verts.push_back(v1); verts.push_back(v2); faces.push_back(verts.size() - 2); faces.push_back(verts.size() - 1); colors.push_back(color); colors.push_back(color); } this->ground_renderer = sfm::MeshRenderer::create(mesh); this->ground_renderer->set_shader(this->wireframe_shader); this->ground_renderer->set_primitive(GL_LINES); } void SceneRenderer::create_viewdir_renderer(void) { if (this->view == nullptr) return; sfm::SfmCameraInfo const& cam(this->view->get_camera()); Eigen::Vector3f campos = cam.fill_camera_pos(); Eigen::Vector3f viewdir = cam.fill_viewing_direction(); sfm::TriangleMesh::Ptr mesh = sfm::TriangleMesh::create(); sfm::TriangleMesh::VertexList& verts = mesh->get_vertices(); sfm::TriangleMesh::ColorList& colors = mesh->get_vertex_colors(); verts.push_back(campos); verts.push_back(campos + viewdir * 100.0f); colors.push_back(Eigen::Vector4f(1.0f, 1.0f, 0.0f, 1.0f)); colors.push_back(Eigen::Vector4f(1.0f, 1.0f, 0.0f, 1.0f)); this->viewdir_renderer = sfm::MeshRenderer::create(mesh); this->viewdir_renderer->set_shader(this->wireframe_shader); this->viewdir_renderer->set_primitive(GL_LINES); } ================================================ FILE: src/asp/SfmView/SceneRenderer.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_SCENE_RENDERER_H__ #define __ASP_SFMVIEW_SCENE_RENDERER_H__ #include <asp/SfmView/GlCommon.h> #include <asp/SfmView/SfmUtils.h> #include <asp/SfmView/GlContext.h> #include <asp/SfmView/MeshRenderer.h> #include <asp/SfmView/GlWidget.h> #include <QAction> #include <QSlider> // 3D renderer: draws camera frusta, ground plane, viewing direction. class SceneRenderer: public QWidget, public sfm::GlContext { Q_OBJECT public: SceneRenderer(GlWidget* gl_widget); void set_scene(sfm::Scene::Ptr scene); void set_view(sfm::View::Ptr view); void reset_scene(void); QAction* get_action_frusta(void); QAction* get_action_viewdir(void); QAction* get_action_ground(void); QSlider* get_frusta_size_slider(void); protected: void init_impl(void); void resize_impl(int old_width, int old_height); void paint_impl(void); private slots: void reset_viewdir_renderer(void); void reset_frusta_renderer(void); void reset_ground_renderer(void); void on_scene_changed(void); private: void load_shaders(void); void send_uniform(sfm::SfmCamera const& cam); void create_frusta_renderer(void); void create_ground_renderer(void); void create_viewdir_renderer(void); GlWidget* gl_widget; QOpenGLShaderProgram* wireframe_shader = nullptr; sfm::Scene::Ptr scene; sfm::View::Ptr view; QAction* action_frusta; QAction* action_viewdir; QAction* action_ground; QSlider* frusta_size_slider; sfm::MeshRenderer::Ptr frusta_renderer; sfm::MeshRenderer::Ptr ground_renderer; sfm::MeshRenderer::Ptr viewdir_renderer; // Cached original poses (before GL transformation). // Cleared on scene change, preserved across slider changes. std::vector<Eigen::Vector3d> orig_cam_centers; std::vector<Eigen::Matrix3d> orig_cam2world_vec; }; #endif // __ASP_SFMVIEW_SCENE_RENDERER_H__ ================================================ FILE: src/asp/SfmView/SfmMainWindow.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/SceneManager.h> #include <asp/SfmView/SfmMainWindow.h> #include <QApplication> #include <QBoxLayout> #include <QDialog> #include <QDockWidget> #include <QMenuBar> #include <QMessageBox> #include <QSlider> SfmMainWindow::~SfmMainWindow(void) { } SfmMainWindow::SfmMainWindow(int width, int height) { this->scene_overview = new SceneOverview(this); // Create GL widget and scene renderer this->gl_widget = new GlWidget(); this->scene_renderer = new SceneRenderer(this->gl_widget); this->gl_widget->set_context(this->scene_renderer); this->connect(&SceneManager::get(), SIGNAL(scene_selected(sfm::Scene::Ptr)), this, SLOT(on_scene_selected(sfm::Scene::Ptr))); this->connect(&SceneManager::get(), SIGNAL(view_selected(sfm::View::Ptr)), this, SLOT(on_view_selected(sfm::View::Ptr))); // Create dock widgets this->dock_scene = new QDockWidget(tr("SfmCameras")); this->dock_scene->setWidget(this->scene_overview); this->dock_scene->setFeatures(QDockWidget::NoDockWidgetFeatures); // Use in-window menu bar to avoid macOS auto-injected menus this->menuBar()->setNativeMenuBar(false); this->create_actions(); this->create_menus(); QWidget* central_widget(new QWidget(this)); QLayout* central_layout(new QVBoxLayout(central_widget)); central_layout->addWidget(this->gl_widget); this->setWindowTitle(tr("sfm_view")); this->setCentralWidget(central_widget); this->addDockWidget(Qt::LeftDockWidgetArea, this->dock_scene); this->resize(width, height); this->show(); } void SfmMainWindow::load_scene(std::vector<std::string> const& cameras) { sfm::Scene::Ptr scene; try { scene = sfm::Scene::create(cameras); } catch (std::exception& e) { QMessageBox::information(this, tr("Error loading scene"), tr("Scene could not be loaded.\n" "Error: %1").arg(e.what())); return; } SceneManager::get().select_scene(scene); } void SfmMainWindow::create_actions(void) { this->action_quit = new QAction(tr("&Quit"), this); this->action_quit->setShortcut(tr("Ctrl+Q")); this->connect(this->action_quit, SIGNAL(triggered()), this, SLOT(close())); this->action_about = new QAction(tr("&About"), this); this->connect(this->action_about, SIGNAL(triggered()), this, SLOT(on_about())); } void SfmMainWindow::create_menus(void) { this->menu_file = new QMenu(tr("&File"), this); this->menu_file->addAction(this->action_quit); this->menu_view = new QMenu(tr("&View"), this); this->menu_view->addAction(this->scene_renderer->get_action_frusta()); this->menu_view->addAction(this->scene_renderer->get_action_ground()); this->menu_view->addAction(this->scene_renderer->get_action_viewdir()); QAction* action_frusta_size = new QAction(tr("Set frusta size"), this); this->connect(action_frusta_size, SIGNAL(triggered()), this, SLOT(on_frusta_size())); this->menu_view->addAction(action_frusta_size); this->menu_help = new QMenu(tr("&Help"), this); this->menu_help->addAction(this->action_about); this->menuBar()->addMenu(this->menu_file); this->menuBar()->addMenu(this->menu_view); this->menuBar()->addMenu(this->menu_help); this->menuBar()->show(); } void SfmMainWindow::on_scene_selected(sfm::Scene::Ptr scene) { this->scene_renderer->set_scene(scene); } void SfmMainWindow::on_view_selected(sfm::View::Ptr view) { this->scene_renderer->set_view(view); } void SfmMainWindow::perform_close_scene(void) { SceneManager::get().reset_view(); SceneManager::get().reset_scene(); this->scene_renderer->reset_scene(); } void SfmMainWindow::on_about(void) { QMessageBox::about(this, tr("About sfm_view"), tr("SfmCamera pose viewer for ASP. Based on " "<a href=\"https://github.com/simonfuhrmann/mve\">MVE</a>.")); } void SfmMainWindow::on_frusta_size(void) { QSlider* slider = this->scene_renderer->get_frusta_size_slider(); QDialog dlg(this); dlg.setWindowTitle(tr("Frusta size")); QVBoxLayout* layout = new QVBoxLayout(&dlg); layout->addWidget(slider); dlg.resize(300, 60); dlg.exec(); // Reparent slider back so it survives the dialog destruction slider->setParent(nullptr); } void SfmMainWindow::closeEvent(QCloseEvent* event) { this->perform_close_scene(); event->accept(); } ================================================ FILE: src/asp/SfmView/SfmMainWindow.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_SFM_MAIN_WINDOW_H__ #define __ASP_SFMVIEW_SFM_MAIN_WINDOW_H__ #include <asp/SfmView/GlWidget.h> #include <asp/SfmView/SceneRenderer.h> #include <asp/SfmView/SceneOverview.h> #include <QMainWindow> #include <string> #include <vector> class SfmMainWindow: public QMainWindow { Q_OBJECT private: QDockWidget* dock_scene; SceneOverview* scene_overview; GlWidget* gl_widget; SceneRenderer* scene_renderer; QAction* action_quit; QAction* action_about; QMenu* menu_file; QMenu* menu_view; QMenu* menu_help; void create_actions(void); void create_menus(void); void perform_close_scene(void); private slots: void on_scene_selected(sfm::Scene::Ptr scene); void on_view_selected(sfm::View::Ptr view); void on_about(void); void on_frusta_size(void); void closeEvent(QCloseEvent* event); public: SfmMainWindow(int width, int height); ~SfmMainWindow(void); void load_scene(std::vector<std::string> const& cameras); }; #endif // __ASP_SFMVIEW_SFM_MAIN_WINDOW_H__ ================================================ FILE: src/asp/SfmView/SfmMath.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #ifndef __ASP_SFMVIEW_SFM_MATH_H__ #define __ASP_SFMVIEW_SFM_MATH_H__ #include <Eigen/Core> #include <Eigen/Geometry> #include <algorithm> #include <cmath> #include <memory> #include <vector> namespace sfm { // Clamp value to range [lo, hi] template <typename T> T clamp(T const& v, T const& lo, T const& hi) { return std::min(hi, std::max(lo, v)); } // Multiply a 4x4 matrix by a 3-vector with homogeneous w coordinate. // Returns upper-left 3x3 block times v, plus w times the translation column. template <typename T> Eigen::Matrix<T, 3, 1> mult_homogeneous(Eigen::Matrix<T, 4, 4> const& m, Eigen::Matrix<T, 3, 1> const& v, T w) { return m.template block<3, 3>(0, 0) * v + w * m.template block<3, 1>(0, 3); } // OpenGL symmetric projection matrix (column-major for GL) template <typename T> Eigen::Matrix<T, 4, 4> matrix_gl_projection(T const& znear, T const& zfar, T const& top, T const& right) { Eigen::Matrix<T, 4, 4> proj = Eigen::Matrix<T, 4, 4>::Zero(); proj(0, 0) = znear / right; proj(1, 1) = znear / top; proj(2, 2) = -(zfar + znear) / (zfar - znear); proj(2, 3) = T(-2) * zfar * znear / (zfar - znear); proj(3, 2) = T(-1); return proj; } // View transformation matrix from camera pos, viewing direction, up vector template <typename T> Eigen::Matrix<T, 4, 4> matrix_viewtrans(Eigen::Matrix<T, 3, 1> const& campos, Eigen::Matrix<T, 3, 1> const& viewdir, Eigen::Matrix<T, 3, 1> const& upvec) { Eigen::Matrix<T, 3, 1> z = -viewdir; Eigen::Matrix<T, 3, 1> x = upvec.cross(z).normalized(); Eigen::Matrix<T, 3, 1> y = z.cross(x); // Start with identity, replace the rotation and translation parts Eigen::Matrix<T, 4, 4> m = Eigen::Matrix<T, 4, 4>::Identity(); m(0, 0) = x[0]; m(0, 1) = x[1]; m(0, 2) = x[2]; m(1, 0) = y[0]; m(1, 1) = y[1]; m(1, 2) = y[2]; m(2, 0) = z[0]; m(2, 1) = z[1]; m(2, 2) = z[2]; Eigen::Matrix<T, 3, 1> t = -campos; m(0, 3) = m(0, 0)*t[0] + m(0, 1)*t[1] + m(0, 2)*t[2]; m(1, 3) = m(1, 0)*t[0] + m(1, 1)*t[1] + m(1, 2)*t[2]; m(2, 3) = m(2, 0)*t[0] + m(2, 1)*t[1] + m(2, 2)*t[2]; return m; } // Inverse view transformation matrix template <typename T> Eigen::Matrix<T, 4, 4> matrix_inverse_viewtrans(Eigen::Matrix<T, 3, 1> const& campos, Eigen::Matrix<T, 3, 1> const& viewdir, Eigen::Matrix<T, 3, 1> const& upvec) { Eigen::Matrix<T, 3, 1> z = -viewdir; Eigen::Matrix<T, 3, 1> x = upvec.cross(z).normalized(); Eigen::Matrix<T, 3, 1> y = z.cross(x); // Start with identity, replace the rotation and translation parts Eigen::Matrix<T, 4, 4> m = Eigen::Matrix<T, 4, 4>::Identity(); m(0, 0) = x[0]; m(0, 1) = y[0]; m(0, 2) = z[0]; m(0, 3) = campos[0]; m(1, 0) = x[1]; m(1, 1) = y[1]; m(1, 2) = z[1]; m(1, 3) = campos[1]; m(2, 0) = x[2]; m(2, 1) = y[2]; m(2, 2) = z[2]; m(2, 3) = campos[2]; return m; } // Rotation matrix from axis and angle (Rodrigues) template <typename T> Eigen::Matrix<T, 3, 3> matrix_rotation_from_axis_angle(Eigen::Matrix<T, 3, 1> const& axis, T const& angle) { return Eigen::AngleAxis<T>(angle, axis.normalized()).toRotationMatrix(); } // TriangleMesh class TriangleMesh { public: typedef std::shared_ptr<TriangleMesh> Ptr; typedef std::shared_ptr<TriangleMesh const> ConstPtr; typedef unsigned int VertexID; typedef std::vector<Eigen::Vector3f> VertexList; typedef std::vector<Eigen::Vector4f> ColorList; typedef std::vector<Eigen::Vector3f> NormalList; typedef std::vector<Eigen::Vector2f> TexCoordList; typedef std::vector<VertexID> FaceList; static Ptr create(void) { return Ptr(new TriangleMesh); } VertexList const& get_vertices(void) const { return vertices; } VertexList& get_vertices(void) { return vertices; } ColorList const& get_vertex_colors(void) const { return vertex_colors; } ColorList& get_vertex_colors(void) { return vertex_colors; } NormalList const& get_vertex_normals(void) const { return vertex_normals; } NormalList& get_vertex_normals(void) { return vertex_normals; } TexCoordList const& get_vertex_texcoords(void) const { return vertex_texcoords; } TexCoordList& get_vertex_texcoords(void) { return vertex_texcoords; } FaceList const& get_faces(void) const { return faces; } FaceList& get_faces(void) { return faces; } private: VertexList vertices; ColorList vertex_colors; NormalList vertex_normals; TexCoordList vertex_texcoords; FaceList faces; }; // Camera with viewing and projection matrices for OpenGL rendering. class SfmCamera { public: Eigen::Vector3f pos; Eigen::Vector3f viewing_dir; Eigen::Vector3f up_vec; float z_near; float z_far; float top; float right; int width; int height; Eigen::Matrix4f view; Eigen::Matrix4f proj; SfmCamera(void); void update_view_mat(void); void update_proj_mat(void); }; inline SfmCamera::SfmCamera(void): pos(0.0f, 0.0f, 5.0f), viewing_dir(0.0f, 0.0f, -1.0f), up_vec(0.0f, 1.0f, 0.0f), z_near(0.1f), z_far(500.0f), top(0.1f), right(0.1f), width(0), height(0) { view = Eigen::Matrix4f::Zero(); proj = Eigen::Matrix4f::Zero(); } inline void SfmCamera::update_view_mat(void) { this->view = sfm::matrix_viewtrans(this->pos, this->viewing_dir, this->up_vec); } inline void SfmCamera::update_proj_mat(void) { this->proj = sfm::matrix_gl_projection(this->z_near, this->z_far, this->top, this->right); } } // namespace sfm #endif // __ASP_SFMVIEW_SFM_MATH_H__ ================================================ FILE: src/asp/SfmView/SfmUtils.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/SfmUtils.h> #include <algorithm> #include <cstdio> #include <fstream> #include <iostream> #include <stdexcept> #include <string> namespace sfm { SfmCameraInfo::SfmCameraInfo() { flen = 0.0f; std::fill(trans, trans + 3, 0.0); std::fill(rot, rot + 9, 0.0); rot[0] = rot[4] = rot[8] = 1.0; // identity } Eigen::Vector3f SfmCameraInfo::fill_camera_pos() const { Eigen::Vector3f pos; pos[0] = float(-rot[0] * trans[0] - rot[3] * trans[1] - rot[6] * trans[2]); pos[1] = float(-rot[1] * trans[0] - rot[4] * trans[1] - rot[7] * trans[2]); pos[2] = float(-rot[2] * trans[0] - rot[5] * trans[1] - rot[8] * trans[2]); return pos; } Eigen::Vector3f SfmCameraInfo::fill_viewing_direction() const { Eigen::Vector3f viewdir; for (int i = 0; i < 3; ++i) viewdir[i] = float(rot[6 + i]); return viewdir; } Eigen::Matrix4f SfmCameraInfo::fill_cam_to_world() const { Eigen::Matrix4f m = Eigen::Matrix4f::Zero(); // 3x3 block is R^T (transpose of world-to-camera rotation) m(0, 0) = float(rot[0]); m(0, 1) = float(rot[3]); m(0, 2) = float(rot[6]); m(1, 0) = float(rot[1]); m(1, 1) = float(rot[4]); m(1, 2) = float(rot[7]); m(2, 0) = float(rot[2]); m(2, 1) = float(rot[5]); m(2, 2) = float(rot[8]); // Translation is -R^T * t m(0, 3) = float(-(rot[0]*trans[0] + rot[3]*trans[1] + rot[6]*trans[2])); m(1, 3) = float(-(rot[1]*trans[0] + rot[4]*trans[1] + rot[7]*trans[2])); m(2, 3) = float(-(rot[2]*trans[0] + rot[5]*trans[1] + rot[8]*trans[2])); m(3, 3) = 1.0f; return m; } // Read camera parameters from a .tsai pinhole model file. // Only reads the extrinsic parameters (camera center C, rotation R) // and converts them to the world-to-camera convention (rot, trans). void SfmCameraInfo::read_tsai(std::string const& filename) { std::ifstream cam_file(filename); if (cam_file.fail()) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not open file: " + filename); // Use a fixed focal length for frustum display. // The true value is not needed for camera pose visualization. this->flen = 1.0f; std::string line; // Check for version number on the first line std::getline(cam_file, line); if (line.find("VERSION") != std::string::npos) { int file_version = 1; std::sscanf(line.c_str(), "VERSION_%d", &file_version); std::getline(cam_file, line); if (file_version == 4) { if (line.find("PINHOLE") == std::string::npos) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Expected PINHOLE type, got: " + line); std::getline(cam_file, line); } } else { // First line should be fu = ... float dummy = 0.0f; if (std::sscanf(line.c_str(), "fu = %f", &dummy) != 1) throw std::invalid_argument( "SfmCameraInfo::read_tsai: File must start with VERSION or fu = . " "Got: " + line); } // Parse fu, fv double f_u = 0.0, f_v = 0.0; if (std::sscanf(line.c_str(), "fu = %lf", &f_u) != 1) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read x focal length."); std::getline(cam_file, line); if (std::sscanf(line.c_str(), "fv = %lf", &f_v) != 1) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read y focal length."); // cu, cv (principal point - not used for display) double cu = 0.0, cv = 0.0; std::getline(cam_file, line); if (std::sscanf(line.c_str(), "cu = %lf", &cu) != 1) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read x principal point."); std::getline(cam_file, line); if (std::sscanf(line.c_str(), "cv = %lf", &cv) != 1) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read y principal point."); // u_direction, v_direction, w_direction (not used for display) double dummy3[3] = {0.0, 0.0, 0.0}; std::getline(cam_file, line); if (std::sscanf(line.c_str(), "u_direction = %lf %lf %lf", &dummy3[0], &dummy3[1], &dummy3[2]) != 3) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read u direction."); std::getline(cam_file, line); if (std::sscanf(line.c_str(), "v_direction = %lf %lf %lf", &dummy3[0], &dummy3[1], &dummy3[2]) != 3) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read v direction."); std::getline(cam_file, line); if (std::sscanf(line.c_str(), "w_direction = %lf %lf %lf", &dummy3[0], &dummy3[1], &dummy3[2]) != 3) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read w direction."); // SfmCamera center in world coordinates double camera_center[3] = {0.0, 0.0, 0.0}; std::getline(cam_file, line); if (std::sscanf(line.c_str(), "C = %lf %lf %lf", &camera_center[0], &camera_center[1], &camera_center[2]) != 3) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read camera center C."); // Rotation matrix (camera-to-world, row-major) double rotation[9] = {0.0}; std::getline(cam_file, line); if (std::sscanf(line.c_str(), "R = %lf %lf %lf %lf %lf %lf %lf %lf %lf", &rotation[0], &rotation[1], &rotation[2], &rotation[3], &rotation[4], &rotation[5], &rotation[6], &rotation[7], &rotation[8]) != 9) throw std::invalid_argument( "SfmCameraInfo::read_tsai: Could not read rotation matrix R."); // Transpose: camera-to-world -> world-to-camera this->rot[0] = rotation[0]; this->rot[1] = rotation[3]; this->rot[2] = rotation[6]; this->rot[3] = rotation[1]; this->rot[4] = rotation[4]; this->rot[5] = rotation[7]; this->rot[6] = rotation[2]; this->rot[7] = rotation[5]; this->rot[8] = rotation[8]; // trans = -world2camera * camera_center this->trans[0] = -(rot[0]*camera_center[0] + rot[1]*camera_center[1] + rot[2]*camera_center[2]); this->trans[1] = -(rot[3]*camera_center[0] + rot[4]*camera_center[1] + rot[5]*camera_center[2]); this->trans[2] = -(rot[6]*camera_center[0] + rot[7]*camera_center[1] + rot[8]*camera_center[2]); } // View View::Ptr View::create() { return Ptr(new View); } std::string const& View::get_name() const { return name_; } SfmCameraInfo const& View::get_camera() const { return camera_; } void View::set_camera(SfmCameraInfo const& cam) { camera_ = cam; } void View::set_dirty(bool /*dirty*/) { } void View::load_view(std::string const& camera_path) { // Extract basename for the view name std::string::size_type pos = camera_path.find_last_of("/\\"); if (pos != std::string::npos) name_ = camera_path.substr(pos + 1); else name_ = camera_path; camera_ = SfmCameraInfo(); camera_.read_tsai(camera_path); } // Scene Scene::ViewList const& Scene::get_views() const { return views_; } Scene::ViewList& Scene::get_views() { return views_; } View::Ptr Scene::get_view_by_id(std::size_t id) { if (id < views_.size()) return views_[id]; return View::Ptr(); } Scene::Ptr Scene::create( std::vector<std::string> const& camera_files) { Ptr scene(new Scene); scene->views_.resize(camera_files.size()); for (std::size_t i = 0; i < camera_files.size(); ++i) { scene->views_[i] = View::create(); scene->views_[i]->load_view(camera_files[i]); } return scene; } } // namespace sfm ================================================ FILE: src/asp/SfmView/SfmUtils.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). // // Lightweight replacements for sfm::SfmCameraInfo, sfm::View, and sfm::Scene // used by sfm_view. These avoid pulling in the full MVE library for types // that are simple data containers in this application. #ifndef __ASP_SFMVIEW_SFM_UTILS_H__ #define __ASP_SFMVIEW_SFM_UTILS_H__ #include <asp/SfmView/SfmMath.h> #include <memory> #include <string> #include <vector> namespace sfm { // SfmCamera intrinsic and extrinsic parameters. // Stores world-to-camera rotation and translation. struct SfmCameraInfo { SfmCameraInfo(); // Compute camera position: pos = -R^T * t. Eigen::Vector3f fill_camera_pos() const; // Return the viewing direction (third row of rotation). Eigen::Vector3f fill_viewing_direction() const; // Return the 4x4 camera-to-world matrix. Eigen::Matrix4f fill_cam_to_world() const; // Read camera parameters from a .tsai pinhole model file. void read_tsai(std::string const& filename); // Intrinsic parameters float flen; // Extrinsic parameters (double for large satellite orbit values) double trans[3]; // SfmCamera translation: pos = -R^T * trans double rot[9]; // World-to-camera rotation (row-major 3x3) }; // A single camera view: holds a name and camera parameters. class View { public: using Ptr = std::shared_ptr<View>; static Ptr create(); // Load camera from a .tsai file. The view name is set to the // basename of camera_path. void load_view(std::string const& camera_path); std::string const& get_name() const; SfmCameraInfo const& get_camera() const; void set_camera(SfmCameraInfo const& cam); // No-op. Kept for API compatibility with code that prevents save prompts. void set_dirty(bool dirty); private: View() = default; std::string name_; SfmCameraInfo camera_; }; // A collection of camera views. class Scene { public: using Ptr = std::shared_ptr<Scene>; using ViewList = std::vector<View::Ptr>; // Create a scene from .tsai camera files. static Ptr create(std::vector<std::string> const& camera_files); ViewList const& get_views() const; ViewList& get_views(); View::Ptr get_view_by_id(std::size_t id); private: Scene() = default; ViewList views_; }; } // namespace sfm #endif // __ASP_SFMVIEW_SFM_UTILS_H__ ================================================ FILE: src/asp/Tools/CMakeLists.txt ================================================ # --------------------------------------------------------------- # Define each of the tools to build #TODO: Turn them off when components are not present # Install all of the python files. # Note: When packaged, the files with a .py extension will # not get a shell script wrapper. See add_executable() # in BinaryDist.py. set(PYTHON_TOOLS dg_mosaic parallel_stereo sparse_disp stereo time_trials camera_calibrate camera_solve parallel_sfs mapproject parallel_bundle_adjust extract_bag list_timestamps rig_bracket texrecon theia_sfm multi_stereo sfm_proc refr_index stereo_sweep stereo_dist stereo_tile cam2map4stereo.py hiedr2mosaic.py lronac2mosaic.py parse_match_file.py historical_helper.py bathy_threshold_calc.py scale_bathy_mask.py orbit_plot.py) foreach(p ${PYTHON_TOOLS}) INSTALL(FILES ${p} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION bin) endforeach() add_executable(aster2asp aster2asp.cc) target_link_libraries(aster2asp AspSessions) install(TARGETS aster2asp DESTINATION bin) add_executable(prism2asp prism2asp.cc) target_link_libraries(prism2asp AspSessions) install(TARGETS prism2asp DESTINATION bin) add_executable(bundle_adjust bundle_adjust.cc) target_link_libraries(bundle_adjust AspSessions ${SOLVER_LIBRARIES}) install(TARGETS bundle_adjust DESTINATION bin) add_executable(opencv_calibrate opencv_calibrate.cc) target_link_libraries(opencv_calibrate AspCore AspSessions) install(TARGETS opencv_calibrate DESTINATION libexec) add_executable(opencv_imagelist_creator opencv_imagelist_creator.cc) target_link_libraries(opencv_imagelist_creator AspCore AspSessions) install(TARGETS opencv_imagelist_creator DESTINATION libexec) add_executable(camera_footprint camera_footprint.cc) target_link_libraries(camera_footprint AspSessions) install(TARGETS camera_footprint DESTINATION bin) add_executable(coverage_fraction coverage_fraction.cc) target_link_libraries(coverage_fraction AspCore AspSessions) install(TARGETS coverage_fraction DESTINATION bin) add_executable(disparitydebug disparitydebug.cc) target_link_libraries(disparitydebug AspCore AspSessions) install(TARGETS disparitydebug DESTINATION bin) add_executable(geodiff geodiff.cc) target_link_libraries(geodiff AspCore AspSessions) install(TARGETS geodiff DESTINATION bin) add_executable(lronacjitreg lronacjitreg.cc) target_link_libraries(lronacjitreg AspSessions) install(TARGETS lronacjitreg DESTINATION bin) add_executable(mapproject_single mapproject_single.cc) target_link_libraries(mapproject_single AspSessions) install(TARGETS mapproject_single DESTINATION bin) add_executable(mer2camera mer2camera.cc) target_link_libraries(mer2camera AspCore AspSessions) install(TARGETS mer2camera DESTINATION bin) add_executable(orbitviz orbitviz.cc) target_link_libraries(orbitviz AspSessions) install(TARGETS orbitviz DESTINATION bin) add_executable(pc_merge pc_merge.cc) target_link_libraries(pc_merge AspSessions) install(TARGETS pc_merge DESTINATION bin) add_executable(pansharp pansharp.cc) target_link_libraries(pansharp AspSessions) install(TARGETS pansharp DESTINATION bin) add_executable(image_calc image_calc.cc) target_link_libraries(image_calc AspCore AspSessions) install(TARGETS image_calc DESTINATION bin) add_executable(point2dem point2dem.cc) target_link_libraries(point2dem AspCore AspSessions) install(TARGETS point2dem DESTINATION bin) add_executable(point2las point2las.cc) target_link_libraries(point2las AspCore AspSessions) install(TARGETS point2las DESTINATION bin) add_executable(point2mesh point2mesh.cc) target_link_libraries(point2mesh AspCore AspSessions) install(TARGETS point2mesh DESTINATION bin) add_executable(add_spot_rpc add_spot_rpc.cc) target_link_libraries(add_spot_rpc AspCamera AspSessions) install(TARGETS add_spot_rpc DESTINATION bin) add_executable(cam2rpc cam2rpc.cc) target_link_libraries(cam2rpc AspSessions) install(TARGETS cam2rpc DESTINATION bin) add_executable(rpc_gen rpc_gen.cc) target_link_libraries(rpc_gen AspSessions) install(TARGETS rpc_gen DESTINATION libexec) add_executable(sfs sfs.cc) target_link_libraries(sfs ${SOLVER_LIBRARIES} AspSfS AspSessions) install(TARGETS sfs DESTINATION bin) add_executable(sfs_blend sfs_blend.cc) target_link_libraries(sfs_blend AspSfS AspSessions) install(TARGETS sfs_blend DESTINATION bin) add_executable(image_subset image_subset.cc) target_link_libraries(image_subset AspCore AspSessions) install(TARGETS image_subset DESTINATION bin) add_executable(stereo_blend stereo_blend.cc stereo.h stereo.cc) target_link_libraries(stereo_blend AspSessions) install(TARGETS stereo_blend DESTINATION bin) add_executable(stereo_corr stereo_corr.cc stereo.h stereo.cc) target_link_libraries(stereo_corr AspSessions) install(TARGETS stereo_corr DESTINATION bin) add_executable(stereo_fltr stereo_fltr.cc stereo.h stereo.cc) target_link_libraries(stereo_fltr AspSessions AspGotcha) install(TARGETS stereo_fltr DESTINATION bin) add_executable(stereo_gui stereo_gui.cc stereo.h stereo.cc) target_link_libraries(stereo_gui AspGUI AspSessions AspRig) install(TARGETS stereo_gui DESTINATION bin) add_executable(sfm_view sfm_view.cc) target_link_libraries(sfm_view AspSfmView) set_target_properties(sfm_view PROPERTIES AUTOMOC TRUE) install(TARGETS sfm_view DESTINATION bin) add_executable(stereo_parse stereo_parse.cc stereo.h stereo.cc) target_link_libraries(stereo_parse AspSessions) install(TARGETS stereo_parse DESTINATION bin) add_executable(stereo_pprc stereo_pprc.cc stereo.h stereo.cc) target_link_libraries(stereo_pprc AspSessions) install(TARGETS stereo_pprc DESTINATION bin) add_executable(stereo_rfne stereo_rfne.cc stereo.h stereo.cc) target_link_libraries(stereo_rfne AspSessions) install(TARGETS stereo_rfne DESTINATION bin) add_executable(stereo_tri stereo_tri.cc stereo.h stereo.cc) target_link_libraries(stereo_tri AspSessions ${SOLVER_LIBRARIES}) install(TARGETS stereo_tri DESTINATION bin) add_executable(jitter_solve jitter_solve.cc) target_link_libraries(jitter_solve AspSessions ${SOLVER_LIBRARIES}) install(TARGETS jitter_solve DESTINATION bin) add_executable(xyzi2csv xyzi2csv.cc) target_link_libraries(xyzi2csv AspCore AspSessions) install(TARGETS xyzi2csv DESTINATION bin) add_executable(dem_mosaic dem_mosaic.cc) target_link_libraries(dem_mosaic AspCore AspSessions) install(TARGETS dem_mosaic DESTINATION bin) add_executable(image_mosaic image_mosaic.cc) target_link_libraries(image_mosaic AspCore AspSessions) install(TARGETS image_mosaic DESTINATION bin) add_executable(image_align image_align.cc) target_link_libraries(image_align AspCore AspSessions) install(TARGETS image_align DESTINATION bin) add_executable(tif_mosaic tif_mosaic.cc) target_link_libraries(tif_mosaic AspCore AspSessions) install(TARGETS tif_mosaic DESTINATION libexec) add_executable(wv_correct wv_correct.cc) target_link_libraries(wv_correct AspCamera AspSessions) install(TARGETS wv_correct DESTINATION bin) add_executable(cam_gen cam_gen.cc) target_link_libraries(cam_gen AspSessions) install(TARGETS cam_gen DESTINATION bin) add_executable(gcp_gen gcp_gen.cc) target_link_libraries(gcp_gen AspSessions) install(TARGETS gcp_gen DESTINATION bin) add_executable(bathy_plane_calc bathy_plane_calc.cc) target_link_libraries(bathy_plane_calc AspSessions) install(TARGETS bathy_plane_calc DESTINATION bin) add_executable(cam_test cam_test.cc) target_link_libraries(cam_test AspSessions) install(TARGETS cam_test DESTINATION bin) add_executable(otsu_threshold otsu_threshold.cc) target_link_libraries(otsu_threshold AspCore AspSessions) install(TARGETS otsu_threshold DESTINATION bin) add_executable(corr_eval corr_eval.cc) target_link_libraries(corr_eval AspCore AspSessions) install(TARGETS corr_eval DESTINATION bin) add_executable(disp2ip disp2ip.cc) target_link_libraries(disp2ip AspCore AspSessions AspRig) install(TARGETS disp2ip DESTINATION bin) add_executable(pc_filter pc_filter.cc) target_link_libraries(pc_filter AspPclIO AspSessions) install(TARGETS pc_filter DESTINATION bin) add_executable(sfm_submap sfm_submap.cc) target_link_libraries(sfm_submap AspRig AspPclIO AspSessions) install(TARGETS sfm_submap DESTINATION bin) add_executable(sfm_merge sfm_merge.cc) target_link_libraries(sfm_merge AspRig AspPclIO AspSessions) install(TARGETS sfm_merge DESTINATION bin) add_executable(dem2gcp dem2gcp.cc) target_link_libraries(dem2gcp AspCore AspSessions) install(TARGETS dem2gcp DESTINATION bin) add_executable(sat_sim sat_sim.cc) target_link_libraries(sat_sim AspSessions) install(TARGETS sat_sim DESTINATION bin) add_executable(undistort_image_texrecon undistort_image_texrecon.cc) target_link_libraries(undistort_image_texrecon AspRig AspPclIO AspSessions) install(TARGETS undistort_image_texrecon DESTINATION bin) if (NOT CORE_ASP_ONLY) add_executable(rig_calibrator rig_calibrator.cc) target_link_libraries(rig_calibrator AspCore AspRig AspPclIO AspSessions) install(TARGETS rig_calibrator DESTINATION bin) add_executable(dem_geoid dem_geoid.cc) target_link_libraries(dem_geoid ${GEOID_LIBRARIES} AspCore AspSessions) install(TARGETS dem_geoid DESTINATION bin) add_executable(pc_align pc_align.cc) target_link_libraries(pc_align AspPcAlign AspSessions) install(TARGETS pc_align DESTINATION bin) add_executable(n_align n_align.cc) target_link_libraries(n_align AspPcAlign AspSessions) install(TARGETS n_align DESTINATION bin) # This must be built with C++14 as otherwise it fails. Must be set # after the standard is set for the entire library. # This is temporary set_source_files_properties( n_align.cc PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF # Keep consistent if desired COMPILE_FLAGS "-std=c++14" ) endif() ================================================ FILE: src/asp/Tools/add_spot_rpc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// Generate an approximate RPC model for a SPOT5 image. /// - The resulting model is appended to the end of the existing /// SPOT5 metadata file. /// - These files can then be used as input for stereo with -t rpc. #include <vw/FileIO/DiskImageView.h> #include <vw/Core/StringUtils.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/FileIO/DiskImageResourceRaw.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Core/FileUtils.h> #include <asp/Camera/CsmModel.h> #include <asp/Camera/SPOT_XML.h> #include <asp/Camera/LinescanSpotModel.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/RPCModelGen.h> #include <xercesc/util/PlatformUtils.hpp> #include <limits> #include <cstring> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> namespace fs = boost::filesystem; namespace po = boost::program_options; using namespace vw; using namespace vw::cartography; using asp::RPCModel; struct Options : public vw::GdalWriteOptions { std::string input_path, output_path; double min_height, max_height; int num_samples; double penalty_weight; Options(): min_height(-1), max_height(-1), num_samples(-1), penalty_weight(-1) {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("output-path,o", po::value(&opt.output_path), "Specify the output path.") ("min-height", po::value(&opt.min_height)->default_value(0), "The minimum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation.") ("max-height", po::value(&opt.max_height)->default_value(8000), "The maximum height (in meters) above the WGS84 datum of the simulation box in which to compute the RPC approximation.") ("num-samples", po::value(&opt.num_samples)->default_value(100), "How many samples to use between the minimum and maximum heights.") ("penalty-weight", po::value(&opt.penalty_weight)->default_value(0.1), "Penalty weight to use to keep the higher-order RPC coefficients small. Higher penalty weight results in smaller such coefficients."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("input_path", po::value(&opt.input_path), "A SPOT5 Metadata file."); po::positional_options_description positional_desc; positional_desc.add("input_path", 1); std::string usage("<input path>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if ( opt.input_path.empty() ) vw_throw( ArgumentErr() << "Missing input path.\n" << usage << general_options ); if ( opt.output_path.empty() ) { vw_out() << "Output path not provided, appending RPC model to the input metadata file.\n"; opt.output_path = opt.input_path; } } /// Generates the set of GDC/pixel pairs that will be fed into the solver. void generate_point_pairs(Options opt, Vector<double> &normalized_geodetics, Vector<double> &normalized_pixels, Vector3 &llh_scale, Vector3 &llh_offset, Vector2 &uv_scale, Vector2 &uv_offset) { // Load up the camera model from the camera file xercesc::XMLPlatformUtils::Initialize(); // Load the input camera model (CSM linescan) boost::shared_ptr<camera::CameraModel> cam_ptr = boost::dynamic_pointer_cast<camera::CameraModel>( asp::load_spot5_csm_camera_model_from_xml(opt.input_path)); // Load some image info vw::ImageFormat format = vw::DiskImageResourceRaw::image_format_from_spot5_DIM(opt.input_path); Vector2 image_size = Vector2(format.cols, format.rows); // Will have to change this if any SPOT5 data uses a different datum. vw::cartography::Datum datum("WGS84"); // Only generate point pairs up to this far from the valid boundaries. // - There is no guarantee that a point right on the edge will safely project! const double CONTRACTION = 0.10; // Load the estimated image bounds from the XML file! std::vector<vw::Vector2> lonlat_corners = asp::SpotXML::get_lonlat_corners(opt.input_path); if (lonlat_corners.size() != 4) vw::vw_throw(ArgumentErr() << "Failed to parse lonlat corners of metadata file!"); Vector2 top_left = lonlat_corners[0]; // The corners should be loaded in this order. Vector2 top_right = lonlat_corners[1]; //Vector2 bot_right = lonlat_corners[2]; Vector2 bot_left = lonlat_corners[3]; // These vectors are aligned with the image projected on to the ground and are // used to iterate through the coverage region of the image. Vector2 col_axis = top_right - top_left; Vector2 row_axis = bot_left - top_left; double height_range = opt.max_height - opt.min_height; // Get a bounding box of the covered region (not all of the BBox has image coverage!) BBox2 bounding_box; for (std::size_t i=0; i<4; ++i) bounding_box.grow(lonlat_corners[i]); Vector3 min_llh_coord = Vector3(bounding_box.min()[0], bounding_box.min()[1], opt.min_height); Vector3 max_llh_coord = Vector3(bounding_box.max()[0], bounding_box.max()[1], opt.max_height); vw_out() << "Min lon/lat/height coord: " << min_llh_coord << std::endl; vw_out() << "Max lon/lat/height coord: " << max_llh_coord << std::endl; // Compute scale factors to describe the bounding box (aligned with ENU coordinate system) llh_scale = (max_llh_coord - min_llh_coord)/2.0; // half range llh_offset = (max_llh_coord + min_llh_coord)/2.0; // center point double pixel_max = vw::math::max(image_size); uv_scale = Vector2(pixel_max/2.0, pixel_max/2.0); // The long axis pixel is scaled to 1.0 uv_offset = image_size/2.0; // center point // Number of points in x and y at which we will optimize the RPC // model. Using 10 or 20 points gives roughly similar results. // 20 points result in 20^3 input data for optimization, with the // number of variable to optimize being just 78. int num_pts = 20; // The number of points per axis int num_total_pts = num_pts*num_pts*num_pts; vw_out() << "Attempting to project " << num_total_pts << " locations...\n"; // Initialize normalized data storage normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*num_total_pts); normalized_pixels.set_size(RPCModel::IMAGE_COORD_SIZE*num_total_pts + asp::RpcSolveLMA::NUM_PENALTY_TERMS); for (std::size_t i = 0; i < normalized_pixels.size(); i++) { // Important: The extra penalty terms are all set to zero here. normalized_pixels[i] = 0.0; } // Loop through the coverage area of the sattelite and generate pairs of // normalized image/GDC training data using the SPOT5 camera model. int success_count = 0; int fail_count = 0; for (int x = 0; x < num_pts; x++){ for (int y = 0; y < num_pts; y++){ for (int z = 0; z < num_pts; z++){ // This is the test point location in our image normalized to 0 <> 1 range Vector3 u( x/(num_pts - 1.0), y/(num_pts - 1.0), z/(num_pts - 1.0) ); // Shrink the point a little bit so we don't go all the way up to the valid boundaries. u = elem_sum(elem_prod(u,1.0-CONTRACTION), (CONTRACTION/2.0)); // Obtain the lat/lon/height of this location Vector2 lonlat = top_left + u[0]*col_axis + u[1]*row_axis; Vector3 G = Vector3(lonlat[0], lonlat[1], u[2]*height_range + opt.min_height); // Convert the actual lonlat point to vector U in the -1 <> 1 range. // - This vector is in a north-aligned coordinate system. // - RPC expects inputs in this range so it can use them with the scaling values we computed. Vector3 U = elem_quot((G - llh_offset), llh_scale); // Convert from geodetic to geocentric coordinates Vector3 P = datum.geodetic_to_cartesian(G); // xyz Vector2 pxg; try { // Project the GCC coordinate into the SPOT5 camera model pxg = cam_ptr->point_to_pixel(P); //vw_out() << "SUCESS location " << G << " === " << u << " === " << U << " into camera! Skipping it.\n"; } catch (vw::camera::PointToPixelErr) { //vw_out() << "Failed to project location " << G << " === " << u << " === " << U << " into camera! Skipping it.\n"; ++fail_count; continue; } // Normalize the pixel to -1 <> 1 range Vector2 pxn = elem_quot(pxg - uv_offset, uv_scale); subvector(normalized_geodetics, RPCModel::GEODETIC_COORD_SIZE*success_count, RPCModel::GEODETIC_COORD_SIZE) = U; subvector(normalized_pixels, RPCModel::IMAGE_COORD_SIZE *success_count, RPCModel::IMAGE_COORD_SIZE ) = pxn; success_count++; } // End z loop } // End y loop } // End x loop vw_out() << "Successfully projected " << success_count << " locations.\n"; // Update the sizes to reflect the number of successful point projections const bool preserve = true; normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*success_count, preserve); normalized_pixels.set_size(RPCModel::IMAGE_COORD_SIZE*success_count + asp::RpcSolveLMA::NUM_PENALTY_TERMS, preserve); } // Save an XML file having all RPC information void save_xml(Vector3 const& llh_scale, Vector3 const& llh_offset, Vector2 const& pixel_scale, Vector2 const& pixel_offset, asp::RPCModel::CoeffVec const& line_num, asp::RPCModel::CoeffVec const& line_den, asp::RPCModel::CoeffVec const& samp_num, asp::RPCModel::CoeffVec const& samp_den, std::string const& out_cam_file){ std::string lineoffset = vw::num_to_str(pixel_offset.y()); std::string sampoffset = vw::num_to_str(pixel_offset.x()); std::string latoffset = vw::num_to_str(llh_offset.y()); std::string longoffset = vw::num_to_str(llh_offset.x()); std::string heightoffset = vw::num_to_str(llh_offset.z()); std::string linescale = vw::num_to_str(pixel_scale.y()); std::string sampscale = vw::num_to_str(pixel_scale.x()); std::string latscale = vw::num_to_str(llh_scale.y()); std::string longscale = vw::num_to_str(llh_scale.x()); std::string heightscale = vw::num_to_str(llh_scale.z()); std::string linenumcoef = vw::vec_to_str(line_num); std::string linedencoef = vw::vec_to_str(line_den); std::string sampnumcoef = vw::vec_to_str(samp_num); std::string sampdencoef = vw::vec_to_str(samp_den); const std::string RPC_START_STR = "<isd>"; const std::string DIMAP_END_STR = "</Dimap_Document>"; bool dimap_file = false; vw_out() << "Writing: " << out_cam_file << std::endl; // Try to open the file for read/write, if that fails just try // to open it for writing. std::fstream ofs; ofs.open(out_cam_file.c_str(), std::fstream::in | std::fstream::out); if (ofs.good()) { // Navigate to the either the end of the file or // the correct location to insert the RPC info std::string line; while (std::getline(ofs, line)) { if (line.find("Dimap_Document") != std::string::npos) dimap_file = true; if (line.find(RPC_START_STR) != std::string::npos) { ofs.seekg(-1*(RPC_START_STR.size()+1), std::ios_base::cur); break; } if (line.find(DIMAP_END_STR) != std::string::npos) { ofs.seekg(-1*(DIMAP_END_STR.size()+1), std::ios_base::cur); break; } } } else { // The file did not exist, create a new one. ofs.open(out_cam_file.c_str(), std::fstream::out); } if (!ofs.good()) vw_throw( ArgumentErr() << "Error writing to file:" << out_cam_file); // Write RPC to file in Digital Globe format ofs << "<isd>\n"; ofs << " <RPB>\n"; ofs << " <SATID>SPOT5_PAN</SATID>\n"; ofs << " <IMAGE>\n"; ofs << " <LINEOFFSET>" << lineoffset << "</LINEOFFSET>\n"; ofs << " <SAMPOFFSET>" << sampoffset << "</SAMPOFFSET>\n"; ofs << " <LATOFFSET>" << latoffset << "</LATOFFSET>\n"; ofs << " <LONGOFFSET>" << longoffset << "</LONGOFFSET>\n"; ofs << " <HEIGHTOFFSET>" << heightoffset << "</HEIGHTOFFSET>\n"; ofs << " <LINESCALE>" << linescale << "</LINESCALE>\n"; ofs << " <SAMPSCALE>" << sampscale << "</SAMPSCALE>\n"; ofs << " <LATSCALE>" << latscale << "</LATSCALE>\n"; ofs << " <LONGSCALE>" << longscale << "</LONGSCALE>\n"; ofs << " <HEIGHTSCALE>" << heightscale << "</HEIGHTSCALE>\n"; ofs << " <LINENUMCOEFList>\n"; ofs << " <LINENUMCOEF>" << linenumcoef << "</LINENUMCOEF>\n"; ofs << " </LINENUMCOEFList>\n"; ofs << " <LINEDENCOEFList>\n"; ofs << " <LINEDENCOEF>" << linedencoef << "</LINEDENCOEF>\n"; ofs << " </LINEDENCOEFList>\n"; ofs << " <SAMPNUMCOEFList>\n"; ofs << " <SAMPNUMCOEF>" << sampnumcoef << "</SAMPNUMCOEF>\n"; ofs << " </SAMPNUMCOEFList>\n"; ofs << " <SAMPDENCOEFList>\n"; ofs << " <SAMPDENCOEF>" << sampdencoef << "</SAMPDENCOEF>\n"; ofs << " </SAMPDENCOEFList>\n"; ofs << " </IMAGE>\n"; ofs << " </RPB>\n"; ofs << "</isd>\n"; if (dimap_file) // Close of DIMAP files properly ofs << DIMAP_END_STR; ofs.close(); } int main( int argc, char *argv[] ) { Options opt; try { handle_arguments(argc, argv, opt); // Generate all the point pairs using the input options Vector<double> normalized_geodetics; Vector<double> normalized_pixels; Vector3 llh_scale, llh_offset; Vector2 uv_scale, uv_offset; generate_point_pairs(opt, normalized_geodetics, normalized_pixels, llh_scale, llh_offset, uv_scale, uv_offset); // Find the RPC coefficients RPCModel::CoeffVec line_num, line_den, samp_num, samp_den; bool refine_only = false; asp::gen_rpc(// Inputs opt.penalty_weight, normalized_geodetics, normalized_pixels, refine_only, // Outputs line_num, line_den, samp_num, samp_den); save_xml(llh_scale, llh_offset, uv_scale, uv_offset, line_num, line_den, samp_num, samp_den, opt.output_path); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/aster2asp.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // This program works with ASTER V004 data, in .hdf format, and with older V0003 // data, when the inputs are expected to be a directory. // For V003, data. The workflow is as follows. Take as input a directory of // ASTER images. Apply radiometric correction to the VNIR_Band3N and VNIR_Band3B // images, writing <output-prefix>-Band3N.tif and <output-prefix>-Band3B.tif. // Generate RPC coefficients from input metadata and write // <output-prefix>-Band3N.xml and <output-prefix>-Band3B.xml. These files can // then be used as input for stereo with -t rpc. // References: // ----------- // ASTER User Handbook Version 2 // https://asterweb.jpl.nasa.gov/content/03_data/04_Documents/aster_user_guide_v2.pdf // // ASTER User Guide Version 4 (for V004 HDF format) // https://lpdaac.usgs.gov/documents/2265/ASTER_User_Guide_V4_pcP80n5.pdf // // https://lpdaac.usgs.gov/documents/175/ASTER_L1_Product_Specifications.pdf // IMPROVEMENT OF DEM GENERATION FROM ASTER IMAGES USING SATELLITE // JITTER ESTIMATION AND OPEN SOURCE IMPLEMENTATION // Luc Girod, Christopher Nutha, and Andreas Kaab // http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XL-1-W5/249/2015/isprsarchives-XL-1-W5-249-2015.pdf #include <asp/Camera/RPCModelGen.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AsterProc.h> #include <asp/Core/FileUtils.h> #include <asp/Core/Macros.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/Core/StringUtils.h> #include <vw/FileIO/DiskImageView.h> #include <vw/FileIO/FileUtils.h> #include <boost/algorithm/string.hpp> #include <boost/filesystem.hpp> #include <boost/program_options.hpp> namespace fs = boost::filesystem; namespace po = boost::program_options; using namespace vw; using namespace vw::cartography; struct Options: public vw::GdalWriteOptions { std::string input, output_prefix; double min_height, max_height; std::int64_t num_samples; double penalty_weight; bool keep_tmp_dir; Options(): min_height(-1), max_height(-1), num_samples(-1), penalty_weight(-1), keep_tmp_dir(false) {} }; void handle_arguments(int argc, char *argv[], Options &opt) { po::options_description general_options(""); general_options.add_options() ("output-prefix,o", po::value(&opt.output_prefix), "Specify the output prefix.") ("min-height", po::value(&opt.min_height)->default_value(0), "The minimum height (in meters) above the WGS84 datum of the simulation " "box in which to compute the RPC approximation.") ("max-height", po::value(&opt.max_height)->default_value(8.0e+3), "The maximum height (in meters) above the WGS84 datum of the simulation " "box in which to compute the RPC approximation.") ("num-samples", po::value(&opt.num_samples)->default_value(100), "How many samples to use between the minimum and maximum heights.") ("penalty-weight", po::value(&opt.penalty_weight)->default_value(0.1), "Penalty weight to use to keep the higher-order RPC coefficients small. " "Higher penalty weight results in smaller such coefficients.") ("keep-tmp-dir", po::bool_switch(&opt.keep_tmp_dir)->default_value(false), "Keep the temporary directory where HDF data is extracted (for debugging).") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input", po::value(&opt.input), "An ASTER HDF file or input data directory."); po::positional_options_description positional_desc; positional_desc.add("input", 1); std::string usage("<input hdf or directory> -o <output prefix>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.input.empty()) vw_throw(ArgumentErr() << "Missing input.\n" << usage << general_options); if (opt.output_prefix.empty()) vw_throw(ArgumentErr() << "Missing output prefix.\n" << usage << general_options); // Create the output directory vw::create_out_dir(opt.output_prefix); } // See if the input file matches the given pattern. If yes, store the result // in matched_file. If matched_file is not empty originally, that means // we have more than one match, which is not good. bool match_file(std::string const &input_file, std::string const &pattern, std::string &matched_file) { std::size_t it = input_file.find(pattern); // No match if (it == std::string::npos) return false; // Check if it does not match at the end of the string if (it + pattern.size() != input_file.size()) return false; // Must match L1A images if (input_file.find("L1A") == std::string::npos) return false; // We expect only one match if (matched_file != "") vw_throw(ArgumentErr() << "Found two files matching: '" << pattern << "'. Those are: " << matched_file << " and " << input_file << "\n"); matched_file = input_file; return true; } // Identify the appropriate inputs in the ASTER directory void locate_inputs(Options const &opt, std::string &nadir_image, std::string &back_image, std::string &nadir_sat_pos, std::string &back_sat_pos, std::string &nadir_sight_vec, std::string &back_sight_vec, std::string &nadir_corr_table, std::string &back_corr_table, std::string &nadir_longitude, std::string &back_longitude, std::string &nadir_latitude, std::string &back_latitude, std::string &nadir_lattice_point, std::string &back_lattice_point) { // Iterate through all files for (fs::directory_iterator itr(opt.input); itr != fs::directory_iterator(); itr++) { std::string file = itr->path().string(); match_file(file, "VNIR_Band3N.ImageData.tif", nadir_image); match_file(file, "VNIR_Band3B.ImageData.tif", back_image); match_file(file, "VNIR_Band3N.SatellitePosition.txt", nadir_sat_pos); match_file(file, "VNIR_Band3B.SatellitePosition.txt", back_sat_pos); match_file(file, "VNIR_Band3N.SightVector.txt", nadir_sight_vec); match_file(file, "VNIR_Band3B.SightVector.txt", back_sight_vec); match_file(file, "VNIR_Band3N.RadiometricCorrTable.txt", nadir_corr_table); match_file(file, "VNIR_Band3B.RadiometricCorrTable.txt", back_corr_table); match_file(file, "VNIR_Band3N.Longitude.txt", nadir_longitude); match_file(file, "VNIR_Band3B.Longitude.txt", back_longitude); match_file(file, "VNIR_Band3N.Latitude.txt", nadir_latitude); match_file(file, "VNIR_Band3B.Latitude.txt", back_latitude); match_file(file, "VNIR_Band3N.LatticePoint.txt", nadir_lattice_point); match_file(file, "VNIR_Band3B.LatticePoint.txt", back_lattice_point); } if (nadir_image == "") vw_throw(ArgumentErr() << "Could not locate the nadir-looking camera image " << "(VNIR_Band3N.ImageData.tif).\n"); if (back_image == "") vw_throw( ArgumentErr() << "Could not locate the backward-looking camera image " << "(VNIR_Band3B.ImageData.tif).\n"); if (nadir_sat_pos == "") vw_throw(ArgumentErr() << "Could not locate the nadir-looking satellite position " << "(VNIR_Band3N.SatellitePosition.txt).\n"); if (back_sat_pos == "") vw_throw( ArgumentErr() << "Could not locate the back-looking satellite position " << "(VNIR_Band3B.SatellitePosition.txt).\n"); if (nadir_sight_vec == "") vw_throw(ArgumentErr() << "Could not locate the nadir-looking sight vector " << "(VNIR_Band3N.SightVector.txt).\n"); if (back_sight_vec == "") vw_throw(ArgumentErr() << "Could not locate the back-looking sight vector " << "(VNIR_Band3B.SightVector.txt).\n"); if (nadir_corr_table == "") vw_throw( ArgumentErr() << "Could not locate the nadir-looking radiometric correction table " << "(VNIR_Band3N.RadiometricCorrTable.txt).\n"); if (back_corr_table == "") vw_throw( ArgumentErr() << "Could not locate the back-looking radiometric correction table " << "(VNIR_Band3B.RadiometricCorrTable.txt).\n"); if (nadir_longitude == "") vw_throw( ArgumentErr() << "Could not locate the nadir-looking longitude file " << "(VNIR_Band3N.Longitude.txt).\n"); if (back_longitude == "") vw_throw( ArgumentErr() << "Could not locate the back-looking longitude file " << "(VNIR_Band3B.Longitude.txt).\n"); if (nadir_latitude == "") vw_throw( ArgumentErr() << "Could not locate the nadir-looking latitude file " << "(VNIR_Band3N.Latitude.txt).\n"); if (back_latitude == "") vw_throw(ArgumentErr() << "Could not locate the back-looking latitude file " << "(VNIR_Band3B.Latitude.txt).\n"); if (nadir_lattice_point == "") vw_throw(ArgumentErr() << "Could not locate the nadir-looking lattice point file " << "(VNIR_Band3N.LatticePoint.txt).\n"); if (back_lattice_point == "") vw_throw( ArgumentErr() << "Could not locate the back-looking lattice point file " << "(VNIR_Band3B.LatticePoint.txt).\n"); } // Generate lon-lat-height to image pixel correspondences that we will // use to create the RPC model. void generate_point_pairs(double min_height, double max_height, std::int64_t num_samples, double penalty_weight, std::string const &sat_pos_file, std::string const &sight_vec_file, std::string const &longitude_file, std::string const &latitude_file, std::string const &lattice_file, // Outputs std::vector<std::vector<vw::Vector3>> &world_sight_mat, Vector3 &llh_scale, Vector3 &llh_offset, Vector2 &pixel_scale, Vector2 &pixel_offset, Vector<double> &normalized_llh, Vector<double> &normalized_pixels) { // Read the sight vectors std::vector<Vector3> sight_vec; asp::read_3d_points(sight_vec_file, sight_vec); // Read the satellite positions std::vector<Vector3> sat_pos; asp::read_3d_points(sat_pos_file, sat_pos); std::int64_t num_rows = sat_pos.size(); std::int64_t num_pts = sight_vec.size(); std::int64_t num_cols = num_pts / num_rows; // Sight vector in world coordinates world_sight_mat.clear(); world_sight_mat.resize(num_rows); if (num_rows * num_cols != num_pts) vw_throw(ArgumentErr() << "Found " << num_rows << " satellite positions in " << sat_pos_file << " and " << num_pts << " sight vectors in " << sight_vec_file << ". The latter must be a multiple of the former."); // For each satellite position there many sight vectors // corresponding to pixel positions on that image line. Clone the // satellite positions to make them one per each sight vector. It is // easier to work with things that way later. std::vector<Vector3> full_sat_pos(num_pts); std::int64_t count = 0; for (std::int64_t row = 0; row < num_rows; row++) { for (std::int64_t col = 0; col < num_cols; col++) { full_sat_pos[count] = sat_pos[row]; count++; } } if (count != num_pts) vw_throw(ArgumentErr() << "Book-keeping failure!\n"); std::vector<double> longitude; asp::read_vec(longitude_file, longitude); if (std::int64_t(longitude.size()) != num_pts) vw_throw(ArgumentErr() << "Expecting " << num_pts << " longitude values in " << longitude_file << " but got instead " << longitude.size() << ".\n"); std::vector<double> latitude; asp::read_vec(latitude_file, latitude); if (std::int64_t(latitude.size()) != num_pts) vw_throw(ArgumentErr() << "Expecting " << num_pts << " latitude values in " << latitude_file << " but got instead " << latitude.size() << ".\n"); // Convert geocentric latitude to geodetic latitude. // This applies to BOTH V003 (directory format) and V004 (HDF format) data: // - V003: ASTER provided geocentric lat/lon in text files // - V004: We compute geocentric lat/lon to match V003 convention // Formula from pages 60 and 79 of ASTER V2 User Guide: // https://asterweb.jpl.nasa.gov/content/03_data/04_Documents/aster_user_guide_v2.pdf // Geodetic = Arctan [(tan (Latitude)) / 0.99330562] double deg2rad = M_PI / 180.0; for (std::size_t i = 0; i < latitude.size(); i++) { latitude[i] = atan(tan(deg2rad * latitude[i]) / 0.99330562) / deg2rad; } std::vector<Vector2> pixels; asp::read_2d_points(lattice_file, pixels); if (std::int64_t(pixels.size()) != num_pts) vw_throw(ArgumentErr() << "Expecting " << num_pts << " pixels in " << lattice_file << " but got instead " << pixels.size() << ".\n"); // Convert from geodetic coordinates to xyz cartography::Datum datum; datum.set_well_known_datum("WGS84"); std::vector<Vector3> ground_xyz(num_pts); for (std::int64_t i = 0; i < num_pts; i++) ground_xyz[i] = datum.geodetic_to_cartesian(Vector3(longitude[i], latitude[i], 0)); // Create the sight vectors, from the camera center to the ground, in world // coordinates, rather than in spacecraft coordinates, like sight_vec. for (std::int64_t pt = 0; pt < num_pts; pt++) { Vector3 G = ground_xyz[pt]; Vector3 C = full_sat_pos[pt]; std::int64_t row = pt / num_cols; world_sight_mat[row].push_back((G - C) / norm_2(G - C)); } if (world_sight_mat.empty() || (std::int64_t)world_sight_mat[0].size() != num_cols) vw_throw(ArgumentErr() << "Incorrect number of world sight vectors.\n"); // Form num_samples layers between min_height and max_height. // Each point there will have its corresponding pixel value. std::int64_t num_total_pts = num_pts * num_samples; std::vector<Vector3> all_llh(num_total_pts); std::vector<Vector2> all_pixels(num_total_pts); count = 0; for (std::int64_t sample = 0; sample < num_samples; sample++) { double height = min_height + double(sample) * (max_height - min_height) / (num_samples - 1.0); // Find an xyz position at roughly that height on the line // connecting the original ground point and the satellite // center. We need to solve a quadratic equation for that. We // assume the Earth is a sphere. for (std::int64_t pt = 0; pt < num_pts; pt++) { Vector3 A = ground_xyz[pt]; Vector3 B = full_sat_pos[pt]; Vector3 D = B - A; // Find t such that norm(A + t*D) = norm(A) + height double d = dot_prod(A, D) * dot_prod(A, D) + dot_prod(D, D) * (height * height + 2 * norm_2(A) * height); double t = (-dot_prod(A, D) + sqrt(d)) / dot_prod(D, D); Vector3 P = A + t * D; all_llh[count] = datum.cartesian_to_geodetic(P); all_pixels[count] = pixels[pt]; count++; } } // Find the range of lon-lat-heights BBox3 llh_box; for (std::size_t i = 0; i < all_llh.size(); i++) llh_box.grow(all_llh[i]); // Find the range of pixels BBox2 pixel_box; for (std::size_t i = 0; i < all_pixels.size(); i++) pixel_box.grow(all_pixels[i]); llh_scale = (llh_box.max() - llh_box.min()) / 2.0; // half range llh_offset = (llh_box.max() + llh_box.min()) / 2.0; // center point pixel_scale = (pixel_box.max() - pixel_box.min()) / 2.0; // half range pixel_offset = (pixel_box.max() + pixel_box.min()) / 2.0; // center point normalized_llh.set_size(asp::RPCModel::GEODETIC_COORD_SIZE * num_total_pts); normalized_pixels.set_size(asp::RPCModel::IMAGE_COORD_SIZE * num_total_pts + asp::RpcSolveLMA::NUM_PENALTY_TERMS); for (std::size_t i = 0; i < normalized_pixels.size(); i++) { // Important: The extra penalty terms are all set to zero here. normalized_pixels[i] = 0.0; } // Form the arrays of normalized pixels and normalized llh for (std::int64_t pt = 0; pt < num_total_pts; pt++) { // Normalize the pixel to -1 <> 1 range Vector3 llh_n = elem_quot(all_llh[pt] - llh_offset, llh_scale); Vector2 pixel_n = elem_quot(all_pixels[pt] - pixel_offset, pixel_scale); subvector(normalized_llh, asp::RPCModel::GEODETIC_COORD_SIZE * pt, asp::RPCModel::GEODETIC_COORD_SIZE) = llh_n; subvector(normalized_pixels, asp::RPCModel::IMAGE_COORD_SIZE * pt, asp::RPCModel::IMAGE_COORD_SIZE) = pixel_n; } return; } // Save an XML file having all RPC information void save_xml(std::int64_t image_cols, std::int64_t image_rows, std::vector<std::vector<Vector2>> const &lattice_mat, std::vector<std::vector<Vector3>> const &sight_mat, std::vector<std::vector<Vector3>> const &world_sight_mat, std::vector<Vector3> const &sat_pos, Vector3 const &llh_scale, Vector3 const &llh_offset, Vector2 const &pixel_scale, Vector2 const &pixel_offset, asp::RPCModel::CoeffVec const &line_num, asp::RPCModel::CoeffVec const &line_den, asp::RPCModel::CoeffVec const &samp_num, asp::RPCModel::CoeffVec const &samp_den, std::string const &out_cam_file) { std::string lineoffset = vw::num_to_str(pixel_offset.y()); std::string sampoffset = vw::num_to_str(pixel_offset.x()); std::string latoffset = vw::num_to_str(llh_offset.y()); std::string longoffset = vw::num_to_str(llh_offset.x()); std::string heightoffset = vw::num_to_str(llh_offset.z()); std::string linescale = vw::num_to_str(pixel_scale.y()); std::string sampscale = vw::num_to_str(pixel_scale.x()); std::string latscale = vw::num_to_str(llh_scale.y()); std::string longscale = vw::num_to_str(llh_scale.x()); std::string heightscale = vw::num_to_str(llh_scale.z()); std::string linenumcoef = vw::vec_to_str(line_num); std::string linedencoef = vw::vec_to_str(line_den); std::string sampnumcoef = vw::vec_to_str(samp_num); std::string sampdencoef = vw::vec_to_str(samp_den); vw_out() << "Writing: " << out_cam_file << std::endl; std::ofstream ofs(out_cam_file.c_str()); ofs << "<isd>\n"; // Rigorous camera model // Lattice points ofs << " <LATTICE_POINT>\n"; for (std::size_t row = 0; row < lattice_mat.size(); row++) { for (std::size_t col = 0; col < lattice_mat[row].size(); col++) { ofs << vw::vec_to_str(lattice_mat[row][col]) << std::endl; } ofs << std::endl; } ofs << " </LATTICE_POINT>\n"; // Sight vector ofs << " <SIGHT_VECTOR>\n"; for (std::size_t row = 0; row < sight_mat.size(); row++) { for (std::size_t col = 0; col < sight_mat[row].size(); col++) { ofs << vw::vec_to_str(sight_mat[row][col]) << std::endl; } ofs << std::endl; } ofs << " </SIGHT_VECTOR>\n"; // Sight vector in world coordinates ofs << " <WORLD_SIGHT_VECTOR>\n"; for (std::size_t row = 0; row < world_sight_mat.size(); row++) { for (std::size_t col = 0; col < world_sight_mat[row].size(); col++) { ofs << vw::vec_to_str(world_sight_mat[row][col]) << std::endl; } ofs << std::endl; } ofs << " </WORLD_SIGHT_VECTOR>\n"; // Satellite position ofs << " <SAT_POS>\n"; for (std::size_t row = 0; row < sat_pos.size(); row++) { ofs << vw::vec_to_str(sat_pos[row]) << std::endl; } ofs << " </SAT_POS>\n"; // Image size ofs << " <IMAGE_COLS>" << image_cols << "</IMAGE_COLS>\n"; ofs << " <IMAGE_ROWS>" << image_rows << "</IMAGE_ROWS>\n"; // RPC ofs << " <RPB>\n"; ofs << " <SATID>ASTER_L1A_VNIR_Band3</SATID>\n"; ofs << " <IMAGE>\n"; ofs << " <LINEOFFSET>" << lineoffset << "</LINEOFFSET>\n"; ofs << " <SAMPOFFSET>" << sampoffset << "</SAMPOFFSET>\n"; ofs << " <LATOFFSET>" << latoffset << "</LATOFFSET>\n"; ofs << " <LONGOFFSET>" << longoffset << "</LONGOFFSET>\n"; ofs << " <HEIGHTOFFSET>" << heightoffset << "</HEIGHTOFFSET>\n"; ofs << " <LINESCALE>" << linescale << "</LINESCALE>\n"; ofs << " <SAMPSCALE>" << sampscale << "</SAMPSCALE>\n"; ofs << " <LATSCALE>" << latscale << "</LATSCALE>\n"; ofs << " <LONGSCALE>" << longscale << "</LONGSCALE>\n"; ofs << " <HEIGHTSCALE>" << heightscale << "</HEIGHTSCALE>\n"; ofs << " <LINENUMCOEFList>\n"; ofs << " <LINENUMCOEF>" << linenumcoef << "</LINENUMCOEF>\n"; ofs << " </LINENUMCOEFList>\n"; ofs << " <LINEDENCOEFList>\n"; ofs << " <LINEDENCOEF>" << linedencoef << "</LINEDENCOEF>\n"; ofs << " </LINEDENCOEFList>\n"; ofs << " <SAMPNUMCOEFList>\n"; ofs << " <SAMPNUMCOEF>" << sampnumcoef << "</SAMPNUMCOEF>\n"; ofs << " </SAMPNUMCOEFList>\n"; ofs << " <SAMPDENCOEFList>\n"; ofs << " <SAMPDENCOEF>" << sampdencoef << "</SAMPDENCOEF>\n"; ofs << " </SAMPDENCOEFList>\n"; ofs << " </IMAGE>\n"; ofs << " </RPB>\n"; ofs << "</isd>\n"; ofs.close(); } // Create XML files containing rigorous camera info, and compute the RPC // coefficients as well. void gen_xml(double min_height, double max_height, std::int64_t num_samples, double penalty_weight, std::string const &image_file, std::string const &sat_pos_file, std::string const &sight_vec_file, std::string const &longitude_file, std::string const &latitude_file, std::string const &lattice_file, std::string const &out_cam_file) { std::vector<std::vector<Vector2>> lattice_mat; asp::read_matrix_from_file(lattice_file, lattice_mat); std::vector<std::vector<Vector3>> sight_mat; asp::read_matrix_from_file(sight_vec_file, sight_mat); if (lattice_mat.empty() || sight_mat.empty() || lattice_mat.size() != sight_mat.size() || lattice_mat[0].size() != sight_mat[0].size()) { vw_throw(ArgumentErr() << "Inconsistent lattice point and sight vector information.\n"); } // Read the satellite positions std::vector<Vector3> sat_pos; asp::read_3d_points(sat_pos_file, sat_pos); if (sat_pos.size() != sight_mat.size()) vw_throw( ArgumentErr() << "Inconsistent satellite position and sight vector information.\n"); Vector3 llh_scale, llh_offset; Vector2 pixel_scale, pixel_offset; Vector<double> normalized_llh; Vector<double> normalized_pixels; std::vector<std::vector<vw::Vector3>> world_sight_mat; // sight dir in world coords generate_point_pairs(min_height, max_height, num_samples, penalty_weight, sat_pos_file, sight_vec_file, longitude_file, latitude_file, lattice_file, // Outputs world_sight_mat, llh_scale, llh_offset, pixel_scale, pixel_offset, normalized_llh, normalized_pixels); // Find the RPC coefficients asp::RPCModel::CoeffVec line_num, line_den, samp_num, samp_den; bool refine_only = false; asp::gen_rpc(penalty_weight, normalized_llh, normalized_pixels, refine_only, // Outputs line_num, line_den, samp_num, samp_den); DiskImageView<float> input_img(image_file); std::int64_t image_cols = input_img.cols(); std::int64_t image_rows = input_img.rows(); save_xml(image_cols, image_rows, lattice_mat, sight_mat, world_sight_mat, sat_pos, llh_scale, llh_offset, pixel_scale, pixel_offset, line_num, line_den, samp_num, samp_den, out_cam_file); } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); // Track if we created a temp directory (for cleanup later) std::string hdfOutDir = ""; // Check if input is an HDF file and extract data if so if (boost::iends_with(opt.input, ".hdf")) { vw_out() << "Reading HDF file: " << opt.input << "\n"; hdfOutDir = asp::genTmpDir(opt.output_prefix); vw_out() << "Creating directory " << hdfOutDir << " for extracting data from HDF.\n"; asp::extractHdfData(opt.input, hdfOutDir); vw_out() << "HDF extraction complete.\n"; // Point the input to the temp directory so the rest of the code can find the files opt.input = hdfOutDir; } std::string nadir_image, back_image, nadir_sat_pos, back_sat_pos; std::string nadir_sight_vec, back_sight_vec; std::string nadir_corr_table, back_corr_table; std::string nadir_longitude, back_longitude; std::string nadir_latitude, back_latitude; std::string nadir_lattice_point, back_lattice_point; locate_inputs(opt, nadir_image, back_image, nadir_sat_pos, back_sat_pos, nadir_sight_vec, back_sight_vec, nadir_corr_table, back_corr_table, nadir_longitude, back_longitude, nadir_latitude, back_latitude, nadir_lattice_point, back_lattice_point); std::string out_nadir_image = opt.output_prefix + "-Band3N.tif"; std::string out_back_image = opt.output_prefix + "-Band3B.tif"; std::string out_nadir_cam = opt.output_prefix + "-Band3N.xml"; std::string out_back_cam = opt.output_prefix + "-Band3B.xml"; // Oddly, writing the xml files first, with output prefix "run", results in // images later wiping the xml camera files. So write the images before the // xml files. asp::applyRadiometricCorrections(nadir_image, nadir_corr_table, out_nadir_image, opt); asp::applyRadiometricCorrections(back_image, back_corr_table, out_back_image, opt); vw_out() << "Computing the camera models.\n"; gen_xml(opt.min_height, opt.max_height, opt.num_samples, opt.penalty_weight, nadir_image, nadir_sat_pos, nadir_sight_vec, nadir_longitude, nadir_latitude, nadir_lattice_point, out_nadir_cam); gen_xml(opt.min_height, opt.max_height, opt.num_samples, opt.penalty_weight, back_image, back_sat_pos, back_sight_vec, back_longitude, back_latitude, back_lattice_point, out_back_cam); // Clean up temporary directory if we created one if (!hdfOutDir.empty()) { if (opt.keep_tmp_dir) { vw_out() << "Keeping temporary directory: " << hdfOutDir << "\n"; } else { vw_out() << "Removing temporary directory: " << hdfOutDir << "\n"; fs::remove_all(hdfOutDir); } } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/bathy_plane_calc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file bathy_plane_calc.cc #include <asp/Core/PointUtils.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/StereoSettings.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/BathyPlaneCalc.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Cartography/BathyStereoModel.h> #include <vw/Cartography/shapeFile.h> #include <vw/Camera/CameraModel.h> #include <vw/FileIO/FileUtils.h> #include <Eigen/Dense> #include <algorithm> #include <iostream> #include <iterator> #include <random> #include <set> #include <vector> namespace po = boost::program_options; struct Options: vw::GdalWriteOptions { std::string shapefile, dem, mask, ortho_mask, camera, stereo_session, bathy_plane, water_height_measurements, lon_lat_measurements, csv_format_str, output_inlier_shapefile, bundle_adjust_prefix, output_outlier_shapefile, mask_boundary_shapefile, dem_minus_plane; double outlier_threshold; int num_ransac_iterations, num_samples; bool save_shapefiles_as_polygons; Options(): outlier_threshold(0.5), num_ransac_iterations(1000) {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options("General Options"); general_options.add_options() ("shapefile", po::value(&opt.shapefile), "The shapefile with vertices whose coordinates will be looked up in the DEM " "with bilinear interpolation.") ("dem", po::value(&opt.dem), "The DEM to use.") ("mask", po::value(&opt.mask), "An input mask, created from a raw camera image and hence having the same dimensions. " "Land pixels must have positive value. Water pixels must have non-positive value " "or be no-data. The heights will be looked up in the DEM with bilinear " "interpolation.") ("camera", po::value(&opt.camera), "The camera file to use with the mask.") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Use the camera adjustment at this output prefix, if the cameras changed " "based on bundle adjustment or alignment.") ("session-type,t", po::value(&opt.stereo_session)->default_value(""), "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.") ("bathy-plane", po::value(&opt.bathy_plane), "The output file storing the computed plane as four coefficients a, b, c, d, " "with the plane being a*x + b*y + c*z + d = 0.") ("outlier-threshold", po::value(&opt.outlier_threshold)->default_value(0.5), "A value, in meters, to determine the distance from a sampled point on the DEM to the " "best-fit plane to determine if it will be marked as outlier and not " "included in the calculation of that plane. Its value should be roughly the expected " "vertical uncertainty of the DEM.") ("num-ransac-iterations", po::value(&opt.num_ransac_iterations)->default_value(1000), "Number of RANSAC iterations to use to find the best-fitting plane.") ("output-inlier-shapefile", po::value(&opt.output_inlier_shapefile)->default_value(""), "If specified, save at this location the shape file with the inlier vertices.") ("output-outlier-shapefile", po::value(&opt.output_outlier_shapefile)->default_value(""), "If specified, save at this location the shape file with the outlier vertices.") ("mask-boundary-shapefile", po::value(&opt.mask_boundary_shapefile)->default_value(""), "If specified, save the extracted points (before RANSAC) to this shapefile " "and exit. When the input is a mask, a random sample is picked (their " "number given by ``--num-samples``). The heights are looked up in the DEM " "if not already present in the input.") ("num-samples", po::value(&opt.num_samples)->default_value(10000), "Number of samples to pick at the water-land interface if using a mask.") ("save-shapefiles-as-polygons", po::bool_switch(&opt.save_shapefiles_as_polygons)->default_value(false), "Save the inlier and outlier shapefiles as polygons, rather than " "discrete vertices. May be more convenient for processing in a GIS tool.") ("ortho-mask", po::value(&opt.ortho_mask), "An input mask, that is georeferenced and aligned with the DEM. Land pixels must " "have positive value. Water pixels must have non-positive value or be no-data.") ("lon-lat-measurements", po::value(&opt.lon_lat_measurements)->default_value(""), "Use this CSV file having longitude and latitude measurements for the water surface. " "The heights will be looked up in the DEM with bilinear interpolation. The option " "--csv-format must be used.") ("water-height-measurements", po::value(&opt.water_height_measurements)->default_value(""), "Use this CSV file having longitude, latitude, and height measurements for the water " "surface, in degrees and meters, respectively, relative to the WGS84 datum. The " "option --csv-format must be used.") ("csv-format", po::value(&opt.csv_format_str)->default_value(""), "Specify the format of the CSV file having water height measurements or lon and lat " "values. The format should have a list of entries with syntax " "column_index:column_type (indices start from 1). Example: '2:lon 3:lat " "4:height_above_datum'.") ("dem-minus-plane", po::value(&opt.dem_minus_plane), "If specified, subtract from the input DEM the best-fit plane and save the " "obtained DEM to this GeoTiff file."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); //positional.add_options() // ("input-files", po::value< std::vector<std::string> >(), "Input files"); po::positional_options_description positional_desc; //positional_desc.add("input-files", -1); std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Need this to be able to load adjusted camera models. This must be set // before loading the cameras. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; bool use_shapefile = !opt.shapefile.empty(); bool use_mask = !opt.mask.empty(); bool use_ortho_mask = !opt.ortho_mask.empty(); bool use_meas = !opt.water_height_measurements.empty(); bool use_lon_lat = !opt.lon_lat_measurements.empty(); if (use_mask && opt.camera.empty()) vw::vw_throw(vw::ArgumentErr() << "If using a mask, must specify a camera.\n" << usage << general_options); if (use_shapefile + use_mask + use_ortho_mask + use_meas + use_lon_lat != 1) vw::vw_throw(vw::ArgumentErr() << "Must use either a mask and camera, an ortho-mask, a shapefile, " << "water height measurements, or lon-lat measurements, " << "and just one of these.\n"); if (!use_meas && opt.dem == "") vw::vw_throw(vw::ArgumentErr() << "Missing the input dem.\n" << usage << general_options); if (opt.bathy_plane.empty() && opt.mask_boundary_shapefile.empty()) vw::vw_throw(vw::ArgumentErr() << "Must set either --bathy-plane or --mask-boundary-shapefile.\n" << usage << general_options); if ((use_meas || use_lon_lat) && opt.csv_format_str == "") vw::vw_throw(vw::ArgumentErr() << "Must set the option --csv-format.\n" << usage << general_options); if ((use_mask || use_ortho_mask) && opt.num_samples <= 0) vw::vw_throw(vw::ArgumentErr() << "A positive number of samples must be specified.\n" << usage << general_options); if (!opt.dem_minus_plane.empty() && opt.dem.empty()) vw::vw_throw(vw::ArgumentErr() << "The option --dem must be set if using --dem-minus-plane.\n" << usage << general_options); // Create the output prefix std::string out_prefix = opt.bathy_plane; if (opt.bathy_plane.empty()) out_prefix = opt.mask_boundary_shapefile; // Remove the extension, which is the text after the last dot size_t pos = out_prefix.rfind("."); if (pos != std::string::npos) out_prefix = out_prefix.substr(0, pos); // Create the output directory and turn on logging to file vw::create_out_dir(out_prefix); asp::log_to_file(argc, argv, "", out_prefix); } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); // Load the camera if we use the mask and the camera bool use_shapefile = !opt.shapefile.empty(); bool use_mask = !opt.mask.empty(); bool use_ortho_mask = !opt.ortho_mask.empty(); bool use_meas = !opt.water_height_measurements.empty(); bool use_lon_lat = !opt.lon_lat_measurements.empty(); vw::CamPtr camera_model; if (use_mask) { std::string out_prefix; asp::SessionPtr session(asp::StereoSessionFactory::create(opt.stereo_session, // may change opt, opt.mask, opt.mask, opt.camera, opt.camera, out_prefix)); camera_model = session->camera_model(opt.mask, opt.camera); } // Only WGS84 is supported. Note that dem_georef and shape_georef // may or may not be overwritten below depending on the case. vw::cartography::GeoReference dem_georef; vw::cartography::Datum datum("WGS_1984"); dem_georef.set_datum(datum); dem_georef.set_geographic(); bool has_shape_georef = true; vw::cartography::GeoReference shape_georef = dem_georef; float dem_nodata_val = -std::numeric_limits<float>::max(); vw::ImageViewRef<float> dem; vw::ImageViewRef<vw::PixelMask<float>> masked_dem; vw::ImageViewRef<vw::PixelMask<float>> interp_dem; if (use_shapefile || use_mask || use_ortho_mask || use_lon_lat || !opt.dem_minus_plane.empty()) { // Read the DEM and its associated data // TODO(oalexan1): Think more about the interpolation method vw::vw_out() << "Reading the DEM: " << opt.dem << "\n"; if (!vw::cartography::read_georeference(dem_georef, opt.dem)) vw::vw_throw(vw::ArgumentErr() << "The input DEM has no georeference.\n"); // We assume the WGS_1984 datum if (dem_georef.datum().name() != "WGS_1984") vw::vw_throw(vw::ArgumentErr() << "The input DEM must be relative to the " << "WGS_1984 datum.\n" << "Got: " << dem_georef.datum().name() << ".\n"); // Note we use a float nodata if (!vw::read_nodata_val(opt.dem, dem_nodata_val)) vw::vw_out() << "Warning: Could not read the DEM nodata value. " << "Using: " << dem_nodata_val << ".\n"; else vw::vw_out() << "Read DEM nodata value: " << dem_nodata_val << ".\n"; // Read the DEM dem = vw::DiskImageView<float>(opt.dem); masked_dem = vw::create_mask(dem, dem_nodata_val); vw::PixelMask<float> nodata_pix(0); nodata_pix.invalidate(); vw::ValueEdgeExtension<vw::PixelMask<float>> ext_nodata(nodata_pix); interp_dem = vw::interpolate(masked_dem, vw::BilinearInterpolation(), ext_nodata); shape_georef = dem_georef; // may get overwritten below } std::vector<Eigen::Vector3d> ecef_vec; std::vector<vw::Vector3> llh_vec; double proj_lat = -1.0, proj_lon = -1.0; std::vector<vw::Vector2> shape_xy_vec; vw::cartography::GeoReference stereographic_georef; std::string poly_color = "green"; if (use_mask) { // Use read_bathy_mask() which invalidates both nodata and non-positive // pixels. Then apply_mask() converts to a plain float image with 0 for // water, so the existing threshold logic works with threshold = 0. vw::vw_out() << "Reading the mask: " << opt.mask << "\n"; float mask_nodata_val = 0.0f; { float file_nodata = -std::numeric_limits<float>::max(); if (vw::read_nodata_val(opt.mask, file_nodata)) vw::vw_out() << "Read mask nodata value: " << file_nodata << ".\n"; } auto masked = vw::read_bathy_mask(opt.mask, mask_nodata_val); auto mask = vw::apply_mask(masked, 0.0f); mask_nodata_val = 0.0f; vw::vw_out() << "Non-positive or nodata pixels are classified as water.\n"; shape_georef = dem_georef; asp::sampleMaskBd(mask, mask_nodata_val, camera_model, shape_georef, dem_georef, masked_dem, opt.num_samples, ecef_vec, llh_vec, shape_xy_vec); } else if (use_ortho_mask) { // Read the ortho mask. Will overwrite shape_georef. if (!vw::cartography::read_georeference(shape_georef, opt.ortho_mask)) vw::vw_throw(vw::ArgumentErr() << "The input ortho-mask has no georeference.\n"); asp::sampleOrthoMaskBd(opt.ortho_mask, shape_georef, dem_georef, interp_dem, opt.num_samples, ecef_vec, llh_vec, shape_xy_vec); } else if (use_shapefile) { // Read the shapefile, overwriting shape_georef vw::vw_out() << "Reading the shapefile: " << opt.shapefile << "\n"; std::vector<vw::geometry::dPoly> polyVec; vw::geometry::read_shapefile(opt.shapefile, poly_color, has_shape_georef, shape_georef, polyVec); if (!has_shape_georef) vw::vw_throw(vw::ArgumentErr() << "The input shapefile has no georeference.\n"); // Find the ECEF coordinates of the shape corners asp::find_points_at_shape_corners(polyVec, shape_georef, dem_georef, interp_dem, ecef_vec, llh_vec, shape_xy_vec); } else if (use_meas) { asp::find_points_from_meas_csv(opt.water_height_measurements, opt.csv_format_str, shape_georef, // Outputs ecef_vec, llh_vec, shape_xy_vec); } else if (use_lon_lat) { shape_georef = dem_georef; has_shape_georef = true; asp::find_points_from_lon_lat_csv(opt.lon_lat_measurements, opt.csv_format_str, shape_georef, dem_georef, interp_dem, // Outputs ecef_vec, llh_vec, shape_xy_vec); } else { vw::vw_throw(vw::LogicErr() << "Unhandled input case in bathy_plane_calc.cc.\n"); } if (!opt.mask_boundary_shapefile.empty()) { asp::saveShape(ecef_vec, opt.mask_boundary_shapefile); return 0; } // See if to convert to local stereographic projection std::vector<Eigen::Vector3d> local_proj_point_vec; asp::find_projection(// Inputs dem_georef, llh_vec, // Outputs proj_lat, proj_lon, stereographic_georef, local_proj_point_vec); // Compute the water surface using RANSAC std::vector<size_t> inlier_indices; double inlier_threshold = opt.outlier_threshold; vw::Matrix<double> plane; asp::calcBathyPlane(opt.num_ransac_iterations, inlier_threshold, local_proj_point_vec, plane, inlier_indices); asp::calcPlaneProperties(local_proj_point_vec, inlier_indices, dem_georef, plane); asp::saveBathyPlane(proj_lat, proj_lon, plane, opt.bathy_plane); // Save the shape having the inliers. if (opt.output_inlier_shapefile != "") { vw::geometry::dPoly inlierPoly; for (size_t inlier_it = 0; inlier_it < inlier_indices.size(); inlier_it++) asp::addPointToPoly(inlierPoly, shape_xy_vec[inlier_indices[inlier_it]]); if (opt.save_shapefiles_as_polygons) { vw::geometry::dPoly localPoly; asp::formSinglePoly(inlierPoly, localPoly); inlierPoly = localPoly; } std::vector<vw::geometry::dPoly> inlierPolyVec; inlierPolyVec.push_back(inlierPoly); vw::vw_out() << "Writing inlier shapefile: " << opt.output_inlier_shapefile << "\n"; vw::geometry::write_shapefile(opt.output_inlier_shapefile, has_shape_georef, shape_georef, inlierPolyVec); } // Save the shape having the outliers. if (opt.output_outlier_shapefile != "") { // First put the inliers in a set so we can exclude them std::set<int> inlier_set; for (size_t inlier_it = 0; inlier_it < inlier_indices.size(); inlier_it++) inlier_set.insert(inlier_indices[inlier_it]); vw::geometry::dPoly outlierPoly; for (size_t it = 0; it < shape_xy_vec.size(); it++) { if (inlier_set.find(it) != inlier_set.end()) continue; // an inlier, skip it asp::addPointToPoly(outlierPoly, shape_xy_vec[it]); } if (opt.save_shapefiles_as_polygons) { vw::geometry::dPoly localPoly; asp::formSinglePoly(outlierPoly, localPoly); outlierPoly = localPoly; } std::vector<vw::geometry::dPoly> outlierPolyVec; outlierPolyVec.push_back(outlierPoly); vw::vw_out() << "Writing outlier shapefile: " << opt.output_outlier_shapefile << "\n"; vw::geometry::write_shapefile(opt.output_outlier_shapefile, has_shape_georef, shape_georef, outlierPolyVec); } if (opt.dem_minus_plane != "") { bool has_nodata = true, has_georef = true; vw::vw_out() << "Writing: " << opt.dem_minus_plane << "\n"; vw::TerminalProgressCallback tpc("asp", ": "); auto dem_minus_plane = asp::demMinusPlane(dem, dem_georef, plane, dem_nodata_val, stereographic_georef); vw::cartography::block_write_gdal_image(opt.dem_minus_plane, dem_minus_plane, has_georef, dem_georef, has_nodata, dem_nodata_val, opt, tpc); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/bathy_threshold_calc.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' Find the water-land threshold in an image (for example the band 7 of a WorldView multispectral image by computing a kernel-density estimate using Gaussian kernels. A good threshold is usually the first minimum of this estimate. This tool needs python 3, numpy, scipy, matplotlib, and osgeo. ''' import sys, time, math, argparse import numpy as np import matplotlib.pyplot as plt import scipy.stats as st from osgeo import gdal from scipy.signal import argrelextrema # Try to use sklearn as well, gives very similar results in very similar time. # Install this with: # conda install -c conda-forge scikit-learn use_sklearn = False # off by default if use_sklearn: from sklearn.neighbors import KernelDensity usage = "python bathy_threshold_calc.py --image <image> --num-samples <num>." parser = argparse.ArgumentParser(usage=usage, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('--image', dest = 'image', default = "", help='The single-channel image to use to find the water-land threshold.') parser.add_argument("--num-samples", dest="num_samples", type=int, default = 1000000, help="The number of samples to pick from the image (more samples " + "will result in more accuracy but will be slower).") parser.add_argument("--no-plot", action="store_true", default=False, dest="no_plot", help="Do not show the plot.") (options, args) = parser.parse_known_args(sys.argv) if options.image == "": parser.print_help() sys.exit(1) print("Image file is " + options.image) print("Number of samples is " + str(options.num_samples)) # Try to read the file using GDAL try: ds = gdal.Open(options.image, gdal.GA_ReadOnly) if ds is None: print("Could not read the file: " + options.image) sys.exit(1) if ds.RasterCount != 1: print("Expecting one band in " + options.image + ", but got instead: " + str(ds.RasterCount) + ".") sys.exit(1) rb = ds.GetRasterBand(1) image = rb.ReadAsArray() except Exception as err: print("Could not read the file: " + options.image) print("It must exist and be a single-band TIF file.") sys.exit(1) num_rows = image.shape[0] num_cols = image.shape[1] if num_rows <= 0 or num_cols <= 0: print("Expecting an image with positive dimensions") sys.exit(1) num_vals = num_rows * num_cols samp_ratio = math.sqrt( float(num_vals) / float(options.num_samples) ) if samp_ratio < 1.0: samp_ratio = 1.0 num_sub_rows = round(num_rows / samp_ratio) if num_sub_rows < 1: num_sub_rows = 1 if num_sub_rows > num_rows: num_sub_rows = num_rows num_sub_cols = round(num_cols / samp_ratio) if num_sub_cols < 1: num_sub_cols = 1 if num_sub_cols > num_cols: num_sub_cols = num_cols print("Number of image rows and columns: " + str(num_rows) + ", " + str(num_cols)) print("Picking a uniform sample of dimensions " + str(num_sub_rows) + ", " + str(num_sub_cols)) print("Please be patient. It may take several minutes to find the answer.") # Subsample uniformly the image sub_rows = np.round(np.array(range(num_sub_rows)) * float(num_rows - 1)/float(num_sub_rows - 1)) sub_cols = np.round(np.array(range(num_sub_cols)) * float(num_cols - 1)/float(num_sub_cols - 1)) sub_rows = sub_rows.astype(int) sub_cols = sub_cols.astype(int) sub_image = image[sub_rows, :][:, sub_cols] # Make it into an array data = sub_image.reshape(-1) xvals = np.linspace(data.min(), data.max(), 1000) beg = time.time() kde = st.gaussian_kde(data) yvals = kde(xvals) min_pos = argrelextrema(yvals, np.less) min_vals = xvals[min_pos] end = time.time() # Note that it is not universal for it to be first minimum. Sometimes # the second minimum is better! print("Positions of the minima: ", min_vals) print("Suggested threshold is the position of the first minimum: ", min_vals[0]) print("Please verify with the graph. There is a chance subsequent minima may work better.") print("Elapsed time in seconds:", round(10.0*(end - beg))/10.0) # sklearn, with similar results if use_sklearn: beg2 = time.time() kernel = 'gaussian' kde2 = KernelDensity(kernel = kernel, bandwidth = 10).fit(data[:, np.newaxis]) log_dens = kde2.score_samples(xvals[:, np.newaxis]) yvals2 = np.exp(log_dens).reshape(-1) min_pos2 = argrelextrema(yvals2, np.less); min_vals2 = xvals[min_pos2] end2 = time.time() print("Elapsed time for sklearn kernel estimation in seconds:", round(10.0*(end2 - beg2))/10.0) print("Suggested threshold is the position of the first minimum2: ", min_vals2[0]) print("Positions of the minima2: ", min_vals2) # Plot the kernel-density estimate and highlight the minima if not options.no_plot: plt.figure(1) plt.hist(data, bins=100, density=True, label="Data histogram") plt.plot(xvals, yvals, label="KDE", c="red") plt.vlines(min_vals, ymin=0, ymax=yvals.max(),colors='g', ls="--", label="Minima", alpha=0.7) if use_sklearn: plt.plot(xvals, yvals2, color = 'green', lw = 2, linestyle='-', label="kernel = '{0}'".format(kernel)) plt.legend() plt.show() ================================================ FILE: src/asp/Tools/bias_dg_cam.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # A script to bias the EPH (positions) and ATT (orientations) fields # in a Maxar (DigitalGlobe) linescan camera. import sys, os, re, optparse try: usage = "Usage: bias_dg_cam.py --position-bias 'x y z' --orientation-bias 'x y z w' " + \ "-i input.xml -o output.xml" parser = optparse.OptionParser(usage=usage) parser.add_option("--position-bias", dest="position_bias", help="A list of four numbers, in quotes, having the values to add " + \ "to positions, in meters.") parser.add_option("--orientation-bias", dest="orientation_bias", help="A list of four numbers, in quotes, having the values to " + \ "add to quaternions (orientations), in order x, y, z, w.") parser.add_option("-i", "--input-camera", dest="in_cam", help="Output camera.", type="string") parser.add_option("-o", "--output-camera", dest="out_cam", help="Output camera.", type="string") (opt, args) = parser.parse_args() except optparse.OptionError as msg: raise Usage(msg) if opt.in_cam is None or opt.out_cam is None: print("Must specify input and output cameras.\n" + usage) sys.exit(1) if opt.position_bias is None or opt.orientation_bias is None: print("Must specify the position and orientation bias.\n" + usage) sys.exit(1) vals = opt.position_bias.split() if len(vals) != 3: print("Must have three values for the position bias, enclosed in quotes.") sys.exit(1) position_bias = [] for val in vals: position_bias.append(float(val)) vals = opt.orientation_bias.split() if len(vals) != 4: print("Must have four values for the orientation bias, enclosed in quotes.") sys.exit(1) orientation_bias = [] for val in vals: orientation_bias.append(float(val)) print("Reading: " + opt.in_cam) handle = open(opt.in_cam, 'r') lines = handle.readlines() handle.close() for count in range(len(lines)): line = lines[count] m = re.search('^(.*?<EPHEMLIST>)(.*?)(</EPHEMLIST>.*?\n)', line) if m: ephem = m.group(2) vals = ephem.split() # Modify values with index 1, 2, 3 (not 0) representing positions for it in range(1, 4): vals[it] = str(float(vals[it]) + position_bias[it - 1]) ephem = " ".join(vals) lines[count] = m.group(1) + ephem + m.group(3) m = re.search('^(.*?<ATTLIST>)(.*?)(</ATTLIST>.*?\n)', line) if m: att = m.group(2) vals = att.split() # Modify values with index 1, 2, 3, 4 (not 0), representing quaternions for it in range(1, 5): vals[it] = str(float(vals[it]) + orientation_bias[it - 1]) att = " ".join(vals) lines[count] = m.group(1) + att + m.group(3) print("Writing: " + opt.out_cam) handle = open(opt.out_cam, 'w') handle.writelines(lines) handle.close() ================================================ FILE: src/asp/Tools/bundle_adjust.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file bundle_adjust.cc // TODO(oalexan1): Break this up into several files grouped by functionality. // See existing BundleAdjustCamera.cc, etc. #include <asp/Sessions/BundleAdjustParse.h> #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Sessions/BundleAdjustSession.h> #include <asp/Camera/BundleAdjustOptions.h> #include <asp/Camera/BundleAdjustResiduals.h> #include <asp/Camera/BundleAdjustOutliers.h> #include <asp/Camera/BundleAdjustIsis.h> #include <asp/Camera/BundleAdjustEigen.h> #include <asp/Camera/BaseCostFuns.h> #include <asp/Camera/BundleAdjustCostFuns.h> #include <asp/Camera/LinescanUtils.h> #include <asp/Camera/CsmModel.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/Nvm.h> #include <asp/Core/PointUtils.h> #include <asp/Core/Macros.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/OutlierProcessing.h> #include <asp/Core/BundleAdjustUtils.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/FileUtils.h> #include <vw/Camera/CameraUtilities.h> #include <vw/Core/CmdUtils.h> #include <vw/FileIO/MatrixIO.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Cartography/GeoReferenceBaseUtils.h> #include <vw/Cartography/DatumUtils.h> #include <vw/BundleAdjustment/ControlNetworkLoader.h> #include <vw/BundleAdjustment/CameraRelation.h> #include <vw/Camera/PinholeModel.h> #include <vw/Camera/LensDistortion.h> #include <vw/Camera/OpticalBarModel.h> #include <vw/FileIO/FileTypes.h> #include <vw/FileIO/FileUtils.h> // Can't do much about warnings in boost except to hide them #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include <boost/algorithm/string.hpp> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/fstream.hpp> #include <boost/foreach.hpp> #pragma GCC diagnostic pop #include <xercesc/util/PlatformUtils.hpp> #include <set> namespace fs = boost::filesystem; using namespace vw; using namespace asp; using namespace vw::camera; using namespace vw::ba; // A callback to invoke at each iteration if desiring to save the cameras // at that time. class BaCallback: public ceres::IterationCallback { public: BaCallback(asp::BaOptions const& opt, asp::BaParams const& param_storage): m_opt(opt), m_param_storage(param_storage) {} virtual ceres::CallbackReturnType operator() (const ceres::IterationSummary& summary) { saveUpdatedCameras(m_opt, m_param_storage); return ceres::SOLVER_CONTINUE; } private: asp::BaOptions const& m_opt; asp::BaParams const& m_param_storage; }; // One pass of bundle adjustment int baOnePass(asp::BaOptions & opt, asp::CRN const & crn, bool first_pass, bool remove_outliers, asp::BaParams & param_storage, // output asp::BaParams const & orig_parameters, std::vector<vw::CamPtr> const& orig_cams, std::vector<std::vector<vw::Vector3>> const& orig_cam_positions, bool & convergence_reached, double & final_cost) { ControlNetwork & cnet = *opt.cnet; int num_cameras = param_storage.num_cameras(); int num_points = param_storage.num_points(); if ((int)crn.size() != num_cameras) vw_throw(ArgumentErr() << "Book-keeping error, the size of CameraRelationNetwork " << "must equal the number of images.\n"); convergence_reached = true; if (opt.proj_win != BBox2(0, 0, 0, 0) && (!opt.proj_str.empty())) asp::filterOutliersProjWin(opt, param_storage, cnet); // How many times an xyz point shows up in the problem std::vector<int> count_map(num_points); for (int i = 0; i < num_points; i++) { if (param_storage.get_point_outlier(i)) count_map[i] = 0; // skip outliers else count_map[i] = cnet[i].size(); // Get number of observations of this point. } // We will optimize multipliers of the intrinsics. This way each intrinsic // changes by a scale specific to it. Note: See --min-distortion for initial // values of the lens distortion coeffs when distortion is optimized. // Prepare for the DEM constraint. // TODO(oalexan1): Study how to best pass the DEM to avoid the code // below not being slow. It is not clear if the DEM tiles are cached // when passing around an ImageViewRef. bool have_dem = (!opt.heights_from_dem.empty()); std::vector<Vector3> dem_xyz_vec; vw::cartography::GeoReference dem_georef; ImageViewRef<PixelMask<double>> masked_dem; std::set<int> outliers; if (have_dem) { for (int ipt = 0; ipt < num_points; ipt++) { if (param_storage.get_point_outlier(ipt)) outliers.insert(ipt); } } if (opt.heights_from_dem != "") { vw::vw_out() << "Constraining against DEM: " << opt.heights_from_dem << "\n"; asp::create_masked_dem(opt.heights_from_dem, dem_georef, masked_dem); asp::updateTriPtsFromDem(cnet, outliers, opt.camera_models, dem_georef, masked_dem, dem_xyz_vec); // output } // If to use a weight image bool have_weight_image = (!opt.weight_image.empty()); vw::ImageViewRef<vw::PixelMask<float>> weight_image; float weight_image_nodata = -std::numeric_limits<float>::max(); vw::cartography::GeoReference weight_image_georef; if (have_weight_image) vw::cartography::readGeorefImage(opt.weight_image, weight_image_nodata, weight_image_georef, weight_image); // Add the various cost functions the solver will optimize over. ceres::Problem problem; // Handle fixed distortion indices. Manually freeing up this pointer at the // end results in a crash. ceres::SubsetManifold *dist_opts = NULL; if (!opt.fixed_distortion_indices.empty()) dist_opts = new ceres::SubsetManifold(param_storage.m_max_num_dist_params, opt.fixed_distortion_indices); // Pixel reprojection error std::vector<size_t> cam_residual_counts, num_pixels_per_cam; std::vector<std::vector<vw::Vector2>> pixels_per_cam; std::vector<std::vector<vw::Vector3>> tri_points_per_cam; std::vector<std::map<int, vw::Vector2>> pixel_sigmas; asp::addPixelReprojCostFun(opt, crn, count_map, weight_image, weight_image_georef, dem_xyz_vec, have_weight_image, have_dem, // Outputs cnet, param_storage, dist_opts, problem, cam_residual_counts, num_pixels_per_cam, pixels_per_cam, tri_points_per_cam, pixel_sigmas); // Add ground control points or points based on a DEM constraint int num_gcp = 0, num_gcp_or_dem_residuals = 0; asp::addGcpOrDemConstraint(opt, opt.cost_function, opt.use_llh_error, opt.fix_gcp_xyz, // Outputs cnet, num_gcp, num_gcp_or_dem_residuals, param_storage, problem); // Add camera constraints if (opt.camera_weight > 0) { for (int icam = 0; icam < num_cameras; icam++) { double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam); ceres::CostFunction* cost_function = CamError::Create(orig_cam_ptr, opt.camera_weight); // Don't use the same loss function as for pixels since that one discounts // outliers and the cameras should never be discounted. // TODO(oalexan1): This will prevent convergence in some cases! ceres::LossFunction* loss_function = new ceres::TrivialLoss(); double * camera = param_storage.get_camera_ptr(icam); problem.AddResidualBlock(cost_function, loss_function, camera); } // End loop through cameras. } // Finer level control of only rotation. See also --camera-position-weight. // Note: A strong constraint here can prevent convergence as the is no loss function. // Camera position and tri constraints are suggested instead. if (opt.rotation_weight > 0) { for (int icam = 0; icam < num_cameras; icam++) { double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam); double translation_weight = 0.0; // This is handled separately ceres::CostFunction* cost_function = RotTransError::Create(orig_cam_ptr, opt.rotation_weight, translation_weight); ceres::LossFunction* loss_function = new ceres::TrivialLoss(); double * camera = param_storage.get_camera_ptr(icam); problem.AddResidualBlock(cost_function, loss_function, camera); } } int num_uncertainty_residuals = 0; if (opt.camera_position_uncertainty.size() > 0) { for (int icam = 0; icam < num_cameras; icam++) { // orig_ctr has the actual camera center, but orig_cam_ptr may have only an adjustment. // For linescan camera, pick the camera center from the middle of the array of // centers. It will be used to determine horizontal and vertical components. vw::Vector3 orig_ctr = orig_cams[icam]->camera_center(vw::Vector2()); double const* orig_cam_ptr = orig_parameters.get_camera_ptr(icam); double * cam_ptr = param_storage.get_camera_ptr(icam); int param_len = 6; // bundle_adjust and jitter_solve expect different lengths double weight = 1.0; ceres::CostFunction* cost_function = CamUncertaintyError::Create(orig_ctr, orig_cam_ptr, param_len, opt.camera_position_uncertainty[icam], weight, opt.datum, opt.camera_position_uncertainty_power); ceres::LossFunction* loss_function = new ceres::TrivialLoss(); problem.AddResidualBlock(cost_function, loss_function, cam_ptr); num_uncertainty_residuals++; } } // Add a soft constraint to keep the cameras near the original position. Add one // constraint per reprojection error. int num_cam_pos_residuals = 0; if (opt.camera_position_weight > 0) asp::addCamPosCostFun(opt, orig_parameters, pixels_per_cam, tri_points_per_cam, pixel_sigmas, orig_cams, param_storage, problem, num_cam_pos_residuals); // Add a cost function meant to tie up to known disparity // (option --reference-terrain). std::vector<vw::Vector3> reference_vec; // must be persistent std::vector<ImageViewRef<DispPixelT>> interp_disp; // must be persistent if (opt.reference_terrain != "") asp::addRefTerrainCostFun(opt, param_storage, problem, reference_vec, interp_disp); // Add a ground constraints to keep points close to their initial positions int num_tri_residuals = 0; if (opt.tri_weight > 0) asp::addTriConstraint(opt, cnet, crn, opt.image_files, orig_cams, opt.tri_weight, opt.cost_function, opt.tri_robust_threshold, // Outputs param_storage, problem, num_tri_residuals); const size_t MIN_KML_POINTS = 50; size_t kmlPointSkip = 30; // Figure out a good KML point skip amount if (num_points / kmlPointSkip < MIN_KML_POINTS) kmlPointSkip = num_points / MIN_KML_POINTS; if (kmlPointSkip < 1) kmlPointSkip = 1; if (first_pass) { vw_out() << "Writing initial condition files." << "\n"; std::string residual_prefix = opt.out_prefix + "-initial_residuals"; write_residual_logs(residual_prefix, opt, param_storage, cam_residual_counts, pixel_sigmas, num_gcp_or_dem_residuals, num_uncertainty_residuals, num_tri_residuals, num_cam_pos_residuals, reference_vec, cnet, crn, problem); std::string point_kml_path = opt.out_prefix + "-initial_points.kml"; param_storage.record_points_to_kml(point_kml_path, opt.datum, kmlPointSkip, "initial_points"); } // Solve the problem ceres::Solver::Options options; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.parameter_tolerance = opt.parameter_tolerance; options.max_num_iterations = opt.num_iterations; options.max_num_consecutive_invalid_steps = std::max(5, opt.num_iterations/5); // try hard options.minimizer_progress_to_stdout = true; if (opt.single_threaded_cameras) options.num_threads = 1; else options.num_threads = opt.num_threads; // Use a callback function at every iteration, if desired to save the intermediate results BaCallback callback(opt, param_storage); if (opt.save_intermediate_cameras) { options.callbacks.push_back(&callback); options.update_state_every_iteration = true; } // Set solver options according to the recommendations in the Ceres solving FAQs options.linear_solver_type = ceres::SPARSE_SCHUR; if (num_cameras < 100) options.linear_solver_type = ceres::DENSE_SCHUR; if (num_cameras > 3500) { // This is supposed to help with speed in a certain size range options.use_explicit_schur_complement = true; options.linear_solver_type = ceres::ITERATIVE_SCHUR; options.preconditioner_type = ceres::SCHUR_JACOBI; } if (num_cameras > 7000) options.use_explicit_schur_complement = false; // Only matters with ITERATIVE_SCHUR //options.ordering_type = ceres::SCHUR; //options.eta = 1e-3; // FLAGS_eta; //options->max_solver_time_in_seconds = FLAGS_max_solver_time; //if (FLAGS_line_search) { // options->minimizer_type = ceres::LINE_SEARCH; //} vw_out() << "Starting the Ceres optimizer." << "\n"; ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); final_cost = summary.final_cost; vw_out() << summary.FullReport() << "\n"; if (summary.termination_type == ceres::NO_CONVERGENCE) { // Print a clarifying message, so the user does not think that the algorithm failed. 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"; convergence_reached = false; } // Write the condition files after each pass, as we never know which pass will be the last // since we may stop the passes prematurely if no more outliers are present. vw_out() << "Writing final condition log files." << "\n"; std::string residual_prefix = opt.out_prefix + "-final_residuals"; write_residual_logs(residual_prefix, opt, param_storage, cam_residual_counts, pixel_sigmas, num_gcp_or_dem_residuals, num_uncertainty_residuals, num_tri_residuals, num_cam_pos_residuals, reference_vec, cnet, crn, problem); std::string point_kml_path = opt.out_prefix + "-final_points.kml"; param_storage.record_points_to_kml(point_kml_path, opt.datum, kmlPointSkip, "final_points"); // Outlier filtering if (remove_outliers) add_to_outliers(cnet, crn, param_storage, // in-out opt, cam_residual_counts, pixel_sigmas, num_gcp_or_dem_residuals, num_uncertainty_residuals, num_tri_residuals, num_cam_pos_residuals, reference_vec, problem); return 0; } // End function baOnePass // Run several more passes with random initial parameter offsets. This flow is // only kicked in if opt.num_random_passes is positive, which is not the void runRandomPasses(asp::BaOptions & opt, asp::BaParams & param_storage, double & final_cost, asp::CRN const& crn, bool remove_outliers, asp::BaParams const& orig_parameters) { // Record the parameters of the best result so far double best_cost = final_cost; boost::shared_ptr<asp::BaParams> best_params_ptr(new asp::BaParams(param_storage)); // Must recompute these, as what is passed in as orig_parameters is actually // the latest parameters after optimization, not the original ones. // TODO(oalexan1): Think of this more. All this runRundomPasses logic // may need to go away. std::vector<vw::CamPtr> orig_cams; asp::calcOptimizedCameras(opt, orig_parameters, orig_cams); // orig cameras std::vector<std::vector<vw::Vector3>> orig_cam_positions; asp::calcCameraCenters(opt.stereo_session, orig_cams, orig_cam_positions); // Back up the output prefix std::string orig_out_prefix = opt.out_prefix; for (int pass = 0; pass < opt.num_random_passes; pass++) { vw_out() << "\n--> Running bundle adjust pass " << pass << " with random initial parameter offsets.\n"; // Randomly distort the original inputs. param_storage.randomize_cameras(); if (opt.solve_intrinsics) param_storage.randomize_intrinsics(opt.intrinsics_limits); // Write output files to a temporary prefix opt.out_prefix = orig_out_prefix + "_rand"; // Do another pass of bundle adjustment. bool first_pass = true; // this needs more thinking bool convergence_reached = true; double curr_cost = 0.0; // will be set baOnePass(opt, crn, first_pass, remove_outliers, param_storage, orig_parameters, orig_cams, orig_cam_positions, convergence_reached, curr_cost); // Record the parameters of the best result. if (curr_cost < best_cost) { vw_out() << " --> Found a better solution using random passes.\n"; best_cost = curr_cost; best_params_ptr = boost::make_shared<asp::BaParams>(param_storage); // Get a list of all the files that were generated in the random step. std::vector<std::string> rand_files; get_files_with_prefix(opt.out_prefix, rand_files); // Replace the existing output files with them. for (size_t i = 0; i < rand_files.size(); i++) { std::string new_path = rand_files[i]; boost::replace_all(new_path, opt.out_prefix, orig_out_prefix); boost::filesystem::copy_file(rand_files[i], new_path, fs::copy_options::overwrite_existing); } } // Clear out the extra files that were generated std::string cmd("rm -f " + opt.out_prefix + "*"); vw_out() << "Deleting temporary files: " << cmd << "\n"; vw::exec_cmd(cmd.c_str()); } opt.out_prefix = orig_out_prefix; // So the cameras are written to the expected paths. // Copy back to the original parameters param_storage = *best_params_ptr; // Copy back the best cost final_cost = best_cost; } /// Use Ceres to do bundle adjustment. void do_ba_ceres(asp::BaOptions & opt, std::vector<Vector3> const& estimated_camera_gcc) { // Try to set up the control network, ie the list of point coordinates. // - This triangulates from the camera models to determine the initial // world coordinate estimate for each matched IP. opt.cnet = boost::make_shared<ControlNetwork>("BundleAdjust"); int num_gcp = 0; ControlNetwork & cnet = *(opt.cnet.get()); // alias to ASP cnet asp::IsisCnetData isisCnetData; // isis cnet (if loaded) std::vector<Eigen::Affine3d> world_to_cam; // for nvm (if applicable) std::map<std::string, Eigen::Vector2d> optical_offsets; // for nvm if (!opt.apply_initial_transform_only) { // TODO(oalexan1): This whole block must be a function if (opt.isis_cnet != "") { vw::vw_out() << "Reading ISIS control network: " << opt.isis_cnet << "\n"; asp::loadIsisCnet(opt.isis_cnet, opt.image_files, cnet, isisCnetData); // outputs } else if (opt.nvm != "") { // Assume the features are stored shifted relative to optical center bool nvm_no_shift = false; asp::readNvmAsCnet(opt.nvm, opt.image_files, nvm_no_shift, cnet, world_to_cam, optical_offsets);// outputs // For pinhole and csm frame cameras also read the poses from nvm unless told not to if (!opt.no_poses_from_nvm) asp::updateCameraPoses(world_to_cam, opt.camera_models); } else { // Read matches into a control network bool triangulate_control_points = true; bool success = vw::ba::build_control_network(triangulate_control_points, cnet, opt.camera_models, opt.image_files, opt.match_files, opt.min_matches, opt.min_triangulation_angle*(M_PI/180.0), opt.forced_triangulation_distance, opt.max_pairwise_matches, stereo_settings().matches_as_txt, opt.bathy_data); vw_out() << "Number of triangulated control points: " << cnet.size() << "\n"; if (!success) { vw_out() << "Failed to build a control network.\n" << " - Consider removing all .vwip and .match files and \n" << " increasing the number of interest points per tile using\n " << " --ip-per-tile, or decreasing --min-matches.\n" << " - Check if your images are similar enough in illumination,\n" << " and if they have enough overlap.\n" << "Will continue if ground control points are present.\n"; } } } if (!opt.gcp_files.empty()) { num_gcp = vw::ba::add_ground_control_points(cnet, opt.gcp_files, opt.datum); checkGcpRadius(opt.datum, cnet); vw::vw_out() << "Loaded " << num_gcp << " ground control points.\n"; } // If we change the cameras, we must rebuild the control network bool cameras_changed = false; // If camera positions were provided for local inputs, align to them. const bool have_est_camera_positions = (opt.camera_position_file != ""); if ((opt.camera_type == BaCameraType_Pinhole) && have_est_camera_positions) { asp::init_pinhole_model_with_camera_positions(opt.cnet, opt.camera_models, opt.image_files, estimated_camera_gcc); cameras_changed = true; } // If we have GPC's for pinhole cameras, try to do a simple affine // initialization of the camera parameters. // - This function also updates all the ControlNetwork world point // positions. // - We could do this for other camera types too, but it would // require us to be able to adjust our camera model positions. // Otherwise we could init the adjustment values. if (opt.gcp_files.size() > 0) { if ((opt.camera_type == BaCameraType_Pinhole) && !have_est_camera_positions) { if (opt.transform_cameras_using_gcp) { asp::transform_cameras_with_indiv_image_gcp(opt.cnet, opt.camera_models); cameras_changed = true; } else if (opt.transform_cameras_with_shared_gcp) { asp::transform_cameras_with_shared_gcp(opt.cnet, opt.camera_models); cameras_changed = true; } else if (opt.init_camera_using_gcp) { asp::init_camera_using_gcp(opt.cnet, opt.camera_models); cameras_changed = true; } } // Issue a warning if the GCPs are far away from the camera coordinates. // Do it only if the cameras did not change, as otherwise the cnet is outdated. if (!cameras_changed) check_gcp_dists(opt.camera_models, opt.cnet, opt.forced_triangulation_distance); } int num_points = cnet.size(); int num_cameras = opt.image_files.size(); // This is important to prevent a crash later if (num_points == 0 && !opt.apply_initial_transform_only) { vw_out() << "No points to optimize (GCP or otherwise). Cannot continue.\n"; return; } // Calculate the max length of a distortion vector. It will be convenient to // have all distortion vectors have this max length, even if fewer are needed // for some cameras. int max_num_dist_params = asp::calcMaxNumDistParams(opt.camera_models, opt.camera_type, opt.intrinsics_options, opt.intrinsics_limits); // This is needed to ensure distortion coefficients are not so small as to not // get optimized. This modifies the cameras and must happen before // param_storage is populated. if (opt.solve_intrinsics && !opt.apply_initial_transform_only) asp::ensureMinDistortion(opt.camera_models, opt.camera_type, opt.intrinsics_options, opt.fixed_distortion_indices, max_num_dist_params, opt.min_distortion); // Create the storage arrays for the variables we will adjust. asp::BaParams param_storage(num_points, num_cameras, // Distinguish when we solve for intrinsics opt.camera_type != BaCameraType_Other, max_num_dist_params, opt.intrinsics_options); // Sync up any camera intrinsics that should be shared. Do this before // populating the param storage values. cameras_changed = cameras_changed || syncUpInitialSharedParams(opt.camera_type, param_storage, opt.camera_models); // Fill in the camera and intrinsic parameters. std::vector<vw::CamPtr> new_cam_models; bool ans = false; switch (opt.camera_type) { case BaCameraType_Pinhole: ans = init_cams_pinhole(opt, param_storage, opt.initial_transform_file, opt.initial_transform, new_cam_models); break; case BaCameraType_OpticalBar: ans = init_cams_optical_bar(opt, param_storage, opt.initial_transform_file, opt.initial_transform,new_cam_models); break; case BaCameraType_CSM: // CSM while optimizing intrinsics ans = init_cams_csm(opt, param_storage, opt.initial_transform_file, opt.initial_transform, new_cam_models); break; case BaCameraType_Other: ans = init_cams(opt, param_storage, opt.initial_transform_file, opt.initial_transform, new_cam_models); break; default: vw_throw(ArgumentErr() << "Unknown camera type.\n"); }; // Certain input options change the cameras inside init_cams and we // need to update the point coordinates for the new cameras. It is // ok to leave the original vector of camera models unchanged. if (ans) cameras_changed = true; // When the cameras changed, must re-triangulate the points. // This is much cheaper than rebuilding the control network. if (!opt.apply_initial_transform_only && cameras_changed) { vw_out() << "Re-triangulating the control points as the cameras changed.\n"; // Do not triangulate the GCP or the height-from-dem points vw::ba::triangulate_control_network(cnet, new_cam_models, opt.min_triangulation_angle*(M_PI/180.0), opt.forced_triangulation_distance, opt.bathy_data); check_gcp_dists(new_cam_models, opt.cnet, opt.forced_triangulation_distance); if (num_points != cnet.size()) // Must not happen vw_throw(ArgumentErr() << "The number of points changed after re-triangulation.\n"); } // Fill in the point vector with the starting values for (int ipt = 0; ipt < num_points; ipt++) param_storage.set_point(ipt, cnet[ipt].position()); // Flag any outliers read from an isis cnet for (auto const& ipt: isisCnetData.isisOutliers) { if (ipt < 0 || ipt >= num_points) vw_throw(ArgumentErr() << "Invalid point index.\n"); param_storage.set_point_outlier(ipt, true); } // Flag outliers in the cnet for (int ipt = 0; ipt < num_points; ipt++) { if (cnet[ipt].ignore()) param_storage.set_point_outlier(ipt, true); } // The camera positions and orientations before we float them // This includes modifications from any initial transforms that were specified. asp::BaParams orig_parameters(param_storage); // TODO(oalexan1): Likely orig_cams have the info as new_cam_models. But need // to test this. std::vector<vw::CamPtr> orig_cams; asp::calcOptimizedCameras(opt, orig_parameters, orig_cams); // orig cameras std::vector<std::vector<vw::Vector3>> orig_cam_positions; asp::calcCameraCenters(opt.stereo_session, orig_cams, orig_cam_positions); // For nadirpinhole and pinhole cameras, save a report bool has_datum = (opt.datum.name() != asp::UNSPECIFIED_DATUM); if (has_datum && opt.stereo_session.find("pinhole") != std::string::npos) asp::saveCameraReport(opt, param_storage, opt.datum, "initial"); // TODO(oalexan1): Is it possible to avoid using CRNs? asp::CRN crn; crn.from_cnet(cnet); if (opt.num_passes <= 0) vw_throw(ArgumentErr() << "Error: Expecting at least one bundle adjust pass.\n"); bool remove_outliers = (opt.num_passes > 1); double final_cost = 0.0; for (int pass = 0; pass < opt.num_passes; pass++) { if (opt.apply_initial_transform_only) continue; vw_out() << "--> Bundle adjust pass: " << pass << "\n"; bool first_pass = (pass == 0); bool convergence_reached = true; // will change baOnePass(opt, crn, first_pass, remove_outliers, param_storage, orig_parameters, orig_cams, orig_cam_positions, convergence_reached, final_cost); int num_points_remaining = num_points - param_storage.get_num_outliers(); if (num_points_remaining < opt.min_matches && num_gcp == 0) { // Do not throw if there exist gcp, as maybe that's all there is, and there // can be just a few of them. Also, do not throw if we are using an ISIS cnet, // unless we have less than 10 points, as that one can make too few points. std::ostringstream os; os << "Too few points remain after filtering. Number of remaining " << "points is " << num_points_remaining << ", but value of --min-matches is " << opt.min_matches << ".\n"; if (opt.isis_cnet != "" && num_points_remaining > 10) vw_out(vw::WarningMessage) << os.str(); else vw_throw(ArgumentErr() << "Error: " << os.str()); } } // End loop through passes // Running random passes is not the default if (!opt.apply_initial_transform_only && opt.num_random_passes > 0) runRandomPasses(opt, param_storage, final_cost, crn, remove_outliers, orig_parameters); // Always save the updated cameras, even if we are not doing any optimization saveUpdatedCameras(opt, param_storage); // If we are only applying an initial transform, we are done if (opt.apply_initial_transform_only) return; // Write the GCP stats to a file if (num_gcp > 0) param_storage.print_gcp_stats(opt.out_prefix, cnet, opt.datum); // Find the cameras with the latest adjustments. Note that we do not modify // opt.camera_models, but make copies as needed. std::vector<vw::CamPtr> optimized_cams; asp::calcOptimizedCameras(opt, param_storage, optimized_cams); // Find the camera centers. For linescan, this will return all samples. std::vector<std::vector<vw::Vector3>> opt_cam_positions; asp::calcCameraCenters(opt.stereo_session, optimized_cams, opt_cam_positions); // Fetch the latest outliers from param_storage and put them in the 'outliers' set std::set<int> outliers; updateOutliers(cnet, param_storage, outliers); // Write clean matches and many types of stats. These are done together as // they rely on reloading interest point matches, which is expensive. bool save_clean_matches = true; asp::matchFilesProcessing(cnet, asp::BaBaseOptions(opt), // note the slicing optimized_cams, remove_outliers, outliers, opt.mapproj_dem, opt.propagate_errors, opt.horizontal_stddev_vec, save_clean_matches, opt.match_files, stereo_settings().matches_as_txt); // Compute the change in camera centers. For that, we need the original cameras. std::string cam_offsets_file = opt.out_prefix + "-camera_offsets.txt"; if (opt.datum.name() != asp::UNSPECIFIED_DATUM) asp::saveCameraOffsets(opt.datum, opt.image_files, orig_cam_positions, opt_cam_positions, cam_offsets_file); else vw::vw_out() << "Cannot compute camera offsets as the datum is unspecified.\n"; std::string tri_offsets_file = opt.out_prefix + "-triangulation_offsets.txt"; asp::saveTriOffsetsPerCamera(opt.image_files, orig_parameters, param_storage, crn, tri_offsets_file); if (has_datum && (opt.stereo_session == "pinhole") || (opt.stereo_session == "nadirpinhole")) saveCameraReport(opt, param_storage, opt.datum, "final"); // Save the updated cnet to ISIS or nvm format. Note that param_storage has // the latest triangulated points and outlier info, while the cnet has the // initially triangulated points and the interest point matches. if (opt.isis_cnet != "" && opt.output_cnet_type == "isis-cnet") asp::saveUpdatedIsisCnet(opt.out_prefix, cnet, param_storage, isisCnetData); else if (opt.output_cnet_type == "isis-cnet") asp::saveIsisCnet(opt.out_prefix, opt.datum, cnet, param_storage); else if (opt.output_cnet_type == "nvm") { asp::saveNvm(opt, opt.no_poses_from_nvm, cnet, param_storage, world_to_cam, optical_offsets); } // Save the optimized control network in GCP format, after outlier filtering if (opt.save_cnet_as_gcp) { std::string gcp_file = opt.out_prefix + "-cnet.gcp"; asp::saveCnetAsGcp(cnet, param_storage, opt.datum, opt.image_files, gcp_file); } } // end do_ba_ceres int main(int argc, char* argv[]) { asp::BaOptions opt; try { xercesc::XMLPlatformUtils::Initialize(); // Process the bundle_adjust options and sanity checks handleBaArgs(argc, argv, opt); asp::load_cameras(opt.image_files, opt.camera_files, opt.out_prefix, opt, opt.approximate_pinhole_intrinsics, // Outputs opt.stereo_session, opt.single_threaded_cameras, opt.camera_models); // Parse data needed for error propagation if (opt.propagate_errors) asp::setup_error_propagation(opt.stereo_session, opt.horizontal_stddev, opt.camera_models, opt.horizontal_stddev_vec); // output bool need_no_matches = (opt.apply_initial_transform_only || !opt.isis_cnet.empty() || !opt.nvm.empty()); // Read mapprojected images if using --mapprojected-data std::vector<std::string> map_files; std::string mapproj_dem; asp::setupMapprojectedData(opt, need_no_matches, map_files, mapproj_dem); // The stats need to be for the mapprojected image, if provided std::vector<std::string> files_for_stats = opt.image_files; if (!map_files.empty()) files_for_stats = map_files; // The file having the image normalization bounds std::string boundsFile = opt.out_prefix + "-normalization-bounds.txt"; // Compute stats in the batch of images given by opt.job_id, etc. // Skip this in several situations, including when we just want to accumulate // the stats for the images in the list. bool skip_stats = (need_no_matches || opt.skip_matching || opt.clean_match_files_prefix != "" || opt.match_files_prefix != "" || opt.calc_normalization_bounds); bool calcIp = false; if (!skip_stats) computeStatsOrIp(opt, files_for_stats, opt.dem_file_for_overlap, boundsFile, calcIp); if (opt.stop_after_stats) { vw_out() << "Quitting after statistics computation.\n"; xercesc::XMLPlatformUtils::Terminate(); return 0; } // Compute normalization bounds if requested. This is done in a separate // process in parallel_bundle_adjust. if (opt.calc_normalization_bounds) { calcNormalizationBounds(opt.out_prefix, files_for_stats, boundsFile); vw_out() << "Quitting after calculating normalization bounds.\n"; xercesc::XMLPlatformUtils::Terminate(); return 0; } // Compute ip if requested. This is done in multiple processes in // parallel_bundle_adjust. For standalone bundle_adjust, this will // happen when matching occurs, which is then serial. if (opt.calc_ip) { bool calcIp = true; computeStatsOrIp(opt, files_for_stats, opt.dem_file_for_overlap, boundsFile, calcIp); vw_out() << "Quitting after computing interest points.\n"; xercesc::XMLPlatformUtils::Terminate(); return 0; } // Calculate which images overlap based on the DEM if (opt.auto_overlap_params != "") { opt.have_overlap_list = true; asp::buildOverlapList(opt.out_prefix, opt.dem_file_for_overlap, opt.pct_for_overlap, opt.overlap_limit, opt.match_first_to_last, opt.image_files, opt.camera_models, opt.overlap_list); // output } // Load estimated camera positions if they were provided. std::vector<Vector3> estimated_camera_gcc; asp::loadEstimCameraPositions(opt, estimated_camera_gcc); // Find or list matches asp::findPairwiseMatches(opt, map_files, mapproj_dem, estimated_camera_gcc, need_no_matches); if (opt.stop_after_matching) { vw_out() << "Quitting after matches computation.\n"; return 0; } // All the work happens here. It also writes out the results. do_ba_ceres(opt, estimated_camera_gcc); xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; } ================================================ FILE: src/asp/Tools/cam2map4stereo.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ from __future__ import print_function import os, optparse, subprocess, sys, tempfile # The path to the ASP python files. basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_system_utils import get_asp_version from asp_system_utils import mkdir_p import asp_system_utils asp_system_utils.verify_python_version_is_supported() def man(option, opt, value, parser): print (parser.usage, file=sys.stderr) print ('''\ This program takes similar arguments as the ISIS3 cam2map program, but takes two input images. With no arguments, the program determines the minimum overlap of the two images, and the worst common resolution, and then map-projects the two images to this identical area and resolution. Using the --lat and --lon options allows you to select portions of the image, ideal for small initial test runs or cropping out just that portion of the image you need. ''', file=sys.stderr) sys.exit() class Usage(Exception): def __init__(self, msg): self.msg = msg class MapExists(Exception): def __init__(self, msg): self.msg = msg class ImgInfo: def __init__( self ): self.resolution = None self.minlat = None self.maxlat = None self.minlon = None self.maxlon = None def mapfile( cube, prefix, suffix ): '''???''' items = cube.split('.') mapname = '.'.join([items[0], suffix, 'cub']) # If the file exists, or it starts with a dot (say ../file.cub) if( os.path.exists(mapname) or mapname[0] == "."): items.insert(len(items)-1, suffix) mapname = '.'.join(items) # Make somedir/file.cub into myprefix-file.map.cub if prefix != "": mapname = prefix + "-" + os.path.basename(mapname) # Ensure that any output directory exists dirname = os.path.dirname(mapname) mkdir_p(dirname) if( os.path.exists(mapname) ): raise MapExists( mapname ) return mapname def camrange( cube, lonGroupName, options ): '''run camrange on cube''' info = ImgInfo(); try: # Run the camrange function to write to a temp file tmpfile = tempfile.NamedTemporaryFile(dir='.', prefix="camrange", suffix=".txt", mode="w") cmd = 'camrange from= '+ cube +' to= '+ tmpfile.name print('Running ' + cmd) result = subprocess.call(cmd, shell=True) if not result == 0: raise Exception('ProcessError', 'Non zero return code ('+str(result)+')') os.system("cat %s" % tmpfile.name ) # Path to the ISIS getkey tool getkey_path = os.environ['ISISROOT']+'/bin/getkey' # By default we get the longitude from the Universal field, # but if the user specified a longitude region we need to match it. lonDomain = '360' lonDirection = 'PositiveEast' if options.map: # Read the pertinent values from the map file lonDomainIn = subprocess.Popen([getkey_path, 'from= '+options.map, "grpname= Mapping", "keyword= LongitudeDomain" ], stdout=subprocess.PIPE,stderr=subprocess.PIPE, universal_newlines=True).communicate()[0].strip() lonDirectionIn = subprocess.Popen([getkey_path, 'from= '+options.map, "grpname= Mapping", "keyword= LongitudeDirection"], stdout=subprocess.PIPE,stderr=subprocess.PIPE, universal_newlines=True).communicate()[0].strip() if lonDomainIn: lonDomain = lonDomainIn if lonDirectionIn: lonDirection = lonDirectionIn # Determine the correct lon group if (lonDomain == '360') and (lonDirection == 'PositiveWest'): lonGroupName = 'PositiveWest360' if (lonDomain == '180') and (lonDirection == 'PositiveEast'): lonGroupName = 'PositiveEast180' if (lonDomain == '180') and (lonDirection == 'PositiveWest'): lonGroupName = 'PositiveWest180' lonGroupString = 'grpname= ' + lonGroupName fromString = "from= "+ tmpfile.name # extract information info.resolution = subprocess.Popen([getkey_path, fromString, "grpname= PixelResolution", "keyword= Lowest" ], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip() info.minlat = subprocess.Popen([getkey_path, fromString, "grpname= UniversalGroundRange", "keyword= MinimumLatitude" ], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip() info.maxlat = subprocess.Popen([getkey_path, fromString, "grpname= UniversalGroundRange", "keyword= MaximumLatitude" ], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip() info.minlon = subprocess.Popen([getkey_path, fromString, lonGroupString, "keyword= MinimumLongitude"], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip() info.maxlon = subprocess.Popen([getkey_path, fromString, lonGroupString, "keyword= MaximumLongitude"], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].strip() except OSError as e: print ("Execution failed:", e, file=sys.stderr) raise e return info def main(): try: try: 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() parser = optparse.OptionParser(usage=usage) parser.set_defaults(dryrun=False) parser.set_defaults(pixres='MPP') parser.set_defaults(prefix='') parser.set_defaults(suffix='map') parser.add_option("--manual", action="callback", callback=man, help="Read the manual.") parser.add_option("-m", "--map", dest="map", help="The mapfile to use for cam2map.") parser.add_option("-p", "--pixres", dest="pixres", help="The pixel resolution mode to use for cam2map.") parser.add_option("-r", "--resolution", dest="resolution", help="Resolution of final map for cam2map.") parser.add_option("-i", "--interp", dest="interp", help="Pixel interpolation scheme for cam2map.") parser.add_option("-a", "--lat", dest="lat", help="Latitude range for cam2map where LAT is minlat:maxlat.") parser.add_option("-o", "--lon", dest="lon", help="Longitude range for cam2map where LON is minlon:maxlon.") parser.add_option("--prefix", dest="prefix", help="Make all output files use this prefix. Default: no prefix.") parser.add_option("-s", "--suffix", dest="suffix", help="Suffix that gets inserted in the output file names.") parser.add_option("-n", "--dry-run", dest="dryrun", action="store_true", help="Make calculations, but print cam2map command, but don't actually run it.") (options, args) = parser.parse_args() if not args: parser.error("need .cub files") except optparse.OptionError as msg: raise Usage(msg) # Call camrange to get bounds. If the lon bounds come as [0, 360] then try a different group. success = False lonGroupNames = ['UniversalGroundRange', 'PositiveEast180', 'PositiveWest180', 'PositiveWest360'] for lonGroupName in lonGroupNames: image1 = camrange( args[0], lonGroupName, options) image2 = camrange( args[1], lonGroupName, options) lonRange = float(max(image1.maxlon, image2.maxlon)) - \ float(min(image1.minlon, image2.minlon)) if lonRange >= 360.0: print("With lonGroupName = " + lonGroupName + " found a longitude range of " + \ str(lonRange) + ". Will try the next group from: " + (" ".join(lonGroupNames))) else: success = True break if not success: raise Exception('ProcessError', 'The longitude range keeps on coming as encompasing the entire planet. Something is wrong.') mapout = ImgInfo() mapout.minlat = max( image1.minlat, image2.minlat ) mapout.maxlat = min( image1.maxlat, image2.maxlat ) mapout.minlon = max( image1.minlon, image2.minlon ) mapout.maxlon = min( image1.maxlon, image2.maxlon ) mapout.resolution = max( image1.resolution, image2.resolution ) if( options.resolution ): mapout.resolution = options.resolution if( options.lat ): latrange = options.lat.split(':') if latrange[0]: mapout.minlat = latrange[0] if latrange[1]: mapout.maxlat = latrange[1] if( options.lon ): lonrange = options.lon.split(':') if lonrange[0]: mapout.minlon = lonrange[0] if lonrange[1]: mapout.maxlon = lonrange[1] # call cam2map with the arguments cam2map = ['cam2map', 'from=' + args[0], 'to=' + mapfile( args[0], options.prefix, options.suffix )] if( options.map ): cam2map.append( 'map=' + options.map ) if( options.interp): cam2map.append( 'interp=' + options.interp) cam2map.append( 'pixres=' + options.pixres ) cam2map.append( 'resolution=' + mapout.resolution ) cam2map.append( 'defaultrange=MAP' ) cam2map.append( 'minlat=' + mapout.minlat ) cam2map.append( 'maxlat=' + mapout.maxlat ) cam2map.append( 'minlon=' + mapout.minlon ) cam2map.append( 'maxlon=' + mapout.maxlon ) # Run for first image # Need to put these together to keep ISIS from calling the GUI cam2map_cmd = ' '.join(cam2map) print(cam2map_cmd) if( not options.dryrun ): code = subprocess.call(cam2map_cmd, shell=True) if not code == 0: raise Exception('ProcessError', 'Non zero return code ('+str(code)+')') # Run for second image cam2map[1] = 'from=' + args[1] cam2map[2] = 'to='+ mapfile( args[1], options.prefix, options.suffix ) cam2map_cmd = ' '.join(cam2map) print(cam2map_cmd) if( not options.dryrun ): code = subprocess.call(cam2map_cmd, shell=True) if not code == 0: raise Exception('ProcessError', 'Non zero return code ('+str(code)+')') print("Finished") return 0 except Usage as err: print (err.msg, file=sys.stderr) return 2 except MapExists as e: print ('The file '+ e.msg +' already exists, delete first.', file=sys.stderr) return 3 # # To more easily debug this program, comment out this catch block. # except Exception as err: # sys.stderr.write( str(err) + '\n' ) # return 1 if __name__ == "__main__": sys.exit(main()) ================================================ FILE: src/asp/Tools/cam2rpc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Create an RPC model from point pairs obtained by sampling a given lon-lat-height box // or a given DEM. Imitate to some extent the DG WV camera // model. Optionally save a TIF version of the input image restricted to the same box. // The saved image and RPC file can be used for stereo with S2P, ASP, and SETSM // some work needs to be done for these packages to give correct results off-Earth. #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Core/FileUtils.h> #include <asp/Camera/RPCModelGen.h> #include <asp/Core/PointUtils.h> #include <asp/Camera/RpcUtils.h> #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Core/StringUtils.h> #include <vw/Camera/PinholeModel.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/Cartography/CameraBBox.h> #include <vw/FileIO/FileUtils.h> #include <limits> #include <cstring> #include <cmath> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> namespace fs = boost::filesystem; namespace po = boost::program_options; using namespace vw; using namespace vw::camera; using namespace vw::cartography; struct Options : public vw::GdalWriteOptions { double penalty_weight; std::string image_file, camera_file, output_rpc, stereo_session, bundle_adjust_prefix, datum_str, dem_file, target_srs_string; bool no_crop, skip_computing_rpc, save_tif, has_output_nodata; BBox2 lon_lat_range; BBox2i image_crop_box; Vector2 height_range; float input_nodata_value, output_nodata_value; double semi_major, semi_minor; double gsd; int num_samples; Datum datum; Options(): penalty_weight(-1.0), no_crop(false), skip_computing_rpc(false), save_tif(false), has_output_nodata(false), gsd(-1.0), num_samples(-1) {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); float nan = std::numeric_limits<float>::quiet_NaN(); general_options.add_options() ("datum", po::value(&opt.datum_str)->default_value(""), "Use this datum to interpret the heights. 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). The datum " "from --t_srs or --dem-file takes priority, if set.") ("semi-major-axis", po::value(&opt.semi_major)->default_value(0), "Explicitly set the datum semi-major axis in meters. The datum from --t_srs or " "--dem-file takes priority, if set.") ("semi-minor-axis", po::value(&opt.semi_minor)->default_value(0), "Explicitly set the datum semi-minor axis in meters. The datum from --t_srs or " "--dem-file takes priority, if set.") ("t_srs", po::value(&opt.target_srs_string)->default_value(""), "Specify a GDAL projection string instead of the datum (in WKT, GeoJSON, or PROJ " "format). The datum from --dem-file takes priority, if set.") ("lon-lat-range", po::value(&opt.lon_lat_range)->default_value(BBox2(0,0,0,0), "0 0 0 0"), "The longitude-latitude range in which to compute the RPC model. Specify in the " "format: lon_min lat_min lon_max lat_max.") ("height-range", po::value(&opt.height_range)->default_value(Vector2(0,0),"0 0"), "Minimum and maximum heights above the datum in which to compute the RPC model.") ("dem-file", po::value(&opt.dem_file)->default_value(""), "Compute the longitude-latitude-height box in which to fit the RPC camera as the " "bounding box of the portion of this DEM that is seen by the input camera.") ("num-samples", po::value(&opt.num_samples)->default_value(40), "How many samples to use in each direction in the longitude-latitude-height range.") ("penalty-weight", po::value(&opt.penalty_weight)->default_value(0.03), // check here! "A higher penalty weight will result in smaller higher-order RPC coefficients.") ("save-tif-image", po::bool_switch(&opt.save_tif)->default_value(false), "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.") ("input-nodata-value", po::value(&opt.input_nodata_value)->default_value(nan), "Set the image input nodata value.") ("output-nodata-value", po::value(&opt.output_nodata_value)->default_value(nan), "Set the image output nodata value. If not specified, the input nodata value will be used.") ("session-type,t", po::value(&opt.stereo_session), "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.") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Use the camera adjustment obtained by previously running bundle_adjust with this output prefix.") ("image-crop-box", po::value(&opt.image_crop_box)->default_value(BBox2i(0,0,0,0), "0 0 0 0"), "The output image and RPC model should not exceed this box, specified in input image pixels as minx miny widx widy.") ("no-crop", po::bool_switch(&opt.no_crop)->default_value(false), "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.") ("skip-computing-rpc", po::bool_switch(&opt.skip_computing_rpc)->default_value(false), "Skip computing the RPC model.") ("gsd", po::value(&opt.gsd)->default_value(-1), "Expected resolution on the ground, in meters. This is needed for SETSM."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("camera-image", po::value(&opt.image_file)) ("camera-model", po::value(&opt.camera_file)) ("output-rpc" , po::value(&opt.output_rpc)); po::positional_options_description positional_desc; positional_desc.add("camera-image",1); positional_desc.add("camera-model",1); positional_desc.add("output-rpc", 1); std::string usage("[options] <camera-image> <camera-model> <output-rpc>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.image_file.empty()) vw_throw(ArgumentErr() << "Missing input image.\n" << usage << general_options); if (boost::iends_with(opt.image_file, ".cub") && opt.stereo_session == "") opt.stereo_session = "isis"; // Need this to be able to load adjusted camera models. That will happen // in the stereo session. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; // This is a bug fix. The user by mistake passed in an empty projection string. if (!vm["t_srs"].defaulted() && opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "The value of --t_srs is empty. Then it must not be set at all.\n"); // Swap min and max if need be if (opt.lon_lat_range.min().x() > opt.lon_lat_range.max().x()) std::swap(opt.lon_lat_range.min().x(), opt.lon_lat_range.max().x()); if (opt.lon_lat_range.min().y() > opt.lon_lat_range.max().y()) std::swap(opt.lon_lat_range.min().y(), opt.lon_lat_range.max().y()); // If we cannot read the data from a DEM, must specify a lot of things. if (opt.dem_file.empty()) { // See if the user specified the datum outside of the srs string bool have_user_datum = asp::read_user_datum(opt.semi_major, opt.semi_minor, opt.datum_str, opt.datum); // Set the srs string into georef. if (!opt.target_srs_string.empty()) { vw::cartography::GeoReference georef; vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, opt.datum, georef); opt.datum = georef.datum(); } if (opt.datum_str.empty() && !have_user_datum && opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "Missing input datum. Must set one of: " << "--datum, --t_srs, --semi-major-axis, and --semi-minor-axis, " << "--t_srs, or --dem-file.\n" << usage << general_options); if (opt.height_range[0] >= opt.height_range[1]) vw_throw(ArgumentErr() << "Must specify a valid range of heights.\n" << usage << general_options); if (opt.lon_lat_range.empty()) vw_throw(ArgumentErr() << "Must specify a valid range for longitude and latitude.\n" << usage << general_options); vw_out() << "Height range is " << opt.height_range[0] << ' ' << opt.height_range[1] << " meters.\n"; vw_out() << "Lon-lat range is " << opt.lon_lat_range.min() << ' ' << opt.lon_lat_range.max() << " degrees.\n"; } // If the DEM file is provided, the lon-lat and height ranges must not be set if (!opt.dem_file.empty()) { if (opt.lon_lat_range != BBox2(0,0,0,0)) vw_throw(ArgumentErr() << "Cannot specify both a DEM file and a lon-lat range.\n"); if (opt.height_range != Vector2(0,0)) vw_throw(ArgumentErr() << "Cannot specify both a DEM file and a height range.\n"); } // If the dem file is set, cannot set --datum, --t_srs, --semi-major-axis, or // --semi-minor-axis if (!opt.dem_file.empty()) { if (!opt.datum_str.empty() || !opt.target_srs_string.empty() || opt.semi_major != 0 || opt.semi_minor != 0) vw_throw(ArgumentErr() << "Cannot specify --datum, --t_srs, --semi-major-axis, or " << "--semi-minor-axis together with --dem-file.\n"); } // Convert from width and height to min and max if (!opt.image_crop_box.empty()) { BBox2 b = opt.image_crop_box; // make a copy opt.image_crop_box = BBox2i(b.min().x(), b.min().y(), b.max().x(), b.max().y()); } // There must be at least 2 samples in each dimension if (opt.num_samples < 2) vw_throw(ArgumentErr() << "Must have at least 2 samples in each dimension.\n"); } // Add pixel and llh samples along the perimeter and diagonals of image_box. // using the DEM. void sample_dem_perim_diag(BBox2 const& image_box, vw::CamPtr cam, ImageViewRef<PixelMask<float>> dem, GeoReference const& dem_geo, // Outputs (append to these) std::vector<Vector3> & all_llh, std::vector<Vector2> & all_pixels) { // Reduce the max by 1, as sample_float_box() assumes the max is inclusive BBox2 b = image_box; b.max() -= Vector2(1, 1); // Calc samples on box perimeter and diagonals int num_steps = 100; std::vector<vw::Vector2> points; vw::cartography::sample_float_box(b, points, num_steps); double height_guess = vw::cartography::demHeightGuess(dem); vw::Vector3 xyz_guess(0, 0, 0); // will be updated for (std::size_t j = 0; j < points.size(); j++) { vw::Vector2 pix = points[j]; // Intersect the ray going from the given camera pixel with a DEM // Use xyz_guess as initial guess and overwrite it with the new value bool treat_nodata_as_zero = false; bool has_intersection = false; double max_abs_tol = 1e-14; double max_rel_tol = max_abs_tol; double dem_height_error_tol = 1e-3; // 1 mm int num_max_iter = 100; vw::Vector3 xyz; try { // Intersect with the DEM xyz = vw::cartography:: camera_pixel_to_dem_xyz(cam->camera_center(pix), cam->pixel_to_vector(pix), dem, dem_geo, treat_nodata_as_zero, has_intersection, dem_height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess, height_guess); } catch (...) { continue; } if (!has_intersection || xyz == vw::Vector3()) continue; // Update the guess for nex time, now that we have a valid intersection point xyz_guess = xyz; vw::Vector3 llh = dem_geo.datum().cartesian_to_geodetic(xyz); all_llh.push_back(llh); all_pixels.push_back(pix); } // end loop through points return; } // Compute the lon-lat box and height range from the DEM void calc_llh_bbox_from_dem(Options & opt, vw::CamPtr cam, vw::BBox2 const& image_box, ImageViewRef<PixelMask<float>> input_img) { vw::vw_out() << "Estimating the lon-lat-height range from DEM: " << opt.dem_file << "\n"; std::vector<Vector3> all_llh; std::vector<Vector2> all_pixels; float dem_nodata_val = -std::numeric_limits<float>::max(); vw::read_nodata_val(opt.dem_file, dem_nodata_val); ImageViewRef<PixelMask<float>> dem = create_mask(DiskImageView<float>(opt.dem_file), dem_nodata_val); GeoReference dem_geo; if (!read_georeference(dem_geo, opt.dem_file)) vw_throw(ArgumentErr() << "Missing georef in DEM: " << opt.dem_file << ".\n"); // Get the datum from the DEM opt.datum = dem_geo.datum(); // If the DEM is too big, we need to skip points. About // 40,000 points should be good enough to determine 78 RPC // coefficients. double delta_col = std::max(1.0, dem.cols()/double(opt.num_samples)); double delta_row = std::max(1.0, dem.rows()/double(opt.num_samples)); vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = delta_col / dem.cols(); tpc.report_progress(0); for (double dcol = 0; dcol < dem.cols(); dcol += delta_col) { for (double drow = 0; drow < dem.rows(); drow += delta_row) { int col = dcol, row = drow; // cast to int if (!is_valid(dem(col, row))) continue; Vector2 pix(col, row); Vector2 lonlat = dem_geo.pixel_to_lonlat(pix); // Lon lat height Vector3 llh; llh[0] = lonlat[0]; llh[1] = lonlat[1]; llh[2] = dem(col, row).child(); Vector3 xyz = opt.datum.geodetic_to_cartesian(llh); // Go back to llh. This is a bugfix for the 360 deg offset problem. llh = opt.datum.cartesian_to_geodetic(xyz); Vector2 cam_pix; try { // The point_to_pixel function can be capricious cam_pix = cam->point_to_pixel(xyz); } catch(...) { continue; } if (image_box.contains(cam_pix) && is_valid(input_img(cam_pix[0], cam_pix[1]))) { all_llh.push_back(llh); all_pixels.push_back(cam_pix); } } tpc.report_incremental_progress(inc_amount); } // end loop through DEM pixels tpc.report_finished(); // Add pixel and llh samples along the perimeter and diagonals of image_box. // using the DEM. sample_dem_perim_diag(image_box, cam, dem, dem_geo, all_llh, all_pixels); // Based on these, find th lon-lat and height ranges opt.lon_lat_range = BBox2(); double big = std::numeric_limits<double>::max(); opt.height_range = Vector2(big, -big); for (std::size_t i = 0; i < all_llh.size(); i++) { Vector3 llh = all_llh[i]; opt.lon_lat_range.grow(Vector2(llh[0], llh[1])); opt.height_range[0] = std::min(opt.height_range[0], llh[2]); opt.height_range[1] = std::max(opt.height_range[1], llh[2]); } vw::vw_out() << "Computed lon-lat range: " << opt.lon_lat_range << "\n"; vw::vw_out() << "Computed height range: " << opt.height_range << "\n"; return; } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); bool allow_map_promote = false; asp::SessionPtr session(asp::StereoSessionFactory::create (opt.stereo_session, // may change opt, opt.image_file, opt.image_file, opt.camera_file, opt.camera_file, opt.output_rpc, opt.dem_file, allow_map_promote)); // If the session was passed in or guessed isis or rpc, adjust for the fact // that the isis .cub file also has camera info. if (opt.output_rpc.empty() && ((session->name() == "isis" || session->name() == "isismapisis") || session->name() == "rpc")) { // The user did not provide an output file. Then the camera // information is contained within the image file and what is in // the camera file is actually the output file. opt.output_rpc = opt.camera_file; opt.camera_file = opt.image_file; } if (opt.camera_file.empty()) vw_throw(ArgumentErr() << "Missing input camera.\n"); if (opt.output_rpc.empty()) vw_throw(ArgumentErr() << "Missing output RPC file.\n"); // Create the output directory vw::create_out_dir(opt.output_rpc); vw::CamPtr cam = session->camera_model(opt.image_file, opt.camera_file); // Get the input nodata value from the image file, unless the // user overwrites it. float val = std::numeric_limits<float>::quiet_NaN(); bool has_input_nodata = vw::read_nodata_val(opt.image_file, val); if (has_input_nodata && std::isnan(opt.input_nodata_value)) opt.input_nodata_value = val; if (!std::isnan(opt.input_nodata_value)) vw_out() << "Using input nodata value: " << opt.input_nodata_value << "\n"; else has_input_nodata = false; // If the output nodata value was not specified, use the input one if (std::isnan(opt.output_nodata_value)) opt.output_nodata_value = opt.input_nodata_value; if (!std::isnan(opt.output_nodata_value)) { opt.has_output_nodata = true; vw_out() << "Using output nodata value: " << opt.output_nodata_value << "\n"; }else{ opt.has_output_nodata = false; } // Masked input image DiskImageView<float> disk_view(opt.image_file); ImageViewRef<PixelMask<float>> input_img = create_mask(disk_view, opt.input_nodata_value); // The bounding box BBox2 image_box = bounding_box(disk_view); if (!opt.image_crop_box.empty()) image_box.crop(opt.image_crop_box); // Calc the lon-lat-height ranges based on the DEM rather than the user // input. TODO(oalexan1): Consider explicitly setting opt.datum in main(), // rather than inside this function. if (!opt.dem_file.empty()) calc_llh_bbox_from_dem(opt, cam, image_box, input_img); // Put this here, after peeking inside the DEM with calc_llh_bbox_from_dem() vw_out() << "Datum: " << opt.datum << "\n"; // Generate point pairs std::vector<Vector3> all_llh; std::vector<Vector2> all_pixels; asp::sample_llh_pix_bbox(opt.lon_lat_range, opt.height_range, opt.num_samples, opt.datum, cam, image_box, all_llh, all_pixels); // outputs // Add points for pixels along the perimeter and diagonals of image_box. Constrain // by the ll box. asp::add_perimeter_diag_points(image_box, opt.datum, cam, opt.lon_lat_range, opt.height_range, all_llh, all_pixels); // outputs // The pixel box BBox2 pixel_box; for (std::size_t i = 0; i < all_pixels.size(); i++) pixel_box.grow(all_pixels[i]); // Below we assume pixel_box to be max-exclusive, so expand it by 1 pixel_box.max() += Vector2(1, 1); // Find the range of lon-lat-heights BBox3 llh_box; for (std::size_t i = 0; i < all_llh.size(); i++) llh_box.grow(all_llh[i]); // If cropping, adjust the pixels BBox2 crop_box; if (!opt.no_crop) { // Cast to int so that we can crop properly pixel_box.min() = floor(pixel_box.min()); pixel_box.max() = ceil(pixel_box.max()); pixel_box.crop(image_box); crop_box = pixel_box; // save it before we modify pixel_box // Shift all pixels by the crop corner, including the pixel box itself for (std::size_t i = 0; i < all_pixels.size(); i++) all_pixels[i] -= pixel_box.min(); // Need to first save the corner before subtracting it, otherwise get wrong result Vector2 shift = pixel_box.min(); pixel_box -= shift; } if (opt.save_tif) { ImageViewRef<PixelMask<float>> output_img = input_img; if (!opt.no_crop) output_img = crop(input_img, crop_box); std::string out_img_file = fs::path(opt.output_rpc).replace_extension("tif").string(); vw_out() << "Writing: " << out_img_file << "\n"; GeoReference img_geo; bool has_img_geo = false; vw::TerminalProgressCallback tpc("asp", "\t-->: "); vw::cartography::block_write_gdal_image(out_img_file, apply_mask(output_img, opt.output_nodata_value), has_img_geo, img_geo, opt.has_output_nodata, opt.output_nodata_value, opt, tpc); } if (opt.skip_computing_rpc) return 0; Vector3 llh_scale = (llh_box.max() - llh_box.min())/2.0; // half range Vector3 llh_offset = (llh_box.max() + llh_box.min())/2.0; // center point Vector2 pixel_scale = (pixel_box.max() - pixel_box.min())/2.0; // half range Vector2 pixel_offset = (pixel_box.max() + pixel_box.min())/2.0; // center point vw_out() << "Lon-lat-height box for the RPC approx: " << llh_box << "\n"; vw_out() << "Camera pixel box for the RPC approx (after crop): " << pixel_box << "\n"; // Form the vectors of normalized llh and pixel values Vector<double> normalized_llh; Vector<double> normalized_pixels; asp::normalizeLlhPix(all_llh, all_pixels, llh_offset, llh_scale, pixel_offset, pixel_scale, normalized_llh, normalized_pixels); // outputs // Find the RPC coefficients asp::RPCModel::CoeffVec line_num, line_den, samp_num, samp_den; vw_out() << "Generating the RPC approximation using " << all_llh.size() << " point pairs.\n"; bool refine_only = false; asp::gen_rpc(// Inputs opt.penalty_weight, normalized_llh, normalized_pixels, refine_only, // Outputs line_num, line_den, samp_num, samp_den); // Form and save the model vw::vw_out() << "Writing: " << opt.output_rpc << "\n"; vw::cartography::Datum datum(opt.datum); asp::RPCModel rpc(datum, line_num, line_den, samp_num, samp_den, pixel_offset, pixel_scale, llh_offset, llh_scale); rpc.saveXML(opt.output_rpc); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/cam_gen.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Create a pinhole, optical bar, or csm camera model based on intrinsics, image // corner coordinates, and other attributes. See the doc for more info. #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Camera/CameraResectioning.h> #include <asp/Camera/CsmModel.h> #include <asp/Camera/LinescanUtils.h> #include <asp/Camera/CsmUtils.h> #include <asp/Camera/CsmModelFit.h> #include <asp/Camera/RPCModel.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Core/FileUtils.h> #include <asp/Core/PointUtils.h> #include <asp/Core/EigenUtils.h> #include <asp/Core/ReportUtils.h> #include <asp/Core/CameraTransforms.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisCameraModel.h> #endif // ASP_HAVE_PKG_ISIS #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Core/StringUtils.h> #include <vw/Camera/PinholeModel.h> #include <vw/Camera/CameraUtilities.h> #include <vw/Camera/LensDistortion.h> #include <vw/Cartography/CameraDatumFit.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/Cartography/CameraBBox.h> #include <vw/Math/LevenbergMarquardt.h> #include <vw/Math/Geometry.h> #include <vw/Stereo/StereoModel.h> #include <vw/Camera/OpticalBarModel.h> #include <vw/Cartography/DatumUtils.h> #include <vw/FileIO/FileTypes.h> #include <vw/FileIO/FileUtils.h> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> #include <boost/algorithm/string/predicate.hpp> #include <nlohmann/json.hpp> #include <cstring> #include <limits> #include <set> namespace fs = boost::filesystem; namespace po = boost::program_options; using json = nlohmann::json; using namespace vw; using namespace vw::camera; using namespace vw::cartography; /// Find the best camera that fits the current GCP void fit_camera_to_xyz_ht(Vector3 const& known_cam_ctr, // may not be known Vector3 const& estim_cam_ctr, // may not be known std::string const& camera_type, bool refine_camera, std::vector<Vector3> const& xyz_vec, std::vector<double> const& pixel_values, double cam_height, double cam_weight, double cam_ctr_weight, vw::cartography::Datum const& datum, bool verbose, boost::shared_ptr<CameraModel> & out_cam) { // Create fake points in space at given distance from this camera's // center and corresponding actual points on the ground. Use 500 // km, just some height not too far from actual satellite height. double ht = 500000.0; int num_pts = pixel_values.size()/2; vw::Matrix<double> in, out; std::vector<vw::Vector2> pixel_vec; in.set_size(3, num_pts); out.set_size(3, num_pts); for (int col = 0; col < in.cols(); col++) { if (estim_cam_ctr != Vector3(0, 0, 0)) { // We know the camera center. Use that. // TODO(oalexan1): Problem with RPC! ht = norm_2(xyz_vec[col] - estim_cam_ctr); } Vector2 pix = Vector2(pixel_values[2*col], pixel_values[2*col+1]); Vector3 a = out_cam->camera_center(Vector2(0, 0)) + ht * out_cam->pixel_to_vector(pix); pixel_vec.push_back(pix); for (int row = 0; row < in.rows(); row++) { in(row, col) = a[row]; out(row, col) = xyz_vec[col][row]; } } // Apply a transform to the camera so that the fake points are on top of the real points Matrix<double, 3, 3> rotation; Vector3 translation; double scale; find_3D_transform(in, out, rotation, translation, scale); if (camera_type == "opticalbar") { ((vw::camera::OpticalBarModel*)out_cam.get())->apply_transform(rotation, translation, scale); if (known_cam_ctr != Vector3(0, 0, 0)) ((vw::camera::OpticalBarModel*)out_cam.get())->set_camera_center(known_cam_ctr); } else if (camera_type == "pinhole") { // The logic based on fake points can give junk results. Use instead the // state-of-the-art OpenCV solver. TODO(oalexan1): Need to consider using // this solution also for OpticalBar. try { asp::findCameraPose(xyz_vec, pixel_vec, *(PinholeModel*)out_cam.get()); } catch(std::exception const& e) { vw_out() << "Failed to find the camera pose using OpenCV. Falling back " << "to ASP's internal approach. This is not as robust. " << "Check your inputs and validate the produced camera.\n"; // Fall back to previous logic ((PinholeModel*)out_cam.get())->apply_transform(rotation, translation, scale); } // Overwrite the solved camera center with what is surely known if (known_cam_ctr != Vector3(0, 0, 0)) ((PinholeModel*)out_cam.get())->set_camera_center(known_cam_ctr); } // Print out some errors if (verbose) { std::vector<double> errors; for (size_t corner_it = 0; corner_it < num_pts; corner_it++) { vw::Vector2 pix1 = out_cam.get()->point_to_pixel(xyz_vec[corner_it]); vw::Vector2 pix2 = Vector2(pixel_values[2*corner_it], pixel_values[2*corner_it+1]); errors.push_back(norm_2(pix1 - pix2)); } vw::vw_out() << "Median pixel projection error in the coarse camera: " << vw::math::destructive_median(errors) << "\n"; } Vector3 xyz0 = out_cam.get()->camera_center(vw::Vector2()); // Solve a little optimization problem to make the points on the ground project // as much as possible exactly into the image corners. if (refine_camera) { if (camera_type == "opticalbar") fitOpticalBar(xyz_vec, cam_height, cam_weight, cam_ctr_weight, datum, pixel_values, *((vw::camera::OpticalBarModel*)out_cam.get())); else if (camera_type == "pinhole") fitPinhole(xyz_vec, cam_height, cam_weight, cam_ctr_weight, datum, pixel_values, *((PinholeModel*)out_cam.get())); else vw_throw(ArgumentErr() << "Unknown camera type: " << camera_type << ".\n"); if (verbose) { std::vector<double> errors; for (size_t corner_it = 0; corner_it < num_pts; corner_it++) { vw::Vector2 pix1 = out_cam.get()->point_to_pixel(xyz_vec[corner_it]); vw::Vector2 pix2 = Vector2(pixel_values[2*corner_it], pixel_values[2*corner_it+1]); errors.push_back(norm_2(pix1 - pix2)); } vw::vw_out() << "Median pixel projection error in the refined camera: " << vw::math::destructive_median(errors) << "\n"; } } // End camera refinement case } // Parse numbers or strings from a list where they are separated by commas or spaces. template<class T> void parse_values(std::string list, std::vector<T> & values) { values.clear(); // Replace commas with spaces std::string oldStr = ",", newStr = " "; size_t pos = 0; while ((pos = list.find(oldStr, pos)) != std::string::npos) { list.replace(pos, oldStr.length(), newStr); pos += newStr.length(); } // Read the values one by one std::istringstream is(list); T val; while (is >> val) values.push_back(val); } // Parse the frame index to extract lon_lat_values_str. Look for a line // having this image, and search for "POLYGON" followed by spaces and "((". void parseFrameIndex(std::string const& frame_index, std::string const& image_file, bool parse_eci, bool parse_ecef, double cam_weight, std::string & lon_lat_values_str, std::string & parsed_camera_center_str, std::string & parsed_cam_quat_str) { boost::filesystem::path p(image_file); std::string image_base = p.stem().string(); // strip the directory name and suffix std::ifstream file(frame_index.c_str()); std::string line; std::string beg1 = "POLYGON"; std::string beg2 = "(("; std::string end = "))"; while (getline(file, line, '\n')) { if (line.find(image_base) != std::string::npos) { // Find POLYGON first. int beg_pos = line.find(beg1); if (beg_pos == std::string::npos) vw_throw(ArgumentErr() << "Cannot find " << beg1 << " in line: " << line << ".\n"); beg_pos += beg1.size(); // Move forward skipping any spaces until finding "((" beg_pos = line.find(beg2, beg_pos); if (beg_pos == std::string::npos) vw_throw(ArgumentErr() << "Cannot find " << beg2 << " in line: " << line << ".\n"); beg_pos += beg2.size(); // Find "))" int end_pos = line.find(end, beg_pos); if (end_pos == std::string::npos) vw_throw(ArgumentErr() << "Cannot find " << end << " in line: " << line << ".\n"); lon_lat_values_str = line.substr(beg_pos, end_pos - beg_pos); vw_out() << "Parsed the lon-lat corner values: " << lon_lat_values_str << "\n"; if (parse_eci && parse_ecef) vw_throw(ArgumentErr() << "Cannot parse both ECI end ECEF at the same time.\n"); // Also parse the camera height constraint, unless manually specified if (cam_weight > 0 || parse_eci || parse_ecef) { std::vector<std::string> vals; parse_values<std::string>(line, vals); if (vals.size() < 12) vw_throw(ArgumentErr() << "Could not parse 12 values from: " << line << ".\n"); // Extract the ECI or ECEF coordinates of camera // center. Keep them as string until we can convert to // height above datum. if (parse_eci) { std::string x = vals[5]; std::string y = vals[6]; std::string z = vals[7]; parsed_camera_center_str = x + " " + y + " " + z; vw_out() << "Parsed the ECI camera center in km: " << parsed_camera_center_str <<".\n"; std::string q0 = vals[8]; std::string q1 = vals[9]; std::string q2 = vals[10]; std::string q3 = vals[11]; parsed_cam_quat_str = q0 + " " + q1 + " " + q2 + " " + q3; vw_out() << "Parsed the ECI quaternion: " << parsed_cam_quat_str <<".\n"; } if (parse_ecef) { if (vals.size() < 19) vw_throw(ArgumentErr() << "Could not parse 19 values from: " << line << ".\n"); std::string x = vals[12]; std::string y = vals[13]; std::string z = vals[14]; parsed_camera_center_str = x + " " + y + " " + z; vw_out() << "Parsed the ECEF camera center in km: " << parsed_camera_center_str <<".\n"; std::string q0 = vals[15]; std::string q1 = vals[16]; std::string q2 = vals[17]; std::string q3 = vals[18]; parsed_cam_quat_str = q0 + " " + q1 + " " + q2 + " " + q3; vw_out() << "Parsed the ECEF quaternion: " << parsed_cam_quat_str <<".\n"; } } // End parsing camera height constraint break; } // end of if we found the image name in the line } // end of loop through lines in frame index file if (lon_lat_values_str == "") vw_throw(ArgumentErr() << "Could not parse the entry for " << image_base << " in file: " << frame_index << ".\n"); } struct Options : public vw::GdalWriteOptions { std::string image_file, out_camera, lon_lat_values_str, pixel_values_str, datum_str, reference_dem, frame_index, gcp_file, camera_type, sample_file, input_camera, stereo_session, bundle_adjust_prefix, parsed_camera_center_str, parsed_cam_quat_str, distortion_str, distortion_type, refine_intrinsics, extrinsics_file; double focal_length, pixel_pitch, gcp_std, height_above_datum, cam_height, cam_weight, cam_ctr_weight; Vector2 optical_center; vw::Vector3 camera_center, camera_center_llh; std::vector<double> lon_lat_values, pixel_values, distortion; bool refine_camera, parse_eci, parse_ecef, planet_pinhole; int num_pixel_samples; bool exact_tsai_to_csm_conv; vw::cartography::Datum datum; 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), planet_pinhole(false), parse_eci(false), parse_ecef(false), num_pixel_samples(0), exact_tsai_to_csm_conv(false) {} }; void handle_arguments(int argc, char *argv[], Options& opt) { double nan = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options(""); general_options.add_options() ("output-camera-file,o", po::value(&opt.out_camera), "Specify the output camera file.") ("camera-type", po::value(&opt.camera_type)->default_value("pinhole"), "Specify the camera type. Options are: pinhole (default), opticalbar, linescan, and rpc.") ("lon-lat-values", po::value(&opt.lon_lat_values_str)->default_value(""), "A (quoted) string listing numbers, separated by commas or spaces, " "having the longitude and latitude (alternating and in this " "order) of each image corner or some other list of pixels given " "by ``--pixel-values``. If the corners are used, they are traversed " "in the order (0, 0) (w, 0) (w, h), (0, h) where w and h are the " "image width and height.") ("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.") ("reference-dem", po::value(&opt.reference_dem)->default_value(""), "Use this DEM to infer the heights above datum of the image corners.") ("datum", po::value(&opt.datum_str)->default_value(""), "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).") ("height-above-datum", po::value(&opt.height_above_datum)->default_value(0), "Assume this height above datum in meters for the image corners unless read from the DEM.") ("sample-file", po::value(&opt.sample_file)->default_value(""), "Read the camera intrinsics from this file. Required for opticalbar bar cameras.") ("focal-length", po::value(&opt.focal_length)->default_value(0), "The camera focal length.") ("optical-center", po::value(&opt.optical_center)->default_value(Vector2(nan, nan),"NaN NaN"), "The camera optical center (horizontal and vertical components). If not specified for " "pinhole cameras, it will be set to image center (half of image dimensions) times the " "pixel pitch. The optical bar camera always uses the image center.") ("pixel-pitch", po::value(&opt.pixel_pitch)->default_value(0), "The camera pixel pitch, that is, the width of a pixel. It can be in millimeters, " "and then the focal length and optical center must be in millimeters as well. " "If set to 1, the focal length and optical center are in units of pixel.") ("distortion", po::value(&opt.distortion_str)->default_value(""), "Distortion model parameters. It is best to leave this blank and have the program " "determine them. By default, the OpenCV radial-tangential lens distortion " "model is used. Then, can specify 5 numbers, in quotes, in the order " "k1, k2, p1, p2, k3. Also supported are the radial distortion model with 3 " "parameters, k1, k2, and k3, and the transverse model, which needs 20 values. The " "latter are the coefficients of a pair of polynomials of degree 3 in x and y. Only " "applicable when creating CSM cameras. The default is zero distortion. See also " "--distortion-type.") ("distortion-type", po::value(&opt.distortion_type)->default_value("radtan"), "Set the distortion type. Options: radtan, radial, and transverse. Only " "applicable when creating CSM Frame cameras.") ("camera-center", po::value(&opt.camera_center)->default_value(Vector3(nan, nan, nan),"NaN NaN NaN"), "The camera center in ECEF coordinates. If not set, the program will solve for it." "If setting --refine-camera, consider using --cam-ctr-weight.") ("camera-center-llh", po::value(&opt.camera_center_llh)->default_value(Vector3(nan, nan, nan),"NaN NaN NaN"), "The camera center as lon-lat-height relative to the datum. See also --camera-center.") ("refine-camera", po::bool_switch(&opt.refine_camera)->default_value(false)->implicit_value(true), "After a rough initial camera is obtained, refine its pose using least squares. " "Consider not refining the camera here, but having bundle_adjust take in the camera " "as-is, together with GCP.") ("refine-intrinsics", po::value(&opt.refine_intrinsics)->default_value(""), "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.") ("num-pixel-samples", po::value(&opt.num_pixel_samples)->default_value(10000), "Number of uniformly distributed pixel samples to use with option --refine-intrinsics.") ("frame-index", po::value(&opt.frame_index)->default_value(""), "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.") ("gcp-file", po::value(&opt.gcp_file)->default_value(""), "If provided, save the image corner coordinates and heights in the GCP format to this file.") ("gcp-std", po::value(&opt.gcp_std)->default_value(1), "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.") ("cam-height", po::value(&opt.cam_height)->default_value(0), "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.") ("cam-weight", po::value(&opt.cam_weight)->default_value(0), "If positive, try to enforce the option --cam-height with this weight (bigger weight means try harder to enforce).") ("cam-ctr-weight", po::value(&opt.cam_ctr_weight)->default_value(0), "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).") ("parse-eci", po::bool_switch(&opt.parse_eci)->default_value(false)->implicit_value(true), "Create cameras based on ECI positions and orientations (not working).") ("parse-ecef", po::bool_switch(&opt.parse_ecef)->default_value(false)->implicit_value(true), "Create cameras based on ECEF position (but not orientation).") ("input-camera", po::value(&opt.input_camera)->default_value(""), "Create a camera approximating this camera. See the examples in the documentation " "for various applications.") ("session-type,t", po::value(&opt.stereo_session)->default_value(""), "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.") ("extrinsics", po::value(&opt.extrinsics_file)->default_value(""), "Read a file having on each line an image name and extrinsic parameters as " "longitude, latitude, height above datum, roll, pitch, and yaw. Write one .tsai " "camera file per image.") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Use the camera adjustment obtained by previously running bundle_adjust " "when providing an input camera.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("image-file", po::value(&opt.image_file)); po::positional_options_description positional_desc; positional_desc.add("image-file",1); std::string usage("[options] <image-file> -o <camera-file>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // If extrinsics file is set, must have datum and sample file if (opt.extrinsics_file != "") { if (opt.datum_str == "") vw_throw(ArgumentErr() << "Must provide a datum when reading extrinsics.\n"); if (opt.sample_file == "") vw_throw(ArgumentErr() << "Must provide a sample file when reading extrinsics.\n"); // The rest of the options do not apply return; } if (opt.image_file.empty()) vw_throw(ArgumentErr() << "Missing the input image.\n"); if (opt.out_camera.empty()) vw_throw(ArgumentErr() << "Missing the output camera file name.\n"); boost::to_lower(opt.camera_type); // Need this to be able to load adjusted camera models. That will happen // in the stereo session. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; if (opt.camera_type != "pinhole" && opt.camera_type != "opticalbar" && opt.camera_type != "linescan" && opt.camera_type != "rpc") vw_throw(ArgumentErr() << "Only pinhole, opticalbar, linescan, and rpc " << "cameras are supported.\n"); if ((opt.camera_type == "opticalbar") && (opt.sample_file == "")) vw_throw(ArgumentErr() << "opticalbar type must use a sample camera file.\n"); std::string out_ext = vw::get_extension(opt.out_camera); if (out_ext != ".tsai" && out_ext != ".json" && opt.camera_type != "rpc") vw_throw(ArgumentErr() << "For the given inputs, the output camera file must end " << "with .tsai or .json.\n"); if (opt.camera_type == "linescan" && out_ext != ".json") vw_throw(ArgumentErr() << "An output linescan camera must end with .json.\n"); if (opt.camera_type == "opticalbar" && out_ext != ".tsai") vw_throw(ArgumentErr() << "An output optical bar camera must be in .tsai format.\n"); if (opt.camera_type == "rpc" && out_ext != ".xml") vw_throw(ArgumentErr() << "An output RPC camera must be in .xml format.\n"); // Create the output directory vw::create_out_dir(opt.out_camera); // This will be empty if an input camera is not specified std::string input_ext = vw::get_extension(opt.input_camera); // The rest of the logic does not apply to linescan and rpc cameras if ((opt.camera_type == "linescan" && input_ext != ".tsai") || opt.camera_type == "rpc") return; // Planet's custom format opt.planet_pinhole = boost::algorithm::ends_with(opt.input_camera, "_pinhole.json"); if (opt.planet_pinhole && !opt.datum_str.empty()) { // Can only use WGS84 for Planet cameras vw::cartography::Datum datum1(opt.datum_str); vw::cartography::Datum datum2("WG84"); bool warn_only = false; vw::checkDatumConsistency(datum1, datum2, warn_only); } if (opt.planet_pinhole && opt.datum_str.empty()) { opt.datum_str = "WGS84"; vw::vw_out() << "Setting the datum to: " << opt.datum_str << "\n"; } if (opt.planet_pinhole && (opt.refine_camera || opt.refine_intrinsics != "")) vw_throw(ArgumentErr() << "Cannot refine the pose or intrinsics for a pinhole camera " "read from a Planet JSON file. Consider running this tool to first convert " "it to ASP's format, and later refine that using another invocation. " "Note that camera refinement will not preserve the camera center.\n"); if ((opt.cam_weight > 0 || opt.cam_ctr_weight > 0) && opt.refine_intrinsics != "") vw_throw(ArgumentErr() << "The option for refining the intrinsics cannot, " "for the time being, constrain either the camera height or camera center.\n"); // Set the datum from the string if (!opt.datum_str.empty()) opt.datum.set_well_known_datum(opt.datum_str); if (!opt.planet_pinhole && !opt.input_camera.empty()) { // Guess the datum from the camera model asp::SessionPtr session; vw::cartography::Datum cam_datum; bool found_cam_datum = asp::datum_from_camera(opt.image_file, opt.input_camera, // Outputs opt.stereo_session, session, cam_datum); // For pinhole session the guessed datum may be unreliable, so warn only bool warn_only = (opt.stereo_session.find("pinhole") != std::string::npos); if (found_cam_datum && !opt.datum_str.empty()) vw::checkDatumConsistency(cam_datum, opt.datum, warn_only); // opt.datum is more general than opt.datum_str, but set both if (found_cam_datum && opt.datum_str.empty()) { opt.datum = cam_datum; opt.datum_str = cam_datum.name(); } } // Must do the same for opt.sample_file. This and opt.input_camera are used for // different things. opt.sample_file may not even be an orbital camera. if (!opt.sample_file.empty()) { // Guess the datum from the camera model asp::SessionPtr session; std::string local_session_str = ""; // may be different than input camera session vw::cartography::Datum cam_datum; bool found_cam_datum = false; found_cam_datum = asp::datum_from_camera(opt.image_file, opt.sample_file, // Outputs local_session_str, session, cam_datum); if (found_cam_datum && local_session_str == "opticalbar") opt.camera_type = local_session_str; // switch from default pinhole to opticalbar // For pinhole session the guessed datum may be unreliable, so warn only bool warn_only = (opt.stereo_session.find("pinhole") != std::string::npos); if (found_cam_datum && !opt.datum_str.empty()) vw::checkDatumConsistency(cam_datum, opt.datum, warn_only); // opt.datum is more general than opt.datum_str, but set both if (found_cam_datum && opt.datum_str.empty()) { opt.datum = cam_datum; opt.datum_str = cam_datum.name(); } } vw::vw_out() << "Using datum: " << opt.datum << "\n"; // If we cannot read the data from a DEM, must know the datum if (!opt.planet_pinhole && opt.reference_dem.empty() && opt.datum_str.empty()) vw_throw(ArgumentErr() << "Must provide either a reference DEM or a datum.\n"); if (opt.gcp_std <= 0) vw_throw(ArgumentErr() << "The GCP standard deviation must be positive.\n"); if (!opt.planet_pinhole && opt.frame_index != "" && opt.lon_lat_values_str != "") vw_throw(ArgumentErr() << "Cannot specify both the frame index file " << "and the lon-lat corners.\n"); if (opt.cam_weight > 0 && opt.cam_ctr_weight > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot enforce the camera center constraint and camera " << "height constraint at the same time.\n"); if (!opt.planet_pinhole && opt.frame_index != "") parseFrameIndex(opt.frame_index, opt.image_file, opt.parse_eci, opt.parse_ecef, opt.cam_weight, opt.lon_lat_values_str, opt.parsed_camera_center_str, opt.parsed_cam_quat_str); // Parse the pixel values parse_values<double>(opt.pixel_values_str, opt.pixel_values); // If none were provided, use the image corners if (!opt.planet_pinhole && opt.pixel_values.empty()) { DiskImageView<float> img(opt.image_file); int wid = img.cols(), hgt = img.rows(); if (wid <= 0 || hgt <= 0) vw_throw(ArgumentErr() << "Could not read an image with positive dimensions from: " << opt.image_file << ".\n"); if (opt.input_camera == "") { // Populate the corners double arr[] = {0.0, 0.0, wid-1.0, 0.0, wid-1.0, hgt-1.0, 0.0, hgt-1.0}; for (size_t it = 0; it < sizeof(arr)/sizeof(double); it++) opt.pixel_values.push_back(arr[it]); } else { // Sample the camera with 100 points int num = 10; for (int c = 0; c < num; c++) { for (int r = 0; r < num; r++) { opt.pixel_values.push_back((wid - 1.0) * c / double(num - 1)); opt.pixel_values.push_back((hgt - 1.0) * r / double(num - 1)); } } } } // Parse the lon-lat values if (!opt.planet_pinhole && opt.input_camera == "") { parse_values<double>(opt.lon_lat_values_str, opt.lon_lat_values); // Bug fix for some frame_index files repeating the first point at the end int len = opt.lon_lat_values.size(); if (opt.frame_index != "" && opt.lon_lat_values.size() == opt.pixel_values.size() + 2 && len >= 2 && opt.lon_lat_values[0] == opt.lon_lat_values[len - 2] && opt.lon_lat_values[1] == opt.lon_lat_values[len - 1]) { opt.lon_lat_values.pop_back(); opt.lon_lat_values.pop_back(); } } // Note that optical center can be negative (for some SkySat products). if (!opt.planet_pinhole && opt.sample_file == "" && (opt.focal_length <= 0 || opt.pixel_pitch <= 0)) { // A pinhole camera can be its own sample file if (input_ext == ".tsai") opt.sample_file = opt.input_camera; else vw_throw(ArgumentErr() << "Must provide positive focal length " << "and pixel pitch values, or a sample file to read these from.\n"); } if (opt.sample_file != "" && (!vm["focal-length"].defaulted() || !vm["optical-center"].defaulted() || !vm["distortion"].defaulted())) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both a sample file and " << "focal length, optical center, or distortion.\n"); if ((opt.parse_eci || opt.parse_ecef) && opt.camera_type == "opticalbar") vw_throw(ArgumentErr() << "Cannot parse ECI/ECEF data for an optical bar camera.\n"); // Parse the lens distortion parse_values<double>(opt.distortion_str, opt.distortion); // Sanity checks for lens distortion if (opt.camera_type != "pinhole" || out_ext != ".json") { if (opt.distortion.size() != 0) vw_throw(ArgumentErr() << "Distortion coefficients are only supported for CSM Frame cameras.\n"); if (opt.refine_intrinsics != "") vw_throw(ArgumentErr() << "Refining intrinsics is only supported for CSM Frame cameras.\n"); } // Populate the distortion parameters for CSM, if not set if (opt.distortion.size() == 0 && opt.camera_type == "pinhole" && out_ext == ".json") { if (opt.distortion_type == "radtan") { // Consider the special case when we can precisely convert tsai to json, // if the distortion is radtan (tsai) or no distortion. std::vector<double> local_distortion; if (input_ext == ".tsai") { vw::camera::PinholeModel pin(opt.input_camera); vw::camera::NullLensDistortion const* zero_dist = dynamic_cast<vw::camera::NullLensDistortion const*>(pin.lens_distortion()); vw::camera::TsaiLensDistortion const* radtan_dist = dynamic_cast<vw::camera::TsaiLensDistortion const*>(pin.lens_distortion()); if (zero_dist != NULL) { // Zero distortion can be thought of as radtan distortion with all zeros local_distortion.resize(5, 0.0); opt.exact_tsai_to_csm_conv = true; } else if (radtan_dist != NULL) { vw::Vector<double> dist = radtan_dist->distortion_parameters(); // Must have 5 parameters, else throw an error if (dist.size() != 5) vw_throw(ArgumentErr() << "Expecting 5 distortion coefficients for tsai " << "distortion, got: " << dist.size() << ".\n"); // resize local dist to 5 elem and copy one by one local_distortion.resize(5, 0.0); for (size_t i = 0; i < 5; i++) local_distortion[i] = dist[i]; opt.exact_tsai_to_csm_conv = true; } } // See if can copy the exact distortion from the tsai file if (!local_distortion.empty()) opt.distortion = local_distortion; else opt.distortion.resize(5, 0.0); } else if (opt.distortion_type == "radial") { opt.distortion.resize(3, 0.0); } else if (opt.distortion_type == "transverse") { // This distortion model is a pair of polynomials of degree 3 in x and y. opt.distortion.resize(20, 0.0); // Great care is needed below // Free term for first polynomial opt.distortion[0] = 0; opt.distortion[1] = 1; // Set the x term coeff of first poly to 1.0 // Free term for second polynomial opt.distortion[10] = 0; opt.distortion[12] = 1; // Set the y term coeff of second poly to 1.0 } else { vw_throw(ArgumentErr() << "Unknown distortion type: " << opt.distortion_type << ".\n"); } } if (opt.distortion.size() != 0) { if (opt.distortion_type == "radtan" && opt.distortion.size() != 5) vw_throw(ArgumentErr() << "Expecting 5 distortion coefficients for radtan " << "distortion, got: " << opt.distortion.size() << ".\n"); if (opt.distortion_type == "radial" && opt.distortion.size() != 3) vw_throw(ArgumentErr() << "Expecting 3 distortion coefficients for radial " << "distortion, got: " << opt.distortion.size() << ".\n"); if (opt.distortion_type == "transverse" && opt.distortion.size() != 20) vw_throw(ArgumentErr() << "Expecting 20 distortion coefficients for transverse " << "distortion, got: " << opt.distortion.size() << ".\n"); } if (opt.refine_intrinsics != "" && opt.input_camera == "") vw_throw(ArgumentErr() << "Must provide an input camera to refine its intrinsics.\n"); if (opt.num_pixel_samples <= 0) vw_throw(ArgumentErr() << "The number of pixel samples must be positive.\n"); } // End function handle_arguments // Form a camera based on info the user provided void manufacture_cam(Options & opt, int wid, int hgt, vw::CamPtr & out_cam) { if (opt.camera_type == "opticalbar") { boost::shared_ptr<vw::camera::OpticalBarModel> opticalbar_cam = boost::make_shared<vw::camera::OpticalBarModel>(opt.sample_file); // Make sure the image size matches the input image file. // TODO(oalexan1): This looks fishy if the pitch is not 1. opticalbar_cam->set_image_size(Vector2i(wid, hgt)); opticalbar_cam->set_optical_center(Vector2(wid/2.0, hgt/2.0)); out_cam = opticalbar_cam; } else if (opt.camera_type == "pinhole") { // csm frame comes here too std::string sample_ext = vw::get_extension(opt.sample_file); if (opt.sample_file != "" && sample_ext == ".json") { // Read the intrinsics from the csm file. The distortion will be set later. asp::CsmModel csm(opt.sample_file); opt.focal_length = csm.focal_length(); opt.pixel_pitch = csm.frame_pixel_pitch(); opt.optical_center = csm.optical_center() * csm.frame_pixel_pitch(); // TODO(oalexan1): Must copy the target name from CSM opt.distortion = csm.distortion(); if (opt.distortion.size() == 5) opt.distortion_type = "radtan"; else if (opt.distortion.size() == 3) opt.distortion_type = "radial"; else if (opt.distortion.size() == 20) opt.distortion_type = "transverse"; else vw_throw(ArgumentErr() << "Unsupported distortion model in: " << opt.sample_file << ".\n"); } boost::shared_ptr<PinholeModel> pinhole_cam; if (opt.sample_file != "" && sample_ext != ".json") { // Use the initial guess from file pinhole_cam = boost::make_shared<PinholeModel>(opt.sample_file); } else { // Use the intrinsics from the command line or read from the CSM sample // file. Use trivial rotation and translation. Vector3 ctr(0, 0, 0); Matrix<double, 3, 3> rotation; rotation.set_identity(); // When the user does not set the optical center, use the image center Vector2 opt_ctr = opt.optical_center; if (std::isnan(opt_ctr[0]) || std::isnan(opt_ctr[1])) opt_ctr = Vector2(opt.pixel_pitch * wid/2.0, opt.pixel_pitch * hgt/2.0); vw::camera::LensDistortion const* distortion = NULL; // no distortion info yet pinhole_cam = boost::make_shared<PinholeModel> (ctr, rotation, opt.focal_length, opt.focal_length, opt_ctr[0], opt_ctr[1], distortion, opt.pixel_pitch); } out_cam = pinhole_cam; } } // Intersect a ray with the DEM or the datum. Return the zero vector on failure. void dem_or_datum_intersect(Options const& opt, vw::cartography::GeoReference const& geo, ImageViewRef<PixelMask<float>> const& interp_dem, vw::CamPtr input_camera_ptr, vw::Vector2 const& pix, vw::Vector3 & xyz) { // output if (input_camera_ptr.get() == NULL) vw_throw(ArgumentErr() << "Input camera was not provided.\n"); Vector3 camera_ctr = input_camera_ptr->camera_center(pix); Vector3 camera_vec = input_camera_ptr->pixel_to_vector(pix); bool treat_nodata_as_zero = false; bool has_intersection = false; double height_error_tol = 0.01; // error in DEM height, in meters double max_abs_tol = 1e-20; // this will not be reached due to height_error_tol double max_rel_tol = 1e-20; int num_max_iter = 100; Vector3 xyz_guess = Vector3(); xyz = vw::cartography::camera_pixel_to_dem_xyz(camera_ctr, camera_vec, interp_dem, geo, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); // If we could not intersect the DEM, use the datum to estimate the height if (xyz == Vector3() || !has_intersection) xyz = datum_intersection(geo.datum().semi_major_axis() + opt.height_above_datum, geo.datum().semi_minor_axis() + opt.height_above_datum, camera_ctr, camera_vec); } // Trace rays from pixel corners to DEM to see where they intersect the DEM. // Save a pointer to the camera, georef, and interp_dem, as we may need these later. void extract_lon_lat_cam_ctr_from_camera(Options & opt, ImageViewRef<PixelMask<float>> const& interp_dem, GeoReference const& geo, // Outputs vw::CamPtr & input_camera_ptr, std::vector<double> & cam_heights, vw::Vector3 & cam_ctr) { cam_heights.clear(); cam_ctr = Vector3(0, 0, 0); // Load the camera. By now --bundle-adjust-prefix should be set. // We will need it outside of this function. std::string out_prefix; asp::SessionPtr session(asp::StereoSessionFactory::create(opt.stereo_session, // may change opt, opt.image_file, opt.image_file, opt.input_camera, opt.input_camera, out_prefix)); input_camera_ptr = session->camera_model(opt.image_file, opt.input_camera); // Store here pixel values for the rays emanating from the pixels at // which we could intersect with the DEM. std::vector<double> good_pixel_values; int num_points = opt.pixel_values.size()/2; opt.lon_lat_values.reserve(2*num_points); opt.lon_lat_values.clear(); // Estimate camera center std::vector<vw::Vector3> ctrs, dirs; int fail_count = 0; for (int it = 0; it < num_points; it++) { Vector2 pix(opt.pixel_values[2*it], opt.pixel_values[2*it+1]); vw::Vector3 xyz; dem_or_datum_intersect(opt, geo, interp_dem, input_camera_ptr, pix, xyz); if (xyz == Vector3()) { fail_count++; continue; } ctrs.push_back(input_camera_ptr->camera_center(pix)); dirs.push_back(input_camera_ptr->pixel_to_vector(pix)); Vector3 llh = geo.datum().cartesian_to_geodetic(xyz); opt.lon_lat_values.push_back(llh[0]); opt.lon_lat_values.push_back(llh[1]); good_pixel_values.push_back(opt.pixel_values[2*it]); good_pixel_values.push_back(opt.pixel_values[2*it+1]); cam_heights.push_back(llh[2]); // will use it later } if (fail_count > 0) vw::vw_out() << "Number of failures when intersecting the ground with ray samples " << "from the camera: " << fail_count << " / " << num_points << ".\n"; if (good_pixel_values.size() < 6) { vw_throw(ArgumentErr() << "Successful intersection happened for less than " << "3 samples. Will not be able to create a camera. Consider checking " << "your inputs, or passing different pixels in --pixel-values. DEM: " << opt.reference_dem << ".\n"); } // Estimate camera center by triangulating back to the camera. This is necessary // for RPC, which does not store a camera center int num = 0; for (size_t it1 = 0; it1 < ctrs.size(); it1++) { for (size_t it2 = it1 + 1; it2 < ctrs.size(); it2++) { vw::Vector3 err; vw::Vector3 pt = vw::stereo::triangulate_pair(dirs[it1], ctrs[it1], dirs[it2], ctrs[it2], err); if (pt != Vector3(0, 0, 0)) { cam_ctr += pt; num += 1; } } } if (num > 0) cam_ctr = cam_ctr / num; // Update with the values at which we were successful opt.pixel_values = good_pixel_values; } vw::Matrix<double> vec2matrix(int rows, int cols, std::vector<double> const& vals) { int len = vals.size(); if (len != rows * cols) vw::vw_throw(vw::ArgumentErr() << "Size mis-match.\n"); vw::Matrix<double> M; M.set_size(rows, cols); int count = 0; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { M(row, col) = vals[count]; count++; } } return M; } // Refine the camera intrinsics and pose. Only applicable to CSM Frame cameras. void refineIntrinsics(Options const& opt, vw::cartography::GeoReference const& geo, ImageViewRef<PixelMask<float>> & interp_dem, vw::CamPtr const& input_camera_ptr, int width, int height, asp::CsmModel & csm) { // Sanity checks if (opt.reference_dem.empty() && opt.datum_str.empty()) vw_throw(ArgumentErr() << "Must provide a DEM or a datum to refine the camera.\n"); if (input_camera_ptr.get() == NULL) vw_throw(ArgumentErr() << "Must provide an input camera to refine its intrinsics.\n"); std::vector<vw::Vector2> all_pix_samples; asp::createPixelSamples(width, height, opt.num_pixel_samples, all_pix_samples); // Populate the corresponding ground points std::vector<vw::Vector2> pix_samples; std::vector<vw::Vector3> xyz_samples; for (size_t i = 0; i < all_pix_samples.size(); i++) { vw::Vector2 pix = all_pix_samples[i]; vw::Vector3 xyz; dem_or_datum_intersect(opt, geo, interp_dem, input_camera_ptr, pix, xyz); if (xyz == Vector3()) continue; pix_samples.push_back(pix); xyz_samples.push_back(xyz); } // Must have at least 1 pixel sample if (pix_samples.empty()) vw_throw(ArgumentErr() << "Could not find any valid pixel samples.\n"); asp::refineCsmFrameFit(pix_samples, xyz_samples, opt.refine_intrinsics, csm); } // Read a matrix in json format. This will throw an error if the json object // does not have the expected data. vw::Matrix<double> json_mat(json const& j, int rows, int cols) { vw::Matrix<double> M; M.set_size(rows, cols); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { M(row, col) = j[row][col].get<double>(); } } return M; } // Create a camera using user-specified options. Keep record // of the georeference and the datum. void form_camera(Options & opt, vw::cartography::GeoReference & geo, ImageViewRef<PixelMask<float>> & interp_dem, vw::CamPtr & input_camera_ptr, boost::shared_ptr<CameraModel> & out_cam) { ImageView<float> dem; float nodata_value = -std::numeric_limits<float>::max(); bool has_dem = false; if (opt.reference_dem != "") { dem = DiskImageView<float>(opt.reference_dem); bool ans = read_georeference(geo, opt.reference_dem); if (!ans) vw_throw(ArgumentErr() << "Could not read the georeference from dem: " << opt.reference_dem << ".\n"); has_dem = true; vw::read_nodata_val(opt.reference_dem, nodata_value); vw_out() << "Using nodata value: " << nodata_value << "\n"; // For pinhole the datum may be unreliable, so warn only bool warn_only = (opt.stereo_session.find("pinhole") != std::string::npos); if (!opt.datum_str.empty()) vw::checkDatumConsistency(geo.datum(), opt.datum, warn_only); if (opt.datum_str.empty()) { // Set for completeness opt.datum = geo.datum(); opt.datum_str = geo.datum().name(); } } else { // Keep track of the datum geo.set_datum(opt.datum); vw_out() << "No reference DEM provided. Will use a height of " << opt.height_above_datum << " above the datum:\n" << geo.datum() << "\n"; } // Prepare the DEM for interpolation. It may be empty if not provided. interp_dem = interpolate(create_mask(dem, nodata_value), BilinearInterpolation(), ZeroEdgeExtension()); // If we have camera center in ECI or ECEF coordinates in km, convert // it to meters, then find the height above datum. Vector3 known_cam_ctr(0, 0, 0); if (opt.parsed_camera_center_str != "") { std::vector<double> vals; parse_values<double>(opt.parsed_camera_center_str, vals); if (vals.size() != 3) vw_throw(ArgumentErr() << "Could not parse 3 values from: " << opt.parsed_camera_center_str << ".\n"); known_cam_ctr = Vector3(vals[0], vals[1], vals[2]); known_cam_ctr *= 1000.0; // convert to meters vw_out() << "Parsed camera center (meters): " << known_cam_ctr << "\n"; } // The camera center can be also set on the command line if (!std::isnan(opt.camera_center[0])) { known_cam_ctr = opt.camera_center; vw_out() << "Camera center set on the command line: " << std::setprecision(17) << known_cam_ctr << "\n"; } if (!std::isnan(opt.camera_center_llh[0])) { if (!std::isnan(opt.camera_center[0])) vw::vw_throw(vw::ArgumentErr() << "Cannot set camera center in both ECEF and LLH coordinates.\n"); vw_out() << "Camera center (lon-lat-height) set on the command line: " << std::setprecision(17) << opt.camera_center_llh << "\n"; known_cam_ctr = geo.datum().geodetic_to_cartesian(opt.camera_center_llh); } if (known_cam_ctr != Vector3() && opt.cam_weight > 0) { // If known_cam_ctr is in ECI coordinates, the lon and lat won't be accurate // but the height will be. Vector3 llh = geo.datum().cartesian_to_geodetic(known_cam_ctr); opt.cam_height = llh[2]; } vw::Quat parsed_cam_quat; if (opt.parsed_cam_quat_str != "") { std::vector<double> vals; parse_values<double>(opt.parsed_cam_quat_str, vals); if (vals.size() != 4) vw_throw(ArgumentErr() << "Could not parse 4 values from: " << opt.parsed_cam_quat_str << ".\n"); parsed_cam_quat = vw::Quat(vals[0], vals[1], vals[2], vals[3]); vw_out() << "Parsed camera quaternion: " << parsed_cam_quat << "\n"; } if (opt.cam_weight > 0) { vw_out() << "Will attempt to find a camera center height above datum of " << opt.cam_height << " meters with a weight strength of " << opt.cam_weight << ".\n"; } if (opt.cam_ctr_weight > 0 && opt.refine_camera) vw_out() << "Will constrain the camera center with the camera center weight.\n"; Vector3 estim_cam_ctr(0, 0, 0); // estimated camera center from input camera std::vector<double> cam_heights; if (opt.input_camera != "") { // Extract lon and lat from tracing rays from the camera to the ground. // This can modify opt.pixel_values. Also calc the camera center. extract_lon_lat_cam_ctr_from_camera(opt, create_mask(dem, nodata_value), geo, // Outputs input_camera_ptr, cam_heights, estim_cam_ctr); } // Overwrite the estimated center with what is parsed from vendor's data, // if this data exists. if (known_cam_ctr != Vector3(0, 0, 0)) estim_cam_ctr = known_cam_ctr; if (opt.lon_lat_values.size() < 3) vw_throw(ArgumentErr() << "Expecting at least three longitude-latitude pairs.\n"); if (opt.lon_lat_values.size() != opt.pixel_values.size()) { vw_throw(ArgumentErr() << "The number of lon-lat pairs must equal the number of pixel pairs.\n"); } size_t num_lon_lat_pairs = opt.lon_lat_values.size()/2; Vector2 pix; Vector3 llh, xyz; std::vector<Vector3> xyz_vec; // TODO(oalexan1): Use asp::writeGcp() instead of inline GCP writing. // If to write a gcp file std::ostringstream gcp; gcp.precision(17); bool write_gcp = (opt.gcp_file != ""); // TODO(oalexan1): Make this into a function for (size_t corner_it = 0; corner_it < num_lon_lat_pairs; corner_it++) { // Get the height from the DEM if possible llh[0] = opt.lon_lat_values[2*corner_it+0]; llh[1] = opt.lon_lat_values[2*corner_it+1]; if (llh[1] < -90 || llh[1] > 90) vw_throw(ArgumentErr() << "Detected a latitude out of bounds. " << "Perhaps the longitude and latitude are reversed?\n"); double height = opt.height_above_datum; if (opt.input_camera != "") { height = cam_heights[corner_it]; // already computed } else { if (has_dem) { bool success = false; pix = geo.lonlat_to_pixel(subvector(llh, 0, 2)); int len = BilinearInterpolation::pixel_buffer; if (pix[0] >= 0 && pix[0] <= interp_dem.cols() - 1 - len && pix[1] >= 0 && pix[1] <= interp_dem.rows() - 1 - len) { PixelMask<float> masked_height = interp_dem(pix[0], pix[1]); if (is_valid(masked_height)) { height = masked_height.child(); success = true; } } if (!success) vw_out() << "Could not determine a valid height value at lon-lat: " << llh[0] << ' ' << llh[1] << ". Will use a height of " << height << ".\n"; } } llh[2] = height; xyz = geo.datum().geodetic_to_cartesian(llh); xyz_vec.push_back(xyz); if (write_gcp) gcp << corner_it << ' ' << llh[1] << ' ' << llh[0] << ' ' << llh[2] << ' ' << 1 << ' ' << 1 << ' ' << 1 << ' ' << opt.image_file << ' ' << opt.pixel_values[2*corner_it] << ' ' << opt.pixel_values[2*corner_it+1] << ' ' << opt.gcp_std << ' ' << opt.gcp_std << "\n"; } // End loop through lon-lat pairs if (write_gcp) { vw_out() << "Writing: " << opt.gcp_file << "\n"; std::ofstream fs(opt.gcp_file.c_str()); fs << gcp.str(); fs.close(); } // Form a camera based on info the user provided DiskImageView<float> img(opt.image_file); int wid = img.cols(), hgt = img.rows(); if (wid <= 0 || hgt <= 0) vw_throw(ArgumentErr() << "Could not read an image with positive dimensions from: " << opt.image_file << ".\n"); manufacture_cam(opt, wid, hgt, out_cam); // Transform it and optionally refine it bool verbose = true; fit_camera_to_xyz_ht(known_cam_ctr, estim_cam_ctr, opt.camera_type, opt.refine_camera, xyz_vec, opt.pixel_values, opt.cam_height, opt.cam_weight, opt.cam_ctr_weight, geo.datum(), verbose, out_cam); return; } // Read a pinhole camera from Planet's json file format (*_pinhole.json). Then // the WGS84 datum is assumed. void read_pinhole_from_json(Options & opt, vw::cartography::GeoReference & geo, boost::shared_ptr<CameraModel> & out_cam) { if (opt.datum_str.empty()) vw_throw(ArgumentErr() << "Must provide a datum to read a pinhole camera.\n"); // Set the datum geo.set_datum(opt.datum); std::ifstream f(opt.input_camera); json j = json::parse(f); // Parse the focal length and optical center. Negate the focal // length to make it positive. We adjust for that later. json const& cam = j["P_camera"]; double fx = -cam[0][0].get<double>(); double fy = -cam[1][1].get<double>(); double ox = cam[0][2].get<double>(); double oy = cam[1][2].get<double>(); json const& exterior = j["exterior_orientation"]; double ecef_x = exterior["x_ecef_meters"].get<double>(); double ecef_y = exterior["y_ecef_meters"].get<double>(); double ecef_z = exterior["z_ecef_meters"].get<double>(); // Following the Planet convention of naming things vw::Matrix<double> extrinsic = json_mat(j["P_extrinsic"], 4, 4); vw::Matrix<double> intrinsic = json_mat(j["P_intrinsic"], 4, 4); // Adjust for the fact that Planet likes negative focal lengths, while // vw::camera::PinholeModel uses positive values. vw::Matrix<double> flip; flip.set_identity(4); flip(0, 0) = -1; flip(1, 1) = -1; // Create a blank pinhole model and get an alias to it out_cam = boost::make_shared<vw::camera::PinholeModel>(); PinholeModel & pin = *((PinholeModel*)out_cam.get()); // Populate the model pin.set_pixel_pitch(1.0); // not necessary, but better be explicit pin.set_focal_length(vw::Vector2(fx, fy)); pin.set_point_offset(vw::Vector2(ox, oy)); pin.set_camera_center(vw::Vector3(ecef_x, ecef_y, ecef_z)); vw::Matrix<double> world2cam = flip * intrinsic * extrinsic; vw::Matrix<double> cam2world = inverse(world2cam); pin.set_camera_pose(submatrix(cam2world, 0, 0, 3, 3)); } void save_linescan(Options & opt) { // Load the cameras. For now load without any adjustment, which will be applied later. auto local_prefix = asp::stereo_settings().bundle_adjust_prefix; asp::stereo_settings().bundle_adjust_prefix = ""; std::string out_prefix; asp::SessionPtr session(asp::StereoSessionFactory::create (opt.stereo_session, // may change opt, opt.image_file, opt.image_file, opt.input_camera, opt.input_camera, out_prefix)); vw::CamPtr camera_model = session->camera_model(opt.image_file, opt.input_camera); // Get a pointer to the underlying CSM model. It is owned by camera_model. asp::CsmModel * csm_cam = asp::csm_model(camera_model); // Apply the adjustment from the base camera model to the CSM model. asp::stereo_settings().bundle_adjust_prefix = local_prefix; if (asp::stereo_settings().bundle_adjust_prefix != "") asp::applyAdjustmentToCsmCamera(opt.image_file, opt.input_camera, asp::stereo_settings().bundle_adjust_prefix, camera_model, csm_cam); vw_out() << "Writing: " << opt.out_camera << "\n"; csm_cam->saveState(opt.out_camera); } void opticalbar2linescan(Options & opt) { if (opt.bundle_adjust_prefix != "") vw_throw(ArgumentErr() << "Option --bundle-adjust-prefix is not supported when converting " << "an opticalbar camera to a linescan camera. Ensure the input camera " << "is created with any adjustments applied to it internally.\n"); vw::Vector2i image_size = vw::file_image_size(opt.image_file); asp::CsmModel csm; asp::fitCsmLinescanToOpticalBar(opt.input_camera, image_size, opt.datum, csm); vw_out() << "Writing: " << opt.out_camera << "\n"; csm.saveState(opt.out_camera); } void save_rpc(Options & opt) { // Load the cameras. Must use the RPC session even if a linescan model exists as well // in the file, such as for WorldView images. opt.stereo_session = "rpc"; std::string out_prefix = ""; asp::SessionPtr session(asp::StereoSessionFactory::create (opt.stereo_session, // may change opt, opt.image_file, opt.image_file, opt.input_camera, opt.input_camera, out_prefix)); boost::shared_ptr<CameraModel> camera_model = session->camera_model(opt.image_file, opt.input_camera); asp::RPCModel const* rpc_cam = dynamic_cast<const asp::RPCModel*>(vw::camera::unadjusted_model(camera_model.get())); if (rpc_cam == NULL) vw_throw(ArgumentErr() << "Expecting an RPC camera.\n"); vw::vw_out() << "Writing: " << opt.out_camera << "\n"; rpc_cam->saveXML(opt.out_camera); } // See --extrinsics. void camerasFromExtrinsics(Options const& opt) { // Read the extrinsics std::set<std::string> str_col_names = {"image"}; std::set<std::string> num_col_names = {"lon", "lat", "height_above_datum", "roll", "pitch", "yaw"}; std::map<std::string, std::vector<std::string>> str_map; std::map<std::string, std::vector<double>> num_map; asp::readReportFile(opt.extrinsics_file, str_col_names, num_col_names, str_map, num_map); // Read the intrinsics vw::camera::PinholeModel pinhole(opt.sample_file); // Read the datum vw::cartography::Datum datum(opt.datum_str); int num_cameras = str_map["image"].size(); if (num_cameras == 0) vw_throw(ArgumentErr() << "No extrinsics found in: " << opt.extrinsics_file << ".\n"); // Iterate over cameras for (int i = 0; i < num_cameras; i++) { // Read the extrinsics double lon = num_map["lon"][i]; double lat = num_map["lat"][i]; double height_above_datum = num_map["height_above_datum"][i]; double roll = num_map["roll"][i]; double pitch = num_map["pitch"][i]; double yaw = num_map["yaw"][i]; // Convert camera center to ECEF vw::Vector3 llh(lon, lat, height_above_datum); vw::Vector3 P = datum.geodetic_to_cartesian(llh); // Camera-to-world rotation vw::Matrix3x3 ned = datum.lonlat_to_ned_matrix(llh); vw::Matrix3x3 R = ned * asp::rollPitchYaw(roll, pitch, yaw) * asp::rotationXY(); // Form the camera pinhole.set_camera_center(P); pinhole.set_camera_pose(R); // Write the camera std::string imageFile = str_map["image"][i]; std::string camFile = fs::path(imageFile).replace_extension(".tsai").string(); vw::create_out_dir(camFile); vw::vw_out() << "Writing: " << camFile << "\n"; pinhole.write(camFile); } } // Fetch metadata from an ISIS cube for saving to the output CSM camera. void isisCubMetadata(vw::CamPtr in_cam, double & ephem_time, vw::Vector3 & sun_pos, std::string & serial_number, std::string & target_name) { // Initialize the output variables ephem_time = 0.0; sun_pos = vw::Vector3(0, 0, 0); serial_number = ""; target_name = ""; #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 if (in_cam.get() == NULL) return; IsisCameraModel const * isis_cam = dynamic_cast<IsisCameraModel const*>(vw::camera::unadjusted_model(in_cam.get())); if (isis_cam == NULL) return; ephem_time = isis_cam->ephemeris_time(); sun_pos = isis_cam->sun_position(); serial_number = isis_cam->serial_number(); target_name = isis_cam->target_name(); #endif } // Save a pinhole camera, in tsai or csm format void save_pinhole(Options const& opt, vw::cartography::GeoReference const& geo, vw::CamPtr input_camera_ptr, ImageViewRef<PixelMask<float>> interp_dem, boost::shared_ptr<CameraModel> out_cam) { vw::camera::PinholeModel* pin = NULL; boost::shared_ptr<vw::camera::PinholeModel> input_pin; std::string out_ext = vw::get_extension(opt.out_camera); if (opt.exact_tsai_to_csm_conv) { // Get the input pinhole model, to be converted below exactly to CSM input_pin = boost::make_shared<vw::camera::PinholeModel>(opt.input_camera); pin = input_pin.get(); // Must make another copy to satisfy another path in the logic below // TODO(oalexan1): This looks like a hack. input_camera_ptr = boost::make_shared<vw::camera::PinholeModel>(opt.input_camera); } else { // Use the manufactured camera pin = (vw::camera::PinholeModel*)out_cam.get(); } if (out_ext == ".tsai") { vw::Vector3 llh = geo.datum().cartesian_to_geodetic(out_cam->camera_center(Vector2())); vw_out() << "Output camera center lon, lat, and height above datum: " << llh << "\n"; vw_out() << "Writing: " << opt.out_camera << "\n"; pin->write(opt.out_camera); } else if (out_ext == ".json") { DiskImageView<float> img(opt.image_file); int width = img.cols(), height = img.rows(); asp::CsmModel csm; // For input ISIS cameras, save some metadata to the output camera double ephem_time = 0.0; vw::Vector3 sun_pos(0, 0, 0); std::string serial_number = "", target_name = ""; isisCubMetadata(input_camera_ptr, ephem_time, sun_pos, serial_number, target_name); csm.createFrameModel(*pin, width, height, geo.datum().semi_major_axis(), geo.datum().semi_minor_axis(), opt.distortion_type, opt.distortion, ephem_time, sun_pos, serial_number, target_name); if (opt.refine_intrinsics != "") refineIntrinsics(opt, geo, interp_dem, input_camera_ptr, width, height, csm); vw::Vector3 llh = geo.datum().cartesian_to_geodetic(csm.camera_center(Vector2())); vw_out() << "Output camera center lon, lat, and height above datum: " << llh << "\n"; vw_out() << "Writing: " << opt.out_camera << "\n"; csm.saveState(opt.out_camera); } else { vw_throw(ArgumentErr() << "Unknown output camera file extension: " << out_ext << ".\n"); } } int main(int argc, char * argv[]) { Options opt; try { handle_arguments(argc, argv, opt); if (opt.camera_type == "linescan") { // The linescan workflow is very different than the rest of the code. if (opt.stereo_session != "opticalbar") save_linescan(opt); else opticalbar2linescan(opt); return 0; } // Same for rpc if (opt.camera_type == "rpc") { save_rpc(opt); return 0; } if (opt.extrinsics_file != "") { camerasFromExtrinsics(opt); return 0; } // Some of the numbers we print need high precision vw_out().precision(17); // Interpolated dem. May not always exist. ImageViewRef<PixelMask<float>> interp_dem; // Georeference. At least the datum will exist. vw::cartography::GeoReference geo; geo.set_datum(opt.datum); // may change later // Input camera vw::CamPtr input_camera_ptr(NULL); // Output camera boost::shared_ptr<CameraModel> out_cam; if (!opt.planet_pinhole && !opt.exact_tsai_to_csm_conv) { // Create a camera using user-specified options. Read geo and interp_dem. form_camera(opt, geo, interp_dem, input_camera_ptr, out_cam); } else if (!opt.exact_tsai_to_csm_conv) { // Read a pinhole camera from Planet's json file format (*_pinhole.json). Then // the WGS84 datum is assumed. Ignore all other input options. Read geo datum. read_pinhole_from_json(opt, geo, out_cam); } if (opt.camera_type == "opticalbar") { vw::Vector3 llh = geo.datum().cartesian_to_geodetic(out_cam->camera_center(Vector2())); vw_out() << "Output camera center lon, lat, and height above datum: " << llh << "\n"; vw_out() << "Writing: " << opt.out_camera << "\n"; ((vw::camera::OpticalBarModel*)out_cam.get())->write(opt.out_camera); } else if (opt.camera_type == "pinhole") { save_pinhole(opt, geo, input_camera_ptr, interp_dem, out_cam); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/cam_test.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Tool to compare two camera models for the same image. For example, // compare ISIS to CSM, linescan to RPC (for DG, PeruSat, or // Pleiades), Optical bar vs pinhole (with the latter created with // convert_pinhole_model). // For each camera model find the camera center and ray direction at a // set of sampled pixels, then by projecting pixels to the ground // using the cam1 camera and back-projecting the resulting points into // the cam2 camera, then doing this in reverse. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/StereoSettings.h> #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/CsmModel.h> #include <asp/Camera/Covariance.h> #include <asp/Sessions/CameraUtils.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisCameraModel.h> #endif // ASP_HAVE_PKG_ISIS #include <vw/Cartography/DatumUtils.h> #include <vw/Cartography/BathyStereoModel.h> #include <vw/Core/Stopwatch.h> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options: vw::GdalWriteOptions { std::string image_file, cam1_file, cam2_file, session1, session2, bundle_adjust_prefix, cam1_bundle_adjust_prefix, cam2_bundle_adjust_prefix, datum, bathy_plane; int sample_rate; double subpixel_offset, height_above_datum, refraction_index; bool print_per_pixel_results, test_error_propagation; vw::Vector2 single_pixel; std::vector<vw::BathyPlane> bathy_plane_vec; Options() {} }; void handle_arguments(int argc, char *argv[], Options& opt) { double nan = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options("General options"); general_options.add_options() ("image", po::value(&opt.image_file), "Image file.") ("cam1", po::value(&opt.cam1_file), "Camera 1 file.") ("cam2", po::value(&opt.cam2_file), "Camera 2 file.") ("session1", po::value(&opt.session1), "Session to use for camera 1 (if not provided it will be guessed).") ("session2", po::value(&opt.session2), "Session to use for camera 2 (if not provided it will be guessed).") ("sample-rate", po::value(&opt.sample_rate)->default_value(100), "Use one out of these many pixels when sampling the image.") ("subpixel-offset", po::value(&opt.subpixel_offset)->default_value(0.0), "Add to each integer pixel this offset (in x and y) when sampling the image.") ("single-pixel", po::value(&opt.single_pixel)->default_value(Vector2(nan, nan)), "Instead of sampling pixels from the image use only this pixel.") ("print-per-pixel-results", po::bool_switch(&opt.print_per_pixel_results)->default_value(false)->implicit_value(true), "Print the results at each pixel.") ("height-above-datum", po::value(&opt.height_above_datum)->default_value(0.0), "Let the ground surface be at this height above the datum (measured in meters).") ("datum", po::value(&opt.datum), "Set the datum. This will override the datum from the input cameras. Usually needed " "only for Pinhole cameras, when the camera does not have the datum information. " "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).") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Adjust the cameras using this prefix.") ("cam1-bundle-adjust-prefix", po::value(&opt.cam1_bundle_adjust_prefix), "Adjust the first camera using this prefix.") ("cam2-bundle-adjust-prefix", po::value(&opt.cam2_bundle_adjust_prefix), "Adjust the first camera using this prefix.") ("test-error-propagation", po::bool_switch(&opt.test_error_propagation)->default_value(false)->implicit_value(true), "Test computing the stddev (see --propagate-errors). This is an undocumented " "developer option.") ("bathy-plane", po::value(&opt.bathy_plane), "Read from this file a bathy plane, so a water surface which is a plane in local " "projected coordinates. A ray from the camera to the ellipsoid determined by " "--height-above-datum that encounters this bathy plane along the way will get bent " "according to Snell's law. Same for a ray going in reverse.") ("refraction-index", po::value(&opt.refraction_index)->default_value(1.0), "The index of refraction of water to be used in bathymetry correction. " "Must be bigger than 1. This index can be computed with refr_index.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("--image <image file> --cam1 <camera 1 file> --cam2 <camera 2 file> " "[other options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.image_file == "" || opt.cam1_file == "" || opt.cam2_file == "") vw_throw(ArgumentErr() << "Not all inputs were specified.\n" << usage << general_options); if (opt.sample_rate <= 0) vw_throw(ArgumentErr() << "The sample rate must be positive.\n" << usage << general_options); // If either cam1_adjust_prefix or cam2_adjust_prefix is set, then // must not set bundle_adjust_prefix. Throw an error then. if (opt.cam1_bundle_adjust_prefix != "" || opt.cam2_bundle_adjust_prefix != "") { if (opt.bundle_adjust_prefix != "") vw_throw(ArgumentErr() << "Cannot set both --bundle-adjust-prefix and " "--cam1-bundle-adjust-prefix or --cam2-bundle-adjust-prefix.\n"); } else { // Need this to be able to load adjusted camera models. This must be set // before loading the cameras. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; } if (opt.test_error_propagation) asp::stereo_settings().propagate_errors = true; // Validate bathymetry options bool have_bathy_plane = (opt.bathy_plane != ""); bool have_refraction = (opt.refraction_index > 1.0); if (have_bathy_plane && !have_refraction) vw_throw(ArgumentErr() << "When --bathy-plane is set, --refraction-index must be " << "specified and bigger than 1.\n"); if (!have_bathy_plane && have_refraction) vw_throw(ArgumentErr() << "When --refraction-index is set, --bathy-plane must " << "also be specified.\n"); // Load bathy plane if specified if (have_bathy_plane) { int num_images = 1; vw::readBathyPlanes(opt.bathy_plane, num_images, opt.bathy_plane_vec); vw_out() << "Refraction index: " << opt.refraction_index << "\n"; } } // Sort the diffs and print some stats void print_diffs(std::string const& tag, std::vector<double> & diffs) { std::sort(diffs.begin(), diffs.end()); vw_out() << "\n"; if (diffs.empty()) { vw_out() << "Empty list of diffs for: " << tag << "\n"; return; } vw_out() << tag << "\n"; vw_out() << "Min: " << diffs[0] << "\n"; vw_out() << "Median: " << diffs[diffs.size()/2] << "\n"; vw_out() << "Max: " << diffs.back() << "\n"; } void testErrorPropagation(Options const& opt, vw::cartography::Datum const& datum, vw::CamPtr cam1_model, vw::CamPtr cam2_model) { double major_axis = datum.semi_major_axis() + opt.height_above_datum; double minor_axis = datum.semi_minor_axis() + opt.height_above_datum; // Try to find a pair of pixels corresponding to same tri point, // within image bounds vw::Vector2 pix1, pix2; Vector3 triPt; for (int i = 0; i < 20; i++) { pix1 = Vector2(i * 1000, i * 1000); Vector3 cam1_dir = cam1_model->pixel_to_vector(pix1); Vector3 cam1_ctr = cam1_model->camera_center(pix1); // Shoot a ray from the cam1 camera, intersect it with the // given height above datum triPt = vw::cartography::datum_intersection(major_axis, minor_axis, cam1_ctr, cam1_dir); // Skip invalid intersections if (triPt == Vector3(0, 0, 0)) continue; // Project to second camera pix2 = cam2_model->point_to_pixel(triPt); if (pix2.x() > 0 && pix2.y() > 0) break; } vw::vw_out() << "Left pixel: " << pix1 << std::endl; vw::vw_out() << "Right pixel: " << pix2 << std::endl; auto const& v = asp::stereo_settings().horizontal_stddev; // alias vw::Vector2 ans = asp::propagateCovariance(triPt, datum, v[0], v[1], cam1_model.get(), cam2_model.get(), pix1, pix2); vw::vw_out() << "Horizontal and vertical stddev: " << ans << std::endl; } // This is an important sanity check for RPC cameras, which have only a limited // range of valid heights above datum. void rpc_datum_sanity_check(std::string const& cam_file, double height_above_datum, vw::camera::CameraModel const* cam) { // Cast the camera to RPC asp::RPCModel const* rpc_cam = dynamic_cast<asp::RPCModel const*>(cam); if (rpc_cam == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting an RPC camera model.\n"); vw::Vector3 lonlatheight_offset = rpc_cam->lonlatheight_offset(); vw::Vector3 lonlatheight_scale = rpc_cam->lonlatheight_scale(); double mid_ht = lonlatheight_offset[2]; double min_ht = mid_ht - lonlatheight_scale[2]; double max_ht = mid_ht + lonlatheight_scale[2]; if (height_above_datum < min_ht || height_above_datum > max_ht) { vw::vw_out() << "\n"; vw::vw_out(vw::WarningMessage) << "For RPC camera file: " << cam_file << ", the range of valid heights above datum is " << min_ht << " to " << max_ht << " meters. The provided height above datum is " << height_above_datum << " meters. The results may be inaccurate. Set appropriately " << "the --height-above-datum option.\n\n"; } } void run_cam_test(Options & opt) { bool indiv_adjust_prefix = (opt.cam1_bundle_adjust_prefix != "" || opt.cam2_bundle_adjust_prefix != ""); // Load cam1 std::string out_prefix; std::string default_session1 = opt.session1; // save it before it changes if (indiv_adjust_prefix) asp::stereo_settings().bundle_adjust_prefix = opt.cam1_bundle_adjust_prefix; asp::SessionPtr cam1_session(asp::StereoSessionFactory::create (opt.session1, // may change opt, opt.image_file, opt.image_file, opt.cam1_file, opt.cam1_file, out_prefix)); boost::shared_ptr<vw::camera::CameraModel> cam1_model = cam1_session->camera_model(opt.image_file, opt.cam1_file); // Load cam2 std::string default_session2 = opt.session2; // save it before it changes if (indiv_adjust_prefix) asp::stereo_settings().bundle_adjust_prefix = opt.cam2_bundle_adjust_prefix; asp::SessionPtr cam2_session(asp::StereoSessionFactory::create (opt.session2, // may change opt, opt.image_file, opt.image_file, opt.cam2_file, opt.cam2_file, out_prefix)); boost::shared_ptr<vw::camera::CameraModel> cam2_model = cam2_session->camera_model(opt.image_file, opt.cam2_file); if (indiv_adjust_prefix) asp::stereo_settings().bundle_adjust_prefix = ""; // reset bool found_datum = false; vw::cartography::Datum datum; if (opt.datum != "") { // Use the datum specified by the user datum.set_well_known_datum(opt.datum); found_datum = true; } // See if the first camera has a datum vw::cartography::Datum cam_datum; bool warn_only = true; // warn about differences in the datums bool found_cam_datum = asp::datum_from_camera(opt.image_file, opt.cam1_file, // Outputs opt.session1, cam1_session, cam_datum); if (found_datum && found_cam_datum) vw::checkDatumConsistency(datum, cam_datum, warn_only); if (!found_datum && found_cam_datum) { datum = cam_datum; found_datum = true; } // Same for the second camera found_cam_datum = asp::datum_from_camera(opt.image_file, opt.cam2_file, // Outputs opt.session2, cam2_session, cam_datum); if (found_datum && found_cam_datum) vw::checkDatumConsistency(datum, cam_datum, warn_only); if (!found_datum && found_cam_datum) { datum = cam_datum; found_datum = true; } if (!found_datum) vw_throw(ArgumentErr() << "Could not find the datum. Set --datum or use " << "the nadirpinhole session (for cameras relative to a planet).\n"); vw_out() << "Using datum: " << datum << std::endl; // Sanity check vw::Vector3 llh1 = datum.cartesian_to_geodetic(cam1_model->camera_center(Vector2())); vw::Vector3 llh2 = datum.cartesian_to_geodetic(cam2_model->camera_center(Vector2())); if (llh1[2] < 0 || llh2[2] < 0) vw::vw_out(vw::WarningMessage) << "First or second camera center is below " << "the zero datum surface. Check your data. Consider using " << "the --datum and/or --height-above-datum options.\n"; if (opt.session1 == opt.session2 && (default_session1 == "" || default_session2 == "") && (opt.session1 == "dg")) vw::vw_out(vw::WarningMessage) << "The session names for both cameras " << "were guessed as: '" << opt.session1 << "'. It is suggested that they be " << "explicitly specified using --session1 and --session2, as a DigitalGlobe " << "camera file may contain both exact linescan and RPC cameras.\n"; // Sanity checks for RPC cameras if (opt.session1 == "rpc") rpc_datum_sanity_check(opt.cam1_file, opt.height_above_datum, vw::camera::unadjusted_model(cam1_model.get())); if (opt.session2 == "rpc") rpc_datum_sanity_check(opt.cam2_file, opt.height_above_datum, vw::camera::unadjusted_model(cam2_model.get())); if (opt.test_error_propagation && opt.session1 == "dg" && opt.session2 == "dg") { testErrorPropagation(opt, datum, cam1_model, cam2_model); return; } // Find the input image dimensions int image_cols = 0, image_rows = 0; try { DiskImageView<float> image(opt.image_file); image_cols = image.cols(); image_rows = image.rows(); } catch(const std::exception& e) { // For CSM-to-CSM ground-to-image and image-to-ground comparisons only, // the camera has the dimensions if the .cub image is missing. asp::CsmModel * csm_model = dynamic_cast<asp::CsmModel*>(vw::camera::unadjusted_model(cam1_model.get())); if (csm_model != NULL) { image_cols = csm_model->get_image_size()[0]; image_rows = csm_model->get_image_size()[1]; } else { vw::vw_throw(ArgumentErr() << e.what()); } } vw_out() << "Image dimensions: " << image_cols << ' ' << image_rows << std::endl; Stopwatch sw; sw.start(); double major_axis = datum.semi_major_axis() + opt.height_above_datum; double minor_axis = datum.semi_minor_axis() + opt.height_above_datum; bool have_bathy_plane = (opt.bathy_plane != ""); // Iterate over the image bool single_pix = !std::isnan(opt.single_pixel[0]) && !std::isnan(opt.single_pixel[1]); std::vector<double> ctr_diff, dir_diff, cam1_to_cam2_diff, cam2_to_cam1_diff; int num_failed = 0; for (int col = 0; col < image_cols; col += opt.sample_rate) { for (int row = 0; row < image_rows; row += opt.sample_rate) { try { Vector2 image_pix(col + opt.subpixel_offset, row + opt.subpixel_offset); if (single_pix) image_pix = opt.single_pixel; if (opt.print_per_pixel_results || single_pix) vw_out() << "Pixel: " << image_pix << "\n"; Vector3 cam1_ctr = cam1_model->camera_center(image_pix); Vector3 cam2_ctr = cam2_model->camera_center(image_pix); ctr_diff.push_back(norm_2(cam1_ctr - cam2_ctr)); if (opt.print_per_pixel_results) vw_out() << "Camera center diff: " << ctr_diff.back() << std::endl; Vector3 cam1_dir = cam1_model->pixel_to_vector(image_pix); Vector3 cam2_dir = cam2_model->pixel_to_vector(image_pix); dir_diff.push_back(norm_2(cam1_dir - cam2_dir)); if (opt.print_per_pixel_results) vw_out() << "Camera direction diff: " << dir_diff.back() << std::endl; // Shoot a ray from the cam1 camera, intersect it with the // given height above datum, and project it back into the cam2 // camera. Vector3 xyz; if (!have_bathy_plane) xyz = vw::cartography::datum_intersection(major_axis, minor_axis, cam1_ctr, cam1_dir); else xyz = vw::datumBathyIntersection(cam1_ctr, cam1_dir, major_axis, minor_axis, opt.bathy_plane_vec[0], opt.refraction_index); // Skip invalid intersections if (xyz == Vector3(0, 0, 0)) continue; Vector2 cam2_pix; if (!have_bathy_plane) cam2_pix = cam2_model->point_to_pixel(xyz); else cam2_pix = vw::point_to_pixel(cam2_model.get(), opt.bathy_plane_vec[0], opt.refraction_index, xyz); cam1_to_cam2_diff.push_back(norm_2(image_pix - cam2_pix)); if (opt.print_per_pixel_results) vw_out() << "cam1 to cam2 pixel diff: " << image_pix - cam2_pix << std::endl; // Shoot a ray from the cam2 camera, intersect it with the // given height above the datum, and project it back into the // cam1 camera. if (!have_bathy_plane) xyz = vw::cartography::datum_intersection(major_axis, minor_axis, cam2_ctr, cam2_dir); else xyz = vw::datumBathyIntersection(cam2_ctr, cam2_dir, major_axis, minor_axis, opt.bathy_plane_vec[0], opt.refraction_index); // Skip invalid intersections if (xyz == Vector3(0, 0, 0)) continue; Vector2 cam1_pix; if (!have_bathy_plane) cam1_pix = cam1_model->point_to_pixel(xyz); else cam1_pix = point_to_pixel(cam1_model.get(), opt.bathy_plane_vec[0], opt.refraction_index, xyz); cam2_to_cam1_diff.push_back(norm_2(image_pix - cam1_pix)); if (opt.print_per_pixel_results) vw_out() << "cam2 to cam1 pixel diff: " << image_pix - cam1_pix << "\n\n"; } catch (...) { // Failure to compute these operations can occur for pinhole cameras num_failed++; } if (single_pix) break; } if (single_pix) break; } sw.stop(); vw_out() << "Number of samples: " << ctr_diff.size() << "\n"; if (num_failed > 0) vw_out() << "Number of failed samples (not counted above): " << num_failed << "\n"; print_diffs("cam1 to cam2 camera direction diff norm", dir_diff); print_diffs("cam1 to cam2 camera center diff (meters)", ctr_diff); print_diffs("cam1 to cam2 pixel diff", cam1_to_cam2_diff); print_diffs("cam2 to cam1 pixel diff", cam2_to_cam1_diff); // If either session is rpc, warn that the camera center may not be accurate if (opt.session1 == "rpc" || opt.session2 == "rpc") { vw::vw_out() << "\n"; // separate from the diffs vw::vw_out(vw::WarningMessage) << "For RPC cameras, the concept of camera center is not well-defined, " << "so the result for that should be ignored.\n"; } double elapsed_sec = sw.elapsed_seconds(); vw_out() << "\nElapsed time per sample: " << 1e+6 * elapsed_sec/ctr_diff.size() << " milliseconds. (More samples will increase the accuracy.)\n"; } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); run_cam_test(opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/camera_calibrate ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' A wrapper around the OpenCV checkerboard calibration tool. Handy to use prior to camera_solve in order to generate intrinsic camera parameters. ''' import sys import os, glob, re, shutil, subprocess, string, time, errno, optparse, math # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils import asp_string_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] def make_image_list(options): '''Generate an OpenCV compatible image list''' # Call in this manner so that the image wildcard does not get expanded cmd = ['opencv_imagelist_creator', options.xml_list_path, options.image_wildcard] # Escape any spaces in the arguments. cmd = asp_string_utils.argListToString(cmd) proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) output = proc.communicate() if not os.path.exists(options.xml_list_path): print(cmd) print(output[0]) raise Exception('Failed to generate xml image list file!') def calibrate_camera(options): '''Perform camera calibration using the input images''' cmd = ['opencv_calibrate', '-pt', 'chessboard', '-o', options.ocv_params_path, '-p', options.xml_list_path, '-w', str(options.board_size[0]), '-h', str(options.board_size[1])] if options.box_size_cm: box_size_meters = options.box_size_cm/100.0 cmd += ['-s', str(box_size_meters)] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppress_output, outputPath=options.ocv_params_path, redo=options.overwrite) if not os.path.exists(options.ocv_params_path): raise Exception('Failed to calibrate the camera!') def get_value_after_colon(s): parts = s.split(':') return parts[1] def get_string_between_brackets(s): start = s.find('[') stop = s.rfind(']') return s[start+1:stop] def read_lines_until_bracket_end(lines, start_index): '''Keep appending lines from a list until we hit the one ending with "]", then strip brackets ''' index = start_index s = '' while index < len(lines): s += lines[index].strip() if s[-1] == ']': return get_string_between_brackets(s) index += 1 raise Exception('Text parsing error!') def parse_cv_yaml_file(path): '''Reads the OpenCV parameter file into a nice dictionary''' params = dict() cv_file = open(path) linesIn = cv_file.read().split('\n') lines = [x for x in linesIn if x != '---'] # Strip this line added in later OpenCV version params['width' ] = int(get_value_after_colon(lines[2])) params['height'] = int(get_value_after_colon(lines[3])) # Get the intrinsic params s = read_lines_until_bracket_end(lines, 12).split(',') intrinsics = [float(x) for x in s] # Get the distortion params s = read_lines_until_bracket_end(lines, 18).split(',') distortion = [float(x) for x in s] params['error' ] = float(get_value_after_colon(lines[-2])) params['focal_length_x'] = intrinsics[0] params['focal_length_y'] = intrinsics[4] params['center_x' ] = intrinsics[2] params['center_y' ] = intrinsics[5] #params['focal_length_pixels'] = 0 # TODO: What units are used? params['k1'] = distortion[0] params['k2'] = distortion[1] params['p1'] = distortion[2] params['p2'] = distortion[3] params['skew'] = 0.0 params['aspect_ratio'] = 1.0 return params def write_vw_params_file(params, path): vw_file = open(path, 'w') vw_file.write('fu = '+ str(params['focal_length_x'])+'\n') vw_file.write('fv = '+ str(params['focal_length_y'])+'\n') vw_file.write('cu = '+ str(params['center_x'])+'\n') vw_file.write('cv = '+ str(params['center_y'])+'\n') vw_file.write('u_direction = 1 0 0\n') vw_file.write('v_direction = 0 1 0\n') vw_file.write('w_direction = 0 0 1\n') vw_file.write('C = 0 0 0\n') # This tool only computes intrinsic parameters! vw_file.write('R = 1 0 0 0 1 0 0 0 1\n') vw_file.write('k1 = '+ str(params['k1'])+'\n') vw_file.write('k2 = '+ str(params['k2'])+'\n') vw_file.write('p1 = '+ str(params['p1'])+'\n') vw_file.write('p2 = '+ str(params['p2'])+'\n') vw_file.close() def get_full_image_list(options): '''Make a list of all the images specified by the wildcard''' handle = file(options.xml_list_path, 'r') text = handle.read() handle.close() start = text.find('<images>') stop = text.find('</images>') image_text = text[start+len('<images>'):stop] paths = image_text.split() return paths def convert_outputs(options): '''Translates the OpenCV output into some more useful formats''' # Parse the OpenCV output params = parse_cv_yaml_file(options.ocv_params_path) # Write a .tsai file write_vw_params_file(params, options.vw_params_path) # If the user requested it, make a duplicate of the vw params file for each input image. if options.duplicate_param_files: all_images = get_full_image_list(options) all_images = [os.path.basename(x) for x in all_images] for name in all_images: output_path = os.path.join(options.output_folder, name + '.tsai') shutil.copy(options.vw_params_path, output_path) # Write the Theia output file theia_file = open(options.theia_params_path, 'w') mean_focal_length = (params['focal_length_x']+params['focal_length_y'])/2.0 param_list = [options.image_wildcard, mean_focal_length, params['center_x'], params['center_y'], params['aspect_ratio'], params['skew'], params['k1'], params['k2']] param_list = [str(x) for x in param_list] # Cast to strings for output s = " ".join(param_list) theia_file.write(s) theia_file.close() #------------------------------------------------------------------------------ def main(argsIn): try: # Use parser that ignores unknown options usage = "usage: camera_calibrate [options] <output folder> <board height> <board width> <image wildcard>" parser = optparse.OptionParser(usage=usage) parser.add_option('--box-size-cm', dest='box_size_cm', default=None, type=float, help='Size of the checkerboard boxes in centimeters. Required for the results to be in real world values.') parser.add_option("--suppress-output", action="store_true", default=False, dest="suppress_output", help="Suppress output of sub-calls.") parser.add_option("--duplicate-files", action="store_true", default=False, dest="duplicate_param_files", help="Makes duplicate copies of the VisionWorkbench parameter file for each input camera.") parser.add_option("--overwrite", action="store_true", default=False, dest="overwrite", help="Overwrite any partial computation results on disk.") # This call handles all the parallel_mapproject specific options. (options, args) = parser.parse_args(argsIn) # Check the required positional arguments. if len(args) < 1: parser.print_help() parser.error("Missing output folder.\n" ); if len(args) < 3: parser.print_help() parser.error("Missing the checkerboard internal corner counts, one in each dimension.\n" ); if len(args) < 4: parser.print_help() parser.error("Missing input image wildcard path.\n" ); # Store the positional input parameters options.output_folder = args[0] options.board_size = (int(args[1]), int(args[2])) options.image_wildcard = args[3] #print args #print options.image_wildcard # Store some other things in options to make passing arguments easier options.xml_list_path = os.path.join(options.output_folder, 'ocv_image_list.xml' ) options.ocv_params_path = os.path.join(options.output_folder, 'ocv_cam_params.yml' ) options.vw_params_path = os.path.join(options.output_folder, 'vw_cam_params.tsai' ) options.theia_params_path = os.path.join(options.output_folder, 'solve_cam_params.txt') except optparse.OptionError as msg: raise Usage(msg) startTime = time.time() if not (os.path.exists(options.output_folder)): os.makedirs(options.output_folder) # Call the image list generation tool make_image_list(options) # Call the calibration tool calibrate_camera(options) # Generate camera_solve and VW compatible camera files. convert_outputs(options) endTime = time.time() print("Finished in " + str(endTime - startTime) + " seconds.") if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/Tools/camera_footprint.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// Compute the footprint of a camera on a DEM/datum, print it, and optionally /// write a KML file. #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Core/FileUtils.h> #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Core/StringUtils.h> #include <vw/Camera/PinholeModel.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/Cartography/CameraBBox.h> #include <vw/FileIO/KML.h> #include <vw/Cartography/shapeFile.h> #include <limits> #include <cstring> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> namespace fs = boost::filesystem; namespace po = boost::program_options; using namespace vw; using namespace vw::camera; using namespace vw::cartography; struct Options : public vw::GdalWriteOptions { std::string image_file, camera_file, stereo_session, bundle_adjust_prefix, datum_str, dem_file, target_srs_string, output_shp, output_kml; bool quick; }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("datum", po::value(&opt.datum_str)->default_value(""), "Use this datum to interpret the heights. Options: WGS_1984, D_MOON (1,737,400 " "meters), D_MARS (3,396,190 meters), MOLA (3,396,000 meters). Also accepted: Earth " "(=WGS_1984), Mars (=D_MARS), Moon (=D_MOON).") ("t_srs", po::value(&opt.target_srs_string)->default_value(""), "Specify the output projection (PROJ or WKT string).") ("quick", po::bool_switch(&opt.quick)->default_value(false), "Use a faster but less accurate computation.") ("output-shp", po::value(&opt.output_shp), "Save the convex hull of the points sampled on the camera footprint as a shapefile " "with this name.") ("output-kml", po::value(&opt.output_kml), "Create an output KML file at this path.") ("session-type,t", po::value(&opt.stereo_session)->default_value(""), "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.") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Use the camera adjustment obtained by previously running bundle_adjust with this " "output prefix.") ("dem-file", po::value(&opt.dem_file)->default_value(""), "Instead of using a longitude-latitude-height box, sample the surface of this DEM."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("camera-image", po::value(&opt.image_file)) ("camera-model", po::value(&opt.camera_file)); po::positional_options_description positional_desc; positional_desc.add("camera-image",1); positional_desc.add("camera-model",1); std::string usage("[options] <camera-image> <camera-model>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.image_file.empty()) vw_throw(ArgumentErr() << "Missing input image.\n" << usage << general_options); if (boost::iends_with(opt.image_file, ".cub") && opt.stereo_session == "") opt.stereo_session = "isis"; // Need this to be able to load adjusted camera models. That will happen // in the stereo session. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; // Must specify the DEM or the datum if (opt.dem_file.empty() && opt.datum_str.empty() && opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "Need to provide a DEM, a datum, or a t_srs string.\n" << usage << general_options); // This is a bug fix. The user by mistake passed in an empty projection string. if (!vm["t_srs"].defaulted() && opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "The value of --t_srs is empty. Then it must not be set at all.\n"); } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); asp::SessionPtr session(asp::StereoSessionFactory::create (opt.stereo_session, // may change inside opt, opt.image_file, opt.image_file, opt.camera_file, opt.camera_file, "", "", false)); // Do not allow promotion from normal to map projected session if (opt.camera_file.empty()) vw_throw(ArgumentErr() << "Missing input camera.\n"); boost::shared_ptr<CameraModel> cam = session->camera_model(opt.image_file, opt.camera_file); // The input nodata value float input_nodata_value = -std::numeric_limits<float>::max(); vw::read_nodata_val(opt.image_file, input_nodata_value); // Just get the image size vw::Vector2i image_size = vw::file_image_size(opt.image_file); // Perform the computation GeoReference target_georef; BBox2 footprint_bbox; float mean_gsd = 0.0; std::vector<Vector3> llh_coords; if (opt.dem_file.empty()) { // No DEM available, intersect with the datum. // Initialize the georef/datum bool have_user_datum = (opt.datum_str != ""); cartography::Datum datum(opt.datum_str); target_georef = GeoReference(datum); vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, datum, target_georef); vw_out() << "Using georef: " << target_georef << "\n"; std::vector<Vector2> coords2; footprint_bbox = camera_bbox(target_georef, cam, image_size[0], image_size[1], mean_gsd, &coords2); for (std::size_t i=0; i<coords2.size(); ++i) { Vector3 proj_coord(coords2[i][0], coords2[i][1], 0.0); llh_coords.push_back(target_georef.point_to_geodetic(proj_coord)); } } else { // DEM provided, intersect with it // Load the DEM float dem_nodata_val = -std::numeric_limits<float>::max(); vw::read_nodata_val(opt.dem_file, dem_nodata_val); ImageViewRef<PixelMask<float>> dem = create_mask(DiskImageView<float>(opt.dem_file), dem_nodata_val); GeoReference dem_georef; if (!read_georeference(dem_georef, opt.dem_file)) vw_throw(ArgumentErr() << "Missing georef.\n"); target_georef = dem_georef; // return box in this projection vw_out() << "Using georef: " << target_georef << "\n"; int num_samples = 100; // should be enough footprint_bbox = camera_bbox(dem, dem_georef, target_georef, cam, image_size[0], image_size[1], mean_gsd, opt.quick, &llh_coords, num_samples); for (std::size_t i = 0; i < llh_coords.size(); i++) llh_coords[i] = target_georef.datum().cartesian_to_geodetic(llh_coords[i]); } // Print out the results vw_out() << "Computed footprint bounding box:\n" << footprint_bbox << "\n"; vw_out() << "Computed mean gsd: " << mean_gsd << "\n"; if (opt.output_shp != "") { // Must convert to projected coordinates std::vector<vw::Vector3> proj_coords(llh_coords.size()); for (std::size_t i = 0; i < llh_coords.size(); i++) proj_coords[i] = target_georef.geodetic_to_point(llh_coords[i]); vw::geometry::dPoly poly; vw::geometry::convexHull(proj_coords, poly); bool has_geo = true; vw::vw_out() << "Writing: " << opt.output_shp << "\n"; vw::geometry::write_shapefile(opt.output_shp, has_geo, target_georef, poly); } if (opt.output_kml != "") { // Create the KML file if specified by the user KMLFile kml(opt.output_kml, "footprint"); const bool HIDE_LABELS = true; std::string base = "http://maps.google.com/mapfiles/kml/shapes/"; std::string dot_cir = base + "placemark_circle.png"; std::string dot_hlt = base + "placemark_circle_highlight.png"; kml.append_style("dot", "", 1.2, dot_cir, HIDE_LABELS); kml.append_style("dot_highlight", "", 1.4, dot_hlt); kml.append_stylemap("placemark", "dot", "dot_highlight"); kml.append_line(llh_coords, "intersections", "placemark"); vw_out() << "Writing: " << opt.output_kml << "\n"; kml.close_kml(); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/camera_solve ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' A helper tool to streamline the process of solving for pinhole camera models using Theia and ASP. ''' import sys, os, re import shutil, subprocess, string, time, errno, optparse, glob, shlex, platform #import register_local_cameras if sys.version_info < (2, 6, 0): print('\nERROR: Must use Python 2.6 or greater.') sys.exit(1) # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils # Prepend the path to build_reconstruction (for local dev builds) base_dir = asp_system_utils.findTheiaInstallDir() os.environ["PATH"] = os.path.join(base_dir, 'bin') + os.pathsep + os.environ["PATH"] # Prepend libexecpath (for packaged ASP) os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] def get_paths_with_extension(input_list, output_folder, new_extension, prefix=""): '''Given a list of input files, generates a list of output paths with an extension appended''' output_paths = [] for path in input_list: filename = os.path.basename(path) output_path = os.path.join(output_folder, prefix + filename + new_extension) output_paths.append(output_path) return output_paths def prep_input_images(options): '''Make sure all the input images can be loaded by Theia. This is done by making symlinks or conversions of all input images in the output directory.''' # List of image types that Theia cannot read and must be translated convert_ext_list = ['.cub'] # Set up the image wildcard string required by Theia. common_ext = os.path.splitext(options.input_images[0])[1] options.image_wildcard = os.path.join(os.path.abspath(options.output_folder), '*' + common_ext) for input_path in options.input_images: ext = os.path.splitext(input_path)[1] if not (ext == common_ext): raise Exception('All input images must have the same extension!') # If needed we could use gdal_translate to convert the file if ext in convert_ext_list: raise Exception('This image type is not yet supported!') # Make a symlink to this file in the output folder filename = os.path.basename(input_path) symlink_path = os.path.join(options.output_folder, filename) try: os.remove(symlink_path) # Redo the symlink each time except: pass os.symlink(os.path.abspath(input_path), symlink_path) return def generate_flagfile(options): '''Generate a Theia config file based on user options''' match_dir = os.path.join(options.output_folder, 'match_dir') match_path = os.path.join(options.output_folder, 'theia_matches') output_path = os.path.join(options.output_folder, 'theia_reconstruction.dat') flagfile_path = os.path.join(options.output_folder, 'theia_flagfile.txt') options.theia_output_path = output_path options.flagfile_path = flagfile_path options.theia_match_dir = match_dir # Control solving for intrinsic parameters intrinsics_options = 'NONE' if options.solveIntrinsic: # We read focal length and principal point so let those vary # - Enabling radial distortion *significantly* changes the results! intrinsics_options = 'FOCAL_LENGTH|PRINCIPAL_POINTS' #intrinsics_options = 'FOCAL_LENGTH|PRINCIPAL_POINTS|RADIAL_DISTORTION' # Make sure the output file has the latest options if os.path.exists(options.flagfile_path): os.remove(options.flagfile_path) def pathPrint(value): '''Simple function to print an absolute path or nothing''' if value: return os.path.abspath(value) else: return '' def tfPrint(value): '''Simple function to convert boolean to 'true' or 'false' ''' if value: return 'true' else: return 'false' if options.existing_theia_flagfile: # Replace the file path options image_line = '--images=' +options.image_wildcard calib_line = '--calibration_file=' +pathPrint(options.theia_camera_param_path) output_match_line = '--output_matches_file=' +pathPrint(match_path) output_line = '--output_reconstruction='+pathPrint(output_path) # Open the input file input_handle = open(options.existing_theia_flagfile, 'r') output_string = '' for line in input_handle: out_line = line # Swap out specific file paths, leaving all the other options. if '--images=' in line: out_line = image_line +'\n' if '--calibration_file=' in line: out_line = calib_line +'\n' if '--output_matches_file=' in line: out_line = output_match_line +'\n' if '--output_reconstruction=' in line: out_line = output_line +'\n' output_string += out_line input_handle.close() else: # The user did not provide a flag file, generate our own from defaults. output_string = ''' ############### Input/Output ############### # Input/output files. # Set these if a matches file is not present. Images should be a filepath with a # wildcard e.g., /home/my_username/my_images/*.jpg --images='''+options.image_wildcard+''' --output_matches_file='''+pathPrint(match_path)+''' # If a matches file has already been created, set the filepath here. This avoids # having to recompute all features and matches. --matches_file='''+options.match_wildcard+''' # The calibration file indicates possibly known calibration e.g., from EXIF or # explicit calibration. Theia attempts to extract EXIF focal lengths if calibration # is not supplied for a given image. --calibration_file='''+pathPrint(options.theia_camera_param_path)+''' --output_reconstruction='''+pathPrint(output_path)+''' ############### Multithreading ############### # Set to the number of threads you want to use. --num_threads=16 ############### Feature Extraction ############### --descriptor=SIFT --feature_density=NORMAL ############### Matching Options ############### # Perform matching out-of-core. If set to true, the matching_working_directory # must be set to a valid, writable directory (the directory will be created if # it does not exist). Set to false to perform all-in-memory matching. --match_out_of_core=true # During feature matching, features are saved to disk so that out-of-core # matching may be performed. This directory specifies which directory those # features should be saved to. # This should be left empty if specified on the command line. --matching_working_directory=''' + pathPrint(match_dir) + ''' # During feature matching we utilize an LRU cache for out-of-core matching. The size # of that cache (in terms of number of images) is controlled by this parameter. The # higher this number the more memory is required. --matching_max_num_images_in_cache=128 --matching_strategy=CASCADE_HASHING --lowes_ratio=0.75 --min_num_inliers_for_valid_match=30 --max_sampson_error_for_verified_match=4.0 --bundle_adjust_two_view_geometry=true --keep_only_symmetric_matches=true # Global descriptor extractor settings. The global image descriptors are used to # speed up matching by selecting the K most similar images for each image, and # only performing feature matching with these images. --num_nearest_neighbors_for_global_descriptor_matching=100 --num_gmm_clusters_for_fisher_vector=16 --max_num_features_for_fisher_vector_training=1000000 ############### General SfM Options ############### --reconstruction_estimator=GLOBAL --min_track_length=2 --max_track_length=50 --reconstruct_largest_connected_component=false # Set to true if all views were captured with the same camera. If true, then a # single set of camera intrinsic parameters will be used for all views in the # reconstruction. --> Always true for ASP use, as solving for intrinsics from one # image is not very reliable. --shared_calibration=true # If set to true, only views with known calibration are reconstructed. --only_calibrated_views=false ############### Global SfM Options ############### --global_position_estimator=NONLINEAR --global_rotation_estimator=ROBUST_L1L2 --post_rotation_filtering_degrees=15.0 # This refinement is very unstable for rotation-only motions so # it is advised that this is set to false for these motions. --refine_relative_translations_after_rotation_estimation=true # If true, only cameras that are well-conditioned for position estimation will # be used for global position estimation --extract_maximal_rigid_subgraph=false # Filter the relative translations with the 1DSfM filter to remove potential # outliers in the relative pose measurements. --filter_relative_translations_with_1dsfm=true # Nonlinear position estimation options --position_estimation_min_num_tracks_per_view=0 --position_estimation_robust_loss_width=0.1 # After estimating camera poses, we perform triangulation, then BA, # then filter out bad points. This controls how many times we repeat # this process. --num_retriangulation_iterations=1 ############### Incremental SfM Options ############### --absolute_pose_reprojection_error_threshold=8 --partial_bundle_adjustment_num_views=20 --full_bundle_adjustment_growth_percent=5 --min_num_absolute_pose_inliers=30 ############### Bundle Adjustment Options ############### # Set this parameter to a value other than NONE if you want to utilize a robust # cost function during bundle adjustment. This can increase robustness to outliers # during the optimization. --bundle_adjustment_robust_loss_function=CAUCHY # Set this value to determine the reprojection error in pixels at which # robustness begins (if a robust cost function is being used). --bundle_adjustment_robust_loss_width=10.0 # Set this parameter to change which camera intrinsics should be # optimized. Valid options are NONE, ALL, FOCAL_LENGTH, PRINCIPAL_POINTS, # RADIAL_DISTORTION, ASPECT_RATIO, and SKEW. This parameter can be set using a # bitmask (with no spaces) e.g., FOCAL_LENGTH|RADIAL_DISTORTION --intrinsics_to_optimize='''+intrinsics_options+''' # After BA, remove any points that have a reprojection error greater # than this. --max_reprojection_error_pixels=20.0 ############### Triangulation Options ############### --min_triangulation_angle_degrees=0.5 --triangulation_reprojection_error_pixels=25.0 --bundle_adjust_tracks=true ############### Reconstruction Type ############### # It can be GLOBAL or INCREMENTAL. The second is more robust. --reconstruction_estimator=GLOBAL ############### Logging Options ############### # Logging verbosity. --logtostderr # Increase this number to get more verbose logging. --v=3 ''' # See if to overwrite some of the above if options.theia_overrides != "": lines = output_string.splitlines() for count in range(len(lines)): line = lines[count] m = re.match(r"(^.*?=)(.*?$)", line) if not m: continue name = m.group(1) old_val = m.group(2) for repl in options.theia_overrides.split(): m = re.match(r"(^.*?=)(.*?$)", repl) curr_name = m.group(1) new_val = m.group(2) if name != curr_name: continue new_line = name + new_val if line != new_line: print("Overriding: " + line) print("with: " + new_line) line = new_line lines[count] = line output_string = "\n".join(lines) # Now have a string to write to the flag file, however we got it. handle = open(flagfile_path, 'w') handle.write(output_string) handle.close() return flagfile_path def build_reconstruction(options): '''Call Theia to generate a 3D camera reconstruction''' # Make sure the input images are set up prep_input_images(options) # Create the Theia config file! options.match_wildcard='' flagfile_path = generate_flagfile(options) if (not os.path.exists(options.theia_output_path)) or options.overwrite: abs_flag_path = os.path.abspath(flagfile_path) cmd = ['build_reconstruction', '--flagfile', abs_flag_path, '-v', '2'] if sys.platform == 'linux' or sys.platform == 'darwin': cmd += ['--random_seed', '1'] if options.threads > 0: cmd += ['--num_threads', str(options.threads)] verbose = False print (' '.join(cmd)) asp_system_utils.generic_run(cmd, verbose) # Theia appends a tag to the requested output file, just rename the file. theia_temp_output_path = options.theia_output_path + '-0' if not os.path.exists(theia_temp_output_path): raise Exception('Theia failed to generate a camera reconstruction') shutil.move(theia_temp_output_path, options.theia_output_path) return options.theia_output_path # This function is not being used but if we ever decide to support large image sets # we may need to switch to using it. Since we don't use it, it can sit in an incomplete state. def guided_build_reconstruction(options): '''Split the reconstruction over multiple Theia tool calls to provide more control over the process''' # Make sure the input images are set up prep_input_images(options) # TODO: Skip existing files # Extract features for all of the input images. # - TODO: Can run this in parallel to use more CPUs, only hits 400% now. # - match_features expects these to be in the same folder as the source images # - TODO: Experiment with feature options and read these from the flagfile which # the user can currently pass in. options.feature_folder = options.output_folder #os.path.join(options.output_folder, 'features') #if not os.path.exists(options.feature_folder): # os.makedirs(options.feature_folder) cmd = ['extract_features', '--input_images',options.image_wildcard, '--features_output_directory',options.feature_folder, '--num_threads','12', '--descriptor','SIFT'] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) # TODO: Generate lists of images which we think should match # - Can even have "primary" images and "backup" images to reduce # the number of links. # - Once we have the lists, we need to selectively call match_features for each pairing. options.matches_folder = options.output_folder #os.path.join(options.output_folder, 'matches') #if not os.path.exists(options.matches_folder): # os.makedirs(options.matches_folder) match_path = os.path.join(os.path.abspath(options.matches_folder), 'A.match') features_wildcard = os.path.join(os.path.abspath(options.feature_folder), '*.features') cmd = ['match_features', '--input_features',features_wildcard, '--output_matches_file',match_path, '--calibration_file',options.theia_camera_param_path, '--num_threads','12', '--matching_strategy','BRUTE_FORCE', '--lowes_ratio','0.8'] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) # Set this so it can be included in the flag file options.match_wildcard = os.path.join(os.path.abspath(options.feature_folder), '*.match') # Create the Theia config file! flagfile_path = generate_flagfile(options) if (not os.path.exists(options.theia_output_path)) or options.overwrite: abs_flag_path = os.path.abspath(flagfile_path) cmd = ['build_reconstruction', '--flagfile', abs_flag_path] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) # Theia appends a tag to the requested output file, just rename the file. theia_temp_output_path = options.theia_output_path + '-0' if not os.path.exists(theia_temp_output_path): raise Exception('Theia failed to generate a camera reconstruction') shutil.move(theia_temp_output_path, options.theia_output_path) return options.theia_output_path def update_tsai_file(input_camera_path, new_pose_path, output_camera_path): '''Copies a .tsai camera file with an updated position from another .tsai camera file.''' # Read in the lines of interest from new_pose_path # - We never update the distortion parameters since we won't be using # exactly the same lens distortion model. scaled_keys = ['fu', 'fv', 'cu', 'cv'] # keys that we will multiply by pitch keys = [] # The values we want to copy keys.extend(scaled_keys) keys.extend(['C', 'R']) # Skip non-existent files if not os.path.exists(new_pose_path): print('Skipping camera with failed reconstruction: ' + new_pose_path) return f_in = open(new_pose_path, 'r') replacements = dict() for line in f_in: for k in keys: # Look for target values if (k+' =') in line: replacements[k] = line f_in.close() # Find the pitch to scale some values by pitch = 1.0 f_in = open(input_camera_path, 'r') for line in f_in: for k in keys: # Look for target values matches = re.match(r'^pitch = (.*?)$', line) if matches: pitch = float(matches.group(1)) f_in.close() # Copy each line of the input file as-is except for the updated fields f_in = open(input_camera_path, 'r') f_out = open(output_camera_path, 'w') for line in f_in: thisLine = line for k in keys: # See if this is a line we should replace if (k+' =') in line: thisLine = replacements[k] # See if to scale by the pitch if k in scaled_keys: matches = re.match(r'^.*? = (.*?)$', thisLine) if matches: val = float(matches.group(1)) thisLine = k + ' = ' + str(val*pitch) + "\n" f_out.write(thisLine) f_in.close() f_out.close() def export_cameras_to_vw(options): """Convert from Theia's camera format to VW's pinhole format.""" # Need to wrap the image wildcard in quotes so it does not get expanded too early! cmd = ['export_reconstruction_to_vw', '--reconstruction', options.theia_output_path, '--output_directory', options.output_folder, '--images', options.image_wildcard] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) # Running the tool should generate a .tsai file for each input image options.theia_camera_models = get_paths_with_extension(options.input_images, options.output_folder, '.tsai') all_found = True good_images = [] good_cameras = [] for i in range(0,len(options.theia_camera_models)): model_path = options.theia_camera_models[i] if not os.path.exists(model_path): all_found = False print('Failed to generate model file: ' + model_path) continue # Handle possibility of multiple camera files if len(options.camera_param_paths) > 1: this_vw_camera_path = options.camera_param_paths[i] else: this_vw_camera_path = options.camera_param_paths[0] # Overwrite the file Theia wrote with a copy of the user's camera file with # position and orientation replaced with the Theia values. update_tsai_file(this_vw_camera_path, model_path, model_path) good_images.append(options.input_images[i]) good_cameras.append(model_path) if not all_found: print('Warning: Failed to extract camera models for all images.') return (good_images, good_cameras) def run_bundle_adjust(options, good_images, good_cameras): '''Run the ASP bundle adjust program to move the camera models into global coordinates''' output_prefix = os.path.join(options.output_folder, 'asp_ba_out') if True: # options.use_theia_matches # Try to export Theia matches to VW so that matching only needs to happen once. # If this fails, bundle_adjust will try to find matches. cmd = ['export_matches_file_to_vw', '-theia_match_dir', options.theia_match_dir, '-vw_output_prefix', output_prefix] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) # Some extra bundle adjust params have_camera_positions = options.bundle_params and \ ('camera-positions' in options.bundle_params) cam_type = 'pinhole' if len(options.gcp_files) > 0 or have_camera_positions: cam_type = 'nadirpinhole' # This is better, but can only use with global coordinates. ba_params = ['--inline-adjustments', '-t', cam_type, '--datum', options.datum] if options.solveIntrinsic: # Add flag to bundle adjust but make sure it is not added twice ba_params += ['--solve-intrinsics'] if options.bundle_params and ('--solve-intrinsics' in options.bundle_params): options.bundle_params = options.bundle_params.replace('--solve-intrinsics', '') if options.bundle_params: ba_params += shlex.split(options.bundle_params) # Split on spaces but keep quoted parts together. # Always run this step as otherwise there was no point to calling the tool. # Run ASP's bundle_adjust tool. The --no-datum option is very important # as we start with the cameras in some arbitrary coordinate system. cmd = ['bundle_adjust', '--no-datum'] + good_images + good_cameras if len(options.gcp_files) > 0: cmd += options.gcp_files if '--transform-cameras-using-gcp' not in ba_params and \ '--transform-cameras-with-shared-gcp' not in ba_params: # Try to transform the cameras using GCP seen in at least two images ba_params += ['--transform-cameras-with-shared-gcp'] cmd += ['-o', output_prefix] cmd += ba_params if '--threads' not in cmd: cmd += ['--threads', str(options.threads)] verbose = False print (' '.join(cmd)) asp_system_utils.generic_run(cmd, verbose) # The previous call should create a .tsai file for every input image in the output folder ba_camera_models = get_paths_with_extension(options.input_images, options.output_folder, '.tsai', prefix='asp_ba_out-') output_paths = get_paths_with_extension(options.input_images, options.output_folder, '.final.tsai', prefix='') # Move the output files to their final location all_found = True finalCameras = [] for (model_path, output_path) in zip(ba_camera_models, output_paths): if not os.path.exists(model_path): all_found = False print('Failed to generate model file: ' + model_path) continue shutil.move(model_path, output_path) finalCameras.append(output_path) print('--> Wrote output camera model: ' + output_path) if not all_found: print('Warning: Failed to produce camera models for all images. The resulting ' + 'subset is likely still usable. Inspect the input images. Consider ' + 'restricting the solving to a smaller group or adding more images with ' + 'intermediate properties.') # Write the final cameras list, for user convenience finalCamList = output_prefix + '-final_camera_list.txt' with open(finalCamList, 'w') as f: for cam in finalCameras: f.write(cam + '\n') print("List of successfully used images: " + output_prefix + '-image_list.txt') print("List of final bundle-adjusted cameras: " + finalCamList) # TODO: Move this somewhere else def parse_vw_tsai_file(path): '''Reads a Vision Workbench .tsai camera file and populates a dictionary with information''' output = dict() f = open(path, 'r') for line in f: # We are looking for lines in the form of NAME = BLAH BLAH BLAH parts = line.split() if len(parts) == 3: # One parameter output[parts[0]] = float(parts[2]) else: if len(parts) > 2: # List of parameters output[parts[0]] = [float(x) for x in parts[2:]] # Else don't read it. f.close() return output def generate_theia_camera_file(input_images, vw_cam_files, theia_cam_file_out): '''Generate zero-distortion camera configs for Theia with one line per input file on disk. Also strip out any folder paths which confuse Theia. We use zero distortion because Theia only supports one distortion model (unlike ASP) and we will run bundle_adjust to fine-tune the Theia outputs by taking into account the distortion model.''' # Make a list of parameters for each camera params = [] for path in vw_cam_files: # Read in the focal length and center point tsai_data = parse_vw_tsai_file(path) pitch = tsai_data['pitch'] # Use to convert other data to pixel units focal_length = ((tsai_data['fu'] + tsai_data['fv']) / 2.0) / pitch center_x = tsai_data['cu'] / pitch center_y = tsai_data['cv'] / pitch params.append( (pitch, focal_length, center_x, center_y) ) # Write a nearly identical line for each input image num_images = len(input_images) with open(theia_cam_file_out, "w") as fh: fh.write("{\n") fh.write('"priors" : [\n') for i in range(0, num_images): image = input_images[i] if len(vw_cam_files) == 1: theseParams = params[0] else: theseParams = params[i] focal_length = theseParams[1] center_x = theseParams[2] center_y = theseParams[3] width, height = asp_image_utils.getImageSize(image) base_image = os.path.basename(image) # Strip the folder fh.write('{"CameraIntrinsicsPrior" : {\n') fh.write('"image_name" : "' + base_image + '",\n') fh.write('"width" : ' + str(width) + ",\n") fh.write('"height" : ' + str(height) + ",\n") fh.write('"focal_length" : ' + str(focal_length) + ",\n") fh.write('"principal_point" : [' + \ str(center_x) + ", " + \ str(center_y) + "],\n") fh.write('"camera_intrinsics_type" : "PINHOLE"\n') if i < num_images - 1: fh.write("}},\n") else: fh.write("}}\n") fh.write("]\n") fh.write("}\n") return os.path.abspath(theia_cam_file_out) # Return the path to the Theia camera file #------------------------------------------------------------------------------ def main(argsIn): # Before anything else, make sure the required tools are installed. try: asp_system_utils.checkIfToolExists('build_reconstruction') asp_system_utils.checkIfToolExists('export_reconstruction_to_vw') asp_system_utils.checkIfToolExists('bundle_adjust') except: print('Did not detect required executables! Check your PATH and ASP installation.') return -1 try: # Use parser that ignores unknown options usage = "usage: camera_solve [options] <output folder> <input images>" extra_info = ("Don't forget that options to ASP's bundle_adjust tool (which is the " "final solution refinement step) can " "be passed in using the '--bundle-adjust-params' option. " "Significantly, the '--camera-positions' " "option is one of two ways to move the cameras to global " "coordinates (the other is via gcp files.") parser = optparse.OptionParser(usage=usage, epilog=extra_info) parser.add_option("--suppress-output", action="store_true", default=False, dest="suppressOutput", help="Suppress output of sub-calls.") parser.add_option("--overwrite", action="store_true", default=False, dest="overwrite", help="Overwrite any partial computation results on disk.") parser.add_option("--reuse-theia-matches", action="store_true", default=False, dest="use_theia_matches", help="Pass the Theia IP matches to bundle adjustment instead " + \ "of recreating them. This is ignored as it is the default.") parser.add_option('--datum', dest='datum', default='wgs84', 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)') parser.add_option('--calib-file', dest='camera_param_paths', default=None, help=('Path to an ASP compatible .tsai file containing camera model information.'+ ' See the ASP documentation for details. The position and pose information will be ignored.'+ ' To use a unique file for each input image, pass a space-separated list of files'+ ' surrounded by quotes.')) parser.add_option('--gcp-file', action="store_true", default=False, help='Obsolete option for specifying GCP. One or more GCP files will be ' + \ 'recognized and loaded if ending with .gcp, without this option.') # Solving for intrinsics is disabled until either Theia or our bundle adjustment tool supports it! parser.add_option("--solve-intrinsics", action="store_true", default=False, dest="solveIntrinsic", help="Use the optimizer to improve the intrinsic camera parameter estimates.") parser.add_option('--bundle-adjust-params', dest='bundle_params', default=None, help='Params string (in single quotes '') passed to the bundle_adjust tool') parser.add_option('--theia-overrides', dest='theia_overrides', default='', 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.') parser.add_option('--theia-flagfile', dest='existing_theia_flagfile', default=None, help='Path to a custom Theia flag file to fine-tune its operation. File paths specified in this file are ignored.') parser.add_option('--theia-retries', type=int, dest='theia_retries', default=3, help='How many times to retry solving for cameras.') parser.add_option('--threads', type=int, dest='threads', default=0, help='Number of threads to use. If set to 0, will use 16 threads.') # This call handles all the parallel_mapproject specific options. (options, args) = parser.parse_args(argsIn) options.gcp_files = [] # Collect all gcp files in args. They must end in .gcp or .GCP args_no_gcp = [] # store here for the moment the non-gcp files for arg in args: if arg.lower().endswith('.gcp'): options.gcp_files.append(arg) else: args_no_gcp.append(arg) args = args_no_gcp[:] args_no_gcp = None # Remove continuation lines in the string (those are convenient # for readability in docs) if options.bundle_params is not None: options.bundle_params = options.bundle_params.replace('\\', '') options.bundle_params = options.bundle_params.replace('\n', ' ') # Check the required positional arguments. if len(args) < 1: parser.print_help() parser.error("Error: Missing output folder.\n" ); if len(args) < 3: parser.print_help() parser.error("Error: At least two input images are required.\n" ); # Store the positional input parameters options.output_folder = args[0] options.input_images = args[1:] asp_system_utils.mkdir_p(options.output_folder) # If we don't have input camera params we have to solve for them. if not options.camera_param_paths: if not options.solveIntrinsic: print ('Since no calib-file provided, setting --solve-intrinsics.') options.solveIntrinsic = True else: # Handle if a list of camera files were passed in. options.camera_param_paths = options.camera_param_paths.split() if (len(options.camera_param_paths) > 1): # Num cameras must equal num images if (len(options.camera_param_paths) != len(options.input_images)): print('Error: If multiple camera files are used, there must be one per input image.') return -1 # Don't use intrinsic solving with multiple models, it is too fragile. if options.solveIntrinsic: print('Error: Solving for intrinsics is not supported with multiple camera models.') return -1 # Otherwise rewrite a zero-distortion copy of the camera param file which Theia can read. alt_param_path = os.path.join(options.output_folder, 'expanded_camera_configs.json') options.theia_camera_param_path \ = generate_theia_camera_file(options.input_images, options.camera_param_paths, alt_param_path) except optparse.OptionError as msg: raise Usage(msg) startTime = time.time() # Step 1: Call Theia's build_reconstruction tool. # Theia's reconstruction tool sometimes fails for no apparent reason but # this does not happen often. If it fails, try a few more times # to see if we can get it to succeed. try_counter = 0 for i in range(0,options.theia_retries): try: build_reconstruction(options) break except: # Theia failed, but give it another shot. if i == options.theia_retries-1: print('Error: Theia failed to generate a camera reconstruction!') return -1 else: print('Retrying Theia solution...') #guided_build_reconstruction(options) print('Finished generating reconstruction using Theia') # Step 2: Call an extra tool to export Theia's camera output. (good_images, good_cameras) = export_cameras_to_vw(options) print('Finished extracting camera models') # Step 3: Call ASP's bundle_adjust to adjust for lens distortion and # to move the cameras into global coordinates if possible. run_bundle_adjust(options, good_images, good_cameras) endTime = time.time() print("Finished in " + str(endTime - startTime) + " seconds.") if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/Tools/corr_eval.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file corr_eval.cc // Evaluate the quality of produced correlation using several metrics. // See CorrEval.h and this tool's manual for more info. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/GdalUtils.h> #include <vw/Stereo/PreFilter.h> #include <vw/Stereo/CorrEval.h> #include <vw/FileIO/FileUtils.h> namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options : vw::GdalWriteOptions { std::string left_image, right_image, disparity, output_prefix, metric; vw::Vector2i kernel_size; bool round_to_int; int prefilter_mode, sample_rate; float prefilter_kernel_width; }; // Create the selected prefilter class and apply the filter to an image. // Return an ImageRef, unlike prefilter_image() in VW, which returns // an in-memory image, which can be huge. namespace vw { namespace stereo { template <class ImageT> ImageViewRef<typename ImageT::pixel_type> prefilter_image_ref(ImageViewBase<ImageT> const& image, PrefilterModeType prefilter_mode, float prefilter_width) { if (prefilter_mode == PREFILTER_LOG){ // LOG stereo::LaplacianOfGaussian prefilter(prefilter_width); return prefilter.filter(image); } if (prefilter_mode == PREFILTER_MEANSUB){ // Subtracted mean stereo::SubtractedMean prefilter(prefilter_width); return prefilter.filter(image); } //Default: PREFILTER_NONE stereo::NullOperation prefilter; return prefilter.filter(image); } }} void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("kernel-size", po::value(&opt.kernel_size)->default_value(vw::Vector2i(21, 21),"21 21"), "The dimensions of image patches. These must be positive odd numbers.") ("metric", po::value(&opt.metric)->default_value("ncc"), "The metric to use to evaluate the quality of correlation. Options: ncc, stddev.") ("prefilter-mode", po::value(&opt.prefilter_mode)->default_value(0), "Prefilter mode. This is the same prefilter as in stereo correlation with " "the asp_bm method. Options: 0 (none), 1 (subtracted mean), 2 (LoG).") ("prefilter-kernel-width", po::value(&opt.prefilter_kernel_width)->default_value(1.5), "The diameter of the Gaussian convolution kernel " "for prefilter modes 1 and 2. A value of 1.5 works " "well for LoG and 25-30 is suggested for the subtracted mean.") ("sample-rate", po::value(&opt.sample_rate)->default_value(1), "Compute the quality image only at one out of this many rows and columns, for speed. " "The output image size does not change. To shrink it, (say by 2x), run " "gdal_translate -r average -outsize 50% 50% in.tif out.tif.") ("round-to-int", po::bool_switch(&opt.round_to_int)->default_value(false), "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."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("left-image", po::value(&opt.left_image)) ("right-image", po::value(&opt.right_image)) ("disparity", po::value(&opt.disparity)) ("output-prefix", po::value(&opt.output_prefix)); po::positional_options_description positional_desc; positional_desc.add("left-image", 1); positional_desc.add("right-image", 1); positional_desc.add("disparity", 1); positional_desc.add("output-prefix", 1); std::string usage("[options] <L.tif> <R.tif> <Disp.tif> <output.tif>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (!vm.count("left-image") || !vm.count("right-image") || !vm.count("disparity") || !vm.count("output-prefix")) vw::vw_throw(vw::ArgumentErr() << "Not all required arguments were specified.\n\n" << usage << general_options); if (opt.metric != "ncc" && opt.metric != "stddev") vw::vw_throw(vw::ArgumentErr() << "Invalid value provided for --metric.\n\n" << usage << general_options); if (opt.sample_rate < 1) vw::vw_throw(vw::ArgumentErr() << "The value of --sample-rate must be positive.\n" << usage << general_options); vw::create_out_dir(opt.output_prefix); } int main(int argc, char *argv[]) { using namespace vw; Options opt; try { handle_arguments(argc, argv, opt); DiskImageView<float> left(opt.left_image); DiskImageView<float> right(opt.right_image); DiskImageView<PixelMask<vw::Vector2f>> disp(opt.disparity); float left_nodata = -32768.0; vw::read_nodata_val(opt.left_image, left_nodata); // this may not succeed float right_nodata = -32768.0; vw::read_nodata_val(opt.right_image, right_nodata); // this may not succeed vw_out() << "Left and right image no-data values: " << left_nodata << ' ' << right_nodata << "\n"; // Use 256x256 as the final output tile size. Process with bigger // tiles (512) internally via saveWithTempBigBlocks, so the prefilter // and NCC kernel have enough padding at tile boundaries. opt.raster_tile_size = Vector2i(asp::ASPGlobalOptions::rfne_tile_size(), // 256 asp::ASPGlobalOptions::rfne_tile_size()); int bigBlockSize = 512; ImageViewRef<PixelMask<float>> masked_left = create_mask(left, left_nodata); ImageViewRef<PixelMask<float>> masked_right = create_mask(right, right_nodata); int m = opt.prefilter_mode; // to write less below if (m > 0) { masked_left = vw::stereo::prefilter_image_ref(masked_left, vw::stereo::PrefilterModeType(m), opt.prefilter_kernel_width); masked_right = vw::stereo::prefilter_image_ref(masked_right, vw::stereo::PrefilterModeType(m), opt.prefilter_kernel_width); } vw::cartography::GeoReference left_georef; bool has_left_georef = read_georeference(left_georef, opt.left_image); bool has_nodata = true; std::string output_image = opt.output_prefix + "-" + opt.metric + ".tif"; vw_out() << "Writing: " << output_image << "\n"; asp::saveWithTempBigBlocks (bigBlockSize, output_image, apply_mask(vw::stereo::corr_eval(masked_left, masked_right, disp, opt.kernel_size, opt.metric, opt.sample_rate, opt.round_to_int, opt.prefilter_mode, opt.prefilter_kernel_width), left_nodata), has_left_georef, left_georef, has_nodata, left_nodata, opt, TerminalProgressCallback("asp", "\t--> Correlation quality:")); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/coverage_fraction.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file coverage_fraction.cc /// /// This tool should provide the best estimate of how much coverage a stereo /// call provided of the theoretically possible coverage. Currently it is /// based off of the percentage of the left input image. #include <asp/Core/PointUtils.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/PointUtils.h> #include <vw/Core/StringUtils.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Image/BlockImageOperator.h> #include <vw/Image/Filter.h> #include <limits> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; /// Compute the error norm from a point cloud image file. /// - This is a simpler version of the function in point2dem.cc template<int num_ch> ImageViewRef<double> error_norm(std::string const& pc_file){ // Read the error channels from the point cloud, and take the norm const int beg_ech = 3; // errors start at this channel const int num_ech = num_ch - beg_ech; // number of error channels typedef Vector<double, num_ch > PixelInT; typedef Vector<double, num_ech> PixelErrT; vw::ImageViewRef<PixelInT> I = vw::DiskImageView<PixelInT>(pc_file); ImageViewRef<PixelErrT> error_channels = select_channels<num_ech, num_ch, double>(I, beg_ech); return per_pixel_filter(error_channels, asp::VectorNorm<PixelErrT>()); } class Options : public vw::GdalWriteOptions { public: std::string input_prefix; float error_cutoff; }; void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options("General Options"); general_options.add_options() ("error-cutoff", po::value(&opt.error_cutoff)->default_value(0)); po::options_description positional(""); positional.add_options() ("input-prefix", po::value<std::string>(), "Input prefix"); po::positional_options_description positional_desc; positional_desc.add("input-prefix", -1); std::string usage("[options] <input-prefix>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); if (vm.count("input-prefix") == 0) vw_throw( ArgumentErr() << "Missing input prefix.\n" << usage << general_options ); opt.input_prefix = vm["input-prefix"].as<std::string>(); } /// Count the number of pixels above a threshold on a per-block basis. class ValidPixelCounterFunctor { double m_error_threshold; uint64 m_masked_count; uint64 m_invalid_count; Mutex m_mutex; public: ValidPixelCounterFunctor(double threshold) : m_error_threshold(threshold), m_masked_count(0), m_invalid_count(0) {} uint64 get_masked_count () const {return m_masked_count; } uint64 get_invalid_count() const {return m_invalid_count;} template <class T> void operator()(ImageView<T> const& image, BBox2i const& bbox) { // Count the pixels where the value is zero or >= the threshold. uint64 local_invalid_count = 0; uint64 local_masked_count = 0; for (std::int64_t r=0; r<bbox.height(); ++r) { for (std::int64_t c=0; c<bbox.width(); ++c) { typename ImageView<T>::pixel_type value = image(c,r); if (value < 0.0) { // These pixels are outside the left mask. ++local_masked_count; continue; } if ((value == 0) || (value >= m_error_threshold)) { ++local_invalid_count; // Bad triangulation } } } // Safely add to the shared totals. m_mutex.lock(); m_masked_count += local_masked_count; m_invalid_count += local_invalid_count; m_mutex.unlock(); } }; //----------------------------------------------------------------------------------- int main( int argc, char *argv[] ) { Options opt; try { handle_arguments( argc, argv, opt ); // Find the two required input files std::string lmask_file = opt.input_prefix + "-lMask.tif"; std::string pc_file = opt.input_prefix + "-PC.tif"; if (!boost::filesystem::exists(lmask_file)) { vw_out() << "Required left mask file not found: " << lmask_file << std::endl; return 0; } if (!boost::filesystem::exists(pc_file)) { vw_out() << "Required point cloud file not found: " << pc_file << std::endl; return 0; } // Each thread will process a block of this tile size. std::int64_t tile_size = asp::ASPGlobalOptions::tri_tile_size(); // Compute the error norm from the PC file, and apply a mask to it copied from the lmask file. // - Zero error values are a flag for a bad pixel, left over from stereo_tri. // - Values outside the left mask are set to a flag value of -1, they are not counted // in the computations. std::int64_t num_pc_channels = get_num_channels(pc_file); ImageViewRef<double> masked_error_image; switch(num_pc_channels) { case 4: masked_error_image = apply_mask(copy_mask(error_norm<4>(pc_file), create_mask(DiskImageView<uint8>(lmask_file))), -1.0); break; case 6: masked_error_image = apply_mask(copy_mask(error_norm<6>(pc_file), create_mask(DiskImageView<uint8>(lmask_file))), -1.0); break; default: vw_out() << "Error: The point cloud file must have 4 or 6 channels!\n"; return 0; }; // Use BlockImageOperator to count invalid pixels in parallel threads. ValidPixelCounterFunctor functor(opt.error_cutoff); //write_image("debug.tif", masked_error_image); const Vector2i block_size(tile_size, tile_size); block_op_cache(masked_error_image, functor, block_size); std::int64_t num_masked = functor.get_masked_count(); std::int64_t num_invalid = functor.get_invalid_count(); std::int64_t num_rows = masked_error_image.rows(); std::int64_t num_cols = masked_error_image.cols(); std::int64_t num_pixels = num_rows * num_cols; std::int64_t num_unmasked_pixels = num_pixels - num_masked; std::int64_t num_valid = num_unmasked_pixels - num_invalid; double percent_invalid = static_cast<double>(num_invalid) / static_cast<double>(num_unmasked_pixels); std::cout << "Total number of pixels: " << num_pixels << std::endl; std::cout << "Number of valid pixels: " << num_valid << std::endl; std::cout << "Percentage of valid pixels: " << 1.0-percent_invalid << std::endl; } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/dem2gcp.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file dem2gcp.cc // See the documentation on readthedocs. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/FileUtils.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/GCP.h> #include <vw/Core/Stopwatch.h> #include <vw/Camera/CameraModel.h> #include <vw/Camera/PinholeModel.h> #include <vw/BundleAdjustment/ControlNetworkLoader.h> #include <vw/Math/RandomSet.h> #include <vw/Image/Filter.h> #include <vw/Cartography/GeoReferenceBaseUtils.h> #include <vw/FileIO/FileUtils.h> #include <ogr_spatialref.h> #include <algorithm> #include <atomic> #include <omp.h> namespace po = boost::program_options; namespace fs = boost::filesystem; typedef vw::PixelMask<vw::Vector2f> DpixT; namespace asp { // Given a pixel (x, y), and a length l, enumerate all the pixels // on the boundary of the square of side length 2*l centered at (x, y). void enumerate_boundary_pixels(int x, int y, int l, std::vector<vw::Vector2> & pixels) { pixels.clear(); for (int i = -l; i <= l; i++) { pixels.push_back(vw::Vector2(x-l, y+i)); pixels.push_back(vw::Vector2(x+l, y+i)); pixels.push_back(vw::Vector2(x+i, y-l)); pixels.push_back(vw::Vector2(x+i, y+l)); } } // Invalidate disparity whose norm is more than this class FilterDisp: public vw::ReturnFixedType<DpixT> { public: FilterDisp(double max_disp): m_max_disp(max_disp) {} DpixT operator()(DpixT const& disp) const { if (is_valid(disp) && vw::math::norm_2(disp.child()) > m_max_disp) { // Invalidate the disparity DpixT invalid_disp = disp; invalid_disp.invalidate(); return invalid_disp; } return disp; } double m_max_disp; }; // Find the interpolated disparity value at a given pixel. If not valid, look in // a small neighborhood. That should not be overused. DpixT find_disparity(vw::ImageViewRef<DpixT> disparity, vw::ImageViewRef<DpixT> interp_disp, double x, double y, int max_l) { if (x < 0 || y < 0 || x >= disparity.cols() || y >= disparity.rows()) return DpixT(); // Try to find the interpolated disparity DpixT idisp = interp_disp(x, y); if (is_valid(idisp)) return idisp; // Otherwise try without interpolation. This casts x and y to integers. if (is_valid(disparity(x, y))) return disparity(x, y); // Otherwise search in the neighborhood. The default value of the neighborhood // is 0. This is likely a desperate measure when the disparity has very few // good values. for (int l = 1; l <= max_l; l++) { // Will keep the pixel closest to the center double max_dist = std::numeric_limits<double>::max(); vw::Vector2 best_pix; bool found = false; std::vector<vw::Vector2> pixels; enumerate_boundary_pixels(int(x), int(y), l, pixels); for (int i = 0; i < (int)pixels.size(); i++) { int px = pixels[i].x(), py = pixels[i].y(); if (px < 0 || py < 0 || px >= disparity.cols() || py >= disparity.rows()) continue; if (!is_valid(disparity(px, py))) continue; double dist = norm_2(vw::Vector2(px-x, py-y)); if (dist >= max_dist) continue; max_dist = dist; best_pix = vw::Vector2(px, py); found = true; } // end loop over pixels on the boundary of the square of side length 2*l if (found) return disparity(best_pix.x(), best_pix.y()); } // end loop over ever-growing squares // Give up return DpixT(); } void genWriteGcp(vw::cartography::GeoReference const& ref_dem_georef, vw::ba::ControlNetwork const& cnet, vw::ImageViewRef<DpixT> const& disparity, vw::ImageViewRef<vw::PixelMask<double>> const& interp_ref_dem, vw::cartography::GeoReference const& warped_dem_georef, std::vector<std::string> const& image_files, double gcp_sigma, int search_len, int max_num_gcp, int num_threads, vw::ImageViewRef<vw::PixelMask<float>> const& gcp_sigma_image, vw::cartography::GeoReference const& gcp_sigma_image_georef, std::string const& gcpFile) { int num_pts = cnet.size(); // Form the interpolated disparity DpixT nodata_pix; nodata_pix.invalidate(); vw::ImageViewRef<DpixT> interp_disp = interpolate(disparity, vw::BilinearInterpolation(), vw::ValueEdgeExtension<DpixT>(nodata_pix)); bool have_gcp_sigma_image = (gcp_sigma_image.cols() > 0 && gcp_sigma_image.rows() > 0); // Use per-thread local vectors to avoid locking int actual_threads = num_threads; if (actual_threads <= 0) actual_threads = vw::vw_settings().default_num_threads(); vw::vw_out() << "Producing GCP using " << actual_threads << " threads.\n"; // Store (original_index, Gcp) pairs per thread for deterministic output typedef std::pair<int, Gcp> IndexedGcp; std::vector<std::vector<IndexedGcp>> thread_gcp(actual_threads); // Atomic counter for progress reporting std::atomic<int> progress_count(0); int report_interval = std::max(num_pts / 100, 1); vw::TerminalProgressCallback tpc("asp", "Producing GCP --> "); tpc.report_progress(0); #pragma omp parallel for num_threads(actual_threads) schedule(dynamic, 1000) for (int ipt = 0; ipt < num_pts; ipt++) { int tid = omp_get_thread_num(); // Report progress from thread 0 int count = progress_count.fetch_add(1); if (tid == 0 && count % report_interval == 0) tpc.report_progress(double(count) / std::max(num_pts, 1)); vw::ba::ControlPoint const& cp = cnet[ipt]; // alias // Find the pixel in the warped DEM vw::Vector3 xyz = cnet[ipt].position(); vw::Vector3 llh; llh = warped_dem_georef.datum().cartesian_to_geodetic(xyz); vw::Vector2 dem_pix = warped_dem_georef.lonlat_to_pixel(vw::Vector2(llh.x(), llh.y())); // Find the corresponding pixel in the reference DEM DpixT disp = find_disparity(disparity, interp_disp, dem_pix.x(), dem_pix.y(), search_len); if (!is_valid(disp)) continue; vw::Vector2 ref_pix = dem_pix + disp.child(); // Find height at the reference pixel double ref_height = interp_ref_dem(ref_pix.x(), ref_pix.y()); if (!vw::is_valid(ref_height)) continue; // Find lon-lat-height at the reference pixel vw::Vector2 ref_lonlat = ref_dem_georef.pixel_to_lonlat(ref_pix); vw::Vector3 ref_llh(ref_lonlat.x(), ref_lonlat.y(), ref_height); // The case when the GCP sigma comes from a file double local_gcp_sigma = gcp_sigma; if (have_gcp_sigma_image) { vw::PixelMask<float> img_gcp_sigma = vw::cartography::closestPixelVal(gcp_sigma_image, gcp_sigma_image_georef, xyz); // Flag bad gcp_sigmas as outliers if (!is_valid(img_gcp_sigma) || std::isnan(img_gcp_sigma.child()) || img_gcp_sigma.child() <= 0.0) continue; local_gcp_sigma = img_gcp_sigma.child(); } // Set the GCP uncertainty for the ground point (in meters). The pixel sigmas // from the input match file will be ignored and replaced with (1, 1) when the // GCP file is written. vw::Vector3 sigma(local_gcp_sigma, local_gcp_sigma, local_gcp_sigma); Gcp gcp; gcp.cp = cp; gcp.llh = ref_llh; gcp.sigma = sigma; thread_gcp[tid].push_back(IndexedGcp(ipt, gcp)); } tpc.report_finished(); // Merge per-thread results std::vector<IndexedGcp> indexed_gcp; for (int t = 0; t < actual_threads; t++) { indexed_gcp.insert(indexed_gcp.end(), thread_gcp[t].begin(), thread_gcp[t].end()); std::vector<IndexedGcp>().swap(thread_gcp[t]); } // Sort by original cnet index for deterministic output std::sort(indexed_gcp.begin(), indexed_gcp.end(), [](IndexedGcp const& a, IndexedGcp const& b) { return a.first < b.first; }); // Extract the Gcp values std::vector<Gcp> gcp_vec(indexed_gcp.size()); for (size_t i = 0; i < indexed_gcp.size(); i++) gcp_vec[i] = indexed_gcp[i].second; std::vector<IndexedGcp>().swap(indexed_gcp); // See if to reduce the number of GCP vw::vw_out() << "Generated " << gcp_vec.size() << " GCP points.\n"; if (max_num_gcp > 0 && (int)gcp_vec.size() > max_num_gcp) { vw::vw_out() << "Reducing the number of GCP to " << max_num_gcp << ".\n"; std::vector<int> indices; vw::math::pick_random_indices_in_range(gcp_vec.size(), max_num_gcp, indices); std::vector<Gcp> local_vec; for (size_t i = 0; i < indices.size(); i++) local_vec.push_back(gcp_vec[indices[i]]); // Swap the two gcp_vec.swap(local_vec); } // Use pixel sigma of 1. TODO(oalexan1): Revisit. bool ignore_pixel_sigma = true; writeGcp(gcpFile, ref_dem_georef, gcp_vec, image_files, ignore_pixel_sigma); } // Put the variables below in a struct struct Options: public vw::GdalWriteOptions { std::string warped_dem_file, ref_dem_file, warped_to_ref_disp_file, left_img, right_img, left_cam, right_cam, match_file, out_gcp, gcp_sigma_image, image_list, camera_list, match_files_prefix, clean_match_files_prefix; int search_len, max_num_gcp, max_pairwise_matches; double gcp_sigma, max_disp; }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("warped-dem", po::value(&opt.warped_dem_file), "The DEM file produced by stereo, that may have warping due to unmodeled distortion.") ("ref-dem", po::value(&opt.ref_dem_file), "The reference DEM file, which is assumed to be accurate.") ("warped-to-ref-disparity", po::value(&opt.warped_to_ref_disp_file), "The stereo disparity from the warped DEM to the reference DEM (use the first band " "of the hillshaded DEMs as inputs for the disparity).") ("left-image", po::value(&opt.left_img), "The left raw image that produced the warped DEM.") ("right-image", po::value(&opt.right_img), "The right raw image that produced the warped DEM.") ("left-camera", po::value(&opt.left_cam), "The left camera that was used for stereo.") ("right-camera", po::value(&opt.right_cam), "The right camera that was used for stereo.") ("match-file", po::value(&opt.match_file), "A match file between the left and right raw images with many dense matches.") ("gcp-sigma", po::value(&opt.gcp_sigma)->default_value(1.0), "The sigma to use for the GCP points. A smaller value will give to GCP more weight. " "This should be a fraction of the image ground sample distance. Measured in meters. " "See also --gcp-sigma-image.") ("max-num-gcp", po::value(&opt.max_num_gcp)->default_value(-1), "The maximum number of GCP to write. If negative, all GCP are written. If more than " "this number, a random subset will be picked. The same subset will be selected if the " "program is called again.") ("output-gcp", po::value(&opt.out_gcp), "The produced GCP file with ground coordinates from the reference DEM.") ("max-disp", po::value(&opt.max_disp)->default_value(-1), "If positive, flag a disparity whose norm is larger than this as erroneous and do not " "use it for creating GCP. Measured in pixels. See also option --max-gcp-reproj-err in " "bundle_adjust.") ("gcp-sigma-image", po::value(&opt.gcp_sigma_image)->default_value(""), "Given a georeferenced image with float values, for each GCP find its location in " "this image and closest pixel value. Let the GCP sigma be that value. Skip GCP that " "result in values that are are no-data or are not positive. This overrides --gcp-sigma.") ("search-len", po::value(&opt.search_len)->default_value(0), "How many DEM pixels to search around a given interest point to find a valid DEM " "disparity (pick the closest). This may help with a spotty disparity but should not " "be overused.") ("image-list", po::value(&opt.image_list)->default_value(""), "A file containing the list of images. This can be used with more than two images.") ("camera-list", po::value(&opt.camera_list)->default_value(""), "A file containing the list of cameras. This can be used with more than two images.") ("match-files-prefix", po::value(&opt.match_files_prefix)->default_value(""), "Use the match files with this prefix.") ("clean-match-files-prefix", po::value(&opt.clean_match_files_prefix)->default_value(""), "Use as input *-clean.match files with this prefix.") ("max-pairwise-matches", po::value(&opt.max_pairwise_matches)->default_value(-1), "If positive, reduce the number of matches to load from any given match file to at " "most this value.") ("help,h", "Display this help message"); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Create the output directory vw::create_out_dir(opt.out_gcp); // Only one of --match-file, --match-files-prefix, or // --clean-match-files-prefix can be used int num = int(!opt.match_file.empty()) + int(!opt.match_files_prefix.empty()) + int(!opt.clean_match_files_prefix.empty()); if (num != 1) vw::vw_throw(vw::ArgumentErr() << "Exactly one of --match-file, --match-files-prefix, or " << "--clean-match-files-prefix must be specified.\n"); // Can have either left and right image, or image-list if ((!opt.left_img.empty() || !opt.right_img.empty()) && !opt.image_list.empty()) vw::vw_throw(vw::ArgumentErr() << "Either specify both --left-image and --right-image, " << "or --image-list, but not both options.\n"); // Same for left and right camera if ((!opt.left_cam.empty() || !opt.right_cam.empty()) && !opt.camera_list.empty()) vw::vw_throw(vw::ArgumentErr() << "Either specify both --left-camera and --right-camera, " << "or --camera-list, but not both options.\n"); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_gcp); } // Check that two georefs have the same projection. Compare PROJ4 strings and // dynamic datum properties. WKT strings can differ in naming conventions while // representing the same projection (e.g., "Moon (2015)" vs "D_MOON"), so a // WKT mismatch alone is only a warning. void datumCheck(vw::cartography::GeoReference const& georef1, vw::cartography::GeoReference const& georef2) { std::string wkt1 = georef1.get_wkt(); std::string wkt2 = georef2.get_wkt(); OGRSpatialReference srs1, srs2; srs1.SetFromUserInput(wkt1.c_str()); srs2.SetFromUserInput(wkt2.c_str()); // Export to PROJ4 for a parameter-level comparison char *proj4_1 = nullptr, *proj4_2 = nullptr; srs1.exportToProj4(&proj4_1); srs2.exportToProj4(&proj4_2); std::string p1 = (proj4_1 ? proj4_1 : ""); std::string p2 = (proj4_2 ? proj4_2 : ""); CPLFree(proj4_1); CPLFree(proj4_2); // Check if either uses a dynamic datum (epoch-based CRS) bool dynamic_mismatch = (srs1.IsDynamic() != srs2.IsDynamic()); if (p1 != p2 || dynamic_mismatch) vw::vw_throw(vw::ArgumentErr() << "The warped DEM and reference DEM have different projections. " << "Use gdalwarp -t_srs to convert them to the same projection.\n" << "Warped DEM PROJ4: " << p1 << "\n" << "Ref DEM PROJ4: " << p2 << "\n" << "Warped DEM WKT: " << wkt1 << "\n" << "Ref DEM WKT: " << wkt2 << "\n"); // Warn if PROJ4 and dynamic datum agree but WKT strings differ if (wkt1 != wkt2) vw::vw_out(vw::WarningMessage) << "Found projections with same PROJ4 string and dynamic datum " << "properties but different WKT. Continuing.\n" << "PROJ4: " << p1 << "\n" << "First WKT: " << wkt1 << "\n" << "Second WKT: " << wkt2 << "\n"; } int run_dem2gcp(int argc, char * argv[]) { Options opt; // Parse and validate the input options handle_arguments(argc, argv, opt); // Prepare the images std::vector<std::string> image_files; // See if to read from image list if (!opt.image_list.empty()) { asp::read_list(opt.image_list, image_files); } else { image_files.push_back(opt.left_img); image_files.push_back(opt.right_img); } // Prepare camera lists std::vector<std::string> camera_files; // See if to read from camera list if (!opt.camera_list.empty()) { asp::read_list(opt.camera_list, camera_files); } else { camera_files.push_back(opt.left_cam); camera_files.push_back(opt.right_cam); } // Load the cameras std::string stereo_session, out_prefix; std::vector<vw::CamPtr> camera_models; bool approximate_pinhole_intrinsics = false, single_threaded_cameras = false; asp::load_cameras(image_files, camera_files, out_prefix, opt, approximate_pinhole_intrinsics, // Outputs stereo_session, single_threaded_cameras, camera_models); // Load the DEM and georef, and prepare for interpolation vw::cartography::GeoReference warped_dem_georef; vw::ImageViewRef<vw::PixelMask<double>> interp_warped_dem; asp::create_interp_dem(opt.warped_dem_file, warped_dem_georef, interp_warped_dem); // Load the reference DEM vw::cartography::GeoReference ref_dem_georef; vw::ImageViewRef<vw::PixelMask<double>> interp_ref_dem; asp::create_interp_dem(opt.ref_dem_file, ref_dem_georef, interp_ref_dem); // Must ensure these have the same projection datumCheck(warped_dem_georef, ref_dem_georef); // Must have the same grid size, which is based on the transform auto warped_trans = warped_dem_georef.transform(); auto ref_trans = ref_dem_georef.transform(); double tol = 1e-6; if (std::abs(warped_trans(0, 0) - ref_trans(0, 0)) > tol || std::abs(warped_trans(1, 1) - ref_trans(1, 1)) > tol) vw::vw_throw( vw::ArgumentErr() << "The warped DEM and reference DEM have different grid sizes. Use " << "gdalwarp -r cubicspline to resample the warped DEM.\n"); // Load the disparity vw::ImageViewRef<DpixT> disparity = vw::DiskImageView<DpixT>(opt.warped_to_ref_disp_file); if (opt.max_disp > 0) { vw::vw_out() << "Filtering the disparity to remove values larger than " << opt.max_disp << ".\n"; disparity = vw::per_pixel_filter(disparity, FilterDisp(opt.max_disp)); } // Warped size must equal disparity size, otherwise there is a mistake if (interp_warped_dem.cols() != disparity.cols() || interp_warped_dem.rows() != disparity.rows()) vw::vw_throw( vw::ArgumentErr() << "Error: The warped DEM and disparity sizes do not match.\n" ); // If to use a gcp_sigma image bool have_gcp_sigma_image = (!opt.gcp_sigma_image.empty()); vw::ImageViewRef<vw::PixelMask<float>> gcp_sigma_image; float gcp_sigma_image_nodata = -std::numeric_limits<float>::max(); vw::cartography::GeoReference gcp_sigma_image_georef; if (have_gcp_sigma_image) { vw::cartography::readGeorefImage(opt.gcp_sigma_image, gcp_sigma_image_nodata, gcp_sigma_image_georef, gcp_sigma_image); vw::vw_out() << "Using GCP sigma image: " << opt.gcp_sigma_image << "\n"; } // Load the control network. This can be slow so left for last. Consider the // case of one match files or a prefix pointing to many match files. vw::ba::ControlNetwork cnet("asp"); bool triangulate_control_points = true; std::map<std::pair<int, int>, std::string> match_files; if (!opt.match_file.empty()) { match_files[std::make_pair(0, 1)] = opt.match_file; } else { // Load all match files with no constraints int overlap_limit = image_files.size(); bool match_first_to_last = true; asp::findMatchFiles(overlap_limit, match_first_to_last, image_files, opt.clean_match_files_prefix, opt.match_files_prefix, out_prefix, asp::stereo_settings().matches_as_txt, // Outputs match_files); } int min_matches = 0; // Not used as we are just loading double min_triangulation_angle = 1e-10; double forced_triangulation_distance = -1.0; bool success = vw::ba::build_control_network(triangulate_control_points, cnet, camera_models, image_files, match_files, min_matches, min_triangulation_angle, forced_triangulation_distance, opt.max_pairwise_matches, stereo_settings().matches_as_txt); if (!success) vw::vw_throw(vw::ArgumentErr() << "Failed to load the interest points.\n"); genWriteGcp(ref_dem_georef, cnet, disparity, interp_ref_dem, warped_dem_georef, image_files, opt.gcp_sigma, opt.search_len, opt.max_num_gcp, opt.num_threads, gcp_sigma_image, gcp_sigma_image_georef, opt.out_gcp); return 0; } } // end namespace asp int main(int argc, char * argv[]) { try { asp::run_dem2gcp(argc, argv); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/dem_geoid.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file dem_geoid.cc /// /// Fortran function declaration from the "geoid" mini external library /// compiled using Binary Builder. /// TODO: Must put this into a C++ header file in that library, and include /// that header file here. Must also make sure that header file gets installed. extern "C" { void egm2008_call_interp_(int* nriw2, int* nciw2, double* grid, double* flon, double* flat, double* val); } #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <vw/Image/ImageChannels.h> #include <vw/Image/Interpolation.h> #include <vw/Cartography/GeoReferenceResourceGDAL.h> #include <vw/FileIO/FileUtils.h> #include <boost/filesystem.hpp> #include <boost/dll.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw; using namespace vw::cartography; /// Image view which adds or subtracts the ellipsoid/geoid difference /// from elevations in a DEM image. template <class ImageT> class DemGeoidView : public ImageViewBase<DemGeoidView<ImageT>> { ImageT m_img; // The DEM GeoReference const& m_georef; // alias bool m_is_egm2008; std::vector<double> const& m_egm2008_grid; // Special variable storing EGM2008 data ImageViewRef<PixelMask<double>> const& m_geoid; // Interpolation view of the geoid GeoReference const& m_geoid_georef; // alias bool m_reverse_adjustment; // If true, convert from geoid to ellipsoid heights double m_correction; double m_nodata_val; public: typedef double pixel_type; typedef double result_type; typedef ProceduralPixelAccessor<DemGeoidView> pixel_accessor; DemGeoidView(ImageT const& img, GeoReference const& georef, bool is_egm2008, std::vector<double> const& egm2008_grid, ImageViewRef<PixelMask<double>> const& geoid, GeoReference const& geoid_georef, bool reverse_adjustment, double correction, double nodata_val): m_img(img), m_georef(georef), m_is_egm2008(is_egm2008), m_egm2008_grid(egm2008_grid), m_geoid(geoid), m_geoid_georef(geoid_georef), m_reverse_adjustment(reverse_adjustment), m_correction(correction), m_nodata_val(nodata_val) {} inline int32 cols () const { return m_img.cols(); } inline int32 rows () const { return m_img.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this); } inline result_type operator()(size_t col, size_t row, size_t p=0) const { if (m_img(col, row, p) == m_nodata_val) return m_nodata_val; // Skip invalid pixels Vector2 lonlat = m_georef.pixel_to_lonlat(Vector2(col, row)); // For testing (see the link to the reference web form belows). //lonlat[0] = -121; lonlat[1] = 37; // mainland US //lonlat[0] = -152; lonlat[1] = 66; // Alaska //lonlat[0] = -155.5; lonlat[1] = 19.5; // Hawaii // Need to carefully wrap lonlat to the [0, 360) x [-90, 90) box. // Note that lon = 25, lat = 91 is the same as lon = 180 + 25, lat = 89 // as we go through the North pole and show up on the other side. // TODO: Does the GeoRef class handle this now? while (std::abs(lonlat[1]) > 90.0) { if (lonlat[1] > 90.0) { lonlat[1] = 180.0 - lonlat[1]; lonlat[0] += 180.0; } if (lonlat[1] < -90.0) { lonlat[1] = -180.0 - lonlat[1]; lonlat[0] += 180.0; } } while (lonlat[0] < 0.0) lonlat[0] += 360.0; while (lonlat[0] >= 360.0) lonlat[0] -= 360.0; result_type geoid_height = 0.0; if (m_is_egm2008) { int nr = m_geoid.rows(), nc = m_geoid.cols(); // Call fortran function from "geoid" mini external library egm2008_call_interp_(&nr, &nc, (double*)&m_egm2008_grid[0], &lonlat[0], &lonlat[1], &geoid_height); } else { // Use our own interpolation into the geoid image Vector2 pix = m_geoid_georef.lonlat_to_pixel(lonlat); PixelMask<double> interp_val = m_geoid(pix[0], pix[1]); if (!is_valid(interp_val)) return m_nodata_val; geoid_height = interp_val.child(); } geoid_height += m_correction; result_type height_above_ellipsoid = m_img(col, row, p); // Compute height above the geoid // - See the note in the main program about the formula below if (m_reverse_adjustment) return height_above_ellipsoid + geoid_height; else return height_above_ellipsoid - geoid_height; } /// \cond INTERNAL typedef DemGeoidView<typename ImageT::prerasterize_type> prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { return prerasterize_type(m_img.prerasterize(bbox), m_georef, m_is_egm2008, m_egm2008_grid, m_geoid, m_geoid_georef, m_reverse_adjustment, m_correction, m_nodata_val); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i const& bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } /// \endcond }; // Helper function which uses the class above. template <class ImageT> DemGeoidView<ImageT> dem_geoid(ImageViewBase<ImageT> const& img, GeoReference const& georef, bool is_egm2008, std::vector<double> & egm2008_grid, ImageViewRef<PixelMask<double>> const& geoid, GeoReference const& geoid_georef, bool reverse_adjustment, double correction, double nodata_val) { return DemGeoidView<ImageT>(img.impl(), georef, is_egm2008, egm2008_grid, geoid, geoid_georef, reverse_adjustment, correction, nodata_val); } /// Parameters for this tool struct Options : vw::GdalWriteOptions { std::string dem_path, geoid, geoid_path, out_prefix; double nodata_value; bool use_double; // Otherwise use float bool reverse_adjustment; }; // Get the absolute path to the geoid. It is normally in the share/geoids // directory of the ASP distribution, but in dev mode the directory // having the geoids can be set via the ASP_GEOID_DIR env var. std::string get_geoid_full_path(std::string const& prog_name, std::string const& geoid_file) { // Convert to absolute path first, to avoid issues when prog_name // is simply "dem_geoid" with no path, when subsequent operations on // it will fail. char * geoid_dir_ptr = getenv("ASP_GEOID_DIR"); fs::path geoid_dir; if (geoid_dir_ptr != NULL && std::string(geoid_dir_ptr) != "") geoid_dir = fs::path(std::string(geoid_dir_ptr)); else geoid_dir = boost::dll::program_location().parent_path().parent_path() / fs::path("share") / fs::path("geoids"); fs::path geoid_path = geoid_dir / fs::path(geoid_file); if (!fs::exists(geoid_path)) vw_throw(ArgumentErr() << "Could not find the geoid: " << geoid_path.string() << ". Set export ASP_GEOID_DIR=/path/to/share/geoids\n"); return geoid_path.string(); } void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("nodata_value", po::value(&opt.nodata_value)->default_value(-32768), "The value of no-data pixels, unless specified in the DEM.") ("geoid", po::value(&opt.geoid), "Specify the geoid to use for the given datum. For WGS84 use EGM96 or EGM2008. " "Default: EGM96. For Mars use MOLA or leave blank. For NAD83 use NAVD88 or leave " "blank. When not specified it will be auto-detected.") ("geoid-path", po::value(&opt.geoid_path), "Specify the path to a custom GeoTiff file having the geoid correction. " "Values from this file will be subtracted from the DEM values in order " "to convert from ellipsoid to geoid heights.") ("output-prefix,o", po::value(&opt.out_prefix), "Specify the output prefix.") ("double", po::bool_switch(&opt.use_double)->default_value(false)->implicit_value(true), "Output using double precision (64 bit) instead of float (32 bit).") ("reverse-adjustment", po::bool_switch(&opt.reverse_adjustment)->default_value(false)->implicit_value(true), "Go from DEM relative to the geoid to DEM relative to the ellipsoid."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("dem", po::value(&opt.dem_path), "Explicitly specify the DEM."); po::positional_options_description positional_desc; positional_desc.add("dem", 1); std::string usage("[options] <dem>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.dem_path.empty()) vw_throw(ArgumentErr() << "Requires <dem> in order to proceed.\n\n" << usage << general_options); boost::to_lower(opt.geoid); if (!opt.geoid.empty() && !opt.geoid_path.empty()) vw_throw(ArgumentErr() << "Cannot specify both --geoid and --geoid-path.\n"); if (opt.out_prefix.empty()) opt.out_prefix = fs::path(opt.dem_path).stem().string(); // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); } /// Given a DEM, with each height value relative to the datum /// ellipsoid, convert the heights to be relative to the geoid. // From: http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/intpthel.html // Geoid heights can be used to convert between orthometric // heights (approximately mean sea level) and ellipsoid heights // according to the formula: // h = H + N // where, // h = WGS 84 Ellipsoid height // H = Orthometric height // N = EGM96 Geoid height (relative to the ellipsoid) // Therefore: H = h - N. // We support four geoids: EGM96, EGM2008, NAVD88 (Earth) and MOLA MEGDR (Mars). // Online tools for verification: // EGM96: http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/intpt.html // NAVD88: http://www.ngs.noaa.gov/cgi-bin/GEOID_STUFF/geoid09_prompt1.prl // EGM2008: http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html // MOLA MEGDR: http://geo.pds.nasa.gov/missions/mgs/megdr.html // Examples: At lat = 37 and lon = -121 (Basalt Hills, CA), we have // EGM96 geoid height = -32.69 m // NAVD88 geoid height = -32.931 m // At lat = 66 and lon = -152 (Alaska): // EGM96 geoid height = 9.51 m // NAVD88 geoid height = 8.255 m // At lat = 19.5 and lon = -155.5 (Hawaii) // NAVD88 geoid height: 27.353 // EGM96 geoid height: 26.58 // For EGM2008, we use the tabulated values at 2.5', and the provided routine // for interpolation (interp_2p5min.f), as described at // http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html // We store the tabulated values as a tif file, and modified // the routine to be callable from this executable. int main(int argc, char *argv[]) { Options opt; try { std::string prog_name = argv[0]; handle_arguments(argc, argv, opt); bool reverse_adjustment = opt.reverse_adjustment; // Read the DEM to adjust DiskImageResourceGDAL dem_rsrc(opt.dem_path); double dem_nodata_val = opt.nodata_value; if (dem_rsrc.has_nodata_read()) { dem_nodata_val = dem_rsrc.nodata_read(); vw_out() << "\tFound input nodata value for " << opt.dem_path << ": " << dem_nodata_val << "\n"; } DiskImageView<double> dem_img(dem_rsrc); GeoReference dem_georef; bool has_georef = read_georeference(dem_georef, dem_rsrc); if (!has_georef) vw_throw(ArgumentErr() << "Missing georeference for DEM: " << opt.dem_path << "\n"); // TODO: Improve this handling so it can read DEMs with relevant EPSG codes, etc. // Find out the datum from the DEM. If we fail, we do an educated guess. std::string datum_name = dem_georef.datum().name(); std::string lname = boost::to_lower_copy(datum_name); std::string geoid_file; bool is_wgs84 = false, is_mola = false; if (opt.geoid_path == "") { if (lname == "wgs_1984" || lname == "wgs 1984" || lname == "wgs1984" || lname == "wgs84" || lname == "world geodetic system 1984") { is_wgs84 = true; } else if (lname == "north_american_datum_1983") { geoid_file = "navd88.tif"; } else if (lname == "d_mars") { is_mola = true; } else if (std::abs(dem_georef.datum().semi_major_axis() - 6378137.0) < 500.0) { // Guess Earth vw_out(WarningMessage) << "Unknown datum: " << datum_name << ". Guessing: WGS_1984.\n"; is_wgs84 = true; } else if (std::abs(dem_georef.datum().semi_major_axis() - 3396190.0) < 500.0) { // Guess Mars vw_out(WarningMessage) << "Unknown datum: " << datum_name << ". Guessing: D_MARS.\n"; is_mola = true; } else if (opt.geoid_path == "") { vw_throw(ArgumentErr() << "Cannot apply geoid adjustment to DEM relative to datum: " << datum_name << "\n"); } } // Ensure that the value of --geoid is compatible with the datum from the DEM. // Only WGS_1984 datums can be used with EGM geoids, only the NAD83 datum // can be used with NAVD88, and only MOLA can be used with Mars. bool is_egm2008 = false; if (opt.geoid_path == "") { if (is_wgs84) { if (opt.geoid == "egm2008") { is_egm2008 = true; geoid_file = "egm2008.jp2"; } else if (opt.geoid == "egm96" || opt.geoid == "") geoid_file = "egm96-5.jp2"; // The default WGS84 geoid option else vw_throw(ArgumentErr() << "The datum is WGS84. The only supported options for the geoid are EGM96 and EGM2008. Got instead: " << opt.geoid << ".\n"); } else if (lname == "north_american_datum_1983") { if (opt.geoid != "" && opt.geoid != "navd88") vw_throw(ArgumentErr() << "The datum is North_American_Datum_1983. " << "Hence the value of the --geoid option must be either " << "empty (auto-detected) or NAVD88. Got instead: " << opt.geoid << ".\n"); } else if (is_mola) { if (opt.geoid != "" && opt.geoid != "mola") vw_throw(ArgumentErr() << "Detected a Mars DEM. In that case, the " << "value of the --geoid option must be either empty " << "(auto-detected) or MOLA. Got instead: " << opt.geoid << ".\n"); } else if (opt.geoid != "") vw_throw(ArgumentErr() << "The geoid value: " << opt.geoid << " is applicable only for the WGS_1984 datum.\n"); if (is_mola) geoid_file = "mola_areoid.tif"; } // Find where we keep the information for this geoid if (opt.geoid_path == "") geoid_file = get_geoid_full_path(prog_name, geoid_file); else geoid_file = opt.geoid_path; vw_out() << "Adjusting the DEM using the geoid correction: " << geoid_file << "\n"; // These files usually go beyond [0, 360) in longitude, which can trigger // a waring that is not helpful here. vw::cartography::silence_warning_for_non_normal_georef(geoid_file); // Read the geoid containing the adjustments. Read it in memory // entirely to dramatically speed up the computations. double geoid_nodata_val = std::numeric_limits<float>::quiet_NaN(); DiskImageResourceGDAL geoid_rsrc(geoid_file); if (geoid_rsrc.has_nodata_read()) geoid_nodata_val = geoid_rsrc.nodata_read(); ImageView<float> geoid_img = DiskImageView<float>(geoid_rsrc); GeoReference geoid_georef; bool has_geoid_georef = read_georeference(geoid_georef, geoid_rsrc); if (!has_geoid_georef && !is_egm2008) vw_throw(ArgumentErr() << "Missing georeference for geoid correction file: " << geoid_file << "\n"); if (is_wgs84 && !is_egm2008) { // Convert the EGM96 int16 JPEG2000-encoded geoid to float. double a = 0, b = 65534, // TODO: What is this? c = -108, d = 86, s = (d-c)/(b-a); for (int col = 0; col < geoid_img.cols(); col++) { for (int row = 0; row < geoid_img.rows(); row++) { geoid_img(col, row) = s*(geoid_img(col, row) - a) + c; } } } // The EGM2008 case is special. Then, we don't do bicubic interpolation into // geoid_img, rather, we invoke some Fortran routine, which gives more accurate results. // And we scale the int16 JPEG2000-encoded geoid to float. std::vector<double> egm2008_grid; if (is_egm2008) { double a = 0, b = 65534, // TODO: What is this? c = -107, d = 86, s = (d-c)/(b-a); int nr = geoid_img.rows(), nc = geoid_img.cols(); egm2008_grid.resize(nr*nc); for (int col = 0; col < nc; col++) { for (int row = 0; row < nr; row++) { double val = geoid_img(col, row); val = s*(val - a) + c; egm2008_grid[row + col*nr] = val; // that is, egm2008_grid(row, col) = val; } } } // Need to apply an extra correction if the datum radius of the geoid is different // than the datum radius of the DEM to correct. We do this only if the datum is // a sphere, such on mars, as otherwise a uniform correction won't work. double major_correction = 0.0; double minor_correction = 0.0; if (!is_egm2008) { major_correction = geoid_georef.datum().semi_major_axis() - dem_georef.datum().semi_major_axis(); minor_correction = geoid_georef.datum().semi_minor_axis() - dem_georef.datum().semi_minor_axis(); } // The DEM and geoid correction are supposed to differ only in minor ways, // such as a constant shift. bool is_navd88 = (geoid_file.find("navd88.tif") != std::string::npos); if (major_correction != 0 || minor_correction != 0) { double den = std::max(std::abs(major_correction), std::abs(minor_correction)); if ((std::abs(1.0 - minor_correction/den) > 1e-5 || std::abs(1.0 - major_correction/den) > 1e-5 || den > 1000.0) && !is_navd88) { vw_throw(ArgumentErr() << "The input DEM and geoid datums are incompatible. " << "Cannot apply geoid adjustment.\n" << std::setprecision(17) << "DEM major semi-axis: " << dem_georef.datum().semi_major_axis() << "\n" << "DEM minor semi-axis: " << dem_georef.datum().semi_minor_axis() << "\n" << "Geoid major semi-axis: " << geoid_georef.datum().semi_major_axis() << "\n" << "Geoid minor semi-axis: " << geoid_georef.datum().semi_minor_axis() << "\n"); } vw_out(WarningMessage) << "Will compensate for the fact that the input DEM and geoid correction datums " << "axis lengths differ.\n"; } // Put an interpolation and mask wrapper around the input geoid file ImageViewRef<PixelMask<double>> geoid = interpolate(create_mask(pixel_cast<double>(geoid_img), geoid_nodata_val), BicubicInterpolation(), ZeroEdgeExtension()); // Set up conversion image view ImageViewRef<double> adj_dem = dem_geoid(dem_img, dem_georef, is_egm2008, egm2008_grid, geoid, geoid_georef, reverse_adjustment, major_correction, dem_nodata_val); std::string adj_dem_file = opt.out_prefix + "-adj.tif"; vw_out() << "Writing adjusted DEM: " << adj_dem_file << "\n"; std::map<std::string, std::string> keywords; if (opt.geoid_path == "") keywords["GEOID"] = opt.geoid; else keywords["GEOID"] = opt.geoid_path; auto tpc = TerminalProgressCallback("asp", "\t--> Applying DEM adjustment: "); bool have_georef = true, have_nodata = true; if (opt.use_double) { // Output as double block_write_gdal_image(adj_dem_file, adj_dem, have_georef, dem_georef, have_nodata, dem_nodata_val, opt, tpc, keywords); } else { // Output as float ImageViewRef<float> adj_dem_float = channel_cast<float>(adj_dem); block_write_gdal_image(adj_dem_file, adj_dem_float, have_georef, dem_georef, have_nodata, dem_nodata_val, opt, tpc, keywords); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/dem_mosaic.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file dem_mosaic.cc /// // A program to merge several DEMs into one. The inputs are always read as float. // The processing happens in double precision. #include <asp/Core/Macros.h> #include <asp/Core/GdalUtils.h> #include <asp/Core/DemMosaic.h> #include <asp/Core/DemMosaicOptions.h> #include <asp/Core/DemMosaicParse.h> #include <asp/Core/FileUtils.h> #include <vw/FileIO/DiskImageManager.h> #include <vw/Image/InpaintView.h> #include <vw/Image/RoundAndClamp.h> #include <vw/Image/Filter.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Image/NoDataAlg.h> #include <vw/FileIO/FileUtils.h> #include <cmath> #include <iostream> #include <fstream> #include <iomanip> #include <string> #include <vector> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <limits> #include <algorithm> namespace asp { // This is used for various tolerances double g_tol = 1e-6; std::string tile_suffix(asp::DemMosaicOptions const& opt) { std::string ans; if (opt.first) ans = "-first"; if (opt.last) ans = "-last"; if (opt.min) ans = "-min"; if (opt.max) ans = "-max"; if (opt.block_max) ans = "-block-max"; if (opt.mean) ans = "-mean"; if (opt.stddev) ans = "-stddev"; if (opt.median) ans = "-median"; if (opt.nmad) ans = "-nmad"; if (opt.count) ans = "-count"; if (opt.save_index_map) ans += "-index-map"; if (opt.save_dem_weight >= 0) ans += "-weight-dem-index-" + vw::stringify(opt.save_dem_weight); return ans; } // Initializations needed for various modes void initializeTileVector(int num_images, vw::BBox2i const& bbox, asp::DemMosaicOptions const& opt, // Outputs vw::ImageView<double> & tile, std::vector<vw::ImageView<double>>& tile_vec, std::vector<vw::ImageView<double>>& weight_vec) { // Wipe the output vectors tile_vec.clear(); weight_vec.clear(); if (opt.median || opt.nmad) // Store each input separately tile_vec.reserve(num_images); if (opt.stddev) { // Need one working image tile_vec.push_back(vw::ImageView<double>(bbox.width(), bbox.height())); // Each pixel starts at zero, nodata is handled later vw::fill(tile_vec[0], 0.0); vw::fill(tile, 0.0); } if (opt.priority_blending_len > 0) { // Store each weight separately tile_vec.reserve (num_images); weight_vec.reserve(num_images); } return; } // Process block max: find DEM with max pixel sum and use it. Print the sum of // pixels per block. void processBlockMax(double out_nodata_value, vw::BBox2i const& bbox, std::vector<vw::ImageView<double>> const& tile_vec, std::vector<std::string> const& dem_vec, vw::ImageView<double> & tile) { vw::fill(tile, out_nodata_value); int num_tiles = tile_vec.size(); if (tile_vec.size() != dem_vec.size()) vw::vw_throw(vw::ArgumentErr() << "Book-keeping error.\n"); std::vector<double> tile_sum(num_tiles, 0); for (int i = 0; i < num_tiles; i++) { for (int c = 0; c < tile_vec[i].cols(); c++) { for (int r = 0; r < tile_vec[i].rows(); r++) { if (tile_vec[i](c, r) != out_nodata_value) tile_sum[i] += tile_vec[i](c, r); } } // The whole purpose of --block-max is to print the sum of // pixels for each mapprojected image/DEM when doing SfS. // The documentation has a longer explanation. vw::vw_out() << "\n" << bbox << " " << dem_vec[i] << " pixel sum: " << tile_sum[i] << "\n"; } int max_index = std::distance(tile_sum.begin(), std::max_element(tile_sum.begin(), tile_sum.end())); if (max_index >= 0 && max_index < num_tiles) tile = copy(tile_vec[max_index]); } // Use the weights created so far only to burn holes in // the DEMs where we don't want blending. Then we will have to // recreate the weights. That because the current weights have // been interpolated from a different grid, and won't handle // erosion and blur well. void priorityBlend(double out_nodata_value, double bias, double weights_blur_sigma, double weights_exp, bool no_border_blend, int save_dem_weight, std::vector<int> const& clip2dem_index, vw::cartography::GeoReference const& out_georef, vw::BBox2i const& bbox, // Outputs std::vector<vw::ImageView<double>> & tile_vec, std::vector<vw::ImageView<double>> & weight_vec, vw::ImageView<double> & tile, vw::ImageView<double> & weights, vw::ImageView<double> & saved_weight) { if (tile_vec.size() != weight_vec.size() || tile_vec.size() != clip2dem_index.size()) vw::vw_throw(vw::ArgumentErr() << "There must be as many dem tiles as weight tiles.\n"); // Set image values to nodata where weight is <= 0 for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++) asp::setNoDataByWeight(out_nodata_value, tile_vec[clip_iter], weight_vec[clip_iter]); // Update the weights given the created nodata regions for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++) weight_vec[clip_iter] = grassfire(notnodata(tile_vec[clip_iter], out_nodata_value), no_border_blend); // Don't allow the weights to become big, for uniqueness across tiles for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++) asp::clampWeights(bias, weight_vec[clip_iter]); // Blur the weights for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++) asp::blurWeights(weight_vec[clip_iter], weights_blur_sigma); // Raise to power if (weights_exp != 1) { for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++) asp::raiseToPower(weights_exp, weight_vec[clip_iter]); } // Now we are ready for blending vw::fill(tile, out_nodata_value); vw::fill(weights, 0.0); if (save_dem_weight >= 0) vw::fill(saved_weight, 0.0); // Accumulate weighted contributions from each DEM clip for (size_t clip_iter = 0; clip_iter < weight_vec.size(); clip_iter++) accumWeightedTiles(out_nodata_value, save_dem_weight, clip2dem_index[clip_iter], tile_vec[clip_iter], weight_vec[clip_iter], tile, weights, saved_weight); // Compute the weighted average computeWeightedAverage(save_dem_weight, tile, weights, saved_weight); return; } // Process a DEM tile pixel by pixel. Take into account the various // blending options. void processDemTile(asp::DemMosaicOptions const& opt, vw::BBox2i const& bbox, vw::Vector2 const& in_box_min, vw::ImageView<asp::DoubleGrayA> const& dem, vw::ImageViewRef<asp::DoubleGrayA> const& interp_dem, vw::cartography::GeoTransform const& geotrans, std::vector<vw::ImageView<double>>& tile_vec, bool noblend, bool use_priority_blend, int dem_iter, double tol, // Outputs vw::ImageView<double>& tile, vw::ImageView<double>& weights, vw::ImageView<double>& weight_modifier, vw::ImageView<double>& saved_weight, vw::ImageView<double>& index_map) { // Loop through each output pixel for (int c = 0; c < bbox.width(); c++) { for (int r = 0; r < bbox.height(); r++) { // Coordinates in the output mosaic vw::Vector2 out_pix(c + bbox.min().x(), r + bbox.min().y()); // Coordinate in this input DEM vw::Vector2 in_pix = geotrans.reverse(out_pix); // Input DEM pixel relative to loaded bbox double x = in_pix[0] - in_box_min.x(); double y = in_pix[1] - in_box_min.y(); // Interpolate asp::DoubleGrayA pval = asp::interpDem(x, y, dem, interp_dem, tol, opt.propagate_nodata); // Separate the value and alpha for this pixel. double val = pval.v(); double wt = pval.a(); if (use_priority_blend) { // The priority blending, pixels from earlier DEMs at this location // are used unmodified unless close to that DEM boundary. wt = std::min(weight_modifier(c, r), wt); // Now ensure that the current DEM values will be used // unmodified unless close to the boundary for subsequent // DEMs. The weight w2 will be 0 well inside the DEM, and // increase towards the boundary. double wt2 = wt; wt2 = std::max(0.0, opt.priority_blending_len - wt2); weight_modifier(c, r) = std::min(weight_modifier(c, r), wt2); } // If point is in-bounds and nodata, make sure this point stays // at nodata even if other DEMs contain it. if (wt == 0 && opt.propagate_nodata) { tile(c, r) = 0; weights(c, r) = -1.0; } if (wt <= 0.0) continue; // No need to continue if the weight is zero // Check if the current output value at this pixel is nodata bool is_nodata = ((tile(c, r) == opt.out_nodata_value)); // Initialize the tile if not done already. // Init to zero not needed with some types. if (!opt.stddev && !opt.median && !opt.nmad && !opt.min && !opt.max && !use_priority_blend) { if (is_nodata) { tile(c, r) = 0; weights(c, r) = 0.0; } } // Update the output value according to the commanded mode if ((opt.first && is_nodata) || opt.last || (opt.min && (val < tile(c, r) || is_nodata)) || (opt.max && (val > tile(c, r) || is_nodata)) || opt.median || opt.nmad || use_priority_blend || opt.block_max) { // Conditions where we replace the current value tile(c, r) = val; weights(c, r) = wt; // In these cases, the saved weight will be 1 or 0, since either // a given DEM gives it all, or nothing at all. if (opt.save_dem_weight >= 0 && (opt.first || opt.last || opt.min || opt.max)) saved_weight(c, r) = (opt.save_dem_weight == dem_iter); // In these cases, the saved weight will be 1 or 0, since either // a given DEM gives it all, or nothing at all. if (opt.save_index_map && (opt.first || opt.last || opt.min || opt.max)) index_map(c, r) = dem_iter; } else if (opt.mean) { // For the mean, accumulate the value tile(c, r) += val; weights(c, r)++; if (opt.save_dem_weight == dem_iter) saved_weight(c, r) = 1; } else if (opt.count) { // Increment the count tile(c, r)++; weights(c, r) += wt; } else if (opt.stddev) { // Standard deviation: use Welford's online algorithm for numerical // stability. Accumulate: count in weights, running mean in tile_vec[0], // sum of squared deviations in tile. Final stddev computed later by // finishStdDevCalc(). weights(c, r) += 1.0; double currMean = tile_vec[0](c,r); double delta = val - currMean; currMean += delta / weights(c, r); double sumSqDev = tile(c, r) + delta*(val - currMean); tile(c, r) = sumSqDev; tile_vec[0](c,r) = currMean; } else if (!noblend) { // For blending do the weighted average tile(c, r) += wt*val; weights(c, r) += wt; if (opt.save_dem_weight == dem_iter) saved_weight(c, r) = wt; } } // End col loop } // End row loop return; } void processMedianOrNmad(vw::BBox2i const& bbox, double out_nodata_value, bool is_median, bool save_index_map, std::vector<int> const& clip2dem_index, std::vector<vw::ImageView<double>> const& tile_vec, vw::ImageView<double> & tile, vw::ImageView<double> & index_map) { // Init output pixels to nodata vw::fill(tile, out_nodata_value); std::vector<double> vals, vals_all(tile_vec.size()); // Iterate through all pixels for (int c = 0; c < bbox.width(); c++) { for (int r = 0; r < bbox.height(); r++) { // Compute the median for this pixel vals.clear(); for (int i = 0; i < (int)tile_vec.size(); i++) { vw::ImageView<double> const& tile_ref = tile_vec[i]; double this_val = tile_ref(c, r); vals_all[i] = this_val; // Record the original order. if (this_val == out_nodata_value) continue; vals.push_back(this_val); } if (vals.empty()) continue; if (is_median) tile(c, r) = vw::math::destructive_median(vals); else tile(c, r) = vw::math::destructive_nmad(vals); if (!save_index_map) continue; // Record the index of the image that is closest to the // median value. Note that the median can average two // values, so the median value may not equal exactly any of // the input values. double min_dist = std::numeric_limits<double>::max(); for (size_t m = 0; m < vals_all.size(); m++) { double dist = fabs(vals_all[m] - tile(c, r)); if (dist < min_dist) { // Here we save the index not in the current array which // is m, but in the full list of DEMs, some of which are // likely skipped in this tile as they don't intersect // it. index_map(c, r) = clip2dem_index[m]; min_dist = dist; } } }// End row loop } // End col loop return; } // Finish standard deviation calculation. At this point, tile contains sum of // squared deviations from mean, and weights contains the count of valid pixels // at each location. void finishStdDevCalc(double out_nodata_value, vw::ImageView<double> & tile, vw::ImageView<double> const& weights) { for (int c = 0; c < tile.cols(); c++) { for (int r = 0; r < tile.rows(); r++) { if (weights(c, r) > 1.0) tile(c, r) = sqrt(tile(c, r) / (weights(c, r) - 1.0)); else // Invalid pixel tile(c, r) = out_nodata_value; } } } // Count valid pixels in tile and update global counter. Care to use a lock when // updating the global counter. Use int64 to not overflow for large images. void updateNumValidPixels(vw::ImageView<double> const& tile, double out_nodata_value, vw::BBox2i const& bbox, vw::BBox2i const& orig_box, std::int64_t & num_valid_pixels, vw::Mutex & count_mutex) { std::int64_t num_valid_in_tile = 0; for (int col = 0; col < tile.cols(); col++) { for (int row = 0; row < tile.rows(); row++) { vw::Vector2 pix = vw::Vector2(col, row) + bbox.min(); if (!orig_box.contains(pix)) continue; // in case the box got expanded, ignore the padding if (tile(col, row) == out_nodata_value) continue; num_valid_in_tile++; } } { // Lock and update the total number of valid pixels vw::Mutex::Lock lock(count_mutex); num_valid_pixels += num_valid_in_tile; } } // Check that all input DEMs have compatible datums with the output // Load and preprocess a single DEM for mosaicking. This includes cropping to the // region of interest, invalidating pixels by threshold, handling NaN values, filling // holes, and blurring if requested. void preprocessDem(int dem_iter, vw::BBox2i const& bbox, vw::BBox2i const& in_box, asp::DemMosaicOptions const& opt, vw::DiskImageManager<float> & imgMgr, std::vector<double> const& nodata_values, // Outputs vw::ImageView<asp::DoubleGrayA>& dem, double& nodata_value) { // Load the DEM from disk and crop to region of interest. The DEM is 2-channel: // first channel is elevation, second is alpha (used for weights later). vw::ImageViewRef<double> disk_dem = vw::pixel_cast<double>(imgMgr.get_handle(dem_iter, bbox)); dem = vw::crop(disk_dem, in_box); // Determine the effective nodata value. If nodata_threshold is specified, // all values <= threshold are invalidated and threshold becomes the nodata value. nodata_value = nodata_values[dem_iter]; if (!std::isnan(opt.nodata_threshold)) { nodata_value = opt.nodata_threshold; asp::invalidateByThreshold(nodata_value, nodata_value, dem); } // NaN values get set to nodata. This is a bugfix for datasets with NaN. asp::invalidateNaN(nodata_value, dem); // Fill holes using grassfire algorithm. This happens on the expanded tile to // ensure we catch holes partially outside the processing region. if (opt.hole_fill_len > 0) dem = vw::apply_mask(vw::fill_holes_grass(vw::create_mask(select_channel(dem, 0), nodata_value), opt.hole_fill_len), nodata_value); // Fill nodata based on search radius. Uses weighted interpolation from nearby // valid pixels. Note: validation ensures this and hole_fill_len aren't both used. if (opt.fill_search_radius > 0.0) dem = vw::apply_mask( fillNodataWithSearchRadius(vw::create_mask(select_channel(dem, 0), nodata_value), opt.fill_search_radius, opt.fill_power, opt.fill_percent, opt.fill_num_passes), nodata_value); // Blur the DEM if requested. First fill nodata slightly to avoid large holes // around nodata regions when blurring (blurring can't handle nodata directly). if (opt.dem_blur_sigma > 0.0) { int kernel_size = vw::compute_kernel_size(opt.dem_blur_sigma); dem = vw::apply_mask(gaussian_filter(fill_nodata_with_avg( vw::create_mask(select_channel(dem, 0), nodata_value), kernel_size), opt.dem_blur_sigma), nodata_value); } // Mark the image as not in use in the manager (but keep file open for performance) imgMgr.release(dem_iter); } // Erode the DEM based on grassfire weights and recompute weights using centerline algorithm. // This is used for priority blending where weights follow the DEM centerline. void erodeCreateCenterlineWeights(vw::ImageView<asp::DoubleGrayA> const& dem, double nodata_value, int erode_len, int bias, // Outputs vw::ImageView<double>& weights) { // Create eroded DEM by invalidating pixels where grassfire weight <= erode_len vw::ImageView<asp::DoubleGrayA> eroded_dem = copy(dem); for (int col = 0; col < eroded_dem.cols(); col++) { for (int row = 0; row < eroded_dem.rows(); row++) { if (weights(col, row) <= erode_len) eroded_dem(col, row) = asp::DoubleGrayA(nodata_value); } } // Compute centerline weights on the eroded DEM vw::ImageView<vw::PixelMask<double>> mask_img = create_mask_less_or_equal(select_channel(eroded_dem, 0), nodata_value); asp::centerlineWeightsWithHoles(mask_img, weights, bias); } // Compute weights for a DEM in the mosaic. This applies a pipeline of operations: // grassfire distance, erosion/centerline, clamping, blurring, power function. // Different steps are skipped depending on options (priority blend, centerline weights). void computeDemWeights(vw::ImageView<asp::DoubleGrayA> const& dem, double nodata_value, asp::DemMosaicOptions const& opt, int bias, bool use_priority_blend, int dem_iter, vw::BBox2i const& in_box, // Outputs vw::ImageView<double>& weights) { // Compute linear weights using grassfire distance transform weights = grassfire(notnodata(select_channel(dem, 0), nodata_value), opt.no_border_blend); // Erode based on grassfire weights, and then overwrite the grassfire // weights with centerline weights if (opt.use_centerline_weights) erodeCreateCenterlineWeights(dem, nodata_value, opt.erode_len, bias, weights); // Clamp the weights to ensure the results agree across tiles. For // priority blending length, we'll do this process later, as the bbox is // obtained differently in that case. With centerline weights, that is // handled before 1D weights are multiplied to get the 2D weights. if (!use_priority_blend && !opt.use_centerline_weights) asp::clampWeights(bias, weights); // Erode. We already did that if centerline weights are used. if (!opt.use_centerline_weights) { int max_cutoff = max_pixel_value(weights); int min_cutoff = opt.erode_len; if (max_cutoff <= min_cutoff) max_cutoff = min_cutoff + 1; // precaution weights = clamp(weights - min_cutoff, 0.0, max_cutoff - min_cutoff); } // Blur the weights. If priority blending length is on, we'll do the blur later, // after weights from different DEMs are combined. if (opt.weights_blur_sigma > 0 && !use_priority_blend) asp::blurWeights(weights, opt.weights_blur_sigma); // Raise to the power. Note that when priority blending length is positive, we // delay this process. if (opt.weights_exp != 1 && !use_priority_blend) asp::raiseToPower(opt.weights_exp, weights); // Apply external weights if (!opt.weight_files.empty()) asp::applyExternalWeights(opt.weight_files[dem_iter], opt.min_weight, opt.invert_weights, in_box, weights); // The weights must be zero where the DEM is no-data. This is a bugfix. for (int col = 0; col < weights.cols(); col++) { for (int row = 0; row < weights.rows(); row++) { if (select_channel(dem, 0)(col, row) == nodata_value) weights(col, row) = 0.0; } } } // Copy weights from separate weight image into the alpha channel of the DEM. void setWeightsAsAlphaChannel(vw::ImageView<double> const& weights, // Outputs vw::ImageView<asp::DoubleGrayA>& dem) { for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { dem(col, row).a() = weights(col, row); } } } /// Class that does the actual image processing work class DemMosaicView: public vw::ImageViewBase<DemMosaicView> { int m_cols, m_rows, m_bias; asp::DemMosaicOptions const& m_opt; // alias vw::DiskImageManager<float> & m_imgMgr; // alias std::vector<vw::cartography::GeoReference> const& m_georefs; // alias vw::cartography::GeoReference m_out_georef; std::vector<double> const& m_nodata_values; // alias std::vector<vw::BBox2i> const& m_dem_pixel_bboxes; // alias std::int64_t & m_num_valid_pixels; // alias, to populate on output vw::Mutex & m_count_mutex; // alias, a lock for m_num_valid_pixels public: DemMosaicView(int cols, int rows, int bias, asp::DemMosaicOptions const& opt, std::vector<vw::cartography::GeoReference> const& georefs, vw::cartography::GeoReference const& out_georef, std::vector<double> const& nodata_values, std::vector<vw::BBox2i> const& dem_pixel_bboxes, // Outputs vw::DiskImageManager<float> & imgMgr, std::int64_t & num_valid_pixels, vw::Mutex & count_mutex): m_cols(cols), m_rows(rows), m_bias(bias), m_opt(opt), m_imgMgr(imgMgr), m_georefs(georefs), m_out_georef(out_georef), m_nodata_values(nodata_values), m_dem_pixel_bboxes(dem_pixel_bboxes), m_num_valid_pixels(num_valid_pixels), m_count_mutex(count_mutex) { // How many valid pixels we will have m_num_valid_pixels = 0; if (imgMgr.size() != georefs.size() || imgMgr.size() != nodata_values.size() || imgMgr.size() != dem_pixel_bboxes.size()) vw::vw_throw(vw::ArgumentErr() << "Inputs expected to have the same size do not.\n"); // Sanity check, see if datums differ, then the tool won't work asp::demMosaicDatumCheck(m_georefs, m_out_georef); } // Output image properties typedef float pixel_type; typedef pixel_type result_type; typedef vw::ProceduralPixelAccessor<DemMosaicView> pixel_accessor; inline int cols () const { return m_cols; } inline int rows () const { return m_rows; } inline int planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double/*i*/, double/*j*/, int/*p*/ = 0) const { vw::vw_throw(vw::NoImplErr() << "DemMosaicView::operator()(...) is not implemented"); return pixel_type(); } typedef vw::CropView<vw::ImageView<pixel_type> > prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i bbox) const { vw::BBox2i orig_box = bbox; // Get a shorthand for this const bool use_priority_blend = (m_opt.priority_blending_len > 0); // When doing priority blending, we will do all the work in the // output pixels domain. Hence we need to take into account the // bias here rather than later. if (use_priority_blend) bbox.expand(m_bias + vw::BilinearInterpolation::pixel_buffer + 1); // We will do all computations in double precision, regardless of the // precision of the inputs, for increased accuracy. The image data buffers // are initialized here. vw::ImageView<double> tile(bbox.width(), bbox.height()); // the output tile (most cases) vw::ImageView<double> weights(bbox.width(), bbox.height()); // weights (most cases) vw::fill(tile, m_opt.out_nodata_value); vw::fill(weights, 0.0); // True if we won't be doing any DEM blending. bool noblend = (numNoBlendOptions(m_opt) > 0); // A vector of tiles, each of the size of the output tile, // is for median, nmad, and stddev calculation. int num_images = m_imgMgr.size(); std::vector<vw::ImageView<double>> tile_vec, weight_vec; std::vector<std::string> dem_vec; initializeTileVector(num_images, bbox, m_opt, tile, tile_vec, weight_vec); // This will ensure that pixels from earlier images are mostly used // unmodified except being blended at the boundary. vw::ImageView<double> weight_modifier; if (use_priority_blend) { weight_modifier = vw::ImageView<double>(bbox.width(), bbox.height()); vw::fill(weight_modifier, std::numeric_limits<double>::max()); } // For saving the weights std::vector<int> clip2dem_index; vw::ImageView<double> saved_weight; if (m_opt.save_dem_weight >= 0) { saved_weight = vw::ImageView<double>(bbox.width(), bbox.height()); vw::fill(saved_weight, 0.0); } // For saving the index map vw::ImageView<double> index_map; if (m_opt.save_index_map) { index_map = vw::ImageView<double>(bbox.width(), bbox.height()); vw::fill(index_map, m_opt.out_nodata_value); // Sanity check: the output no-data value must not equal to // any of the indices in the map, as then the two cannot be // distinguished. for (int dem_iter = 0; dem_iter < (int)m_imgMgr.size(); dem_iter++) { if (dem_iter == m_opt.out_nodata_value) vw::vw_throw(vw::ArgumentErr() << "Cannot have the output no-data value equal to " << m_opt.out_nodata_value << " as this is one of the indices being saved in the index map.\n"); } } // Loop through all input DEMs for (int dem_iter = 0; dem_iter < (int)m_imgMgr.size(); dem_iter++) { // Load the information for this DEM vw::cartography::GeoReference georef= m_georefs[dem_iter]; vw::BBox2i dem_pixel_box = m_dem_pixel_bboxes[dem_iter]; // The vw::cartography::GeoTransform will hide the messy details of conversions // from pixels to points and lon-lat. vw::cartography::GeoTransform geotrans(georef, m_out_georef, dem_pixel_box, bbox); // Get the tile bbox in the frame of the current input DEM vw::BBox2 in_box = geotrans.reverse_bbox(bbox); // Grow to account for blending and erosion length, etc. If // priority blending length was positive, we've already expanded 'bbox'. if (!use_priority_blend) in_box.expand(m_bias + vw::BilinearInterpolation::pixel_buffer + 1); in_box.crop(dem_pixel_box); if (in_box.width() == 1 || in_box.height() == 1) { // Grassfire likes to have width of at least 2 in_box.expand(1); in_box.crop(dem_pixel_box); } if (in_box.width() <= 1 || in_box.height() <= 1) continue; // No overlap with this tile, skip to the next DEM. if (m_opt.median || m_opt.nmad || use_priority_blend || m_opt.block_max) { // Must use a blank tile each time vw::fill(tile, m_opt.out_nodata_value); vw::fill(weights, 0.0); } // Load and preprocess this DEM (crop, threshold, fill, blur) vw::ImageView<asp::DoubleGrayA> dem; double nodata_value = -std::numeric_limits<double>::max(); // will change preprocessDem(dem_iter, bbox, in_box, m_opt, m_imgMgr, m_nodata_values, dem, nodata_value); // Compute weights for this DEM vw::ImageView<double> local_wts; computeDemWeights(dem, nodata_value, m_opt, m_bias, use_priority_blend, dem_iter, in_box, local_wts); // Save the weights with georeference. Very useful for debugging // non-uniqueness issues across tiles. if (false) saveTileWeight(dem_iter, bbox, local_wts, georef); // Set the weights in the alpha channel asp::setWeightsAsAlphaChannel(local_wts, dem); // Prepare the DEM for interpolation vw::ImageViewRef<asp::DoubleGrayA> interp_dem = interpolate(dem, vw::BilinearInterpolation(), vw::ConstantEdgeExtension()); // Process the DEM tile pixel by pixel processDemTile(m_opt, bbox, in_box.min(), dem, interp_dem, geotrans, tile_vec, noblend, use_priority_blend, dem_iter, g_tol, // Outputs tile, weights, weight_modifier, saved_weight, index_map); // For the median option, keep a copy of the output tile for each input DEM. // Also do it for max per block. This will be memory intensive. if (m_opt.median || m_opt.nmad || m_opt.block_max) { std::string dem_name = m_imgMgr.get_file_name(dem_iter); tile_vec.push_back(copy(tile)); dem_vec.push_back(dem_name); } // For priority blending, need also to keep all tiles, but also the weights if (use_priority_blend) { tile_vec.push_back(copy(tile)); weight_vec.push_back(copy(weights)); } if (use_priority_blend || m_opt.save_index_map) clip2dem_index.push_back(dem_iter); } // End iterating over DEMs // Divide by the weights in blend, mean if (!noblend || m_opt.mean) asp::divideByWeight(tile, weights); // Finish stddev calculations if (m_opt.stddev) finishStdDevCalc(m_opt.out_nodata_value, tile, weights); // Median and nmad operations if (m_opt.median || m_opt.nmad) processMedianOrNmad(bbox, m_opt.out_nodata_value, m_opt.median, m_opt.save_index_map, clip2dem_index, tile_vec, // Outputs tile, index_map); // For max per block, find the sum of values in each DEM if (m_opt.block_max) processBlockMax(m_opt.out_nodata_value, bbox, tile_vec, dem_vec, tile); // For priority blending length, use the weights created so far only to burn holes in // the DEMs where we don't want blending, then recreate the weights if (use_priority_blend) priorityBlend(m_opt.out_nodata_value, m_bias, m_opt.weights_blur_sigma, m_opt.weights_exp, m_opt.no_border_blend, m_opt.save_dem_weight, clip2dem_index, m_out_georef, bbox, // Outputs tile_vec, weight_vec, tile, weights, saved_weight); // Save the weight instead if (m_opt.save_dem_weight >= 0) tile = saved_weight; // Save the index map instead if (m_opt.save_index_map) tile = index_map; // How many valid pixels are there in the tile updateNumValidPixels(tile, m_opt.out_nodata_value, bbox, orig_box, m_num_valid_pixels, m_count_mutex); // Return the tile we created with fake borders to make it look // the size of the entire output image. So far we operated // on doubles, here we cast to float. return prerasterize_type(vw::pixel_cast<float>(tile), -bbox.min().x(), -bbox.min().y(), cols(), rows()); } // end function prerasterize template <class DestT> inline void rasterize(DestT const& dest, vw::BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class DemMosaicView /// Find the bounding box of all DEMs in the projected space. /// - mosaic_bbox is the output bounding box in projected space /// - dem_proj_bboxes and dem_pixel_bboxes are the locations of /// each input DEM in the output DEM in projected and pixel coordinates. void loadDemBdBoxes(asp::DemMosaicOptions const& opt, vw::cartography::GeoReference const& mosaic_georef, vw::BBox2& mosaic_bbox, // Projected coordinates std::vector<vw::BBox2>& dem_proj_bboxes, std::vector<vw::BBox2i>& dem_pixel_bboxes) { vw::vw_out() << "Determining the bounding boxes of the inputs.\n"; // Initialize the outputs mosaic_bbox = vw::BBox2(); dem_proj_bboxes.clear(); dem_pixel_bboxes.clear(); vw::TerminalProgressCallback tpc("", "\t--> "); tpc.report_progress(0); double inc_amount = 1.0 / double(opt.dem_files.size()); // Loop through all DEMs for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++) { // Open a handle to this DEM file vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[dem_iter]); vw::DiskImageView<float> img(opt.dem_files[dem_iter]); vw::cartography::GeoReference georef = asp::readGeorefOrThrow(opt.dem_files[dem_iter]); vw::BBox2i pixel_box = bounding_box(img); dem_pixel_bboxes.push_back(pixel_box); bool has_lonat = (georef.proj4_str().find("+proj=longlat") != std::string::npos || mosaic_georef.proj4_str().find("+proj=longlat") != std::string::npos); // Compute bounding box of this DEM. The simple case is when all DEMs have // the same projection, and it is not longlat, as then we need to worry about // a 360 degree shift. if ((!has_lonat) && mosaic_georef.get_wkt() == georef.get_wkt()) { vw::BBox2 proj_box = georef.pixel_to_point_bbox(vw::bounding_box(img)); mosaic_bbox.grow(proj_box); dem_proj_bboxes.push_back(proj_box); } else { // Compute the bounding box of the current image in projected // coordinates of the mosaic. There is always a worry that the // lonlat of the mosaic so far and of the current DEM will be // offset by 360 degrees. Try to deal with that. vw::BBox2 proj_box; vw::BBox2 imgbox = bounding_box(img); vw::BBox2 mosaic_pixel_box; // Get the bbox of current mosaic in pixels. if (dem_iter == 0) { // TODO: Not robust. How to estimate the pixel extent of the // first DEM in the mosaic? Taking into account that // the first DEM lonlat box and the mosaic lonlat box // may be offset by 360 degrees? mosaic_pixel_box = imgbox; } else { mosaic_pixel_box = mosaic_georef.point_to_pixel_bbox(mosaic_bbox); } vw::cartography::GeoTransform geotrans(georef, mosaic_georef, imgbox, mosaic_pixel_box); proj_box = geotrans.pixel_to_point_bbox(imgbox); mosaic_bbox.grow(proj_box); dem_proj_bboxes.push_back(proj_box); } // End second case tpc.report_incremental_progress(inc_amount); } // End loop through DEM files tpc.report_finished(); } // End function loadDemBdBoxes // Load DEMs that intersect with the current tile batch. This filters the input DEMs // to only those needed for the tiles being processed, and prepares them for mosaicking. void loadDemsForTiles(asp::DemMosaicOptions const& opt, std::vector<vw::BBox2> const& demProjBboxes, std::vector<vw::BBox2i> const& demPixelBboxes, std::vector<vw::BBox2i> const& tilePixelBboxes, int startTile, int endTile, vw::cartography::GeoReference const& mosaicGeoref, vw::BBox2i const& outputDemBox, // Outputs vw::DiskImageManager<float>& imgMgr, std::vector<std::string>& loadedDems, std::vector<double>& nodataValues, std::vector<vw::cartography::GeoReference>& georefs, std::vector<vw::BBox2i>& loadedDemPixelBboxes) { // Loop through all DEMs for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++) { // Get the DEM bounding box that we previously computed (output projected coords) vw::BBox2 dem_bbox = demProjBboxes[dem_iter]; // Go through each of the tile bounding boxes and see they intersect this DEM bool use_this_dem = false; for (int tile_id = startTile; tile_id < endTile; tile_id++) { if (!opt.tile_list.empty() && opt.tile_list.find(tile_id) == opt.tile_list.end()) continue; // Get tile bbox in pixels, then convert it to projected coords. vw::BBox2i tile_pixel_box = tilePixelBboxes[tile_id - startTile]; vw::BBox2 tile_proj_box = mosaicGeoref.pixel_to_point_bbox(tile_pixel_box); if (tile_proj_box.intersects(dem_bbox)) { use_this_dem = true; break; } } if (!use_this_dem) continue; // Skip to the next DEM if we don't need this one. // The vw::cartography::GeoTransform will hide the messy details of conversions // from pixels to points and lon-lat. vw::cartography::GeoReference georef = asp::readGeorefOrThrow(opt.dem_files[dem_iter]); vw::BBox2i dem_pixel_box = demPixelBboxes[dem_iter]; vw::cartography::GeoTransform geotrans(georef, mosaicGeoref, dem_pixel_box, outputDemBox); // Get the current DEM bounding box in pixel units of the output mosaicked DEM vw::BBox2 curr_box = geotrans.forward_bbox(dem_pixel_box); curr_box.crop(outputDemBox); // This is a fix for GDAL crashing when there are too many open // file handles. In such situation, just selectively close the // handles furthest from the current location. imgMgr.add_file_handle_not_thread_safe(opt.dem_files[dem_iter], curr_box); double curr_nodata_value = opt.out_nodata_value; try { // Get the nodata-value. Need a try block, in case we can't // open more handles. vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[dem_iter]); if (in_rsrc.has_nodata_read()) curr_nodata_value = float(in_rsrc.nodata_read()); } catch(std::exception const& e) { // Try again imgMgr.freeup_handles_not_thread_safe(); vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[dem_iter]); if (in_rsrc.has_nodata_read()) curr_nodata_value = float(in_rsrc.nodata_read()); } loadedDems.push_back(opt.dem_files[dem_iter]); if (!std::isnan(opt.nodata_threshold)) curr_nodata_value = opt.nodata_threshold; // Add the info for this DEM to the appropriate vectors nodataValues.push_back(curr_nodata_value); georefs.push_back(georef); loadedDemPixelBboxes.push_back(dem_pixel_box); } // End loop through DEM files } // Determine the output nodata value. Read from first DEM if not user-specified, // and validate that it can be represented exactly as a float. void determineNodataValue(asp::DemMosaicOptions& opt) { // Read nodata from first DEM, unless the user chooses to specify it. // Cast nodata to float since DEMs are read as float. if (!opt.has_out_nodata) { vw::DiskImageResourceGDAL in_rsrc(opt.dem_files[0]); if (in_rsrc.has_nodata_read()) opt.out_nodata_value = float(in_rsrc.nodata_read()); } // Watch for underflow, if mixing doubles and float. Particularly problematic // is when the nodata_value cannot be represented exactly as a float. if (opt.out_nodata_value < static_cast<double>(-std::numeric_limits<float>::max()) || float(opt.out_nodata_value) != double(opt.out_nodata_value)) { vw::vw_out() << "The no-data value cannot be represented exactly as a float. " << "Changing it to the smallest float.\n"; opt.out_nodata_value = static_cast<double>(-std::numeric_limits<float>::max()); } vw::vw_out() << "Using output no-data value: " << opt.out_nodata_value << "\n"; } // Compute the bias for reading from images beyond tile boundaries to avoid // tiling artifacts. This accounts for erosion, blurring, hole filling, etc. int computeTileBias(asp::DemMosaicOptions const& opt) { // This bias is very important. This is how much we should read from // the images beyond the current boundary to avoid tiling artifacts. // The +1 is to ensure extra pixels beyond the hole fill length. int bias = opt.erode_len + opt.extra_crop_len + opt.hole_fill_len + opt.fill_search_radius + 2*std::max(vw::compute_kernel_size(opt.weights_blur_sigma), vw::compute_kernel_size(opt.dem_blur_sigma)) + 1; // If we just fill holes based on search radius, we do not need a large bias. // Filling with large search radius is slow as it is. if (opt.fill_search_radius > 0) bias = opt.fill_search_radius + 10; return bias; } // Save DEM tile with type conversion (template) template<typename T> void saveDemTileAsType(int blockSize, std::string const& demTile, vw::ImageViewRef<float> const& outDem, vw::cartography::GeoReference const& cropGeoref, asp::DemMosaicOptions const& opt) { bool hasGeoref = true, hasNodata = true; vw::TerminalProgressCallback tpc("asp", "\t--> "); asp::saveWithTempBigBlocks(blockSize, demTile, per_pixel_filter(outDem, vw::RoundAndClamp<T, float>()), hasGeoref, cropGeoref, hasNodata, vw::round_and_clamp<T>(opt.out_nodata_value), opt, tpc); } // Specialization for Float32 (no conversion needed) template<> void saveDemTileAsType<float>(int blockSize, std::string const& demTile, vw::ImageViewRef<float> const& outDem, vw::cartography::GeoReference const& cropGeoref, asp::DemMosaicOptions const& opt) { bool hasGeoref = true, hasNodata = true; vw::TerminalProgressCallback tpc("asp", "\t--> "); asp::saveWithTempBigBlocks(blockSize, demTile, outDem, hasGeoref, cropGeoref, hasNodata, opt.out_nodata_value, opt, tpc); } // Save DEM tile to disk with appropriate type conversion based on output_type option. void saveDemTile(int blockSize, std::string const& demTile, vw::ImageViewRef<float> const& outDem, vw::cartography::GeoReference const& cropGeoref, asp::DemMosaicOptions const& opt) { vw::vw_out() << "Writing: " << demTile << "\n"; if (opt.output_type == "Float32") saveDemTileAsType<float>(blockSize, demTile, outDem, cropGeoref, opt); else if (opt.output_type == "Byte") saveDemTileAsType<vw::uint8>(blockSize, demTile, outDem, cropGeoref, opt); else if (opt.output_type == "UInt16") saveDemTileAsType<vw::uint16>(blockSize, demTile, outDem, cropGeoref, opt); else if (opt.output_type == "Int16") saveDemTileAsType<vw::int16>(blockSize, demTile, outDem, cropGeoref, opt); else if (opt.output_type == "UInt32") saveDemTileAsType<vw::uint32>(blockSize, demTile, outDem, cropGeoref, opt); else if (opt.output_type == "Int32") saveDemTileAsType<vw::int32>(blockSize, demTile, outDem, cropGeoref, opt); else vw::vw_throw(vw::NoImplErr() << "Unsupported output type: " << opt.output_type << ".\n"); } // Compute block size for rasterization based on bias and user options. // Block size is set to next power of 2 >= 4*bias, with minimum of 256. int computeBlockSize(int bias, asp::DemMosaicOptions const& opt) { // The next power of 2 >= 4*bias. We want to make the blocks big, // to reduce overhead from this bias, but not so big that it may // not fit in memory. int block_size = vw::nextpow2(4.0*bias); block_size = std::max(block_size, 256); // don't make them too small though if (opt.block_size > 0) block_size = opt.block_size; // The block size must be a multiple of 16 if (block_size % 16 != 0) vw::vw_throw(vw::ArgumentErr() << "The block size must be a multiple of 16.\n"); return block_size; } // Setup tile grid parameters and validate configuration. // Determines number of tiles, checks for single-file output mode, validates tile index. void setupTileGrid(int cols, int rows, asp::DemMosaicOptions const& opt, // Outputs int& num_tiles_x, int& num_tiles_y, int& num_tiles, bool& write_to_precise_file) { // See if to lump all mosaic in just a given file, rather than creating tiles. write_to_precise_file = (opt.out_prefix.size() >= 4 && opt.out_prefix.substr(opt.out_prefix.size()-4, 4) == ".tif"); num_tiles_x = (int)ceil((double)cols/double(opt.tile_size)); num_tiles_y = (int)ceil((double)rows/double(opt.tile_size)); if (num_tiles_x <= 0) num_tiles_x = 1; if (num_tiles_y <= 0) num_tiles_y = 1; num_tiles = num_tiles_x*num_tiles_y; vw::vw_out() << "Number of tiles: " << num_tiles_x << " x " << num_tiles_y << " = " << num_tiles << ".\n"; if (opt.tile_index >= num_tiles) vw::vw_throw(vw::ArgumentErr() << "Tile with index " << opt.tile_index << " is out of bounds (valid range: 0-" << num_tiles-1 << ").\n"); if (num_tiles > 1 && write_to_precise_file) vw::vw_throw(vw::ArgumentErr() << "Cannot fit all mosaic in the given output file name. " << "Hence specify an output prefix instead, and then multiple " << "tiles will be created.\n"); } // Generate a single output tile. This creates a DemMosaicView, rasters it to disk, // and removes the tile if it contains no valid pixels. void generateTile(int tile_id, int start_tile, int cols, int rows, int bias, int block_size, int num_digits, bool write_to_precise_file, asp::DemMosaicOptions const& opt, std::vector<vw::BBox2i> const& tile_pixel_bboxes, std::vector<vw::cartography::GeoReference> const& georefs, vw::cartography::GeoReference const& mosaic_georef, std::vector<double> const& nodata_values, std::vector<vw::BBox2i> const& loaded_dem_pixel_bboxes, vw::DiskImageManager<float>& imgMgr) { // Get the bounding box we previously computed vw::BBox2i tile_box = tile_pixel_bboxes[tile_id - start_tile]; std::string dem_tile; if (!write_to_precise_file) { std::ostringstream os; os << opt.out_prefix << "-tile-" << std::setfill('0') << std::setw(num_digits) << tile_id << tile_suffix(opt) << ".tif"; dem_tile = os.str(); } else { dem_tile = opt.out_prefix; // the file name was set by user } // Set up tile image and metadata std::int64_t num_valid_pixels = 0; // Will be populated when saving to disk vw::Mutex count_mutex; // to lock when updating num_valid_pixels vw::ImageViewRef<float> out_dem = vw::crop(DemMosaicView(cols, rows, bias, opt, georefs, mosaic_georef, nodata_values, loaded_dem_pixel_bboxes, imgMgr, num_valid_pixels, count_mutex), tile_box); vw::cartography::GeoReference crop_georef = vw::cartography::crop(mosaic_georef, tile_box.min().x(), tile_box.min().y()); // Update the lon-lat box given that we know the final georef and image size crop_georef.ll_box_from_pix_box(vw::BBox2i(0, 0, cols, rows)); // Raster the tile to disk. Optionally cast to int (may be useful for // mosaicking ortho images). saveDemTile(block_size, dem_tile, out_dem, crop_georef, opt); vw::vw_out() << "Number of valid (not no-data) pixels written: " << num_valid_pixels << ".\n"; if (num_valid_pixels == 0) { vw::vw_out() << "Removing tile with no valid pixels: " << dem_tile << "\n"; boost::filesystem::remove(dem_tile); } } // Set up output mosaic geometry: georef, dimensions (cols/rows), spacing. // Handles projection changes, resolution, alignment (tap/gdal-tap), and projwin cropping. // Arguments below get modified. void setupMosaicGeom(asp::DemMosaicOptions& opt, vw::cartography::GeoReference& mosaic_georef, vw::BBox2& mosaic_bbox, std::vector<vw::BBox2>& dem_proj_bboxes, std::vector<vw::BBox2i>& dem_pixel_bboxes, double& spacing, int& cols, int& rows) { // By default the output georef is equal to the first input georef mosaic_georef = asp::readGeorefOrThrow(opt.dem_files[0]); spacing = opt.tr; if (opt.target_srs_string != "" && spacing <= 0) vw::vw_throw(vw::ArgumentErr() << "Changing the projection was requested. The output DEM " << "resolution must be specified via the --tr option.\n"); if (opt.target_srs_string != "") { // Set the srs string into georef. bool have_user_datum = false; vw::cartography::Datum user_datum; vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, user_datum, mosaic_georef); } // Use desired spacing if user-specified if (spacing > 0.0) { // Get lonlat bounding box of the first DEM. vw::DiskImageView<float> dem0(opt.dem_files[0]); vw::BBox2 llbox = mosaic_georef.pixel_to_lonlat_bbox(bounding_box(dem0)); // Reset transform with user provided spacing. vw::math::Matrix<double,3,3> transform = mosaic_georef.transform(); transform.set_identity(); transform(0, 0) = spacing; transform(1, 1) = -spacing; mosaic_georef.set_transform(transform); // Set the translation part of the transform so that the origin // maps to the lonlat box corner. This is still not fully // reliable, but better than nothing. We will adjust mosaic_georef later on. vw::Vector2 ul = mosaic_georef.lonlat_to_pixel(vw::Vector2(llbox.min().x(), llbox.max().y())); mosaic_georef = vw::cartography::crop(mosaic_georef, ul.x(), ul.y()); } else { // Update spacing variable from the current transform spacing = mosaic_georef.transform()(0, 0); if (spacing <= 0) vw::vw_throw(vw::ArgumentErr() << "The output grid size must be positive.\n"); } if (opt.gdal_tap) { // A first adjustment, will refine later auto T = mosaic_georef.transform(); T(0, 2) = spacing * round(T(0, 2)/spacing); T(1, 2) = spacing * round(T(1, 2)/spacing); mosaic_georef.set_transform(T); } // If the user specified the tile size in georeferenced units if (opt.geo_tile_size > 0) { opt.tile_size = (int)round(opt.geo_tile_size/spacing); vw::vw_out() << "Tile size in pixels: " << opt.tile_size << "\n"; } opt.tile_size = std::max(opt.tile_size, 1); // Load the bounding boxes from all of the DEMs loadDemBdBoxes(opt, mosaic_georef, mosaic_bbox, dem_proj_bboxes, dem_pixel_bboxes); if (opt.tap) { // Ensure that the grid is at integer multiples of grid size mosaic_bbox.min() = spacing * floor(mosaic_bbox.min() / spacing); mosaic_bbox.max() = spacing * ceil(mosaic_bbox.max() / spacing); if (opt.projwin != vw::BBox2()) { opt.projwin.min() = spacing * floor(opt.projwin.min() / spacing); opt.projwin.max() = spacing * ceil(opt.projwin.max() / spacing); } } if (opt.gdal_tap) { // Conform to GDAL -tap. Ensure that the output bounds are at integer // multiples of grid size. mosaic_bbox.min() = spacing * round(mosaic_bbox.min() / spacing); mosaic_bbox.max() = spacing * round(mosaic_bbox.max() / spacing); if (opt.projwin != vw::BBox2()) { opt.projwin.min() = spacing * round(opt.projwin.min() / spacing); opt.projwin.max() = spacing * round(opt.projwin.max() / spacing); } } if (opt.projwin != vw::BBox2()) { // If to create the mosaic only in a given region if (!opt.gdal_tap) mosaic_bbox.crop(opt.projwin); else mosaic_bbox = opt.projwin; // GDAL --tap overrides the mosaic box // Crop the proj boxes as well for (int dem_iter = 0; dem_iter < (int)opt.dem_files.size(); dem_iter++) dem_proj_bboxes[dem_iter].crop(opt.projwin); if (opt.force_projwin) mosaic_bbox = opt.projwin; } if (opt.gdal_tap) { // Further adjustment of the georef. By now mosaic_bbox incorporates // --projwin if given. The corners of mosaic_bbox are multiples of spacing. auto T = mosaic_georef.transform(); if (T(0, 0) <= 0) vw::vw_throw(vw::ArgumentErr() << "The output grid size in x must be positive.\n"); if (T(1, 1) >= 0) vw::vw_throw(vw::ArgumentErr() << "The output grid size in y must be negative.\n"); T(0, 2) = mosaic_bbox.min().x(); T(1, 2) = mosaic_bbox.max().y(); mosaic_georef.set_transform(T); } // First-guess pixel box vw::BBox2 pixel_box = asp::pointToPixelBboxSnapped(mosaic_georef, mosaic_bbox, g_tol); // Take care of numerical artifacts vw::Vector2 beg_pix = pixel_box.min(); if (norm_2(beg_pix - round(beg_pix)) < g_tol) beg_pix = round(beg_pix); mosaic_georef = vw::cartography::crop(mosaic_georef, beg_pix[0], beg_pix[1]); // Image size pixel_box = asp::pointToPixelBboxSnapped(mosaic_georef, mosaic_bbox, g_tol); vw::Vector2 end_pix = pixel_box.max(); cols = (int)round(end_pix[0]); // end_pix is the last pix in the image rows = (int)round(end_pix[1]); vw::vw_out() << "Mosaic size: " << cols << " x " << rows << " pixels.\n"; } } // end namespace asp int main(int argc, char *argv[]) { asp::DemMosaicOptions opt; try { asp::handleDemMosaicArgs(argc, argv, opt); // Determine and validate output nodata value asp::determineNodataValue(opt); // Set up output mosaic geometry vw::cartography::GeoReference mosaic_georef; vw::BBox2 mosaic_bbox; std::vector<vw::BBox2> dem_proj_bboxes; std::vector<vw::BBox2i> dem_pixel_bboxes, loaded_dem_pixel_bboxes; double spacing = 0.0; // will be updated int cols = 0, rows = 0; // will be updated asp::setupMosaicGeom(opt, mosaic_georef, mosaic_bbox, dem_proj_bboxes, dem_pixel_bboxes, spacing, cols, rows); // Compute tile processing bias int bias = asp::computeTileBias(opt); // Compute block size for rasterization int block_size = asp::computeBlockSize(bias, opt); // Setup tile grid and validate configuration int num_tiles_x = 0, num_tiles_y = 0, num_tiles = 0; // will be set bool write_to_precise_file = false; // will be set asp::setupTileGrid(cols, rows, opt, num_tiles_x, num_tiles_y, num_tiles, write_to_precise_file); // If to use a range if (!opt.tile_list.empty() && opt.tile_index >= 0) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both tile index and tile range.\n"); // See if to save all tiles, or an individual tile. int start_tile = opt.tile_index, end_tile = opt.tile_index + 1; if (opt.tile_index < 0) { start_tile = 0; end_tile = num_tiles; } // Compute the bounding box of each output tile std::vector<vw::BBox2i> tile_pixel_bboxes; for (int tile_id = start_tile; tile_id < end_tile; tile_id++) { int tile_index_y = tile_id / num_tiles_x; int tile_index_x = tile_id - tile_index_y*num_tiles_x; vw::BBox2i tile_box(tile_index_x*opt.tile_size, tile_index_y*opt.tile_size, opt.tile_size, opt.tile_size); // Bounding box of this tile in pixels in the output image tile_box.crop(vw::BBox2i(0, 0, cols, rows)); tile_pixel_bboxes.push_back(tile_box); } // Store the no-data values, pointers to images, and georeferences (for speed). vw::vw_out() << "Reading the input DEMs.\n"; std::vector<double> nodata_values; std::vector<vw::cartography::GeoReference> georefs; std::vector<std::string> loaded_dems; vw::DiskImageManager<float> imgMgr; // Load DEMs that intersect with this tile batch. Also calc the output DEM box. vw::BBox2i output_dem_box = vw::BBox2i(0, 0, cols, rows); // output DEM box vw::vw_out() << "Reading the input DEMs.\n"; asp::loadDemsForTiles(opt, dem_proj_bboxes, dem_pixel_bboxes, tile_pixel_bboxes, start_tile, end_tile, mosaic_georef, output_dem_box, // Outputs imgMgr, loaded_dems, nodata_values, georefs, loaded_dem_pixel_bboxes); // If there are 17 tiles, let them be tile-00, ..., tile-16. int num_digits = 1; int tens = 10; while (num_tiles - 1 >= tens) { num_digits++; tens *= 10; } // Time to generate each of the output tiles for (int tile_id = start_tile; tile_id < end_tile; tile_id++) { if (!opt.tile_list.empty() && opt.tile_list.find(tile_id) == opt.tile_list.end()) continue; asp::generateTile(tile_id, start_tile, cols, rows, bias, block_size, num_digits, write_to_precise_file, opt, tile_pixel_bboxes, georefs, mosaic_georef, nodata_values, loaded_dem_pixel_bboxes, imgMgr); } // End loop through tiles // Write the name of each DEM file that was used together with its index if (opt.save_index_map) { std::string index_map = opt.out_prefix + "-index-map.txt"; vw::vw_out() << "Writing: " << index_map << "\n"; std::ofstream ih(index_map.c_str()); for (int dem_iter = 0; dem_iter < (int)loaded_dems.size(); dem_iter++) { ih << opt.dem_files[dem_iter] << ' ' << dem_iter << "\n"; } } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/dg_mosaic ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # To do: There is no need to round the corners of the images # which are combined into the mosaic. May improve accuracy # that way. This change would need very careful testing. from __future__ import print_function import os, sys, string, subprocess, math, re, optparse, time, copy, tempfile from datetime import datetime, timedelta # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_system_utils import * # must be after the path is altered above from asp_system_utils import get_asp_version verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] def write_tree(tree, filename): '''A workarround for tree.write() not printing the string <?xml version="1.0"...>''' root = tree.getroot() with open(filename, 'w') as fh: fh.write(ET.tostring(root, encoding='utf8', method='xml').decode()) def format_microsec(microsec): # Ensure that we have 6 digits in a microsecond. Pre-pad with # zeros if necessary. if len(microsec) > 6: raise Exception('InputError', "The microsecond value: " + microsec + " has more than 6 digits.") microsec = (6 - len(microsec)) * '0' + microsec return microsec try: import xml.etree.ElementTree as ET except ImportError: # python 2.4 import elementtree.ElementTree as ET if hasattr(datetime, 'strptime'): def parse_time(date_string, fmt): return datetime.strptime(date_string, fmt) else: # python 2.4 def parse_time(date_str, fmt): m = re.match(r'^(.*?)T(.*?)\.(\d+)Z', date_str) if m: date_str = m.group(1) + " " + m.group(2) microsec = format_microsec(m.group(3)) else: raise Exception('InputError', "Could not match string: " + date_str) m = re.match(r'^(.*?)T(.*?)\.(.*?)Z', fmt) if m: fmt = m.group(1) + " " + m.group(2) else: raise Exception('InputError', "Could not match string: " + fmt) parsed = datetime(*(time.strptime(date_str, fmt)[0:6])) parsed = parsed.replace(microsecond=int(microsec)) return parsed class Usage(Exception): def __init__(self, msg): self.msg = msg # TODO: Move this function into the utils file def lonlat_point_distance(pt1, pt2): '''Computes the great circle distance in meters between two lonlat coordinates''' # This function uses a simple, less accurate calculation. PI = 3.141592653589793 EARTH_RADIUS = 6371.009 # In km DEG2RAD = PI / 180.0 lon1 = pt1[0] * DEG2RAD lon2 = pt2[0] * DEG2RAD lat1 = pt1[1] * DEG2RAD lat2 = pt2[1] * DEG2RAD theta = lon2 - lon1 dist = math.acos(math.sin(lat1) * math.sin(lat2) + math.cos(lat1) * math.cos(lat2) * math.cos(theta)) if (dist < 0): dist = dist + PI dist = dist * EARTH_RADIUS return dist * 1000.0 # Convert km to meters # We assume that the boxes are products of closed intervals, [a, b] x # [c, d]. As such, the box [0, 0] x [0, 0] of width 0 is not empty. class BBox: def __init__(self, minx = sys.float_info.max, miny = sys.float_info.max, maxx = -sys.float_info.max, maxy = -sys.float_info.max): self.minx = minx self.miny = miny self.maxx = maxx self.maxy = maxy def empty(self): return ( self.maxx < self.minx ) or ( self.maxy < self.miny ) def expand_with_box(self, box): if box.empty(): return if self.empty(): self.minx = box.minx self.miny = box.miny self.maxx = box.maxx self.maxy = box.maxy return if box.minx < self.minx: self.minx = box.minx if box.miny < self.miny: self.miny = box.miny if box.maxx > self.maxx: self.maxx = box.maxx if box.maxy > self.maxy: self.maxy = box.maxy def add_point(self, pt): self.expand_with_box(BBox(pt[0], pt[1], pt[0], pt[1])) def extend (self, val): # Note: val can be negative if self.empty(): return self.minx = self.minx - val self.miny = self.miny - val self.maxx = self.maxx + val self.maxy = self.maxy + val if self.empty(): # Ensure all empty boxes are identical. For some reason # the line self = BBox() does not work. So need to assign # the members one by one. b = BBox() self.minx = b.minx self.miny = b.miny self.maxx = b.maxx self.maxy = b.maxy def width(self): if self.empty(): return 0 return self.maxx - self.minx def height(self): if self.empty(): return 0 return self.maxy - self.miny def __repr__(self): return "BBox %f %f -> %f %f" % (self.minx,self.miny,self.maxx,self.maxy) # Create an object made of an image name and a box. Sort an array of # such objects by the min coordinate of the box. class StrBox: def __init__(self, img_str, box): self.img_str = img_str self.box = box # Sort by miny. If miny is same, sort by height. def minyCompare(P, Q): val = int(round(P.box.miny - Q.box.miny)) if val != 0: return val val = int(round((P.box.maxy - P.box.miny) - (Q.box.maxy - Q.box.miny))) return val def sort_by_miny(imgVec, boxVec): S = [] for i in range(len(imgVec)): S.append(StrBox(copy.deepcopy(imgVec[i]), copy.deepcopy(boxVec[i]))) # Sorting changed in Python 3 if sys.version_info[0] < 3: S.sort(minyCompare) else: from functools import cmp_to_key S.sort(key=cmp_to_key(minyCompare)) imgVec = [] for i in range(len(S)): imgVec.append(S[i].img_str) return imgVec def set_or_wipe_image_tags(IMAGE, merged_vals): # Wipe most image tags as they differ from image to image. # Replace some tags with their average/min/max values across the images. # Values we are supposed to keep, by borrowing them from one image. keep_ar = ["SATID", "MODE", "SCANDIRECTION", "CATID", "TLCTIME", "NUMTLC", "TLCLISTList", "FIRSTLINETIME", "AVGLINERATE", "EXPOSUREDURATION", "CLOUDCOVER", "RESAMPLINGKERNEL", "POSITIONKNOWLEDGESRC", "ATTITUDEKNOWLEDGESRC", "REVNUMBER"] # Values we will average for key in merged_vals: keep_ar.append(key) # Put in a set keep_tags = set(keep_ar) # Read existing tags. tags = [] for i in range(len(IMAGE)): tag = IMAGE[i].tag tags.append(tag) # Wipe some of the tags. for tag in tags: if not tag in keep_tags: IMAGE.remove( IMAGE.find (tag) ) # Set the averages for key in merged_vals: if IMAGE.find(key) is not None and merged_vals[key] is not None: IMAGE.find(key).text = str(merged_vals[key]) def get_corners(A, B, indices): # Each corner of C will be picked either from A or from B, # depending on the value of 'indices' for that corner. C=[] for i in range(len(indices)): j = indices[i] if j == 0: C.append(A[i]) else: C.append(B[i]) return C def signed_triangle_area(P, Q, R): return ( (Q[0]-P[0])*(R[1]-Q[1])-(Q[1]-P[1])*(R[0]-Q[0]) )/2.0 def find_combined_box(A, B): # Given two boxes, A and B, find the rough box containing both A and B. # Both A and B is a vector of 4 points, each point having two # coordinates, x and y. # Each of the corners of the new box will be one of the corresponding # corners of either A or B. Pick the new corners as to maximize # the area of the obtained box. if len(A) == 0: return B if len(A) != 4 or len(B) != 4: raise Exception('Error', "A box is supposed to have 4 corners.") max_area = 0 max_indices = [] for a in range(2): for b in range(2): for c in range(2): for d in range(2): indices = [a, b, c, d] C = get_corners(A, B, indices) area = abs( signed_triangle_area(C[0], C[1], C[2]) + signed_triangle_area(C[2], C[3], C[0])) if area > max_area: max_area = area max_indices = indices return get_corners(A, B, max_indices) # The lon-lat box for the combined camera is the union of the # lon-lat boxes for all the cameras. Also record the min and max # height values. def adjust_camera_corners(BAND, all_ll_corners, ref_htbox): if len(all_ll_corners) == 0: return # no data # Each camera is a rectangle. Find the rough bounding box of all rectangles. out_corners = [] for corner_vec in all_ll_corners: out_corners = find_combined_box(out_corners, corner_vec) BAND.find("ULLON").text = str(out_corners[0][0]) BAND.find("ULLAT").text = str(out_corners[0][1]) BAND.find("URLON").text = str(out_corners[1][0]) BAND.find("URLAT").text = str(out_corners[1][1]) BAND.find("LRLON").text = str(out_corners[2][0]) BAND.find("LRLAT").text = str(out_corners[2][1]) BAND.find("LLLON").text = str(out_corners[3][0]) BAND.find("LLLAT").text = str(out_corners[3][1]) try: # Distribute the min and max height values BAND.find("ULHAE").text = str(ref_htbox.minx) BAND.find("URHAE").text = str(ref_htbox.maxx) BAND.find("LRHAE").text = str(ref_htbox.minx) BAND.find("LLHAE").text = str(ref_htbox.maxx) except: pass def find_bands(node): # Extract the bands at the current node. Usually we have # panchromatic data, that corresponds to BAND_P. The # other ones are for multispectral data. bands = [] for b in ["BAND_P", # pan "BAND_B", "BAND_G", "BAND_R", # rgb "BAND_N", "BAND_C", "BAND_Y", "BAND_RE", "BAND_N2" # other ]: p = node.find(b) if p is not None: bands.append(p) if len(bands) == 0: raise Exception('InputError', "XML files lack information on bands.") return bands # bugfix for the situations: ullon = -178.6 and urlon = 178.34 # ullon = 178.6 and urlon = -178.34 def maybe_swap_add_360(a, b): if b - a > 270: # ullon = -178.6 and urlon = 178.34 tmp = b b = a + 360 a = tmp if a - b > 270: # ullon = 178.6 and urlon = -178.34 b = b + 360 return [a, b] def read_corners(band): '''Read in the corners from a DG XML file from one band. The points are stored in clockwise order from the upper left.''' llbox = BBox() ll_corners = [] ullon = float(band.find("ULLON").text) ullat = float(band.find("ULLAT").text) urlon = float(band.find("URLON").text) urlat = float(band.find("URLAT").text) lrlon = float(band.find("LRLON").text) lrlat = float(band.find("LRLAT").text) lllon = float(band.find("LLLON").text) lllat = float(band.find("LLLAT").text) # Bugfix for the situation when ullon = +/-178.6 and urlon = +/-178.34 [ullon, urlon] = maybe_swap_add_360(ullon, urlon) [lllon, lrlon] = maybe_swap_add_360(lllon, lrlon) llbox.add_point([ullon, ullat]) llbox.add_point([urlon, urlat]) llbox.add_point([lrlon, lrlat]) llbox.add_point([lllon, lllat]) ll_corners.append([ullon, ullat]) ll_corners.append([urlon, urlat]) ll_corners.append([lrlon, lrlat]) ll_corners.append([lllon, lllat]) return (llbox, ll_corners) # Provide the image files that make up the composite. We assume the XML # files are in the same directory and end with extension ".xml" or ".XML". def read_xml(filename, options, xml_keys): tree = ET.parse(filename) root = tree.getroot() IMD = root.find("IMD") GEO = root.find("GEO") EPH = root.find("EPH") ATT = root.find("ATT") RPB = root.find("RPB") IMAGE = IMD.find("IMAGE") tlctime = parse_time(IMAGE.find("TLCTIME").text.strip(), "%Y-%m-%dT%H:%M:%S.%fZ") tlclist = [] for tlc_item in IMAGE.find("TLCLISTList").findall("TLCLIST"): tokens = tlc_item.text.strip().split(' ') tlclist.append([float(tokens[0]), float(tokens[1])]) if len(tlclist) == 1: direction = 1.0 if IMAGE.find("SCANDIRECTION").text.lower() != "forward": direction = -1.0 linerate = float(IMAGE.find("AVGLINERATE").text) tlclist.append([(linerate+tlclist[0][0]), (tlclist[0][1]+direction)]) firstlinetime = parse_time(IMAGE.find("FIRSTLINETIME").text, "%Y-%m-%dT%H:%M:%S.%fZ") # Pull a bunch of values into a dictionary xml_vals = {} for key in xml_keys: if IMAGE.find(key) is not None: xml_vals[key] = float(IMAGE.find(key).text) else: xml_vals[key] = None image_size = [] image_size.append( int(IMD.find("NUMCOLUMNS").text) ) image_size.append( int(IMD.find("NUMROWS").text) ) llbox = BBox() htbox = BBox() ll_corners = [] for band in find_bands(IMD): # The longitude-latitude box. Note: Later when we create # the adjusted box we will traverse the corners in # exactly the same order as here, so this and that # code blocks must be kept consistent. # Verify that all bands have the same corners try: ll_box_curr, ll_corners_curr = read_corners(band) for i in range(0,4): llbox.add_point( [ll_corners_curr[i][0], ll_corners_curr[i][1]] ) except Exception as e: print("Warning: File " + filename + " lacks longitude/latitude information.") if len(ll_corners) == 0: ll_corners = ll_corners_curr if ll_corners != ll_corners_curr: raise Exception('InputError', "File " + filename + " has multiple bands with inconsistent LON/LAT info.") if not options.skip_rpc_gen: # The height range, [ht_min, ht_max]. We store it as a 2D box # as to not create an interval class. try: ht_scale = float(RPB.find("IMAGE").find("HEIGHTSCALE").text) ht_offset = float(RPB.find("IMAGE").find("HEIGHTOFFSET").text) min_ht = -ht_scale + ht_offset max_ht = ht_scale + ht_offset htbox = BBox(min_ht, min_ht, max_ht, max_ht) except Exception as e: raise Exception('InputError', "File " + filename + " lacks RPC model information.") # Get the pitch, originx, and pd. Verify that all bands are consistent. pitch = None; originx = None; pd = None for band in find_bands(GEO.find("DETECTOR_MOUNTING")): DET_ARRAY = band.find("DETECTOR_ARRAY") curr_pitch = float(DET_ARRAY.find("DETPITCH").text) curr_originx = DET_ARRAY.find("DETORIGINX").text curr_pd = GEO.find("PRINCIPAL_DISTANCE").find("PD").text if pitch is None: pitch = curr_pitch if originx is None: originx = curr_originx if pd is None: pd = curr_pd if pitch != curr_pitch or originx != curr_originx or pd != curr_pd: raise Exception('InputError', "File " + filename + " has inconsistent info across bands.") # Note: We concatenate all eph values into one single array, # the proper structure would be an array of arrays. eph_list = [] for eph_item in EPH.find("EPHEMLISTList").findall("EPHEMLIST"): tokens = eph_item.text.strip().split(' ') eph_list.extend(tokens) # Note: We concatenate all att values into one single array, # the proper structure would be an array of arrays. att_list = [] for att_item in ATT.find("ATTLISTList").findall("ATTLIST"): tokens = att_item.text.strip().split(' ') att_list.extend(tokens) return [tlctime, tlclist, firstlinetime, image_size, pitch, originx, pd, eph_list, att_list, llbox, htbox, ll_corners, xml_vals] def tlc_time_lookup( tlctime, tlclist, pixel_y ): fraction = (pixel_y - tlclist[0][0]) / (tlclist[1][0] - tlclist[0][0]) seconds_off = fraction * ( tlclist[1][1] - tlclist[0][1]) + tlclist[0][1] return tlctime + timedelta(seconds=seconds_off) def tlc_pixel_lookup( tlctime, tlclist, time ): difference = time - tlctime seconds_since_ref = difference.microseconds / 10.0**6 + difference.seconds + difference.days*24.0*3600.0 fraction = ( seconds_since_ref - tlclist[0][1] ) / (tlclist[1][1] - tlclist[0][1]); return fraction * ( tlclist[1][0] - tlclist[0][0] ) + tlclist[0][0] # Get the xml file name from the .ntf or .tif file name. The xml file # must exist and end in either '.xml' or '.XML'. def xml_name( filename ): path, ext = os.path.splitext(filename) xml_file_l = path + ".xml" xml_file_u = path + ".XML" if os.path.isfile(xml_file_l): xml_file = xml_file_l elif os.path.isfile(xml_file_u): xml_file = xml_file_u else: raise Exception('InputError', 'Cannot find any of: ' + xml_file_l + ' ' + xml_file_u) return xml_file def estimate_ground_resolution( xml_tree ): '''Parse the DG XML file to estimate the ground resolution in meters per pixel''' # Retrieve the image size and the four corners from the XML file root = xml_tree.getroot() imd = root.find("IMD") num_cols = float(imd.find("NUMCOLUMNS").text) num_rows = float(imd.find("NUMROWS").text) bands = find_bands(imd) band = bands[0] ll_box, ll_corners = read_corners(band) # Estimate meters per pixel in the X and Y directions of the image. top_dist = lonlat_point_distance(ll_corners[0], ll_corners[1]) bot_dist = lonlat_point_distance(ll_corners[2], ll_corners[3]) left_dist = lonlat_point_distance(ll_corners[3], ll_corners[0]) right_dist = lonlat_point_distance(ll_corners[1], ll_corners[2]) x_dist = (top_dist + bot_dist ) / 2.0 y_dist = (left_dist + right_dist) / 2.0 gsd_x = x_dist / num_cols gsd_y = y_dist / num_rows # Just take the average of the two sizes return (gsd_x + gsd_y) / 2.0 def run_cmd( cmd, options ): if options.dryrun or options.verbose: print(cmd) if options.dryrun: return code = subprocess.call(cmd, shell=True) if code: raise Exception('ProcessError', 'Non zero return code ('+str(code)+')') def scale_xml_element(elem, scale): tokens = elem.text.strip().split(' ') for i in range(len(tokens)): tokens[i] = str(float(tokens[i]) * scale) elem.text = " ".join(tokens) # convert a list of lists to a string, to be able # to use it as a hash key. def listlist_to_str(listlist): ans = "" for list_entry in listlist: for val in list_entry: ans += str(val) + " " return ans def examine_discrepancy_in_arrays(A, B, ignore_incon): if len(A) != len(B): raise Exception('InputError', 'Cannot process arrays of different lengths.') max_err = 1.0e-8 print("Will go on if the relative discrepancies are less than %g." % max_err) observed_max_err = 0 num_messages = 0 max_num_messages = 10 for i in range(len(A)): if A[i] != B[i]: a=float(A[i]) b=float(B[i]) if a != b: err = abs( (a-b)/a ) num_messages = num_messages + 1 if err > observed_max_err: observed_max_err = err if err > max_err and num_messages < max_num_messages: print("Warning: Disagreeing values and relative error: %0.18g %0.18g %0.18g" \ % (a, b, err)) continue if err > max_err and num_messages == max_num_messages: print("Will stop printing more warnings.") print('Maximum observed relative discrepancy is ' + str(observed_max_err)) if observed_max_err > max_err: if not ignore_incon: 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.") raise Exception('InputError', 'Bailing out.') else: print("Will continue working with these inconsistent files. You are doing this at your own risk.") def main(): try: try: usage = 'dg_mosaic [--help] <all ntf or tif files that make up the observation>\n' + get_asp_version() parser = optparse.OptionParser(usage=usage) parser.set_defaults(dryrun=False) parser.set_defaults(preview=False) parser.set_defaults(gdaldir="") parser.set_defaults(target_resolution=-1.0) parser.set_defaults(reduce_percent=100.0) parser.set_defaults(output_prefix="") parser.set_defaults(band=0) parser.set_defaults(input_nodata_value=None) parser.set_defaults(output_nodata_value=None) parser.add_option("--target_resolution", dest="target_resolution", type="float", help="Choose the output resolution in meters per pixel on the ground (note that a coarse resolution may result in aliasing).") parser.add_option("--reduce-percent", dest="reduce_percent", type="float", help="Render a reduced resolution image and xml based on this percentage. This can result in aliasing artifacts.") parser.add_option("-o", "--output-prefix", dest="output_prefix", type="str", help="The prefix for the output .tif and .xml files.") parser.add_option("--ot", dest="output_type", type="str", default = "Float32", 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.") parser.add_option("--cache-size", dest="cache_size", type="int", default=1024, help="Set the system cache size, in MB, for each process.") parser.add_option("--threads", dest="threads", type="int", default=4, help="How many threads to use.") parser.add_option("--band", dest="band", type="int", help="Which band to use (for multi-spectral images).") parser.add_option("--input-nodata-value", dest="input_nodata_value", type="float", help="Nodata value to use on input; input pixel values less than or equal to this are considered invalid.") parser.add_option("--output-nodata-value", dest="output_nodata_value", type="float", help="Nodata value to use on output.") parser.add_option("--rpc-penalty-weight", dest="penalty_weight", type="float", default=0.01, 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.") parser.add_option('--fix-seams', dest='fix_seams', default=False, action='store_true', help="Fix seams in the output mosaic due to inconsistencies between image and camera data using interest point matching.") parser.add_option('--ignore-inconsistencies', dest='ignore_incon', default=False, 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.") parser.add_option("--preview", dest="preview", action="store_true", help="Render a small 8 bit png of the input for preview.") parser.add_option("-v", "--verbose", dest="verbose", action="store_true", help="Increase verbosity.") parser.add_option("-n", "--dry-run", dest="dryrun", action="store_true", help="Make the calculations, but just print out the commands.") parser.add_option('--skip-rpc-gen', dest='skip_rpc_gen', default=False, action='store_true', help="Skip RPC model generation") parser.add_option('--skip-tif-gen', dest='skip_tif_gen', default=False, action='store_true', help="Skip TIF file generation.") parser.add_option('--wipe-att-eph', dest='wipe_att_eph', default=False, action='store_true', help="Wipe ATT and EPH from final RPC.") # This option is obsolete. We now ship gdal_translate with ASP. parser.add_option("--gdal-dir", dest="gdaldir", help=optparse.SUPPRESS_HELP) (options, args) = parser.parse_args() # Transform 50.0 into just 50 if options.reduce_percent == int(options.reduce_percent): options.reduce_percent = int(options.reduce_percent) # Quit if the user provided conflicting resolution options if (options.reduce_percent != 100) and (options.target_resolution > 0): raise_error('Cannot specify both --reduce-percent and --target-resolution!') if not args: parser.print_help() raise_error('Need .ntf or .tif files.', code=2) if len(options.gdaldir): options.gdaldir += "/" except optparse.OptionError as msg: raise Usage(msg) if options.output_prefix == "": options.output_prefix = args[0].split('-')[-1].split('.')[0] if options.output_prefix == "": raise_error('Empty output prefix. Please set it via the ' + \ '--output-prefix option', code=2) out_dir=os.path.dirname(options.output_prefix) if len(out_dir)==0: out_dir='.' if not os.path.exists(out_dir): os.makedirs(out_dir) # Read these fields from each XML, and then find the average # or min or max value for each field. xml_keys = ["MEANPRODUCTGSD", "MEANCOLLECTEDGSD", "MINCOLLECTEDROWGSD", "MAXCOLLECTEDROWGSD", "MEANCOLLECTEDROWGSD", "MINCOLLECTEDCOLGSD", "MAXCOLLECTEDCOLGSD", "MEANCOLLECTEDCOLGSD", "MEANSUNEL", "MEANSUNAZ", "MEANSATAZ", "MEANSATEL", "MEANINTRACKVIEWANGLE", "MEANCROSSTRACKVIEWANGLE", "MEANOFFNADIRVIEWANGLE" ] # Do a couple of passes at parsing the xml files and # extracting and combining the data. At the second pass, the # files (stored in args) and all other data will be in the # order in which they need to be mosaiced. for it in range(2): all_ll_corners = [] tlclist_arr = [] # Initialize merged_vals merged_vals = {} num_vals = {} for key in xml_keys: m = re.match(r'^.*?MEAN', key, re.IGNORECASE) if m: merged_vals[key] = 0 num_vals[key] = 0 else: merged_vals[key] = None num_vals[key] = None # We reference everything from the perspective of the first # image. So lets load it up first into our special variables. [ref_tlctime, ref_tlclist, ref_firstlinetime, ref_image_size, ref_pitch, ref_originx, ref_pd, ref_eph_list, ref_att_list, ref_llbox, ref_htbox, ll_corners, xml_vals] \ = read_xml( xml_name(args[0]), options, xml_keys) all_ll_corners.append(ll_corners) tlclist_arr.append(ref_tlclist) for key in xml_keys: if key in xml_vals and xml_vals[key] is not None: merged_vals[key] = xml_vals[key] num_vals[key] = 1 # orig_sizes[i] holds the original size of i-th image. After # we scale i-th image by i_th_image_pitch/0_th_image_pitch, we # store the new image box in placements[i]. orig_sizes = [] placements = [] orig_sizes.append(ref_image_size) shiftx = 0 shifty = tlc_pixel_lookup(ref_tlctime, ref_tlclist, ref_firstlinetime) placement = BBox(shiftx, shifty, shiftx + ref_image_size[0], shifty + ref_image_size[1]) placements.append( placement ) for filename in args[1:]: [tlctime, tlclist, firstlinetime, image_size, pitch, originx, pd, eph_list, att_list, llbox, htbox, ll_corners, xml_vals] \ = read_xml( xml_name(filename), options, xml_keys) all_ll_corners.append(ll_corners) tlclist_arr.append(tlclist) # Sanity checks if ref_originx != originx: raise Exception('InputError', 'Must have the same originx in: ' + xml_name(args[0]) + ' ' + xml_name(filename) ) if ref_pd != pd: raise Exception('InputError', 'Must have the same pd in: ' + xml_name(args[0]) + ' ' + xml_name(filename) ) if len(ref_eph_list) != len(eph_list): raise Exception('InputError', 'Must have the same number of ephem values in: ' + xml_name(args[0]) + ' and ' + xml_name(filename) ) if ref_eph_list != eph_list: # Normally we'd expect the same ephh in all files, as after all, # they are components of the same observation. Oddly, in practice # that is not always so. Print a warning if the discrepancies are # minor, and thow an error if they are major. print("Warning: ephem values must be identical in " \ + xml_name(args[0]) + ' and ' + xml_name(filename)) examine_discrepancy_in_arrays(ref_eph_list, eph_list, options.ignore_incon) if len(ref_att_list) != len(att_list): raise Exception('InputError', 'Must have the same number of att values in: ' + xml_name(args[0]) + ' and ' + xml_name(filename) ) if ref_att_list != att_list: # Same thing as for ephem. print("Warning: att values must be identical in " \ + xml_name(args[0]) + ' and ' + xml_name(filename)) examine_discrepancy_in_arrays(ref_att_list, att_list, options.ignore_incon) orig_sizes.append(image_size) shiftx = 0 shifty = tlc_pixel_lookup(ref_tlctime, ref_tlclist, firstlinetime) # We compensate for the fact that different images # may have different physical pixel sizes. pitch_ratio = pitch/ref_pitch scaled_image_size = [image_size[0]*pitch_ratio, image_size[1]*pitch_ratio] placement = BBox(shiftx, shifty, shiftx + scaled_image_size[0], shifty + scaled_image_size[1]) placements.append( placement ) ref_llbox.expand_with_box(llbox) ref_htbox.expand_with_box(htbox) for key in xml_keys: if xml_vals[key] is None: continue m_mean = re.match(r'^.*?MEAN', key, re.IGNORECASE) m_max = re.match(r'^.*?MAX', key, re.IGNORECASE) m_min = re.match(r'^.*?MIN', key, re.IGNORECASE) if m_mean: # Mean of all means merged_vals[key] += xml_vals[key] num_vals[key] += 1 elif m_max: # Max of all max if merged_vals[key] is not None: merged_vals[key] = max(merged_vals[key], xml_vals[key]) else: merged_vals[key] = xml_vals[key] elif m_min: # Min of all min if merged_vals[key] is not None: merged_vals[key] = min(merged_vals[key], xml_vals[key]) else: merged_vals[key] = xml_vals[key] # Complete the process of computing the averages for key in xml_keys: m_mean = re.match(r'^.*?MEAN', key, re.IGNORECASE) if m_mean and num_vals[key] != 0 and merged_vals[key] is not None: merged_vals[key] /= num_vals[key] boundary = BBox() for placement in placements: boundary.expand_with_box(placement) for i in range(len(args)): placements[i].miny -= boundary.miny placements[i].maxy -= boundary.miny # Ensure that the images are placed in order, from top to # bottom. So the second image will partially cover the first # image, etc. This is a bug fix for the situation when some # images have a black area at the bottom. s_args = sort_by_miny(args, placements) if it == 0: args = s_args[:] # deep copy # End passes loop # Look for duplicate files that will insert at same location # and with the same tlclist. Files that do this would be the # R?C1 variants that have the same XML file due to download # errors or simplying mixing of R?C1 and the other format. seen = set() for i in range(len(args)): # form a tuple of a string and a number val = listlist_to_str(tlclist_arr[i]), placements[i].miny if val in seen: raise Exception('InputError', 'Input images have same input ' + 'location which could be caused by repeated ' + 'XML file or invalid TLC information.') seen.add(val) if options.target_resolution > 0: # Compute the reduce percentage based on GSD current_gsd = estimate_ground_resolution(ET.parse(xml_name(args[0]))) options.reduce_percent = (current_gsd / options.target_resolution) * 100 # Compute scale factor for adjusting XML values scale = options.reduce_percent / 100.0 suffix = ".r" + str(options.reduce_percent) # The band to output if options.band > 0: suffix += ".b" + str(options.band) # Write a composite scaled XML file. We first create the xml at # the original resolution and then we scale it. tree = ET.parse(xml_name(args[0])) root = tree.getroot() imd = root.find("IMD") imd.find("NUMROWS").text = str(int(boundary.height())) imd.find("NUMCOLUMNS").text = str(int(boundary.width())) for tlc_item in imd.find("IMAGE").find("TLCLISTList").findall("TLCLIST"): tokens = tlc_item.text.strip().split(' ') tokens[0] = str(float(tokens[0])- boundary.miny) tlc_item.text = " ".join(tokens) first_line_item = root.find("IMD").find("IMAGE").find("FIRSTLINETIME") tlc_lookup = tlc_time_lookup( ref_tlctime, ref_tlclist, boundary.miny ) # The verbose operation below is needed for python 2.4 first_line_item.text = tlc_lookup.strftime("%Y-%m-%dT%H:%M:%S") + '.' \ + format_microsec(str(tlc_lookup.microsecond)) + "Z" sep = "," if not options.skip_rpc_gen: # Find the best-fitting RPC coefficients. # TODO(oalexan1): Using temporary files can be error-prone # as users may delete those by mistake. Better use a filename # derived from the input file name. temp_xml_file = tempfile.NamedTemporaryFile(suffix = ".xml", dir = out_dir) write_tree(tree, temp_xml_file.name) rpc_cmd = "rpc_gen" rpc_args = ['--penalty-weight', str(options.penalty_weight), '--output-prefix', options.output_prefix, '--lon-lat-height-box', str(ref_llbox.minx), str(ref_llbox.miny), str(ref_htbox.minx), str(ref_llbox.maxx), str(ref_llbox.maxy), str(ref_htbox.maxx), temp_xml_file.name] rpc_model = run_and_parse_output( rpc_cmd, rpc_args, sep, options.verbose ) try: # Set the RPC model info. Wipe all other outdated info. RPI = root.find("RPB").find("IMAGE") # TODO: Note that we keep the first encountered value. # May need to do some tweaks. # Need to keep them for SETSM to parse things properly. #if RPI.find("ERRBIAS") != None: RPI.remove( RPI.find ("ERRBIAS") ) #if RPI.find("ERRRAND") != None: RPI.remove( RPI.find ("ERRRAND") ) RPI.find("SAMPSCALE").text = rpc_model["uv_scale"][0] RPI.find("LINESCALE").text = rpc_model["uv_scale"][1] RPI.find("SAMPOFFSET").text = rpc_model["uv_offset"][0] RPI.find("LINEOFFSET").text = rpc_model["uv_offset"][1] RPI.find("LONGSCALE").text = rpc_model["llh_scale"][0] RPI.find("LATSCALE").text = rpc_model["llh_scale"][1] RPI.find("HEIGHTSCALE").text = rpc_model["llh_scale"][2] RPI.find("LONGOFFSET").text = rpc_model["llh_offset"][0] RPI.find("LATOFFSET").text = rpc_model["llh_offset"][1] RPI.find("HEIGHTOFFSET").text = rpc_model["llh_offset"][2] RPI.find("LINENUMCOEFList").find("LINENUMCOEF").text = " ".join(rpc_model["line_num"]) RPI.find("LINEDENCOEFList").find("LINEDENCOEF").text = " ".join(rpc_model["line_den"]) RPI.find("SAMPNUMCOEFList").find("SAMPNUMCOEF").text = " ".join(rpc_model["samp_num"]) RPI.find("SAMPDENCOEFList").find("SAMPDENCOEF").text = " ".join(rpc_model["samp_den"]) except Exception as e: print('Caught exception: ' + str(e)) raise Exception('InputError', "File " + args[0] + " lacks complete RPC model information.") else: if root.find("RPB") != None: root.remove( root.find ("RPB") ) # Wipe other outdated info if root.find("TIL") != None: root.remove( root.find("TIL") ) # Adjust image corners for band in find_bands(imd): adjust_camera_corners(band, all_ll_corners, ref_htbox) # Adjust the GSD if images are reduced in resolution if options.reduce_percent != 100: for key in merged_vals: m = re.match(r'^.*?GSD', key) if m and merged_vals[key] is not None: merged_vals[key] *= 100.0/float(options.reduce_percent) # Keep some values, average/combine some, and wipe the rest set_or_wipe_image_tags(root.find("IMD").find("IMAGE"), merged_vals) # Scale the xml file # Update NUMROWS and NUMCOLUMNS nrows = int(boundary.height() * scale) ncols = int(boundary.width() * scale) imd = root.find("IMD") imd.find("NUMROWS").text = str(nrows) imd.find("NUMCOLUMNS").text = str(ncols) print("Output image size: %dx%d px" % (nrows, ncols)) # Update TLCList, AVGLineRate, ExposureDur image = imd.find("IMAGE") for tlc_item in image.find("TLCLISTList").findall("TLCLIST"): tokens = tlc_item.text.strip().split(' ') tokens[0] = str(float(tokens[0]) * scale) tlc_item.text = " ".join(tokens) scale_xml_element(image.find("AVGLINERATE"), scale) scale_xml_element(image.find("EXPOSUREDURATION"), 1.0/scale) # Update detector pitch. Verify that pitch is consistent # accross multiple bands. first_pitch_val = None for band in find_bands(root.find("GEO").find("DETECTOR_MOUNTING")): pitch = band.find("DETECTOR_ARRAY").find("DETPITCH") if first_pitch_val is None: first_pitch_val = pitch.text if first_pitch_val != pitch.text: raise Exception('InputError', "Found inconsistent pitch info across bands.") scale_xml_element(pitch, 1.0/scale) # Scale the RPC model if not options.skip_rpc_gen: RPI = root.find("RPB").find("IMAGE") scale_xml_element(RPI.find("SAMPSCALE" ), scale) scale_xml_element(RPI.find("LINESCALE" ), scale) scale_xml_element(RPI.find("SAMPOFFSET"), scale) scale_xml_element(RPI.find("LINEOFFSET"), scale) if options.wipe_att_eph: root = tree.getroot() try: root.remove(root.find("ATT")) except: pass try: root.remove(root.find("EPH")) except: pass xml_file = options.output_prefix + suffix + ".xml" print("Writing: " + xml_file) write_tree(tree, xml_file) if not options.skip_tif_gen: tif_mosaic_opts = "%d,%d," % (boundary.width(), boundary.height()) for i in range(len(args)): print(" Placing %s" % args[i]) print(" Size %dx%d at column %d and line %d" % \ (placements[i].width(),placements[i].height(), placements[i].minx, placements[i].miny)) tif_mosaic_opts += \ ("%s,%0.16f,%0.16f,%0.16f,%0.16f,%0.16f,%0.16f," % ( os.path.abspath(args[i]), orig_sizes[i][0], orig_sizes[i][1], placements[i].minx, placements[i].miny, placements[i].width(), placements[i].height() ) ) tif_file = options.output_prefix + suffix + ".tif"; mosaic_cmd = "tif_mosaic" mosaic_args = ['--threads', str(options.threads), '--cache-size', str(options.cache_size), '--output-image', tif_file, '--ot', options.output_type, '--band', str(options.band), '--reduce-percent', str(options.reduce_percent), '--image-data', tif_mosaic_opts] if options.input_nodata_value is not None: mosaic_args += ['--input-nodata-value', str(options.input_nodata_value)] if options.output_nodata_value is not None: mosaic_args += ['--output-nodata-value', str(options.output_nodata_value)] if options.fix_seams: mosaic_args += ['--fix-seams'] print(mosaic_cmd + " " + " ".join(mosaic_args)) subprocess.call([mosaic_cmd] + mosaic_args) # For some reason, the xml file goes missing when # tif_mosaic is invoked. Very strange. Write it again, for now. write_tree(tree, xml_file) # Make a preview image if options.preview: # The preview image size will be around 5% of the input image size. small_scale = int(round(5.0/scale)) stif_file = options.output_prefix + ".small.png" print("Writing: " + stif_file) 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) run_cmd( cmd, options ) except Usage as err: print(err.msg, file=sys.stderr) return 2 if __name__ == "__main__": sys.exit(main()) ================================================ FILE: src/asp/Tools/disp2ip.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file disp2ip.cc // Produce additional interest points based on disparity maps. This is a // tool for a very specialized purpose. #include <asp/Core/AspProgramOptions.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/FileUtils.h> #include <asp/Core/Nvm.h> #include <asp/Core/Macros.h> #include <asp/Core/DisparityProcessing.h> #include <asp/Sessions/StereoSessionFactory.h> #include <vw/BundleAdjustment/ControlNetwork.h> #include <vw/FileIO/FileUtils.h> #include <boost/program_options.hpp> #include <boost/filesystem.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; namespace asp { // Given a cnet between a set of left images, and disparities from left // to right images, add more interest points to the cnet based on the // disparities. void completeCnetFromDisparities(vw::ba::ControlNetwork & cnet, std::map<int, int> const& cnet_to_raw_index, std::vector<asp::DispImageType> const& interp_disparities, std::vector<vw::TransformPtr> const& left_trans, std::vector<vw::TransformPtr> const& right_trans) { // All input quantities must have the same size size_t num_left_images = cnet_to_raw_index.size(); if (interp_disparities.size() != num_left_images || left_trans.size() != num_left_images || right_trans.size() != num_left_images) vw::vw_throw(vw::ArgumentErr() << "Input datasets must have the same size.\n"); int net_size = cnet.size(); for (int i = 0; i < net_size; i++) { vw::ba::ControlPoint & cp = cnet[i]; // alias int num_measures = cp.size(); for (int j = 0; j < num_measures; j++) { vw::ba::ControlMeasure & cm = cp[j]; int cid = cm.image_id(); vw::Vector2 pix = cm.position(); vw::Vector2 sigma = cm.sigma(); // Find the raw image index corresponding to this cnet image index auto it = cnet_to_raw_index.find(cid); if (it == cnet_to_raw_index.end()) vw::vw_throw(vw::ArgumentErr() << "Could not find an index in the raw image list.\n"); int raw_index = it->second; // Apply the alignment transform to the left pixel pix = left_trans[raw_index]->forward(pix); // Find the interpolated disparity value auto disp = interp_disparities[raw_index](pix[0], pix[1]); // Skip invalid disparities if (!is_valid(disp)) continue; // Find the right transformed pixel vw::Vector2 right_pix = pix + disp.child(); // Undo the alignment transform in the right pixel right_pix = right_trans[raw_index]->reverse(right_pix); // Add the measure cp.add_measure(vw::ba::ControlMeasure(right_pix[0], right_pix[1], sigma[0], sigma[1], num_left_images + raw_index)); } } } struct DispToIpOptions: vw::GdalWriteOptions { std::string left_raw_image_list, left_filtered_image_list, right_filtered_image_list, optical_center_list, stereo_prefix_list, input_nvm, output_nvm; }; void disp2ip(int argc, char *argv[], DispToIpOptions& opt) { po::options_description general_options(""); general_options.add_options() ("left-raw-image-list", po::value(&opt.left_raw_image_list)->default_value(""), "List of raw left images, one per line.") ("left-filtered-image-list", po::value(&opt.left_filtered_image_list)->default_value(""), "List of left images after applying a filter, one per line.") ("right-filtered-image-list", po::value(&opt.right_filtered_image_list)->default_value(""), "List of right images after applying a filter, one per line.") ("stereo-prefix-list", po::value(&opt.stereo_prefix_list)->default_value(""), "List of stereo prefixes, one per line. Each prefix is for a stereo run " "with a left filtered and right filtered image, with affine epipolar alignment. " "Stereo could have been run with --correlator-mode, so without cameras.") ("optical-center-list", po::value(&opt.optical_center_list)->default_value(""), "List of optical centers for all filtered images. On each line must have the image name, " "optical center column, then row. The order of images is not important.") ("input-nvm", po::value(&opt.input_nvm)->default_value(""), "Input NVM file, having interest point matches between the left raw images.") ("output-nvm", po::value(&opt.output_nvm)->default_value(""), "Output NVM file, having interest point matches between all filtered images, " "produced with the help of disparity maps."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // All inputs must be non-empty if (opt.left_raw_image_list.empty() || opt.left_filtered_image_list.empty() || opt.right_filtered_image_list.empty() || opt.stereo_prefix_list.empty() || opt.optical_center_list.empty() || opt.input_nvm.empty() || opt.output_nvm.empty()) vw::vw_throw(vw::ArgumentErr() << "Must specify all input files.\n"); // Create the output directory vw::create_out_dir(opt.output_nvm); // Read the lists std::vector<std::string> left_raw_image_files, left_filtered_image_files, right_filtered_image_files, stereo_prefixes; asp::read_list(opt.left_raw_image_list, left_raw_image_files); asp::read_list(opt.left_filtered_image_list, left_filtered_image_files); asp::read_list(opt.right_filtered_image_list, right_filtered_image_files); asp::read_list(opt.stereo_prefix_list, stereo_prefixes); // All lists must have the same size if (left_raw_image_files.size() != left_filtered_image_files.size() || left_raw_image_files.size() != right_filtered_image_files.size() || left_raw_image_files.size() != stereo_prefixes.size()) vw::vw_throw(vw::ArgumentErr() << "All input lists must have the same size.\n"); // Read the optical center offsets for the filtered images std::map<std::string, Eigen::Vector2d> offsets; asp::readNvmOffsets(opt.optical_center_list, offsets); // Number of offsets must equal the number of filtered images if (offsets.size() != left_filtered_image_files.size() + right_filtered_image_files.size()) vw::vw_throw(vw::ArgumentErr() << "Number of optical center offsets must equal " << "the number of filtered images.\n"); // Read the nvm and create the cnet bool nvm_no_shift = false; // have an offsets file asp::nvmData nvm; asp::readNvm(opt.input_nvm, nvm_no_shift, nvm); vw::ba::ControlNetwork cnet("raw"); std::vector<Eigen::Affine3d> world_to_cam; std::map<std::string, Eigen::Vector2d> raw_offsets; asp::nvmToCnet(nvm, cnet, raw_offsets, world_to_cam); // Invalid disparity pixel typedef typename DispImageType::pixel_type DispPixelT; DispPixelT invalid_disp; invalid_disp.invalidate(); vw::ValueEdgeExtension<DispPixelT> invalid_ext(invalid_disp); // Iterate over images, and read the transforms to undo the alignment // in disparities. Also read the disparities and prepare for interpolation. int num_runs = stereo_prefixes.size(); std::vector<asp::DispImageType> interp_disparities(num_runs); std::vector<vw::TransformPtr> left_trans(num_runs), right_trans(num_runs); for (int i = 0; i < num_runs; i++) { stereo_settings().correlator_mode = true; // No cameras assumed asp::stereo_settings().alignment_method = "affineepipolar"; std::string stereo_prefix = stereo_prefixes[i]; std::string session_name = "pinhole"; std::string input_dem = ""; // No DEM bool allow_map_promote = false, quiet = true; asp::SessionPtr session(asp::StereoSessionFactory::create(session_name, // may change opt, left_filtered_image_files[i], right_filtered_image_files[i], "", "", // No cameras stereo_prefix, input_dem, allow_map_promote, quiet)); left_trans[i] = session->tx_left(); right_trans[i] = session->tx_right(); // Check that the pointers are not null if (left_trans[i].get() == NULL || right_trans[i].get() == NULL) vw::vw_throw(vw::ArgumentErr() << "Could not read the alignment transforms " << "for stereo prefix: " << stereo_prefix); // Read the disparity std::string dispFile = stereo_prefix + "-F.tif"; asp::DispImageType disp = session->pre_pointcloud_hook(dispFile); if (disp.cols() == 0 || disp.rows() == 0) vw::vw_throw(vw::ArgumentErr() << "Empty disparity image: " << dispFile << "\n"); // Add the disparity with bilinear interpolation to the list. Care with no-data. interp_disparities[i] = interpolate(disp, vw::BilinearInterpolation(), invalid_ext); } // Red the raw image list from the cnet. The order is not the same as in list // of raw images. std::vector<std::string> & cnet_list = cnet.get_image_list(); // alias // The map from each left raw image to its index in that list std::map<std::string, int> left_raw_name_to_index; for (size_t i = 0; i < left_raw_image_files.size(); i++) left_raw_name_to_index[left_raw_image_files[i]] = i; // The images in the cnet are in a random order usually, as produced by Theia // Need to find correspondences between the cnet indices and raw image indices std::map<int, int> cnet_to_raw_index; for (size_t i = 0; i < cnet_list.size(); i++) { // Look up in the raw image map auto it = left_raw_name_to_index.find(cnet_list[i]); if (it == left_raw_name_to_index.end()) vw::vw_throw(vw::ArgumentErr() << "Could not find image " << cnet_list[i] << " in the raw image list.\n"); int raw_index = it->second; cnet_to_raw_index[i] = raw_index; } // Replace in the cnet the left images with the left filtered images for (size_t i = 0; i < cnet_list.size(); i++) { // find corresponding raw image index auto it = cnet_to_raw_index.find(i); if (it == cnet_to_raw_index.end()) vw::vw_throw(vw::ArgumentErr() << "Could not find image " << cnet_list[i] << " in the raw image list.\n"); int raw_index = it->second; cnet_list[i] = left_filtered_image_files[raw_index]; } // Number of right filtered images (same as number of left filtered images) int num_right_images = right_filtered_image_files.size(); // Add the right filtered images to the cnet. This will also update // cnet_list, as it is an alias. for (int i = 0; i < num_right_images; i++) cnet.add_image_name(right_filtered_image_files[i]); // Make fake camera poses for the right filtered images. Those won't be accurate, // but have to create something. They will not be used. for (int i = 0; i < num_right_images; i++) world_to_cam.push_back(world_to_cam[i]); // The core work asp::completeCnetFromDisparities(cnet, cnet_to_raw_index, interp_disparities, left_trans, right_trans); // Convert the cnet to the nvm format asp::cnetToNvm(cnet, offsets, world_to_cam, nvm); // Write the nvm to disk asp::writeNvm(nvm, opt.output_nvm); } } // end namespace asp int main(int argc, char *argv[]) { asp::DispToIpOptions opt; try { asp::disp2ip(argc, argv, opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/disparitydebug.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file disparitydebug.cc #ifdef _MSC_VER #pragma warning(disable:4244) #pragma warning(disable:4267) #pragma warning(disable:4996) #endif #ifdef NDEBUG #undef NDEBUG #endif #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Stereo/DisparityMap.h> #include <vw/Image/Algorithms.h> #include <vw/Image/Filter.h> #include <vw/FileIO/FileUtils.h> #include <vw/Image/PixelMask.h> using namespace vw; using namespace vw::stereo; namespace po = boost::program_options; namespace fs = boost::filesystem; // Disparity norm double disparity_norm(PixelMask<Vector2f> const& pix) { if (!is_valid(pix)) return 0.0; return norm_2(pix.child()); } // To find the disparity norm of an image, use // per_pixel_filter(image, DisparityNorm()). class DisparityNorm: public ReturnFixedType<double> { public: double operator()(PixelMask<Vector2f> const& pix) const { return disparity_norm(pix); } }; // Find the maximum of the norms of differences between a disparity // at a pixel and its four left, right, top, and bottom neighbors. // For the disparity to result in a nice transform from left to // right image the norms better be less than 1. class DispNormDiff: public ImageViewBase<DispNormDiff> { ImageViewRef<PixelMask<Vector2f>> m_img; public: DispNormDiff(ImageViewRef<PixelMask<Vector2f>> const& img): m_img(img) {} typedef float result_type; typedef result_type pixel_type; typedef ProceduralPixelAccessor<DispNormDiff> pixel_accessor; inline int32 cols() const { return m_img.cols(); } inline int32 rows() const { return m_img.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline result_type operator()(double/*i*/, double/*j*/, int32/*p*/ = 0) const { vw_throw(NoImplErr() << "DispNormDiff::operator()(...) is not implemented"); return result_type(0.0); } typedef CropView<ImageView<result_type>> prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { ImageView<result_type> tile(bbox.width(), bbox.height()); // Need to see each pixel's neighbors int extra = 1; BBox2i biased_box = bbox; biased_box.expand(extra); biased_box.crop(bounding_box(m_img)); // Bring fully in memory a crop of the input for this tile ImageView<PixelMask<Vector2f>> cropped_img = crop(m_img, biased_box); for (int col = bbox.min().x(); col < bbox.max().x(); col++) { for (int row = bbox.min().y(); row < bbox.max().y(); row++) { // Find the disparity value at the current pixel and the neighbors. // Need to be careful to account for the bias and for indices // going out of range. // Coordinates of a pixel and its neighbors. std::vector<Vector2i> coords = {Vector2i(0, 0), Vector2i(1, 0), Vector2i(0, 1), Vector2i(-1, 0), Vector2i(0, -1)}; std::vector<PixelMask<Vector2f>> vals(5); for (int it = 0; it < 5; it++) { Vector2i coord = Vector2i(col, row) + coords[it]; // pixel in uncropped image if (biased_box.contains(coord)) { // Take into account the bounds and the crop vals[it] = cropped_img(coord.x() - biased_box.min().x(), coord.y() - biased_box.min().y()); } else { // Out of range vals[it].child() = Vector2f(0, 0); vals[it].invalidate(); } } double max_norm_diff = 0.0; if (is_valid(vals[0])) { // Need to have the center pixel valid for (int it = 1; it < 5; it++) { if (!is_valid(vals[it])) continue; max_norm_diff = std::max(max_norm_diff, norm_2(vals[it].child() - vals[0].child())); } } tile(col - bbox.min().x(), row - bbox.min().y()) = max_norm_diff; } } return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; struct Options : vw::GdalWriteOptions { // Input std::string input_file_name; BBox2 normalization_range; BBox2 roi; ///< Only generate output images in this region bool save_norm, save_norm_diff, raw; // Output std::string output_prefix, output_file_type; Options(): save_norm(false), save_norm_diff(false) {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("normalization", po::value(&opt.normalization_range)->default_value(BBox2(0, 0, 0, 0), "auto"), "Normalization range. Specify in the format: hmin vmin hmax vmax.") ("roi", po::value(&opt.roi)->default_value(BBox2(0,0,0,0), "auto"), "Region of interest. Specify in the format: xmin ymin xmax ymax.") ("raw", po::bool_switch(&opt.raw)->default_value(false), "Save the raw disparity values without any normalization. Invalid pixels are set to " "no-data.") ("save-norm", po::bool_switch(&opt.save_norm)->default_value(false), "Save the norm of the disparity instead of its two bands.") ("save-norm-diff", po::bool_switch(&opt.save_norm_diff)->default_value(false), "Save the maximum of norms of differences between a disparity and its four neighbors.") ("output-prefix, o", po::value(&opt.output_prefix), "Specify the output prefix. This is set automatically if not provided.") ("output-filetype, t", po::value(&opt.output_file_type)->default_value("tif"), "Specify the output file type."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input-file", po::value(&opt.input_file_name), "Input disparity map."); po::positional_options_description positional_desc; positional_desc.add("input-file", 1); std::string usage("[options] <input disparity map>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.input_file_name.empty()) vw_throw(ArgumentErr() << "Missing input file.\n"); if (opt.output_prefix.empty()) opt.output_prefix = vw::prefix_from_filename(opt.input_file_name); if (int(opt.save_norm) + int(opt.save_norm_diff) + int(opt.raw) > 1) vw::vw_throw(vw::ArgumentErr() << "Cannot save more than one of: disparity norm, norm of differences, raw.\n"); // Float data need to be saved to a tif file if ((opt.save_norm || opt.save_norm_diff || opt.raw) && opt.output_file_type != "tif") vw::vw_throw(vw::ArgumentErr() << "When saving either disparity norm, norm of differences, or raw disparity, " << "the output file type must be tif.\n"); } void process_disparity(Options& opt) { cartography::GeoReference georef; bool has_georef = read_georeference(georef, opt.input_file_name); bool has_nodata = false; float output_nodata = -32768.0; // Read as PixelMask<Vector2f> regardless of input type. // Must handle int32 vs float and masked vs unmasked variants. ImageFormat fmt = vw::image_format(opt.input_file_name); bool has_mask = (fmt.pixel_format == VW_PIXEL_RGB || fmt.pixel_format == VW_PIXEL_GENERIC_3_CHANNEL || (fmt.pixel_format == VW_PIXEL_SCALAR && fmt.planes == 3)); bool is_int = (fmt.channel_type == VW_CHANNEL_INT32); ImageViewRef<PixelMask<Vector2f>> disk_disparity_map; if (has_mask && is_int) disk_disparity_map = pixel_cast<PixelMask<Vector2f>> (DiskImageView<PixelMask<Vector2i>>(opt.input_file_name)); else if (has_mask) disk_disparity_map = DiskImageView<PixelMask<Vector2f>>(opt.input_file_name); else if (is_int) disk_disparity_map = pixel_cast<PixelMask<Vector2f>> (create_mask(DiskImageView<Vector2i>(opt.input_file_name))); else disk_disparity_map = pixel_cast<PixelMask<Vector2f>> (create_mask(DiskImageView<Vector2f>(opt.input_file_name))); if (opt.save_norm) { std::string norm_file = opt.output_prefix + "-norm." + opt.output_file_type; vw_out() << "\t--> Writing disparity norm: " << norm_file << "\n"; block_write_gdal_image(norm_file, per_pixel_filter(disk_disparity_map, DisparityNorm()), has_georef, georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp","\t norm: ")); return; } if (opt.save_norm_diff) { std::string norm_file = opt.output_prefix + "-norm-diff." + opt.output_file_type; vw_out() << "\t--> Writing norm of disparity diff: " << norm_file << "\n"; block_write_gdal_image(norm_file, DispNormDiff(disk_disparity_map), has_georef, georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp","\t norm: ")); return; } // If no ROI passed in, use the full image BBox2 roiToUse(opt.roi); if (opt.roi == BBox2(0, 0, 0, 0)) roiToUse = BBox2(0, 0, disk_disparity_map.cols(), disk_disparity_map.rows()); if (has_georef) georef = crop(georef, roiToUse); // Crop to ROI and select channels ImageViewRef<PixelMask<Vector2f>> disp = crop(disk_disparity_map, roiToUse); ImageViewRef<float> horizontal = select_channel(disp, 0); ImageViewRef<float> vertical = select_channel(disp, 1); // Set up output files std::string h_file = opt.output_prefix + "-H." + opt.output_file_type; std::string v_file = opt.output_prefix + "-V." + opt.output_file_type; if (opt.raw) { has_nodata = true; // Pick as nodata a value that large and representable exactly as float output_nodata = -1e+6; // Set invalid pixels to nodata ImageViewRef<float> horiz_out = apply_mask(copy_mask(horizontal, disp), output_nodata); ImageViewRef<float> vert_out = apply_mask(copy_mask(vertical, disp), output_nodata); // Write both images to disk vw_out() << "\t--> Writing raw horizontal disparity: " << h_file << "\n"; block_write_gdal_image(h_file, horiz_out, has_georef, georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp","\t H : ")); vw_out() << "\t--> Writing raw vertical disparity: " << v_file << "\n"; block_write_gdal_image(v_file, vert_out, has_georef, georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp","\t V : ")); return; } // Compute intensity display range if not passed in. For this purpose // subsample the image. vw_out() << "\t--> Computing disparity range.\n"; if (opt.normalization_range == BBox2(0,0,0,0)) { float subsample_amt = float(roiToUse.height())*float(roiToUse.width()) / (1000.f * 1000.f); subsample_amt = std::max(subsample_amt, 1.0f); opt.normalization_range = get_disparity_range(subsample(disp, subsample_amt)); } vw_out() << "\t Horizontal: [" << opt.normalization_range.min().x() << " " << opt.normalization_range.max().x() << "] Vertical: [" << opt.normalization_range.min().y() << " " << opt.normalization_range.max().y() << "]\n"; // Generate value-normalized copies of the H and V channels. // Normalize to [0,1] (float channel range), then rescale to uint8. horizontal = apply_mask(copy_mask(clamp(normalize(horizontal, opt.normalization_range.min().x(), opt.normalization_range.max().x(), ChannelRange<float>::min(), ChannelRange<float>::max())), disp)); vertical = apply_mask(copy_mask(clamp(normalize(vertical, opt.normalization_range.min().y(), opt.normalization_range.max().y(), ChannelRange<float>::min(), ChannelRange<float>::max())), disp)); // Write both images to disk, casting as UINT8 vw_out() << "\t--> Writing horizontal disparity: " << h_file << "\n"; block_write_gdal_image(h_file, channel_cast_rescale<uint8>(horizontal), has_georef, georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp","\t H : ")); vw_out() << "\t--> Writing vertical disparity: " << v_file << "\n"; block_write_gdal_image(v_file, channel_cast_rescale<uint8>(vertical), has_georef, georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp","\t V : ")); } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); vw_out() << "Reading: " << opt.input_file_name << "\n"; // Validate that the input is a 2 or 3 channel image ImageFormat fmt = vw::image_format(opt.input_file_name); bool valid = (fmt.pixel_format == VW_PIXEL_GENERIC_2_CHANNEL || fmt.pixel_format == VW_PIXEL_RGB || fmt.pixel_format == VW_PIXEL_GENERIC_3_CHANNEL || (fmt.pixel_format == VW_PIXEL_SCALAR && (fmt.planes == 2 || fmt.planes == 3))); if (!valid) vw_throw(ArgumentErr() << "Unsupported pixel format. Expected 2 or 3 channel image. " << "Instead got [" << pixel_format_name(fmt.pixel_format) << "]."); // All disparity data is read as float and processed uniformly process_disparity(opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/extract_bag ================================================ #!/usr/bin/env python """ For a given list of topics and directory names, save the image and point cloud messages for that topic to the specified directories. The created file names will be in the form: <timestamp>.<extension>, with the timestamp being the double-precision number of seconds since epoch read from message header. Can specify a list of timestamps for which to extract the data. """ import argparse, os, re, sys, rosbag, cv2, sensor_msgs, cv_bridge from sensor_msgs import point_cloud2 import numpy as np def read_timestamps(filename): """Return a map of timestamps.""" timestamp_map = {} with open(filename, 'r') as f: lines = f.readlines() for line in lines: m = re.match("^.*?(\d+\.\d+).*?\n", line) if m: timestamp = float(m.group(1)) timestamp_map[timestamp] = line return timestamp_map def sanity_checks(args, topic_list, dir_list): # Sanity checks if args.bag == "": print("Must specify the input bag.") sys.exit(1) if len(topic_list) != len(dir_list): print("There must exists as many topics as output directories.") sys.exit(1) if len(topic_list) == 0: print("Must specify at least one topic and output directory.") sys.exit(1) if args.timestamp_tol is not None and args.timestamp_tol <= 0: print("The timestamp tolerance must be positive.") sys.exit(1) if args.approx_timestamp and args.timestamp_tol is None: print("When saving with an approximate timestamp, must specify the tolerance.") sys.exit(1) def find_closest_messages_within_tol(args, topic_list, timestamp_map): """ Given a list of timestamps and a tolerance, find, for each input topic, the closest message in the bag to every timestamp in the list, within given tolerance. """ print("Doing a first pass through the bag to find the closest messages to " "desired ones, with tolerance.") # The timestamps close to which need to find data in the bag, Must # be sorted. req_timestamps = sorted(list(timestamp_map.keys())) min_list_time = req_timestamps[0] max_list_time = req_timestamps[-1] # This will travel forward in time, and we assume the messages travel # forward in time too. # Must depend on topic! req_index = {} closest_stamps = {} first_good = {} for topic in topic_list: req_index[topic] = 0 first_good[topic] = -1 # Will keep the result here, starts as an array with values smaller # than any timestamp closest_stamps[topic] = [-1000.0] * len(req_timestamps) with rosbag.Bag(args.bag, "r") as bag: # Check image message type for topic, msg, t in bag.read_messages(topic_list): # Read the header timestamp try: # Note that we search the bag exhaustively. We do not assume # timestamps are in increasing order of time. Sometimes # that assumption can be violated. stamp = msg.header.stamp.to_sec() if stamp < min_list_time - args.timestamp_tol: continue # too early if stamp > max_list_time + args.timestamp_tol: break # past the desired times # See if this timestamp is closer to any of the req_timestamps # than the existing candidates. Note that we stop as soon as # we can to keep the overall complexity linear and not quadratic. first_good[topic] = -1 for it in range(req_index[topic], len(req_timestamps)): if req_timestamps[it] > stamp + args.timestamp_tol: break # no point in continuing curr_diff = abs(stamp - req_timestamps[it]) prev_diff = abs(closest_stamps[topic][it] - req_timestamps[it]) if curr_diff < args.timestamp_tol and curr_diff < prev_diff: closest_stamps[topic][it] = stamp if first_good[topic] < 0: first_good[topic] = 1 # Found the first good fit index. There won't be good # fits going forward for indices to the left of this. req_index[topic] = it except: continue # Put in a set and print some stats closest_stamps_set = {} exact_to_approx = {} for topic in topic_list: print("Topic is " + str(topic)) closest_stamps_set[topic] = set() exact_to_approx[topic] = {} for it in range(len(closest_stamps[topic])): diff = abs(closest_stamps[topic][it] - req_timestamps[it]) msg = "" if diff > args.timestamp_tol: diff = "-1" msg = " (failed)" else: closest_stamps_set[topic].add(closest_stamps[topic][it]) exact_to_approx[topic][closest_stamps[topic][it]] = req_timestamps[it] print("For timestamp " + str(req_timestamps[it]) + \ ", closest found message is within " + str(diff) + " seconds" + msg) return (closest_stamps_set, exact_to_approx) parser = argparse.ArgumentParser(description = __doc__, formatter_class = argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("--bag", dest = "bag", help = "Input bag."), parser.add_argument("--topics", dest = "topics", default = "", help = "A list of topics, in quotes, having image, compressed " + "image, or point cloud (depth) data.") parser.add_argument("--dirs", dest = "dirs", default = "", help = "A list of directories, in quotes, one for each topic, " + "in which to save the data for that topic.") parser.add_argument("--timestamp_list", dest = "timestamp_list", default = "", help = "Extract data for the timestamps in this list. " + "If not set, extract all data. Each line in " + "this file must contain a number of the form " + "<digits>.<digits> (the timestamp), and perhaps other " + "text as well, or it will be ignored. So, a " + "filename containing a timestamp as part of " + "its name will be accepted.") parser.add_argument("--timestamp_tol", dest = "timestamp_tol", type = float, default = None, help = "If set, extract the data for each of the given topics " + "whose timestamps are closest to the " + "ones in the input list, within this " + "tolerance, in seconds. This should be kept small. It is assumed " + "the bag stores the data for each topic in increasing value of " + "timestamp.") parser.add_argument('--approx_timestamp', dest='approx_timestamp', action='store_true', help = "If using --timestamp_tol, change the timestamp of " + "the data being saved (which becomes part of the output filename) " + "to be the closest timestamp in the input list.") args = parser.parse_args() topic_list = args.topics.split() dir_list = args.dirs.split() sanity_checks(args, topic_list, dir_list) # The map of all required timestamps, if specified timestamp_map = {} if args.timestamp_list != "": timestamp_map = read_timestamps(args.timestamp_list) if len(timestamp_map) == 0: print("No timestamps read from " + args.timestamp_list) sys.exit(1) if args.timestamp_tol > 0 and len(timestamp_map) == 0: print("When using a timestamp tolerance, an input list must be provided.") sys.exit(1) # TODO(oalexan1): Make this a function. # Map from topic name to dir name. topic_to_dir = {} for it in range(len(topic_list)): topic = topic_list[it] path = dir_list[it] if topic in topic_to_dir: print("Duplicate topic: " + topic) sys.exit(1) topic_to_dir[topic] = path # TODO(oalexan1): Make this a function. # Create directories for path in dir_list: try: os.makedirs(path) except OSError: if os.path.isdir(path): pass else: raise Exception("Could not make directory: " + path) if args.timestamp_tol > 0: (closest_stamps_set, exact_to_approx)\ = find_closest_messages_within_tol(args, topic_list, timestamp_map) if args.approx_timestamp: print("Replacing on saving the actual timestamps with the closest from the list.") # TODO(oalexan1): Make this a function # Read the bag print("Reading: " + args.bag) print("Writing the data to: " + args.dirs) cv_bridge = cv_bridge.CvBridge() # The timestamp format is consistent with what rig_calibrator uses fmt_str = "{:10.7f}" # Write the data with rosbag.Bag(args.bag, "r") as bag: info = bag.get_type_and_topic_info() # Check image message type for topic, msg, t in bag.read_messages(topic_list): # Read the header timestamp try: # Note that we search the bag exhaustively. We do not assume # timestamps are in increasing order of time. Sometimes # that assumption can be violated. stamp = msg.header.stamp.to_sec() if len(timestamp_map) > 0: # When extracting only a subset of the timestamps if args.timestamp_tol is None: # exact timestamp if stamp not in timestamp_map: continue else: # Nearby timestamp if stamp not in closest_stamps_set[topic]: continue except: continue if args.approx_timestamp: # Replacing with the apporox one approx_stamp = exact_to_approx[topic][stamp] print("Saving data for timestamp " + str(stamp) + " as if it were for " + \ "timestamp " + str(approx_stamp)) stamp = approx_stamp if info.topics[topic].msg_type == "sensor_msgs/Image": # Write an image try: filename = topic_to_dir[topic] + "/" + fmt_str.format(stamp) + ".jpg" cv_image = cv_bridge.imgmsg_to_cv2(msg, desired_encoding = 'passthrough') if len(cv_image.shape) == 2: # Try again, as mono. There should be a better way. cv_image = cv_bridge.imgmsg_to_cv2(msg, desired_encoding = 'mono8') print("Writing: " + filename) cv2.imwrite(filename, cv_image) except: print("Failed to write: " + filename) if info.topics[topic].msg_type == "sensor_msgs/CompressedImage": # Write a compressed image. It is assumed to be in color. try: filename = topic_to_dir[topic] + "/" + fmt_str.format(stamp) + ".jpg" cv_image = cv_bridge.compressed_imgmsg_to_cv2(msg, desired_encoding = 'passthrough') print("Writing: " + filename) cv2.imwrite(filename, cv_image) except: print("Failed to write: " + filename) if info.topics[topic].msg_type == "sensor_msgs/PointCloud2": try: # Write a point cloud in the format at: # https://stereopipeline.readthedocs.io/en/latest/tools/rig_calibrator.html # (section on point cloud format). # TODO(oalexan1): Test this! filename = topic_to_dir[topic] + "/" + fmt_str.format(stamp) + ".pc" print("Writing: " + filename) fh = open(filename, "wb") vals = np.array([msg.height, msg.width, 3], dtype=np.int32) fh.write(vals.tobytes()) # TODO(oalexan1): This iteration may be slow. cloud_points = list( point_cloud2.read_points(msg, skip_nans = False, # read all field_names = ("x", "y", "z"))) for point in cloud_points: vals = np.array([point[0], point[1], point[2]], dtype=np.float32) fh.write(vals.tobytes()) except Exception as e: print("Failed to write: ", filename) print("Error is ", str(e)) ================================================ FILE: src/asp/Tools/fit_rpc.cc ================================================ /* Copyright (c) 2021, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking * platform" software is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ // TODO(oalexan1): Do not use -out_dir. Use -out_config. // TODO(oalexan1): Print an underestimate and overestimate for the undistorted win. // TODO(oalexan1): Must have sensor name as an option. For now it defaults to sensor 0. // TODO(oalexan1): Must document this tool. #include <ceres/ceres.h> #include <ceres/rotation.h> #include <ceres/problem.h> #include <ceres/solver.h> #include <ceres/cost_function.h> #include <ceres/loss_function.h> #include <ceres/dynamic_numeric_diff_cost_function.h> #include <ceres/numeric_diff_cost_function.h> #include <ceres/autodiff_cost_function.h> #include <opencv2/imgproc.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/core/utility.hpp> #include <asp/Rig/RigRpcDistortion.h> #include <asp/Rig/RigCameraParams.h> #include <asp/Rig/RigUtils.h> #include <asp/Rig/RigConfig.h> #include <gflags/gflags.h> #include <glog/logging.h> #include <Eigen/Geometry> #include <Eigen/Core> #include <boost/filesystem.hpp> #include <string> #include <map> #include <iostream> #include <fstream> #include <iomanip> namespace fs = boost::filesystem; DEFINE_int32(rpc_degree, -1, "The degree of the RPC model to fit."); DEFINE_int32(num_samples, -1, "The number of row and column samples to use to fit the RPC model."); DEFINE_int32(num_iterations, 20, "How many solver iterations to perform in calibration."); DECLARE_int32(num_threads); // declared externally DEFINE_double(parameter_tolerance, 1e-12, "Stop when the optimization variables change by " "less than this."); DEFINE_string(camera_config, "", "Read the camera configuration from this file."); DEFINE_string(out_dir, "", "Write here the camera configuration having the RPC fit."); DEFINE_bool(verbose, false, "Print more information about what the tool is doing."); int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); google::ParseCommandLineFlags(&argc, &argv, true); if (FLAGS_camera_config.empty()) LOG(FATAL) << "Camera config file was not specified."; if (FLAGS_out_dir.empty()) LOG(FATAL) << "Output camera config directory was not specified."; if (FLAGS_rpc_degree <= 0) LOG(FATAL) << "The RPC degree must be positive."; if (FLAGS_num_samples <= 0) LOG(FATAL) << "The number of samples must be positive."; rig::RigSet R; bool use_initial_rig_transforms = true; // dictated by the api rig::readRigConfig(FLAGS_camera_config, use_initial_rig_transforms, R); std::cout << "Focal length is " << R.cam_params[0].GetFocalVector().transpose() << std::endl; Eigen::VectorXd rpc_dist_coeffs; rig::fitRpcDist(FLAGS_rpc_degree, FLAGS_num_samples, R.cam_params[0], FLAGS_num_threads, FLAGS_num_iterations, FLAGS_parameter_tolerance, FLAGS_verbose, // Output rpc_dist_coeffs); rig::RPCLensDistortion rpc; rpc.set_distortion_parameters(rpc_dist_coeffs); rig::evalRpcDistUndist(FLAGS_num_samples, R.cam_params[0], rpc); // Create the model with RPC distortion. Note how we pass both the distortion // and undistortion RPC coefficients. R.cam_params[0].SetDistortion(rpc_dist_coeffs); rig::writeRigConfig(FLAGS_out_dir + "/rig_config.txt", use_initial_rig_transforms, R); return 0; } ================================================ FILE: src/asp/Tools/gcp_gen.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file gcp_gen.cc /// /// A program for finding GCP given a camera image, a similar looking /// orthoimage, and a DEM. #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/MatchList.h> #include <asp/Core/GCP.h> #include <asp/Core/Macros.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/ImageNormalization.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Image/Manipulation.h> #include <vw/Image/PixelTypeInfo.h> #include <vw/FileIO/MatrixIO.h> #include <vw/Math/Geometry.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/FileIO/FileUtils.h> using namespace vw; namespace po = boost::program_options; namespace asp { struct Options: vw::GdalWriteOptions { std::string camera_image, ortho_image, mapproj_image, dem, output_gcp, output_prefix, match_file; int min_matches; double gcp_sigma; Options() {} }; void handle_arguments(int argc, char *argv[], Options& opt) { const double g_nan_val = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options(""); general_options.add(vw::GdalWriteOptionsDescription(opt)); // Pass interest point matching options directly to stereo_settings auto & ip_opt = asp::stereo_settings(); // alias general_options.add_options() ("camera-image", po::value(&opt.camera_image)->default_value(""), "The camera image.") ("ortho-image", po::value(&opt.ortho_image)->default_value(""), "The ortho image to geolocate the interest points in.") ("dem", po::value(&opt.dem)->default_value(""), "The DEM to infer the elevations from.") ("output-gcp,o", po::value(&opt.output_gcp)->default_value(""), "The output GCP file.") ("gcp-sigma", po::value(&opt.gcp_sigma)->default_value(1.0), "The sigma (uncertainty, in meters) to use for the GCPs. A smaller sigma suggests " "a more accurate GCP. See also option --fix-gcp-xyz in bundle adjustment.") ("ip-detect-method", po::value(&ip_opt.ip_detect_method)->default_value(0), "Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.") ("ip-per-image", po::value(&ip_opt.ip_per_image)->default_value(20000), "How many interest points to detect in each image (the resulting number of " "matches will be much less).") ("ip-per-tile", po::value(&ip_opt.ip_per_tile)->default_value(0), "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.") ("matches-per-tile", po::value(&ip_opt.matches_per_tile)->default_value(0), "How many interest point matches to compute in each image tile (of size " "normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger " "than this. See also --matches-per-tile-params.") ("matches-per-tile-params", po::value(&ip_opt.matches_per_tile_params)->default_value(Vector2(1024, 1280), "1024 1280"), "To be used with --matches-per-tile. The first value is the image tile size for both " "images. A larger second value allows each right tile to further expand to this size, " "resulting in the tiles overlapping. This may be needed if the homography alignment " "between these images is not great, as this transform is used to pair up left and " "right image tiles.") ("mapproj-image", po::value(&opt.mapproj_image)->default_value(""), "If interest point matching of the camera image to the orthoimage fails, and this " "image is provided, which is produced by mapprojecting the camera image with a camera " "model onto a DEM, use this for matching to the orthoimage instead, then transfer the " "matches to the camera image. The camera model file and DEM must be available and " "their names will be read from the geoheader of the mapprojected image.") ("individually-normalize", po::bool_switch(&ip_opt.individually_normalize)->default_value(false)->implicit_value(true), "Individually normalize the input images instead of using common values.") ("matches-as-txt", po::bool_switch(&ip_opt.matches_as_txt)->default_value(false)->implicit_value(true), "Read and write match files as plain text instead of binary. See the documentation " "for details.") ("num-ransac-iterations", po::value(&ip_opt.ip_num_ransac_iterations)->default_value(1000), "How many iterations to perform in RANSAC when finding interest point matches.") ("inlier-threshold", po::value(&ip_opt.epipolar_threshold)->default_value(0.0), "The inlier threshold (in pixels) to separate inliers from outliers when " "computing interest point matches. A smaller threshold will result in fewer " "inliers. The default is auto-determined.") ("min-matches", po::value(&opt.min_matches)->default_value(10), "Set the minimum number of inlier matches between images for successful matching.") ("nodata-value", po::value(&ip_opt.nodata_value)->default_value(g_nan_val), "Pixels with values less than or equal to this number are treated as no-data. This " "overrides the no-data values from input images.") ("output-prefix", po::value(&opt.output_prefix)->default_value(""), "Save intermediate data, including match files, in this directory. Ths will " "cache any matches found, and those will be used to create the GCP file. " "The match file needs to be deleted if desired to recompute it.") ("match-file", po::value(&opt.match_file)->default_value(""), "If set, use this match file instead of creating one.") ; po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("--camera-image image.tif --ortho-image ortho.tif " "--dem dem.tif -o output.gcp"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Sanity checks if (opt.camera_image == "") vw_throw(ArgumentErr() << "Missing camera image.\n"); if (opt.ortho_image == "") vw_throw(ArgumentErr() << "Missing ortho image.\n"); if (opt.dem == "") vw_throw(ArgumentErr() << "Missing DEM.\n"); if (opt.output_gcp == "") vw_throw(ArgumentErr() << "Missing output GCP file.\n"); if (opt.output_prefix == "") vw::vw_throw(vw::ArgumentErr() << "The output prefix must be non-empty.\n"); // GCP sigma must be positive if (opt.gcp_sigma <= 0.0) vw_throw(ArgumentErr() << "The GCP sigma must be positive.\n"); // The ortho must have a geo reference vw::cartography::GeoReference georef_ortho; bool has_georef_ortho = vw::cartography::read_georeference(georef_ortho, opt.ortho_image); if (!has_georef_ortho) vw_throw(ArgumentErr() << "The ortho image must have a georeference.\n"); // Same for the DEM vw::cartography::GeoReference georef_dem; bool has_georef_dem = vw::cartography::read_georeference(georef_dem, opt.dem); if (!has_georef_dem) vw_throw(ArgumentErr() << "The DEM must have a georeference.\n"); // Sanity checks if (ip_opt.ip_per_image > 0 && ip_opt.ip_per_tile > 0) vw_throw(ArgumentErr() << "Can set only one of --ip-per-image and --ip-per-tile.\n"); // Create the output directory vw::create_out_dir(opt.output_prefix); vw::create_out_dir(opt.output_gcp); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.output_prefix); return; } // If the matching is done with the mapprojected camera image, undo it. This applies // only to ip1, as ip2 is for the ortho image. Both of these may be modified if the // mapprojection is not undone successfully for all matches. void undo_mapproj(Options & opt, std::vector<vw::ip::InterestPoint> & ip1, std::vector<vw::ip::InterestPoint> & ip2) { // Read the needed information from the mapproj header std::string adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key; std::string adj_prefix, image_file, cam_type, cam_file, dem_file; read_mapproj_header(opt.mapproj_image, adj_key, img_file_key, cam_type_key, cam_file_key, dem_file_key, adj_prefix, image_file, cam_type, cam_file, dem_file); // The image file must match if (image_file != opt.camera_image) vw_throw(ArgumentErr() << "The image file in the mapproj header of " << opt.mapproj_image << " does not match the camera image.\n"); // The dem file must be non-empty if (dem_file == "") vw_throw(ArgumentErr() << "The DEM file in the mapproj header of " << opt.mapproj_image << " is empty.\n"); // Load the camera model asp::SessionPtr session(asp::StereoSessionFactory::create (cam_type, // may change opt, image_file, image_file, cam_file, cam_file, opt.output_prefix)); const Vector2 zero_pixel_offset(0,0); vw::CamPtr map_proj_cam = session->load_camera_model(image_file, cam_file, adj_prefix, zero_pixel_offset); // Prepare the DEM for interpolation vw::cartography::GeoReference dem_georef; ImageViewRef<PixelMask<double>> interp_dem; asp::create_interp_dem(dem_file, dem_georef, interp_dem); // Read the mapproj_image georef vw::cartography::GeoReference map_georef; bool has_mapproj_georef = vw::cartography::read_georeference(map_georef, opt.mapproj_image); if (!has_mapproj_georef) vw_throw(ArgumentErr() << "No georeference found in: " << opt.mapproj_image << ".\n"); // Undo the mapprojection. Skip the matches for which cannot do that. std::vector<vw::ip::InterestPoint> local_ip1, local_ip2; for (size_t ip_iter = 0; ip_iter < ip1.size(); ip_iter++) { if (!asp::projected_ip_to_raw_ip(ip1[ip_iter], interp_dem, map_proj_cam, map_georef, dem_georef)) continue; local_ip1.push_back(ip1[ip_iter]); local_ip2.push_back(ip2[ip_iter]); } // Replace the old IP with the new ones ip1 = local_ip1; ip2 = local_ip2; } void gcp_gen(Options & opt) { std::vector<vw::ip::InterestPoint> ip1, ip2; if (opt.match_file == "") { bool is_mapproj = false; if (opt.mapproj_image == "") { matchIpNoCams(opt.camera_image, opt.ortho_image, opt.output_prefix, ip1, ip2); } else { // Consider the advanced --mapproj-image option is_mapproj = true; matchIpNoCams(opt.mapproj_image, opt.ortho_image, opt.output_prefix, ip1, ip2); } } else { vw::vw_out() << "Reading matches from: " << opt.match_file << "\n"; bool matches_as_txt = asp::stereo_settings().matches_as_txt; vw::ip::read_match_file(opt.match_file, ip1, ip2, matches_as_txt); } // If too few matches, fail, rather than give incorrect results if (int(ip1.size()) < opt.min_matches) vw::vw_throw(ArgumentErr() << "Found only " << ip1.size() << " matches, " << "fewer than the minimum of " << opt.min_matches << " (option --min-matches). Cannot create GCP file.\n"); if (opt.mapproj_image != "") undo_mapproj(opt, ip1, ip2); // Populate from two vectors of matched interest points asp::MatchList matchList; matchList.populateFromIpPair(ip1, ip2); // Write the GCP file std::vector<std::string> image_files = {opt.camera_image, opt.ortho_image}; asp::genWriteGcp(image_files, opt.output_gcp, opt.dem, matchList, opt.gcp_sigma); return; } } // end namespace asp int main(int argc, char *argv[]) { asp::Options opt; try { // Process command line options asp::handle_arguments(argc, argv, opt); asp::gcp_gen(opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/geodiff.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/PointUtils.h> #include <asp/Core/DemUtils.h> #include <vw/FileIO/DiskImageView.h> #include <vw/FileIO/FileUtils.h> #include <vw/Image/ImageChannels.h> #include <vw/Image/PixelMath.h> #include <vw/Image/ImageMath.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Cartography/PointImageManipulation.h> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options: vw::GdalWriteOptions { std::string dem1_file, dem2_file, output_prefix, csv_format_str, csv_srs, csv_proj4_str; double nodata_value; bool use_float, use_absolute; }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("nodata-value", po::value(&opt.nodata_value)->default_value(-32768), "The no-data value to use, unless present in the DEM geoheaders.") ("output-prefix,o", po::value(&opt.output_prefix), "Specify the output prefix.") ("float", po::bool_switch(&opt.use_float)->default_value(false), "Output using float (32 bit) instead of using doubles (64 bit). This is now " "the default, and this option is obsolete.") ("absolute", po::bool_switch(&opt.use_absolute)->default_value(false), "Output the absolute difference as opposed to just the difference.") ("csv-format", po::value(&opt.csv_format_str)->default_value(""), asp::csv_opt_caption().c_str()) ("csv-srs", po::value(&opt.csv_srs)->default_value(""), "The projection string to use to interpret the entries in input CSV files. If not set, " "it will be borrowed from the DEM.") ("csv-proj4", po::value(&opt.csv_proj4_str)->default_value(""), "An alias for --csv-srs, for backward compatibility."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("dem1", po::value(&opt.dem1_file), "Explicitly specify the first DEM.") ("dem2", po::value(&opt.dem2_file), "Explicitly specify the second DEM."); po::positional_options_description positional_desc; positional_desc.add("dem1", 1); positional_desc.add("dem2", 1); std::string usage("[options] <dem1> <dem2>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.dem1_file.empty() || opt.dem2_file.empty()) vw_throw(ArgumentErr() << "Requires <dem1> and <dem2> in order to proceed.\n\n" << usage << general_options); if (opt.output_prefix.empty()) opt.output_prefix = fs::path(opt.dem1_file).stem().string() + "__" + fs::path(opt.dem2_file).stem().string(); vw::create_out_dir(opt.output_prefix); // Make this the default. There is no reason to have double-precision differences, // and they are huge. opt.use_float = true; // Must specify either csv_srs or csv_proj4_str, but not both. The latter is // for backward compatibility. if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty()) vw_throw(ArgumentErr() << "Cannot specify both --csv-srs and --csv-proj4.\n"); if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty()) opt.csv_srs = opt.csv_proj4_str; } void georef_sanity_checks(GeoReference const& georef1, GeoReference const& georef2){ // We don't support datum changes! if (std::abs(georef1.datum().semi_major_axis() - georef2.datum().semi_major_axis()) > 0.1 || std::abs(georef1.datum().semi_minor_axis() - georef2.datum().semi_minor_axis()) > 0.1 || georef1.datum().meridian_offset() != georef2.datum().meridian_offset()) { vw_throw(NoImplErr() << "geodiff can't difference DEMs which have differing " << "datum radii or meridian offsets.\n"); } if (georef1.datum().semi_major_axis() == georef2.datum().semi_major_axis() && georef1.datum().semi_minor_axis() == georef2.datum().semi_minor_axis() && georef1.datum().meridian_offset() == georef2.datum().meridian_offset() && georef1.datum().proj4_str() != georef2.datum().proj4_str()) { vw_out(WarningMessage) << "Found DEMs with same datum radii and meridian offsets but " << "different projection strings. Use some caution.\n"; } } void dem2dem_diff(Options& opt) { DiskImageResourceGDAL dem1_rsrc(opt.dem1_file), dem2_rsrc(opt.dem2_file); double dem1_nodata = opt.nodata_value, dem2_nodata = opt.nodata_value; if (dem1_rsrc.has_nodata_read()) { dem1_nodata = dem1_rsrc.nodata_read(); opt.nodata_value = dem1_nodata; vw_out() << "\tFound input nodata value for DEM 1: " << dem1_nodata << "\n"; vw_out() << "Using this nodata value on output.\n"; } if (dem2_rsrc.has_nodata_read()) { dem2_nodata = dem2_rsrc.nodata_read(); vw_out() << "\tFound input nodata value for DEM 2: " << dem2_nodata << "\n"; } if (dem1_rsrc.channels() != 1 || dem2_rsrc.channels() != 1) vw_throw(ArgumentErr() << "The input DEMs must have a single channel.\n"); DiskImageView<double> dem1_disk_image_view(dem1_rsrc), dem2_disk_image_view(dem2_rsrc); GeoReference dem1_georef, dem2_georef; bool has_georef1 = read_georeference(dem1_georef, dem1_rsrc); bool has_georef2 = read_georeference(dem2_georef, dem2_rsrc); if (!has_georef1 || !has_georef2) vw_throw(ArgumentErr() << "geodiff cannot difference files without a georeference.\n"); georef_sanity_checks(dem1_georef, dem2_georef); // Generate a bounding box that is the minimum of the two BBox areas. For // that, first transform the second DEM's bounding box to first DEM's // coordinates. BBox2i dem1_crop_box = bounding_box(dem1_disk_image_view); GeoTransform gt(dem2_georef, dem1_georef); BBox2i box21 = gt.forward_bbox(bounding_box(dem2_disk_image_view)); dem1_crop_box.crop(box21); if (dem1_crop_box.empty()) vw_throw(ArgumentErr() << "The two DEMs do not have a common area.\n"); // Crop the first DEM to the shared box, then transform and crop the second DEM // to same box. Use bilinear interpolation for the transform. ImageViewRef<PixelMask<double>> dem1_crop = crop(create_mask(dem1_disk_image_view, dem1_nodata), dem1_crop_box); ImageViewRef<PixelMask<double>> dem2_trans = asp::warpCrop(dem2_disk_image_view, dem2_nodata, dem2_georef, dem1_georef, dem1_crop_box, "bilinear"); ImageViewRef<double> difference; if (opt.use_absolute) difference = apply_mask(abs(dem1_crop - dem2_trans), opt.nodata_value); else difference = apply_mask(dem1_crop - dem2_trans, opt.nodata_value); GeoReference crop_georef = crop(dem1_georef, dem1_crop_box); std::string output_file = opt.output_prefix + "-diff.tif"; vw_out() << "Writing difference file: " << output_file << "\n"; bool has_georef = true; bool has_nodata = true; auto tpc = TerminalProgressCallback("asp", "\t--> Differencing: "); if (opt.use_float) { ImageViewRef<float> difference_float = channel_cast<float>(difference); vw::cartography::block_write_gdal_image(output_file, difference_float, has_georef, crop_georef, has_nodata, opt.nodata_value, opt, tpc); } else { vw::cartography::block_write_gdal_image(output_file, difference, has_georef, crop_georef, has_nodata, opt.nodata_value, opt, tpc); } } // From a DEM, subtract a csv file. Reverse the sign is 'reverse' is true. void dem2csv_diff(Options & opt, std::string const& dem_file, std::string const & csv_file, bool reverse){ if (opt.csv_format_str == "") vw_throw(ArgumentErr() << "CSV files were passed in, but the " << "option --csv-format was not set.\n"); // Read the DEM DiskImageView<double> dem(dem_file); // Read the no-data double dem_nodata = opt.nodata_value; { // Use a scope to free up fast this handle DiskImageResourceGDAL dem_rsrc(dem_file); if (dem_rsrc.has_nodata_read()) { dem_nodata = dem_rsrc.nodata_read(); opt.nodata_value = dem_nodata; vw_out() << "\tFound input nodata value for DEM: " << dem_nodata << "\n"; } if (dem_rsrc.channels() != 1) vw_throw(ArgumentErr() << "The input DEM must have a single channel.\n"); } // Read the DEM georef GeoReference dem_georef; bool has_georef = read_georeference(dem_georef, dem_file); if (!has_georef) vw_throw(ArgumentErr() << "geodiff cannot load a georeference from: " << dem_file << ".\n"); if (opt.csv_srs == "") opt.csv_srs = dem_georef.get_wkt(); // Copy from the DEM // Configure a CSV converter object according to the input parameters asp::CsvConv csv_conv; csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs); // Modifies csv_conv if (!csv_conv.is_configured()) vw_throw(ArgumentErr() << "Could not configure the csv parser.\n"); // Set the georef for CSV files GeoReference csv_georef = dem_georef; csv_conv.parse_georef(csv_georef); std::list<asp::CsvConv::CsvRecord> csv_records; typedef std::list<asp::CsvConv::CsvRecord>::const_iterator RecordIter; csv_conv.read_csv_file(csv_file, csv_records); std::vector<Vector3> csv_llh; for (RecordIter iter = csv_records.begin(); iter != csv_records.end(); iter++) { Vector3 xyz = csv_conv.csv_to_cartesian(*iter, csv_georef); if (xyz == Vector3() || xyz != xyz) continue; // invalid point Vector3 llh = dem_georef.datum().cartesian_to_geodetic(xyz); // use the dem's datum csv_llh.push_back(llh); } // We will interpolate into the DEM to find the difference ImageViewRef<PixelMask<double>> interp_dem = interpolate(create_mask(dem, dem_nodata), BilinearInterpolation(), ConstantEdgeExtension()); // Save the diffs int count = 0; double diff_min = std::numeric_limits<double>::max(); double diff_max = -diff_min; double diff_mean = 0.0; double diff_std = 0.0; vw::TerminalProgressCallback tpc("Diff:", "\t--> "); tpc.report_progress(0); double hundred = 100.0; double inc_amount = hundred / std::max(csv_llh.size(), size_t(1)); std::vector<Vector3> csv_diff; std::vector<double> csv_errs; int prev_progress = 0; for (size_t it = 0; it < csv_llh.size(); it++) { Vector3 llh = csv_llh[it]; Vector2 ll = subvector(llh, 0, 2); Vector2 pix = dem_georef.lonlat_to_pixel(ll); // Check for out of range if (pix[0] < 0 || pix[0] > dem.cols() - 1) continue; if (pix[1] < 0 || pix[1] > dem.rows() - 1) continue; PixelMask<double> dem_ht = interp_dem(pix[0], pix[1]); if (!is_valid(dem_ht)) continue; double diff = dem_ht.child() - llh[2]; if (reverse) diff *= -1; if (opt.use_absolute) diff = std::abs(diff); if (diff > diff_max) diff_max = diff; if (diff < diff_min) diff_min = diff; diff_mean += diff; diff_std += diff*diff; count += 1; csv_diff.push_back(Vector3(ll[0], ll[1], diff)); csv_errs.push_back(diff); int percent_progress = (int)round(it * inc_amount); if (percent_progress != prev_progress) { tpc.report_incremental_progress(1.0 / hundred); prev_progress = percent_progress; } } tpc.report_finished(); if (count > 0) { diff_mean /= count; diff_std = diff_std/count - diff_mean*diff_mean; if (diff_std < 0) diff_std = 0; // just in case, for numerical noise diff_std = std::sqrt(diff_std); } double diff_median = 0.0; std::sort(csv_errs.begin(), csv_errs.end()); if (csv_errs.size() > 0) diff_median = csv_errs[csv_errs.size()/2]; vw_out() << "Max difference: " << diff_max << " meters" << "\n"; vw_out() << "Min difference: " << diff_min << " meters" << "\n"; vw_out() << "Mean difference: " << diff_mean << " meters" << "\n"; vw_out() << "StdDev of difference: " << diff_std << " meters" << "\n"; vw_out() << "Median difference: " << diff_median << " meters" << "\n"; std::string output_file = opt.output_prefix + "-diff.csv"; vw_out() << "Writing difference file: " << output_file << "\n"; std::ofstream outfile( output_file.c_str() ); outfile.precision(16); outfile << "# longitude,latitude, height diff (m)" << "\n"; outfile << "# " << dem_georef.datum() << "\n"; // dem's datum outfile << "# Max difference: " << diff_max << " meters" << "\n"; outfile << "# Min difference: " << diff_min << " meters" << "\n"; outfile << "# Mean difference: " << diff_mean << " meters" << "\n"; outfile << "# StdDev of difference: " << diff_std << " meters" << "\n"; outfile << "# Median difference: " << diff_median << " meters" << "\n"; for (size_t it = 0; it < csv_diff.size(); it++) { Vector3 diff = csv_diff[it]; outfile << diff[0] << "," << diff[1] << "," << diff[2] << "\n"; } } // Subtract from the first dem the second. One of them can be a CSV file. int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); bool is_dem1_csv = asp::is_csv(opt.dem1_file); bool is_dem2_csv = asp::is_csv(opt.dem2_file); if (is_dem1_csv && is_dem2_csv) vw_throw(ArgumentErr() << "Cannot do the diff of two csv files. One of them " << "can be converted to a DEM using point2dem fist.\n"); bool reverse = false; // true if first DEM is a csv if (is_dem1_csv) { reverse = true; dem2csv_diff(opt, opt.dem2_file, opt.dem1_file, reverse); }else if (is_dem2_csv){ reverse = false; dem2csv_diff(opt, opt.dem1_file, opt.dem2_file, reverse); }else{ // Both are regular DEMs dem2dem_diff(opt); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/hiedr2mosaic.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2020, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ from __future__ import print_function import os, glob, optparse, re, shutil, subprocess, sys, string try: from urllib2 import urlopen except ImportError: from urllib.request import urlopen libexecpath = os.path.abspath(sys.path[0] + '/../libexec') sys.path.insert(0, libexecpath) # prepend to Python path from asp_system_utils import get_asp_version import asp_system_utils asp_system_utils.verify_python_version_is_supported() job_pool = [] def man(option, opt, value, parser): print(parser.usage, file=sys.stderr) print('''\ This program operates on HiRISE EDR (.IMG) channel files, and performs the following ISIS 3 operations: * Converts to ISIS format (hi2isis) * Performs radiometric calibration (hical) * Stitches the channel files together into single CCD files (histitch) * Attaches SPICE information (spiceinit and spicefit) * Removes camera distortions from the CCD images (noproj) * Perfroms jitter analysis (hijitreg) * Mosaics individual CCDs into one unified image file (handmos) * Normalizes the mosaic (cubenorm) ''', file=sys.stderr) sys.exit() class Usage(Exception): def __init__(self, msg): self.msg = msg class CCDs(dict): '''''' def __init__(self, cubes, match=5): self.prefix = os.path.commonprefix( cubes ) dict.__init__(self) for cub in cubes: number = int( cub[len(self.prefix)] ) self[number] = cub self.match = int(match) def min(self): return min( self.keys() ) def max(self): return max( self.keys() ) def matchcube(self): return self[self.match] def add_job( cmd, num_working_threads=4 ): if len(job_pool) >= num_working_threads: job_pool[0].wait() job_pool.pop(0) print(cmd) job_pool.append( subprocess.Popen(cmd, shell=True) ) def wait_on_all_jobs(): print("Waiting for jobs to finish") while len(job_pool) > 0: job_pool[0].wait() job_pool.pop(0) def read_flatfile( flat ): f = open(flat,'r') averages = [0.0,0.0] try: for line in f: if line.rfind("Average Sample Offset:") > 0: index = line.rfind("Offset:") index_e = line.rfind("StdDev:") crop = line[index+7:index_e] averages[0] = float(crop) elif line.rfind("Average Line Offset:") > 0: index = line.rfind("Offset:") index_e = line.rfind("StdDev:") crop = line[index+7:index_e] averages[1] = float(crop) except ValueError: print("Could not extract valid offsets from the flat file (" + flat + "). " "This could be because no matches were found. " "You may need to run hijitreg manually with a " "custom REGDEF parameter. In order for this program " "to complete, we are returning zeros as the offset " "but this may result in misaligned CCDs.") return averages def check_output_files(file_list): '''Verify the output files were created.''' for f in file_list: if not os.path.exists(f): raise Exception('Failed to generate file: ' + f) def hi2isis( img_files, threads ): hi2isis_cubs = [] for img in img_files: # Expect to end in .IMG, change to end in .cub to_cub = os.path.splitext( os.path.basename(img) )[0] + '.cub' if os.path.exists(to_cub): print(to_cub + ' exists, skipping hi2isis.') else: cmd = 'hi2isis from= '+ img +' to= '+ to_cub add_job(cmd, threads) hi2isis_cubs.append( to_cub ) wait_on_all_jobs() check_output_files(hi2isis_cubs) return hi2isis_cubs def hical( cub_files, threads, delete=False ): hical_cubs = [] for cub in cub_files: # Expect to end in .cub, change to end in .hical.cub to_cub = os.path.splitext(cub)[0] + '.hical.cub' if os.path.exists(to_cub): print(to_cub + ' exists, skipping hical.') else: cmd = 'hical from= '+ cub +' to= '+ to_cub add_job(cmd, threads) hical_cubs.append( to_cub ) wait_on_all_jobs() check_output_files(hical_cubs) if delete: for cub in cub_files: os.remove( cub ) hical_log_files = glob.glob( os.path.commonprefix(cub_files) + '*.hical.log' ) for file in hical_log_files: os.remove( file ) return hical_cubs def histitch( cub_files, threads, delete=False ): histitch_cubs = [] to_del_cubs = [] # Strictly, we should probably look in the image headers, but instead we'll # assume that people have kept a sane naming convention for their files, such # that the name consists of prefix + 'N_C' + suffix # where prefix we extract below and the 'N_C' string is where N is the CCD number # and C is the channel number. prefix = os.path.commonprefix( cub_files ) channel_files = [[None]*2 for i in range(10)] pattern = re.compile(r"(\d)_(\d)") for cub in cub_files: match = re.match( pattern, cub[len(prefix):] ) if match: ccd = match.group(1) channel = match.group(2) # print ('ccd: ' + ccd + ' channel: '+ channel) channel_files[int(ccd)][int(channel)] = cub else: raise Exception( 'Could not find a CCD and channel identifier in ' + cub ) for i in range(10): to_cub = prefix + str(i) + '.histitch.cub' if channel_files[i][0] and channel_files[i][1]: if os.path.exists(to_cub): print(to_cub + ' exists, skipping histitch.') else: cmd = 'histitch balance= TRUE from1= '+ channel_files[i][0] \ +' from2= '+ channel_files[i][1] +' to= '+ to_cub add_job(cmd, threads) to_del_cubs.append( channel_files[i][0] ) to_del_cubs.append( channel_files[i][1] ) histitch_cubs.append( to_cub ) elif channel_files[i][0] or channel_files[i][1]: if channel_files[i][0]: found = channel_files[i][0] else: found = channel_files[i][1] print('Found '+ found +' but not the matching channel file.') cmd = 'histitch from1= '+ found +' to= '+ to_cub add_job(cmd, threads) to_del_cubs.append( found ) histitch_cubs.append( to_cub ) wait_on_all_jobs() check_output_files(histitch_cubs) if delete: for cub in to_del_cubs: os.remove( cub ) return histitch_cubs def spice( cub_files, threads, web): for cub in cub_files: cmd = f'spiceinit WEB={web} from={cub}' add_job(cmd, threads) wait_on_all_jobs() for cub in cub_files: cmd = 'spicefit from= '+ cub add_job(cmd, threads) wait_on_all_jobs() return def noproj( CCD_object, threads, delete=False ): noproj_CCDs = [] for i in CCD_object.keys(): to_cub = CCD_object.prefix + str(i) + '.noproj.cub' if os.path.exists( to_cub ): print(to_cub + ' exists, skipping noproj.') else: cmd = 'mkdir -p tmp_' + CCD_object[i] + '&& ' \ + 'cd tmp_' + CCD_object[i] + '&& ' \ + 'noproj from=../' + CCD_object[i] \ + ' match=../' + CCD_object.matchcube() \ + ' source= frommatch to=../'+ to_cub + '&& ' \ + 'cd .. && rm -rf tmp_' + CCD_object[i] # cmd = 'noproj from= '+ CCD_object[i] \ # +' match= '+ CCD_object.matchcube() \ # +' source= frommatch to= '+ to_cub add_job(cmd, threads) # print (cmd) # os.system(cmd) noproj_CCDs.append( to_cub ) wait_on_all_jobs() if delete: for cub in CCD_object.values(): os.remove( cub ) return CCDs( noproj_CCDs, CCD_object.match ) # Check for failure for hijitreg. Sometimes bombs? Default to zeros. def hijitreg( noproj_CCDs, threads, delete=False ): for i in noproj_CCDs.keys(): j = i + 1 if( j not in noproj_CCDs ): continue cmd = 'hijitreg from= '+ noproj_CCDs[i] \ +' match= '+ noproj_CCDs[j] \ + ' flatfile= flat_'+str(i)+'_'+str(j)+'.txt' add_job(cmd, threads) wait_on_all_jobs() averages = dict() for i in noproj_CCDs.keys(): j = i + 1 if( j not in noproj_CCDs ): continue flat_file = 'flat_'+str(i)+'_'+str(j)+'.txt' averages[i] = read_flatfile( flat_file ) if delete: os.remove( flat_file ) return averages def mosaic( noprojed_CCDs, averages ): mosaic = noprojed_CCDs.prefix+'.mos_hijitreged.cub' shutil.copy( noprojed_CCDs.matchcube(), mosaic ) sample_sum = 1 line_sum = 1 for i in range( noprojed_CCDs.match-1, noprojed_CCDs.min()-1, -1): if i not in noprojed_CCDs: continue sample_sum += averages[i][0] line_sum += averages[i][1] handmos( noprojed_CCDs[i], mosaic, str( int(round( sample_sum )) ), str( int(round( line_sum )) ) ) sample_sum = 1 line_sum = 1 for i in range( noprojed_CCDs.match+1, noprojed_CCDs.max()+1, 1): if i not in noprojed_CCDs: continue sample_sum -= averages[i-1][0] line_sum -= averages[i-1][1] handmos( noprojed_CCDs[i], mosaic, str( int(round( sample_sum )) ), str( int(round( line_sum )) ) ) return mosaic def handmos( fromcub, tocub, outsamp, outline ): cmd = 'handmos from= '+ fromcub +' mosaic= '+ tocub \ +' outsample= '+ outsamp \ +' outline= '+ outline \ +' priority= beneath' os.system(cmd) return def cubenorm( fromcub, delete=False ): tocub = os.path.splitext(fromcub)[0] + '.norm.cub' cmd = 'cubenorm from= '+ fromcub+' to= '+ tocub print(cmd) os.system(cmd) if delete: os.remove( fromcub ) return tocub def fetch_files( url, output_folder, image_type='RED' ): '''Fetch all the files for a HiRISE image and return the list of files.''' os.system('mkdir -p ' + output_folder) # The URL should look like this: # https://hirise-pds.lpl.arizona.edu/PDS/EDR/ESP/ORB_052800_052899/ESP_052893_1835/ try: # python2 from BeautifulSoup import BeautifulSoup parsedDataPage = BeautifulSoup(urlopen(url).read()) except: # python3 try: from bs4 import BeautifulSoup parsedDataPage = BeautifulSoup(urlopen(url).read(), "html.parser") except Exception as e: raise Exception("Error: " + str(e) + "\n" + "If this is a missing module error, please install " + \ "BeautifulSoup for python 2 or bs4 for python 3.\n" + "Or do not use the --download-folder option.") # Loop through all the links on the page image_list = [] for link in parsedDataPage.findAll('a'): filename = link.string if image_type not in filename: continue # Skip types that don't match full_url = os.path.join(url, filename) local_path = os.path.join(output_folder, filename) image_list.append(local_path) # Download the file if it is not already there if not os.path.exists(local_path): cmd = 'wget ' + full_url + ' -O ' + local_path print (cmd) os.system(cmd) return image_list def get_ccd(path): '''Returns the CCD number of a filename.''' filename = os.path.basename(path) # Out of 'ESP_023957_1755/ESP_023957_1755_RED5_1.IMG', pull '_RED5_1', # and extract the number 5. match = re.match(r"^.*?RED(\d)", filename ) if not match: raise Exception('Could not extract the CCD number from: ' + filename) ccd = int(match.group(1)) return ccd #---------------------------- def main(): try: try: usage = "usage: hiedr2mosaic.py [--help][--manual][--threads N][--keep][-m match][-w bool] HiRISE-EDR.IMG-files\n " + get_asp_version() parser = optparse.OptionParser(usage=usage) parser.set_defaults(delete=True) parser.set_defaults(match=5) parser.set_defaults(threads=4) parser.set_defaults(web=False) parser.add_option("--manual", action="callback", callback=man, help="Read the manual.") parser.add_option("--stop-at-no-proj", dest="stop_no_proj", action="store_true", help="Process the IMG files only to have SPICE attached. This allows jigsaw to happen") parser.add_option("--resume-at-no-proj", dest="resume_no_proj", action="store_true", help="Pick back up after spiceinit has happened or jigsaw. This was noproj uses your new camera information") parser.add_option("-t", "--threads", dest="threads", help="Number of threads to use.",type="int") parser.add_option("-m", "--match", dest="match",type="int", help="CCD number of match CCD, passed as the match argument to noproj (default 5).") parser.add_option("-w", "--web", action="store_true", dest="web", help="Invokes spiceinit with web=true, to fetch the kernels from the web.") parser.add_option("-k", "--keep", action="store_false", dest="delete", help="Will not delete intermediate files.") parser.add_option("--download-folder", dest="download_folder", default=None, help="Download files to this folder. Hence the second argument to this is the URL of the page to download the files from.") (options, args) = parser.parse_args() if not args: parser.error("need .IMG files or a URL") if options.download_folder: print ('Downloading HiRISE images from URL...') # For now we only fetch RED images. args = fetch_files(args[0], options.download_folder, image_type='RED') print ('Finished downloading ' + str(len(args)) + ' images.') # Verify that we have both of the specified match CCD's. # This is applicable only when we start with initial IMG files. if not options.resume_no_proj: matchCount = 0 for a in args: if get_ccd(a) == options.match: matchCount += 1 if matchCount != 2: print ('Error: Found ' + str(matchCount) + ' files for match CCD ' + str(options.match) + ' instead of 2.') return -1 numCcds = len(args) / 2 except optparse.OptionError as msg: raise Usage(msg) if not options.resume_no_proj: # hi2isis hi2isised = hi2isis( args, options.threads ) # hical hicaled = hical( hi2isised, options.threads, options.delete ) # histitch histitched = histitch( hicaled, options.threads, options.delete ) # attach spice spice( histitched, options.threads, options.web) if options.stop_no_proj: print("Finished") return 0 if options.resume_no_proj: histitched = args CCD_files = CCDs( histitched, options.match ) # noproj noprojed_CCDs = noproj( CCD_files, options.threads, options.delete ) # hijitreg averages = hijitreg( noprojed_CCDs, options.threads, options.delete ) # mosaic handmos mosaicked = mosaic( noprojed_CCDs, averages ) # Clean up noproj files if options.delete: for cub in noprojed_CCDs.values(): os.remove( cub ) # Run a final cubenorm across the image: cubenorm( mosaicked, options.delete ) print("Finished") return 0 except Usage as err: print (err.msg, file = sys.stderr) return 2 # To more easily debug this program, comment out this catch block. # except Exception as err: # sys.stderr.write( str(err) + '\n' ) # return 1 if __name__ == "__main__": sys.exit(main()) ================================================ FILE: src/asp/Tools/historical_helper.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' Python tool for working with historical data products. ''' from __future__ import print_function import sys import os, shutil, string, errno, argparse, subprocess #import simplekml, json import numpy as np # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP libpath = os.path.abspath(basepath + '/../lib') # path to the lib directory sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_alg_utils import * import asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] # Prepend to system LD_LIBRARY_PATH if "LD_LIBRARY_PATH" not in os.environ: os.environ["LD_LIBRARY_PATH"] = "" os.environ["LD_LIBRARY_PATH"] = libpath + os.pathsep + os.environ["LD_LIBRARY_PATH"] #------------------------------------------------------------------------------ class BBox: '''Simple bounding box class''' def __init__(self): self.minX = 999999999 self.maxX = 0 self.minY = 999999999 self.maxY = 0 def __str__(self): return ('Min: (%lf, %lf), Max: (%lf, %lf)' % (self.minX, self.minY, self.maxX, self.maxY)) def expandToContain(self, pt): if pt[0] < self.minX: self.minX = pt[0] if pt[0] > self.maxX: self.maxX = pt[0] if pt[1] < self.minY: self.minY = pt[1] if pt[1] > self.maxY: self.maxY = pt[1] def width(self): return self.maxX - self.minX def height(self): return self.maxY - self.minY def parseInterestPoints(ipString): '''Return the list of IP as a numpy array''' parts = ipString.split() if len(parts) % 2 == 1: raise Exception('The number of IP numbers must be even!') numIp = int(len(parts) / 2) ip = np.ndarray(shape=(numIp,2), dtype=float) for i in range(numIp): ip[i,0] = float(parts[2*i ]) ip[i,1] = float(parts[2*i+1]) return ip def computeAngle(topLeft, topRight): '''Compute the angle from the top left to the top right of an image. Positive rotation = clockwise.''' horizVec = (1,0) measuredVec = topRight - topLeft denom = np.linalg.norm(horizVec)*np.linalg.norm(measuredVec) angle = np.arccos(np.dot(measuredVec,horizVec) / denom) degrees = np.rad2deg(angle) return degrees def rotateAndCrop(options): '''Apply a rotation and crop to the image so that the output image is horizontal and cropped.''' ip = parseInterestPoints(options.interestPoints) numIp = ip.shape[0] if numIp != 4: raise Exception('rotate-crop requires the following IP: top-left, top-right, bot-right, bot-left') degrees = computeAngle(ip[0,:], ip[1,:]) radians = np.deg2rad(degrees) box = BBox() rotMatrix = np.array([[np.cos(radians), -np.sin(radians)], [np.sin(radians), np.cos(radians)]], np.float32) for i in range(numIp): rotLoc = np.matmul(rotMatrix, ip[i,:]) box.expandToContain(rotLoc) offsetX = box.minX offsetY = box.minY cropX = box.width() cropY = box.height() # All option to rotate without cropping cropCmd = '' if options.operation == 'rotate-crop': cropCmd = ("-crop '%dx%d+%d+%d'" % (cropX, cropY, offsetX, offsetY)) cmd = ("%s %s -define tiff:tile-geometry=256x256 -distort ScaleRotateTranslate '0,0 %lf' %s %s" % (options.convertPath, options.inputPath, degrees, cropCmd, options.outputPath)) print(cmd) os.system(cmd) def refineConvertPath(convertPath): """Returns the full path to a validated ImageMagic 'convert' executable. In particular, fail if the the embree tool with the same name is found.""" if convertPath == "": convertPath = "convert" # Look for the tool using the 'which' command cmd = ['which', convertPath] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) out, err = p.communicate() # Check if that command failed to find the file failString = 'no ' + convertPath + ' in (' if out.find(failString) >= 0 or p.returncode != 0: raise Exception('Failed to find "convert".') # So far so good, have a tool. Now check if it is the right one convertPath = out.rstrip() cmd = [convertPath, '--help'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) out, err = p.communicate() if 'ImageMagick' not in out: raise Exception('The tool "' + convertPath + '" does not appear to be ImageMagick convert.') return convertPath def main(argsIn): try: # Use parser that ignores unknown options usage = "usage: historical_helper [options] <rotate or rotate-crop>" parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--input-path", dest="inputPath", default=None, required=True, help="Path of the input file to process") parser.add_argument("--output-path", dest="outputPath", default=None, required=True, help="The output file to write.") parser.add_argument("--interest-points", dest="interestPoints", default=None, help="List of column and row pairs contained in quotes.") parser.add_argument('operation') parser.add_argument("--convert-path", dest="convertPath", default="", required=False, 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.") # This call handles all the parallel_mapproject specific options. options = parser.parse_args(argsIn) except argparse.ArgumentError as msg: raise Usage(msg) try: options.convertPath = refineConvertPath(options.convertPath) except Exception as e: 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.') # Uncomment below for further debug info. It can be too verbose for the user though. #print(e) return -1 # Make a directory having the output file outDir = os.path.dirname(options.outputPath) if outDir != "" and (not os.path.exists(outDir)): os.makedirs(outDir) if options.operation == 'rotate-crop' or options.operation == 'rotate': rotateAndCrop(options) print('Script finished.') if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/Tools/image_align.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file image_align.cc /// /// Tool for aligning a second image to a first image. #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/Macros.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/FileUtils.h> #include <asp/Sessions/StereoSession.h> #include <vw/Image/Interpolation.h> #include <vw/Image/Filter.h> #include <vw/Image/Transform.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Image/Manipulation.h> #include <vw/Image/PixelTypeInfo.h> #include <vw/FileIO/MatrixIO.h> #include <vw/Math/Geometry.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Math/RANSAC.h> #include <vw/FileIO/FileUtils.h> using namespace vw; namespace po = boost::program_options; struct Options: vw::GdalWriteOptions { std::vector<std::string> input_images; std::string alignment_transform, output_image, output_prefix, output_data_string, input_transform, disparity_params, ecef_transform_type, dem1, dem2; int output_data_type, min_matches; Options(): output_data_type(0){} }; /// Get a list of matched IP based on an input disparity void find_matches_from_disp(std::vector<ip::InterestPoint> &matched_ip1, std::vector<ip::InterestPoint> &matched_ip2, Options const& opt) { // Clear the outputs matched_ip1.clear(); matched_ip2.clear(); std::string disp_file; int num_samples; std::istringstream iss(opt.disparity_params); if (!(iss >> disp_file >> num_samples)) vw_throw(ArgumentErr() << "Could not parse correctly the option --disparity-params.\n"); DiskImageView<PixelMask<Vector2f>> disp(disp_file); if (num_samples <= 0) vw_throw(ArgumentErr() << "Expecting a positive number of samples in --disparity-params.\n"); if (disp.cols() == 0 || disp.rows() == 0) vw_throw(ArgumentErr() << "Empty disparity specified in --disparity-params.\n"); // Careful here to not overflow an int32 double num_pixels = double(disp.cols()) * double(disp.rows()); int sample_rate = std::max(round(sqrt(num_pixels / double(num_samples))), 1.0); vw_out() << "Creating interest point matches from disparity: " << disp_file << ".\n"; vw_out() << "Using a row and column sampling rate of: " << sample_rate << ".\n"; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = sample_rate / double(disp.cols()); tpc.report_progress(0); for (int col = 0; col < disp.cols(); col += sample_rate) { for (int row = 0; row < disp.rows(); row += sample_rate) { vw::PixelMask<vw::Vector2f> d = disp(col, row); if (!is_valid(d)) continue; Vector2 left_pix(col, row); Vector2 right_pix = left_pix + d.child(); vw::ip::InterestPoint lip(left_pix.x(), left_pix.y()); vw::ip::InterestPoint rip(right_pix.x(), right_pix.y()); matched_ip1.push_back(lip); matched_ip2.push_back(rip); } tpc.report_incremental_progress(inc_amount); } tpc.report_finished(); return; } template<class FunctorT> Matrix<double> do_ransac(std::vector<Vector3> const& ransac_ip1, std::vector<Vector3> const& ransac_ip2, Options const& opt, int min_num_output_inliers, bool reduce_num_inliers_if_no_fit, // Output std::vector<size_t> & indices) { // Must reset the random seed for RANSAC to give same results with and without // cached ip matches. std::srand(0); indices.clear(); Matrix<double> tf; try { vw::math::RandomSampleConsensus<FunctorT, vw::math::InterestPointErrorMetric> ransac(FunctorT(), vw::math::InterestPointErrorMetric(), asp::stereo_settings().ip_num_ransac_iterations, asp::stereo_settings().epipolar_threshold, min_num_output_inliers, reduce_num_inliers_if_no_fit); tf = ransac(ransac_ip2, ransac_ip1); indices = ransac.inlier_indices(tf, ransac_ip2, ransac_ip1); return tf; } catch (std::exception const& e) { vw_throw(ArgumentErr() << e.what() << "\n" << "Alignment transform computation failed.\n"); } } // Compute the ECEF transform (around planet center) given the // interest point matches void calc_ecef_transform(std::vector<ip::InterestPoint> const& inlier_ip1, std::vector<ip::InterestPoint> const& inlier_ip2, Options const& opt, Matrix<double> & ecef_transform) { // output // Go from pixels to 3D points int num_matches = inlier_ip1.size(); vw::Matrix<double> points_ref(3, num_matches), points_src(3, num_matches); // The value of the invalid pixel used in interpolation PixelMask<float> invalid_pix; invalid_pix.invalidate(); vw::ValueEdgeExtension<PixelMask<float>> invalid_ext(invalid_pix); vw::cartography::GeoReference img1_geo, img2_geo, dem1_geo, dem2_geo; // Read first image and DEM, and set up interpolation. Out-of-range // values are set to invalid. bool has_img1_geo = vw::cartography::read_georeference(img1_geo, opt.input_images[0]); if (!has_img1_geo) vw::vw_throw(vw::ArgumentErr() << "The first image does not have a georeference.\n"); bool has_dem1_geo = vw::cartography::read_georeference(dem1_geo, opt.dem1); if (!has_dem1_geo) vw::vw_throw(vw::ArgumentErr() << "The first DEM does not have a georeference.\n"); double dem1_nodata = -std::numeric_limits<double>::max(); vw::read_nodata_val(opt.dem1, dem1_nodata); DiskImageView<float> dem1(opt.dem1); auto interp_dem1 = interpolate(create_mask(dem1, dem1_nodata), BilinearInterpolation(), invalid_ext); // Repeat for 2nd DEM and image bool has_img2_geo = vw::cartography::read_georeference(img2_geo, opt.input_images[1]); if (!has_img2_geo) vw::vw_throw(vw::ArgumentErr() << "The second image does not have a georeference.\n"); bool has_dem2_geo = vw::cartography::read_georeference(dem2_geo, opt.dem2); if (!has_dem2_geo) vw::vw_throw(vw::ArgumentErr() << "The second DEM does not have a georeference.\n"); double dem2_nodata = -std::numeric_limits<double>::max(); vw::read_nodata_val(opt.dem2, dem2_nodata); DiskImageView<float> dem2(opt.dem2); auto interp_dem2 = interpolate(create_mask(dem2, dem2_nodata), BilinearInterpolation(), invalid_ext); // Find the 3D coordinates for (size_t ip_it = 0; ip_it < inlier_ip1.size(); ip_it++) { // ECEF point for first image ip vw::Vector2 pix1(inlier_ip1[ip_it].x, inlier_ip1[ip_it].y); vw::Vector2 img1_lonlat = img1_geo.pixel_to_lonlat(pix1); vw::Vector2 dem1_pix = dem1_geo.lonlat_to_pixel(img1_lonlat); PixelMask<float> dem1_val = interp_dem1(dem1_pix.x(), dem1_pix.y()); if (!is_valid(dem1_val)) continue; vw::Vector3 xyz1 = dem1_geo.datum().geodetic_to_cartesian (vw::Vector3(img1_lonlat.x(), img1_lonlat.y(), dem1_val.child())); // ECEF point for second image ip vw::Vector2 pix2(inlier_ip2[ip_it].x, inlier_ip2[ip_it].y); vw::Vector2 img2_lonlat = img2_geo.pixel_to_lonlat(pix2); vw::Vector2 dem2_pix = dem2_geo.lonlat_to_pixel(img2_lonlat); PixelMask<float> dem2_val = interp_dem2(dem2_pix.x(), dem2_pix.y()); if (!is_valid(dem2_val)) continue; vw::Vector3 xyz2 = dem2_geo.datum().geodetic_to_cartesian (vw::Vector3(img2_lonlat.x(), img2_lonlat.y(), dem2_val.child())); // Store in matrices typedef vw::math::MatrixCol<vw::Matrix<double>> ColView; ColView col_ref(points_ref, ip_it); ColView col_src(points_src, ip_it); col_ref = xyz1; col_src = xyz2; } // Find the 3D transform from second to first set of ECEF points vw::Matrix3x3 rotation; vw::Vector3 translation; double scale; bool filter_outliers = true; Vector2 ransac_params; ransac_params[0] = asp::stereo_settings().ip_num_ransac_iterations; ransac_params[1] = 1.0; // factor; not the same as opt.inlier_threshold vw::math::find_3D_transform(points_src, points_ref, rotation, translation, scale, opt.ecef_transform_type, filter_outliers, ransac_params); // Convert to pc_align transform format ecef_transform = identity_matrix(4); submatrix(ecef_transform, 0, 0, 3, 3) = rotation * scale; for (int row = 0; row < 3; row++) ecef_transform(row, 3) = translation[row]; } /// Compute a matrix transform between images, searching for IP in /// the specified regions. Matrix<double> calc_alignment_transform(std::string const& image_file1, std::string const& image_file2, std::vector<ip::InterestPoint> &matched_ip1, std::vector<ip::InterestPoint> &matched_ip2, Options const& opt, Matrix<double> & ecef_transform) { // potential output // Convert to 3D points with the third coordinate being 1, obtaining // homogeneous coordinates. std::vector<Vector3> ransac_ip1 = iplist_to_vectorlist(matched_ip1); std::vector<Vector3> ransac_ip2 = iplist_to_vectorlist(matched_ip2); // RANSAC parameters. const int min_num_output_inliers = ransac_ip1.size()/2; const bool reduce_num_inliers_if_no_fit = true; Matrix<double> tf; std::vector<size_t> indices; if (opt.alignment_transform == "translation") { tf = do_ransac<vw::math::TranslationFittingFunctor> (ransac_ip1, ransac_ip2, opt, min_num_output_inliers, reduce_num_inliers_if_no_fit, indices); } else if (opt.alignment_transform == "rigid") { tf = do_ransac<vw::math::TranslationRotationFittingFunctorN<2>> (ransac_ip1, ransac_ip2, opt, min_num_output_inliers, reduce_num_inliers_if_no_fit, indices); } else if (opt.alignment_transform == "similarity") { tf = do_ransac<vw::math::SimilarityFittingFunctor> (ransac_ip1, ransac_ip2, opt, min_num_output_inliers, reduce_num_inliers_if_no_fit, indices); } else if (opt.alignment_transform == "affine") { tf = do_ransac<vw::math::AffineFittingFunctor> (ransac_ip1, ransac_ip2, opt, min_num_output_inliers, reduce_num_inliers_if_no_fit, indices); } else if (opt.alignment_transform == "homography") { tf = do_ransac<vw::math::HomographyFittingFunctor> (ransac_ip1, ransac_ip2, opt, min_num_output_inliers, reduce_num_inliers_if_no_fit, indices); } else { vw_throw(ArgumentErr() << "Unknown alignment transform: " << opt.alignment_transform << ".\n"); } // Keeping only inliers std::vector<ip::InterestPoint> inlier_ip1, inlier_ip2; for (size_t i = 0; i < indices.size(); i++) { inlier_ip1.push_back(matched_ip1[indices[i]]); inlier_ip2.push_back(matched_ip2[indices[i]]); } vw_out() << "Found " << inlier_ip1.size() << " / " << ransac_ip1.size() << " inliers using RANSAC.\n"; if (opt.output_prefix != "") { // Write a match file for debugging bool matches_as_txt = asp::stereo_settings().matches_as_txt; std::string clean_match_file = ip::clean_match_filename(ip::match_filename(opt.output_prefix, image_file1, image_file2, matches_as_txt), matches_as_txt); vw_out() << "Writing inlier matches after RANSAC to: " << clean_match_file << std::endl; ip::write_match_file(clean_match_file, inlier_ip1, inlier_ip2, matches_as_txt); } vw_out() << "Alignment transform (in pixels):\n" << tf << std::endl; if (opt.ecef_transform_type != "") calc_ecef_transform(inlier_ip1, inlier_ip2, opt, ecef_transform); return tf; } void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add(vw::GdalWriteOptionsDescription(opt)); // Pass interest point matching options directly to stereo_settings auto & ip_opt = asp::stereo_settings(); // alias const double g_nan_val = std::numeric_limits<double>::quiet_NaN(); general_options.add_options() ("output-image,o", po::value(&opt.output_image)->default_value(""), "Specify the output image.") ("alignment-transform", po::value(&opt.alignment_transform)->default_value("rigid"), "Specify the transform to use to align the second image to the first. Options: " "translation, rigid (translation + rotation), similarity (translation + rotation + " "scale), affine, homography.") ("output-prefix", po::value(&opt.output_prefix)->default_value("out_image_align/run"), "Save the interest point matches, computed transform, and other auxiliary " "data at this prefix. These are cached for future runs.") ("output-data-type,d", po::value(&opt.output_data_string)->default_value("float32"), "The data type of the output file. Options: uint8, uint16, uint32, int16, int32, " "float32, float64. The values are clamped (and also rounded for integer types) to avoid " "overflow.") ("ip-detect-method", po::value(&ip_opt.ip_detect_method)->default_value(0), "Interest point detection algorithm (0: Integral OBALoG (default), 1: OpenCV SIFT, 2: OpenCV ORB.") ("ip-per-image", po::value(&ip_opt.ip_per_image)->default_value(20000), "How many interest points to detect in each image (the resulting number of " "matches will be much less).") ("ip-per-tile", po::value(&ip_opt.ip_per_tile)->default_value(0), "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.") ("matches-per-tile", po::value(&ip_opt.matches_per_tile)->default_value(0), "How many interest point matches to compute in each image tile (of size " "normally 1024^2 pixels). Use a value of --ip-per-tile a few times larger " "than this. See also --matches-per-tile-params.") ("matches-per-tile-params", po::value(&ip_opt.matches_per_tile_params)->default_value(Vector2(1024, 1280), "1024 1280"), "To be used with --matches-per-tile. The first value is the image tile size for both " "images. A larger second value allows each right tile to further expand to this size, " "resulting in the tiles overlapping. This may be needed if the homography alignment " "between these images is not great, as this transform is used to pair up left and " "right image tiles.") ("min-matches", po::value(&opt.min_matches)->default_value(10), "Set the minimum number of inlier matches between images for successful matching.") ("individually-normalize", po::bool_switch(&ip_opt.individually_normalize)->default_value(false)->implicit_value(true), "Individually normalize the input images instead of using common values.") ("matches-as-txt", po::bool_switch(&ip_opt.matches_as_txt)->default_value(false)->implicit_value(true), "Read and write match files as plain text instead of binary. See the documentation for details.") ("num-ransac-iterations", po::value(&ip_opt.ip_num_ransac_iterations)->default_value(1000), "How many iterations to perform in RANSAC when finding interest point matches.") ("inlier-threshold", po::value(&ip_opt.epipolar_threshold)->default_value(50.0), "The inlier threshold (in pixels) to separate inliers from outliers when " "computing interest point matches. A smaller threshold will result in fewer " "inliers.") ("input-transform", po::value(&opt.input_transform)->default_value(""), "Instead of computing an alignment transform, read and apply the one from this file. Must be stored as a 3x3 matrix.") ("ecef-transform-type", po::value(&opt.ecef_transform_type)->default_value(""), "Save the ECEF transform corresponding to the image alignment transform to <output " "prefix>-ecef-transform.txt. The type can be: 'translation', 'rigid' (rotation + " "translation), or 'similarity' (rotation + translation + scale).") ("dem1", po::value(&opt.dem1)->default_value(""), "The DEM associated with the first image. To be used with --ecef-transform-type.") ("dem2", po::value(&opt.dem2)->default_value(""), "The DEM associated with the second image. To be used with --ecef-transform-type.") ("disparity-params", po::value(&opt.disparity_params)->default_value(""), "Find the alignment transform by using, instead of interest points, a disparity, such " "as produced by 'parallel_stereo --correlator-mode'. Specify as a string in quotes, " "in the format: 'disparity.tif num_samples'.") ("nodata-value", po::value(&ip_opt.nodata_value)->default_value(g_nan_val), "Pixels with values less than or equal to this number are treated as no-data. This " "overrides the no-data values from input images.") ; po::options_description positional(""); positional.add_options() ("input-images", po::value(&opt.input_images)); po::positional_options_description positional_desc; positional_desc.add("input-images", -1); std::string usage("[options] <reference image> <source image> -o " " <aligned source image>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.input_images.size() != 2) vw_throw(ArgumentErr() << "Expecting two input images.\n" << usage << general_options); if (opt.output_image.empty()) vw_throw(ArgumentErr() << "Missing output image name.\n" << usage << general_options); if (ip_opt.ip_per_image > 0 && ip_opt.ip_per_tile > 0) vw_throw(ArgumentErr() << "Can set only one of --ip-per-image and --ip-per-tile.\n"); if (opt.alignment_transform != "translation" && opt.alignment_transform != "rigid" && opt.alignment_transform != "similarity" && opt.alignment_transform != "affine" && opt.alignment_transform != "homography") { vw_throw(ArgumentErr() << "The alignment transform must be one of: translation, " "rigid, similarity, affine, homography.\n" << usage << general_options); } if (opt.ecef_transform_type != "") { if (opt.ecef_transform_type != "translation" && opt.ecef_transform_type != "rigid" && opt.ecef_transform_type != "similarity") vw_throw(ArgumentErr() << "The value of --ecef-transform-type must be one of: " << "translation, rigid, or similarity.\n"); if (opt.dem1 == "" || opt.dem2 == "") vw::vw_throw(vw::ArgumentErr() << "When using the option --ecef-transform-type, " << "the options --dem1 and --dem2 must be set.\n"); if (opt.output_prefix == "") vw::vw_throw(vw::ArgumentErr() << "When using the option --ecef-transform-type, " << "the option --output-prefix must be set.\n"); } // Determining the format of the second input image boost::shared_ptr<vw::DiskImageResource> rsrc(vw::DiskImageResourcePtr(opt.input_images[1])); ChannelTypeEnum input_data_type = rsrc->channel_type(); // By default, use the same type on output as on input opt.output_data_type = input_data_type; if (opt.output_data_string == "uint8" ) opt.output_data_type = VW_CHANNEL_UINT8; else if (opt.output_data_string == "uint16" ) opt.output_data_type = VW_CHANNEL_UINT16; else if (opt.output_data_string == "uint32" ) opt.output_data_type = VW_CHANNEL_UINT32; // GDAL does not support int8 //else if (opt.output_data_string == "int8" ) opt.output_data_type = VW_CHANNEL_INT8; else if (opt.output_data_string == "int16" ) opt.output_data_type = VW_CHANNEL_INT16; else if (opt.output_data_string == "int32" ) opt.output_data_type = VW_CHANNEL_INT32; else if (opt.output_data_string == "float32") opt.output_data_type = VW_CHANNEL_FLOAT32; else if (opt.output_data_string == "float64") opt.output_data_type = VW_CHANNEL_FLOAT64; else vw_throw(ArgumentErr() << "Invalid value for the output type: " << opt.output_data_string << ".\n"); // Create the output directory vw::create_out_dir(opt.output_image); if (opt.output_prefix != "") // for saving match files, etc. vw::create_out_dir(opt.output_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.output_image); return; } // Write the aligned image with the specified output data type, casting and // clamping as needed. Integer types are rounded before clamping. #define WRITE_ALIGNED_INT(T) \ vw::cartography::block_write_gdal_image( \ opt.output_image, \ per_pixel_filter(apply_mask(aligned_image2, nodata2), \ vw::ClampRoundAndCastToInt<T, double>()), \ has_georef2, georef2, has_nodata2, nodata2, opt, tpc) #define WRITE_ALIGNED_FLOAT(T) \ vw::cartography::block_write_gdal_image( \ opt.output_image, \ per_pixel_filter(apply_mask(aligned_image2, nodata2), \ vw::ClampAndCast<T, double>()), \ has_georef2, georef2, has_nodata2, nodata2, opt, tpc) void save_output(ImageViewRef<PixelMask<double>> aligned_image2, bool has_nodata2, float nodata2, bool has_georef2, vw::cartography::GeoReference const& georef2, Options const& opt) { vw_out() << "Writing: " << opt.output_image << "\n"; TerminalProgressCallback tpc("asp", "\t Aligned image: "); switch (opt.output_data_type) { case VW_CHANNEL_UINT8: WRITE_ALIGNED_INT(vw::uint8); break; case VW_CHANNEL_UINT16: WRITE_ALIGNED_INT(vw::uint16); break; case VW_CHANNEL_UINT32: WRITE_ALIGNED_INT(vw::uint32); break; case VW_CHANNEL_INT16: WRITE_ALIGNED_INT(vw::int16); break; case VW_CHANNEL_INT32: WRITE_ALIGNED_INT(vw::int32); break; case VW_CHANNEL_FLOAT32: WRITE_ALIGNED_FLOAT(vw::float32); break; case VW_CHANNEL_FLOAT64: WRITE_ALIGNED_FLOAT(vw::float64); break; default: vw_throw(ArgumentErr() << "Invalid value for the output pixel format.\n"); } } #undef WRITE_ALIGNED_INT #undef WRITE_ALIGNED_FLOAT int main(int argc, char *argv[]) { Options opt; try { // Process command line options handle_arguments(argc, argv, opt); std::string image_file1 = opt.input_images[0], image_file2 = opt.input_images[1]; ImageViewRef<double> image1, image2; bool has_georef1 = false, has_georef2 = false; double nodata1_double, nodata2_double; // part of api, will not be used vw::cartography::GeoReference georef1, georef2; asp::load_image(image_file1, image1, nodata1_double, has_georef1, georef1); asp::load_image(image_file2, image2, nodata2_double, has_georef2, georef2); // Set the no-data value while takeing into account the command line override float nodata1, nodata2; { boost::shared_ptr<DiskImageResource> rsrc1(vw::DiskImageResourcePtr(image_file1)); boost::shared_ptr<DiskImageResource> rsrc2(vw::DiskImageResourcePtr(image_file2)); asp::get_nodata_values(rsrc1, rsrc2, asp::stereo_settings().nodata_value, nodata1, nodata2); } Matrix<double> tf, ecef_transform; if (opt.input_transform.empty()) { std::vector<ip::InterestPoint> matched_ip1, matched_ip2; if (opt.disparity_params == "") asp::matchIpNoCams(image_file1, image_file2, opt.output_prefix, matched_ip1, matched_ip2); else find_matches_from_disp(matched_ip1, matched_ip2, opt); // Must have at least a minimum number of matches to ensure accurate transform if ((int)matched_ip1.size() < opt.min_matches) vw_throw(ArgumentErr() << "Found only " << matched_ip1.size() << " matches, which is less than the minimum of " << opt.min_matches << " (option --min-matches).\n"); tf = calc_alignment_transform(image_file1, image_file2, matched_ip1, matched_ip2, opt, ecef_transform); } else { vw_out() << "Reading the alignment transform from: " << opt.input_transform << "\n"; read_matrix_as_txt(opt.input_transform, tf); } if (opt.output_prefix != "") { std::string transform_file = opt.output_prefix + "-transform.txt"; vw_out() << "Writing the transform to: " << transform_file << std::endl; write_matrix_as_txt(transform_file, tf); } if (opt.output_prefix != "" && opt.ecef_transform_type != "") { std::string ecef_transform_file = opt.output_prefix + "-ecef-transform.txt"; vw_out() << "Writing the ECEF transform to: " << ecef_transform_file << "\n"; write_matrix_as_txt(ecef_transform_file, ecef_transform); // Write the inverse too std::string ecef_transform_inv_file = opt.output_prefix + "-ecef-inverse-transform.txt"; vw_out() << "Writing the inverse of the ECEF transform to: " << ecef_transform_inv_file << "\n"; write_matrix_as_txt(ecef_transform_inv_file, vw::math::inverse(ecef_transform)); } // Any transforms supported by this tool fit in a homography transform object vw::HomographyTransform T(tf); // Find the domain of the transformed image BBox2i trans_box = T.forward_bbox(vw::bounding_box(image2)); // Adjust the box to consistent with what vw::transform expects below trans_box.min() = vw::Vector2(0, 0); PixelMask<double> nodata_mask = PixelMask<double>(); // invalid value for a PixelMask ImageViewRef<PixelMask<double>> aligned_image2 = vw::transform(create_mask(image2, nodata2), HomographyTransform(tf), trans_box.width(), trans_box.height(), ValueEdgeExtension<PixelMask<double>>(nodata_mask), BilinearInterpolation()); // Almost always the alignment will result in pixels with no data bool has_nodata2 = true; if (has_georef1) { // Borrow the georef from the first image, since we are in its coordinates // It is useful to print the data below, as it explains what is happening // in the georeference domain. The pixel-only transform is only one part. vw::vw_out() << "\nSecond image georeference before alignment:\n\t" << georef2 << "\n"; has_georef2 = has_georef1; georef2 = georef1; vw::vw_out() << "Second image georeference after alignment:\n\t" << georef2 << "\n"; } else{ // Write no georef has_georef1 = false; has_georef2 = false; } save_output(aligned_image2, has_nodata2, nodata2, has_georef2, georef2, opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/image_calc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file image_calc.cc // Apply specified arithmetic operations to given input images and save the // output with desired pixel type. #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Core/AspStringUtils.h> #include <vw/Core/FundamentalTypes.h> #include <vw/Core/Log.h> #include <vw/Image/Algorithms.h> #include <vw/Image/ImageIO.h> #include <vw/Image/ImageView.h> #include <vw/Image/ImageViewRef.h> #include <vw/Image/Manipulation.h> #include <vw/Image/MaskViews.h> #include <vw/Image/PixelMath.h> #include <vw/Image/Statistics.h> #include <vw/Image/Filter.h> #include <vw/FileIO/DiskImageView.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/FileUtils.h> #include <boost/program_options.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> #include <boost/fusion/include/adapt_struct.hpp> #include <boost/math/special_functions/sign.hpp> #include <vector> #include <random> namespace po = boost::program_options; namespace b_s = boost::spirit; // The operations tree structure. Boost::Spirit requires the use of some // specific Boost types in order to store the parsed information. enum OperationType { OP_pass, // UNARY operations OP_number, // This is a leaf node containing a number. OP_variable, OP_negate, OP_abs, OP_sign, OP_rand, // BINARY operations OP_add, OP_subtract, OP_divide, OP_multiply, OP_power, // MULTI operations OP_min, OP_max, OP_lt, OP_gt, OP_lte, OP_gte, OP_eq }; std::string getTagName(const OperationType op) { switch(op) { case OP_pass: return "PASS"; case OP_number: return "NUMBER"; case OP_variable: return "VARIABLE"; case OP_negate: return "NEGATE"; case OP_abs: return "ABS"; case OP_sign: return "SIGN"; case OP_rand: return "RAND"; case OP_add: return "ADD"; case OP_subtract: return "SUBTRACT"; case OP_divide: return "DIVIDE"; case OP_multiply: return "MULTIPLY"; case OP_power: return "POWER"; case OP_min: return "MIN"; case OP_max: return "MAX"; case OP_lt: return "LESS_THAN"; case OP_gt: return "GREATER_THAN"; case OP_lte: return "LESS_THAN_EQ"; case OP_gte: return "LESS_THAN_EQ"; case OP_eq: return "EQUALS"; default: return "ERROR"; } } const int TAB_SIZE = 4; void tab(int indent) { for (int i = 0; i < indent; i++) vw::vw_out() << ' '; } // TODO: Are there pixel functions for these? template <typename T> T manual_min(std::vector<T> const& vec) { T minVal = vec[0]; for (size_t i = 1; i < vec.size(); i++) if (vec[i] < minVal) minVal = vec[i]; return minVal; } template <typename T> T manual_max(std::vector<T> const& vec) { T maxVal = vec[0]; for (size_t i = 1; i < vec.size(); i++) if (vec[i] > maxVal) maxVal = vec[i]; return maxVal; } // Initialize the random number generator. Always use the same seed, so that // results are repeatable. std::mt19937 mt(0); // Return a random number in the range [0, 1] template <typename T> T custom_rand_0_1(T val) { return double(mt() - mt.min())/double(mt.max() - mt.min()); } // This type represents an operation performed on one or more inputs. struct calc_operation { OperationType opType; // The operation to be performed on the children double value; // If this is a leaf node, the number is stored here. Ignored unless OP_number. int varName; std::vector<calc_operation> inputs; // The inputs to the operation calc_operation(): opType(OP_pass) {} /// Recursive function to print out the contents of this object void print(const int indent=0) { if (opType == OP_number) { tab(indent); vw::vw_out() << "Node: " << getTagName(opType) << " = " << value << "\n"; } else if (opType == OP_variable) { tab(indent); vw::vw_out() << "Node: " << getTagName(opType) << " = " << varName << "\n"; } else { vw::vw_out() << "\n"; tab(indent); vw::vw_out() << "tag: " << getTagName(opType) << "\n"; tab(indent); vw::vw_out() << "value: " << value << "\n"; tab(indent); vw::vw_out() << "varName: " << varName << "\n"; tab(indent); vw::vw_out() << '{' << "\n"; for (size_t i = 0; i < inputs.size(); i++) inputs[i].print(indent+TAB_SIZE); tab(indent); vw::vw_out() << '}' << "\n"; } } /// Recursive function to eliminate extraneous nodes created by our parsing technique void clearEmptyNodes() { // Recursively call this function on all inputs for (size_t i = 0; i < inputs.size(); i++) inputs[i].clearEmptyNodes(); if (opType != OP_pass) return; // Check for errors if (inputs.size() != 1) { vw::vw_out() << "ERROR: pass node with " << inputs.size() << " Nodes!\n"; return; } // Replace this node with its input node value = inputs[0].value; opType = inputs[0].opType; varName = inputs[0].varName; std::vector<calc_operation> temp = inputs[0].inputs; inputs = temp; } /// Apply the operation tree to the input parameters and return a result template <typename T> T applyOperation(std::vector<T> const& params) const { // Get the results from each input node. // - This is a recursive call. size_t numInputs = inputs.size(); std::vector<T> inputResults(numInputs); for (size_t i = 0; i < numInputs; i++) inputResults[i] = inputs[i].applyOperation(params); // Now perform the operation for this node switch(opType) { // Unary case OP_number: return T(value); case OP_variable: if (varName >= static_cast<int>(params.size())) vw::vw_throw(vw::ArgumentErr() << "Unrecognized variable input. Note that the first variable is var_0.\n"); return params[varName]; if (numInputs < 1) vw::vw_throw(vw::LogicErr() << "Insufficient inputs for this operation.\n"); case OP_negate: return T(-1 * inputResults[0]); case OP_abs: return T(std::abs(inputResults[0])); // regular abs casts to integer. case OP_sign: return T(boost::math::sign(inputResults[0])); case OP_rand: return T(custom_rand_0_1(inputResults[0])); // Binary if (numInputs < 2) vw::vw_throw(vw::LogicErr() << "Insufficient inputs for this operation.\n"); case OP_add: return (inputResults[0] + inputResults[1]); case OP_subtract: return (inputResults[0] - inputResults[1]); case OP_divide: return (inputResults[0] / inputResults[1]); case OP_multiply: return (inputResults[0] * inputResults[1]); case OP_power: return (pow(inputResults[0], inputResults[1])); // Multi case OP_min: return manual_min(inputResults); // TODO: Do these functions exist? case OP_max: return manual_max(inputResults); case OP_lt: return (inputResults[0] < inputResults[1]) ? inputResults[2]: inputResults[3]; case OP_gt: return (inputResults[0] > inputResults[1]) ? inputResults[2]: inputResults[3]; case OP_lte: return (inputResults[0] <= inputResults[1]) ? inputResults[2]: inputResults[3]; case OP_gte: return (inputResults[0] >= inputResults[1]) ? inputResults[2]: inputResults[3]; case OP_eq: return (inputResults[0] == inputResults[1]) ? inputResults[2]: inputResults[3]; default: vw::vw_throw(vw::LogicErr() << "Unexpected operation type.\n"); } } }; // We need to tell fusion about our calc_operation struct to make it a // first-class fusion citizen BOOST_FUSION_ADAPT_STRUCT( calc_operation, (OperationType, opType) (double, value) (int, varName) (std::vector<calc_operation>, inputs) ) // Boost::Spirit equation parsing // Helper constants to aid in accessing a calc_operation struct const int OP = 0; const int NUM = 1; const int VAR = 2; const int IN = 3; template <typename ITER> struct calc_grammar: b_s::qi::grammar<ITER, calc_operation(), b_s::ascii::space_type> { // Constructor function calc_grammar(): calc_grammar::base_type(expression) { // Definitions using boost::phoenix::at; using boost::phoenix::at_c; using boost::phoenix::push_back; using b_s::qi::double_; using b_s::qi::int_; using b_s::qi::eps; using b_s::qi::_val; using b_s::qi::_1; // This is required to avoid namespace mixups with other Boost modules. using b_s::qi::_2; using b_s::qi::_3; // Map from function names to operation types func_map.add ("min", OP_min) ("max", OP_max) ("lt", OP_lt) ("gt", OP_gt) ("lte", OP_lte) ("gte", OP_gte) ("eq", OP_eq) ("abs", OP_abs) ("sign", OP_sign) ("rand", OP_rand); // This approach works but it processes expressions right to left. To get a // desired order, use parenthesis. // An outer expression expression = (term [push_back(at_c<IN>(_val), _1)]) >> *(( // Addition '+' >> expression [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_add]) | // Subtraction ('-' >> expression [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_subtract])); // Middle priority term = (factor [push_back(at_c<IN>(_val), _1)]) >> *(( // Multiplication '*' >> term [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_multiply]) | // Division ('/' >> term [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_divide ])); // The highest priority // TODO: An additional layer to prevent double signs? factor = // Just a number (double_ [at_c<NUM>(_val)=_1, at_c<OP>(_val)=OP_number]) | // Handle all operations specified in func_map (func_map [at_c<OP>(_val)=_1] > '(' > expression [push_back(at_c<IN>(_val), _1)] % ',' > ')') | // Power function (("pow(" > expression > ',' > expression > ')') [push_back(at_c<IN>(_val), _1), push_back(at_c<IN>(_val), _2), at_c<OP>(_val)= OP_power]) | // Something in parenthesis ('(' > expression [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_pass] > ')') | // Negative sign ('-' >> factor [push_back(at_c<IN>(_val), _1), at_c<OP>(_val)=OP_negate]) | // Variable ("var_" > int_ [at_c<VAR>(_val)=_1, at_c<OP>(_val)=OP_variable]); } // End constructor // Grammar rules b_s::qi::rule<ITER, calc_operation(), b_s::ascii::space_type> expression, term, factor; b_s::qi::symbols<char, OperationType> func_map; }; // End struct calc_grammar /// Image view class which applies the calc_operation tree to each pixel location. template <class ImageT, typename OutputPixelT> class ImageCalcView: public vw::ImageViewBase<ImageCalcView<ImageT, OutputPixelT>> { public: // Definitions typedef typename ImageT::pixel_type input_pixel_type; typedef OutputPixelT pixel_type; // Output pixel type typedef OutputPixelT result_type; private: // Variables std::vector<ImageT> const& m_image_vec; std::vector<bool> m_has_nodata_vec; std::vector<double> m_nodata_vec; // nodata is always double double m_output_nodata; calc_operation m_operation_tree; int m_num_rows; int m_num_cols; int m_num_channels; public: // Functions // Constructor ImageCalcView(std::vector<ImageT> const& imageVec, std::vector<bool> const& has_nodata_vec, std::vector<double> const& nodata_vec, double outputNodata, calc_operation const& operation_tree): m_image_vec(imageVec), m_has_nodata_vec(has_nodata_vec), m_nodata_vec(nodata_vec), m_output_nodata(outputNodata), m_operation_tree(operation_tree) { size_t numImages = imageVec.size(); VW_ASSERT((numImages > 0), vw::ArgumentErr() << "ImageCalcView: One or more images required."); VW_ASSERT((has_nodata_vec.size() == numImages), vw::LogicErr() << "ImageCalcView: Incorrect hasNodata count passed in."); VW_ASSERT((nodata_vec.size() == numImages), vw::LogicErr() << "ImageCalcView: Incorrect nodata count passed in."); // Make sure all images are the same size m_num_rows = imageVec[0].rows(); m_num_cols = imageVec[0].cols(); m_num_channels = imageVec[0].planes(); for (size_t i = 1; i < numImages; i++) { if ((imageVec[i].rows() != m_num_rows) || (imageVec[i].cols() != m_num_cols) || (imageVec[i].planes() != m_num_channels)) vw::vw_throw(vw::ArgumentErr() << "Error: Input images must all have the same size and number of channels."); } } inline vw::int32 cols () const { return m_num_cols; } inline vw::int32 rows () const { return m_num_rows; } inline vw::int32 planes() const { return m_num_channels; } inline result_type operator()(vw::int32 i, vw::int32 j, vw::int32 p=0) const { return 0; // NOT IMPLEMENTED. } typedef vw::ProceduralPixelAccessor<ImageCalcView<ImageT, OutputPixelT>> pixel_accessor; inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } typedef vw::CropView<vw::ImageView<result_type>> prerasterize_type; inline prerasterize_type prerasterize(vw::BBox2i const& bbox) const { typedef typename vw::ImageChannelType<vw::ImageView<result_type>>::type output_channel_type; // Set up the output image tile vw::ImageView<result_type> tile(bbox.width(), bbox.height()); // TODO: Left to right processing. // Set up for pixel calculations size_t num_images = m_image_vec.size(); std::vector<input_pixel_type> input_pixels(num_images); std::vector<double> input_doubles(num_images); // Rasterize all the input images at this particular tile std::vector<vw::ImageView<input_pixel_type>> input_tiles(num_images); for (size_t i = 0; i < num_images; i++) input_tiles[i] = crop(m_image_vec[i], bbox); // Loop through each output pixel and compute each output value for (int c = 0; c < bbox.width(); c++) { for (int r = 0; r < bbox.height(); r++) { // Fetch all the input pixels for this location bool isNodata = false; for (size_t i = 0; i < num_images; i++) { input_pixels[i] = (input_tiles[i])(c,r); // If any of the input pixels are nodata, the output is nodata. if (m_has_nodata_vec[i] && (m_nodata_vec[i] == input_pixels[i])) { isNodata = true; break; } } // End image loop if (isNodata) { // Output is nodata, move on to the next pixel tile(c, r) = m_output_nodata; continue; } for (int chan = 0; chan < m_num_channels; chan++) { for (size_t i = 0; i < num_images; i++) { input_doubles[i] = input_pixels[i][chan]; } // End image loop // Apply the operation tree to this pixel and store in the output // pixel. Note that this does not round the output value when the // output type is integral. Not sure if that is desired behavior. double newVal = m_operation_tree.applyOperation<double>(input_doubles); tile(c, r, chan) = vw::clamp_and_cast<output_channel_type>(newVal); } // End channel loop } // End row loop } // End column loop // Return the tile we created with fake borders to make it look the // size of the entire output image return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } // End prerasterize function template <class DestT> inline void rasterize(DestT const& dest, vw::BBox2i const& bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class ImageCalcView struct Options: vw::GdalWriteOptions { Options(): out_nodata_value(-1), percentile_stretch(false), percentile_range(vw::Vector2(2, 98)) {} // Input std::vector<std::string> input_files; bool has_in_nodata; double in_nodata_value, lon_offset; // Settings std::string output_data_string; int output_data_type; bool has_out_nodata; bool no_georef; bool percentile_stretch; vw::Vector2 percentile_range; double out_nodata_value; std::string calc_string; std::string output_file, metadata; }; // Handling input void handle_arguments(int argc, char * argv[], Options & opt) { const std::string calc_string_help = "The operation to be performed on the input images. Input images must all be the " "same size and type. Currently only single channel images are supported. " "Recognized operators: +, -, /, *, (), pow(), abs(), sign(), rand(), min(), max(), " "var_0, var_1, etc. Use var_n to refer to the pixel of the n-th input image " "(n starts from 0). Note that the order of operations is parsed with right-to-left " "associativity, so, 'a * b * c' becomes 'a * (b * c)'. Use parentheses to " "enforce the desired order. Surround the entire string with quotes. For a " "single input image, if the operation is not set, it defaults to 'var_0' so the " "identity operation."; const std::string data_type_string = "The data type of the output file:\n" " uint8 \n" " uint16 \n" " uint32 \n" " int16 \n" " int32 \n" " float32 (default)\n" " float64 \n"; double nan = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options(""); general_options.add_options() ("output-file,o", po::value(&opt.output_file), "Output file name.") ("calc,c", po::value(&opt.calc_string), calc_string_help.c_str()) ("output-data-type,d", po::value(&opt.output_data_string)->default_value("float32"), data_type_string.c_str()) ("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.") ("output-nodata-value", po::value(&opt.out_nodata_value), "Manually specify a nodata value for the output image. By default it is read from the " "first input which has it, or, if missing, it is set to data type min.") ("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.") ("no-georef", po::bool_switch(&opt.no_georef)->default_value(false), "Remove any georeference information (useful with subsequent GDAL-based processing).") ("stretch", po::bool_switch(&opt.percentile_stretch)->default_value(false), "Linearly stretch, round, and clamp the input values to the 0 - 255 range (uint8) " "based on the specified percentiles. See --percentile-range.") ("percentile-range", po::value(&opt.percentile_range)->default_value(vw::Vector2(2, 98), "2 98"), "The percentiles to use for stretching the image to 8-bit. These are double values.") ("longitude-offset", po::value(&opt.lon_offset)->default_value(nan), "Add this value to the longitudes in the geoheader (can be used to offset the " "longitudes by 360 degrees).") ("help,h", "Display this help message."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input-files", po::value<std::vector<std::string>>(&opt.input_files)); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("[options] <image-files>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.input_files.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing input files.\n" << usage << general_options); if (opt.percentile_stretch && opt.input_files.size() != 1) vw::vw_throw(vw::ArgumentErr() << "The --stretch option works only with a single input image.\n"); if (opt.percentile_range[0] < 0.0 || opt.percentile_range[0] >= opt.percentile_range[1] || opt.percentile_range[1] > 100.0) vw::vw_throw(vw::ArgumentErr() << "The --percentile-range values must be between 0 and 100, " << "and the first value must be less than the second.\n"); if (opt.calc_string.empty()) { if (opt.input_files.size() == 1) { opt.calc_string = "var_0"; } else { vw::vw_throw(vw::ArgumentErr() << "Missing operation string.\n" << usage << general_options); } } if (opt.output_data_string == "uint8") opt.output_data_type = vw::VW_CHANNEL_UINT8; else if (opt.output_data_string == "uint16") opt.output_data_type = vw::VW_CHANNEL_UINT16; else if (opt.output_data_string == "uint32") opt.output_data_type = vw::VW_CHANNEL_UINT32; // GDAL does not support int8 //else if (opt.output_data_string == "int8") opt.output_data_type = VW_CHANNEL_INT8; else if (opt.output_data_string == "int16") opt.output_data_type = vw::VW_CHANNEL_INT16; else if (opt.output_data_string == "int32") opt.output_data_type = vw::VW_CHANNEL_INT32; else if (opt.output_data_string == "float32") opt.output_data_type = vw::VW_CHANNEL_FLOAT32; else if (opt.output_data_string == "float64") opt.output_data_type = vw::VW_CHANNEL_FLOAT64; else vw::vw_throw(vw::ArgumentErr() << "Unsupported output data type: " << opt.output_data_string << ".\n"); // Fill out opt.has_in_nodata and opt.has_out_nodata depending if the user // specified these options if (!vm.count("input-nodata-value")) { opt.has_in_nodata = false; } else opt.has_in_nodata = true; if (!vm.count("output-nodata-value")) { opt.has_out_nodata = false; opt.out_nodata_value = vw::get_default_nodata(opt.output_data_type); } else opt.has_out_nodata = true; if (opt.output_file.empty()) vw::vw_throw(vw::ArgumentErr() << "The output file was not specified.\n"); vw::create_out_dir(opt.output_file); } // Implement option --stretch void image_calc_stretch(Options const& opt, bool have_georef, vw::cartography::GeoReference const& georef, std::map<std::string, std::string> const& keywords, bool has_nodata, double nodata_val) { // Check that the input image has only one channel const std::string firstFile = opt.input_files[0]; auto rsrc = vw::DiskImageResourcePtr(firstFile); if (rsrc->channels() != 1) vw::vw_throw(vw::ArgumentErr() << "The --stretch option works only with single-channel images.\n"); // Read the image vw::DiskImageView<double> image(firstFile); // Handle nodata. Mask it before doing stats. vw::ImageViewRef<vw::PixelMask<double>> masked_image; if (has_nodata) masked_image = vw::create_mask(image, nodata_val); else masked_image = vw::pixel_cast<vw::PixelMask<double>>(image); // Compute statistics at a reduced resolution. Use double and int64 to avoid overflow. const double numPixelSamples = 1000000; double num_pixels = double(image.cols()) * double(image.rows()); vw::int64 stat_scale = vw::int64(ceil(sqrt(num_pixels / numPixelSamples))); vw::math::CDFAccumulator<double> accumulator; vw::int64 num_valid_pixels = 0; vw::ImageView<vw::PixelMask<double>> sub_image = vw::subsample(masked_image, stat_scale); vw::vw_out() << "Computing image percentiles with subsampled image size: " << sub_image.cols() << " x " << sub_image.rows() << "\n"; vw::TerminalProgressCallback tp("asp", ": "); for (vw::int64 col = 0; col < sub_image.cols(); col++) { for (vw::int64 row = 0; row < sub_image.rows(); row++) { if (vw::is_valid(sub_image(col, row))) { accumulator(sub_image(col, row).child()); num_valid_pixels++; } } tp.report_fractional_progress(col, sub_image.cols()); } tp.report_finished(); double min_val = 0.0, max_val = 1.0; if (num_valid_pixels == 0) { vw::vw_out(vw::WarningMessage) << "No valid pixels found in the input image.\n"; } else { min_val = accumulator.quantile(opt.percentile_range[0] / 100.0); max_val = accumulator.quantile(opt.percentile_range[1] / 100.0); } vw::vw_out() << " " << opt.percentile_range[0] << "%: " << min_val << "\n" << " " << opt.percentile_range[1] << "%: " << max_val << "\n"; // Create the stretched view. Pixels below min_val and nodata are clamped to // 0. Pixels above max_val are clamped to 255. Round, then cast to uint8. vw::ImageViewRef<double> normalized_image = vw::normalize(vw::apply_mask(masked_image, min_val), min_val, max_val, 0.0, 255.0); vw::ImageViewRef<vw::uint8> cast_image = vw::channel_cast_round_and_clamp<vw::uint8>(normalized_image); bool has_out_nodata = false; double out_nodata = 0.0; auto tpc = vw::TerminalProgressCallback("asp", ": "); vw::vw_out() << "Writing: " << opt.output_file << "\n"; vw::cartography::block_write_gdal_image(opt.output_file, cast_image, have_georef, georef, has_out_nodata, out_nodata, opt, tpc, keywords); } /// This function call is just to clean up the case statement in proc_img template <typename PixelT, typename OutputT> void write_out(std::string const& output_file, Options const& opt, calc_operation const& calc_tree, bool have_georef, vw::cartography::GeoReference const& georef, std::vector<vw::ImageViewRef<PixelT>> const& input_images, std::vector<bool> const& has_nodata_vec, std::vector<double> const& nodata_vec) { // Read previous keywords and append any new keywords from --mo. Overwrite // any previous value of a keyword. std::map<std::string, std::string> keywords; if (opt.metadata != "") { if (!opt.input_files.empty()) { auto rsrc = vw::DiskImageResourcePtr(opt.input_files[0]); vw::cartography::read_header_strings(*rsrc.get(), keywords); } asp::parse_append_metadata(opt.metadata, keywords); } if (opt.percentile_stretch) { image_calc_stretch(opt, have_georef, georef, keywords, has_nodata_vec[0], nodata_vec[0]); } else { if (opt.has_out_nodata) vw::vw_out() << "\t--> Writing output nodata value: " << opt.out_nodata_value << "\n"; vw::vw_out() << "Writing: " << output_file << "\n"; auto tpc = vw::TerminalProgressCallback("image_calc", "Writing:"); vw::cartography::block_write_gdal_image (output_file, ImageCalcView<vw::ImageViewRef<PixelT>, OutputT> (input_images, has_nodata_vec, nodata_vec, opt.out_nodata_value, calc_tree), have_georef, georef, opt.has_out_nodata, opt.out_nodata_value, opt, tpc, keywords); } } void handleGeoref(Options const& opt, bool & have_georef, vw::cartography::GeoReference & georef) { have_georef = false; size_t numInputFiles = opt.input_files.size(); for (size_t i = 0; i < numInputFiles; i++) { std::string input = opt.input_files[i]; // If desired to not use a georef, skip reading it. Else read it. if (!opt.no_georef) { if (!have_georef) { have_georef = vw::cartography::read_georeference(georef, input); if (have_georef) { vw::vw_out() << "\t--> Copying georef from input image " << input << "\n"; if (!std::isnan(opt.lon_offset)) { if (!georef.is_projected()) { vw::vw_out() << "\t--> Adding " << opt.lon_offset << " to the longitude bounds in the geoheader.\n"; vw::Matrix<double,3,3> T = georef.transform(); T(0, 2) += opt.lon_offset; georef.set_transform(T); } else { vw::vw_throw(vw::ArgumentErr() << "Can apply a longitude offset only to georeferenced " << "images in the longitude-latitude projection.\n"); } } } } } } } // Read all images as double. Disable rescaling on the resource so integer // pixels (uint8, uint16, etc.) keep their original values when read as double. typedef vw::PixelGray<double> DoublePixelT; void loadImagesNodata(Options & opt, std::vector<vw::ImageViewRef<DoublePixelT>> & input_images, std::vector<bool> & has_nodata_vec, std::vector<double> & nodata_vec) { size_t numInputFiles = input_images.size(); for (size_t i = 0; i < numInputFiles; i++) { std::string input = opt.input_files[i]; // Open the resource and disable rescaling auto rsrc = vw::DiskImageResourcePtr(input); rsrc->set_rescale(false); // Check for nodata value in the file if (opt.has_in_nodata) { // User has specified a default nodata value, override its value in the file has_nodata_vec[i] = true; nodata_vec[i] = opt.in_nodata_value; opt.has_out_nodata = true; vw::vw_out() << "\t--> Using as nodata value: " << nodata_vec[i] << "\n"; } else if (rsrc->has_nodata_read()) { nodata_vec[i] = rsrc->nodata_read(); has_nodata_vec[i] = true; if (!opt.has_out_nodata) { opt.has_out_nodata = true; opt.out_nodata_value = nodata_vec[i]; } vw::vw_out() << "\t--> Extracted nodata value from " << input << ": " << nodata_vec[i] << "\n"; } else { vw::vw_out() << "\t--> No nodata value present in: " << input << "\n"; has_nodata_vec[i] = false; } vw::DiskImageView<DoublePixelT> disk_image(rsrc); input_images[i] = disk_image; } } /// This function loads the input images and calls the main processing function void proc_img(Options & opt, std::string const& output_file, calc_operation const& calc_tree) { // Read the georef from the first file, they should all have the same value. size_t numInputFiles = opt.input_files.size(); std::vector<vw::ImageViewRef<DoublePixelT>> input_images(numInputFiles); std::vector<bool> has_nodata_vec(numInputFiles); std::vector<double> nodata_vec(numInputFiles); bool have_georef = false; vw::cartography::GeoReference georef; handleGeoref(opt, have_georef, georef); // Load images and nodata values loadImagesNodata(opt, input_images, has_nodata_vec, nodata_vec); // Write out the selected data type switch(opt.output_data_type) { case vw::VW_CHANNEL_UINT8: write_out<DoublePixelT, vw::PixelGray<vw::uint8>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break; case vw::VW_CHANNEL_INT16: write_out<DoublePixelT, vw::PixelGray<vw::int16>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break; case vw::VW_CHANNEL_UINT16: write_out<DoublePixelT, vw::PixelGray<vw::uint16>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break; case vw::VW_CHANNEL_INT32: write_out<DoublePixelT, vw::PixelGray<vw::int32>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break; case vw::VW_CHANNEL_UINT32: write_out<DoublePixelT, vw::PixelGray<vw::uint32>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break; case vw::VW_CHANNEL_FLOAT32: write_out<DoublePixelT, vw::PixelGray<vw::float32>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break; default: write_out<DoublePixelT, vw::PixelGray<vw::float64>>(output_file, opt, calc_tree, have_georef, georef, input_images, has_nodata_vec, nodata_vec); break; }; } void image_calc(Options & opt) { std::string exp(opt.calc_string); calc_grammar<std::string::const_iterator> grammarParser; calc_operation calc_tree; std::string::const_iterator iter = exp.begin(); std::string::const_iterator end = exp.end(); bool r = phrase_parse(iter, end, grammarParser, boost::spirit::ascii::space, calc_tree); if (r && iter == end) {// Successfully parsed the calculation expression calc_tree.clearEmptyNodes(); } else { // Failed to parse the calculation expression std::string::const_iterator some = iter+30; std::string context(iter, (some>end)?end:some); vw::vw_out() << "Parsing calculation expression failed\n"; vw::vw_out() << "stopped at: \": " << context << "...\"\n"; vw::vw_throw(vw::ArgumentErr() << "Parsing calculation expression failed\n"); } // Use a default output file if none provided const std::string firstFile = opt.input_files[0]; std::string output_file = opt.output_file; // All inputs are read in native type and cast to double without rescaling. // The computation is done in double precision, and the output is cast to // the requested type. proc_img(opt, output_file, calc_tree); } /// The main function calls the cmd line parsers and figures out the input image type int main(int argc, char * argv[]) { Options opt; try { handle_arguments(argc, argv, opt); image_calc(opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/image_mosaic.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file image_mosaic.cc // // Tool for creating mosaics of images on disk. Currently supports one line of // images. #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/Macros.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/GdalUtils.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/ImageChannelRead.h> #include <vw/Image/RoundAndClamp.h> #include <vw/Image/AlgorithmFunctions.h> #include <vw/Image/Grassfire.h> #include <vw/Image/Manipulation.h> #include <vw/Image/Interpolation.h> #include <vw/FileIO/FileUtils.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Math/Geometry.h> #include <vw/Math/RANSAC.h> #include <vw/Image/Filter.h> #include <vw/Image/Transform.h> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> #include <boost/filesystem.hpp> #include <limits> using namespace vw; namespace po = boost::program_options; namespace fs = boost::filesystem; /// GDAL block write sizes must be a multiple to 16 so if the input value is /// not a multiple of 16 increase it until it is. void fix_tile_multiple(int &size) { const int TILE_MULTIPLE = 16; if (size % TILE_MULTIPLE != 0) size = ((size / TILE_MULTIPLE) + 1) * TILE_MULTIPLE; } struct Options: vw::GdalWriteOptions { std::vector<std::string> image_files; std::string orientation, output_image, output_type, out_prefix; int overlap_width, band, blend_radius, ip_per_tile, num_ransac_iterations; bool has_input_nodata_value, has_output_nodata_value, reverse, rotate, use_affine_transform, rotate90, rotate90ccw; double input_nodata_value, output_nodata_value, inlier_threshold; Vector2 big_tile_size; Options(): has_input_nodata_value(false), has_output_nodata_value(false), input_nodata_value (std::numeric_limits<double>::quiet_NaN()), output_nodata_value(std::numeric_limits<double>::quiet_NaN()){} }; /// Load an input image, respecting the user parameters. void get_input_image(std::string const& path, Options const& opt, ImageViewRef<float> &image, double &nodata) { // Extract the desired band. // In VW, bands start from 0, not 1. image = vw::read_float_channel(path, opt.band - 1); // Read the nodata-value from disk DiskImageResourceGDAL in_rsrc(path); bool has_nodata = in_rsrc.has_nodata_read(); if (has_nodata) nodata = in_rsrc.nodata_read(); else nodata = std::numeric_limits<double>::quiet_NaN(); } /// Get a list of matched IP, looking in certain image regions. void match_ip_in_regions(std::string const& image_file1, std::string const& image_file2, BBox2i const& roi1, BBox2i const& roi2, std::vector<ip::InterestPoint> &matched_ip1, std::vector<ip::InterestPoint> &matched_ip2, Options const& opt) { // Load the input images ImageViewRef<float> image1, image2; double nodata1, nodata2; get_input_image(image_file1, opt, image1, nodata1); get_input_image(image_file2, opt, image2, nodata2); vw_out() << "Matching interest points between: " << image_file1 << " and " << image_file2 << std::endl; std::string match_file; bool matches_as_txt = false; if (opt.out_prefix != "") { // Write a match file for debugging match_file = ip::match_filename(opt.out_prefix, image_file1, image_file2, matches_as_txt); // If the match file already exists, load it instead of finding new points. if (fs::exists(match_file)) { vw_out() << "Reading matched interest points from file: " << match_file << std::endl; ip::read_match_file(match_file, matched_ip1, matched_ip2, matches_as_txt); vw_out() << "Read in " << matched_ip1.size() << " matched IP.\n"; } } if (matched_ip1.empty()) { // Now find and match interest points in the selected regions size_t number_of_jobs = 1; bool use_cached_ip = false; asp::detect_match_ip(matched_ip1, matched_ip2, crop(image1, roi1), crop(image2, roi2), opt.ip_per_tile, number_of_jobs, "", "", use_cached_ip, nodata1, nodata2, match_file); } // TODO: This should be a function! // Adjust the IP to account for the search ROIs. for (size_t i=0; i<matched_ip1.size(); ++i) { matched_ip1[i].x += roi1.min()[0]; matched_ip1[i].ix += roi1.min()[0]; matched_ip1[i].y += roi1.min()[1]; matched_ip1[i].iy += roi1.min()[1]; matched_ip2[i].x += roi2.min()[0]; matched_ip2[i].ix += roi2.min()[0]; matched_ip2[i].y += roi2.min()[1]; matched_ip2[i].iy += roi2.min()[1]; } } // End function match_ip_in_regions /// Compute a matrix transform between images, searching for IP in /// the specified regions. Matrix<double> compute_ip_matching(std::string const& image_file1, std::string const& image_file2, BBox2i const& roi1, BBox2i const& roi2, Options & opt) { // Find IP, looking in only the specified regions. std::vector<ip::InterestPoint> matched_ip1, matched_ip2; match_ip_in_regions(image_file1, image_file2, roi1, roi2, matched_ip1, matched_ip2, opt); // Clean up lists. std::vector<Vector3> ransac_ip1 = iplist_to_vectorlist(matched_ip1); std::vector<Vector3> ransac_ip2 = iplist_to_vectorlist(matched_ip2); // RANSAC parameters int min_num_output_inliers = ransac_ip1.size()/2; bool reduce_min_num_output_inliers_if_no_fit = true; vw_out() << "Number of RANSAC iterations: " << opt.num_ransac_iterations << "\n"; vw_out() << "Inlier threshold in pixels: " << opt.inlier_threshold << "\n"; Matrix<double> tf; std::vector<size_t> indices; try { if (opt.use_affine_transform) { vw::math::RandomSampleConsensus<vw::math::AffineFittingFunctor, vw::math::InterestPointErrorMetric> ransac(vw::math::AffineFittingFunctor(), vw::math::InterestPointErrorMetric(), opt.num_ransac_iterations, opt.inlier_threshold, min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit); tf = ransac(ransac_ip2, ransac_ip1); indices = ransac.inlier_indices(tf, ransac_ip2, ransac_ip1); } else { // More restricted transform vw::math::RandomSampleConsensus<vw::math::TranslationRotationFittingFunctorN<2>, vw::math::InterestPointErrorMetric> ransac(vw::math::TranslationRotationFittingFunctorN<2>(), vw::math::InterestPointErrorMetric(), opt.num_ransac_iterations, opt.inlier_threshold, min_num_output_inliers, reduce_min_num_output_inliers_if_no_fit); tf = ransac(ransac_ip2, ransac_ip1); indices = ransac.inlier_indices(tf, ransac_ip2, ransac_ip1); } } catch (...) { vw_throw( ArgumentErr() << "Automatic alignment failed in the RANSAC fit."); } // Keeping only inliers std::vector<ip::InterestPoint> inlier_ip1, inlier_ip2; for ( size_t i = 0; i < indices.size(); i++ ) { inlier_ip1.push_back( matched_ip1[indices[i]] ); inlier_ip2.push_back( matched_ip2[indices[i]] ); } std::string match_file; bool matches_as_txt = false; if (opt.out_prefix != "") { // Write a match file for debugging match_file = ip::clean_match_filename(opt.out_prefix, image_file1, image_file2, matches_as_txt); vw_out() << "Writing inlier matches after RANSAC to: " << match_file << std::endl; ip::write_match_file(match_file, inlier_ip1, inlier_ip2, matches_as_txt); } return tf; } // TODO: Pass in image ref instead of paths? /// Compute the transform from image1 to image2 /// (the top left corner of image1 is (0,0)) Matrix<double> compute_relative_transform(std::string const& image1, std::string const& image2, Options& opt) { Vector2i size1 = file_image_size(image1); Vector2i size2 = file_image_size(image2); // Set up the ROIs for the two images based on the selected orientation. // - Currently only horizontal orientation is supported. BBox2i roi1, roi2; if (opt.orientation == "horizontal") { roi1.min() = Vector2(std::max(size1[0] - opt.overlap_width, 0), 0); roi1.max() = size1; // Bottom right corner roi2.min() = Vector2(0, 0); // Top left corner roi2.max() = Vector2(std::min(opt.overlap_width, size2[0]), size2[1]); // Bottom right } if (roi1.empty() || roi2.empty()) vw_throw( ArgumentErr() << "Unrecognized image orientation!"); Matrix<double> tf; // Try several times, with ever-larger value of ip-per-tile. Normally this value // is computed internally, or passed in by the user via --ip-per-tile. In // either case, it will be recorded in asp::stereo_settings().ip_per_tile, // which we will increase in subsequent attempts. int num_attempts = 3; for (int attempt = 1; attempt <= num_attempts; attempt++) { try { tf = compute_ip_matching(image1, image2, roi1, roi2, opt); break; } catch (std::exception const& e) { vw_out() << "Failed with error: " << e.what() << "\n"; if (attempt == num_attempts) vw_throw(ArgumentErr() << "Failed to compute the relative transform. Inspect your images.\n"); } // Wipe any old match file to force it to be regenerated std::string match_file; bool matches_as_txt = false; if (opt.out_prefix != "") match_file = ip::match_filename(opt.out_prefix, image1, image2, matches_as_txt); if (!match_file.empty() && fs::exists(match_file)) { vw::vw_out() << "Removing old match file: " << match_file << "\n"; fs::remove(match_file); } // Multiply the number of IP per tile by 4 and try again. asp::stereo_settings().ip_per_tile *= 4; opt.ip_per_tile = asp::stereo_settings().ip_per_tile; vw_out() << "Increasing --ip-per-tile to: " << asp::stereo_settings().ip_per_tile << "\n"; } return tf; } // End function compute_relative_transform /// Compute the positions of each image relative to the first image. /// - The top left corner of the first image is coordinate 0,0 in the output image. void compute_all_image_positions(Options & opt, std::vector<boost::shared_ptr<vw::Transform>> & transforms, std::vector<BBox2i> & bboxes, Vector2i & output_image_size) { const size_t num_images = opt.image_files.size(); transforms.resize(num_images); bboxes.resize(num_images); // Init the bounding box to contain the first image BBox2i output_bbox; Vector2i image_size = file_image_size(opt.image_files[0]); output_bbox.grow(Vector2i(0,0)); output_bbox.grow(image_size); // Init values for the first image Vector2 to(0, 0); Matrix2x2 mo; mo(0,0) = 1; mo(0,1) = 0; mo(1,0) = 0; mo(1,1) = 1; transforms[0] = boost::shared_ptr<vw::Transform>(new AffineTransform(mo, to)); bboxes [0] = output_bbox; // This approach only works for serial pairs, if we add another type of // orientation it will need to be changed. Matrix<double> last_transform = identity_matrix(3); for (size_t i=1; i<num_images; ++i) { Matrix<double> relative_transform = compute_relative_transform(opt.image_files[i-1], opt.image_files[i], opt); image_size = file_image_size(opt.image_files[i]); Matrix<double> absolute_transform; if (i == 0) { // First transform absolute_transform = relative_transform; } else { // Chain from the last transform absolute_transform = last_transform * relative_transform; } last_transform = absolute_transform; Vector2 t(absolute_transform(0,2), absolute_transform(1,2)); Matrix2x2 m; m(0,0) = absolute_transform(0,0); m(0,1) = absolute_transform(0,1); m(1,0) = absolute_transform(1,0); m(1,1) = absolute_transform(1,1); boost::shared_ptr<vw::Transform> tf_ptr(new AffineTransform(m, t)); Matrix<double> inv_absolute_transform = inverse(absolute_transform); Vector2 ti(inv_absolute_transform(0,2), inv_absolute_transform(1,2)); Matrix2x2 mi; mi(0,0) = inv_absolute_transform(0,0); mi(0,1) = inv_absolute_transform(0,1); mi(1,0) = inv_absolute_transform(1,0); mi(1,1) = inv_absolute_transform(1,1); boost::shared_ptr<vw::Transform> inv_tf_ptr(new AffineTransform(mi, ti)); transforms[i] = tf_ptr; // Record transfrom from output to input vw_out() << "relative_transform: " << relative_transform << std::endl; vw_out() << "absolute_transform: " << absolute_transform << std::endl; // Update the overall output bbox with the new image added // TODO: Add other corners! Vector2 new_bot_right_corner = tf_ptr->forward(image_size); output_bbox.grow(new_bot_right_corner); // Update this image's bbox in output image BBox2f this_bbox = compute_transformed_bbox_fast( BBox2i(0,0,image_size[0],image_size[1]), *tf_ptr); this_bbox.expand(1); this_bbox.crop(output_bbox); // TODO: Should not be needed! bboxes[i] = this_bbox; } // End loop through images output_image_size = output_bbox.size(); } /// A class to mosaic and rescale images using bilinear interpolation. template <class T> class ImageMosaicView: public ImageViewBase<ImageMosaicView<T> >{ private: std::vector<ImageViewRef<T> > const& m_images; std::vector<boost::shared_ptr<vw::Transform> > const& m_transforms; std::vector<BBox2i> const& m_bboxes; int m_blend_radius; Vector2i const m_output_image_size; double m_output_nodata_value; public: ImageMosaicView(std::vector<ImageViewRef<T> > const& images, std::vector<boost::shared_ptr<vw::Transform> > const& transforms, std::vector<BBox2i> const& bboxes, int blend_radius, Vector2i output_image_size, double output_nodata_value): m_images(images), m_transforms(transforms), m_bboxes(bboxes), m_blend_radius(blend_radius), m_output_image_size(output_image_size), m_output_nodata_value(output_nodata_value){} typedef float pixel_type; typedef float result_type; typedef ProceduralPixelAccessor<ImageMosaicView> pixel_accessor; inline int32 cols () const { return m_output_image_size[0]; } inline int32 rows () const { return m_output_image_size[1]; } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); } inline result_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const { vw_throw(NoImplErr() << "ImageMosaicView::operator()(...) is not implemented"); return result_type(); } typedef CropView<ImageView<result_type> > prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { // Initialize the output tile ImageView<result_type> tile (bbox.width(), bbox.height()); ImageView<float > weights(bbox.width(), bbox.height()); fill(tile, m_output_nodata_value); fill(weights, 0); // Loop through the intersecting input images and paste them in // to the output image. for (size_t i=0; i<m_images.size(); ++i) { // Get the intersection (if any) of this image with the current bbox. if (!m_bboxes[i].intersects(bbox)) { continue; } BBox2i intersect = m_bboxes[i]; intersect.crop(bbox); typedef ImageView<T> ImageT; typedef InterpolationView<ImageT, BilinearInterpolation> InterpT; // Find the required section of the input image. //BBox2f temp_bbox = compute_transformed_bbox_fast(intersect, inv_trans); BBox2i temp_bbox = m_transforms[i]->reverse_bbox(intersect); temp_bbox.expand(BilinearInterpolation::pixel_buffer); BBox2i input_bbox = temp_bbox; input_bbox.crop(bounding_box(m_images[i])); BBox2i tile_bbox = intersect - bbox.min(); // ROI of this input in the output tile // TODO: Clean up AffineTransform* temp = dynamic_cast<AffineTransform*>(m_transforms[i].get()); // --> Requires loading a larger section of the input image, // calling grassfire on it, and then extracting out the section we need. /// This sets the extra area we work with to improve the blending weights. BBox2i expanded_intersect = intersect; expanded_intersect.expand(m_blend_radius); // Get the cropped piece of the transformed input image that we need ImageView<T> trans_input = crop(transform(m_images[i], *temp, ZeroEdgeExtension(), BilinearInterpolation()), expanded_intersect); ImageView<double> input_weights; // = grassfire(notnodata(apply_mask(trans_input,0), 0)); bool fill_holes = false; // Don't fill holes bool min_weights = true; // This option works better with the applied cutoffs centerline_weights(trans_input, input_weights, BBox2i(), fill_holes, min_weights); double dist = std::min(intersect.height(), intersect.width()) / 2.0; double denom = dist + m_blend_radius; double cutoff = (m_blend_radius/denom);//*(dist/denom); for (int r=0; r<input_weights.rows(); ++r) { for (int c=0; c<input_weights.cols(); ++c) { if (input_weights(c,r) > cutoff) input_weights(c,r) = cutoff; } } // Copy that piece to the output tile, applying the mask. for (int r=0; r<intersect.height(); ++r) { for (int c=0; c<intersect.width(); ++c) { double weight = input_weights(c+m_blend_radius,r+m_blend_radius); //if (weight > cutoff) // weight = cutoff; T pixel = trans_input(c+m_blend_radius,r+m_blend_radius); if (is_valid(pixel)) { float value = remove_mask(pixel); int o_c = c+tile_bbox.min()[0]; int o_r = r+tile_bbox.min()[1]; if (weights(o_c, o_r) == 0) tile(o_c, o_r) = value * weight; else tile(o_c, o_r) += value * weight; weights(o_c, o_r) += weight; } } } // End loop through tile intersection } // End loop through input images //std::string fix = "_"+num2str(bbox.min()[0])+"_"+num2str(bbox.min()[1])+".tif"; //write_image("tile"+fix, tile); //write_image("tile_weights"+fix, weights); // Normalize output by the weight. for (int c = 0; c < bbox.width(); c++){ for (int r = 0; r < bbox.height(); r++){ if ( weights(c, r) > 0 ) tile(c, r) /= weights(c, r); } // End row loop } // End col loop //write_image("tile_norm"+fix, tile); return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows() ); } // End function prerasterize template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class ImageMosaicView // Write the image out, converting to the specified data type. void write_selected_image_type(ImageViewRef<float> const& out_img, double output_nodata_value, Options & opt) { // Set up our output image object TerminalProgressCallback tpc("asp", "\t Mosaic:"); // Since we blend large portions, it is convenient to use large // tiles upon writing. Yet, those are hard to process later, for // example, by stereo_gui. So, later we will rewrite the tiles // with smaller blocks. int min_tile_size = 2*opt.blend_radius; min_tile_size = std::max(opt.raster_tile_size[0], min_tile_size); min_tile_size = std::max(opt.raster_tile_size[1], min_tile_size); fix_tile_multiple(min_tile_size); vw_out() << "Using temporary block size: " << min_tile_size << std::endl; bool has_georef = false; bool has_nodata = true; vw::cartography::GeoReference georef; boost::algorithm::to_lower(opt.output_type); // Write to disk using the specified output data type. if (opt.output_type == "float32") asp::saveWithTempBigBlocks(min_tile_size, opt.output_image, out_img, has_georef, georef, has_nodata, output_nodata_value, opt, tpc); else if (opt.output_type == "byte") asp::saveWithTempBigBlocks(min_tile_size, opt.output_image, per_pixel_filter(out_img, RoundAndClamp<uint8, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<uint8>(output_nodata_value), opt, tpc); else if (opt.output_type == "uint16") asp::saveWithTempBigBlocks(min_tile_size, opt.output_image, per_pixel_filter(out_img, RoundAndClamp<uint16, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<uint16>(output_nodata_value), opt, tpc); else if (opt.output_type == "int16") asp::saveWithTempBigBlocks(min_tile_size, opt.output_image, per_pixel_filter(out_img, RoundAndClamp<int16, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<int16>(output_nodata_value), opt, tpc); else if (opt.output_type == "uint32") asp::saveWithTempBigBlocks(min_tile_size, opt.output_image, per_pixel_filter(out_img, RoundAndClamp<uint32, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<uint32>(output_nodata_value), opt, tpc); else if (opt.output_type == "int32") asp::saveWithTempBigBlocks(min_tile_size, opt.output_image, per_pixel_filter(out_img, RoundAndClamp<int32, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<int32>(output_nodata_value), opt, tpc); else vw_throw( NoImplErr() << "Unsupported output type: " << opt.output_type << ".\n" ); } // End function write_selected_image_type void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); // Add the reverse option general_options.add( vw::GdalWriteOptionsDescription(opt) ); general_options.add_options() ("orientation", po::value(&opt.orientation)->default_value("horizontal"), "Choose a supported image layout from [horizontal].") ("reverse", po::bool_switch(&opt.reverse)->default_value(false), "Mosaic the images in reverse order.") ("rotate", po::bool_switch(&opt.rotate)->default_value(false), "After mosaicking, rotate the image by 180 degrees around its center.") ("rotate-90", po::bool_switch(&opt.rotate90)->default_value(false), "After mosaicking, rotate the image by 90 degrees clockwise around its center.") ("rotate-90-ccw", po::bool_switch(&opt.rotate90ccw)->default_value(false), "After mosaicking, rotate the image by 90 degrees counter-clockwise around its center.") ("use-affine-transform", po::bool_switch(&opt.use_affine_transform)->default_value(false), "Solve for full affine transforms between segments instead of a simpler rotate+translate transform.") ("overlap-width", po::value(&opt.overlap_width)->default_value(2000), "Select the size of the overlap region to use.") ("blend-radius", po::value(&opt.blend_radius)->default_value(0), "Size to perform blending over. Default is the overlap width.") ("output-image,o", po::value(&opt.output_image)->default_value(""), "Specify the output image.") ("ip-per-tile", po::value(&opt.ip_per_tile)->default_value(0), "How many interest points to detect in each 1024^2 image tile (default: automatic determination).") ("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.") ("band", po::value(&opt.band)->default_value(1), "Which band (channel) to use (for multi-spectral images). The band count starts from 1.") ("input-nodata-value", po::value(&opt.input_nodata_value), "Nodata value to use on input; input pixel values less than or equal to this are considered invalid.") ("output-nodata-value", po::value(&opt.output_nodata_value), "Nodata value to use on output.") ("output-prefix", po::value(&opt.out_prefix)->default_value(""), "If specified, save here the interest point matches used in mosaicking.") ("num-ransac-iterations", po::value(&opt.num_ransac_iterations)->default_value(1000), "How many iterations to perform in RANSAC when finding interest point matches.") ("inlier-threshold", po::value(&opt.inlier_threshold)->default_value(10.0), "The inlier threshold (in pixels) to separate inliers from outliers when computing " "interest point matches. A smaller threshold will result in fewer inliers."); po::options_description positional(""); positional.add_options() ("input-files", po::value(&opt.image_files)); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("image_mosaic <images> [options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); opt.has_input_nodata_value = vm.count("input-nodata-value" ); opt.has_output_nodata_value = vm.count("output-nodata-value"); if ( opt.image_files.empty() ) vw_throw( ArgumentErr() << "No images to mosaic.\n" << usage << general_options ); if ( opt.output_image.empty() ) vw_throw( ArgumentErr() << "Missing output image name.\n" << usage << general_options ); if ( opt.blend_radius == 0 ) { opt.blend_radius = opt.overlap_width; vw_out() << "Using blend radius: " << opt.blend_radius << std::endl; } int check = 0; // Count the number of rotate options specified. if (opt.rotate ) ++check; if (opt.rotate90 ) ++check; if (opt.rotate90ccw) ++check; if (check > 1) vw_throw( ArgumentErr() << "Cannot specify more than one rotate option.\n" << usage << general_options ); // Reverse the order of files if (opt.reverse) { size_t len = opt.image_files.size(); for (size_t it = 0; it < len; it++) { size_t it2 = len-1-it; if (it < it2) std::swap(opt.image_files[it], opt.image_files[it2]); } } // Create the output directory vw::create_out_dir(opt.output_image); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.output_image); } int main( int argc, char *argv[] ) { Options opt; try { // Find command line options handle_arguments( argc, argv, opt ); // Compute the transforms between all of the images on disk std::vector<boost::shared_ptr<vw::Transform> > transforms; std::vector<BBox2i> bboxes; Vector2i output_image_size; compute_all_image_positions(opt, transforms, bboxes, output_image_size); // Get handles to all of the input images. size_t num_images = opt.image_files.size(); std::vector<ImageViewRef<PixelMask<float>>> images(num_images); double nodata = -std::numeric_limits<float>::max(); for (size_t i = 0; i < num_images; i++) { // Apply a nodata mask here ImageViewRef<float> temp; get_input_image(opt.image_files[i], opt, temp, nodata); images[i] = create_mask(temp, nodata); } // If nodata was not provided, take one from the input images. double output_nodata_value = nodata; if (opt.has_output_nodata_value) output_nodata_value = opt.output_nodata_value; // Set up our output image object vw_out() << "Writing: " << opt.output_image << std::endl; TerminalProgressCallback tpc("asp", "\t Mosaic:"); ImageViewRef<float> out_img = ImageMosaicView<PixelMask<float>>(images, transforms, bboxes, opt.blend_radius, output_image_size, opt.output_nodata_value); if (opt.rotate) //write_selected_image_type(ImageRotateView<float>(out_img), opt.output_nodata_value, opt); write_selected_image_type(vw::rotate_180(out_img), opt.output_nodata_value, opt); else if (opt.rotate90) write_selected_image_type(vw::rotate_90_cw(out_img), opt.output_nodata_value, opt); else if (opt.rotate90ccw) write_selected_image_type(vw::rotate_90_ccw(out_img), opt.output_nodata_value, opt); else write_selected_image_type(out_img, opt.output_nodata_value, opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/image_subset.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Given a set of overlapping georeferenced images, find a small // subset with almost the same coverage. This is used in SfS. #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/Macros.h> #include <asp/Core/FileUtils.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Core/Stopwatch.h> #include <vw/FileIO/FileUtils.h> #include <omp.h> #include <vector> #include <string> #include <iostream> #include <limits> #include <boost/filesystem.hpp> #include <boost/program_options.hpp> namespace fs = boost::filesystem; namespace po = boost::program_options; struct Options : public vw::GdalWriteOptions { std::string image_list_file, out_list; double threshold; vw::BBox2 target_projwin; }; void handle_arguments(int argc, char *argv[], Options& opt) { double nan = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options(""); general_options.add_options() ("image-list", po::value(&opt.image_list_file)->default_value(""), "The list of input images.") ("output-list,o", po::value(&opt.out_list)->default_value(""), "The file having the produced image subset, and for each image the number " "of contributing pixels (sorted in decreasing order of contribution).") ("threshold", po::value(&opt.threshold)->default_value(nan), "The image threshold. Pixels no less than this will contribute to the coverage.") ("t_projwin", po::value(&opt.target_projwin)->default_value(vw::BBox2(), "0 0 0 0"), "Specify a custom extent in projected coordinates in which to evaluate the coverage. " "The format is min_x min_y max_x max_y or min_x max_y max_x min_y, with no quotes. " "In this mode all input images must use the same projection.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Validate inputs if (opt.image_list_file == "") vw::vw_throw(vw::ArgumentErr() << "Missing image list.\n"); if (opt.out_list == "") vw::vw_throw(vw::ArgumentErr() << "Missing output list.\n"); if (std::isnan(opt.threshold)) vw::vw_throw(vw::ArgumentErr() << "The threshold must be set.\n"); // For compatibility with GDAL, we allow the proj win y coordinate to be flipped. // Correct that here. if (opt.target_projwin != vw::BBox2()) { if (opt.target_projwin.min().y() > opt.target_projwin.max().y()) std::swap(opt.target_projwin.min().y(), opt.target_projwin.max().y()); vw::vw_out() << "The overlap analysis restricted to projection box: " << opt.target_projwin << ".\n"; } // Create the output directory vw::create_out_dir(opt.out_list); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_list); return; } // Calc the score of adding a new image. Apply the new image pixels to the output image if // requested. double calc_score_apply(Options const& opt, std::string const& image_file, double threshold, bool apply, vw::cartography::GeoReference const& out_georef, // Output vw::ImageView<vw::PixelMask<float>> & out_img) { // Read the image vw::DiskImageResourceGDAL in_rsrc(image_file); // Read the georef vw::cartography::GeoReference georef; bool is_good = read_georeference(georef, in_rsrc); if (!is_good) vw::vw_throw(vw::ArgumentErr() << "No georeference found in " << image_file << ".\n"); // Read the no-data double nodata = -std::numeric_limits<float>::max(); if (in_rsrc.has_nodata_read()) nodata = in_rsrc.nodata_read(); // Read the image in memory (for speed) and mask the no-data vw::ImageView<vw::PixelMask<float>> img = create_mask(vw::DiskImageView<float>(in_rsrc), nodata); // Bounds of the output and input images vw::BBox2 out_box = vw::bounding_box(out_img); vw::BBox2 img_box = vw::bounding_box(img); // Form the geo transform from the output to the input image vw::cartography::GeoTransform geotrans(out_georef, georef, out_box, img_box); // Find the current image bounding box in the output image coordinates vw::BBox2 trans_box = geotrans.reverse_bbox(vw::bounding_box(img)); // See if to crop to an area if (opt.target_projwin != vw::BBox2()) { vw::BBox2 proj_pix_box = out_georef.point_to_pixel_bbox(opt.target_projwin); trans_box.crop(proj_pix_box); } // Grow to int trans_box = vw::grow_bbox_to_int(trans_box); // trans_box must be contained within out_box, as out_box is a union of such // boxes. As a precaution, do a crop however, in case numerical issues are // encountered. trans_box.crop(out_box); // Prepare the image for interpolation vw::PixelMask<float> no_data; no_data.invalidate(); typedef vw::ValueEdgeExtension<vw::PixelMask<float>> NoDataType; NoDataType no_data_ext(no_data); vw::InterpolationView<vw::EdgeExtensionView<vw::ImageView<vw::PixelMask<float>>, NoDataType>, vw::BilinearInterpolation> interp_img = interpolate(img, vw::BilinearInterpolation(), no_data_ext); // Iterate over the transformed box and calculate the score or apply the // image. Extract bounds to integer variables to satisfy OpenMP canonical form. int beg_col = trans_box.min().x(); int end_col = trans_box.max().x(); int beg_row = trans_box.min().y(); int end_row = trans_box.max().y(); double score = 0.0; // Use reduction(+:score) to handle the sum efficiently without locking #pragma omp parallel for num_threads(opt.num_threads) reduction(+:score) for (int col = beg_col; col < end_col; col++) { for (int row = beg_row; row < end_row; row++) { vw::Vector2 out_pix(col, row); // If already above threshold, skip vw::PixelMask<float> out_val = out_img(col, row); if (is_valid(out_val) && out_val.child() >= threshold) continue; // Interpolated pixel vw::Vector2 img_pix = geotrans.forward(out_pix); vw::PixelMask<float> val = interp_img(img_pix.x(), img_pix.y()); // If not above threshold, it does not add to the score if (!is_valid(val) || val.child() < threshold) continue; // No need for critical section; reduction handles this safely and fast score += 1.0; if (apply) out_img(col, row) = val; } } return score; } void run_image_subset(Options const& opt) { vw::vw_out() << "Reading: " << opt.image_list_file << "\n"; std::vector<std::string> image_files; asp::read_list(opt.image_list_file, image_files); vw::vw_out() << "Reading input georeferences.\n"; vw::cartography::GeoReference out_georef; // Loop through all input images int num_images = image_files.size(); vw::BBox2 out_box; for (int image_iter = 0; image_iter < num_images; image_iter++) { std::string image_file = image_files[image_iter]; vw::DiskImageResourceGDAL in_rsrc(image_file); vw::DiskImageView<float> img(in_rsrc); vw::cartography::GeoReference georef; bool is_good = read_georeference(georef, in_rsrc); if (!is_good) vw::vw_throw(vw::ArgumentErr() << "No georeference found in " << image_file << ".\n"); // Input image bounding box vw::BBox2 img_box = vw::bounding_box(img); // Borrow the geo info from the first image if (image_iter == 0) { out_georef = georef; out_box = img_box; } if (opt.target_projwin != vw::BBox2() && georef.get_wkt() != out_georef.get_wkt()) vw::vw_throw(vw::ArgumentErr() << "All images must have the same projection with the " << "--t_projwin option.\n"); // The georef transform from current to output image vw::cartography::GeoTransform geotrans(out_georef, georef, out_box, img_box); // Convert the bounding box of current image to output pixel coordinates vw::BBox2 trans_img_box = geotrans.reverse_bbox(img_box); // See if to crop to an area if (opt.target_projwin != vw::BBox2()) { vw::BBox2 proj_pix_box = out_georef.point_to_pixel_bbox(opt.target_projwin); trans_img_box.crop(proj_pix_box); } // Grow to int trans_img_box = vw::grow_bbox_to_int(trans_img_box); out_box.grow(trans_img_box); } // End loop through DEM files // grow this to int out_box = vw::grow_bbox_to_int(out_box); // The box must be non-empty if (out_box.empty()) vw::vw_throw(vw::ArgumentErr() << "The region of interest is empty.\n"); // Crop the georef to the output box. Adjust the box. out_georef = crop(out_georef, out_box); out_box.max() -= out_box.min(); out_box.min() = vw::Vector2(0, 0); // Create the output image as a pixel mask, with all pixels being float and invalid vw::ImageView<vw::PixelMask<float>> out_img(out_box.width(), out_box.height()); // invalidate all pixels for (int col = 0; col < out_img.cols(); col++) { for (int row = 0; row < out_img.rows(); row++) { out_img(col, row).invalidate(); } } // Now process the images vw::vw_out() << "Processing the images.\n"; vw::Stopwatch sw; sw.start(); vw::TerminalProgressCallback tpc("", "\t--> "); tpc.report_progress(0); double inc_amount = 2.0 / (double(num_images) * double(num_images)); // The no-data score is lower than any possible score double nodata_inspected_score = -std::numeric_limits<float>::max(); // Do as many passes as images std::map<std::string, double> inspected; for (int pass = 0; pass < num_images; pass++) { // Skip inspected images if (inspected.find(image_files[pass]) != inspected.end()) continue; double best_score = 0; int best_index = 0; // Inner iteration over all images. Skip the inspected ones. for (int inner = 0; inner < num_images; inner++) { if (inspected.find(image_files[inner]) != inspected.end()) continue; tpc.report_incremental_progress(inc_amount); bool apply = false; double score = calc_score_apply(opt, image_files[inner], opt.threshold, apply, out_georef, out_img); // If the image being inspected now adds nothing, it won't add anything // after we add other images either. So do not look at it again. if (score == 0.0) { inspected[image_files[inner]] = nodata_inspected_score; continue; } // Update the best score if (score > best_score) { best_score = score; best_index = inner; } } // If the score is 0, we are done, as more passes won't help if (best_score == 0.0) { break; } // Add the contribution of the best image bool apply = true; calc_score_apply(opt, image_files[best_index], opt.threshold, apply, out_georef, out_img); // Flag the current image as inspected and store its score inspected[image_files[best_index]] = best_score; } tpc.report_finished(); sw.stop(); vw::vw_out() << "Elapsed time: " << sw.elapsed_seconds() << " s.\n"; // Save in decreasing order of score std::vector<std::pair<double, std::string>> sorted; for (auto const& p: inspected) sorted.push_back(std::make_pair(p.second, p.first)); std::sort(sorted.begin(), sorted.end()); vw::vw_out() << "Writing: " << opt.out_list << "\n"; std::ofstream ofs(opt.out_list.c_str()); for (int i = int(sorted.size()) - 1; i >= 0; i--) { // Skip images with nodata score if (sorted[i].first == nodata_inspected_score) continue; ofs << sorted[i].second << " " << sorted[i].first << "\n"; } ofs.close(); } // End function run_image_subset() int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); run_image_subset(opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/jitter_solve.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file jitter_adjust.cc /// /// Use n adjustments for every camera, placed at several lines in the image // with interpolation between them. The pdf doc has more info. // TODO(oalexan1): Move some UsgsAstroLsSensorModel functions from // here and from LinescanDGModel.cc to CsmUtils.cc. // TODO(oalexan1): Why jitter_solve does not use all threads? #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Camera/CsmModel.h> #include <asp/Camera/CsmUtils.h> #include <asp/Camera/BundleAdjustCamera.h> #include <asp/Camera/BundleAdjustOutliers.h> #include <asp/Camera/BundleAdjustIsis.h> #include <asp/Camera/JitterSolveCostFuns.h> #include <asp/Camera/JitterSolveUtils.h> #include <asp/Rig/RigConfig.h> #include <asp/Camera/JitterSolveRigUtils.h> #include <asp/Camera/LinescanUtils.h> #include <asp/Camera/BundleAdjustResiduals.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/BaseCameraUtils.h> #include <asp/Core/BundleAdjustUtils.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/CameraTransforms.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/PointUtils.h> #include <asp/Core/FileUtils.h> #include <asp/Core/Nvm.h> #include <asp/Core/Bathymetry.h> #include <vw/BundleAdjustment/ControlNetwork.h> #include <vw/Image/ImageChannels.h> #include <vw/BundleAdjustment/ControlNetworkLoader.h> #include <vw/Core/Stopwatch.h> #include <vw/Cartography/CameraBBox.h> #include <vw/Cartography/GeoReferenceBaseUtils.h> #include <vw/Camera/CameraImage.h> #include <vw/Cartography/DatumUtils.h> #include <vw/FileIO/FileTypes.h> #include <vw/FileIO/FileUtils.h> #include <usgscsm/UsgsAstroLsSensorModel.h> #include <usgscsm/UsgsAstroFrameSensorModel.h> #include <usgscsm/Utilities.h> #include <xercesc/util/PlatformUtils.hpp> #include <set> namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw; using namespace vw::math; namespace asp { struct Options: public asp::BaBaseOptions { int num_lines_per_position, num_lines_per_orientation, num_anchor_points_per_image, num_anchor_points_per_tile; std::string anchor_weight_image; std::string anchor_dem, rig_config; int num_anchor_points_extra_lines; bool initial_camera_constraint, fix_rig_translations, fix_rig_rotations, use_initial_rig_transforms; double quat_norm_weight, anchor_weight, roll_weight, yaw_weight, smoothness_weight; std::map<int, int> cam2group; }; void handle_arguments(int argc, char *argv[], Options& opt, rig::RigSet & rig) { po::options_description general_options(""); general_options.add_options() ("output-prefix,o", po::value(&opt.out_prefix), "Prefix for output filenames.") ("session-type,t", po::value(&opt.stereo_session)->default_value(""), "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.") ("input-adjustments-prefix", po::value(&opt.input_prefix), "Prefix to read initial adjustments from, written by bundle_adjust. " "Not required. Cameras in .json files in ISD or model state format " "can be passed in with no adjustments.") ("num-lines-per-position", po::value(&opt.num_lines_per_position)->default_value(-1), "Resample the input camera positions and velocities, using this many lines per " "produced position and velocity. If not set, use the positions and velocities " "from the CSM file as they are.") ("num-lines-per-orientation", po::value(&opt.num_lines_per_orientation)->default_value(-1), "Resample the input camera orientations, using this many lines per produced " "orientation. If not set, use the orientations from the CSM file as they are.") ("match-first-to-last", po::bool_switch(&opt.match_first_to_last)->default_value(false)->implicit_value(true), "Match first several images to last several images by extending the logic of " "--overlap-limit past the last image to the earliest ones.") ("overlap-limit", po::value(&opt.overlap_limit)->default_value(0), "Limit the number of subsequent images to search for matches to the current image " "to this value. By default match all images.") ("match-files-prefix", po::value(&opt.match_files_prefix)->default_value(""), "Use the match files from this prefix. The order of images in each interest point " "match file need not be the same as for input images.") ("clean-match-files-prefix", po::value(&opt.clean_match_files_prefix)->default_value(""), "Use as input match files the *-clean.match files from this prefix. The order of " "images in each interest point match file need not be the same as for input images.") ("matches-as-txt", po::bool_switch(&asp::stereo_settings().matches_as_txt)->default_value(false)->implicit_value(true), "Read and write match files as plain text instead of binary. See the documentation " "for details.") ("isis-cnet", po::value(&opt.isis_cnet)->default_value(""), "Read a control network having interest point matches from this binary file " "in the ISIS jigsaw format. This can be used with any images and cameras " "supported by ASP.") ("nvm", po::value(&opt.nvm)->default_value(""), "Read a control network having interest point matches from this file in the NVM " "format. This can be used with any images and cameras supported by ASP.") ("min-matches", po::value(&opt.min_matches)->default_value(30), "Set the minimum number of matches between images that will be considered.") ("max-pairwise-matches", po::value(&opt.max_pairwise_matches)->default_value(10000), "Reduce the number of matches per pair of images to at most this " "number, by selecting a random subset, if needed. This happens " "when setting up the optimization, and before outlier filtering. " "Set to 0 to load no matches (use with GCP only).") ("min-triangulation-angle", po::value(&opt.min_triangulation_angle)->default_value(0.1), "The minimum angle, in degrees, at which rays must meet at a triangulated point to " "accept this point as valid. It must be a positive value.") ("max-initial-reprojection-error", po::value(&opt.max_init_reproj_error)->default_value(20), "Filter as outliers any triangulated points that have a reprojection error " "(in pixels) of more than this value, with the initial cameras. Since jitter " "corrections are supposed to be small and cameras bundle-adjusted by now, " "this value need not be too big. Does not apply to GCP.") ("max-gcp-reproj-err", po::value(&opt.max_gcp_reproj_err)->default_value(-1.0), "If positive, after each pass remove GCPs whose mean reprojection error " "(averaged over all cameras seeing that point) is more than this, in pixels.") ("robust-threshold", po::value(&opt.robust_threshold)->default_value(0.5), "Set the threshold for the Cauchy robust cost function. Increasing this makes " "the solver focus harder on the larger errors.") ("image-list", po::value(&opt.image_list)->default_value(""), "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.") ("camera-list", po::value(&opt.camera_list)->default_value(""), "A file containing the list of cameras, when they are too many to specify on " "the command line. If the images have embedded camera information, such as for ISIS, " "this file may be omitted, or specify the image names instead of camera names.") ("parameter-tolerance", po::value(&opt.parameter_tolerance)->default_value(1e-12), "Stop when the relative error in the variables being optimized is less than this.") ("num-iterations", po::value(&opt.num_iterations)->default_value(500), "Set the maximum number of iterations.") ("tri-weight", po::value(&opt.tri_weight)->default_value(0.1), "The weight to give to the constraint that optimized triangulated points stay " "close to original triangulated points. A positive value will help ensure the " "cameras do not move too far, but a large value may prevent convergence. It is " "suggested to use here 0.1 to 0.5. This will be divided by ground sample distance " "(GSD) to convert this constraint to pixel units, since the reprojection errors " "are in pixels. See also --tri-robust-threshold. Does not apply to GCP or points " "constrained by a DEM.") ("tri-robust-threshold", po::value(&opt.tri_robust_threshold)->default_value(0.1), "The robust threshold to attenuate large differences between initial and " "optimized triangulation points, after multiplying them by --tri-weight and " "dividing by GSD. This is less than --robust-threshold, as the primary goal " "is to reduce pixel reprojection errors, even if that results in big differences " "in the triangulated points. It is suggested to not modify this value, " "and adjust instead --tri-weight.") ("heights-from-dem", po::value(&opt.heights_from_dem)->default_value(""), "Assuming the cameras have already been bundle-adjusted and aligned to a " "known DEM, constrain the triangulated points to be close to this DEM. See also " "--heights-from-dem-uncertainty.") ("heights-from-dem-uncertainty", po::value(&opt.heights_from_dem_uncertainty)->default_value(-1.0), "The DEM uncertainty (1 sigma, in meters). Must be positive. A smaller value " "constrains more the triangulated points to the DEM specified via --heights-from-dem.") ("heights-from-dem-robust-threshold", po::value(&opt.heights_from_dem_robust_threshold)->default_value(0.1), "The robust threshold to use to keep the triangulated points close to the DEM if " "specified via --heights-from-dem. This is applied after the point differences " "are divided by --heights-from-dem-uncertainty. It will attenuate large height " "difference outliers. It is suggested to not modify this value, and adjust instead " "--heights-from-dem-uncertainty.") ("num-anchor-points", po::value(&opt.num_anchor_points_per_image)->default_value(0), "How many anchor points to create per image. They will be uniformly distributed.") ("num-anchor-points-per-tile", po::value(&opt.num_anchor_points_per_tile)->default_value(0), "How many anchor points to create per 1024 x 1024 image tile. They will be uniformly " "distributed. Useful when images of vastly different sizes (such as frame and " "linescan) are used together.") ("anchor-weight", po::value(&opt.anchor_weight)->default_value(0.0), "How much weight to give to each anchor point. Anchor points are " "obtained by intersecting rays from initial cameras with the DEM given by " "--heights-from-dem. A larger weight will make it harder for " "the cameras to move, hence preventing unreasonable changes. " "Set also --anchor-weight and --anchor-dem.") ("anchor-dem", po::value(&opt.anchor_dem)->default_value(""), "Use this DEM to create anchor points.") ("num-anchor-points-extra-lines", po::value(&opt.num_anchor_points_extra_lines)->default_value(0), "Start placing anchor points this many lines before first image line " "and after last image line. Applies only to linescan cameras.") ("camera-position-uncertainty", po::value(&opt.camera_position_uncertainty_str)->default_value(""), "A file having on each line the image name and the horizontal and vertical camera " "position uncertainty (1 sigma, in meters). This strongly constrains the movement of " "cameras, potentially at the expense of accuracy. To have the same uncertainties for " "all cameras, pass instead of a file name two values separated by a comma (no " "spaces).") ("camera-position-uncertainty-power", po::value(&opt.camera_position_uncertainty_power)->default_value(2.0), "A higher value makes the cost function rise more steeply when " "--camera-position-uncertainty is close to being violated. This is an advanced " "option. The default should be good enough.") ("camera-position-weight", po::value(&opt.camera_position_weight)->default_value(0.0), "A soft constraint to keep the camera positions close to the original values. " "It is meant to prevent a wholesale shift of the cameras. It can impede " "the reduction in reprojection errors. It adjusts to the ground sample distance " "and the number of interest points in the images. The computed " "discrepancy is attenuated with --camera-position-robust-threshold.") ("camera-position-robust-threshold", po::value(&opt.camera_position_robust_threshold)->default_value(0.1), "The robust threshold to attenuate large discrepancies between initial and " "optimized camera positions with the option --camera-position-weight. " "This is less than --robust-threshold, as the primary goal " "is to reduce pixel reprojection errors, even if that results in big differences " "in the camera positions. It is suggested to not modify this value, " "and adjust instead --camera-position-weight.") ("reference-terrain", po::value(&opt.reference_terrain)->default_value(""), "An externally provided trustworthy reference terrain to use as a constraint. It can " "be either a DEM or a point cloud in CSV format. It must be well-aligned with the " "input cameras.") ("max-num-reference-points", po::value(&opt.max_num_reference_points)->default_value(50000), "Maximum number of (randomly picked) points from the --reference-terrain dataset.") ("stereo-prefix-list", po::value(&opt.stereo_prefix_list)->default_value(""), "List of stereo prefixes (one per line) having disparities for the " "--reference-terrain option.") ("reference-terrain-uncertainty", po::value(&opt.reference_terrain_uncertainty)->default_value(1.0), "The uncertainty (1 sigma, in meters), for the dataset in --reference-terrain. " "A smaller value will result in a stronger constraint. It is suggested to not " "not make this too small as it may prevent convergence.") ("reference-terrain-robust-threshold", po::value(&opt.reference_terrain_robust_threshold)->default_value(0.1), "The robust threshold, in pixels, for the option --reference-terrain. It is suggested " "to not modify this value, and adjust instead --reference-terrain-uncertainty.") ("csv-format", po::value(&opt.csv_format_str)->default_value(""), asp::csv_opt_caption().c_str()) ("csv-srs", po::value(&opt.csv_srs)->default_value(""), "The PROJ or WKT string for interpreting the entries in input CSV files.") ("rotation-weight", po::value(&opt.rotation_weight)->default_value(0.0), "A higher weight will penalize more deviations from the original camera " "orientations. This is not recommended. Use instead ground constraints and " "--camera-position-uncertainty.") ("mapproj-dem", po::value(&opt.mapproj_dem)->default_value(""), "If specified, mapproject every pair of matched interest points onto this DEM " "and compute their distance, then percentiles of such distances for each image " "vs the rest and each image pair. This is done after bundle adjustment " "and outlier removal. Measured in meters.") ("ip-side-filter-percent", po::value(&opt.ip_edge_buffer_percent)->default_value(-1.0), "Remove matched IPs this percentage from the image left/right sides.") ("forced-triangulation-distance", po::value(&opt.forced_triangulation_distance)->default_value(-1), "When triangulation fails, for example, when input cameras are inaccurate, " "artificially create a triangulation point this far ahead of the camera, in units " "of meter.") ("update-isis-cubes-with-csm-state", po::bool_switch(&opt.update_isis_cubes_with_csm_state)->default_value(false)->implicit_value(true), "Save the model state of optimized CSM cameras as part of the .cub files. Any prior " "version and any SPICE data will be deleted. Mapprojected images obtained with prior " "version of the cameras must no longer be used in stereo.") ("num-passes", po::value(&opt.num_passes)->default_value(2), "How many passes of jitter solving to do, with given number of iterations in each " "pass.") ("rig-config", po::value(&opt.rig_config)->default_value(""), "Assume that the cameras are acquired with a set of rigs with this configuration " "file. The intrinsics will be read, but not the transforms between sensors, as those " "will be auto-computed (unless --use-initial-rig-transforms is set). The optimized " "rig, including the sensor transforms, will be saved.") ("fix-rig-translations", po::bool_switch(&opt.fix_rig_translations)->default_value(false)->implicit_value(true), "Fix the translation component of the transforms between the sensors on a " "rig.") ("fix-rig-rotations", po::bool_switch(&opt.fix_rig_rotations)->default_value(false)->implicit_value(true), "Fix the rotation component of the transforms between the sensors on a " "rig.") ("use-initial-rig-transforms", po::bool_switch(&opt.use_initial_rig_transforms)->default_value(false)->implicit_value(true), "Use the transforms between the sensors (ref_to_sensor_transform) of the rig " "given by --rig-config, instead of computing them from the poses of individual " "cameras.") ("quat-norm-weight", po::value(&opt.quat_norm_weight)->default_value(1.0), "How much weight to give to the constraint that the norm of each quaternion must be 1.") ("weight-image", po::value(&opt.weight_image)->default_value(""), "Given a georeferenced image with float values, for each initial triangulated " "point find its location in the image and closest pixel value. Multiply the " "reprojection errors in the cameras for this point by this weight value. The solver " "will focus more on optimizing points with a higher weight. Points that fall " "outside the image and weights that are non-positive, NaN, or equal to nodata " "will be ignored.") ("anchor-weight-image", po::value(&opt.anchor_weight_image)->default_value(""), "Weight image for anchor points. Limits where anchor points are placed and their " "weight. These weights are additionally multiplied by --anchor-weight. See also " "--weight-image.") ("roll-weight", po::value(&opt.roll_weight)->default_value(0.0), "A weight to penalize the deviation of camera roll orientation as measured from the " "along-track direction. Pass in a large value, such as 1e+5. This is best used only " "with linescan cameras created with sat_sim. With non-synthetic cameras, add the " "--initial-camera-constraint option. Use with --camera-position-weight 1e+6 or so, to " "tightly constrain the camera positions.") ("yaw-weight", po::value(&opt.yaw_weight)->default_value(0.0), "A weight to penalize the deviation of camera yaw orientation as measured from the " "along-track direction. Pass in a large value, such as 1e+5. This is best used only " "with linescan cameras created with sat_sim. With non-synthetic cameras, add the " "--initial-camera-constraint option. Use with --camera-position-weight 1e+6 or so, to " "tightly constrain the camera positions.") ("smoothness-weight", po::value(&opt.smoothness_weight)->default_value(0.0), "A weight to penalize high-frequency changes in the sequence of orientations " "in the linescan cameras being optimized. This is internally adjusted based " "on the initial curvature of the sequence of orientations. A value of 0.01 " "to 0.1 is recommended. This may impede convergence if high. Use with " "--camera-position-weight 1e+6 or so, to tightly constrain the camera positions.") ("initial-camera-constraint", po::bool_switch(&opt.initial_camera_constraint)->default_value(false), "When constraining roll and yaw, measure these not in the satellite along-track/ " "across-track/down coordinate system, but relative to the initial camera poses. This " "is experimental. Internally, the roll weight will then be applied to the camera " "pitch angle (rotation around the camera y axis), because the camera coordinate " "system is rotated by 90 degrees in the sensor plane relative to the satellite " "coordinate system. The goal is the same, to penalize deviations that are not " "aligned with satellite pitch.") ("fix-gcp-xyz", po::bool_switch(&opt.fix_gcp_xyz)->default_value(false)->implicit_value(true), "If the GCP are highly accurate, use this option to not float them during the optimization.") ("use-lon-lat-height-gcp-error", po::bool_switch(&opt.use_llh_error)->default_value(false)->implicit_value(true), "Constrain the triangulated points tied to GCP in the longitude, latitude, and height " "space, instead of ECEF. The standard deviations in the GCP file are applied " "accordingly.") ("accept-provided-mapproj-dem", po::bool_switch(&asp::stereo_settings().accept_provided_mapproj_dem)->default_value(false)->implicit_value(true), "Accept the DEM provided on the command line as the one mapprojection was done with, " "even if it disagrees with the DEM recorded in the geoheaders of input images.") // For bathymetry correction ("bathy-mask-list", po::value(&asp::stereo_settings().bathy_mask_list)->default_value(""), "List of masks to use for bathymetry. Must be one per input image and 1-to-1 with " "the images. Pixels classified as water must have non-positive value or be no-data " "in the mask, while land pixels must have positive value. This is preliminary work. " "This program does not yet model bathymetry.") ("bathy-plane", po::value(&asp::stereo_settings().bathy_plane), "Path to a file containing a plane approximating the water surface, for " "bathymetry correction with underwater terrain. This corrects camera rays passing " "through water using Snell's law. If multiple images are used and they have " "different water surfaces use --bathy-plane-list. Use together with " "--refraction-index. See also --bathy-mask-list.") ("bathy-plane-list", po::value(&asp::stereo_settings().bathy_plane_list)->default_value(""), "Path to a file containing a list of bathy plane files for bathymetry correction, " "if more than one. Set one plane file per line. Must specify one plane per input " "image, in the same order. Use with --bathy-mask-list and --refraction-index.") ("refraction-index", po::value(&asp::stereo_settings().refraction_index)->default_value(0), "The index of refraction of water to be used in bathymetry correction. " "Must be specified and bigger than 1. This index can be computed with " "the refr_index program.") ("save-cnet-as-gcp", po::bool_switch(&opt.save_cnet_as_gcp)->default_value(false)->implicit_value(true), "Save the optimized control network, after outlier filtering, in the " "format used by ground control points (GCP), including any input GCP. " "The xyz sigma is 1 meter for regular non-GCP triangulated points and the " "value of --heights-from-dem-uncertainty for DEM-constrained points.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input-files", po::value(&opt.image_files)); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("<images> <cameras> -o <output prefix> [options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Stereo settings must be set after the command line arguments are parsed. // TODO(oalexan1): This old option may need to be wiped given the newer // recent outlier filtering. asp::stereo_settings().ip_edge_buffer_percent = opt.ip_edge_buffer_percent; // Do this check first, as the output prefix is needed to log to file. This // will be triggered when called with no arguments, so print the general // options, which functions as the help message. if (opt.out_prefix == "") vw_throw(ArgumentErr() << "Missing the output prefix.\n" << usage << general_options); // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file (after the output directory is created) asp::log_to_file(argc, argv, "", opt.out_prefix); // For Glog google::InitGoogleLogging(argv[0]); // This must be done early boost::to_lower(opt.stereo_session); // Separate out GCP files bool rm_from_input_list = true; opt.gcp_files = vw::get_files_with_ext(opt.image_files, ".gcp", rm_from_input_list); if (!opt.image_list.empty()) { // Read the images and cameras and put them in 'images_or_cams' to be parsed later if (!opt.image_files.empty()) vw_throw(ArgumentErr() << "The option --image-list was specified, but also " << "images or cameras on the command line.\n"); asp::IntrinsicOptions intr_opts; read_image_cam_lists(opt.image_list, opt.camera_list, opt.image_files, opt.camera_files, intr_opts); // outputs if (intr_opts.num_sensors != 0 || !intr_opts.cam2sensor.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot handle intrinsics with jitter_solve.\n"); } else { std::vector<std::string> images_or_cams = opt.image_files; bool ensure_equal_sizes = true; asp::separate_images_from_cameras(images_or_cams, opt.image_files, opt.camera_files, // outputs ensure_equal_sizes); // This is needed when several frame camera images are acquired in quick succession asp::readGroupStructure(images_or_cams, opt.cam2group); } // Throw if there are duplicate camera file names. asp::check_for_duplicates(opt.image_files, opt.camera_files, opt.out_prefix); // Sanity check const int num_images = opt.image_files.size(); if (opt.image_files.size() != opt.camera_files.size()) vw_throw(ArgumentErr() << "Must have as many cameras as have images.\n"); if (opt.image_files.empty()) vw_throw(ArgumentErr() << "Missing input image files.\n"); // Must have this early check to print a clear message about unsupported // camera before any error thrown by StereoSessionFactory. std::string err_str; try { std::string input_dem = ""; // No DEM bool allow_map_promote = false, quiet = true; asp::SessionPtr session; session = asp::StereoSessionFactory::create (opt.stereo_session, // may change opt, opt.image_files[0], opt.image_files[0], opt.camera_files[0], opt.camera_files[0], opt.out_prefix, input_dem, allow_map_promote, quiet); } catch (const std::exception& e) { // Catch and record any error err_str = e.what(); } // First check for unexpected sessions. if (!asp::isLinescanCsmSession(opt.stereo_session)) vw_throw(ArgumentErr() << "Session " << opt.stereo_session << " is not supported in jitter_solve. Check your camera files and/or " << "specify the -t (--session-type) option.\n"); // Throw any other errors if (err_str != "") vw_throw(ArgumentErr() << err_str << "\n"); if (opt.overlap_limit < 0) vw_throw(ArgumentErr() << "Must allow search for matches between " << "at least each image and its subsequent one.\n"); // By default, try to match all of the images if (opt.overlap_limit == 0) opt.overlap_limit = opt.image_files.size(); int num_pref = int(!opt.match_files_prefix.empty()) + int(!opt.clean_match_files_prefix.empty()) + int(!opt.isis_cnet.empty()) + int(!opt.nvm.empty()); if (num_pref > 1) vw_throw(ArgumentErr() << "Must specify no more than one of: --match-files-prefix, " << "--clean-match-files-prefix, --isis-cnet, --nvm.\n"); if (num_pref == 0 && opt.gcp_files.empty()) vw_throw(ArgumentErr() << "Neither interest point matches nor GCP were passed in.\n"); if (opt.max_init_reproj_error <= 0.0) vw_throw(ArgumentErr() << "Must have a positive --max-initial-reprojection-error.\n"); if (opt.tri_weight < 0.0) vw_throw(ArgumentErr() << "The value of --tri-weight must be non-negative.\n"); if (opt.robust_threshold <= 0.0) vw_throw(ArgumentErr() << "The value of --robust-threshold must be positive.\n"); if (opt.tri_robust_threshold <= 0.0) vw_throw(ArgumentErr() << "The value of --tri-robust-threshold must be positive.\n"); // This is a bug fix. The user by mistake passed in an empty height-from-dem string. if (!vm["heights-from-dem"].defaulted() && opt.heights_from_dem.empty()) vw_throw(ArgumentErr() << "The value of --heights-from-dem is empty. " << "Then it must not be set at all.\n"); // Same for opt.anchor_dem if (!vm["anchor-dem"].defaulted() && opt.anchor_dem.empty()) vw_throw(ArgumentErr() << "The value of --anchor-dem is empty. Then it must not be set at all.\n"); if (!vm["heights-from-dem-uncertainty"].defaulted() && vm["heights-from-dem"].defaulted()) vw_throw(ArgumentErr() << "The value of --heights-from-dem-uncertainty is set, " << "but --heights-from-dem is not set.\n"); if (!vm["heights-from-dem"].defaulted() && opt.heights_from_dem_uncertainty <= 0.0) vw_throw(ArgumentErr() << "The value of --heights-from-dem-uncertainty must be positive.\n"); if (opt.heights_from_dem_robust_threshold <= 0.0) vw_throw(ArgumentErr() << "The value of --heights-from-robust-threshold must be positive.\n"); // Options for reference terrain if (!vm["reference-terrain"].defaulted() && opt.reference_terrain.empty()) vw_throw(ArgumentErr() << "The value of --reference-terrain is set and empty. " << "Then it must not be set at all.\n"); if (!vm["reference-terrain-uncertainty"].defaulted() && vm["reference-terrain"].defaulted()) vw_throw(ArgumentErr() << "The value of --reference-terrain-uncertainty is set, " << "but --reference-terrain is not set.\n"); if (opt.reference_terrain_uncertainty <= 0.0) vw_throw(ArgumentErr() << "The value of --reference-terrain-uncertainty must be " << "positive.\n"); if (opt.reference_terrain_robust_threshold <= 0.0) vw_throw(ArgumentErr() << "The value of --heights-from-robust-threshold must be " << "positive.\n"); if (!opt.reference_terrain.empty()) { if (opt.stereo_prefix_list.empty()) vw_throw(ArgumentErr() << "Must set --stereo-prefix-list when --reference-terrain is set.\n"); if (!opt.rig_config.empty()) vw_throw(ArgumentErr() << "Cannot use --rig-config with --reference-terrain.\n"); // Must have --csv-format unless the reference terrain is a DEM if (opt.csv_format_str.empty()) { vw::cartography::GeoReference georef; bool has_georef = vw::has_image_extension(opt.reference_terrain) && vw::cartography::read_georeference(georef, opt.reference_terrain); if (!has_georef) vw_throw(ArgumentErr() << "Must set --csv-format when --reference-terrain is set " << "the terrain is not a DEM.\n"); } } bool have_camera_position_uncertainty = !opt.camera_position_uncertainty_str.empty(); bool have_datum = true; // Jitter solving always expects a datum if (have_camera_position_uncertainty) asp::handleCameraPositionUncertainty(opt, have_datum); if (opt.rotation_weight < 0) vw_throw(ArgumentErr() << "The rotation weight must be non-negative.\n"); if (opt.camera_position_weight < 0) vw_throw(ArgumentErr() << "The value of --camera-position-weight must be n" << "non-negative.\n"); if (opt.camera_position_robust_threshold <= 0.0) vw_throw(ArgumentErr() << "The value of --camera-position-robust-threshold " << "must be positive.\n"); if (opt.quat_norm_weight <= 0) vw_throw(ArgumentErr() << "The quaternion norm weight must be positive.\n"); if (opt.roll_weight < 0.0) vw_throw(ArgumentErr() << "The roll weight must be non-negative.\n"); if (opt.yaw_weight < 0.0) vw_throw(ArgumentErr() << "The yaw weight must be non-negative.\n"); // The smoothness weight must be non-negative if (opt.smoothness_weight < 0.0) vw_throw(ArgumentErr() << "The smoothness weight must be non-negative.\n"); // Handle the roll/yaw constraint DEM if ((opt.roll_weight > 0 || opt.yaw_weight > 0) && opt.heights_from_dem == "" && opt.anchor_dem == "") vw::vw_throw(ArgumentErr() << "Cannot use the roll/yaw constraint without a DEM. " << "Set either --heights-from-dem or --anchor-dem.\n"); if (opt.num_anchor_points_per_image < 0) vw_throw(ArgumentErr() << "The number of anchor points must be non-negative.\n"); if (opt.num_anchor_points_per_tile < 0) vw_throw(ArgumentErr() << "The number of anchor points per tile must be non-negative.\n"); // Cannot have anchor points both per image and per tile if (opt.num_anchor_points_per_image > 0 && opt.num_anchor_points_per_tile > 0) vw_throw(ArgumentErr() << "Cannot have anchor points both per image and per tile.\n"); if (opt.anchor_weight < 0) vw_throw(ArgumentErr() << "The anchor weight must be non-negative.\n"); if ((opt.anchor_weight > 0 || opt.num_anchor_points_per_image > 0 || opt.num_anchor_points_per_tile > 0 || opt.num_anchor_points_extra_lines > 0) && opt.anchor_dem.empty()) vw::vw_throw(vw::ArgumentErr() << "Anchor points parameters have been specified. " << "Must set --anchor-dem.\n"); // Must have at least one pass if (opt.num_passes < 1) vw_throw(ArgumentErr() << "Must have at least one pass.\n"); bool have_rig = !opt.rig_config.empty(); if (have_rig) { bool have_rig_transforms = opt.use_initial_rig_transforms; rig::readRigConfig(opt.rig_config, have_rig_transforms, rig); for (size_t i = 0; i < rig.cam_params.size(); i++) { auto const& params = rig.cam_params[i]; if (params.GetDistortion().size() != 0) vw::vw_throw(vw::ArgumentErr() << "Distortion is not supported in jitter_solve.\n"); } if (opt.roll_weight > 0 || opt.yaw_weight > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot use the roll/yaw constraint with a rig.\n"); } if (!have_rig && (opt.use_initial_rig_transforms || opt.fix_rig_translations || opt.fix_rig_rotations)) vw::vw_throw(vw::ArgumentErr() << "Cannot use --use-initial-rig-transforms, " << "--fix-rig-translations, or --fix-rig-rotations without a rig.\n"); // If have both anchor DEM and height-from-dem, and these are difrerent, print // a warming that the user should check for their agreement. if (!opt.anchor_dem.empty() && !opt.heights_from_dem.empty() && opt.anchor_dem != opt.heights_from_dem) vw::vw_out(vw::WarningMessage) << "The values of --anchor-dem and --heights-from-dem are different. " << "Check (with geodiff) that these are in agreement.\n"; asp::bathyChecks(opt.stereo_session, asp::stereo_settings(), opt.image_files.size()); return; } // Calculate a set of anchor points uniformly distributed over the image // Will use opt.num_anchor_points_extra_lines. We append to weight_vec and // other quantities that were used for reprojection errors for match points. void calcAnchorPoints(Options const & opt, ImageViewRef<PixelMask<double>> interp_anchor_dem, vw::cartography::GeoReference const & anchor_georef, std::vector<asp::CsmModel*> const & csm_models, // Append to these, they already have entries std::vector<std::vector<Vector2>> & pixel_vec, std::vector<std::vector<double>> & weight_vec, std::vector<std::vector<int>> & isAnchor_vec, std::vector<std::vector<int>> & pix2xyz_index, std::vector<double> & orig_tri_points_vec, std::vector<double> & tri_points_vec) { vw::vw_out() << "Calculating anchor points.\n"; vw::Stopwatch sw; sw.start(); if (opt.num_anchor_points_per_image <= 0 && opt.num_anchor_points_per_tile <= 0) vw::vw_throw(vw::ArgumentErr() << "Expecting a positive number of anchor points.\n"); bool warning_printed = false; // If to use an anchor weight image bool have_anchor_weight_image = (!opt.anchor_weight_image.empty()); vw::ImageViewRef<vw::PixelMask<float>> anchor_weight_image; float anchor_weight_image_nodata = -std::numeric_limits<float>::max(); vw::cartography::GeoReference anchor_weight_image_georef; if (have_anchor_weight_image) vw::cartography::readGeorefImage(opt.anchor_weight_image, anchor_weight_image_nodata, anchor_weight_image_georef, anchor_weight_image); int num_cams = opt.camera_models.size(); for (int icam = 0; icam < num_cams; icam++) { vw::Vector2 dims = vw::file_image_size(opt.image_files[icam]); int numLines = dims[1]; int numSamples = dims[0]; int extra = opt.num_anchor_points_extra_lines; UsgsAstroLsSensorModel * ls_model = dynamic_cast<UsgsAstroLsSensorModel*>((csm_models[icam]->m_gm_model).get()); if (ls_model == NULL) extra = 0; // extra lines are only for linescan // Find how much image area will be taken by each anchor point // Convert to double early on to avoid integer overflow double area = double(numSamples) * double(numLines + 2 * extra); double area_per_point = 0.0; if (opt.num_anchor_points_per_image > 0) area_per_point = area / double(opt.num_anchor_points_per_image); else area_per_point = 1024.0 * 1024.0 / double(opt.num_anchor_points_per_tile); double bin_len = sqrt(area_per_point); bin_len = std::max(bin_len, 1.0); int lenx = ceil(double(numSamples) / bin_len); lenx = std::max(1, lenx); int leny = ceil(double(numLines + 2 * extra) / bin_len); leny = std::max(1, leny); vw_out() << "Image file: " << opt.image_files[icam] << "\n"; vw::TerminalProgressCallback tpc("asp", "\t--> "); double inc_amount = 1.0/lenx; tpc.report_progress(0); int numAnchorPoints = 0; for (int binx = 0; binx <= lenx; binx++) { tpc.report_incremental_progress(inc_amount); double posx = binx * bin_len; for (int biny = 0; biny <= leny; biny++) { double posy = biny * bin_len - extra; if (posx > numSamples - 1 || posy < -extra || posy > numLines - 1 + extra) continue; Vector2 pix(posx, posy); Vector3 xyz_guess(0, 0, 0); bool treat_nodata_as_zero = false; bool has_intersection = false; double height_error_tol = 0.001; // 1 mm should be enough double max_abs_tol = 1e-14; // abs cost fun change b/w iterations double max_rel_tol = 1e-14; int num_max_iter = 50; // Using many iterations can be very slow Vector3 dem_xyz = vw::cartography::camera_pixel_to_dem_xyz (opt.camera_models[icam]->camera_center(pix), opt.camera_models[icam]->pixel_to_vector(pix), vw::pixel_cast<vw::PixelMask<float>>(interp_anchor_dem), anchor_georef, treat_nodata_as_zero, has_intersection, height_error_tol, max_abs_tol, max_rel_tol, num_max_iter, xyz_guess); if (!has_intersection || dem_xyz == Vector3()) continue; Vector2 pix_out; try { pix_out = opt.camera_models[icam]->point_to_pixel(dem_xyz); } catch (...) { continue; } if (norm_2(pix - pix_out) > 10 * height_error_tol) continue; // this is likely a bad point // If we have a weight image, use it to multiply the weight double anchor_weight_from_image = 1.0; if (have_anchor_weight_image) { vw::PixelMask<float> img_wt = vw::cartography::closestPixelVal(anchor_weight_image, anchor_weight_image_georef, dem_xyz); // Skip bad weights if (!is_valid(img_wt) || std::isnan(img_wt.child()) || img_wt.child() <= 0.0) continue; anchor_weight_from_image = img_wt.child(); } if (ls_model != NULL) { // Anchor points must not be outside the range of tabulated positions and orientations csm::ImageCoord imagePt; asp::toCsmPixel(pix, imagePt); double time = ls_model->getImageTime(imagePt); int numPos = ls_model->m_positions.size() / NUM_XYZ_PARAMS; double posT0 = ls_model->m_t0Ephem; double posDt = ls_model->m_dtEphem; int pos_index = static_cast<int>((time - posT0) / posDt); int numQuat = ls_model->m_quaternions.size() / NUM_QUAT_PARAMS; double quatT0 = ls_model->m_t0Quat; double quatDt = ls_model->m_dtQuat; int quat_index = static_cast<int>((time - quatT0) / quatDt); if (pos_index < 0 || pos_index >= numPos || quat_index < 0 || quat_index >= numQuat) { if (!warning_printed) { vw::vw_out(vw::WarningMessage) << "Not placing anchor points outside " << "the range of tabulated positions and orientations.\n"; warning_printed = true; } continue; } } pixel_vec[icam].push_back(pix); weight_vec[icam].push_back(opt.anchor_weight * anchor_weight_from_image); isAnchor_vec[icam].push_back(1); // The current number of points in tri_points_vec is the index of the next point pix2xyz_index[icam].push_back(tri_points_vec.size() / 3); // Append every coordinate of dem_xyz to tri_points_vec for (int it = 0; it < 3; it++) { orig_tri_points_vec.push_back(dem_xyz[it]); tri_points_vec.push_back(dem_xyz[it]); } numAnchorPoints++; } } tpc.report_finished(); vw_out() << "Lines and samples: " << numLines << ' ' << numSamples << std::endl; vw_out() << "Num anchor points per image: " << numAnchorPoints << std::endl; } sw.stop(); vw::vw_out() << "Elapsed time in calculating anchor points: " << sw.elapsed_seconds() << " seconds.\n"; } // Apply the input adjustments to the CSM cameras. Resample linescan models. // Get pointers to the underlying CSM cameras, as need to manipulate // those directly. This modifies camera_models in place. void initResampleCsmCams(Options const& opt, std::vector<vw::CamPtr> const& camera_models, std::vector<asp::CsmModel*> & csm_models) { // Wipe the output csm_models.clear(); for (size_t icam = 0; icam < camera_models.size(); icam++) { asp::CsmModel * csm_cam = asp::csm_model(camera_models[icam]); // Sanity check if (csm_cam == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting CSM cameras.\n"); if (!opt.input_prefix.empty()) asp::applyAdjustmentToCsmCamera(opt.image_files[icam], opt.camera_files[icam], opt.input_prefix, camera_models[icam], csm_cam); // Get the underlying linescan model or frame model UsgsAstroLsSensorModel * ls_model = dynamic_cast<UsgsAstroLsSensorModel*>((csm_cam->m_gm_model).get()); UsgsAstroFrameSensorModel * frame_model = dynamic_cast<UsgsAstroFrameSensorModel*>((csm_cam->m_gm_model).get()); if (ls_model == NULL && frame_model == NULL) vw_throw(ArgumentErr() << "Expecting the cameras to be of CSM linescan or frame type.\n"); // Normalize quaternions. Later, the quaternions being optimized will // be kept close to being normalized. This makes it easy to ensure // that quaternion interpolation gives good results, especially that // some quaternions may get optimized and some not. if (ls_model != NULL) { asp::normalizeQuaternions(ls_model); // The provided tabulated positions, velocities and quaternions may be too few, // so resample them with --num-lines-per-position and --num-lines-per-orientation, // if those are set. resampleModel(opt.num_lines_per_position, opt.num_lines_per_orientation, ls_model); } else if (frame_model != NULL) { normalizeQuaternions(frame_model); } else { vw::vw_throw(vw::ArgumentErr() << "Expecting the cameras to be of CSM linescan or frame type.\n"); } csm_models.push_back(csm_cam); } } // Create structures for pixels, xyz, and weights, to be used in optimization. // Later there will be another pass to add weights for the anchor points. // Here more points may be flagged as outliers. void createProblemStructure(Options const& opt, asp::CRN const& crn, vw::ba::ControlNetwork const& cnet, std::vector<double> const& tri_points_vec, // Outputs std::set<int> & outliers, std::vector<std::vector<Vector2>> & pixel_vec, std::vector<std::vector<double>> & weight_vec, std::vector<std::vector<int>> & isAnchor_vec, std::vector<std::vector<int>> & pix2xyz_index) { // If to use a weight image bool have_weight_image = (!opt.weight_image.empty()); vw::ImageViewRef<vw::PixelMask<float>> weight_image; float weight_image_nodata = -std::numeric_limits<float>::max(); vw::cartography::GeoReference weight_image_georef; if (have_weight_image) vw::cartography::readGeorefImage(opt.weight_image, weight_image_nodata, weight_image_georef, weight_image); int num_cameras = opt.camera_models.size(); // Wipe pixel_vec.resize(0); weight_vec.resize(0); isAnchor_vec.resize(0); pix2xyz_index.resize(0); // Resize pixel_vec.resize(num_cameras); weight_vec.resize(num_cameras); isAnchor_vec.resize(num_cameras); pix2xyz_index.resize(num_cameras); for (int icam = 0; icam < (int)crn.size(); icam++) { for (auto fiter = crn[icam].begin(); fiter != crn[icam].end(); fiter++) { // The index of the 3D point int ipt = (**fiter).m_point_id; if (outliers.find(ipt) != outliers.end()) continue; // Skip outliers // The observed value for the projection of point with index ipt into // the camera with index icam. Vector2 observation = (**fiter).m_location; // Unlike in bundle adjustment, the weight of a pixel is 1.0, rather // than 1.0 / pixel_sigma. double weight = 1.0; // If we have a weight image, use it to set the weight if (have_weight_image) { const double * tri_point = &tri_points_vec[0] + ipt * NUM_XYZ_PARAMS; Vector3 ecef(tri_point[0], tri_point[1], tri_point[2]); vw::PixelMask<float> img_wt = vw::cartography::closestPixelVal(weight_image, weight_image_georef, ecef); // Flag bad weights as outliers if (!is_valid(img_wt) || std::isnan(img_wt.child()) || img_wt.child() <= 0.0) { outliers.insert(ipt); continue; } weight = img_wt.child(); } pixel_vec[icam].push_back(observation); weight_vec[icam].push_back(weight); isAnchor_vec[icam].push_back(0); pix2xyz_index[icam].push_back(ipt); } } return; } // Run one pass of solving for jitter. At each pass the cameras we have so far // are used to triangulate the points and the DEM constraint is refreshed if // applicable, and then the cameras are optimized. More than one pass // was shown to improve the accuracy. void jitterSolvePass(int pass, bool have_rig, Options const& opt, asp::CRN const& crn, std::vector<RigCamInfo> const& rig_cam_info, TimestampMap const& timestamp_map, // Outputs ba::ControlNetwork & cnet, std::set<int> & outliers, std::vector<asp::CsmModel*> & csm_models, std::vector<std::vector<vw::Vector3>> & orig_cam_positions, std::vector<double> & orig_tri_points_vec, std::vector<std::vector<double>> & orig_curvatures, rig::RigSet & rig, std::vector<double> & ref_to_curr_sensor_vec) { vw::vw_out() << "\nJitter solving pass: " << pass << "\n"; // If some of the input cameras are frame, need to store position and // quaternion variables for them outside the camera model. // TODO(oalexan1): Revisit this decision now that frame camera // params are no longer private. std::vector<double> frame_params; initFrameCameraParams(csm_models, frame_params); // Update tri points from DEM and create anchor xyz from DEM. bool have_dem = (!opt.heights_from_dem.empty()); std::vector<Vector3> dem_xyz_vec; vw::cartography::GeoReference dem_georef, anchor_georef; ImageViewRef<PixelMask<double>> masked_dem, interp_anchor_dem; bool warn_only = false; // for jitter solving we always know well the datum if (have_dem) { vw::vw_out() << "Reading the DEM for the --heights-from-dem constraint.\n"; asp::create_masked_dem(opt.heights_from_dem, dem_georef, masked_dem); vw::checkDatumConsistency(opt.datum, dem_georef.datum(), warn_only); asp::updateTriPtsFromDem(cnet, outliers, opt.camera_models, dem_georef, masked_dem, dem_xyz_vec); // output } if (opt.anchor_dem != "") { vw::vw_out() << "Reading the DEM for the --anchor-dem constraint.\n"; asp::create_interp_dem(opt.anchor_dem, anchor_georef, interp_anchor_dem); vw::checkDatumConsistency(opt.datum, anchor_georef.datum(), warn_only); } // Handle the roll/yaw constraint DEM. We already checked that one of thse cases should work vw::cartography::GeoReference roll_yaw_georef; if (opt.roll_weight > 0 || opt.yaw_weight > 0) { if (opt.heights_from_dem != "") { roll_yaw_georef = dem_georef; vw::vw_out() << "Using the DEM from --heights-from-dem " << "for the roll/yaw constraint.\n"; } else if (opt.anchor_dem != "") { roll_yaw_georef = anchor_georef; vw::vw_out() << "Using the DEM from --anchor-dem for the roll/yaw constraint.\n"; } } int num_cameras = opt.camera_models.size(); if (num_cameras < 1) vw_throw(ArgumentErr() << "Expecting at least one input camera.\n"); // Put the triangulated points in a vector. Update the cnet from the DEM, // if we have one. Later will add here the anchor points. std::vector<double> local_orig_tri_points_vec, tri_points_vec; asp::formTriVec(dem_xyz_vec, have_dem, opt.heights_from_dem_uncertainty, cnet, local_orig_tri_points_vec, tri_points_vec); // outputs // Create structures for pixels, xyz, and weights, to be used in optimization std::vector<std::vector<Vector2>> pixel_vec; std::vector<std::vector<double>> weight_vec; std::vector<std::vector<int>> isAnchor_vec; std::vector<std::vector<int>> pix2xyz_index; createProblemStructure(opt, crn, cnet, tri_points_vec, // Outputs outliers, pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index); // Find anchor points and append to pixel_vec, weight_vec, xyz_vec, etc. if ((opt.num_anchor_points_per_image > 0 || opt.num_anchor_points_per_tile > 0) && opt.anchor_weight > 0) calcAnchorPoints(opt, interp_anchor_dem, anchor_georef, csm_models, // Append to these pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index, local_orig_tri_points_vec, tri_points_vec); // Save the original camera positions and triangulated points for the initial pass if (pass == 0) { orig_tri_points_vec = local_orig_tri_points_vec; asp::calcCameraCenters(opt.stereo_session, opt.camera_models, orig_cam_positions); } // The above structures must not be resized anymore, as we will get pointers // to individual blocks within them. // Need this in order to undo the multiplication by weight before saving the residuals std::vector<double> weight_per_residual; // The problem to solve ceres::Problem problem; // In order to add a proportional camera constraint, we need to know the // median weight per camera and their count. These are different for anchor // and non-anchor points. std::vector<std::vector<double>> weight_per_cam(2); std::vector<std::vector<double>> count_per_cam(2); // Add reprojection errors. Get back weights_per_cam, count_per_cam. addReprojCamErrs(opt, crn, pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index, csm_models, have_rig, rig, rig_cam_info, opt.cam2group, timestamp_map, opt.fix_rig_translations, opt.fix_rig_rotations, // Outputs tri_points_vec, frame_params, weight_per_residual, weight_per_cam, count_per_cam, ref_to_curr_sensor_vec, problem); // Add the DEM constraint. We check earlier that only one // of the two options below can be set at a time. if (have_dem) addDemConstraint(opt, dem_xyz_vec, outliers, cnet, // Outputs tri_points_vec, weight_per_residual, // append problem); // Add the constraint to keep triangulated points close to initial values // This does not need a DEM or alignment. // This must happen after any DEM-based constraint is set, and won't // apply to tri points already constrained by the DEM (so it will // work only where the DEM is missing). if (opt.tri_weight > 0) addTriConstraint(opt, outliers, cnet, crn, // Outputs tri_points_vec, weight_per_residual, // append problem); // Add a cost function meant to tie up to known disparities (option // --reference-terrain). The structures below must persist until the end. std::vector<int> left_indices, right_indices; std::vector<asp::SessionPtr> sessions; std::vector<vw::TransformPtr> left_trans, right_trans; std::vector<std::string> disp_files; std::vector<DispPtr> disp_vec; std::vector<vw::Vector3> reference_vec; std::vector<std::vector<int>> ref_indices; vw::ImageView<float> mapproj_dem; if (opt.reference_terrain != "") { asp::parseStereoRuns(opt.stereo_prefix_list, opt.image_files, // Outputs left_indices, right_indices, sessions, left_trans, right_trans, disp_files); asp::addRefTerrainCostFun(opt, csm_models, left_indices, right_indices, left_trans, right_trans, disp_files, // Outputs problem, disp_vec, mapproj_dem, weight_per_residual, // append reference_vec, ref_indices); } // Add the GCP constraint. GCP can come from GCP files or ISIS cnet. addGcpConstraint(opt, outliers, opt.use_llh_error, opt.fix_gcp_xyz, cnet, tri_points_vec, weight_per_residual, problem); // outputs // Add the constraint to keep the camera positions close to initial values. // Note that in the second pass the initial values are the ones optimized in // the first pass. // TODO(oalexan1): It is not clear how to best handle this. Also revisit // for bundle adjustment. if (opt.camera_position_uncertainty.size() > 0) addHardCamPositionConstraint(opt, outliers, crn, csm_models, count_per_cam, opt.anchor_weight, have_rig, rig, rig_cam_info, // Outputs frame_params, weight_per_residual, problem); // Add another type of constraint to keep the camera positions close to initial values. // The earlier one is recommended as this one was not fully sorted out. // TODO(oalexan1): Need to wipe this option. The above does better. if (opt.camera_position_weight > 0) addSoftCamPositionConstraint(opt, outliers, crn, csm_models, weight_per_cam, count_per_cam, have_rig, rig, rig_cam_info, // Outputs frame_params, weight_per_residual, problem); // Add constraints to keep quat norm close to 1, and make rotations // not change too much. // TODO(oalexan1): Need to parameterize the rotations with axis angle, then // convert from / to quaternions. addQuatNormRotationConstraints(opt, outliers, crn, csm_models, have_rig, rig, rig_cam_info, opt.quat_norm_weight, // Outputs frame_params, weight_per_residual, // append problem); if (opt.roll_weight > 0 || opt.yaw_weight > 0) addRollYawConstraint(opt, crn, csm_models, roll_yaw_georef, opt.cam2group, opt.initial_camera_constraint, opt.roll_weight, opt.yaw_weight, // Outputs frame_params, weight_per_residual, problem); // outputs // Add the smoothness constraint. This is a constraint on the curvature of the // sequence of poses. if (opt.smoothness_weight > 0) asp::addSmoothnessConstraint(opt, csm_models, opt.smoothness_weight, have_rig, rig, rig_cam_info, // Outputs weight_per_residual, orig_curvatures, problem); // Save residuals before optimization std::vector<double> mean_pixel_residuals; if (pass == 0) { std::string residual_prefix = opt.out_prefix + "-initial_residuals"; saveJitterResiduals(problem, residual_prefix, opt, cnet, crn, opt.datum, tri_points_vec, outliers, weight_per_residual, pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index, reference_vec, ref_indices, mean_pixel_residuals); } // Set up the problem ceres::Solver::Options options; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.parameter_tolerance = opt.parameter_tolerance; // default is 1e-12 options.max_num_iterations = opt.num_iterations; options.max_num_consecutive_invalid_steps = std::max(20, opt.num_iterations/5); // try hard options.minimizer_progress_to_stdout = true; if (opt.single_threaded_cameras) options.num_threads = 1; else options.num_threads = opt.num_threads; // This is supposed to help with speed in a certain size range options.linear_solver_type = ceres::SPARSE_SCHUR; options.use_explicit_schur_complement = true; options.linear_solver_type = ceres::ITERATIVE_SCHUR; options.preconditioner_type = ceres::SCHUR_JACOBI; options.use_explicit_schur_complement = false; // Only matters with ITERATIVE_SCHUR // Solve the problem vw_out() << "Starting the Ceres optimizer.\n"; ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); vw_out() << summary.FullReport() << "\n"; if (summary.termination_type == ceres::NO_CONVERGENCE) 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"; // Update the cameras given the optimized parameters updateCameras(have_rig, rig, rig_cam_info, opt.cam2group, timestamp_map, ref_to_curr_sensor_vec, csm_models, frame_params); // By now camera_models has been updated in-place. Compute the optimized // camera centers. std::vector<std::vector<vw::Vector3>> opt_cam_positions; asp::calcCameraCenters(opt.stereo_session, opt.camera_models, opt_cam_positions); // Save residuals after optimization std::string residual_prefix = opt.out_prefix + "-final_residuals"; saveJitterResiduals(problem, residual_prefix, opt, cnet, crn, opt.datum, tri_points_vec, outliers, weight_per_residual, pixel_vec, weight_vec, isAnchor_vec, pix2xyz_index, reference_vec, ref_indices, mean_pixel_residuals); // Filter GCP outliers based on mean reprojection error if (opt.max_gcp_reproj_err > 0) asp::filterGcpOutliers(cnet, mean_pixel_residuals, opt.max_gcp_reproj_err, outliers); // Save the optimized camera models saveCsmCameras(opt.out_prefix, opt.stereo_session, opt.image_files, opt.camera_files, opt.camera_models, opt.update_isis_cubes_with_csm_state); if (have_rig) { // Update the rig with the optimized transforms and save it asp::updateRig(ref_to_curr_sensor_vec, rig); std::string rig_config = opt.out_prefix + "-rig_config.txt"; rig::writeRigConfig(rig_config, have_rig, rig); } // Write many types of stats. These are done together as they rely on // reloading interest point matches, which is expensive. bool remove_outliers = true, propagate_errors = false, save_clean_matches = false; vw::Vector<double> horizontal_stddev_vec; // not used asp::matchFilesProcessing(cnet, asp::BaBaseOptions(opt), // note the slicing opt.camera_models, // these have been updated remove_outliers, outliers, opt.mapproj_dem, propagate_errors, horizontal_stddev_vec, save_clean_matches, opt.match_files, stereo_settings().matches_as_txt); // Compute the change in camera centers std::string cam_offsets_file = opt.out_prefix + "-camera_offsets.txt"; if (opt.datum.name() != asp::UNSPECIFIED_DATUM) asp::saveCameraOffsets(opt.datum, opt.image_files, orig_cam_positions, opt_cam_positions, cam_offsets_file); // Resize the tri_points_vec to eliminate the anchor points that were appended. // The number of those can be variable in each pass and those do not contribute // to the triangulation offsets. This must be at the end. int num_tri_points = cnet.size(); size_t tri_len = num_tri_points*NUM_XYZ_PARAMS; if (orig_tri_points_vec.size() < tri_len || tri_points_vec.size() < tri_len) vw_throw(ArgumentErr() << "Expecting more triangulated points.\n"); orig_tri_points_vec.resize(tri_len); tri_points_vec.resize(tri_len); std::string tri_offsets_file = opt.out_prefix + "-triangulation_offsets.txt"; asp::saveTriOffsetsPerCamera(opt.image_files, outliers, orig_tri_points_vec, tri_points_vec, crn, tri_offsets_file); // Save the optimized control network in GCP format, after outlier filtering if (opt.save_cnet_as_gcp) { std::string gcp_file = opt.out_prefix + "-cnet.gcp"; asp::saveCnetAsGcp(cnet, tri_points_vec, outliers, opt.datum, opt.image_files, gcp_file); } } // end jitterSolvePass void run_jitter_solve(int argc, char* argv[]) { // Parse arguments and perform validation Options opt; rig::RigSet rig; handle_arguments(argc, argv, opt, rig); // Load the cameras bool approximate_pinhole_intrinsics = false; asp::load_cameras(opt.image_files, opt.camera_files, opt.out_prefix, opt, approximate_pinhole_intrinsics, // Outputs opt.stereo_session, // may change opt.single_threaded_cameras, opt.camera_models); // Find the datum. // TODO(oalexan1): Integrate this into load_cameras, to avoid loading // the cameras twice. Do this also in bundle_adjust.cc. asp::SessionPtr session(NULL); bool found_datum = asp::datum_from_camera(opt.image_files[0], opt.camera_files[0], // Outputs opt.stereo_session, session, opt.datum); if (!found_datum) vw_throw(ArgumentErr() << "No datum was found in the input cameras.\n"); // Apply the input adjustments to the cameras. Resample linescan models. // Get pointers to the underlying CSM cameras, as need to manipulate // those directly. These will result in changes to the input cameras. std::vector<asp::CsmModel*> csm_models; initResampleCsmCams(opt, opt.camera_models, csm_models); // Preparations if having a rig // TODO(oalexan1): Must check that there exist images for all rig sensors, and // there are no images without a rig. Otherwise the results are quietly bad. bool have_rig = (opt.rig_config != ""); std::vector<RigCamInfo> rig_cam_info; std::vector<double> ref_to_curr_sensor_vec; TimestampMap timestamp_map; if (have_rig) populateRigCamInfo(rig, opt.image_files, opt.camera_files, csm_models, opt.cam2group, opt.use_initial_rig_transforms, // Outputs rig_cam_info, ref_to_curr_sensor_vec, timestamp_map); // Make a list of all the image pairs to find matches for. Some quantities // below are not needed but are part of the API. if (opt.isis_cnet.empty() && opt.nvm.empty()) asp::findMatchFiles(opt.overlap_limit, opt.match_first_to_last, opt.image_files, opt.clean_match_files_prefix, opt.match_files_prefix, opt.out_prefix, asp::stereo_settings().matches_as_txt, // Outputs opt.match_files); // Build control network and perform triangulation with adjusted input cameras ba::ControlNetwork cnet("jitter_solve"); if (opt.isis_cnet != "") { asp::IsisCnetData isisCnetData; // isis cnet (if loaded) vw::vw_out() << "Reading ISIS control network: " << opt.isis_cnet << "\n"; asp::loadIsisCnet(opt.isis_cnet, opt.image_files, cnet, isisCnetData); // outputs } else if (opt.nvm != "") { // Assume the features are stored shifted relative to optical center bool nvm_no_shift = false; std::vector<Eigen::Affine3d> world_to_cam; // poses will not be used std::map<std::string, Eigen::Vector2d> optical_offsets; asp::readNvmAsCnet(opt.nvm, opt.image_files, nvm_no_shift, cnet, world_to_cam, optical_offsets); // outputs } else { bool triangulate_control_points = true; vw::ba::build_control_network(triangulate_control_points, cnet, // output opt.camera_models, opt.image_files, opt.match_files, opt.min_matches, opt.min_triangulation_angle*(M_PI/180.0), opt.forced_triangulation_distance, opt.max_pairwise_matches, stereo_settings().matches_as_txt); } vw::vw_out() << "Number of triangulated control points: " << cnet.size() << "\n"; if (!opt.gcp_files.empty()) { int num_gcp = vw::ba::add_ground_control_points(cnet, opt.gcp_files, opt.datum); checkGcpRadius(opt.datum, cnet); vw::vw_out() << "Loaded " << num_gcp << " ground control points.\n"; } if (cnet.empty()) vw::vw_throw(vw::ArgumentErr() << "Failed to build a control network. Check the bundle adjustment directory " << "for matches and if the match files satisfy the naming convention " << "<prefix>-<image1>__<image2>.match. " << "Or, if using an .nvm file, ISIS cnet, or GCP, check those.\n"); // TODO(oalexan1): Is it possible to avoid using CRNs? asp::CRN crn; crn.from_cnet(cnet); if ((int)crn.size() != opt.camera_models.size()) vw_throw(ArgumentErr() << "Book-keeping error, the size of CameraRelationNetwork " << "must equal the number of images.\n"); // Flag as outliers points with initial reprojection error bigger than // a certain amount. This assumes that the input cameras are very accurate. std::set<int> outliers; flag_initial_outliers(cnet, crn, opt.camera_models, opt.max_init_reproj_error, // Output outliers); vw_out() << "Removed " << outliers.size() << " outliers based on initial reprojection error.\n"; // It is convenient to compute these inside the first pass rather than outside. // They should not go out of scope until the end of the program. std::vector<std::vector<vw::Vector3>> orig_cam_positions; std::vector<double> orig_tri_points_vec; std::vector<std::vector<double>> orig_curvatures; // Do this many passes for (int pass = 0; pass < opt.num_passes; pass++) jitterSolvePass(pass, have_rig, opt, crn, rig_cam_info, timestamp_map, // Outputs cnet, outliers, csm_models, orig_cam_positions, orig_tri_points_vec, orig_curvatures, rig, ref_to_curr_sensor_vec); return; } } // end namespace asp int main(int argc, char* argv[]) { try { xercesc::XMLPlatformUtils::Initialize(); asp::run_jitter_solve(argc, argv); xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/list_timestamps ================================================ #!/usr/bin/env python """ For each message in the bag having a header, add to the output list the header timestamp (in double-precision seconds since epoch) and the topic name. Do this for all topics in the bag or for those passed on input. """ import argparse, os, re, sys,rosbag if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("--bag", dest = "bag", help="Input bag."), parser.add_argument("--list", dest = "list", default="", help="Output list having a timestamp and topic for each message.") parser.add_argument("--topics", dest="topics", default = "", help="Print the timestamps only for these topics.") args = parser.parse_args() if args.bag == "" or args.list == "": print("Must specify the input bag and the output list.") sys.exit(1) topic_list = None if args.topics != "": topic_list = args.topics.split() print("Listing timestamps in: " + args.bag) print("This can be slow for large bags.") print("Writing: " + args.list) with open(args.list, "w") as fh: with rosbag.Bag(args.bag, "r") as bag: for topic, msg, t in bag.read_messages(topic_list): try: # The timestamp format is consistent with what rig_calibrator uses fh.write("{0:10.7f} {1:s}\n".format(msg.header.stamp.to_sec(), topic)) except: pass ================================================ FILE: src/asp/Tools/lronac2mosaic.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ from __future__ import print_function import os, glob, optparse, re, shutil, subprocess, sys, string, time libexecpath = os.path.abspath(sys.path[0] + '/../libexec') sys.path.insert(0, libexecpath) # prepend to Python path from asp_system_utils import get_asp_version import asp_system_utils asp_system_utils.verify_python_version_is_supported() job_pool = [] # Global output folder variable outputFolder = "" def man(option, opt, value, parser): print(parser.usage, file=sys.stderr) print('''\ This program operates on LRO (.IMG) files, and performs the following ISIS 3 operations: * Converts to ISIS format (lronac2isis) * Attaches SPICE information (spiceinit and spicefit) * Performs radiometric calibration (lronaccal) * Runs lronacecho * Applies an optional crop * Removes camera distortions from the CCD images (noproj) * Performs jitter analysis (lrojitreg) * Mosaics individual CCDs into one unified image file (handmos) * Normalizes the mosaic (cubenorm) ''', file=sys.stderr) sys.exit() class Usage(Exception): def __init__(self, msg): self.msg = msg def add_job(cmd, num_working_threads=4): if ( len(job_pool) >= num_working_threads): job_pool[0].wait(); job_pool.pop(0) print(cmd) job_pool.append(subprocess.Popen(cmd, shell=True, env=os.environ)) def wait_on_all_jobs(): print("Waiting for jobs to finish") while len(job_pool) > 0: job_pool[0].wait() job_pool.pop(0) # Go through a list of cubes and sort them into left/right pairs def build_cube_pairs(cubePaths): pairDict = dict(); for cube in cubePaths: print(cube) m = re.search(r'\D*(\d+)(.).*',os.path.basename(cube)) number = m.group(1) sideLetter = m.group(2) if (number not in pairDict): pairDict[number] = ['', '']; # Store the path in the spot for either the left or right cube if (sideLetter == "L"): pairDict[number][0] = cube; # Left else: pairDict[number][1] = cube; # Right return pairDict def read_flatfile( flat ): # Fail if the input file is not present if not os.path.isfile(flat): raise Exception('File ' + flat + ' is missing!') averages = [0.0,0.0] f = open(flat,'r') for line in f: if ( line.rfind("Average Sample Offset:") >= 0 ): index = line.rfind("Offset:"); index_e = line.rfind("StdDev:"); crop = line[index+7:index_e]; if crop == " NULL ": # Check for null value raise Exception('Null sample offset in file ' + flat) averages[0] = float(crop); elif ( line.rfind("Average Line Offset:") >= 0 ): index = line.rfind("Offset:"); index_e = line.rfind("StdDev:"); crop = line[index+7:index_e]; if crop == " NULL ": # Check for null value raise Exception('Null sample offset in file ' + flat) averages[1] = float(crop); elif ( line.rfind("Using IpFind result only:") >= 0 ): index = line.rfind("only:"); if (line[index + 7] == 1): print("Warning: This result based only on IpFind search.") print(str(averages)) return averages # Call lronac2isis on each input file, return list of output files. def lronac2isis( img_files, threads, outputFolder ): lronac2isis_cubs = [] for img in img_files: # Expect to end in .IMG, change to end in .cub and move to output folder newExtension = os.path.splitext(img)[0] + '.cub' cubFilePath = os.path.join(outputFolder, os.path.basename(newExtension)) if( os.path.exists(cubFilePath) ): print(cubFilePath + ' exists, skipping lronac2isis.') else: cmd = 'lronac2isis from='+ img +' to='+ cubFilePath add_job(cmd, threads) lronac2isis_cubs.append( cubFilePath ) wait_on_all_jobs() return lronac2isis_cubs # Call lronaccal on each input file, return list of output files. def lronaccal( cub_files, threads, delete=False ): lronaccal_cubs = [] for cub in cub_files: # Expect to end in .cub, change to end in .lronaccal.cub to_cub = os.path.splitext(cub)[0] + '.lronaccal.cub' if( os.path.exists(to_cub) ): print(to_cub + ' exists, skipping lronaccal.') else: cmd = 'lronaccal from=' + cub + ' to=' + to_cub add_job(cmd, threads) lronaccal_cubs.append( to_cub ) wait_on_all_jobs() if (delete): # Delete all input .cub files and log files for cub in cub_files: os.remove( cub ) lronaccal_log_files = glob.glob( os.path.commonprefix(cub_files) + '*.lronaccal.log' ) for file in lronaccal_log_files: os.remove( file ) return lronaccal_cubs # Call lronacecho on each input file, return list of output files. def lronacecho( cub_files, threads, delete=False ): lronacecho_cubs = [] for cub in cub_files: # Expect to end in .cub, change to end in .lronaccal.cub to_cub = os.path.splitext(cub)[0] + '.lronacecho.cub' if( os.path.exists(to_cub) ): print(to_cub + ' exists, skipping lronacecho.') else: cmd = 'lronacecho from='+ cub +' to='+ to_cub add_job(cmd, threads) lronacecho_cubs.append( to_cub ) wait_on_all_jobs() if( delete ): # Delete all input .cub files and log files for cub in cub_files: os.remove( cub ) return lronacecho_cubs # Call spiceinit and spicefit on each input file def spice(cub_files, spiceinit_options, threads): for cub in cub_files: cmd = 'spiceinit ' + spiceinit_options + ' from=' + cub add_job(cmd, threads) wait_on_all_jobs() for cub in cub_files: cmd = 'spicefit from='+ cub add_job(cmd, threads) wait_on_all_jobs() return # Returns true if the .cub LRONAC file has CROSSTRACK_SUMMING = 1 def isFileHalfRes(cubFilePath): return False; # It looks like the normal pvl file works so use it in all cases f = open(cubFilePath, 'r') for line in f: if ( line.rfind("CROSSTRACK_SUMMING") >= 0 ): index = line.rfind("="); crop = line[index+2]; result = (crop == "2") f.close() return result; # Left file is/home/smcmich1 in index 0, right is in index 1 def noproj( file_pairs, threads, delete, fakePvl, outputFolder): if fakePvl: # Generate temporary PVL files containing LRONAC definition # - We need one for full-res mode, one for half-X-res mode. fullResFilePath = os.path.join(outputFolder, 'noprojInstruments_fullRes.pvl') if os.path.exists(fullResFilePath): print(fullResFilePath + ' exists, using existing file.') else: # Need to write the file print('Generating LRONAC compatible .pvl file ' + fullResFilePath) f = open(fullResFilePath, 'w') f.write('Object = IdealInstrumentsSpecifications\n'); f.write(' UserName = auto\n'); f.write(' Created = 2013-07-18T13:42:00\n'); f.write(' LastModified = 2013-07-18T13:42:00\n\n'); f.write(' Group = "LUNAR RECONNAISSANCE ORBITER/NACL"\n'); f.write(' TransY = 16.8833\n') f.write(' ItransS = -2411.9\n') f.write(' TransX = 0.6475\n') f.write(' ItransL = -92.5\n') f.write(' DetectorSamples = 10000\n') f.write(' End_Group\n\n') f.write('End_Object\n') f.write('End') f.close() halfResFilePath = os.path.join(outputFolder, 'noprojInstruments_halfRes.pvl') if os.path.exists(halfResFilePath): print(halfResFilePath + ' exists, using existing file.') else: # Need to write the file print('Generating LRONAC compatible .pvl file ' + halfResFilePath) f = open(halfResFilePath, 'w') f.write('Object = IdealInstrumentsSpecifications\n'); f.write(' UserName = auto\n'); f.write(' Created = 2013-07-18T13:42:00\n'); f.write(' LastModified = 2013-07-18T13:42:00\n\n'); f.write(' Group = "LUNAR RECONNAISSANCE ORBITER/NACL"\n'); f.write(' TransY = 16.8833\n') f.write(' ItransS = -4823.8\n') # Halved f.write(' TransX = 0.6475\n') f.write(' ItransL = -185\n') # Halved f.write(' DetectorSamples = 5000\n') # Halved f.write(' End_Group\n\n') f.write('End_Object\n') f.write('End') f.close() noproj_pairs = dict(); for k, v in file_pairs.items(): noproj_pairs[k] = ['', '']; for i in range(2): # Process left and right image to_cub = os.path.splitext(v[i])[0] + '.noproj.cub' noproj_pairs[k][i] = to_cub; # Add file to output list if os.path.exists( to_cub ): print(to_cub + ' exists, skipping noproj.') else: # Generate pvl command if needed if fakePvl: fileIsHalfRes = isFileHalfRes(v[0]) if fileIsHalfRes: specsLine = ' specs=' + os.path.abspath(halfResFilePath) + ' '; else: # Full resolution specsLine = ' specs=' + os.path.abspath(fullResFilePath) + ' '; else: # Use the default file specsLine = ''; # Multiple noproj threads will create clashing temporary files # so we need to make temporary directories to run each thread in. tempDir = 'temp_' + str(k) + '_' + str(i) tempDir = os.path.join(outputFolder, tempDir) cmd = 'mkdir -p ' + tempDir + ' && ' \ + 'cd ' + tempDir + ' && ' \ + 'noproj from=' + os.path.abspath(v[i]) \ + ' match=' + os.path.abspath(v[0]) \ + specsLine \ + ' to=' + os.path.abspath(to_cub) + ' && ' \ + 'cd .. && rm -rf ' + tempDir add_job(cmd, threads) wait_on_all_jobs() if( delete ): # Clean up input cube files for v in file_pairs.values(): os.remove( v[0] ); os.remove( v[1] ); # if fakePvl: # These are not deleted in case this program is running in multiple threads # os.remove( halfResFilePath ); # os.remove( fullResFilePath ); return noproj_pairs; def lronacjitreg( noproj_pairs, threads, delete=False ): boundsCommands = '--correlator-type 2 --kernel 15 15' for k,v in noproj_pairs.items(): cmd = 'lronacjitreg ' + boundsCommands \ + ' --output-log outputLog_'+str(k)+'.txt' \ + ' '+ v[0] \ + ' '+ v[1]; add_job(cmd, threads) wait_on_all_jobs() # Read in all the shift values from the output text files averages = dict() for k,v in noproj_pairs.items(): flat_file = 'outputLog_'+str(k)+'.txt' print('Reading log file ' + flat_file) averages[k] = read_flatfile( flat_file ) if delete: os.remove( flat_file ) return averages def mosaic( noproj_pairs, averages, threads ): mosaicList = dict(); for k,v in noproj_pairs.items(): # Create mosaic output file mosaicPath = os.path.splitext(v[0])[0] + '.mosaic.cub' shutil.copy( v[0], mosaicPath ) # Copy the LE image to the output path xOffset = -1*averages[k][0] # Sign convention changes here yOffset = -1*averages[k][1] handmos( v[1], mosaicPath, str( int(round( xOffset )) ), str( int(round( yOffset )) ), threads ) mosaicList[k] = mosaicPath; wait_on_all_jobs() return mosaicList def handmos( fromcub, tocub, outsamp, outline, threads ): cmd = 'handmos from='+ fromcub +' mosaic='+ tocub \ +' outsample = '+ str(outsamp) \ +' outline = ' + str(outline) \ +' matchbandbin=FALSE priority=ontop'; add_job(cmd, threads); return def cubenorm( mosaicList, threads, delete=False ): normedList = dict(); for k,v in mosaicList.items(): normedPath = os.path.splitext(v)[0] + '.norm.cub' cmd = 'cubenorm from='+ v +' to='+ normedPath add_job(cmd, threads); normedList[k] = normedPath; wait_on_all_jobs() if( delete ): # Clean up input cube files for v in mosaicList.values(): os.remove(v); return normedList def cropInputs(inputFiles, outputFolder, cropAmount, threads, delete=False): outputPaths = [] for path in inputFiles: # Expect to end in .IMG, change to end in .cub and move to output folder newExtension = os.path.splitext(path)[0] + '.cropped.cub' croppedPath = os.path.join(outputFolder, os.path.basename(newExtension)) cmd = 'crop from='+ path +' to='+ croppedPath + ' nlines=' + str(cropAmount) add_job(cmd, threads) outputPaths.append( croppedPath ) wait_on_all_jobs() if delete: for path in inputFiles: os.remove(path) return outputPaths #-------------------------------------------------------------------------------- #TODO: Support for file based logging of results def main(): try: try: usage = "usage: lronac2mosaic.py [--help][--manual][--crop][--threads N]" \ "[--keep] LRONAC.IMG-files\n " + get_asp_version() parser = optparse.OptionParser(usage=usage) parser.set_defaults(delete =True) parser.set_defaults(cropAmount=0) parser.set_defaults(threads=4) parser.set_defaults(fakePvl=True) parser.add_option("--manual", action="callback", callback=man, help="Read the manual.") parser.add_option("-o", "--output-dir", dest="outputFolder", help="Output folder (default to input folder).",type="string") parser.add_option("--stop-at-no-proj", dest="stop_no_proj", action="store_true", help="Process the IMG files only to have SPICE attached.") parser.add_option("--resume-at-no-proj", dest="resume_no_proj", action="store_true", help="Start after spiceinit, lronaccal, lronacecho, and the optional crop. This allows for custom preparation of the inputs.") parser.add_option("--spiceinit-options", dest="spiceinit_options", help="Options to pass to spiceinit. Use quotes.", type="string", default="web=false spksmithed=true") parser.add_option("-c", "--crop", dest="cropAmount", help="Process only this many first lines of the images.",type="int") parser.add_option("-t", "--threads", dest="threads", help="Number of threads to use.",type="int") parser.add_option("-k", "--keep", action="store_false", dest="delete", help="Will not delete intermediate files.") parser.add_option("--p", dest="fakePvl", action="store_true", help="Don't automatically create a LRONAC pvl file") (options, args) = parser.parse_args() if not args: parser.error("need .IMG files") except optparse.OptionError as msg: raise Usage(msg) # Make sure only one pair of cubes was passed in input_file_pair = build_cube_pairs(args) if len(input_file_pair) > 1: raise Usage('Input error: Only one pair of input files are allowed, ' + 'with names like M1127782730LE.IMG and M1127782730RE.IMG.') if not options.outputFolder: # Set the output folder equal to the input folder options.outputFolder = os.path.dirname(args[0]) print('Using output folder: ' + options.outputFolder) if not os.path.exists(options.outputFolder) and len(options.outputFolder) > 1: os.makedirs(options.outputFolder) print("Start processing.") if not options.resume_no_proj: # If not skipping to later point print("lronac2isis") # Per-file operation, returns list of new files lronac2isised = lronac2isis( args, options.threads, options.outputFolder ) # Attach spice info to cubes (adds to existing files). This # must happen before calibration. print("spiceinit") spice(lronac2isised, options.spiceinit_options, options.threads) print("lronaccal") # Per-file operation, returns list of new files lronaccaled = lronaccal(lronac2isised, options.threads, options.delete) print("lronacecho") # Per-file operation, returns list of new files lronacechod = lronacecho( lronaccaled, options.threads, options.delete ) if (options.cropAmount > 0): # Crop the input files as soon as ISIS calls allow it lronacechod = cropInputs(lronacechod, options.outputFolder, options.cropAmount, options.threads, options.delete) if options.stop_no_proj: # Stop early if requested print("Finished") return 0 if options.resume_no_proj: # If resume option was set lronacechod = args print("build_cube_pairs") # Detected corresponding pairs of cubes lronac_file_pairs = build_cube_pairs(lronacechod) print("noproj") # Per-file operation noprojed_file_pairs = noproj( lronac_file_pairs, options.threads, options.delete, options.fakePvl, options.outputFolder) print("lronacjitreg") # Determines mean shift for each file pair averages = lronacjitreg( noprojed_file_pairs, options.threads, options.delete ) print("mosaic") # handmos - Use mean shifts to combine the file pairs mosaicked = mosaic( noprojed_file_pairs, averages, options.threads ) # Clean up noproj files if( options.delete ): for cub in noprojed_file_pairs.values(): os.remove( cub[0] ) os.remove( cub[1] ) # Run a final cubenorm across the image: cubenorm( mosaicked, options.threads, options.delete ) print("Finished") return 0 except Usage as err: print(err.msg, file=sys.stderr) return 2 # To more easily debug this program, comment out this catch block. # except Exception as err: # sys.stderr.write( str(err) + '\n' ) # return 1 if __name__ == "__main__": sys.exit(main()) ================================================ FILE: src/asp/Tools/lronacjitreg.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file lronacjitreg.cc /// #include <asp/Core/DemDisparity.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <vw/Math/Functors.h> #include <vw/Image/ImageView.h> #include <vw/Image/ImageMath.h> #include <vw/Image/MaskViews.h> #include <vw/Image/Manipulation.h> #include <vw/FileIO/DiskImageResource.h> #include <vw/FileIO/DiskImageView.h> #include <vw/FileIO/DiskCacheImageView.h> #include <vw/FileIO/GdalWriteOptions.h> #include <vw/Stereo/PrefilterEnum.h> #include <vw/Stereo/CorrelationView.h> #include <vw/Stereo/CostFunctions.h> #include <vw/Stereo/DisparityMap.h> #include <vw/Stereo/Correlate.h> #include <vw/Math/RANSAC.h> #include <vw/Math/Geometry.h> #include <vw/Core/Log.h> #include <iomanip> // Can't do much about warnings in boost except to hide them #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> #pragma GCC diagnostic pop namespace po = boost::program_options; // - Use the correlate tool to determine the mean X and Y offset // between the two cubes (which should be almost parallel with // some overlap) // - Output those two values. struct Parameters: vw::GdalWriteOptions { // Input paths std::string leftFilePath; std::string rightFilePath; std::string rowLogFilePath; // Settings float log; int h_corr_min, h_corr_max; int v_corr_min, v_corr_max; vw::Vector2i kernel; int lrthresh; int correlator_type; int cropWidth; }; bool handle_arguments(int argc, char* argv[], Parameters& opt) { po::options_description general_options("Options"); general_options.add_options() ("output-log", po::value(&opt.rowLogFilePath)->default_value(""), "Explicitly specify the per row output text file") ("log", po::value(&opt.log)->default_value(1.4), "Apply LOG filter with the given sigma, or 0 to disable") ("crop-width", po::value(&opt.cropWidth)->default_value(200), "Crop images to this width before disparity search") ("h-corr-min", po::value(&opt.h_corr_min)->default_value(0), "Minimum horizontal disparity - computed automatically if not set.") ("h-corr-max", po::value(&opt.h_corr_max)->default_value(-1), "Maximum horizontal disparity - computed automatically if not set.") ("v-corr-min", po::value(&opt.v_corr_min)->default_value(0), "Minimum vertical disparity - computed automatically if not set.") ("v-corr-max", po::value(&opt.v_corr_max)->default_value(-1), "Maximum vertical disparity - computed automatically if not set.") ("kernel", po::value(&opt.kernel)->default_value(vw::Vector2i(15,15)), "Correlation kernel size") ("lrthresh", po::value(&opt.lrthresh)->default_value(2), "Left/right correspondence threshold") ("correlator-type", po::value(&opt.correlator_type)->default_value(0), "0 - Abs difference; 1 - Sq Difference; 2 - NormXCorr"); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("left", po::value(&opt.leftFilePath)) ("right", po::value(&opt.rightFilePath)); po::positional_options_description positional_desc; positional_desc.add("left", 1); positional_desc.add("right", 1); std::string usage("[options] <left> <right>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (!vm.count("left") || !vm.count("right")) vw::vw_throw(vw::ArgumentErr() << "Requires <left> and <right> input in order to proceed.\n\n" << usage << general_options); return true; } bool determineShifts(Parameters & params, double &dX, double &dY) { // Verify images are present boost::filesystem::path leftBoostPath (params.leftFilePath); boost::filesystem::path rightBoostPath(params.rightFilePath); if (!boost::filesystem::exists(boost::filesystem::path(params.leftFilePath))) { vw::vw_out() << "Error: input file " << params.leftFilePath << " is missing!\n"; return false; } if (!boost::filesystem::exists(boost::filesystem::path(params.rightFilePath))) { vw::vw_out() << "Error: input file " << params.rightFilePath << " is missing!\n"; return false; } // Load both images vw::vw_out() << "Loading images left=" << params.leftFilePath << " and right=" << params.rightFilePath << ".\n"; vw::DiskImageView<vw::PixelGray<float>> left_disk_image (params.leftFilePath); vw::DiskImageView<vw::PixelGray<float>> right_disk_image(params.rightFilePath); const int imageWidth = std::min(left_disk_image.cols(), right_disk_image.cols()); const int imageHeight = std::min(left_disk_image.rows(), right_disk_image.rows()); const int imageTopRow = 0; const int imageMidPointX = imageWidth / 2; const int cropStartX = imageMidPointX - (params.cropWidth/2); // Restrict processing to the border of the images // - Since both images were nproj'd the overlap areas should be in about the same spots. const vw::BBox2i crop_roi(cropStartX, imageTopRow, params.cropWidth, imageHeight); vw::vw_out() << "Expected overlap ROI = " << crop_roi << "\n"; const int SEARCH_RANGE_EXPANSION = 5; int ipFindXOffset = 0; int ipFindYOffset = 0; bool ransacSuccess = false; // If the search box was not fully populated use ipfind to estimate a search region if ((params.h_corr_min > params.h_corr_max) || (params.v_corr_min > params.v_corr_max)) { vw::vw_out() << "Gathering interest points...\n"; int points_per_tile = 500; double nodata1 = 0, nodata2 = 0; vw::ImageViewRef<vw::PixelGray<float>> left_crop = vw::crop(left_disk_image, crop_roi); vw::ImageViewRef<vw::PixelGray<float>> right_crop = vw::crop(right_disk_image, crop_roi); // Gather interest points and match them std::vector<vw::ip::InterestPoint> matched_ip1, matched_ip2; size_t number_of_jobs = 1; bool use_cached_ip = false; asp::detect_match_ip(matched_ip1, matched_ip2, vw::pixel_cast<float>(left_crop), vw::pixel_cast<float>(right_crop), points_per_tile, number_of_jobs, "", "", use_cached_ip, nodata1, nodata2); if (matched_ip1.empty() || matched_ip2.empty()) { ransacSuccess = false; vw::vw_out() << "Failed to find any matching interest points, " << "defaulting to large search range.\n"; } else { vw::vw_out() << "Found " << matched_ip1.size() << ", " << matched_ip2.size() << " matched interest points.\n"; // Filter interest point matches vw::math::RandomSampleConsensus<vw::math::SimilarityFittingFunctor, vw::math::InterestPointErrorMetric> ransac(vw::math::SimilarityFittingFunctor(), vw::math::InterestPointErrorMetric(), 100, 5, 100, true); std::vector<vw::Vector3> ransac_ip1 = vw::ip::iplist_to_vectorlist(matched_ip1); std::vector<vw::Vector3> ransac_ip2 = vw::ip::iplist_to_vectorlist(matched_ip2); // Finding offset using RANSAC. try { vw::math::Matrix<double> H(ransac(ransac_ip1, ransac_ip2)); vw::vw_out() << "ipfind based similarity: " << H << "\n"; ipFindXOffset = static_cast<int>(H[0][2]); ipFindYOffset = static_cast<int>(H[1][2]); ransacSuccess = true; } catch (...) { vw::vw_out() << "RANSAC solution failed, defaulting to large search range.\n"; ransacSuccess = false; } } } vw::BBox2i searchRegion(ipFindXOffset, ipFindYOffset, 1, 1); searchRegion.expand(SEARCH_RANGE_EXPANSION); if (!ransacSuccess) { // Default to a large search radius searchRegion.min()[0] = -100; searchRegion.max()[0] = 100; searchRegion.min()[1] = -100; searchRegion.max()[1] = 100; } // Factor in user bounds overrides if (params.h_corr_min < params.h_corr_max) { searchRegion.min()[0] = params.h_corr_min; searchRegion.max()[0] = params.h_corr_max; } if (params.v_corr_min < params.v_corr_max) { searchRegion.min()[1] = params.v_corr_min; searchRegion.max()[1] = params.v_corr_max; } vw::vw_out() << "Disparity search image size = " << params.cropWidth << " by " << imageHeight << "\n"; vw::vw_out() << "Offset search region = " << searchRegion << "\n"; // Use correlation function to compute image disparity vw::stereo::CostFunctionType corr_type = vw::stereo::ABSOLUTE_DIFFERENCE; if (params.correlator_type == 1) corr_type = vw::stereo::SQUARED_DIFFERENCE; else if (params.correlator_type == 2) corr_type = vw::stereo::CROSS_CORRELATION; vw::vw_out() << "Running stereo correlation.\n"; // Pyramid Correlation works best rasterizing in 1024^2 chunks vw::vw_settings().set_default_tile_size(1024); int filter_kernel_size = 5; int max_pyramid_levels = 5; int corr_timeout = 0; int min_lr_level = 0; double seconds_per_op = 0.0; vw::DiskCacheImageView<vw::PixelMask<vw::Vector2f>> disparity_map( vw::stereo::pyramid_correlate( vw::apply_mask(vw::create_mask_less_or_equal( vw::crop(left_disk_image, crop_roi), 0)), vw::apply_mask(vw::create_mask_less_or_equal( vw::crop(right_disk_image, crop_roi), 0)), vw::constant_view(vw::uint8(255), left_disk_image), vw::constant_view(vw::uint8(255), right_disk_image), vw::stereo::PREFILTER_LOG, params.log, searchRegion, params.kernel, corr_type, corr_timeout, seconds_per_op, params.lrthresh, min_lr_level, filter_kernel_size, max_pyramid_levels)); // Compute the mean horizontal and vertical shifts // - Currently disparity_map contains the per-pixel shifts vw::vw_out() << "Accumulating offsets.\n"; std::ofstream out; const bool writeLogFile = !params.rowLogFilePath.empty(); if (writeLogFile) { out.open(params.rowLogFilePath.c_str()); if (out.fail()) { vw::vw_out() << "Failed to create output log file " << params.rowLogFilePath << "!\n"; return false; } vw::vw_out() << "Created output log file: " << params.rowLogFilePath << "\n"; out << "# Lronacjitreg ISIS Application Results" << "\n"; out << "# Coordinates are (Sample, Line) unless indicated" << "\n"; out << "#\n# **** Image Input Information ****\n"; out << "# FROM: " << params.leftFilePath << "\n"; out << "# Lines: " << std::setprecision(0) << imageHeight << "\n"; out << "# Samples: " << std::setprecision(0) << imageWidth << "\n"; out << "# SampOffset: " << cropStartX << "\n"; out << "# TopLeft: " << std::setw(7) << std::setprecision(0) << cropStartX << " " << std::setw(7) << std::setprecision(0) << 0 << "\n"; out << "# LowerRight: " << std::setw(7) << std::setprecision(0) << cropStartX + params.cropWidth << " " << std::setw(7) << std::setprecision(0) << imageHeight << "\n"; out << "\n"; out << "# MATCH: " << params.rightFilePath << "\n"; out << "# Lines: " << std::setprecision(0) << imageHeight << "\n"; out << "# Samples: " << std::setprecision(0) << imageWidth << "\n"; out << "# SampOffset: " << cropStartX << "\n"; out << "# TopLeft: " << std::setw(7) << std::setprecision(0) << cropStartX << " " << std::setw(7) << std::setprecision(0) << 0 << "\n"; out << "# LowerRight: " << std::setw(7) << std::setprecision(0) << cropStartX+params.cropWidth << " " << std::setw(7) << std::setprecision(0) << imageHeight << "\n"; out << "\n"; } double meanVertOffset = 0.0; double meanHorizOffset = 0.0; int numValidRows = 0; int totalNumValidPixels = 0; vw::StdDevAccumulator<float> stdCalcX, stdCalcY; std::vector<double> rowOffsets(disparity_map.rows()); std::vector<double> colOffsets(disparity_map.rows()); for (int row=0; row<disparity_map.rows(); row++) { // Accumulate the shifts for this row vw::StdDevAccumulator<float> stdDevCalcRow; double rowSum = 0.0; double colSum = 0.0; double stdDevRow = 0.0; int numValidInRow = 0; for (int col=0; col<disparity_map.cols(); col++) { if (vw::is_valid(disparity_map(col,row))) { float dY = disparity_map(col,row)[1]; // Y float dX = disparity_map(col,row)[0]; // X rowSum += dY; colSum += dX; ++numValidInRow; stdCalcX(dX); stdCalcY(dY); stdDevCalcRow(dY); } } // End loop through cols // Compute mean shift for this row if (numValidInRow == 0) { rowOffsets[row] = 0; colOffsets[row] = 0; stdDevRow = 0; } else { // At least one valid pixel rowOffsets[row] = rowSum / static_cast<double>(numValidInRow); colOffsets[row] = colSum / static_cast<double>(numValidInRow); stdDevRow = stdDevCalcRow.value(); totalNumValidPixels += numValidInRow; ++numValidRows; } if (writeLogFile) { out << std::setprecision(4) << std::setw(5) << row << ", " << std::setw(6) << rowOffsets[row] << ", " << std::setw(6) << colOffsets[row] << " Count = " << std::setw(3) << numValidInRow << " Std = " << std::setw(4) << stdDevRow << "\n"; } } // End loop through rows if (writeLogFile) { out << "\n# **** Registration Data ****\n"; out << "# RegFile: " << "" << "\n"; out << "# OverlapSize: " << std::setw(7) << params.cropWidth << " " << std::setw(7) << imageHeight << "\n"; out << "# Sample Spacing: " << std::setprecision(1) << 1 << "\n"; out << "# Line Spacing: " << std::setprecision(1) << 1 << "\n"; out << "# Columns, Rows: " << params.kernel[0] << " " << params.kernel[1] << "\n"; out << "# Corr. Algorithm: "; switch(params.correlator_type) { case 1: out << "SQUARED_DIFFERENCE" << "\n"; break; case 2: out << "CROSS_CORRELATION" << "\n"; break; default: out << "ABSOLUTE_DIFFERENCE" << "\n"; break; }; if (numValidRows > 0) { out << "# Using IpFind result only: 0" << "\n"; out << "# Average Sample Offset: " << std::setprecision(4) << stdCalcX.mean() << " StdDev: " << std::setprecision(4) << stdCalcX.value() << "\n"; out << "# Average Line Offset: " << std::setprecision(4) << stdCalcY.mean() << " StdDev: " << std::setprecision(4) << stdCalcY.value() << "\n"; } else { if (ransacSuccess) { vw::vw_out() << "Pixel correlation search failed, using IpFind results.\n"; out << "# Using IpFind result only: 1" << "\n"; out << "# Average Sample Offset: " << std::setprecision(4) << ipFindXOffset << " StdDev: 0.0" << "\n"; out << "# Average Line Offset: " << std::setprecision(4) << ipFindYOffset << " StdDev: 0.0" << "\n"; } else { out << "# Using IpFind result only: 0" << "\n"; out << "# Average Sample Offset: NULL StdDev: NULL\n"; out << "# Average Line Offset: NULL StdDev: NULL\n"; } } out.close(); } if ((numValidRows == 0) && (!ransacSuccess)) { vw::vw_out() << "Error: No valid pixel matches found!\n"; return false; } // Compute overall mean shift meanVertOffset = stdCalcY.mean(); meanHorizOffset = stdCalcX.mean(); dX = meanHorizOffset; dY = meanVertOffset; vw::vw_out() << "Found " << totalNumValidPixels << " valid pixels in " << numValidRows << " rows\n"; return true; } int main(int argc, char* argv[]) { try { // Parse the input parameters Parameters params; if (!handle_arguments(argc, argv, params)) { vw::vw_out() << "Failed to parse input parameters!\n"; return 1; } double dX, dY; if (determineShifts(params, dX, dY)) { // Success, print the results vw::vw_out() << "Mean sample offset = " << dX << "\n"; vw::vw_out() << "Mean line offset = " << dY << "\n"; } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/mapproject ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' This tool implements a multi-process version of mapproject to greatly increase the speed of map projecting ISIS images. ''' import sys import os, glob, re, shutil, subprocess, string, time, errno, argparse, math # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_alg_utils import * import asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH. First try to find things in libexec, # and if that fails, then in bin. Otherwise mapproject_single # cannot be found. os.environ["PATH"] = libexecpath + os.pathsep + \ basepath + os.pathsep + \ os.environ["PATH"] # This is explained in asp_system_utils. if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] def generateTileList(fullWidth, fullHeight, tileSize): """Generate a full list of tiles for this image""" numTilesX = int(math.ceil(fullWidth / float(tileSize))) numTilesY = int(math.ceil(fullHeight / float(tileSize))) tileList = [] for r in range(0, numTilesY): for c in range(0, numTilesX): # Starting pixel positions for the tile tileStartY = r * tileSize tileStartX = c * tileSize # Determine the size of this tile thisWidth = tileSize thisHeight = tileSize if (r == numTilesY-1): # If the last row thisHeight = fullHeight - tileStartY # Height is last remaining pixels if (c == numTilesX-1): # If the last col thisWidth = fullWidth - tileStartX # Width is last remaining pixels # Get the end pixels for this tile tileStopY = tileStartY + thisHeight # Stop values are exclusive tileStopX = tileStartX + thisWidth # Create a name for this tile # - Tile format is tile_col_row_width_height_.tif tileString = generateTileName(tileStartX, tileStartY, tileStopX, tileStopY) tileList.append((tileStartX, tileStartY, tileStopX, tileStopY, tileString)) return (numTilesX, numTilesY, tileList) def writeSingleTile(options): """Writes a single tile according to the options""" # Determine the name of the tile we need to write tileName = generateTileName(options.pixelStartX, options.pixelStartY, options.pixelStopX, options.pixelStopY) tilePath = os.path.join(options.workDir, tileName) # Bounds for this tile startX = int(options.pixelStartX) stopX = int(options.pixelStopX) startY = int(options.pixelStartY) stopY = int(options.pixelStopY) # If the user passed in the t_pixelwin argument, reconcile it with the internal ROI we need. extraArgs = [] i = 0 while i < len(options.extraArgs): arg = options.extraArgs[i] if arg == '--t_pixelwin': # Skip this element and grab the user provided pixel bounds userStartX = int(options.extraArgs[i+1]) userStartY = int(options.extraArgs[i+2]) userStopX = int(options.extraArgs[i+3]) userStopY = int(options.extraArgs[i+4]) # Reconcile the bounding box if (startX < userStartX): startX = userStartX if (stopX > userStopX ): stopX = userStopX if (startY < userStartY): startY = userStartY if (stopY > userStopY ): stopY = userStopY # If there is no tile left to generate then we can just return here if ((startX > stopX) or (startY > stopY)): return 0 i += 5 else: extraArgs.append(arg) i += 1 # Just call the command for a single tile. cmd = ['mapproject_single', '--t_pixelwin', str(startX), str(startY), str(stopX), str(stopY), options.demPath, options.imagePath, options.cameraPath, tilePath] if options.noGeoHeaderInfo: cmd += ['--no-geoheader-info'] cmd = cmd + extraArgs # Append other options asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput, realTimeOutput = True) if options.convertTiles: # Make uint8 version of the tile for debugging tilePathU8 = os.path.splitext(tilePath)[0] + 'U8.tif' cmd = ['gdal_translate', '-ot', 'byte', '-scale', tilePath, tilePathU8] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) return 0 def parse_gdal_metadata(filename, meta_label): """ Seek out the metadata for the given label in a tif file and return that metadata as a map having key and value pairs. Use gdalinfo to query the tif file. """ args = [filename] sep = "" verbose = False gdal_settings = asp_system_utils.run_and_parse_output("gdalinfo", args, sep, verbose, return_full_lines = True) meta_dict = {} parseBlock = False for v in sorted(gdal_settings.keys()): if gdal_settings[v] == meta_label + ':': # Just reached the line with the label, so need to parse # the block of next several lines which start with a # space. Notice how above there is a column at the end of # the label line. parseBlock = True continue if len(gdal_settings[v]) == 0 or gdal_settings[v][0] != " ": # Another block started if parseBlock: # Past the current block, time to stop break else: # Did not reach the desired block yet continue if len(gdal_settings[v]) > 0 and parseBlock: # In the desired block m = re.match(r"^\s*(.*?)\s*=\s*(.*?)\s*$", gdal_settings[v]) if not m: continue meta_dict[m.group(1)] = m.group(2) return meta_dict def format_metadata(meta_label, meta_dict): """ Format the metadata with given label and entries as the GDAL VRT format expects it. """ # From meta_label = "RPC Metadata" extract "RPC". vrt_domain = "" m = re.match(r"^([\w]+)\s+Metadata", meta_label) if m: vrt_domain = m.group(1) # The VRT format is quite particular # https://gdal.org/drivers/raster/vrt.html if vrt_domain == "": meta_lines = [" <Metadata>\n"] else: meta_lines = [" <Metadata domain=\"" + vrt_domain + "\">\n"] for v in sorted(meta_dict.keys()): line = " <MDI key=\"" + v + "\">" + meta_dict[v] + "</MDI>\n" meta_lines.append(line) meta_lines.append(" </Metadata>\n") return meta_lines #------------------------------------------------------------------------------ # If there is an input _RPC.TXT or .RPB, create such an output file as well, # to store there the RPC coefficients. Need this for stereo later on. # For some reason, this function must be invoked after the writing # of the output tif file has been competed. Otherwise something wipes it. def maybe_copy_rpc(inputPath, outputPath): for ext in ['_RPC.TXT', '_rpc.txt', '.RPB', '.rpb']: input_rpc = os.path.splitext(inputPath )[0] + ext output_rpc = os.path.splitext(outputPath)[0] + ext if os.path.exists(input_rpc): print("Copied " + input_rpc + " to " + output_rpc) shutil.copy(input_rpc, output_rpc) def main(argsIn): relOutputPath = "" try: # Get the help text from the base C++ tool so we can append it to the python help cmd = ['mapproject_single', '--help'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) baseHelp, err = p.communicate() except OSError: print("Error: Unable to find required mapproject_single tool!") return -1 # Extract the version and help text vStart = baseHelp.find('[ASP') vEnd = baseHelp.find(']', vStart)+1 version = baseHelp[vStart:vEnd] baseHelpText = "Help options for the underlying 'mapproject_single' program:\n" + \ baseHelp[vEnd:] # Use a parser that ignores unknown options. Those will be passed to mapproject_single. usage = "mapproject [options] <dem> <camera-image> <camera-model> <output-image>\n" + \ "Instead of the DEM file, a datum can be provided, such as\n" + \ "WGS84, NAD83, NAD27, D_MOON, D_MARS, and MOLA." parser = argparse.ArgumentParser(usage=usage, epilog=baseHelpText, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("--processes", dest="numProcesses", type=int, default=None, help="Number of processes to use on each node (the default is for the " + \ "program to choose).") parser.add_argument("--num-processes", dest="numProcesses2", type=int, default=None, help="Same as --processes. Used for backwards compatibility.") parser.add_argument('--nodes-list', dest='nodesListPath', default=None, help='The list of computing nodes, one per line. ' + \ 'If not provided, run on the local machine.') parser.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2', help='Options to pass directly to GNU Parallel.') parser.add_argument('--tile-size', dest='tileSize', default=None, type=int, help = 'Size of square tiles to break up processing up ' + \ 'into. Each tile is run by an individual process. The ' + \ 'default is 1024 pixels for ISIS cameras, as then each ' + \ 'process is single-threaded, and 5120 for other cameras, ' + \ 'as such a process is multi-threaded, and disk I/O ' + \ 'becomes a bigger consideration.') # Directory where the job is running parser.add_argument('--work-dir', dest='workDir', default=None, help='Working directory to assemble the tiles in.') parser.add_argument('--run-dir', dest='runDir', default=None, help='Directory in which the script is running.') parser.add_argument("--suppress-output", action="store_true", default=False, dest="suppressOutput", help="Suppress output of sub-calls.") parser.add_argument("--no-geoheader-info", action="store_true", default=False, dest="noGeoHeaderInfo", help="Suppress writing some auxiliary information in geoheaders.") # DEBUG options parser.add_argument("--keep", action="store_true", dest="keep", default=False, help="Do not delete the temporary files.") parser.add_argument("--convert-tiles", action="store_true", dest="convertTiles", help="Generate a uint8 version of each tile") parser.add_argument("--cog", action="store_true", dest="cog", default=False, help="Write a cloud-optimized GeoTIFF (COG).") parser.add_argument('-v', '--version', dest='version', default=False, action='store_true', help='Display the version of software.') # PRIVATE options # These specify the tile location to request, bypassing the need to query mapproject. parser.add_argument('--pixelStartX', dest='pixelStartX', default=None, type=int, help=argparse.SUPPRESS) parser.add_argument('--pixelStartY', dest='pixelStartY', default=None, type=int, help=argparse.SUPPRESS) parser.add_argument('--pixelStopX', dest='pixelStopX', default=None, type=int, help=argparse.SUPPRESS) parser.add_argument('--pixelStopY', dest='pixelStopY', default=None, type=int, help=argparse.SUPPRESS) # This call handles all the parallel_mapproject specific options. (options, args) = parser.parse_known_args(argsIn) if options.version: asp_system_utils.print_version_and_exit() if not args and not options.version: parser.print_help() sys.exit(1) # This can handle spaces in directory names, unlike when GNU parallel is in charge if options.runDir is not None: os.chdir(options.runDir) # Run an initial query to parse and validate the user input sep = "," verbose = False progName = 'mapproject_single' settings = asp_system_utils.run_and_parse_output(progName, args + ['--parse-options'], sep, verbose) options.demPath = settings["dem"][0] options.imagePath = settings["image"][0] options.cameraPath = settings["camera"][0] options.outputPath = settings["output_file"][0] # Remove these entries from the arguments. # TODO(oalexan1): This is fragile. What if we have the image file both on its own # and as an argument to some option? That is not the case for now. for v in [options.demPath, options.imagePath, options.cameraPath, options.outputPath]: if v != "" and v in args: args.remove(v) # This may contain --t_pixelwin, to be parsed later. options.extraArgs = args startTime = time.time() # Determine if this is a main copy or a spawned copy spawnedCopy = ((options.pixelStartX is not None) and \ (options.pixelStartY is not None) and \ (options.pixelStopX is not None) and \ (options.pixelStopY is not None) and \ options.workDir is not None) if spawnedCopy: # This copy was spawned to process a single tile return writeSingleTile(options) # Now we are in the main process, not in a spawned copy # See if this is the ISIS session. The image file or camera file # must end in .cub (both are possible), but the camera file must # not end in .json, as then the CSM session is used. camExt = os.path.splitext(options.cameraPath)[1].lower() isIsis = (asp_image_utils.isIsisFile(options.imagePath) or asp_image_utils.isIsisFile(options.cameraPath)) \ and (camExt != '.json') # If the user did not set the tile size, then for ISIS use small # tiles, to have them run in parallel as individual processes, # since each process is necessarily single-threaded. For other # cameras use bigger tiles, as each process is multi-threaded, and # then file I/O is a bigger consideration. if options.tileSize is None: if isIsis: options.tileSize = 1024 else: options.tileSize = 5120 # See if the input tif file has RPC coefficients embedded in it. # In that case need to save them later in the output mapprojected # image. rpc_label = 'RPC Metadata' rpc_dict = parse_gdal_metadata(options.imagePath, rpc_label) rpc_lines = format_metadata(rpc_label, rpc_dict) # Handle --query-pixel if '--query-pixel' in options.extraArgs: cmd = ['mapproject_single', options.demPath, options.imagePath, options.cameraPath, options.outputPath] + options.extraArgs p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) ans, err = p.communicate() print(ans) return 0 # Handle --query-projection query_only = False if '--query-projection' in options.extraArgs: query_only = True # Wipe this, it will be added later right below asp_cmd_utils.wipe_option(options.extraArgs, '--query-projection', 0) # Create the output folder if needed, before --query-projection writes the # WKT file there outputFolder = os.path.dirname(options.outputPath) if outputFolder == '': outputFolder = './' asp_file_utils.createFolder(outputFolder) # Run mapproject_single --query-projection to get image size and projection queryArgs = ['--query-projection', options.demPath, options.imagePath, options.cameraPath, options.outputPath] queryArgs = queryArgs + options.extraArgs if options.noGeoHeaderInfo: queryArgs += ['--no-geoheader-info'] sep = "," queryVerbose = (query_only or not options.suppressOutput) querySettings = asp_system_utils.run_and_parse_output( 'mapproject_single', queryArgs, sep, queryVerbose) if query_only: return 0 fullWidth = int(querySettings['image_width'][0]) fullHeight = int(querySettings['image_height'][0]) print('Output image size is ' + str(fullWidth) + ' by ' + str(fullHeight) + ' pixels.') # For now we just break up the image into a user-specified tile size (default 1000x1000) numTilesX, numTilesY, tileList = generateTileList(fullWidth, fullHeight, options.tileSize) numTiles = numTilesX * numTilesY print('Splitting into ' + str(numTilesX) + ' by ' + str(numTilesY) + ' tiles.') outputName = os.path.basename(options.outputPath) # Make a temporary directory to store the tiles if options.workDir: tempFolder = options.workDir else: # No folder provided, create a default one tempFolder = os.path.join(outputFolder, outputName.replace('.', '_') + '_tiles/') asp_file_utils.createFolder(tempFolder) # Generate a text file that contains the boundaries for each tile argumentFilePath = os.path.join(tempFolder, 'argumentList.txt') with open(argumentFilePath, 'w') as argumentFile: for tile in tileList: argumentFile.write(str(tile[0]) + '\t' + str(tile[1]) + '\t' + str(tile[2]) + '\t' + str(tile[3]) + '\n') # Indicate to GNU Parallel that there are multiple tab-separated # variables in the text file we just wrote parallelArgs = ['--colsep', "\\t"] if options.parallel_options is not None: parallelArgs += options.parallel_options.split(' ') # Get the number of available nodes and CPUs per node numNodes = asp_system_utils.getNumNodesInList(options.nodesListPath) # We assume all machines have the same number of CPUs (cores) cpusPerNode = asp_system_utils.get_num_cpus() processesPerCpu = 1 # Handle the situation that both --processes and --num-processes can happen if (options.numProcesses is not None) and (options.numProcesses2 is not None): raise Exception("Cannot set both --processes and --num-processes.") if options.numProcesses is None and (options.numProcesses2 is not None): # Copy over --num-processes to --processes options.numProcesses = options.numProcesses2 # Set the optimal number of processes if the user did not specify if not options.numProcesses: options.numProcesses = cpusPerNode * processesPerCpu # Note: mapproject can run with multiple threads on non-ISIS data but we don't use that # functionality here since we call mapproject with one tile at a time. # No need for more processes than their are tiles! if options.numProcesses > numTiles: options.numProcesses = numTiles # Build the command line that will be passed to GNU parallel # - The numbers in braces will receive the values from the text file we wrote earlier # - The output path used here does not matter since spawned copies compute the correct tile path. python_path = sys.executable # children must use same Python as parent # We use below the libexec_path to call python, not the shell script mapproject_path = asp_system_utils.libexec_path('mapproject') commandList = [python_path, mapproject_path, '--pixelStartX', '{1}', '--pixelStartY', '{2}', '--pixelStopX', '{3}', '--pixelStopY', '{4}', '--work-dir', tempFolder, options.demPath, options.imagePath, options.cameraPath, options.outputPath] if '--threads' not in options.extraArgs: commandList = commandList + ['--threads', '8'] # If not specified use 8 threads if options.convertTiles: commandList = commandList + ['--convert-tiles'] if options.suppressOutput: commandList = commandList + ['--suppress-output'] commandList = commandList + options.extraArgs # Append other options # Append the run directory runDir = asp_system_utils.escape_token(os.getcwd()) commandList = commandList + ['--run-dir', runDir] # Prepend the parallel arguments commandList = parallelArgs + commandList # Use GNU parallel call to distribute the work across computers # - This call will wait until all processes are finished verbose = True asp_system_utils.runInGnuParallel(options.numProcesses, argumentFilePath, commandList, options.nodesListPath, verbose) # Find the tiles that were generated tiles = [] for tile in tileList: outTile = os.path.join(tempFolder, tile[4]) if os.path.exists(outTile): tiles.append(outTile) else: print("Warning: Skipping non-existing file: ", outTile) if len(tiles) == 0: print("Removing: " + tempFolder) asp_file_utils.removeFolderIfExists(tempFolder) raise Exception("No mapprojected tif tiles were generated. Examine the " + \ "output above for more information.") # Build a gdal VRT file which is composed of all the processed tiles vrtPath = os.path.join(tempFolder, 'mosaic.vrt') cmd = "gdalbuildvrt -resolution highest " + vrtPath + " " + " ".join(tiles) ret = subprocess.call(["gdalbuildvrt", "-resolution", "highest", vrtPath]+tiles) if ret != 0: print("gdalbuildvrt error ", ret) exit(1) # Modify the vrt to append some metadata from the original tiles or the input file if not options.noGeoHeaderInfo: meta_label = 'Metadata' meta_dict = parse_gdal_metadata(tiles[0], meta_label) meta_lines = format_metadata(meta_label, meta_dict) # Insert the metadata after the first line in the vrt. f = open(vrtPath, "r") lines = f.readlines() lines_before = [ lines[0] ] lines_after = lines[1:len(lines)] f.close() lines = lines_before + meta_lines if len(rpc_dict) > 0: lines += rpc_lines lines += lines_after f = open(vrtPath, "w") f.writelines(lines) f.close() # Convert VRT file to final output file cmd = "gdal_translate -co BIGTIFF=IF_SAFER " if options.cog: # Use GDAL COG driver for cloud-optimized output. This ignores the # INTERLEAVE, TILED options. cmd += "-of COG -co COMPRESS=DEFLATE -co BLOCKSIZE=512 " else: # Standard tiled GeoTIFF cmd += "-co INTERLEAVE=BAND -co TILED=yes -co compress=lzw -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 " cmd += vrtPath + " " + options.outputPath print(cmd) ans = os.system(cmd) # Clean up temporary files if not options.keep: print("Removing: " + tempFolder) asp_file_utils.removeFolderIfExists(tempFolder) if ans == 0: print("Wrote: " + options.outputPath) maybe_copy_rpc(options.imagePath, options.outputPath) endTime = time.time() print("Finished in " + str(endTime - startTime) + " seconds.") if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/Tools/mapproject_single.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file mapproject.cc /// /// This program will project a camera image onto a DEM using the /// camera model. /// TODO: This creates an RGBA output for an RGB input. /// It should create an RBG output for RGB input, /// and same for RGBA. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/StereoSettings.h> #include <asp/Camera/MapprojectImage.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Core/DemUtils.h> #include <asp/Core/CartographyUtils.h> #include <vw/Cartography/CameraBBox.h> #include <vw/Cartography/DatumUtils.h> #include <vw/Camera/PinholeModel.h> #include <vw/Cartography/PointImageManipulation.h> #include <vw/FileIO/FileTypes.h> #include <vw/Image/ImageChannels.h> #include <fstream> #include <iomanip> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; /// The pixel type used for the DEM data typedef PixelMask<float> DemPixelT; void handle_arguments(int argc, char *argv[], asp::MapprojOptions& opt) { po::options_description general_options(""); double NaN = std::numeric_limits<double>::quiet_NaN(); general_options.add_options() ("nodata-value", po::value(&opt.nodata_value)->default_value(-32768), "No-data value to use unless specified in the input image.") ("t_srs", po::value(&opt.target_srs_string)->default_value(""), "Specify the output projection as a GDAL projection string (WKT, GeoJSON, or PROJ). If not provided, use the one from the DEM.") ("tr", po::value(&opt.tr)->default_value(NaN), "Set the output file resolution (ground sample distance) in target georeferenced " "units per pixel. This may be in meters or degrees, depending on the projection. The " "center of each output pixel will be at integer multiples of this grid size, unless " "--gdal-tap is set.") ("mpp", po::value(&opt.mpp)->default_value(NaN), "Set the output file resolution in meters per pixel.") ("ppd", po::value(&opt.ppd)->default_value(NaN), "Set the output file resolution in pixels per degree.") ("datum-offset", po::value(&opt.datum_offset)->default_value(0), "When projecting to a datum instead of a DEM, use this elevation in meters from the datum.") ("query-projection", po::bool_switch(&opt.query_projection)->default_value(false), "Display the computed projection information, estimated ground sample " "distance, and projected bounding box. Quit afterwards.") ("write-wkt", po::bool_switch(&opt.write_wkt)->default_value(false), "When used with --query-projection, save the projection as a WKT " "file named <output image>.wkt.") ("session-type,t", po::value(&opt.stereo_session), "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.") ("t_projwin", po::value(&opt.target_projwin), "Limit the mapprojected image to this region, with the corners given in georeferenced " "coordinates (xmin ymin xmax ymax). See also --gdal-tap.") ("t_pixelwin", po::value(&opt.target_pixelwin), "Limit the mapprojected image to this region, with the corners given in pixels (xmin ymin xmax ymax). Max is exclusive.") ("gdal-tap", po::bool_switch(&opt.gdal_tap)->default_value(false), "Ensure that the output image bounds (as printed by gdalinfo) are integer multiples " "of the grid size (as set with --tr). When --t_projwin is set and its entries are " "integer multiples of the grid size, that precise extent will be produced on output. " "This functions as the GDAL -tap option.") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Use the camera adjustment obtained by previously running bundle_adjust with this output prefix.") ("ref-map", po::value(&opt.ref_map)->default_value(""), "Read the projection and grid size from this mapprojected image.") ("ot", po::value(&opt.output_type)->default_value("Float32"), "Output data type, when the input is single channel. 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. This option will be ignored for " "multi-channel images, when the output type is set to be the same as the input type.") ("nearest-neighbor", po::bool_switch(&opt.nearest_neighbor)->default_value(false), "Use nearest neighbor interpolation. Useful for classification images.") ("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.") ("no-geoheader-info", po::bool_switch(&opt.noGeoHeaderInfo)->default_value(false), "Do not write metadata information in the geoheader. See the doc for more info.") ("query-pixel", po::value(&opt.query_pixel)->default_value(vw::Vector2(NaN, NaN)), "Trace a ray from this input image pixel (values start from 0) to the ground. " "Print the intersection point with the DEM as lon, lat, height, then " "as DEM column, row, height. Quit afterwards.") ("parse-options", po::bool_switch(&opt.parseOptions)->default_value(false), "Parse the options and print the results. Used by the mapproject script.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("dem", po::value(&opt.dem_file)) ("camera-image", po::value(&opt.image_file)) ("camera-model", po::value(&opt.camera_file)) ("output-image", po::value(&opt.output_file)); po::positional_options_description positional_desc; positional_desc.add("dem", 1); positional_desc.add("camera-image", 1); positional_desc.add("camera-model", 1); positional_desc.add("output-image", 1); 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."); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (!vm.count("dem") || !vm.count("camera-image") || !vm.count("camera-model")) vw_throw(ArgumentErr() << "Not all of the input DEM, image, and camera were specified.\n" << usage << general_options); // If exactly three files were passed in, the last one must be the output file and the image file // must contain the camera model. if (!vm.count("output-image") && vm.count("camera-model")) { opt.output_file = opt.camera_file; opt.camera_file = ""; } // This is a bug fix. The user by mistake passed in an empty projection string. if (!vm["t_srs"].defaulted() && opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "The value of --t_srs is empty. Then it must not be set at all.\n"); if (vw::has_cam_extension(opt.output_file)) vw_throw(ArgumentErr() << "The output file is a camera. Check your inputs.\n"); if (opt.parseOptions) { // For the benefit of mapproject vw_out() << "dem," << opt.dem_file << "\n"; vw_out() << "image," << opt.image_file << "\n"; vw_out() << "camera," << opt.camera_file << "\n"; vw_out() << "output_file," << opt.output_file << "\n"; exit(0); } // Need this to be able to load adjusted camera models. That will happen // in the stereo session. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; if (!opt.ref_map.empty()) { // Ensure that --ref-map and --t_srs are not both set if (!opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "Cannot specify both --ref-map and --t_srs.\n"); if (!std::isnan(opt.tr)) vw_throw(ArgumentErr() << "Cannot specify both --ref-map and --tr.\n"); // Read the georeference from the reference map and get its wkt GeoReference ref_map_georef; bool has_georef = vw::cartography::read_georeference(ref_map_georef, opt.ref_map); if (!has_georef) vw_throw(ArgumentErr() << "The reference map has no georeference.\n"); opt.target_srs_string = ref_map_georef.get_wkt(); // Set opt.tr opt.tr = ref_map_georef.transform()(0, 0); } if (fs::path(opt.dem_file).extension() != "") { // A path to a real DEM file was provided, load it! GeoReference dem_georef; bool has_georef = vw::cartography::read_georeference(dem_georef, opt.dem_file); if (!has_georef) vw_throw(ArgumentErr() << "There is no georeference information in: " << opt.dem_file << ".\n"); // Make sure the user did not actually pass in an RGB image boost::shared_ptr<DiskImageResource> dem_rsrc = vw::DiskImageResourcePtr(opt.dem_file); ImageFormat dem_fmt = dem_rsrc->format(); const int num_input_channels = num_channels(dem_fmt.pixel_format); if (num_input_channels > 2) vw_throw(ArgumentErr() << "Too many channels in: " << opt.dem_file << ".\n"); // Store the datum from the DEM // TODO (oalexan1): Storing the datum name is fragile. asp::stereo_settings().datum = dem_georef.datum().name(); } return; } /// Compute which camera pixel observes a DEM pixel. Vector2 demPixToCamPix(Vector2i const& dem_pixel, boost::shared_ptr<camera::CameraModel> const& camera_model, ImageViewRef<DemPixelT> const& dem, GeoReference const &dem_georef) { Vector2 lonlat = dem_georef.point_to_lonlat(dem_georef.pixel_to_point(dem_pixel)); DemPixelT height = dem(dem_pixel[0], dem_pixel[1]); Vector3 xyz = dem_georef.datum().geodetic_to_cartesian (Vector3(lonlat[0], lonlat[1], height.child())); // Throws if the projection fails ??? Vector2i camera_pixel = camera_model->point_to_pixel(xyz); return camera_pixel; } /// Expand the ground BBox to contain all the corners of the DEM if they intersect the camera. /// - TODO: This method still does not guarantee all points will be included in the bbox. /// - TODO: This should probably take pixel validity into account! void expandBboxToContainCornerIntersections(vw::CamPtr camera_model, ImageViewRef<DemPixelT> const& dem, GeoReference const &dem_georef, Vector2i const& image_size, BBox2 & bbox_on_ground) { // Each of the corners of the DEM std::vector<Vector2> dem_pixel_list(4); dem_pixel_list[0] = Vector2(0, 0); dem_pixel_list[1] = Vector2(dem.cols()-1, 0); dem_pixel_list[2] = Vector2(dem.cols()-1, dem.rows()-1); dem_pixel_list[3] = Vector2(0, dem.rows()-1); for (int i=0; i<4; i++) { try{ // Project the DEM corner into the input image Vector2 dem_pixel = dem_pixel_list[i]; Vector2 cam_pixel = demPixToCamPix(dem_pixel, camera_model, dem, dem_georef); // Get the point on the ground Vector2 groundLoc = dem_georef.pixel_to_point(dem_pixel); // If there was in intersection if (cam_pixel.x() >= 0 && cam_pixel.y() > 0 && cam_pixel.x() < image_size.x() && cam_pixel.y() < image_size.y()) { bbox_on_ground.grow(groundLoc); } } catch(...) {} // projection failed } // End loop through DEM points } /// Compute output georeference to use void calc_target_geom(// Inputs bool calc_target_res, Vector2i const& image_size, boost::shared_ptr<camera::CameraModel> const& camera_model, ImageViewRef<DemPixelT> const& dem, GeoReference const& dem_georef, bool proj_on_datum, asp::MapprojOptions const & opt, // Outputs BBox2 & cam_box, GeoReference & target_georef, int & outCols, int & outRows) { // Find the camera bbox and the target resolution unless user-supplied. // - This call returns the bounding box of the camera view on the ground. // - The bounding box is in units defined by dem_georef and might not be meters. // - auto_res is an estimate of the ground resolution visible by the camera. // This is in a unit defined by dem_georef and also might not be meters. // - This call WILL intersect pixels outside the dem valid area! // - TODO: Modify this function to optionally disable intersection outside the DEM float auto_res = -1.0; // will be updated bool quick = proj_on_datum; // Quick mode when no actual DEM try { cam_box = camera_bbox(dem, dem_georef, target_georef, camera_model, image_size.x(), image_size.y(), auto_res, quick); } catch (std::exception const& e) { if (opt.target_projwin == BBox2() || calc_target_res) { vw_throw(ArgumentErr() << e.what() << "\n" << "Check your inputs. Or try specifying --t_projwin and --tr values.\n"); } } // Use auto-calculated ground resolution if that option was selected double current_resolution; if (calc_target_res) { current_resolution = auto_res; } else { // Set the resolution from input options if (target_georef.is_projected()) { current_resolution = opt.mpp; // Use units of meters } else { // Not projected, GDC coordinates only. // Use units of degrees. Lat/lon degrees are different so, this should be avoided. current_resolution = 1/opt.ppd; } } // Important sanity checks if (current_resolution < 0.001 * auto_res) vw::vw_throw(vw::ArgumentErr() << "The user-set grid size (option --tr) is so small that likely it is in degrees, " << "while meters are expected.\n"); // For a lesser discrepancy, just print a warning. if (current_resolution < 0.1 * auto_res) vw_out(vw::WarningMessage) << "The user-provided grid size (--tr) is " << current_resolution << ", " << "which is smaller than the auto-estimated grid size of " << auto_res << ". Likely the resulting mapprojected image will not be accurate.\n"; // If an image bounding box (projected coordinates) was passed in, // override the camera's view on the ground with the custom box. // The user needs to know the georeference projected coordinate // system (using the query command) to do this. if (opt.target_projwin != BBox2()) { cam_box = opt.target_projwin; if (cam_box.min().y() > cam_box.max().y()) std::swap(cam_box.min().y(), cam_box.max().y()); } // When projwin is set without --gdal-tap, convert pixel edges to centers, // then round to nearest grid multiples. When edges are at half-grid points // (the normal case from a previous mapproject), the inset lands exactly on // grid centers and round is a no-op. Unlike floor/ceil, round tolerates // float noise without overshooting by a grid step. // For auto-computed bbox (no projwin), use floor/ceil to expand outward. if (opt.target_projwin != BBox2() && !opt.gdal_tap) { vw::Vector2 half(0.5 * current_resolution, 0.5 * current_resolution); cam_box.min() += half; cam_box.max() -= half; double s = current_resolution; cam_box.min() = s * round(cam_box.min() / s); cam_box.max() = s * round(cam_box.max() / s); } else { asp::snapBBox2ToGrid(cam_box, current_resolution); } // Compute output image dimensions directly from the snapped extent. // Without --gdal-tap, min and max are pixel centers at grid multiples, // so +1 to include both endpoints. With --gdal-tap, min and max are pixel // edges, so the count is (max - min) / res with no +1. int endpointAdj = opt.gdal_tap ? 0 : 1; outCols = (int)round((cam_box.max().x() - cam_box.min().x()) / current_resolution) + endpointAdj; outRows = (int)round((cam_box.max().y() - cam_box.min().y()) / current_resolution) + endpointAdj; // Set the geotransform. Pixel centers are at integer multiples of the grid // size (PixelAsArea convention). The GDAL geotransform origin is the upper-left // pixel edge, which is half a pixel before the first pixel center. double delta = 0.0; if (target_georef.pixel_interpretation() == GeoReference::PixelAsArea && !opt.gdal_tap) delta = 0.5 * current_resolution; Matrix3x3 T = target_georef.transform(); // Check polarity before overwriting T(0,0) bool x_flipped = (T(0, 0) < 0); T(0,0) = current_resolution; T(1,1) = -current_resolution; if (x_flipped) T(0,2) = cam_box.max().x() + delta; else T(0,2) = cam_box.min().x() - delta; T(1,2) = cam_box.max().y() + delta; target_georef.set_transform(T); // cam_box stays as the snapped projected extent (pixel-center grid). // Downstream code uses outCols/outRows for image dimensions. return; } // Automatic projection determination void calcAutoProj(GeoReference const& dem_georef, vw::CamPtr camera_model, Vector2i const& image_size, bool proj_on_datum, vw::ImageViewRef<DemPixelT> const& dem, GeoReference& target_georef) { float auto_res = false; bool quick = proj_on_datum; // Quick mode when no actual DEM std::vector<vw::Vector3> *coords = NULL; int num_samples = 100; // enough for projection center determination BBox2 cam_box = camera_bbox(dem, dem_georef, target_georef, camera_model, image_size.x(), image_size.y(), auto_res, quick, coords, num_samples); BBox2 ll_box = target_georef.point_to_lonlat_bbox(cam_box); if (ll_box.empty()) vw_throw(ArgumentErr() << "Failed to determine the output projection.\n"); // The projection center is the box center vw::Vector2 lonlat_ctr = (ll_box.min() + ll_box.max()) / 2.0; asp::setAutoProj(lonlat_ctr.y(), lonlat_ctr.x(), target_georef); } int main(int argc, char* argv[]) { asp::MapprojOptions opt; try { handle_arguments(argc, argv, opt); // TODO: Replace this using the new CameraModelLoader functions. But those // may not have the session guessing logic. // We create a stereo session where both of the cameras and images // are the same, because we want to take advantage of the stereo // pipeline's ability to generate camera models for various // missions. Hence, we create two identical camera models, but only one is used. asp::SessionPtr session(asp::StereoSessionFactory::create (opt.stereo_session, // in-out opt, opt.image_file, opt.image_file, // The same file is passed in twice opt.camera_file, opt.camera_file, opt.output_file, "", // Do not use a DEM to not make the session mapprojected false)); // Do not allow promotion from normal to map projected session if (opt.output_file.empty()) vw_throw(ArgumentErr() << "Missing output filename.\n"); // Additional checks once the stereo session is determined. if (opt.stereo_session == "perusat") vw_out(WarningMessage) << "Images mapprojected using the '" << opt.stereo_session << "' camera model cannot be used later for stereo. " << "If that is desired, please run mapproject with " << "'-t rpc' and a camera file having an RPC model.\n"; // If nothing else works // TODO(oalexan1): Likely StereoSessionFactory already have this logic. if (boost::iends_with(boost::to_lower_copy(opt.camera_file), ".xml") && opt.stereo_session == "") opt.stereo_session = "rpc"; // Initialize the camera model opt.camera_model = session->camera_model(opt.image_file, opt.camera_file); opt.multithreaded_model = session->supports_multi_threading(); { // Safety check that the users are not trying to map project map // projected images. This should not be an error as sometimes // even raw images have some half-baked georeference attached to them. GeoReference dummy_georef; bool has_georef = vw::cartography::read_georeference(dummy_georef, opt.image_file); if (has_georef) vw_out(WarningMessage) << "Your input camera image is already map-" << "projected. The expected input is required " << "to be unprojected or raw camera imagery.\n"; } // If the query pixel option was set, run the query and exit if (!std::isnan(opt.query_pixel[0]) && !std::isnan(opt.query_pixel[1])) { asp::queryPixel(opt.dem_file, opt.camera_model, opt.query_pixel); return 0; } // Load the DEM bool proj_on_datum = false; GeoReference dem_georef; ImageViewRef<DemPixelT> dem; if (fs::path(opt.dem_file).extension() != "") { // A path to a real DEM file was provided, load it! bool has_georef = vw::cartography::read_georeference(dem_georef, opt.dem_file); if (!has_georef) vw_throw(ArgumentErr() << "There is no georeference information in: " << opt.dem_file << ".\n"); boost::shared_ptr<DiskImageResource> dem_rsrc(DiskImageResourcePtr(opt.dem_file)); // If we have a nodata value, create a mask. DiskImageView<float> dem_disk_image(opt.dem_file); if (dem_rsrc->has_nodata_read()) { dem = create_mask(dem_disk_image, dem_rsrc->nodata_read()); } else { dem = pixel_cast<DemPixelT>(dem_disk_image); } } else { // Projecting to a datum instead of a DEM proj_on_datum = true; std::string datum_name = opt.dem_file; // Use the camera center to determine whether to center the fake DEM on 0 or 180. Vector3 cam_ctr = opt.camera_model->camera_center(Vector2()); Vector3 llr_camera_loc = cartography::XYZtoLonLatRadEstimateFunctor::apply(cam_ctr); float lonstart = 0; if ((llr_camera_loc[0] < 0) && (llr_camera_loc[0] > -180)) lonstart = -180; dem_georef = GeoReference(Datum(datum_name), // Need adjustments to work at boundaries vw::Matrix3x3(1, 0, lonstart-0.5, 0, -1, 90+0.5, 0, 0, 1)); dem = constant_view(PixelMask<float>(opt.datum_offset), 360.0, 180.0); vw_out() << "\t--> Using flat datum: " << datum_name << " as elevation model.\n"; } // Finished setting up the datum Vector2i image_size = vw::file_image_size(opt.image_file); // Read projection. Work out output bounding box in points using original camera model. GeoReference target_georef = dem_georef; if ((opt.target_srs_string.empty() && !target_georef.is_projected()) || boost::to_lower_copy(opt.target_srs_string) == "auto") { // Automatic projection determination calcAutoProj(dem_georef, opt.camera_model, image_size, proj_on_datum, dem, target_georef); // output } else if (!opt.target_srs_string.empty()) { // Use specified proj4 string for the output georeference bool have_user_datum = false; Datum user_datum; vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, user_datum, target_georef); } // The user datum and DEM datum must agree bool warn_only = false; vw::checkDatumConsistency(dem_georef.datum(), target_georef.datum(), warn_only); // Find the target resolution based --tr, --mpp, and --ppd if provided. Do // the math to convert pixel-per-degree to meter-per-pixel and vice-versa. int sum = (!std::isnan(opt.tr)) + (!std::isnan(opt.mpp)) + (!std::isnan(opt.ppd)); if (sum >= 2) vw::vw_throw(vw::ArgumentErr() << "Must specify at most one of the options: --tr, --mpp, --ppd.\n"); double radius = target_georef.datum().semi_major_axis(); if (!std::isnan(opt.tr)) { // --tr was set if (target_georef.is_projected()) { if (std::isnan(opt.mpp)) opt.mpp = opt.tr; // User must have provided be m / pixel } else { if (std::isnan(opt.ppd)) opt.ppd = 1.0/opt.tr; // User must have provided degrees per pixel } } if (!std::isnan(opt.mpp) && std::isnan(opt.ppd)) // Meters per pixel was set opt.ppd = 2.0*M_PI*radius/(360.0*opt.mpp); if (!std::isnan(opt.ppd) && std::isnan(opt.mpp)) // Pixels per degree was set opt.mpp = 2.0*M_PI*radius/(360.0*opt.ppd); bool user_provided_resolution = (!std::isnan(opt.ppd)); bool calc_target_res = !user_provided_resolution; BBox2 cam_box; // Output image dimensions. The full image is never realized in memory // because it is written in tiles. int outCols = 0, outRows = 0; calc_target_geom(// Inputs calc_target_res, image_size, opt.camera_model, dem, dem_georef, proj_on_datum, opt, // Outputs cam_box, target_georef, outCols, outRows); // Set a high precision, as the numbers can come out big for UTM vw_out() << std::setprecision(17) << "Projected space bounding box: " << cam_box << "\n"; // Shrink output image BB if an output image BB was passed in GeoReference crop_georef = target_georef; BBox2i crop_bbox(0, 0, outCols, outRows); if (opt.target_pixelwin != BBox2()) { // Replace with passed-in bounding box crop_bbox = opt.target_pixelwin; // Update output georeference to match the reduced image size crop_georef = vw::cartography::crop(target_georef, crop_bbox); } // Print an explanation for a potential problem. if (outCols <= 0 || outRows <= 0) vw_throw(ArgumentErr() << "Computed output image size is not positive. " << "This can happen if the projection is in meters while the " << "grid size is either in degrees or too large for the given input.\n"); // Form the lon-lat bounding box of the output image. This helps with // geotransform operations and should be done any time a georef is modified. BBox2 image_bbox(0, 0, outCols, outRows); crop_georef.ll_box_from_pix_box(image_bbox); if (opt.query_projection) { std::string wkt_file = opt.output_file + ".wkt"; // Optionally save the projection to a WKT file named <output>.wkt if (opt.write_wkt) { std::ofstream ofs(wkt_file.c_str()); if (!ofs.good()) vw_throw(ArgumentErr() << "Failed to open for writing: " << wkt_file << "\n"); ofs << crop_georef.get_wkt() << "\n"; ofs.close(); } // Structured output for the Python mapproject wrapper to parse. // The comma separator must be in sync with the Python side. vw_out() << std::setprecision(17) << "Query results:\n" << "image_width," << outCols << "\n" << "image_height," << outRows << "\n" << "pixel_size," << crop_georef.transform()(0, 0) << "\n" << "proj_box_xmin," << cam_box.min().x() << "\n" << "proj_box_ymin," << cam_box.min().y() << "\n" << "proj_box_xmax," << cam_box.max().x() << "\n" << "proj_box_ymax," << cam_box.max().y() << "\n"; if (opt.write_wkt) vw_out() << "projection_wkt_file," << wkt_file << "\n"; return 0; } // For certain pinhole camera models the reverse check can make map // projection very slow, so we disable it here. The check is very important // for computing the bounding box safely but we don't really need it when // projecting the pixels back in to the camera. auto pinhole_ptr = boost::dynamic_pointer_cast<vw::camera::PinholeModel>(opt.camera_model); if (pinhole_ptr) pinhole_ptr->set_do_point_to_pixel_check(false); // Project the image depending on image format. project_image(opt, dem_georef, target_georef, crop_georef, image_size, outCols, outRows, crop_bbox); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/mer2camera.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <vw/Camera/CAHVModel.h> #include <vw/Camera/CAHVORModel.h> #include <vw/Camera/CAHVOREModel.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <boost/filesystem/path.hpp> #include <boost/lexical_cast.hpp> namespace fs = boost::filesystem; #include <boost/program_options.hpp> namespace po = boost::program_options; #include <boost/foreach.hpp> using namespace vw; struct Options : public vw::GdalWriteOptions { // Input std::string img_file; // Output std::string output_prefix; }; void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options(""); general_options.add_options() ("output-prefix,o", po::value(&opt.output_prefix), "Output prefix for new control network."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("img-file", po::value(&opt.img_file) ); po::positional_options_description positional_desc; positional_desc.add("img-file", 1); std::string usage("[options] <img_file>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); if ( opt.img_file.empty() ) vw_throw( ArgumentErr() << "Missing required input file.\n" << usage << general_options ); if ( opt.output_prefix.empty() ) opt.output_prefix = fs::path(opt.img_file).stem().string(); } int main( int argc, char** argv ) { Options opt; try { handle_arguments( argc, argv, opt ); std::string camera_type; std::vector<std::string> camera_params; { // Extracting important keys I need std::ifstream image( opt.img_file.c_str(), std::ios::in ); std::list<std::string> objects; std::string line; while ( image.good() ) { std::getline(image,line); if ( line.empty() ) continue; // Skip blank lines if ( line[0] == '/' && line[1] == '*' ) continue; // Skip comments // Splitting std::vector<std::string> tokens; boost::split( tokens, line, boost::is_any_of("="), boost::token_compress_on ); if ( tokens.size() != 2 ) continue; // Handle only easy tokens boost::trim(tokens[0]); boost::trim(tokens[1]); boost::to_lower(tokens[0]); boost::to_lower(tokens[1]); if ( tokens[0] == "group" ) { objects.push_back(tokens[1]); continue; } else if ( tokens[0] == "end_group" ) { if ( objects.back() != tokens[1] ) vw_throw( IOErr() << "Object parsing error!" ); if ( objects.back() == "geometric_camera_model" ) break; // I don't care to read anymore objects.pop_back(); continue; } if ( objects.empty() ) continue; // Labels not in a group is useless // For now .. only extracting camera model. However we could pull more. if ( objects.back() == "geometric_camera_model" ) { if ( tokens[0] == "model_type" ) camera_type = tokens[1]; if ( boost::starts_with(tokens[0],"model_component_") && boost::is_digit()(tokens[0][tokens[0].size()-1]) ) camera_params.push_back( tokens[1] ); } } image.close(); } vw_out() << "Found camera type: " << camera_type << std::endl; if ( camera_type != "cahv" && camera_type != "cahvor" && camera_type != "cahvore" ) vw_throw( IOErr() << "Unknown camera type: " << camera_type << "\n" ); // Convert the camera properties to Vector3 std::vector<Vector3> camera_vectors; BOOST_FOREACH( std::string const& str, camera_params ) { std::vector<std::string> tokens; boost::split( tokens, str, boost::is_any_of("(), "), boost::token_compress_on ); // Hack to remove starting empty token. I don't understand why // this happens. if ( tokens[0].empty() ) tokens.erase(tokens.begin()); if ( tokens[tokens.size()-1].empty() ) tokens.erase(tokens.begin()+(tokens.size()-1)); if ( tokens.size() == 3 ) { Vector3 temp; temp[0] = boost::lexical_cast<double>(tokens[0]); temp[1] = boost::lexical_cast<double>(tokens[1]); temp[2] = boost::lexical_cast<double>(tokens[2]); camera_vectors.push_back(temp); } else if ( tokens.size() == 1 ) { camera_vectors.push_back(Vector3(boost::lexical_cast<double>(tokens[0]),0,0)); } else { vw_throw( IOErr() << "Error parsing vector: " << str << "\n" ); } } // Writing out our results if ( camera_type == "cahv" ) { camera::CAHVModel camera( camera_vectors[0], camera_vectors[1], camera_vectors[2], camera_vectors[3] ); camera.write( opt.output_prefix + ".cahv" ); } else if ( camera_type == "cahvor" ) { camera::CAHVORModel camera( camera_vectors[0], camera_vectors[1], camera_vectors[2], camera_vectors[3], camera_vectors[4], camera_vectors[5] ); camera.write( opt.output_prefix + ".cahvor" ); } else if ( camera_type == "cahvore" ) { camera::CAHVOREModel camera( camera_vectors[0], camera_vectors[1], camera_vectors[2], camera_vectors[3], camera_vectors[4], camera_vectors[5], camera_vectors[6], camera_vectors[8][0]); camera.write( opt.output_prefix + ".cahvore" ); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/multi_stereo ================================================ #!/usr/bin/env python # Copyright (c) 2021, United States Government, as represented by the # Administrator of the National Aeronautics and Space Administration. # # All rights reserved. # # The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking # platform" software is licensed under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. """ Prepare for and then run stereo on many image pairs, and produce a fuse mesh. """ import argparse, os, re, shutil, subprocess, sys, glob, shlex import numpy as np # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_rig_utils def process_args(args): """ Set up the parser and parse the args. """ parser = argparse.ArgumentParser(description = "Parameters for multi_stereo.") parser.add_argument("--rig_config", dest="rig_config", default="", help = "Rig configuration file.") parser.add_argument("--rig_sensor", dest="rig_sensor", default="", help="Which rig sensors to use. Must be among the " + \ "sensors specified via --rig_config. To use images from " + \ "several sensors, pass in a quoted list of them, " + \ "separated by a space.") parser.add_argument("--camera_poses", dest="camera_poses", default="", help= "Read images and camera poses for this " + \ "sensor from this list.") parser.add_argument("--out_dir", dest="out_dir", default="", help="The directory where to write the stereo " + \ "output, textured mesh, and other data.") parser.add_argument("--stereo_options", dest="stereo_options", default="", help="Options to pass to parallel_stereo. Use " + \ "double quotes around the full list and simple quotes " + \ "if needed by an individual option, or vice-versa.") parser.add_argument("--pc_filter_options", dest="pc_filter_options", default="", help="Options to pass to pc_filter.") parser.add_argument("--mesh_gen_options", dest="mesh_gen_options", default="", help="Options to pass to voxblox for mesh generation.") # Note how the percent sign below is escaped, by writing: %% parser.add_argument("--undistorted_crop_win", dest="undistorted_crop_win", default = "", help = "The dimensions of the central image region to keep " + \ "after the internal undistortion step and before using " + \ "it in stereo. Normally 85%% - 90%% of distorted (actual) " + \ "image dimensions would do. Suggested the Astrobee images:" + \ " sci_cam: '1250 1000' nav_cam: '1100 776'. haz_cam: '250 200'.") parser.add_argument("--first_step", dest="first_step", default="stereo", help = "Let the first step run by this tool be one of: " + \ "'stereo', 'pc_filter', or 'mesh_gen'. " + \ "This allows resuming a run at a desired step. " + \ "The stereo subdirectories are deleted before that " + \ "step takes place.") parser.add_argument("--left", dest="left", default="", help = "Instead of running pairwise stereo between every " + \ "image and the next one given in --camera_poses, use every " + \ "image from this list and corresponding one from the list " + \ "given by the --right option.") parser.add_argument("--right", dest="right", default="", help = "To be used with --left.") parser.add_argument("--last_step", dest="last_step", default="mesh_gen", help = "The last step run by this tool. See ``--first_step`` " + \ "for allowed values.") parser.add_argument("--first-image-index", dest="first_image_index", default = None, type = int, help = "The index of the first image to use for stereo, in the " "list of images. Indices start from 1. By default, use " + \ "all the images.") parser.add_argument("--last-image-index", dest="last_image_index", default = None, type = int, help = "The index of the last image to use for stereo, in the " "list of images. Indices start from 1. By default, " + \ "use all the images.") args = parser.parse_args() return args def gen_pairs(args, all_distorted_images): """ Create pairs of indices for the images to run stereo on. By default, use each image and the next in the list. Otherwise, if args.left and args.right are specified, use pairs made up of one image from the left list and corresponding one from the right list. """ index_pairs = [] if args.left == "" or args.right == "": for t in range(len(all_distorted_images) - 1): index_pairs.append((t, t + 1)) return index_pairs dist_indices = asp_rig_utils.create_index_dict(all_distorted_images) image_pairs = asp_rig_utils.read_image_pairs(args.left, args.right) for pair in image_pairs: left_index = dist_indices[pair[0]] right_index = dist_indices[pair[1]] index_pairs.append((left_index, right_index)) return index_pairs # Assign to each step a number, given the order in which they should be done step_dict = {"stereo": 0, "pc_filter": 1, "mesh_gen": 2} def sanity_checks(args): if args.camera_poses == "": raise Exception("The path to the list having input images and poses was not specified.") if args.rig_config == "": raise Exception("The path to the rig configuration was not specified.") if args.rig_sensor == "": raise Exception("The rig sensor to use for texturing was not specified.") if args.out_dir == "": raise Exception("The path to the output directory was not specified.") if args.undistorted_crop_win == "": raise Exception("The undistorted crop win was not specified.") for step in [args.first_step, args.last_step]: if step not in step_dict: raise Exception("Invalid values specified for --first_step or --last_step.") if (args.first_image_index is not None or args.last_image_index is not None) and \ (args.left != "" or args.right != ""): raise Exception("Cannot use --first_image_index, --last_image_index " + "together with --left, --right.") if int(args.left == "") + int(args.right == "") == 1: raise Exception("Must specify either both --left and --right, or none of them.") def write_asp_and_voxblox_cameras(undist_intrinsics_file, distorted_images, undistorted_images, world_to_cam): if len(undistorted_images) != len(world_to_cam): raise Exception("Expecting as many undistorted images as cameras.") (widx, widy, f, cx, cy) = asp_rig_utils.read_intrinsics(undist_intrinsics_file) undist_image_dict = {} for image in undistorted_images: # Use the image name without dir and extension as a key base = os.path.basename(image) base = os.path.splitext(base)[0] undist_image_dict[base] = image # Collect the undistorted images for which camera info is present undistorted_images_out = [] cameras = [] cam_to_world_files = [] count = 0 for dist_image in distorted_images: base = os.path.basename(dist_image) base = os.path.splitext(base)[0] if base not in undist_image_dict: raise Exception("Cannot find undistorted image for: " + dist_image) undist_image = undist_image_dict[base] tsai_file = os.path.splitext(undist_image)[0] + ".tsai" # Find the camera-to-world transform cam_to_world = np.linalg.inv(world_to_cam[count]) asp_rig_utils.write_tsai_camera_file(tsai_file, f, cx, cy, cam_to_world) # For use with voxblox later cam_to_world_file = os.path.splitext(undist_image)[0] + "_cam2world.txt" asp_rig_utils.write_cam_to_world_matrix(cam_to_world_file, cam_to_world) undistorted_images_out.append(undist_image) cameras.append(tsai_file) cam_to_world_files.append(cam_to_world_file) count = count + 1 print("Found " + str(len(undistorted_images)) + " undistorted image(s).") print("Wrote: " + str(count) + " camera(s).") return (undistorted_images_out, cameras, cam_to_world_files) def run_pair(left_image, right_image, left_cam, right_cam, args, sensor_dir, tool_base_dir, first_step, last_step): out_dir = args.out_dir + "/" + sensor_dir left_prefix = os.path.basename(os.path.basename(left_image)) left_prefix, ext = os.path.splitext(left_prefix) right_prefix = os.path.basename(os.path.basename(right_image)) right_prefix, ext = os.path.splitext(right_prefix) stereo_dir = out_dir + "/stereo/" + left_prefix + "_" + right_prefix stereo_prefix = stereo_dir + "/run" pcd_file = stereo_prefix + '-PC-filter.pcd' if first_step <= 0 and last_step >= 0: # Run stereo if os.path.isdir(stereo_dir): print("Will run stereo in existing directory: " + stereo_dir) ## Wipe the existing directory #print("Removing recursively old directory: " + stereo_dir) #shutil.rmtree(stereo_dir) # Split on spaces but keep quoted parts together. Wipe stray # continuation lines. args.stereo_options = args.stereo_options.replace('\\', ' ') stereo_options = shlex.split(args.stereo_options) # Run stereo tool_path = asp_rig_utils.find_tool(tool_base_dir, 'parallel_stereo') cmd = [tool_path] + stereo_options + \ [left_image, right_image, left_cam, right_cam, stereo_prefix] # Allow this to fail, as perhaps not all stereo pairs are good asp_rig_utils.run_cmd(cmd, quit_on_failure = False) if first_step <= 1 and last_step >= 1: # Split on spaces but keep quoted parts together args.pc_filter_options = args.pc_filter_options.replace('\\', ' ') pc_filter_options = shlex.split(args.pc_filter_options) # Run pc_filter tool_path = asp_rig_utils.find_tool(tool_base_dir, 'pc_filter') cmd = [tool_path, '--input-cloud', stereo_prefix + '-PC.tif', '--input-texture', stereo_prefix + '-L.tif', '--output-cloud', stereo_prefix + '-PC-filter.tif', '--camera', left_cam] + \ pc_filter_options # Allow this to fail, as perhaps not all stereo pairs are good asp_rig_utils.run_cmd(cmd, quit_on_failure = False) # Run point2mesh. This is for debugging purposes, to be able # to inspect each cloud. # If we use -s 1 the .obj file is too big. But -s 4 is too coarse. # TODO(oalexan1): Make creating these debug meshes optional. # Run point2mesh tool_path = asp_rig_utils.find_tool(tool_base_dir, 'point2mesh') cmd = [tool_path, "-s", "4", "--texture-step-size", "1", stereo_prefix + '-PC-filter.tif', stereo_prefix + '-L.tif'] asp_rig_utils.run_cmd(cmd, quit_on_failure = False) # Write this in PCD format and in left camera's coordinates, # so it can be merged later with voxblox tool_path = asp_rig_utils.find_tool(tool_base_dir, 'pc_filter') cmd = [tool_path, '--input-cloud', stereo_prefix + '-PC.tif', '--input-texture', stereo_prefix + '-L.tif', '--output-cloud', pcd_file, '--camera', left_cam, '--transform-to-camera-coordinates', '--output-weight', stereo_prefix + 'PC-weight.tif'] + \ pc_filter_options asp_rig_utils.run_cmd(cmd, quit_on_failure = False) return pcd_file def fuse_clouds(args, pairs, sensor_dir, tool_base_dir, undistorted_images, cam_to_world_files): """ Fuse the results in a mesh with voxblox. """ voxblox_index = args.out_dir + "/" + sensor_dir + "/voxblox_index.txt" fused_mesh = args.out_dir + "/" + sensor_dir + "/fused_mesh.ply" print("Writing: " + voxblox_index) with open(voxblox_index, "w") as handle: for t in range(len(pairs)): L=pairs[t][0] R=pairs[t][1] handle.write(cam_to_world_files[L] + "\n") handle.write(pcd_files[t] + "\n") args.mesh_gen_options = args.mesh_gen_options.replace('\\', ' ') mesh_gen_options = shlex.split(args.mesh_gen_options) tool_path = asp_rig_utils.find_tool(tool_base_dir, 'voxblox_mesh') cmd = [tool_path, '--index', voxblox_index, '--output_mesh', fused_mesh] + \ mesh_gen_options asp_rig_utils.run_cmd(cmd, quit_on_failure = True) if __name__ == "__main__": args = process_args(sys.argv) sanity_checks(args) asp_rig_utils.mkdir_p(args.out_dir) sensors = args.rig_sensor.split() sensor_dir = "_".join(sensors) # for when there are multiple sensors tool_base_dir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))) # Read the images and camera poses # TODO(oalexan1): Make the block below a function all_distorted_images = [] all_undistorted_images = [] all_cams = [] all_cam_to_world_files = [] for sensor in sensors: # For the case when only a subset of images is used, and those # are set via lists # TODO(oalexan1): Make this a function called parse_all_cameras() lists = [""] if args.left != "" and args.right != "": lists = [args.left, args.right] distorted_images = [] world_to_cam = [] for subset_list in lists: (local_distorted_images, local_world_to_cam) \ = asp_rig_utils.parse_cameras(args.camera_poses, subset_list, sensor, args.first_image_index, args.last_image_index) distorted_images += local_distorted_images world_to_cam += local_world_to_cam # Write undistorted images extension = '.tif' # use lossless .tif extension for undistorted images extra_opts = [] suff = "" (undist_intrinsics_file, undistorted_images, undist_dir) \ = asp_rig_utils.undistort_images(args, sensor, distorted_images, tool_base_dir, extension, extra_opts, suff) # Write camera poses in the format of ASP and voxblox (undistorted_images, cameras, cam_to_world_files) \ = write_asp_and_voxblox_cameras(undist_intrinsics_file, distorted_images, undistorted_images, world_to_cam) all_distorted_images += distorted_images all_undistorted_images += undistorted_images all_cams += cameras all_cam_to_world_files += cam_to_world_files # TODO(oalexan1): This must be parallelized like done for icebridge # Run for each pair parallel_stereo and/or filtering. Even if desired # to skip these steps, must go through the motions to produce # some lists of files neded for mesh generation later. pcd_files = [] pairs = gen_pairs(args, all_distorted_images) for pair in pairs: L = pair[0] R = pair[1] pcd_file = run_pair(all_undistorted_images[L], all_undistorted_images[R], all_cams[L], all_cams[R], args, sensor_dir, tool_base_dir, step_dict[args.first_step], step_dict[args.last_step]) print("got pcd file: " + pcd_file) pcd_files.append(pcd_file) if step_dict[args.first_step] <= 2 and step_dict[args.last_step] >= 2: fuse_clouds(args, pairs, sensor_dir, tool_base_dir, all_undistorted_images, all_cam_to_world_files) ================================================ FILE: src/asp/Tools/n_align.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2018, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Joint n-cloud joint alignment. Reimplementing the Matlab code at // https://searchcode.com/file/13619767/Code/matlab/GlobalProcrustesICP/globalProcrustes.m // One tiny change is that that code had a little bug, when invoked // with 10 iterations it would actually do only 9. So, before // comparing this code's result to that one, un-comment the line which // says "original incorrect logic". Based on the paper: Global // registration of multiple point clouds embedding the Generalized // Procrustes Analysis into an ICP framework by Toldo, Roberto and // Beinat, Alberto and Crosilla, Fabio. #include <asp/PcAlign/pc_align_utils.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/Macros.h> #include <asp/Core/PointUtils.h> #include <asp/Core/EigenUtils.h> #include <asp/Core/PdalUtils.h> #include <vw/Cartography/GeoReference.h> #include <vw/Core/Stopwatch.h> #include <vw/FileIO/FileUtils.h> // Turn off warnings about things we can't control #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include <flann/flann.hpp> #pragma GCC diagnostic pop #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <Eigen/Core> #include <Eigen/Geometry> #include <fstream> #include <iostream> #include <set> #include <vector> namespace fs = boost::filesystem; namespace po = boost::program_options; using namespace vw; using namespace vw::cartography; using namespace asp; typedef PointMatcher<double> PM; typedef PM::DataPoints DP; // TODO: Figure out these magic numbers #define FIFTEEN 15 #define ONE_TWO_EIGHT 128 typedef flann::Index<flann::L2<double>> KDTree_double; /// Options container struct Options : public vw::GdalWriteOptions { // Input std::string in_prefix, in_transforms, datum, csv_format_str, csv_srs, csv_proj4_str; int num_iter, max_num_points; double semi_major_axis, semi_minor_axis, rel_error_tol; bool save_transformed_clouds, align_to_first_cloud, verbose; std::vector<std::string> cloud_files; // Output std::string out_prefix; Options() {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("num-iterations", po::value(&opt.num_iter)->default_value(100), "Maximum number of iterations.") ("max-num-points", po::value(&opt.max_num_points)->default_value(1000000), "Maximum number of (randomly picked) points from each cloud to use.") ("csv-format", po::value(&opt.csv_format_str)->default_value(""), asp::csv_opt_caption().c_str()) ("csv-srs", po::value(&opt.csv_srs)->default_value(""), "The projection string to use to interpret the entries in input CSV files.") ("datum", po::value(&opt.datum)->default_value(""), "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).") ("semi-major-axis", po::value(&opt.semi_major_axis)->default_value(0), "Explicitly set the datum semi-major axis in meters.") ("semi-minor-axis", po::value(&opt.semi_minor_axis)->default_value(0), "Explicitly set the datum semi-minor axis in meters.") ("output-prefix,o", po::value(&opt.out_prefix)->default_value(""), "Specify the output prefix. The computed alignment transforms and, if desired, the transformed clouds, will be saved to names starting with this prefix.") ("save-transformed-clouds", po::bool_switch(&opt.save_transformed_clouds)->default_value(false)->implicit_value(true), "Apply the obtained alignment transforms to the input clouds and save them.") ("initial-transforms-prefix", po::value(&opt.in_prefix)->default_value(""), "The prefix of the transforms to be used as initial guesses. The naming convention is the same as for the transforms written on output.") ("initial-transforms", po::value(&opt.in_transforms)->default_value(""), "Specify the initial transforms as a list of files separated by spaces and in quotes, that is, as 'trans1.txt ... trans_n.txt'.") ("relative-error-tolerance", po::value(&opt.rel_error_tol)->default_value(1e-10), "Stop when the change in the error divided by the error itself is less than this.") ("align-to-first-cloud", po::bool_switch(&opt.align_to_first_cloud)->default_value(false)->implicit_value(true), "Align the other clouds to the first one, rather than to their common centroid.") ("csv-proj4", po::value(&opt.csv_proj4_str)->default_value(""), "An alias for --csv-srs, for backward compatibility.") ("verbose", po::bool_switch(&opt.verbose)->default_value(false)->implicit_value(true), "Print the alignment error after each iteration.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("cloud-files", po::value<std::vector<std::string>>(&opt.cloud_files)); po::positional_options_description positional_desc; positional_desc.add("cloud-files", -1); std::string usage("[options] <cloud-files> -o <output prefix>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.out_prefix.empty()) vw_throw(ArgumentErr() << "Missing output prefix.\n" << usage << general_options); // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); if (opt.num_iter < 0) vw_throw(ArgumentErr() << "The number of iterations must be non-negative.\n" << usage << general_options); // Must specify either csv_srs or csv_proj4_str, but not both. The latter is // for backward compatibility. if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty()) vw_throw(ArgumentErr() << "Cannot specify both --csv-srs and --csv-proj4.\n"); if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty()) opt.csv_srs = opt.csv_proj4_str; if ((opt.semi_major_axis != 0 && opt.semi_minor_axis == 0) || (opt.semi_minor_axis != 0 && opt.semi_major_axis == 0)) { vw_throw(ArgumentErr() << "One of the semi-major or semi-minor axes" << " was specified, but not the other one.\n" << usage << general_options); } if (opt.semi_major_axis < 0 || opt.semi_minor_axis < 0) { vw_throw(ArgumentErr() << "The semi-major and semi-minor axes cannot " << "be negative.\n" << usage << general_options); } if (opt.datum != "" && opt.semi_major_axis != 0 && opt.semi_minor_axis != 0) { vw_throw(ArgumentErr() << "Both the datum string and datum semi-axes were " << "specified. At most one needs to be set.\n" << usage << general_options); } if (opt.cloud_files.size() < 2) vw_throw(ArgumentErr() << "Must have at least two clouds to align.\n" << usage << general_options); if (opt.in_prefix != "" && opt.in_transforms != "") vw_throw(ArgumentErr() << "Cannot specify both the initial transforms prefix " << "and the list of initial transforms.\n" << usage << general_options); } bool triplet_less(vw::Vector3 const& p, vw::Vector3 const& q) { if (p.x() < q.x()) return true; if (p.x() > q.x()) return false; if (p.y() < q.y()) return true; if (p.y() > q.y()) return false; if (p.z() < q.z()) return true; if (p.z() > q.z()) return false; return false; } // Define equality for pairs of integers bool operator==(std::pair<int, int> const& p, std::pair<int, int> const& q) { return (p.first == q.first) && (p.second == q.second); } // An operator used to sort pairs of integers struct CustomCompare { bool operator()(std::pair<int, int> const& p, std::pair<int, int> const& q) const { if (p.first < q.first) return true; if (p.first > q.first) return false; if (p.second < q.second) return true; if (p.second > q.second) return false; return false; } }; bool vector_less(Eigen::VectorXd const& p, Eigen::VectorXd const& q) { for (int i = 0; i < p.size(); i++) { if (p[i] < q[i]) return true; if (p[i] > q[i]) return false; } return false; } // Convert a cloud from libpointmatcher's format to a vector of points void convert_cloud(DP const& in_cloud, std::vector<vw::Vector3> & out_cloud) { out_cloud.clear(); for (int col = 0; col < in_cloud.features.cols(); col++) { vw::Vector3 p; for (int row = 0; row < 3; row++) p[row] = in_cloud.features(row, col); out_cloud.push_back(p); } } // Apply a rotation + transform to a cloud void apply_transform_to_cloud(std::vector<vw::Vector3> & cloud, Eigen::MatrixXd const& T) { for (std::size_t pointIter = 0; pointIter < cloud.size(); pointIter++) { Eigen::VectorXd v(4); v << cloud[pointIter][0], cloud[pointIter][1], cloud[pointIter][2], 1.0; v = T*v; for (int it = 0; it < 3; it++) cloud[pointIter][it] = v[it]; } } void print_cloud(std::vector<vw::Vector3> const& cloud) { for (std::size_t it = 0; it < cloud.size(); it++) { vw_out() << cloud[it].x() << ' ' << cloud[it].y() << ' ' << cloud[it].z() << std::endl; } } void sort_and_make_unique(std::vector<vw::Vector3> & cloud) { std::sort(cloud.begin(), cloud.end(), triplet_less); std::vector<vw::Vector3>::iterator it = std::unique(cloud.begin(), cloud.end()); cloud.resize(distance(cloud.begin(), it)); } void BuildKDTree_double(std::vector<vw::Vector3> const& cloud, KDTree_double* tree) { int rows = cloud.size(); int dim = vw::Vector3().size(); // Need to have this to avoid a seg fault later if (rows*dim <= 0) vw_throw(ArgumentErr() << "Cannot operate on empty clouds.\n"); std::vector<double> dataset(rows * dim); flann::Matrix<double> dataset_mat(&dataset[0], rows, dim); for (int i = 0; i < rows; i++) { for (int j = 0; j < dim; j++) { dataset[i * dim + j] = cloud[i][j]; } } // Using the default leaf_max_size = 10 in flann::KDTreeSingleIndexParams() KDTree_double temp_tree(dataset_mat, flann::KDTreeSingleIndexParams(FIFTEEN)); temp_tree.buildIndex(); *tree = temp_tree; } void SearchKDTree_double(KDTree_double* tree, const vw::Vector3& input, std::vector<int>& indices, std::vector<double>& dists, int nn) { int rows_t = 1; int dim = input.size(); std::vector<double> query; query.resize(rows_t*dim); for (int i = 0; i < dim; i++) query[i] = input[i]; flann::Matrix<double> query_mat(&query[0], rows_t, dim); indices.resize(rows_t*nn); dists.resize(rows_t*nn); flann::Matrix<int> indices_mat(&indices[0], rows_t, nn); flann::Matrix<double> dists_mat(&dists[0], rows_t, nn); tree->knnSearch(query_mat, indices_mat, dists_mat, nn, flann::SearchParams(ONE_TWO_EIGHT)); } std::string transform_file(std::string const& out_prefix, int index) { std::ostringstream os; os << out_prefix << "-transform-" << index << ".txt"; std::string transFile = os.str(); return transFile; } /// Save the transforms void write_n_transforms(std::vector<Eigen::MatrixXd> const& transVec, std::string const& out_prefix) { for (std::size_t it = 0; it < transVec.size(); it++) { std::string transFile = transform_file(out_prefix, it); vw_out() << "Writing: " << transFile << std::endl; write_transform(transVec[it], transFile); } } /// Read the transforms. We assume we know their number. void read_transforms(std::vector<Eigen::MatrixXd> & transVec, std::string const& in_prefix) { for (std::size_t it = 0; it < transVec.size(); it++) { std::string transFile = transform_file(in_prefix, it); read_transform(transVec[it], transFile); } } /// Read the transforms from a list. We assume we know their numbers. void read_transforms_from_list(std::vector<Eigen::MatrixXd> & transVec, std::string const& transform_list) { std::istringstream is(transform_list); for (std::size_t it = 0; it < transVec.size(); it++) { std::string transFile; if (!(is >> transFile)) vw_throw(ArgumentErr() << "Cannot parse enough transform files from: " << transform_list); read_transform(transVec[it], transFile); } } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); // Parse the csv format string and csv projection string asp::CsvConv csv_conv; csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs); // Try to read the georeference/datum info vw::cartography::GeoReference geo; asp::read_georef(opt.cloud_files, opt.datum, opt.csv_srs, opt.semi_major_axis, opt.semi_minor_axis, opt.csv_format_str, csv_conv, geo); int numClouds = opt.cloud_files.size(); // The vector of transforms among the clouds std::vector<Eigen::MatrixXd> transVec(numClouds); for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) transVec[cloudIter] = Eigen::MatrixXd::Identity(4, 4); // Check for COPC files, as those cannot be read for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) { if (asp::isCopc(opt.cloud_files[cloudIter])) vw::vw_throw(vw::ArgumentErr() << "Cannot read LAZ COPC files.\n"); } // Load the first subsampled point cloud. Calculate the shift to apply to // all clouds. Then load the other clouds. std::vector<std::vector<vw::Vector3>> clouds(numClouds); vw::Vector3 shift; bool calc_shift = true; // Shift points so the first point is (0,0,0) bool is_lola_rdr_format = false; // may get overwritten double mean_ref_longitude = 0.0; // may get overwritten double mean_source_longitude = 0.0; // may get overwritten BBox2 empty_box, copc_win; // will not be used, part of the API bool copc_read_all = false; // will not be used, part of the API DP in_cloud; bool verbose = true; load_cloud(opt.cloud_files[0], opt.max_num_points, empty_box, copc_win, copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, mean_ref_longitude, verbose, in_cloud); convert_cloud(in_cloud, clouds[0]); vw_out() << "Data shifted internally by subtracting: " << shift << std::endl; calc_shift = false; // We will use the same shift from here on for (int cloudIter = 1; cloudIter < numClouds; cloudIter++) { load_cloud(opt.cloud_files[cloudIter], opt.max_num_points, empty_box, copc_win, copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, mean_ref_longitude, verbose, in_cloud); convert_cloud(in_cloud, clouds[cloudIter]); } // Read the clouds for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) { sort_and_make_unique(clouds[cloudIter]); } // Read any initial transforms, either using a prefix or an explicit list bool has_init_transform = false; if (opt.in_prefix != "" || opt.in_transforms != "") { has_init_transform = true; if (opt.in_prefix != "") read_transforms(transVec, opt.in_prefix); else if (opt.in_transforms != "") read_transforms_from_list(transVec, opt.in_transforms); // The point clouds are shifted, so shift the initial transforms as well. for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) transVec[cloudIter] = apply_shift(transVec[cloudIter], shift); } // Apply the initial transforms to the clouds if (has_init_transform) { for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) apply_transform_to_cloud(clouds[cloudIter], transVec[cloudIter]); } // Build the trees std::vector<boost::shared_ptr<KDTree_double>> Trees; for (int it = 0; it < numClouds; it++) { boost::shared_ptr<KDTree_double> tree(new KDTree_double(flann::KDTreeSingleIndexParams(FIFTEEN))); BuildKDTree_double(clouds[it], tree.get()); Trees.push_back(tree); } std::string errCaption = std::string("Computing the error, defined as the mean of ") + "pairwise distances from each cloud to the centroid cloud.\n"; if (opt.verbose) vw_out() << errCaption; // Mean error from the centroid cloud points to all matching // points in all clouds. We don't use the mean square error like // the Matlab code, which had bugs in how it was computed anyway. double initError = -1, errAfter = -1, prevError = -1; Stopwatch sw1; sw1.start(); vw::TerminalProgressCallback tpc("asp", "Performing alignment\t--> "); double inc_amount = 1.0 / std::max(opt.num_iter, 1); // Don't display the progress in verbose mode, as then it interferes with // printing of errors. if (!opt.verbose) tpc.report_progress(0); int step = 0; // Starting step // int step = 1; // original incorrect logic in the Matlab code while (step < opt.num_iter) { bool firstStep = (step == 0); bool lastStep = (step == opt.num_iter - 1); std::vector<int> modelSpan(numClouds+1); int numOfPoints = 0; for (int it = 0; it < numClouds; it++) { modelSpan[it] = numOfPoints; numOfPoints += clouds[it].size(); } modelSpan[numClouds] = numOfPoints; // This will record for each point in each cloud which point in // every other cloud is closest to it. This matrix will store the // indices of these points. std::vector<Eigen::VectorXd> CentroidPtsBelMod(numOfPoints); for (std::size_t row = 0; row < CentroidPtsBelMod.size(); row++) { CentroidPtsBelMod[row] = Eigen::VectorXd(numClouds); for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) { CentroidPtsBelMod[row][cloudIter] = -1; } } for (std::size_t i = 0; i < numClouds; i++) { //spanI = modelSpan(i)+1:modelSpan(i+1); std::vector<int> spanI; int beg = modelSpan[i], end = modelSpan[i+1] - 1; for (int it = beg; it <= end; it++) spanI.push_back(it); //CentroidPtsBelMod(spanI,i) = 1:length(spanI); for (std::size_t it = 0; it < spanI.size(); it++) { CentroidPtsBelMod[spanI[it]][i] = it; } for (std::size_t j = i + 1; j < numClouds; j++) { //spanJ = modelSpan(j)+1:modelSpan(j+1); std::vector<int> spanJ; int beg = modelSpan[j], end = modelSpan[j+1] - 1; for (int it = beg; it <= end; it++) spanJ.push_back(it); std::vector<int> match, match2; std::vector<double> dist; typedef std::set<std::pair<int, int>, CustomCompare> PairType; // For each point in cloud i, find a match in cloud j PairType Corr1; for (std::size_t index_i = 0; index_i < clouds[i].size(); index_i++) { SearchKDTree_double(Trees[j].get(), clouds[i][index_i], match, dist, 1); if (match.empty()) continue; // should not happen int index_j = match[0]; Corr1.insert(std::pair<int, int>(index_j, index_i)); } // Now do it in reverse PairType Corr2; for (std::size_t index_j = 0; index_j < clouds[j].size(); index_j++) { SearchKDTree_double(Trees[i].get(), clouds[j][index_j], match, dist, 1); if (match.empty()) continue; // should not happen int index_i = match[0]; Corr2.insert(std::pair<int, int>(index_j, index_i)); } std::vector<std::pair<int, int>> Corr; for (PairType::iterator it = Corr1.begin(); it != Corr1.end(); it++) { PairType::iterator it2 = Corr2.find(*it); if (it2 == Corr2.end()) continue; Corr.push_back(*it); } for (std::size_t it = 0; it < Corr.size(); it++) { // CentroidPtsBelMod(spanI(Corr(:,2)),j) = Corr(:,1)'; CentroidPtsBelMod[spanI[Corr[it].second]][j] = Corr[it].first; // CentroidPtsBelMod(spanJ(Corr(:,1)),i) = Corr(:,2)'; CentroidPtsBelMod[spanJ[Corr[it].first]][i] = Corr[it].second; } } } std::sort(CentroidPtsBelMod.begin(), CentroidPtsBelMod.end(), vector_less); // Remove non-unique elements, and remove entries which exist only in one cloud int pos = 0; for (std::size_t row = 0; row < CentroidPtsBelMod.size(); row++) { int num_good = 0; for (int cloudIter = 0; cloudIter < CentroidPtsBelMod[row].size(); cloudIter++) { if (CentroidPtsBelMod[row][cloudIter] >= 0) num_good++; } if (num_good < 2) continue; if (row > 0 && CentroidPtsBelMod[row - 1] == CentroidPtsBelMod[row]) continue; CentroidPtsBelMod[pos] = CentroidPtsBelMod[row]; pos++; } CentroidPtsBelMod.resize(pos); // We connected the clouds. Find the average cloud. std::vector<vw::Vector3> centroid(CentroidPtsBelMod.size()); for (std::size_t row = 0; row < CentroidPtsBelMod.size(); row++) { vw::Vector3 pt(0, 0, 0); int num = 0; for (int cloudIter = 0; cloudIter < CentroidPtsBelMod[row].size(); cloudIter++) { int idx = CentroidPtsBelMod[row][cloudIter]; if (idx < 0) continue; vw::Vector3 curr = clouds[cloudIter][idx]; pt += curr; num++; } pt /= num; centroid[row] = pt; } double errBefore = 0; errAfter = 0; int numErrors = 0; // Find the transform from each cloud to the centroid, and apply it to each cloud for (std::size_t cloudIter = 0; cloudIter < numClouds; cloudIter++) { std::vector<Eigen::Vector3d> src, dst; Eigen::Matrix3d rot; Eigen::Vector3d trans; for (int row = 0; row < CentroidPtsBelMod.size(); row++) { int pointIter = CentroidPtsBelMod[row][cloudIter]; if (pointIter < 0) continue; vw::Vector3 curr = clouds[cloudIter][pointIter]; vw::Vector3 ctr = centroid[row]; Eigen::Vector3d p; p[0] = curr[0]; p[1] = curr[1]; p[2] = curr[2]; src.push_back(p); p[0] = ctr[0]; p[1] = ctr[1]; p[2] = ctr[2]; dst.push_back(p); errBefore += norm_2(curr - ctr); numErrors++; } computeRigidTransform(src, dst, rot, trans); // Update the output transforms Eigen::MatrixXd currT = Eigen::MatrixXd::Identity(4, 4);; for (int row = 0; row < 3; row++) for (int col = 0; col < 3; col++) currT(row, col) = rot(row, col); for (int row = 0; row < 3; row++) currT(row, 3) = trans(row); transVec[cloudIter] = currT*transVec[cloudIter]; // Move the clouds to the new location for the next iteration apply_transform_to_cloud(clouds[cloudIter], currT); // Compute the error after the transform is applied for (int row = 0; row < CentroidPtsBelMod.size(); row++) { int pointIter = CentroidPtsBelMod[row][cloudIter]; if (pointIter < 0) continue; vw::Vector3 curr = clouds[cloudIter][pointIter]; vw::Vector3 ctr = centroid[row]; errAfter += norm_2(curr - ctr); } } errBefore /= numErrors; errAfter /= numErrors; if (firstStep) { initError = errBefore; if (opt.verbose) { vw_out() << "Error before alignment: " << initError << std::endl; } } if (opt.verbose) vw_out() << "Error at iteration " << step << ": " << errAfter << "\n"; else tpc.report_incremental_progress(inc_amount); if (!firstStep) { if (errAfter > 0 && std::abs(errAfter - prevError)/errAfter < opt.rel_error_tol) { break; } } prevError = errAfter; step++; } // End of iterations refining the transforms if (!verbose) { tpc.report_finished(); } sw1.stop(); if (!opt.verbose) { vw_out() << "\n" << errCaption; vw_out() << "Error before alignment: " << initError << std::endl; } vw_out() << "Error after alignment: " << errAfter << std::endl; vw_out() << "Performed: " << step + 1 << " iterations.\n"; vw_out() << "\nAlignment took " << sw1.elapsed_seconds() << " [s]" << std::endl; if (opt.align_to_first_cloud) { // Make the first transform be the identity for (int cloudIter = 1; cloudIter < numClouds; cloudIter++) transVec[cloudIter] = transVec[0].inverse() * transVec[cloudIter]; transVec[0] = Eigen::MatrixXd::Identity(4, 4); } // Undo the shift when the clouds were read for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) transVec[cloudIter] = apply_shift(transVec[cloudIter], -shift); for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) vw_out() << "Final transform for cloud: " << cloudIter << ":\n" << transVec[cloudIter] << std::endl; write_n_transforms(transVec, opt.out_prefix); if (opt.save_transformed_clouds) { for (int cloudIter = 0; cloudIter < numClouds; cloudIter++) { std::ostringstream os; os << opt.out_prefix << "-trans_cloud-" << cloudIter; std::string trans_prefix = os.str(); vw::BBox2 copc_win; bool copc_read_all = false; // not used, part of the API save_trans_point_cloud(opt, opt.cloud_files[cloudIter], trans_prefix, copc_win, copc_read_all, geo, csv_conv, transVec[cloudIter]); } } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/nonlin_trans_corr.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file nonlin_trans_corr.cc /// // Use VTK's thin plate transform to warp left and right images based // on disparity to make them more similar, compute the disparity among // the warped images, and then unwarp the disparity. #include <vtkMath.h> #include <vtkNew.h> #include <vtkPoints.h> #include <vtkThinPlateSplineTransform.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Image/PixelMask.h> #include <vw/Core/Exception.h> #include <vw/Core/Stopwatch.h> #include <vw/Image/Interpolation.h> #include <vw/Image/MaskViews.h> #include <vw/Image/ImageViewRef.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <iostream> // Find the max error between two arrays of points. Note that // cannot use const here as GetPoint() is not const. double max_error(vtkNew<vtkPoints> & a, vtkNew<vtkPoints> & b) { int npoints = a->GetNumberOfPoints(); double max_err = 0.0; for (int i = 0; i < npoints; i++) { double testDstPoint[3] = {0.0}; a->GetPoint(i, testDstPoint); double transSrcPoint[3] = {0.0}; b->GetPoint(i, transSrcPoint); double d = vtkMath::Distance2BetweenPoints(testDstPoint, transSrcPoint); max_err = std::max(max_err, d); } return max_err; } void TestThinPlateSplineTransform() { int npoints = 20; const double P[20][3] = { { -0.8316301300814422, -0.06992580859519772, -1.6034524068257419 }, { -2.151893827785692, 0.38244721645095636, -0.9275967632551845 }, { 0.8147291118075928, -0.7016483698682392, 0.15003863332602096 }, { 0.918239421266975, 0.5515514723709805, -1.0230600499321258 }, { -0.4977939747967184, 1.5000786176083494, 0.892455159403953 }, { 2.137759080794324, -0.7876029858279091, 0.23676951564894347 }, { 0.07659657475437548, 0.37528421293358666, 1.061745743663681 }, { -0.7908820649026604, 1.4270955106455065, 2.2665387247459576 }, { -0.5663930529602919, 1.9402635876094498, 1.1531767242062774 }, { 0.22529528853908187, -1.5938090446587108, -0.7004997748768814 }, { 0.6165064084492409, -0.2761336076050157, -0.7930056820043028 }, { -1.6122391974605947, -1.4200010952872733, 1.0567292903013055 }, { 0.17993263043615856, -0.9038514957133562, -2.1611068227229695 }, { -1.4186794357559613, 0.85026116269838, -1.7600646313947719 }, { 0.9690209792801024, 0.7018737798529897, 0.3923799957082836 }, { -0.6586203767750309, -2.1468680342265904, 0.762954972139701 }, { 1.2872860659137344, 0.8557080868402649, 0.3905931440107816 }, { -0.18996464681200217, 0.8315184491297033, -1.0227889589485941 }, { 1.0636210067525393, -0.24736478911115908, -0.7581101375259237 }, { -0.09448165336394657, -1.1381967760924927, -0.7171168342666931 }, }; const double noise[20][3] = { { 1.5137019295427425, 0.6858246680960894, 0.07331883771349512 }, { -0.34081703057234036, 0.47987804772801446, 0.982197518178181 }, { -0.1106079068591361, 1.0523148414328571, 0.17910578196163454 }, { 0.05724784633562011, -0.08459760939107724, -0.7665637643588622 }, { -0.4333381262791796, 0.018412807528038692, 0.6889623031683394 }, { -1.1692454358073843, -0.6875830563599973, 0.9077463799204326 }, { -1.9329042505569662, 1.0529789607437061, -0.29738186972471486 }, { -0.12079407626315326, 0.9261998453458427, 1.0938543547601083 }, { -0.6384715430732077, -0.2606527602354865, 1.417882645305744 }, { -0.10127708027623447, -0.7470111486643078, 0.726100633329295 }, { 0.36659507636859245, 1.4194144006017144, 0.41878644928947467 }, { 1.0325034539790547, -0.2291631905797599, -1.3490582933020208 }, { -0.7186165872334461, 0.4613954758072554, -1.1318559861004829 }, { 2.455035378196603, -0.01476716688473253, -0.0890030227805104 }, { 1.6498918075463915, 2.7557006973876508, -0.6466098561563114 }, { 1.16764314555201, -1.5226214641344893, 0.13000979083980121 }, { -0.9640219699623079, 1.3071375444488553, 0.5668689159057715 }, { 0.40366181757487013, 2.308315254377135, 0.8202651493656881 }, { -1.0267515231555335, -0.2853656137629097, -1.1599391275129292 }, { -0.09199656043877075, 0.35274602605225164, 2.5626579880899327 }, }; // Good API //sourceTransform->TransformPoint(src, src); // create the two point sets vtkNew<vtkPoints> srcPoints, dstPoints; vtkNew<vtkPoints> testSrcPoints, testDstPoints; double s = 0.1; double a = 0.1, b = 0.1; // Create a set of points to find the transform for, and a set of new test // points to verify how well it generalized for (int i = 0; i < npoints; i++) { double src[3] = {P[i][0], P[i][1], 0}; double testSrc[3] = {src[0] + s * noise[i][0], src[1] + s * noise[i][1], 0}; double dst[3] = {src[0] + a * src[1] *src[0] * src[0], src[1] + b * src[0] * src[1], 0}; double testDst[3] = {testSrc[0] + a * testSrc[1] * testSrc[0] * testSrc[0], testSrc[1] + b * testSrc[0] * testSrc[1], 0}; srcPoints->InsertNextPoint(src); testSrcPoints->InsertNextPoint(testSrc); dstPoints->InsertNextPoint(dst); testDstPoints->InsertNextPoint(testDst); } // Set up the transform vtkNew<vtkThinPlateSplineTransform> trans; //trans->SetBasisToR(); // 3D trans->SetBasisToR2LogR(); // 2D trans->SetRegularizeBulkTransform(true); trans->SetSourceLandmarks(srcPoints); trans->SetTargetLandmarks(dstPoints); trans->Update(); // Test the forward transform on the points used to create it vtkNew<vtkPoints> transSrcPoints; trans->TransformPoints(srcPoints, transSrcPoints); std::cout << "Error using forward transform on points which defined it: " << max_error(dstPoints, transSrcPoints) << "\n"; // Test the forward transform on a new set of points for which we // know the answer vtkNew<vtkPoints> transTestSrcPoints; trans->TransformPoints(testSrcPoints, transTestSrcPoints); std::cout << "Error using forward transform on additional test points: " << max_error(testDstPoints, transTestSrcPoints) << "\n"; // Compute the inverse transform. This changes the direction // in which TransformPoints() is applied. trans->Inverse(); // Test how reliably the inverse brings one back vtkNew<vtkPoints> srcPoints2; trans->TransformPoints(transSrcPoints, srcPoints2); std::cout << "Error after forward then inverse transform on orig points: " << max_error(srcPoints, srcPoints2) << "\n"; vtkNew<vtkPoints> testSrcPoints2; trans->TransformPoints(transTestSrcPoints, testSrcPoints2); std::cout << "Error after forward then inverse transform on additional points: " << max_error(testSrcPoints, testSrcPoints2) << "\n"; vtkNew<vtkPoints> transTestDstPoints; trans->TransformPoints(testDstPoints, transTestDstPoints); std::cout << "Error using inverse transform on additional test points: " << max_error(testSrcPoints, transTestDstPoints) << "\n"; return; } struct Options : vw::GdalWriteOptions { }; using namespace vw; // Testcase: // cd projects/grand_mesa // nonlin_trans_corr stereo_rpc_local_epi_2_1_rpc_v2/run 1000 // Then run: // parallel_stereo --correlator-mode run-L_sub.tif aligned-R_sub.tif int main(int argc, char ** argv) { Options opt; try { // TestThinPlateSplineTransform(); std::string prefix = argv[1]; int num_samples = atof(argv[2]); std::cout << "Num samples is " << num_samples << std::endl; std::string left_file = prefix + "-L_sub.tif"; std::string right_file = prefix + "-R_sub.tif"; std::string disp_file = prefix + "-D_sub.tif"; //std::string disp_file = prefix + "-D_sub_asp_bm.tif"; DiskImageView<float> left(left_file); DiskImageView<float> right(right_file); DiskImageView<PixelMask<Vector2f>> disp(disp_file); float right_nodata = -32768.0; if (read_nodata_val(right_file, right_nodata)) { std::cout << "Read right image nodata value: " << right_nodata << std::endl; } ImageViewRef<PixelMask<float>> masked_right = create_mask(right, right_nodata); std::cout << "L cols and rows " << left.cols() << ' ' << left.rows() << std::endl; std::cout << "R cols and rows " << right.cols() << ' ' << right.rows() << std::endl; std::cout << "D cols and rows " << disp.cols() << ' ' << disp.rows() << std::endl; if (left.cols() != disp.cols() || left.rows() != disp.rows()) vw_throw( ArgumentErr() << "Left image and disparity must have same dims."); double area = double(left.cols()) * double(left.rows()); // careful to not overflow int sample_rate = round(sqrt(double(area) / double(num_samples))); if (sample_rate < 1) sample_rate = 1; std::cout << "Sample rate " << sample_rate << std::endl; Stopwatch sw; sw.start(); // Create a set of points to find the transform for, and a set of new test // points to verify how well it generalized int max_points = 1000, count = 0; vtkNew<vtkPoints> srcPoints, dstPoints; for (int col = 0; col < disp.cols(); col += sample_rate) { for (int row = 0; row < disp.rows(); row += sample_rate) { PixelMask<Vector2f> pix = disp(col, row); if (!is_valid(pix)) continue; double src[3] = {double(col), double(row), 0.0}; double dst[3] = {col + pix.child().x(), row + pix.child().y(), 0.0}; srcPoints->InsertNextPoint(src); dstPoints->InsertNextPoint(dst); count++; if (count >= max_points) break; } if (count >= max_points) break; } sw.stop(); vw_out() << "Elapsed time to add points: " << sw.elapsed_seconds() << " seconds.\n"; int npoints = srcPoints->GetNumberOfPoints(); std::cout << "Num points " << npoints << std::endl; sw.start(); // Set up the transform vtkNew<vtkThinPlateSplineTransform> trans; //trans->SetBasisToR(); // 3D trans->SetBasisToR2LogR(); // 2D trans->SetRegularizeBulkTransform(true); trans->SetSourceLandmarks(srcPoints); trans->SetTargetLandmarks(dstPoints); trans->Update(); sw.stop(); vw_out() << "Elapsed time to calc transform: " << sw.elapsed_seconds() << " seconds.\n"; // An invalid pixel value used for edge extension PixelMask<float> nodata_pix(0); nodata_pix.invalidate(); ValueEdgeExtension<PixelMask<float>> nodata_ext(nodata_pix); // Interpolate into the right image. Avoid using an ImageViewRef to // avoid a per-pixel virtual function overhead. The 'auto' keyword // will use the exact type. auto interp_right = interpolate(create_mask(right, right_nodata), BilinearInterpolation(), nodata_ext); vw_out() << "Warping the image.\n"; TerminalProgressCallback tpc("asp", "\t--> "); // Warp the right image to make it more similar to the left one ImageView<PixelMask<float>> trans_right(left.cols(), left.rows()); //#pragma omp parallel for for (int col = 0; col < left.cols(); col++) { tpc.report_fractional_progress(col, left.cols()); for (int row = 0; row < left.rows(); row++) { double src[3] = {double(col), double(row), 0.0}; double dst[3] = {0.0, 0.0, 0.0}; trans->TransformPoint(src, dst); trans_right(col, row) = interp_right(dst[0], dst[1]); } } tpc.report_finished(); vw::cartography::GeoReference left_georef; bool has_left_georef = read_georeference(left_georef, left_file); bool has_nodata = true; std::string output_image = prefix + "-trans_right.tif"; vw_out() << "Writing: " << output_image << "\n"; vw::cartography::block_write_gdal_image (output_image, apply_mask(trans_right, right_nodata), has_left_georef, left_georef, has_nodata, right_nodata, opt, TerminalProgressCallback("asp", "\t--> Nonlinear warping:")); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/opencv_calibrate.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file opencv_calibrate.cpp /// /// Camera calibration tool using OpenCV's chessboard/circle grid pattern detection. /// Computes intrinsic camera parameters and distortion coefficients from a set of /// calibration images. #include <vw/Image/ImageView.h> #include <vw/Image/ImageIO.h> #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/DiskImageResource.h> #include <vw/Core/Log.h> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/calib3d/calib3d.hpp> #include <cctype> #include <stdio.h> #include <string.h> #include <time.h> #include <iostream> const char * usage = " \nexample command line for calibration from a list of stored images:\n" " imagelist_creator image_list.xml *.png\n" " calibration -w 4 -h 5 -s 0.025 -o camera.yml -op -oe image_list.xml\n" " where image_list.xml is the standard OpenCV XML/YAML\n" " use imagelist_creator to create the xml or yaml list\n" " file consisting of the list of strings, e.g.:\n" " \n" "<?xml version=\"1.0\"?>\n" "<opencv_storage>\n" "<images>\n" "view000.png\n" "view001.png\n" "<!-- view002.png -->\n" "view003.png\n" "view010.png\n" "one_extra_view.jpg\n" "</images>\n" "</opencv_storage>\n"; static void help() { vw::vw_out() << "This is a camera calibration sample.\n" "Usage: calibration\n" " -w <board_width> # the number of inner corners per one of\n" " # board dimension\n" " -h <board_height> # the number of inner corners per another\n" " # board dimension\n" " [-pt <pattern>] # the type of pattern: chessboard or\n" " # circles' grid\n" " [-n <number_of_frames>] # the number of frames to use for\n" " # calibration (if not specified, it\n" " # will be set to the number of board\n" " # views actually available)\n" " [-s <squareSize>] # square size in some user-defined units\n" " # (1 by default)\n" " [-o <out_camera_params>] # the output filename for intrinsic\n" " # [and extrinsic] parameters\n" " [-op] # write detected feature points\n" " [-oe] # write extrinsic parameters\n" " [-zt] # assume zero tangential distortion\n" " [-a <aspectRatio>] # fix aspect ratio (fx/fy)\n" " [-p] # fix the principal point at the center\n" " [-v] # flip the captured images around the\n" " # horizontal axis\n" " [input_data] # input data, one of the following:\n" " # - text file with a list of the images\n" " # of the board\n" " # the text file can be generated with\n" " # imagelist_creator\n" "\n"; vw::vw_out() << "\n" << usage; } enum { DETECTION = 0, CAPTURING = 1, CALIBRATED = 2 }; enum BoardPattern { CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID }; static double computeReprojectionErrors( const std::vector<std::vector<cv::Point3f>>& objectPoints, const std::vector<std::vector<cv::Point2f>>& imagePoints, const std::vector<cv::Mat>& rvecs, const std::vector<cv::Mat>& tvecs, const cv::Mat& cameraMatrix, const cv::Mat& distCoeffs, std::vector<float>& perViewErrors) { std::vector<cv::Point2f> imagePoints2; int i, totalPoints = 0; double totalErr = 0, err; perViewErrors.resize(objectPoints.size()); for (i = 0; i < (int)objectPoints.size(); i++) { cv::projectPoints(cv::Mat(objectPoints[i]), rvecs[i], tvecs[i], cameraMatrix, distCoeffs, imagePoints2); err = cv::norm(cv::Mat(imagePoints[i]), cv::Mat(imagePoints2), cv::NORM_L2); int n = (int)objectPoints[i].size(); perViewErrors[i] = (float)std::sqrt(err*err/n); totalErr += err*err; totalPoints += n; } return std::sqrt(totalErr/totalPoints); } static void calcChessboardCorners(cv::Size boardSize, float squareSize, std::vector<cv::Point3f>& corners, BoardPattern patternType = CHESSBOARD) { corners.resize(0); switch (patternType) { case CHESSBOARD: case CIRCLES_GRID: for (int i = 0; i < boardSize.height; i++) for (int j = 0; j < boardSize.width; j++) corners.push_back(cv::Point3f(float(j*squareSize), float(i*squareSize), 0)); break; case ASYMMETRIC_CIRCLES_GRID: for (int i = 0; i < boardSize.height; i++) for (int j = 0; j < boardSize.width; j++) corners.push_back(cv::Point3f(float((2*j + i % 2)*squareSize), float(i*squareSize), 0)); break; default: CV_Error(cv::Error::StsBadArg, "Unknown pattern type\n"); } } bool runCalibration(std::vector<std::vector<cv::Point2f>> imagePoints, cv::Size imageSize, cv::Size boardSize, BoardPattern patternType, float squareSize, float aspectRatio, int flags, cv::Mat& cameraMatrix, cv::Mat& distCoeffs, std::vector<cv::Mat>& rvecs, std::vector<cv::Mat>& tvecs, std::vector<float>& reprojErrs, double& totalAvgErr) { cameraMatrix = cv::Mat::eye(3, 3, CV_64F); if (flags & cv::CALIB_FIX_ASPECT_RATIO) cameraMatrix.at<double>(0,0) = aspectRatio; const int NUM_DISTORTION_COEFFS = 4; distCoeffs = cv::Mat::zeros(NUM_DISTORTION_COEFFS, 1, CV_64F); std::vector<std::vector<cv::Point3f>> objectPoints(1); calcChessboardCorners(boardSize, squareSize, objectPoints[0], patternType); objectPoints.resize(imagePoints.size(), objectPoints[0]); double rms = cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs, flags|cv::CALIB_FIX_K3); vw::vw_out() << "RMS error reported by calibrateCamera: " << rms << "\n"; bool ok = cv::checkRange(cameraMatrix) && cv::checkRange(distCoeffs); totalAvgErr = computeReprojectionErrors(objectPoints, imagePoints, rvecs, tvecs, cameraMatrix, distCoeffs, reprojErrs); return ok; } static void saveCameraParams(const std::string& filename, cv::Size imageSize, cv::Size boardSize, float squareSize, float aspectRatio, int flags, const cv::Mat& cameraMatrix, const cv::Mat& distCoeffs, const std::vector<cv::Mat>& rvecs, const std::vector<cv::Mat>& tvecs, const std::vector<float>& reprojErrs, const std::vector<std::vector<cv::Point2f>>& imagePoints, double totalAvgErr) { cv::FileStorage fs(filename, cv::FileStorage::WRITE); time_t tt; time(&tt); struct tm *t2 = localtime(&tt); char buf[1024]; strftime(buf, sizeof(buf)-1, "%c", t2); fs << "calibration_time" << buf; if (!rvecs.empty() || !reprojErrs.empty()) fs << "nframes" << (int)std::max(rvecs.size(), reprojErrs.size()); fs << "image_width" << imageSize.width; fs << "image_height" << imageSize.height; fs << "board_width" << boardSize.width; fs << "board_height" << boardSize.height; fs << "square_size" << squareSize; if (flags & cv::CALIB_FIX_ASPECT_RATIO) fs << "aspectRatio" << aspectRatio; if (flags != 0) { sprintf(buf, "flags: %s%s%s%s", flags & cv::CALIB_USE_INTRINSIC_GUESS ? "+use_intrinsic_guess" : "", flags & cv::CALIB_FIX_ASPECT_RATIO ? "+fix_aspectRatio" : "", flags & cv::CALIB_FIX_PRINCIPAL_POINT ? "+fix_principal_point" : "", flags & cv::CALIB_ZERO_TANGENT_DIST ? "+zero_tangent_dist" : ""); } fs << "flags" << flags; fs << "camera_matrix" << cameraMatrix; fs << "distortion_coefficients" << distCoeffs; fs << "avg_reprojection_error" << totalAvgErr; if (!reprojErrs.empty()) fs << "per_view_reprojection_errors" << cv::Mat(reprojErrs); if (!rvecs.empty() && !tvecs.empty()) { CV_Assert(rvecs[0].type() == tvecs[0].type()); cv::Mat bigmat((int)rvecs.size(), 6, rvecs[0].type()); for (int i = 0; i < (int)rvecs.size(); i++) { cv::Mat r = bigmat(cv::Range(i, i+1), cv::Range(0,3)); cv::Mat t = bigmat(cv::Range(i, i+1), cv::Range(3,6)); CV_Assert(rvecs[i].rows == 3 && rvecs[i].cols == 1); CV_Assert(tvecs[i].rows == 3 && tvecs[i].cols == 1); r = rvecs[i].t(); t = tvecs[i].t(); } fs << "extrinsic_parameters" << bigmat; } if (!imagePoints.empty()) { cv::Mat imagePtMat((int)imagePoints.size(), (int)imagePoints[0].size(), CV_32FC2); for (int i = 0; i < (int)imagePoints.size(); i++) { cv::Mat r = imagePtMat.row(i).reshape(2, imagePtMat.cols); cv::Mat imgpti(imagePoints[i]); imgpti.copyTo(r); } fs << "image_points" << imagePtMat; } } static bool readStringList(const std::string& filename, const std::string& tempFile, std::vector<std::string>& l) { l.resize(0); cv::FileStorage fs(filename, cv::FileStorage::READ); if (!fs.isOpened()) return false; cv::FileNode n = fs.getFirstTopLevelNode(); if (n.type() != cv::FileNode::SEQ) return false; cv::FileNodeIterator it = n.begin(), it_end = n.end(); for (; it != it_end; ++it) l.push_back((std::string)*it); return true; } bool runAndSave(const std::string& outputFilename, const std::vector<std::vector<cv::Point2f>>& imagePoints, cv::Size imageSize, cv::Size boardSize, BoardPattern patternType, float squareSize, float aspectRatio, int flags, cv::Mat& cameraMatrix, cv::Mat& distCoeffs, bool writeExtrinsics, bool writePoints) { std::vector<cv::Mat> rvecs, tvecs; std::vector<float> reprojErrs; double totalAvgErr = 0; bool ok = runCalibration(imagePoints, imageSize, boardSize, patternType, squareSize, aspectRatio, flags, cameraMatrix, distCoeffs, rvecs, tvecs, reprojErrs, totalAvgErr); vw::vw_out() << (ok ? "Calibration succeeded" : "Calibration failed") << ". avg reprojection error = " << totalAvgErr << "\n"; if (ok) saveCameraParams(outputFilename, imageSize, boardSize, squareSize, aspectRatio, flags, cameraMatrix, distCoeffs, writeExtrinsics ? rvecs : std::vector<cv::Mat>(), writeExtrinsics ? tvecs : std::vector<cv::Mat>(), writeExtrinsics ? reprojErrs : std::vector<float>(), writePoints ? imagePoints : std::vector<std::vector<cv::Point2f>>(), totalAvgErr); return ok; } cv::Mat vw_imread(const std::string fileName, vw::ImageView<vw::uint8> &gray_buffer) { vw::read_image(gray_buffer, fileName); // Figure out the image buffer parameters void* raw_data_ptr = reinterpret_cast<void*>(gray_buffer.data()); size_t pixel_size = sizeof(vw::uint8); size_t step_size = gray_buffer.cols() * pixel_size; // Create an OpenCV wrapper for the buffer image cv::Mat cv_image(gray_buffer.rows(), gray_buffer.cols(), CV_8UC1, raw_data_ptr, step_size); return cv_image; } int main(int argc, char** argv) { cv::Size boardSize, imageSize; float squareSize = 1.f, aspectRatio = 1.f; cv::Mat cameraMatrix, distCoeffs; const char* outputFilename = "out_camera_data.yml"; const char* inputFilename = 0; int i, nframes = 10; bool writeExtrinsics = false, writePoints = false; int flags = 0; int mode = DETECTION; std::vector<std::vector<cv::Point2f>> imagePoints; std::vector<std::string> imageList; BoardPattern pattern = CHESSBOARD; if (argc < 2) { help(); return 0; } for (i = 1; i < argc; i++) { const char* s = argv[i]; if (strcmp(s, "-w") == 0) { if (sscanf(argv[++i], "%u", &boardSize.width) != 1 || boardSize.width <= 0) { vw::vw_out() << "Invalid board width\n"; return -1; } } else if (strcmp(s, "-h") == 0) { if (sscanf(argv[++i], "%u", &boardSize.height) != 1 || boardSize.height <= 0) { vw::vw_out() << "Invalid board height\n"; return -1; } } else if (strcmp(s, "-pt") == 0) { i++; if (!strcmp(argv[i], "circles")) pattern = CIRCLES_GRID; else if (!strcmp(argv[i], "acircles")) pattern = ASYMMETRIC_CIRCLES_GRID; else if (!strcmp(argv[i], "chessboard")) pattern = CHESSBOARD; else { vw::vw_out() << "Invalid pattern type: must be chessboard or circles\n"; return -1; } } else if (strcmp(s, "-s") == 0) { if (sscanf(argv[++i], "%f", &squareSize) != 1 || squareSize <= 0) { vw::vw_out() << "Invalid board square width\n"; return -1; } } else if (strcmp(s, "-n") == 0) { if (sscanf(argv[++i], "%u", &nframes) != 1 || nframes <= 3) { vw::vw_out() << "Invalid number of images\n"; return -1; } } else if (strcmp(s, "-a") == 0) { if (sscanf(argv[++i], "%f", &aspectRatio) != 1 || aspectRatio <= 0) { vw::vw_out() << "Invalid aspect ratio\n"; return -1; } flags |= cv::CALIB_FIX_ASPECT_RATIO; } else if (strcmp(s, "-op") == 0) { writePoints = true; } else if (strcmp(s, "-oe") == 0) { writeExtrinsics = true; } else if (strcmp(s, "-zt") == 0) { flags |= cv::CALIB_ZERO_TANGENT_DIST; } else if (strcmp(s, "-p") == 0) { flags |= cv::CALIB_FIX_PRINCIPAL_POINT; } else if (strcmp(s, "-o") == 0) { outputFilename = argv[++i]; } else if (s[0] != '-') { inputFilename = s; } else { vw::vw_out() << "Unknown option " << s << "\n"; return -1; } } std::string tempFile = outputFilename; tempFile += ".temp"; if (inputFilename) { if (readStringList(inputFilename, tempFile, imageList)) mode = CAPTURING; else { vw::vw_out() << "Error openening file " << inputFilename << "\n"; return -1; } } else { vw::vw_out() << "Missing input filename.\n"; return -1; } if (!imageList.empty()) nframes = (int)imageList.size(); for (i = 0; ; i++) { cv::Mat view; vw::ImageView<vw::uint8> gray_buffer; if (i < (int)imageList.size()) { view = vw_imread(imageList[i], gray_buffer); if (!view.data) { vw::vw_out() << "Failed to read image data from input file " << imageList[i] << "\n"; return -1; } } if (!view.data) { if (imagePoints.size() > 0) runAndSave(outputFilename, imagePoints, imageSize, boardSize, pattern, squareSize, aspectRatio, flags, cameraMatrix, distCoeffs, writeExtrinsics, writePoints); break; } imageSize = view.size(); std::vector<cv::Point2f> pointbuf; cv::Mat viewGray; if (view.channels() > 1) cv::cvtColor(view, viewGray, cv::COLOR_BGR2GRAY); else view.copyTo(viewGray); bool found; switch (pattern) { case CHESSBOARD: found = cv::findChessboardCorners(view, boardSize, pointbuf, cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_FAST_CHECK | cv::CALIB_CB_NORMALIZE_IMAGE); break; case CIRCLES_GRID: found = cv::findCirclesGrid(view, boardSize, pointbuf); break; case ASYMMETRIC_CIRCLES_GRID: found = cv::findCirclesGrid(view, boardSize, pointbuf, cv::CALIB_CB_ASYMMETRIC_GRID); break; default: vw::vw_out() << "Unknown pattern type\n"; return -1; } int winSize = 11; if (pattern == CHESSBOARD && found) cv::cornerSubPix(viewGray, pointbuf, cv::Size(winSize, winSize), cv::Size(-1, -1), cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, 0.0001)); if (mode == CAPTURING && found) { imagePoints.push_back(pointbuf); } if (found) cv::drawChessboardCorners(view, boardSize, cv::Mat(pointbuf), found); std::string msg = mode == CAPTURING ? "100/100" : mode == CALIBRATED ? "Calibrated" : "Press 'g' to start"; int baseLine = 0; cv::Size textSize = cv::getTextSize(msg, 1, 1, 1, &baseLine); cv::Point textOrigin(view.cols - 2*textSize.width - 10, view.rows - 2*baseLine - 10); if (mode == CAPTURING) { msg = cv::format("%d/%d", (int)imagePoints.size(), nframes); } cv::putText(view, msg, textOrigin, 1, 1, mode != CALIBRATED ? cv::Scalar(0, 0, 255) : cv::Scalar(0, 255, 0)); if (mode == CAPTURING && imagePoints.size() >= (unsigned)nframes) { if (runAndSave(outputFilename, imagePoints, imageSize, boardSize, pattern, squareSize, aspectRatio, flags, cameraMatrix, distCoeffs, writeExtrinsics, writePoints)) mode = CALIBRATED; else mode = DETECTION; break; } } return 0; } ================================================ FILE: src/asp/Tools/opencv_imagelist_creator.cc ================================================ /*this creates a yaml or xml list of files from the command line args */ #include <opencv2/core/core.hpp> #include <string> #include <iostream> using std::string; using std::cout; using std::endl; using namespace cv; static void help(char** av) { cout << "\nThis creates a yaml or xml list of files from the command line args\n" "usage:\n./" << av[0] << " imagelist.yaml *.png\n" << "Try using different extensions.(e.g. yaml yml xml xml.gz etc...)\n" << "This will serialize this list of images or whatever with opencv's FileStorage framework" << endl; } int main(int ac, char** av) { if (ac < 3) { help(av); return 1; } string outputname = av[1]; FileStorage fs(outputname, FileStorage::WRITE); fs << "images" << "["; for(int i = 2; i < ac; i++){ fs << string(av[i]); } fs << "]"; return 0; } ================================================ FILE: src/asp/Tools/orbit_plot.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Plot roll, pitch, and yaw of ASP Pinhole .tsai cameras, and/or of CSM # Frame/Linescan .json cameras, before and after bundle adjustment. # See the documentation for more info. import sys, os, re, math, json, argparse, shutil, glob import numpy as np import matplotlib.pyplot as plt from pyproj import Proj, transform, Transformer from scipy.spatial.transform import Rotation as R # Add this value to an ASP pixel to get a CSM pixel ASP_TO_CSM_SHIFT = 0.5 def toCsmPixel(asp_pix): """ Convert an ASP pixel to a CSM pixel. Code copied from CsmModel.cc. """ # Explicitly ensure csm_pix has float values even if the input may be int csm_pix = np.array([float(asp_pix[0]), float(asp_pix[1])]) # Add the shift csm_pix[0] += ASP_TO_CSM_SHIFT csm_pix[1] += ASP_TO_CSM_SHIFT return csm_pix def getTimeAtLine(model, line): """ Find the time at a given line. The line count starts from 0. Code copied from get_time_at_line() in CsmUtils.cc and getImageTime() in UsgsAstroLsSensorModel.cpp. """ # Covert the line to a CSM pixel asp_pix = np.array([0.0, float(line)]) csm_pix = toCsmPixel(asp_pix) referenceIndex = 0 time = model['m_intTimeStartTimes'][referenceIndex] + \ model['m_intTimes'][referenceIndex] * \ (csm_pix[1] - model['m_intTimeLines'][referenceIndex] + 0.5) return time def getLineAtTime(time, model): """ Get the line number at a given time. This assumes a linear relationship between them (rather than piecewise linear). Code copied from get_line_at_time() in CsmUtils.cc. """ # All dt values in model['intTimes'] (slopes) must be equal, or else # the model is not linear in time. for i in range(1, len(model['m_intTimeLines'])): if abs(model['m_intTimes'][i] - model['m_intTimes'][0]) > 1e-10: raise Exception("Expecting a linear relation between time and image lines.\n") line0 = 0.0 line1 = float(model['m_nLines']) - 1.0 time0 = getTimeAtLine(model, line0) time1 = getTimeAtLine(model, line1) return line0 + (line1 - line0) * (time - time0) / (time1 - time0) # TODO(oalexan1): Fix this to be aware of the fact that the Earth is not a sphere. # See the relevant WV code. def produce_m(lon, lat, m_meridian_offset=0): """ Produce M matrix which facilitates conversion from Lon-lat (NED) to ECEF coordinates From https://github.com/visionworkbench/visionworkbench/blob/master/src/vw/Cartography/Datum.cc#L249 This is known as direction cosine matrix Parameters ------------ lon: numeric longitude of spacecraft lat: numeric latitude of spacecraft m_meridian_offset: numeric set to zero Returns ----------- R: np.array 3 x 3 rotation matrix representing the m-matrix aka direction cosine matrix """ if lat < -90: lat = -90 if lat > 90: lat = 90 rlon = (lon + m_meridian_offset) * (np.pi/180) rlat = lat * (np.pi/180) slat = np.sin(rlat) clat = np.cos(rlat) slon = np.sin(rlon) clon = np.cos(rlon) R = np.ones((3,3),dtype=float) R[0,0] = -slat*clon R[1,0] = -slat*slon R[2,0] = clat R[0,1] = -slon R[1,1] = clon R[2,1] = 0.0 R[0,2] = -clon*clat R[1,2] = -slon*clat R[2,2] = -slat return R def convert_ecef2NED(asp_rotation,lon,lat): """ convert rotation matrices from ECEF to North-East-Down convention Parameters ------------- asp_rotation: np.array 3 x 3 rotation matrix from ASP lon: numeric longitude for computing m matrix lat: numeric latitude for computing m matrix Returns -------------- r_ned: np.array 3 x 3 NED rotation matrix """ m = produce_m(lon,lat) r_ned = np.matmul(np.linalg.inv(m),asp_rotation) # this is the cam to ned transform #r_ned = np.matmul(np.transpose(m),asp_rotation) #r_ned = np.matmul(m,asp_rotation) return r_ned def read_csm_cam(json_file): """ Read a CSM model state file in JSON format. """ print("Reading CSM camera: " + json_file) with open(json_file, 'r') as f: data = f.read() # Find first occurrence of open brace. This is needed because the CSM # state has some text before the JSON object. pos = data.find('{') # do substring from pos to the end, if pos was found if pos != -1: data = data[pos:] # parse the json from data j = json.loads(data) return j def read_tsai_cam(tsai): """ read tsai frame model from asp and return a python dictionary containing the parameters See ASP's frame camera implementation here: https://stereopipeline.readthedocs.io/en/latest/pinholemodels.html Parameters ---------- tsai: str path to ASP frame camera model Returns ---------- output: dictionary dictionary containing camera model parameters #TODO: support distortion model """ print("Reading Pinhole camera: " + tsai) camera = os.path.basename(tsai) with open(tsai, 'r') as f: content = f.readlines() content = [x.strip() for x in content] fu = np.float64(content[2].split(' = ', 4)[1]) # focal length in x fv = np.float64(content[3].split(' = ', 4)[1]) # focal length in y cu = np.float64(content[4].split(' = ', 4)[1]) # optical center in x cv = np.float64(content[5].split(' = ', 4)[1]) # optical center in y cam = content[9].split(' = ', 10)[1].split(' ') cam_cen = [np.float64(x) for x in cam] # camera center coordinates in ECEF rot = content[10].split(' = ', 10)[1].split(' ') rot_mat = [np.float64(x) for x in rot] # rotation matrix for camera to world coordinates transformation # Reshape as 3x3 matrix rot_mat = np.reshape(rot_mat,(3,3)) pitch = np.float64(content[11].split(' = ', 10)[1]) # pixel pitch tsai_dict = { 'camera': camera, 'focal_length': (fu, fv), 'optical_center': (cu, cv), 'cam_cen_ecef': cam_cen, 'rotation_matrix': rot_mat, 'pitch': pitch} return tsai_dict def read_frame_cam_dict(cam): # Invoke the appropriate reader for .tsai and .json frame cameras if cam.endswith('.tsai'): return read_tsai_cam(cam) elif cam.endswith('.json'): return read_frame_csm_cam(cam) else: raise Exception('Unknown camera file extension: ' + cam) def estim_satellite_orientation(positions): """ Given a list of satellite positions, estimate the satellite orientation at each position. The x axis is the direction of motion, z points roughly down while perpendicular to x, and y is the cross product of z and x. """ num = len(positions) rotations = [] for i in range(num): prev_i = i - 1 if prev_i < 0: prev_i = 0 next_i = i + 1 if next_i >= num: next_i = num - 1 # x is tangent to orbit, z goes down x = np.array(positions[next_i]) - np.array(positions[prev_i]) z = -np.array(positions[i]) # Normalize z = z / np.linalg.norm(z) x = x / np.linalg.norm(x) # Make sure z is perpendicular to x z = z - np.dot(z, x) * x z = z / np.linalg.norm(z) # Find y as the cross product y = np.cross(z, x) # Make these as columns in a matrix r r = np.column_stack((x, y, z)) rotations.append(r) return rotations def read_frame_csm_cam(json_file): """ Read rotation from a CSM Frame json state file. """ j = read_csm_cam(json_file) # Read the entry having the translation and rotation params = j['m_currentParameterValue'] # First three entries are the translation dict = {} dict['cam_cen_ecef'] = params[0:3] # Next four entries are the quaternion quat = params[3:7] # Convert the quaternion to rotation matrix r = R.from_quat(quat) mat = r.as_matrix() dict['rotation_matrix'] = mat return dict def read_linescan_pos_rot(json_file): """ Read positions and rotations from a CSM linescan json state file. """ j = read_csm_cam(json_file) # Read the positions positions_vec = j['m_positions'] # Reshape to Nx3 matrix using the reshape function positions_vec = np.reshape(positions_vec, (-1, 3)) # Create a vector of vectors positions = [] for i in range(positions_vec.shape[0]): positions.append(positions_vec[i, :]) # Read the quaternions quats = j['m_quaternions'] # Reshape to Nx4 matrix using the reshape function quats = np.reshape(quats, (-1, 4)) # Iterate over the rows and convert to rotation matrix rotations = [] for i in range(quats.shape[0]): r = R.from_quat(quats[i, :]) rotations.append(r.as_matrix()) return (positions, rotations) def Rroll(theta): return np.matrix([[ 1, 0 , 0 ], [ 0, math.cos(theta),-math.sin(theta)], [ 0, math.sin(theta), math.cos(theta)]]) def Rpitch(theta): return np.matrix([[ math.cos(theta), 0, math.sin(theta)], [ 0 , 1, 0 ], [-math.sin(theta), 0, math.cos(theta)]]) def Ryaw(theta): return np.matrix([[ math.cos(theta), -math.sin(theta), 0 ], [ math.sin(theta), math.cos(theta) , 0 ], [ 0 , 0 , 1 ]]) def isLinescan(cam_file): """ Read the first line from cam_file which tells if the sensor is linescan. """ lineScan = False with open(cam_file, 'r') as f: line = f.readline() if 'LINE_SCAN' in line: lineScan = True return lineScan def roll_pitch_yaw(rot_mat, ref_rot_mat): # Rotate about z axis by 90 degrees. This must be synched up with # sat_sim. This will be a problem for non-sat_sim cameras. T = np.zeros((3,3),float) T[0, 1] = -1 T[1, 0] = 1 T[2, 2] = 1 Tinv = np.linalg.inv(T) inv_ref_rot_mat = np.linalg.inv(ref_rot_mat) N = np.matmul(inv_ref_rot_mat, rot_mat) return R.from_matrix(np.matmul(N, Tinv)).as_euler('XYZ', degrees=True) # Return at most this many elements from an array def getFirstN(arr, N): if N >= 0 and len(arr) > N: return arr[:N] else: return arr def poly_fit(X, Y): """ Fit a polynomial of degree 1 and return the fitted Y values. """ fit = np.poly1d(np.polyfit(X, Y, 1)) return fit(X) # Read a list. Return only the files that match the given pattern and have the given extension. def read_list(list_file, pattern, extensions): files = [] with open(list_file, 'r') as f: for line in f: line = line.strip() for ext in extensions: if pattern in line and line.endswith(ext): files.append(line) return files def multi_glob(prefix, extensions): """ Return a list of files matching the given prefix and extensions. """ files = [] for ext in extensions: files += glob.glob(prefix + '*' + ext) return files # Read the positions and rotations from the given files. For linescan we will # have a single camera, but with many poses in it. For Pinhole we we will have # many cameras, each with a single pose. def read_positions_rotations_from_file(cam_file): # Read the first line from cam_file lineScan = isLinescan(cam_file) positions = [] rotations = [] if lineScan: # Read linescan data (positions, rotations) = read_linescan_pos_rot(cam_file) else: # read Pinhole (Frame) files in ASP .tsai or CSM .json format asp_dict = read_frame_cam_dict(cam_file) # get camera rotation position = asp_dict['cam_cen_ecef'] rot_mat = asp_dict['rotation_matrix'] positions.append(position) rotations.append(rot_mat) return (positions, rotations) # Read the positions and rotations from the given files def read_positions_rotations(cams): (positions, rotations) = ([], []) for i in range(len(cams)): (p, r) = read_positions_rotations_from_file(cams[i]) positions += p rotations += r # Must have as many rotations as positions. That is needed as later # we build ref rotations from positions. if len(rotations) != len(positions): print("Number of camera positions and orientations must be the same.") sys.exit(1) return (positions, rotations) def exclude_ref_cams(all_cams, ref_cams): cams = [] camMap = set() # Add ref_cams to camMap set for c in ref_cams: camMap.add(c) for c in all_cams: if c not in camMap: cams.append(c) return cams # Get rotations, then convert to NED. That's why the loops below. def read_angles(orig_cams, opt_cams, ref_cams): # orig_cams and ref_cams must be the same size if len(ref_cams) > 0 and len(orig_cams) != len(ref_cams): print("Number of input and reference cameras must be the same. Got: ", \ len(ref_cams), " and ", len(opt_cams)) sys.exit(1) (orig_positions, orig_rotations) = read_positions_rotations(orig_cams) (opt_positions, opt_rotations) = read_positions_rotations(opt_cams) (ref_positions, ref_rotations) = read_positions_rotations(ref_cams) # If we do not have ref cameras that determine the satellite orientation, # estimate them from the camera positions if len(ref_cams) == 0: orig_ref_rotations = estim_satellite_orientation(orig_positions) opt_ref_rotations = estim_satellite_orientation(opt_positions) else: orig_ref_rotations = ref_rotations[:] opt_ref_rotations = ref_rotations[:] orig_rotation_angles = [] opt_rotation_angles = [] for i in range(len(orig_rotations)): angles = roll_pitch_yaw(orig_rotations[i], orig_ref_rotations[i]) orig_rotation_angles.append(angles) for i in range(len(opt_rotations)): angles = roll_pitch_yaw(opt_rotations[i], opt_ref_rotations[i]) opt_rotation_angles.append(angles) return (orig_rotation_angles, opt_rotation_angles) def findRange(orig, opt): """ Concatenate the orig and opt arrays and find the min and max values. """ concat = np.sort(np.concatenate((orig, opt))) return (concat.min(), concat.max()) def err_fun(vals, opt): ''' Find the standard deviation or RMSE of the given values. ''' if opt.use_rmse: return np.sqrt(np.multiply(vals, vals).mean()) return np.std(vals) def setupLinescanPlot(rotation_angles, trim_ratio, cam_files): """ Prepare the linescan poses for plotting. """ # Remove the first and last few poses, based on the trim ratio totalNum = len(rotation_angles) removeNum = int(trim_ratio * totalNum) removeNumBefore = int(removeNum / 2) removeNumAfter = removeNum - removeNumBefore b = removeNumBefore e = totalNum - removeNumAfter rotation_angles = rotation_angles[b:e] if len(rotation_angles) < totalNum: print("Plotting the most central %d out of %d poses for linescan cameras." % \ (len(rotation_angles), totalNum)) # Read the json file j = read_csm_cam(cam_files[0]) t0 = j['m_t0Quat'] dt = j['m_dtQuat'] numLines = j['m_nLines'] firstLine = 0 lastLine = numLines - 1 # These correspond to the poses that are being plotted, which can go beyond # the first and last image lines begPlotTime = t0 + removeNumBefore * dt endPlotTime = begPlotTime + len(rotation_angles) * dt begPlotLine = getLineAtTime(begPlotTime, j) endPlotLine = getLineAtTime(endPlotTime, j) # The X axis for the plot x_vals = np.linspace(begPlotLine, endPlotLine, len(rotation_angles)) return (rotation_angles, firstLine, lastLine, x_vals) def resampleVals(out_x, in_x, in_y): """ Given x and y values, and a new grid out_x, find the y values on the new grid. Use linear interpolation. """ # If in_x and out_x are the same, return in_y if np.array_equal(in_x, out_x): return in_y out_y = np.interp(out_x, in_x, in_y) return out_y # Load and plot each row in the figure given by 'ax' def plot_row(ax, row, orbits, hasList, datasets, orbit_labels, dataset_labels, ref_list, opt): # We assume we have one or two datasets that we want to plot on top of each other. numSets = len(datasets) if numSets < 1: print("Must specify at least one dataset.") sys.exit(1) origPrefix = datasets[0] origTag = dataset_labels[0] optPrefix = "" optTag = "" if numSets == 2: optPrefix = datasets[1] optTag = dataset_labels[1] camType = orbits[row] camLabel = orbit_labels[row] # This tool can mix and match ASP Pinhole .tsai files and CSM frame/linescan .json files. extensions = ['.tsai', '.json'] # Read the opt cameras and their ref cameras. The latter may not exist as # bundle adjusted does not create them. We will use the ref cams for orig cams. opt_cams = [] ref_cams = [] print_ref_cam_warning = False if numSets == 2: if hasList: opt_cams = read_list(optPrefix, camType, extensions) ref_cams = [] if ref_list != "": ref_cams = read_list(ref_list, camType, extensions) else: all_opt_cams = sorted(multi_glob(optPrefix + '*' + camType, extensions)) # Exclude any opt ref cams. We will use the orig ref cams later. ref_cams = sorted(multi_glob(optPrefix + '*' + camType + '*-ref', extensions)) opt_cams = exclude_ref_cams(all_opt_cams, ref_cams) if (not opt.use_ref_cams) and len(ref_cams) > 0: print_ref_cam_warning = True # Same for orig cams. Overwrite the earlier ref cams, if present, # as we will use the orig ref cams if hasList: orig_cams = read_list(origPrefix, camType, extensions) ref_cams = [] if ref_list != "": ref_cams = read_list(ref_list, camType, extensions) else: all_orig_cams = sorted(multi_glob(origPrefix + '*' + camType, extensions)) ref_cams = sorted(multi_glob(origPrefix + '*' + camType + '*-ref', extensions)) orig_cams = exclude_ref_cams(all_orig_cams, ref_cams) if (not opt.use_ref_cams) and len(ref_cams) > 0: print_ref_cam_warning = True # If not using ref cams, wipe them if not opt.use_ref_cams: if (print_ref_cam_warning): print("Found reference cameras but will not use them.") ref_cams = [] # Reduce the number of cameras to opt.num_cameras orig_cams = getFirstN(orig_cams, opt.num_cameras) if opt.use_ref_cams: ref_cams = getFirstN(ref_cams, opt.num_cameras) if numSets == 2: opt_cams = getFirstN(opt_cams, opt.num_cameras) # Check that these sets are the same size if opt.use_ref_cams and len(orig_cams) != len(ref_cams): print("Number of input and reference cameras must be thee same. See the " + \ "option --use-ref-cams for more info. For these numbers, got: ", \ len(ref_cams), " and ", len(orig_cams)) sys.exit(1) if numSets == 2 and opt.use_ref_cams and len(orig_cams) != len(opt_cams): print("Number of cameras in both datasets must be the same when using " + \ "reference cameras. Got: ", len(orig_cams), " and ", len(opt_cams)) sys.exit(1) # Throw an error if no cameras are found if len(orig_cams) == 0: print("No cameras found for orbit id " + camType) sys.exit(1) # Read the rotations and convert them to roll, pitch, yaw (orig_rotation_angles, opt_rotation_angles) = read_angles(orig_cams, opt_cams, ref_cams) print("Number of rotations for orbit id " + camType + ': ' + str(len(orig_rotation_angles))) if numSets == 2 and (not isLinescan(orig_cams[0])): # For linescan can handle different number of rotations but not for frame if len(orig_rotation_angles) != len(opt_rotation_angles): print("Number of rotations in the two datasets must be the same, got: ", \ len(orig_rotation_angles), " and ", len(opt_rotation_angles)) sys.exit(1) # X axes for the plots (will change for linescan) X1 = np.arange(len(orig_rotation_angles)) X2 = np.arange(len(opt_rotation_angles)) x_label = 'Frame index' # For linescan, we will plot against image line. Number of rotations can differ. if isLinescan(orig_cams[0]): x_label = 'Image line' (orig_rotation_angles, firstLine, lastLine, X1) = \ setupLinescanPlot(orig_rotation_angles, opt.trim_ratio, orig_cams) if numSets == 2: (opt_rotation_angles, _, _, X2) = \ setupLinescanPlot(opt_rotation_angles, opt.trim_ratio, opt_cams) # The order is roll, pitch, yaw, as returned by # R.from_matrix().as_euler('XYZ',degrees=True) orig_roll = [r[0] for r in orig_rotation_angles] orig_pitch = [r[1] for r in orig_rotation_angles] orig_yaw = [r[2] for r in orig_rotation_angles] opt_roll = [r[0] for r in opt_rotation_angles] opt_pitch = [r[1] for r in opt_rotation_angles] opt_yaw = [r[2] for r in opt_rotation_angles] residualTag = '' if opt.subtract_line_fit: # Same line fit will be subtracted from all datasets residualTag = ' residual' F1 = np.arange(len(orig_roll)) fit_roll = poly_fit(F1, orig_roll) fit_pitch = poly_fit(F1, orig_pitch) fit_yaw = poly_fit(F1, orig_yaw) orig_roll = orig_roll - fit_roll orig_pitch = orig_pitch - fit_pitch orig_yaw = orig_yaw - fit_yaw if numSets == 2: if isLinescan(orig_cams[0]): L1 = max(len(orig_roll) - 1.0, 1.0) L2 = max(len(opt_roll) - 1.0, 1.0) F2 = np.arange(len(opt_roll)) * L1 / L2 opt_roll = opt_roll - resampleVals(F2, F1, fit_roll) opt_pitch = opt_pitch - resampleVals(F2, F1, fit_pitch) opt_yaw = opt_yaw - resampleVals(F2, F1, fit_yaw) else: # There is no resampling with frame cameras, and these will have same size opt_roll = opt_roll - fit_roll opt_pitch = opt_pitch - fit_pitch opt_yaw = opt_yaw - fit_yaw if isLinescan(orig_cams[0]): minVal = [0, 0, 0] maxVal = [0, 0, 0] (minVal[0], maxVal[0]) = findRange(orig_roll, opt_roll) (minVal[1], maxVal[1]) = findRange(orig_pitch, opt_pitch) (minVal[2], maxVal[2]) = findRange(orig_yaw, opt_yaw) fmt = "{:.2e}" # 2 digits of precision are enough for display orig_roll_err = fmt.format(err_fun(orig_roll, opt)) orig_pitch_err = fmt.format(err_fun(orig_pitch, opt)) orig_yaw_err = fmt.format(err_fun(orig_yaw, opt)) err_str = 'StDev: ' if opt.use_rmse: err_str = ' RMSE: ' print(origTag + " " + camType + " roll " + err_str + orig_roll_err + " degrees") print(origTag + " " + camType + " pitch " + err_str + orig_pitch_err + " degrees") print(origTag + " " + camType + " yaw " + err_str + orig_yaw_err + " degrees") (opt_roll_err, opt_pitch_err, opt_yaw_err) = (0, 0, 0) # initialize if numSets == 2: opt_roll_err = fmt.format(err_fun(opt_roll, opt)) opt_pitch_err = fmt.format(err_fun(opt_pitch, opt)) opt_yaw_err = fmt.format(err_fun(opt_yaw, opt)) print(optTag + " " + camType + " roll " + err_str + opt_roll_err + " degrees") print(optTag + " " + camType + " pitch " + err_str + opt_pitch_err + " degrees") print(optTag + " " + camType + " yaw " + err_str + opt_yaw_err + " degrees") # Find the handle to the axis object for the current row if len(ax.shape) == 1: A = ax # otherwise get an indexing error else: A = ax[row] # Plot residuals lw = opt.line_width A[0].plot(X1, orig_roll, label=origTag, color = 'r', linewidth = lw) A[1].plot(X1, orig_pitch, label=origTag, color = 'r', linewidth = lw) A[2].plot(X1, orig_yaw, label=origTag, color = 'r', linewidth = lw) if numSets == 2: A[0].plot(X2, opt_roll, label=optTag, color = 'b', linewidth = lw) A[1].plot(X2, opt_pitch, label=optTag, color = 'b', linewidth = lw) A[2].plot(X2, opt_yaw, label=optTag, color = 'b', linewidth = lw) if isLinescan(orig_cams[0]): # Plot vertical lines showing where the first and last image lines are for index in range(3): A[index].plot([firstLine, firstLine], [minVal[index], maxVal[index]], label = 'First image line', color = 'black', linestyle = '--') A[index].plot([lastLine, lastLine], [minVal[index], maxVal[index]], label = 'Last image line', color = 'black', linestyle = '--') A[0].set_title(camLabel + ' roll' + residualTag) A[1].set_title(camLabel + ' pitch' + residualTag) A[2].set_title(camLabel + ' yaw ' + residualTag) A[0].set_ylabel('Degrees') #A[1].set_ylabel('Degrees') # don't repeat this as it takes space #A[2].set_ylabel('Degrees') err = ((orig_roll_err, opt_roll_err), (orig_pitch_err, opt_pitch_err), (orig_yaw_err, opt_yaw_err)) for index in range(3): A[index].set_xlabel(x_label) # Calc err text if numSets == 1: txt = err_str + err[index][0] else: txt = err_str + err[index][0] + ", " + err[index][1] # Make the margin bigger so that the text does not overlap with the data (x1, x2, y1, y2) = A[index].axis() A[index].axis((x1, x2, y1 - 0.025*(y2-y1), y2)) # Add err values as text. Careful to not put text on top of data. A[index].text(0.05, 0.05, txt, va='top', color='k', transform=A[index].transAxes, fontsize=fs) # Legend A[index].legend() # Se the font size ac = A[index] for item in ([ac.title, ac.xaxis.label, ac.yaxis.label] + ac.get_xticklabels() + ac.get_yticklabels()): item.set_fontsize(fs) # Main function. Set up the arguments. usage = "python orbit_plot.py <options>\n" parser = argparse.ArgumentParser(usage=usage, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('--dataset', dest = 'dataset', default = '', help='The dataset to plot. Only one or two datasets are supported ' '(for example, before and after optimization). Each dataset can have ' 'several types of images, given by --orbit-id. The dataset is the prefix ' 'of the cameras, such as "cameras/" or "opt/run-". It is to be followed ' 'by the orbit id, such as, "nadir" or "aft". If more than one dataset, ' 'they will be plotted on top of each other.') parser.add_argument('--orbit-id', dest = 'orbit_id', default = '', help='The id (a string) that determines an orbital group of ' + 'cameras. If more than one, separate them by comma, with no ' + 'spaces in between.') parser.add_argument('--dataset-label', dest = 'dataset_label', default = '', help='The label to use for each dataset in the legend. If more than ' + 'one, separate them by comma, with no spaces in between. If not ' + 'set, will use the dataset name.') parser.add_argument('--list', dest = 'list', default = '', help='Instead of specifying --dataset, load the cameras listed ' + 'in this file (one per line). Only the names matching --orbit-id ' + 'will be read. If more than one list, separate them by comma, with ' + 'no spaces in between.') parser.add_argument('--ref-list', dest = 'ref_list', default = '', help='When --list is specified, read the ref cams from here.') parser.add_argument('--orbit-label', dest = 'orbit_label', default = '', help='The label to use for each orbital group (will be shown as ' 'part of the title). If more than one, separate them by comma, with ' + 'no spaces in between. If not set, will use the orbit id.') parser.add_argument('--use-ref-cams', dest = 'use_ref_cams', action='store_true', help='Read from disk reference cameras that determine the satellite ' + 'orientation. This assumes the first dataset was created with ' + 'sat_sim with the option --save-ref-cams. The naming convention ' + 'assumes the additional -ref string as part of the reference camera ' + 'names, before the filename extension. Without this option, the ' + 'satellite orientations are estimated based on camera positions.') parser.add_argument('--subtract-line-fit', dest = 'subtract_line_fit', action='store_true', help='If set, subtract the best line fit from the curves being ' + 'plotted. If more than one dataset is present, the same line ' + 'fit (for the first one) will be subtracted from all of them. ' + 'This is useful for inspecting subtle changes.') parser.add_argument('--use-rmse', dest = 'use_rmse', action='store_true', help='Compute and display the root mean square error (RMSE) ' + 'rather than the standard deviation. This is useful when a ' + 'systematic shift is present. See also --subtract-line-fit.') parser.add_argument('--num-cameras', dest='num_cameras', type=int, default = -1, help='Plot only the first this many cameras from each orbital ' + 'sequence. By default, plot all of them.') parser.add_argument('--trim-ratio', dest='trim_ratio', type=float, default = 0.0, help='Trim ratio. Given a value between 0 and 1 (inclusive), ' + 'remove this fraction of camera poses from each sequence, with half ' + 'of this amount for poses at the beginning and half at the end of ' + 'the sequence. This is used only for linescan cameras, to not plot ' + 'camera poses beyond image lines. For cameras created with sat_sim, ' + 'a value of 0.5 should be used.') parser.add_argument('--figure-size', dest = 'figure_size', default = '15,15', help='Specify the width and height of the figure having the plots, ' + 'in inches. Use two numbers with comma as separator (no spaces).') parser.add_argument('--title', dest = 'title', default = '', help='Set this as the figure title, to be shown on top of all plots.') parser.add_argument('--line-width', dest = 'line_width', type=float, default = 1.5, help='Line width for the plots.') parser.add_argument('--font-size', dest = 'font_size', type=int, default = 14, help='Font size for the plots.') parser.add_argument('--output-file', dest = 'out_file', type=str, default = '', help='Save the figure to this image file, instead of showing it on ' + 'the screen. A png extension is recommended.') (opt, args) = parser.parse_known_args(sys.argv) # Throw an error if not all args have been parsed if len(args) > 1: print("Not all arguments were parsed. Unprocessed values:", args[1:]) sys.exit(1) if opt.dataset == "" and opt.list == "": print("Must set --dataset or --list.") parser.print_help() sys.exit(1) if opt.dataset != "" and opt.list != "": print("Cannot set both --dataset and --list.") parser.print_help() sys.exit(1) hasList = False if opt.dataset == "": # If the dataset label is not set, use the list hasList = True opt.dataset = opt.list if hasList and opt.use_ref_cams and opt.ref_list == "": print("Must set --ref-list when using --use-ref-cams with --list.") parser.print_help() sys.exit(1) if opt.orbit_id == "": print("Must set --orbit-id.") parser.print_help() sys.exit(1) if opt.trim_ratio < 0: print("The value of --trim-ratio must be non-negative.") parser.print_help() sys.exit(1) if opt.line_width <= 0: print("The value of --line-width must be positive.") parser.print_help() sys.exit(1) if opt.font_size <= 0: print("The value of --font-size must be positive.") parser.print_help() sys.exit(1) # Parse the datasets and their labels. Split by comma. datasets = opt.dataset.split(',') dataset_labels = opt.dataset_label.split(',') if len(dataset_labels) == 0 or (len(dataset_labels) == 1 and dataset_labels[0] == ""): dataset_labels = datasets[:] if len(dataset_labels) != len(datasets): print("Number of datasets/lists and dataset_labels must agree. Got ", datasets, " and ", dataset_labels) sys.exit(1) # Parse the orbits and their labels. Split by comma. orbits = opt.orbit_id.split(',') orbit_labels = opt.orbit_label.split(',') if len(orbit_labels) == 0 or (len(orbit_labels) == 1 and orbit_labels[0] == ""): orbit_labels = orbits[:] if len(orbit_labels) != len(orbits): print("Number of orbits and orbit_labels must agree. Got ", orbits, " and ", orbit_labels) sys.exit(1) # Read the figure dimensions figure_size = opt.figure_size.split(',') if len(figure_size) != 2: print("The --figure-size option must have two values. Got: ", figure_size) sys.exit(1) figure_size = [float(x) for x in figure_size] # We assume we have one or two datasets that we want to plot on top of each other. numSets = len(datasets) if numSets < 1: print("Must specify at least one dataset.") sys.exit(1) f, ax = plt.subplots(len(orbits), 3, sharex=False, sharey = False, figsize = (figure_size[0], figure_size[1])) # Set up the legend in the upper right corner. We will have text in upper-left plt.rcParams["legend.loc"] = 'upper right' # Set up the font for all elements fs = opt.font_size plt.rcParams.update({'font.size': fs}) plt.rc('axes', titlesize = fs) # fontsize of the axes title plt.rc('axes', labelsize = fs) # fontsize of the x and y labels plt.rc('xtick', labelsize = fs) # fontsize of the tick labels plt.rc('ytick', labelsize = fs) # fontsize of the tick labels plt.rc('legend', fontsize = fs) # legend fontsize plt.rc('figure', titlesize = fs) # fontsize of the figure title # Plot each row in the figure for row in range(len(orbits)): plot_row(ax, row, orbits, hasList, datasets, orbit_labels, dataset_labels, opt.ref_list, opt) # Show a title if set if opt.title != "": f.suptitle(opt.title, fontsize=fs) plt.tight_layout() if opt.out_file == "": plt.show() else: # Create the parent directory for this file, then save it. print("Saving the figure to: " + opt.out_file) parent = os.path.dirname(opt.out_file) if parent != "" and not os.path.exists(parent): os.makedirs(parent) plt.ioff() plt.savefig(opt.out_file) ================================================ FILE: src/asp/Tools/orbitviz.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file orbitviz.cc /// Show the positions of the cameras above the planet in kml format. #include <asp/Core/Macros.h> #include <asp/Core/StereoSettings.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/FileUtils.h> #include <asp/Core/AspProgramOptions.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisCameraModel.h> #endif #include <vw/FileIO/KML.h> #include <vw/FileIO/FileUtils.h> #include <vw/InterestPoint/InterestPoint.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/FileIO/FileTypes.h> #include <vw/FileIO/FileUtils.h> #include <iomanip> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> #include <boost/filesystem/path.hpp> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/fstream.hpp> using namespace vw; using namespace vw::camera; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options : public vw::GdalWriteOptions { Options() : separate_camera_files(true) {} // Input std::vector<std::string> input_files; std::string stereo_session, path_to_outside_model, bundle_adjust_prefix; // Settings bool separate_camera_files, write_csv, load_camera_solve, hide_labels; std::string datum; double model_scale; ///< Size scaling applied to 3D models int linescan_line; ///< Show the camera position at this line int linescan_sample; // Output std::string out_file; }; // TODO: Eliminate bool input and move somewhere else. /// Separates a list of files into camera files and image files. /// - The camera files may be the same as the image files. size_t split_files_list(std::vector<std::string> const& input_files, std::vector<std::string> & image_files, std::vector<std::string> & camera_files, const bool separate_camera_files) { size_t num_cameras = separate_camera_files ? input_files.size()/2 : input_files.size(); vw_out() << "Number of cameras: " << num_cameras << std::endl; // Split the list of image files and camera files image_files.resize (num_cameras); camera_files.resize(num_cameras); for (size_t i = 0, store=0; store < num_cameras; ++store) { image_files[store] = input_files[i]; if (separate_camera_files){ // Camera file comes after the image file camera_files[store] = input_files[i+1]; i += 2; } else { // Camera file is the same as the image file camera_files[store] = camera_files[store]; i += 1; } } // End loop through cameras return num_cameras; } /// Get a list of the files in the solver output folder size_t get_files_from_solver_folder(std::string const& solver_folder, std::vector<std::string> & image_files, std::vector<std::string> & camera_files, std::vector<std::vector<int> > & matched_cameras) { image_files.clear(); camera_files.clear(); matched_cameras.clear(); std::vector<std::string> solver_files; get_files_in_folder(solver_folder, solver_files); // Identify the image extension std::string image_ext = ""; for (size_t i=0; i<solver_files.size(); ++i) { if (vw::has_image_extension(solver_files[i])) { image_ext = get_extension(solver_files[i], false); break; } } vw_out() << "image_ext: " << image_ext << std::endl; if (image_ext == "") vw_throw( ArgumentErr() << "Failed to find any image files in the camera_solve directory: " << solver_folder); // Grab a list of just the image files size_t num_images = get_files_in_folder(solver_folder, image_files, image_ext); vw_out() << "Number of cameras: " << num_images << std::endl; // Make a list of the camera model files camera_files.resize(num_images); for (size_t i=0; i<num_images; ++i) camera_files[i] = solver_folder + "/" + image_files[i] + ".final.tsai"; // Search for IP match files std::vector<std::string> match_files; size_t num_matches = get_files_in_folder(solver_folder, match_files, ".match"); matched_cameras.resize(num_images); // Ignore any match files where there are not many matches const size_t MIN_MATCHES = 30; // This is the default value, but it could be made an option. std::vector<ip::InterestPoint> ip1, ip2; for (size_t m=0; m<num_matches; ++m) { vw::ip::read_binary_match_file(solver_folder+ "/"+match_files[m], ip1, ip2); if (ip1.size() < MIN_MATCHES) match_files[m] = ""; } // Figure out which image pairs are matched std::string f1, f2; for (size_t i=0; i<num_images; ++i) { matched_cameras[i].clear(); // Start with empty list of matches f1 = strip_directory_and_extension(image_files[i]); for (size_t j=0; j<num_images; ++j) { if (i == j) // No self-matching! continue; f2 = strip_directory_and_extension(image_files[j]); for (size_t m=0; m<num_matches; ++m) { // If both file names are contained in the match file name, // make a match between image files i and j if ( (match_files[m].find(f1) != std::string::npos) && (match_files[m].find(f2) != std::string::npos) ) { matched_cameras[i].push_back(j); match_files[m] = ""; // Clear this name so we don't use the match twice } } } } // End nested loops for setting up file matches return num_images; } void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options(""); general_options.add_options() ("output,o", po::value(&opt.out_file)->default_value("orbit.kml"), "The output kml file that will be written.") ("reference-spheroid,r", po::value(&opt.datum)->default_value("WGS_1984"), "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).") ("use-path-to-dae-model,u", po::value(&opt.path_to_outside_model), "Instead of using an icon to mark a camera, use a 3D model with extension .dae.") ("linescan-line", po::value(&opt.linescan_line)->default_value(0), "Show the position of the camera when this line was captured.") ("linescan-sample", po::value(&opt.linescan_sample)->default_value(0), "Show the position of the camera when this sample was captured.") ("hide-labels", po::bool_switch(&opt.hide_labels)->default_value(false)->implicit_value(true), "Hide image names unless the camera is highlighted.") // The KML class applies a model scale of 3000 * this value. ("model-scale", po::value(&opt.model_scale)->default_value(1.0/30.0), "Scale factor applied to 3D model size.") ("session-type,t", po::value(&opt.stereo_session)->default_value(""), "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.") ("load-camera-solve", po::bool_switch(&opt.load_camera_solve)->default_value(false)->implicit_value(true), "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.") ("write-csv", po::bool_switch(&opt.write_csv)->default_value(false), "Write a csv file with the orbital data.") ("bundle-adjust-prefix", po::value(&opt.bundle_adjust_prefix), "Use the camera adjustment obtained by previously running bundle_adjust with this output prefix."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input-files", po::value(&opt.input_files) ); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("[options] <input images and cameras>\nNote: All cameras and their images must be of the same session type."); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Need this to be able to load adjusted camera models. That will happen // in the stereo session. asp::stereo_settings().bundle_adjust_prefix = opt.bundle_adjust_prefix; } int main(int argc, char* argv[]) { Options opt; try { handle_arguments(argc, argv, opt); // Get the list of image files and camera model files size_t num_cameras = 0; std::vector<std::string> image_files, camera_files; std::vector<std::vector<int> > matched_cameras; if (!opt.load_camera_solve) { bool ensure_equal_sizes = true; asp::separate_images_from_cameras(opt.input_files, image_files, camera_files, // outputs ensure_equal_sizes); num_cameras = image_files.size(); }else{ num_cameras = get_files_from_solver_folder(opt.input_files[0], image_files, camera_files, matched_cameras); } if ( image_files.empty() ) vw_throw( ArgumentErr() << "No image files detected.\n" ); std::string first_image = image_files[0]; std::string first_camera = first_image; if (!camera_files.empty()) first_camera = camera_files[0]; asp::SessionPtr session (asp::StereoSessionFactory::create(opt.stereo_session, // may change inside opt, first_image, first_image, first_camera, first_camera ) ); // Prepare output directory vw::create_out_dir(opt.out_file); // Create the KML file. The KML title comes from the output file name. KMLFile kml( opt.out_file, strip_directory_and_extension(opt.out_file)); // Style listing if ( opt.path_to_outside_model.empty() ) { // Placemark Style kml.append_style( "plane", "", 1.2, "http://maps.google.com/mapfiles/kml/shapes/airports.png", opt.hide_labels); kml.append_style( "plane_highlight", "", 1.4, "http://maps.google.com/mapfiles/kml/shapes/airports.png"); kml.append_stylemap( "camera_placemark", "plane", "plane_highlight" ); } // Load up the datum cartography::Datum datum(opt.datum); vw_out() << "Using datum: " << datum << std::endl; std::string csv_file = fs::path(opt.out_file).replace_extension("csv").string(); std::ofstream csv_handle; if ( opt.write_csv ) { csv_handle.open(csv_file.c_str()); if ( !csv_handle.is_open() ) vw_throw( IOErr() << "Unable to open output file.\n" ); } Vector2 camera_pixel(opt.linescan_sample, opt.linescan_line); // Building Camera Models and then writing to KML std::vector<Vector3> camera_positions(num_cameras); for (size_t i=0; i < num_cameras; i++) { boost::shared_ptr<camera::CameraModel> current_camera; // This is so clumsy, a new stereo session needs to be loaded for each // input camera. asp::SessionPtr session (asp::StereoSessionFactory::create(opt.stereo_session, // may change inside opt, image_files[i], image_files[i], camera_files[i], camera_files[i] ) ); current_camera = session->camera_model(image_files[i], camera_files[i]); if ( opt.write_csv ) { csv_handle << image_files[i] << ", "; // Add the ISIS camera serial number if applicable #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 boost::shared_ptr<IsisCameraModel> isis_cam = boost::dynamic_pointer_cast<IsisCameraModel>(current_camera); if ( isis_cam != NULL ) { csv_handle << isis_cam->serial_number() << ", "; } #endif Vector3 xyz = current_camera->camera_center(camera_pixel); csv_handle << std::setprecision(12); csv_handle << xyz[0] << ", " << xyz[1] << ", " << xyz[2] << "\n"; } // End csv write condition // Compute and record the GDC coordinates Vector3 lon_lat_alt = datum.cartesian_to_geodetic( current_camera->camera_center(camera_pixel)); camera_positions[i] = lon_lat_alt; // Adding Placemarks std::string display_name = strip_directory(image_files[i]); if (!opt.path_to_outside_model.empty()) { kml.append_model( opt.path_to_outside_model, lon_lat_alt.x(), lon_lat_alt.y(), inverse(current_camera->camera_pose(camera_pixel)), display_name, "", lon_lat_alt[2], opt.model_scale ); } else { kml.append_placemark( lon_lat_alt.x(), lon_lat_alt.y(), display_name, "", "camera_placemark", lon_lat_alt[2], true ); } } // End loop through cameras // Draw lines between camera positions representing camera // pairs with match files. const std::string style_id = "ip_match_style"; kml.append_line_style(style_id, "FF00FF00", 1.0); // Green line with default size std::vector<Vector3> line_ends(2); for (size_t i=0; i<matched_cameras.size(); ++i) { line_ends[0] = camera_positions[i]; for (size_t j=0; j<matched_cameras[i].size(); ++j) { int index = matched_cameras[i][j]; line_ends[1] = camera_positions[index]; kml.append_line(line_ends, "", style_id); } } // Put the Writing: messages here, so that they show up after all other info. vw_out() << "Writing: " << opt.out_file << std::endl; kml.close_kml(); if (opt.write_csv){ vw_out() << "Writing: " << csv_file << std::endl; csv_handle.close(); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/otsu_threshold.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file otsu_thresh.cc /// /// Tool for finding the Otsu image threshold /// https://en.wikipedia.org/wiki/Otsu%27s_method #include <limits> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Image/Statistics.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> namespace po = boost::program_options; using namespace vw; struct Options: vw::GdalWriteOptions { std::vector<std::string> image_files; bool has_nodata_value; std::int64_t num_samples, num_bins; double nodata_value; Options(): has_nodata_value(false), num_samples(-1), nodata_value(std::numeric_limits<double>::quiet_NaN()){} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); // Add the reverse option general_options.add(vw::GdalWriteOptionsDescription(opt)); general_options.add_options() ("num-samples", po::value(&opt.num_samples)->default_value(-1), "The number of samples to pick from the image. If not specified, hence set to -1, " "the full image will be used.") ("num-bins", po::value(&opt.num_bins)->default_value(256), "Number of bins to use for the histogram. A larger value is " "suggested if the image has outlying pixel values.") ("nodata-value", po::value(&opt.nodata_value), "Use this nodata value instead of what is read from the file, if present."); po::options_description positional(""); positional.add_options() ("image-files", po::value(&opt.image_files)); po::positional_options_description positional_desc; positional_desc.add("image-files", -1); std::string usage("[options] <images>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); opt.has_nodata_value = vm.count("nodata-value"); if (opt.image_files.empty()) vw_throw(ArgumentErr() << "No input images were specified.\n" << usage << general_options); if (opt.num_bins <= 100) vw_throw(ArgumentErr() << "At least 100 bins should be used, and ideally more.\n" << usage << general_options); } int main( int argc, char *argv[] ) { Options opt; try { // Find command line options handle_arguments(argc, argv, opt); for (size_t it = 0; it < opt.image_files.size(); it++) { std::string image_file = opt.image_files[it]; std::cout << "Reading image: " << image_file << std::endl; DiskImageView<float> image(image_file); boost::shared_ptr<vw::DiskImageResource> rsrc(vw::DiskImageResourcePtr(image_file)); // Check for nodata value in the file if (opt.has_nodata_value) { std::cout << "Using as nodata value: " << opt.nodata_value << ".\n"; }else if (rsrc->has_nodata_read()) { opt.nodata_value = rsrc->nodata_read(); opt.has_nodata_value = true; std::cout << "Extracted nodata value from file: " << opt.nodata_value << ".\n"; } else { std::cout << "No nodata value present in the file." << std::endl; } // Use a 64 bit int to not run into an overflow std::int64_t num_rows = image.rows(), num_cols = image.cols(); std::int64_t num_vals = num_rows * num_cols; if (num_vals <= 0) vw_throw(ArgumentErr() << "Found empty image: " << image_file << "\n"); double samp_ratio = 1.0; if (opt.num_samples > 0) samp_ratio = sqrt(double(num_vals) / double(opt.num_samples)); samp_ratio = std::max(samp_ratio, 1.0); std::int64_t num_sample_rows = round(num_rows / samp_ratio); num_sample_rows = std::max(std::int64_t(1), num_sample_rows); num_sample_rows = std::min(num_rows, num_sample_rows); std::int64_t num_sample_cols = round(num_cols / samp_ratio); num_sample_cols = std::max(std::int64_t(1), num_sample_cols); num_sample_cols = std::min(num_cols, num_sample_cols); std::cout << "Number of image rows and columns: " << num_rows << ", " << num_cols << "\n"; std::cout << "Picking a uniform sample of dimensions " << num_sample_rows << ", " << num_sample_cols << "\n"; std::cout << "Number of bins in the histogram: " << opt.num_bins << std::endl; std::cout << "It may take several minutes to find the answer.\n"; // The mask creation can handle a NaN for the opt.nodata_value. double threshold = vw::otsu_threshold(create_mask(image, opt.nodata_value), num_sample_rows, num_sample_cols, opt.num_bins); // A different implementation, which gives the same result // if above the full image is sampled and 256 bins are used. //double threshold2 = vw::otsu_threshold(create_mask(image, opt.nodata_value)); vw_out() << std::setprecision(16) << "Otsu threshold for image " << image_file << ": " << threshold << "\n"; } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/pansharp.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Camera/RPC_XML.h> #include <vw/Image/ImageChannels.h> #include <vw/Image/ImageView.h> #include <vw/Cartography/GeoTransform.h> #include <vw/FileIO/FileUtils.h> using std::endl; using std::string; using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; // TODO: Move these to vw/PixelType.h ?? // - These don't follow the existing pixel color conventions! /// Convert an RGB pixel to a YCbCr pixel /// - So far this only works for unsigned char and unsigned short. template <typename T> T rgbToYCbCr(T const& rgb, double min_val, double max_val) { // Convert double mean_val = (min_val + max_val+1) / 2.0; double temp[3]; temp[0] = 0.299 *rgb[0] + 0.587 *rgb[1] + 0.114 *rgb[2]; temp[1] = mean_val - 0.168736*rgb[0] - 0.331264*rgb[1] + 0.5 *rgb[2]; temp[2] = mean_val + 0.5 *rgb[0] - 0.418688*rgb[1] - 0.081312*rgb[2]; // Copy and constrain T ycbcr; for (int i=0; i<3; ++i) { ycbcr[i] = temp[i]; if (temp[i] < min_val) ycbcr[i] = min_val; if (temp[i] > max_val) ycbcr[i] = max_val; } return ycbcr; } /// Converts a single YCbCr pixel to RGB /// - So far this only works for unsigned char and unsigned short. template <typename T> T ycbcrToRgb(T const& ycbcr, double min_val, double max_val) { // Convert double mean_val = (min_val + max_val+1) / 2.0; double temp[3]; temp[0] = ycbcr[0] + 1.402 * (ycbcr[2] - mean_val); temp[1] = ycbcr[0] - 0.34414 * (ycbcr[1] - mean_val) - 0.71414 * (ycbcr[2] - mean_val); temp[2] = ycbcr[0] + 1.772 * (ycbcr[1] - mean_val); // Copy and constrain T rgb; for (int i=0; i<3; ++i) { rgb[i] = temp[i]; if (temp[i] < min_val) rgb[i] = min_val; if (temp[i] > max_val) rgb[i] = max_val; } return rgb; } /// Image view class which applies a pan sharp algorithm. /// - This takes a gray and an RGB image as input and generates an RGB image as output. /// - This operation is not particularly useful unless the gray image is higher /// resolution than the RGB image. template <class ImageGrayT, class ImageColorT, typename DataTypeT> class PanSharpView : public ImageViewBase<PanSharpView<ImageGrayT, ImageColorT, DataTypeT> > { public: // Definitions typedef PixelRGB<DataTypeT> pixel_type; // This is what controls the type of image that is written to disk. typedef pixel_type result_type; private: // Variables // TODO: These should be Ref views and masked? ImageGrayT const& m_gray_image; ImageColorT const& m_color_image; DataTypeT m_output_nodata; DataTypeT m_min_val; DataTypeT m_max_val; int m_num_rows; int m_num_cols; public: // Functions // Constructor PanSharpView( ImageGrayT const& gray_image, ImageColorT const& color_image, DataTypeT outputNodata, DataTypeT min_value, DataTypeT max_value) : m_gray_image(gray_image), m_color_image(color_image), m_output_nodata(outputNodata), m_min_val(min_value), m_max_val(max_value) { // The images are assumed to be the same size (possibly due to transforms) m_num_rows = m_gray_image.rows(); m_num_cols = m_gray_image.cols(); } inline int32 cols () const { return m_num_cols; } inline int32 rows () const { return m_num_rows; } inline int32 planes() const { return 1; } inline result_type operator()( int32 i, int32 j, int32 p=0 ) const { return 0; // NOT IMPLEMENTED! } typedef ProceduralPixelAccessor<PanSharpView<ImageGrayT, ImageColorT, DataTypeT> > pixel_accessor; inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); } /// Apply pansharp algorithm to a single pair of pixels. /// - Any required interpolation etc. will have already happened by now. template <class P1, class P2> result_type convert_pixel(P1 const& gray_pixel, P2 const& color_pixel) const { // Convert RGB to YCbCr P2 temp = rgbToYCbCr(color_pixel, m_min_val, m_max_val); result_type ycbcr_pixel(temp[0], temp[1], temp[2]); // Extra step breaks any type dependency from the inputs // Replace Y channel with gray value ycbcr_pixel[0] = gray_pixel[0]; // Convert YCbCr back to RGB return ycbcrToRgb(ycbcr_pixel, m_min_val, m_max_val); } typedef CropView<ImageView<result_type> > prerasterize_type; inline prerasterize_type prerasterize( BBox2i const& bbox ) const { // Set up the output image tile ImageView<result_type> tile(bbox.width(), bbox.height()); // Loop through each output pixels and compute each output value for (int c = 0; c < bbox.width(); c++) { int source_c = c + bbox.min()[0]; for (int r = 0; r < bbox.height(); r++) { int source_r = r + bbox.min()[1]; // Check for a masked pixel if ( !is_valid(m_gray_image (source_c, source_r)) || !is_valid(m_color_image(source_c, source_r)) ) { tile(c, r) = m_output_nodata; continue; } // Pass the two input pixels into the conversion function //result_type output_pixel = convert_pixel(m_gray_image(source_c, r), m_color_image(source_c, r)); tile(c,r) = convert_pixel(m_gray_image (source_c, source_r), m_color_image(source_c, source_r)); } // End row loop } // End column loop // Return the tile we created with fake borders to make it look the size of the entire output image return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows() ); } // End prerasterize function template <class DestT> inline void rasterize( DestT const& dest, BBox2i const& bbox ) const { vw::rasterize( prerasterize(bbox), dest, bbox ); } }; // End class PanSharpView /// Convenience function template <class ImageGrayT, class ImageColorT, typename DataTypeT> PanSharpView<ImageGrayT, ImageColorT, DataTypeT> inline pansharp_view( ImageGrayT const& gray_image, ImageColorT const& color_image, DataTypeT output_nodata, DataTypeT min_value, DataTypeT max_value ) { return PanSharpView<ImageGrayT, ImageColorT, DataTypeT> (gray_image, color_image, output_nodata, min_value, max_value); } //------------------------------------------------------------------------------------- struct Options : vw::GdalWriteOptions { string gray_file, gray_xml_file, color_file, color_xml_file, output_file; double nodata_value, min_value, max_value; bool has_nodata; }; const double DEFAULT_NODATA = -std::numeric_limits<double>::max(); void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options(""); general_options.add_options() ("min-value", po::value(&opt.min_value)->default_value(0), "Set this as the minimum legal image value, overriding the data type default.") ("max-value", po::value(&opt.max_value)->default_value(0), "Set this as the maximum legal image value, overriding the data type default.") ("gray-xml", po::value(&opt.gray_xml_file)->default_value(""), "Path to a WV XML file for the gray image. Can be used to obtain the geo data.") ("color-xml", po::value(&opt.color_xml_file)->default_value(""), "Path to a WV XML file for the color image. Can be used to obtain the geo data.") ("nodata-value", po::value(&opt.nodata_value)->default_value(DEFAULT_NODATA), "The no-data value to use, unless present in the color image header."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("gray_file", po::value(&opt.gray_file), "The gray image file") ("color_file", po::value(&opt.color_file), "The color image file") ("output_file", po::value(&opt.output_file), "The output file"); po::positional_options_description positional_desc; positional_desc.add("gray_file", 1); positional_desc.add("color_file", 1); positional_desc.add("output_file", 1); std::string usage("[options] <gray file> <color file> <output file>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); if ( opt.gray_file.empty() || opt.color_file.empty() || opt.output_file.empty()) vw_throw( ArgumentErr() << "Requires <gray file>, <color file>, and <output file> in order to proceed.\n\n" << usage << general_options ); if (opt.min_value > opt.max_value) vw_throw( ArgumentErr() << "The minimum value cannot be greater than the maximum value!\n\n"); // Determine if the user entered a nodata value opt.has_nodata = vm.count("output-nodata-value"); vw::create_out_dir(opt.output_file); } /// Load and process the images with the correct data type template <typename T> void load_inputs_and_process(Options & opt, GeoReference const& gray_georef, GeoReference const& color_georef, double const& gray_nodata, double const& color_nodata) { // If the user left max_value at the default, make it the data type max. // - min_value defaults to zero so no need to change that. if (opt.max_value == 0) opt.max_value = std::numeric_limits<T>::max(); // TODO: How to handle nonexistant nodata value? std::cout << "Min value: " << (double)opt.min_value << std::endl; std::cout << "Max value: " << (double)opt.max_value << std::endl; std::cout << "Gray nodata: " << (double)gray_nodata << std::endl; std::cout << "Color nodata: " << (double)color_nodata << std::endl; std::cout << "Out nodata: " << (double)opt.nodata_value << std::endl; // Set up file handles DiskImageResourceGDAL gray_rsrc(opt.gray_file), color_rsrc(opt.color_file); DiskImageView<PixelGray<T> > gray_img (gray_rsrc); DiskImageView<PixelRGB <T> > color_img(color_rsrc); // Generate a bounding box that is the minimum of the two BBox areas BBox2 crop_box = bounding_box( gray_img ); crop_box.crop(gray_georef.lonlat_to_pixel_bbox(color_georef.pixel_to_lonlat_bbox(bounding_box( color_img )))); // Processing is done on doubles to handle nodata values, then converted to the desired output type. // Generate a view of the color image from the pixel coordinate system of the gray image typedef PixelMask<PixelRGB<double> > PixelRGBMaskD; typedef PixelMask<PixelRGB<T > > PixelRGBMask; ImageViewRef<PixelRGBMaskD> color_trans = crop(geo_transform( create_mask(pixel_cast<PixelRGBMaskD>(color_img), color_nodata), color_georef, gray_georef, ValueEdgeExtension<PixelRGBMaskD>(PixelRGBMaskD()) ), crop_box ); // WorldView convention is to mask <= a value, but this may not be a universal standard! // - create_mask_less_or_equal seems to break on PixelRGB types. vw_out() << "Writing: " << opt.output_file << std::endl; vw::cartography::block_write_gdal_image( opt.output_file, // The final output image is set up in these few lines: pixel_cast<PixelRGBMask> (apply_mask(pansharp_view (crop(create_mask_less_or_equal (pixel_cast<double>(gray_img), gray_nodata), crop_box), color_trans, opt.nodata_value, opt.min_value, opt.max_value), opt.nodata_value) ), true, gray_georef, // The output is written in the gray coordinate system opt.has_nodata, opt.nodata_value, opt, TerminalProgressCallback("pansharp","\t--> Writing:")); } int main( int argc, char *argv[] ) { Options opt; try { handle_arguments( argc, argv, opt ); DiskImageResourceGDAL gray_rsrc(opt.gray_file), color_rsrc(opt.color_file); double gray_nodata = opt.nodata_value; double color_nodata = opt.nodata_value; if ( gray_rsrc.has_nodata_read() ) { gray_nodata = gray_rsrc.nodata_read(); vw_out() << "\tFound input nodata value for the gray image: " << gray_nodata << endl; } if ( color_rsrc.has_nodata_read() ) { color_nodata = color_rsrc.nodata_read(); vw_out() << "\tFound input nodata value for the color image: " << color_nodata << endl; // If we read in color nodata and the user did not provide nodata, // set this as the output nodata value. if (opt.nodata_value == DEFAULT_NODATA) { opt.nodata_value = color_nodata; opt.has_nodata = true; } } // Read in geo information GeoReference gray_georef, color_georef; if (!asp::read_wv_georeference(gray_georef, opt.gray_file, opt.gray_xml_file ) || !asp::read_wv_georeference(color_georef, opt.color_file, opt.color_xml_file) ) { vw_throw(ArgumentErr() << "Could not read a georeference from an input image!\n"); } // Transform the color image into the same perspective as the grayscale image. However, we // don't support datum changes! if ( gray_georef.datum().proj4_str() != color_georef.datum().proj4_str() ) vw_throw( NoImplErr() << "Pansharp can't operate on images which are on different datums!\n" ); // Check the input data type ChannelTypeEnum input_data_type = gray_rsrc.channel_type(); ChannelTypeEnum color_data_type = color_rsrc.channel_type(); if (input_data_type != color_data_type) vw_throw( NoImplErr() << "Pansharp can't operate on images which are different data types!\n" ); // Redirect to another function with the correct template type switch(input_data_type) { //case VW_CHANNEL_INT8 : load_inputs_and_process<vw::int8 >(opt); break; case VW_CHANNEL_UINT8 : load_inputs_and_process<vw::uint8 >(opt, gray_georef, color_georef, gray_nodata, color_nodata); break; //case VW_CHANNEL_INT16 : load_inputs_and_process<vw::int16 >(opt); break; case VW_CHANNEL_UINT16 : load_inputs_and_process<vw::uint16 >(opt, gray_georef, color_georef, gray_nodata, color_nodata); break; //case VW_CHANNEL_INT32 : load_inputs_and_process<vw::int32 >(opt); break; //case VW_CHANNEL_UINT32 : load_inputs_and_process<vw::uint32 >(opt); break; //case VW_CHANNEL_FLOAT32: load_inputs_and_process<vw::float32>(opt); break; //case VW_CHANNEL_FLOAT64: load_inputs_and_process<vw::float64>(opt); break; default : vw_throw(ArgumentErr() << "Input image format " << input_data_type << " is not supported!\n"); }; } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/parallel_bundle_adjust ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ import sys, argparse, subprocess, re, os, math, time, glob, shutil, math, copy import os.path as P # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_cmd_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] # This is explained below if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] def get_output_prefix(args): '''Parse the output prefix from the argument list''' prefix = asp_cmd_utils.get_option(args, '-o', 1) if not prefix: prefix = asp_cmd_utils.get_option(args, '--output-prefix', 1) if len(prefix) < 2: raise Exception('Failed to parse the output prefix.') return prefix[1] def get_num_nodes(nodes_list): if nodes_list is None: return 1 # local machine # Count the number of nodes without repetition (need this for # Pleiades). nodes = {} num_nodes = 0 try: fh = open(nodes_list, "r") for line in fh: if re.match(r'^\s*$', line): continue # skip empty lines matches = re.match(r'^\s*([^\s]*)', line) if matches: nodes[matches.group(1)] = 1 num_nodes = len(nodes) except Exception as e: asp_system_utils.raise_error(e) if num_nodes == 0: raise Exception('The list of computing nodes is empty') return num_nodes def get_best_procs_threads(): # Decide the best number of processes to use on a node, and how # many threads to use for each process. Too many processes # may result in too much memory usage. # We assume all machines have the same number of CPUs (cores) num_cpus = asp_system_utils.get_num_cpus() # Auto-compute the number of processes unless set. if opt.processes is not None: num_procs = opt.processes else: num_procs = int(round(num_cpus/4.0)) if num_procs < 1: num_procs = 1 # Same for the number of threads. if opt.threads is not None: num_threads = opt.threads else: num_threads = int(math.ceil(float(num_cpus)/num_procs)) if num_threads < 1: num_threads = 1 print("Using %d threads and %d processes." % (num_threads, num_procs)) return (num_procs, num_threads) def get_num_images(args): '''Return the number of input images. There are several cases to consider.''' count = 0 # TODO(oalexan1): This is very fragile logic. IMAGE_EXTENSIONS = ['.tif', '.tiff', '.ntf', '.nitf', '.png', '.jpeg', '.jpg', '.jp2', '.img', '.cub', '.bip', '.bil', '.bsq'] for a in args: lc = a.lower() for e in IMAGE_EXTENSIONS: if lc.endswith(e): count += 1 # Handle --image-list if count == 0: if '--image-list' not in args: raise Exception("No input images found, and neither was " + \ "--image-list specified. Supported image extensions: " + \ " ".join(IMAGE_EXTENSIONS)) # Parse --image-list if '--image-list' in args: count = 0 for v in range(len(args)): if args[v] == '--image-list' and v + 1 < len(args): image_list = args[v + 1] # If image_list has commas, that means it is a list of lists. # Then split by comma and collect in an array. if ',' in image_list: image_lists = image_list.split(',') else: image_lists = [image_list] for image_list in image_lists: # Check if image_list exists if not os.path.isfile(image_list): raise Exception("Could not find image list: " + image_list) with open(image_list, "r") as fh: lines = fh.readlines() lines = (" ".join(lines)).split() for line in lines: line = line.strip() if len(line) == 0: continue count = count + 1 return count # Launch the jobs with GNU Parallel. It will take care of distributing the jobs # across the nodes and load balancing. The way we accomplish this is by calling # this same script but with --job-id <num>. def spawn_to_nodes(step, num_nodes, output_prefix, argsIn): args = copy.copy(argsIn) if opt.processes is None or opt.threads is None: # The user did not specify these. We will find the best # for their system. (num_procs, num_threads) = get_best_procs_threads() else: num_procs = opt.processes num_threads = opt.threads # Number of jobs to run in parallel to ensure all nodes are busy. num_parallel_jobs = num_nodes * num_procs # Need not have more processes than jobs to run on them. # TODO(oalexan1): Wipe this #if num_procs > num_parallel_jobs: # num_procs = num_parallel_jobs asp_cmd_utils.wipe_option(args, '--processes', 1) asp_cmd_utils.wipe_option(args, '--threads', 1) args.extend(['--processes', str(num_procs)]) args.extend(['--threads', str(num_threads)]) args.extend(['--num-parallel-jobs', str(num_parallel_jobs)]) # For convenience store the list of job ids in a file that # will be passed to GNU parallel. Keep this in the run directory. asp_system_utils.mkdir_p(os.path.dirname(output_prefix)) job_list = output_prefix + '-job-list.txt' f = open(job_list, 'w') for i in range(num_parallel_jobs): f.write("%d\n" % i) f.close() # Use GNU parallel with given number of processes. # TODO(oalexan1): Run 'parallel' using the runInGnuParallel() function call, # when the ASP_LIBRARY_PATH trick can be fully encapsulated in the # asp_system_utils.py code rather than being needed for each tool. 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] if asp_system_utils.which(cmd[0]) is None: raise Exception('Need GNU Parallel to distribute the jobs.') if opt.nodes_list is not None: cmd += ['--sshloginfile', opt.nodes_list] if opt.parallel_options is not None: cmd += opt.parallel_options.split(' ') # Add the options which we want GNU parallel to not mess # with. Put them into a single string. Before that, put in quotes # any quantities having spaces, to avoid issues later. # Don't quote quantities already quoted. # TODO(oalexan1): Unify this across all tools. # Improve and use the function argListToString. args_copy = args[:] # deep copy args_copy += ["--work-dir", opt.work_dir] if opt.isisroot is not None: args_copy += ["--isisroot", opt.isisroot] if opt.isisdata is not None: args_copy += ["--isisdata", opt.isisdata] for index, arg in enumerate(args_copy): if re.search(r"[ \t]", arg) and arg[0] != '\'': args_copy[index] = '\'' + arg + '\'' python_path = sys.executable # children must use same Python as parent start = step; stop = start + 1 args_str = python_path + " " + \ " ".join(args_copy) + \ " --entry-point " + str(start) + \ " --stop-point " + str(stop) args_str += " --job-id {}" cmd += [args_str] # This is a bugfix for RHEL 8. The 'parallel' program fails to start with ASP's # libs, so temporarily hide them. if 'LD_LIBRARY_PATH' in os.environ: os.environ['ASP_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH'] os.environ['LD_LIBRARY_PATH'] = '' try: asp_system_utils.generic_run(cmd, opt.verbose) except Exception as e: exception_len = len(str(e)) # This may fail because the command line is too long. It does not seem # possible to catch this error, which comes from parallel. So we # have to guess. if exception_len > 50000: print("If the command line is too long, consider using --image-list, etc.") raise Exception(str(e)) # Undo the above if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] def run_job(prog, args, job_id, **kw): '''Wrapper to run a command. Set job_id=-1 if only one job will be called.''' binpath = asp_system_utils.bin_path(prog) call = [binpath] call.extend(args) if job_id < 0: # Only one job will process everything if opt.threads is not None: asp_cmd_utils.wipe_option(call, '--threads', 1) call.extend(['--threads', str(opt.threads)]) else: # One of the parallel jobs if opt.threads is not None: asp_cmd_utils.wipe_option(call, '--threads', 1) call.extend(['--threads', str(opt.threads)]) if opt.dryrun: print('%s' % ' '.join(call)) return if opt.verbose: print('%s' % ' '.join(call)) try: code = subprocess.call(call) except OSError as e: raise Exception('%s: %s' % (binpath, e)) if code != 0: raise Exception('Bundle adjust step ' + kw['msg'] + ' failed') class ParallelBaStep: # The ids of individual parallel_bundle_adjust steps. What the user # sets as the statistics step, internally has 3 sub-steps: # A. Compute image statistics # B. Compute normalization bounds. # C. Compute interest points per image. statistics = 0 bounds = 0.1 interest_point = 0.2 matching = 1 optimization = 2 all = 3 if __name__ == '__main__': # Fix for this failing in a subprocess. There, need not know the ASP version. asp_version = '' if 'ISISROOT' in os.environ: asp_version = asp_system_utils.get_asp_version() usage = '''parallel_bundle_adjust <images> <cameras> <optional ground control points> -o <output prefix> [options] Camera model arguments may be optional for some stereo session types (e.g. isis). See bundle_adjust for all options.\n''' + asp_version # A wrapper for bundle_adjust which computes image statistics and IP matches # in parallel across multiple machines. The final bundle_adjust step is # performed on a single machine. # Algorithm: When the script is started, it starts one copy of # itself on each node during steps before optimization. # Those scripts in turn start actual jobs on those nodes. # For the optimization step, the script does the work itself. p = argparse.ArgumentParser(usage=usage) p.add_argument('--nodes-list', dest='nodes_list', default=None, help='The list of computing nodes, one per line. ' + \ 'If not provided, run on the local machine.') p.add_argument('--processes', dest='processes', default=None, type=int, help='The number of processes to use per node. The default is ' + \ 'a quarter of the number of cores on the head node.') p.add_argument('--threads', dest='threads', default=None, type=int, help='The number of threads per process. The default is ' + \ 'the number of cores on the head node over the number of processes.') p.add_argument('-e', '--entry-point', dest='entry_point', default=0, type = float, help = "Bundle adjustment entry point (start at this stage). " + \ "Options: statistics and interest points per image = 0, " + \ "interest point matching = 1, optimization = 2.") p.add_argument('--stop-point', dest='stop_point', default=3, type = float, help = "Bundle adjustment stop point (stop *before* this stage). " + \ "Options: statistics = 0, matching = 1, optimization = 2, all = 3.") p.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2', help='Options to pass directly to GNU Parallel.') p.add_argument('-v', '--version', dest='version', default=False, action='store_true', help='Display the version of software.') p.add_argument('--verbose', dest='verbose', default=False, action='store_true', help='Display the commands being executed.') # Internal variables below. # The index of the spawned process, 0 <= job_id < processes. p.add_argument('--job-id', dest='job_id', default=None, type=int, help=argparse.SUPPRESS) # Directory where the job is running p.add_argument('--work-dir', dest='work_dir', default=None, help=argparse.SUPPRESS) # ISIS settings p.add_argument('--isisroot', dest='isisroot', default=None, help=argparse.SUPPRESS) p.add_argument('--isisdata', dest='isisdata', default=None, help=argparse.SUPPRESS) # Debug options p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true', help=argparse.SUPPRESS) global opt (opt, args) = p.parse_known_args() if opt.version: asp_system_utils.print_version_and_exit() if not args and not opt.version: p.print_help() sys.exit(1) try: args = asp_cmd_utils.clean_args(args) output_prefix = get_output_prefix(args) except Exception as e: # Print the error message and exit. print('\nERROR: ' + str(e) + '\n') p.print_help() sys.exit(1) # Setting ISISROOT and ISISDATA must happen in both parent and # child processes, and before checking parallel version. if opt.isisroot is not None: os.environ['ISISROOT'] = opt.isisroot if opt.isisdata is not None: os.environ['ISISDATA'] = opt.isisdata # Ensure our 'parallel' is not out of date asp_system_utils.check_parallel_version() if opt.job_id is None: # When the script is started, set some options from the # environment which we will pass to the scripts we spawn # 1. Set the work directory opt.work_dir = os.getcwd() # 2. Set the ISIS settings if any if 'ISISROOT' in os.environ: opt.isisroot = os.environ['ISISROOT'] if 'ISISDATA' in os.environ: opt.isisdata = os.environ['ISISDATA'] # 3. Fix for Pleiades, copy the nodes_list to the run directory # to ensure it can be seen on any node. if opt.nodes_list is not None: if not os.path.isfile(opt.nodes_list): asp_system_utils.raise_error('No such nodes-list file: ' + opt.nodes_list, code=2) local_nodes_list = output_prefix + "-nodes-list.txt" if opt.nodes_list != local_nodes_list: asp_system_utils.mkdir_p(os.path.dirname(output_prefix)) shutil.copy2(opt.nodes_list, local_nodes_list) opt.nodes_list = local_nodes_list asp_cmd_utils.wipe_option(sys.argv, '--nodes-list', 1) sys.argv.extend(['--nodes-list', opt.nodes_list]) print("Nodes list: " + opt.nodes_list) else: # After the script spawns itself to nodes, it starts in the # home dir. Make it go to the right place. os.chdir(opt.work_dir) if opt.version: args.append('-v') if opt.job_id is None: # We get here when the script is started. The current running # process has become the management process that spawns other # copies of itself on other machines. This block will only do # actual work during the optimization step. # Wipe options which we will override. self_args = sys.argv # shallow copy asp_cmd_utils.wipe_option(self_args, '-e', 1) asp_cmd_utils.wipe_option(self_args, '--entry-point', 1) asp_cmd_utils.wipe_option(self_args, '--stop-point', 1) output_folder = os.path.dirname(output_prefix) # Create the main output folder if (not os.path.exists(output_folder)) and (output_folder != ""): os.makedirs(output_folder) if '--isis-cnet' in args or '--match-files-prefix' in args or \ '--clean-match-files-prefix' in args or '--skip-matching' in args or \ '--nvm' in args: print("Skipping statistics and matching based on input options.") if opt.entry_point < ParallelBaStep.optimization: opt.entry_point = ParallelBaStep.optimization # Sanity check if (opt.entry_point < ParallelBaStep.statistics or opt.stop_point < ParallelBaStep.statistics): raise Exception("Invalid entry or stop point.") num_nodes = get_num_nodes(opt.nodes_list) # Statistics, bounds per image, interest points per image step = ParallelBaStep.interest_point if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() # Spawn statistics processes to nodes # num_images = get_num_images(self_args) spawn_to_nodes(ParallelBaStep.statistics, num_nodes, output_prefix, self_args) # Run the bounds step as a single process if '--skip-matching' not in args: args.extend(['--skip-matching']) # this will also skip stats run_job('bundle_adjust', args + ['--calc-normalization-bounds'], job_id=-1, msg='%d: Normalization bounds' % step) # Spawn interest point processes to nodes spawn_to_nodes(ParallelBaStep.interest_point, num_nodes, output_prefix, self_args) # Matching step = ParallelBaStep.matching if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() # Will run as many processes as we have nodes times processes per node. # This seems to be the best approach at load-balancing. # The commented-out logic below will be deleted at some point. # To do load-balancing properly, need to know how many pairs of # images we expect to match. This depends on --auto-overlap-params, # etc. #sep = "," #settings = run_and_parse_output("bundle_adjust", # args + ['--query-num-image-pairs'], # sep, opt.verbose) #num_image_pairs = int(settings["num_image_pairs"][0]) # Spawn matching to nodes spawn_to_nodes(step, num_nodes, output_prefix, self_args) # Optimization step = ParallelBaStep.optimization if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() if '--skip-matching' not in args: args.extend(['--skip-matching']) run_job('bundle_adjust', args, job_id=-1, msg='%d: Optimizing' % step) # End main process case else: # This process was spawned by GNU Parallel with a given # value of job_id. It will do the actual work. if opt.verbose: print("Running on machine: ", os.uname()) try: args.extend(['--job-id', str(opt.job_id)]) if (opt.entry_point == ParallelBaStep.statistics): args.extend(['--stop-after-statistics']) run_job('bundle_adjust', args, opt.job_id, msg='%d: Statistics' % opt.entry_point) # The bounds step will not be done in parallel so is not here if (opt.entry_point == ParallelBaStep.interest_point): args.extend(['--calc-ip']) run_job('bundle_adjust', args, opt.job_id, msg='%d: Interest point' % opt.entry_point) if (opt.entry_point == ParallelBaStep.matching): args.extend(['--stop-after-matching']) run_job('bundle_adjust', args, opt.job_id, msg='%d: Matching' % opt.entry_point) # The optimization step will not be done in parallel so is not here except Exception as e: asp_system_utils.raise_error(e) raise ================================================ FILE: src/asp/Tools/parallel_sfs ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' This tool implements a multi-process and multi-machine version of sfs. The input DEM gets split into tiles with padding, sfs runs on each tile, and the outputs are mosaicked. ''' import sys import os, glob, re, shutil, subprocess, string, time, errno, argparse, math # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_alg_utils import * import asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] # This is explained in asp_system_utils.py. if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] # Measure the memory usage on Linux and elapsed time timeCmd = [] if 'linux' in sys.platform: timeCmd = ['/usr/bin/time', '-f', 'elapsed=%E memory=%M (kb)'] def generateTileList(sizeX, sizeY, tileSize, padding): """Generate a full list of tiles for this image""" Lx = genSegmentList(sizeX, tileSize, padding) Ly = genSegmentList(sizeY, tileSize, padding) tileList = [] for x in range(0, len(Lx)-1): for y in range(0, len(Ly)-1): begX = Lx[x]; endX = Lx[x+1] begY = Ly[y]; endY = Ly[y+1] # apply the padding begX = begX - padding if (begX < 0): begX = 0 begY = begY - padding if (begY < 0): begY = 0 endX = endX + padding if (endX > sizeX): endX = sizeX endY = endY + padding if (endY > sizeY): endY = sizeY # Create a name for this tile # - Tile format is tile_col_row_width_height_.tif tileString = generateTileDir(begX, begY, endX, endY) tileList.append((begX, begY, endX, endY, tileString)) return (len(Lx)-1, len(Ly)-1, tileList) def generateTilePrefix(outputFolder, tileName, outputName): return os.path.join(outputFolder, tileName, outputName) def runSfs(options, outputFolder, outputName, baseFileNames): """Run sfs in a single tile.""" # Determine the name of the tile we need to write tileName = generateTileDir(options.pixelStartX, options.pixelStartY, options.pixelStopX, options.pixelStopY) tilePrefix = generateTilePrefix(outputFolder, tileName, outputName) # Bounds for this tile startX = int(options.pixelStartX) stopX = int(options.pixelStopX) startY = int(options.pixelStartY) stopY = int(options.pixelStopY) extraArgs = [] i = 0 while i < len(options.extraArgs): arg = options.extraArgs[i] if arg == '--crop-win': # If the user passed in the crop-win argument, reconcile # it with the internal ROI we need. Skip this element and # grab the user provided pixel bounds. userStartX = int(options.extraArgs[i+1]) userStopX = int(options.extraArgs[i+2]) userStartY = int(options.extraArgs[i+3]) userStopY = int(options.extraArgs[i+4]) # Reconcile the bounding box if (startX < userStartX): startX = userStartX if (stopX > userStopX ): stopX = userStopX if (startY < userStartY): startY = userStartY if (stopY > userStopY ): stopY = userStopY # If there is no tile left to generate then we can just return here if ((startX > stopX) or (startY > stopY)): return 0 i += 5 if arg == '-o' and i + 1 < len(options.extraArgs): # Replace the final output directory with the one for the given tile extraArgs.append(arg) extraArgs.append(tilePrefix) i += 2 else: extraArgs.append(arg) i += 1 # Call the command for a single tile cmd = timeCmd + ['sfs', '--crop-win', str(startX), str(startY), str(stopX), str(stopY)] cmd = cmd + extraArgs # Append other options willRun = True if options.resume: # If all files that need to be computed exist, skip this tile willRun = False for baseFileName in baseFileNames: fullFilePath = tilePrefix + '-' + baseFileName if (not asp_system_utils.is_valid_image(fullFilePath)): willRun = True if not willRun: print("Will skip tile: " + tileName + ", as found valid: " + " ".join(baseFileNames)) else: print("Will run tile: " + tileName) if willRun: (out, err, status) = asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) write_cmd_output(tilePrefix, cmd, out, err, status) return 0 def mosaic_results(tileList, outputFolder, outputName, options, baseFile): # Final mosaicked result mosaicFile = options.output_prefix + '-' + baseFile # Create the list of DEMs to mosaic demList = mosaicFile demList = re.sub(r'\.\w+$', '', demList) demList += '-list.txt' with open(demList, 'w') as f: for tile in tileList: tileName = tile[4] tilePrefix = generateTilePrefix(outputFolder, tileName, outputName) demFile = tilePrefix + '-' + baseFile f.write(demFile + '\n') # Mosaic the outputs using dem_mosaic dem_mosaic_path = asp_system_utils.bin_path('dem_mosaic') dem_mosaic_args = ['--weights-exponent', '2', '--use-centerline-weights', '--dem-list', demList, '-o', mosaicFile] cmd = timeCmd + [dem_mosaic_path] + dem_mosaic_args asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) def write_cmd_output(output_prefix, cmd, out, err, status): logFile = output_prefix + '-cmd-log.txt' print("Saving log in: " + logFile) with open(logFile, 'w') as f: f.write(" ".join(cmd)) f.write(out) f.write(err) f.write('Command return status: ' + str(status)) def main(argsIn): sfsPath = asp_system_utils.bin_path('sfs') try: # Get the help text from the base C++ tool so we can append it to the python help cmd = [sfsPath, '--help'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) baseHelp, err = p.communicate() except OSError: print("Error: Unable to find the required sfs program.") return -1 # Extract the version and help text vStart = baseHelp.find('[ASP') vEnd = baseHelp.find(']', vStart)+1 version = baseHelp[vStart:vEnd] baseHelpText = "Help options for the underlying 'sfs' program:\n" + baseHelp[vEnd:] # Use parser that ignores unknown options usage = "parallel_sfs -i <input DEM> -n <max iterations> -o <output prefix> <images> [other options]" parser = argparse.ArgumentParser(usage=usage, epilog=baseHelpText, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('-i', '--input-dem', dest='input_dem', default='', help = 'The input DEM to refine using SfS.') parser.add_argument('-o', '--output-prefix', dest='output_prefix', default='', help = 'Prefix for output filenames.') parser.add_argument('--tile-size', dest='tileSize', default=300, type=int, help = 'Size of approximately square tiles to break ' + 'up processing into (not counting the padding).') parser.add_argument('--padding', dest='padding', default=50, type=int, help = 'How much to expand a tile in each direction. This ' + 'helps with reducing artifacts in the final mosaicked ' + 'SfS output.') parser.add_argument("--processes", dest="numProcesses", type=int, default=None, help = "Number of processes to use on each node " + "(the default is for the program to choose).") parser.add_argument("--num-processes", dest="numProcesses2", type=int, default=None, help = "Same as --processes. Used for backwards compatibility.") parser.add_argument('--nodes-list', dest='nodesListPath', default=None, help = 'A file containing the list of computing nodes, one ' + 'per line. If not provided, run on the local machine.') parser.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2', help = 'Options to pass directly to GNU Parallel.') parser.add_argument('--threads', dest='threads', default=8, type=int, help = 'How many threads each process should use. This will be ' + 'changed to 1 for ISIS cameras when ' + '--use-approx-camera-models is not set, as ISIS is ' + 'single-threaded. Not all parts of the computation ' + 'benefit from parallelization.') parser.add_argument("--resume", action="store_true", default=False, dest="resume", help = "Resume a partially done run. Only " + "process the tiles for which the desired " + "per-tile output files are missing or " "invalid (as checked by gdalinfo).") parser.add_argument('--run-dir', dest='runDir', default=None, help = 'Directory in which the script is running.') parser.add_argument("--suppress-output", action="store_true", default=False, dest = "suppressOutput", help = "Suppress output of sub-calls.") parser.add_argument('-v', '--version', dest='version', default=False, action = 'store_true', help = 'Display the version of software.') # Private options parser.add_argument('--pixelStartX', dest='pixelStartX', default=None, type=int, help=argparse.SUPPRESS) parser.add_argument('--pixelStartY', dest='pixelStartY', default=None, type=int, help=argparse.SUPPRESS) parser.add_argument('--pixelStopX', dest='pixelStopX', default=None, type=int, help=argparse.SUPPRESS) parser.add_argument('--pixelStopY', dest='pixelStopY', default=None, type=int, help=argparse.SUPPRESS) # This call handles all the parallel_sfs specific options. (options, args) = parser.parse_known_args(argsIn) if options.version: asp_system_utils.print_version_and_exit() if not args and not options.version: parser.print_help() sys.exit(1) # This can handle spaces in directory names, unlike when GNU parallel is in charge if options.runDir is not None: os.chdir(options.runDir) # The parallel_sfs tool must not take the option --crop-win as it will # work on the entire input DEM. if '--crop-win' in argsIn: parser.print_help() parser.error("parallel_sfs cannot take the --crop-win option. " + "Crop the input DEM using gdal_translate.\n" ); if '--float-exposure' in argsIn or \ '--float-haze' in argsIn or \ '--float-reflectance-model' in argsIn: print("Warning: Floating exposures and other quantities per tile may result " + "in non-globally consistent results.") # Any additional arguments need to be forwarded to the sfs function options.extraArgs = args # Pass to the sfs executable the -i and -o options we filtered out options.extraArgs = ['-i', options.input_dem, '-o', options.output_prefix, '--threads', str(options.threads) ] + options.extraArgs # If --save-covariances is on, also turn on --save-variances if '--save-covariances' in argsIn and '--save-variances' not in argsIn: argsIn.append('--save-variances') options.extraArgs.append('--save-variances') # See what kind of outputs to generate baseFileNames = [] if '--estimate-height-errors' not in argsIn: # Computed DEM baseFileNames += ['DEM-final.tif'] # Albedo if '--float-albedo' in argsIn: baseFileNames += ['albedo-final.tif'] # Dem with nodata if '--save-dem-with-nodata' in argsIn: baseFileNames += ['DEM-nodata-final.tif'] # Variances and covariances if '--save-variances' in argsIn: prefixes = ['DEM'] if '--float-albedo' in argsIn: prefixes += ['albedo'] suffixes = ['-variance.tif'] if '--save-covariances' in argsIn: suffixes += ['-dr0_dc2-covariance.tif', '-dr1_dcn1-covariance.tif', '-dr1_dc1-covariance.tif', '-dr2_dc0-covariance.tif'] for prefix in prefixes: for suffix in suffixes: baseFileNames += [prefix + suffix] elif '--estimate-height-errors' in argsIn: # Here we just mosaic the height errors baseFileNames += ['height-error.tif'] if options.resume: if '--compute-exposures-only' in options.extraArgs \ or '--estimate-exposure-haze-albedo' in options.extraArgs: parser.print_help() parser.error("The --resume option cannot be used to compute the " + \ "exposures, haze, albedo.\n") # Handle the situation that both --processes and --num-processes can happen if (options.numProcesses is not None) and (options.numProcesses2 is not None): raise Exception("Cannot set both --processes and --num-processes.") if options.numProcesses is None and (options.numProcesses2 is not None): # Copy over --num-processes to --processes options.numProcesses = options.numProcesses2 # Set up output folder outputFolder = os.path.dirname(options.output_prefix) if outputFolder == '': outputFolder = './' # Handle calls in same directory outputName = os.path.basename(options.output_prefix) asp_file_utils.createFolder(outputFolder) startTime = time.time() # Determine if this is a main copy or a spawned copy spawnedCopy = ((options.pixelStartX is not None) and (options.pixelStartY is not None) and (options.pixelStopX is not None) and (options.pixelStopY is not None) and outputFolder) if spawnedCopy: # This copy was spawned to process a single tile. Just call a # function to handle this and then we are done. return runSfs(options, outputFolder, outputName, baseFileNames) # Otherwise this is the original called process and there are multiple steps to go through # Compute the exposures, haze, initial albedo based on the full DEM if not # specified and missing. Save them to disk. They will be read when SfS runs # on each small DEM tile. estimatedExposureHazeAlbedo = False if '--image-exposures-prefix' not in options.extraArgs: print("Computing exposures (and haze and initial albedo, if applicable).\n") cmd = timeCmd + [sfsPath] + options.extraArgs # Add the option to compute the exposures, if not there already # TODO(oalexan1): Must handle the case when there is also haze # and albedo to compute. Must also test if only haze or if only # floating albedo is enabled. if '--compute-exposures-only' not in options.extraArgs: cmd += ['--compute-exposures-only'] if '--estimate-exposure-haze-albedo' not in options.extraArgs: # Not strictly needed as it is equivalent to the above. cmd += ['--estimate-exposure-haze-albedo'] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) options.extraArgs += ['--image-exposures-prefix', options.output_prefix] estimatedExposureHazeAlbedo = True # If the haze prefix is not set, and have a non-zero number of haze coeffs, # must estimate the haze, unless done already if '--haze-prefix' not in options.extraArgs: # TODO(oalexan1): Must test! numHazeCoeffs = asp_cmd_utils.option_val(options.extraArgs, '--num-haze-coeffs') if numHazeCoeffs is not None and numHazeCoeffs != '0': if not estimatedExposureHazeAlbedo: print("Estimating haze.\n") cmd = timeCmd + [sfsPath] + options.extraArgs if '--estimate-exposure-haze-albedo' not in options.extraArgs: cmd += ['--estimate-exposure-haze-albedo'] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) estimatedExposureHazeAlbedo = True # By now the haze should have been computed in either case options.extraArgs += ['--haze-prefix', options.output_prefix] # Same about estimating albedo, if we want to float albedo and was not provided if '--input-albedo' not in options.extraArgs and '--float-albedo' in options.extraArgs: if not estimatedExposureHazeAlbedo: print("Estimating albedo.\n") cmd = timeCmd + [sfsPath] + options.extraArgs if '--estimate-exposure-haze-albedo' not in options.extraArgs: cmd += ['--estimate-exposure-haze-albedo'] asp_system_utils.executeCommand(cmd, suppressOutput=options.suppressOutput) estimatedExposureHazeAlbedo = True # By now the albedo should have been computed in either case options.extraArgs += ['--input-albedo', options.output_prefix + "-albedo-estim.tif"] if '--compute-exposures-only' in options.extraArgs or \ '--estimate-exposure-haze-albedo' in options.extraArgs: print("Finished computing exposure, haze, albedo.") return # What is the size of the DEM on which to do SfS sep = "," verbose = False print("Running initial query") settings = asp_system_utils.run_and_parse_output(sfsPath, options.extraArgs + ['--query'], sep, verbose) sizeX = int(settings['dem_cols'][0]) sizeY = int(settings['dem_rows'][0]) # Compute the number and size of tiles in x and y (width and height). # Make all tiles about the same size. # For now we just break up the image into a user-specified tile size print("Generating the list of tiles") # this can take a while so print a note numTilesX, numTilesY, tileList = generateTileList(sizeX, sizeY, options.tileSize, options.padding) numTiles = numTilesX * numTilesY print('Splitting into ' + str(numTilesX) + ' by ' + str(numTilesY) + \ ' = ' + str(numTilesX*numTilesY) + ' tiles.\n') # Generate a text file that contains the boundaries for each tile argumentFilePath = os.path.join(outputFolder, 'argumentList.txt') argumentFile = open(argumentFilePath, 'w') for tile in tileList: argumentFile.write(str(tile[0]) + '\t' + str(tile[1]) + '\t' \ + str(tile[2]) + '\t' + str(tile[3]) + '\n') argumentFile.close() # Indicate to GNU Parallel that there are multiple tab-separated # variables in the text file we just wrote parallelArgs = ['--colsep', "\\t", '--will-cite', '--env', 'ASP_DEPS_DIR', '--env', 'PATH', '--env', 'LD_LIBRARY_PATH', '--env', 'ASP_LIBRARY_PATH', '--env', 'ISISROOT'] if options.parallel_options is not None: parallelArgs += options.parallel_options.split(' ') # Get the number of available nodes and CPUs per node numNodes = asp_system_utils.getNumNodesInList(options.nodesListPath) # We assume all machines have the same number of CPUs (cores) cpusPerNode = asp_system_utils.get_num_cpus() # TODO: What is a good number here? processesPerCpu = 2 # Set the optimal number of processes if the user did not specify if not options.numProcesses: options.numProcesses = cpusPerNode * processesPerCpu # Note: sfs can run with multiple threads on non-ISIS data but we don't use that # functionality here since we call sfs with one tile at a time. # No need for more processes than tiles if options.numProcesses > numTiles: options.numProcesses = numTiles # Build the command line that will be passed to GNU parallel # - The numbers in braces will receive the values from the text file we wrote earlier # - The output path used here does not matter since spawned copies compute the correct tile path. python_path = sys.executable # children must use same Python as parent # We use below the libexec_path to call python, not the shell script parallel_sfs_path = asp_system_utils.libexec_path('parallel_sfs') commandList = [python_path, parallel_sfs_path, '--pixelStartX', '{1}', '--pixelStartY', '{2}', '--pixelStopX', '{3}', '--pixelStopY', '{4}', '--threads', str(options.threads)] if options.suppressOutput: commandList = commandList + ['--suppress-output'] if options.resume: commandList.append('--resume') # Prepend the parallel arguments and append the extra arguments commandList = parallelArgs + commandList + options.extraArgs # Append the run directory runDir = asp_system_utils.escape_token(os.getcwd()) commandList = commandList + ['--run-dir', runDir] # Use GNU parallel call to distribute the work across computers. Wait until # all processes are finished. verbose = True asp_system_utils.runInGnuParallel(options.numProcesses, argumentFilePath, commandList, options.nodesListPath, verbose) # Mosaic the results for it in range(len(baseFileNames)): mosaic_results(tileList, outputFolder, outputName, options, baseFileNames[it]) endTime = time.time() print("Finished in " + str(endTime - startTime) + " seconds.") if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/Tools/parallel_stereo ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2026, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ import sys, argparse, subprocess, re, os, math, time, glob, shutil, math, platform import os.path as P # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_string_utils, asp_cmd_utils asp_system_utils.verify_python_version_is_supported() from asp_stereo_utils import * # must be after the path is altered above # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] # This is explained below if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] def check_system_memory(opt, args, settings): '''Issue a warning when doing correlation if our selected options are estimated to exceed available RAM. Currently only the ASP SGM and MGM have large memory requirements.''' if asp_system_utils.run_with_return_code(['which', 'free']) != 0: # No 'free' exists. This is the case on OSX. return try: alg = stereo_alg_to_num(settings['stereo_algorithm'][0]) if alg == VW_CORRELATION_BM or alg >= VW_CORRELATION_OTHER: return # This is the processor count code, won't work if other # machines have a different processor count. num_procs = opt.processes if opt.processes is None: num_procs = get_num_cpus() # Memory usage calculations bytes_per_mb = 1024*1024 est_bytes_per_pixel = 8 # This is a very rough estimate! num_tile_pixels = pow(int(settings['corr_tile_size'][0]), 2) baseline_mem = (num_tile_pixels*est_bytes_per_pixel) / bytes_per_mb sgm_ram_limit = int(settings['corr_memory_limit_mb'][0]) ram_per_process = baseline_mem + sgm_ram_limit est_ram_usage = int(num_procs * ram_per_process) print('Warning: Estimated maximum memory consumption is ' + str(est_ram_usage) + ' MB. To lower memory use, ' + 'consider reducing the number of processes or lowering ' + '--corr-memory-limit-mb.') except: # Don't let an error here prevent the tool from running. print('Warning: Error checking system memory, skipping the memory test!') return def sym_link_prev_run(prev_run_prefix, out_prefix): '''Sym link files from a previous run up to triangulation to the output directory of this run. We must not symlink directories from the previous run as then the new results will be written there. Do not sym link the previous point cloud, DEM, etc., also not VRT files as those will not be valid. ''' # Ensure we do not wipe the run we want to reuse if prev_run_prefix == out_prefix: raise Exception('The previous run prefix is the same as the current run prefix.') curr_dir = os.path.dirname(out_prefix) mkdir_p(curr_dir) for ext in ['L.tif', 'R.tif', 'L-cropped.tif', 'R-cropped.tif', 'L.tsai', 'R.tsai', 'L_cropped.tif', 'R_cropped.tif', 'L_sub.tif', 'R_sub.tif', 'Mask_sub.tif', 'D_sub.tif', 'D_sub_spread.tif', '.vwip', 'L.txt', 'R.txt', '.exr', '.match', 'GoodPixelMap.tif', 'F.tif', 'stats.tif', 'Mask.tif', 'bathy_mask.tif']: files = glob.glob(prev_run_prefix + '*' + ext) for f in files: if os.path.isdir(f): continue # Skip folders dst_f = f[len(prev_run_prefix):] # strip the prefix dst_f = out_prefix + dst_f rel_src = os.path.relpath(f, curr_dir) if os.path.exists(dst_f): os.remove(dst_f) # this could be some dangling thing os.symlink(rel_src, dst_f) def create_symlinks_for_multiview(opt, args, settings): """ Running parallel_stereo for each pair in a multiview run creates files like: out-prefix-pair2/2-4096_4096_1629_1629/4096_4096_1629_1629-F.tif To run parallel_stereo for tri, we expect this at out-prefix-4096_4096_1629_1629/4096_4096_1629_1629-pair2/2-F.tif Create the latter as a sym link. """ subdirs = create_subdirs_symlink(opt, args, settings) # symlink L.tif, etc for s in sorted(settings.keys()): # Find the settings for each stereo command that together comprise the # multiview run. # TODO(oalexan1): This should be factored out as a function, and the above # loop should iterate over the output of this function. m = re.match(r'multiview_command', s) if not m: continue local_settings=run_and_parse_output("stereo_parse", settings[s][1:], sep, opt.verbose) local_prefix = local_settings['out_prefix'][0] m = re.match(r'^(.*?)-pair(\d+)\/', local_prefix) if not m: continue base_prefix = m.group(1) index = str(m.group(2)) for tile_id in range(len(subdirs)): subdir = subdirs[tile_id] tile = dirToTile(subdir) tile_str = tile.name_str() src_pref = tile_dir(base_prefix + '-pair' + index + '/' + index, tile) + '/' + tile_str dst_dir = tile_dir(base_prefix, tile) + '/' + tile_str + '-pair' + index mkdir_p(dst_dir) dst_pref = dst_dir + '/' + index files = glob.glob(src_pref + '*') for f in files: m = re.match(skip_symlink_expr, f) if m: continue # won't sym link certain patterns m = re.match(r'^' + src_pref + '(.*?)$', f) if not m: continue suff = m.group(1) src_f = src_pref + suff dst_f = dst_pref + suff rel_src = os.path.relpath(src_f, dst_dir) if os.path.lexists(dst_f): continue os.symlink(rel_src, dst_f) def get_num_nodes(nodes_list): if nodes_list is None: return 1 # local machine # Count the number of nodes without repetition (need this for # Pleiades). nodes = {} num_nodes = 0 try: fh = open(nodes_list, "r") for line in fh: if re.match(r'^\s*$', line): continue # skip empty lines matches = re.match(r'^\s*([^\s]*)', line) if matches: nodes[matches.group(1)] = 1 num_nodes = len(nodes) except Exception as e: raise_error(e) if num_nodes == 0: raise Exception('The list of computing nodes is empty') return num_nodes def get_best_procs_threads(step, opt, settings): # Decide the best number of processes to use on a node, and how # many threads to use for each process. There used to be some # fancy logic, see below, but it does not work well. For now, # use many processes and one thread per process. # We assume all machines have the same number of CPUs (cores) num_cpus = get_num_cpus() # Respect user's choice for the number of processes num_procs = num_cpus if opt.processes is not None: num_procs = opt.processes # Same for the number of threads. num_threads = 1 if opt.threads_multi is not None: num_threads = opt.threads_multi # Old code, now turned off. if 0: if step == Step.corr: tile_size = int(settings['corr_tile_size'][0]) elif step == Step.rfne: tile_size = int(settings['rfne_tile_size'][0]) elif step == Step.tri: tile_size = int(settings['tri_tile_size'][0]) else: raise Exception('Stereo step %d must be executed on a single machine.' \ % step) # We use the observation that each tile uses one thread, # so we need to find how many tiles are in the given job. num_threads = int(opt.job_size_w*opt.job_size_h/tile_size/tile_size) if num_threads > num_cpus: num_threads = num_cpus if num_threads <= 0: num_threads = 1 # For triangulation, we need to consider the case of ISIS cameras # when we must use 1 thread unless CSM sensor models have been provided. if step == Step.tri: cam_info = " ".join(settings['in_file1'] + settings['in_file2'] + \ settings['cam_file1'] + settings['cam_file2']) m1 = re.search('\\.cub\\b', cam_info, re.IGNORECASE) m2 = re.search('\\.json\\b', cam_info, re.IGNORECASE) m3 = re.search('\\.isd\\b', cam_info, re.IGNORECASE) if m1 and not (m2 or m3): num_threads = 1 num_procs = int(math.ceil(float(num_cpus)/num_threads)) if opt.verbose: print("For stage %d, using %d threads and %d processes." % (step, num_threads, num_procs)) return (num_procs, num_threads) # Launch GNU Parallel for all tiles, it will take care of distributing # the jobs across the nodes and load balancing. The way we accomplish # this is by calling this same script but with --tile-id <num>. def spawn_to_nodes(step, opt, settings, args, subdirs): if opt.processes is None or opt.threads_multi is None: # The user did not specify these. We will find the best # for their system. (procs, threads) = get_best_procs_threads(step, opt, settings) else: procs = opt.processes threads = opt.threads_multi asp_cmd_utils.wipe_option(args, '--processes', 1) asp_cmd_utils.wipe_option(args, '--threads-multiprocess', 1) args.extend(['--processes', str(procs)]) args.extend(['--threads-multiprocess', str(threads)]) # Each tile has an index in the list of tiles. There can be a huge amount of # tiles, and for that reason we store their indices in a file, rather than # putting them on the command line. Keep this file in the run directory. out_prefix = settings['out_prefix'][0] tiles_index = stereoTilesIndex(out_prefix) mkdir_p(os.path.dirname(tiles_index)) f = open(tiles_index, 'w') for i in range(len(subdirs)): f.write("%d\n" % i) f.close() # Reset number of done tiles for this step reset = True updateNumDoneTiles(out_prefix, stereoProgName(step), reset) # Use GNU parallel with given number of processes. # TODO(oalexan1): Run 'parallel' using the runInGnuParallel() function call, # when the ASP_LIBRARY_PATH trick can be fully encapsulated in the # asp_system_utils.py code rather than being needed for each tool. 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] if which(cmd[0]) is None: raise Exception('Need GNU Parallel to distribute the jobs.') if opt.nodes_list is not None: cmd += ['--sshloginfile', opt.nodes_list] if opt.ssh is not None: cmd += ['--ssh', opt.ssh] if opt.parallel_options is not None: cmd += opt.parallel_options.split(' ') # Assemble the options which we want GNU parallel to not mess up # with. args_copy = args[:] # deep copy args_copy += ["--work-dir", opt.work_dir] if opt.isisroot is not None: args_copy += ["--isisroot", opt.isisroot] if opt.isisdata is not None: args_copy += ["--isisdata", opt.isisdata] # Quote entities that have spaces in them. Don't quote quantities # already quoted. for index, arg in enumerate(args_copy): if re.search(r"[ \t]", arg) and arg[0] != '\'': args_copy[index] = '\'' + arg + '\'' python_path = sys.executable # children must use same Python as parent start = step; stop = start + 1 # Put options in a single string. args_str = python_path + " " + \ " ".join(args_copy) + \ " --entry-point " + str(start) + \ " --stop-point " + str(stop) args_str += " --tile-id {}" cmd += [args_str] # This is a bugfix for RHEL 8. The 'parallel' program fails to start with ASP's # libs, so temporarily hide them. if 'LD_LIBRARY_PATH' in os.environ: os.environ['ASP_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH'] os.environ['LD_LIBRARY_PATH'] = '' asp_system_utils.generic_run(cmd, opt.verbose) # Undo the above if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] def tile_run(prog, args, opt, settings, tile, **kw): '''Job launch wrapper for a single tile''' if prog != 'stereo_blend': # Set collar_size argument to zero in almost all cases. asp_cmd_utils.set_option(args, '--sgm-collar-size', [0]) # Get tool path and output prefix binpath = asp_system_utils.bin_path(prog) out_prefix = settings['out_prefix'][0] # Measure the memory usage on Linux and elapsed time timeCmd = [] if 'linux' in sys.platform and os.path.exists('/usr/bin/time'): timeCmd = ['/usr/bin/time', '-f', prog + \ ': elapsed=%E ([hours:]minutes:seconds), memory=%M (kb)'] try: # Get tile folder tile_dir_prefix = tile_dir(out_prefix, tile) + "/" + tile.name_str() # When using SGM correlation, increase the output tile size. # - The output image will contain more populated pixels but # there will be no other change. adjusted_tile = grow_crop_tile_maybe(settings, prog, tile) if adjusted_tile.width <= 0 or adjusted_tile.height <= 0: return # the produced tile is empty # Increase the processing block size for the tile so we process # the entire tile in one go. if use_padded_tiles(settings) and prog == 'stereo_corr': curr_tile_size = max(adjusted_tile.width, adjusted_tile.height) asp_cmd_utils.set_option(args, '--corr-tile-size', [curr_tile_size]) # Set up the call string call = [binpath] call.extend(args) if opt.threads_multi is not None: asp_cmd_utils.wipe_option(call, '--threads', 1) call.extend(['--threads', str(opt.threads_multi)]) cmd = call + ['--trans-crop-win'] + adjusted_tile.as_array() # append the tile # This is a bugfix for when the output prefix is the same as the # bundle-adjust-prefix. Let the stereo executables parse these as it is # better equipped for that. cmd += ['--output-prefix-override', tile_dir_prefix] if opt.dryrun: print(" ".join(cmd)) return if opt.verbose: print(" ".join(cmd)) resetStatus = False # for updating the status of done tiles # See if perhaps we can skip correlation if prog == 'stereo_corr' and opt.resume_at_corr: D = tile_dir_prefix + '-D.tif' if (not os.path.islink(D)) and asp_system_utils.is_valid_image(D): # The disparity D.tif is valid and not a symlink. No need # to recreate it. updateNumDoneTiles(out_prefix, prog, resetStatus) return Dnosym = tile_dir_prefix + '-Dnosym.tif' if (not os.path.islink(Dnosym)) and asp_system_utils.is_valid_image(Dnosym): # In a previous run D.tif was renamed to Dnosym.tif # and D.tif was made into a symlink. Still good. # Just undo the rename. if os.path.exists(D): os.remove(D) os.rename(Dnosym, D) updateNumDoneTiles(out_prefix, prog, resetStatus) return # We are left with the situation that there is no image which is both # valid and not a symlink. Perhaps D does not exist or is corrupted. # Then wipe D and Dnosym, if present, and redo the correlation. print("Will run correlation to create a valid image for " + D) if os.path.exists(D): os.remove(D) if os.path.exists(Dnosym): os.remove(Dnosym) cmd = timeCmd + cmd (out, err, status) = asp_system_utils.executeCommand(cmd, realTimeOutput = True) if len(timeCmd) > 0: print(err) usage_file = tile_dir_prefix + "-" + prog + "-resource-usage.txt" with open(usage_file, 'w') as f: f.write(err) if status != 0: raise Exception('Stereo step ' + kw['msg'] + ' failed') if status == 0: updateNumDoneTiles(out_prefix, prog, resetStatus) except OSError as e: raise Exception('%s: %s' % (binpath, e)) def keepOnlySpecified(keep_only, out_prefix, subdirs, settings): """ Merge all VRTs and wipe any files the user does not want to keep. """ if keep_only == "unchanged": return # keep everything unchanged elif keep_only == "essential": keep_only = "L.txt R.txt .exr -L.tif -F.tif disp-diff.tif -PC.tif" # List all the files stereo may create. We will not attempt to delete # any files except these (and subdirs). In particular log files in the # top-most directory are not deleted. all_files = set() 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(): for f in glob.glob(out_prefix + "*" + ext): all_files.add(f) # List all the files with the suffixes the user wants to keep. Must also keep # the aux.xml files, as those can have CRS information. keep_files = set() if keep_only == "all_combined": keep_files = all_files.copy() else: for keep in keep_only.split(): for f in glob.glob(out_prefix + "*" + keep) + \ glob.glob(out_prefix + "*" + keep + ".aux.xml"): keep_files.add(f) if len(keep_files) == 0: # Sometimes the user can make a mistake here. If not sure, don't do anything. print("No files to keep. This is likely a user error. Not deleting any files.") return for f in keep_files: if int(settings['correlator_mode'][0]) != 0 and 'PC.tif' in f: # No PC.tif in correlator-mode continue print("Keeping: " + f) if isVrt(f): f_merged = os.path.splitext(f)[0] + "_merged.tif" print("Convert " + f + " from VRT to TIF format.") cmd = ['gdal_translate', '-co', 'compress=lzw', '-co', 'TILED=yes', '-co', 'INTERLEAVE=BAND', '-co', 'BLOCKXSIZE=256', '-co', 'BLOCKYSIZE=256', '-co', 'BIGTIFF=IF_SAFER', f, f_merged] (out, err, status) = asp_system_utils.executeCommand(cmd, realTimeOutput = True) if status != 0: raise Exception('Failed converting VRT to TIF. Qutting. ' + \ 'Likely this run is partially wiped now.') print("Renaming: " + f_merged + " to " + f) shutil.move(f_merged, f) # If _merged.aux.xml exists, rename it to .xml. This is for 3D CRS. merged_aux = f_merged + ".aux.xml" aux = f + ".aux.xml" if os.path.exists(merged_aux): print("Renaming: " + merged_aux + " to " + aux) shutil.move(merged_aux, aux) # Delete the other files and directories for f in list(all_files) + subdirs: if f not in keep_files: print("Deleting: " + f) if os.path.isdir(f): shutil.rmtree(f) else: os.remove(f) # It looks useful to print the final cloud, as the messages above # can be quite verbose. pc_file = glob.glob(out_prefix + "-PC.tif") if len(pc_file) > 0 and int(settings['correlator_mode'][0]) == 0: print("Output point cloud: " + pc_file[0]) def parallel_stereo_args(p, opt, parallel_args, args): """ Find the options used by parallel_stereo which are not passed to the stereo executables. This is fragile. """ # Map from option, say --job-size-w, to the variable name, say, job_size_w. opt2var = {} for x in p._actions: # For cases like ['-l', '--long'] get the second entry opt_str = getattr(x, 'option_strings')[-1] opt2var[opt_str] = getattr(x, 'dest') extra_args = [] option_dict = vars(opt) # Each option understood by python, and its parsed value for arg in parallel_args[1:]: if arg in args: # This is an option passed to stereo continue if len(arg) >= 2 and arg[0] == '-' and arg[1] != '-': # We expect two dashes raise Exception('Failed to parse: ' + arg) if not arg in opt2var.keys(): # Does not start with dash continue var = opt2var[arg] if option_dict[var] is None: # This option was not specified continue if isinstance(option_dict[var], bool): # This is a bool flag, append it with no value extra_args.append(arg) continue if (isinstance(option_dict[var], int) or isinstance(option_dict[var], float) or asp_string_utils.isString(option_dict[var])): # For int, float, and string, append together with value extra_args.append(arg) extra_args.append(str(option_dict[var])) continue # We cannot currently parse other options than int, string, float, and bool. # Should be simple to fix if need be. raise Exception('Could not parse: ' + arg) return extra_args def setup_run_multiview(opt, settings, parallel_args, args): ''' Prepare and run multiview stereo. Triangulation is joint, but the steps before that are done separately for each pair. ''' # TODO(oalexan1): This function calls parallel_stereo again. This is # confusing. if opt.keep_only == "all_combined": # Change the default to "unchanged" opt.keep_only = "unchanged" if opt.keep_only != "unchanged": # If the user specified something else raise Exception('Option --keep-only does not work with multiview stereo.') # TODO(oalexan1): avoid confusing the logic below asp_cmd_utils.wipe_option(parallel_args, '-s', 1) if os.path.exists(opt.stereo_file): parallel_args.extend(['--stereo-file', opt.stereo_file]) # Args only for parallel_stereo extra_args = parallel_stereo_args(p, opt, parallel_args, args) if opt.entry_point < Step.tri: run_multiview(__file__, args, extra_args, opt.entry_point, opt.stop_point, opt.verbose, settings) # Everything is done. sys.exit(0) else: # We will arrive here after this script invokes itself # for multiview. Set up the directories. After this # exits, triangulation will run. create_symlinks_for_multiview(opt, args, settings) if __name__ == '__main__': usage = '''parallel_stereo [options] <images> [<cameras>] <output_prefix> [DEM] Extensions are automatically added to the output files. Camera model arguments may be optional for some stereo session types (e.g. isis). Stereo parameters should be set in the stereo.default file.\n''' + asp_system_utils.get_asp_version() # What makes this program different from stereo is that it # tries to treat ASP as a multi-process system instead of a # multi-threaded executable. This has benefits on the super # computer by allowing a single stereo pair use multiple # computers. It also allows us to get past the single-threaded # constraints of ISIS. # Algorithm: When this script is started, it calls itself on each node if # doing steps 1, 2, or 4 (corr, rfne, tri). Those scripts in turn start # actual jobs on those nodes. For the other steps, the script does the work # itself. # Python does not know how to disambiguate between two options which start # with a similar prefix. if '--threads' in sys.argv: print("Ignoring the option --threads. Use --threads-multiprocess " + \ "and --threads-singleprocess.") asp_cmd_utils.wipe_option(sys.argv, '--threads', 1) p = argparse.ArgumentParser(usage=usage) p.add_argument('--nodes-list', dest='nodes_list', default=None, help='The list of computing nodes, one per line. If not provided, run ' + \ 'on the local machine.') p.add_argument('--ssh', dest='ssh', default=None, help='The path to the ssh program to use to connect to other nodes') p.add_argument('--processes', dest='processes', default=None, type=int, help='The number of processes to use per node.') p.add_argument('--threads-multiprocess', dest='threads_multi', default=None, type=int, help='The number of threads to use per process when running multiple ' + \ 'processes.') p.add_argument('--threads-singleprocess', dest='threads_single', default=None, type=int, help='The number of threads to use when running a single process (PPRC ' + \ 'and FLTR).') p.add_argument('--corr-seed-mode', dest='seed_mode', default=None, type=int, help='Correlation seed strategy. See stereo_corr for options.') p.add_argument('-e', '--entry-point', dest='entry_point', default=0, type=int, help='Stereo Pipeline entry point (an integer from 0-6).') p.add_argument('--stop-point', dest='stop_point', default=7, type=int, help='Stereo Pipeline stop point (an integer from 1-7). Stop before this ' + \ 'step.') p.add_argument('--job-size-w', dest='job_size_w', default=-1, type=int, help='Pixel width of input image tile for a single process. Set ' + \ 'automatically.') p.add_argument('--job-size-h', dest='job_size_h', default=-1, type=int, help='Pixel height of input image tile for a single process. Set ' + \ 'automatically.') p.add_argument('--sgm-collar-size', dest='sgm_collar_size', default=-1, type=int, help='The padding around each tile to process. Set automatically.') p.add_argument('--resume-at-corr', dest='resume_at_corr', default=False, action='store_true', help='Start at the correlation stage and skip recomputing the valid low ' + \ 'and full-res disparities for that stage. Do not change ' + \ '--left-image-crop-win, etc., when running this.') p.add_argument('--prev-run-prefix', dest='prev_run_prefix', default=None, help='Start at the triangulation stage while reusing the data from this ' + \ 'prefix. The new run can use different cameras, bundle adjustment prefix, ' + \ 'or bathy planes (if applicable). Do not change crop windows, as that ' + \ 'would invalidate the run.') p.add_argument('--keep-only', dest='keep_only', default="all_combined", help='If set to "all_combined", which is the default, at the end of a ' + \ 'successful run combine the results from subdirectories into .tif files ' + \ 'with the given output prefix, and delete the subdirectories. If set to ' + \ '"essential", keep only PC.tif and the files needed to recreate it (those ' + \ 'ending with L.txt, R.txt, .exr, L.tif, -F.tif). If set to "unchanged", ' + \ 'keep the run directory as it is. For fine-grained control, specify a ' + \ 'quoted list of suffixes of files to keep, such as "L.txt R.txt .exr ' + \ '.match -L.tif -PC.tif".') p.add_argument('--sparse-disp-options', dest='sparse_disp_options', help='Options to pass directly to sparse_disp. Use quotes around this ' + \ 'string.') p.add_argument('-v', '--version', dest='version', default=False, action='store_true', help='Display the version of software.') p.add_argument('-s', '--stereo-file', dest='stereo_file', default='./stereo.default', help='Explicitly specify the stereo.default file to use. ' + \ '[default: ./stereo.default]') p.add_argument('--verbose', dest='verbose', default=False, action='store_true', help='Display the commands being executed.') p.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2', help='Options to pass directly to GNU Parallel.') # Internal variables below. # The id of the tile to process, 0 <= tile_id < num_tiles. p.add_argument('--tile-id', dest='tile_id', default=None, type=int, help=argparse.SUPPRESS) # Directory where the job is running p.add_argument('--work-dir', dest='work_dir', default=None, help=argparse.SUPPRESS) # ISIS settings p.add_argument('--isisroot', dest='isisroot', default=None, help=argparse.SUPPRESS) p.add_argument('--isisdata', dest='isisdata', default=None, help=argparse.SUPPRESS) # Debug option p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true', help="Do not launch the jobs, only print the commands that should be run.") (opt, args) = p.parse_known_args() args = asp_cmd_utils.clean_args(args) if opt.version: asp_system_utils.print_version_and_exit() if not args and not opt.version: p.print_help() raise_error('Missing input files', code=2) # Ensure our 'parallel' is not out of date asp_system_utils.check_parallel_version() if opt.tile_id is None and opt.resume_at_corr: print("Resuming at the correlation stage.") opt.entry_point = Step.corr if opt.stop_point <= Step.corr: raise Exception('Cannot resume at correlation if --stop-point ' + \ 'is set to stop before that.') if opt.threads_single is None: opt.threads_single = get_num_cpus() # Resolve corr-seed-mode from CLI, stereo file, or default resolve_seed_mode(opt, args) if os.path.exists(opt.stereo_file): args.extend(['--stereo-file', opt.stereo_file]) if opt.tile_id is None: # When the script is started, set some options from the # environment which we will pass to the scripts we spawn # 1. Set the work directory opt.work_dir = os.getcwd() # 2. Set the ISIS settings if any if 'ISISROOT' in os.environ: opt.isisroot = os.environ['ISISROOT'] if 'ISISDATA' in os.environ: opt.isisdata = os.environ['ISISDATA'] else: # After the script spawns itself to nodes, it starts in the # home dir. Make it go to the right place. os.chdir(opt.work_dir) # Set the ISIS settings if opt.isisroot is not None: os.environ['ISISROOT' ] = opt.isisroot if opt.isisdata is not None: os.environ['ISISDATA'] = opt.isisdata # This command needs to be run after we switch to the work directory, # hence no earlier than this point. sep = "," settings = run_and_parse_output("stereo_parse", args, sep, opt.verbose) out_prefix = settings['out_prefix'][0] if settings['stereo_algorithm'][0].lower() == 'libelas' and \ platform.system() == "Darwin" and platform.machine() == "arm64": raise Exception('The stereo algorithm ' + \ settings['stereo_algorithm'][0] + ' is not supported on Mac Arm.') # In the master process, need to create the list of nodes. Must happen # after we are in the work dir and have out_prefix. This ensures # the list is not in a temp dir of one of the nodes. if opt.tile_id is None and opt.nodes_list is not None: if not os.path.isfile(opt.nodes_list): raise_error('No such nodes-list file: ' + opt.nodes_list, code=2) local_nodes_list = out_prefix + "-nodes-list.txt" mkdir_p(os.path.dirname(local_nodes_list)) if opt.nodes_list != local_nodes_list: shutil.copy2(opt.nodes_list, local_nodes_list) opt.nodes_list = local_nodes_list asp_cmd_utils.wipe_option(sys.argv, '--nodes-list', 1) sys.argv.extend(['--nodes-list', opt.nodes_list]) print("Nodes list: " + opt.nodes_list) # Padded tiles are needed if later we do blending using_padded_tiles = use_padded_tiles(settings) # By default use 8 threads for SGM/MGM. Then use proportionately fewer # processes to not run out of RAM. Otherwise see the function # get_best_procs_threads(). # TODO(oalexan1): This logic needs to be all in one place. # For ISIS needs to use more processes in triangulation. alg = stereo_alg_to_num(settings['stereo_algorithm'][0]) if alg > VW_CORRELATION_BM and alg < VW_CORRELATION_OTHER: if opt.threads_multi is None: opt.threads_multi = 8 if opt.processes is None: num_cpus = get_num_cpus() opt.processes = int(float(num_cpus) / float(opt.threads_multi) + 0.5) if opt.processes <= 0: opt.processes = 1 if opt.version: args.append('-v') # TODO(oalexan1): This block must be a function called setup_job_size(). if int(opt.job_size_h < 0) + int(opt.job_size_w < 0) == 1: raise Exception('Must set neither or both of --job-size-h and --job-size-w.') # If --job-size-h and --job-size-w are not set, set them depending on the algorithm localEpi = (settings['alignment_method'][0] == 'local_epipolar') if opt.job_size_h < 0: if alg >= VW_CORRELATION_OTHER or localEpi: # Local alignment needs small tiles opt.job_size_w = 512 opt.job_size_h = 512 elif alg == VW_CORRELATION_BM: # Regular block matching opt.job_size_w = 2048 opt.job_size_h = 2048 elif alg > VW_CORRELATION_BM: # SGM, MGM, etc. opt.job_size_w = 2048 opt.job_size_h = 2048 if opt.sgm_collar_size < 0: if alg >= VW_CORRELATION_OTHER or localEpi: # Local alignment opt.sgm_collar_size = 128 elif alg == VW_CORRELATION_BM: # Regular block matching opt.sgm_collar_size = 0 elif alg > VW_CORRELATION_BM: # SGM, MGM, etc. opt.sgm_collar_size = 256 # Update the collar size in the settings and args (settings, args) = set_collar_size(opt.sgm_collar_size, args, settings) # A string unlikely to be in the output. This should be in sync with stereo_parse. sep2 = '--non-comma-separator--' georef=run_and_parse_output("stereo_parse", args, sep2, opt.verbose) georef["WKT"] = "".join(georef["WKT"]) georef["GeoTransform"] = "".join(georef["GeoTransform"]) print ('Using tiles (before collar addition) of ' + str(opt.job_size_w) + \ ' x ' + str(opt.job_size_h) + ' pixels.') print('Using a collar (padding) for each tile of ' + settings['collar_size'][0] + \ ' pixels.') # parallel_args is what we will pass to spawned copies of parallel_stereo, # while 'args' is what we pass to plain stereo. parallel_args = sys.argv # shallow copy # Individual tools may use these options, but then they confuse parallel_stereo. # They are usually encountered in log files and can be passed in by mistake. if '--compute-point-cloud-center-only' in parallel_args: raise Exception('Option --compute-point-cloud-center-only is not ' + \ 'supported in parallel_stereo. Use stereo_tri instead.') if '--compute-low-res-disparity-only' in parallel_args: raise Exception('Option --compute-low-res-disparity-only is not ' + \ 'supported in parallel_stereo. Use stereo_corr instead.') # See if to resume at triangulation. This logic must happen after we figured # if we need padded tiles, otherwise the bookkeeping will be wrong. if opt.tile_id is None and opt.prev_run_prefix is not None: print("Starting at the triangulation stage while reusing a previous run.") opt.entry_point = Step.tri if opt.stop_point <= Step.tri: raise Exception('Cannot resume at triangulation if --stop-point ' + \ 'is set to stop before that.') sym_link_prev_run(opt.prev_run_prefix, out_prefix) # Now that we have data, update the settings value settings = run_and_parse_output("stereo_parse", args, sep, opt.verbose) # Create the directory tree for this run subdirs = create_subdirs_symlink(opt, args, settings) # TODO(oalexan1): The giant block below needs to be broken up into two # functions, called main_run() and and tile_run(). Careful testing will be # needed, including for multiview stereo. if opt.tile_id is None: # We get here when the script is started. The current running process # has become the management process that spawns other copies of itself # on other machines. This block will only do actual work when we hit a # non-multiprocess step like pprc or fltr. # Wipe options which we will override. asp_cmd_utils.wipe_option(parallel_args, '-e', 1) asp_cmd_utils.wipe_option(parallel_args, '--entry-point', 1) asp_cmd_utils.wipe_option(parallel_args, '--stop-point', 1) num_pairs = int(settings['num_stereo_pairs'][0]) if num_pairs > 1: # Multiview stereo needs special treatment setup_run_multiview(opt, settings, parallel_args, args) # Preprocessing step = Step.pprc if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() normal_run('stereo_pprc', opt, args, out_prefix, msg='%d: Preprocessing' % step) # Now that L.tif is saved, recompute trans_left_image_size. settings = run_and_parse_output("stereo_parse", args, sep, opt.verbose) # Correlation step = Step.corr if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() # Do low-res correlation, this happens just once. calc_lowres_disp(args, opt, sep, resume = opt.resume_at_corr) # symlink D_sub, D_sub_spread, etc. subdirs = create_subdirs_symlink(opt, args, settings) # Run full-res stereo using multiple processes. check_system_memory(opt, args, settings) parallel_args.extend(['--skip-low-res-disparity-comp']) spawn_to_nodes(step, opt, settings, parallel_args, subdirs) # Low-res disparity is done, so wipe that option asp_cmd_utils.wipe_option(parallel_args, '--skip-low-res-disparity-comp', 0) # Bugfix: When doing refinement for a given tile, we must see # the result of correlation for all tiles. To achieve that, # rename all correlation tiles to something else, # build the vrt of all correlation tiles, and sym link # that vrt from all tile directories. rename_files(settings, subdirs, "-D.tif", "-Dnosym.tif") build_vrt('stereo_corr', opt, args, settings, georef, "-D.tif", "-Dnosym.tif", contract_tiles = using_padded_tiles) subdirs = create_subdirs_symlink(opt, args, settings) # symlink D.tif skip_refine_step = (int(settings['subpixel_mode'][0]) > 6) # Blending (when using local_epipolar alignment, or SGM/MGM, or external algorithms) step = Step.blend if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() if not using_padded_tiles: print("No work to do at the blending step.") else: subdirs = create_subdirs_symlink(opt, args, settings) spawn_to_nodes(step, opt, settings, parallel_args, subdirs) if not skip_refine_step: # Do the same trick as after stereo_corr rename_files(settings, subdirs, "-B.tif", "-Bnosym.tif") build_vrt('stereo_blend', opt, args, settings, georef, "-B.tif", "-Bnosym.tif", contract_tiles = False) create_subdirs_symlink(opt, args, settings) # symlink B.tif # At the blending step, make a vrt from the per-tile lr-disp differences. if settings['save_lr_disp_diff'][0] != '0': if using_padded_tiles: build_vrt('stereo_blend', opt, args, settings, georef, "-L-R-disp-diff.tif", "-L-R-disp-diff-blend.tif") else: build_vrt('stereo_blend', opt, args, settings, georef, "-L-R-disp-diff.tif", "-L-R-disp-diff.tif") # Refinement step = Step.rfne if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() # If we used SGM/MGM or some other method making use of # tiles, need to read from the blend file. if using_padded_tiles: parallel_args.extend(['--subpix-from-blend']) if not skip_refine_step: subdirs = create_subdirs_symlink(opt, args, settings) spawn_to_nodes(step, opt, settings, parallel_args, subdirs) try: build_vrt('stereo_rfne', opt, args, settings, georef, "-RD.tif", "-RD.tif") except Exception as e: # Make the error message more informative raise Exception('Failed to build a VRT from */*RD.tif files. Must redo at least the refinement step. Additional error message: ' + str(e)) # Filtering step = Step.fltr if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() normal_run('stereo_fltr', opt, args, out_prefix, msg='%d: Filtering' % step) create_subdirs_symlink(opt, args, settings) # symlink F.tif # Triangulation # TODO(oalexan1): For stereo we do not need to pad the tiles, which should # be a nice speed up. But then must ensure both the padded and non-padded # tiles are wiped after the run is done. step = Step.tri subdirs = [] if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() # TODO(oalexan1): Must wipe the subdirs in all cases. if int(settings['correlator_mode'][0]) != 0 and \ '--num-matches-from-disparity' not in parallel_args and \ '--num-matches-from-disp-triplets' not in parallel_args: # Skip triangulation, but continue further down with cleanup. print("Skipping triangulation with --correlator-mode.") else: # Compute the cloud center. Done once per run. tmp_args = args[:] # deep copy tmp_args.append('--compute-point-cloud-center-only') normal_run('stereo_tri', opt, tmp_args, out_prefix, msg='%d: Triangulation' % step) # Point cloud center computation was done parallel_args.extend(['--skip-point-cloud-center-comp']) # Wipe options that should have been done when the # the center of point cloud was computed asp_cmd_utils.wipe_option(parallel_args, '--unalign-disparity', 0) asp_cmd_utils.wipe_option(parallel_args, '--num-matches-from-disparity', 1) asp_cmd_utils.wipe_option(parallel_args, '--num-matches-from-disp-triplets', 1) # Create subdirs and symlink the files just created subdirs = create_subdirs_symlink(opt, args, settings) # Run triangulation on multiple machines spawn_to_nodes(step, opt, settings, parallel_args, subdirs) if int(settings['correlator_mode'][0]) == 0: build_vrt('stereo_tri', opt, args, settings, georef, "-PC.tif", "-PC.tif") # If the run concluded successfully, merge and wipe step = Step.clean subdirs = [] if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() if (opt.stop_point > Step.clean): if len(subdirs) == 0: # If this was not created by now, do it now subdirs = create_subdirs_symlink(opt, args, settings) keepOnlySpecified(opt.keep_only, out_prefix, subdirs, settings) # End main process case else: # This process was spawned by GNU Parallel with a given # value of opt.tile_id. Launch the job for that tile. if opt.verbose: print("Running on machine: ", os.uname()) try: # Pick the tile we want from the list of tiles tiles = readTiles(out_prefix) tile = tiles[opt.tile_id] prog_name = stereoProgName(opt.entry_point) if (opt.entry_point == Step.corr): check_system_memory(opt, args, settings) tile_run(prog_name, args, opt, settings, tile, msg='%d: Correlation' % opt.entry_point) if (opt.entry_point == Step.blend): tile_run(prog_name, args, opt, settings, tile, msg='%d: Blending' % opt.entry_point) if (opt.entry_point == Step.rfne): tile_run(prog_name, args, opt, settings, tile, msg='%d: Refinement' % opt.entry_point) if (opt.entry_point == Step.tri): tile_run(prog_name, args, opt, settings, tile, msg='%d: Triangulation' % opt.entry_point) except Exception as e: raise_error(e) raise ================================================ FILE: src/asp/Tools/parse_match_file.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # Thanks to Amaury Dehecq for contributing this tool. # Bugfix by PicoJr. import argparse, os, struct import numpy as np def read_ip_record(mf): """ Read one IP record from the binary match file. Information contained are x, y, xi, yi, orientation, scale, interest, polarity, octave, scale_lvl, desc. Inputs: mf, file handle to the in put binary file (in 'rb' mode) Outputs: iprec, array containing the IP record """ x, y = np.frombuffer(mf.read(8), dtype=np.float32) xi, yi = np.frombuffer(mf.read(8), dtype=np.int32) orientation, scale, interest = np.frombuffer(mf.read(12), dtype=np.float32) polarity, = np.frombuffer(mf.read(1), dtype=np.int8) # or np.bool? octave, scale_lvl = np.frombuffer(mf.read(8), dtype=np.uint32) ndesc, = np.frombuffer(mf.read(8), dtype=np.uint64) desc = np.frombuffer(mf.read(int(ndesc * 4)), dtype=np.float32) iprec = [x, y, xi, yi, orientation, scale, interest, polarity, octave, scale_lvl, ndesc] iprec.extend(desc) return iprec def write_ip_record(out, iprec): """ The reverse operation of read_ip_record. Inputs: - out: file handle to the output binary file (in 'wb' mode) - iprec: 1D array containing one IP record """ out.write(struct.pack('f',iprec[0])) # x, y out.write(struct.pack('f',iprec[1])) out.write(struct.pack('i',iprec[2])) # xi, yi out.write(struct.pack('i',iprec[3])) out.write(struct.pack('f',iprec[4])) # orientation, scale, interest out.write(struct.pack('f',iprec[5])) out.write(struct.pack('f',iprec[6])) out.write(struct.pack('?',iprec[7])) # polarity # use fmt ? instead? out.write(struct.pack('I',iprec[8])) # octave, scale_lvl out.write(struct.pack('I',iprec[9])) ndesc = iprec[10] # If the descriptors were not read, their true number # is less than specified. ndesc = len(iprec) - 11 out.write(struct.pack('Q', ndesc)) # ndesc for k in range(ndesc): out.write(struct.pack('f',iprec[11+k])) # desc return def read_match_file(match_file): """ Read a full binary match file. The first two 8-bit fields contain the number of IPs in each image. Next are the records for each IP, first for image1 and then for image2. Input: match_file: str, path to the match file. Outputs: two arrays, containing the IP records for image1 and image2. """ # Open binary file in read mode print("Reading: " + match_file) mf = open(match_file,'rb') # Read record length size1 = np.frombuffer(mf.read(8), dtype=np.uint64)[0] size2 = np.frombuffer(mf.read(8), dtype=np.uint64)[0] # Read record for each image im1_ip = [read_ip_record(mf) for i in range(size1)] im2_ip = [read_ip_record(mf) for i in range(size2)] # Close file mf.close() return im1_ip, im2_ip def write_match_file(outfile, im1_ip, im2_ip): """ Write the full binary match file. Inputs: - outfile: str, path to the output match file - im1_ip: array containing all the records for image1 - im2_ip: array containing all the records for image2 """ # Open binary file in write mode print("Writing: " + outfile) try: os.makedirs(os.path.dirname(outfile)) except OSError: pass out = open(outfile, 'wb') # Read records lengths size1 = len(im1_ip) size2 = len(im2_ip) # Write record length out.write(struct.pack('q',size1)) out.write(struct.pack('q',size2)) # Write records for both images for k in range(size1): write_ip_record(out, im1_ip[k]) for k in range(size2): write_ip_record(out, im2_ip[k]) return if __name__ == '__main__': #Set up the arguments parser = argparse.ArgumentParser(description = \ 'Convert an ASP binary match file to a text file. ' + \ 'Use the -rev option to do the reverse operation.') parser.add_argument('infile', type=str, help='Path to the input file.') parser.add_argument('outfile', type=str, help='Path to the output file.') parser.add_argument('-rev', '--reverse', dest='rev', help='Convert a text file having matches into an ASP binary match file.', action='store_true') parser.add_argument('--save-descriptors', dest='save_descriptors', help='When converting a binary match file to text, save the ' + 'interest point descriptors as well.', action='store_true') args = parser.parse_args() if args.rev==False: # Read match file im1_ip, im2_ip = read_match_file(args.infile) # Save to text file print("Writing: " + args.outfile) try: os.makedirs(os.path.dirname(args.outfile)) except OSError: pass with open(args.outfile, 'w') as out: # Write number of records out.write('%i %i\n' %(len(im1_ip), len(im2_ip))) # Write IPs for image1 for i in range(len(im1_ip)): iprec = im1_ip[i] if args.save_descriptors: # Save the full record, including descriptors iprec_to_write = iprec else: # Keep only the first 11 fields, and set ndesc (at index 10) to 0. iprec_to_write = iprec[:11] iprec_to_write[10] = 0 iprec_str = [str(a) for a in iprec_to_write] out.write(' '.join(iprec_str) + '\n') # Write IPs for image2 for i in range(len(im2_ip)): iprec = im2_ip[i] if args.save_descriptors: # Save the full record, including descriptors iprec_to_write = iprec else: # Keep only the first 11 fields, and set ndesc (at index 10) to 0. iprec_to_write = iprec[:11] iprec_to_write[10] = 0 iprec_str = [str(a) for a in iprec_to_write] out.write(' '.join(iprec_str) + '\n') else: # Read number of records f = open(args.infile,'r') print("Reading: " + args.infile) out = f.readline() size1, size2 = np.uint64(out.strip().split(' ')) f.close() # Read each image IPs records. Note how we don't bother to read the # descriptors, which are a handful of values on each row beyond the # specified fields. try: im1_ipb = np.genfromtxt(args.infile,skip_header=1,dtype='float32, float32, int32, int32, float32, float32, float32, int8, uint32, uint32, uint64', max_rows=size1) im1_ipb = im1_ipb.reshape((size1,)) 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) im2_ipb = im2_ipb.reshape((size2,)) except Exception as e: print("Your numpy version (" + str(np.__version__) + ") may be too old. " + "Got the error: " + str(e)) # Save to output file write_match_file(args.outfile, im1_ipb, im2_ipb) ================================================ FILE: src/asp/Tools/pc_align.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // This tool uses libpointmatcher for alignment. // https://github.com/ethz-asl/libpointmatcher // Released under the BSD 3-Clause. #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/Macros.h> #include <asp/Core/PointUtils.h> #include <asp/Core/PdalUtils.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/EigenUtils.h> #include <asp/PcAlign/pc_align_utils.h> #include <asp/PcAlign/pc_align_ceres.h> #include <asp/PcAlign/pc_align_fgr.h> #include <asp/PcAlign/NuthAlignment.h> #include <vw/Core/Stopwatch.h> #include <vw/Math/EulerAngles.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/Cartography/PointImageManipulation.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Core/CmdUtils.h> #include <vw/Math/Geometry.h> #include <vw/Math/Functors.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/FileIO/FileUtils.h> #include <limits> #include <cstring> #include <thread> #include <omp.h> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> namespace fs = boost::filesystem; namespace po = boost::program_options; using namespace vw; using namespace vw::cartography; using namespace asp; const double BIG_NUMBER = 1e+300; // libpointmatcher does not like here the largest double /// Options container for the pc_align tool struct Options: public vw::GdalWriteOptions { // Input std::string reference, source, init_transform_file, alignment_method, datum, csv_format_str, csv_srs, match_file, hillshade_command, hillshade_options, ipfind_options, ipmatch_options, nuth_options, fgr_options, csv_proj4_str; Vector2 initial_transform_ransac_params; Eigen::MatrixXd init_transform; int num_iter, max_num_reference_points, max_num_source_points; double diff_translation_err, diff_rotation_err, max_disp, outlier_ratio, semi_major_axis, semi_minor_axis, initial_rotation_angle; bool compute_translation_only, dont_use_dem_distances, save_trans_source, save_trans_ref, highest_accuracy, verbose, skip_shared_box_estimation; std::string initial_ned_translation, hillshading_transform; vw::BBox2 ref_copc_win, src_copc_win; bool ref_copc_read_all, src_copc_read_all; // Output std::string out_prefix; Options() : max_disp(-1.0), verbose(true) {} /// Return true if the reference file is a DEM file and this option is not disabled bool use_dem_distances() const { return (asp::get_cloud_type(this->reference) == "DEM") && !dont_use_dem_distances; } }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("initial-transform", po::value(&opt.init_transform_file)->default_value(""), "The file containing the transform to be used as an initial guess. It can come from a previous run of the tool.") ("num-iterations", po::value(&opt.num_iter)->default_value(1000), "Maximum number of iterations.") ("diff-rotation-error", po::value(&opt.diff_rotation_err)->default_value(1e-5), "Change in rotation amount below which the algorithm will stop (if translation " "error is also below bound), in degrees. A small value can result in numerical " "precision issues and many iterations.") ("diff-translation-error", po::value(&opt.diff_translation_err)->default_value(1e-3), "Change in translation amount below which the algorithm will stop (if rotation error is also below bound), in meters.") ("max-displacement", po::value(&opt.max_disp)->default_value(0.0), "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.") ("outlier-ratio", po::value(&opt.outlier_ratio)->default_value(0.75), "Fraction of source (movable) points considered inliers (after gross outliers further than max-displacement from reference points are removed).") ("max-num-reference-points", po::value(&opt.max_num_reference_points)->default_value(100000000), "Maximum number of (randomly picked) reference points to use.") ("max-num-source-points", po::value(&opt.max_num_source_points)->default_value(100000), "Maximum number of (randomly picked) source points to use (after discarding gross outliers).") ("alignment-method", po::value(&opt.alignment_method)->default_value("point-to-plane"), "Alignment method. Options: point-to-plane, point-to-point, " "similarity-point-to-plane, similarity-point-to-point, nuth, fgr, least-squares, " "similarity-least-squares.") ("highest-accuracy", po::bool_switch(&opt.highest_accuracy)->default_value(false)->implicit_value(true), "Compute with highest accuracy for point-to-plane (can be much slower).") ("csv-format", po::value(&opt.csv_format_str)->default_value(""), asp::csv_opt_caption().c_str()) ("csv-srs", po::value(&opt.csv_srs)->default_value(""), "The PROJ or WKT string to use to interpret the entries in input CSV files.") ("datum", po::value(&opt.datum)->default_value(""), "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).") ("semi-major-axis", po::value(&opt.semi_major_axis)->default_value(0), "Explicitly set the datum semi-major axis in meters.") ("semi-minor-axis", po::value(&opt.semi_minor_axis)->default_value(0), "Explicitly set the datum semi-minor axis in meters.") ("output-prefix,o", po::value(&opt.out_prefix)->default_value(""), "Specify the output prefix.") ("compute-translation-only", po::bool_switch(&opt.compute_translation_only)->default_value(false)->implicit_value(true), "Compute the transform from source to reference point cloud as a translation only (no rotation).") ("save-transformed-source-points", po::bool_switch(&opt.save_trans_source)->default_value(false)->implicit_value(true), "Apply the obtained transform to the source points so they match the reference points and save them.") ("save-inv-transformed-reference-points", po::bool_switch(&opt.save_trans_ref)->default_value(false)->implicit_value(true), "Apply the inverse of the obtained transform to the reference points so they match the source points and save them.") ("initial-ned-translation", po::value(&opt.initial_ned_translation)->default_value(""), "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.") ("initial-rotation-angle", po::value(&opt.initial_rotation_angle)->default_value(0), "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.") ("initial-transform-from-hillshading", po::value(&opt.hillshading_transform)->default_value(""), "If both input clouds are DEMs, find interest point matches among their hillshaded " "versions, and use them to compute an initial transform to apply to the source cloud " "before proceeding with alignment. Specify here the type of transform, as one of: " "'similarity' (rotation + translation + scale), 'rigid' (rotation + translation) or " "'translation'. See the options further down for tuning this.") ("hillshade-command", po::value(&opt.hillshade_command)->default_value(""), "The hillshade command and options to use when computing the transform from " "hillshading. The default is: gdaldem hillshade -multidirectional -compute_edges -co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256. An alternative is: " "hillshade --azimuth 300 --elevation 20 --align-to-georef.") ("hillshade-options", po::value(&opt.hillshade_options)->default_value(""), "Options to pass to the hillshade program when computing the transform from " "hillshading. This is for backward compatibility. Use instead the --hillshade-command " "option.") ("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.") ("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.") ("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.") ("initial-transform-ransac-params", po::value(&opt.initial_transform_ransac_params)->default_value(Vector2(10000, 1.0), "num_iter factor"), "When computing an initial transform based on hillshading, use " "this number of RANSAC iterations and outlier factor. A smaller factor " "will reject more outliers.") ("nuth-options", po::value(&opt.nuth_options)->default_value(""), "Options to pass to the Nuth and Kaab algorithm.") ("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"), "Options to pass to the Fast Global Registration algorithm.") ("no-dem-distances", po::bool_switch(&opt.dont_use_dem_distances)->default_value(false)->implicit_value(true), "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.") ("skip-shared-box-estimation", po::bool_switch(&opt.skip_shared_box_estimation)->default_value(false)->implicit_value(true), "Do not estimate the shared bounding box of the two clouds. This estimation " "can be costly for large clouds but helps with eliminating outliers.") ("ref-copc-win", po::value(&opt.ref_copc_win)->default_value(vw::BBox2()), "Specify the region to read from the reference cloud, if it is a COPC LAZ file. The " "units are based the projection in the file. This is required unless --ref-copc-read- " "all is set. Specify as minx miny maxx maxy, or minx maxy maxx miny, with no quotes.") ("src-copc-win", po::value(&opt.src_copc_win)->default_value(vw::BBox2()), "Specify the region to read from the source cloud, if it is a COPC LAZ file. The " "units are based the projection in the file. This is required unless " "--src-copc-read-all all is set. Specify as minx miny maxx maxy, " "or minx maxy maxx miny, with no quotes. If not set, the --ref-copc-win option will " "be used, or otherwise it will be estimated based on the extent of reference points " "and the --max-displacement option.") ("ref-copc-read-all", po::bool_switch(&opt.ref_copc_read_all)->default_value(false), "Read the full reference COPC file, ignoring the --ref-copc-win option.") ("src-copc-read-all", po::bool_switch(&opt.src_copc_read_all)->default_value(false), "Read the full source COPC file, ignoring the --src-copc-win option.") ("csv-proj4", po::value(&opt.csv_proj4_str)->default_value(""), "An alias for --csv-srs, for backward compatibility."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("reference", po::value(&opt.reference), "The reference (fixed) point cloud/DEM.") ("source", po::value(&opt.source), "The source (movable) point cloud/DEM."); po::positional_options_description positional_desc; positional_desc.add("reference", 1); positional_desc.add("source", 1); std::string usage("--max-displacement arg [other options] <reference cloud> <source cloud> " "-o <output prefix>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // If the user specifies no options at all, print the help message. // Otherwise, print the specific error. if (opt.reference.empty() && opt.source.empty() && opt.out_prefix.empty()) vw_throw(ArgumentErr() << "No input arguments provided.\n" << usage << general_options); if (opt.reference.empty() || opt.source.empty()) vw_throw(ArgumentErr() << "Missing input files.\n"); if (opt.out_prefix.empty()) vw_throw(ArgumentErr() << "Missing output prefix.\n"); if (opt.max_disp == 0.0) vw_throw(ArgumentErr() << "The max-displacement option was not set. " << "Use -1 if it is desired not to use it.\n"); if (opt.num_iter < 0) vw_throw(ArgumentErr() << "The number of iterations must be non-negative.\n"); if ((opt.semi_major_axis != 0 && opt.semi_minor_axis == 0) || (opt.semi_minor_axis != 0 && opt.semi_major_axis == 0)) { vw_throw(ArgumentErr() << "One of the semi-major or semi-minor axes" << " was specified, but not the other one.\n"); } if (opt.semi_major_axis < 0 || opt.semi_minor_axis < 0) { vw_throw(ArgumentErr() << "The semi-major and semi-minor axes cannot " << "be negative.\n"); } if (opt.datum != "" && opt.semi_major_axis != 0 && opt.semi_minor_axis != 0) { vw_throw(ArgumentErr() << "Both the datum string and datum semi-axes were " << "specified. At most one needs to be set.\n"); } if ((opt.initial_ned_translation != "" || opt.initial_rotation_angle != 0) && opt.init_transform_file != "") vw_throw(ArgumentErr() << "Cannot specify an initial transform both from a file " << "and as a NED vector or rotation angle.\n"); if ((opt.hillshading_transform != "" || opt.match_file != "") && (opt.initial_ned_translation != "" || opt.init_transform_file != "" || opt.initial_rotation_angle != 0)) { vw_throw(ArgumentErr() << "Cannot both specify an initial transform " << "and expect one to be computed automatically.\n"); } // Must specify either csv_srs or csv_proj4_str, but not both. The latter is // for backward compatibility. if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty()) vw_throw(ArgumentErr() << "Cannot specify both --csv-srs and --csv-proj4.\n"); if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty()) opt.csv_srs = opt.csv_proj4_str; // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); // Read the initial transform opt.init_transform = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1); if (opt.init_transform_file != "") { asp::read_transform(opt.init_transform, opt.init_transform_file); vw_out() << std::setprecision(16) << "Initial guess transform:\n" << opt.init_transform << "\n"; vw_out() << std::setprecision(8); // undo the higher precision } if (opt.alignment_method != "point-to-plane" && opt.alignment_method != "point-to-point" && opt.alignment_method != "similarity-point-to-point" && opt.alignment_method != "similarity-point-to-plane" && opt.alignment_method != "nuth" && opt.alignment_method != "fgr" && opt.alignment_method != "least-squares" && opt.alignment_method != "similarity-least-squares") vw_throw(ArgumentErr() << "Only the following alignment methods are supported: " << "point-to-plane, point-to-point, similarity-point-to-point, " << "similarity-point-to-plane, fgr, least-squares, and similarity-least-squares.\n"); if (opt.alignment_method != "point-to-plane" && opt.alignment_method != "point-to-point" && opt.alignment_method != "similarity-point-to-point" && opt.alignment_method != "similarity-point-to-plane" && opt.alignment_method != "nuth" && opt.compute_translation_only) { vw_throw(ArgumentErr() << "The option --compute-translation-only is only applicable " << "to point-to-plane, point-to-point, similarity-point-to-point, " << "similarity-point-to-plane, and nuth alignment.\n"); } if ((opt.alignment_method == "least-squares" || opt.alignment_method == "similarity-least-squares") && asp::get_cloud_type(opt.reference) != "DEM") vw_throw(ArgumentErr() << "Least squares alignment can be used only when the " << "reference cloud is a DEM.\n"); if (opt.alignment_method == "nuth") { if (asp::get_cloud_type(opt.reference) != "DEM" || asp::get_cloud_type(opt.source) != "DEM") vw_throw(ArgumentErr() << "Nuth and Kaab alignment can be used only when both " << "the reference and source clouds are DEMs.\n"); if (!opt.init_transform_file.empty() || !opt.initial_ned_translation.empty() || !opt.hillshading_transform.empty()) vw_throw(ArgumentErr() << "Nuth and Kaab alignment cannot be used with an initial transform.\n"); if (opt.dont_use_dem_distances) vw_throw(ArgumentErr() << "Nuth and Kaab alignment requires using DEM distances for statistics.\n"); if (!opt.match_file.empty()) vw_throw(ArgumentErr() << "Nuth and Kaab alignment cannot be used with a match file.\n"); if (opt.initial_rotation_angle != 0) vw_throw(ArgumentErr() << "Nuth and Kaab alignment cannot be used with an initial rotation angle.\n"); opt.max_num_reference_points /= 25; opt.max_num_reference_points = std::max(1000000, opt.max_num_reference_points); vw::vw_out() << "For Nuth and Kaab alignment, a smaller reference cloud is " << "sufficient. Reducing --max-num-reference-points by about 25x, to: " << opt.max_num_reference_points << ".\n"; } int num_iter = opt.initial_transform_ransac_params[0]; double factor = opt.initial_transform_ransac_params[1]; if (num_iter < 1 || factor <= 0.0) vw_throw(ArgumentErr() << "Invalid values were provided for " << "--initial-transform-ransac-params.\n"); // Support for minx maxy maxx miny format. if (opt.ref_copc_win != BBox2()) { if (opt.ref_copc_win.min().y() > opt.ref_copc_win.max().y()) std::swap(opt.ref_copc_win.min().y(), opt.ref_copc_win.max().y()); } if (opt.src_copc_win != BBox2()) { if (opt.src_copc_win.min().y() > opt.src_copc_win.max().y()) std::swap(opt.src_copc_win.min().y(), opt.src_copc_win.max().y()); } // Use ref_copc_win, if src_copc_win is not set if (asp::isCopc(opt.source) && opt.src_copc_win == BBox2() && opt.ref_copc_win != BBox2()) { vw::vw_out() << "Using --ref-copc-win for --src-copc-win.\n"; opt.src_copc_win = opt.ref_copc_win; } } /// Compute output statistics for pc_align void calc_stats(std::string label, Eigen::MatrixXd const& dists) { VW_ASSERT(dists.rows() == 1, LogicErr() << "Expecting only one row."); std::vector<double> errs(dists.cols()*dists.rows()); int count = 0; for (int col = 0; col < dists.cols(); col++) { errs[count] = dists(0, col); count++; } std::sort(errs.begin(), errs.end()); int len = errs.size(); vw_out() << "Number of errors: " << len << "\n"; if (len == 0) return; // Find the median. This operation re-sorts the vector internally. This does a // more careful job than the code below for even-length vectors. It looks // safer, if redundant, to work on a copy of the vector. std::vector<double> errs_copy = errs; double median = vw::math::destructive_median(errs_copy); // Find nmad. As before, copy the vector to be safe. errs_copy = errs; double nmad = vw::math::destructive_nmad(errs_copy); double p16 = errs[std::min(len-1, (int)round(len*0.16))]; double p84 = errs[std::min(len-1, (int)round(len*0.84))]; vw_out() << label << ": error percentile of smallest errors (meters):" << " 16%: " << p16 << ", 50%: " << median << ", 84%: " << p84 << "\n"; double a25 = calc_mean(errs, len/4), a50 = calc_mean(errs, len/2); double a75 = calc_mean(errs, 3*len/4), a100 = calc_mean(errs, len); vw_out() << label << ": mean of smallest errors (meters):" << " 25%: " << a25 << ", 50%: " << a50 << ", 75%: " << a75 << ", 100%: " << a100 << "\n"; // Mean, StdDev, RMSE, median, nmad vw_out() << label << " stats (meters): " << "Mean: " << calc_mean(errs, len) << ", " << "StdDev: " << calc_stddev(errs) << ", " << "RMSE: " << calc_rmse(errs) << ", " << "Median: " << median << ", " << "NMAD: " << nmad << "\n"; } // Save a cloud to disk for debugging void debug_save_point_cloud(DP const& point_cloud, GeoReference const& geo, Vector3 const& shift, std::string const& output_file) { int numPts = point_cloud.features.cols(); vw_out() << "Writing: " << numPts << " to " << output_file << "\n"; std::ofstream outfile(output_file.c_str()); outfile.precision(18); for (int col = 0; col < numPts; col++) { Vector3 P = get_cloud_gcc_coord(point_cloud, shift, col); Vector3 llh = geo.datum().cartesian_to_geodetic(P); // lon-lat-height outfile << llh[1] << ',' << llh[0] << ',' << llh[2] << "\n"; } outfile.close(); } /// Save the transform and its inverse. void write_transforms(Options const& opt, Eigen::MatrixXd const& T) { std::string transFile = opt.out_prefix + "-transform.txt"; vw_out() << "Writing: " << transFile << "\n"; write_transform(T, transFile); std::string iTransFile = opt.out_prefix + "-inverse-transform.txt"; Eigen::MatrixXd invT = T.inverse(); vw_out() << "Writing: " << iTransFile << "\n"; write_transform(invT, iTransFile); } /// Save the lon, lat, radius/height, and error. Use a format /// consistent with the input CSV format. void save_errors(DP const& point_cloud, Eigen::MatrixXd const& errors, std::string const& output_file, Vector3 const& shift, GeoReference const& geo, asp::CsvConv const& csv_conv, bool is_lola_rdr_format, double median_longitude) { vw_out() << "Writing: " << output_file << "\n"; VW_ASSERT(point_cloud.features.cols() == errors.cols(), ArgumentErr() << "Expecting as many errors as source points."); std::ofstream outfile(output_file.c_str()); outfile.precision(16); // Write the header line if (csv_conv.is_configured()) { outfile << "# " << csv_conv.write_header_string(",") << "error (meters)" << "\n"; } else { if (is_lola_rdr_format) outfile << "# longitude,latitude,radius (km),error (meters)" << "\n"; else outfile << "# latitude,longitude,height above datum (meters),error (meters)" << "\n"; } // Save the datum, may be useful to know what it was if (geo.datum().name() != UNSPECIFIED_DATUM) { outfile << "# " << geo.datum() << "\n"; outfile << "# Projection: " << geo.get_wkt() << "\n"; } int numPts = point_cloud.features.cols(); for (int col = 0; col < numPts; col++) { Vector3 P = get_cloud_gcc_coord(point_cloud, shift, col); if (csv_conv.is_configured()) { Vector3 csv = csv_conv.cartesian_to_csv(P, geo, median_longitude); outfile << csv[0] << ',' << csv[1] << ',' << csv[2] << "," << errors(0, col) << "\n"; } else { Vector3 llh = geo.datum().cartesian_to_geodetic(P); // lon-lat-height llh[0] += 360.0*round((median_longitude - llh[0])/360.0); // 360 deg adjustment if (is_lola_rdr_format) outfile << llh[0] << ',' << llh[1] << ',' << norm_2(P)/1000.0 << "," << errors(0, col) << "\n"; else outfile << llh[1] << ',' << llh[0] << ',' << llh[2] << "," << errors(0, col) << "\n"; } } outfile.close(); } /// Like PM::ICP::filterGrossOutliersAndCalcErrors, except comparing to a DEM instead. /// - The point cloud is in GCC coordinates with point_cloud_shift subtracted from each point. /// - The output is put in the "errors" vector for each point. /// - If there is a problem computing the point error, a very large number is used as a flag. void calcErrorsWithDem(DP const& point_cloud, vw::Vector3 const& point_cloud_shift, vw::cartography::GeoReference const& georef, vw::ImageViewRef<PixelMask<float>> const& dem, std::vector<double> & errors) { // Initialize output error storage const std::int64_t num_pts = point_cloud.features.cols(); errors.resize(num_pts); // Loop through every point in the point cloud double dem_height_here; for (std::int64_t i = 0; i < num_pts; i++) { // Extract and un-shift the point to get the real GCC coordinate Vector3 gcc_coord = get_cloud_gcc_coord(point_cloud, point_cloud_shift, i); // Convert from GDC to GCC Vector3 llh = georef.datum().cartesian_to_geodetic(gcc_coord); // lon-lat-height // Interpolate the point at this location if (!interp_dem_height(dem, georef, llh, dem_height_here)) { // If we did not intersect the DEM, record a flag error value here. errors[i] = BIG_NUMBER; } else { // Success, the error is the absolute height difference errors[i] = std::abs(llh[2] - dem_height_here); } } // End loop through all points } // Updates an LPM error matrix to use the DEM-based error for each point if it is lower. // Note: The LPM matrix type used to store errors only ever has a single row. void update_best_error(std::vector<double> const& dem_errors, Eigen::MatrixXd & lpm_errors) { std::int64_t num_points = lpm_errors.cols(); if (dem_errors.size() != static_cast<std::size_t>(num_points)) vw_throw(LogicErr() << "Error: error size does not match point count size!\n"); // Loop through points for (std::int64_t col = 0; col < num_points; col++) { // Use the DEM error if it is less if (dem_errors[col] < lpm_errors(0,col)) { lpm_errors(0, col) = dem_errors[col]; } } } /// Compute the distance from source_point_cloud to the reference points. double compute_registration_error(DP const& ref_point_cloud, DP & source_point_cloud, // Should not be modified PM::ICP & pm_icp_object, vw::Vector3 const& shift, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef< PixelMask<float> > const& dem_ref, Options const& opt, Eigen::MatrixXd &error_matrix) { Stopwatch sw; sw.start(); // Always start by computing the error using LPM // Use a big number to make sure no points are filtered! pm_icp_object.filterGrossOutliersAndCalcErrors(ref_point_cloud, BIG_NUMBER, source_point_cloud, error_matrix); if (opt.use_dem_distances()) { // Compute the distance from each point to the DEM std::vector<double> dem_errors; calcErrorsWithDem(source_point_cloud, shift, dem_georef, dem_ref, dem_errors); // For each point use the lower of the two calculated errors. update_best_error(dem_errors, error_matrix); // We compute the error in two passes for two reasons: // 1 - Get the most accurate distance for each point in all cases. // 2 - Help fill in distances where the DEM has holes. } sw.stop(); return sw.elapsed_seconds(); } /// Points in source_point_cloud farther than opt.max_disp from the reference cloud are deleted. void filter_source_cloud(DP const& ref_point_cloud, DP & source_point_cloud, PM::ICP & pm_icp_object, // Must already be initialized vw::Vector3 const& shift, vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef< PixelMask<float> > const& dem_ref, Options const& opt) { // Filter gross outliers Stopwatch sw; sw.start(); if (opt.verbose) vw_out() << "Filtering gross outliers" << "\n"; Eigen::MatrixXd error_matrix; try { if (opt.use_dem_distances()) { // Compute the registration error using the best available means compute_registration_error(ref_point_cloud, source_point_cloud, pm_icp_object, shift, dem_georef, dem_ref, opt, error_matrix); filterPointsByError(source_point_cloud, error_matrix, opt.max_disp); } else { // LPM only method // Points in source_point_cloud further than opt.max_disp from ref_point_cloud are deleted! pm_icp_object.filterGrossOutliersAndCalcErrors(ref_point_cloud, opt.max_disp, source_point_cloud, error_matrix); } } catch(const PointMatcher<double>::ConvergenceError & e) { vw_throw(ArgumentErr() << "Error: No points left in source cloud after filtering. Consider increasing --max-displacement and/or see the documentation.\n"); } sw.stop(); if (opt.verbose) vw_out() << "Filtering gross outliers took " << sw.elapsed_seconds() << " s\n"; } Eigen::Matrix3d vw_matrix3_to_eigen(vw::Matrix3x3 const& vw_matrix) { Eigen::Matrix3d out; out(0,0) = vw_matrix(0,0); out(0,1) = vw_matrix(0,1); out(0,2) = vw_matrix(0,2); out(1,0) = vw_matrix(1,0); out(1,1) = vw_matrix(1,1); out(1,2) = vw_matrix(1,2); out(2,0) = vw_matrix(2,0); out(2,1) = vw_matrix(2,1); out(2,2) = vw_matrix(2,2); return out; } Eigen::Vector3d vw_vector3_to_eigen(vw::Vector3 const& vw_vector) { return Eigen::Vector3d(vw_vector[0], vw_vector[1], vw_vector[2]); } // Need this to placate libpointmatcher. std::string alignment_method_fallback(std::string const& alignment_method) { if (alignment_method == "least-squares" || alignment_method == "similarity-least-squares" || alignment_method == "fgr" || alignment_method == "nuth") return "point-to-plane"; return alignment_method; } // Hillshade the reference and source DEMs, and use them to find // interest point matches among the hillshaded images. These will be // used later to find a rotation + translation + scale transform. std::string find_matches_from_hillshading(Options & opt, std::string const& curr_exec_path) { // First, this works only for DEMs if (asp::get_cloud_type(opt.reference) != "DEM" || asp::get_cloud_type(opt.source) != "DEM") vw_throw(ArgumentErr() << "Cannot find an initial transform using hillshading " << "unless both point clouds are DEMs. Use point2dem to first create " << "DEMs from the input point clouds. Then this transform can be used " << "with the original clouds.\n"); // Cannot have both opt.hillshade_command and opt.hillshade_options set if (!opt.hillshade_command.empty() && !opt.hillshade_options.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot have both --hillshade-command and " << "--hillshade-options set.\n"); // This is to ensure backward compatibility if (opt.hillshade_options.empty()) { if (opt.hillshade_command.empty()) opt.hillshade_command = "gdaldem hillshade -multidirectional -compute_edges " "-co TILED=yes -co BLOCKXSIZE=256 -co BLOCKYSIZE=256"; } else { std::string hillshade_path = vw::program_path("hillshade", curr_exec_path); opt.hillshade_command = hillshade_path + " " + opt.hillshade_options; } // ASP hillshade needs the "-o" switch. std::string extra = " "; if (opt.hillshade_command.find("gdaldem") == std::string::npos) extra = " -o "; // Find the needed executables std::string ipfind_path = vw::program_path("ipfind", curr_exec_path); std::string ipmatch_path = vw::program_path("ipmatch", curr_exec_path); // Hillshade the reference std::string ref_hillshade = opt.out_prefix + "-reference_hillshade.tif"; std::string cmd = opt.hillshade_command + " " + opt.reference + extra + ref_hillshade; vw_out() << cmd << "\n"; std::string ans = vw::exec_cmd(cmd.c_str()); vw_out() << ans << "\n"; // Hillshade the source std::string source_hillshade = opt.out_prefix + "-source_hillshade.tif"; cmd = opt.hillshade_command + " " + opt.source + extra + source_hillshade; vw_out() << cmd << "\n"; ans = vw::exec_cmd(cmd.c_str()); vw_out() << ans << "\n"; // IP find cmd = ipfind_path + " " + opt.ipfind_options + " " + ref_hillshade + " " + source_hillshade; vw_out() << cmd << "\n"; ans = vw::exec_cmd(cmd.c_str()); vw_out() << ans << "\n"; // IP match std::string ref_ip = fs::path(ref_hillshade).replace_extension(".vwip").string(); std::string source_ip = fs::path(source_hillshade).replace_extension(".vwip").string(); cmd = ipmatch_path + " " + opt.ipmatch_options + " " + ref_hillshade + " " + ref_ip + " " + source_hillshade + " " + source_ip + " -o " + opt.out_prefix; vw_out() << cmd << "\n"; ans = vw::exec_cmd(cmd.c_str()); vw_out() << ans << "\n"; // The name of the file where the matches are written to bool matches_as_txt = false; std::string match_file = vw::ip::match_filename(opt.out_prefix, ref_hillshade, source_hillshade, matches_as_txt); return match_file; } // Compute an initial source to reference transform based on tie points (interest point matches). Eigen::MatrixXd initial_transform_from_match_file(std::string const& ref_file, std::string const& source_file, std::string const& match_file, std::string const& hillshading_transform, Vector2 initial_transform_ransac_params) { if (asp::get_cloud_type(ref_file) != "DEM" || asp::get_cloud_type(source_file) != "DEM") vw_throw(ArgumentErr() << "The alignment transform computation based on manually chosen " << "point matches only works for DEMs. Use point2dem to first create " << "DEMs from the input point clouds.\n"); std::vector<vw::ip::InterestPoint> ref_ip, source_ip; vw_out() << "Reading match file: " << match_file << "\n"; vw::ip::read_binary_match_file(match_file, ref_ip, source_ip); DiskImageView<float> ref(ref_file); vw::cartography::GeoReference ref_geo; bool has_ref_geo = vw::cartography::read_georeference(ref_geo, ref_file); double ref_nodata = -std::numeric_limits<double>::max(); vw::read_nodata_val(ref_file, ref_nodata); DiskImageView<float> source(source_file); vw::cartography::GeoReference source_geo; bool has_source_geo = vw::cartography::read_georeference(source_geo, source_file); double source_nodata = -std::numeric_limits<double>::max(); vw::read_nodata_val(source_file, source_nodata); if (!has_ref_geo || !has_source_geo) vw_throw(ArgumentErr() << "One of the inputs is not a valid DEM.\n"); if (DIM != 3) vw_throw(ArgumentErr() << "Expecting DIM = 3.\n"); // Go from pixels to 3D points int num_matches = ref_ip.size(); vw::Matrix<double> points_ref(DIM, num_matches), points_src(DIM, num_matches); typedef vw::math::MatrixCol<vw::Matrix<double>> ColView; int count = 0; for (int match_id = 0; match_id < num_matches; match_id++) { int ref_x = ref_ip[match_id].x; int ref_y = ref_ip[match_id].y; if (ref_x < 0 || ref_x >= ref.cols()) continue; if (ref_y < 0 || ref_y >= ref.rows()) continue; double ref_h = ref(ref_x, ref_y); // Check for no-data and NaN pixels if (ref_h <= ref_nodata || ref_h != ref_h) continue; int source_x = source_ip[match_id].x; int source_y = source_ip[match_id].y; if (source_x < 0 || source_x >= source.cols()) continue; if (source_y < 0 || source_y >= source.rows()) continue; double source_h = source(source_x, source_y); // Check for no-data and NaN pixels if (source_h <= source_nodata || source_h != source_h) continue; Vector2 ref_ll = ref_geo.pixel_to_lonlat(Vector2(ref_x, ref_y)); Vector3 ref_xyz = ref_geo.datum() .geodetic_to_cartesian(Vector3(ref_ll[0], ref_ll[1], ref_h)); Vector2 source_ll = source_geo.pixel_to_lonlat(Vector2(source_x, source_y)); Vector3 source_xyz = source_geo.datum() .geodetic_to_cartesian(Vector3(source_ll[0], source_ll[1], source_h)); // Store in matrices ColView col_ref(points_ref, count); ColView col_src(points_src, count); col_ref = ref_xyz; col_src = source_xyz; count++; } if (count < 3) vw_throw(ArgumentErr() << "Not enough valid matches were found.\n"); // Resize the matrix to keep only the valid points. Find the transform. points_src.set_size(DIM, count, true); points_ref.set_size(DIM, count, true); vw::Matrix3x3 rotation; vw::Vector3 translation; double scale; bool filter_outliers = true; vw::math::find_3D_transform(points_src, points_ref, rotation, translation, scale, hillshading_transform, filter_outliers, initial_transform_ransac_params); // Convert to pc_align transform format. Eigen::MatrixXd globalT = Eigen::MatrixXd::Identity(DIM+1, DIM+1); globalT.block(0, 0, DIM, DIM) = vw_matrix3_to_eigen(rotation*scale); globalT.block(0, DIM, DIM, 1) = vw_vector3_to_eigen(translation); vw_out() << "Transform computed from source to reference using a match file:\n" << globalT << "\n"; return globalT; } void apply_transform_to_cloud(Eigen::MatrixXd const& T, DP & point_cloud) { for (int col = 0; col < point_cloud.features.cols(); col++) { point_cloud.features.col(col) = T*point_cloud.features.col(col); } } // Load, filter, transform, and resample the source point cloud. The input // clouds and transform have been shifted by the provided shift value. The // same shift will be applied to the produced source cloud. void processSourceCloud(Options const& opt, DP const& ref_point_cloud, Eigen::MatrixXd const& shiftInitT, vw::cartography::GeoReference const& dem_georef, vw::cartography::GeoReference const& geo, asp::CsvConv const& csv_conv, BBox2 const& source_box, vw::ImageViewRef<PixelMask<float>> reference_dem_ref, bool is_lola_rdr_format, double mean_source_longitude, // These won't change but cannot be const PM::ICP & icp, vw::Vector3 & shift, // Output DP & source_point_cloud) { // Do two attempts, in case too few points are left after filtering. This can // happen if the source cloud is very different from the reference cloud. std::string tag = ""; for (int attempt = 1; attempt <= 2; attempt++) { source_point_cloud = DP(); // Clear the output int big_num = 1.0e+6; if (attempt == 2) { big_num = 50.0e+6; tag = "(second attempt) "; } int num_source_pts = opt.max_num_source_points; if (opt.max_disp > 0.0) num_source_pts = std::max((1+attempt) * num_source_pts, big_num); // Use the same shift used for the reference point cloud bool calc_shift = false; Stopwatch sw; sw.start(); load_cloud(opt.source, num_source_pts, source_box, opt.src_copc_win, opt.src_copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, mean_source_longitude, opt.verbose, source_point_cloud); sw.stop(); if (opt.verbose) vw_out() << "Loading the source point cloud " << tag << "took " << sw.elapsed_seconds() << " s\n"; // Apply the initial guess transform to the source point cloud. apply_transform_to_cloud(shiftInitT, source_point_cloud); // Filter gross outliers in the source point cloud with max_disp try { // This can throw an exception if the resulting cloud is empty if (opt.max_disp > 0.0) filter_source_cloud(ref_point_cloud, source_point_cloud, icp, shift, dem_georef, reference_dem_ref, opt); } catch (std::exception const& e) { vw_out() << "Not enough points left in the source cloud after filtering. " << "Try loading more.\n"; continue; } random_pc_subsample(opt.max_num_source_points, source_point_cloud.features); vw_out() << "Reducing number of source points to: " << source_point_cloud.features.cols() << "\n"; if (source_point_cloud.features.cols() >= opt.max_num_source_points) break; if (attempt == 1) vw_out() << "Not enough points left in the source cloud after filtering. " << "Try loading more.\n"; } // Write the point cloud to disk for debugging //debug_save_point_cloud(ref_point_cloud, geo, shift, "ref.csv"); } // Convert a north-east-down vector at a given location to a vector in reference // to the center of the Earth and create a translation matrix from that vector. Eigen::MatrixXd ned_to_cartesian_transform(vw::cartography::Datum const& datum, std::string& ned_str, vw::Vector3 const & location) { vw::string_replace(ned_str, ",", " "); // replace any commas vw::Vector3 ned = vw::str_to_vec<vw::Vector3>(ned_str); vw::Vector3 loc_llh = datum.cartesian_to_geodetic(location); vw::Matrix3x3 NedToEcef = datum.lonlat_to_ned_matrix(loc_llh); vw::Vector3 xyz_shift = NedToEcef * ned; Eigen::MatrixXd T = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1); // Append the transform for (int row = 0; row < DIM; row++) T(row, DIM) = xyz_shift[row]; return T; } // Estimate the centroid of the reference points vw::Vector3 estimate_ref_cloud_centroid(Options const& opt, vw::cartography::GeoReference const& geo, CsvConv const& csv_conv, std::string const& reference) { Stopwatch sw; sw.start(); PointMatcherSupport::validateFile(reference); PointMatcher<double>::DataPoints points; double median_longitude = 0.0; // to convert back from xyz to lonlat bool verbose = false; bool calc_shift = false; // won't shift the points vw::Vector3 shift = vw::Vector3(0, 0, 0); vw::BBox2 dummy_box; bool is_lola_rdr_format; // Load a sample of points, hopefully enough to estimate the centroid // reliably. int num_sample_pts = 1000000; load_cloud(reference, num_sample_pts, dummy_box, opt.ref_copc_win, opt.ref_copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, median_longitude, verbose, points); int numRefPts = points.features.cols(); Eigen::VectorXd meanRef = points.features.rowwise().sum() / numRefPts; vw::Vector3 centroid; for (int it = 0; it < 3; it++) centroid[it] = meanRef[it]; sw.stop(); vw_out() << "Centroid estimation took " << sw.elapsed_seconds() << " s\n"; return centroid; } // Intersect the reference and source boxes, making sure to handle well the potential // 360 degree offset among the two. void adjust_and_intersect_ref_source_boxes(BBox2 & ref_box, BBox2 & source_box, std::string const& reference, std::string const& source) { double lon_offset = 0.0; // Compute the longitude offset double source_mean_lon = (source_box.min().x() + source_box.max().x())/2.0; double ref_mean_lon = (ref_box.min().x() + ref_box.max().x())/2.0; lon_offset = source_mean_lon - ref_mean_lon; lon_offset = 360.0*round(lon_offset/360.0); // Move the ref box in the domain of the source box ref_box += Vector2(lon_offset, 0); // Intersect them, as pc_align will operate on their common area ref_box.crop(source_box); source_box.crop(ref_box); // Move back the ref box to its domain ref_box -= Vector2(lon_offset, 0); // Extra adjustments. These are needed since pixel_to_lonlat and // cartesian_to_geodetic can disagree by 360 degrees. Adjust ref // to source and vice-versa. adjust_lonlat_bbox(reference, ref_box); adjust_lonlat_bbox(source, source_box); } // See if we need to estimate the proj win of the source points // based on reference points and max disp. This is needed for COPC // files when this win is not set by the user. void checkNeeForSrcProjWin(Options const& opt, bool & need_src_projwin, vw::cartography::GeoReference & src_georef) { need_src_projwin = false; src_georef = vw::cartography::GeoReference(); if (asp::isCopc(opt.source) && opt.src_copc_win == vw::BBox2() && !opt.src_copc_read_all && opt.max_disp > 0.0) { need_src_projwin = true; // Sanity check bool has_src_georef = asp::georef_from_las(opt.source, src_georef); if (!has_src_georef) vw_throw(ArgumentErr() << "Cannot read the georeference of the source point cloud.\n"); // Need this later when biasing by max_disp if (!src_georef.is_projected()) vw_throw(ArgumentErr() << "The source point cloud is not in projected coordinates. " << "Set the option: --src-copc-win."); } } int main(int argc, char *argv[]) { // Mandatory line for Eigen Eigen::initParallel(); Options opt; try { handle_arguments(argc, argv, opt); // Set the number of threads for OpenMP. int processor_count = std::thread::hardware_concurrency(); omp_set_dynamic(0); omp_set_num_threads(processor_count); // Parse the csv format string and csv projection string asp::CsvConv csv_conv; csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs); // Try to read the georeference/datum info GeoReference geo; std::vector<std::string> clouds; clouds.push_back(opt.reference); clouds.push_back(opt.source); read_georef(clouds, opt.datum, opt.csv_srs, opt.semi_major_axis, opt.semi_minor_axis, opt.csv_format_str, csv_conv, geo); // Use hillshading to create a match file if (opt.hillshading_transform != "" && opt.match_file == "") opt.match_file = find_matches_from_hillshading(opt, argv[0]); // Create a transform based on a match file, either automatically generated, or // user-made (normally with stereo_gui). if (opt.match_file != "") { if (opt.hillshading_transform == "") opt.hillshading_transform = "similarity"; opt.init_transform = initial_transform_from_match_file(opt.reference, opt.source, opt.match_file, opt.hillshading_transform, opt.initial_transform_ransac_params); } // See if to apply an initial north-east-down translation relative // to the point cloud centroid, and/or a rotation around the axis // going from the planet center to the centroid. The rotation // happens first. if (opt.initial_rotation_angle != 0 || opt.initial_ned_translation != "") { vw::Vector3 centroid = estimate_ref_cloud_centroid(opt, geo, csv_conv, opt.reference); // Ignore any other initializations so far opt.init_transform = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1); // Form the rotation around the axis Eigen::Vector3d axis(centroid[0], centroid[1], centroid[2]); axis.normalize(); Eigen::Matrix3d rot = Eigen::AngleAxisd(opt.initial_rotation_angle * M_PI/180.0, axis).matrix(); opt.init_transform.block(0, 0, DIM, DIM) = rot; // The NED translation if (opt.initial_ned_translation != "") opt.init_transform = ned_to_cartesian_transform(geo.datum(), opt.initial_ned_translation, centroid) * opt.init_transform; } // Find the intersection of ref and source bounding boxs. This does not need // a lot of samples as it is expanded by max_disp in either case. BBox2 ref_box, source_box, trans_ref_box, trans_source_box; if (!opt.skip_shared_box_estimation) { Stopwatch sw0; sw0.start(); int num_sample_pts = std::max(4000000, std::max(opt.max_num_source_points, opt.max_num_reference_points)/4); num_sample_pts = std::min(1.0e+6, 1.0 * num_sample_pts); // avoid being slow // Compute GDC bounding box of the source and reference clouds. vw_out() << "Computing the bounding boxes of the reference and source points using " << num_sample_pts << " sample points.\n"; // See if we have to estimate the proj win of the src points bool need_src_projwin = false, dummy_flag = false; vw::cartography::GeoReference src_georef, dummy_georef; vw::BBox2 src_projwin, dummy_projwin; checkNeeForSrcProjWin(opt, need_src_projwin, src_georef); Eigen::MatrixXd inv_init_trans = opt.init_transform.inverse(); calc_extended_lonlat_bbox(geo, num_sample_pts, csv_conv, opt.reference, opt.max_disp, inv_init_trans, opt.ref_copc_win, opt.ref_copc_read_all, need_src_projwin, src_georef, ref_box, trans_ref_box, src_projwin); // outputs if (need_src_projwin) { opt.src_copc_win = src_projwin; vw::vw_out() << "Estimated: --src-copc-win " << opt.src_copc_win.min().x() << " " << opt.src_copc_win.min().y() << " " << opt.src_copc_win.max().x() << " " << opt.src_copc_win.max().y() << "\n"; } calc_extended_lonlat_bbox(geo, num_sample_pts, csv_conv, opt.source, opt.max_disp, opt.init_transform, opt.src_copc_win, opt.src_copc_read_all, dummy_flag, dummy_georef, source_box, trans_source_box, dummy_projwin); // outputs sw0.stop(); vw_out() << "Computation of bounding boxes took " << sw0.elapsed_seconds() << " s\n"; // When boxes are huge, it is hard to do the optimization of intersecting // them, as they may differ not by 0 or 360, but by 180. Better do nothing // in that case. The solution may degrade a bit, as we may load points // not in the intersection of the boxes, but at least it won't be wrong. // In this case, there is a chance the boxes were computed wrong anyway. if (ref_box.width() > 180.0 || source_box.width() > 180.0) { vw_out() << "Warning: Your input point clouds are spread over more than half " << "the planet. It is suggested that they be cropped, to get more " << "accurate results. Giving up on estimating their bounding boxes " << "and filtering outliers based on them.\n"; ref_box = BBox2(); source_box = BBox2(); } // This is useful to point out issues when the reference and source // boxes are shifted by 360 degrees relative to each other. vw_out() << "Reference points box: " << ref_box << "\n"; vw_out() << "Source points box: " << source_box << "\n"; if (!ref_box.empty() && !source_box.empty()) { adjust_and_intersect_ref_source_boxes(ref_box, trans_source_box, opt.reference, opt.source); adjust_and_intersect_ref_source_boxes(trans_ref_box, source_box, opt.reference, opt.source); } if (ref_box == source_box) { // Leave some space here to align the text to the earlier printouts vw_out() << "Intersection box: " << ref_box << "\n"; } else { // This can happen when the projections are offset by 360 degrees vw_out() << "Intersection reference box: " << ref_box << "\n"; vw_out() << "Intersection source box: " << source_box << "\n"; } } // Load the point clouds. We will shift both point clouds by the // centroid of the first one to bring them closer to origin. // Load the subsampled reference point cloud. Vector3 shift; bool calc_shift = true; // Shift points so the first point is (0,0,0) bool is_lola_rdr_format = false; // may get overwritten double mean_ref_longitude = 0.0; // may get overwritten double mean_source_longitude = 0.0; // may get overwritten Stopwatch sw1; sw1.start(); DP ref_point_cloud; load_cloud(opt.reference, opt.max_num_reference_points, ref_box, opt.ref_copc_win, opt.ref_copc_read_all, calc_shift, shift, geo, csv_conv, is_lola_rdr_format, mean_ref_longitude, opt.verbose, ref_point_cloud); sw1.stop(); if (opt.verbose) vw_out() << "Loading the reference point cloud took " << sw1.elapsed_seconds() << " s\n"; //ref_point_cloud.save(outputBaseFile + "_ref.vtk"); // So far we shifted by first point in reference point cloud to reduce // the magnitude of all loaded points. Now that we have loaded all // points, shift one more time, to place the centroid of the // reference at the origin. // Note: If this code is ever converting to using floats, // the operation below needs to be re-implemented to be accurate. int numRefPts = ref_point_cloud.features.cols(); Eigen::VectorXd meanRef = ref_point_cloud.features.rowwise().sum() / numRefPts; ref_point_cloud.features.topRows(DIM).colwise() -= meanRef.head(DIM); for (int row = 0; row < DIM; row++) shift[row] += meanRef(row); // Update the shift variable as well as the points if (opt.verbose) vw_out() << "Data shifted internally by subtracting: " << shift << "\n"; // The point clouds are shifted, so shift the initial transform as well. Eigen::MatrixXd shiftInitT = apply_shift(opt.init_transform, shift); // If the reference point cloud came from a DEM, also load the data in DEM format. cartography::GeoReference dem_georef; vw::ImageViewRef<PixelMask<float>> reference_dem_ref; if (opt.use_dem_distances()) { // Load the dem, then wrap it inside an ImageViewRef object. This is done // because the actual DEM type cannot be created without being // initialized. InterpolationReadyDem reference_dem(load_interpolation_ready_dem(opt.reference, dem_georef)); reference_dem_ref.reset(reference_dem); } // Filter the reference and initialize the reference tree double elapsed_time; PM::ICP icp; // libpointmatcher object Stopwatch sw3; if (opt.verbose) vw_out() << "Building the reference cloud tree.\n"; sw3.start(); icp.initRefTree(ref_point_cloud, alignment_method_fallback(opt.alignment_method), opt.highest_accuracy, false /*opt.verbose*/); sw3.stop(); if (opt.verbose) vw_out() << "Reference point cloud processing took " << sw3.elapsed_seconds() << " s\n"; // Load, filter, transform, and resample the source point cloud DP source_point_cloud; processSourceCloud(opt, ref_point_cloud, shiftInitT, dem_georef, geo, csv_conv, source_box, reference_dem_ref, is_lola_rdr_format, mean_source_longitude, icp, shift, source_point_cloud); // output // Make the libpointmatcher error message clearer std::string libpointmatcher_error = "no point to minimize"; std::string pc_align_error = "This likely means that the clouds are too far. Consider increasing the " "--max-displacement value to something somewhat larger than the expected " "length of the displacement that may be needed to align the clouds.\n"; Eigen::MatrixXd beg_errors; try { elapsed_time = compute_registration_error(ref_point_cloud, source_point_cloud, icp, shift, dem_georef, reference_dem_ref, opt, beg_errors); } catch(std::exception const& e) { std::string error = e.what(); if (error.find(libpointmatcher_error) != std::string::npos) error += ".\n" + pc_align_error; // clarify the error vw_throw(ArgumentErr() << error); } calc_stats("Input", beg_errors); if (opt.verbose) vw_out() << "Initial error computation took " << elapsed_time << " s\n"; // Set up the ICP object Stopwatch sw4; sw4.start(); bool verbose = false; Eigen::MatrixXd Id = Eigen::MatrixXd::Identity(DIM + 1, DIM + 1); icp.setParams(opt.out_prefix, opt.num_iter, opt.outlier_ratio, (2.0*M_PI/360.0)*opt.diff_rotation_err, // convert to radians opt.diff_translation_err, alignment_method_fallback(opt.alignment_method), verbose); // Compute the transformation to align the source to reference. // We bypass calling ICP if the user explicitly asks for 0 iterations. Eigen::MatrixXd T = Id; if (opt.num_iter > 0) { if (opt.alignment_method == "nuth") { T = asp::nuthAlignment(opt.reference, opt.source, opt.out_prefix, opt.max_disp, opt.num_iter, opt.num_threads, opt.compute_translation_only, opt.nuth_options); // Nuth does not use the shift, so apply it after it is returned. T = apply_shift(T, shift); } else if (opt.alignment_method == "fgr") { T = fgr_alignment(source_point_cloud, ref_point_cloud, opt.fgr_options); } else if (opt.alignment_method == "point-to-plane" || opt.alignment_method == "point-to-point" || opt.alignment_method == "similarity-point-to-point" || opt.alignment_method == "similarity-point-to-plane") { // Use libpointmatcher try { T = icp(source_point_cloud, ref_point_cloud, Id, opt.compute_translation_only); } catch(std::exception const& e) { std::string error = e.what(); if (error.find(libpointmatcher_error) != std::string::npos) error += ".\n" + pc_align_error; // clarify the error vw_throw(ArgumentErr() << error); } vw_out() << "Match ratio: " << icp.errorMinimizer->getWeightedPointUsedRatio() << "\n"; } else if (opt.alignment_method == "least-squares" || opt.alignment_method == "similarity-least-squares") { // Compute alignment using least squares T = least_squares_alignment(source_point_cloud, shift, dem_georef, reference_dem_ref, opt.alignment_method, opt.num_iter, opt.num_threads); } else vw_throw(ArgumentErr() << "Unknown alignment method: " << opt.alignment_method); } sw4.stop(); if (opt.verbose) vw_out() << "Alignment took " << sw4.elapsed_seconds() << " s\n"; // Transform the source to make it close to reference. DP trans_source_point_cloud(source_point_cloud); apply_transform_to_cloud(T, trans_source_point_cloud); // Calculate by how much points move as result of T double max_obtained_disp = calc_max_displacement(source_point_cloud, trans_source_point_cloud); Vector3 source_ctr_vec, source_ctr_llh; Vector3 trans_xyz, trans_ned, trans_llh; vw::Matrix3x3 NedToEcef; calc_translation_vec(shiftInitT, source_point_cloud, trans_source_point_cloud, shift, geo.datum(), source_ctr_vec, source_ctr_llh, trans_xyz, trans_ned, trans_llh, NedToEcef); // For each point, compute the distance to the nearest reference point. Eigen::MatrixXd end_errors; elapsed_time = compute_registration_error(ref_point_cloud, trans_source_point_cloud, icp, shift, dem_georef, reference_dem_ref, opt, end_errors); calc_stats("Output", end_errors); if (opt.verbose) vw_out() << "Final error computation took " << elapsed_time << " s\n"; // Go back to the original coordinate system, by applying the shifted initial // transform to the shifted computed transform and then undoing the shift. Eigen::MatrixXd globalT = apply_shift(T * shiftInitT, -shift); // Print statistics vw_out() << std::setprecision(16) << "Alignment transform (origin is planet center):\n" << globalT << "\n"; vw_out() << std::setprecision(8); // undo the higher precision vw_out() << "Centroid of source points (Cartesian, meters): " << source_ctr_vec << "\n"; // Swap lat and lon, as we want to print lat first std::swap(source_ctr_llh[0], source_ctr_llh[1]); vw_out() << "Centroid of source points (lat,lon,z): " << source_ctr_llh << "\n"; vw_out() << "\n"; vw_out() << "Translation vector (Cartesian, meters): " << trans_xyz << "\n"; vw_out() << "Translation vector (North-East-Down, meters): " << trans_ned << "\n"; vw_out() << "Translation vector magnitude (meters): " << norm_2(trans_xyz) << "\n"; vw::vw_out() << "Maximum displacement of points between the source " << "cloud with any initial transform applied to it and the " << "source cloud after alignment to the reference: " << max_obtained_disp << " m" << "\n"; if (opt.max_disp > 0 && opt.max_disp < max_obtained_disp) vw_out() << "Warning: The input --max-displacement value is smaller than the " << "final observed displacement. It may be advised to increase the former " << "and rerun the tool.\n"; // Swap lat and lon, as we want to print lat first std::swap(trans_llh[0], trans_llh[1]); vw_out() << "Translation vector (lat,lon,z): " << trans_llh << "\n"; vw_out() << "\n"; Matrix3x3 rot; for (int r = 0; r < DIM; r++) for (int c = 0; c < DIM; c++) rot(r, c) = globalT(r, c); double scale = pow(det(rot), 1.0/3.0); for (int r = 0; r < DIM; r++) for (int c = 0; c < DIM; c++) rot(r, c) /= scale; // Subtract one before printing the scale, to see a lot of digits of precision vw_out() << "Transform scale - 1 = " << (scale-1.0) << "\n"; Matrix3x3 rot_NED = inverse(NedToEcef) * rot * NedToEcef; Vector3 euler_angles = math::rotation_matrix_to_euler_xyz(rot) * 180/M_PI; Vector3 euler_angles_NED = math::rotation_matrix_to_euler_xyz(rot_NED) * 180/M_PI; Vector3 axis_angles = math::matrix_to_axis_angle(rot) * 180/M_PI; vw_out() << "Euler angles (degrees): " << euler_angles << "\n"; vw_out() << "Euler angles (North-East-Down, degrees): " << euler_angles_NED << "\n"; vw_out() << "Axis of rotation and angle (degrees): " << axis_angles/norm_2(axis_angles) << ' ' << norm_2(axis_angles) << "\n"; Stopwatch sw5; sw5.start(); write_transforms(opt, globalT); if (opt.save_trans_ref) { std::string trans_ref_prefix = opt.out_prefix + "-trans_reference"; save_trans_point_cloud(opt, opt.reference, trans_ref_prefix, opt.ref_copc_win, opt.ref_copc_read_all, geo, csv_conv, globalT.inverse()); } if (opt.save_trans_source) { std::string trans_source_prefix = opt.out_prefix + "-trans_source"; save_trans_point_cloud(opt, opt.source, trans_source_prefix, opt.src_copc_win, opt.src_copc_read_all, geo, csv_conv, globalT); } save_errors(source_point_cloud, beg_errors, opt.out_prefix + "-beg_errors.csv", shift, geo, csv_conv, is_lola_rdr_format, mean_source_longitude); save_errors(trans_source_point_cloud, end_errors, opt.out_prefix + "-end_errors.csv", shift, geo, csv_conv, is_lola_rdr_format, mean_source_longitude); if (opt.verbose) vw_out() << "Writing: " << opt.out_prefix + "-iterationInfo.csv" << "\n"; sw5.stop(); if (opt.verbose) vw_out() << "Saving to disk took " << sw5.elapsed_seconds() << " s\n"; } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/pc_filter.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file pc_filter.cc. /// Apply some filtering operations to a point cloud. // TODO(oalexan1): Add ability to remove blobs // Add median filter based on a window of given size and threshold. // Make it apply a blur and fill in from neighbors // See if saving .pcd as binary will speed up voxblox // Save weight image via --weight-image // Save the computed weight for each cloud point. // Replace max_camera_dir_to_camera_ray_angle with // --max-horizontal-camera-dir-to-camera-ray-angle // --max-vertical-camera-dir-to-camera-ray-angle #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/EigenUtils.h> #include <asp/PclIO/PclIO.h> #include <asp/Core/PointUtils.h> #include <asp/Core/PointCloudRead.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/MatrixIO.h> #include <vw/Image/DistanceFunction.h> #include <vw/Camera/PinholeModel.h> #include <vw/Cartography/GeoReference.h> #include <vw/FileIO/FileUtils.h> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <limits> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options: vw::GdalWriteOptions { bool transform_to_camera_coordinates; std::string input_cloud, input_texture, output_cloud, output_weight, camera_file; double max_valid_triangulation_error, max_distance_from_camera, max_camera_ray_to_surface_normal_angle, max_camera_dir_to_surface_normal_angle, max_camera_dir_to_camera_ray_angle, reliable_surface_resolution, distance_from_camera_weight_power, blending_dist, blending_power; // The class members will be initialized when parsing happens Options() {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options("General options"); general_options.add_options() ("input-cloud", po::value(&opt.input_cloud)->default_value(""), "Input cloud name. A four-band .tif file as produced by stereo triangulation.") ("output-cloud", po::value(&opt.output_cloud)->default_value(""), "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.") ("input-texture", po::value(&opt.input_texture)->default_value(""), "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.") ("camera", po::value(&opt.camera_file)->default_value(""), "The left or right camera used to produce this cloud. Used for some filtering operations.") ("max-distance-from-camera", po::value(&opt.max_distance_from_camera)->default_value(0), "If positive, remove points further from camera center than this value. Measured in meters.") ("max-valid-triangulation-error", po::value(&opt.max_valid_triangulation_error)->default_value(0), "If positive, points with triangulation error larger than this will be removed from the cloud. Measured in meters.") ("max-camera-ray-to-surface-normal-angle", po::value(&opt.max_camera_ray_to_surface_normal_angle)->default_value(0), "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.") ("max-camera-dir-to-surface-normal-angle", po::value(&opt.max_camera_dir_to_surface_normal_angle)->default_value(0), "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.") ("max-camera-dir-to-camera-ray-angle", po::value(&opt.max_camera_dir_to_camera_ray_angle)->default_value(0), "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.") ("distance-from-camera-weight-power", po::value(&opt.distance_from_camera_weight_power)->default_value(0), "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.") ("blending-dist", po::value(&opt.blending_dist)->default_value(0.0), "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.") ("blending-power", po::value(&opt.blending_power)->default_value(1.0), "Use this as the power when setting --blending-dist.") ("reliable-surface-resolution", po::value(&opt.reliable_surface_resolution)->default_value(0), "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.") ("transform-to-camera-coordinates", po::bool_switch(&opt.transform_to_camera_coordinates)->default_value(false), "Transform the point cloud to the coordinate system of the camera provided with --camera. For use with VoxBlox.") ("output-weight", po::value(&opt.output_weight)->default_value(""), "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.)"); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("--input-cloud input.tif --output-cloud output.tif [other options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Validation if ((opt.transform_to_camera_coordinates || opt.max_camera_ray_to_surface_normal_angle > 0 || opt.max_camera_dir_to_surface_normal_angle > 0 || opt.max_camera_dir_to_camera_ray_angle > 0) && opt.camera_file.empty()) vw_throw(ArgumentErr() << "Some of the requested operations require " << "a camera model specified via --camera."); if (opt.input_cloud.empty() || opt.output_cloud.empty()) vw_throw(ArgumentErr() << "The input and output point clouds must be specified."); if (opt.blending_dist > 0 && opt.blending_power <= 0) vw_throw(ArgumentErr() << "When setting --blending-dist, a " << "positive value of blending power must be used."); // Create the output directory vw::create_out_dir(opt.output_cloud); // Turn on logging to file std::string prog_name = asp::extract_prog_name(argv[0]); asp::log_to_file(argc, argv, "", opt.output_cloud); return; } // Apply a rigid transforms to a point cloud in-place. Points at // origin are considered outliers and are unchanged. void applyAffineTransform(ImageView<Vector<double, 4>> & pc, vw::Matrix<double> const& T) { if (T.rows() != 4 && T.cols() != 4 && T(3, 3) != 1.0) vw_throw(ArgumentErr() << "Expecting a 4x4 affine transform."); for (int col = 0; col < pc.cols(); col++) { for (int row = 0; row < pc.rows(); row++) { if (subvector(pc(col, row), 0, 3) == Vector3()) continue; // outlier // Create homogeneous coordinates Vector<double, 4> Q; subvector(Q, 0, 3) = subvector(pc(col, row), 0, 3); Q[3] = 1; // Apply transform Q = T * Q; // Copy back subvector(pc(col, row), 0, 3) = subvector(Q, 0, 3); } } } // Find the surface normal at a given pixel based on the 3x3 neighborhood. // Return true on success. bool surfaceNormal(ImageView<Vector<double, 4>> const& point_image, int col, int row, Vector3 & N) { // Initialize the output N = Vector3(); // Find the nearby points std::vector<Eigen::Vector3d> near_points; for (int c = col - 1; c <= col + 1; c++) { for (int r = row - 1; r <= row + 1; r++) { if (c < 0 || c >= point_image.cols()) continue; if (r < 0 || r >= point_image.rows()) continue; Vector<double, 4> const& Q = point_image(c, r); if (Q == Vector<double, 4>()) continue; // outlier near_points.push_back(Eigen::Vector3d(Q[0], Q[1], Q[2])); } } if (near_points.size() < 5) return false; Eigen::Vector3d plane_normal, centroid; asp::bestFitPlane(near_points, centroid, plane_normal); N = Vector3(plane_normal[0], plane_normal[1], plane_normal[2]); if (N != N) return false; // NaN return true; } // Estimate surface resolution by looking at four immediate neighbors. // Return 0 if at least 2 neighbors are missing or the current point. void estimate_surface_res(ImageView<Vector<double, 4>> const& point_image, ImageView<float> & surface_res) { int offset_x[] = {-1, 0, 0, 1}; int offset_y[] = {0, -1, 1, 0}; surface_res = ImageView<float>(point_image.cols(), point_image.rows()); for (int col = 0; col < surface_res.cols(); col++) { for (int row = 0; row < surface_res.rows(); row++) { surface_res(col, row) = 0.0; Vector<double, 4> const& P = point_image(col, row); // alias if (P == Vector<double, 4>()) continue; // outlier int count = 0; double dist = 0.0; for (int it = 0; it < 4; it++) { int c = col + offset_x[it]; int r = row + offset_y[it]; if (c < 0 || c >= point_image.cols()) continue; if (r < 0 || r >= point_image.rows()) continue; Vector<double, 4> const& Q = point_image(c, r); // alias if (Q == Vector<double, 4>()) continue; // outlier dist = std::max(dist, norm_2(subvector(P, 0, 3) - subvector(Q, 0, 3))); count++; } if (count < 3) continue; // too few neighbors surface_res(col, row) = dist; } } } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); // For now only 4 channels are supported // TODO(oalexan1): Support also 3 channels int num_channels = get_num_channels(opt.input_cloud); if (num_channels != 4) vw_throw(ArgumentErr() << "The input point cloud must have 4 channels."); std::string ext = fs::path(opt.output_cloud).extension().string(); boost::algorithm::to_lower(ext); if (ext != ".tif" && ext != ".pcd" && ext != ".ply") vw_throw(ArgumentErr() << "The output point cloud extension must be .tif, .pcd, or .ply."); // Read the point cloud fully in memory, and remove any offset ImageView<Vector<double, 4>> point_image = asp::read_asp_point_cloud_4(opt.input_cloud); std::cout << "Read point cloud: " << opt.input_cloud << std::endl; // Load the texture or set it to 1 ImageView<float> texture; bool has_texture_nodata = false; float texture_nodata = -32768.0; if (opt.input_texture != "") { std::cout << "Read texture file: " << opt.input_texture << std::endl; texture = DiskImageView<float>(opt.input_texture); if (vw::read_nodata_val(opt.input_texture, texture_nodata)) { has_texture_nodata = true; std::cout << "Read texture nodata value: " << texture_nodata << std::endl; } } else { texture = ImageView<float>(point_image.cols(), point_image.rows()); for (int col = 0; col < texture.cols(); col++) { for (int row = 0; row < texture.rows(); row++) { texture(col, row) = 1.0; } } } // Sanity check if (point_image.cols() != texture.cols() || point_image.rows() != texture.rows()) vw_throw(ArgumentErr() << "The input point cloud and texture must have the same dimensions."); // Load the camera vw::camera::PinholeModel cam; vw::Matrix<double> cam2world = vw::math::identity_matrix(4); if (opt.camera_file != "") { vw_out() << "Reading camera mode: " << opt.camera_file << "\n"; cam = vw::camera::PinholeModel(opt.camera_file); vw::math::submatrix(cam2world, 0, 0, 3, 3) = cam.get_rotation_matrix(); for (int row = 0; row < 3; row++) cam2world(row, 3) = cam.camera_center()[row]; vw_out() << "Camera-to-world transform: " << cam2world << "\n"; } vw::Matrix<double> world2cam = inverse(cam2world); // Transform the cloud to camera coordinates (if world2cam is read) applyAffineTransform(point_image, world2cam); ImageView<float> weight(point_image.cols(), point_image.rows()); ImageView<float> out_texture(point_image.cols(), point_image.rows()); ImageView<Vector<double, 4>> clean_points(point_image.cols(), point_image.rows()); for (int col = 0; col < point_image.cols(); col++) { for (int row = 0; row < point_image.rows(); row++) { weight(col, row) = 0.0; out_texture(col, row) = 0.0; clean_points(col, row) = Vector<double, 4>(); } } ImageView<float> surface_res; if (opt.reliable_surface_resolution > 0) estimate_surface_res(point_image, surface_res); // Camera direction, in camera's coordinate system Vector3 cam_dir(0.0, 0.0, 1.0); for (int col = 0; col < point_image.cols(); col++) { for (int row = 0; row < point_image.rows(); row++) { Vector<double, 4> const& P = point_image(col, row); // alias if (subvector(P, 0, 3) == Vector3() || (has_texture_nodata && texture(col, row) == texture_nodata) || (opt.max_valid_triangulation_error > 0 && P[3] > opt.max_valid_triangulation_error)) { continue; // outlier } // The first 3 coordinates of P Vector3 Q = subvector(P, 0, 3); if (opt.max_distance_from_camera > 0 && norm_2(Q) > opt.max_distance_from_camera) { continue; // outlier } // All points are given equal weight for now double wt = 1.0; if (opt.distance_from_camera_weight_power > 0) { double dist = norm_2(Q); if (dist == 0.0) continue; // outlier wt = 1.0 / pow(dist, opt.distance_from_camera_weight_power); } if (opt.max_camera_ray_to_surface_normal_angle > 0 || opt.max_camera_dir_to_surface_normal_angle > 0) { // Find the surface normal Vector3 N; if (!surfaceNormal(point_image, col, row, N)) continue; // outlier if (opt.max_camera_ray_to_surface_normal_angle > 0) { // Use abs as the normal can point in either direction double prod = std::abs(dot_prod(Q, N) / norm_2(Q) / norm_2(N)); double angle = acos(prod) * (180.0 / M_PI); if (std::isnan(angle) || std::isinf(angle) || angle > opt.max_camera_ray_to_surface_normal_angle) continue; // something went wrong } else if (opt.max_camera_dir_to_surface_normal_angle > 0) { double prod = std::abs(dot_prod(cam_dir, N) / norm_2(cam_dir) / norm_2(N)); double angle = acos(prod) * (180.0 / M_PI); if (std::isnan(angle) || std::isinf(angle) || angle > opt.max_camera_dir_to_surface_normal_angle) continue; // something went wrong } } if (opt.max_camera_dir_to_camera_ray_angle > 0) { double prod = std::abs(dot_prod(Q, cam_dir)/ norm_2(Q) / norm_2(cam_dir)); double angle = acos(prod) * (180.0 / M_PI); if (std::isnan(angle) || std::isinf(angle)) continue; // something went wrong if (angle > opt.max_camera_dir_to_camera_ray_angle) continue; // outlier } // The input texture is usually between 0 and 1. // TODO(oalexan1): What is the max color? double t = 255.0 * texture(col, row); if (t <= 0.0) t = 1.0; // Ensure a positive value for the color // Note how we add back the triangulation error clean_points(col, row) = Vector<double, 4>(Q[0], Q[1], Q[2], P[3]); out_texture(col, row) = t; weight(col, row) = wt; } } if (opt.blending_dist > 0 && opt.blending_power > 0) { ImageView<int> mask(clean_points.cols(), clean_points.rows()); for (int col = 0; col < clean_points.cols(); col++) { for (int row = 0; row < clean_points.rows(); row++) { mask(col, row) = (subvector(clean_points(col, row), 0, 3) != Vector3()); } } ImageView<double> dist; vw::bounded_dist(mask, opt.blending_dist, dist); // Adjust the weight by the normalized distance raised to given power for (int col = 0; col < dist.cols(); col++) { for (int row = 0; row < dist.rows(); row++) { dist(col, row) = pow(dist(col, row) / opt.blending_dist, opt.blending_power); weight(col, row) *= dist(col, row); } } } if (opt.reliable_surface_resolution > 0) { for (int col = 0; col < weight.cols(); col++) { for (int row = 0; row < weight.rows(); row++) { if (weight(col, row) <= 0) continue; if (surface_res(col, row) <= 0) { weight(col, row) = 0.0; continue; } weight(col, row) *= exp(-surface_res(col, row) / opt.reliable_surface_resolution); } } } if (!opt.transform_to_camera_coordinates) applyAffineTransform(clean_points, cam2world); // convert back to world // Save as .tif, .pcd, or .pcl if (ext == ".tif") { vw::cartography::GeoReference georef; bool has_georef = vw::cartography::read_georeference(georef, opt.input_cloud); bool has_nodata = false; double nodata = 0.0; vw_out() << "Writing: " << opt.output_cloud << "\n"; vw::cartography::block_write_gdal_image (opt.output_cloud, clean_points, has_georef, georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Filter: ")); } else { asp::writeCloud(clean_points, out_texture, weight, opt.output_cloud); } if (opt.output_weight != "") { vw::cartography::GeoReference georef; bool has_georef = false; bool has_nodata = false; double nodata = 0; vw_out() << "Writing weights: " << opt.output_weight << "\n"; vw::cartography::block_write_gdal_image (opt.output_weight, weight, has_georef, georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Weight per point:")); } return 0; } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/pc_merge.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file pc_merge.cc /// /// A simple tool to merge multiple point cloud files into a single file. The clouds /// can have 1 channel (plain raster images) or 3 to 6 channels. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/PointUtils.h> #include <asp/Core/OrthoRasterizer.h> #include <asp/Core/GdalUtils.h> #include <vw/Core/Stopwatch.h> #include <vw/Mosaic/ImageComposite.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Cartography/PointImageManipulation.h> #include <vw/FileIO/FileUtils.h> #include <limits> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options : vw::GdalWriteOptions { // Input std::vector<std::string> pointcloud_files; // Settings bool write_double; ///< If true, output file is double instead of float // Output std::string out_file; Options() : write_double(false) {} }; void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options("General Options"); general_options.add_options() ("output-file,o", po::value(&opt.out_file)->default_value(""), "Specify the output file.") ("write-double,d", po::value(&opt.write_double)->default_value(false), "Write a double precision output file."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("input-files", po::value< std::vector<std::string> >(), "Input files"); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("[options] <point-clouds> "); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); if (vm.count("input-files") == 0) vw_throw( ArgumentErr() << "Missing input point clouds.\n" << usage << general_options ); opt.pointcloud_files = vm["input-files"].as< std::vector<std::string> >(); if (opt.out_file == "") vw_throw( ArgumentErr() << "The output file must be specified!\n" << usage << general_options ); vw::create_out_dir(opt.out_file); } /// Throws if the input point clouds do not have the same number of channels. /// - Returns the number of channels. int check_num_channels(std::vector<std::string> const& pc_files){ VW_ASSERT(pc_files.size() >= 1, ArgumentErr() << "Expecting at least one file.\n"); int target_num = get_num_channels(pc_files[0]); for (int i = 1; i < (int)pc_files.size(); ++i){ int num_channels = get_num_channels(pc_files[i]); if (num_channels != target_num) vw_throw( ArgumentErr() << "Input point clouds must all have the same number of channels!.\n" ); } return target_num; } /// Determine the common shift value to use for the output files Vector3 determine_output_shift(std::vector<std::string> const& pc_files, Options const& opt){ // If writing to double format, no shift is needed. if (opt.write_double) return Vector3(0,0,0); // As an approximation, compute the mean shift vector of the input files. // - If none of the input files have a shift, the output file will be written as a double. vw::Vector3 shift(0,0,0), shiftIn; double shift_count = 0; for (size_t i=0; i<pc_files.size(); ++i) { // Read in the shift from each cloud and accumulate them std::string shift_str; boost::shared_ptr<vw::DiskImageResource> rsrc(new vw::DiskImageResourceGDAL(pc_files[i])); if (vw::cartography::read_header_string(*rsrc.get(), asp::ASP_POINT_OFFSET_TAG_STR, shift_str)) { //std::cout << "shift string = " << shift_str << std::endl; shift += vw::str_to_vec<vw::Vector3>(shift_str); shift_count += 1.0; } } if (shift_count < 0.9) // If no shifts read, don't use a shift. return Vector3(0,0,0); // Compute the mean shift // - It would be more accurate to weight the shift according to the number of input points shift /= shift_count; return shift; } // Do the actual work of loading, merging, and saving the point clouds // Case 1: Single-channel cloud. template <class PixelT> typename boost::enable_if<boost::is_same<PixelT, vw::PixelGray<float> >, void >::type do_work(Vector3 const& shift, Options const& opt) { // The spacing is selected to be compatible with the point2dem convention. const int spacing = ASP_MAX_SUBBLOCK_SIZE; ImageViewRef<PixelT> merged_cloud = asp::form_point_cloud_composite<PixelT>(opt.pointcloud_files, spacing); vw_out() << "Writing image: " << opt.out_file << "\n"; bool has_georef = false; bool has_nodata = false; double nodata = -std::numeric_limits<float>::max(); // smallest float GeoReference georef; vw::cartography::block_write_gdal_image(opt.out_file, merged_cloud, has_georef, georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Merging: ")); } // Case 2: Multi-channel cloud. template <class PixelT> typename boost::disable_if<boost::is_same<PixelT, vw::PixelGray<float> >, void >::type do_work(Vector3 const& shift, Options const& opt) { // The spacing is selected to be compatible with the point2dem convention. const int spacing = ASP_MAX_SUBBLOCK_SIZE; ImageViewRef<PixelT> merged_cloud = asp::form_point_cloud_composite<PixelT>(opt.pointcloud_files, spacing); // See if we can pull a georeference from somewhere. Of course it will be wrong // when applied to the merged cloud, but it will at least have the correct datum // and projection. bool has_georef = false; cartography::GeoReference georef; for (size_t i = 0; i < opt.pointcloud_files.size(); i++){ cartography::GeoReference local_georef; if (read_georeference(local_georef, opt.pointcloud_files[i])){ georef = local_georef; has_georef = true; } } bool has_nodata = false; double nodata = -std::numeric_limits<float>::max(); // smallest float vw_out() << "Writing point cloud: " << opt.out_file << "\n"; // If shift != zero then this will cast the output data to type float. // Otherwise it will keep its data type. double point_cloud_rounding_error = 0.0; asp::block_write_approx_gdal_image(opt.out_file, shift, point_cloud_rounding_error, merged_cloud, has_georef, georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Merging: ")); } //----------------------------------------------------------------------------------- int main( int argc, char *argv[] ) { Options opt; try { handle_arguments( argc, argv, opt ); // Determine the number of channels int num_channels = check_num_channels(opt.pointcloud_files); // Determine the output shift (if any) Vector3 shift = determine_output_shift(opt.pointcloud_files, opt); // The code has to branch here depending on the number of channels switch (num_channels) { // The input point clouds have their shift incorporated and are stored as doubles. // If the output file is stored as float, it needs to have a single shift value applied. case 1: do_work< vw::PixelGray<float> >(shift, opt); break; case 3: do_work<Vector3>(shift, opt); break; case 4: do_work<Vector4>(shift, opt); break; case 6: do_work<Vector6>(shift, opt); break; default: vw_throw( ArgumentErr() << "Unsupported number of channels!.\n" ); } } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/point2dem.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file point2dem.cc // #include <asp/Core/PointToDem.h> #include <asp/Core/PointUtils.h> #include <asp/Core/OrthoRasterizer.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/OutlierProcessing.h> #include <asp/Core/PointCloudProcessing.h> #include <vw/Image/InpaintView.h> #include <vw/Core/Stopwatch.h> #include <vw/Core/StringUtils.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Mosaic/ImageComposite.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Math/EulerAngles.h> #include <vw/Cartography/PointImageManipulation.h> #include <vw/Cartography/DatumUtils.h> #include <vw/Core/StringUtils.h> #include <vw/FileIO/FileUtils.h> #include <pdal/PDALUtils.hpp> #include <boost/math/special_functions/fpclassify.hpp> #include <limits> using namespace vw; using namespace asp; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; /// To help with compression, round to about 1mm, but /// use for rounding a number with few digits in binary. const double APPROX_ONE_MM = 1.0/1024.0; void handle_arguments(int argc, char *argv[], DemOptions& opt) { std::string dem_spacing1, dem_spacing2; double nan = std::numeric_limits<double>::quiet_NaN(); po::options_description manipulation_options("Manipulation options"); manipulation_options.add_options() ("x-offset", po::value(&opt.lon_offset)->default_value(0), "Add a longitude offset (in degrees) to the DEM.") ("y-offset", po::value(&opt.lat_offset)->default_value(0), "Add a latitude offset (in degrees) to the DEM.") ("z-offset", po::value(&opt.height_offset)->default_value(0), "Add a vertical offset (in meters) to the DEM."); po::options_description projection_options("Projection options"); projection_options.add_options() ("t_srs", po::value(&opt.target_srs_string)->default_value(""), "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.") ("t_projwin", po::value(&opt.target_projwin), "Specify a custom extent in georeferenced coordinates. This will be adjusted " "to ensure that the grid points are placed at integer multiples of the grid " "size, unless --gdal-tap is on.") ("dem-spacing,s", po::value(&dem_spacing1)->default_value(""), "Set output DEM resolution (in target georeferenced units per pixel). These units may " "be in meters or degrees, depending on the projection. If not specified, it will be " "computed automatically (except for LAS and CSV files). Multiple spacings can be set " "(in quotes) to generate multiple output files. This is the same as the --tr option.") ("tr", po::value(&dem_spacing2)->default_value(""), "This is identical to the --dem-spacing option.") ("gdal-tap", po::bool_switch(&opt.gdal_tap)->default_value(false), "Ensure that the bounds of output products (as printed by gdalinfo) are integer " "multiples of the grid size (as set with --tr). This implies that the centers of " "output pixels are offset by 0.5 times the grid size. When --t_projwin is set and its " "entries are integer multiples of the grid size, that precise extent will be produced " "on output. This functions as the GDAL -tap option.") ("datum", po::value(&opt.datum)->default_value(""), "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).") ("reference-spheroid,r", po::value(&opt.reference_spheroid)->default_value(""), "This is identical to the datum option.") ("semi-major-axis", po::value(&opt.semi_major)->default_value(0), "Explicitly set the datum semi-major axis in meters.") ("semi-minor-axis", po::value(&opt.semi_minor)->default_value(0), "Explicitly set the datum semi-minor axis in meters.") ("sinusoidal", "Save using a sinusoidal projection.") ("mercator", "Save using a Mercator projection.") ("transverse-mercator", "Save using a transverse Mercator projection.") ("orthographic", "Save using an orthographic projection.") ("stereographic", "Save using a stereographic projection. See also --auto-proj-center.") ("oblique-stereographic", "Save using an oblique stereographic projection.") ("gnomonic", "Save using a gnomonic projection.") ("lambert-azimuthal", "Save using a Lambert azimuthal projection.") ("utm", po::value(&opt.utm_zone), "Save using a UTM projection with the given zone.") ("geographic", "Save using the geographic projection (longitude and latitude). " "Recommended only close to the equator.") ("proj-lon", po::value(&opt.proj_lon)->default_value(nan), "The center of projection longitude. If not specified, it will be computed " "automatically based on the estimated point cloud median.") ("proj-lat", po::value(&opt.proj_lat)->default_value(nan), "The center of projection latitude. See also --proj-lon.") ("proj-scale", po::value(&opt.proj_scale)->default_value(1), "The projection scale (if applicable).") ("false-easting", po::value(&opt.false_easting)->default_value(0), "The projection false easting (if applicable).") ("false-northing", po::value(&opt.false_northing)->default_value(0), "The projection false northing (if applicable).") ("auto-proj-center", po::bool_switch(&opt.auto_proj_center)->default_value(false), "Automatically compute the projection center, unless --proj-lon and --proj-lat " "are set. This is now the default, so this option is obsolete."); po::options_description general_options("General options"); general_options.add_options() ("nodata-value", po::value(&opt.nodata_value)->default_value(-1e+6), "Set the nodata value.") ("use-alpha", po::bool_switch(&opt.has_alpha)->default_value(false), "Create images that have an alpha channel.") ("normalized,n", po::bool_switch(&opt.do_normalize)->default_value(false), "Also write a normalized version of the DEM (for debugging).") ("orthoimage", po::bool_switch(&opt.do_ortho)->default_value(false), "Write an orthoimage based on the texture files passed in as inputs " "(after the point clouds).") ("output-prefix,o", po::value(&opt.out_prefix), "Specify the output prefix.") ("output-filetype,t", po::value(&opt.output_file_type)->default_value("tif"), "Specify the output file.") ("errorimage", po::bool_switch(&opt.do_error)->default_value(false), "Write an additional image, whose values represent the triangulation ray " "intersection error in meters (the closest distance between the rays " "emanating from the two cameras corresponding to the same point on the " "ground). Filename is <output prefix>-IntersectionErr.tif. If stereo " "triangulation was done with the option --compute-error-vector, this " "intersection error will instead have 3 bands, corresponding to the " "coordinates of that vector, unless the option --scalar-error is set.") ("scalar-error", po::bool_switch(&opt.scalar_error)->default_value(false), "If the point cloud has a vector triangulation error, ensure that " "the intersection error produced by this program is the rasterized " "norm of that vector. See also --error-image.") ("dem-hole-fill-len", po::value(&opt.dem_hole_fill_len)->default_value(0), "Maximum dimensions of a hole in the output DEM to fill in, in pixels.") ("orthoimage-hole-fill-len", po::value(&opt.ortho_hole_fill_len)->default_value(0), "Maximum dimensions of a hole in the output orthoimage to fill in, in pixels.") ("orthoimage-hole-fill-extra-len", po::value(&opt.ortho_hole_fill_extra_len)->default_value(0), "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.") ("remove-outliers", po::bool_switch(&opt.remove_outliers_with_pct)->default_value(true), "Turn on outlier removal based on percentage of triangulation error. Obsolete, as this is the default.") ("remove-outliers-params", po::value(&opt.remove_outliers_params)->default_value(Vector2(75.0, 3.0), "pct factor"), "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]") ("use-tukey-outlier-removal", po::bool_switch(&opt.use_tukey_outlier_removal)->default_value(false)->implicit_value(true), "Remove outliers above Q3 + 1.5*(Q3 - Q1). Takes precedence over " "--remove-outliers-params.") ("max-valid-triangulation-error", po::value(&opt.max_valid_triangulation_error)->default_value(0), "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.") ("max-output-size", po::value(&opt.max_output_size)->default_value(Vector2(9999999, 9999999)), "Don't write the output DEM if it is calculated to be this size or greater.") ("median-filter-params", po::value(&opt.median_filter_params)->default_value(Vector2(0, 0), "window_size threshold"), "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.") ("erode-length", po::value<int>(&opt.erode_len)->default_value(0), "Erode input point clouds by this many pixels at boundary (after outliers are removed, but before filling in holes).") ("csv-format", po::value(&opt.csv_format_str)->default_value(""), asp::csv_opt_caption().c_str()) ("csv-srs", po::value(&opt.csv_srs)->default_value(""), "The projection string to use to interpret the entries in input CSV files. If not set, --t_srs will be used.") ("filter", po::value(&opt.filter)->default_value("weighted_average"), "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.") ("rounding-error", po::value(&opt.rounding_error)->default_value(APPROX_ONE_MM), "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.") ("search-radius-factor", po::value(&opt.search_radius_factor)->default_value(0.0), "Multiply this factor by --dem-spacing to get the search radius. The " "DEM height at a given grid point is obtained as the weighted average of heights " "of all points in the cloud within search radius of the grid point, with the " "weight given by the Gaussian of the distance from the grid point to the cloud " "point (see --gaussian-sigma-factor). If not specified, the default search radius " "is the maximum of user-set --dem-spacing and internally estimated median DEM " "spacing, so the default factor is about 1.") ("gaussian-sigma-factor", po::value(&opt.sigma_factor)->default_value(0.0), "The value s to be used in the Gaussian exp(-s*(x/grid_size)^2) when computing the " "weight to give to a cloud point contribution to a given DEM grid point, " "with x the distance in meters between the two. The default is -log(0.25) = 1.3863. " "A smaller value will result in a smoother terrain.") ("default-grid-size-multiplier", po::value(&opt.default_grid_size_multiplier)->default_value(1.0), "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.") ("propagate-errors", po::bool_switch(&opt.propagate_errors)->default_value(false), "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.") ("no-dem", po::bool_switch(&opt.no_dem)->default_value(false), "Skip writing a DEM.") ("input-is-projected", po::bool_switch(&opt.input_is_projected)->default_value(false), "Input data is already in projected coordinates, or is a point cloud in Cartesian " "coordinates that is small in extent. See the doc for more info.") ("csv-proj4", po::value(&opt.csv_proj4_str)->default_value(""), "An alias for --csv-srs, for backward compatibility.") ("copc-win", po::value(&opt.copc_win)->default_value(vw::BBox2()), "Specify the region to read from a COPC LAZ file. The units are based the projection " "in the file. This is required unless --copc-read-all is set. Specify as minx miny " "maxx maxy, or minx maxy maxx miny, with no quotes.") ("copc-read-all", po::bool_switch(&opt.copc_read_all)->default_value(false), "Read the full COPC file, ignoring the --copc-win option.") ; general_options.add(manipulation_options); general_options.add(projection_options); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("input-files", po::value<std::vector<std::string>>(), "Input files"); po::positional_options_description positional_desc; positional_desc.add("input-files", -1); std::string usage("[options] <point-clouds> [ --orthoimage <textures> ]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (vm.count("input-files") == 0) vw_throw(ArgumentErr() << "Missing input point clouds.\n" << usage << general_options); std::vector<std::string> input_files = vm["input-files"].as<std::vector<std::string>>(); parse_input_clouds_textures(input_files, opt); // This is a bug fix. The user by mistake passed in an empty projection string. if (!vm["t_srs"].defaulted() && opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "The value of --t_srs is empty. Then it must not be set at all.\n"); if (opt.median_filter_params[0] < 0 || opt.median_filter_params[1] < 0) vw_throw(ArgumentErr() << "The parameters for median-based filtering " << "must be non-negative.\n"); // If opt.target_srs is upper-case "auto", make it lowercase. Do not touch // this string otherwise as PROJ complains. if (boost::to_lower_copy(opt.target_srs_string) == "auto") opt.target_srs_string = "auto"; if (opt.has_las_or_csv_or_pcd && opt.median_filter_params[0] > 0 && opt.median_filter_params[1] > 0) vw_throw(ArgumentErr() << "Median-based filtering cannot handle CSV or LAS files.\n"); if (opt.erode_len < 0) vw_throw(ArgumentErr() << "Erode length must be non-negative.\n"); if ((dem_spacing1.size() > 0) && (dem_spacing2.size() > 0)) vw_throw(ArgumentErr() << "The DEM spacing was specified twice.\n"); // Consolidate the dem_spacing and tr parameters if (dem_spacing1.size() < dem_spacing2.size()) dem_spacing1 = dem_spacing2; // Now we can just use dem_spacing1 // Extract the list of numbers from the input string vw::split_number_string(dem_spacing1, opt.dem_spacing); // Check for for non-positive input for (size_t i = 0; i < opt.dem_spacing.size(); i++) { if (opt.dem_spacing[i] <= 0.0) vw_throw(ArgumentErr() << "The DEM spacing must be positive.\n" ); } // Make sure we have a number if (opt.dem_spacing.size() == 0) opt.dem_spacing.push_back(0.0); bool spacing_provided = false; for (size_t i = 0; i < opt.dem_spacing.size(); i++) { if (opt.dem_spacing[i] > 0) spacing_provided = true; } if (opt.has_las_or_csv_or_pcd && !spacing_provided) vw_throw(ArgumentErr() << "When inputs are not PC.tif files, the " << "output DEM resolution must be set.\n"); if (opt.out_prefix.empty()) { std::string input_file = opt.pointcloud_files[0]; if (asp::is_las(input_file) && pdal::Utils::isRemote(input_file)) input_file = fs::path(input_file).filename().string(); // rm the remote path opt.out_prefix = asp::prefix_from_pointcloud_filename(input_file); } if (opt.dem_hole_fill_len < 0) vw_throw(ArgumentErr() << "The value of --dem-hole-fill-len must be non-negative.\n"); if (opt.ortho_hole_fill_len < 0) vw_throw(ArgumentErr() << "The value of --orthoimage-hole-fill-len must be non-negative.\n"); if (opt.ortho_hole_fill_extra_len < 0) vw_throw(ArgumentErr() << "The value of --orthoimage-hole-fill-extra-len must be non-negative.\n"); if (!opt.do_ortho && opt.ortho_hole_fill_len > 0) vw_throw(ArgumentErr() << "The value of --orthoimage-hole-fill-len is positive, " << "but orthoimage generation was not requested.\n"); if (opt.dem_hole_fill_len > 200) vw::vw_out(WarningMessage) << "The value of --dem-hole-fill-len is large, " << "this may result in the program running out of memory. " << "Consider using dem_mosaic with the option " << "--fill-search-radius instead.\n"; if (opt.ortho_hole_fill_len > 200) vw::vw_out(WarningMessage) << "The value of --orthoimage-hole-fill-len is large, " << "this may result in the program running out of memory. " << "Consider using the mapproject program instead.\n"; if (opt.ortho_hole_fill_len > 0) { // We do hole-filling before erosion and outlier removal, for performance reason, // and the two may not play nicely together. if (opt.erode_len > 0) vw_out(WarningMessage) << "Erosion may interfere with filling " << "holes in ortho images.\n"; if (opt.median_filter_params[0] > 0 && opt.median_filter_params[1] > 0) vw_out(WarningMessage) << "Removing outliers using a median filter may interfere " << "with filling holes in ortho images.\n"; if (opt.remove_outliers_params[0] < 100) vw_out(WarningMessage) << "Removing outliers using a percentile filter may interfere " << "with filling holes in ortho images.\n"; } double pct = opt.remove_outliers_params[0], factor = opt.remove_outliers_params[1]; if (pct <= 0.0 || pct > 100.0 || factor <= 0.0){ vw_throw(ArgumentErr() << "Invalid values were provided for outlier removal params.\n"); } // opt.proj_lon and opt.proj_lat must either both be set or not if (std::isnan(opt.proj_lon) != std::isnan(opt.proj_lat)) vw_throw(ArgumentErr() << "Must set both or neither of --proj-lon and --proj-lat.\n"); if (opt.max_valid_triangulation_error > 0) { // Since the user passed in a threshold, will use that to rm // outliers, instead of using the percentage. opt.remove_outliers_with_pct = false; opt.use_tukey_outlier_removal = false; } // For compatibility with GDAL, we allow the proj win y coordinate to be flipped. // Correct that here. if (opt.target_projwin != BBox2()) { if (opt.target_projwin.min().y() > opt.target_projwin.max().y()) std::swap(opt.target_projwin.min().y(), opt.target_projwin.max().y()); vw_out() << "Cropping to projection box " << opt.target_projwin << ".\n"; } if (opt.copc_win != BBox2()) { if (opt.copc_win.min().y() > opt.copc_win.max().y()) std::swap(opt.copc_win.min().y(), opt.copc_win.max().y()); vw_out() << "Reading COPC LAZ file with bounding box " << opt.copc_win << ".\n"; } // Must specify either csv_srs or csv_proj4_str, but not both. The latter is // for backward compatibility. if (!opt.csv_srs.empty() && !opt.csv_proj4_str.empty()) vw_throw(ArgumentErr() << "Cannot specify both --csv-srs and --csv-proj4.\n"); if (!opt.csv_proj4_str.empty() && opt.csv_srs.empty()) opt.csv_srs = opt.csv_proj4_str; // If the user specified an srs to interpret the input in CSV files, use the // same string to create output DEMs, unless the user explicitly sets the // output t_srs string. if (!opt.csv_srs.empty() && opt.target_srs_string.empty()) { vw_out() << "The --csv-srs option was set, but not --t_srs. Will use the former " << "as a substitute for the latter.\n"; opt.target_srs_string = opt.csv_srs; } // If csv_srs is empty, use --t_srs as a substitute. if (opt.csv_srs.empty() && !opt.target_srs_string.empty() && opt.target_srs_string != "auto") opt.csv_srs = opt.target_srs_string; // This option is now the default so it is obsolete if (opt.auto_proj_center) vw::vw_out(WarningMessage) << "The --auto-proj-center option is now the default and need not be set.\n"; // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); // reference_spheroid and datum are aliases. boost::to_lower(opt.reference_spheroid); boost::to_lower(opt.datum); if (opt.datum != "" && opt.reference_spheroid != "") vw_throw(ArgumentErr() << "Both --datum and --reference-spheroid were specified.\n"); if (opt.datum == "") opt.datum = opt.reference_spheroid; if (vm.count("sinusoidal")) opt.projection = SINUSOIDAL; else if (vm.count("mercator")) opt.projection = MERCATOR; else if (vm.count("transverse-mercator")) opt.projection = TRANSVERSEMERCATOR; else if (vm.count("orthographic")) opt.projection = ORTHOGRAPHIC; else if (vm.count("stereographic")) opt.projection = STEREOGRAPHIC; else if (vm.count("oblique-stereographic")) opt.projection = OSTEREOGRAPHIC; else if (vm.count("gnomonic")) opt.projection = GNOMONIC; else if (vm.count("lambert-azimuthal")) opt.projection = LAMBERTAZIMUTHAL; else if (vm.count("utm")) opt.projection = UTM; else if (vm.count("geographic")) opt.projection = GEOGRAPHIC; else opt.projection = AUTO_DETERMINED; } // end function handle_arguments() // Wrapper for rasterize_cloud that goes through all spacing values void rasterize_cloud_multi_spacing(const ImageViewRef<Vector3>& proj_points, DemOptions& opt, cartography::GeoReference& georef, ImageViewRef<double> const& error_image, double estim_max_error, vw::BBox3 const& estim_proj_box) { asp::OutlierRemovalMethod outlier_removal_method = asp::NO_OUTLIER_REMOVAL_METHOD; if (opt.remove_outliers_with_pct) outlier_removal_method = asp::PERCENTILE_OUTLIER_METHOD; if (opt.use_tukey_outlier_removal) outlier_removal_method = asp::TUKEY_OUTLIER_METHOD; // takes precedence // Perform the slow initialization that can be shared by all output resolutions vw::Mutex count_mutex; // Need to pass in by pointer due to C++ class restrictions // Need to pass in by pointer because we can't get back the number from // the original rasterizer object otherwise for some reason. std::int64_t num_invalid_pixels = 0; asp::OrthoRasterizerView rasterizer(proj_points.impl(), select_channel(proj_points.impl(),2), opt.search_radius_factor, opt.sigma_factor, asp::ASPGlobalOptions::tri_tile_size(), // to efficiently process the cloud opt.target_projwin, opt.gdal_tap, outlier_removal_method, opt.remove_outliers_params, error_image, estim_max_error, estim_proj_box, opt.max_valid_triangulation_error, opt.median_filter_params, opt.erode_len, opt.has_las_or_csv_or_pcd, opt.filter, opt.default_grid_size_multiplier, &num_invalid_pixels, &count_mutex, TerminalProgressCallback("asp", "Point cloud extent estimation: ")); // Perform other rasterizer configuration rasterizer.set_use_alpha(opt.has_alpha); rasterizer.set_use_min_z_as_default(false); rasterizer.set_default_value(opt.nodata_value); std::string base_out_prefix = opt.out_prefix; // Call the function for each dem spacing for (size_t i = 0; i < opt.dem_spacing.size(); i++) { double this_spacing = opt.dem_spacing[i]; // Required second init step for each spacing rasterizer.initialize_spacing(this_spacing); // Each spacing gets a variation of the output prefix if (i == 0) opt.out_prefix = base_out_prefix; else // Write later iterations to a different path. opt.out_prefix = base_out_prefix + "_" + vw::num_to_str(i); rasterize_cloud(rasterizer, opt, georef, &num_invalid_pixels); } // End loop through spacings opt.out_prefix = base_out_prefix; // Restore the original value } int main(int argc, char *argv[]) { DemOptions opt; try { handle_arguments(argc, argv, opt); // Need to know for both CSV and point cloud parsing if have the user datum cartography::Datum user_datum; bool have_user_datum = asp::read_user_datum(opt.semi_major, opt.semi_minor, opt.datum, user_datum); // Configure a CSV converter object according to the input parameters asp::CsvConv csv_conv; csv_conv.parse_csv_format(opt.csv_format_str, opt.csv_srs); // Modifies csv_conv vw::cartography::GeoReference csv_georef; // TODO(oalexan1): The logic below is fragile. Check all locations // where parse_georef is called and see if a datum is always set before being used. if (have_user_datum) csv_georef.set_datum(user_datum); // Set the datum csv_conv.parse_georef(csv_georef); // This alone may not set the datum always // Convert any input LAS, CSV, PCD, or unorganized projected TIF files to // ASP's point cloud tif format // - The output and input datum will match unless the input data files // themselves specify a different datum. // - Should all be XYZ format when finished, unless option // --input-is-projected is set. // - The names of converted clouds will be updated in opt.pointcloud_files. // - The vector conv_files holds the names of the new files that got created, // so they can be deleted later. std::vector<std::string> conv_files; chip_convert_to_tif(opt, csv_conv, csv_georef, opt.pointcloud_files, conv_files); // outputs // Generate a merged xyz point cloud consisting of all inputs. By now, each // input exists in xyz tif format. ImageViewRef<Vector3> point_image = asp::form_point_cloud_composite<Vector3>(opt.pointcloud_files, ASP_MAX_SUBBLOCK_SIZE); // Set up the error image ImageViewRef<double> error_image; if (opt.remove_outliers_with_pct || opt.use_tukey_outlier_removal || opt.max_valid_triangulation_error > 0.0) { error_image = asp::point_cloud_error_image(opt.pointcloud_files); if (error_image.rows() == 0 || error_image.cols() == 0) { vw_out() << "The point cloud files must have an equal number of channels which " << "must be 4 or 6 to be able to remove outliers.\n"; opt.remove_outliers_with_pct = false; opt.use_tukey_outlier_removal = false; opt.max_valid_triangulation_error = 0.0; } } // Set up the georeferencing information. We specify everything // here except for the affine transform, which is defined later once // we know the bounds of the orthorasterizer view. However, we can // still reproject the points in the point image without the affine // transform because this projection never requires us to convert to // or from pixel space. GeoReference output_georef; // See if we can get a georef from any of the input pc files GeoReference pc_georef; bool have_input_georef = asp::georef_from_pc_files(opt.pointcloud_files, pc_georef); if (have_input_georef) output_georef = pc_georef; // If the user set --t_srs, set the output georef to that. If not, set up // the datum for now, and then will set the projection later. if (opt.target_srs_string.empty() || opt.target_srs_string == "auto") { if (have_user_datum) output_georef.set_datum(user_datum); else if (!have_input_georef && opt.datum == "") vw::vw_throw(vw::ArgumentErr() << "A datum, projection, or semi-axes must be set.\n"); } else { vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, user_datum, output_georef); } // Determine if we should be using a longitude range between [-180, 180] or // [0, 360]. The former is used, unless the latter results in a tighter // range of longitudes, such as when crossing the international date line. // This logic needs the datum only, which is set up by now. vw::BBox2 lonlat_box; if (!opt.input_is_projected) { lonlat_box = asp::estim_lonlat_box(point_image, output_georef.datum()); output_georef.set_image_ll_box(lonlat_box); } // Finalize setting the projection. The doc spells out the logic. if (!opt.input_is_projected) { bool good_input_geo = have_input_georef && output_georef.is_projected(); if ((opt.target_srs_string.empty() && !good_input_geo) || opt.target_srs_string == "auto") { if (std::isnan(opt.proj_lon) && std::isnan(opt.proj_lat)) // estimate proj center asp::median_lon_lat(point_image, output_georef, opt.proj_lon, opt.proj_lat); // Auto-determine the projection setProjection(opt, output_georef); } } // The provided datums must not be too different bool warn_only = false; if (!opt.csv_srs.empty()) vw::checkDatumConsistency(output_georef.datum(), csv_georef.datum(), warn_only); // Convert xyz points to projected points // - The cartesian_to_geodetic call converts invalid (0,0,0,0) points to NaN, // which is checked for in the OrthoRasterizer class. ImageViewRef<Vector3> proj_points; if (opt.input_is_projected) { vw_out() << "\t--> Assuming the input cloud is already projected.\n"; proj_points = point_image; } else { // TODO(oalexan1): Wipe the --x-offset, etc, not used. if (opt.lon_offset != 0 || opt.lat_offset != 0 || opt.height_offset != 0) { vw_out() << "\t--> Applying offset: " << opt.lon_offset << " " << opt.lat_offset << " " << opt.height_offset << "\n"; proj_points = geodetic_to_point // GDC to XYZ (asp::point_image_offset // Add user coordinate offset (cartesian_to_geodetic(point_image, output_georef), Vector3(opt.lon_offset, opt.lat_offset, opt.height_offset) ), output_georef); } else { proj_points = geodetic_to_point(cartesian_to_geodetic(point_image, output_georef), output_georef); } } // Estimate the proj box size, and the max intersection error (if having an error iamge) double estim_max_error = 0.0; BBox3 estim_proj_box; estim_max_error = asp::estim_max_tri_error_and_proj_box(proj_points, error_image, opt.remove_outliers_params, estim_proj_box); // Create the DEM rasterize_cloud_multi_spacing(proj_points, opt, output_georef, error_image, estim_max_error, estim_proj_box); // Wipe the temporary converted files for (size_t i = 0; i < conv_files.size(); i++) if (fs::exists(conv_files[i])) fs::remove(conv_files[i]); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/point2las.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Convert an ASP point cloud to LAS 1.2 format using PDAL. /// \file point2las.cc /// #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/PointUtils.h> #include <asp/Core/PointCloudRead.h> #include <asp/Core/PdalUtils.h> #include <vw/Cartography/PointImageManipulation.h> #include <vw/Core/Stopwatch.h> #include <vw/Math/Statistics.h> #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/FileUtils.h> #include <vw/Image/ImageChannels.h> #include <vw/Image/Statistics.h> #include <vw/Cartography/PointImageManipulation.h> #include <fstream> #include <iostream> #include <string> #include <boost/program_options.hpp> using namespace vw; namespace po = boost::program_options; // A class to collect some positive errors, and return the error at // given percentile multiplied by given factor. class PercentileErrorAccum : public ReturnFixedType<void> { typedef double accum_type; std::vector<accum_type> m_vals; public: typedef accum_type value_type; PercentileErrorAccum() { m_vals.clear(); } void operator()( accum_type const& value ) { // Don't add zero errors, those most likely came from invalid points if (value > 0) m_vals.push_back(value); } int size() { return m_vals.size(); } value_type value(Vector2 const& outlier_removal_params, bool use_tukey_outlier_removal){ // Care here with empty sets if (m_vals.empty()) { vw_out() << "Found no positive triangulation errors in the sample.\n"; return 0.0; } std::sort(m_vals.begin(), m_vals.end()); int len = m_vals.size(); vw_out() << "Collected a sample of " << len << " positive triangulation errors.\n"; double mean = vw::math::mean(m_vals); vw_out() << "For this sample: " << "min = " << m_vals.front() << ", mean = " << mean << ", stdev = " << vw::math::standard_deviation(m_vals, mean) << ", max = " << m_vals.back() << "." << std::endl; int i25 = round((len - 1) * 0.25); int i50 = round((len - 1) * 0.50); int i75 = round((len - 1) * 0.75); double Q1 = m_vals[i25]; double Q2 = m_vals[i50]; double Q3 = m_vals[i75]; vw_out() << "Error percentiles: " << "Q1 (25%): " << Q1 << ", " << "Q2 (50%): " << Q2 << ", " << "Q3 (75%): " << Q3 << "." << std::endl; if (use_tukey_outlier_removal) { vw_out() << "Using as outlier cutoff the Tukey formula Q3 + 1.5*(Q3 - Q1)." << std::endl; return Q3 + 1.5*(Q3 - Q1); } double pct = outlier_removal_params[0]/100.0; // e.g., 0.75 double factor = outlier_removal_params[1]; int k = (int)round((len - 1) * pct); vw_out() << "Using as outlier cutoff the " << outlier_removal_params[0] << " percentile times " << factor << "." << std::endl; return m_vals[k] * factor; } }; struct Options: vw::GdalWriteOptions { // Input std::string reference_spheroid, datum; std::string pointcloud_file, intensity_file; std::string target_srs_string; bool compressed, use_tukey_outlier_removal, ecef, no_input_georef; Vector2 outlier_removal_params; double max_valid_triangulation_error; int num_samples; bool save_triangulation_error, save_stddev, dem; // Output std::string out_prefix; Options() : compressed(false), max_valid_triangulation_error(0.0), num_samples(0) {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options("General Options"); general_options.add_options() ("compressed,c", po::bool_switch(&opt.compressed)->default_value(false)->implicit_value(true), "Compress using laszip.") ("output-prefix,o", po::value(&opt.out_prefix), "Specify the output prefix.") ("datum", po::value(&opt.datum)->default_value(""), "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).") ("reference-spheroid,r", po::value(&opt.reference_spheroid)->default_value(""), "This is identical to the datum option.") ("t_srs", po::value(&opt.target_srs_string)->default_value(""), "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.") ("remove-outliers-params", po::value(&opt.outlier_removal_params)->default_value(Vector2(75.0, 3.0), "pct factor"), "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]") ("use-tukey-outlier-removal", po::bool_switch(&opt.use_tukey_outlier_removal)->default_value(false)->implicit_value(true), "Remove outliers above Q3 + 1.5*(Q3 - Q1). Takes precedence over " "--remove-outliers-params.") ("max-valid-triangulation-error", po::value(&opt.max_valid_triangulation_error)->default_value(0.0), "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.") ("save-intensity-from-image", po::value(&opt.intensity_file)->default_value(""), "Save the intensity of each triangulated point, as borrowed from the aligned left " "image L.tif specified via this option, in the W field of the LAS file, in double " "precision. This bumps the LAS file version from 1.2 to 1.4.") ("save-triangulation-error", po::bool_switch(&opt.save_triangulation_error)->default_value(false), "Save the triangulation error from the input point cloud as the TextureU field " "in the LAS file, in double precision. Take into account the outlier filtering." "This bumps the LAS file version from 1.2 to 1.4") ("save-stddev", po::bool_switch(&opt.save_stddev)->default_value(false), "Save the standard deviations of the horizontal and vertical components of uncertainty " "from the ASP point cloud file to the TextureV and TextureW fields in the LAS file, " "in double precision. This bumps the LAS file version from 1.2 to 1.4.") ("num-samples-for-outlier-estimation", po::value(&opt.num_samples)->default_value(1000000), "Approximate number of samples to pick from the input cloud to find the outlier cutoff based on triangulation error.") ("ecef", po::bool_switch(&opt.ecef)->default_value(false)->implicit_value(true), "Save the point cloud in ECEF, rather than with a projection relative to a datum.") ("dem", po::bool_switch(&opt.dem)->default_value(false)->implicit_value(true), "Assume the input file is a DEM.") ("no-input-georef", po::bool_switch(&opt.no_input_georef)->default_value(false)->implicit_value(true), "Do not attempt to read the georeference from the input point cloud.") ("help,h", "Display this help message"); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("input-file", po::value(&opt.pointcloud_file), "Input point cloud"); po::positional_options_description positional_desc; positional_desc.add("input-file", 1); std::string usage("[options] <point-cloud>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.pointcloud_file.empty()) vw_throw(ArgumentErr() << "Missing point cloud.\n" << usage << general_options); if (opt.out_prefix.empty()) opt.out_prefix = vw::prefix_from_filename(opt.pointcloud_file); // This is a bug fix. The user by mistake passed in an empty projection string. if (!vm["t_srs"].defaulted() && opt.target_srs_string.empty()) vw_throw(ArgumentErr() << "The value of --t_srs is empty. Then it must not be set at all.\n"); // reference_spheroid and datum are aliases boost::to_lower(opt.reference_spheroid); boost::to_lower(opt.datum); if (opt.datum != "" && opt.reference_spheroid != "") vw_throw( ArgumentErr() << "Both --datum and --reference-spheroid were specified.\n"); if (opt.datum == "") opt.datum = opt.reference_spheroid; double pct = opt.outlier_removal_params[0], factor = opt.outlier_removal_params[1]; if (pct <= 0.0 || pct > 100.0 || factor <= 0.0) vw_throw( ArgumentErr() << "Invalid values were provided for outlier removal parameters.\n"); if (opt.max_valid_triangulation_error < 0.0) vw_throw( ArgumentErr() << "The maximum valid triangulation error must be non-negative.\n"); if (opt.num_samples <= 0) vw_throw( ArgumentErr() << "Must pick a positive number of samples.\n"); // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); } void find_error_image_and_do_stats(Options& opt, ImageViewRef<double> & error_image) { std::vector<std::string> pointcloud_files; pointcloud_files.push_back(opt.pointcloud_file); error_image = asp::point_cloud_error_image(pointcloud_files); if (error_image.rows() == 0 || error_image.cols() == 0) { vw_out() << "The point cloud files must have an equal number of channels which " << "must be 4 or 6 to be able to remove outliers.\n"; opt.max_valid_triangulation_error = 0.0; return; } if (opt.max_valid_triangulation_error > 0.0) { vw_out() << "Using the set maximum valid triangulation error as outlier cutoff: " << opt.max_valid_triangulation_error << "." << std::endl; return; } vw_out() << "Estimating the maximum valid triangulation error (outlier cutoff).\n"; int num_err_cols = error_image.cols(); int num_err_rows = error_image.rows(); double area = std::max(num_err_cols * num_err_rows, 1); int sample_rate = round(sqrt(double(area) / double(opt.num_samples))); if (sample_rate < 1) sample_rate = 1; Stopwatch sw; sw.start(); PixelAccumulator<PercentileErrorAccum> error_accum; for_each_pixel(subsample(error_image, sample_rate), error_accum, TerminalProgressCallback ("asp", "Error estim: ")); opt.max_valid_triangulation_error = error_accum.value(opt.outlier_removal_params, opt.use_tukey_outlier_removal); sw.stop(); vw_out(DebugMessage, "asp") << "Elapsed time: " << sw.elapsed_seconds() << std::endl; vw_out() << "Found the maximum valid triangulation error (outlier cutoff): " << opt.max_valid_triangulation_error << "." << std::endl; } // Read a DEM and convert it to having projected points and elevation void read_dem(std::string const& pointcloud_file, bool ecef, bool no_input_georef, bool & has_georef, cartography::GeoReference & georef, ImageViewRef<Vector3> & point_image) { has_georef = vw::cartography::read_georeference(georef, pointcloud_file); // Sanity checks if (!has_georef) vw::vw_throw(vw::ArgumentErr() << "The input DEM file does not have a georeference.\n"); if (ecef) vw::vw_throw(vw::ArgumentErr() << "Options --ecef and --dem are not compatible.\n"); if (no_input_georef) vw::vw_throw(vw::ArgumentErr() << "Options --no-input-georef and --dem are not compatible.\n"); double nodata_val = -std::numeric_limits<double>::max(); vw::read_nodata_val(pointcloud_file, nodata_val); // Form the point image as projected coordinates and elevation vw::DiskImageView<double> dem(pointcloud_file); point_image = vw::cartography::dem_to_proj(vw::create_mask(dem, nodata_val), georef); } int main(int argc, char *argv[]) { // TODO(oalexan1): need to understand what is the optimal strategy // for traversing the input point cloud file to minimize the reading // time. Options opt; try { handle_arguments(argc, argv, opt); cartography::Datum datum; cartography::GeoReference georef; bool have_user_datum = false, have_input_georef = false; bool have_out_georef = false; ImageViewRef<Vector3> point_image; if (!opt.dem) { if (!opt.ecef) { have_user_datum = asp::read_user_datum(0, 0, opt.datum, datum); if (!opt.no_input_georef) have_input_georef = vw::cartography::read_georeference(georef, opt.pointcloud_file); if (have_input_georef && opt.target_srs_string.empty()) opt.target_srs_string = georef.get_wkt(); if (have_user_datum || !opt.target_srs_string.empty()) { // Set the srs string into georef vw::cartography::set_srs_string(opt.target_srs_string, have_user_datum, datum, georef); have_out_georef = true; datum = georef.datum(); } } // Save the las file with given georeference, if present point_image = asp::read_asp_point_cloud_3(opt.pointcloud_file); if (have_out_georef) { // See if to use [-180, 180] or [0, 360] vw::BBox2 lonlat_box = asp::estim_lonlat_box(point_image, georef.datum()); georef.set_image_ll_box(lonlat_box); // Convert cartesian to projected coordinates via geodetic point_image = cartesian_to_geodetic(point_image, datum); point_image = geodetic_to_point(point_image, georef); } } else { // The input is a DEM. Resulting point_image will be in projected_coordinates. read_dem(opt.pointcloud_file, opt.ecef, opt.no_input_georef, have_out_georef, georef, point_image); datum = georef.datum(); have_out_georef = true; } // The error image, if provided ImageViewRef<double> error_image; if (opt.outlier_removal_params[0] < 100.0 || opt.max_valid_triangulation_error > 0.0) find_error_image_and_do_stats(opt, error_image); // The intensity image, if provided vw::ImageViewRef<float> intensity; if (opt.intensity_file != "") intensity = DiskImageView<float>(opt.intensity_file); // For saving the stddev vw::ImageViewRef<vw::Vector6> full_point_image; vw::ImageViewRef<double> horizontal_stddev, vertical_stddev; if (opt.save_stddev) { std::vector<std::string> pointcloud_files; pointcloud_files.push_back(opt.pointcloud_file); bool has_sd = asp::has_stddev(pointcloud_files); if (!has_sd) vw_throw(ArgumentErr() << "The input point cloud file does not have " << "standard deviations.\n"); full_point_image = asp::form_point_cloud_composite<vw::Vector6>(pointcloud_files, ASP_MAX_SUBBLOCK_SIZE); // Channel 3 is the error image, 4 and 5 are the stddevs horizontal_stddev = vw::select_channel(full_point_image, 4); vertical_stddev = vw::select_channel(full_point_image, 5); } BBox3 cloud_bbox = asp::pointcloud_bbox(point_image, have_out_georef); // The las format stores the values as 32 bit integers. So, for a // given point, we store round((point-offset)/scale), as well as // the offset and scale values. Here we decide the values for // offset and scale to lose minimum amount of precision. We make // the scale almost as large as it can be without causing integer overflow. // TODO(oalexan1): This can have its own issues if later // this cloud is shifted a lot. Better pick more sensible // scale. 1 mm should be enough. Note that sometimes // the coordinates are in degrees, not in meters. Vector3 offset = (cloud_bbox.min() + cloud_bbox.max())/2.0; double maxInt = std::numeric_limits<int32>::max(); maxInt *= 0.95; // Just in case stay a bit away Vector3 scale = cloud_bbox.size()/(2.0*maxInt); for (size_t i = 0; i < scale.size(); i++) if (scale[i] <= 0.0) scale[i] = 1.0e-16; // avoid degeneracy asp::write_las(have_out_georef, georef, point_image, error_image, intensity, horizontal_stddev, vertical_stddev, offset, scale, opt.compressed, opt.save_triangulation_error, opt.max_valid_triangulation_error, opt.out_prefix); return 0; } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/point2mesh.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file point2mesh2.cc /// #include <asp/Core/AspLog.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Core/PointCloudRead.h> #include <asp/Core/PointUtils.h> #include <vw/Cartography/PointImageManipulation.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/FileUtils.h> #include <vw/Image/Algorithms.h> #include <vw/Image/Filter.h> #include <vw/Image/Manipulation.h> #include <vw/Image/MaskViews.h> #include <vw/Image/Transform.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <stdio.h> #include <stddef.h> #include <math.h> #include <boost/filesystem.hpp> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; struct Options : vw::GdalWriteOptions { Options() {}; // Input std::string pointcloud_filename, texture_file_name; // Settings int point_cloud_step_size, texture_step_size, precision; bool center; // Output std::string output_prefix, output_file_type; }; // Create a blank float image of given size class BlankImage: public ReturnFixedType<float> { public: float operator()(Vector3 const& v) const { return 1.0; } }; // Form the mtl file having the given png texture void save_mtl(std::string const& output_prefix, std::string const& output_prefix_no_dir) { std::string mtl_file = output_prefix + ".mtl"; std::cout << "Writing: " << mtl_file << std::endl; std::ofstream ofs(mtl_file.c_str()); ofs << "newmtl material0000\n"; ofs << "Ka 1.000000 1.000000 1.000000\n"; ofs << "Kd 1.000000 1.000000 1.000000\n"; ofs << "Ks 0.000000 0.000000 0.000000\n"; ofs << "Tr 0.000000\n"; ofs << "illum 1\n"; ofs << "Ns 1.000000\n"; ofs << "map_Kd " << output_prefix_no_dir << ".png\n"; ofs.close(); } void save_texture(std::string const& output_prefix, ImageViewRef<float> texture_image) { std::string texture_file = output_prefix + ".png"; std::cout << "Writing: " << texture_file << std::endl; //DiskImageView<PixelGray<uint8> > new_texture(tex_file+".tif"); double image_min = 0.0, image_max = 1.0; ImageViewRef<float> normalized_image = normalize(texture_image, image_min, image_max, 0.0, 1.0); write_image(texture_file, normalized_image); } // A point at the center of the planet or which has NaN elements cannot be valid inline bool is_valid_pt(Vector3 const& P) { if (P != P || P == Vector3()) return false; return true; } // Add a given vertex to the .obj file unless already present inline void add_vertex(Vector3 const& V, std::pair<int, int> const& pix, int cloud_cols, int cloud_rows, std::ofstream & ofs, std::map<std::pair<int, int>, int> & pix_to_vertex, int & vertex_count) { if (pix_to_vertex.find(pix) == pix_to_vertex.end()) { ofs << "v " << V[0] << " " << V[1] << " " << V[2] << '\n'; double u = double(pix.first)/cloud_cols; // TODO(oalexan1). Study this. The second option looks more accurate. // In the second option the lower-left pixel (0, cloud_rows - 1) // gets mapped to (u, v) = (0, 0). This seems correct per: // https://computergraphics.stackexchange.com/questions/9339/convert-image-pixel-dimensions-to-uv // In some places on the net I even saw a subpixel shift of (0.5, 0.5) // which makes things even more complicated. #if 0 double v = double(pix.second)/cloud_rows; ofs << "vt " << u << ' ' << 1.0 - v << std::endl; #else double v = double(cloud_rows - 1 - pix.second)/cloud_rows; ofs << "vt " << u << ' ' << v << std::endl; #endif pix_to_vertex[pix] = vertex_count; vertex_count++; } } void save_mesh(std::string const& output_prefix, std::string const& output_prefix_no_dir, ImageViewRef<Vector3> point_cloud, Vector3 C, int precision) { std::string mesh_file = output_prefix + ".obj"; std::cout << "Writing: " << mesh_file << std::endl; std::ofstream ofs(mesh_file.c_str()); ofs.precision(precision); ofs << "mtllib " << output_prefix_no_dir << ".mtl\n"; // Some constants for the calculation in here int cloud_cols = point_cloud.cols(); int cloud_rows = point_cloud.rows(); TerminalProgressCallback vertex_progress("asp", "\tVertices: "); double vertex_progress_mult = 1.0/double(std::max(cloud_cols - 1, 1)); // Make sure we we save a vertex only once even if we encounter it // multiple times. std::map<std::pair<int, int>, int> pix_to_vertex; std::vector<Vector3i> faces; int vertex_count = 1; // The obj spec calls for the starting vertex to have index 1. for (int col = 0; col < cloud_cols - 1; col++) { vertex_progress.report_progress(col*vertex_progress_mult); for (int row = 0; row < cloud_rows - 1; row++) { // We have a square that needs to be split into two triangles. // Here the image is viewed as having the origin on the upper-left, // the column axis going right, and the row axis going down. std::pair<int, int> pix_ul = std::make_pair(col, row); std::pair<int, int> pix_ur = std::make_pair(col + 1, row); std::pair<int, int> pix_ll = std::make_pair(col, row + 1); std::pair<int, int> pix_lr = std::make_pair(col + 1, row + 1); Vector3 UL = point_cloud(pix_ul.first, pix_ul.second); Vector3 UR = point_cloud(pix_ur.first, pix_ur.second); Vector3 LL = point_cloud(pix_ll.first, pix_ll.second); Vector3 LR = point_cloud(pix_lr.first, pix_lr.second); if (is_valid_pt(UL) && is_valid_pt(LL) && is_valid_pt(UR)) { add_vertex(UL - C, pix_ul, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count); add_vertex(LL - C, pix_ll, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count); add_vertex(UR - C, pix_ur, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count); Vector3 face(pix_to_vertex[pix_ul], pix_to_vertex[pix_ll], pix_to_vertex[pix_ur]); faces.push_back(face); } if (is_valid_pt(UR) && is_valid_pt(LL) && is_valid_pt(LR)) { add_vertex(UR - C, pix_ur, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count); add_vertex(LL - C, pix_ll, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count); add_vertex(LR - C, pix_lr, cloud_cols, cloud_rows, ofs, pix_to_vertex, vertex_count); Vector3 face(pix_to_vertex[pix_ur], pix_to_vertex[pix_ll], pix_to_vertex[pix_lr]); faces.push_back(face); } } } vertex_progress.report_finished(); TerminalProgressCallback face_progress("asp", "\tFaces: "); double face_progress_mult = 1.0/double(std::max(faces.size(), size_t(1))); for (size_t face_iter = 0; face_iter < faces.size(); face_iter++) { face_progress.report_progress(face_iter*face_progress_mult); Vector3 const& F = faces[face_iter]; // alias ofs << "f " << F[0] << "/" << F[0] << " " << F[1] << "/" << F[1] << " " << F[2] << "/" << F[2] << std::endl; } face_progress.report_finished(); } void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options(""); general_options.add_options() ("point-cloud-step-size,s", po::value(&opt.point_cloud_step_size)->default_value(10), "Sampling step for the point cloud. Pick one out of these many samples.") ("texture-step-size", po::value(&opt.texture_step_size)->default_value(2), "Sampling step for the texture. Pick one out of these many samples.") ("output-prefix,o", po::value(&opt.output_prefix), "Specify the output prefix.") ("center", po::bool_switch(&opt.center)->default_value(false), "Let the origin be the midpoint of the bounding box of the cloud. Use this option if you are experiencing numerical precision issues.") ("precision", po::value(&opt.precision)->default_value(17), "How many digits of precision to save."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("input-file", po::value(&opt.pointcloud_filename), "Explicitly specify the input file") ("texture-file", po::value(&opt.texture_file_name), "Explicity specify the texture file"); po::positional_options_description positional_desc; positional_desc.add("input-file", 1); positional_desc.add("texture-file", 1); std::string usage("[options] <pointcloud> <texture-file>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.pointcloud_filename.empty()) vw_throw(ArgumentErr() << "Missing point cloud.\n" << usage << general_options); if ( opt.output_prefix.empty() ) opt.output_prefix = asp::prefix_from_pointcloud_filename( opt.pointcloud_filename ); if (opt.point_cloud_step_size <= 0) vw_throw(ArgumentErr() << "Step size must be positive.\n" << usage << general_options); if (opt.precision <= 0) vw_throw(ArgumentErr() << "Precision must be positive.\n" << usage << general_options); // It is useful to have this to make the p if (opt.point_cloud_step_size % opt.texture_step_size != 0) vw_throw(ArgumentErr() << "--point-cloud-step-size must be a multiple " << "of --texture-step-size.\n" << usage << general_options); // Create the output directory vw::create_out_dir(opt.output_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.output_prefix); } int main(int argc, char *argv[]){ Options opt; try { handle_arguments(argc, argv, opt); std::string input_file = opt.pointcloud_filename; int num_channels = get_num_channels(input_file); GeoReference georef; bool has_georef = read_georeference(georef, input_file); double nodata_val = -std::numeric_limits<double>::max(); vw::read_nodata_val(input_file, nodata_val); Vector2 image_size = vw::file_image_size(input_file); vw_out() << "\t--> Original cloud size: " << image_size[0] << " x " << image_size[1] << "\n"; // Loading point cloud ImageViewRef<Vector3> point_cloud; if (num_channels == 1 && has_georef) { // The input is a DEM. Convert it to a point cloud. DiskImageView<double> dem(input_file); point_cloud = vw::subsample(geodetic_to_cartesian(dem_to_geodetic (create_mask(dem, nodata_val), georef), georef.datum()), opt.point_cloud_step_size); }else if (num_channels >= 3){ // The input DEM is a point cloud point_cloud = vw::subsample(asp::read_asp_point_cloud_3(input_file), opt.point_cloud_step_size); }else{ vw_throw( ArgumentErr() << "The input must be a point cloud or a DEM.\n"); } vw_out() << "\t--> Subsampled cloud size: " << point_cloud.cols() << " x " << point_cloud.rows() << "\n"; // Centering option (helpful if you are experiencing round-off error) Vector3 C(0, 0, 0); if (opt.center) { bool is_geodetic = false; // raw xyz values BBox3 bbox = asp::pointcloud_bbox(point_cloud, is_geodetic); vw_out() << "\t--> Setting as the origin the bounding box midpoint.\n"; vw_out() << std::setprecision(17) << "\t Bounding box: " << bbox << "\n"; C = (bbox.max() + bbox.min()) / 2.0; vw_out() << std::setprecision(17) << "\t Midpoint: " << C << "\n"; } ImageViewRef<float> texture_image; // Resample the image if it is too fine. if ( !opt.texture_file_name.empty() ) { texture_image = vw::subsample(DiskImageView<float>(opt.texture_file_name), opt.texture_step_size); } else { // Use a blank texture image with each pixel being white texture_image = per_pixel_filter(point_cloud, BlankImage()); } boost::filesystem::path p(opt.output_prefix); std::string output_prefix_no_dir = p.filename().string(); save_mesh(opt.output_prefix, output_prefix_no_dir, point_cloud, C, opt.precision); save_texture(opt.output_prefix, texture_image); save_mtl(opt.output_prefix, output_prefix_no_dir); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/prism2asp.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2024, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Parse PRISM data and produce CSM camera files // Reference: https://elib.dlr.de/57440/1/Schneider.pdf // TODO(oalexan1): Many of these need to go when the code is modularized #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Camera/PRISM_XML.h> #include <asp/Camera/CsmModel.h> #include <asp/Camera/LinescanUtils.h> #include <asp/Camera/CsmUtils.h> #include <asp/Camera/CsmModelFit.h> #include <asp/Camera/SatSim.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/Macros.h> #include <asp/Core/CamPoseUtils.h> #include <asp/Core/CameraTransforms.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Cartography/Datum.h> #include <vw/Cartography/GeoReference.h> #include <vw/Cartography/GeoReferenceBaseUtils.h> #include <vw/FileIO/FileUtils.h> #include <boost/filesystem.hpp> #include <boost/program_options.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; struct Options: public vw::GdalWriteOptions { std::string dim_file, csm_file, dem; int ccd; // Constructor Options() {} }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("dim", po::value(&opt.dim_file)->default_value(""), "The input PRISM .DIMA file.") ("ccd", po::value(&opt.ccd)->default_value(-1), "The CCD id to use. Must be between 1 and 6 or 8, depending on view (F, N, A).") ("csm", po::value(&opt.csm_file)->default_value(""), "The output CSM camera file.") ("dem", po::value(&opt.dem)->default_value(""), "A reference DEM for the site.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // The dim file is required if (opt.dim_file.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing the input .DIMA file.\n" << usage << general_options); // The output file is required if (opt.csm_file.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing the output CSM file.\n"); // The CCD must be positive if (opt.ccd < 1) vw::vw_throw(vw::ArgumentErr() << "The CCD id must be positive.\n"); // The reference DEM is required if (opt.dem.empty()) vw::vw_throw(vw::ArgumentErr() << "Missing the reference DEM.\n"); // Create the output directory vw::create_out_dir(opt.csm_file); // Turn on logging to file std::string out_prefix = opt.csm_file; // Remove the extension, which is the text after the last dot size_t pos = out_prefix.rfind("."); if (pos != std::string::npos) out_prefix = out_prefix.substr(0, pos); asp::log_to_file(argc, argv, "", out_prefix); } // End function handle_arguments // Given a vector of values and a spacing, check that the values have // that spacing, with given tolerance. void checkSpacing(std::vector<double> const& vals, double spacing, double tol, std::string const& tag) { // The spacing must be positive if (spacing <= 0) vw::vw_throw(vw::ArgumentErr() << "Expecting positive time spacing between samples.\n"); for (size_t i = 1; i < vals.size(); i++) { double diff = vals[i] - vals[i-1]; double err = std::abs(diff - spacing); if (err > tol) vw::vw_throw(vw::ArgumentErr() << "Expecting all " << tag << " values to be spaced by " << spacing << ". Found a discrepancy of " << err << " seconds at index " << i << ".\n"); } return; } // A function to create a georeference in stereographic coordinates // at given position with given datum. void produceStereographicGeoref(vw::Vector3 const& pos, vw::cartography::Datum const& datum, vw::cartography::GeoReference & georef) { // Create a georeference at the last position vw::Vector3 llh = datum.cartesian_to_geodetic(pos); georef.set_datum(datum); double scale = 1.0, false_easting = 0.0, false_northing = 0.0; georef.set_stereographic(llh[1], llh[0], scale, false_easting, false_northing); return; } // TODO(oalexan1): Move this to a better place // Given a set of orbital positions acquired at with uniform time spacing, // corresponding velocities, the times, the time spacing, extrapolate one more // position by fitting a parabola. This was shown to given results to within 1 // km. Do this in projected coordinates, where the curvature is less, and the // error was validated to be half as much. Do this for velocity in ECEF. Add to // the time by incrementing the last time by the time interval. void extrapolatePosition(vw::cartography::Datum const& datum, double dt, std::vector<double> & times, std::vector<vw::Vector3> & positions, std::vector<vw::Vector3> & velocities) { // Must have at least 3 positions if (positions.size() < 3) vw::vw_throw(vw::ArgumentErr() << "Expecting at least 3 positions for parabola " "extrapolation.\n"); // The time spacing must be positive if (dt <= 0) vw::vw_throw(vw::ArgumentErr() << "Expecting positive time spacing between samples.\n"); // Sanity check for spacing double tol = 1e-6; checkSpacing(times, dt, tol, "position"); // Produce a georef at the last position vw::cartography::GeoReference georef; produceStereographicGeoref(positions.back(), datum, georef); // Find projected coordinates std::vector<vw::Vector3> projections(positions.size()); for (size_t i = 0; i < positions.size(); i++) projections[i] = georef.geodetic_to_point(georef.datum().cartesian_to_geodetic(positions[i])); // We do the extrapolation at every position, to be able to check how we are // doing before the final extrapolation. int num_pos = positions.size(); // the position size will grow, but this will not for (int i = 2; i < num_pos; i++) { vw::Vector3 u = projections[i-2]; vw::Vector3 v = projections[i-1]; vw::Vector3 w = projections[i]; // Extrapolate by fitting a parabola vw::Vector3 next_proj = u - 3 * v + 3 * w; vw::Vector3 next_pos = georef.datum().geodetic_to_cartesian(georef.point_to_geodetic(next_proj)); // Do this for velocity as well u = velocities[i-2]; v = velocities[i-1]; w = velocities[i]; vw::Vector3 next_vel = u - 3 * v + 3 * w; // if we are not at the end, see how this prediction compares #if 0 if (i < num_pos - 1) { std::cout << "Error in extrapolation at position " << i << " is = " << vw::math::norm_2(positions[i+1] - next_pos) << std::endl; std::cout << "Error in extrapolation at velocity " << i << " is = " << vw::math::norm_2(velocities[i+1] - next_vel) << std::endl; } #endif if (i == num_pos - 1) { // Append the new position, last velocity, and a new time positions.push_back(next_pos); velocities.push_back(next_vel); times.push_back(times.back() + dt); } } return; } void createCsmModel(double first_line_time, double dt_line, double t0_ephem, double dt_ephem, double focal_length, double roll, double pitch, double yaw, std::string const& view, vw::Vector2 const& optical_center, vw::Vector2 const& image_size, vw::cartography::Datum const& datum, std::vector<vw::Vector3> const& positions, std::vector<vw::Vector3>const & velocities, std::vector<vw::Vector3> const& rpy, asp::CsmModel& model) { // Create a georeference at the last position vw::cartography::GeoReference georef; produceStereographicGeoref(positions.back(), datum, georef); // TODO(oalexan1): This is wrong. The positions and rpy arrays // have different sizes and are at different times. // Assemble the cam2world matrices std::vector<vw::Matrix3x3> cam2world(positions.size()); for (size_t i = 0; i < positions.size(); i++) { vw::Vector3 beg_pos = positions[i]; // Normalized velocity vw::Vector3 vel = velocities[i]; vel = vel / vw::math::norm_2(vel); vw::Vector3 end_pos = beg_pos + asp::satSimDelta() * vel; vw::Vector3 llh = georef.datum().cartesian_to_geodetic(beg_pos); vw::Vector3 beg_proj = georef.geodetic_to_point(georef.datum().cartesian_to_geodetic(beg_pos)); vw::Vector3 end_proj = georef.geodetic_to_point(georef.datum().cartesian_to_geodetic(end_pos)); vw::Vector3 proj_along, proj_across; asp::calcProjAlongAcross(beg_proj, end_proj, proj_along, proj_across); vw::Vector3 along, across; // ECEF asp::calcEcefAlongAcross(georef, asp::satSimDelta(), proj_along, proj_across, beg_proj, along, across); vw::Vector3 down = vw::math::cross_prod(along, across); down = down / vw::math::norm_2(down); // The satellite orientation if perfectly aligned with the trajectory vw::Matrix3x3 sat2world; asp::assembleCam2WorldMatrix(along, across, down, sat2world); // Adjust for the measured roll-pitch-yaw of the satellite from the PRISM data vw::Matrix3x3 sat2sat = asp::rollPitchYaw(rpy[i][0], rpy[i][1], rpy[i][2]); // Go from satellite orientation to sensor orientation vw::Matrix3x3 cam2sat = asp::rollPitchYaw(roll, pitch, yaw); // It looks that the PRISM camera is mounted in reverse, so need to use // the inverse of the rotation matrix. vw::Matrix3x3 cam2cam = vw::math::inverse(asp::rotationXY()); // Put it all together cam2world[i] = sat2world * sat2sat * cam2sat * cam2cam; } // Form and save the camera asp::populateCsmLinescan(first_line_time, dt_line, t0_ephem, dt_ephem, t0_ephem, dt_ephem, // for poses //t0_quat, dt_quat, // for later focal_length, optical_center, image_size, datum, view, positions, velocities, cam2world, model); } // Put this in a function and compute the total error double calcCornersError(vw::cartography::GeoReference const& dem_georef, vw::ImageViewRef<vw::PixelMask<float>> const& interp_dem, std::vector<vw::Vector2> const& lonlat_vec, std::vector<vw::Vector2> const& raw_pix_vec, asp::CsmModel const& model) { // Check that lonlat and raw_pix have the same size if (lonlat_vec.size() != raw_pix_vec.size()) vw::vw_throw(vw::ArgumentErr() << "Expecting the same number of lonlat and raw pixel corners.\n"); // Must have at least one element if (lonlat_vec.empty()) vw::vw_throw(vw::ArgumentErr() << "Expecting at least one corner.\n"); double total_err = 0; for (int i = 0; i < lonlat_vec.size(); i++) { vw::Vector2 lonlat = lonlat_vec[i]; vw::Vector2 raw_pix = raw_pix_vec[i]; vw::Vector2 dem_pix = dem_georef.lonlat_to_pixel(lonlat); auto dem_ht = interp_dem(dem_pix[0], dem_pix[1]); if (!vw::is_valid(dem_ht)) vw::vw_throw(vw::ArgumentErr() << "Could not interpolate into the DEM.\n"); vw::Vector3 llh(lonlat[0], lonlat[1], dem_ht.child()); vw::Vector3 xyz = dem_georef.datum().geodetic_to_cartesian(llh); vw::Vector2 cam_pix = model.point_to_pixel(xyz); double err = vw::math::norm_2(cam_pix - raw_pix); total_err += err; } return total_err; } #if 0 // A bare-bone minimizer to make the lon-lat corners project to the raw pixel corners. // This does grid search, than makes a smaller grid around the most promising point. void findBestParams() { // Put ul_lonlat and ur_lonlat into a vector, and same for raw pixel corners std::vector<vw::Vector2> lonlat_vec = {ul_lonlat, ur_lonlat, ll_lonlat, lr_lonlat}; std::vector<vw::Vector2> raw_pix_vec = {ul_raw_pix, ur_raw_pix, ll_raw_pix, lr_raw_pix}; calcCornersError(dem_georef, interp_dem, lonlat_vec, raw_pix_vec, model); double best_roll = roll, best_pitch = pitch, best_yaw = yaw; double best_cost = std::numeric_limits<double>::max(); for (int pass = 0; pass < 20; pass++) { int num = 7; // must be odd to include the initial guess double max_angle = 2.0 / pow(double(num - 1.0), double(pass)); double spacing = 2.0 * max_angle / (num - 1); std::vector<double> samples(num); for (int i = 0; i < num; i++) samples[i] = i * spacing - max_angle; // Find the best roll and pitch for (int ir = 0; ir < num; ir++) { double curr_roll = roll + samples[ir]; for (int ip = 0; ip < num; ip++) { double curr_pitch = pitch + samples[ip]; for (int iy = 0; iy < num; iy++) { double curr_yaw = yaw + samples[iy]; createCsmModel(first_line_time, dt_line, t0_ephem, dt_ephem, focal_length, curr_roll, curr_pitch, curr_yaw, view, optical_center, image_size, datum, positions, velocities, rpy, model); double err = calcCornersError(dem_georef, interp_dem, lonlat_vec, raw_pix_vec, model); if (err < best_cost) { best_cost = err; best_roll = curr_roll; best_pitch = curr_pitch; best_yaw = curr_yaw; } } } } std::cout << "roll = " << best_roll << ";\n"; std::cout << "pitch = " << best_pitch << ";\n"; std::cout << "yaw = " << best_yaw << ";\n"; std::cout << "Error = " << best_cost << std::endl; roll = best_roll; pitch = best_pitch; yaw = best_yaw; } createCsmModel(first_line_time, dt_line, t0_ephem, dt_ephem, focal_length, roll, pitch, yaw, view, optical_center, image_size, datum, positions, velocities, rpy, model); } #endif // TODO(oalexan1): This needs to be modularized void prism2asp(Options const& opt) { int ncols = -1, nrows = -1; double first_line_time = -1, last_line_time = -1; std::string view; std::vector<vw::Vector3> positions, velocities, rpy; // rpy = roll-pitch-yaw std::vector<double> position_times, rpy_times; asp::parsePrismXml(opt.dim_file, ncols, nrows, view, first_line_time, last_line_time, positions, velocities, position_times, rpy, rpy_times); // TODO(oalexan1): Modularize the block below // Shift all values closer to the origin to avoid numerical issues with interpolation double time_shift = first_line_time; first_line_time -= time_shift; last_line_time -= time_shift; for (size_t i = 0; i < position_times.size(); i++) position_times[i] -= time_shift; for (size_t i = 0; i < rpy_times.size(); i++) rpy_times[i] -= time_shift; // WGS84 datum vw::cartography::Datum datum("WGS84"); // Position sampling double t0_ephem = position_times[0]; double dt_ephem = position_times[1] - position_times[0]; // The tolerance should not be too small as the times in seconds can be large. // A satellite velocity under 10 km / s would result in movement of less // than 1e-2 m in 1e-6 seconds. double tol = 1e-6; checkSpacing(position_times, dt_ephem, tol, "position"); // Roll-pitch-yaw sampling double t0_quat = rpy_times[0]; double dt_quat = rpy_times[1] - rpy_times[0]; checkSpacing(rpy_times, dt_quat, tol, "roll-pitch-yaw"); double dt_line = (last_line_time - first_line_time) / (nrows - 1.0); vw::Vector2 image_size(ncols, nrows); // This is a fix for the range of the position times not encompassing the // range of the image lines times. This is a temporary fix, to be refined later. // TODO(oalexan1): Must ensure we extrapolate somewhat beyond the last line time. // Say for another 5000 lines or so. while (position_times.back() < last_line_time - tol) extrapolatePosition(datum, dt_ephem, position_times, positions, velocities); // TODO(oalexan1): Must resample positions and rpy, say every 1000 lines, // using Lagrange interpolation. For positions, may need to convert to projected // coordinates first. // Sanity check to ensure interpolation works later if (position_times[0] > first_line_time + tol || position_times.back() < last_line_time - tol) vw::vw_throw(vw::ArgumentErr() << "The position time range must encompass the image lines time range.\n"); if (rpy_times[0] > first_line_time + tol || rpy_times.back() < last_line_time - tol) vw::vw_throw(vw::ArgumentErr() << "The roll-pitch-yaw time range must encompass the image lines time range.\n"); // Nadir view // Upper-left corner, and other corners, in lon-lat and raw pixel coordinates // will read from xml <Dataset_Frame> vw::Vector2 ul_lonlat(0, 0), ur_lonlat(0, 0), ll_lonlat(0, 0), lr_lonlat(0, 0); // The corner pixel is based on NDUMMY_LEFT of first band vw::Vector2 ul_raw_pix(0, 0), ur_raw_pix(0, 0), ll_raw_pix(0, 0), lr_raw_pix(0, 0); // Optical offset and other heuristics per view // TODO(oalexan1): These need refinement. The [Schneider] doc has better values. // Offset for the merged image. Subtract 32 as that is the overlap amount // between CCDs. Heuristics for now. double roll = 0.0, pitch = 0, yaw = 0.0; double offset_factor = 0.0; if (view == "PRISM forward") { offset_factor = 7.3; //4.81; // (latter is before adding rpy) //roll = 0; pitch = 23.8; yaw = 0.0; // nominal roll = -0.58428750997244516; pitch = 23.831397378838467; yaw = -1.4942372009731513; ul_lonlat = vw::Vector2(-108.1339846, 39.3750293); // from xml, wrong ul_raw_pix = vw::Vector2(2304, 0); // from xml, wrong // From inspection ul_lonlat = vw::Vector2(-108.13184312172825, 39.381410562321079); ur_lonlat = vw::Vector2(-107.67580895904177, 39.303613241935807); ll_lonlat = vw::Vector2(-108.23937126681177, 39.031311463460831); lr_lonlat = vw::Vector2(-107.78713723922995, 38.949143632121732); ul_raw_pix = vw::Vector2(2325, 0); ur_raw_pix = vw::Vector2(16820, 0); ll_raw_pix = vw::Vector2(2325, 15999); lr_raw_pix = vw::Vector2(16820, 15999); } else if (view == "PRISM nadir") { // Heuristics offset_factor = 5.8; // (latter is before adding rpy) //roll = 0; pitch = 0; // nominal roll = -0.017892244040000001; pitch = -0.036843287040000006; yaw = 0.0; // Read from xml ul_lonlat = vw::Vector2(-108.1266445, 39.3974048); ul_raw_pix = vw::Vector2(3520, 0); } else if (view == "PRISM backward") { offset_factor = 6.0; // 3.31; // (latter is before adding rpy) //roll = 0.0; pitch = -23.8; // nominal roll = 0.038117781239999982; pitch = -23.802336706320002; // empirical ul_lonlat = vw::Vector2(-108.1360601, 39.4241022); // from xml, wrong ul_raw_pix = vw::Vector2(4000, 0); // from xml, wrong ul_lonlat = vw::Vector2(-108.13848057684356, 39.415530627090277); // visual inspection ul_raw_pix = vw::Vector2(4021, 0); // based on visual inspection } else { vw::vw_throw(vw::ArgumentErr() << "Expecting forward, nadir or backward view. " << "Got: " << view << ".\n"); } // CCD strip image width int w = image_size[0]; int global_offset = (w-32) * offset_factor; // experimentally found // Adapt to current CCD int local_offset = global_offset - (opt.ccd - 1) * (w-32); vw::Vector2 optical_center(local_offset, 0); // 0 offset in y // Focal length // TODO(oalexan1): Use honest focal length and optical offset // The doc says 1.939 m focal length. double ht = 689880; // height above Earth's surface, in meters double dx = 2.5; // resolution in meters double focal_length = ht / dx; // focal length in pixels // Read and interpolate the DEM vw::ImageViewRef<vw::PixelMask<float>> dem; float dem_nodata_val = -std::numeric_limits<float>::max(); // will change vw::cartography::GeoReference dem_georef; vw::cartography::readGeorefImage(opt.dem, dem_nodata_val, dem_georef, dem); vw::PixelMask<float> nodata_pix(0); nodata_pix.invalidate(); vw::ValueEdgeExtension<vw::PixelMask<float>> nodata_ext(nodata_pix); auto interp_dem = interpolate(dem, vw::BicubicInterpolation(), nodata_ext); // Create the CSM model asp::CsmModel model; createCsmModel(first_line_time, dt_line, t0_ephem, dt_ephem, focal_length, roll, pitch, yaw, view, optical_center, image_size, datum, positions, velocities, rpy, model); vw::vw_out() << "Writing: " << opt.csm_file << "\n"; model.saveState(opt.csm_file); } int main(int argc, char * argv[]) { Options opt; try { handle_arguments(argc, argv, opt); prism2asp(opt); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/refr_index ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2026, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ Compute the effective refractive index of water for a given temperature, salinity, and wavelength or spectral response. Uses the Quan and Fry (1995) or Parrish (2020) empirical equations. References: Quan and Fry (1995): https://github.com/geojames/global_refractive_index_532 Parrish (2020): https://research.engr.oregonstate.edu/parrish/ index-refraction-seawater-and-freshwater-function-wavelength-and-temperature """ import sys import os import argparse import numpy as np # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] # Define wavelength limits (in nm). The first range is from the Parrish equation # documentation, the second is a hard error for sanity checking. The spectral # response tables from vendors usually go beyond the strict Parrish limits, but # have small responses outside the valid range. min_wl_warn = 400 max_wl_warn = 700 min_wl_err = 300 max_wl_err = 1100 def read_csv(filename): wavelengths = [] responses = [] warn_range = False skipped_extreme = False try: with open(filename, 'r') as f: lines = f.readlines() if not lines: print("Error: Empty spectral response file.") sys.exit(1) # Skip header if len(lines) > 0: print(f"Skipping first line: {lines[0].strip()}", file=sys.stderr) for line in lines[1:]: line = line.strip() if not line: continue # Handle comma or space delimiters parts = line.replace(',', ' ').split() if len(parts) < 2: continue try: wl = float(parts[0]) resp = float(parts[1]) except ValueError: print(f"Warning: Skipping invalid line: {line}", file=sys.stderr) continue # Only include positive responses if resp <= 0: continue # Skip wavelengths outside extreme range (don't include in computation) if wl < min_wl_err or wl > max_wl_err: skipped_extreme = True continue # Check wavelength range for warning if wl < min_wl_warn or wl > max_wl_warn: warn_range = True wavelengths.append(wl) responses.append(resp) if skipped_extreme: print(f"Warning: Wavelengths outside {min_wl_err}-{max_wl_err} nm " + f"were skipped.", file=sys.stderr) if warn_range: print(f"Warning: Some wavelengths are outside the valid range of " + f"{min_wl_warn}-{max_wl_warn} nm for the Parrish equation. " + f"Results may still be accurate if the spectral response " + "for those is small.", file=sys.stderr) except Exception as e: print(f"Error reading spectral response file: {e}") sys.exit(1) if not wavelengths: print("Error: No valid data found in spectral response file.") sys.exit(1) if not responses: print("Error: No valid responses found in spectral response file.") sys.exit(1) return np.array(wavelengths), np.array(responses) def main(): usage = ("refr_index --salinity <val> --temperature <val> " + "[--spectral-response <file> | --wavelength <val>]") parser = argparse.ArgumentParser(usage=usage, description="Compute effective refraction index.") parser.add_argument('--salinity', type=float, default=-1.0, help='Salinity in parts per thousand (ppt).') parser.add_argument('--temperature', type=float, default=-1.0, help='Temperature in degrees Celsius.') parser.add_argument('--mode', type=str, default='Quan-Fry', help='Refractive index equation: Quan-Fry (default) or Parrish.') group = parser.add_mutually_exclusive_group(required=True) group.add_argument('--spectral-response', type=str, default="", help='CSV file containing the spectral response.') group.add_argument('--wavelength', type=float, default=-1.0, help='Calculate refraction index for single wavelength (nm).') parser.add_argument('-v', '--version', action='store_true', help='Display the version of software.') args = parser.parse_args() if args.version: asp_system_utils.print_version_and_exit() # Normalize mode to lowercase args.mode = args.mode.lower() # Validate mode if args.mode not in ['quan-fry', 'parrish']: print(f"Error: Invalid mode '{args.mode}'. Must be 'Quan-Fry' or 'Parrish'.") sys.exit(1) # Input validation if args.salinity == -1.0: print("Error: --salinity must be specified.") sys.exit(1) if args.temperature == -1.0: print("Error: --temperature must be specified.") sys.exit(1) if args.salinity < 0: print("Error: Salinity must be non-negative.") sys.exit(1) if not (0 <= args.temperature <= 30): print("Error: Temperature must be between 0 and 30 degrees Celsius.") sys.exit(1) # Coefficients for Parrish (2020) empirical equation (used only if mode is Parrish) # n = a*T^2 + b*lambda^2 + c*T + d*lambda + e if args.mode == 'parrish': # Seawater (S = 35) params_35 = { 'a': -1.50156e-6, 'b': 1.07085e-7, 'c': -4.27594e-5, 'd': -1.60476e-4, 'e': 1.39807 } # Freshwater (S = 0) params_0 = { 'a': -1.97812e-6, 'b': 1.03223e-7, 'c': -8.58125e-6, 'd': -1.54834e-4, 'e': 1.38919 } # Linearly interpolate coefficients based on salinity s_factor = args.salinity / 35.0 params = {} for key in params_0: params[key] = params_0[key] + s_factor * (params_35[key] - params_0[key]) if args.spectral_response: if not os.path.exists(args.spectral_response): print(f"Error: Spectral response file not found: {args.spectral_response}") sys.exit(1) # Read spectral response wavelengths, responses = read_csv(args.spectral_response) else: # Single wavelength case wl = args.wavelength wavelengths = np.array([wl]) responses = np.array([1.0]) if np.sum(responses) == 0: print("Error: Sum of spectral responses is zero.") sys.exit(1) # Compute effective wavelength using spectral response weights eff_wl = np.sum(wavelengths * responses) / np.sum(responses) # Validate effective wavelength if eff_wl < min_wl_warn or eff_wl > max_wl_warn: print(f"Warning: Effective wavelength {eff_wl:.2f} nm is " + f"outside the valid range of {min_wl_warn}-{max_wl_warn} nm for " + f"the Parrish equation. Result may be inaccurate.", file=sys.stderr) if eff_wl < min_wl_err or eff_wl > max_wl_err: print(f"Error: Effective wavelength {eff_wl:.2f} nm is " + f"out of supported range ({min_wl_err}-{max_wl_err} nm).") sys.exit(1) # Compute refractive index using the effective wavelength T = args.temperature S = args.salinity lam = eff_wl if args.mode == 'quan-fry': # Quan and Fry (1995) equation effective_index = (1.31405 + (0.0001779 + -0.00000105 * T + 0.000000016 * T**2) * S + -0.00000202 * T**2 + ((15.868 + 0.01155*S + -0.00423 *T)/lam) + (-4382/lam**2) + (1145500/lam**3)) else: # Parrish (2020) empirical equation # n = a*T^2 + b*lambda^2 + c*T + d*lambda + e effective_index = (params['a'] * T**2 + params['b'] * lam**2 + params['c'] * T + params['d'] * lam + params['e']) print(f"Effective index: {effective_index:.6f}") if __name__ == "__main__": main() ================================================ FILE: src/asp/Tools/rig_bracket ================================================ #!/usr/bin/env python """ Given a list of ref cam timestamps, one per line, grouped in pairs, with each pair very close in time, forming a bracket, and a second list of timestamps for another camera, for each ref cam bracket pick a timestamp from the second camera list. A timestamp is a float number in the form <digits>.<digits>. Other data on each line having a timestamp will be read as well. The output list will have a subset of lines from the other list. Can handle correctly the case when both input lists are identical, when bracketing needs some care, as each timestamp is its own bracket. """ import argparse, os, re, sys, rosbag, cv2, sensor_msgs, cv_bridge from sensor_msgs import point_cloud2 import numpy as np def read_timestamps(filename): """Return a list of timestamps and lines corresponding to them.""" timestamps_map = {} with open(filename, 'r') as f: lines = f.readlines() for line in lines: m = re.match("^.*?(\d+\.\d+).*?\n", line) if m: timestamp = float(m.group(1)) timestamps_map[timestamp] = line # Return arrays of timestamps and lines, in sorted order of timestamp. # Those are easier to parse. timestamps = sorted(timestamps_map) lines = [] for t in timestamps: lines.append(timestamps_map[t]) return (timestamps, lines) parser = argparse.ArgumentParser(description = __doc__, formatter_class = argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("--ref_list", dest = "ref_list", help = "List of bracketing reference camera timestamps."), parser.add_argument("--other_list", dest = "other_list", default = "", help = "List of timestamps for another camera. Pick one of those between each ref cam bracketing timestamps.") parser.add_argument("--out_list", dest = "out_list", default = "", help = "Output list of timestamps in other camera bracketed by ref cam.") parser.add_argument("--bracket_len", dest = "bracket_len", type = float, default = -1, help = "Maximum distance in time, in seconds, between two ref cam timestamps forming a bracket.") args = parser.parse_args() # Sanity checks if args.ref_list == "" or args.other_list == "" or args.out_list == "": print("Not all arguments were specified.") sys.exit(1) if args.bracket_len <= 0: print("The bracket length must be positive.") sys.exit(1) (ref_timestamps, ref_lines) = read_timestamps(args.ref_list) (other_timestamps, other_lines) = read_timestamps(args.other_list) # Advance simultaneously in both sorted arrays, for effeciency other_count = 0 found_it = [] for ref_count in range(len(ref_timestamps)): ref_count2 = ref_count + 1 if ref_count == len(ref_timestamps) - 1: # Handle the case when we are at the end ref_count2 = ref_count t1 = ref_timestamps[ref_count] t2 = ref_timestamps[ref_count2] # Search for t such that t1 <= t < t2. When last t1 and t2 are reached, # can have t == t2. for it in range(other_count, len(other_timestamps)): t = other_timestamps[it] if t < t1: other_count = it + 1 # surely next time need to start searching further continue # too early if t > t2: break # there is no point in continuing # Now t1 <= t <= t2 if (t == t1) or (t2 - t1 <= args.bracket_len and t < t2) or \ (t == t2 and ref_count == len(ref_timestamps) - 1): found_it.append(it) other_count = it + 1 break # Save the lines corresponding to bracketed timestamps print("Writing: " + args.out_list) with open(args.out_list, 'w') as f: for it in found_it: f.write(other_lines[it]) ================================================ FILE: src/asp/Tools/rig_calibrator.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <asp/Core/AspLog.h> #include <asp/Core/Macros.h> #include <asp/Core/BundleAdjustUtils.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/Nvm.h> #include <asp/Camera/BundleAdjustCamera.h> #include <asp/Rig/RigOptions.h> #include <asp/Rig/RigParseOptions.h> #include <asp/Rig/RigTypeDefs.h> #include <asp/Rig/Triangulation.h> #include <asp/Rig/RigThread.h> #include <asp/Rig/RigParseUtils.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Rig/RigUtils.h> #include <asp/Rig/ImageLookup.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/TransformUtils.h> #include <asp/Rig/InterpolationUtils.h> #include <asp/Rig/InterestPoint.h> #include <asp/Rig/RigOutlier.h> #include <asp/Rig/TextureProcessing.h> #include <asp/Rig/CameraImage.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/RigCameraUtils.h> #include <asp/Rig/RigData.h> #include <asp/Rig/RigIo.h> #include <asp/Rig/RigImageIO.h> #include <asp/Rig/RigOptimizer.h> #include <vw/FileIO/FileUtils.h> #include <vw/Core/Log.h> #include <vw/Cartography/GeoReference.h> #include <opencv2/imgproc.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/core/utility.hpp> #include <glog/logging.h> #include <Eigen/Geometry> #include <Eigen/Core> #include <oneapi/tbb/task_arena.h> #include <boost/filesystem.hpp> #include <string> #include <map> #include <iostream> #include <fstream> void run_rig_calibrator(int argc, char** argv) { // Some dependencies may still use google logging google::InitGoogleLogging(argv[0]); // Force linking to tbb for some dependencies tbb::task_arena schedule(tbb::task_arena::automatic); rig::RigOptions opt; rig::handleRigArgs(argc, argv, opt); rig::parameterValidation(opt); // Create the output directory, turn on logging std::string out_prefix = opt.out_prefix + "/run"; // part of the api vw::create_out_dir(out_prefix); asp::log_to_file(argc, argv, "", out_prefix); // Rig configuration. The rig transforms may not exist yet. rig::RigSet R; rig::readRigConfig(opt.rig_config, opt.use_initial_rig_transforms, R); // Parse auxiliary rig options that depend on R rig::parseAuxRigOptions(opt, R); // Sanity check size_t max_num_sensors_per_rig = 0; for (size_t rig_it = 0; rig_it < R.cam_set.size(); rig_it++) max_num_sensors_per_rig = std::max(max_num_sensors_per_rig, R.cam_set[rig_it].size()); if (opt.extra_list != "" && opt.num_overlaps < max_num_sensors_per_rig) LOG(FATAL) << "If inserting extra images, must have --num_overlaps be at least " << "the number of sensors in the rig, and ideally more, to be able " << "to tie well the new images with the existing ones.\n"; // Optionally load the mesh mve::TriangleMesh::Ptr mesh; std::shared_ptr<mve::MeshInfo> mesh_info; std::shared_ptr<tex::Graph> graph; std::shared_ptr<BVHTree> bvh_tree; if (opt.mesh != "") rig::loadMeshBuildTree(opt.mesh, mesh, mesh_info, graph, bvh_tree); // Read camera poses from nvm file or a list. std::vector<rig::MsgMap> image_maps; std::vector<rig::MsgMap> depth_maps; asp::nvmData nvm; rig::readListOrNvm(opt.camera_poses, opt.nvm, opt.image_sensor_list, opt.extra_list, opt.use_initial_rig_transforms, opt.bracket_len, opt.nearest_neighbor_interp, opt.read_nvm_no_shift, opt.num_overlaps, R, nvm, image_maps, depth_maps); // out // Poses for all the cameras (extrinsics) rig::Extrinsics cams; // Keep here the images, timestamps, and bracketing information std::vector<rig::cameraImage> imgData; // The range of R.ref_to_cam_timestamp_offsets[cam_type] before // getting out of the bracket. std::vector<double> min_timestamp_offset, max_timestamp_offset; std::vector<double> ref_timestamps; // Timestamps for the ref cameras // Select the images to use. If the rig is used, keep non-ref images // only within the bracket. rig::lookupImages(// Inputs opt.no_rig, opt.bracket_len, opt.timestamp_offsets_max_change, opt.bracket_single_image, R, image_maps, depth_maps, // Outputs ref_timestamps, cams.world_to_ref, imgData, cams.world_to_cam, min_timestamp_offset, max_timestamp_offset); // De-allocate data we no longer need image_maps = std::vector<rig::MsgMap>(); depth_maps = std::vector<rig::MsgMap>(); if (opt.no_rig && opt.use_initial_rig_transforms) LOG(FATAL) << "Cannot use initial rig transforms without a rig.\n"; // If we can use the initial rig transform, compute and overwrite // cams.world_to_cam, the transforms from the world to each non-reference camera. // TODO(oalexan1): Test if this works with --no_rig. For now this combination // is not allowed. if (!opt.no_rig && opt.use_initial_rig_transforms) rig::calcWorldToCamWithRig(// Inputs !opt.no_rig, imgData, cams.world_to_ref, ref_timestamps, R.ref_to_cam_trans, R.ref_to_cam_timestamp_offsets, // Output cams.world_to_cam); // If desired, initalize the rig based on median of transforms for the sensors if (!opt.no_rig && !opt.use_initial_rig_transforms) rig::calc_rig_trans(imgData, cams.world_to_ref, cams.world_to_cam, ref_timestamps, R); // out // Determine if a given camera type has any depth information int num_cam_types = R.cam_names.size(); std::vector<bool> has_depth(num_cam_types, false); for (size_t cid = 0; cid < imgData.size(); cid++) { int cam_type = imgData[cid].camera_type; if (imgData[cid].depth_cloud.cols > 0 && imgData[cid].depth_cloud.rows > 0) has_depth[cam_type] = true; } // Transform to world coordinates if control points were provided. Note: // applyRegistration modifies cams.world_to_ref (Affine3d), which will then be // converted to state.world_to_ref_vec (primary storage) below. Eigen::Affine3d registration_trans; registration_trans.matrix() = Eigen::Matrix4d::Identity(); // default bool registration_applied = false; if (opt.registration && opt.hugin_file != "" && opt.xyz_file != "") { // Keep user's R.depth_to_image transforms, and only transform only the image // cameras from Theia's abstract coordinate system to world coordinates. bool scale_depth = false; registration_applied = true; applyRegistration(opt.no_rig, scale_depth, opt.hugin_file, opt.xyz_file, has_depth, imgData, // Outputs registration_trans, cams.world_to_ref, cams.world_to_cam, R); } int num_ref_cams = cams.world_to_ref.size(); if (cams.world_to_ref.size() != ref_timestamps.size()) LOG(FATAL) << "Must have as many ref cam timestamps as ref cameras.\n"; // Set up the variable blocks to optimize for BracketedDepthError int num_depth_params = rig::NUM_RIGID_PARAMS; if (opt.affine_depth_to_image) num_depth_params = rig::NUM_AFFINE_PARAMS; // Separate the initial scale. This is convenient if cam_depth_to_image is // scale * rotation + translation and if it is desired to keep the scale // fixed. In either case, the scale will be multiplied back when needed. // TODO(oalexan1): affine_depth_to_image must allow fixing the scale. std::vector<double> depth_to_image_scales; for (int cam_type = 0; cam_type < num_cam_types; cam_type++) { double depth_to_image_scale = pow(R.depth_to_image[cam_type].matrix().determinant(), 1.0 / 3.0); R.depth_to_image[cam_type].linear() /= depth_to_image_scale; depth_to_image_scales.push_back(depth_to_image_scale); } // Detect and match features if --num_overlaps > 0. Append the features // read from the nvm. Triangulate all points. rig::KeypointVec keypoint_vec; rig::PidCidFid pid_to_cid_fid; bool filter_matches_using_cams = true; std::vector<std::pair<int, int>> input_image_pairs; // will use num_overlaps instead // Do not save these matches. Only inlier matches will be saved later. bool local_save_matches = false; std::vector<Eigen::Vector3d> xyz_vec; rig::detectAddFeatures(// Inputs imgData, R.cam_params, opt.out_prefix, local_save_matches, filter_matches_using_cams, cams.world_to_cam, opt.num_overlaps, input_image_pairs, opt.initial_max_reprojection_error, opt.num_match_threads, opt.read_nvm_no_shift, opt.no_nvm_matches, opt.verbose, // Outputs keypoint_vec, pid_to_cid_fid, xyz_vec, nvm); if (pid_to_cid_fid.empty()) LOG(FATAL) << "No interest points were found. Must specify either " << "--nvm or positive --num_overlaps.\n"; // Inlier flag. Once an inlier becomes an outlier, it stays that way rig::PidCidFidMap pid_cid_fid_inlier; // TODO(oalexan1): Must initialize all points as inliers outside this function, // as now this function resets those. rig::flagOutlierByExclusionDist(// Inputs R.cam_params, imgData, pid_to_cid_fid, keypoint_vec, // Outputs pid_cid_fid_inlier); // Ensure that the triangulated points are kept in sync with the cameras if (opt.use_initial_triangulated_points && registration_applied) rig::transformInlierTriPoints(registration_trans, pid_to_cid_fid, pid_cid_fid_inlier, xyz_vec); // Run several optimization passes with outlier filtering for (int pass = 0; pass < opt.num_passes; pass++) { std::cout << "\nOptimization pass " << pass + 1 << " / " << opt.num_passes << "\n"; runOptPass(pass, num_depth_params, opt, imgData, ref_timestamps, keypoint_vec, pid_to_cid_fid, min_timestamp_offset, max_timestamp_offset, mesh, bvh_tree, depth_to_image_scales, cams, R, xyz_vec, pid_cid_fid_inlier); // out } // End optimization passes // Put back the scale in R.depth_to_image for (int cam_type = 0; cam_type < num_cam_types; cam_type++) R.depth_to_image[cam_type].linear() *= depth_to_image_scales[cam_type]; if (opt.save_matches) rig::saveInlierMatchPairs(imgData, opt.num_overlaps, pid_to_cid_fid, keypoint_vec, pid_cid_fid_inlier, opt.out_prefix); // Redo the registration unless told not to. // Note: applyRegistration modifies cams.world_to_ref (Affine3d form), which was updated // from state.world_to_ref_vec after the optimization loop above. if (!opt.skip_post_registration && opt.registration && opt.hugin_file != "" && opt.xyz_file != "") { // This time adjust the depth-to-image scale to be consistent with optimized cameras bool scale_depth = true; Eigen::Affine3d registration_trans; applyRegistration(opt.no_rig, scale_depth, opt.hugin_file, opt.xyz_file, has_depth, imgData, // Outputs registration_trans, cams.world_to_ref, cams.world_to_cam, R); // Transform accordingly the triangulated points rig::transformInlierTriPoints(registration_trans, pid_to_cid_fid, pid_cid_fid_inlier, xyz_vec); } if (opt.out_texture_dir != "") rig::meshProjectCameras(R.cam_names, R.cam_params, imgData, cams.world_to_cam, mesh, bvh_tree, opt.out_texture_dir); rig::saveCameraPoses(opt.out_prefix, imgData, cams.world_to_cam); bool model_rig = (!opt.no_rig); rig::writeRigConfig(opt.out_prefix + "/rig_config.txt", model_rig, R); std::string nvm_file = opt.out_prefix + "/cameras.nvm"; bool shift_keypoints = true; rig::writeInliersToNvm(nvm_file, shift_keypoints, R.cam_params, imgData, cams.world_to_cam, keypoint_vec, pid_to_cid_fid, pid_cid_fid_inlier, xyz_vec); if (opt.save_nvm_no_shift) { std::string nvm_file = opt.out_prefix + "/cameras_no_shift.nvm"; bool shift_keypoints = false; rig::writeInliersToNvm(nvm_file, shift_keypoints, R.cam_params, imgData, cams.world_to_cam, keypoint_vec, pid_to_cid_fid, pid_cid_fid_inlier, xyz_vec); } if (opt.export_to_voxblox) rig::exportToVoxblox(R.cam_names, imgData, R.depth_to_image, cams.world_to_cam, opt.out_prefix); if (opt.save_transformed_depth_clouds) rig::saveTransformedDepthClouds(R.cam_names, imgData, R.depth_to_image, cams.world_to_cam, opt.out_prefix); // Save the list of images (useful for bundle_adjust) std::string image_list = opt.out_prefix + "/image_list.txt"; rig::saveImageList(imgData, image_list); if (opt.save_pinhole_cameras) rig::writePinholeCameras(R.cam_names, R.cam_params, imgData, cams.world_to_cam, opt.out_prefix); std::string conv_angles_file = opt.out_prefix + "/convergence_angles.txt"; rig::savePairwiseConvergenceAngles(pid_to_cid_fid, keypoint_vec, imgData, cams.world_to_cam, xyz_vec, pid_cid_fid_inlier, conv_angles_file); return; } int main(int argc, char * argv[]) { try { run_rig_calibrator(argc, argv); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/rpc_gen.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file rpc_gen.cc /// /// This program will generate an RPC model from a DG model. /// It will work by creating a 3D grid in the provided lon-lat-height box, /// at each of those points finding the corresponding pixel value, and /// then finding the best-fitting RPC transform. For increased /// accuracy, both lon-lat-height and pixel values are normalized. /// /// Reference: The Cubic Rational Polynomial Camera Model, Hartley, 2001. #include <fstream> #include <asp/Camera/RPCModelGen.h> #include <asp/Camera/RPC_XML.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <xercesc/util/PlatformUtils.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw; using namespace asp; using namespace xercesc; /// Structure for storing user options struct RPC_gen_Options : vw::GdalWriteOptions { // Input std::string camera_model; // Settings double penalty_weight; BBox3 lon_lat_height_box; std::string output_prefix; }; /// Parse input arguments void handle_arguments( int argc, char *argv[], RPC_gen_Options& opt ) { po::options_description general_options(""); general_options.add_options() ("output-prefix", po::value(&opt.output_prefix)->default_value(""), "Write diagnostic/report files to this location. If not set then no files will be written.") ("penalty-weight", po::value(&opt.penalty_weight)->default_value(0.1), "Penalty weight to use to keep the higher-order RPC coefficients small. Higher penalty weight results in smaller such coefficients.") ("lon-lat-height-box", po::value(&opt.lon_lat_height_box)->default_value(BBox3(0,0,0,0,0,0)), "The 3D region in which to solve for the RPC model [lon_min lat_min height_min lon_max lat_max height_max]."); general_options.add( vw::GdalWriteOptionsDescription(opt) ); po::options_description positional(""); positional.add_options() ("camera-model", po::value(&opt.camera_model)); po::positional_options_description positional_desc; positional_desc.add("camera-model", 1); std::string usage("[options] <camera_model>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); if ( !vm.count("camera-model") ) vw_throw( ArgumentErr() << "Requires <camera_model> input in order to proceed.\n\n" << usage << general_options ); } void compute_scale_factors(vw::BBox3 const& gdc_box, vw::Vector2 const& image_size, Vector3 &llh_scale, Vector3 &llh_offset, Vector2 &uv_scale, Vector2 &uv_offset) { Vector3 min_llh_coord = gdc_box.min(); Vector3 max_llh_coord = gdc_box.max(); // Use matched axis scaling for pixels so one axis does not get higher error weighting llh_scale = (max_llh_coord - min_llh_coord)/2.0; // half range llh_offset = (max_llh_coord + min_llh_coord)/2.0; // center point // Prevent divide by zero for any dimension with no variation for (int i = 0; i < 3; i++) { if (llh_scale[i] == 0.0) llh_scale[i] = 1.0; } double pixel_max = vw::math::max(image_size); uv_scale = Vector2(pixel_max/2.0, pixel_max/2.0); // The long axis pixel is scaled to 1.0 uv_offset = image_size/2.0; // center point } /// Loads in the points from a text file void load_pairs_from_file(std::string const& path, Vector<double> &normalized_geodetics, Vector<double> &normalized_pixels, Vector3 &llh_scale, Vector3 &llh_offset, Vector2 &uv_scale, Vector2 &uv_offset) { // For now this only loads files from Geocam Space. const double HEIGHT = 0; // Might want to change this! vw_out() << "Reading point pairs from file...\n"; // Read through the file and extract all the points std::ifstream infile(path.c_str()); std::vector<Vector3> gdc_temp; std::vector<Vector2> pixel_temp; vw::BBox2 pixel_bbox; vw::BBox3 gdc_bbox; std::string line; while (std::getline(infile, line)) { size_t colon_pos = line.find(':'); size_t start_pos = colon_pos + 1; size_t comma_pos = line.find(','); size_t num1_len = comma_pos - start_pos; std::string num1_str = line.substr(start_pos, num1_len); std::string num2_str = line.substr(comma_pos+1); float num1 = atof(num1_str.c_str()); float num2 = atof(num2_str.c_str()); if (line[0] == 'u') { // = GDC Vector3 gdc(num1, num2, HEIGHT); gdc_temp.push_back(gdc); gdc_bbox.grow(gdc); }else { // v = pixel Vector2 pixel(num1, num2); pixel_temp.push_back(pixel); pixel_bbox.grow(pixel); } } // End loop through file // Check that we loaded the correct number of points size_t num_points = gdc_temp.size(); if (pixel_temp.size() != num_points) vw_throw( ArgumentErr() << "Error reading input file: counts\n"); // Automatically compute the scale factors compute_scale_factors(gdc_bbox, pixel_bbox.size(), llh_scale, llh_offset, uv_scale, uv_offset); // Initialize normalized data storage normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*num_points); normalized_pixels.set_size (RPCModel::IMAGE_COORD_SIZE *num_points + RpcSolveLMA::NUM_PENALTY_TERMS); for (size_t i = 0; i < normalized_pixels.size(); i++) normalized_pixels[i] = 0.0; // Important: The extra penalty terms are all set to zero here. for (size_t i=0; i<num_points; ++i) { // Normalize the points Vector3 gdc = elem_quot(gdc_temp [i] - llh_offset, llh_scale); Vector2 pixel = elem_quot(pixel_temp[i] - uv_offset, uv_scale ); // Pack them in the output vectors subvector(normalized_geodetics, RPCModel::GEODETIC_COORD_SIZE*i, RPCModel::GEODETIC_COORD_SIZE) = gdc; subvector(normalized_pixels, RPCModel::IMAGE_COORD_SIZE *i, RPCModel::IMAGE_COORD_SIZE ) = pixel; } vw_out() << "Loaded "<< num_points <<" processing point pairs from file\n"; } /// Generates the set of GDC/pixel pairs that will be fed into the solver. void generate_point_pairs(RPC_gen_Options opt, Vector<double> &normalized_geodetics, Vector<double> &normalized_pixels, Vector3 &llh_scale, Vector3 &llh_offset, Vector2 &uv_scale, Vector2 &uv_offset) { // If the user provided a text file instead of a camera model, load the points // straight from the file. if ( (opt.camera_model.find(".csv") != std::string::npos) || (opt.camera_model.find(".txt") != std::string::npos) ) { load_pairs_from_file(opt.camera_model, normalized_geodetics, normalized_pixels, llh_scale, llh_offset, uv_scale, uv_offset); return; } // Otherwise use the camera model information to generate the point pairs. // Load up the Digital Globe camera model from the camera file XMLPlatformUtils::Initialize(); // TODO: Replace with direct call? // Load the DG camera model. The API is kind of ugly. std::string session_name = "DG"; asp::SessionPtr session(asp::StereoSessionFactory::create (session_name, opt, "", "", opt.camera_model, opt.camera_model, "")); boost::shared_ptr<camera::CameraModel> cam_dg(session->camera_model("", opt.camera_model)); // Load up the RPC camera model from the camera file RPCXML xml; xml.read_from_file( opt.camera_model ); boost::shared_ptr<RPCModel> cam_rpc( new RPCModel( *xml.rpc_ptr() ) ); Vector2 image_size = xml_image_size(opt.camera_model); // Normalization in the lon-lat-height and pixel domains // - Compute an offset and scale to place all values in the // zero to one range centered on the center coordinate/pixel. // - The input RPC model has similar numbers loaded but we will use different // values unless the input options exactly match the input XML file. Vector3 min_llh_coord = opt.lon_lat_height_box.min(); Vector3 max_llh_coord = opt.lon_lat_height_box.max(); // Use matched axis scaling for pixels so one axis does not get higher error weighting llh_scale = (max_llh_coord - min_llh_coord)/2.0; // half range llh_offset = (max_llh_coord + min_llh_coord)/2.0; // center point double pixel_max = vw::math::max(image_size); uv_scale = Vector2(pixel_max/2.0, pixel_max/2.0); // The long axis pixel is scaled to 1.0 uv_offset = image_size/2.0; // center point // Number of points in x and y at which we will optimize the RPC // model. Using 10 or 20 points gives roughly similar results. // 20 points result in 20^3 input data for optimization, with the // number of variable to optimize being just 78. int num_pts = 20; // The number of points per axis int num_total_pts = num_pts*num_pts*num_pts; // Initialize normalized data storage normalized_geodetics.set_size(RPCModel::GEODETIC_COORD_SIZE*num_total_pts); normalized_pixels.set_size(RPCModel::IMAGE_COORD_SIZE*num_total_pts + RpcSolveLMA::NUM_PENALTY_TERMS); for (size_t i = 0; i < normalized_pixels.size(); i++) { // Important: The extra penalty terms are all set to zero here. normalized_pixels[i] = 0.0; } // Loop through all test points and generate the "correct" pairs / training data // using the trusted DG camera model. int count = 0; for (int x = 0; x < num_pts; x++){ for (int y = 0; y < num_pts; y++){ for (int z = 0; z < num_pts; z++){ // Test points are evenly spaced through the x/y/z -1 <> 1 range Vector3 U( x/(num_pts - 1.0), y/(num_pts - 1.0), z/(num_pts - 1.0) ); U = 2.0*U - Vector3(1, 1, 1); // in the box [-1, 1]^3. // Linear conversion from x/y/z to lat/lon/height Vector3 G = elem_prod(U, llh_scale) + llh_offset; // geodetic // Convert from geodetic to geocentric coordinates Vector3 P = cam_rpc->datum().geodetic_to_cartesian(G); // xyz // Project the GCC coordinate into the DG camera model Vector2 pxg = cam_dg->point_to_pixel(P); //Vector2 pxg = cam_rpc->point_to_pixel(P); // DEBUG -> Try fitting to RPC! // Normalize the pixel to -1 <> 1 range Vector2 pxn = elem_quot(pxg - uv_offset, uv_scale); // It is a useful exercise to compare DG and RPC cameras //Vector2 pxr = cam_rpc->point_to_pixel(P); //std::cout << U << ' ' << P << ' ' << pxg << ' ' << pxr << ' ' // << norm_2(pxg-pxr)<< std::endl; subvector(normalized_geodetics, RPCModel::GEODETIC_COORD_SIZE*count, RPCModel::GEODETIC_COORD_SIZE) = U; subvector(normalized_pixels, RPCModel::IMAGE_COORD_SIZE *count, RPCModel::IMAGE_COORD_SIZE ) = pxn; count++; } // End z loop } // End y loop } // End x loop } int main( int argc, char* argv[] ) { RPC_gen_Options opt; try { handle_arguments( argc, argv, opt ); // Generate all the point pairs using the input options Vector<double> normalized_geodetics; Vector<double> normalized_pixels; Vector3 llh_scale, llh_offset; Vector2 uv_scale, uv_offset; generate_point_pairs(opt, normalized_geodetics, normalized_pixels, llh_scale, llh_offset, uv_scale, uv_offset); // Find the RPC coefficients RPCModel::CoeffVec line_num, line_den, samp_num, samp_den; bool refine_only = false; gen_rpc(// Inputs opt.penalty_weight, normalized_geodetics, normalized_pixels, refine_only, // Outputs line_num, line_den, samp_num, samp_den); // Dump the output to stdout, to be parsed by python print_vec("uv_scale", uv_scale ); print_vec("uv_offset", uv_offset ); print_vec("llh_scale", llh_scale ); print_vec("llh_offset", llh_offset); print_vec("line_num", line_num ); print_vec("line_den", line_den ); print_vec("samp_num", samp_num ); print_vec("samp_den", samp_den ); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/runWithLog.py ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ from __future__ import print_function import sys import datetime import os if len(sys.argv) != 3: raise Exception('usage: %s <dir> "<cmd> [arg1] [arg2] ..."' % sys.argv[0]) logDir = sys.argv[1] fullCmd = sys.argv[2] timeStr = datetime.datetime.now().strftime('%Y%m%d_%H%M%S_%f') cmdArgv = fullCmd.split(' ') cmdShort = os.path.splitext(os.path.basename(cmdArgv[0]))[0] logFname = '%s/%s_%s.txt' % (logDir, timeStr, cmdShort) print('%s: logging to %s' % (sys.argv[0], logFname), file=sys.stderr) # open log if not os.path.exists(logDir): os.system('mkdir -p %s' % logDir) logFile = open(logFname, 'w') # close stdin devNull = open('/dev/null', 'rw') os.dup2(devNull.fileno(), 0) # redirect stdout and stderr to log os.dup2(logFile.fileno(), 1) os.dup2(logFile.fileno(), 2) quotedArgs = ['"%s"' % arg for arg in cmdArgv] print('%s: running: %s' % (sys.argv[0], ' '.join(quotedArgs)), file=sys.stderr) # run desired command os.execvp(cmdArgv[0], cmdArgv) ================================================ FILE: src/asp/Tools/sat_sim.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Tool to create simulated satellite images and/or pinhole cameras for them. // See the manual for details. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Camera/SyntheticLinescan.h> #include <asp/Camera/SatSim.h> #include <asp/Rig/RigConfig.h> #include <vw/Cartography/GeoReferenceBaseUtils.h> #include <vw/Cartography/CameraBBox.h> #include <vw/Camera/PinholeModel.h> #include <vw/Core/StringUtils.h> #include <vw/Core/Stopwatch.h> #include <vw/FileIO/FileUtils.h> #include <glog/logging.h> namespace po = boost::program_options; namespace fs = boost::filesystem; void handle_arguments(int argc, char *argv[], asp::SatSimOptions& opt, rig::RigSet & rig) { double NaN = std::numeric_limits<double>::quiet_NaN(); po::options_description general_options("General options"); general_options.add_options() ("dem", po::value(&opt.dem_file)->default_value(""), "Input DEM file.") ("ortho", po::value(&opt.ortho_file)->default_value(""), "Input georeferenced image file.") ("output-prefix,o", po::value(&opt.out_prefix), "Specify the output prefix. All the " "files that are saved will start with this prefix.") ("camera-list", po::value(&opt.camera_list)->default_value(""), "A file containing the list of pinhole cameras to create synthetic images for. " "Then these cameras will be used instead of generating them. Specify one file " "per line. The options --first, --last, --num, --focal-length, " "and --optical-center will be ignored.") ("first", po::value(&opt.first)->default_value(vw::Vector3(), ""), "First camera position, specified as DEM pixel column and row, and height above " "the DEM datum. See the doc for more info.") ("last", po::value(&opt.last)->default_value(vw::Vector3(), ""), "Last camera position, specified as DEM pixel column and row, and height above " "the DEM datum.") ("num", po::value(&opt.num_cameras)->default_value(0), "Number of cameras to generate, including the first and last ones. Must be positive. " "The cameras are uniformly distributed along the straight edge from first to last (in " "projected coordinates).") ("first-ground-pos", po::value(&opt.first_ground_pos)->default_value(vw::Vector2(NaN, NaN), ""), "Coordinates of first camera ground footprint center (DEM column and row). " "If not set, the cameras will look straight down (perpendicular to along " "and across track directions).") ("last-ground-pos", po::value(&opt.last_ground_pos)->default_value(vw::Vector2(NaN, NaN), ""), "Coordinates of last camera ground footprint center (DEM column and row). " "If not set, the cameras will look straight down (perpendicular to along " "and across track directions).") ("focal-length", po::value(&opt.focal_length)->default_value(NaN), "Output camera focal length in units of pixel.") ("optical-center", po::value(&opt.optical_center)->default_value(vw::Vector2(NaN, NaN),"NaN NaN"), "Output camera optical center (image column and row). Units of pixel.") ("image-size", po::value(&opt.image_size)->default_value(vw::Vector2(NaN, NaN), "NaN NaN"), "Output camera image size (width and height).") ("roll", po::value(&opt.roll)->default_value(NaN), "Camera roll angle, in degrees. See the documentation for more details.") ("pitch", po::value(&opt.pitch)->default_value(NaN), "Camera pitch angle, in degrees.") ("yaw", po::value(&opt.yaw)->default_value(NaN), "Camera yaw angle, in degrees.") ("velocity", po::value(&opt.velocity)->default_value(NaN), "Satellite velocity, in meters per second. Used for modeling jitter. A value of " "around 8000 m/s is typical for a satellite like SkySat in Sun-synchronous orbit " "(90 minute period) at an altitude of about 450 km. For WorldView, the velocity " "is around 7500 m/s, with a higher altitude and longer period.") ("jitter-frequency", po::value(&opt.jitter_frequency_str)->default_value(""), "Jitter frequency, in Hz. Used for modeling jitter (satellite vibration). " "Several frequencies can be specified. Use a quoted list, with spaces " "as separators (or separated by commas with no quotes). See also " "--jitter-amplitude and --horizontal-uncertainty.") ("jitter-phase", po::value(&opt.jitter_phase_str)->default_value(""), "Jitter phase, in radians. Measures the jitter phase offset from the start of " "the orbit as set by --first. Specify as a quoted list of numbers (or " "separated by commas with no quotes). The number " "of values must be 3 times the number of frequencies. The order in this list " "corresponds to phase for roll, pitch, and yaw for first frequency, then " "second frequency, etc. If not specified, will be set to 0.") ("horizontal-uncertainty", po::value(&opt.horizontal_uncertainty_str)->default_value(""), "Camera horizontal uncertainty on the ground, in meters, at nadir orientation. " "Specify as a quoted list of three numbers (or separated by commas with no quotes), " "used for roll, pitch, and yaw. The jitter amplitude for each of these angles " "is found as " "= atan(horizontal_uncertainty / satellite_elevation_above_datum), then converted " "to degrees. See also --jitter-amplitude.") ("jitter-amplitude", po::value(&opt.jitter_amplitude_str)->default_value(""), "Jitter amplitude, in micro radians. Specify as a quoted list having " "amplitude in roll, pitch, yaw for first frequency, then for second, and so on. " "Separate the values by spaces (or commas with no quotes).") ("first-index", po::value(&opt.first_index)->default_value(-1), "Index of first camera and/or image to generate, starting from 0. If not set, will " "create all images/cameras. This is used for parallelization.") ("last-index", po::value(&opt.last_index)->default_value(-1), "Index of last image and/or camera to generate, starting from 0. Stop before " "this index. If not set, will create all images/cameras. This is used for " "parallelization.") ("frame-rate", po::value(&opt.frame_rate)->default_value(NaN), "Camera frame rate, per second. Can be in double precision. If set, it will override " "--num. The cameras will start from --first (after any position adjustment, if " "applicable, per the doc). Set the --velocity value. The last camera will be no further " "than the (adjusted) value of --last along the orbit.") ("sensor-type", po::value(&opt.sensor_type)->default_value("pinhole"), "Sensor type for created cameras and images. Can be one of: pinhole, linescan. " "Can use 'frame' instead of 'pinhole'. With a rig, this can be a list of values, " "separated by commas, with no spaces, one per sensor, if desired to have different " "types for different sensors.") ("non-square-pixels", po::bool_switch(&opt.non_square_pixels)->default_value(false)->implicit_value(true), "When creating linescan cameras and images, use the provided image height in pixels, " "even if that results in non-square pixels. The default is to auto-compute the image " "height.") ("no-images", po::bool_switch(&opt.no_images)->default_value(false)->implicit_value(true), "Create only cameras, and no images. Cannot be used with --camera-list.") ("save-ref-cams", po::bool_switch(&opt.save_ref_cams)->default_value(false)->implicit_value(true), "For each created camera, save also the 'reference' camera that has no roll, pitch, " "yaw, jitter, or 90 degree in-sensor-plane rotation from camera to satellite " "coordinates. Their names have '-ref-' after the output prefix.") ("save-as-csm", po::bool_switch(&opt.save_as_csm)->default_value(false)->implicit_value(true), "Save Pinhole (frame) cameras in the CSM format, as done for linescan cameras. " "Can be used to combine these sensors in bundle adjustment and solving for jitter.") ("rig-config", po::value(&opt.rig_config)->default_value(""), "Simulate a frame camera rig with this configuration file. Then do not set the image " "size, focal length, optical center on the command line, as those are set by the rig. " "The transforms on this rig may be adjusted via --rig-sensor-ground-offsets " "and --rig-sensor-rotation-angles.") ("rig-sensor-ground-offsets", po::value(&opt.rig_sensor_ground_offsets)->default_value(""), "Modify the input rig so that each sensor center has the given horizontal offsets " "from the rig center in the rig plane, and the sensor ground footprint centers have " "the given ground plane offsets from the nominal ground footprint center at nadir. " "Specify as a quoted list of values, separated by spaces or commas. The order is " "sensor1_x sensor1_y ground1_x ground1_y followed by sensor 2, etc. The units are in " "meter. These will determine the sensor orientations. If not set, use 0 for all " "sensors.") ("rig-sensor-rotation-angles", po::value(&opt.rig_sensor_rotation_angles)->default_value(""), "Modify the input rig by rotating each sensor by the given angle in the sensor " "plane. Specify as one number per sensor, in degrees, separated by commas, or " "in quotes and separated by spaces.") ("sensor-name", po::value(&opt.sensor_name)->default_value("all"), "Name of the sensor in the rig to simulate. If not set, will simulate all sensors. " "If more than one, list them separated by commas (no spaces).") ("model-time", po::bool_switch(&opt.model_time)->default_value(false)->implicit_value(true), "Model time at each camera position. See also --start-time.") ("reference-time", po::value(&opt.ref_time)->default_value(10000), "The measured time, in seconds, when the satellite is along given orbit, in nadir " "orientation, with the center view direction closest to the ground point at " "--first-ground-pos. A unique value for each orbit is suggested. A large value " "(millions), may result in numerical issues.") ("perturb-cameras", po::bool_switch(&opt.perturb_cameras)->default_value(false)->implicit_value(true), "Apply a jitter perturbation to existing cameras.") ("random-pose-perturbation", po::bool_switch(&opt.random_pose_perturbation)->default_value(false)->implicit_value(true), "Apply a random pose perturbation to existing cameras, with the amplitude " "specified by --horizontal-uncertainty.") ("random-position-perturbation", po::value(&opt.random_position_perturbation)->default_value(NaN), "Apply a random position perturbation to existing camera centers, with the given " "magnitude, in meters.") ("dem-height-error-tol", po::value(&opt.dem_height_error_tol)->default_value(0.001), "When intersecting a ray with a DEM, use this as the height error tolerance " "(measured in meters). It is expected that the default will be always good enough.") ("blur-sigma", po::value(&opt.blur_sigma)->default_value(0.0), "When creating images, blur them with a Gaussian with this sigma. The sigma is " "in input orthoimage pixel units.") ("help,h", "Display this help message.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("--dem <dem file> --ortho <ortho image file> " "[other options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // When invoked with no arguments or no output prefix, display the help message. if (opt.out_prefix == "") vw::vw_throw(vw::ArgumentErr() << "Missing output prefix.\n" << usage << general_options); // Create the output directory based on the output prefix vw::create_out_dir(opt.out_prefix); // Turn on logging to file asp::log_to_file(argc, argv, "", opt.out_prefix); // Some functions use google logging google::InitGoogleLogging(argv[0]); bool have_perturb = opt.perturb_cameras || opt.random_pose_perturbation || !std::isnan(opt.random_position_perturbation); // Only one of the three options above must be set if (int(opt.perturb_cameras) + int(opt.random_pose_perturbation) + int(!std::isnan(opt.random_position_perturbation)) > 1) vw::vw_throw(vw::ArgumentErr() << "Only one of --perturb-cameras, " "--random-pose-perturbation, and --random-position-perturbation " "can be set.\n"); if (opt.dem_file == "") vw::vw_throw(vw::ArgumentErr() << "Missing input DEM.\n"); if (opt.ortho_file == "" && !have_perturb) vw::vw_throw(vw::ArgumentErr() << "Missing input ortho image.\n"); bool have_rig = !opt.rig_config.empty(); if (have_rig && opt.camera_list != "") vw::vw_throw(vw::ArgumentErr() << "Cannot specify both --rig-config and --camera-list.\n"); if (have_rig && (!vm["image-size"].defaulted() || !vm["focal-length"].defaulted() || !vm["optical-center"].defaulted())) vw::vw_throw(vw::ArgumentErr() << "Cannot specify image size, focal length, or " "optical center when using a rig. Those are set in the rig configuration file.\n"); if (have_rig && !opt.model_time) { opt.model_time = true; vw::vw_out() << "Will model time as a rig was specified.\n"; } if (!have_rig && (!have_perturb || opt.save_as_csm)) { if (std::isnan(opt.image_size[0]) || std::isnan(opt.image_size[1])) vw::vw_throw(vw::ArgumentErr() << "The image size must be specified.\n"); if (opt.image_size[0] <= 1 || opt.image_size[1] <= 1) vw::vw_throw(vw::ArgumentErr() << "The image size must be at least 2 x 2.\n"); } if (opt.camera_list != "" && opt.no_images && !have_perturb) vw::vw_throw(vw::ArgumentErr() << "The --camera-list and --no-images options " "cannot be used together.\n"); if (opt.camera_list == "") { if (opt.first == vw::Vector3() || opt.last == vw::Vector3()) vw::vw_throw(vw::ArgumentErr() << "The first and last camera positions must be " "specified.\n"); if (opt.first[2] != opt.last[2]) vw::vw_out() << "Warning: The first and last camera positions have different " << "heights above the datum. This is supported but is not usual. " << "Check your inputs.\n"; if (std::isnan(opt.frame_rate)) { if (opt.num_cameras < 1) vw::vw_throw(vw::ArgumentErr() << "The number of cameras must be at least 1.\n"); } else { // Frame rate is set. Then need not set num cameras. if (opt.num_cameras > 0) vw::vw_throw(vw::ArgumentErr() << "Cannot set both --num and --frame-rate.\n"); // Must have a positive velocity if (std::isnan(opt.velocity) || opt.velocity <= 0.0) vw::vw_throw(vw::ArgumentErr() << "The velocity must be positive if using " << " --frame-rate.\n"); } // Validate focal length, optical center, and image size if (!have_rig) { if (std::isnan(opt.focal_length)) vw::vw_throw(vw::ArgumentErr() << "The focal length must be positive.\n"); if (std::isnan(opt.optical_center[0]) || std::isnan(opt.optical_center[1])) vw::vw_throw(vw::ArgumentErr() << "The optical center must be specified.\n"); // If the optical center is large, the images will show up very oblique. // The current logic implicitly assumes that the optical center is close to // the image center. if (opt.optical_center[0] < 0 || opt.optical_center[1] < 0 || opt.optical_center[0] >= opt.image_size[0] || opt.optical_center[1] >= opt.image_size[1]) vw::vw_throw(vw::ArgumentErr() << "The optical center must be non-negative and " << "within the image bounds. It is suggested to have it close to " << "the image center.\n"); } // Either both first and last ground positions are specified, or none. if (std::isnan(norm_2(opt.first_ground_pos)) != std::isnan(norm_2(opt.last_ground_pos))) vw::vw_throw(vw::ArgumentErr() << "Either both first and last ground positions " "must be specified, or none.\n"); // Check that either all of roll, pitch, and yaw are specified, or none. int ans = int(std::isnan(opt.roll)) + int(std::isnan(opt.pitch)) + int(std::isnan(opt.yaw)); if (ans != 0 && ans != 3) vw::vw_throw(vw::ArgumentErr() << "Either all of roll, pitch, and yaw must be " "specified, or none.\n"); } // Parse jitter frequency // Convert from string to vector of doubles std::string sep = ", \t\n"; // separators: comma, space, tab, newline opt.jitter_frequency = vw::str_to_std_vec(opt.jitter_frequency_str, sep); if (opt.jitter_frequency.empty()) opt.jitter_frequency.push_back(NaN); // Horizontal uncertainty must be 3 values. Must specify either this or // jitter amplitude. opt.horizontal_uncertainty = vw::str_to_std_vec(opt.horizontal_uncertainty_str, sep); if (!opt.horizontal_uncertainty.empty() && opt.horizontal_uncertainty.size() != 3) vw::vw_throw(vw::ArgumentErr() << "The horizontal uncertainty must be specified " "as three values, separated by commas or spaces.\n"); // Number of jitter amplitudes must be 3x the number of frequencies. It can // be empty, if horizontal uncertainty is specified. opt.jitter_amplitude = vw::str_to_std_vec(opt.jitter_amplitude_str, sep); if (opt.jitter_amplitude.empty() && opt.horizontal_uncertainty.empty()) { // Default amplitude is 0 for (size_t i = 0; i < opt.jitter_frequency.size() * 3; i++) opt.jitter_amplitude.push_back(0.0); } // Number of jitter phases must be 3x the number of frequencies. opt.jitter_phase = vw::str_to_std_vec(opt.jitter_phase_str, sep); if (opt.jitter_phase.empty()) { // Default phase is 0 for (size_t i = 0; i < opt.jitter_frequency.size() * 3; i++) opt.jitter_phase.push_back(0.0); } // Sanity checks if (!opt.horizontal_uncertainty_str.empty() && !opt.jitter_amplitude_str.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both jitter uncertainty and jitter amplitude.\n"); if (!opt.horizontal_uncertainty.empty() && !opt.jitter_amplitude.empty()) vw::vw_throw(vw::ArgumentErr() << "Cannot specify both jitter uncertainty and jitter amplitude.\n"); bool have_pose_perturb = opt.random_pose_perturbation || opt.perturb_cameras; bool model_jitter = (!std::isnan(opt.jitter_frequency[0]) || have_pose_perturb); if (model_jitter) { bool have_roll_pitch_yaw = !std::isnan(opt.roll) && !std::isnan(opt.pitch) && !std::isnan(opt.yaw); if (!have_roll_pitch_yaw && !have_pose_perturb) vw::vw_throw(vw::ArgumentErr() << "Modelling jitter requires specifying --roll, --pitch, and --yaw.\n"); if (opt.camera_list != "" && !have_pose_perturb) vw::vw_throw(vw::ArgumentErr() << "The --camera-list option must not be set " << "when modeling jitter.\n"); // See if the user specified either horizontal uncertainty or jitter amplitude if (opt.horizontal_uncertainty_str.empty() && opt.jitter_amplitude_str.empty() && std::isnan(opt.random_position_perturbation)) vw::vw_throw(vw::ArgumentErr() << "Must specify either horizontal uncertainty " << "or jitter amplitude.\n"); if (3 * opt.jitter_frequency.size() != opt.jitter_phase.size()) vw::vw_throw(vw::ArgumentErr() << "The number of jitter phases must be " << "three times the number of jitter frequencies.\n"); if (opt.horizontal_uncertainty.empty()) { // Jitter amplitude was specified if (3 * opt.jitter_frequency.size() != opt.jitter_amplitude.size()) vw::vw_throw(vw::ArgumentErr() << "The number of jitter amplitudes must be " << "three times the number of jitter frequencies.\n"); } else { // Horizontal uncertainty was specified. if (opt.horizontal_uncertainty.size() != 3) vw::vw_throw(vw::ArgumentErr() << "The number of horizontal uncertainty values " << "must be 3.\n"); if (opt.horizontal_uncertainty[0] < 0 || opt.horizontal_uncertainty[1] < 0 || opt.horizontal_uncertainty[2] < 0) vw::vw_throw(vw::ArgumentErr() << "The horizontal uncertainty must be non-negative.\n"); } // Check that all jitter frequencies are not NaN and positive for (size_t i = 0; i < opt.jitter_frequency.size(); i++) { if (std::isnan(opt.jitter_frequency[i]) && !opt.random_pose_perturbation && std::isnan(opt.random_position_perturbation)) vw::vw_throw(vw::ArgumentErr() << "The jitter frequency must be specified.\n"); if (opt.jitter_frequency[i] <= 0) vw::vw_throw(vw::ArgumentErr() << "The jitter frequency must be positive.\n"); } } // end if model jitter if (opt.velocity <= 0) vw::vw_throw(vw::ArgumentErr() << "The satellite velocity must be positive.\n"); // Checks for linescan cameras bool have_linescan = (opt.sensor_type.find("linescan") != std::string::npos); if (have_linescan && std::isnan(opt.velocity)) vw::vw_throw(vw::ArgumentErr() << "The satellite velocity must be specified " << "in order to create linescan cameras.\n"); if (opt.non_square_pixels && !have_linescan) vw::vw_throw(vw::ArgumentErr() << "Cannot specify --non-square-pixels unless creating " << "linescan cameras.\n"); // Sanity check the first and last indices int ans = int(opt.first_index < 0) + int(opt.last_index < 0); if (ans != 0 && ans != 2) vw::vw_throw(vw::ArgumentErr() << "Either both first and last indices must be " "specified, or none.\n"); if (ans == 0 && opt.first_index >= opt.last_index) vw::vw_throw(vw::ArgumentErr() << "The first index must be less than " "the last index.\n"); // Check for sensor type. With a rig, it will be checked later, per sensor. if (!have_rig) { if (opt.sensor_type == "frame") opt.sensor_type = "pinhole"; // pinhole is same as frame if (opt.sensor_type != "pinhole" && opt.sensor_type != "linescan") vw::vw_throw(vw::ArgumentErr() << "The sensor type must be either pinhole/frame or linescan.\n"); } if (opt.model_time) { // Must have the velocity set if (std::isnan(opt.velocity)) vw::vw_throw(vw::ArgumentErr() << "Must set the velocity to model time.\n"); // Must have first ground pos if (std::isnan(norm_2(opt.first_ground_pos))) vw::vw_throw(vw::ArgumentErr() << "Must set the first ground position to model time.\n"); if (opt.camera_list != "") vw::vw_throw(vw::ArgumentErr() << "Cannot model time with --camera-list.\n"); } // Check the reference time. We want the time accurate to within 1e-8 seconds, // and that is tricky when the time is large. if (opt.ref_time <= 0 || opt.ref_time >= 1e+6) vw::vw_throw(vw::ArgumentErr() << "The reference time is not positive or is too large. " << "This can cause numerical issues.\n"); if (have_rig) { // Read the rig configuration bool have_rig_transforms = true; // dictated by the api rig::readRigConfig(opt.rig_config, have_rig_transforms, rig); // Must have just one rig if (rig.cam_set.size() != 1) vw::vw_throw(vw::ArgumentErr() << "Only one rig (reference sensor) is supported " << "in sat_sim.\n"); for (size_t i = 0; i < rig.cam_params.size(); i++) { auto const& params = rig.cam_params[i]; // If the optical center is large, the images will show up very oblique. // The current sat_sim logic implicitly assumes that the optical center is close to // the image center, as we shoot rays to the ground not through the optical // center but through the middle of the image. if (params.GetOpticalOffset()[0] < 0 || params.GetOpticalOffset()[1] < 0 || params.GetOpticalOffset()[0] >= params.GetDistortedSize()[0] || params.GetOpticalOffset()[1] >= params.GetDistortedSize()[1]) vw::vw_throw(vw::ArgumentErr() << "The optical center must be non-negative and " << "within the image bounds. It is suggested to have it close to " << "the image center.\n"); if (params.GetDistortion().size() != 0) vw::vw_throw(vw::ArgumentErr() << "Distortion is not supported in sat_sim.\n"); } } if (have_perturb) { // must have camera list if (opt.camera_list.empty()) vw::vw_throw(vw::ArgumentErr() << "Must have camera list to perturb cameras.\n"); // Sensor type must be pinhole if (opt.sensor_type != "pinhole") vw::vw_throw(vw::ArgumentErr() << "Perturbing cameras is only supported for pinhole cameras.\n"); // Must not have a rig if (!opt.rig_config.empty()) vw::vw_throw(vw::ArgumentErr() << "Perturbing cameras is not supported for rigs.\n"); // Must set the satellite velocity if (std::isnan(opt.velocity) && opt.perturb_cameras) vw::vw_throw(vw::ArgumentErr() << "Must set the satellite velocity to perturb cameras.\n"); // The jitter frequency must be set and not NaN if ((opt.jitter_frequency.empty() || std::isnan(opt.jitter_frequency[0])) && opt.perturb_cameras) vw::vw_throw(vw::ArgumentErr() << "Must set the jitter frequency to perturb cameras.\n"); if ((std::isnan(opt.velocity) || opt.velocity <= 0.0) && std::isnan(opt.random_position_perturbation)) vw::vw_throw(vw::ArgumentErr() << "The satellite velocity must be set and positive if " << "perturbing existing cameras.\n"); // No images will be created opt.no_images = true; } // Blur sigma must be non-negative if (opt.blur_sigma < 0) vw::vw_throw(vw::ArgumentErr() << "The blur sigma must be non-negative.\n"); return; } int main(int argc, char *argv[]) { asp::SatSimOptions opt; rig::RigSet rig; try { handle_arguments(argc, argv, opt, rig); // Read the DEM vw::ImageViewRef<vw::PixelMask<float>> dem; float dem_nodata_val = -std::numeric_limits<float>::max(); // will change vw::cartography::GeoReference dem_georef; vw::cartography::readGeorefImage(opt.dem_file, dem_nodata_val, dem_georef, dem); double height_guess = vw::cartography::demHeightGuess(dem); // for image-to-ground // Read the ortho image vw::ImageViewRef<vw::PixelMask<float>> ortho; float ortho_nodata_val = -std::numeric_limits<float>::max(); // will change vw::cartography::GeoReference ortho_georef; bool have_perturb = opt.perturb_cameras || opt.random_pose_perturbation || !std::isnan(opt.random_position_perturbation); if (!have_perturb) vw::cartography::readGeorefImage(opt.ortho_file, ortho_nodata_val, ortho_georef, ortho); std::vector<std::string> cam_names; std::vector<vw::CamPtr> cams; bool external_cameras = false; std::string suffix = ""; if (!opt.camera_list.empty()) { // Read the cameras external_cameras = true; if (opt.sensor_type == "pinhole") asp::readPinholeCameras(opt, cam_names, cams); else asp::readLinescanCameras(opt, cam_names, cams); if (have_perturb) asp::perturbCameras(opt, suffix, dem_georef, cam_names, cams); // Generate images if (!opt.no_images) asp::genImages(opt, external_cameras, cam_names, cams, suffix, dem_georef, dem, height_guess, ortho_georef, ortho, ortho_nodata_val); } else if (opt.rig_config.empty()) { // Generate the cameras // The matrix cam2world_no_jitter is only needed with linescan cameras, // but compute it for consistency in all cases. bool have_rig = false; int rig_sensor_index = -1; asp::genCamerasImages(ortho_nodata_val, have_rig, rig_sensor_index, dem, height_guess, ortho_georef, ortho, opt, rig, dem_georef, suffix); } else { // The rig needs special treatment asp::genRigCamerasImages(opt, rig, dem_georef, dem, height_guess, ortho_georef, ortho, ortho_nodata_val); } if (!opt.rig_config.empty()) asp::writeRelRig(opt.out_prefix, rig); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/scale_bathy_mask.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' A tool which takes as input a multispectral mask and a PAN image, and scales and crops the former to agree with the latter. Used during shallow-water bathymetry. See: https://stereopipeline.readthedocs.io/en/latest ''' from __future__ import print_function import sys, os, subprocess # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_image_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] if len(sys.argv) < 4: print("Usage: " + sys.argv[0] + " ms_mask.tif pan_image.tif output_pan_mask.tif [num_left_cols_crop]") sys.exit(1) ms_mask = sys.argv[1] pan_image = sys.argv[2] if not os.path.exists(ms_mask): print("Missing file: " + ms_mask) sys.exit(1) if not os.path.exists(pan_image): print("Missing file: " + pan_image) sys.exit(1) # It is not clear how much to crop on the left # A value of 50 seems to work better with WV03 and 48 with WV02. crop_len = 50 if len(sys.argv) >= 5: crop_len = sys.argv[4] print("Will remove " + str(crop_len) + " columns on the left after scaling the mask.") output_pan_mask = sys.argv[3] tmp_pan_mask = os.path.splitext(output_pan_mask)[0]+'_tmp.tif' ms_width, ms_height = asp_image_utils.getImageSize(ms_mask) pan_width, pan_height = asp_image_utils.getImageSize(pan_image) # gdal_translate with options gdt = 'gdal_translate -co compress=lzw -co TILED=yes -co INTERLEAVE=BAND ' + \ '-co BLOCKXSIZE=256 -co BLOCKYSIZE=256 -co BIGTIFF=YES ' # Scale up the mask. Cast to float32. cmd = gdt + '-outsize 400% 400% -ot float32 ' + ms_mask + " " + tmp_pan_mask print(cmd) os.system(cmd) scaled_width, scaled_height = asp_image_utils.getImageSize(tmp_pan_mask) # Remove crop_len pixels from the left edge, then adjust the other dimensions # so that the resulting PAN mask dimensions agree with the PAN image. cmd = gdt + "-srcwin " + str(crop_len) + " 0 " + str(pan_width) + " " + str(pan_height) + \ " " + tmp_pan_mask + " " + output_pan_mask print(cmd) os.system(cmd) # Wipe the temporary file print("Removing: " + tmp_pan_mask) os.remove(tmp_pan_mask) ================================================ FILE: src/asp/Tools/sfm_merge.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigThread.h> #include <asp/Rig/InterestPoint.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/MergeMaps.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Core/Nvm.h> #include <opencv2/features2d/features2d.hpp> #include <gflags/gflags.h> #include <glog/logging.h> #include <iostream> #include <fstream> #include <algorithm> #include <thread> // Merge n maps by merging second into the first, then the third into // the merged map, etc. It works by finding matches among the maps // using -num_image_overlaps_at_endpoints and then bringing the second // map in the coordinate system of the first map. It is suggested that // bundle adjustment and registration to real-world coordinate systems // be (re-)done after maps are merged, using rig_calibrator. DEFINE_string(rig_config, "", "Read the configuration of sensors from this file in the format used for " "rig_calibrator, even though this tool does not use the rig structure. " "The output of this program can be passed back to rig_calibrator, " "with or without the rig constraint."); DEFINE_string(output_map, "", "Output file containing the merged map."); DEFINE_int32(num_threads, rig::defaultNumThreads(), "Number of threads to use."); DEFINE_int32(num_image_overlaps_at_endpoints, 10, "Search this many images at the beginning and end of the first map " "for matches to this many images at the beginning and end of the " "second map."); DEFINE_bool(fix_first_map, false, "If true, after merging the maps and reconciling the camera poses for the " "shared images, overwrite the shared poses with those from the first map."); DEFINE_bool(fast_merge, false, "When merging maps that have shared images, use their camera poses to " "find the transform from other maps to first map, and skip finding " "additional matches among the images."); DEFINE_bool(no_shift, false, "Assume that in the input .nvm files the features are not shifted " "relative to the optical center. The merged map will then be saved " "the same way. The usual behavior is that .nvm file features are " "shifted, then this tool internally undoes the shift."); DEFINE_bool(no_transform, false, "Do not compute and apply a transform from the other " "maps to the first one. This keeps the camera poses as " "they are (shared poses and features will be reconciled). " "This will succeed even when the two maps do not overlap."); DEFINE_double(close_dist, -1.0, "Two triangulated points are considered to be close if no further " "than this distance, in meters. Used as inlier threshold when " "identifying triangulated points after the maps are " "aligned. Auto-computed, taking into account the extent of " "a tight subset of the triangulated points and printed on screen if " "not set. This is an advanced option. "); DEFINE_string(image_sensor_list, "", "Read image name, sensor name, and timestamp, from each line in this list. " "Alternatively, a directory structure can be used."); void parameterValidation(int argc, char** argv) { if (argc < 3) LOG(FATAL) << "Usage: " << argv[0] << " <input maps> -output-map <output map>"; // Ensure we don't over-write one of the inputs for (int i = 1; i < argc; i++) { if (argv[i] == FLAGS_output_map) LOG(FATAL) << "The input and output maps must have different names."; } if (FLAGS_rig_config == "") LOG(FATAL) << "The rig configuration was not specified."; if (FLAGS_output_map == "") LOG(FATAL) << "No output map was specified."; if (!FLAGS_fast_merge && FLAGS_num_image_overlaps_at_endpoints <= 0) LOG(FATAL) << "Must have num_image_overlaps_at_endpoints > 0."; if (FLAGS_fix_first_map && argc != 3) LOG(FATAL) << "Keeping the first map fixed works only when there are two input maps."; } // Merge offsets read from different nvm files. Any duplicate offsets must be the same. void mergeOffsets(std::vector<std::map<std::string, Eigen::Vector2d>> const& offsets, std::map<std::string, Eigen::Vector2d> & combined_offsets) { // Wipe the output combined_offsets.clear(); for (size_t i = 0; i < offsets.size(); i++) { for (auto const& it: offsets[i]) { auto pos = combined_offsets.find(it.first); if (pos == combined_offsets.end()) { combined_offsets[it.first] = it.second; } else { if (pos->second != it.second) { LOG(FATAL) << "The same image has different offsets in different maps."; } } } } } int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); google::ParseCommandLineFlags(&argc, &argv, true); parameterValidation(argc, argv); rig::RigSet R; bool use_initial_rig_transforms = false; // not used, part of the API rig::readRigConfig(FLAGS_rig_config, use_initial_rig_transforms, R); // Store the offsets for all maps that we will merge std::vector<std::map<std::string, Eigen::Vector2d>> offsets(argc - 1); asp::nvmData in0; asp::readNvm(argv[1], in0.cid_to_keypoint_map, in0.cid_to_filename, in0.pid_to_cid_fid, in0.pid_to_xyz, in0.world_to_cam, in0.focal_lengths); if (!FLAGS_no_shift) { bool undo_shift = true; // remove the shift relative to the optical center std::string offsets_file = asp::offsetsFilename(argv[1]); asp::readNvmOffsets(offsets_file, in0.optical_centers); offsets[0] = in0.optical_centers; // TODO(oalexan1): Undoing shift of keypoints should happen on reading the nvm rig::shiftKeypoints(undo_shift, R, in0); } // Successively append the maps asp::nvmData out_map; for (int i = 2; i < argc; i++) { asp::nvmData in1; asp::readNvm(argv[i], in1.cid_to_keypoint_map, in1.cid_to_filename, in1.pid_to_cid_fid, in1.pid_to_xyz, in1.world_to_cam, in1.focal_lengths); if (!FLAGS_no_shift) { bool undo_shift = true; // remove the shift relative to the optical center std::string offsets_file = asp::offsetsFilename(argv[i]); asp::readNvmOffsets(offsets_file, in1.optical_centers); offsets[i - 1] = in1.optical_centers; // TODO(oalexan1): Undoing shift of keypoints should happen on reading the nvm rig::shiftKeypoints(undo_shift, R, in1); } // TODO(oalexan1): Add flag to not have to transform second map, then use // this code to merge the theia nvm and produced nvm. rig::MergeMaps(in0, in1, R, FLAGS_num_image_overlaps_at_endpoints, FLAGS_fast_merge, FLAGS_no_transform, FLAGS_close_dist, FLAGS_image_sensor_list, FLAGS_num_threads, out_map); if (i + 1 < argc) { // There are more maps to marge. Let in0 be what we have so far, // and will merge onto it at the next iteration // TODO(oalexan1): Test this! in0 = out_map; } } if (FLAGS_fix_first_map) { // TODO(oalexan1): Make this work with N maps // Poses shared among the two input maps were averaged after // merging in out_map. Now, replace all poses in out_map which // exist in the first map with the originals from that map. std::map<std::string, int> in0_name_to_cid; for (size_t in0_cid = 0; in0_cid < in0.cid_to_filename.size(); in0_cid++) in0_name_to_cid[in0.cid_to_filename[in0_cid]] = in0_cid; for (size_t out_cid = 0; out_cid < out_map.cid_to_filename.size(); out_cid++) { auto pos = in0_name_to_cid.find(out_map.cid_to_filename[out_cid]); if (pos == in0_name_to_cid.end()) continue; // was not in in0 int in0_cid = pos->second; out_map.world_to_cam[out_cid] = in0.world_to_cam[in0_cid]; } } if (!FLAGS_no_shift) { bool undo_shift = false; // put back the shift // TODO(oalexan1): This must happen in MergeMaps mergeOffsets(offsets, out_map.optical_centers); // TODO(oalexan1): Shifting the keypoints should happen on writing the nvm rig::shiftKeypoints(undo_shift, R, out_map); } // TODO(oalexan1): Throw out outliers! asp::writeNvm(out_map.cid_to_keypoint_map, out_map.cid_to_filename, out_map.pid_to_cid_fid, out_map.pid_to_xyz, out_map.world_to_cam, FLAGS_output_map); // Save the optical offsets if (!FLAGS_no_shift) { // Write the optical center offsets to a file std::string offsets_file = asp::offsetsFilename(FLAGS_output_map); asp::writeNvmOffsets(offsets_file, out_map.optical_centers); } return 0; } ================================================ FILE: src/asp/Tools/sfm_proc ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ Documentation: https://stereopipeline.readthedocs.io/en/latest/tools/sfm_proc.html """ import argparse, glob, os, re, subprocess, sys # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_string_utils, asp_cmd_utils asp_system_utils.verify_python_version_is_supported() def sanityChecks(args): if args.image_list == "": raise Exception("The path to the image list was not specified.") if args.out_dir == "": raise Exception("The path to the output directory was not specified.") def processArgs(args): """ Set up the parser and parse the args. """ # Number of arguments before starting to parse them num_input_args = len(sys.argv) parser = argparse.ArgumentParser(description="") parser.add_argument("--image-list", dest="image_list", default="", help = "A file listing the input images with EXIF data, one per line.") parser.add_argument("--out-dir", dest="out_dir", default="", help="The output directory that will contain the processed data.") args, other = parser.parse_known_args() # Print the help message if called with no arguments if num_input_args <= 1: parser.print_help() sys.exit(1) sanityChecks(args) return args def extractExif(jpg_file_path): """ Extract some EXIF metadata from a JPG file using gdalinfo. Args: jpg_file_path (str): Path to the JPG file Returns: dict: A dictionary of GPS-related EXIF metadata """ try: # Run gdalinfo and capture its output result = subprocess.run( ['gdalinfo', jpg_file_path], capture_output=True, text=True, check=True ) # Dictionary to store GPS metadata gps_metadata = {} # Regex patterns for specific GPS fields patterns = { 'GPSAltitude': r'EXIF_GPSAltitude=\(([^)]+)\)', 'GPSImgDirection': r'EXIF_GPSImgDirection=\(([^)]+)\)', 'GPSLatitude': r'EXIF_GPSLatitude=\(([^)]+)\) \(([^)]+)\) \(([^)]+)\)', 'GPSLongitude': r'EXIF_GPSLongitude=\(([^)]+)\) \(([^)]+)\) \(([^)]+)\)', 'GPSLongitudeRef': r'EXIF_GPSLongitudeRef=(\w+)' } # Extract each GPS field for key, pattern in patterns.items(): match = re.search(pattern, result.stdout) if match: if key in ['GPSLatitude', 'GPSLongitude']: # For latitude and longitude, store as a tuple of three values deg = float(match.group(1)) min = float(match.group(2)) sec = float(match.group(3)) # sec must be 0 if sec != 0: raise Exception(f"Unexpected third value for key: " + key) gps_metadata[key] = deg + min/60.0 + sec/3600.0 else: # For other fields, store the first match group gps_metadata[key] = match.group(1) # Check that all fields were present by iterating over the keys of patterns for key in patterns.keys(): if key not in gps_metadata: print(f"Missing EXIF field: {key} in file {jpg_file_path}") # If the lowercase value of GPSLongitudeRef is 'w', make the longitude negative if 'GPSLongitudeRef' in gps_metadata and \ gps_metadata['GPSLongitudeRef'].lower() == 'w': gps_metadata['GPSLongitude'] = -gps_metadata['GPSLongitude'] return gps_metadata except subprocess.CalledProcessError as e: print(f"Error running gdalinfo: {e}") print(f"stderr: {e.stderr}") return {} except FileNotFoundError: print("gdalinfo command not found. Make sure GDAL is installed.") return {} except Exception as e: print(f"Unexpected error extracting GPS metadata: {e}") return {} # Read the input image list. Iterate over images. def processImageList(image_list_path, out_dir): print("Extracting EXIF data from images in: " + image_list_path) # Read all image from image_list_path into an array image_list = [] with open(image_list_path, 'r') as f: for line in f: image_list.append(line.strip()) # Create the output directory if it does not exist if not os.path.exists(out_dir): os.makedirs(out_dir) # Save the results in 'extrinsics.txt' in the output directory extrinsics_path = os.path.join(out_dir, 'extrinsics.txt') # Open this for writing with open(extrinsics_path, 'w') as f: f.write("# image, lon, lat, height_above_datum, roll, pitch, yaw\n") f.write("# datum: WGS84\n") # assume the WG84 datum numImages = 0 for line in image_list: jpg_file_path = line.strip() print(f"Processing: {jpg_file_path}") # File must exist if not os.path.exists(jpg_file_path): print(f"File does not exist: {jpg_file_path}") continue gps_metadata = extractExif(jpg_file_path) numImages += 1 lon = gps_metadata.get('GPSLongitude', 0) lat = gps_metadata.get('GPSLatitude', 0) alt = float(gps_metadata.get('GPSAltitude', 0)) # The exif metadata lack the roll and pitch, so we set them to 0 roll = 0 pitch = 0 yaw = float(gps_metadata.get('GPSImgDirection', 0)) # Append the GPS metadata to the extrinsics file. Use double precision # with 17 digits of precision. f.write(f"{jpg_file_path}, {lon:.17f}, {lat:.17f}, {alt:.17f}, {roll:.17f}, {pitch:.17f}, {yaw:.17f}\n") # Error out if no images were processed if numImages == 0: raise Exception("Could not process any images in the list " + image_list_path) print("Wrote: " + extrinsics_path) if __name__ == "__main__": args = processArgs(sys.argv) processImageList(args.image_list, args.out_dir) ================================================ FILE: src/asp/Tools/sfm_submap.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigThread.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/BasicAlgs.h> #include <asp/Core/Nvm.h> #include <opencv2/features2d/features2d.hpp> #include <gflags/gflags.h> #include <glog/logging.h> #include <iostream> #include <fstream> #include <algorithm> #include <thread> #include <boost/filesystem.hpp> namespace fs = boost::filesystem; // Given a map, extract a submap with only specified images. Works // with nvm files where features are either shifted relative // to the optical center or not, and saves the submap in the same format. // Can be useful if the map failed to build properly, but parts of it // are still salvageable. Those can be extracted, new small maps can // be created of the region that failed, then all maps can be merged // together. // It is suggested that each extracted submap consist only of consecutive // images (each image overlaps with the one before and after it). Such // submaps are easier to merge. // Usage: // sfm_submap -input_map <input map> -output_map <output map> <images to keep> // // sfm_submap -input_map <input map> -output_map <output map> -image_list <file> DEFINE_string(input_map, "", "The input map, in .nvm format."); DEFINE_string(output_map, "", "The output map, in .nvm format."); DEFINE_string(image_list, "", "A file having the names of the images to be included in " "the submap, one per line."); void parameterValidation() { if (FLAGS_input_map == "") LOG(FATAL) << "Must specify the input map.\n"; if (FLAGS_output_map == "") LOG(FATAL) << "Must specify the output map.\n"; } int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); google::ParseCommandLineFlags(&argc, &argv, true); parameterValidation(); std::vector<std::string> images_to_keep; if (FLAGS_image_list == "") { // Get the images from the command line for (int i = 1; i < argc; i++) images_to_keep.push_back(argv[i]); } else { // Get the images from a file std::string image; std::ifstream image_handle(FLAGS_image_list); while (image_handle >> image) images_to_keep.push_back(image); } asp::nvmData nvm; asp::readNvm(FLAGS_input_map, nvm.cid_to_keypoint_map, nvm.cid_to_filename, nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam, nvm.focal_lengths); std::string offsets_file = asp::offsetsFilename(FLAGS_input_map); if (!fs::exists(offsets_file)) std::cout << "WARNING: No offsets file found. Will not write offsets for the submap.\n"; else asp::readNvmOffsets(offsets_file, nvm.optical_centers); // Extract the submap. Will also extract a subset of the optical centers. asp::ExtractSubmap(images_to_keep, nvm); asp::writeNvm(nvm.cid_to_keypoint_map, nvm.cid_to_filename, nvm.pid_to_cid_fid, nvm.pid_to_xyz, nvm.world_to_cam, FLAGS_output_map); if (std::ifstream(offsets_file)) { std::string output_offsets_file = asp::offsetsFilename(FLAGS_output_map); asp::writeNvmOffsets(output_offsets_file, nvm.optical_centers); } return 0; } ================================================ FILE: src/asp/Tools/sfm_view.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Derived from MVE (Simon Fuhrmann, TU Darmstadt, BSD 3-Clause). #include <asp/SfmView/GlCommon.h> #include <asp/SfmView/SfmMainWindow.h> #include <QApplication> #include <QStyleFactory> #include <cstdlib> #include <iostream> #include <string> #include <vector> void print_usage_and_exit() { std::cerr << "Usage: sfm_view [OPTIONS] cameras.tsai ...\n" << "Options:\n" << " -h, --help Print this help and exit\n" << " --width VALUE Window width in pixels\n" << " --height VALUE Window height in pixels\n"; std::exit(EXIT_FAILURE); } int main(int argc, char** argv) { std::vector<std::string> cameras; int width = 1400, height = 1200; // default window size for (int i = 1; i < argc; i++) { std::string arg = argv[i]; if (arg == "-h" || arg == "--help") print_usage_and_exit(); else if (arg == "--width" && i + 1 < argc) width = std::atoi(argv[++i]); else if (arg == "--height" && i + 1 < argc) height = std::atoi(argv[++i]); else cameras.push_back(arg); } if (cameras.empty()) { std::cerr << "No camera files specified.\n"; print_usage_and_exit(); } if (width < 10 || height < 10) { std::cerr << "Invalid width or height. Must be at least 10.\n"; std::exit(EXIT_FAILURE); } // Set OpenGL version that Qt should use when creating a context. QSurfaceFormat fmt; fmt.setVersion(3, 3); fmt.setDepthBufferSize(24); fmt.setStencilBufferSize(8); fmt.setProfile(QSurfaceFormat::CoreProfile); QSurfaceFormat::setDefaultFormat(fmt); // Create application. QApplication app(argc, argv); QStyle* style = QStyleFactory::create("Cleanlooks"); if (style != nullptr) QApplication::setStyle(style); // Create main window. SfmMainWindow win(width, height); // Load camera files win.load_scene(cameras); return app.exec(); } ================================================ FILE: src/asp/Tools/sfs.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // Deal with outliers in image intensity. // TODO: Ensure the output DEM is float. Check its no-data value. // TODO: Must specify in the SfS doc that the Lunar-Lambertian model fails at poles // TODO: Study the effect of using bicubic interpolation. // TODO: Find a good automatic value for the smoothness weight. // TODO: Check that we are within image boundaries when interpolating. // TODO: Study the normal computation formula. /// \file sfs.cc // Turn off warnings from boost and other packages #if defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #endif #include <asp/SfS/SfsImageProc.h> #include <asp/SfS/SfsUtils.h> #include <asp/SfS/SfsOptions.h> #include <asp/SfS/SfsArgs.h> #include <asp/SfS/SfsCamera.h> #include <asp/SfS/SfsModel.h> #include <asp/SfS/SfsErrorEstim.h> #include <asp/SfS/SfsCostFun.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Camera/CsmModel.h> #include <asp/Core/Macros.h> #include <asp/Core/DemUtils.h> #include <asp/Core/BaseCameraUtils.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/FileUtils.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/IsisCameraModel.h> #endif // ASP_HAVE_PKG_ISIS #include <vw/Image/MaskViews.h> #include <vw/Image/AntiAliasing.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/FileIO/FileUtils.h> #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Core/Stopwatch.h> #include <vw/Cartography/GeoTransform.h> #include <ceres/ceres.h> #include <ceres/loss_function.h> #include <cmath> #include <iostream> #include <set> #include <string> #if defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic pop #undef LOCAL_GCC_VERSION #endif namespace fs = boost::filesystem; using namespace vw::camera; using namespace vw::cartography; using namespace asp; // Run sfs void runSfs(// Fixed quantities int num_iterations, double gridx, double gridy, SfsOptions & opt, GeoReference const & geo, double smoothness_weight, double max_dem_height, double dem_nodata_val, float img_nodata_val, std::vector<vw::BBox2i> const & crop_boxes, std::vector<MaskedImgRefT> const & masked_images, std::vector<DblImgT> const & blend_weights, bool blend_weight_is_ground_weight, asp::ReflParams const & refl_params, std::vector<vw::Vector3> const & sunPosition, vw::ImageView<double> const & orig_dem, vw::ImageView<int> const & lit_image_mask, vw::ImageView<double> const & curvature_in_shadow_weight, // Variable quantities vw::ImageView<double> & dem, vw::ImageView<double> & albedo, std::vector<vw::CamPtr> & cameras, std::vector<double> & exposures, std::vector<std::vector<double>> & haze, std::vector<double> & refl_coeffs) { // Set up the cost function int num_images = opt.input_images.size(); ceres::Problem problem; vw::ImageView<vw::Vector2> pq; asp::sfsCostFun(gridx, gridy, smoothness_weight, max_dem_height, dem_nodata_val, img_nodata_val, blend_weight_is_ground_weight, geo, crop_boxes, masked_images, blend_weights, refl_params, sunPosition, orig_dem, lit_image_mask, curvature_in_shadow_weight, opt, // Outputs dem, albedo, cameras, exposures, haze, refl_coeffs, pq, problem); // Solver options and the callback ceres::Solver::Options options; options.gradient_tolerance = 1e-16; options.function_tolerance = 1e-16; options.max_num_iterations = num_iterations; options.minimizer_progress_to_stdout = 1; options.num_threads = opt.num_threads; options.linear_solver_type = ceres::SPARSE_SCHUR; SfsCallback callback(opt, dem, pq, albedo, geo, refl_params, sunPosition, crop_boxes, masked_images, blend_weights, blend_weight_is_ground_weight, cameras, dem_nodata_val, img_nodata_val, exposures, haze, max_dem_height, gridx, gridy, refl_coeffs); options.callbacks.push_back(&callback); options.update_state_every_iteration = true; // Solve the problem if asked to do iterations. Otherwise // just keep the DEM at the initial guess, while saving // all the output data as if iterations happened. ceres::Solver::Summary summary; if (options.max_num_iterations > 0) ceres::Solve(options, &problem, &summary); // Save the final results callback.set_final_iter(true); ceres::IterationSummary callback_summary; callback(callback_summary); vw::vw_out() << summary.FullReport() << "\n\n"; // Save the covariances if (opt.save_variances) asp::calcSaveSfsCovariances(opt, dem, albedo, problem, geo, dem_nodata_val); } // Load cameras and sun positions void loadCamerasSunPos(SfsOptions &opt, vw::ImageView<double> const& dem, double dem_nodata_val, vw::cartography::GeoReference const& geo, std::vector<vw::CamPtr> &cameras, std::vector<vw::Vector3> &sunPosition) { // Initialize outputs int num_images = opt.input_images.size(); cameras.resize(num_images); sunPosition.resize(num_images, vw::Vector3()); // Read from list or from angles if (opt.sun_positions_list != "") asp::readSunPositions(opt.sun_positions_list, opt.input_images, dem, dem_nodata_val, geo, sunPosition); if (opt.sun_angles_list != "") asp::readSunAngles(opt.sun_angles_list, opt.input_images, dem, dem_nodata_val, geo, sunPosition); // Read cameras and compute sun positions if not read from file for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; asp::SessionPtr session(asp::StereoSessionFactory::create(opt.stereo_session, // in-out opt, opt.input_images[image_iter], opt.input_images[image_iter], opt.input_cameras[image_iter], opt.input_cameras[image_iter], opt.out_prefix)); cameras[image_iter] = session->camera_model(opt.input_images[image_iter], opt.input_cameras[image_iter]); // Read the sun position from the camera if it is was not read from the list if (sunPosition[image_iter] == vw::Vector3()) sunPosition[image_iter] = asp::sunPositionFromCamera(cameras[image_iter]); // Sanity check if (sunPosition[image_iter] == vw::Vector3()) vw::vw_throw(vw::ArgumentErr() << "Could not read sun positions from list or from camera model files.\n"); // Compute the azimuth and elevation double azimuth = 0.0, elevation = 0.0; asp::sunAngles(dem, dem_nodata_val, geo, sunPosition[image_iter], azimuth, elevation); // Print this. It will be used to organize the images by illumination // for bundle adjustment. // Since the sun position has very big values and we want to sort uniquely // the images by azimuth angle, use high precision below. vw::vw_out().precision(17); vw::vw_out() << "Sun position for: " << opt.input_images[image_iter] << " is " << sunPosition[image_iter] << "\n"; vw::vw_out() << "Sun azimuth and elevation for: " << opt.input_images[image_iter] << " are " << azimuth << " and " << elevation << " degrees.\n"; vw::vw_out().precision(6); // Go back to usual precision } } // end function loadCamerasSunPos void calcApproxCamsCropBoxes(vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, double dem_nodata_val, // Outputs SfsOptions &opt, std::vector<vw::CamPtr> &cameras, std::vector<vw::BBox2i> &crop_boxes, vw::Mutex &camera_mutex) { double max_approx_err = 0.0; int num_images = opt.input_images.size(); for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; // Here we make a copy, since soon cameras[image_iter] will be overwritten vw::CamPtr exact_camera = cameras[image_iter]; vw::vw_out() << "Creating an approximate camera model for " << opt.input_images[image_iter] << "\n"; vw::BBox2i img_bbox = crop_boxes[image_iter]; vw::Stopwatch sw; sw.start(); boost::shared_ptr<CameraModel> apcam; apcam.reset(new asp::ApproxCameraModel(exact_camera, img_bbox, dem, geo, dem_nodata_val, camera_mutex)); cameras[image_iter] = apcam; sw.stop(); vw::vw_out() << "Approximate model generation time: " << sw.elapsed_seconds() << " s.\n"; // Cast the pointer back to ApproxCameraModel as we need that. asp::ApproxCameraModel* cam_ptr = dynamic_cast<asp::ApproxCameraModel*>(apcam.get()); if (cam_ptr == NULL) vw::vw_throw(vw::ArgumentErr() << "Expecting an ApproxCameraModel."); bool model_is_valid = cam_ptr->model_is_valid(); // Compared original and approximate models double max_curr_err = 0.0; if (model_is_valid) { for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { vw::Vector2 ll = geo.pixel_to_lonlat(vw::Vector2(col, row)); vw::Vector3 xyz = geo.datum().geodetic_to_cartesian (vw::Vector3(ll[0], ll[1], dem(col, row))); // Test how the exact and approximate models compare vw::Vector2 pix3 = exact_camera->point_to_pixel(xyz); vw::Vector2 pix4 = cameras[image_iter]->point_to_pixel(xyz); max_curr_err = std::max(max_curr_err, norm_2(pix3 - pix4)); cam_ptr->crop_box().grow(pix3); cam_ptr->crop_box().grow(pix4); } } cam_ptr->crop_box().crop(img_bbox); } else { vw::vw_out() << "Invalid camera model.\n"; } if (max_curr_err > 2.0 || !model_is_valid) { // This is a bugfix. When the DEM clip does not intersect the image, // the approx camera model has incorrect values. if (model_is_valid) vw::vw_out() << "Error of camera approximation is too big.\n"; vw::vw_out() << "Skip image " << image_iter << "\n"; opt.skip_images.insert(image_iter); cam_ptr->crop_box() = vw::BBox2(); max_curr_err = 0.0; } max_approx_err = std::max(max_approx_err, max_curr_err); cam_ptr->crop_box().crop(img_bbox); vw::vw_out() << "Crop box dimensions: " << cam_ptr->crop_box() << std::endl; // Copy the crop box if (opt.crop_input_images) crop_boxes[image_iter].crop(cam_ptr->crop_box()); // Skip images which result in empty crop boxes if (crop_boxes[image_iter].empty()) { opt.skip_images.insert(image_iter); } } // end iterating over images vw::vw_out() << "Max error of approximating cameras: " << max_approx_err << " pixels.\n"; } // end function calcApproxCamsCropBoxes void calcCropBoxes(vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, std::vector<vw::CamPtr> const& cameras, // Outputs SfsOptions &opt, std::vector<vw::BBox2i> &crop_boxes) { int num_images = opt.input_images.size(); for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; // Store the full image box, and initialize the crop box to an empty box vw::BBox2i img_bbox = crop_boxes[image_iter]; crop_boxes[image_iter] = vw::BBox2i(); for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { vw::Vector2 ll = geo.pixel_to_lonlat(vw::Vector2(col, row)); vw::Vector3 xyz = geo.datum().geodetic_to_cartesian (vw::Vector3(ll[0], ll[1], dem(col, row))); vw::Vector2 pix = cameras[image_iter]->point_to_pixel(xyz); crop_boxes[image_iter].grow(pix); } } // Double the box dimensions, just in case. Later the SfS heights // may change, and we may need to see beyond the given box. // TODO(oalexan1): This is likely excessive. double extraFactor = 0.5; double extrax = extraFactor * crop_boxes[image_iter].width(); double extray = extraFactor * crop_boxes[image_iter].height(); crop_boxes[image_iter].min() -= vw::Vector2(extrax, extray); crop_boxes[image_iter].max() += vw::Vector2(extrax, extray); // Crop to the bounding box of the image crop_boxes[image_iter].crop(img_bbox); //vw_out() << "Estimated crop box for image " << opt.input_images[image_iter] << "\n"; if (crop_boxes[image_iter].empty()) opt.skip_images.insert(image_iter); } } // end function calcCropBoxes // Load masked images and compute blending weights. These weights will be adjusted // later. void loadMaskedImagesCalcWeights(SfsOptions const& opt, std::vector<vw::BBox2i> const& crop_boxes, // Outputs std::vector<MaskedImgRefT> &masked_images, std::vector<vw::ImageView<double>> &blend_weights, float &img_nodata_val) { // Initialize outputs int num_images = opt.input_images.size(); img_nodata_val = -std::numeric_limits<float>::max(); masked_images.resize(num_images); blend_weights.resize(num_images); for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) continue; std::string img_file = opt.input_images[image_iter]; vw::read_nodata_val(img_file, img_nodata_val); // Model the shadow threshold float shadow_thresh = opt.shadow_threshold_vec[image_iter]; if (opt.crop_input_images) { // Make a copy in memory for faster access if (!crop_boxes[image_iter].empty()) { vw::ImageView<float> cropped_img = vw::crop(vw::DiskImageView<float>(img_file), crop_boxes[image_iter]); masked_images[image_iter] = vw::create_pixel_range_mask2(cropped_img, std::max(img_nodata_val, shadow_thresh), opt.max_valid_image_vals_vec[image_iter]); // Compute blending weights only when cropping the images. Otherwise // the weights are too huge. if (opt.blending_dist > 0) blend_weights[image_iter] = asp::blendingWeights(masked_images[image_iter], opt.blending_dist, opt.blending_power, opt.min_blend_size); } } else { masked_images[image_iter] = vw::create_pixel_range_mask2(vw::DiskImageView<float>(img_file), std::max(img_nodata_val, shadow_thresh), opt.max_valid_image_vals_vec[image_iter]); } } } // end function loadMaskedImagesCalcWeights // Heuristics for setting up the no-data value double setupDemNodata(SfsOptions const& opt) { double dem_nodata_val = -1e+6; if (vw::read_nodata_val(opt.input_dem, dem_nodata_val)) { vw::vw_out() << "Found DEM nodata value: " << dem_nodata_val << std::endl; if (std::isnan(dem_nodata_val)) { dem_nodata_val = -1e+6; // bugfix for NaN vw::vw_out() << "Overwriting the nodata value with: " << dem_nodata_val << "\n"; } } if (!std::isnan(opt.nodata_val)) { dem_nodata_val = opt.nodata_val; vw::vw_out() << "Over-riding the DEM nodata value with: " << dem_nodata_val << "\n"; } return dem_nodata_val; } // Read the georeference for the DEM and albedo void loadGeoref(SfsOptions const& opt, vw::cartography::GeoReference &geo, vw::cartography::GeoReference &albedo_geo) { if (!vw::cartography::read_georeference(geo, opt.input_dem)) vw::vw_throw(vw::ArgumentErr() << "The input DEM has no georeference.\n"); if (!opt.input_albedo.empty()) { if (!vw::cartography::read_georeference(albedo_geo, opt.input_albedo)) vw::vw_throw(vw::ArgumentErr() << "The input albedo has no georeference.\n"); } else { // Ensure initialization albedo_geo = geo; } // This is a bug fix. The georef pixel size in y must be negative // for the DEM to be oriented correctly. if (geo.transform()(1, 1) > 0) vw::vw_throw(vw::ArgumentErr() << "The input DEM has a positive pixel size in y. " << "This is unexpected. Normally it is negative since the (0, 0) " << "pixel is in the upper-left. Check your DEM pixel size with " << "gdalinfo. Cannot continue.\n"); // The albedo and georef must have same wkt if (geo.get_wkt() != albedo_geo.get_wkt()) vw::vw_throw(vw::ArgumentErr() << "The input DEM has a different georeference " << "from the input albedo image.\n"); } // If --ref-map is passed in, crop to its extent. This will create opt.crop_win. void setupRefMap(vw::ImageViewRef<double> const& full_dem, vw::cartography::GeoReference const& geo, SfsOptions & opt) { if (opt.ref_map.empty()) return; // Read the georeference from the reference map vw::cartography::GeoReference ref_map_georef; bool has_ref_map_georef = vw::cartography::read_georeference(ref_map_georef, opt.ref_map); if (!has_ref_map_georef) vw::vw_throw(vw::ArgumentErr() << "The image in --ref-map has no georeference.\n"); // Find the bounding box of the reference map vw::Vector2 ref_size = vw::file_image_size(opt.ref_map); vw::BBox2i ref_map_box(0, 0, ref_size.x(), ref_size.y()); // Convert this to dem pixel coordinates via GeoTransform. If the georefs are // same, do not use forward_bbox, as that expands the box by a pixel std::string dem_wkt = geo.get_wkt(); std::string ref_wkt = ref_map_georef.get_wkt(); vw::cartography::GeoTransform ref2dem(ref_map_georef, geo); if (dem_wkt == ref_wkt) { vw::Vector2 beg = ref2dem.forward(vw::Vector2(0, 0)); vw::Vector2 end = ref2dem.forward(vw::Vector2(ref_size.x(), ref_size.y())); ref_map_box.min() = round(beg); ref_map_box.max() = round(end); } else { ref_map_box = ref2dem.forward_bbox(ref_map_box); } // Crop to dem pixel coordinates ref_map_box.crop(vw::bounding_box(full_dem)); // Assign to opt.crop_win. It is checked by now that opt.crop_win would be // empty otherwise. opt.crop_win = ref_map_box; // Must be non-empty if (opt.crop_win.empty()) vw::vw_throw(vw::ArgumentErr() << "The --ref-map does not overlap with the input DEM.\n"); } void prepareDemAndAlbedo(SfsOptions& opt, vw::ImageView<double>& dem, vw::ImageView<double>& albedo, vw::cartography::GeoReference& geo, double& dem_nodata_val) { // Manage no-data. Use here a value that is not overly large in magnitude, // and easy to represent as float. dem_nodata_val = setupDemNodata(opt); // Read the handle to the DEM. Here we don't load the DEM into memory yet. We // will later load into memory only a crop, if cropping is specified. This is // to save on memory. vw::ImageViewRef<double> full_dem = vw::DiskImageView<double>(opt.input_dem); vw::ImageViewRef<double> full_albedo; // Read the albedo if (!opt.input_albedo.empty()) { vw::vw_out() << "Reading albedo from: " << opt.input_albedo << "\n"; full_albedo = vw::DiskImageView<double>(opt.input_albedo); // Must have the same size as dem if (full_albedo.cols() != full_dem.cols() || full_albedo.rows() != full_dem.rows()) vw::vw_throw(vw::ArgumentErr() << "The input albedo must have the same dimensions as the DEM.\n"); } // This must be done before the DEM is cropped. This stats is // queried from parallel_sfs. if (opt.query) { vw::vw_out() << "dem_cols, " << full_dem.cols() << "\n"; vw::vw_out() << "dem_rows, " << full_dem.rows() << "\n"; } // Read the georeference vw::cartography::GeoReference albedo_geo; loadGeoref(opt, geo, albedo_geo); // If --ref-map is passed in, need to crop to its extent. This modifies // opt.crop_win. setupRefMap(full_dem, geo, opt); // Adjust the crop win opt.crop_win.crop(vw::bounding_box(full_dem)); // Crop the DEM and georef if requested to given box. Same for albedo. // In either case, read the needed portion fully in memory. if (!opt.crop_win.empty()) { dem = vw::crop(full_dem, opt.crop_win); geo = vw::cartography::crop(geo, opt.crop_win); if (!opt.input_albedo.empty()) { albedo = vw::crop(full_albedo, opt.crop_win); albedo_geo = vw::cartography::crop(albedo_geo, opt.crop_win); } } else { // No cropping dem = full_dem; if (!opt.input_albedo.empty()) albedo = full_albedo; } // Initialize the albedo if not read from disk if (opt.input_albedo.empty()) { double initial_albedo = 1.0; albedo.set_size(dem.cols(), dem.rows()); for (int col = 0; col < albedo.cols(); col++) { for (int row = 0; row < albedo.rows(); row++) { albedo(col, row) = initial_albedo; } } albedo_geo = geo; } // Albedo and DEM must have same dimensions and georef if (albedo.cols() != dem.cols() || albedo.rows() != dem.rows()) vw::vw_throw(vw::ArgumentErr() << "The albedo image must have the same dimensions as the DEM.\n"); if (geo.get_wkt() != albedo_geo.get_wkt()) vw::vw_throw(vw::ArgumentErr() << "The input DEM has a different georeference " << "from the input albedo image.\n"); } void sfsSanityChecks(asp::SfsOptions const& opt, vw::ImageView<double> const& dem, double dem_nodata_val) { // Refuse to run if there are no-data values or if the DEM is too small int min_dem_size = 5; for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { if (dem(col, row) == dem_nodata_val || std::isnan(dem(col, row))) { vw::vw_throw(vw::ArgumentErr() << "Found a no-data or NaN pixel in the DEM. Cannot continue. " << "The dem_mosaic tool can be used to fill in holes. Then " << "crop and use a clip from this DEM having only valid data."); } } } if (dem.cols() < min_dem_size || dem.rows() < min_dem_size) vw::vw_throw(vw::ArgumentErr() << "The input DEM is too small.\n"); // This check must happen before loading images but after we know the DEM size if ((dem.cols() > 500 || dem.rows() > 500) && !opt.compute_exposures_only && !opt.estim_exposure_haze_albedo && !opt.save_sim_intensity_only && !opt.save_meas_intensity_only) vw::vw_out(vw::WarningMessage) << "The input DEM is large and this program " << "may run out of memory. Use parallel_sfs instead, with small tiles.\n"; } // Initialize the exposure as mean(intensity)/mean(reflectance)/albedo. // Initialize the haze to 0. Skip images with zero exposure. If the user // provided initial exposures and haze, use those, but still go through the // motions to find the images to skip. void estimExposuresHazeSkipVec(asp::SfsOptions const& opt, vw::ImageView<double> const& dem, vw::cartography::GeoReference const& geo, double max_dem_height, double gridx, double gridy, std::vector<vw::Vector3> const& sunPosition, asp::ReflParams const& refl_params, std::vector<vw::BBox2i> const& crop_boxes, std::vector<MaskedImgRefT> const& masked_images, std::vector<vw::ImageView<double>> const& blend_weights, bool blend_weight_is_ground_weight, std::vector<vw::CamPtr> const& cameras, double mean_albedo, // Outputs std::vector<double> & local_exposures_vec, std::vector<double> & local_haze_vec, std::set<int> & skip_images) { // Initialize outputs int num_images = opt.input_images.size(); local_exposures_vec.resize(num_images, 0); local_haze_vec.resize(num_images, 0); for (int image_iter = 0; image_iter < num_images; image_iter++) { if (skip_images.find(image_iter) != skip_images.end()) continue; // Sample large DEMs. Keep about 200 row and column samples. int sample_col_rate = 0, sample_row_rate = 0; asp::calcSampleRates(dem, opt.num_samples_for_estim, sample_col_rate, sample_row_rate); MaskedDblImgT reflectance, intensity; vw::ImageView<double> ground_weight; vw::ImageView<vw::Vector2> pq; // no need for these just for initialization bool show_progress = false; computeReflectanceAndIntensity(dem, pq, geo, opt.model_shadows, show_progress, max_dem_height, gridx, gridy, sample_col_rate, sample_row_rate, sunPosition[image_iter], refl_params, crop_boxes[image_iter], masked_images[image_iter], blend_weights[image_iter], blend_weight_is_ground_weight, cameras[image_iter], reflectance, intensity, ground_weight, &opt.model_coeffs_vec[0], opt); asp::calcExposureHazeSkipImages(intensity, reflectance, mean_albedo, image_iter, opt.input_images, local_exposures_vec, local_haze_vec, skip_images); } } int main(int argc, char* argv[]) { vw::Stopwatch sw_total; sw_total.start(); asp::SfsOptions opt; try { asp::handleSfsArgs(argc, argv, opt); // Set up model information ReflParams refl_params; setupReflectance(refl_params, opt); double dem_nodata_val = -1e+6; // Will change vw::ImageView<double> dem, albedo; vw::cartography::GeoReference geo; prepareDemAndAlbedo(opt, dem, albedo, geo, dem_nodata_val); // See if to use provided initial DEM height if (!std::isnan(opt.init_dem_height)) { for (int col = 0; col < dem.cols(); col++) { for (int row = 0; row < dem.rows(); row++) { dem(col, row) = opt.init_dem_height; } } } // Read in the camera models and the sun positions std::vector<vw::CamPtr> cameras; std::vector<vw::Vector3> sunPosition; loadCamerasSunPos(opt, dem, dem_nodata_val, geo, cameras, sunPosition); // Stop here if all we wanted was some information if (opt.query) return 0; // Do the sanity checks after the query, as that one better not fail sfsSanityChecks(opt, dem, dem_nodata_val); // This check must be here, after we find the session if (opt.stereo_session != "isis" && opt.use_approx_camera_models) { vw::vw_out() << "Computing approximate models works only with ISIS cameras. " << "Ignoring this option.\n"; opt.use_approx_camera_models = false; } if (opt.num_threads > 1 && opt.stereo_session == "isis" && !opt.use_approx_camera_models) { vw::vw_out() << "Using exact ISIS camera models. Can run with only a single thread.\n"; opt.num_threads = 1; } vw::vw_out() << "Using: " << opt.num_threads << " thread(s).\n"; // We won't load the full images, just portions restricted to the area we we // will compute the DEM. int num_images = opt.input_images.size(); std::vector<vw::BBox2i> crop_boxes(num_images); // The crop box starts as the original image bounding box. We'll shrink it later. for (int image_iter = 0; image_iter < num_images; image_iter++) { std::string img_file = opt.input_images[image_iter]; crop_boxes[image_iter] = vw::bounding_box(vw::DiskImageView<float>(img_file)); } // Ensure that no two threads can access an ISIS camera at the same time. // Declare the lock here, as we want it to live until the end of the program. vw::Mutex camera_mutex; if (opt.use_approx_camera_models) // calc approx camera models and crop boxes calcApproxCamsCropBoxes(dem, geo, dem_nodata_val, opt, cameras, crop_boxes, camera_mutex); // outputs else if (opt.crop_input_images) // calc crop boxes with the exact camera models calcCropBoxes(dem, geo, cameras, opt, crop_boxes); // Masked images and weights float img_nodata_val = -std::numeric_limits<float>::max(); // will change std::vector<MaskedImgRefT> masked_images; std::vector<vw::ImageView<double>> blend_weights; loadMaskedImagesCalcWeights(opt, crop_boxes, masked_images, blend_weights, img_nodata_val); // outputs // Find the grid sizes in meters. Note that dem heights are in meters too, // so we treat both horizontal and vertical measurements in same units. // Sample large DEMs. Keep about 200 row and column samples. int sample_col_rate = 0, sample_row_rate = 0; asp::calcSampleRates(dem, opt.num_samples_for_estim, sample_col_rate, sample_row_rate); double gridx = 0.0, gridy = 0.0; asp::calcGsd(dem, geo, dem_nodata_val, sample_col_rate, sample_row_rate, gridx, gridy); // outputs vw::vw_out() << "DEM grid in x and y in meters: " << gridx << ' ' << gridy << "\n"; // Find the max DEM height double max_dem_height = asp::maxDemHeight(dem); // Find the mean albedo double mean_albedo = asp::meanAlbedo(dem, albedo, dem_nodata_val); // Initalize the exposure, haze, and skip images bool blend_weight_is_ground_weight = false; // will change later std::vector<double> local_exposures_vec, local_haze_vec; estimExposuresHazeSkipVec(opt, dem, geo, max_dem_height, gridx, gridy, sunPosition, refl_params, crop_boxes, masked_images, blend_weights, blend_weight_is_ground_weight, cameras, mean_albedo, // Outputs local_exposures_vec, local_haze_vec, opt.skip_images); // Only overwrite the exposures if we don't have them supplied if (opt.image_exposures_vec.empty()) opt.image_exposures_vec = local_exposures_vec; // Initialize the haze as 0. If computed above, initialize its first coeff. if ((!opt.image_haze_vec.empty()) && (int)opt.image_haze_vec.size() != num_images) vw::vw_throw(vw::ArgumentErr() << "Expecting as many haze values as images.\n"); if (opt.image_haze_vec.empty()) { for (int image_iter = 0; image_iter < num_images; image_iter++) { // Pad the haze vec with zeros std::vector<double> curr_image_haze_vec; while (curr_image_haze_vec.size() < g_max_num_haze_coeffs) curr_image_haze_vec.push_back(0); curr_image_haze_vec[0] = local_haze_vec[image_iter]; opt.image_haze_vec.push_back(curr_image_haze_vec); } } // TODO(oalexan1): Check if --num-haze-coeffs is non-zero. // TODO(oalexan1): This should work even if albedo is not modeled. if (opt.estim_exposure_haze_albedo && (opt.float_albedo || opt.num_haze_coeffs > 0)) estimExposureHazeAlbedo(opt, masked_images, blend_weights, blend_weight_is_ground_weight, dem, mean_albedo, geo, cameras, max_dem_height, crop_boxes, sunPosition, refl_params, gridx, gridy); if (opt.compute_exposures_only || opt.estim_exposure_haze_albedo) { asp::saveExposures(opt.out_prefix, opt.input_images, opt.image_exposures_vec); // TODO(oalexan1): Think of this more if (opt.num_haze_coeffs > 0) asp::saveHaze(opt.out_prefix, opt.input_images, opt.image_haze_vec); return 0; // all done } // Need to compute the valid data image to be able to find the grid points always // in shadow, so when this image is zero. vw::ImageView<int> lit_image_mask; if (opt.curvature_in_shadow_weight > 0.0) { lit_image_mask.set_size(dem.cols(), dem.rows()); for (int col = 0; col < lit_image_mask.cols(); col++) { for (int row = 0; row < lit_image_mask.rows(); row++) { lit_image_mask(col, row) = 0; // no valid points originally } } } // Compute and/or save the intensities, and/or estimate height errors, // and/or compute weights for borderline data. // Show progress when the DEM is big std::vector<vw::ImageView<double>> ground_weights(num_images); std::vector<MaskedDblImgT> meas_intensities(num_images); std::vector<MaskedDblImgT> sim_intensities(num_images); bool show_progress = (opt.save_sim_intensity_only || opt.save_meas_intensity_only); if (opt.save_sim_intensity_only || opt.save_meas_intensity_only || opt.estimate_height_errors || opt.curvature_in_shadow_weight > 0.0 || opt.allow_borderline_data || opt.low_light_threshold > 0.0) asp::calcIntenEstimHeights(opt, dem, albedo, geo, show_progress, max_dem_height, gridx, gridy, sunPosition, refl_params, crop_boxes, masked_images, blend_weights, blend_weight_is_ground_weight, cameras, img_nodata_val, // Outputs lit_image_mask, ground_weights, meas_intensities, sim_intensities); if (opt.save_sim_intensity_only || opt.save_meas_intensity_only || opt.estimate_height_errors) { asp::saveExposures(opt.out_prefix, opt.input_images, opt.image_exposures_vec); return 0; // All done } // Print and make global the exposures and haze if (opt.num_haze_coeffs > 0) { for (size_t image_iter = 0; image_iter < opt.image_haze_vec.size(); image_iter++) { vw::vw_out() << "Image haze for " << opt.input_images[image_iter] << ':'; for (size_t haze_it = 0; haze_it < opt.image_haze_vec[image_iter].size(); haze_it++) vw::vw_out() << " " << opt.image_haze_vec[image_iter][haze_it]; vw::vw_out() << "\n"; } } if (opt.allow_borderline_data) asp::handleBorderlineAndLowLight(opt, num_images, dem, geo, crop_boxes, meas_intensities, sim_intensities, img_nodata_val, // Outputs masked_images, blend_weights, blend_weight_is_ground_weight, ground_weights); // Calc the weight for option --curvature-in-shadow-weight vw::ImageView<double> curvature_in_shadow_weight; if (opt.curvature_in_shadow_weight > 0.0) asp::calcCurvatureInShadowWeight(opt, lit_image_mask, geo, curvature_in_shadow_weight); // output // For images that we don't use, wipe the cameras and all other // info, as those take up memory (the camera is a table). for (int image_iter = 0; image_iter < num_images; image_iter++) { if (opt.skip_images.find(image_iter) != opt.skip_images.end()) { masked_images[image_iter] = vw::ImageView<vw::PixelMask<float>>(); blend_weights[image_iter] = vw::ImageView<double>(); cameras[image_iter] = boost::shared_ptr<CameraModel>(); } } // orig_dem will keep the input DEMs and won't change. Keep to the optimized // DEMs close to orig_dem. Make a deep copy below. Then run sfs. vw::ImageView<double> orig_dem = vw::copy(dem); runSfs(opt.max_iterations, gridx, gridy, opt, geo, opt.smoothness_weight, max_dem_height, dem_nodata_val, img_nodata_val, crop_boxes, masked_images, blend_weights, blend_weight_is_ground_weight, refl_params, sunPosition, orig_dem, lit_image_mask, curvature_in_shadow_weight, // Variable quantities dem, albedo, cameras, opt.image_exposures_vec, opt.image_haze_vec, opt.model_coeffs_vec); } ASP_STANDARD_CATCHES; sw_total.stop(); vw::vw_out() << "Total elapsed time: " << sw_total.elapsed_seconds() << " s.\n"; return 0; } ================================================ FILE: src/asp/Tools/sfs_blend.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file sfs_blend.cc /// // A tool to take an SfS-produced DEM, and replace in the areas in // permanent shadow this DEM with the original LOLA DEM, with a // transition at the boundary. // It uses the Euclidean distance to the boundary, which is better // than the Manhattan distance employed by grassfire. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/GdalUtils.h> #include <asp/SfS/SfsImageProc.h> #include <vw/FileIO/DiskImageManager.h> #include <vw/Image/InpaintView.h> #include <vw/Image/RoundAndClamp.h> #include <vw/Image/Filter.h> #include <vw/Cartography/GeoTransform.h> #include <vw/FileIO/FileUtils.h> #include <boost/math/special_functions/fpclassify.hpp> #include <boost/math/special_functions/erf.hpp> #include <boost/program_options.hpp> #include <iostream> #include <fstream> #include <iomanip> #include <string> #include <vector> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <time.h> #include <limits> #include <algorithm> using namespace vw; using namespace vw::cartography; namespace po = boost::program_options; namespace fs = boost::filesystem; GeoReference read_georef(std::string const& file) { // Read a georef, and check for success GeoReference geo; bool is_good = read_georeference(geo, file); if (!is_good) vw_throw(ArgumentErr() << "No georeference found in " << file << ".\n"); // This is a bug fix. The georef pixel size in y must be negative // for the image to be oriented correctly. if (geo.transform()(1, 1) > 0) vw_throw(ArgumentErr() << "The georeference in " << file << " has a positive pixel size in y. " << "This is unexpected. Normally it is negative since the (0, 0) " << "pixel is in the upper-left. Check your DEM pixel size with " << "gdalinfo. Cannot continue.\n"); return geo; } struct Options: vw::GdalWriteOptions { std::string sfs_dem, lola_dem, max_lit_image_mosaic, output_dem, output_weight; double image_threshold, weight_blur_sigma, lit_blend_length, shadow_blend_length, min_blend_size; Options(): image_threshold(0.0), weight_blur_sigma(0.0), lit_blend_length(0.0), shadow_blend_length(0.0), min_blend_size(0.0) {} }; // The workhorse of this code, do the blending class SfsBlendView: public ImageViewBase<SfsBlendView>{ ImageViewRef<float> m_sfs_dem, m_lola_dem, m_image_mosaic; float m_sfs_nodata, m_lola_nodata, m_weight_nodata; int m_extra; bool m_save_weight; Options const& m_opt; typedef float PixelT; public: SfsBlendView(ImageViewRef<float> sfs_dem, ImageViewRef<float> lola_dem, ImageViewRef<float> image_mosaic, float sfs_nodata, float lola_nodata, float weight_nodata, int extra, bool save_weight, Options const& opt): m_sfs_dem(sfs_dem), m_lola_dem(lola_dem), m_image_mosaic(image_mosaic), m_sfs_nodata(sfs_nodata), m_lola_nodata(lola_nodata), m_weight_nodata(weight_nodata), m_extra(extra), m_save_weight(save_weight), m_opt(opt) {} typedef PixelT pixel_type; typedef PixelT result_type; typedef ProceduralPixelAccessor<SfsBlendView> pixel_accessor; inline int32 cols() const { return m_sfs_dem.cols(); } inline int32 rows() const { return m_sfs_dem.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double/*i*/, double/*j*/, int32/*p*/ = 0) const { vw_throw(NoImplErr() << "SfsBlendView::operator()(...) is not implemented"); return pixel_type(); } typedef CropView<ImageView<pixel_type>> prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { BBox2i biased_box = bbox; biased_box.expand(m_extra); biased_box.crop(bounding_box(m_sfs_dem)); // Make crops in memory (from references) ImageView<pixel_type> sfs_dem_crop = crop(m_sfs_dem, biased_box); ImageView<pixel_type> lola_dem_crop = crop(m_lola_dem, biased_box); ImageView<pixel_type> image_mosaic_crop = crop(m_image_mosaic, biased_box); // The mask of lit pixels ImageView<PixelMask<pixel_type>> mask = create_mask_less_or_equal(image_mosaic_crop, m_opt.image_threshold); // The mask of unlit pixels ImageView<PixelMask<pixel_type>> inv_mask = vw::copy(mask); for (int col = 0; col < inv_mask.cols(); col++) { for (int row = 0; row < inv_mask.rows(); row++) { if (is_valid(mask(col, row))) { inv_mask(col, row) = 0; inv_mask(col, row).invalidate(); } else { inv_mask(col, row) = 1; inv_mask(col, row).validate(); } } } // The grassfire weight positive in the lit region, with zero at the light-shadow // boundary bool no_zero_at_border = true; // don't decrease the weights to zero at image border // Fill small holes that we don't blend in those, then compute the distance // to the remaining holes ImageView<pixel_type> lit_grass_dist = vw::grassfire(vw::copy(vw::fill_holes_grass(mask, m_opt.min_blend_size)), no_zero_at_border); // The grassfire weights are positive in the shadow region, with // zero at the light-shadow boundary ImageView<pixel_type> shadow_grass_dist = vw::grassfire(inv_mask, no_zero_at_border); // Note that our boundary is in fact two pixel wide at the light-shadow // interface, given how lit_grass_dist and shadow_grass_dist are defined as // the negation of each other. The boundary is the set of pixels where both // of these are <= 1. Here must use double pixels as otherwise there's not // enough precision for the final weights (even though they are float). ImageView<double> dist_to_bd = asp::calcClampedBdDist(lit_grass_dist, shadow_grass_dist, m_opt.lit_blend_length, m_opt.shadow_blend_length); // Apply the blur if (m_opt.weight_blur_sigma > 0) dist_to_bd = vw::gaussian_filter(dist_to_bd, m_opt.weight_blur_sigma); // Do the blending ImageView<float> blended_dem; blended_dem.set_size(sfs_dem_crop.cols(), sfs_dem_crop.rows()); for (int col = 0; col < sfs_dem_crop.cols(); col++) { for (int row = 0; row < sfs_dem_crop.rows(); row++) { if (!m_save_weight) blended_dem(col, row) = m_sfs_nodata; else blended_dem(col, row) = m_weight_nodata; // The signed distance to the boundary is modified so that the smallest // value is 0, the largest is 1, and in a band close to the boundary it // transitions from 0 to 1. Must use here a double value, for precision. double weight = (dist_to_bd(col, row) + m_opt.shadow_blend_length) / (m_opt.shadow_blend_length + m_opt.lit_blend_length); // These are not strictly necessary but enforce them if (weight > 1.0) weight = 1.0; if (weight < 1e-7) // take into account the float error weight = 0.0; // Handle no-data values. These are not meant to happen, but do this just in case. if (sfs_dem_crop(col, row) == m_sfs_nodata) weight = 0.0; // Use LOLA if (lola_dem_crop(col, row) == m_lola_nodata) continue; if (!m_save_weight) blended_dem(col, row) = weight * sfs_dem_crop(col, row) + (1.0 - weight) * lola_dem_crop(col, row); else blended_dem(col, row) = weight; } } return prerasterize_type(blended_dem, -biased_box.min().x(), -biased_box.min().y(), cols(), rows()); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options("Options"); general_options.add_options() ("sfs-dem", po::value<std::string>(&opt.sfs_dem), "The SfS DEM to process.") ("lola-dem", po::value<std::string>(&opt.lola_dem), "The LOLA DEM to use to fill in the regions in permanent shadow.") ("max-lit-image-mosaic", po::value<std::string>(&opt.max_lit_image_mosaic), "The maximally lit image mosaic to use to determine the permanently shadowed regions.") ("image-threshold", po::value<double>(&opt.image_threshold)->default_value(0.0), "The value separating permanently shadowed pixels from lit pixels in the maximally lit image mosaic.") ("lit-blend-length", po::value<double>(&opt.lit_blend_length)->default_value(0.0), "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.") ("shadow-blend-length", po::value<double>(&opt.shadow_blend_length)->default_value(0.0), "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.") ("weight-blur-sigma", po::value<double>(&opt.weight_blur_sigma)->default_value(0.0), "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.") ("min-blend-size", po::value<double>(&opt.min_blend_size)->default_value(0.0), "Do not apply blending in shadowed areas of dimensions less than this, hence keeping there the SfS DEM.") ("output-dem", po::value(&opt.output_dem), "The blended output DEM to save.") ("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)."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); // Error checking if (opt.sfs_dem == "" || opt.lola_dem == "" || opt.max_lit_image_mosaic == "" || opt.output_dem == "" || opt.output_weight == "") vw_throw(ArgumentErr() << "Not all input or output files were specified.\n" << usage << general_options); if (opt.lit_blend_length <= 0) vw_throw(ArgumentErr() << "The lit blending length must be positive.\n" << usage << general_options); if (opt.shadow_blend_length <= 0) vw_throw(ArgumentErr() << "The shadow blending length must be positive.\n" << usage << general_options); if (opt.image_threshold <= 0) vw_throw(ArgumentErr() << "The image threshold must be positive.\n" << usage << general_options); // Create the output directory vw::create_out_dir(opt.output_dem); } // End function handle_arguments int main(int argc, char *argv[]) { Options opt; try{ handle_arguments(argc, argv, opt); vw_out() << "Reading SfS DEM: " << opt.sfs_dem << std::endl; DiskImageView<float> sfs_dem(opt.sfs_dem); vw_out() << "Reading LOLA DEM: " << opt.lola_dem << std::endl; DiskImageView<float> lola_dem(opt.lola_dem); vw_out() << "Reading maximally-lit image mosaic: " << opt.max_lit_image_mosaic << std::endl; DiskImageView<float> image_mosaic(opt.max_lit_image_mosaic); if (sfs_dem.cols() != lola_dem.cols() || sfs_dem.rows() != lola_dem.rows()) vw_throw(ArgumentErr() << "The SfS DEM and LOLA DEM must have the same dimensions."); if (sfs_dem.cols() != image_mosaic.cols() || sfs_dem.rows() != image_mosaic.rows()) vw_throw(ArgumentErr() << "The SfS DEM and image mosaic must have the same dimensions."); GeoReference sfs_georef = read_georef(opt.sfs_dem); GeoReference lola_georef = read_georef(opt.lola_dem); GeoReference image_georef = read_georef(opt.max_lit_image_mosaic); if (sfs_georef.proj4_str() != lola_georef.proj4_str() || sfs_georef.proj4_str() != image_georef.proj4_str()) vw_throw(ArgumentErr() << "The SfS DEM, LOLA DEM, and image mosaic " << "must have the same PROJ4 string."); // All these must be on the same grid, or else the blending will be wrong. // Allow some tolerance here as sometimes products created with different // tools can differ a bit. 1e-10 degrees is about 0.01 mm on Earth's surface. vw::Vector2 sfs_corner = sfs_georef.pixel_to_point(Vector2(0, 0)); vw::Vector2 lola_corner = lola_georef.pixel_to_point(Vector2(0, 0)); vw::Vector2 image_corner = image_georef.pixel_to_point(Vector2(0, 0)); if (norm_2(sfs_corner - lola_corner) > 1e-10 || norm_2(sfs_corner - image_corner) > 1e-10) vw_throw(ArgumentErr() << "The SfS DEM, LOLA DEM, and image mosaic " << "must be on the same grid."); float sfs_nodata = -1.0, lola_nodata = -1.0, image_nodata = -1.0; DiskImageResourceGDAL sfs_rsrc(opt.sfs_dem); if (sfs_rsrc.has_nodata_read()) sfs_nodata = sfs_rsrc.nodata_read(); else vw_throw(ArgumentErr() << "The SfS DEM does not have a no-data value."); DiskImageResourceGDAL lola_rsrc(opt.lola_dem); if (lola_rsrc.has_nodata_read()) lola_nodata = lola_rsrc.nodata_read(); else vw_throw(ArgumentErr() << "The LOLA DEM does not have a no-data value."); DiskImageResourceGDAL image_rsrc(opt.max_lit_image_mosaic); if (image_rsrc.has_nodata_read()) image_nodata = image_rsrc.nodata_read(); else vw_throw(ArgumentErr() << "The maximally-lit mosaic does not have a no-data value."); // When processing the DEM tile by tile, need to see further in // each tile because of blending and blurring int extra = 2*opt.lit_blend_length + 2*opt.shadow_blend_length + opt.min_blend_size; if (opt.weight_blur_sigma > 0) extra += vw::compute_kernel_size(opt.weight_blur_sigma); // Write bigger tiles to make the processing with the extra margin // more efficient. int block_size = 256 + 2 * extra; block_size = 16*std::ceil(block_size/16.0); // internal constraint vw_out() << "Writing: " << opt.output_dem << std::endl; bool has_georef = true, has_nodata = true; TerminalProgressCallback tpc("asp", ": "); float weight_nodata = -1.0; bool save_weight = false; asp::saveWithTempBigBlocks(block_size, opt.output_dem, SfsBlendView(sfs_dem, lola_dem, image_mosaic, sfs_nodata, lola_nodata, weight_nodata, extra, save_weight, opt), has_georef, sfs_georef, has_nodata, sfs_nodata, opt, tpc); // Write the weight. Have to rerun the same logic due to ASP's limitations, // it cannot write two large files at the same time. vw_out() << "Writing the blending weight: " << opt.output_weight << std::endl; save_weight = true; asp::saveWithTempBigBlocks(block_size, opt.output_weight, SfsBlendView(sfs_dem, lola_dem, image_mosaic, sfs_nodata, lola_nodata, weight_nodata, extra, save_weight, opt), has_georef, sfs_georef, has_nodata, weight_nodata, opt, tpc); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/skysat_helper.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ ''' Python tools for working with SkySat data products. ''' from __future__ import print_function import sys import os, glob, re, shutil, subprocess, string, time, errno, argparse import simplekml, json # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_alg_utils import * import asp_file_utils, asp_system_utils, asp_cmd_utils, asp_image_utils, asp_string_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] #------------------------------------------------------------------------------ def addJsonFileToKml(path, kml, color = simplekml.Color.white): '''Add one JSON frame bounding box to the KML object''' with open(path, 'r') as f: contents = f.read() parts = json.loads(contents) coords = parts['geometry']['coordinates'][0] pol = kml.newpolygon(name=os.path.basename(path), outerboundaryis=coords) pol.style.linestyle.color = color pol.style.linestyle.width = 5 pol.style.polystyle.fill = 0 def convertToTsai(path, demPath): '''Given the json metadata, generate a .tsai camera file''' # Get the other file paths tifPath = path.replace('metadata.json', 'basic_panchromatic_dn.tif') outputPath = tifPath.replace('.tif', '.tsai') # Get the image size (for the center coordinate) width, height = asp_image_utils.getImageSize(tifPath) # Set up the required coordinate string with open(path, 'r') as f: contents = f.read() parts = json.loads(contents) coords = parts['geometry']['coordinates'][0] coordString = (('%f %f %f %f %f %f %f %f') % (coords[0][0], coords[0][1], coords[3][0], coords[3][1], coords[2][0], coords[2][1], coords[1][0], coords[1][1])) 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)) asp_system_utils.executeCommand(cmd, outputPath=outputPath) def splitSkysatName(path): '''Extract parts of the skysat name''' # 20181215_074403_ssc10d3_0004_metadata.json result = dict() name = os.path.basename(path) parts = name.split('_') result['date' ] = parts[0] result['imageId' ] = parts[1] result['sat'], result['ccd'] = parts[2].split('d') result['frameNum'] = parts[3] return result def main(argsIn): try: # Use parser that ignores unknown options usage = "usage: skysat_helper [options]" parser = argparse.ArgumentParser(usage=usage) parser.add_argument("--input-prefix", dest="inputPrefix", default=None, help="Input prefix of files to process") parser.add_argument("--output-path", dest="outputPath", default=None, help="The output kml file to write.") parser.add_argument("--kml-name", dest="kmlName", default='footprint', help="The name assigned to the kml tree.") parser.add_argument("--dem-path", dest="demPath", default=None, help="DEM file to use for tsai conversion.") # This call handles all the parallel_mapproject specific options. options = parser.parse_args(argsIn) # Check the required positional arguments. except argparse.ArgumentError as msg: raise Usage(msg) kml = simplekml.Kml() kml.document.name = options.kmlName colorList = ['ffffffff', 'ff000000', 'ffff0000', 'ff008000', 'ff00ffff', 'orange', 'ff00a5ff'] count = 0 imageIdList = [] paths = glob.glob(options.inputPrefix) for path in paths: if (os.path.splitext(path)[1] != '.json') or ('metadata' not in path): continue frameInfo = splitSkysatName(path) fid = frameInfo['imageId'] if fid not in imageIdList: imageIdList.append(fid) colorIndex = imageIdList.index(fid) % len(colorList) color = colorList[colorIndex] try: addJsonFileToKml(path, kml, color) count += 1 except: print('Failed to add file: ' + path + ' to the kml footprint.') if options.demPath: try: convertToTsai(path, options.demPath) except: print('Failed to generate .tsai model for file: ' + path) print('Wrote ' + str(count) + ' polygons to file: ' + options.outputPath) kml.save(options.outputPath) print('Script is finished.') if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ================================================ FILE: src/asp/Tools/sparse_disp ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ # This program depends on a variety of Python modules that can be # installed following the instructions in the documentation where the # use of this tool is shown. # The purpose of this program is to generate a good initial disparity # estimate for stereo processing by matching interest points taken # full resolution at sampled regions across the input images. This # helps out in cases where there is high resolution detail such as ice # and snow patterns but no low resolution detail. from __future__ import print_function import sys, optparse, subprocess, re, os, math, time, datetime # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils asp_system_utils.verify_python_version_is_supported() try: from osgeo import gdal, gdalconst except ImportError: import gdal, gdalconst gdal.UseExceptions() import numpy as np import scipy.ndimage as sf import scipy.stats as ss import scipy.spatial as spatial from scipy.ndimage import convolve, binary_dilation, convolve1d from scipy.sparse import coo_matrix from scipy.interpolate import griddata from multiprocessing import Pool, cpu_count from optparse import OptionParser # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_system_utils import get_asp_version #============================================================================== # Start of supporting functions #============================================================================== def prevpow2(i): """ Find largest 2^n that is <= given number. """ n = 1 while 2*n <= i: n *= 2 return n class im_subset: def __init__(self, c0, r0, Nc, Nr, source, user_nodata, pad_val=0, Bands=(1,2,3)): self.source = source self.c0 = c0 self.r0 = r0 self.Nc = Nc self.Nr = Nr self.z = [] # 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 self.level = 0 self.Bands = Bands self.pad_val = pad_val # get the nodata value from the source if hasattr(self.source, 'level'): self.level=self.source.level+1 if user_nodata is not None: self.noData = user_nodata else: self.noData = self.source.noData else: band=self.source.GetRasterBand(self.Bands[0]) if user_nodata is not None: self.noData = user_nodata else: self.noData = band.GetNoDataValue() if self.noData is None: self.noData = 0.0 def setBounds(self, c0, r0, Nc, Nr, update=0): self.c0 = np.int64(c0) self.r0 = np.int64(r0) self.Nc = np.int64(Nc) self.Nr = np.int64(Nr) if update > 0: self.copySubsetFrom(pad_val=self.pad_val) def copySubsetFrom(self, pad_val=0): if hasattr(self.source, 'level'): # copy data from another subset self.z = np.zeros((self.source.z.shape[0], self.Nr, self.Nc), self.source.z.dtype) + pad_val (sr0, sr1, dr0, dr1, vr) = match_range(self.source.r0, self.source.Nr, self.r0, self.Nr) (sc0, sc1, dc0, dc1, vc) = match_range(self.source.c0, self.source.Nc, self.c0, self.Nc) if (vr & vc): self.z[:, dr0:dr1, dc0:dc1]=self.source.z[:,sr0:sr1, sc0:sc1] self.level=self.source.level+1 else: # read data from a file band = self.source.GetRasterBand(self.Bands[0]) src_NB = self.source.RasterCount dt = gdal.GetDataTypeName(band.DataType) self.z = np.zeros((src_NB, self.Nr, self.Nc)) + pad_val (sr0, sr1, dr0, dr1, vr) = match_range(0, band.YSize, self.r0, self.Nr) (sc0, sc1, dc0, dc1, vc) = match_range(0, band.XSize, self.c0, self.Nc) if (vr & vc): self.z[:, dr0:dr1, dc0:dc1]=self.source.ReadAsArray(int(sc0), int(sr0), int(sc1-sc0), int(sr1-sr0)) self.level=0 def trim_from_edges(self, x_trim, y_trim): self.z = self.z[:, y_trim[0]:-y_trim[1], x_trim[0]:-x_trim[1]] self.r0 = self.r0+y_trim[0] self.c0 = self.c0+x_trim[0] self.Nr = self.Nr-np.sum(y_trim) self.Nc = self.Nc-np.sum(x_trim) def writeSubsetTo(self, bands, target): if hasattr(target, 'level') and target.level > 0: (sr0, sr1, dr0, dr1, vr) = match_range(target.source.r0, target.source.Nr, self.r0, self.Nr) (sc0, sc1, dc0, dc1, vc) = match_range(target.source.c0, target.source.Nc, self.c0, self.Nc) if (vr & vc): for b in bands: target.source.z[b,sr0:sr1, sc0:sc1]=self.z[b, dr0:dr1, dc0:dc1] else: band=target.source.GetRasterBand(1) (sr0, sr1, dr0, dr1, vr) = match_range(0, band.YSize, self.r0, self.Nr) (sc0, sc1, dc0, dc1, vc) = match_range(0, band.XSize, self.c0, self.Nc) if (vr & vc): for bb in (bands): band=target.source.GetRasterBand(int(bb)) band.WriteArray( self.z[bb-1, dr0:dr1, dc0:dc1], int(sc0), int(sr0)) def match_range(s0, ns, d0, nd): i0 = max(s0, d0) i1 = min(s0+ns, d0+nd) si0 = max(0, i0-s0) si1 = min(ns, i1-s0) di0 = max(0, i0-d0) di1 = min(nd,i1-d0) any_valid=(di1>di0) & (si1 > si0) return (si0, si1, di0, di1, any_valid) # Try and use the faster Fourier transform functions from the pyFFTW # module if available. Otherwise use the normal scipy fftpack ones # instead (~2-3x slower!). try: from pyfftw.interfaces.scipy_fftpack import fftn, ifftn except ImportError: print("Module 'pyfftw' (FFTW Python bindings) could not be imported.\n"\ "To install it, try running 'easy_install anfft' from the terminal.\n"\ "Falling back on the slower 'fftpack' module for ND Fourier transforms.") from scipy.fftpack import fftn, ifftn class TemplateMatch(object): """ N-dimensional template search by normalized cross-correlation or sum of squared differences. Arguments: ------------------------ template The template to search for """ def __init__(self,template): self.template = template def __call__(self,a): if a.ndim != self.template.ndim: raise Exception('Input array must have the same number of dimensions as the template (%i)' %self.template.ndim) C = norm_xcorr(self.template, a, trim=True) return C def norm_xcorr(t, a, trim=True): """ Fast normalized cross-correlation for n-dimensional arrays Inputs: ---------------- t The template. Must have at least 2 elements, which cannot all be equal. a The search space. Its dimensionality must match that of the template. trim If True (default), the output array is trimmed down to the size of the search space. Otherwise, its size will be (f.shape[dd] + t.shape[dd] -1) for dimension dd. Output: ---------------- nxcorr An array of cross-correlation coefficients, which may vary from -1.0 to 1.0. Wherever the search space has zero variance under the template, normalized cross-correlation is undefined. In such regions, the correlation coefficients are set to zero. References: Hermosillo et al 2002: Variational Methods for Multimodal Image Matching, International Journal of Computer Vision 50(3), 329-343, 2002 <http://www.springerlink.com/content/u4007p8871w10645/> Lewis 1995: Fast Template Matching, Vision Interface, p.120-123, 1995 <http://www.idiom.com/~zilla/Papers/nvisionInterface/nip.html> <http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation> Alistair Muldal Department of Pharmacology University of Oxford <alistair.muldal@pharm.ox.ac.uk> Sept 2012 """ if t.size < 2: raise Exception('Invalid template') if t.size > a.size: raise Exception('The input array must be smaller than the template') std_t,mean_t = np.std(t),np.mean(t) if std_t == 0: #raise Exception('The values of the template must not all be equal (they are equal to %f)' % mean_t) #warnings.warn('The values of the template are all the same, correlation failed') return None t = np.float64(t) a = np.float64(a) # output dimensions of xcorr need to match those of local_sum outdims = np.array([a.shape[dd]+t.shape[dd]-1 for dd in range(a.ndim)]) # hack by BS 1/15/2013-- the direct method appears not to work af = fftn(a,shape=outdims) tf = fftn(ndflip(t),shape=outdims) # 'non-normalized' cross-correlation xcorr = np.real(ifftn(tf*af)) # local linear and quadratic sums of input array in the region of the # template ls_a = local_sum(a,t.shape, 0) ls2_a = local_sum(a**2,t.shape, np.mean(a**2)) # now we need to make sure xcorr is the same size as ls_a xcorr = procrustes(xcorr,ls_a.shape,side='both') # local standard deviation of the input array ls_diff = ls2_a - (ls_a**2)/t.size ls_diff = np.where(ls_diff < 0,0,ls_diff) sigma_a = np.sqrt(ls_diff) # standard deviation of the template sigma_t = np.sqrt(t.size-1.)*std_t # denominator: product of standard deviations denom = sigma_t*sigma_a # numerator: local mean corrected cross-correlation numer = (xcorr - ls_a*mean_t) # sigma_t cannot be zero, so wherever the denominator is zero, this must # be because sigma_a is zero (and therefore the normalized cross- # correlation is undefined), so set nxcorr to zero in these regions tol = np.sqrt(np.finfo(denom.dtype).eps) nxcorr = np.zeros(numer.shape) good = denom>tol nxcorr[good]=numer[good]/denom[good] #nxcorr = np.where(denom < tol,0,numer/denom) # if any of the coefficients are outside the range [-1 1], they will be # unstable to small variance in a or t, so set them to zero to reflect # the undefined 0/0 condition bad = nxcorr-1. > np.sqrt(np.finfo(nxcorr.dtype).eps); nxcorr[bad] = 0. if trim: nxcorr = procrustes(nxcorr,a.shape,side='both') sigma_a = procrustes(sigma_a,a.shape,side='both') return nxcorr def local_sum(a, tshape, padval): """For each element in an n-dimensional input array, calculate the sum of the elements within a surrounding region the size of the template""" # zero-padding a = ndpad(a, tshape, padval) # difference between shifted copies of an array along a given dimension def shiftdiff(a,tshape,shiftdim): ind1 = [slice(None,None),]*a.ndim ind2 = [slice(None,None),]*a.ndim ind1[shiftdim] = slice(tshape[shiftdim], a.shape[shiftdim]-1) ind2[shiftdim] = slice(0,a.shape[shiftdim]-tshape[shiftdim]-1) return a[tuple(ind1)] - a[tuple(ind2)] # take the cumsum along each dimension and subtracting a shifted version # from itself. this reduces the number of computations to 2*N additions # and 2*N subtractions for an N-dimensional array, independent of its # size. # # See: # <http://www.idiom.com/~zilla/Papers/nvisionInterface/nip.html> for dd in range(a.ndim): a = np.cumsum(a,dd) a = shiftdiff(a,tshape,dd) return a def ndpad(a,npad=None,padval=0): """ Pads the edges of an n-dimensional input array with a constant value across all of its dimensions. Inputs: ---------------- a The array to pad npad* The pad width. Can either be array-like, with one element per dimension, or a scalar, in which case the same pad width is applied to all dimensions. padval The value to pad with. Must be a scalar (default is 0). Output: ---------------- b The padded array *If npad is not a whole number, padding will be applied so that the 'left' edge of the output is padded less than the 'right', e.g.: a == np.array([1,2,3,4,5,6]) ndpad(a,1.5) == np.array([0,1,2,3,4,5,6,0,0]) In this case, the average pad width is equal to npad (but if npad was not a multiple of 0.5 this would not still hold). This is so that ndpad can be used to pad an array out to odd final dimensions. """ if npad == None: npad = np.ones(a.ndim) elif np.isscalar(npad): npad = (npad,)*a.ndim elif len(npad) != a.ndim: raise Exception('Length of npad (%i) does not match the '\ 'dimensionality of the input array (%i)' %(len(npad),a.ndim)) # initialise padded output padsize = [a.shape[dd]+2*npad[dd] for dd in range(a.ndim)] b = np.ones(padsize,a.dtype)*padval # construct an N-dimensional list of slice objects ind = [slice(int(np.floor(npad[dd])), int(a.shape[dd]+np.floor(npad[dd]))) for dd in range(a.ndim)] # fill in the non-pad part of the array b[tuple(ind)] = a return b def procrustes(a,target,side='both',padval=0): """ Forces an array to a target size by either padding it with a constant or truncating it Arguments: a Input array of any type or shape target Dimensions to pad/trim to, must be a list or tuple """ try: if len(target) != a.ndim: raise TypeError('Target shape must have the same number of dimensions as the input') except TypeError: raise TypeError('Target must be array-like') try: b = np.ones(target,a.dtype)*padval except TypeError: raise TypeError('Pad value must be numeric') except ValueError: raise ValueError('Pad value must be scalar') aind = [slice(None,None)]*a.ndim bind = [slice(None,None)]*a.ndim # pad/trim comes after the array in each dimension if side == 'after': for dd in range(a.ndim): if a.shape[dd] > target[dd]: aind[dd] = slice(None, int(target[dd])) elif a.shape[dd] < target[dd]: bind[dd] = slice(None, int(a.shape[dd])) # pad/trim comes before the array in each dimension elif side == 'before': for dd in range(a.ndim): if a.shape[dd] > target[dd]: aind[dd] = slice(int(a.shape[dd]-target[dd]), None) elif a.shape[dd] < target[dd]: bind[dd] = slice(int(target[dd]-a.shape[dd]), None) # pad/trim both sides of the array in each dimension elif side == 'both': for dd in range(a.ndim): if a.shape[dd] > target[dd]: diff = (a.shape[dd]-target[dd])/2. aind[dd] = slice(int(np.floor(diff)), int(a.shape[dd]-np.ceil(diff))) elif a.shape[dd] < target[dd]: diff = (target[dd]-a.shape[dd])/2. bind[dd] = slice(int(np.floor(diff)), int(target[dd]-np.ceil(diff))) else: raise Exception('Invalid choice of pad type: %s' %side) b[tuple(bind)] = a[tuple(aind)] return b def ndflip(a): """Inverts an n-dimensional array along each of its axes""" ind = (slice(None,None,-1),)*a.ndim return a[ind] def log_filter(img, noData): """ performs a separable Laplacian of Gaussian filter on the input image. Returns a copy of the original image, converted to float64 """ img1 = np.float64(img.copy()) img1 = sf.laplace( img1, mode='constant') if np.sum(img<=noData) > 0 : #zero the filtered image at data-nodata boundaries mask = np.float64(img.copy()) mask[:] = 1. mask[img<=noData] = 0.0 mask=sf.laplace(mask, mode='constant') img1[mask != 0.] = 0. # set the borders to zero img1 = sf.gaussian_filter(img1, (1.4, 1.4), mode='constant') return img1 #============================================================================== # Start of sparse_disp functions #============================================================================== def run_one_block(template_size, KW, min_template_sigma, Xc, Yc, search_range_x, search_range_y, dx0, dy0, T_img, S_img, noData): # Do template matching for a single block in the left image. # LOG filter the images T_filt = log_filter(T_img, noData) S_filt = log_filter(S_img, noData) std_T = np.std(T_filt) if min_template_sigma is not None: if std_T <= min_template_sigma: return(-2, Xc, Yc, -1, 0, 0) # Run the feature match. TT = T_filt[KW:template_size+KW, KW:template_size+KW ] SS = S_filt[KW:search_range_y+KW, KW:search_range_x+KW] # If the search image is large, do an initial search at 2x lower resolution if (SS.shape[0] > 32+TT.shape[0]) or (SS.shape[1] >32+TT.shape[1]): low_res_template = TT[1:-1:2, 1:-1:2] low_res_image = SS[1:-1:2, 1:-1:2] template_matcher = TemplateMatch(low_res_template) # Perform template search result = template_matcher(low_res_image) if result is None: #warnings.warn('run_one_block: TemplateMatch returned None at xc=%d, yc=%d' % (Xc, Yc)) return(-3., Xc, Yc, 0., np.NaN, np.NaN) 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)] ijC = 2*(np.array(np.unravel_index(np.argmax(result), result.shape))-[result.shape[0]/2., result.shape[1]/2.]).astype(int) t_xr = np.array(ijC[1]+[-template_size/2-16, template_size/2+16]+SS.shape[1]/2, dtype=np.int16) t_yr = np.array(ijC[0]+[-template_size/2-16, template_size/2+16]+SS.shape[0]/2, dtype=np.int16) if t_xr[0] >= 0 and t_yr[0] >= 0 and t_xr[1] <= SS.shape[1] and t_yr[1] <= SS.shape[0] : dx0 = dx0+ijC[1] dy0 = dy0+ijC[0] SS = SS[t_yr[0]:t_yr[1], t_xr[0]:t_xr[1]] template_matcher = TemplateMatch(TT) result = template_matcher(SS) # trim off edges of result result=result[int(template_size/2):int(SS.shape[0]-template_size/2), int(template_size/2):int(SS.shape[1]-template_size/2)] ij = np.unravel_index(np.argmax(result), result.shape) ijC = ij-np.array([result.shape[0]/2, result.shape[1]/2]) return (result[ij], Xc, Yc, std_T, ijC[1]+dx0, ijC[0]+dy0) def run_blocks(param): # Run template matching for a set of blocks. This function is being # distributed across multiple processors. (Tfile, Sfile, processes, xgi, ygi, these_ind, template_size, search_range_xy_i, dxy0_i, XYc_i, min_template_sigma, user_nodata) = param matcher = fft_matcher(Tfile, Sfile, processes, user_nodata) KW=matcher.KW s_x_bounds=np.c_[XYc_i[:,0]+dxy0_i[:,0]-search_range_xy_i[:,0]-KW-1000, XYc_i[:,0]+dxy0_i[:,0]+search_range_xy_i[:,0]+KW+1000] s_y_bounds=np.c_[XYc_i[:,1]+dxy0_i[:,1]-search_range_xy_i[:,1]-KW-1000, XYc_i[:,1]+dxy0_i[:,1]+search_range_xy_i[:,1]+KW+1000] matcher.T_sub.setBounds(xgi-template_size, ygi-template_size, matcher.blocksize+2*template_size, matcher.blocksize+2*template_size, update=1) matcher.S_sub.setBounds(s_x_bounds[:,0].min(), s_y_bounds[:,0].min(), s_x_bounds[:,1].max()-s_x_bounds[:,0].min(), s_y_bounds[:,1].max()-s_y_bounds[:,0].min(), update=1) indices = []; c = []; x = []; y = []; sigma = []; dx = []; dy = []; # loop over the sub-blocks count=-1 T_buffer=im_subset(0, 0, 0, 0, matcher.T_sub, user_nodata, pad_val=matcher.T_sub.noData) S_buffer=im_subset(0, 0, 0, 0, matcher.S_sub, user_nodata, pad_val=matcher.S_sub.noData) for Xc, Yc, search_range_x, search_range_y, dx0, dy0 in \ zip(XYc_i[:,0], XYc_i[:,1], search_range_xy_i[:,0], search_range_xy_i[:,1], dxy0_i[:,0],dxy0_i[:,1]): #print("S_buffer.Nodata=%f, T_buffer.noData"% (matcher.S_sub.noData, matcher.T_sub.noData) count=count+1 t_xr=[Xc-(template_size/2-1)-KW, Xc+(template_size/2) +KW] t_yr=[Yc-(template_size/2-1)-KW, Xc+(template_size/2) +KW] s_xr=[Xc+dx0-(search_range_x/2-1)-KW, Xc+(search_range_x/2)+KW] s_yr=[Yc+dy0-(search_range_y/2-1)-KW, Yc+(search_range_y/2)+KW] # Read in the data for this block. Use the im_subset objects: # read nodata if we read past the image edges. # Read T T_buffer.setBounds(t_xr[0]-KW, t_yr[0]-KW, template_size+2.*KW, template_size+2.*KW, update=1) T_img=T_buffer.z[0,:,:] if np.mean(T_img<=T_buffer.noData)>.1: # bail if > 10% 0, flag with C=-2 continue # Read S S_buffer.setBounds(s_xr[0]-KW, s_yr[0]-KW, search_range_x+2.*KW, search_range_y+2.*KW, update=1) S_img=S_buffer.z[0,:,:] if np.mean(S_img<=S_buffer.noData) > .25: # bail if > 25% 0 continue out = run_one_block(template_size, KW, min_template_sigma, Xc, Yc, int(search_range_x), int(search_range_y), dx0, dy0, T_img, S_img, T_buffer.noData) indices.append(these_ind[count]) c.append(out[0]) x.append(out[1]) y.append(out[2]) sigma.append(out[3]) dx.append(out[4]) dy.append(out[5]) return(indices[:], c[:], x[:], y[:], sigma[:], dx[:], dy[:]) class fft_matcher(object): """ class to perform fft matches on a pair of image files. Uses the GDAL API for reads and writes, and the norm_xcorr package to do the matching Arguments: For initialization: Tfile The template file -- small images are extracted from this file and correlated against sub-images of Sfile Sfile The search file. For correlation: template_size : Size of the square template search_range_xy_i : [2, N], array-like search windows in x and y to use at each center (n_columns, n_rows) dxy0_i : [2, N], array-like initial offset estimates (delta_col, delta_row) XYc_i : [2,N] pixel centers to search in the template image (col, row) Outputs from correlation: xyC : Pixel centers in the template image dxy : pixel offsets needed to shift the template to match the search image C : Correlation value for the best match (0<C<1). -1 indicates invalid search or template data """ def __init__(self, Tfile, Sfile, processes, user_nodata): self.Tfile = Tfile self.Sfile = Sfile self.processes = processes self.T_ds = gdal.Open(Tfile, gdalconst.GA_ReadOnly) self.T_band = self.T_ds.GetRasterBand(1) self.S_ds = gdal.Open(Sfile, gdalconst.GA_ReadOnly) self.S_band = self.S_ds.GetRasterBand(1) self.Nx = self.T_band.XSize self.Ny = self.T_band.YSize self.KW = 13 # pad the edges by this amount to avoid edge effects self.S_sub = im_subset(0, 0, self.S_band.XSize, self.S_band.YSize, self.S_ds, user_nodata, pad_val=0, Bands=[1]) self.T_sub = im_subset(0, 0, self.T_band.XSize, self.S_band.YSize, self.T_ds, user_nodata, pad_val=0, Bands=[1]) search_geotransform = self.S_sub.source.GetGeoTransform() self.search_geotransform = search_geotransform self.UL_S = np.array([search_geotransform[0], search_geotransform[3]]) LL_S = np.array([search_geotransform[0], search_geotransform[3]+self.S_sub.Nr*search_geotransform[5]]) UR_S = np.array([search_geotransform[0]+self.S_sub.Nc*search_geotransform[1], search_geotransform[3]]) template_geotransform = self.T_sub.source.GetGeoTransform() self.template_geotransform = template_geotransform self.UL_T = np.array([template_geotransform[0], template_geotransform[3]]) LL_T = np.array([template_geotransform[0], template_geotransform[3]+self.T_sub.Nr*template_geotransform[5]]) UR_T = np.array([template_geotransform[0]+self.T_sub.Nc*template_geotransform[1], template_geotransform[3]]) XR = [np.max([LL_S[0], LL_T[0]]), np.min([UR_S[0], UR_T[0]])] YR = [np.max([LL_S[1], LL_T[1]]), np.min([UR_S[1], UR_T[1]])] self.XR = XR self.YR = YR self.T_c0c1 = np.array([max([0, (LL_T[0]-XR[0])/template_geotransform[1]]), min(self.T_sub.Nc, (XR[1]-LL_T[0])/template_geotransform[1])]).astype(int) self.T_r0r1 = np.array([max([0 , (YR[1]-UR_T[1])/template_geotransform[5]]), min([self.T_sub.Nr, (LL_T[1]-YR[1])/template_geotransform[5]])]).astype(int) self.blocksize = 2048 self.user_nodata = user_nodata def __call__(self, template_size, search_range_xy_i, dxy0_i, XYc_i, min_template_sigma): # loop over pixel centers self.C = np.zeros([XYc_i.shape[0], 1])-1 self.sigma_template = (self.C).copy() self.dxy = np.zeros([XYc_i.shape[0], 2]) self.xyC = np.zeros([XYc_i.shape[0], 2]) xg0, yg0 = np.meshgrid(np.arange(0, self.T_band.XSize, self.blocksize), np.arange(0, self.T_band.YSize, self.blocksize)) TaskParams = [] for xgi, ygi in zip(xg0.ravel(), yg0.ravel()): these = np.logical_and(np.logical_and(XYc_i[:,0] > xgi, XYc_i[:,0] <= xgi+self.blocksize), np.logical_and(XYc_i[:,1] > ygi, XYc_i[:,1] <= ygi+self.blocksize)) if ~np.any(these): continue XYc = XYc_i[these,:] dxy0 = dxy0_i[these,:] search_range_xy = search_range_xy_i[these,:] these_ind = np.array(np.nonzero(these)).ravel() param = (self.Tfile, self.Sfile, self.processes, xgi.copy(), ygi.copy(), these_ind.copy(), template_size, search_range_xy.copy(), dxy0.copy(), XYc.copy(), min_template_sigma, self.user_nodata) TaskParams.append(param) if self.processes > 1: # Run using multiple processes pool = Pool(processes=self.processes) Out = pool.map(run_blocks, TaskParams, chunksize=1) else: # Run using single process (for debugging) Out = [run_blocks(TP) for TP in TaskParams] for out in Out: (indices, c, x, y, sigma, dx, dy) = out for i in range(len(indices)): ind = indices[i] self.C[ind] = c[i] self.xyC[ind] = [x[i], y[i]] self.sigma_template[ind] = sigma[i] self.dxy[ind,:] = [dx[i], dy[i]] return (self.xyC).copy(), (self.dxy).copy(), (self.C).copy(), (self.sigma_template).copy() def make_pt_2_neighbors(tri): """ make a dictionary of the neighbors of each point in triangulation tri """ pt_dict=dict() for vlist in tri.simplices: for i in vlist: if not i in pt_dict: pt_dict[i]=list() for k in vlist: if k != i: pt_dict[i].insert(0,k) for i in range(tri.points.shape[0]): pt_dict[i]=np.unique(pt_dict[i]).tolist() return pt_dict def unique_rows(data): """ return the indices for the unique rows of matrix (data) """ udict = dict() for row in range(len(data)): row_data = tuple(data[row,:]) if not row_data in udict: udict[row_data] = row uInd=udict.values() new_ind = [] for key in udict: new_ind.append(udict[key]) new_rows = data[new_ind, :] return new_ind, new_rows def search_new_pts(xy, dxy, t_size, matcher, min_template_sigma=0., mask=None): """ use an image matcher object to perform a template match between two images at the points defined by xy, using search windows that span the range in dxy """ if mask is not None: x_geo = matcher.template_geotransform[0] + matcher.template_geotransform[1]*xy[:,0] y_geo = matcher.template_geotransform[3] + matcher.template_geotransform[5]*xy[:,1] good_pts = img_interpolate_linear(x_geo, y_geo, mask['Z'], mask['GT']) good_pts = (~np.isnan(good_pts)) & (good_pts > 0) if ~np.any(good_pts): return np.zeros(0), np.zeros(0), np.zeros(0), np.zeros(0) xy = xy [good_pts,:] dxy = dxy[good_pts,:] dxy0 = np.c_[dxy[:,0]+dxy[:,1], dxy[:,2]+dxy[:,3]]/2. dxyR = np.c_[dxy[:,1]-dxy[:,0], dxy[:,3]-dxy[:,2]] sw = np.array(2.**np.ceil(np.log2(np.maximum(dxyR+t_size, t_size+16)))) xy_new, dxy_new, C_new, Pt_new = matcher(t_size, sw, dxy0, xy, min_template_sigma=min_template_sigma) xy_bad_mask = xy_new [C_new.ravel()==-2,:] good = C_new>0 xy_new = xy_new [good.ravel(),:] dxy_new = dxy_new[good.ravel(),:] C_new = C_new [good.ravel() ] Pt_new = Pt_new [good.ravel() ] return xy_new, dxy_new, C_new, xy_bad_mask def neighborhood_range(pt_list, dx_mat, dy_mat, tri, pt_dict, max_dist=None, calc_min_slope=None): """ for each point in pt_list, return the maximum and minimum offset to its neighbors. inputs: pt_list: list of points to be searched dx_mat: sparse matrix with x disparity values for each pixel in the template image dy_may: ditto, but for y tri: a triangulation. th points field in this triangulation is used to get the x and y offsets for the point indices pt_dict: a dictionary giving the neighbor point numbers for each point in tri output: dx_range: an Nx4 martix. columns 0 and 1 give the min and max x offsets around each point, columns 2 and 3 give the min and max y. """ dxy_range = np.zeros([len(pt_list), 4]) if calc_min_slope is not None: dxy_slope = np.zeros([len(pt_list), 2]) for row, pt in enumerate(pt_list): neighbors = pt_dict[pt] nbhd_pts = tri.points[neighbors,:] this_pt = tri.points[pt,:] if max_dist is not None: dist2 = (nbhd_pts[:,1]-this_pt[1])**2 + (nbhd_pts[:,0]-this_pt[0])**2 nbhd_pts = nbhd_pts[dist2 < max_dist**2,:] if nbhd_pts is None or min(nbhd_pts.shape) < 1: continue dx_vals = np.append(np.array(dx_mat[nbhd_pts[:,1], nbhd_pts[:,0]]), dx_mat[int(this_pt[1]), int(this_pt[0])]) dy_vals = np.append(np.array(dy_mat[nbhd_pts[:,1], nbhd_pts[:,0]]), dy_mat[int(this_pt[1]), int(this_pt[0])]) if calc_min_slope is not None: dist = np.sqrt((nbhd_pts[:,1]-this_pt[1])**2 + (nbhd_pts[:,0]-this_pt[0])**2) dx_slope = np.abs(dx_vals[0:-1]-dx_vals[-1])/dist dy_slope = np.abs(dy_vals[0:-1]-dy_vals[-1])/dist dxy_slope[row,:] = [np.min(dx_slope), np.min(dy_slope)]; dxy_range[row,[0,1]] = [np.min(dx_vals), np.max(dx_vals)] dxy_range[row,[2,3]] = [np.min(dy_vals), np.max(dy_vals)] if calc_min_slope is not None: return dxy_range, dxy_slope else: return dxy_range ##, dxy_bar def test_epipolar(dxy_0, ep_vec, dxy, tol): """ given an origin vector and an epipolar unit vector, projects a set of points against the epipolar vector and gives their perpendicular offset WRT that vector, and a boolean array that shows whether this offset is smaller that tol. """ delta=np.abs(np.dot((dxy-dxy_0), [ep_vec[1], -ep_vec[0]])) disp_mag=np.sqrt((dxy[:,0]-dxy_0[0])**2 +(dxy[:,1]-dxy_0[1])**2) good=(delta < tol) | (delta < 0.02 * disp_mag ) return good, delta def est_epipolar_vec(dxy, C, C_tol, ep_vec_initial, F_use): """ given a set of offsets and correlation values: For those point with C>C_tol, find the median offset and the eigenvectors of the distribution of the points around that median offset. The eigenvector corresponding to the largest eigenvalue is assumed to be the epipolar vector. """ if ep_vec_initial is not None: return ep_vec_initial, np.zeros([1,2]) P_use =100*np.array([(1-F_use)/2., (F_use+1.)/2.]) ctr_vals=((dxy[:,0] >= np.percentile(dxy[:,0], P_use[0])) & (dxy[:,0] <= np.percentile(dxy[:,0], P_use[1])) & (dxy[:,1] >= np.percentile(dxy[:,1], P_use[0])) & (dxy[:,1] <= np.percentile(dxy[:,1], P_use[1])) ) good = ctr_vals & np.array(C.ravel()>C_tol, dtype=bool) dxy1 = np.array(dxy[good.ravel(),:]) dxy_ctr = np.array([np.median(dxy1[:,0]), np.median(dxy1[:,1])]) dxy_0 = dxy1.copy() dxy_0[:,0] = dxy_0[:,0]-dxy_ctr[0] dxy_0[:,1] = dxy_0[:,1]-dxy_ctr[1] vals, vecs = np.linalg.eig(np.dot(dxy_0.transpose(), dxy_0)) biggest_vec = vecs[:,np.argmax(abs(vals)) ] return biggest_vec, dxy_ctr def img_interpolate_linear( x, y, I, GT, nodata_val=np.NaN): result=np.zeros_like(x)+nodata_val # get the col and row in the image col = (x-GT[0])/GT[1] row = (y-GT[3])/GT[5] good = (row > 0) & (row < I.shape[0]-1) & (col > 0) & (col<I.shape[1]-1) if ~np.any(good): return result # perform interpolation only for in-bounds xy row = row[good] col = col[good] rx = row-np.floor(row) ry = col-np.floor(col) row = np.floor(row).astype('int') col = np.floor(col).astype('int') # add the contributions of each neighbor ztemp = np.zeros_like(row) ztemp = (1-ry)*(1-rx)*I[(row, col)] ztemp = ztemp + (ry)*(1-rx)*I[(row+1,col)] ztemp = ztemp + (1-ry)*(rx)*I[(row,col+1)] ztemp = ztemp + (ry)*(rx)*I[(row+1,col+1)] result[good] = ztemp return result def grid_disp(xg, yg, xy, dx, dy, ex, ey, L_valid, N_coarse, dispDs, spreadDs, downscale, cr_out): grid_spacing = xg[0,1]-xg[0,0] # valid kernel dilates the distance mask, which tells whether to correlate sigma_valid = L_valid/3; N_valid = np.ceil(sigma_valid*3/grid_spacing) kernel_valid = np.exp(-0.5*(grid_spacing*np.arange(-N_valid, N_valid+1)/(sigma_valid))**2) # smoothing kernel is used to make a large-scale smoothed version of the disparities # set its smoothing width to 512 pixels, make sure the whole kernel is at least 1024 pixels wider than the valid kernel N_sm = 2048/downscale+np.ceil(L_valid/grid_spacing); sigma_sm = N_sm/4. kernel_sm = np.exp(-0.5*(np.arange(-N_sm, N_sm+1)/sigma_sm)**2) row = np.floor((xy[:,1]-yg[0,0])/(yg[1,0]-yg[0,0])).astype('int') col = np.floor((xy[:,0]-xg[0,0])/(xg[0,1]-xg[0,0])).astype('int') good = (row>=0) & (row < xg.shape[0]-1) & (col >=0) & (col < xg.shape[1]-1) dist_mask = np.zeros_like(xg) dist_mask[row[good], col[good]] = 1. dist_mask = convolve1d(convolve1d(dist_mask, kernel_valid, axis=0, mode='constant'), kernel_valid, axis=1, mode='constant') dist_mask = dist_mask > np.exp(-0.5*(L_valid/sigma_valid)**2) # take a subset of points from dist_mask to limit the interpolation distance for each quantity # Otherwise, the triangulation makes long skinny triangles along concave boundaries of the data points mask1 = dist_mask[0::N_coarse, 0::N_coarse].ravel() xg1 = xg[0::N_coarse, 0::N_coarse].ravel() yg1 = yg[0::N_coarse, 0::N_coarse].ravel() xg1 = xg1[mask1==0] yg1 = yg1[mask1==0] for count, z in enumerate((dx, dy)): 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') zi_smooth = convolve1d(convolve1d(np.nan_to_num(zi), kernel_sm, axis=0, mode='constant'), kernel_sm, axis=1, mode='constant') if count<1: mask_smooth=convolve1d(convolve1d((~np.isnan(zi)).astype('float32'), kernel_sm, axis=0, mode='constant'), kernel_sm, axis=1, mode='constant') zi_smooth[mask_smooth>1e-5 ] = zi_smooth[mask_smooth>1e-5]/mask_smooth[mask_smooth>1e-5] zi_smooth[mask_smooth<=1e-5] = 0 zi[np.isnan(zi)] = zi_smooth[np.isnan(zi)] zi = np.nan_to_num(zi) # ... and write it out to the disparity file dispDs.GetRasterBand(count+1).WriteArray(zi[:,:,0], int(cr_out[0]), int(cr_out[1])) if count==0: dx_g = zi if count==1: dy_g = zi dispDs.GetRasterBand(3).WriteArray(dist_mask.astype('float32'), int(cr_out[0]), int(cr_out[1])) 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')) zi[dist_mask==0] = 0 spreadDs.GetRasterBand(1).WriteArray(zi[:,:,0], int(cr_out[0]), int(cr_out[1])) 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')) zi[dist_mask==0] = 0 spreadDs.GetRasterBand(2).WriteArray(zi[:,:,0], int(cr_out[0]), int(cr_out[1])) spreadDs.GetRasterBand(3).WriteArray(dist_mask.astype('float32'), int(cr_out[0]), int(cr_out[1])) return #============================================================================== # Main program #============================================================================== def main(): """ For a pair of images, perform a sparse image match using the full resolution of the images. Begin at resolution coarse_skip. For each point in a grid spanning the image 1, extract a template image of size template_size, and use fft-based correlation to find its match in image 2, over a wide search window (size xsearch by ysearch). Based on matches from this coarse grid, estimate an epipolar vector (the largest eigenvector of the disparity vectors) and a tolerance for disparities to be parallel to this vector (use max (16 pix, 90th percentile of differeces)). Next, refine points for which the range of disparities among the neighbors are larger than tolerance refine_tol. Refinement consists of adding the eight grid neighbors of a point, at half the previous point spacing. During refinment, the search windows are selected to span the neighbors' x and y disparities, and are padded by 16 pixels and padded again to give a power-of-two search size. After each refinement, the new matches are checked againt the epipolar vector, and all the matched points are checked for convergence. Refinment continues until the point spacing reaches fine_skip, or until no points need to be refined. Writes the output disparity image files: [output_prefix]/-D_sub.tif [output_prefix]/-D_sub_spread.tif ??? Results are written to oufile: pixel_x pixel_y x_disparity y_diparity correlation value (max-min) neighbor x disparity (max-min) neighbor y disparity """ usage = '''%prog [options] left_image right_image output_prefix ''' + get_asp_version() parser = OptionParser(usage=usage) parser.set_defaults(epipolar_fltr=True) parser.add_option("-x", "--xsearch", dest="search_range_x", default=1024-56, type="int", help="initial x search range, pixels (%default)") parser.add_option("-y", "--ysearch", dest="search_range_y", default=1024-56, type="int", help="initial y search range, pixels (%default)") parser.add_option("-t", "--template", dest="template_size", default=56, type="int", help="template size, pixels (%default)") parser.add_option("-c", "--coarse", dest="coarse_skip", default=None, type="int", help="initial search-point spacing, pixels (%default)") parser.add_option("-f", "--fine", dest="fine_skip", default=64, type="int", help="final search-point spacing, pixels (%default)") parser.add_option("-r","--refine_tol", dest="refine_tol", default=8, type="int", help="pixel range tolerance for refinement (%default)") parser.add_option("-d","--output_dec_scale", dest="output_scale", default=8, type="int", help="if set, output a second copy of the offsets scaled by this amount (%default), to file called OUTFILE_(OUTPUT_SCALE)") parser.add_option("-p","--output_pad", dest="output_pad", default=2, type="int", help="pad the output search range by this amount (%default)") parser.add_option("-s", "--sigma_t_min", dest="sigma_t_min", default=0., type="float", help="matches will not be calculated if the standard deviation of the template is less than this value (%default)") parser.add_option("-R", "--R_lim_min", dest="R_lim_min", default=32., type="float", 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)") parser.add_option("-l", "--R_limax_disp_range", dest="R_limax_disp_range", default=128., type="float", 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)") parser.add_option("-m", "--mask_file", dest="mask_file", default=None, type="string", help="if specified, use this geotif mask file to reject template-image points that should not be searched (1=search, 0=don't)") parser.add_option("-M", "--Max_disp_range", dest="max_disp_range", default=64., type="float", help="Un-scaled disparity range in output limited to this value (%default)") parser.add_option("-P", "--processes", dest="processes", default=cpu_count(), type="int", help="The number of processes to use (%default)") parser.add_option("--no_epipolar_fltr", action="store_false", dest="epipolar_fltr", help="Disable filtering of disparities by distance from epipolar vector") parser.add_option("-e", "--epipolar_axis", dest="epipolar_axis", default=None, type="int", help="If set, specify the axis that is epipolar 0=x, 1=y (%default)") parser.add_option("-n", "--nodata-value", dest="user_nodata", default=None, type="int", help="The no-data value (pixel values <= nodata are not not used. (%default)") parser.add_option("-w", "--fill-dist", dest="fill_dist", default=1000., type="float", help="Fill in gaps of this size or more with smoothed values. (%default)") parser.add_option("-D", "--Debug", dest="Debug", default=False, action="store_true", help="Output deugging info and text file of correlation-estimate points") (options, args) = parser.parse_args() if len(args) < 3: parser.print_help() asp_system_utils.raise_error('Missing input files or output prefix', code=2) if options.mask_file is not None: mask_file=gdal.Open(options.mask_file) in_mask={'GT': np.array(mask_file.GetGeoTransform()), 'Z': np.array(mask_file.ReadAsArray())} else: in_mask=None # undocumented options # F_ep_pts_to_use = 0.9 ep_tol_max = 24 ep_tol_min = 4 dxy_slope_tol = 3.0 corr_score_tolerance = 0.4 # minimum quality needed in defining the epipolar vector estimate template_file = args[0] search_file = args[1] output_prefix = args[2] sys.stdout.flush() print("Start: " + str(datetime.datetime.now())) print("template_file = " + template_file) print("search_file = " + search_file ) print("output_prefix = " + output_prefix) # Minimum number of coarse points in any dimension min_npts = 8 # Adjust the input parameters based on the images. This # may need to become more advanced. T_ds = gdal.Open(template_file, gdalconst.GA_ReadOnly) T_band = T_ds.GetRasterBand(1) # Limit search range to less than a quarter of the image size # - This appears to be a hard limitation imposed by the FFT usage?? prev2x = prevpow2( T_band.XSize) if options.search_range_x > prev2x/4: options.search_range_x = prev2x/4 print("Warning: Decreasing xsearch value to: %d" % options.search_range_x) prev2y = prevpow2(T_band.YSize) if options.search_range_y > prev2y/4: options.search_range_y = prev2y/4 print("Warning: Decreasing ysearch value to: %d" % options.search_range_y) # Automatically set coarse_skip if not specified if options.coarse_skip is None: options.coarse_skip = np.min([prev2x/min_npts, prev2y/min_npts]) print("Setting coarse skip to: %d" % options.coarse_skip) else: # Check to make sure coarse_skip isn't TOO coarse # Minimum of 4 points in smallest dimension if options.coarse_skip > np.min([prev2x/min_npts, prev2y/min_npts]): options.coarse_skip = np.min([prev2x/min_npts, prev2y/min_npts]) print("Warning: decreasing coarse skip to: %d" % options.coarse_skip) search_range_x = options.search_range_x search_range_y = options.search_range_y template_size = options.template_size # If the user specified an epipolar axis, limit the search range to primarily along that axis # with only a small search range perpendicular to that axis. if options.epipolar_axis is not None: # Handle user epipolar axis input ep_vec_initial = np.zeros([1,2]) ep_vec_initial[options.epipolar_axis] = 1. if options.epipolar_axis == 0: # X axis search_range_y = np.min([search_range_y, search_range_x/10.]); else: # Y axis search_range_x = np.min([search_range_x, search_range_y/10.]); else: ep_vec_initial = None # Create the output directory out_dir = os.path.dirname(output_prefix) if len(out_dir) == 0: out_dir = '.' if not os.path.exists(out_dir): os.makedirs(out_dir) # Generate a list of skip distances from the course level to the fine level. skip_vals = 2.**np.arange(np.floor(np.log2(options.coarse_skip/2.)), np.floor(np.log2(options.fine_skip /2.)), -1) # Initialize the matcher object matcher = fft_matcher(template_file, search_file, options.processes, options.user_nodata) # Define the initial search points # ?? edge_pad = np.array([search_range_x/4.+template_size/2, search_range_y/4.+template_size/2]) x_centers = np.arange(matcher.T_c0c1[0]+edge_pad[0], matcher.T_c0c1[1]-edge_pad[0], options.coarse_skip) if x_centers[-1] < matcher.T_c0c1[1]: x_centers = np.append(x_centers, int((x_centers[-1]+matcher.T_c0c1[1])/2.)) y_centers = np.arange(matcher.T_r0r1[0]+edge_pad[1], matcher.T_r0r1[1]-edge_pad[1], options.coarse_skip) if y_centers[-1] < matcher.T_r0r1[1]: y_centers = np.append(y_centers, int((y_centers[-1]+matcher.T_r0r1[1])/2.)) [x_centers_grid, y_centers_grid] = np.meshgrid(x_centers, y_centers) xy_centers0 = np.c_[x_centers_grid.ravel(), y_centers_grid.ravel()] # Find the offset that matches the origins of the two images geotransform = matcher.search_geotransform origin_diff = np.c_[matcher.UL_T - matcher.UL_S].transpose() origin_diff[0][0] = np.floor(origin_diff[0][0]/np.abs(geotransform[1])) origin_diff[0][1] = np.floor(origin_diff[0][1]/np.abs(geotransform[5])) print("Running initial search: " + str(datetime.datetime.now())) # Find best correlation matches in the search image for each center in the template image # ??? dxy0 = np.dot(np.c_[np.ones_like(xy_centers0[:,0])], origin_diff*[1, -1]) dxy_score = np.c_[dxy0[:,0]-search_range_x/2., dxy0[:,0]+search_range_x/2, dxy0[:,1]-search_range_y/2, dxy0[:,1]+search_range_y/2] xy, dxy, corr_scores, xy_bad_mask = search_new_pts(xy_centers0, dxy_score, template_size, matcher, min_template_sigma=options.sigma_t_min, mask=in_mask) if options.epipolar_fltr: # Throw out disparity results which are too far from the epipolar line # Fit an epipolar line to the detected offsets ep_vec, dxy_ctr = est_epipolar_vec(dxy, corr_scores, corr_score_tolerance, ep_vec_initial, F_ep_pts_to_use) # Compare the offsets to the fit line tolerance = 32 good_indices, ep_dist = test_epipolar(dxy_ctr, ep_vec, dxy, tolerance) # Get the 90th percentile distance from the epipolar line ep_f90 = np.percentile(ep_dist[corr_scores.ravel() > corr_score_tolerance], 90) # Use the 90th percentile dist as the tolerance unless it falls out of bounds ep_tol = np.minimum(ep_tol_max, np.maximum(ep_tol_min, ep_f90)) # If any points were marked as bad in the first epipolar test... if (ep_vec_initial is not None) and np.any(~good_indices): # Run the fit again with just good points and recompute the epipolar tolerance. ep_vec, dxy_ctr = est_epipolar_vec(dxy [good_indices,:], corr_scores[good_indices,:], corr_score_tolerance, None, F_ep_pts_to_use) ep_f90 = np.percentile(ep_dist[corr_scores.ravel() > corr_score_tolerance], 90) ep_tol = np.minimum(ep_tol_max,np.maximum(ep_tol_min, ep_f90)) good_indices, ep_dist = test_epipolar(dxy_ctr, ep_vec, dxy, ep_tol) print(" --- ep vec estimated at(%f,%f), tolerance=%f, ep_dist_f90=%f" % (ep_vec[0], ep_vec[1], ep_tol, ep_f90)) else: # Create boolean array with True for all values in dx, don't filter the points. good_indices = (dxy != np.nan)[:,0] if len(good_indices) == 0: print('No correlation matches detected!') return -1 # Make sparse matrices for storing dx and dy values, store initial values im_shape = [matcher.Ny, matcher.Nx] dx_mat = coo_matrix((dxy[good_indices,0], (xy[good_indices,1], xy[good_indices,0])), shape=im_shape).tocsr() dy_mat = coo_matrix((dxy[good_indices,1], (xy[good_indices,1], xy[good_indices,0])), shape=im_shape).tocsr() score_mat = coo_matrix(((corr_scores[good_indices]).ravel(), (xy[good_indices,1], xy[good_indices,0])), shape=im_shape).tocsr() bad_mask_mat = coo_matrix((np.ones_like(xy_bad_mask[:,0]), (xy_bad_mask[:,1], xy_bad_mask[:,0])), shape=im_shape).tocsr() xy_list = xy[good_indices,:] # Points tested so far are the nozero members of score_mat all_pts = np.c_[score_mat.nonzero()]; all_pts = all_pts[:,[1,0]]; # ??? # Perform triangulation of points, then get min/max dx and dy differences with the neighboring points. tri = spatial.Delaunay(all_pts) pt_dict = make_pt_2_neighbors(tri) dxy_score = neighborhood_range(np.arange(0, all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict) indices_to_refine = np.arange(0, xy_list.shape[0] ) # Indices into the vales in the dxy_score variable OFFSET_MIN_X = 0 OFFSET_MAX_X = 1 OFFSET_MIN_Y = 2 OFFSET_MAX_Y = 3 # Define the pattern of pixel centers to refine at each step. Duplicates will be deleted. refine_x = np.array([-1., 0., 1., -1., 1., -1., 0., 1.]) refine_y = np.array([-1., -1., -1., 0., 0., 1., 1., 1.]); # Iterate through our disparity search coarseness levels, low to high res. recalc_neighborhood_range = False for delta_x in skip_vals: print("----------refining to pixel skip length %d---------" % delta_x) print("Refining start time: " + str(datetime.datetime.now())) if len(indices_to_refine)==0: print(" No refinement points for scale: %d" % delta_x) recalc_neighborhood_range=True break # Add neighbors of the last set of points to the list #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) new_x = (np.tile(all_pts[indices_to_refine, 0], [8,1]).transpose()+refine_x*delta_x).ravel() new_y = (np.tile(all_pts[indices_to_refine, 1], [8,1]).transpose()+refine_y*delta_x).ravel() # The search range for the new points is set based on the # min and max of the dxy_scores of the refine points new_dxy_score = np.array([np.tile(dxy_score[:,OFFSET_MIN_X], [8,1]).transpose().ravel(), np.tile(dxy_score[:,OFFSET_MAX_X], [8,1]).transpose().ravel(), np.tile(dxy_score[:,OFFSET_MIN_Y], [8,1]).transpose().ravel(), np.tile(dxy_score[:,OFFSET_MAX_Y], [8,1]).transpose().ravel()]).transpose() # define min and max pt indices num_image_rows = im_shape[0] num_image_cols = im_shape[1] x_lims = np.array([1, num_image_cols-1]) y_lims = np.array([1, num_image_rows-1]) # clamp range of x and y to these indices new_x[new_x > x_lims[1]] = x_lims[1] new_x[new_x < 0 ] = x_lims[0] new_y[new_y > y_lims[1]] = y_lims[1] new_y[new_y < 0 ] = y_lims[0] # ?? not_dups = np.squeeze(np.array(score_mat[new_y, new_x]==0)) new_xy = np.c_[new_x[not_dups], new_y[not_dups]] uRows, new_xy = unique_rows(new_xy) new_dxy_score = new_dxy_score[uRows,:] N_search = new_xy.shape[0] # Search for the best image correlation matches around our new points new_xy, new_dxy, new_corr_scores, new_xy_bad = search_new_pts(new_xy, new_dxy_score, template_size, matcher, min_template_sigma=options.sigma_t_min, mask=in_mask) if len(new_xy)==0: print(" no new points found") recalc_neighborhood_range = True break # Either epipolar filter the points or call them all good. if options.epipolar_fltr: good_indices, ep_dist = test_epipolar(dxy_ctr, ep_vec, new_dxy, ep_tol) print(" searched %d points, found %d good matches" % (N_search, np.sum(good_indices) )) else: good_indices = (new_dxy != np.nan)[:,0] # TODO: Make a function out of this code? # Add the new points to the sparse matrix of tested points dx_mat = dx_mat+coo_matrix((new_dxy[good_indices,0], [new_xy[good_indices,1], new_xy[good_indices,0]]), im_shape).tocsr() dy_mat = dy_mat+coo_matrix((new_dxy[good_indices,1], [new_xy[good_indices,1], new_xy[good_indices,0]]), im_shape).tocsr() score_mat = score_mat+coo_matrix(((new_corr_scores[good_indices]).ravel(), [new_xy[good_indices,1], new_xy[good_indices,0]]), im_shape).tocsr() 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() bad_indices = ~good_indices bad_mask_mat = bad_mask_mat + coo_matrix((2*np.ones_like(new_xy[bad_indices,1]), (new_xy[bad_indices,1], new_xy[bad_indices,0])), shape=im_shape).tocsr() #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() all_pts = np.c_[score_mat.nonzero()]; all_pts = all_pts[:,[1,0]]; # Extract the dx and dy values, re-estimate the ep vector dxy = np.array(np.c_[dx_mat[all_pts[:,1], all_pts[:,0]].transpose(), dy_mat[all_pts[:,1], all_pts[:,0]].transpose()]) C = np.array(score_mat[all_pts[:,1], all_pts[:,0]].transpose()) if options.epipolar_fltr and ep_vec_initial is not None: ep_vec, dxy_ctr = est_epipolar_vec(dxy, C, corr_score_tolerance) # Triangulate all the good points so far tri = spatial.Delaunay(all_pts) pt_dict = make_pt_2_neighbors(tri) # Zero out points for which delta(disparity)/delta(dist) is too large # - ie, delete points with too rapid rate of disparity change. dxy_score, min_dxy_slope = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict, calc_min_slope=True) bad_indices = np.max(min_dxy_slope, axis=1) > dxy_slope_tol if options.Debug: print("---deleting %d points that failed the d(disparity)/d(dist) test" % np.sum(bad_indices)) if (bad_indices is not None) and np.any(bad_indices): # ??? score_mat = score_mat.tolil() score_mat[all_pts[bad_indices,1], all_pts[bad_indices,0]] = 0 score_mat = score_mat.tocsr() bad_mask_mat = bad_mask_mat + coo_matrix((4*np.ones_like(all_pts[bad_indices,1]), (all_pts[bad_indices,1], all_pts[bad_indices,0])), shape=im_shape).tocsr() all_pts = np.c_[score_mat.nonzero()] all_pts = all_pts[:,[1,0]]; tri = spatial.Delaunay(all_pts) pt_dict = make_pt_2_neighbors(tri) dxy_score = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict) # Don't refine if we're on the last value of the refinement list if delta_x == skip_vals[-1]: continue test_pts = np.arange(0, all_pts.shape[0]) # Test the new points and their neighbors for convergence to_refine = np.logical_or(((dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X]) > options.refine_tol), ((dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y]) > options.refine_tol)) indices_to_refine = test_pts [to_refine] dxy_score = dxy_score[to_refine,:] # N.B. we can often end up refining more points than we searched on the # last round, because points from previous rounds can get marked for refinement print(" found %d points to refine" % len(indices_to_refine)) # END LOOP through pixel skip sizes if recalc_neighborhood_range: all_pts = np.c_[score_mat.nonzero()]; all_pts = all_pts[:,[1,0]]; dxy_score = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict) # Delete the 1% of matches with the greatest disparity range R_dx = dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X] R_dy = dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y] R_dx_mat = coo_matrix((R_dx, [all_pts[:,1], all_pts[:,0]]), im_shape).tocsr() R_dy_mat = coo_matrix((R_dy, [all_pts[:,1], all_pts[:,0]]), im_shape).tocsr() R_dxy_score = neighborhood_range(range(all_pts.shape[0]), R_dx_mat, R_dy_mat, tri, pt_dict) P99 = (np.percentile(R_dxy_score[:,OFFSET_MIN_X], 99), np.percentile(R_dxy_score[:,OFFSET_MIN_Y], 99)) R_max = np.maximum(P99, options.R_lim_min) R_max = np.minimum(R_max, options.R_limax_disp_range) bad_xy = all_pts[np.logical_or((R_dxy_score[:,OFFSET_MIN_X] > R_max[0]), (R_dxy_score[:,OFFSET_MIN_Y] > R_max[1])),:] 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() if options.Debug: print("rejecting %d detected outliers using the minimum-disparity-difference test with R_max = %f, %f" % (bad_xy.shape[0], R_max[0], R_max[1])) # Delete the bad value, convert dx dy, and C to lil matrices score_mat = score_mat.tolil() dx_mat = dx_mat.tolil() dy_mat = dy_mat.tolil() for bad in bad_xy: dx_mat [bad[1], bad[0]] = 0 dy_mat [bad[1], bad[0]] = 0 score_mat[bad[1], bad[0]] = 0 score_mat = score_mat.tocsr() dx_mat = dx_mat.tocsr() dy_mat = dy_mat.tocsr() all_pts = np.c_[score_mat.nonzero()]; all_pts = all_pts[:,[1,0]]; if len(all_pts) == 0: print('No points remaining after outlier rejection!') return -1 # Triangulate all the good points so far tri = spatial.Delaunay(all_pts) pt_dict = make_pt_2_neighbors(tri) # Check the score for output, ignore differences for points separated by more than 2*coarse skip dxy_score = neighborhood_range(range(all_pts.shape[0]), dx_mat, dy_mat, tri, pt_dict, max_dist= 2.*options.coarse_skip) R_dx = dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X] R_dy = dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y] print("--------output stats------") for pct in (99, 95, 90, 84): P = (pct, np.percentile(R_dx, pct), np.percentile(R_dy, pct)) print("%dth percetiles (rx,ry) = (%5.2f %5.2f)" % P) dx = dx_mat [all_pts[:,1], all_pts[:,0]].transpose() dy = dy_mat [all_pts[:,1], all_pts[:,0]].transpose() C = score_mat[all_pts[:,1], all_pts[:,0]].transpose() # transform the pixel centers to map coordinates geotransform = matcher.search_geotransform driver = matcher.T_ds.GetDriver() projection = matcher.T_ds.GetProjection() xy = np.c_[geotransform[0]+all_pts[:,0]*geotransform[1]+all_pts[:,1]*geotransform[2], geotransform[3]+all_pts[:,0]*geotransform[4]+all_pts[:,1]*geotransform[5]] out = np.c_[xy, dx , dy , C, dxy_score[:,OFFSET_MAX_X]-dxy_score[:,OFFSET_MIN_X]+options.output_pad, dxy_score[:,OFFSET_MAX_Y]-dxy_score[:,OFFSET_MIN_Y]+options.output_pad] # spit out the good and bad masks good_xy = np.c_[score_mat.nonzero()][:,[1, 0]] good_xy = np.c_[geotransform[0]+good_xy[:,0]*geotransform[1]+good_xy[:,1]*geotransform[2], geotransform[3]+good_xy[:,0]*geotransform[4]+good_xy[:,1]*geotransform[5]] bad_xy = np.c_[bad_mask_mat.nonzero()][:,[1, 0]] if np.min(bad_xy.shape) > 0: bad_flag = bad_mask_mat[bad_xy[:,1], bad_xy[:,0]] bad_xy = np.c_[geotransform[0]+bad_xy[:,0]*geotransform[1]+bad_xy[:,1]*geotransform[2], geotransform[3]+bad_xy[:,0]*geotransform[4]+bad_xy[:,1]*geotransform[5]] else: bad_flag = None bad_xy = None # cleanup memory before gridding starts pt_dict = None tri = None dx = None dy = None dx_mat = None dy_mat = None R_dx_mat = None R_dy_mat = None xy = None matcher = None C = None indices_to_refine = None if options.Debug: print("--- Debug enabled-----") print(" writing csv file: %s" % output_prefix+'.csv') outfile=open(output_prefix+'.csv','w') outfile.write('%x, y, dx, dy, C, R_dx, R_dy\n') for line in out: 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])) outfile.close print(" writing bad points to file: %s" % output_prefix+'_bad_pts.csv') print(" bad matches are flagged:") print(" 1: failed signal strength test") print(" 2: failed epipolar test") print(" 4: failed d(disparity)/d(dist) test") print(" 8: failed the total-delta-disparity test") print("-----") outfile = open(output_prefix+'_bad_pts.csv', 'w') outfile.write('%x, y, flag\n') if bad_flag is not None: out_bad = np.c_[bad_xy[:,0], bad_xy[:,1], bad_flag.transpose()] for line in out_bad: outfile.write("%7.2f, %7.2f, %3d\n" % tuple(x for x in line.tolist()[0])) outfile.close out_bad = None bad_flag = None # END IF (if options.Debug) if options.output_scale > 0.: out = out/options.output_scale # scale x, y, and C back up by output_scale for col in [0, 1, 4]: out[:,col] = out[:,col]*options.output_scale delta_x = options.output_scale*np.abs(geotransform[1]) x0 = geotransform[0] y0 = geotransform[3] x0 = delta_x*(np.ceil(x0/delta_x)) y0 = delta_x*(np.ceil(y0/delta_x)) Gdx = geotransform[1]*options.output_scale Gdy = geotransform[5]*options.output_scale GT1 = np.array(geotransform) GT1[0] = x0; GT1[3] = y0; GT1[1] = Gdx GT1[5] = Gdy nx1 = int(im_shape[1]/options.output_scale) ny1 = int(im_shape[0]/options.output_scale) xg = (np.arange(0, nx1)+0.5)*Gdx+x0 yg = (np.arange(0, ny1)+0.5)*Gdy+y0 disp_file = output_prefix + '-D_sub.tif' spread_file = output_prefix + '-D_sub_spread.tif' dispDs = driver.Create(disp_file, nx1, ny1, 3, gdalconst.GDT_Int32) spreadDs = driver.Create(spread_file, nx1, ny1, 3, gdalconst.GDT_Int32) # interpolate the scaled dx and dy values OutBlocksize = 1024 c0_out = np.arange(0, xg.shape[0], OutBlocksize) r0_out = np.arange(0, yg.shape[0], OutBlocksize) grid_pad = options.fill_dist*2 for c0 in c0_out: for r0 in r0_out: if options.Debug: print(" gridding output for col %d out of %d, row %d out of %d" % (int(c0/OutBlocksize)+1, int(c0_out[-1]/OutBlocksize)+1, int(r0/OutBlocksize)+1, int(r0_out[-1]/OutBlocksize)+1)) cols = np.arange(c0, np.minimum(c0+OutBlocksize, len(xg))) rows = np.arange(r0, np.minimum(r0+OutBlocksize, len(yg))) if (len(rows)==0) | (len(cols)==0): continue [xg_sub, yg_sub] = np.meshgrid(xg[cols], yg[rows]) XR_out = np.array([np.amin(xg[cols])-grid_pad, np.amax(xg[cols])+grid_pad]) YR_out = np.array([np.amin(yg[rows])-grid_pad, np.amax(yg[rows])+grid_pad]) cr_out = [cols[0], rows[0]] # make a 1-d array to populate with the truth values we'll use to select data points ii = np.zeros(out.shape[0]).astype('bool') ii[:] = ((out[:,0] > XR_out[0]) & (out[:,0] < XR_out[1]) & (out[:,1] > YR_out[0]) & (out[:,1] < YR_out[1])).ravel() if np.sum(ii) < 4: continue if options.Debug: print(" ...based on %d points" % np.sum(ii)) if (np.amax(out[ii,0])-np.amin(out[ii,0]) > 0) and (np.amax(out[ii,1])-np.amin(out[ii,1]) > 0 ) : grid_disp(xg_sub, yg_sub, out[ii,0:2], out[ii,2], out[ii,3], out[ii,5], out[ii,6], options.fill_dist, int(search_range_x), dispDs, spreadDs, options.output_scale, cr_out) for Ds in (dispDs, spreadDs): Ds.SetGeoTransform(tuple(GT1)) Ds.SetProjection(projection) spreadDs = None dispDs = None # END IF (if options.output_scale > 0.) print("End: " + str(datetime.datetime.now())) if __name__=="__main__": main() ================================================ FILE: src/asp/Tools/stereo ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ from __future__ import print_function import sys, argparse, subprocess, re, os import os.path as P # The path to the ASP python files basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) from asp_stereo_utils import * # must be after the path is altered above import asp_system_utils, asp_cmd_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] if __name__ == '__main__': usage = '''stereo [options] <images> [<cameras>] <output_prefix> [DEM] Extensions are automatically added to the output files. Camera model arguments may be optional for some stereo session types (e.g. isis). Stereo parameters should be set in the stereo.default file.\n''' + asp_system_utils.get_asp_version() p = argparse.ArgumentParser(usage=usage) p.add_argument('-t', '--session-type', dest='session', 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.') p.add_argument('-s', '--stereo-file', dest='stereo_file', default='./stereo.default', help='Explicitly specify the stereo.default file to use. Default: ./stereo.default.') p.add_argument('--corr-seed-mode', dest='seed_mode', default=None, help='Correlation seed strategy. See stereo_corr for options.', type=int) p.add_argument('-e', '--entry-point', dest='entry_point', default=0, help='Pipeline entry point (an integer from 0-5)', type=int) p.add_argument('--stop-point', dest='stop_point', default=6, help='Stereo Pipeline stop point (an integer from 1-6).', type=int) p.add_argument('--sparse-disp-options', dest='sparse_disp_options', help='Options to pass directly to sparse_disp.') p.add_argument('--threads', dest='threads', default=0, type=int, help='Set the number of threads to use. 0 means use as many threads as there are cores.') p.add_argument('--no-bigtiff', dest='no_bigtiff', default=False, action='store_true', help='Tell GDAL to not create bigtiffs.') p.add_argument('--tif-compress', dest='tif_compress', default = 'LZW', help='TIFF compression method. Options: None, LZW, Deflate, Packbits. Default: LZW.') p.add_argument('-v', '--version', dest='version', default=False, action='store_true', help='Display the version of software.') # This must not be used in production. Will not work on the mac. A temporary undocumented # thing. p.add_argument('--check-mem-usage', dest='mem_usage', default=False, action='store_true', help='Check stereo_corr run time and memory usage.') # Debug options p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true', help=argparse.SUPPRESS) p.add_argument('--verbose', dest='verbose', default=False, action='store_true', help=argparse.SUPPRESS) global opt (opt, args) = p.parse_known_args() args=asp_cmd_utils.unescape_vals(args) # to do: somehow, merge into the above call if opt.version: asp_system_utils.print_version_and_exit() if not args and not opt.version: p.print_help() asp_system_utils.raise_error('Missing input files', code=2) if opt.threads == 0: opt.threads = asp_system_utils.get_num_cpus() args.extend(['--threads', str(opt.threads)]) # If corr-seed-mode was not specified, read it from the file if opt.seed_mode is None: opt.seed_mode = parse_corr_seed_mode(opt.stereo_file) # If not set in the file either, use 1. if opt.seed_mode is None: opt.seed_mode = 1 # Pass it to the subprocesses args.extend(['--corr-seed-mode', str(opt.seed_mode)]) # Pass to sub-processes other stereo options. We wanted these # set in this Python script so that they show up in the help message. if opt.session is not None: args.extend(['--session-type', opt.session]) if opt.stereo_file is not None and os.path.exists(opt.stereo_file): args.extend(['--stereo-file', opt.stereo_file]) if opt.no_bigtiff: args.append('--no-bigtiff') if opt.tif_compress is not None and opt.tif_compress != "LZW": # If it is LZW then don't pass it, as that is the default args.extend(['--tif-compress', opt.tif_compress]) # Run stereo_parse with these options, to get the values of some # internal fields. sep = "," settings = run_and_parse_output("stereo_parse", args, sep, opt.verbose) alg = stereo_alg_to_num(settings['stereo_algorithm'][0]) using_tiles = (alg > VW_CORRELATION_BM or \ settings['alignment_method'][0] == 'local_epipolar') if using_tiles: raise Exception("Alignment method 'local_epipolar' and/or other algorithms " + "except ASP_BM can be used only with parallel_stereo.") try: # These can be stray options if pasting the stereo command # from a log file where these particular operations # happened, and they will result in the overall stereo # command misbehaving. They are needed only at a certain stage. asp_cmd_utils.wipe_option(args, '--compute-low-res-disparity-only', 0) asp_cmd_utils.wipe_option(args, '--compute-point-cloud-center-only', 0) # Invoke itself for multiview if appropriate num_pairs = int(settings['num_stereo_pairs'][0]) if num_pairs > 1 and opt.entry_point < Step.tri: extra_args = [] run_multiview(__file__, args, extra_args, opt.entry_point, opt.stop_point, opt.verbose, settings) sys.exit(0) # Pre-processing step = Step.pprc if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() stereo_run('stereo_pprc', args, opt, msg='%d: Preprocessing' % step) # Correlation step = Step.corr if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() if (opt.seed_mode == 0): # No low resolution seed, go straight to full resolution correlation stereo_run('stereo_corr', args, opt, msg='%d: Correlation' % step) else: # Do low-res correlation, this happens just once. calc_lowres_disp(args, opt, sep) # Run full-resolution stereo correlation args.extend(['--skip-low-res-disparity-comp']) stereo_run('stereo_corr', args, opt, msg='%d: Correlation' % step) # Low-res disparity is done, so wipe that option asp_cmd_utils.wipe_option(args, '--skip-low-res-disparity-comp', 0) # Note that blending is not done, as with stereo the only # supported algorithm is block-matching, which does not use # separately stored tiles which may need blending. # Refinement step = Step.rfne if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() stereo_run('stereo_rfne', args, opt, msg='%d: Refinement' % step) # Filtering step = Step.fltr if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() stereo_run('stereo_fltr', args, opt, msg='%d: Filtering' % step) # Triangulation step = Step.tri if (opt.entry_point <= step): if (opt.stop_point <= step): sys.exit() if int(settings['correlator_mode'][0]) != 0 and \ '--num-matches-from-disparity' not in args and \ '--num-matches-from-disp-triplets' not in args: print("Skipping triangulation with --correlator-mode.") sys.exit() stereo_run('stereo_tri', args, opt, msg='%d: Triangulation' % step) except Exception as e: asp_system_utils.raise_error(e) ================================================ FILE: src/asp/Tools/stereo.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo.cc #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Camera/CameraErrorPropagation.h> #include <asp/Core/FileUtils.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/Bathymetry.h> #include <asp/Core/AspStringUtils.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/AspLog.h> #include <asp/Core/StereoSettingsParse.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/StereoTiling.h> #include <asp/Core/ImageUtils.h> #include <asp/Tools/stereo.h> #include <asp/asp_config.h> // defines ASP_HAVE_PKG_ISIS // Support for ISIS image files #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 #include <asp/IsisIO/DiskImageResourceIsis.h> #endif #include <vw/Cartography/PointImageManipulation.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Stereo/StereoView.h> #include <vw/Stereo/CorrelationView.h> #include <vw/Stereo/CostFunctions.h> #include <vw/Stereo/DisparityMap.h> #include <vw/FileIO/MatrixIO.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/FileTypes.h> #include <vw/FileIO/FileUtils.h> #include <vw/InterestPoint/MatcherIO.h> using namespace vw; using namespace vw::cartography; namespace asp { // Transform the crop window to be in reference to L.tif. When --left-image-crop-win // is set, different logic is used, which may need to be integrated here. BBox2i transformed_crop_win(ASPGlobalOptions const& opt) { bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); if (crop_left) vw::vw_throw(ArgumentErr() << "Function transformed_crop_win() " << "should not be called with --left-image-crop-win.\n"); BBox2i b; boost::shared_ptr<vw::DiskImageResource> rsrc = vw::DiskImageResourcePtr(opt.in_file1); DiskImageView<PixelGray<float>> left_image(rsrc); BBox2i full_box = bounding_box(left_image); if (fs::exists(opt.out_prefix+"-L.tif")) { DiskImageView<PixelGray<float>> L_img(opt.out_prefix+"-L.tif"); b = bounding_box(L_img); } else { b = full_box; // To not have an empty box } return b; } // Parse data needed for error propagation void setup_error_propagation(ASPGlobalOptions const& opt) { // A bugfix for the propagated errors not being saved with enough digits if (stereo_settings().point_cloud_rounding_error > 0) { vw_out(WarningMessage) << "Option --point-cloud-rounding-error is set to " << stereo_settings().point_cloud_rounding_error << " meters. If too coarse, " "it may create artifacts in the propagated horizontal and vertical errors.\n"; } else { stereo_settings().point_cloud_rounding_error = 1.0e-8; vw_out() << "Round triangulated points to " << stereo_settings().point_cloud_rounding_error << " meters. " << "(Option: --point-cloud-rounding-error.) " << "This is much finer rounding than usual, motivated by the " << "fact that the propagated errors vary slowly and will be " << "saved with step artifacts otherwise.\n"; } vw::Vector2 & v = asp::stereo_settings().horizontal_stddev; // alias, will modify bool message_printed = false; // will print the message only once if (v[0] == 0 && v[1] == 0) { // This will not reload the cameras boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2; opt.session->camera_models(camera_model1, camera_model2); v[0] = asp::horizontalStDevFromCamera(camera_model1, message_printed); v[1] = asp::horizontalStDevFromCamera(camera_model2, message_printed); } asp::horizontalStdDevCheck(v, opt.session->name()); } // Save some info that will be useful for peeking at a run void saveRunInfo(ASPGlobalOptions const& opt, std::vector<std::string> const& images, std::vector<std::string> const& cameras, std::string const& input_dem) { std::string info_file = opt.out_prefix + "-info.txt"; std::ofstream ostr(info_file.c_str()); if (!ostr.good()) vw_throw(ArgumentErr() << "Failed to open: " << info_file << "\n"); // Print the images ostr << "images: "; for (int i = 0; i < (int)images.size(); i++) ostr << images[i] << " "; ostr << "\n"; // Print the cameras ostr << "cameras: "; for (int i = 0; i < (int)cameras.size(); i++) ostr << cameras[i] << " "; ostr << "\n"; // Print the DEM ostr << "input_dem: " << input_dem << "\n"; // Print the output prefix ostr << "output_prefix: " << opt.out_prefix << "\n"; // Print the alignment method ostr << "alignment_method: " << stereo_settings().alignment_method << "\n"; // Print the stereo session ostr << "stereo_session: " << opt.stereo_session << "\n"; // Print proj-win if set, otherwise print left/right crop windows auto p = stereo_settings().proj_win; bool has_proj_win = (p != BBox2(0, 0, 0, 0)); if (has_proj_win) { // For proj-win, interpret as: minx miny maxx maxy (not width/height) ostr << "proj_win: " << p.min().x() << " " << p.min().y() << " " << p.max().x() << " " << p.max().y() << "\n"; } else { // Print left-image-crop-win auto l = stereo_settings().left_image_crop_win; ostr << "left_image_crop_win: " << l.min().x() << " " << l.min().y() << " " << l.width() << " " << l.height() << "\n"; // Print right-image-crop-win auto r = stereo_settings().right_image_crop_win; ostr << "right_image_crop_win: " << r.min().x() << " " << r.min().y() << " " << r.width() << " " << r.height() << "\n"; } } // See if user's request to skip image normalization can be // satisfied. This option is a speedup switch which is only meant // to work with with mapprojected images. It is also not documented. bool skip_image_normalization(ASPGlobalOptions const& opt) { if (!stereo_settings().skip_image_normalization) return false; bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); // Respect user's choice for skipping the normalization of the input // images, if feasible. bool is_good = (!crop_left && !crop_right && stereo_settings().alignment_method == "none" && stereo_settings().cost_mode == 2 && !asp::doBathy(asp::stereo_settings()) && vw::has_tif_or_ntf_extension(opt.in_file1) && vw::has_tif_or_ntf_extension(opt.in_file2)); if (!is_good) vw_throw(ArgumentErr() << "Cannot skip image normalization unless there is no alignment, " << "no use of --left-image-crop-win and --right-image-crop-win, " << "no bathymetry, --cost-mode is set to 2, and the input images have " << ".tif or .ntf extension."); return is_good; } // End function skip_image_normalization // Convert, for example, 'asp_mgm' to '2'. For ASP algorithms we // use the numbers 0 (BM), 1 (SGM), 2 (MGM), 3 (Final MGM). For // external algorithms will have to examine closer the algorithm // string. This function has a Python analog in parallel_stereo. vw::stereo::CorrelationAlgorithm stereo_alg_to_num(std::string alg) { // Make it lowercase first boost::to_lower(alg); // Sanity check if (alg == "") vw_throw(ArgumentErr() << "No stereo algorithm was specified.\n"); if (alg.rfind("0", 0) == 0 || alg.rfind("asp_bm", 0) == 0) return vw::stereo::VW_CORRELATION_BM; if (alg.rfind("1", 0) == 0 || alg.rfind("asp_sgm", 0) == 0) return vw::stereo::VW_CORRELATION_SGM; if (alg.rfind("2", 0) == 0 || alg.rfind("asp_mgm", 0) == 0) return vw::stereo::VW_CORRELATION_MGM; if (alg.rfind("3", 0) == 0 || alg.rfind("asp_final_mgm", 0) == 0) return vw::stereo::VW_CORRELATION_FINAL_MGM; // Sanity check. Any numerical values except 0, 1, 2, 3 are not accepted. int num = atof(alg.c_str()); if (num < 0 || num > 3) vw_throw(ArgumentErr() << "Unknown algorithm: " << alg << ".\n"); // An external stereo algorithm return vw::stereo::VW_CORRELATION_OTHER; } // Find the median angle in degrees at which rays emanating from // matching points meet void estimate_convergence_angle(ASPGlobalOptions const& opt) { if (stereo_settings().correlator_mode) return; // No camera can be assumed, hence no convergence angle. // When having matches between L and R, need to do things a bit differently. bool have_aligned_matches = (stereo_settings().alignment_method == "none" || stereo_settings().alignment_method == "epipolar"); bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); std::string match_filename; bool matches_as_txt = stereo_settings().matches_as_txt; if (have_aligned_matches) match_filename = vw::ip::match_filename(opt.out_prefix, "L.tif", "R.tif", matches_as_txt); else match_filename = asp::stereoMatchFile(opt.session->left_cropped_image(crop_left), opt.session->right_cropped_image(crop_right), opt.out_prefix, matches_as_txt); // The interest points must exist by now. But be tolerant of failure, as // this functionality is not critical. if (!fs::exists(match_filename)) { vw::vw_out(vw::WarningMessage) << "Cannot estimate the convergence angle, as cannot find the match file: " << match_filename << ".\n"; return; } std::vector<ip::InterestPoint> left_ip, right_ip; ip::read_match_file(match_filename, left_ip, right_ip, stereo_settings().matches_as_txt); if (have_aligned_matches) { // Create the transforms ahead of time for clarity. When these are created // as part of unalign_ip() arguments, the creation order seems in reverse. auto left_tx = opt.session->tx_left(); auto right_tx = opt.session->tx_right(); // Unalign the interest point matches std::vector<vw::ip::InterestPoint> unaligned_left_ip, unaligned_right_ip; asp::unalign_ip(left_tx, right_tx, left_ip, right_ip, unaligned_left_ip, unaligned_right_ip); left_ip = unaligned_left_ip; right_ip = unaligned_right_ip; } std::vector<double> sorted_angles; boost::shared_ptr<camera::CameraModel> left_cam, right_cam; opt.session->camera_models(left_cam, right_cam); asp::convergence_angles(left_cam.get(), right_cam.get(), left_ip, right_ip, sorted_angles); if (sorted_angles.empty()) { vw_out(vw::WarningMessage) << "Could not compute the stereo convergence angle.\n"; return; } int len = sorted_angles.size(); vw_out() << "Convergence angle percentiles (in degrees) based on interest point matches:\n"; vw_out() << "\t" << "25% " << sorted_angles[0.25*len] << ", " << "50% " << sorted_angles[0.50*len] << ", " << "75% " << sorted_angles[0.75*len] << ".\n"; if (sorted_angles[0.50*len] < 5.0) vw_out(vw::WarningMessage) << "The stereo convergence angle is: " << sorted_angles[0.50*len] << " degrees. " << "This is quite low and may result in an empty or unreliable point cloud. " << "Reduce --min-triangulation-angle to triangulate with very small angles.\n"; } // Set up options for stereo. This will be used in a couple of places. void configStereoOpts(ASPGlobalOptions& opt, po::options_description const& additional_options, po::options_description& general_options, po::options_description& all_general_options, po::options_description& positional_options, po::positional_options_description& positional_desc) { // Add options whose values are stored in ASPGlobalOptions rather than in stereo_settings() po::options_description general_options_sub(""); addAspGlobalOptions(general_options_sub, opt); // Populate general_options (specific to the current tool) general_options.add(general_options_sub); general_options.add(additional_options); general_options.add(vw::GdalWriteOptionsDescription(opt)); // Populate all_general_options (parsing fallback) all_general_options.add(general_options_sub); all_general_options.add(generate_config_file_options(opt)); // Populate positional options positional_options.add_options() ("input-files", po::value<std::vector<std::string>>(), "Input files"); positional_desc.add("input-files", -1); } // Parse the command line arguments. Extract in a vector all the options and // their values, so everything apart from standalone files not associated with // options. This approach does not get confused by a file showing up both as a // value to an option and later as a standalone file. This is needed for later // reconstructing the command line with subsets of the input files, such when as // going from a multiview command to multiple pairwise commands. void parseStereoOptsVals(int argc, char *argv[], po::options_description const& additional_options, std::vector<std::string> & opts_and_vals) { // Wipe the output opts_and_vals.clear(); // We set up the option descriptions locally just to aid the parser // in distinguishing flags from positional files. po::options_description general_options(""); po::options_description all_general_options(""); po::options_description positional_options(""); po::positional_options_description positional_desc; ASPGlobalOptions local_opt; // Configure the descriptions using your helper function configStereoOpts(local_opt, additional_options, general_options, all_general_options, positional_options, positional_desc); // Parse the command line try { po::options_description all_options; all_options.add(all_general_options).add(positional_options); // Pass positional_desc to the parser so it knows which args are positional po::parsed_options parsed = po::command_line_parser(argc, argv) .options(all_options) .positional(positional_desc) .style(po::command_line_style::unix_style) .run(); // Populate opts_and_vals for (auto const& opt: parsed.options) { // Position_key is -1 for named options, >= 0 for positional args (files) if (opt.position_key == -1) { opts_and_vals.insert(opts_and_vals.end(), opt.original_tokens.begin(), opt.original_tokens.end()); } } } catch (po::error const& e) { // The main parser will catch errors, so this one can be silent. } } // Handle the arguments for the multiview case. It creates multiple pairwise // invocations of stereo. void parseMultiviewHelper(int argc, char* argv[], int num_pairs, std::vector<std::string> const& files, std::vector<std::string> const& images, std::vector<std::string> const& cameras, std::string const& output_prefix, std::string const& input_dem, po::options_description const& additional_options, bool verbose, bool exit_early, // Outputs std::string & usage, std::vector<ASPGlobalOptions> & opt_vec) { // Parse all the options and their values, stored in a vector, to be // used later for pairwise stereo. It skips the standalone input files. std::vector<std::string> opts_vals; parseStereoOptsVals(argc, argv, additional_options, opts_vals); // Must signal to the children runs that they are part of a multiview run std::string opt_str = "--part-of-multiview-run"; auto it = find(opts_vals.begin(), opts_vals.end(), opt_str); if (it == opts_vals.end()) opts_vals.push_back(opt_str); // Multiview is very picky about alignment method if (stereo_settings().alignment_method != "none" && stereo_settings().alignment_method != "homography") { std::string new_alignment; if (input_dem == "") new_alignment = "homography"; else new_alignment = "none"; vw_out(WarningMessage) << "For multi-view stereo, only alignment method of 'none' or 'homography' " << "is supported. Changing alignment method from '" << stereo_settings().alignment_method << "' to '" << new_alignment << "'.\n"; stereo_settings().alignment_method = new_alignment; // Set this for future pairwise runs as well std::string align_opt = "--alignment-method"; auto it = std::find(opts_vals.begin(), opts_vals.end(), align_opt); if (it != opts_vals.end() && it + 1 != opts_vals.end()) { // Modify existing alignment *(it+1) = new_alignment; } else { // Set new alignment opts_vals.push_back(align_opt); opts_vals.push_back(new_alignment); } } // Generate the stereo command for each of the pairs made up of the first // image and each subsequent image, with corresponding cameras. opt_vec.resize(num_pairs); std::string prog_name = extract_prog_name(argv[0]); for (int p = 1; p <= num_pairs; p++) { std::vector<std::string> cmd; cmd.push_back(prog_name); // The command line options go first for (int t = 0; t < (int)opts_vals.size(); t++) cmd.push_back(opts_vals[t]); cmd.push_back(images[0]); // left image cmd.push_back(images[p]); // right image if (!cameras.empty()) { // Don't append the camera names if they are the same as the image names if ((images[0] != cameras[0]) && (images[p] != cameras[p])) { cmd.push_back(cameras[0]); // left camera cmd.push_back(cameras[p]); // right camera } } // Need to have a separate output prefix for each pair std::string local_prefix = output_prefix; std::ostringstream os; os << local_prefix << "-pair" << p << "/" << p; local_prefix = os.str(); cmd.push_back(local_prefix); if (!input_dem.empty()) cmd.push_back(input_dem); // Create a local argc and argv for the given stereo pair and parse them. int largc = cmd.size(); std::vector<char*> largv; for (int t = 0; t < largc; t++) largv.push_back((char*)cmd[t].c_str()); bool is_multiview = false; // single image and camera pair std::vector<std::string> local_files; bool override_out_prefix = false; parseStereoHelper(largc, &largv[0], opt_vec[p-1], additional_options, is_multiview, override_out_prefix, local_files, usage, exit_early); if (verbose) { // Needed for stereo_parse int big = 10000; // helps keep things in order in the python script vw_out() << "multiview_command_" << big + p << ","; for (int t = 0; t < largc-1; t++) vw_out() << cmd[t] << ","; if (largc > 0) vw_out() << cmd[largc-1]; vw_out() << "\n"; } } // end loop through pairs // Sanity checks specific to multiview if (stereo_settings().propagate_errors) vw::vw_throw(vw::ArgumentErr() << "Error propagation is not " << "implemented for more than two images.\n"); if (prog_name != "stereo_parse" && prog_name != "stereo_tri" && prog_name != "stereo_gui") vw_throw(ArgumentErr() << "The executable " << prog_name << " is not meant to be used directly with more than two images. Use " << "instead the stereo/parallel_stereo scripts with desired entry points.\n"); // This must happen after StereoSession is initialized if (asp::doBathy(asp::stereo_settings())) vw_throw(ArgumentErr() << "Bathymetry correction does not work with " << "multiview stereo.\n"); return; } /// Parse the list of files and output prefix specified as positional arguments /// on the command line. Hence, parse the arguments that are not passed to options. // The format is: <N image paths> [N camera model paths] <output prefix> [input DEM path] bool parseStereoFiles(bool override_out_prefix, std::vector<std::string> const &filesIn, std::vector<std::string> &imageFiles, std::vector<std::string> &camFiles, std::string &outPrefix, std::string &inputDem) { // Init outputs imageFiles.clear(); camFiles.clear(); outPrefix = ""; inputDem = ""; // Find the input DEM, if any std::vector<std::string> files = filesIn; // Make a local copy to work with std::string input_dem; bool has_georef = false; try{ // Just try to load the last file path as a dem cartography::GeoReference georef; has_georef = read_georeference(georef, files.back()); } catch (...) {} if (has_georef) { // I guess it worked inputDem = files.back(); files.pop_back(); } else { // We tried to load the prefix, there is no dem. inputDem = ""; } if (files.size() < 3) { vw_throw(ArgumentErr() << "Expecting at least three inputs to stereo.\n"); return false; } // Handle --dem option vs positional DEM. The --dem option is easier to use // and will hopefully become the standard. std::string optDem = asp::stereo_settings().dem; if (!inputDem.empty() && !optDem.empty()) { // Both are set, check if they are the same if (!fs::equivalent(fs::path(inputDem), fs::path(optDem))) vw_throw(ArgumentErr() << "Cannot specify both a positional DEM and --dem " << "with different values.\n"); } else if (inputDem.empty() && !optDem.empty()) { // Only --dem is set, use it inputDem = optDem; } // Find the output prefix outPrefix = files.back(); // the dem, if present, was already popped off the back. files.pop_back(); // parallel_stereo must be able to run with a tile output prefix. That program // does not understand all the stereo options, so, it delegates to the // underlying stereo executables to do this switch. Invoke this only // if is_multiview is true, to do the replacement of the prefix just once. // Do not do it later again, when the processing is per each stereo pair. if (asp::stereo_settings().output_prefix_override != "" && override_out_prefix) outPrefix = asp::stereo_settings().output_prefix_override; // An output prefix cannot be an image or a camera if (vw::has_image_extension(outPrefix) || vw::has_cam_extension(outPrefix) || outPrefix == "") vw_throw(ArgumentErr() << "Invalid output prefix: " << outPrefix << ".\n"); // The output prefix must not exist as a file if (fs::exists(outPrefix)) vw_out(WarningMessage) << "It appears that the output prefix exists as a file: " << outPrefix << ". Perhaps this was not intended.\n"; // Now there are N images and possibly N camera paths bool ensure_equal_sizes = false; asp::separate_images_from_cameras(files, imageFiles, camFiles, ensure_equal_sizes); return true; } // If --trans-crop-win is in the input arguments, this is means that we are running // stereo for a tile bool is_tile_run(int argc, char* argv[]) { for (int s = 1; s < argc; s++) { if (std::string(argv[s]) == "--trans-crop-win") return true; } return false; } // Convert the crop windows from (minx, miny, width, height) to (minx, miny, // maxx, maxy) format in any case. Handle proj_win conversion to crop windows for // mapprojected images. void handleCropWins(ASPGlobalOptions const& opt) { // Handle proj_win for mapprojected images BBox2 proj_win = stereo_settings().proj_win; // local copy bool use_proj_win = (proj_win != BBox2(0, 0, 0, 0)); if (use_proj_win) { // Check that input_dem is set if (opt.input_dem.empty()) vw_throw(ArgumentErr() << "The option --proj-win requires mapprojected images and " << "an input DEM.\n"); // Check that left or right crop win are not set if (stereo_settings().left_image_crop_win != BBox2(0, 0, 0, 0) || stereo_settings().right_image_crop_win != BBox2(0, 0, 0, 0)) vw_throw(ArgumentErr() << "Cannot use --proj-win together with " << "--left-image-crop-win or --right-image-crop-win.\n"); // Swap min and max if need be as some tools use (minx, maxy, maxx, miny) if (proj_win.min().y() > proj_win.max().y()) std::swap(proj_win.min().y(), proj_win.max().y()); if (proj_win.min().x() > proj_win.max().x()) std::swap(proj_win.min().x(), proj_win.max().x()); // Read georef from left and right images GeoReference left_georef, right_georef; bool has_left_georef = vw::cartography::read_georeference(left_georef, opt.in_file1); bool has_right_georef = vw::cartography::read_georeference(right_georef, opt.in_file2); if (!has_left_georef || !has_right_georef) vw_throw(ArgumentErr() << "Cannot use --proj-win: input images must be georeferenced.\n"); // Convert projection window to pixel coordinates for left and right images stereo_settings().left_image_crop_win = left_georef.point_to_pixel_bbox(proj_win); stereo_settings().right_image_crop_win = right_georef.point_to_pixel_bbox(proj_win); } else { // There are two crop win boxes, in respect to original left image, named // left_image_crop_win, and in respect to the transformed left image // (L.tif), named trans_crop_win. We use the second if available, otherwise // we transform and use the first. The box trans_crop_win is for internal // use, invoked from parallel_stereo. // Interpret the last two coordinates of the crop win boxes as // width and height rather than max_x and max_y. This is needed because // boost reads them as max_x and max_y but stores them in BBox2 constructor // which expects width and height. BBox2i bl = stereo_settings().left_image_crop_win; BBox2i br = stereo_settings().right_image_crop_win; stereo_settings().left_image_crop_win = BBox2i(bl.min().x(), bl.min().y(), bl.max().x(), bl.max().y()); stereo_settings().right_image_crop_win = BBox2i(br.min().x(), br.min().y(), br.max().x(), br.max().y()); } // This needs handling in either case. See the else block above for more info. BBox2i bt = stereo_settings().trans_crop_win; stereo_settings().trans_crop_win = BBox2i(bt.min().x(), bt.min().y(), bt.max().x(), bt.max().y()); } // If a stereo program is invoked as: // prog <images> <cameras> <output-prefix> [<input_dem>] <other options> // with the number of images n >= 2, create n-1 individual // ASPGlobalOptions entries, corresponding to n-1 stereo pairs between the // first image and each of the subsequent images. // TODO(oalexan1): The logic here is convoluted. parseStereoHelper() is called // multiple times: once initially to extract files, then again for each stereo // pair (1 time for single stereo, or n-1 times for multiview with n images). // This redundant parsing and argv reconstruction should be refactored. void parseStereoArgs(int argc, char* argv[], boost::program_options::options_description const& additional_options, bool verbose, std::string & output_prefix, std::vector<ASPGlobalOptions> & opt_vec, bool exit_early) { // First reset the outputs output_prefix.clear(); opt_vec.clear(); // Extract the images/cameras/output prefix, and perhaps the input DEM std::vector<std::string> files; bool is_multiview = true; ASPGlobalOptions opt; std::string usage; bool override_out_prefix = true; parseStereoHelper(argc, argv, opt, additional_options, is_multiview, override_out_prefix, files, usage, exit_early); // Need this for the GUI, ensure that opt_vec is never empty, even on failures opt_vec.push_back(opt); if (files.size() < 3) vw_throw(ArgumentErr() << "Missing the input files and/or output prefix.\n"); // Add note on the alignment method. If done in parseStereoHelper, it will be // printed twice. if (stereo_settings().correlator_mode) vw_out() << "Running in correlator mode. The alignment method is: " << stereo_settings().alignment_method << ".\n"; // Extract all the positional elements std::vector<std::string> images, cameras; std::string input_dem; if (!parseStereoFiles(override_out_prefix, files, images, cameras, output_prefix, input_dem)) vw_throw(ArgumentErr() << "Missing the input files and/or output prefix.\n"); int num_pairs = (int)images.size() - 1; if (num_pairs <= 0) vw_throw(ArgumentErr() << "Insufficient number of images provided.\n"); // Needed for stereo_parse if (verbose) vw_out() << "num_stereo_pairs," << num_pairs << "\n"; if (num_pairs == 1) { bool is_multiview = false, override_out_prefix = true; parseStereoHelper(argc, argv, opt_vec[0], additional_options, is_multiview, override_out_prefix, files, usage, exit_early); } else { parseMultiviewHelper(argc, argv, num_pairs, files, images, cameras, output_prefix, input_dem, additional_options, verbose, exit_early, usage, opt_vec); // output } // For each stereo command not in a tile, print the run info if (!is_tile_run(argc, argv)) saveRunInfo(opt_vec[0], images, cameras, input_dem); return; } // Parse input command line arguments void parseStereoHelper(int argc, char *argv[], ASPGlobalOptions& opt, boost::program_options::options_description const& additional_options, bool is_multiview, bool override_out_prefix, std::vector<std::string> & input_files, std::string & usage, bool exit_early) { // Configure the stereo options po::options_description general_options(""); po::options_description all_general_options(""); po::options_description positional_options(""); po::positional_options_description positional_desc; configStereoOpts(opt, additional_options, general_options, all_general_options, positional_options, positional_desc); usage = "[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 session types (e.g., isis).\n" " Stereo parameters should be set in the stereo.default file."; bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, all_general_options, positional_options, positional_desc, usage, allow_unregistered, unregistered); // Read the config file try { // The user can specify the positional input from the // stereo.default if they want to. po::options_description cfg_options; cfg_options.add(positional_options); cfg_options.add(generate_config_file_options(opt)); // Append the options from the config file to vm. The Boost documentation // says that an option already stored will not be changed. So, the settings // in the config files will not overwrite the ones already set on the // command line. bool print_warnings = is_multiview; // print warnings just first time po::store(parse_asp_config_file(print_warnings, opt.stereo_default_filename, cfg_options), vm); po::notify(vm); } catch (po::error const& e) { vw::vw_throw(vw::ArgumentErr() << "Error parsing configuration file:\n" << e.what() << "\n"); } // This must happen early boost::to_lower(opt.stereo_session); asp::stereo_settings().validate(); if (stereo_settings().correlator_mode) { // Images are assumed aligned, unless alignment is explicitly requested. if (vm["alignment-method"].defaulted()) stereo_settings().alignment_method = "none"; opt.stereo_session = "rpc"; // since inputs are images this seems simpler if (stereo_settings().propagate_errors) vw::vw_throw(vw::ArgumentErr() << "Cannot propagate errors in correlator mode.\n"); } // Make sure that algorithm 0 is same as asp_bm, etc. boost::to_lower(stereo_settings().stereo_algorithm); if (stereo_settings().stereo_algorithm == "0") stereo_settings().stereo_algorithm = "asp_bm"; else if (stereo_settings().stereo_algorithm == "1") stereo_settings().stereo_algorithm = "asp_sgm"; else if (stereo_settings().stereo_algorithm == "2") stereo_settings().stereo_algorithm = "asp_mgm"; else if (stereo_settings().stereo_algorithm == "3") stereo_settings().stereo_algorithm = "asp_final_mgm"; // Add the options to the usage std::ostringstream os; os << usage << general_options; usage = os.str(); // When called with no arguments, print the help message. if (vm.count("input-files") == 0) vw_throw(ArgumentErr() << "Missing input arguments.\n" << usage << general_options); input_files = vm["input-files"].as<std::vector<std::string>>(); // For multiview, just store the files and return. Must happen after logging // starts, as logging for multiview is done in subdirectories. In multiview // mode, the logic further down will be later called for each pair. if (is_multiview) return; // Re-use the logic in parseStereoFiles, but just for two images/cameras. std::vector<std::string> images, cameras; if (!parseStereoFiles(override_out_prefix, input_files, // inputs images, cameras, opt.out_prefix, opt.input_dem)) // outputs vw_throw(ArgumentErr() << "Missing the input files and/or output prefix.\n"); if (images.size() >= 1) opt.in_file1 = images[0]; if (images.size() >= 2) opt.in_file2 = images[1]; if (cameras.size() >= 1) opt.cam_file1 = cameras[0]; if (cameras.size() >= 2) opt.cam_file2 = cameras[1]; if (opt.in_file1.empty() || opt.in_file2.empty() || opt.out_prefix.empty()) vw_throw(ArgumentErr() << "Missing the input files and/or output prefix.\n"); // Create the output directory vw::create_out_dir(opt.out_prefix); // Turn on logging to file, except for stereo_parse, as that one is called // all the time. std::string prog_name = extract_prog_name(argv[0]); if (prog_name.find("stereo_parse") == std::string::npos) asp::log_to_file(argc, argv, opt.stereo_default_filename, opt.out_prefix); // Handle crop wins and proj_win conversion handleCropWins(opt); // Handle the crop wins for distributed stereo mode. This must be after the // crop wins are adjusted for the regular stereo mode. if (asp::stereo_settings().stereo_dist_mode) { handleDistCropWins(opt.in_file1, opt.in_file2, stereo_settings().sgm_collar_size, stereo_settings().left_image_crop_win, stereo_settings().right_image_crop_win); // Reset trans_crop_win in case user set it by mistake; it's not used in dist mode stereo_settings().trans_crop_win = BBox2i(0, 0, 0, 0); } // Ensure the crop windows are always contained in the images. boost::shared_ptr<vw::DiskImageResource> left_resource, right_resource; left_resource = vw::DiskImageResourcePtr(opt.in_file1); right_resource = vw::DiskImageResourcePtr(opt.in_file2); // For multi-band images, this will only read the first band. This is enough // for now as we do only bounding box checks. During stereo preprocessing, the // images will be opened again and the correct band will be used. DiskImageView<float> left_image(left_resource); DiskImageView<float> right_image(right_resource); stereo_settings().left_image_crop_win.crop (bounding_box(left_image)); stereo_settings().right_image_crop_win.crop(bounding_box(right_image)); bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); // If crops were specified, check that they are valid. if (crop_left && stereo_settings().left_image_crop_win.empty()) vw_throw(ArgumentErr() << "Invalid left crop window specified!\n"); if (crop_right && stereo_settings().right_image_crop_win.empty()) vw_throw(ArgumentErr() << "Invalid right crop window specified!\n"); // Make sure the trans_crop_win value is correct going forwards. if (!crop_left) { // The crop window after transforming the left image via // affine epipolar or homography alignment. if (stereo_settings().trans_crop_win == BBox2i(0, 0, 0, 0)) stereo_settings().trans_crop_win = transformed_crop_win(opt); // Intersect with L.tif which is the transformed and processed left image. if (fs::exists(opt.out_prefix+"-L.tif")) { DiskImageView<PixelGray<float>> L_img(opt.out_prefix+"-L.tif"); stereo_settings().trans_crop_win.crop(bounding_box(L_img)); } } else { // If left_image_crop_win is specified, as can be see in // StereoSession::preprocessing_hook(), we actually // physically crop the image. The trans_crop_win as passed // here from parallel_stereo will already be a tile in the // cropped image. So we just use it as it is. If it is not defined, // we set it to the entire cropped image. if (stereo_settings().trans_crop_win == BBox2i(0, 0, 0, 0)) { stereo_settings().trans_crop_win = bounding_box(left_image); if (fs::exists(opt.out_prefix+"-L.tif")) { DiskImageView<PixelGray<float>> L_img(opt.out_prefix+"-L.tif"); stereo_settings().trans_crop_win = bounding_box(L_img); } } } // End crop checking case // If not using crop wins but the crop image exists, then things won't go well. if (!crop_left && !crop_right && (fs::exists(opt.out_prefix+"-L-cropped.tif") || fs::exists(opt.out_prefix+"-R-cropped.tif"))) vw_throw(ArgumentErr() << "The current output prefix '" << opt.out_prefix << "' has an old run which used --left-image-crop-win or " << "--proj-win, but the current run does not. Results will be " << "incorrect. Use a new output prefix."); // TODO: May need to update this check for individual crop cases. // Sanity check. Don't run it if we have L-cropped.tif or R-cropped.tif, // in that case we have ran the gui before, and the sizes of the subimages // could be anything. We'll regenerate any of those anyway soon. if ((stereo_settings().trans_crop_win.width () <= 0 || stereo_settings().trans_crop_win.height() <= 0) && !fs::exists(opt.out_prefix+"-L-cropped.tif") && !fs::exists(opt.out_prefix+"-R-cropped.tif")) { vw_throw(ArgumentErr() << "Invalid region for doing stereo.\n\n"); } // For time being the crop wins are not taken into account when // matches are produced from disparity, and the results are wrong. // Therefore, disable this. if ((crop_left || crop_right) && (stereo_settings().num_matches_from_disparity > 0 || stereo_settings().num_matches_from_disp_triplets > 0)) vw_throw(ArgumentErr() << "Cannot use --num-matches-from-disparity or " << "--num-matches-from-disp-triplets with --left-image-crop-win, " << "--right-image-crop-win, or --proj-win. The alternative is to " << "manually crop the left and right images while keeping the " << "upper-left corner. Otherwise the results would be incorrect.\n"); // This does not work because tx_left() and tx_right() return the identity for // this alignment method. See StereoSessionPinhole::tx_left() for more // details. if (asp::stereo_settings().alignment_method == "epipolar" && (stereo_settings().num_matches_from_disparity > 0 || stereo_settings().num_matches_from_disp_triplets > 0)) vw_throw(ArgumentErr() << "Cannot use --num-matches-from-disparity or " << "--num-matches-from-disp-triplets with epipolar alignment.\n"); // Cannot have both matches from disparity and triplets if (stereo_settings().num_matches_from_disparity > 0 && stereo_settings().num_matches_from_disp_triplets > 0) vw_throw(ArgumentErr() << "Cannot have both --num-matches-from-disparity and " << "--num-matches-from-disp-triplets.\n"); // In the latest ASP always create triplets if (stereo_settings().num_matches_from_disparity > 0) { vw::vw_out(vw::WarningMessage) << "The option --num-matches-from-disparity is equivalent to " << "--num-matches-from-disp-triplets.\n"; stereo_settings().num_matches_from_disp_triplets = stereo_settings().num_matches_from_disparity; stereo_settings().num_matches_from_disparity = 0; } // Ensure good order BBox2 & b = stereo_settings().lon_lat_limit; // alias if (b != BBox2(0,0,0,0)) { if (b.min().y() > b.max().y()) std::swap(b.min().y(), b.max().y()); if (b.min().x() > b.max().x()) std::swap(b.min().x(), b.max().x()); } if (!stereo_settings().match_files_prefix.empty() && !stereo_settings().clean_match_files_prefix.empty()) vw_throw(ArgumentErr() << "Cannot specify both --match-files-prefix and " << "--clean-match-files-prefix.\n"); if (!stereo_settings().corr_search_limit.empty() && stereo_settings().max_disp_spread > 0) vw_throw(ArgumentErr() << "Cannot specify both --corr-search-limit and " << "--max-disp-spread.\n"); // Get number of bands in input images int num_left_bands = vw::get_num_channels(opt.in_file1); int num_right_bands = vw::get_num_channels(opt.in_file2); // Verify that there is only one channel per input image if (asp::skip_image_normalization(opt) && (num_left_bands > 1 || num_right_bands > 1)) vw_throw(ArgumentErr() << "Error: Cannot skip image normalization if the input images " << "have more than one band (channel).\n\n"); // Print a warning if more than one band exists and the band was not set. if (stereo_settings().band == -1 && (num_left_bands > 1 || num_right_bands > 1)) { vw_out(WarningMessage) << "The input images have more than one band (channel), " << "but the --band option was not set. Using band 1.\n"; stereo_settings().band = 1; } // Having printed the warning, set the band to 1 if it was not set. if (stereo_settings().band == -1) stereo_settings().band = 1; // Sanity check if (stereo_settings().band <= 0 || stereo_settings().band > num_left_bands || stereo_settings().band > num_right_bands) vw_throw(ArgumentErr() << "The value of --band is out of range.\n"); if ((stereo_settings().bundle_adjust_prefix != "") && (stereo_settings().alignment_method == "epipolar")) vw_throw(ArgumentErr() << "Error: Epipolar alignment does not support using a " << "bundle adjust prefix.\n"); // Replace normal default values with these when SGM is enabled. // - TODO: Move these somewhere easier to find! const int SGM_DEFAULT_SUBPIXEL_MODE = 12; // Blend const int SGM_DEFAULT_COST_MODE = 4; const int SGM_DEFAULT_KERNELSIZE = 5; const int SGM_DEFAULT_RM_CLEANUP_PASSES = 0; const int SGM_DEFAULT_MEDIAN_FILTER_SIZE = 3; const int SGM_DEFAULT_TEXTURE_SMOOTH_SIZE = 11; const double SGM_DEFAULT_TEXTURE_SMOOTH_SCALE = 0.13; // Increase the timeout for MGM, unless specified, as that one is slow. // Need some care here, to make sure that even if the parent function is called // twice, the increase happens just once. if (stereo_settings().stereo_algorithm == "mgm" && stereo_settings().corr_timeout == stereo_settings().default_corr_timeout) { stereo_settings().corr_timeout = 10 * stereo_settings().default_corr_timeout; vw_out() << "For the original mgm algorithm increasing the --corr-timeout to: " << stereo_settings().corr_timeout << ".\n"; } // TODO: Modify SGM tile sizes? vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); if (stereo_alg > vw::stereo::VW_CORRELATION_BM) { // If these parameters were not specified by the user, override // the normal default values. Note that by setting // subpixel_mode to SGM_DEFAULT_SUBPIXEL_MODE, we will do no // further subpixel refinement than what all algorithms except // ASP's block matching are intrinsically capable of. if the // user however explicitly specifies, for example, // --subpixel-mode 3, that one will be used later on. // TODO(oalexan1): Consider setting the default --subpixel-mode to 9 // with non-BM algorithms, as it results in nicer results. // These are also useful with external algorithms, as the results are then // smoother. if (vm["rm-cleanup-passes"].defaulted()) stereo_settings().rm_cleanup_passes = SGM_DEFAULT_RM_CLEANUP_PASSES; if (vm["median-filter-size"].defaulted()) stereo_settings().median_filter_size = SGM_DEFAULT_MEDIAN_FILTER_SIZE; if (vm["texture-smooth-size"].defaulted()) stereo_settings().disp_smooth_size = SGM_DEFAULT_TEXTURE_SMOOTH_SIZE; if (vm["texture-smooth-scale"].defaulted()) stereo_settings().disp_smooth_texture = SGM_DEFAULT_TEXTURE_SMOOTH_SCALE; if (vm["subpixel-mode"].defaulted()) stereo_settings().subpixel_mode = SGM_DEFAULT_SUBPIXEL_MODE; // This is for the case when settings are read from stereo.default. Print // some warnings. if (stereo_settings().rm_cleanup_passes != SGM_DEFAULT_RM_CLEANUP_PASSES) vw_out(WarningMessage) << "When using a stereo algorithm rather than asp_bm, " << "the default suggested value for " << "rm-cleanup-passes is " << SGM_DEFAULT_RM_CLEANUP_PASSES << ". " << "Got instead " << stereo_settings().rm_cleanup_passes << ".\n"; if (stereo_settings().median_filter_size != SGM_DEFAULT_MEDIAN_FILTER_SIZE) vw_out(WarningMessage) << "When using a stereo algorithm rather than asp_bm, " << "the default suggested value for " << "median-filter-size is " << SGM_DEFAULT_MEDIAN_FILTER_SIZE << ". " << "Got instead " << stereo_settings().median_filter_size << ".\n"; if (stereo_settings().disp_smooth_size != SGM_DEFAULT_TEXTURE_SMOOTH_SIZE) vw_out(WarningMessage) << "When using a stereo algorithm rather than asp_bm, " << "the default suggested value for " << "texture-smooth-size is " << SGM_DEFAULT_TEXTURE_SMOOTH_SIZE << ". " << "Got instead " << stereo_settings().disp_smooth_size << ".\n"; if (stereo_settings().disp_smooth_texture != SGM_DEFAULT_TEXTURE_SMOOTH_SCALE) vw_out(WarningMessage) << "When using a stereo algorithm rather than asp_bm, " << "the default suggested value for " << "texture-smooth-scale is " << SGM_DEFAULT_TEXTURE_SMOOTH_SCALE << ". " << "Got instead " << stereo_settings().disp_smooth_texture << ".\n"; } bool using_tiles = (stereo_alg > vw::stereo::VW_CORRELATION_BM || stereo_settings().alignment_method == "local_epipolar"); // Settings for asp_mgm / asp_sgm. For external algorithms, the low-res // disparity in stereo_corr will be created with asp_mgm, so override // user's choice in that case. if (stereo_alg > vw::stereo::VW_CORRELATION_BM) { if (vm["cost-mode"].defaulted() || stereo_alg >= vw::stereo::VW_CORRELATION_OTHER) stereo_settings().cost_mode = SGM_DEFAULT_COST_MODE; if (vm["corr-kernel"].defaulted() || stereo_alg >= vw::stereo::VW_CORRELATION_OTHER) stereo_settings().corr_kernel = Vector2i(SGM_DEFAULT_KERNELSIZE, SGM_DEFAULT_KERNELSIZE); // This is a fix for the user setting cost-mode in stereo.default, when // it is not defaulted. Do not allow cost mode to be different than // 3 or 4 for asp_sgm / asp_mgm, as it produced junk. if (stereo_settings().cost_mode != 3 && stereo_settings().cost_mode != 4) vw_throw(ArgumentErr() << "When using the asp_sgm or asp_mgm " << "stereo algorithm, cost-mode must be 3 or 4. " << "Check your stereo.default or command-line options.\n"); // Also do not allow corr-kernel to be outside of [3, 9] if (stereo_settings().corr_kernel[0] < 3 || stereo_settings().corr_kernel[0] > 9) vw_throw(ArgumentErr() << "For the asp_sgm / asp_mgm algorithm, " << "the corr kernel size must be between 3 and 9 (inclusive). " << "Check your stereo.default or command-line options.\n"); } if (stereo_alg == vw::stereo::VW_CORRELATION_BM && stereo_settings().subpixel_mode > 6) vw::vw_throw(vw::ArgumentErr() << "Subpixel mode " << stereo_settings().subpixel_mode << " is not supported with block matching. Use mode <= 6.\n"); if (!using_tiles && !stereo_settings().stereo_dist_mode) { // No need for a collar when we are not using tiles. stereo_settings().sgm_collar_size = 0; } if (stereo_alg >= vw::stereo::VW_CORRELATION_OTHER && stereo_settings().alignment_method != "local_epipolar") { vw_throw(ArgumentErr() << "External stereo algorithms can be " << "used only with alignment method local_epipolar.\n"); } if (exit_early) return; // The StereoSession call automatically determines the type of object to // create from the input parameters. In correlator mode there are no cameras, // so don't print the session. bool allow_map_promote = true; bool total_quiet = asp::stereo_settings().correlator_mode; opt.session = asp::StereoSessionFactory::create(opt.stereo_session, // can change opt, opt.in_file1, opt.in_file2, opt.cam_file1, opt.cam_file2, opt.out_prefix, opt.input_dem, allow_map_promote, total_quiet); // Load the cameras. They will be cached in the session. boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2; opt.session->camera_models(camera_model1, camera_model2); // Run a set of checks to make sure the settings are compatible. validateStereoOptions(opt); // This logic must happen after the cameras are loaded. if (stereo_settings().propagate_errors) setup_error_propagation(opt); // The last thing we do before we get started is to copy the // stereo.default settings over into the results directory so that // we have a record of the most recent stereo.default that was used // with this data set. asp::stereo_settings().write_copy(argc, argv, opt.stereo_default_filename, opt.out_prefix + "-stereo.default"); } // Register session types void stereo_register_sessions() { // Register the Isis file handler with the Vision Workbench DiskImageResource system. #if defined(ASP_HAVE_PKG_ISIS) && ASP_HAVE_PKG_ISIS == 1 DiskImageResource::register_file_type(".cub", DiskImageResourceIsis::type_static(), &DiskImageResourceIsis::construct_open, &DiskImageResourceIsis::construct_create); #endif } // Error checking for stereo void validateStereoOptions(ASPGlobalOptions const& opt) { bool dem_provided = !opt.input_dem.empty(); vw::Vector2 heights = asp::stereo_settings().ortho_heights; bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1])); if (have_heights && dem_provided) vw_throw(ArgumentErr() << "The option --ortho-heights expects no DEM as input argument.\n"); // We will work as if the images were mapprojected if (have_heights) dem_provided = true; // Seed mode valid values if (stereo_settings().seed_mode > 3) vw_throw(ArgumentErr() << "Invalid value for --corr-seed-mode: " << stereo_settings().seed_mode << ".\n"); if (stereo_settings().seed_mode == 2) { if (stereo_settings().disparity_estimation_dem_error <= 0.0) vw_throw(ArgumentErr() << "For --corr-seed-mode 2, the value of disparity-estimation-dem-error " << "must be positive."); if (stereo_settings().disparity_estimation_dem.empty()) vw_throw(ArgumentErr() << "For --corr-seed-mode 2, must set --disparity-estimation-dem.\n"); if (stereo_settings().alignment_method == "epipolar") vw_throw(ArgumentErr() << "For --corr-seed-mode 2, cannot use epipolar alignment.\n"); } // Must use map-projected images if input DEM is provided GeoReference georef1, georef2; bool has_georef1 = vw::cartography::read_georeference(georef1, opt.in_file1); bool has_georef2 = vw::cartography::read_georeference(georef2, opt.in_file2); if (dem_provided && (!has_georef1 || !has_georef2)) { vw_throw(ArgumentErr() << "The images are not map-projected, " << "cannot use the provided DEM: " << opt.input_dem << "\n"); } // If the images are map-projected, they need to use the same projection. if (dem_provided && georef1.get_wkt() != georef2.get_wkt()) vw_throw(ArgumentErr() << "The left and right images must use the same projection.\n"); // Must check here for same resolution. This is an endless source of bugs. if (dem_provided && !stereo_settings().allow_different_mapproject_gsd) { auto M1 = georef1.transform(); auto M2 = georef2.transform(); // The diagonal terms of these must be equal. double tol = 1e-10; if (std::abs(M1(0, 0) - M2(0, 0)) > tol || std::abs(M1(1, 1) - M2(1, 1)) > tol) vw::vw_throw(vw::ArgumentErr() << "The input mapprojected images must have the same ground resolution " << "for best results. This can be overriden with the option " << "--allow-different-mapproject-gsd, but is not recommended.\n"); } // Read the mapprojection metadata to identify the DEM used. This is safe // to call on any image; outputs stay empty if the metadata is absent. bool corr_only = stereo_settings().correlator_mode; std::string l_adj_key, l_img_key, l_cam_type_key, l_cam_file_key, l_dem_key; std::string l_adj, l_img, l_cam_type, l_cam_file, l_dem_file; std::string r_adj_key, r_img_key, r_cam_type_key, r_cam_file_key, r_dem_key; std::string r_adj, r_img, r_cam_type, r_cam_file, r_dem_file; if (has_georef1 && has_georef2 && !corr_only) { asp::read_mapproj_header(opt.in_file1, l_adj_key, l_img_key, l_cam_type_key, l_cam_file_key, l_dem_key, l_adj, l_img, l_cam_type, l_cam_file, l_dem_file); asp::read_mapproj_header(opt.in_file2, r_adj_key, r_img_key, r_cam_type_key, r_cam_file_key, r_dem_key, r_adj, r_img, r_cam_type, r_cam_file, r_dem_file); } // If the images are map-projected, we need an input DEM, as we use the ASP // flow with map-projected images. if (has_georef1 && has_georef2 && !dem_provided && !corr_only) { if (!l_dem_file.empty() || !r_dem_file.empty()) vw_throw(ArgumentErr() << "The input images appear to be mapprojected. " << "Please provide a DEM.\n"); // Otherwise, just print a warning. Maybe the user got these from somewhere else. vw_out(WarningMessage) << "It appears that the input images are " << "map-projected. In that case a DEM needs to be " << "provided for stereo to give correct results.\n"; } // Sanity check for .cub images produced with cam2map asp_map=true. // These have the AspMapproject metadata group but no embedded camera model. // RPC/DG .tif files also have DEM_FILE in their header but embed the camera // coefficients, so this check is restricted to .cub inputs. bool is_cub1 = (vw::get_extension(opt.in_file1) == ".cub"); bool is_cub2 = (vw::get_extension(opt.in_file2) == ".cub"); if (has_georef1 && has_georef2 && dem_provided && (is_cub1 || is_cub2) && (opt.cam_file1.empty() || opt.cam_file2.empty()) && !corr_only) { if (!l_dem_file.empty() || !r_dem_file.empty()) vw_throw(ArgumentErr() << "The input .cub images were produced with cam2map asp_map=true " << "and do not contain embedded camera models. Please provide " << "the original camera files (unprojected .cub or .json ISD) " << "as the 3rd and 4th arguments.\n"); } // Check that if the user provided a dem that we are using a map projection method if (dem_provided && !opt.session->isMapProjected() && !corr_only) { vw_throw(ArgumentErr() << "Cannot use map-projected images with a session of type: " << opt.session->name() << ".\n"); } // Validate proj_win option bool use_proj_win = (stereo_settings().proj_win != BBox2i(0, 0, 0, 0)); if (use_proj_win && !dem_provided) vw_throw(ArgumentErr() << "The option --proj-win can only be used with mapprojected images. " << "Provide an input DEM.\n"); // No alignment must be set for map-projected images. if (stereo_settings().alignment_method != "none" && dem_provided) { stereo_settings().alignment_method = "none"; vw_out(WarningMessage) << "Changing the alignment method to 'none' " << "as the images are map-projected." << "\n"; } // Sanity check for distributed stereo mode if (stereo_settings().stereo_dist_mode) { if (asp::doBathy(stereo_settings())) vw_throw(ArgumentErr() << "Bathymetry correction is not supported in " << "distributed stereo mode.\n"); if (stereo_settings().alignment_method != "none") vw_throw(ArgumentErr() << "In distributed stereo mode the alignment method " << "must be 'none'.\n"); if (!opt.session->isMapProjected()) vw_throw(ArgumentErr() << "In distributed stereo mode the session must be " << "map-projected.\n"); if (stereo_settings().sgm_collar_size <= 0) vw_throw(ArgumentErr() << "In distributed stereo mode --sgm-collar-size " << "must be positive.\n"); if (stereo_settings().proj_win != BBox2(0, 0, 0, 0)) vw_throw(ArgumentErr() << "In distributed stereo mode --proj-win " << "must not be set.\n"); } if (stereo_settings().corr_kernel[0]%2 == 0 || stereo_settings().corr_kernel[1]%2 == 0) { vw_throw(ArgumentErr() << "The entries of corr-kernel must be odd numbers.\n"); } if (stereo_settings().subpixel_kernel[0]%2 == 0 || stereo_settings().subpixel_kernel[1]%2 == 0) { vw_throw(ArgumentErr() << "The entries of subpixel-kernel must be odd numbers.\n"); } // Check SGM-related settings vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); // For external algorithms we will still use the MGM algorithm for low-res // disparity, so cost mode of 3 and 4 is fine unless for regular block matching. if (stereo_alg == vw::stereo::VW_CORRELATION_BM) { if (stereo_settings().cost_mode == 3 || stereo_settings().cost_mode == 4) vw_throw(ArgumentErr() << "Cannot use the census transform with " << "the ASP_BM block matching algorithm.\n"); } if (stereo_settings().cost_mode > 4) vw_throw(ArgumentErr() << "Unknown value " << stereo_settings().cost_mode << " for cost-mode.\n"); if (stereo_settings().min_triangulation_angle <= 0 && stereo_settings().min_triangulation_angle != -1) { // This means the user modified it. Then it must be positive. vw_throw(ArgumentErr() << "The min triangulation angle must be positive.\n"); } if (stereo_settings().min_triangulation_angle == -1) { // This means that the user did not set it. Set it to 0. // Deep inside StereoModel.cc it will be overwritten with some // positive value. // This is a bit awkward but is done so for backward compatibility. stereo_settings().min_triangulation_angle = 0; } int num_images = 2; asp::bathyChecks(opt.session->name(), asp::stereo_settings(), num_images); // Need the percentage to be more than 50 as we look at the range [100 - pct, pct]. if (stereo_settings().outlier_removal_params[0] <= 50.0) vw_throw(ArgumentErr() << "The --outlier-removal-params percentage must be more than 50.\n"); if (stereo_settings().outlier_removal_params[1] <= 0.0) vw_throw(ArgumentErr() << "The --outlier-removal-params factor must be positive.\n"); if (stereo_settings().save_lr_disp_diff) { if (stereo_settings().xcorr_threshold < 0.0) vw_throw(ArgumentErr() << "Must have a non-negative value of --xcorr-threshold " << "to be able to use --save-left-right-disparity-difference.\n"); if (stereo_alg >= vw::stereo::VW_CORRELATION_OTHER) vw_throw(ArgumentErr() << "Can use --save-left-right-disparity-difference " << "only with stereo algorithms asp_bm, asp_sgm, asp_mgm, and " << "asp_final_mgm.\n"); } if (stereo_settings().propagate_errors && stereo_settings().compute_error_vector) vw::vw_throw(vw::ArgumentErr() << "Cannot use option --error-vector for computing " << "the triangulation error vector when propagating errors (covariances) " << "from cameras, as those are stored instead in " << "bands 5 and 6.\n"); // No cog if (opt.cog) vw_throw(ArgumentErr() << "The --cog option is not supported for stereo programs, " << "as these create only intermediate processing files.\n"); // Camera checks if (!stereo_settings().correlator_mode) { try { // Note. Cameras are loaded just once, and repeated invocation of camera_models() // will not reload them. Hence this check does not incur a performance hit // due to loading of the cameras. boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2; opt.session->camera_models(camera_model1, camera_model2); Vector3 cam1_ctr = camera_model1->camera_center(Vector2()); Vector3 cam2_ctr = camera_model2->camera_center(Vector2()); Vector3 cam1_vec = camera_model1->pixel_to_vector(Vector2()); Vector3 cam2_vec = camera_model2->pixel_to_vector(Vector2()); // Do the cameras appear to be in the same location? if (norm_2(cam1_ctr - cam2_ctr) < 1e-3) vw_out(WarningMessage) << "Your cameras appear to be in the same location!\n" << "\tYou should double check your given camera\n" << "\tmodels as most likely stereo won't be able\n" << "\tto triangulate or perform epipolar rectification.\n"; // Developer friendly help VW_OUT(DebugMessage,"asp") << "Camera 1 location: " << cam1_ctr << "\n" << " in estimated Lon Lat Rad: " << cartography::xyz_to_lon_lat_radius_estimate(cam1_ctr) << "\n"; VW_OUT(DebugMessage,"asp") << "Camera 2 location: " << cam2_ctr << "\n" << " in estimated Lon Lat Rad: " << cartography::xyz_to_lon_lat_radius_estimate(cam2_ctr) << "\n"; VW_OUT(DebugMessage,"asp") << "Camera 1 pointing dir: " << cam1_vec << "\n" << " dot against pos: " << dot_prod(cam1_vec, cam1_ctr) << "\n"; VW_OUT(DebugMessage,"asp") << "Camera 2 pointing dir: " << cam2_vec << "\n" << " dot against pos: " << dot_prod(cam2_vec, cam2_ctr) << "\n"; // For RPC cameras the camera center is not accurate, so don't print it. if (opt.stereo_session != "rpc" && opt.stereo_session.find("rpcmap") == std::string::npos) vw_out() << "Distance between camera centers: " << norm_2(cam1_ctr - cam2_ctr) << " meters.\n"; // Can cameras triangulate to point at something in front of them? stereo::StereoModel model(camera_model1.get(), camera_model2.get()); double error; Vector3 point = model(Vector2(), Vector2(), error); if (point != Vector3() && // triangulation succeeded ((dot_prod(cam1_vec, point - cam1_ctr) < 0) || (dot_prod(cam2_vec, point - cam2_ctr) < 0))) { vw::vw_out(vw::WarningMessage) << "Your cameras appear to not to be pointing at the same location. " << "A test vector triangulated backwards through the camera models. " << "You should double-check your input cameras as most likely stereo " << "will not be able to triangulate.\n"; } } catch (const std::exception& e) { // Don't throw an error here. There are legitimate reasons as to // why the first checks may fail. For example, the top left pixel // might not be valid on a map projected image. But notify the // user anyway. vw_out(DebugMessage,"asp") << e.what() << "\n"; } } // end camera checks } // End validateStereoOptions } // end namespace asp ================================================ FILE: src/asp/Tools/stereo.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo.h /// Logic needed by the stereo executables. #ifndef __ASP_STEREO_H__ #define __ASP_STEREO_H__ #include <asp/Core/StereoSettingsDesc.h> #include <vw/FileIO/GdalWriteOptions.h> #include <vw/Math/BBox.h> #include <boost/algorithm/string.hpp> #include <boost/program_options.hpp> // This has only the definition of an enum #include <vw/Stereo/CorrelationAlgorithms.h> // Boost headers #include <boost/thread/xtime.hpp> // Posix time is not fully supported in the version of Boost for RHEL Workstation 4 #ifdef __APPLE__ #include <boost/date_time/posix_time/posix_time.hpp> #else #include <ctime> #endif namespace po = boost::program_options; namespace fs = boost::filesystem; /// The stereo pipeline has several stages, which are enumerated below. enum { PREPROCESSING = 0, CORRELATION, REFINEMENT, FILTERING, POINT_CLOUD, WIRE_MESH, NUM_STAGES}; // Allows FileIO to correctly read/write these pixel types namespace asp { struct ASPGlobalOptions; /// Transform the crop window to be in reference to L.tif vw::BBox2i transformed_crop_win(ASPGlobalOptions const& opt); /// Parse the command line options for multi-view stereo void parseStereoArgs(int argc, char* argv[], boost::program_options::options_description const& additional_options, bool verbose, std::string & output_prefix, std::vector<ASPGlobalOptions> & opt_vec, bool exit_early = false); /// Extract only the named options (flags and their values) from the command /// line, skipping positional arguments (images, cameras, output prefix). void parseStereoOptsVals(int argc, char *argv[], boost::program_options::options_description const& additional_options, std::vector<std::string> & opts_and_vals); /// Parse input command line arguments void parseStereoHelper(int argc, char *argv[], ASPGlobalOptions& opt, boost::program_options::options_description const& additional_options, bool is_multiview, bool override_out_prefix, std::vector<std::string> & unregistered, std::string & usage, bool exit_early = false); /// Register DiskImageResource types that are not included in Vision Workbench. void stereo_register_sessions(); /// Checks for obvious user mistakes /// - Throws if any incompatible settings are found. void validateStereoOptions(ASPGlobalOptions const& opt); bool skip_image_normalization(ASPGlobalOptions const& opt); // Convert, for example, 'asp_mgm' to '2'. For ASP algorithms we // use the numbers 0 (BM), 1 (SGM), 2 (MGM), 3 (Final MGM). For // external algorithms will have to examine closer the algorithm // string. This function has a Python analog in parallel_stereo. vw::stereo::CorrelationAlgorithm stereo_alg_to_num(std::string alg); // Find the median angle in degrees at which rays emanating from // matching points meet // TODO(oalexan1): Make this not take opt as an argument, as that requires // including StereoSettings.h here. void estimate_convergence_angle(ASPGlobalOptions const& opt); } // end namespace vw #endif//__ASP_STEREO_H__ ================================================ FILE: src/asp/Tools/stereo_blend.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ // \file stereo_blend.cc // The purpose of this tool is to blend the boundaries of extra-large // stereo_corr tiles so that no seams are visible. This is only // required when running local alignment or SGM/MGM on large data sets // using parallel_stereo. // ROI means region of interest. Each tile has a central area, the // ROI, extracted from the string, out-2048_0_1487_2048, and // outer/padding areas, called buffers, that are not in the tile // proper but rather in neighboring tiles. The buffer size is 0 at // image boundary, and it can be smaller closer to the boundary, // otherwise it is equal to the collar size, which is a fixed bias. // Hence, what this tool does, is, take the outer areas of neighboring // tiles which overlap with the inner area of the current tile, and // blend the results. #include <asp/Core/StereoSettings.h> #include <asp/Core/Macros.h> #include <asp/Core/AspLog.h> #include <asp/Tools/stereo.h> #include <vw/Image/Grassfire.h> #include <vw/Image/ImageMath.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Cartography/GeoReference.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Stereo/DisparityMap.h> #include <boost/filesystem.hpp> using namespace vw; using namespace vw::stereo; using namespace asp; typedef ImageView<double> WeightsType; typedef PixelMask<Vector2f> MaskedPixType; // Every tile has 8 neighbors const int NUM_NEIGHBORS = 8; // Enum for the tiles. We count later on on the fact that the // neighbors have indices in [0, 7]. TILE_M is the main tile and the // others are its neighbors. enum TilePosition {TILE_M = -1, TILE_TL = 0, TILE_T = 1, TILE_TR = 2, TILE_L = 3, TILE_R = 4, TILE_BL = 5, TILE_B = 6, TILE_BR = 7}; /// Given "out-2048_0_1487_2048" return "2048_0_1487_2048" std::string extract_process_folder_bbox_string(std::string s, std::string const& in_file) { // If the filename was included, throw it out first. if (s.find("-" + in_file) != std::string::npos) { std::size_t pt = s.rfind("/"); s = s.substr(0, pt); } std::size_t num_start = s.rfind("-"); if (num_start == std::string::npos) vw_throw(ArgumentErr() << "Error parsing folder string: " << s); return s.substr(num_start+1); } /// Constructs a BBox2i from a parallel_stereo formatted folder. BBox2i bbox_from_folder(std::string const& s, std::string const& in_file) { std::string cropped = extract_process_folder_bbox_string(s, in_file); int x, y, width, height; sscanf(cropped.c_str(), "%d_%d_%d_%d", &x, &y, &width, &height); return BBox2i(x, y, width, height); } // Load an image and form its weights bool load_image_and_weights(std::string const& file_path, ImageView<MaskedPixType> & image, WeightsType & weights, int & num_channels, bool & has_nodata, float& nodata_value) { // Initialize the outputs to something num_channels = 1; has_nodata = false; nodata_value = -32768.0; // Verify image exists if (file_path == "") return false; vw_out() << "Reading: " << file_path << std::endl; // Verify that the disparity has float pixels, as expected. Blending // is done either after algorithms which are not the old ASP block // matching (ASP_BM), when the disparity pixels are always float, or // with local epipolar alignment, when the resulting disparity has // float pixels even when ASP_BM is used. boost::shared_ptr<DiskImageResource> rsrc(DiskImageResourcePtr(file_path)); ChannelTypeEnum disp_data_type = rsrc->channel_type(); if (disp_data_type != VW_CHANNEL_FLOAT32) vw_throw(ArgumentErr() << "Error: stereo_blend should only be called with float images."); num_channels = vw::get_num_channels(file_path); if (rsrc->has_nodata_read()) { has_nodata = true; nodata_value = rsrc->nodata_read(); } else { has_nodata = false; if (num_channels == 1) { vw_throw(ArgumentErr() << "stereo_blend: For a single-channel image " << "expecting to have a no-data value in order to keep track of invalid pixels."); } } // Load the image from disk if (num_channels == 3) { // Load a disparity image = DiskImageView<MaskedPixType>(file_path); } else if (num_channels == 1) { // Load a float image with a nodata value, and create a disparity. It is simpler // to do it this way than to write some template-based logic. ImageView<float> curr_image = DiskImageView<float>(file_path); image.set_size(curr_image.cols(), curr_image.rows()); for (int col = 0; col < curr_image.cols(); col++) { for (int row = 0; row < curr_image.rows(); row++) { float val = curr_image(col, row); if (val != nodata_value) { image(col, row) = MaskedPixType(vw::Vector2f(val, val)); image(col, row).validate(); } else{ image(col, row) = MaskedPixType(vw::Vector2f(0, 0)); image(col, row).invalidate(); } } } } else { vw_throw(ArgumentErr() << "stereo_blend: Expecting an image with 1 or 3 bands, but " << "image " << file_path << " has " << num_channels << " channels.\n"); } // Compute the desired weights. Strictly speaking we need to compute the weights // only on the portion of the image that we will use for blending, but weights // computation is a cheap operation comparing to I/O time. centerline_weights(image, weights); #if 0 // For debugging std::string weights_file = file_path + "_weight.tif"; vw_out() << "Writing: " << weights_file << std::endl; write_image(weights_file, weights); #endif return true; } struct BlendOptions { std::string main_path; // the path to the main disparity to blend BBox2i main_roi; // the main region of interest without padding BBox2i padded_main; // the main region of interest with padding std::string neib_path [NUM_NEIGHBORS]; // the path to the neighbor disparity to blend BBox2i neib_roi [NUM_NEIGHBORS]; // neighbor region of interest without padding BBox2i padded_neib[NUM_NEIGHBORS]; // neighbor region of interest with padding int pad_size; BBox2i full_box; // The box in which all tiles must fit, including their padding // Add padding to a box BBox2i add_padding(BBox2i box) { box.expand(pad_size); box.crop(full_box); return box; } }; // Check if the dimensions of a tile agree with the box it is supposed to fit in void check_size(BBox2i const& bbox, std::string const& image_file) { Vector2i image_size = file_image_size(image_file); bool is_good = (bbox.width() == image_size.x() && bbox.height() == image_size.y()); if (!is_good) vw_throw(ArgumentErr() << "stereo_blend: File: " << image_file << " is expected to fit in box: " << bbox); } void fill_blend_options(ASPGlobalOptions const& opt, std::string const& in_file, BlendOptions & blend_opt) { std::string left_image = opt.out_prefix + "-L.tif"; Vector2i full_image_size = file_image_size(left_image); blend_opt.full_box = BBox2i(0, 0, full_image_size.x(), full_image_size.y()); blend_opt.pad_size = stereo_settings().sgm_collar_size; blend_opt.main_path = opt.out_prefix + "-" + in_file; // Get the top level output folder for parallel_stereo boost::filesystem::path parallel_stereo_folder(opt.out_prefix); // This wrong, as it assumes that out_prefix always looks like path1/path2. // What if it is path1/path2/path3. parallel_stereo_folder = parallel_stereo_folder.parent_path().parent_path(); // This must be sync-ed up with parallel_stereo. Read the list of // dirs that parallel_stereo made. std::vector<std::string> folder_list; std::string dir; std::string dirList = opt.out_prefix + "-dirList.txt"; std::ifstream ifs(dirList.c_str()); while (ifs >> dir) folder_list.push_back(dir); ifs.close(); if (folder_list.empty()) vw_throw(ArgumentErr() << "Something is corrupted. Found an empty file: " << dirList << ".\n"); // Get the main tile bbox from the subfolder name boost::filesystem::path mpath(blend_opt.main_path); std::string mbb = mpath.parent_path().filename().string(); blend_opt.main_roi = bbox_from_folder(mbb, in_file); blend_opt.padded_main = blend_opt.add_padding(blend_opt.main_roi); check_size(blend_opt.padded_main, blend_opt.main_path); BBox2i main_bbox = blend_opt.main_roi; // Figure out where each folder goes for (std::size_t i = 0; i < folder_list.size(); i++) { BBox2i bbox = bbox_from_folder(folder_list[i], in_file); std::string bbox_string = extract_process_folder_bbox_string(folder_list[i], in_file); // Note that folder_list[i] already has the output prefix relative to the // directory parallel_stereo runs in. const std::string abs_path = folder_list[i] + "/" + bbox_string + "-" + in_file; if (bbox.max().x() == main_bbox.min().x()) { // Tiles one column to left if (bbox.max().y() == main_bbox.min().y()) { // Top left blend_opt.neib_path[TILE_TL] = abs_path; blend_opt.neib_roi [TILE_TL] = bbox; continue; } if (bbox.min().y() == main_bbox.min().y()) { // Left blend_opt.neib_path[TILE_L] = abs_path; blend_opt.neib_roi [TILE_L] = bbox; continue; } if (bbox.min().y() == main_bbox.max().y()) { // Bot left blend_opt.neib_path[TILE_BL] = abs_path; blend_opt.neib_roi [TILE_BL] = bbox; continue; } } // End left tiles if (bbox.min().x() == main_bbox.max().x()) { // Tiles one column to right if (bbox.max().y() == main_bbox.min().y()) { // Top right blend_opt.neib_path[TILE_TR] = abs_path; blend_opt.neib_roi [TILE_TR] = bbox; continue; } if (bbox.min().y() == main_bbox.min().y()) { // Right blend_opt.neib_path[TILE_R] = abs_path; blend_opt.neib_roi [TILE_R] = bbox; continue; } if (bbox.min().y() == main_bbox.max().y()) { // Bot right blend_opt.neib_path[TILE_BR] = abs_path; blend_opt.neib_roi [TILE_BR] = bbox; continue; } } // End right tiles if (bbox.min().x() == main_bbox.min().x()) { // Tiles in same column if (bbox.max().y() == main_bbox.min().y()) { // Top blend_opt.neib_path[TILE_T] = abs_path; blend_opt.neib_roi [TILE_T] = bbox; continue; } if (bbox.min().y() == main_bbox.max().y()) { // Bottom blend_opt.neib_path[TILE_B] = abs_path; blend_opt.neib_roi [TILE_B] = bbox; continue; } } } // Compute the padded box for each neighbor for (int i = 0; i < NUM_NEIGHBORS; i++) { if (blend_opt.neib_path[i] == "") continue; // no neighbor in that direction blend_opt.padded_neib[i] = blend_opt.add_padding(blend_opt.neib_roi[i]); check_size(blend_opt.padded_neib[i], blend_opt.neib_path[i]); } } // See if a given image has only invalid pixels bool invalid_image(ImageView<MaskedPixType> const& image) { for (int col = 0; col < image.cols(); col++) { for (int row = 0; row < image.rows(); row++) { if (is_valid(image(col, row))) { // Found a valid pixel return false; } } } return true; } /// Blend the borders of the main tile using the neighboring /// tiles. /// While all the main tile and neighbor tiles have padding, we will save /// the blended main tile without padding. ImageView<MaskedPixType> tile_blend(ASPGlobalOptions const& opt, BlendOptions & blend_opt, // These will change int & num_channels, bool & has_nodata, float & nodata_value) { // Initialize the outputs to something num_channels = 1; has_nodata = false; nodata_value = -32768.0; // Start the output image as invalid and zero. It will be used to // accumulate the weighted disparities. ImageView<MaskedPixType> output_image(blend_opt.main_roi.width(), blend_opt.main_roi.height()); for (int col = 0; col < output_image.cols(); col++) { for (int row = 0; row < output_image.rows(); row++) { output_image(col, row) = MaskedPixType(); output_image(col, row).invalidate(); } } // Accumulate here the weights WeightsType output_weights(blend_opt.main_roi.width(), blend_opt.main_roi.height()); for (int col = 0; col < output_weights.cols(); col++) { for (int row = 0; row < output_weights.rows(); row++) { output_weights(col, row) = 0.0; } } // Add the contribution from the main tile and neighboring tiles. Note // that i = -1 corresponds to the main tile. for (int i = -1; i < NUM_NEIGHBORS; i++) { ImageView<MaskedPixType> image; WeightsType weights; BBox2i padded_box; if (i == -1) { // Main tile // The main tile better exist int curr_num_channels = 1; bool curr_has_nodata = false; float curr_nodata_value = -32768.0; bool ans = load_image_and_weights(blend_opt.main_path, image, weights, curr_num_channels, curr_has_nodata, curr_nodata_value); if (!ans) vw_throw(ArgumentErr() << "stereo_blend: main tile is missing."); // Since the image was loaded successfully, copy its other info num_channels = curr_num_channels; has_nodata = curr_has_nodata; nodata_value = curr_nodata_value; padded_box = blend_opt.padded_main; // If there are no valid pixels in the main tile without its padding, // return an invalid blended tile. if (invalid_image(crop(image, blend_opt.main_roi - blend_opt.padded_main.min()))) return output_image; } else { // A neighboring tile int curr_num_channels = 1; bool curr_has_nodata = false; float curr_nodata_value = -32768.0; bool ans = load_image_and_weights(blend_opt.neib_path[i], image, weights, curr_num_channels, curr_has_nodata, curr_nodata_value); if (!ans) continue; // Nothing to blend // Since the image was loaded successfully, copy its other info. Note we assume // all inputs are consistent. num_channels = curr_num_channels; has_nodata = curr_has_nodata; nodata_value = curr_nodata_value; padded_box = blend_opt.padded_neib[i]; } // Do the blending, either with the main or neighboring tiles for (int col = 0; col < output_image.cols(); col++) { for (int row = 0; row < output_image.rows(); row++) { // Convert the given pixel to the coordinate system of the full image Vector2 pix = Vector2(col, row) + blend_opt.main_roi.min(); // Convert the pixel to the coordinate system of the current padded tile pix = pix - padded_box.min(); // Padded tiles can overlap only partially with the central region of the main // tile. If not in the overlap region, skip the work. if (!vw::bounding_box(image).contains(pix)) continue; if (!is_valid(image(pix[0], pix[1])) || weights(pix[0], pix[1]) <= 0.0) continue; // No useful info output_image(col, row).validate(); output_image(col, row) += weights(pix[0], pix[1]) * image(pix[0], pix[1]); output_weights(col, row) += weights(pix[0], pix[1]); } } } // Normalize for (int col = 0; col < output_image.cols(); col++) { for (int row = 0; row < output_image.rows(); row++) { if (!is_valid(output_image(col, row))) continue; if (output_weights(col, row) <= 0) { output_image(col, row).invalidate(); continue; } output_image(col, row) /= output_weights(col, row); } } return output_image; } void stereo_blending(ASPGlobalOptions const& opt, std::string const& in_file, std::string const& out_file) { BlendOptions blend_opt; fill_blend_options(opt, in_file, blend_opt); // Since this tool is only for follow-up processing of SGM results // in parallel_stereo, it can be safely assumed that the input // images are small enough to load entirely into memory. cartography::GeoReference left_georef; std::string left_image = opt.out_prefix + "-L.tif"; bool has_left_georef = read_georeference(left_georef, left_image); int num_channels = 1; bool has_nodata = false; float nodata = -32768.0; ImageView<MaskedPixType> blended_disp = tile_blend(opt, blend_opt, // These will change num_channels, has_nodata, nodata); // Sanity check if (num_channels == 1 && !has_nodata) { vw_throw(ArgumentErr() << "stereo_blend: For a single-channel image " << "expecting to have a no-data value in order to keep track of invalid pixels."); } std::string full_out_file = opt.out_prefix + "-" + out_file; vw_out() << "Writing: " << full_out_file << "\n"; if (num_channels == 3) { // Write the blended disparity vw::cartography::block_write_gdal_image(full_out_file, blended_disp, has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Blending :")); } else if (num_channels == 1) { // Write a single-channel image with no-data ImageView<float> image(blended_disp.cols(), blended_disp.rows()); for (int col = 0; col < image.cols(); col++) { for (int row = 0; row < image.rows(); row++) { if (is_valid(blended_disp(col, row))) image(col, row) = blended_disp(col, row).child()[0]; else image(col, row) = nodata; } } vw::cartography::block_write_gdal_image(full_out_file, image, has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Blending:")); } } int main(int argc, char* argv[]) { try { vw_out() << "\n[ " << current_posix_time_string() << " ]: Stage 2 --> BLENDING\n"; stereo_register_sessions(); bool verbose = false; std::vector<ASPGlobalOptions> opt_vec; std::string output_prefix; asp::parseStereoArgs(argc, argv, SubpixelDescription(), verbose, output_prefix, opt_vec); ASPGlobalOptions opt = opt_vec[0]; // Subpixel refinement uses smaller tiles. //--------------------------------------------------------- int ts = ASPGlobalOptions::rfne_tile_size(); opt.raster_tile_size = Vector2i(ts, ts); // This tool is only intended to run as part of parallel_stereo, which // renames the normal -D.tif file to -Dnosym.tif. std::string in_file = "Dnosym.tif"; std::string out_file = "B.tif"; if (stereo_settings().subpixel_mode > 6){ // No further subpixel refinement, skip to the -RD output. out_file = "RD.tif"; } stereo_blending(opt, in_file, out_file); // See if to also blend L-R disp differences if (stereo_settings().save_lr_disp_diff) { in_file = "L-R-disp-diff.tif"; out_file = "L-R-disp-diff-blend.tif"; stereo_blending(opt, in_file, out_file); } vw_out() << "\n[ " << current_posix_time_string() << " ]: BLENDING FINISHED\n"; } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/stereo_corr.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo_corr.cc /// #include <asp/Core/DisparityProcessing.h> #include <asp/Core/DemDisparity.h> #include <asp/Core/InterestPointMatching.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/LocalAlignment.h> #include <asp/Core/StereoSettings.h> #include <asp/Sessions/StereoSession.h> #include <asp/Tools/stereo.h> #include <asp/Core/Macros.h> #include <asp/Core/EnvUtils.h> #include <asp/Core/FileUtils.h> #include <asp/Core/AspLog.h> #include <vw/Stereo/CorrelationView.h> #include <vw/Stereo/CostFunctions.h> #include <vw/Stereo/DisparityMap.h> #include <vw/Core/StringUtils.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Stereo/Correlation.h> #include <vw/Core/Stopwatch.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <xercesc/util/PlatformUtils.hpp> using namespace vw; using namespace vw::stereo; using namespace asp; typedef vw::ImageViewRef<vw::PixelMask<vw::Vector2f>> DispImageRef; /// Returns the properly cast cost mode type stereo::CostFunctionType get_cost_mode_value() { switch(stereo_settings().cost_mode) { case 0: return stereo::ABSOLUTE_DIFFERENCE; case 1: return stereo::SQUARED_DIFFERENCE; case 2: return stereo::CROSS_CORRELATION; case 3: return stereo::CENSUS_TRANSFORM; case 4: return stereo::TERNARY_CENSUS_TRANSFORM; default: vw_throw(ArgumentErr() << "Unknown value " << stereo_settings().cost_mode << " for cost-mode.\n"); }; } /// Determine the proper subpixel mode to be used with SGM correlation SemiGlobalMatcher::SgmSubpixelMode get_sgm_subpixel_mode() { switch(stereo_settings().subpixel_mode) { case 7: return SemiGlobalMatcher::SUBPIXEL_NONE; case 8: return SemiGlobalMatcher::SUBPIXEL_LINEAR; case 9: return SemiGlobalMatcher::SUBPIXEL_POLY4; case 10: return SemiGlobalMatcher::SUBPIXEL_COSINE; case 11: return SemiGlobalMatcher::SUBPIXEL_PARABOLA; case 12: return SemiGlobalMatcher::SUBPIXEL_LC_BLEND; default: return SemiGlobalMatcher::SUBPIXEL_NONE; // This includes stereo_rfne subpixel modes }; } // Read the search range from D_sub, and scale it to the full image void read_search_range_from_D_sub(vw::ImageView<vw::PixelMask<vw::Vector2f>> const& sub_disp, vw::Vector2 const& upsample_scale, bool verbose) { // No D_sub is generated or should be used for seed mode 0. if (stereo_settings().seed_mode == 0) return; BBox2 search_range = stereo::get_disparity_range(sub_disp); search_range.min() = floor(elem_prod(search_range.min(), upsample_scale)); search_range.max() = ceil (elem_prod(search_range.max(), upsample_scale)); // If the width or height of the box is 0, expand it a bit, otherwise // VisionWorkbench will think it is empty and print it with no width or height. if (search_range.min().x() == search_range.max().x()) { search_range.min().x() -= 0.5; search_range.max().x() += 0.5; } if (search_range.min().y() == search_range.max().y()) { search_range.min().y() -= 0.5; search_range.max().y() += 0.5; } stereo_settings().search_range = search_range; // This ensures the search range is not printed in the D_sub log but not in the // full res correlation log, where it will be printed again anyway right before // correlation starts. if (verbose) vw_out() << "\t--> Full-res search range based on D_sub: " << search_range << "\n"; } /// Produces the low-resolution disparity file D_sub void produce_lowres_disparity(ASPGlobalOptions & opt) { // Set up handles to read the input images DiskImageView<vw::uint8> Lmask(opt.out_prefix + "-lMask.tif"), Rmask(opt.out_prefix + "-rMask.tif"); DiskImageView<PixelGray<float>> left_sub (opt.out_prefix + "-L_sub.tif"), right_sub(opt.out_prefix + "-R_sub.tif"); DiskImageView<uint8> left_mask_sub (opt.out_prefix+"-lMask_sub.tif"), right_mask_sub(opt.out_prefix+"-rMask_sub.tif"); Vector2 downsample_scale(double(left_sub.cols()) / double(Lmask.cols()), double(left_sub.rows()) / double(Lmask.rows())); double mean_scale = (downsample_scale[0] + downsample_scale[1]) / 2.0; // Compute the initial search range in the subsampled image BBox2 search_range(floor(elem_prod(downsample_scale, stereo_settings().search_range.min())), ceil(elem_prod(downsample_scale, stereo_settings().search_range.max()))); vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); std::string d_sub_file = opt.out_prefix + "-D_sub.tif"; std::string spread_file = opt.out_prefix + "-D_sub_spread.tif"; if (stereo_settings().seed_mode != 3 && fs::exists(spread_file)) { // Wipe any potentially old spread file, unless seed_mode is 3, when // sparse_disp does the work. fs::remove(spread_file); } if (stereo_settings().seed_mode == 1) { // For D_sub always use a cross-check even if it takes more time. // The user-specified xcorr_threshold will be restored at the end. int orig_xcorr_threshold = stereo_settings().xcorr_threshold; if (orig_xcorr_threshold < 0) stereo_settings().xcorr_threshold = 2; // Use low-res correlation to get the low-res disparity Vector2 expansion(search_range.width(), search_range.height()); expansion *= stereo_settings().seed_percent_pad / 2.0f; // Expand by the user selected amount. Default is 25%. search_range.min() -= expansion; search_range.max() += expansion; //VW_OUT(DebugMessage,"asp") << "D_sub search range: " << search_range << " px\n"; vw_out() << "D_sub search range: " << search_range << " px\n"; stereo::CostFunctionType cost_mode = get_cost_mode_value(); Vector2i kernel_size = stereo_settings().corr_kernel; int corr_timeout = 5*stereo_settings().corr_timeout; // 5x, so try hard const int rm_half_kernel = 5; // Filter kernel size used by CorrelationView double seconds_per_op = 0.0; if (corr_timeout > 0) seconds_per_op = calc_seconds_per_op(cost_mode, kernel_size); SemiGlobalMatcher::SgmSubpixelMode sgm_subpixel_mode = get_sgm_subpixel_mode(); Vector2i sgm_search_buffer = stereo_settings().sgm_search_buffer; ImageView<PixelMask<float>> * lr_disp_diff = NULL; Vector2i region_ul = Vector2i(0, 0); int blob_filter_area = stereo_settings().corr_blob_filter_area * mean_scale; if (stereo_settings().rm_quantile_multiple > 0.0) { // Don't combine blob filtering with quantile filtering blob_filter_area = 0; } // Process the entire D_sub in memory as it is small enough int collar_size = 0; // Since there won't be tiles as the all the processing is done at once vw::vw_out() << "Computing the low-resolution disparity.\n"; // Use here a stop watch, as this takes forever. vw::Stopwatch sw; sw.start(); ImageView<PixelMask<Vector2f>> d_sub = vw::stereo::pyramid_correlate (// Compute image correlation using the PyramidCorrelationView class left_sub, right_sub, left_mask_sub, right_mask_sub, vw::stereo::PREFILTER_LOG, stereo_settings().slogW, search_range, kernel_size, cost_mode, corr_timeout, seconds_per_op, stereo_settings().xcorr_threshold, stereo_settings().min_xcorr_level, rm_half_kernel, stereo_settings().corr_max_levels, stereo_alg, collar_size, sgm_subpixel_mode, sgm_search_buffer, stereo_settings().corr_memory_limit_mb, blob_filter_area, lr_disp_diff, region_ul, stereo_settings().stereo_debug); if (stereo_settings().rm_quantile_multiple <= 0.0) { // Filter D_sub using thresholds (the default) d_sub = rm_outliers_using_thresh (d_sub, // To do: all these hard-coded values must be replaced with // appropriate params from user's stereo.default, for // consistency with how disparity is filtered in stereo_fltr, // when invoking disparity_cleanup_using_thresh. 1, 1, // in stereo.default we have 5 5 // Changing below the hard-coded value from 2.0 to using a // param. The default value will still be 2.0 but is now // modifiable. Need to get rid of the 2.0/3.0 factor and // study how it affects the result. stereo_settings().rm_threshold*2.0/3.0, // Another change of hard-coded value to param. Get rid of 0.5/0.6 // and study the effect. (stereo_settings().rm_min_matches/100.0)*0.5/0.6); } else { // Filter D_sub using quantiles d_sub = rm_outliers_using_quantiles (d_sub, stereo_settings().rm_quantile_percentile, stereo_settings().rm_quantile_multiple); } vw_out() << "Writing: " << d_sub_file << std::endl; vw::cartography::block_write_gdal_image (// Write to disk d_sub_file, d_sub, opt, TerminalProgressCallback("asp", "\t--> Low-resolution disparity:")); // Check elapsed time sw.stop(); vw_out() << "Low-resolution disparity computation took " << sw.elapsed_seconds() << " s.\n"; // Restore the user xcorr_threshold stereo_settings().xcorr_threshold = orig_xcorr_threshold; // Read D_sub back from disk, filter it, and write it back. // Avoid the pinhole session as that one has no datum which we need. // Avoid the correlator mode as then there are no cameras. if (stereo_settings().outlier_removal_params[0] < 100.0 && opt.session->have_datum() && !stereo_settings().correlator_mode) { vw::TransformPtr tx_left = opt.session->tx_left(); vw::TransformPtr tx_right = opt.session->tx_right(); boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model; opt.session->camera_models(left_camera_model, right_camera_model); const bool use_sphere_for_non_earth = true; vw::cartography::Datum datum = opt.session->get_datum(left_camera_model.get(), use_sphere_for_non_earth); asp::filter_D_sub(opt, tx_left, tx_right, left_camera_model, right_camera_model, datum, d_sub_file, stereo_settings().outlier_removal_params); } if (stereo_settings().max_disp_spread > 0.0) asp::dispSpreadFilterIO(opt, d_sub_file, stereo_settings().max_disp_spread); } else if (stereo_settings().seed_mode == 2) { // Use a DEM to get the low-res disparity boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model; opt.session->camera_models(left_camera_model, right_camera_model); vw::TransformPtr tx_left = opt.session->tx_left(); vw::TransformPtr tx_right = opt.session->tx_right(); produce_dem_disparity(opt, tx_left, tx_right, left_camera_model, right_camera_model, opt.session->name()); } else if (stereo_settings().seed_mode == 3) { // D_sub is already generated by now by sparse_disp } // Read this to print some text while still in low-res disparity // computation mode. Next time we call this it will be per // individual tile so it will go to different log files. if (stereo_settings().seed_mode > 0) { bool verbose = true; ImageView<PixelMask<Vector2f>> sub_disp; vw::Vector2 upsample_scale; load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale); read_search_range_from_D_sub(sub_disp, upsample_scale, verbose); } } // End produce_lowres_disparity // TODO(oalexan1): move this to InterestPointMatching.cc BBox2 get_search_range_from_ip_hists(vw::math::Histogram const& hist_x, vw::math::Histogram const& hist_y, double edge_discard_percentile, double search_scale) { const double min_percentile = edge_discard_percentile; const double max_percentile = 1.0 - edge_discard_percentile; const Vector2 FORCED_EXPANSION = Vector2(30,2); // Must expand range by at least this much size_t min_bin_x = hist_x.get_percentile(min_percentile); size_t min_bin_y = hist_y.get_percentile(min_percentile); size_t max_bin_x = hist_x.get_percentile(max_percentile); size_t max_bin_y = hist_y.get_percentile(max_percentile); Vector2 search_min(hist_x.get_bin_center(min_bin_x), hist_y.get_bin_center(min_bin_y)); Vector2 search_max(hist_x.get_bin_center(max_bin_x), hist_y.get_bin_center(max_bin_y)); Vector2 search_center = (search_max + search_min) / 2.0; Vector2 d_min = search_min - search_center; // TODO: Make into a bbox function! Vector2 d_max = search_max - search_center; // Enforce a minimum expansion on the search range in each direction Vector2 min_expand = d_min*search_scale; Vector2 max_expand = d_max*search_scale; for (int i = 0; i < 2; ++i) { if (min_expand[i] > -1*FORCED_EXPANSION[i]) min_expand[i] = -1*FORCED_EXPANSION[i]; if (max_expand[i] < FORCED_EXPANSION[i]) max_expand[i] = FORCED_EXPANSION[i]; } search_min = search_center + min_expand; search_max = search_center + max_expand; Vector2 search_minI(floor(search_min[0]), floor(search_min[1])); // Round outwards Vector2 search_maxI(ceil (search_max[0]), ceil (search_max[1])); return BBox2(search_minI, search_maxI); } /// Use existing interest points to compute a search range, when --seed-mode is 1. BBox2 approximate_search_range(ASPGlobalOptions & opt, std::string const& match_filename) { vw_out() << "\t--> Using interest points to determine search window.\n"; std::vector<ip::InterestPoint> in_left_ip, in_right_ip, matched_left_ip, matched_right_ip; // The interest points must have been created outside this function if (!fs::exists(match_filename)) vw_throw(ArgumentErr() << "Missing IP file: " << match_filename); vw_out() << "\t * Loading match file: " << match_filename << "\n"; ip::read_match_file(match_filename, in_left_ip, in_right_ip, stereo_settings().matches_as_txt); // TODO(oalexan1): Add here filter_ip_using_cameras, but take into account // that the datum may not exist! // TODO(oalexan1): Add filter ip using reprojection error! // Align the ip, so go ip between left.tif and right.tif to ones between // L.tif and R.tif. If the matches are already between L.tif and R.tif // then do nothing. // TODO(oalexan1): Having this as a special case is annoying. Do something about this. bool matches_as_txt = stereo_settings().matches_as_txt; std::string aligned_match_file = vw::ip::match_filename(opt.out_prefix, "L.tif", "R.tif", matches_as_txt); if (match_filename != aligned_match_file) align_ip(opt.session->tx_left(), opt.session->tx_right(), in_left_ip, in_right_ip); // Camera models boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model; opt.session->camera_models(left_camera_model, right_camera_model); // Filter out IPs which fall outside the specified elevation range // TODO(oalexan1): This must go to stereo_pprc. if (!stereo_settings().correlator_mode && opt.session->have_datum()) { bool use_sphere_for_non_earth = true; cartography::Datum datum = opt.session->get_datum(left_camera_model.get(), use_sphere_for_non_earth); // Set up the transforms before the call to avoid indeterminate behavior auto tx_left = opt.session->tx_left(); auto tx_right = opt.session->tx_right(); asp::filter_ip_by_lonlat_and_elevation(tx_left, tx_right, left_camera_model.get(), right_camera_model.get(), datum, in_left_ip, in_right_ip, stereo_settings().elevation_limit, stereo_settings().lon_lat_limit, matched_left_ip, matched_right_ip); } else { // No cameras in this mode matched_left_ip = in_left_ip; matched_right_ip = in_right_ip; } // TODO(oalexan1): Consider adding filter_ip_using_cameras(). // Note that D_sub later on already filters based on cameras. Vector2 disp_params = stereo_settings().outlier_removal_params; bool quiet = false; if (disp_params[0] < 100.0) asp::filter_ip_by_disparity(disp_params[0], disp_params[1], quiet, matched_left_ip, matched_right_ip); // Filter ip using DEM if (stereo_settings().ip_filter_using_dem != "" && !stereo_settings().correlator_mode && opt.session->have_datum()) { auto tx_left = opt.session->tx_left(); auto tx_right = opt.session->tx_right(); ip_filter_using_dem(stereo_settings().ip_filter_using_dem, tx_left, tx_right, left_camera_model, right_camera_model, matched_left_ip, matched_right_ip); } // Quit if we don't have the requested number of IP. if (static_cast<int>(matched_left_ip.size()) < stereo_settings().min_num_ip) vw_throw(ArgumentErr() << "Number of IPs left after filtering is " << matched_left_ip.size() << " which is less than the required amount of " << stereo_settings().min_num_ip << ". Aborting stereo_corr.\n" << " - Consider removing the run directory and restarting stereo,\n" << " while setting --ip-per-tile 200 or some other larger number.\n" << " - Consider decreasing --min-num-ip to accept these matches.\n" << " - Check if your input images are similar enough in illumination\n" << " and if they have enough overlap.\n"); // Find search window based on interest point matches size_t num_ip = matched_left_ip.size(); vw_out(InfoMessage, "asp") << "Estimating search range with " << num_ip << " interest points.\n"; // Record the disparities for each point pair const double BIG_NUM = 99999999; const double SMALL_NUM = -99999999; std::vector<double> dx, dy; double min_dx = BIG_NUM, max_dx = SMALL_NUM, min_dy = BIG_NUM, max_dy = SMALL_NUM; for (size_t i = 0; i < num_ip; i++) { double diffX = matched_right_ip[i].x - matched_left_ip[i].x; double diffY = matched_right_ip[i].y - matched_left_ip[i].y; dx.push_back(diffX); dy.push_back(diffY); if (diffX < min_dx) min_dx = diffX; if (diffY < min_dy) min_dy = diffY; if (diffX > max_dx) max_dx = diffX; if (diffY > max_dy) max_dy = diffY; } BBox2 search_range(Vector2(min_dx, min_dy), Vector2(max_dx, max_dy)); vw_out(InfoMessage,"asp") << "Initial search range: " << search_range << std::endl; const int MAX_SEARCH_WIDTH = 4000; // Try to avoid searching this width const int MIN_SEARCH_WIDTH = 200; // Under this width don't filter IP. const Vector2i MINIMAL_EXPAND(10,1); // If the input search range is too small, expand it a little. Likely there // are not enough interest points to find it accurately. bool filter_using_histogram = true; if (std::max(search_range.width(), search_range.height()) <= MIN_SEARCH_WIDTH) { search_range.min() -= MINIMAL_EXPAND; // BBox2.expand() function does not always work!!!! search_range.max() += MINIMAL_EXPAND; vw_out(InfoMessage, "asp") << "Using expanded search range: " << search_range << "\n"; filter_using_histogram = false; // histogram filtering can be too aggressive } if (filter_using_histogram) { // Compute histograms const int NUM_BINS = 1000000; // Accuracy is important with scaled pixels vw::math::Histogram hist_x(NUM_BINS, min_dx, max_dx); vw::math::Histogram hist_y(NUM_BINS, min_dy, max_dy); for (size_t i = 0; i < dx.size(); ++i){ hist_x.add_value(dx[i]); hist_y.add_value(dy[i]); } // Gradually increase the filtering const double PERCENTILE_CUTOFF = 1.0 - stereo_settings().outlier_removal_params[0]/100.0; double search_scale = (2.0/3.0) * stereo_settings().outlier_removal_params[1]; // for bwd compat const double PERCENTILE_CUTOFF_INC = 0.05; // until the search width is reasonable. const double MAX_PERCENTILE_CUTOFF = 0.201; double current_percentile_cutoff = PERCENTILE_CUTOFF; int search_width = MAX_SEARCH_WIDTH + 1; while (current_percentile_cutoff > 0.0) { // no point in using a 0 cutoff // Remove some outliers based on histogram and then multiply by a factor. // This can be an overestimate. BBox2 hist_search_range = get_search_range_from_ip_hists(hist_x, hist_y, current_percentile_cutoff, search_scale); // Use the hist_search_range to perhaps narrow down the search range search_range.crop(hist_search_range); vw_out() << "Refined search range using a histogram and --outlier-removal-params: " << search_range << "\n"; search_width = search_range.width(); // Increase the percentile cutoff in case we need to filter out more IP current_percentile_cutoff += PERCENTILE_CUTOFF_INC; if (current_percentile_cutoff > MAX_PERCENTILE_CUTOFF) { if (search_width < MAX_SEARCH_WIDTH) vw_out() << "Exceeded maximum filter cutoff of " << MAX_PERCENTILE_CUTOFF << ", keeping current search range\n"; break; // No more filtering is possible, exit the loop. } if (search_width < MAX_SEARCH_WIDTH) break; // Happy with search range, exit the loop. else vw_out() << "Search width of " << search_width << " is greater than desired limit of " << MAX_SEARCH_WIDTH << ", retrying with more aggressive IP filter.\n"; } // End search range determination loop } if (stereo_settings().max_disp_spread > 0.0) { BBox2 spread_box = search_range_using_spread(stereo_settings().max_disp_spread, matched_left_ip, matched_right_ip); search_range.crop(spread_box); // Need this because spread_box may be an overestimate vw_out() << "Refined search range using --max-disp-spread: " << search_range << "\n"; } // Prevent any dimension from being length zero, otherwise future parts to ASP will fail. // TODO(oalexan1): Fix ASP and SGM handling of small boxes. // The issue is that a box with one point is considered empty. // See BBox.h. // Currently code has a minimum search height of 5! if (search_range.empty()) vw_throw(ArgumentErr() << "Computed an empty search range!"); return search_range; } // End function approximate_search_range /// The first step of correlation computation. void lowres_correlation(ASPGlobalOptions & opt) { vw_out() << "\n[ " << current_posix_time_string() << " ]: Stage 1 --> LOW-RESOLUTION CORRELATION\n"; bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); // Working out search range if need be if (stereo_settings().is_search_defined()) { vw_out() << "\t--> Using user-defined search range: " << stereo_settings().search_range << "\n"; // Update user provided search range based on input crops if (crop_left && !crop_right) stereo_settings().search_range += stereo_settings().left_image_crop_win.min(); if (!crop_left && crop_right) stereo_settings().search_range -= stereo_settings().right_image_crop_win.min(); } else if (stereo_settings().seed_mode == 2) { // Do nothing as we will compute the search range based on D_sub } else if (stereo_settings().seed_mode == 3) { // Do nothing as low-res disparity (D_sub) is already provided by sparse_disp } else { // Regular seed mode. Also arrives here fro seed-mode 0. See note in caller. // Load IP from disk std::string match_filename; bool matches_as_txt = stereo_settings().matches_as_txt; bool have_aligned_matches = (stereo_settings().alignment_method == "none" || stereo_settings().alignment_method == "epipolar"); if (have_aligned_matches) match_filename = vw::ip::match_filename(opt.out_prefix, "L.tif", "R.tif", matches_as_txt); else match_filename = asp::stereoMatchFile(opt.session->left_cropped_image(crop_left), opt.session->right_cropped_image(crop_right), opt.out_prefix, matches_as_txt); // The interest points must exist by now if (!fs::exists(match_filename)) vw_throw(ArgumentErr() << "Missing IP matches file: " << match_filename); // This function applies filtering to find good points stereo_settings().search_range = approximate_search_range(opt, match_filename); } // End of case where we had to calculate the search range // If the user specified a search range limit, apply it here. if ((stereo_settings().corr_search_limit.min() != Vector2i()) || (stereo_settings().corr_search_limit.max() != Vector2i())) { stereo_settings().search_range.crop(stereo_settings().corr_search_limit); vw_out() << "\t--> Search range constrained to: " << stereo_settings().search_range << "\n"; } // At this point stereo_settings().search_range is populated DiskImageView<vw::uint8> Lmask(opt.out_prefix + "-lMask.tif"), Rmask(opt.out_prefix + "-rMask.tif"); // Performing disparity on sub images if (stereo_settings().seed_mode > 0) { // Reuse prior existing D_sub if it exists, unless we // are cropping the images each time, when D_sub must // be computed anew each time. bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); std::string sub_disp_file = opt.out_prefix + "-D_sub.tif"; // Also need to rebuild if the inputs changed after the mask files were produced. bool inputs_changed = (!first_is_newer(sub_disp_file, opt.in_file1, opt.in_file2, opt.cam_file1, opt.cam_file2)); bool rebuild = crop_left || crop_right || inputs_changed || (asp::stereo_settings().max_disp_spread > 0.0); try { vw_log().console_log().rule_set().add_rule(-1,"fileio"); if (!fs::exists(sub_disp_file)) // Check for existence, or else an error will be printed rebuild = true; else DiskImageView<PixelMask<Vector2f>> test(sub_disp_file); vw_settings().reload_config(); } catch (vw::IOErr const& e) { vw_settings().reload_config(); rebuild = true; } catch (vw::ArgumentErr const& e) { // Throws on a corrupted file. vw_settings().reload_config(); rebuild = true; } if (rebuild) { // It will be rebuilt except for seed-mode 3 when sparse_disp takes care of it. produce_lowres_disparity(opt); } else { vw_out() << "\t--> Using cached low-resolution disparity: " << sub_disp_file << "\n"; } } vw_out() << "\n[ " << current_posix_time_string() << " ]: LOW-RESOLUTION CORRELATION FINISHED\n"; } // End lowres_correlation /// This correlator takes a low resolution disparity image as an input /// so that it may narrow its search range for each tile that is processed. class SeededCorrelatorView: public ImageViewBase<SeededCorrelatorView> { ImageViewRef<PixelGray<float>> m_left_image; ImageViewRef<PixelGray<float>> m_right_image; ImageViewRef<vw::uint8> m_left_mask; ImageViewRef<vw::uint8> m_right_mask; DispImageRef m_sub_disp; DispImageRef m_sub_disp_spread; ImageView<PixelMask<float>> * m_lr_disp_diff; // Settings Vector2 m_upscale_factor; BBox2i m_seed_bbox; Vector2i m_kernel_size; stereo::CostFunctionType m_cost_mode; int m_corr_timeout; double m_seconds_per_op; Vector2 m_region_ul; // the upper-left corner of the region containing all pixels to process public: // Set these input types here instead of making them template arguments typedef ImageViewRef<PixelGray<float>> ImageType; typedef ImageViewRef<vw::uint8> MaskType; typedef ImageType::pixel_type InputPixelType; SeededCorrelatorView(ImageType const& left_image, ImageType const& right_image, MaskType const& left_mask, MaskType const& right_mask, DispImageRef const& sub_disp, DispImageRef const& sub_disp_spread, Vector2i const& kernel_size, stereo::CostFunctionType cost_mode, int corr_timeout, double seconds_per_op, Vector2i const& region_ul, ImageView<PixelMask<float>> * lr_disp_diff): m_left_image(left_image.impl()), m_right_image(right_image.impl()), m_left_mask (left_mask.impl ()), m_right_mask (right_mask.impl ()), m_sub_disp(sub_disp.impl()), m_sub_disp_spread(sub_disp_spread.impl()), m_kernel_size(kernel_size), m_cost_mode(cost_mode), m_corr_timeout(corr_timeout), m_seconds_per_op(seconds_per_op), m_region_ul(region_ul), m_lr_disp_diff(lr_disp_diff) { m_upscale_factor[0] = double(m_left_image.cols()) / m_sub_disp.cols(); m_upscale_factor[1] = double(m_left_image.rows()) / m_sub_disp.rows(); m_seed_bbox = bounding_box(m_sub_disp); } // Image View interface typedef PixelMask<Vector2f> pixel_type; typedef pixel_type result_type; typedef ProceduralPixelAccessor<SeededCorrelatorView> pixel_accessor; inline int32 cols () const { return m_left_image.cols(); } inline int32 rows () const { return m_left_image.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const { vw_throw(NoImplErr() << "SeededCorrelatorView::operator()(...) is not implemented"); return pixel_type(); } /// Does the work typedef CropView<ImageView<pixel_type>> prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); // User strategies BBox2 local_search_range; if (stereo_settings().seed_mode > 0) { // The low-res version of bbox BBox2i seed_bbox(elem_quot(bbox.min(), m_upscale_factor), elem_quot(bbox.max(), m_upscale_factor)); seed_bbox.expand(1); seed_bbox.crop(m_seed_bbox); // Get the disparity range in d_sub corresponding to this tile. VW_OUT(DebugMessage, "stereo") << "\nGetting disparity range for : " << seed_bbox << "\n"; DispImageRef disparity_in_box = crop(m_sub_disp, seed_bbox); local_search_range = stereo::get_disparity_range(disparity_in_box); bool has_sub_disp_spread = (m_sub_disp_spread.cols() != 0 && m_sub_disp_spread.rows() != 0); // Sanity check: If m_sub_disp_spread was provided, it better have the same size as sub_disp. if (has_sub_disp_spread && m_sub_disp_spread.cols() != m_sub_disp.cols() && m_sub_disp_spread.rows() != m_sub_disp.rows()){ vw_throw(ArgumentErr() << "D_sub and D_sub_spread must have equal sizes.\n"); } if (has_sub_disp_spread) { // Expand the disparity range by m_sub_disp_spread. DispImageRef spread_in_box = crop(m_sub_disp_spread, seed_bbox); BBox2 spread = stereo::get_disparity_range(spread_in_box); // The spread may be negative if the box is empty spread.max()[0] = std::max(spread.max()[0], 0.0); spread.max()[1] = std::max(spread.max()[1], 0.0); local_search_range.min() -= spread.max(); local_search_range.max() += spread.max(); } //endif has_sub_disp_spread local_search_range = grow_bbox_to_int(local_search_range); // Expand local_search_range by 1. This is necessary since // m_sub_disp is integer-valued, and perhaps the search // range was supposed to be a fraction of integer bigger. local_search_range.expand(1); // Scale the search range to full-resolution local_search_range.min() = floor(elem_prod(local_search_range.min(),m_upscale_factor)); local_search_range.max() = ceil (elem_prod(local_search_range.max(),m_upscale_factor)); // If the user specified a search range limit, apply it here. if ((stereo_settings().corr_search_limit.min() != Vector2i()) || (stereo_settings().corr_search_limit.max() != Vector2i())) { local_search_range.crop(stereo_settings().corr_search_limit); vw_out() << "\t--> Local search range constrained to: " << local_search_range << "\n"; } } else { // seed mode == 0 local_search_range = stereo_settings().search_range; } SemiGlobalMatcher::SgmSubpixelMode sgm_subpixel_mode = get_sgm_subpixel_mode(); Vector2i sgm_search_buffer = stereo_settings().sgm_search_buffer; // Now we are ready to actually perform correlation. const int rm_half_kernel = 5; // Filter kernel size used by CorrelationView vw::stereo::PrefilterModeType prefilter_mode = static_cast<vw::stereo::PrefilterModeType>(stereo_settings().pre_filter_mode); DispImageRef disparity_map = stereo::pyramid_correlate(m_left_image, m_right_image, m_left_mask, m_right_mask, prefilter_mode, stereo_settings().slogW, local_search_range, m_kernel_size, m_cost_mode, m_corr_timeout, m_seconds_per_op, stereo_settings().xcorr_threshold, stereo_settings().min_xcorr_level, rm_half_kernel, stereo_settings().corr_max_levels, stereo_alg, stereo_settings().sgm_collar_size, sgm_subpixel_mode, sgm_search_buffer, stereo_settings().corr_memory_limit_mb, stereo_settings().corr_blob_filter_area, m_lr_disp_diff, m_region_ul, stereo_settings().stereo_debug); // Crop the disparity to given box, bringing all the computation in the box // in memory. ImageView<pixel_type> cropped_disp = crop(disparity_map, bbox); // Place the result in the appropriate place in the virtual image return CropView<ImageView<result_type>>(cropped_disp, -bbox.min().x(), -bbox.min().y(), cols(), rows()); } // End function prerasterize_helper template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class SeededCorrelatorView /// Stereo correlation function using ASP's block-matching and MGM/SGM /// algorithms which can handle a 2D disparity. void stereo_correlation_2D(ASPGlobalOptions& opt) { // The first thing we will do is compute the low-resolution correlation. // Note that even when we are told to skip low-resolution correlation, // we must still go through the motions when seed_mode is 0, to be // able to get a search range, even though we don't write D_sub then. if (!stereo_settings().skip_low_res_disparity_comp || stereo_settings().seed_mode == 0) lowres_correlation(opt); if (stereo_settings().compute_low_res_disparity_only) return; // Just computed the low-res disparity, so quit. std::string d_sub_file = opt.out_prefix + "-D_sub.tif"; std::string spread_file = opt.out_prefix + "-D_sub_spread.tif"; // Load D_sub ImageView<PixelMask<Vector2f>> sub_disp; vw::Vector2 upsample_scale; if (stereo_settings().seed_mode > 0) load_D_sub_and_scale(opt.out_prefix, d_sub_file, sub_disp, upsample_scale); // Load D_sub_spread DispImageRef sub_disp_spread; if (stereo_settings().seed_mode == 2 || stereo_settings().seed_mode == 3) { // D_sub_spread is mandatory for seed_mode 2 and 3. sub_disp_spread = DiskImageView<PixelMask<Vector2f>>(spread_file); } else if (stereo_settings().seed_mode == 1) { // D_sub_spread is optional for seed_mode 1, we use it only if it is provided. if (fs::exists(spread_file)) { try { sub_disp_spread = DiskImageView<PixelMask<Vector2f>>(spread_file); } catch (...) {} } } // If the user set --max-disp-spread, filter by it again in each process, // as maybe the D_sub on disk was from an older run with this filter not // applied. if (asp::stereo_settings().seed_mode > 0 && asp::stereo_settings().max_disp_spread > 0.0) asp::dispSpreadFilter(sub_disp, asp::stereo_settings().max_disp_spread, upsample_scale); bool verbose = false; // We already printed the message above read_search_range_from_D_sub(sub_disp, upsample_scale, verbose); // If the user specified a search range limit, apply it here. if ((stereo_settings().corr_search_limit.min() != Vector2i()) || (stereo_settings().corr_search_limit.max() != Vector2i())) { stereo_settings().search_range.crop(stereo_settings().corr_search_limit); vw_out() << "\t--> Detected search range constrained to: " << stereo_settings().search_range << "\n"; } // Load data for full-resolution processing std::string left_image_file = opt.out_prefix + "-L.tif"; std::string right_image_file = opt.out_prefix + "-R.tif"; boost::shared_ptr<DiskImageResource> left_rsrc (vw::DiskImageResourcePtr(left_image_file)), right_rsrc(vw::DiskImageResourcePtr(right_image_file)); // Load the normalized images. DiskImageView<PixelGray<float>> left_disk_image(left_rsrc), right_disk_image(right_rsrc); DiskImageView<vw::uint8> Lmask(opt.out_prefix + "-lMask.tif"), Rmask(opt.out_prefix + "-rMask.tif"); stereo::CostFunctionType cost_mode = get_cost_mode_value(); Vector2i kernel_size = stereo_settings().corr_kernel; BBox2i left_trans_crop_win = stereo_settings().trans_crop_win; int corr_timeout = stereo_settings().corr_timeout; double seconds_per_op = 0.0; if (corr_timeout > 0) seconds_per_op = calc_seconds_per_op(cost_mode, kernel_size); // Prepare for saving the LR to RL disparity difference. ImageView<PixelMask<float>> * lr_disp_diff_ptr = NULL; ImageView<PixelMask<float>> lr_disp_diff; Vector2i region_ul = left_trans_crop_win.min(); if (stereo_settings().save_lr_disp_diff) { // This image is allocated fully in memory, so need to check if it fits. if (left_trans_crop_win.width() > 20000 || left_trans_crop_win.height() > 20000) vw_throw(ArgumentErr() << "Detected an unreasonably large image. Use " << "parallel_stereo (with reasonably-sized tiles) if desired to invoke " << "--save-left-right-disparity-difference.\n"); lr_disp_diff.set_size(left_trans_crop_win.width(), left_trans_crop_win.height()); for (int col = 0; col < lr_disp_diff.cols(); col++) { for (int row = 0; row < lr_disp_diff.rows(); row++) { lr_disp_diff(col, row) = 0; lr_disp_diff(col, row).invalidate(); } } lr_disp_diff_ptr = &lr_disp_diff; } // Set up the reference to the stereo disparity code // - Processing is limited to left_trans_crop_win for use with parallel_stereo. DispImageRef fullres_disparity = crop(SeededCorrelatorView(left_disk_image, right_disk_image, Lmask, Rmask, sub_disp, sub_disp_spread, kernel_size, cost_mode, corr_timeout, seconds_per_op, region_ul, lr_disp_diff_ptr), left_trans_crop_win); // With SGM, we must do the entire image chunk as one // tile. Otherwise, if it gets done in smaller tiles, there will be // artifacts at tile boundaries. vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); bool using_sgm = (stereo_alg > vw::stereo::VW_CORRELATION_BM && stereo_alg < vw::stereo::VW_CORRELATION_OTHER); if (using_sgm) { Vector2i image_size = bounding_box(fullres_disparity).size(); int max_dim = std::max(image_size[0], image_size[1]); if (stereo_settings().corr_tile_size_ovr < max_dim) vw_throw(ArgumentErr() << "Error: SGM processing is not permitted with " << "a tile size smaller than the image!\n" << "Value of --corr-tile-size is " << stereo_settings().corr_tile_size_ovr << " but image size is " << image_size << ".\n" << "Increase --corr-tile-size so the entire image fits in one tile, or " << "use parallel_stereo. Note that making --corr-tile-size " << "larger than 9000 or so may cause GDAL to crash.\n\n"); } // Provide the user with some feedback of what we are actually going to use. // This does not make sense for local_epipolar alignment. if (stereo_settings().alignment_method != "local_epipolar") { vw_out() << "\t--------------------------------------------------\n"; vw_out() << "\t Kernel size: " << stereo_settings().corr_kernel << "\n"; vw_out() << "\t Search range: " << stereo_settings().search_range << "\n"; vw_out() << "\t Cost mode: " << stereo_settings().cost_mode << "\n"; vw_out(DebugMessage) << "\t XCorr threshold: " << stereo_settings().xcorr_threshold << "\n"; vw_out(DebugMessage) << "\t Prefilter: " << stereo_settings().pre_filter_mode << "\n"; vw_out(DebugMessage) << "\t Prefilter size: " << stereo_settings().slogW << "\n"; vw_out() << "\t--------------------------------------------------\n"; } cartography::GeoReference left_georef; bool has_left_georef = read_georeference(left_georef, opt.out_prefix + "-L.tif"); bool has_nodata = false; double nodata = -32768.0; std::string d_file = opt.out_prefix + "-D.tif"; vw_out() << "Writing: " << d_file << "\n"; auto tpc = TerminalProgressCallback("asp", "\t--> Correlation :"); if (stereo_alg > vw::stereo::VW_CORRELATION_BM) { // SGM and external algorithms perform subpixel correlation in // this step, so write out floats. // Rasterize the image first as one block, then write it out using multiple small blocks. // - If we don't do this, the output image file is not tiled and handles very slowly. // - This is possible because with SGM the image must be small enough to fit in memory. ImageView<PixelMask<Vector2f>> result = fullres_disparity; opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(), // small block size ASPGlobalOptions::rfne_tile_size()); vw::cartography::block_write_gdal_image(d_file, result, has_left_georef, left_georef, has_nodata, nodata, opt, tpc); } else { // Otherwise cast back to integer results to save on storage space. vw::cartography::block_write_gdal_image(d_file, pixel_cast<PixelMask<Vector2i>>(fullres_disparity), has_left_georef, left_georef, has_nodata, nodata, opt, tpc); } if (stereo_settings().save_lr_disp_diff) { bool has_lr_disp_nodata = true; float lr_disp_nodata = -32768.0; std::string lr_disp_diff_file = opt.out_prefix + "-L-R-disp-diff.tif"; vw_out() << "Writing: " << lr_disp_diff_file << "\n"; opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(), // small block size ASPGlobalOptions::rfne_tile_size()); auto tpc = TerminalProgressCallback("asp", "\t--> L-R-disp-diff :"); vw::cartography::block_write_gdal_image(lr_disp_diff_file, apply_mask(lr_disp_diff, lr_disp_nodata), has_left_georef, left_georef, has_lr_disp_nodata, lr_disp_nodata, opt, tpc); } return; } // End function stereo_correlation_2D // Adjust for the fact that tile_crop_win may not be the same as left_trans_crop_win. template <class PixelT> void adjustForCropWin(ImageView<PixelMask<PixelT>> const& input_img, BBox2i const& tile_crop_win, BBox2i const& left_trans_crop_win, ImageView<PixelMask<PixelT>>& out_img) { out_img = vw::ImageView<PixelMask<PixelT>>(tile_crop_win.width(), tile_crop_win.height()); for (int col = 0; col < tile_crop_win.width(); col++) { for (int row = 0; row < tile_crop_win.height(); row++) { Vector2 pix = Vector2(col, row) + tile_crop_win.min(); if (left_trans_crop_win.contains(pix)) { out_img(col, row) = input_img(pix.x() - left_trans_crop_win.min().x(), pix.y() - left_trans_crop_win.min().y()); } else { out_img(col, row) = PixelMask<PixelT>(); out_img(col, row).invalidate(); } } } } // A small function we will invoke repeatedly to save the disparity void save_disparity(ASPGlobalOptions& opt, ImageView<PixelMask<Vector2f>> unaligned_disp_2d, std::string const& out_disp_file) { vw::cartography::GeoReference georef; bool has_georef = false; bool has_nodata = false; double nodata = -32768.0; vw_out() << "Writing: " << out_disp_file << "\n"; opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(), ASPGlobalOptions::rfne_tile_size()); opt.gdal_options["TILED"] = "YES"; vw::cartography::block_write_gdal_image(out_disp_file, unaligned_disp_2d, has_georef, georef, has_nodata, nodata, opt, TerminalProgressCallback ("asp", "\t--> Correlation :")); } // A small function to save the l-r-diff file void save_lr_disp_diff(ASPGlobalOptions& opt, vw::ImageView<vw::PixelMask<float>> unaligned_lr_disp_diff, std::string const& lr_disp_diff_file) { vw::cartography::GeoReference georef; bool has_georef = false; bool has_lr_disp_nodata = true; float lr_disp_nodata = -32768.0; vw_out() << "Writing: " << lr_disp_diff_file << "\n"; opt.raster_tile_size = Vector2i(ASPGlobalOptions::rfne_tile_size(), // small block size ASPGlobalOptions::rfne_tile_size()); opt.gdal_options["TILED"] = "YES"; auto tpc = TerminalProgressCallback("asp", "\t--> L-R-disp-diff :"); vw::cartography::block_write_gdal_image(lr_disp_diff_file, apply_mask(unaligned_lr_disp_diff, lr_disp_nodata), has_georef, georef, has_lr_disp_nodata, lr_disp_nodata, opt, tpc); } // Write an empty disparity of given dimensions void save_empty_disparity(ASPGlobalOptions& opt, vw::BBox2i const& crop_win, std::string const& out_disp_file) { vw::ImageView<PixelMask<Vector2f>> disp; disp.set_size(crop_win.width(), crop_win.height()); for (int col = 0; col < disp.cols(); col++) { for (int row = 0; row < disp.rows(); row++) { disp(col, row) = PixelMask<Vector2f>(); disp(col, row).invalidate(); } } save_disparity(opt, disp, out_disp_file); } /// Stereo correlation function using 1D correlation algorithms /// (implemented in ASP and external ones). Local alignment will be /// performed before those algorithms are invoked. // TODO(oalexan1): This function is too long and needs to be split. void stereo_correlation_1D(ASPGlobalOptions& opt) { // The low-res disparity computation, if desired, happens on the full images, // which is incompatible with local alignment and stereo for pairs of tiles. if (stereo_settings().compute_low_res_disparity_only) return; // The dimensions of the tile and the final disparity BBox2i tile_crop_win = stereo_settings().trans_crop_win; // The left_trans_crop_win will be obtained by tile_crop_win by maybe growing it a bit BBox2i left_trans_crop_win, right_trans_crop_win; int max_tile_size = stereo_settings().corr_tile_size_ovr; Matrix<double> left_local_mat = math::identity_matrix<3>(); Matrix<double> right_local_mat = math::identity_matrix<3>(); std::string left_aligned_file, right_aligned_file; int min_disp = -1, max_disp = -1; std::string out_disp_file = opt.out_prefix + "-D.tif"; // Ensure the disparity is always recreated if (fs::exists(out_disp_file)) fs::remove(out_disp_file); std::string alg_name, user_opts; asp::parse_stereo_alg_name_and_opts(stereo_settings().stereo_algorithm, alg_name, user_opts); vw_out() << "Using algorithm: " << alg_name << std::endl; // The msmw and msmw2 algorithms expects the input tif images to not // be tiled. Accommodate it, then revert to the original when this // is no longer necessary. Vector2 orig_tile_size = opt.raster_tile_size; bool write_nodata = true; if (alg_name == "msmw" || alg_name == "msmw2") { opt.gdal_options["TILED"] = "NO"; opt.raster_tile_size = vw::Vector2(-1, -1); write_nodata = false; // To avoid warnings from the tif reader in msmw } double left_extra_factor = 1.0, right_extra_factor = 1.0; bool success = false; std::string err_msg; boost::shared_ptr<camera::CameraModel> left_camera_model, right_camera_model; opt.session->camera_models(left_camera_model, right_camera_model); bool use_sphere_for_non_earth = true; cartography::Datum datum = opt.session->get_datum(left_camera_model.get(), use_sphere_for_non_earth); for (int attempt = 1; attempt <= 1; attempt++) { // TODO(oalexan1): The idea of the expansion of the domains need more thinking. // In particular, need to proportionally expand how many interest points are // found, as otherwise, if the density of interest points is different // among the left and right images, the number of successful matches // will actually go down. In either case, need to try without expansion // first and only expand in subsequent attempts. A first attempt at // expansion should expand the right box, in case it is not found // accurately based on input disparity and interest points. //if (attempt == 2) { // vw_out() << "Local alignment attempt: " << attempt << ".\n"; // left_extra_factor = 1.0; // right_extra_factor = 2.0; // } try { local_alignment(// Inputs opt, alg_name, opt.session->name(), max_tile_size, left_extra_factor, right_extra_factor, tile_crop_win, write_nodata, left_camera_model.get(), right_camera_model.get(), datum, // Outputs left_trans_crop_win, right_trans_crop_win, left_local_mat, right_local_mat, left_aligned_file, right_aligned_file, min_disp, max_disp); success = true; break; } catch(std::exception const& e){ err_msg = e.what(); } } if (!success) { // If this tile fails, write an empty disparity vw_out() << err_msg << std::endl; save_empty_disparity(opt, tile_crop_win, out_disp_file); return; } vw_out() << "Min and max disparities: " << min_disp << ", " << max_disp << ".\n"; // If the user specified a search range limit, apply it here. if ((stereo_settings().corr_search_limit.min() != Vector2i()) || (stereo_settings().corr_search_limit.max() != Vector2i())) { int min_limit = stereo_settings().corr_search_limit.min().x(); int max_limit = stereo_settings().corr_search_limit.max().x(); min_disp = std::max(min_disp, min_limit); max_disp = std::min(max_disp, max_limit); vw_out() << "Min and max_disparities constrained, based on " << "--corr-search-limit, to: " << min_disp << ", " << max_disp << ".\n"; } vw::ImageView<PixelMask<Vector2f>> unaligned_disp_2d; vw::ImageView<vw::PixelMask<float>> unaligned_lr_disp_diff; vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); if (stereo_alg < vw::stereo::VW_CORRELATION_OTHER) { // ASP algorithms // Mask the locally alignment images which were written with NaN nodata. float nan = std::numeric_limits<float>::quiet_NaN(); ImageView<PixelMask<PixelGray<float>>> left_image = vw::create_mask(DiskImageView<PixelGray<float>>(left_aligned_file), nan); ImageView<PixelMask<PixelGray<float>>> right_image = vw::create_mask(DiskImageView<PixelGray<float>>(right_aligned_file), nan); ImageView<vw::uint8> left_mask = channel_cast_rescale<vw::uint8>(select_channel(left_image, 1)); ImageView<vw::uint8> right_mask = channel_cast_rescale<vw::uint8>(select_channel(right_image, 1)); stereo::CostFunctionType cost_mode = get_cost_mode_value(); Vector2i kernel_size = stereo_settings().corr_kernel; int corr_timeout = stereo_settings().corr_timeout; stereo_settings().seed_mode = 0; // no seed // The search range. Put here 2 for the upper limit in y as the // interval in y is [lower_limit, upper_limit). stereo_settings().search_range.min() = vw::Vector2i(min_disp, -1); stereo_settings().search_range.max() = vw::Vector2i(max_disp, 2); double seconds_per_op = 0.0; if (corr_timeout > 0) seconds_per_op = calc_seconds_per_op(cost_mode, kernel_size); // Start with no seed. The current tile is rather small, which, when coupled // with pyramid levels is enough to get away without a seed. And the external // methods can't use a seed anyway. ImageView<PixelMask<Vector2f>> sub_disp; ImageView<PixelMask<Vector2f>> sub_disp_spread; // Prepare for saving the LR to RL disparity difference. ImageView<PixelMask<float>> * lr_disp_diff_ptr = NULL; ImageView<PixelMask<float>> lr_disp_diff; Vector2i region_ul(0, 0); // We compute the disparity on the full tile below, not a crop if (stereo_settings().save_lr_disp_diff) { lr_disp_diff.set_size(left_image.cols(), left_image.rows()); for (int col = 0; col < lr_disp_diff.cols(); col++) { for (int row = 0; row < lr_disp_diff.rows(); row++) { lr_disp_diff(col, row) = 0; lr_disp_diff(col, row).invalidate(); } } lr_disp_diff_ptr = &lr_disp_diff; } // Find the disparity ImageView<PixelMask<Vector2f> > aligned_disp_2d = crop(SeededCorrelatorView(apply_mask(left_image, nan), // left image apply_mask(right_image, nan), // right image left_mask, right_mask, sub_disp, sub_disp_spread, kernel_size, cost_mode, corr_timeout, seconds_per_op, region_ul, lr_disp_diff_ptr), bounding_box(left_image)); if (stereo_settings().local_alignment_debug) { // Write the aligned 2D disparity to disk, for debugging vw::cartography::GeoReference georef; bool has_georef = false; bool has_nodata = false; double nodata = std::numeric_limits<float>::quiet_NaN(); std::string aligned_disp_file = opt.out_prefix + "-aligned-disparity_2D.tif"; vw_out() << "Writing: " << aligned_disp_file << "\n"; vw::cartography::block_write_gdal_image(aligned_disp_file, aligned_disp_2d, has_georef, georef, has_nodata, nan, opt, TerminalProgressCallback ("asp", "\t--> Disparity :")); } // Undo the alignment asp::unalign_2d_disparity(// Inputs aligned_disp_2d, left_trans_crop_win, right_trans_crop_win, left_local_mat, right_local_mat, // Output unaligned_disp_2d); if (stereo_settings().save_lr_disp_diff) asp::unalign_masked_image(// Inputs lr_disp_diff, left_trans_crop_win, left_local_mat, // Output unaligned_lr_disp_diff); } else if (stereo_alg == vw::stereo::VW_CORRELATION_OTHER) { // External algorithms using 1D disparity // TODO(oalexan1): Make this into a function // Set the default options for all algorithms std::string default_opts; if (alg_name == "mgm") { default_opts = std::string("MEDIAN=1 CENSUS_NCC_WIN=5 ") + "USE_TRUNCATED_LINEAR_POTENTIALS=1 TSGM=3 -s vfit -t census -O 8 " + "-r " + vw::num_to_str(min_disp) + " -R " + vw::num_to_str(max_disp); } else if (alg_name == "opencv_bm") { default_opts = std::string("-block_size 21 -texture_thresh 10 -prefilter_cap 31 ") + "-uniqueness_ratio 15 -speckle_size 100 -speckle_range 32 -disp12_diff 1"; } else if (alg_name == "opencv_sgbm") { default_opts = std::string("-mode sgbm -block_size 3 -P1 8 -P2 32 -prefilter_cap 63 ") + "-uniqueness_ratio 10 -speckle_size 100 -speckle_range 32 -disp12_diff 1"; } else if (alg_name == "msmw") { default_opts = std::string("-i 1 -n 4 -p 4 -W 5 -x 9 -y 9 -r 1 -d 1 -t -1 ") + "-s 0 -b 0 -o 0.25 -f 0 -P 32 " + "-m " + vw::num_to_str(min_disp) + " -M " + vw::num_to_str(max_disp); } else if (alg_name == "msmw2") { default_opts = std::string("-i 1 -n 4 -p 4 -W 5 -x 9 -y 9 -r 1 -d 1 -t -1 ") + "-s 0 -b 0 -o -0.25 -f 0 -P 32 -D 0 -O 25 -c 0 " + "-m " + vw::num_to_str(min_disp) + " -M " + vw::num_to_str(max_disp); } else if (alg_name == "libelas"){ // For some reasons libelas fails with a tight search range int extra = 10 + std::max(0, min_disp); vw_out() << "For libelas, grow the search range on each end by " << extra << ".\n"; default_opts = std::string("-support_threshold 0.85 -support_texture 10 ") + "-candidate_stepsize 5 -incon_window_size 5 " + "-incon_threshold 5 -incon_min_support 5 " + "-add_corners 0 -grid_size 20 " + "-beta 0.02 -gamma 3 -sigma 1 -sradius 2 " + "-match_texture 1 -lr_threshold 2 -speckle_sim_threshold 1 " + "-speckle_size 200 -ipol_gap_width 3 -filter_median 0 " + "-filter_adaptive_mean 1 -postprocess_only_left 0 " + "-disp_min " + vw::num_to_str(min_disp - extra) + " " + "-disp_max " + vw::num_to_str(max_disp + extra); }else { // No defaults for other algorithms } // Parse the algorithm options and environmental variables from the default // options and append the user options (the latter take precedence). std::string options, env_vars; std::map<std::string, std::string> option_map; std::map<std::string, std::string> env_vars_map; asp::extract_opts_and_env_vars(default_opts + " " + user_opts, options, option_map, env_vars, env_vars_map); std::string aligned_disp_file = opt.out_prefix + "-aligned-disparity.tif"; std::string mask_file = opt.out_prefix + "-disparity-mask.tif"; // Ensure the disparity is always recreated if (fs::exists(aligned_disp_file)) fs::remove(aligned_disp_file); if (fs::exists(mask_file)) fs::remove(mask_file); vw::ImageView<float> aligned_disp; if (alg_name == "opencv_bm") { // Call the OpenCV BM algorithm std::string mode = "bm"; int dummy_p1 = -1, dummy_p2 = -1; // Only needed for SGBM call_opencv_bm_or_sgbm(left_aligned_file, right_aligned_file, mode, atoi(option_map["-block_size"].c_str()), min_disp, max_disp, atoi(option_map["-prefilter_cap"].c_str()), atoi(option_map["-uniqueness_ratio"].c_str()), atoi(option_map["-speckle_size"].c_str()), atoi(option_map["-speckle_range"].c_str()), atoi(option_map["-disp12_diff"].c_str()), atoi(option_map["-texture_thresh"].c_str()), dummy_p1, dummy_p2, opt, aligned_disp_file, // Output aligned_disp); } else if (alg_name == "opencv_sgbm") { // Call the OpenCV SGBM algorithm int dummy_texture_thresh = -1; // only needed for BM call_opencv_bm_or_sgbm(left_aligned_file, right_aligned_file, option_map["-mode"], atoi(option_map["-block_size"].c_str()), min_disp, max_disp, atoi(option_map["-prefilter_cap"].c_str()), atoi(option_map["-uniqueness_ratio"].c_str()), atoi(option_map["-speckle_size"].c_str()), atoi(option_map["-speckle_range"].c_str()), atoi(option_map["-disp12_diff"].c_str()), dummy_texture_thresh, atoi(option_map["-P1"].c_str()), atoi(option_map["-P2"].c_str()), opt, aligned_disp_file, // Output aligned_disp); } else { // Read the list of plugins std::map<std::string, std::string> plugins, plugin_libs; asp::parse_plugins_list(plugins, plugin_libs); auto it1 = plugins.find(alg_name); auto it2 = plugin_libs.find(alg_name); if (it1 == plugins.end() || it2 == plugin_libs.end()) vw_throw(ArgumentErr() << "Could not lookup plugin: " << alg_name << ".\n"); std::string plugin_path = it1->second; std::string plugin_lib = it2->second; // Set up the environemnt asp::setEnvVar("LD_LIBRARY_PATH", plugin_lib); // For Linux asp::setEnvVar("DYLD_LIBRARY_PATH", plugin_lib); // For OSX vw_out() << "Path to libraries: " << plugin_lib << std::endl; for (auto it = env_vars_map.begin(); it != env_vars_map.end(); it++) asp::setEnvVar(it->first, it->second); // Call an external program which will write the disparity to disk std::string cmd = plugin_path + " " + options + " " + left_aligned_file + " " + right_aligned_file + " " + aligned_disp_file; if (alg_name == "msmw" || alg_name == "msmw2") cmd += " " + mask_file; // Provide the mask file int timeout = stereo_settings().corr_timeout; if (env_vars != "") vw_out() << "Using environmental variables: " << env_vars << "\n"; vw_out() << "Executing: " << cmd << "\n"; // Use a system call system(cmd.c_str()); // Read the disparity from disk. This may fail, for example, the // disparity may time out or it may not have good data. In that // case just make an empty disparity, as we don't want // the processing of the full image to fail because of a tile. try { aligned_disp = DiskImageView<float>(aligned_disp_file); } catch(std::exception const& e){ // If this tile fails, write an empty disparity vw_out() << e.what() << std::endl; save_empty_disparity(opt, tile_crop_win, out_disp_file); return; } if (alg_name == "msmw" || alg_name == "msmw2") { // TODO(oalexan1): Make this into a function // Apply the mask, which for this algorithm is stored separately. // For that need to read things in memory. ImageView<float> local_disp(aligned_disp.cols(), aligned_disp.rows()); DiskImageView<vw::uint8> mask(mask_file); if (local_disp.cols() != mask.cols() || local_disp.rows() != mask.rows()) vw_throw(ArgumentErr() << "Expecting that the following images would " << "have the same dimensions: " << aligned_disp_file << ' ' << mask_file << ".\n"); float nan = std::numeric_limits<float>::quiet_NaN(); for (int col = 0; col < local_disp.cols(); col++) { for (int row = 0; row < local_disp.rows(); row++) { if (mask(col, row) != 0) local_disp(col, row) = aligned_disp(col, row); else local_disp(col, row) = nan; } } // Assign the image we just made to the handle aligned_disp = local_disp; } } try { // Sanity check. Temporarily load the left image. DiskImageView<float> left_image(left_aligned_file); if (aligned_disp.cols() != left_image.cols() || aligned_disp.rows() != left_image.rows() ) vw_throw(ArgumentErr() << "Expecting that the 1D disparity " << aligned_disp_file << " would have the same dimensions as the left image " << left_aligned_file << ".\n"); } catch(std::exception const& e){ // If this tile fails, write an empty disparity vw_out() << e.what() << std::endl; save_empty_disparity(opt, tile_crop_win, out_disp_file); return; } if (0) { // TODO(oalexan1): Make this into a function. Filter the disparity. // This needs more testing. // Wipe disparities which map to an invalid pixel float nan = std::numeric_limits<float>::quiet_NaN(); ImageView<PixelMask<PixelGray<float>>> left_masked_image = vw::create_mask(DiskImageView<PixelGray<float>>(left_aligned_file), nan); ImageView<PixelMask<PixelGray<float>>> right_masked_image = vw::create_mask(DiskImageView<PixelGray<float>>(right_aligned_file), nan); // invalid value for a PixelMask PixelMask<PixelGray<float>> nodata_mask = PixelMask<PixelGray<float>>(); ImageViewRef<PixelMask<PixelGray<float>>> interp_right_masked_image = interpolate(right_masked_image, BilinearInterpolation(), ValueEdgeExtension<PixelMask<PixelGray<float>>>(nodata_mask)); for (int col = 0; col < left_masked_image.cols(); col++) { for (int row = 0; row < left_masked_image.rows(); row++) { if (std::isnan(aligned_disp(col, row))) continue; // already nan // If the left pixel is not valid, the disparity cannot be valid if (!is_valid(left_masked_image(col, row))) { aligned_disp(col, row) = nan; continue; } // If the right pixel is not valid, the disparity cannot be valid Vector2 right_pix(col + aligned_disp(col, row), row); if (!is_valid(interp_right_masked_image(right_pix.x(), right_pix.y()))) aligned_disp(col, row) = nan; } } } // Undo the alignment asp::unalign_1d_disparity(// Inputs aligned_disp, left_trans_crop_win, right_trans_crop_win, left_local_mat, right_local_mat, // Output unaligned_disp_2d); } // Undo the logic needed for msmw if (alg_name == "msmw" || alg_name == "msmw2") { opt.gdal_options["TILED"] = "YES"; opt.raster_tile_size = orig_tile_size; } // Adjust for the fact that tile_crop_win may not be the same as left_trans_crop_win. vw::ImageView<PixelMask<Vector2f>> cropped_disp; adjustForCropWin(unaligned_disp_2d, tile_crop_win, left_trans_crop_win, cropped_disp); save_disparity(opt, cropped_disp, out_disp_file); // If unaligned_lr_disp_diff is not empty, adjust it and save it if (unaligned_lr_disp_diff.cols() > 0) { vw::ImageView<vw::PixelMask<float>> cropped_diff; adjustForCropWin(unaligned_lr_disp_diff, tile_crop_win, left_trans_crop_win, cropped_diff); std::string lr_disp_diff_file = opt.out_prefix + "-L-R-disp-diff.tif"; save_lr_disp_diff(opt, cropped_diff, lr_disp_diff_file); } } // End function stereo_correlation_1D int main(int argc, char* argv[]) { try { xercesc::XMLPlatformUtils::Initialize(); stereo_register_sessions(); bool verbose = false; std::vector<ASPGlobalOptions> opt_vec; std::string output_prefix; asp::parseStereoArgs(argc, argv, CorrelationDescription(), verbose, output_prefix, opt_vec); ASPGlobalOptions opt = opt_vec[0]; // Leave the number of parallel block threads equal to the default unless we // are using SGM in which case only one block at a time should be processed. // - Processing multiple blocks is possible, but it is better to use a larger blocks // with more threads applied to the single block. // - Thread handling is still a little confusing because opt.num_threads is ONLY used // to control the number of parallel image blocks written at a time. Everything else // reads directly from vw_settings().default_num_threads() vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); bool using_sgm = (stereo_alg > vw::stereo::VW_CORRELATION_BM && stereo_alg < vw::stereo::VW_CORRELATION_OTHER); opt.num_threads = vw_settings().default_num_threads(); if (using_sgm) opt.num_threads = 1; if (stereo_alg != vw::stereo::VW_CORRELATION_BM) { // SGM/MGM works best with no prefilter. That one is also turned // off in CorrelationView.h. vw_out() << "\t--> Using no pre-processing filter with stereo algorithm: " << stereo_settings().stereo_algorithm << std::endl; stereo_settings().pre_filter_mode = 0; } else { switch (stereo_settings().pre_filter_mode){ case 2: vw_out() << "\t--> Using LOG pre-processing filter with " << stereo_settings().slogW << " sigma blur.\n"; break; case 1: vw_out() << "\t--> Using subtracted mean pre-processing filter with " << stereo_settings().slogW << " sigma blur.\n"; break; default: vw_out() << "\t--> Using No pre-processing filter." << std::endl; } } // Integer correlator requires large tiles //--------------------------------------------------------- int ts = stereo_settings().corr_tile_size_ovr; // GDAL block write sizes must be a multiple to 16 so if the input value is // not a multiple of 16 increase it until it is. const int TILE_MULTIPLE = 16; if (ts % TILE_MULTIPLE != 0) ts = ((ts / TILE_MULTIPLE) + 1) * TILE_MULTIPLE; opt.raster_tile_size = Vector2i(ts, ts); vw_out() << "\n[ " << current_posix_time_string() << " ]: Stage 1 --> CORRELATION\n"; if (stereo_settings().alignment_method == "local_epipolar") { // Need to have the low-res 2D disparity to later guide the // per-tile correlation. Use here the ASP MGM algorithm as the // most reliable one, unless we do good old block-matching if (stereo_settings().compute_low_res_disparity_only) { if (stereo_settings().stereo_algorithm != "asp_bm") stereo_settings().stereo_algorithm = "asp_mgm"; stereo_correlation_2D(opt); return 0; } // This will be invoked per-tile. stereo_correlation_1D(opt); } else { // Do 2D correlation. The first time this is invoked it will // compute the low-res disparity unless told not to. stereo_correlation_2D(opt); } vw_out() << "\n[ " << current_posix_time_string() << " ]: CORRELATION FINISHED\n"; xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/stereo_dist ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2026, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ stereo_dist - Distributed stereo processing. """ import sys, argparse, subprocess, re, os, time, glob, shutil, platform, math import os.path as P # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils, asp_string_utils, asp_cmd_utils asp_system_utils.verify_python_version_is_supported() from asp_stereo_utils import * # must be after the path is altered above from asp_dist_utils import * # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] # Ensure we can look up the ASP libraries if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] if __name__ == '__main__': usage = '''stereo_dist [options] <images> [<cameras>] <output_prefix> Distributed stereo processing.\n''' + asp_system_utils.get_asp_version() p = argparse.ArgumentParser(usage=usage) p.add_argument('-v', '--version', dest='version', default=False, action='store_true', help='Display the version of software.') p.add_argument('--verbose', dest='verbose', default=False, action='store_true', help='Display the commands being executed.') p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true', help='Do not launch the jobs, only print the commands that should be run.') p.add_argument('--tile-size', dest='tile_size', default=2048, type=int, help='Size of each tile for distributed processing. This is before the padding is added.') p.add_argument('--tile-padding', dest='tile_padding', default=256, type=int, help='Padding around each tile to avoid boundary artifacts.') p.add_argument('--threads-multiprocess', dest='threads_multi', default=None, type=int, help='The number of threads to use per process when running multiple ' 'processes.') p.add_argument('--threads-singleprocess', dest='threads_single', default=None, type=int, help='The number of threads to use when running a single process ' '(PPRC and FLTR).') p.add_argument('-e', '--entry-point', dest='entry_point', default=0, type=int, help='Stereo pipeline entry point (default: 0). Values: 0=pprc, ' '1=corr, 2=blend, 3=rfne, 4=fltr, 5=tri, 6=cleanup, 7=dem, ' '8=mosaic.') p.add_argument('--stop-point', dest='stop_point', default=9, type=int, help='Stereo pipeline stop point, stop before this step ' '(default: 9).') p.add_argument('--point2dem-options', dest='point2dem_options', default='', help='Options to pass to point2dem. Can pass --orthoimage ' 'with no argument, and the L.tif file for each tile ' 'will be autocompleted. Can also pass --errorimage.') p.add_argument('--processes', dest='processes', default=None, type=int, help='The number of processes to use per node.') p.add_argument('--nodes-list', dest='nodes_list', default=None, help='A file containing the list of computing nodes, one per line. ' 'If not provided, run on the local machine.') p.add_argument('--dem', dest='dem', required=True, help='Input DEM. Required.') p.add_argument('--mapproject', dest='mapproject', default=False, action='store_true', help='Mapproject the input images onto the DEM before ' 'running stereo. The projection, grid size, and bounding ' 'box are auto-determined to be consistent for both images. ' 'These can be overridden with --t_srs, --tr, and --t_projwin.') p.add_argument('--t_srs', dest='t_srs', default=None, help='Output projection for mapprojection. A PROJ string, ' 'EPSG code, or path to a WKT file. Auto-determined if not set.') p.add_argument('--tr', dest='tr', default=None, type=float, help='Output grid size (ground sample distance) for ' 'mapprojection, in units of the projection. ' 'Auto-determined as the finer of the two images if not set.') p.add_argument('--t_projwin', dest='t_projwin', default=None, type=float, nargs=4, metavar=('XMIN', 'YMIN', 'XMAX', 'YMAX'), help='Bounding box for mapprojection in projected coordinates: ' 'xmin ymin xmax ymax. Auto-determined as the intersection of ' 'the two images if not set.') p.add_argument('--parallel-options', dest='parallel_options', default='--sshdelay 0.2', help='Options to pass directly to GNU Parallel.') # Warn about --threads being ignored if '--threads' in sys.argv: print("Ignoring the option --threads. Use --threads-multiprocess " "and --threads-singleprocess.") asp_cmd_utils.wipe_option(sys.argv, '--threads', 1) (opt, args) = p.parse_known_args() args = asp_cmd_utils.clean_args(args) if opt.version: asp_system_utils.print_version_and_exit() if not args and not opt.version: p.print_help() asp_system_utils.raise_error('Missing input files.', code=2) # Validate --t_projwin if provided. Swap min/max if in wrong order, # as some tools print bounding boxes with inverted y axis. if opt.t_projwin is not None: if opt.t_projwin[0] > opt.t_projwin[2]: opt.t_projwin[0], opt.t_projwin[2] = opt.t_projwin[2], opt.t_projwin[0] if opt.t_projwin[1] > opt.t_projwin[3]: opt.t_projwin[1], opt.t_projwin[3] = opt.t_projwin[3], opt.t_projwin[1] # Validate that --t_srs, --tr, --t_projwin are only used with --mapproject if not opt.mapproject: for name in ['--t_srs', '--tr', '--t_projwin']: val = getattr(opt, name.lstrip('-').replace('-', '_')) if val is not None: asp_system_utils.raise_error( name + ' can only be used with --mapproject.') # These are not supported as stereo_dist manages its own crop windows per tile for bad_opt in ['--left-image-crop-win', '--right-image-crop-win']: if bad_opt in args: asp_system_utils.raise_error('The option ' + bad_opt + ' is not supported by stereo_dist.') # Pass the DEM to the stereo C++ tools. When mapprojecting, defer this # until after mapprojection, as stereo_parse will complain about # non-mapprojected images with --dem. if not opt.mapproject: args.extend(['--dem', opt.dem]) # Validate --tr is in point2dem options when DEM step will run if opt.entry_point <= Step.dem < opt.stop_point and '--tr' not in opt.point2dem_options: asp_system_utils.raise_error('The option --point2dem-options must include --tr to ' 'ensure consistent grid size across all tiles.') # Set default threads if not specified if opt.threads_single is None: opt.threads_single = asp_system_utils.get_num_cpus() # Get the output prefix from stereo_parse sep = "," settings = asp_system_utils.run_and_parse_output("stereo_parse", args, sep, opt.verbose) outPrefix = settings['out_prefix'][0] # Mapproject both images onto the DEM with consistent parameters if opt.mapproject: (args, settings, outPrefix) = \ mapprojAndUpdateArgs(opt, settings, outPrefix, sep) # Run stereo_tile on all tiles for pprc only (entry_point=0, stop_point=1) if opt.entry_point <= Step.pprc < opt.stop_point: # Run stereo_parse to generate the tile list tile_params = ['--stereo-dist-tile-params', str(opt.tile_size), str(opt.tile_padding)] stereo_run('stereo_parse', args, opt, extra_args=tile_params) # The tile layout already accounts for --proj-win, so remove it to avoid # conflict with per-tile --left-image-crop-win / --right-image-crop-win asp_cmd_utils.wipe_option(args, '--proj-win', 4) # Run stereo_pprc with full images and --stop-after-stats to compute statistics only asp_cmd_utils.wipe_option(args, '--threads', 1) pprc_args = ['--stop-after-stats', '--threads', str(opt.threads_single)] stereo_run('stereo_pprc', args, opt, extra_args=pprc_args) # Do the rest of preprocessing logic per tiles runStereoTiles(opt, args, outPrefix, Step.pprc, Step.corr) # Run stereo_tile on all tiles for corr only (entry_point=1, stop_point=2) if opt.entry_point <= Step.corr < opt.stop_point: runStereoTiles(opt, args, outPrefix, Step.corr, Step.blend) # Skip blend - in distributed stereo each tile goes to point cloud/DEM independently, # then only final DEMs are merged. No cross-talk needed until DEM merging. # Run stereo_tile on all tiles for rfne only (entry_point=3, stop_point=4) if opt.entry_point <= Step.rfne < opt.stop_point: runStereoTiles(opt, args, outPrefix, Step.rfne, Step.fltr) # Run stereo_tile on all tiles for fltr only (entry_point=4, stop_point=5) if opt.entry_point <= Step.fltr < opt.stop_point: runStereoTiles(opt, args, outPrefix, Step.fltr, Step.tri) # Run stereo_tile on all tiles for tri only (entry_point=5, stop_point=6) if opt.entry_point <= Step.tri < opt.stop_point: runStereoTiles(opt, args, outPrefix, Step.tri, Step.clean) # Cleanup step (entry_point=6, stop_point=7) if opt.entry_point <= Step.clean < opt.stop_point: runStereoTiles(opt, args, outPrefix, Step.clean, Step.dem) # Run point2dem on all tiles (entry_point=7, stop_point=8) if opt.entry_point <= Step.dem < opt.stop_point: runStereoTiles(opt, args, outPrefix, Step.dem, Step.mosaic) # Mosaic per-tile DEMs into final DEM (entry_point=8, stop_point=9) if opt.entry_point <= Step.mosaic < opt.stop_point: mosaicDems(opt, outPrefix) sys.exit(0) ================================================ FILE: src/asp/Tools/stereo_fltr.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo_fltr.cc /// #include <asp/Sessions/StereoSession.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/Macros.h> #include <asp/Core/ThreadedEdgeMask.h> #include <asp/Core/AspLog.h> #include <asp/Gotcha/CBatchProc.h> #include <asp/Tools/stereo.h> #include <vw/Stereo/DisparityMap.h> #include <vw/Stereo/Algorithms.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Image/BlobIndex.h> #include <vw/Image/ErodeView.h> #include <vw/Image/InpaintView.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <xercesc/util/PlatformUtils.hpp> #include <boost/dll.hpp> #include <vw/Image/Manipulation.h> using namespace vw; using namespace asp; /// Apply a set of smoothing filters to the subpixel disparity results. template <class ImageT, class DispImageT> class TextureAwareDisparityFilter: public ImageViewBase<TextureAwareDisparityFilter<ImageT, DispImageT> >{ ImageT m_img; DispImageT m_disp_img; int m_median_filter_size; ///< Step 1: Apply a median filter of this size int m_texture_smooth_range; ///< Step 2: Compute texture measure of input image with this kernel size float m_texture_max; ///< Step 3: Perform texture-aware smoothing of the disparity. m_texture_max int m_max_smooth_kernel_size; ///< smooths more pixels, and the smooth_kernel_size increases the smoothing intensity. public: TextureAwareDisparityFilter( ImageViewBase<ImageT > const& img, ImageViewBase<DispImageT> const& disp_img, int median_filter_size, int texture_smooth_range, float texture_max, int max_smooth_kernel_size): m_img(img.impl()), m_disp_img(disp_img.impl()), m_median_filter_size(median_filter_size), m_texture_smooth_range(texture_smooth_range), m_texture_max(texture_max), m_max_smooth_kernel_size(max_smooth_kernel_size) {} // Image View interface typedef typename DispImageT::pixel_type pixel_type; typedef pixel_type result_type; typedef ProceduralPixelAccessor<TextureAwareDisparityFilter> pixel_accessor; inline int32 cols () const { return m_disp_img.cols(); } inline int32 rows () const { return m_disp_img.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); } inline pixel_type operator()( double /*i*/, double /*j*/, int32 /*p*/ = 0 ) const { vw_throw(NoImplErr() << "TextureAwareDisparityFilter::operator()(...) is not implemented"); return pixel_type(); } typedef CropView<ImageView<pixel_type> > prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { // Figure out the largest kernel expansion we need to support the filtering int max_half_kernel = m_texture_smooth_range; if (m_max_smooth_kernel_size > max_half_kernel) max_half_kernel = m_max_smooth_kernel_size; max_half_kernel += m_median_filter_size; // Don't forget we apply two kernels in succession max_half_kernel /= 2; // Rasterize both input image regions BBox2i bbox2 = bbox; bbox2.expand(max_half_kernel); bbox2.crop(bounding_box(m_img)); // Restrict to valid input area ImageView<typename ImageT::pixel_type> input_tile = crop(m_img, bbox2); ImageView<pixel_type > input_disp_tile = crop(m_disp_img, bbox2); ImageView<float> texture_image; vw::stereo::texture_measure(input_tile, texture_image, m_texture_smooth_range); //write_image( "texture_image.tif", texture_image ); ImageView<pixel_type > disp_tile_median; vw::stereo::disparity_median_filter(input_disp_tile, disp_tile_median, m_median_filter_size); ImageView<pixel_type > disp_tile_filtered; vw::stereo::texture_preserving_disparity_filter(disp_tile_median, disp_tile_filtered, texture_image, m_texture_max, m_max_smooth_kernel_size); // Fake the bounds on the returned image region return prerasterize_type(disp_tile_filtered, -bbox2.min().x(), -bbox2.min().y(), cols(), rows() ); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; template <class ImageT, class DispImageT> TextureAwareDisparityFilter<ImageT, DispImageT> texture_aware_disparity_filter( ImageViewBase<ImageT > const& img, ImageViewBase<DispImageT> const& disp_img, int median_filter_size, int texture_smooth_range, float texture_max, int max_smooth_kernel_size) { typedef TextureAwareDisparityFilter<ImageT, DispImageT> return_type; return return_type(img.impl(), disp_img.impl(), median_filter_size, texture_smooth_range, texture_max, max_smooth_kernel_size); } // Erode blobs from given image by iterating through tiles, biasing // each tile by a factor of blob size, removing blobs in the tile, // then shrinking the tile back. The bias is necessary to help avoid // fragmenting (and then unnecessarily removing) blobs. template <class ImageT> class PerTileErode: public ImageViewBase<PerTileErode<ImageT> >{ ImageT m_img; public: PerTileErode( ImageViewBase<ImageT> const& img): m_img(img.impl()){} // Image View interface typedef typename ImageT::pixel_type pixel_type; typedef pixel_type result_type; typedef ProceduralPixelAccessor<PerTileErode> pixel_accessor; inline int32 cols () const { return m_img.cols(); } inline int32 rows () const { return m_img.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); } inline pixel_type operator()( double /*i*/, double /*j*/, int32 /*p*/ = 0 ) const { vw_throw(NoImplErr() << "PerTileErode::operator()(...) is not implemented"); return pixel_type(); } typedef CropView<ImageView<pixel_type> > prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { int area = stereo_settings().erode_max_size; // We look a beyond the current tile, to avoid cutting blobs // if possible. Skinny blobs will be cut though. int bias = 2*int(std::ceil(sqrt(double(area)))); BBox2i bbox2 = bbox; bbox2.expand(bias); bbox2.crop(bounding_box(m_img)); ImageView<pixel_type> tile_img = crop(m_img, bbox2); int tile_size = std::max(bbox2.width(), bbox2.height()); // don't subsplit BlobIndexThreaded smallBlobIndex(tile_img, area, tile_size); ImageView<pixel_type> clean_tile_img = applyErodeView(tile_img, smallBlobIndex); return prerasterize_type(clean_tile_img, -bbox2.min().x(), -bbox2.min().y(), cols(), rows() ); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; template <class ImageT> PerTileErode<ImageT> per_tile_erode( ImageViewBase<ImageT> const& img) { typedef PerTileErode<ImageT> return_type; return return_type( img.impl() ); } // Run several cleanup passes with desired cleanup mode. template <class ViewT> struct MultipleDisparityCleanUp { typedef ImageViewRef< typename ViewT::pixel_type > result_type; inline result_type operator()( ImageViewBase<ViewT> const& input, int N) { result_type out = input; for (int i = 0; i < N; i++){ int mode = stereo_settings().filter_mode; if (mode == 1){ out = stereo::disparity_cleanup_using_mean (out.impl(), stereo_settings().rm_half_kernel.x(), stereo_settings().rm_half_kernel.y(), stereo_settings().max_mean_diff); }else if (mode == 2){ out = stereo::disparity_cleanup_using_thresh (out.impl(), stereo_settings().rm_half_kernel.x(), stereo_settings().rm_half_kernel.y(), stereo_settings().rm_threshold, stereo_settings().rm_min_matches/100.0); }else vw_throw( ArgumentErr() << "\nExpecting value of 1 or 2 for filter-mode. " << "Got: " << mode << "\n" ); } return out; } }; template <class ImageT> void write_good_pixel_and_filtered(ImageViewBase<ImageT> const& inputview, ASPGlobalOptions const& opt) { // Write Good Pixel Map // Sub-sampling so that the user can actually view it. double sub_scale = double( std::min( inputview.impl().cols(), inputview.impl().rows() ) ) / 2048.0; if (sub_scale < 1) // Don't use a sub_scale less than one. sub_scale = 1; // Write out the good pixel map std::string goodPixelFile = opt.out_prefix + "-GoodPixelMap.tif"; vw_out() << "Writing: " << goodPixelFile << std::endl; ImageViewRef< PixelRGB<uint8> > goodPixelImage = subsample(apply_mask (copy_mask (stereo::missing_pixel_image(inputview.impl()), create_mask(DiskImageView<vw::uint8>(opt.out_prefix+"-lMask.tif"), 0) ) ), sub_scale); // Determine if we can attach geo information to the output image cartography::GeoReference left_georef; bool has_left_georef = read_georeference(left_georef, opt.out_prefix + "-L.tif"); bool has_nodata = false; double nodata = -32768.0; vw::cartography::GeoReference good_pixel_georef; if (has_left_georef) { // Account for scale. Note that goodPixelImage is not guaranteed to respect // the sub_scale factor above, hence this calculation. double good_pixel_scale = 0.5*( double(goodPixelImage.cols())/inputview.impl().cols() + double(goodPixelImage.rows())/inputview.impl().rows()); good_pixel_georef = resample(left_georef, good_pixel_scale); } vw::cartography::block_write_gdal_image ( goodPixelFile, goodPixelImage, has_left_georef, good_pixel_georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Good pixel map: ") ); bool removeSmallBlobs = (stereo_settings().erode_max_size > 0); std::string outF = opt.out_prefix + "-F.tif"; // Fill holes if(stereo_settings().enable_fill_holes) { // Generate a list of blobs below a maximum size // - This requires the entire input image to be read in // and produces a single blob list for the entire image. vw_out() << "\t--> Filling holes with inpainting method.\n"; BlobIndexThreaded smallHoleIndex( invert_mask( inputview.impl() ), stereo_settings().fill_hole_max_size, vw::vw_settings().default_tile_size(), vw::vw_settings().default_num_threads() ); vw_out() << "\t * Identified " << smallHoleIndex.num_blobs() << " holes\n"; bool use_grassfire = true; typename ImageT::pixel_type default_inpaint_val; if (!removeSmallBlobs) { // Skip small blob removal // Write out the image to disk, filling in the blobs in the process vw_out() << "Writing: " << outF << std::endl; vw::cartography::block_write_gdal_image( outF, inpaint(inputview.impl(), smallHoleIndex, use_grassfire, default_inpaint_val), has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback ("asp","\t--> Filtering: ") ); } else { // Add small blob removal step // Write out the image to disk, filling in and removing blobs in the process // - Blob removal is done second to make sure inner-blob holes are removed. vw_out() << "Writing: " << outF << std::endl; vw::cartography::block_write_gdal_image( outF, per_tile_erode (inpaint(inputview.impl(), smallHoleIndex, use_grassfire, default_inpaint_val) ), has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback ("asp","\t--> Filtering: ") ); } } else { // No hole filling if (!removeSmallBlobs) { // Skip small blob removal vw_out() << "Writing: " << outF << std::endl; vw::cartography::block_write_gdal_image( outF, inputview.impl(), has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback ("asp", "\t--> Filtering: ") ); } else { // Add small blob removal step vw_out() << "\t--> Removing small blobs.\n"; // Write out the image to disk, removing the blobs in the process vw_out() << "Writing: " << outF << std::endl; vw::cartography::block_write_gdal_image(outF, per_tile_erode(inputview.impl()), has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback ("asp","\t--> Filtering: ") ); } } // End no hole filling case } //end write_good_pixel_and_filtered void stereo_filtering(ASPGlobalOptions& opt) { std::string post_correlation_fname = opt.out_prefix+"-RD.tif"; try { // Rasterize the results so far to a temporary file on disk. // This file is deleted once we complete the second half of the // disparity map filtering process. // Apply filtering for high frequencies typedef DiskImageView<PixelMask<Vector2f> > input_type; input_type disparity_disk_image(post_correlation_fname); // Applying additional clipping from the edge. We make new // mask files to avoid a weird and tricky segfault due to ownership issues. DiskImageView<vw::uint8> left_mask ( opt.out_prefix+"-lMask.tif" ); DiskImageView<vw::uint8> right_mask( opt.out_prefix+"-rMask.tif" ); // Erode at the edge. If not set, apply some logic as below. int32 edge_buffer = stereo_settings().edge_buffer_size; if (edge_buffer < 0) { if (stereo_settings().subpixel_mode > 0 && stereo_settings().subpixel_mode <= 6) edge_buffer = max(stereo_settings().subpixel_kernel); // max of the two entries else edge_buffer = 5; // should be enough } DiskImageView<PixelGray<float>> left_disk_image (opt.out_prefix+"-L.tif"); vw_out() << "\t--> Cleaning up disparity map prior to filtering processes (" << stereo_settings().rm_cleanup_passes << " pass).\n"; // If the user wants to do no filtering at all, that amounts // to doing no passes. if (stereo_settings().filter_mode == 0) stereo_settings().rm_cleanup_passes = 0; // No Erosion step if ( stereo_settings().rm_cleanup_passes >= 1 ) { // Apply an outlier removal filter write_good_pixel_and_filtered (stereo::disparity_mask (MultipleDisparityCleanUp<input_type>() (disparity_disk_image, stereo_settings().rm_cleanup_passes), apply_mask(asp::threaded_edge_mask(left_mask, 0,edge_buffer,1024)), apply_mask(asp::threaded_edge_mask(right_mask,0,edge_buffer,1024))), opt); } else { // No cleanup passes write_good_pixel_and_filtered (stereo::disparity_mask ( texture_aware_disparity_filter(left_disk_image, disparity_disk_image, stereo_settings().median_filter_size, stereo_settings().disp_smooth_size+2, // Compute texture a little larger than smooth radius stereo_settings().disp_smooth_texture, stereo_settings().disp_smooth_size), apply_mask(asp::threaded_edge_mask(left_mask, 0,edge_buffer,1024)), apply_mask(asp::threaded_edge_mask(right_mask,0,edge_buffer,1024))), opt); } // End cleanup passes check } catch (IOErr const& e) { vw_throw( ArgumentErr() << "\nUnable to start at filtering stage -- could not read input files.\n" << e.what() << "\nExiting.\n\n" ); } } // end stereo_filtering() void gotcha_disparity_refinement(ASPGlobalOptions& opt) { // Apply Gotcha on tiles of size 1024 opt.raster_tile_size = Vector2i(ASPGlobalOptions::corr_tile_size(), ASPGlobalOptions::corr_tile_size()); // Use this much padding to ensure that the tiles processed by Gotcha overlap, // to avoid help avoid seams. int padding = ASPGlobalOptions::corr_tile_size()/4; if (stereo_settings().casp_go_param_file == "") { // Use the default CASP-GO parameter file if not provided std::string base_dir = boost::dll::program_location().parent_path().parent_path().string(); stereo_settings().casp_go_param_file = base_dir + "/share/CASP-GO_params.xml"; } if (!fs::exists(stereo_settings().casp_go_param_file)) vw_throw(ArgumentErr() << "Cannot read CASP-GO parameter file: " << stereo_settings().casp_go_param_file << "\n"); else vw_out() << "Refining the disparity using the Gotcha algorithm and parameter file: " << stereo_settings().casp_go_param_file << "\n"; // First move the current F file out of the way, as it is not possible to overwrite // it in place. std::string disp_file = opt.out_prefix + "-F.tif"; std::string disp_file_nogotcha = opt.out_prefix + "-F-nogotcha.tif"; std::string cmd = "mv " + disp_file + " " + disp_file_nogotcha; vw_out() << cmd << "\n"; system(cmd.c_str()); ImageViewRef<PixelMask<Vector2f>> filtered_disparity = opt.session->pre_pointcloud_hook(disp_file_nogotcha); // TODO(oalexan1): How about no-data pixels in the left and right images? std::string L_file = opt.out_prefix + "-L.tif"; std::string R_file = opt.out_prefix + "-R.tif"; DiskImageView<float> left_image (L_file); DiskImageView<float> right_image(R_file); // Determine if we can attach geo information to the output disparity cartography::GeoReference left_georef; bool has_left_georef = read_georeference(left_georef, L_file); bool has_nodata = false; double nodata = -32768.0; vw_out() << "Writing Gotcha-refined disparity: " << disp_file << std::endl; block_write_gdal_image(disp_file, gotcha::gotcha_refine(filtered_disparity, left_image, right_image, padding, stereo_settings().casp_go_param_file), has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback("asp","\t Gotcha: ")); } int main(int argc, char* argv[]) { try { xercesc::XMLPlatformUtils::Initialize(); vw_out() << "\n[ " << current_posix_time_string() << " ]: Stage 4 --> FILTERING\n"; stereo_register_sessions(); bool verbose = false; std::vector<ASPGlobalOptions> opt_vec; std::string output_prefix; asp::parseStereoArgs(argc, argv, FilteringDescription(), verbose, output_prefix, opt_vec); ASPGlobalOptions opt = opt_vec[0]; // Internal Processes //--------------------------------------------------------- stereo_filtering(opt); if (stereo_settings().gotcha_disparity_refinement) gotcha_disparity_refinement(opt); vw_out() << "\n[ " << current_posix_time_string() << " ]: FILTERING FINISHED\n"; xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/stereo_gui.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo_gui.cc /// #include <QApplication> #include <QWidget> #include <asp/GUI/MainWindow.h> #include <asp/GUI/GuiUtilities.h> #include <asp/GUI/GuiArgs.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/DemDisparity.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Tools/stereo.h> #include <vw/Stereo/CorrelationView.h> #include <vw/Stereo/CostFunctions.h> #include <vw/Stereo/DisparityMap.h> #include <vw/Core/CmdUtils.h> #include <vw/FileIO/FileTypes.h> // Can't do much about warnings in boost except to hide them #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include <boost/core/null_deleter.hpp> #include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> #pragma GCC diagnostic pop #include <xercesc/util/PlatformUtils.hpp> #include <omp.h> #include <thread> using namespace vw; using namespace vw::stereo; using namespace asp; namespace fs = boost::filesystem; namespace asp { // Parse the input command line arguments. We'll use this function // only when we failed to parse the arguments under the assumption // that the tool was being invoked with the stereo interface. Hence // we'll fallback to this when the tool is used as an image viewer. void parseStereoGuiArgs(int argc, char *argv[], ASPGlobalOptions& opt, std::vector<std::string> & input_files) { // Options for which we will print the help message po::options_description general_options(""); general_options.add(GUIDescription()); // All options that we will parse po::options_description all_general_options(""); // The values for these options are stored in 'opt' addAspGlobalOptions(all_general_options, opt); // The values for these are stored in stereo_settings() all_general_options.add(generate_config_file_options(opt)); po::options_description positional_options(""); po::positional_options_description positional_desc; positional_options.add_options() ("input-files", po::value< std::vector<std::string> >(), "Input files"); positional_desc.add("input-files", -1); std::string usage = "[options] <images> <output_prefix>"; bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, all_general_options, positional_options, positional_desc, usage, allow_unregistered, unregistered); // Add the options to the usage std::ostringstream os; os << usage << general_options; usage = os.str(); // Store the files if (vm.count("input-files") > 0) input_files = vm["input-files"].as<std::vector<std::string>>(); else input_files.clear(); // no input files, will be read from nvm later // Interpret the the last two coordinates of the crop win boxes as // width and height rather than max_x and max_y. BBox2i bl = stereo_settings().left_image_crop_win; BBox2i br = stereo_settings().right_image_crop_win; stereo_settings().left_image_crop_win = BBox2i(bl.min().x(), bl.min().y(), bl.max().x(), bl.max().y()); stereo_settings().right_image_crop_win = BBox2i(br.min().x(), br.min().y(), br.max().x(), br.max().y()); // Adjust the zoom win dimensions auto & zoom_win = asp::stereo_settings().zoom_proj_win; // alias if (zoom_win.min().x() > zoom_win.max().x()) std::swap(zoom_win.min().x(), zoom_win.max().x()); if (zoom_win.min().y() > zoom_win.max().y()) std::swap(zoom_win.min().y(), zoom_win.max().y()); // Option --zoom-proj-win implies --zoom-all-to-same-region if (!asp::stereo_settings().zoom_proj_win.empty()) asp::stereo_settings().zoom_all_to_same_region = true; } // Inherit from QApplication to be able to over-ride the notify() method // that throws exceptions. class StereoApplication: public QApplication { public: StereoApplication(int& argc, char** argv): QApplication(argc, argv) {} virtual bool notify(QObject *receiver, QEvent *e) { try { return QApplication::notify(receiver, e); } catch (std::exception& ex) { asp::popUp(ex.what()); return false; } } }; void readImageNames(std::vector<std::string> const& all_files, std::vector<std::string> & images, std::string & output_prefix) { output_prefix = ""; images.clear(); // Try to load each input file as a standalone image one at a time for (size_t i = 0; i < all_files.size(); i++) { std::string file = all_files[i]; bool is_image = false; try { DiskImageView<float> tmp(file); is_image = true; } catch(std::exception & e) { if (file.empty() || file[0] == '-') continue; if (vw::get_extension(file) == ".match") { // Found a match file stereo_settings().match_file = file; is_image = false; } else if (vw::get_extension(file) == ".vwip") { // Found a vwip file stereo_settings().vwip_files.push_back(file); is_image = false; } else if (vw::get_extension(file) == ".gcp") { // Found a gcp file stereo_settings().gcp_file = file; is_image = false; } else if (vw::get_extension(file) == ".nvm") { // Found an nvm file if (!stereo_settings().nvm.empty()) // sanity check vw_out() << "Multiple nvm files specified. Will load only: " << file << "\n"; stereo_settings().nvm = file; is_image = false; } else if (vw::has_shp_extension(file)) { // See if this is a shape file is_image = true; // will load it in the same struct as for images } else if (asp::hasCsv(file)) { is_image = true; // will load it in the same struct as for images } else if (vw::has_cam_extension(file)) { // We will get here for all cameras except .cub, which // is both an image and a camera and was picked up by // now. Don't print an error in this case as this is // expected to not be an image. is_image = false; } else { if (!fs::exists(file)) { vw_out() << "Setting output prefix: " << file << "\n"; output_prefix = file; } else { vw_out() << "Not a valid image: " << file << "\n"; } } } if (is_image) images.push_back(file); } return; } } // end namespace asp int main(int argc, char** argv) { try { xercesc::XMLPlatformUtils::Initialize(); stereo_register_sessions(); // Extract style and color for scattered points, curves, and polygons std::vector<std::map<std::string, std::string>> properties; asp::preprocessArgs(argc, argv, properties); bool verbose = false; ASPGlobalOptions opt; std::string output_prefix; std::vector<std::string> images; std::vector<std::string> all_files; asp::stereo_settings().vwip_files.clear(); asp::parseStereoGuiArgs(argc, argv, opt, all_files); asp::readImageNames(all_files, images, output_prefix); if (stereo_settings().create_image_pyramids_only) { // Just create the image pyramids and exit. for (size_t i = 0; i < images.size(); i++) { asp::imageData img; img.read(images[i], opt); if (stereo_settings().hillshade) { // Create hillshaded images. std::string hillshaded_file; bool have_gui = false; // so we don't use a pop up before the gui got started bool success = asp::write_hillshade(opt, have_gui, stereo_settings().hillshade_azimuth, stereo_settings().hillshade_elevation, images[i], hillshaded_file); // output if (success) // build the pyramids img.read(hillshaded_file, opt, asp::HILLSHADED_VIEW); } } return 0; } // Create the application. Must be done before trying to read // images as that call uses pop-ups. Must not happen before // building image pyramids as that does not need a gui. asp::StereoApplication app(argc, argv); // Set the font size QFont f = app.font(); f.setPointSize(asp::stereo_settings().font_size); app.setFont(f); vw::create_out_dir(output_prefix); // Use OpenMP to speed things up. // TODO(oalexan1): This should be enabled in more places. int processor_count = std::thread::hardware_concurrency(); omp_set_dynamic(0); omp_set_num_threads(processor_count); // Start up the Qt GUI asp::MainWindow main_window(opt, images, output_prefix, stereo_settings().grid_cols, stereo_settings().window_size, stereo_settings().single_window, stereo_settings().use_georef, properties, argc, argv); main_window.show(); app.exec(); xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/stereo_parse.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo_parse.cc /// /// This program is to allow python access to stereo settings. #include <asp/Core/StereoSettings.h> #include <asp/Core/StereoTiling.h> #include <asp/Core/Macros.h> #include <asp/Tools/stereo.h> #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Core/DisparityProcessing.h> #include <vw/Stereo/DisparityMap.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/Stereo/CorrelationView.h> #include <vw/Cartography/shapeFile.h> #include <vw/FileIO/DiskImageIO.h> #include <vw/FileIO/DiskImageView.h> #include <xercesc/util/PlatformUtils.hpp> using namespace vw; using namespace asp; namespace fs = boost::filesystem; // Find the tile at given location for a parallel_stereo run with local epipolar // alignment. void find_tile_at_loc(std::string const& tile_at_loc, ASPGlobalOptions const& opt) { if (opt.input_dem != "") vw_throw(ArgumentErr() << "Option --tile-at-location does not work " << "with mapprojected images.\n"); std::istringstream iss(tile_at_loc); double lon, lat, h; if (!(iss >> lon >> lat >> h)) vw_throw(ArgumentErr() << "Could not parse --tile-at-location.\n"); vw::cartography::GeoReference georef = opt.session->get_georef(); vw::CamPtr left_camera_model, right_camera_model; opt.session->camera_models(left_camera_model, right_camera_model); Vector3 xyz = georef.datum().geodetic_to_cartesian(Vector3(lon, lat, h)); Vector2 pix = left_camera_model->point_to_pixel(xyz); vw::TransformPtr tx_left = opt.session->tx_left(); pix = tx_left->forward(pix); // Read the tiles std::string line; std::string dir_list = opt.out_prefix + "-dirList.txt"; vw_out() << "Reading list of tiles: " << dir_list << "\n"; std::ifstream ifs(dir_list); std::vector<BBox2i> boxes; bool success = false; while (ifs >> line) { std::string::size_type pos = line.find(opt.out_prefix); if (pos == std::string::npos) vw_throw(ArgumentErr() << "Could not find the output prefix in " << dir_list << ".\n"); std::string tile_name = line; line.replace(pos, opt.out_prefix.size() + 1, ""); // add 1 to replace the dash int start_x, start_y, wid_x, wid_y; int ans = sscanf(line.c_str(), "%d_%d_%d_%d", &start_x, &start_y, &wid_x, &wid_y); if (ans != 4) vw_throw(ArgumentErr() << "Error parsing 4 numbers from string: " << line); BBox2i box(start_x, start_y, wid_x, wid_y); if (box.contains(pix)) { vw::vw_out() << "Tile with location: " << tile_name << "\n"; success = true; } } if (!success) vw_out() << "No tile found at location.\n"; } int main(int argc, char* argv[]) { try { xercesc::XMLPlatformUtils::Initialize(); stereo_register_sessions(); bool verbose = true; std::vector<ASPGlobalOptions> opt_vec; std::string output_prefix; asp::parseStereoArgs(argc, argv, ParseDescription(), verbose, output_prefix, opt_vec); if (opt_vec.empty()) return 1; ASPGlobalOptions opt = opt_vec[0]; // This is needed for the stereo_dist distributed processing program. Save // the needed list of tiles to disk (and their mapprojected versions as a // shapefile) and exit. if (asp::stereo_settings().stereo_dist_tile_params != vw::Vector2i(0, 0)) { produceDistTileList(opt.in_file1, opt.in_file2, output_prefix, asp::stereo_settings().stereo_dist_tile_params); return 0; } // Use this as a small utility in debugging parallel_stereo runs if (!stereo_settings().tile_at_loc.empty()) { find_tile_at_loc(stereo_settings().tile_at_loc, opt); return 0; } vw_out() << "in_file1," << opt.in_file1 << "\n"; vw_out() << "in_file2," << opt.in_file2 << "\n"; vw_out() << "cam_file1," << opt.cam_file1 << "\n"; vw_out() << "cam_file2," << opt.cam_file2 << "\n"; vw_out() << "input_dem," << opt.input_dem << "\n"; vw_out() << "extra_argument1," << opt.extra_argument1 << "\n"; vw_out() << "extra_argument2," << opt.extra_argument2 << "\n"; vw_out() << "extra_argument3," << opt.extra_argument3 << "\n"; vw_out() << "stereo_session," << opt.stereo_session << "\n"; vw_out() << "stereo_default_filename," << opt.stereo_default_filename << "\n"; vw_out() << "left_image_crop_win," << stereo_settings().left_image_crop_win.min().x() << "," << stereo_settings().left_image_crop_win.min().y() << "," << stereo_settings().left_image_crop_win.width() << "," << stereo_settings().left_image_crop_win.height() << "\n"; // This is different from opt.out_prefix for multiview vw_out() << "out_prefix," << output_prefix << "\n"; // Output only the named options (no positional args) so that callers // like stereo_dist can safely reconstruct command lines. std::vector<std::string> opts_vals; asp::parseStereoOptsVals(argc, argv, ParseDescription(), opts_vals); vw_out() << "named_options"; for (size_t i = 0; i < opts_vals.size(); i++) vw_out() << "," << opts_vals[i]; vw_out() << "\n"; Vector2i left_image_size = file_image_size(opt.in_file1), right_image_size = file_image_size(opt.in_file2); vw_out() << "left_image_size," << left_image_size.x() << "," << left_image_size.y() << "\n"; vw_out() << "right_image_size," << right_image_size.x() << "," << right_image_size.y() << "\n"; std::string trans_left_image = opt.out_prefix+"-L.tif"; std::string trans_right_image = opt.out_prefix+"-R.tif"; vw::vw_out() << "trans_left_image," << trans_left_image << "\n"; vw::vw_out() << "trans_right_image," << trans_right_image << "\n"; // This is needed to create tiles in parallel_stereo vw::Vector2 trans_left_image_size(0, 0); if (fs::exists(trans_left_image)) trans_left_image_size = file_image_size(trans_left_image); vw_out() << "trans_left_image_size," << trans_left_image_size.x() << "," << trans_left_image_size.y() << "\n"; // This separator needs to be in sync with parallel_stereo. It is needed to // extract from a line of text the portion after the separator. std::string sep = "--non-comma-separator--"; cartography::GeoReference georef = opt.session->get_georef(); vw_out() << "WKT" << sep << georef.get_wkt() << "\n"; // Write the geotransform as a string as expected by GDAL's vrt xml format // TODO: Not sure if this will be useful as a member function in GeoReference. Matrix3x3 T = georef.transform(); std::ostringstream os; os.precision(18); os << " " << T(0, 2) << ", " << T(0, 0) << ", " << T(0, 1) << ", " << " " << T(1, 2) << ", " << T(1, 0) << ", " << T(1, 1); vw_out() << "GeoTransform" << sep << os.str() << "\n"; // Some care is needed below. The transformed_window will be used // by parallel_stereo to parallelize stereo on a given user-specified // region. If both --left-image-crop-win and --right-image-crop-win // is specified, we already chopped the input images to these windows, // and created L.tif. Hence, we will work on the bd box on L.tif. However, // if just left-image-crop-win was set, we still use the full images, // but just the domain of computation is restricted. Hence we take user's // crop window, transform it to be in the L.tif coordinates, and use that one. bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); BBox2i transformed_window; if (crop_left) { transformed_window.min() = Vector2(0, 0); transformed_window.max() = trans_left_image_size; }else{ transformed_window = transformed_crop_win(opt); } vw_out() << "transformed_window," << transformed_window.min().x() << "," << transformed_window.min().y() << "," << transformed_window.width() << "," << transformed_window.height() << "\n"; //vw_out() << "corr_tile_size," << ASPGlobalOptions::corr_tile_size() << "\n"; vw_out() << "corr_tile_size," << stereo_settings().corr_tile_size_ovr << "\n"; vw_out() << "rfne_tile_size," << ASPGlobalOptions::rfne_tile_size() << "\n"; vw_out() << "tri_tile_size," << ASPGlobalOptions::tri_tile_size() << "\n"; vw_out() << "stereo_algorithm," << stereo_settings().stereo_algorithm << "\n"; vw_out() << "alignment_method," << stereo_settings().alignment_method << "\n"; vw_out() << "subpixel_mode," << stereo_settings().subpixel_mode << "\n"; // Apart from default block matching, correlation will be done tiles // with padding, which is called here collar_size. vw::stereo::CorrelationAlgorithm stereo_alg = asp::stereo_alg_to_num(stereo_settings().stereo_algorithm); bool using_tiles = (stereo_alg > vw::stereo::VW_CORRELATION_BM || stereo_settings().alignment_method == "local_epipolar"); int sgm_collar_size = 0; if (using_tiles) sgm_collar_size = stereo_settings().sgm_collar_size; vw_out() << "collar_size," << sgm_collar_size << "\n"; vw_out() << "corr_memory_limit_mb," << stereo_settings().corr_memory_limit_mb << "\n"; vw_out() << "save_lr_disp_diff," << stereo_settings().save_lr_disp_diff << "\n"; vw_out() << "correlator_mode," << stereo_settings().correlator_mode << "\n"; if (asp::stereo_settings().parallel_tile_size != vw::Vector2i(0, 0)) produceTiles(opt.session->isMapProjected(), output_prefix, trans_left_image_size, asp::stereo_settings().parallel_tile_size, sgm_collar_size); // Attach a georeference to this disparity. // TODO(oalexan1): Make this into a function std::string left_image_file = opt.out_prefix + "-L.tif"; if (stereo_settings().attach_georeference_to_lowres_disparity && fs::exists(left_image_file)) { cartography::GeoReference left_georef, left_sub_georef; bool has_left_georef = read_georeference(left_georef, left_image_file); bool has_nodata = false; double output_nodata = -32768.0; if (has_left_georef) { DiskImageView<float> left_image(left_image_file); for (int i = 0; i < 2; i++) { std::string d_sub_file = opt.out_prefix + "-D_sub.tif"; if (i == 1) d_sub_file = opt.out_prefix + "-D_sub_spread.tif"; if (!fs::exists(d_sub_file)) continue; bool has_sub_georef = read_georeference(left_sub_georef, d_sub_file); if (has_sub_georef) { // If D_sub already has a georef, as with seed-mode 3, don't overwrite it. continue; } vw::ImageView<PixelMask<Vector2f>> d_sub; vw::read_image(d_sub, d_sub_file); // Account for scale. double left_scale = 0.5*(double(d_sub.cols())/left_image.cols() + double(d_sub.rows())/left_image.rows()); left_sub_georef = resample(left_georef, left_scale); vw::cartography::block_write_gdal_image(d_sub_file, d_sub, has_left_georef, left_sub_georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp", "\t D_sub: ")); } // End i loop } // End has_left_georef } // End georef attach xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/stereo_pprc.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo_pprc.cc /// #include <asp/Sessions/StereoSession.h> #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Sessions/CameraUtils.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/Bathymetry.h> #include <asp/Core/Macros.h> #include <asp/Core/AspLog.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/FileUtils.h> #include <asp/Core/ThreadedEdgeMask.h> #include <asp/Core/ImageUtils.h> #include <asp/Tools/stereo.h> #include <vw/Core/Stopwatch.h> #include <vw/Image/AntiAliasing.h> #include <vw/Image/WindowAlgorithms.h> #include <vw/Image/UtilityViews.h> #include <vw/Cartography/GeoTransform.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Math/Functors.h> #include <xercesc/util/PlatformUtils.hpp> #include <vw/Image/Manipulation.h> using namespace vw; using namespace asp; // Check that the images in file1 and file2 have same size, and throw // an exception if they don't. void check_image_sizes(std::string const& file1, std::string const& file2) { DiskImageView<float> left_image (file1), right_image(file2); if (left_image.cols() != right_image.cols() || left_image.rows() != right_image.rows()) vw_throw( ArgumentErr() << "Expecting images: " << file1 << " and " << file2 << " to have the same dimensions. Delete this run and start all over.\n"); } // Create subsampled images and masks void createSubsampledImages(ASPGlobalOptions const& opt, std::vector<std::string> const& in_file_list, bool crop_left, bool crop_right, DiskImageView<PixelGray<float>> const& left_image, DiskImageView<PixelGray<float>> const& right_image, std::string const& left_mask_file, std::string const& right_mask_file, bool has_left_georef, bool has_right_georef, cartography::GeoReference const& left_georef, cartography::GeoReference const& right_georef, float output_nodata) { bool has_nodata = true; std::string lsub = opt.out_prefix+"-L_sub.tif"; std::string rsub = opt.out_prefix+"-R_sub.tif"; std::string lmsub = opt.out_prefix+"-lMask_sub.tif"; std::string rmsub = opt.out_prefix+"-rMask_sub.tif"; bool inputs_changed = (!first_is_newer(lsub, in_file_list) || !first_is_newer(rsub, in_file_list) || !first_is_newer(lmsub, in_file_list) || !first_is_newer(rmsub, in_file_list)); // We must always redo the subsampling if we are allowed to crop the images bool rebuild = crop_left || crop_right || inputs_changed; try { // First try to see if the subsampled images exist. if (!fs::exists(lsub) || !fs::exists(rsub) || !fs::exists(lmsub) || !fs::exists(rmsub)) { rebuild = true; } else { // See if the subsampled images are valid DiskImageView<PixelGray<float>> testl(lsub); DiskImageView<PixelGray<float>> testr(rsub); DiskImageView<uint8> testlm(lmsub); DiskImageView<uint8> testrm(rmsub); vw_out() << "\t--> Using cached subsampled images.\n"; } } catch (vw::Exception const& e) { rebuild = true; } if (rebuild) { // Produce subsampled images, these will be used later for auto // search range detection. double s = 1500.0; float sub_scale = sqrt(s * s / (float(left_image.cols ()) * float(left_image.rows ()))) + sqrt(s * s / (float(right_image.cols()) * float(right_image.rows()))); sub_scale /= 2; if ( sub_scale > 0.6 ) // ??? sub_scale = 0.6; // Solving for the number of threads and the tile size to use for // subsampling while only using 500 MiB of memory. (The cache code // is a little slow on releasing so it will probably use 1.5GiB // memory during subsampling) Also tile size must be a power of 2 // and greater than or equal to 64 px. uint32 sub_threads = vw_settings().default_num_threads() + 1; uint32 tile_power = 0; while (tile_power < 6 && sub_threads > 1) { sub_threads--; tile_power = boost::numeric_cast<uint32> (log10(500e6*sub_scale*sub_scale/(4.0*float(sub_threads)))/(2*log10(2))); } uint32 sub_tile_size = 1u << tile_power; if (sub_tile_size > vw_settings().default_tile_size()) sub_tile_size = vw_settings().default_tile_size(); Vector2 sub_tile_size_vec(sub_tile_size, sub_tile_size); vw_out() << "Creating subimages and submasks. Subsampling by " << sub_scale << " by using a tile of size " << sub_tile_size << " and " << sub_threads << " threads.\n"; // Resample the images and the masks. We must use the masks when // resampling the images to interpolate correctly around invalid pixels. DiskImageView<uint8> left_mask(left_mask_file), right_mask(right_mask_file); // Below we use ImageView instead of ImageViewRef as the output // images are small. Using an ImageViewRef would make the // subsampling operations happen twice, once for L_sub.tif and // second time for lMask_sub.tif. ImageView<PixelMask<PixelGray<float>>> left_sub_image, right_sub_image; if (sub_scale > 0.5) { // When we are near the pixel input to output ratio, standard // interpolation gives the best possible results. left_sub_image = block_rasterize( resample(copy_mask(left_image, create_mask(left_mask)), sub_scale), sub_tile_size_vec, sub_threads); right_sub_image = block_rasterize( resample(copy_mask(right_image, create_mask(right_mask)), sub_scale), sub_tile_size_vec, sub_threads); } else { // When we heavily reduce the image size, super sampling seems // like the best approach. The method below should be equivalent. left_sub_image = block_rasterize( cache_tile_aware_render(resample_aa(copy_mask(left_image, create_mask(left_mask)), sub_scale), Vector2i(256,256) * sub_scale), sub_tile_size_vec, sub_threads); right_sub_image = block_rasterize( cache_tile_aware_render(resample_aa(copy_mask(right_image, create_mask(right_mask)), sub_scale), Vector2i(256,256) * sub_scale), sub_tile_size_vec, sub_threads); } // Enforce no predictor in compression, it works badly with sub-images vw::GdalWriteOptions opt_nopred = opt; opt_nopred.gdal_options["PREDICTOR"] = "1"; opt_nopred.cog = false; // Do not use COG with preprocessing intermediates vw::cartography::GeoReference left_sub_georef, right_sub_georef; if (has_left_georef) { // Account for scale. double left_scale = 0.5 * (double(left_sub_image.cols())/left_image.cols() + double(left_sub_image.rows())/left_image.rows()); left_sub_georef = resample(left_georef, left_scale); } if (has_right_georef) { // Account for scale. double right_scale = 0.5 * (double(right_sub_image.cols())/right_image.cols() + double(right_sub_image.rows())/right_image.rows()); right_sub_georef = resample(right_georef, right_scale); } vw::cartography::block_write_gdal_image( lsub, apply_mask(left_sub_image, output_nodata), has_left_georef, left_sub_georef, has_nodata, output_nodata, opt_nopred, TerminalProgressCallback("asp", "\t Sub L: ") ); vw::cartography::block_write_gdal_image( rsub, apply_mask(right_sub_image, output_nodata), has_right_georef, right_sub_georef, has_nodata, output_nodata, opt_nopred, TerminalProgressCallback("asp", "\t Sub R: ") ); vw::cartography::block_write_gdal_image( lmsub, channel_cast_rescale<uint8>(select_channel(left_sub_image, 1)), has_left_georef, left_sub_georef, has_nodata, output_nodata, opt_nopred, TerminalProgressCallback("asp", "\t Sub L Mask: ") ); vw::cartography::block_write_gdal_image( rmsub, channel_cast_rescale<uint8>(select_channel(right_sub_image, 1)), has_right_georef, right_sub_georef, has_nodata, output_nodata, opt_nopred, TerminalProgressCallback("asp", "\t Sub R Mask: ") ); } // End rebuild check } // End function createSubsampledImages // Create the image masks for the left and right images void createImageMasks(ASPGlobalOptions & opt, boost::shared_ptr<DiskImageResource> left_rsrc, boost::shared_ptr<DiskImageResource> right_rsrc, DiskImageView<PixelGray<float>> const& left_image, DiskImageView<PixelGray<float>> const& right_image, bool skip_img_norm, bool has_left_georef, bool has_right_georef, cartography::GeoReference const& left_georef, cartography::GeoReference const& right_georef, bool has_nodata, float output_nodata, std::string const& left_mask_file, std::string const& right_mask_file) { vw_out() << "\t--> Generating image masks.\n"; vw::Stopwatch sw; sw.start(); // Read the no-data values of L.tif and R.tif. float left_nodata_value = std::numeric_limits<float>::quiet_NaN(); float right_nodata_value = std::numeric_limits<float>::quiet_NaN(); if (left_rsrc->has_nodata_read()) left_nodata_value = left_rsrc->nodata_read(); if (right_rsrc->has_nodata_read()) right_nodata_value = right_rsrc->nodata_read(); // We need to treat the following special case: if the user // skipped image normalization, so we are still using the original // input images, and the user wants to use a custom no-data value, // this is the time to apply it. if (skip_img_norm && !std::isnan(stereo_settings().nodata_value)) { left_nodata_value = stereo_settings().nodata_value; right_nodata_value = stereo_settings().nodata_value; } // TODO(oalexan1): Remove the ThreadedEdgeMask logic, as it is slow. But need // to ensure results are acceptable with both raw and mapprojected images. ImageViewRef<PixelMask<uint8>> left_mask = copy_mask(constant_view(uint8(255), left_image.cols(), left_image.rows()), asp::threaded_edge_mask(left_image, 0, 0, 1024)); ImageViewRef<PixelMask<uint8>> right_mask = copy_mask(constant_view(uint8(255), right_image.cols(), right_image.rows()), asp::threaded_edge_mask(right_image, 0, 0, 1024)); // Mask no-data pixels. left_mask = intersect_mask(left_mask, create_mask_less_or_equal(left_image, left_nodata_value)); right_mask = intersect_mask(right_mask, create_mask_less_or_equal(right_image, right_nodata_value)); // Mask out regions with low input pixel value standard deviations if the // user requested it. if (stereo_settings().nodata_stddev_kernel > 0) { Vector2i stddev_kernel(stereo_settings().nodata_stddev_kernel, stereo_settings().nodata_stddev_kernel); // If the threshold value is negative write out a debug image // instead, allowing the user to tune the threshold. // TODO(oalexan1): See if to wipe this code. if (stereo_settings().nodata_stddev_thresh < 0) { vw::cartography::block_write_gdal_image (opt.out_prefix + "-L_stddev_filter_output.tif", vw::stddev_filter_view(left_image, stddev_kernel), has_left_georef, left_georef, false, output_nodata, opt, TerminalProgressCallback ("asp", "\t StdDev filter raw output (left): ")); vw::cartography::block_write_gdal_image (opt.out_prefix + "-R_stddev_filter_output.tif", vw::stddev_filter_view(right_image, stddev_kernel), has_right_georef, right_georef, false, output_nodata, opt, TerminalProgressCallback("asp", "\t StdDev filter raw output (right): ")); } else { left_mask = intersect_mask(left_mask, create_mask_less_or_equal (vw::stddev_filter_view(left_image, stddev_kernel), stereo_settings().nodata_stddev_thresh)); right_mask = intersect_mask(right_mask, create_mask_less_or_equal (vw::stddev_filter_view(right_image, stddev_kernel), stereo_settings().nodata_stddev_thresh)); } } // Intersect the left mask with the warped version of the right // mask, and vice-versa to reduce noise, if the images // are map-projected. vw_out() << "Writing masks: " << left_mask_file << ' ' << right_mask_file << ".\n"; if (has_left_georef && has_right_georef && opt.session->isMapProjected()) { // Write with big blocks. Small blocks results in slow writing and great // memory usage. The latter is likely because there's a memory leak // somewhere or the bookkeeping for small tiles takes too much memory. // This is a bugfix. Vector2 orig_tile_size = opt.raster_tile_size; opt.raster_tile_size = Vector2(1024, 1024); { // Right image mask transformed into left coordinates. Keep this in its // own scope to free up the memory of its bookkeeping as soon as // possible. ImageViewRef<PixelMask<uint8>> warped_right_mask = crop(vw::cartography::geo_transform (right_mask, right_georef, left_georef, ConstantEdgeExtension(), NearestPixelInterpolation()), bounding_box(left_mask)); vw::cartography::block_write_gdal_image(left_mask_file, apply_mask(intersect_mask(left_mask, warped_right_mask)), has_left_georef, left_georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp", "\t Mask L: ")); } { // Left image mask transformed into right coordinates. Keep it in its // own scope as per above. ImageViewRef<PixelMask<uint8>> warped_left_mask = crop(vw::cartography::geo_transform (left_mask, left_georef, right_georef, ConstantEdgeExtension(), NearestPixelInterpolation()), bounding_box(right_mask)); vw::cartography::block_write_gdal_image(right_mask_file, apply_mask(intersect_mask(right_mask, warped_left_mask)), has_right_georef, right_georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp", "\t Mask R: ")); } // Put the original tile size back opt.raster_tile_size = orig_tile_size; } else { // No DEM to map-project to. // TODO: Even so, the trick above with intersecting the masks will still work, // if the images are map-projected (such as with cam2map-ed cubes), // but this would require careful research. vw::cartography::block_write_gdal_image(left_mask_file, apply_mask(left_mask), has_left_georef, left_georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp", "\t Mask L: ")); vw::cartography::block_write_gdal_image(right_mask_file, apply_mask(right_mask), has_right_georef, right_georef, has_nodata, output_nodata, opt, TerminalProgressCallback("asp", "\t Mask R: ")); } sw.stop(); vw_out(DebugMessage, "asp") << "Mask creation elapsed time: " << sw.elapsed_seconds() << " s." << std::endl; } /// The main preprocessing function void stereo_preprocessing(bool adjust_left_image_size, ASPGlobalOptions& opt) { // Perform image normalization and calc stats. Handle skip_image_normalization. std::string left_image_file, right_image_file; opt.session->preprocessing_hook(adjust_left_image_size, opt.in_file1, opt.in_file2, left_image_file, right_image_file); boost::shared_ptr<DiskImageResource> left_rsrc (vw::DiskImageResourcePtr(left_image_file)), right_rsrc(vw::DiskImageResourcePtr(right_image_file)); // Load the normalized images DiskImageView<PixelGray<float>> left_image (left_rsrc), right_image(right_rsrc); // If we crop the images, we must always rebuild the masks // and subsample the images and masks. bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); std::string left_mask_file = opt.out_prefix+"-lMask.tif"; std::string right_mask_file = opt.out_prefix+"-rMask.tif"; // Also need to rebuild if the inputs changed after the mask files were produced. std::vector<std::string> in_file_list; in_file_list.push_back(opt.in_file1); in_file_list.push_back(opt.in_file2); in_file_list.push_back(opt.cam_file1); in_file_list.push_back(opt.cam_file2); bool inputs_changed = (!first_is_newer(left_mask_file, in_file_list) || !first_is_newer(right_mask_file, in_file_list)); bool rebuild = crop_left || crop_right || inputs_changed; try { // If files do not exist, create them. Also if they exist // but are invalid. The second check gives an ugly verbose // message, hence first check for existence with boost. if (!fs::exists(left_mask_file) || !fs::exists(right_mask_file)){ rebuild = true; }else{ vw_log().console_log().rule_set().add_rule(-1,"fileio"); DiskImageView<PixelGray<uint8>> testa(left_mask_file ); DiskImageView<PixelGray<uint8>> testb(right_mask_file); vw_settings().reload_config(); } } catch (vw::IOErr const& e) { vw_settings().reload_config(); rebuild = true; } catch (vw::ArgumentErr const& e ) { // Throws on a corrupted file. vw_settings().reload_config(); rebuild = true; } cartography::GeoReference left_georef, right_georef; bool has_left_georef = read_georeference(left_georef, left_image_file); bool has_right_georef = read_georeference(right_georef, right_image_file); // The output no-data value must be < 0 as the images are scaled to around [0, 1]. bool has_nodata = true; float output_nodata = -32768.0; // Create or reuse masks if (!rebuild) { vw_out() << "\t--> Using cached masks.\n"; // This is to safeguard against the case when masks produced with alignment // or crop from a previous run are used with no alignment or no crop. if (stereo_settings().alignment_method == "none") { check_image_sizes(opt.in_file1, left_mask_file); check_image_sizes(opt.in_file2, right_mask_file); } } else { bool skip_img_norm = asp::skip_image_normalization(opt); createImageMasks(opt, left_rsrc, right_rsrc, left_image, right_image, skip_img_norm, has_left_georef, has_right_georef, left_georef, right_georef, has_nodata, output_nodata, left_mask_file, right_mask_file); } // Create subsampled images and masks createSubsampledImages(opt, in_file_list, crop_left, crop_right, left_image, right_image, left_mask_file, right_mask_file, has_left_georef, has_right_georef, left_georef, right_georef, output_nodata); // When alignment method is none or epipolar, no ip were created so far, so // produce them now. if (stereo_settings().alignment_method == "none" || stereo_settings().alignment_method == "epipolar") { try { asp::compute_ip_LR(opt.out_prefix); } catch (const std::exception& e) { if (!asp::stereo_settings().search_range.empty() || stereo_settings().seed_mode == 2) { // If the user provided a search range or disp from DEM, IP are not needed. vw_out() << "Could not compute interest points. The error was:\n"; vw_out() << e.what(); if (!asp::stereo_settings().search_range.empty()) vw_out() << "Will continue, given that --corr-search was set.\n"; if (stereo_settings().seed_mode == 2) vw_out() << "Will continue, given the option --seed-mode 2.\n"; } else { vw::vw_throw(vw::ArgumentErr() << e.what() << "\n"); } } } } // End function stereo_preprocessing int main(int argc, char* argv[]) { try { xercesc::XMLPlatformUtils::Initialize(); vw_out() << "\n[ " << current_posix_time_string() << " ]: Stage 0 --> PREPROCESSING\n"; stereo_register_sessions(); bool verbose = false; std::vector<ASPGlobalOptions> opt_vec; std::string output_prefix; asp::parseStereoArgs(argc, argv, PreProcessingDescription(), verbose, output_prefix, opt_vec); ASPGlobalOptions opt = opt_vec[0]; vw_out() << "Image files: " << opt.in_file1 << ", " << opt.in_file2 << "\n"; if (opt.cam_file1 != "" || opt.cam_file2 != "") vw_out() << "Camera files: " << opt.cam_file1 << ", " << opt.cam_file2 << "\n"; if (!opt.input_dem.empty()) vw_out() << "Input DEM: " << opt.input_dem << "\n"; // We will not adjust the left image size if we do multiview stereo, // so we can keep one-to-one correspondence between the several // pairwise runs that are part of the multiview run for the time // when we need to combine all these runs to do simultaneous triangulation. bool adjust_left_image_size = (opt_vec.size() == 1 && !stereo_settings().part_of_multiview_run); stereo_preprocessing(adjust_left_image_size, opt); if (!stereo_settings().stereo_dist_mode) asp::estimate_convergence_angle(opt); vw_out() << "\n[ " << current_posix_time_string() << " ]: PREPROCESSING FINISHED\n"; xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/stereo_rfne.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2025, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo_rfne.cc /// #include <asp/Sessions/StereoSession.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/Macros.h> #include <asp/Core/ImageNormalization.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/AspLog.h> #include <asp/Core/FileUtils.h> #include <asp/Tools/stereo.h> #include <vw/Stereo/PrefilterEnum.h> #include <vw/Stereo/CostFunctions.h> #include <vw/Stereo/ParabolaSubpixelView.h> #include <vw/Stereo/SubpixelView.h> #include <vw/Stereo/DisparityMap.h> #include <vw/FileIO/DiskImageResource.h> #include <vw/Image/InpaintView.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/Cartography/GeoReferenceUtils.h> #include <xercesc/util/PlatformUtils.hpp> using namespace vw; using namespace vw::stereo; using namespace asp; template <class Image1T, class Image2T> ImageViewRef<PixelMask<Vector2f>> refine_disparity(Image1T const& left_image, Image2T const& right_image, ImageViewRef<PixelMask<Vector2f>> const& integer_disp, ASPGlobalOptions const& opt, bool verbose) { ImageViewRef<PixelMask<Vector2f>> refined_disp = integer_disp; PrefilterModeType prefilter_mode = static_cast<vw::stereo::PrefilterModeType>(stereo_settings().pre_filter_mode); // Mode 0 and SGM modes 7-12: no refinement in this stage if (stereo_settings().subpixel_mode == 0 || (stereo_settings().subpixel_mode >= 7 && stereo_settings().subpixel_mode <= 12)) { if (verbose) vw_out() << "\t--> Skipping subpixel mode.\n"; return refined_disp; } if (verbose) { if (stereo_settings().pre_filter_mode == 2) vw_out() << "\t--> Using LOG pre-processing filter with " << stereo_settings().slogW << " sigma blur.\n"; else if (stereo_settings().pre_filter_mode == 1) vw_out() << "\t--> Using Subtracted Mean pre-processing filter with " << stereo_settings().slogW << " sigma blur.\n"; else vw_out() << "\t--> NO preprocessing.\n"; } if (stereo_settings().subpixel_mode == 1) { // Parabola if (verbose) vw_out() << "\t--> Using parabola subpixel mode.\n"; refined_disp = parabola_subpixel(integer_disp, left_image, right_image, prefilter_mode, stereo_settings().slogW, stereo_settings().subpixel_kernel); } else if (stereo_settings().subpixel_mode == 2) { // Bayes EM if (verbose) vw_out() << "\t--> Using affine adaptive subpixel mode\n"; refined_disp = bayes_em_subpixel(integer_disp, left_image, right_image, prefilter_mode, stereo_settings().slogW, stereo_settings().subpixel_kernel, stereo_settings().subpixel_max_levels); } else if (stereo_settings().subpixel_mode == 3) { // Fast affine if (verbose) vw_out() << "\t--> Using affine subpixel mode\n"; refined_disp = affine_subpixel(integer_disp, left_image, right_image, prefilter_mode, stereo_settings().slogW, stereo_settings().subpixel_kernel, stereo_settings().subpixel_max_levels); } else if (stereo_settings().subpixel_mode == 4) { // Phase correlation if (verbose) { vw_out() << "\t--> Using Phase Correlation subpixel mode\n"; vw_out() << "\t--> Forcing subpixel pyramid levels to zero\n"; } // So far phase correlation has worked poorly with multiple levels. stereo_settings().subpixel_max_levels = 0; refined_disp = phase_subpixel(integer_disp, left_image, right_image, prefilter_mode, stereo_settings().slogW, stereo_settings().subpixel_kernel, stereo_settings().subpixel_max_levels, stereo_settings().phase_subpixel_accuracy); } else if (stereo_settings().subpixel_mode == 5) { // Lucas-Kanade if (verbose) vw_out() << "\t--> Using Lucas-Kanade subpixel mode\n"; refined_disp = lk_subpixel(integer_disp, left_image, right_image, prefilter_mode, stereo_settings().slogW, stereo_settings().subpixel_kernel, stereo_settings().subpixel_max_levels); } else { vw::vw_throw(vw::ArgumentErr() << "Invalid subpixel mode: " << stereo_settings().subpixel_mode << ".\n"); } return refined_disp; } // Perform refinement in each tile. If using local homography, // apply the local homography transform for the given tile // to the right image before doing refinement in that tile. template <class Image1T, class Image2T, class SeedDispT> class PerTileRfne: public ImageViewBase<PerTileRfne<Image1T, Image2T, SeedDispT>> { Image1T m_left_image; Image2T m_right_image; SeedDispT m_integer_disp; SeedDispT m_sub_disp; ASPGlobalOptions const& m_opt; Vector2 m_upscale_factor; public: PerTileRfne(ImageViewBase<Image1T> const& left_image, ImageViewBase<Image2T> const& right_image, ImageViewBase<SeedDispT> const& integer_disp, ImageViewBase<SeedDispT> const& sub_disp, ASPGlobalOptions const& opt): m_left_image(left_image.impl()), m_right_image(right_image.impl()), m_integer_disp(integer_disp.impl()), m_sub_disp(sub_disp.impl()), m_opt(opt) { m_upscale_factor = Vector2(double(m_left_image.impl().cols()) / m_sub_disp.cols(), double(m_left_image.impl().rows()) / m_sub_disp.rows()); } // Image View interface typedef PixelMask<Vector2f> pixel_type; typedef pixel_type result_type; typedef ProceduralPixelAccessor<PerTileRfne> pixel_accessor; inline int32 cols () const { return m_left_image.cols(); } inline int32 rows () const { return m_left_image.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()(double /*i*/, double /*j*/, int32 /*p*/ = 0) const { vw_throw(NoImplErr() << "PerTileRfne::operator()(...) is not implemented"); return pixel_type(); } typedef CropView<ImageView<pixel_type>> prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { ImageView<pixel_type> tile_disparity; bool verbose = false; tile_disparity = crop(refine_disparity(m_left_image, m_right_image, m_integer_disp, m_opt, verbose), bbox); prerasterize_type disparity = prerasterize_type(tile_disparity, -bbox.min().x(), -bbox.min().y(), cols(), rows()); return disparity; } template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; template <class Image1T, class Image2T, class SeedDispT> PerTileRfne<Image1T, Image2T, SeedDispT> per_tile_rfne(ImageViewBase<Image1T> const& left, ImageViewBase<Image2T> const& right, ImageViewBase<SeedDispT> const& integer_disp, ImageViewBase<SeedDispT> const& sub_disp, ASPGlobalOptions const& opt) { typedef PerTileRfne<Image1T, Image2T, SeedDispT> return_type; return return_type(left.impl(), right.impl(), integer_disp.impl(), sub_disp.impl(), opt); } // Enable conversion from images with float pixels to images with // PixelGray<float> pixels. class GrayCast: public ReturnFixedType<PixelGray<float>> { public: PixelGray<float> operator()(float v) const { return PixelGray<float>(v); } }; void stereo_refinement(ASPGlobalOptions const& opt) { ImageViewRef<float> left_image, right_image; ImageViewRef<PixelMask<Vector2f>> input_disp; ImageViewRef<PixelMask<Vector2f>> sub_disp; std::string left_image_file = opt.out_prefix+"-L.tif"; std::string right_image_file = opt.out_prefix+"-R.tif"; std::string left_mask_file = opt.out_prefix+"-lMask.tif"; std::string right_mask_file = opt.out_prefix+"-rMask.tif"; int kernel_size = std::max(stereo_settings().subpixel_kernel[0], stereo_settings().subpixel_kernel[1]); left_image = DiskImageView<float>(left_image_file); right_image = DiskImageView<float>(right_image_file); // It is better to fill no-data pixels with an average from // neighbors than to use no-data values in processing. This is a // temporary band-aid solution. float left_nodata_val = -std::numeric_limits<float>::max(); if (vw::read_nodata_val(left_image_file, left_nodata_val)) vw_out() << "Left image nodata: " << left_nodata_val << "\n"; float right_nodata_val = -std::numeric_limits<float>::max(); if (vw::read_nodata_val(right_image_file, right_nodata_val)) vw_out() << "Right image nodata: " << right_nodata_val << "\n"; left_image = apply_mask(vw::fill_nodata_with_avg (create_mask(left_image, left_nodata_val), kernel_size)); right_image = apply_mask(vw::fill_nodata_with_avg (create_mask(right_image, right_nodata_val), kernel_size)); // Read the correct type of correlation file (float for SGM/MGM, otherwise integer) std::string disp_file = opt.out_prefix + "-D.tif"; std::string blend_file = opt.out_prefix + "-B.tif"; if (stereo_settings().subpix_from_blend) { // Read the stereo_blend output file input_disp = DiskImageView<PixelMask<Vector2f>>(blend_file); } else { // Read the stereo_corr output file boost::shared_ptr<DiskImageResource> rsrc(DiskImageResourcePtr(disp_file)); ChannelTypeEnum disp_data_type = rsrc->channel_type(); if (disp_data_type == VW_CHANNEL_INT32) input_disp = pixel_cast<PixelMask<Vector2f>> (DiskImageView< PixelMask<Vector2i>>(disp_file)); else // File on disk is float input_disp = DiskImageView<PixelMask<Vector2f>>(disp_file); } bool skip_img_norm = asp::skip_image_normalization(opt); if (skip_img_norm && (stereo_settings().subpixel_mode == 2 || stereo_settings().subpixel_mode == 3)) { // Images were not normalized in pre-processing. Must do so now // as subpixel mode 2 and 3 assumes them to be normalized. ImageViewRef<uint8> left_mask, right_mask; left_mask = DiskImageView<uint8>(left_mask_file); right_mask = DiskImageView<uint8>(right_mask_file); ImageViewRef<PixelMask<float>> Limg = copy_mask(left_image, create_mask(left_mask)); ImageViewRef<PixelMask<float>> Rimg = copy_mask(right_image, create_mask(right_mask)); // By now the stats should be cached, but need to respect the API Vector6f left_stats = gather_stats(Limg, opt.out_prefix, left_image_file, stereo_settings().force_reuse_match_files); Vector6f right_stats = gather_stats(Rimg, opt.out_prefix, right_image_file, stereo_settings().force_reuse_match_files); bool use_percentile_stretch = false; bool do_not_exceed_min_max = (opt.session->name() == "isis" || opt.session->name() == "isismapisis"); asp::normalize_images(stereo_settings().force_use_entire_range, stereo_settings().individually_normalize, use_percentile_stretch, do_not_exceed_min_max, left_stats, right_stats, Limg, Rimg); // As above, fill no-data with average from neighbors left_image = apply_mask(vw::fill_nodata_with_avg(Limg, kernel_size)); right_image = apply_mask(vw::fill_nodata_with_avg(Rimg, kernel_size)); } // The whole goal of this block it to go through the motions of // refining disparity solely for the purpose of printing // the relevant messages once, rather than per tile, as in the // processing below. bool verbose = true; ImageView<PixelGray<float>> left_dummy(1, 1), right_dummy(1, 1); ImageView<PixelMask<Vector2f>> dummy_disp(1, 1); refine_disparity(left_dummy, right_dummy, dummy_disp, opt, verbose); // The images must be explicitly converted to have PixelGray<float> // pixels. ImageViewRef<PixelGray<float>> left_gray = per_pixel_filter(left_image, GrayCast()); ImageViewRef<PixelGray<float>> right_gray = per_pixel_filter(right_image, GrayCast()); ImageViewRef<PixelMask<Vector2f>> refined_disp = crop(per_tile_rfne(left_gray, right_gray, input_disp, sub_disp, opt), stereo_settings().trans_crop_win); cartography::GeoReference left_georef; bool has_left_georef = read_georeference(left_georef, opt.out_prefix + "-L.tif"); bool has_nodata = false; double nodata = -32768.0; std::string rd_file = opt.out_prefix + "-RD.tif"; vw_out() << "Writing: " << rd_file << "\n"; vw::cartography::block_write_gdal_image(rd_file, refined_disp, has_left_georef, left_georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Refinement :")); } int main(int argc, char* argv[]) { try { xercesc::XMLPlatformUtils::Initialize(); vw_out() << "\n[ " << current_posix_time_string() << " ]: Stage 3 --> REFINEMENT\n"; stereo_register_sessions(); bool verbose = false; std::vector<ASPGlobalOptions> opt_vec; std::string output_prefix; asp::parseStereoArgs(argc, argv, SubpixelDescription(), verbose, output_prefix, opt_vec); ASPGlobalOptions opt = opt_vec[0]; // Subpixel refinement uses smaller tiles. //--------------------------------------------------------- int ts = ASPGlobalOptions::rfne_tile_size(); opt.raster_tile_size = Vector2i(ts, ts); // Internal Processes //--------------------------------------------------------- stereo_refinement(opt); vw_out() << "\n[ " << current_posix_time_string() << " ]: REFINEMENT FINISHED\n"; xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/stereo_sweep ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2025, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ import sys, argparse, os, subprocess, shlex, itertools # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_system_utils def parseParamSweep(sweep_str): """Parse a --param-sweep string into a dict of {param_name: [values]}. Input format: "--param1 val1 val2 --param2 val3 val4" Returns: {"--param1": ["val1", "val2"], "--param2": ["val3", "val4"]} Supports multiple separators: spaces, colons, semicolons, newlines. A comma is used if a value itself has multiple parts (e.g., "7,7"). """ # Normalize all separators to spaces normalized = sweep_str.replace(':', ' ').replace(';', ' ') normalized = normalized.replace('\n', ' ') # Split into tokens tokens = normalized.split() params = {} current_param = None for token in tokens: if token.startswith('--'): # Start of a new parameter current_param = token params[current_param] = [] elif current_param is not None: # Value for current parameter params[current_param].append(token) return params def generateCombinations(parsed_params): """Generate all combinations from parsed parameters using Cartesian product. Args: parsed_params: dict like {"--param1": ["val1", "val2"], "--param2": ["val3"]} Returns: List of dicts, one for each combination: [{"--param1": "val1", "--param2": "val3"}, {"--param1": "val2", "--param2": "val3"}] """ if not parsed_params: return [{}] param_names = list(parsed_params.keys()) param_values = [parsed_params[name] for name in param_names] # Generate Cartesian product combinations = [] for combo in itertools.product(*param_values): combo_dict = {param_names[i]: combo[i] for i in range(len(param_names))} combinations.append(combo_dict) return combinations def runCombination(combo_dict, args, opt, out_prefix): """Run parallel_stereo and point2dem for a single parameter combination. Args: combo_dict: Dict of parameters like {"--stereo-algorithm": "asp_mgm", etc} args: Pass-through arguments (images, cameras, etc.) opt: Parsed options object out_prefix: Output prefix for this run Returns: 0 on success, non-zero on failure """ # Build the parameter list from combo_dict combo_args = [] for param, value in combo_dict.items(): # Handle multi-value parameters separated by commas (e.g., "7,7" -> "7 7") if ',' in value: combo_args.append(param) combo_args.extend(value.replace(',', ' ').split()) else: combo_args.extend([param, value]) # Assemble parallel_stereo command with combination parameters stereo_cmd = ['parallel_stereo'] + args + combo_args + [out_prefix] # Add DEM if provided if opt.dem: stereo_cmd.extend(['--dem', opt.dem]) # Run the command using ASP utilities if opt.dry_run: print(' '.join(stereo_cmd)) else: (out, err, status) = asp_system_utils.executeCommand(stereo_cmd, realTimeOutput = True) if status != 0: print(f"ERROR: parallel_stereo failed with status {status}") return status print(f"\nparallel_stereo completed successfully.") # Now run point2dem on the output point cloud pc_file = out_prefix + "-PC.tif" point2dem_cmd = ['point2dem', pc_file] # Add user-specified point2dem parameters if opt.point2dem_params: # Split the string into individual arguments point2dem_cmd.extend(shlex.split(opt.point2dem_params)) # If --orthoimage is requested, insert L.tif right after it if opt.point2dem_params and '--orthoimage' in opt.point2dem_params: l_file = out_prefix + "-L.tif" # Find --orthoimage in the command and insert L.tif after it try: ortho_idx = point2dem_cmd.index('--orthoimage') point2dem_cmd.insert(ortho_idx + 1, l_file) except ValueError: pass # Should not happen since we checked for it if opt.dry_run: print(' '.join(point2dem_cmd)) else: (out, err, status) = asp_system_utils.executeCommand(point2dem_cmd, realTimeOutput = True) if status != 0: print(f"ERROR: point2dem failed with status {status}") return status print(f"\npoint2dem completed successfully.") return 0 def generateRunIndex(parsed_sweeps, output_dir): """Generate run_index.csv mapping run directories to parameter values. Args: parsed_sweeps: List of sweep dicts with combinations output_dir: Output directory for the CSV file """ # Collect all unique parameter names across all sweeps all_params = set() for sweep in parsed_sweeps: for combo in sweep['combinations']: all_params.update(combo.keys()) # Sort parameter names for consistent column ordering param_names = sorted(all_params) # Build CSV content csv_lines = [] # Header row header = ['run_dir'] + param_names csv_lines.append(', '.join(header)) # Data rows run_num = 0 for sweep in parsed_sweeps: for combo in sweep['combinations']: run_dir = f"{output_dir}/run_{run_num:04d}" row = [run_dir] # Add parameter values, handling commas in values (convert to spaces) for param in param_names: if param in combo: value = combo[param] # Replace commas with spaces (multi-value parameters) if ',' in value: value = value.replace(',', ' ') row.append(value) else: row.append('') # Empty if parameter not in this combination csv_lines.append(', '.join(row)) run_num += 1 # Write to file csv_path = os.path.join(output_dir, 'run_index.csv') with open(csv_path, 'w') as f: f.write('\n'.join(csv_lines) + '\n') print(f"Writing run index: {csv_path}") def main(): parser = argparse.ArgumentParser( description='Run parallel_stereo on small patches with different ' + \ 'parameter combinations.') parser.add_argument('--param-sweep', action='append', default=[], help='Parameter sweep. Must be in quotes. Multiple such options can be ' + \ 'specified. Each defines a different set of parameter combinations to test.') parser.add_argument('--dem', default='', help='Input DEM for mapprojection. Required if using --proj-win.') parser.add_argument('--output-dir', default='', help='Output directory.') parser.add_argument('--point2dem-params', default='', help='Parameters to pass to point2dem. If --orthoimage (with no ' + \ 'argument) is passed in, the needed L.tif will be passed to each ' + \ 'created point2dem command.') parser.add_argument('--dry-run', dest='dry_run', action='store_true', help='Print commands without executing them.') if len(sys.argv) == 1: parser.print_help() return 0 (opt, args) = parser.parse_known_args() # Check that output directory is provided if not opt.output_dir: print("ERROR: --output-dir is required") return 1 # Check if --proj-win is used in any sweep, and if so, require --dem has_proj_win = False if opt.param_sweep: for sweep_str in opt.param_sweep: if '--proj-win' in sweep_str: has_proj_win = True break if has_proj_win and not opt.dem: print("ERROR: --dem is required when using --proj-win in parameter sweeps") return 1 # Parse parameter sweeps - each --param-sweep creates a separate experiment parsed_sweeps = [] run_count = 0 # Running total of runs across all sweeps if opt.param_sweep: for sweep_num, sweep_str in enumerate(opt.param_sweep, start=1): parsed = parseParamSweep(sweep_str) combinations = generateCombinations(parsed) parsed_sweeps.append({ 'sweep_num': sweep_num, 'run_start': run_count, 'combinations': combinations }) run_count += len(combinations) # If no sweeps specified, run once with no extra parameters if not parsed_sweeps: print("No parameter sweeps specified, running single instance") out_prefix = opt.output_dir + "/run" os.makedirs(opt.output_dir, exist_ok=True) status = runCombination({}, args, opt, out_prefix) return status # Create output directory and generate run index before starting runs os.makedirs(opt.output_dir, exist_ok=True) generateRunIndex(parsed_sweeps, opt.output_dir) # Iterate over all sweeps and combinations run_num = 0 for sweep in parsed_sweeps: print(f"\nProcessing sweep {sweep['sweep_num']}") for combo in sweep['combinations']: # Create run directory with zero-padded number run_dir = f"{opt.output_dir}/run_{run_num:04d}" os.makedirs(run_dir, exist_ok=True) out_prefix = f"{run_dir}/run" print(f"\nRun {run_num:04d}") print(f"Parameters: {combo}") status = runCombination(combo, args, opt, out_prefix) if status != 0: print(f"ERROR: Run {run_num:04d} failed, stopping") return 1 run_num += 1 print(f"\nAll {run_num} runs completed successfully") return 0 if __name__ == '__main__': sys.exit(main()) ================================================ FILE: src/asp/Tools/stereo_tile ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2026, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ """ stereo_tile - Process a single tile for distributed stereo. """ import sys, argparse, subprocess, re, os, math, time, glob, shutil, platform, shlex import os.path as P # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) # Import after setting up the paths import asp_system_utils, asp_string_utils, asp_cmd_utils, asp_stereo_utils, asp_alg_utils asp_system_utils.verify_python_version_is_supported() # Prepend to system PATH os.environ["PATH"] = libexecpath + os.pathsep + os.environ["PATH"] # Ensure we can look up the needed ASP libraries if 'ASP_LIBRARY_PATH' in os.environ: os.environ['LD_LIBRARY_PATH'] = os.environ['ASP_LIBRARY_PATH'] def symlinkStatsFiles(outPrefix, tileSubdir, tilePrefix): '''Symlink stats files from parent directory to tile subdir.''' for f in glob.glob(outPrefix + '*stats.tif'): if os.path.isdir(f): continue relSrc = os.path.relpath(f, tileSubdir) dstF = f.replace(outPrefix, tilePrefix) if not os.path.lexists(dstF): os.symlink(relSrc, dstF) def getTileByIndex(outPrefix, tileIndex): '''Read the tile list and return (BBox, padding) for the given tile index.''' tiles = asp_stereo_utils.readDistTileList(outPrefix) if tileIndex < 0 or tileIndex >= len(tiles): asp_system_utils.raise_error('Tile index ' + str(tileIndex) + ' out of range [0, ' + str(len(tiles) - 1) + ']') return tiles[tileIndex] def runDemMosaicBlock(masterFile, blockIndex, opt): '''Run dem_mosaic on a block of DEMs specified in a list. The master file has the input list and output DEM name at the given index.''' with open(masterFile, 'r') as f: lines = [l.strip() for l in f if l.strip()] if blockIndex < 0 or blockIndex >= len(lines): asp_system_utils.raise_error('Block index ' + str(blockIndex) + ' out of range [0, ' + str(len(lines) - 1) + ']') parts = lines[blockIndex].split() if len(parts) != 2: asp_system_utils.raise_error('Invalid master file line: ' + lines[blockIndex]) demListFile = parts[0] outputDem = parts[1] demMosaicPath = asp_system_utils.bin_path('dem_mosaic') commandList = [demMosaicPath, '--dem-list', demListFile, '-o', outputDem] if opt.dryrun: print('Command: ' + ' '.join(commandList)) else: if opt.verbose: print(' '.join(commandList)) subprocess.call(commandList) def runPoint2dem(tilePrefix, opt): '''Run point2dem on a tile's point cloud.''' pcFile = tilePrefix + '-PC.tif' commandList = [asp_system_utils.bin_path('point2dem')] if opt.point2dem_options: commandList += shlex.split(opt.point2dem_options) # If --orthoimage is in the options with no argument, insert L.tif after it if opt.point2dem_options and '--orthoimage' in opt.point2dem_options: lFile = tilePrefix + '-L.tif' try: orthoIdx = commandList.index('--orthoimage') commandList.insert(orthoIdx + 1, lFile) except ValueError: pass commandList.append(pcFile) if opt.dryrun: print('Command: ' + ' '.join(commandList)) else: if opt.verbose: print(' '.join(commandList)) subprocess.call(commandList) if __name__ == '__main__': usage = '''stereo_tile [options] <images> [<cameras>] <output_prefix> Process a single tile for distributed stereo.\n''' + asp_system_utils.get_asp_version() p = argparse.ArgumentParser(usage=usage) p.add_argument('--tile-index', dest='tile_index', default=None, type=int, help='Index of the tile to process (0-based).') p.add_argument('-e', '--entry-point', dest='entry_point', default=0, type=int, help='Stereo pipeline entry point (default: 0). Values: 0=pprc, ' '1=corr, 2=blend, 3=rfne, 4=fltr, 5=tri, 6=cleanup, 7=dem.') p.add_argument('--stop-point', dest='stop_point', default=9, type=int, help='Stereo pipeline stop point, stop before this step ' '(default: 9).') p.add_argument('--dem', dest='dem', default=None, help='Input DEM for mapprojection. Required for tile processing.') p.add_argument('--point2dem-options', dest='point2dem_options', default='', help='Options to pass to point2dem. Can pass --orthoimage ' 'with no argument, and the L.tif file for each tile ' 'will be autocompleted. Can also pass --errorimage.') p.add_argument('-s', '--stereo-file', dest='stereo_file', default='./stereo.default', help='Explicitly specify the stereo.default file to use. ' 'This is optional.') p.add_argument('--corr-seed-mode', dest='seed_mode', default=None, type=int, help='Correlation seed strategy. See stereo_corr for options.') p.add_argument('--sparse-disp-options', dest='sparse_disp_options', default=None, help='Options to pass directly to sparse_disp. Use quotes ' 'around this string.') p.add_argument('--dem-mosaic-index', dest='dem_mosaic_index', default=None, type=int, help='Index of the mosaic block to process (0-based). ' 'Requires --dem-mosaic-master. Invoked by stereo_dist for ' 'parallel DEM mosaicking.') p.add_argument('--dem-mosaic-master', dest='dem_mosaic_master', default=None, help='Master file enumerating for each block to mosaic the ' 'input DEM list file and output DEM path, one block per line.') p.add_argument('--run-dir', dest='runDir', default=None, help='Directory in which the script is running.') p.add_argument('--verbose', dest='verbose', default=False, action='store_true', help='Display the commands being executed.') p.add_argument('--dry-run', dest='dryrun', default=False, action='store_true', help='Do not launch the jobs, only print the commands that ' 'should be run.') p.add_argument('-v', '--version', dest='version', default=False, action='store_true', help='Display the version of the software.') (opt, args) = p.parse_known_args() args = asp_cmd_utils.clean_args(args) if opt.version: asp_system_utils.print_version_and_exit() # This can handle spaces in directory names, unlike when GNU parallel is in charge if opt.runDir is not None: os.chdir(opt.runDir) # Handle dem mosaic mode. Runs dem_mosaic on one block and exits. Hence this # aux tool does both mosaicking of DEMs or running stereo tiles depending on # the options. if opt.dem_mosaic_index is not None: if opt.dem_mosaic_master is None: asp_system_utils.raise_error('--dem-mosaic-master is required with ' + '--dem-mosaic-index.') runDemMosaicBlock(opt.dem_mosaic_master, opt.dem_mosaic_index, opt) sys.exit(0) # In tile processing mode there should be some positional arguments if not args and not opt.version: p.print_help() asp_system_utils.raise_error('Missing input files.', code=2) if opt.tile_index is None: asp_system_utils.raise_error('The option --tile-index is required.', code=2) if opt.dem is None: asp_system_utils.raise_error('The option --dem is required for tile processing.', code=2) # These are not supported as stereo_tile manages its own crop windows per tile for bad_opt in ['--left-image-crop-win', '--right-image-crop-win']: if bad_opt in args: asp_system_utils.raise_error('The option ' + bad_opt + ' is not supported by stereo_tile.') # Pass the DEM to the stereo C++ tools args.extend(['--dem', opt.dem]) # Resolve corr-seed-mode from CLI, stereo file, or default sep = "," asp_stereo_utils.resolve_seed_mode(opt, args) if os.path.exists(opt.stereo_file): args.extend(['--stereo-file', opt.stereo_file]) # Run stereo_parse to get settings settings = asp_system_utils.run_and_parse_output("stereo_parse", args, sep, opt.verbose) outPrefix = settings['out_prefix'][0] print("Output prefix: " + outPrefix) print("Tile index: " + str(opt.tile_index)) (tile, padding) = getTileByIndex(outPrefix, opt.tile_index) print("Tile: " + tile.name_str() + ", padding: " + str(padding)) # Create tile subdir tileSubdir = outPrefix + '-' + tile.name_str() asp_system_utils.mkdir_p(tileSubdir) tilePrefix = tileSubdir + '/' + os.path.basename(outPrefix) # Symlink stats files to the subdir symlinkStatsFiles(outPrefix, tileSubdir, tilePrefix) # Common extra args for all steps extraArgs = ['--output-prefix-override', tilePrefix, '--stereo-dist-mode', '--left-image-crop-win', str(tile.x), str(tile.y), str(tile.width), str(tile.height), '--sgm-collar-size', str(padding)] Step = asp_stereo_utils.Step # Validate --tr is in point2dem options when DEM step will run if opt.entry_point <= Step.dem < opt.stop_point and '--tr' not in opt.point2dem_options: asp_system_utils.raise_error('The option --point2dem-options must include --tr to ' 'ensure consistent grid size across all tiles.') if opt.entry_point <= Step.pprc < opt.stop_point: asp_stereo_utils.stereo_run('stereo_pprc', args, opt, extra_args=extraArgs) if opt.entry_point <= Step.corr < opt.stop_point: # Compute low-res disparity (uses sparse_disp for seed mode 3) tile_args = args + ['--output-prefix-override', tilePrefix] asp_stereo_utils.calc_lowres_disp(tile_args, opt, sep) # Run full-res correlation asp_stereo_utils.stereo_run('stereo_corr', args, opt, extra_args=extraArgs) # Skip blend - in distributed stereo each tile goes to point cloud/DEM independently, # then only final DEMs are merged. No cross-talk needed until DEM merging. if opt.entry_point <= Step.rfne < opt.stop_point: asp_stereo_utils.stereo_run('stereo_rfne', args, opt, extra_args=extraArgs) if opt.entry_point <= Step.fltr < opt.stop_point: asp_stereo_utils.stereo_run('stereo_fltr', args, opt, extra_args=extraArgs) if opt.entry_point <= Step.tri < opt.stop_point: asp_stereo_utils.stereo_run('stereo_tri', args, opt, extra_args=extraArgs) # TODO(oalexan1): Implement cleanup step (delete intermediate files per tile) if opt.entry_point <= Step.clean < opt.stop_point: pass if opt.entry_point <= Step.dem < opt.stop_point: runPoint2dem(tilePrefix, opt) sys.exit(0) ================================================ FILE: src/asp/Tools/stereo_tri.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2026, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file stereo_tri.cc /// // We must have the implementations of all sessions for triangulation #include <asp/Sessions/StereoSessionFactory.h> #include <asp/Sessions/StereoSessionMapProj.h> #include <asp/Sessions/StereoSessionIsis.h> #include <asp/Sessions/StereoSessionNadirPinhole.h> #include <asp/Sessions/StereoSessionPinhole.h> #include <asp/Sessions/StereoSessionRPC.h> #include <asp/Sessions/StereoSessionASTER.h> #include <asp/Camera/RPCModel.h> #include <asp/Camera/Covariance.h> #include <asp/Core/StereoSettings.h> #include <asp/Core/PointUtils.h> #include <asp/Core/DisparityProcessing.h> #include <asp/Core/Bathymetry.h> #include <asp/Core/Macros.h> #include <asp/Core/AspLog.h> #include <asp/Core/IpMatchingAlgs.h> #include <asp/Core/ImageUtils.h> #include <asp/Core/GdalUtils.h> #include <asp/Tools/stereo.h> #include <vw/Camera/CameraModel.h> #include <vw/Stereo/StereoView.h> #include <vw/Cartography/BathyStereoModel.h> #include <vw/Stereo/DisparityMap.h> #include <vw/Image/Filter.h> #include <vw/InterestPoint/MatcherIO.h> #include <vw/Cartography/Map2CamTrans.h> #include <vw/Core/Stopwatch.h> #include <xercesc/util/PlatformUtils.hpp> #include <ctime> using namespace vw; namespace asp { enum OUTPUT_CLOUD_TYPE {FULL_CLOUD, BATHY_CLOUD, TOPO_CLOUD}; // all, below water, above water /// The main class for taking in a set of disparities and returning a /// point cloud using triangulation. Will compute the triangulation /// error, and perhaps propagate covariances (creating stddev). class StereoTriangulation: public ImageViewBase<StereoTriangulation> { std::vector<DispImageType> m_disparity_maps; std::vector<const vw::camera::CameraModel*> m_camera_ptrs; std::vector<vw::TransformPtr> m_transforms; // e.g., map-projection or homography to undo vw::cartography::Datum m_datum; vw::stereo::StereoModel m_stereo_model; vw::BathyStereoModel m_bathy_model; bool m_is_map_projected; bool m_bathy_correct; OUTPUT_CLOUD_TYPE m_cloud_type; ImageViewRef<PixelMask<float>> m_left_aligned_bathy_mask; ImageViewRef<PixelMask<float>> m_right_aligned_bathy_mask; typedef typename DispImageType::pixel_type DPixelT; public: typedef Vector6 pixel_type; typedef Vector6 result_type; typedef ProceduralPixelAccessor<StereoTriangulation> pixel_accessor; /// Constructor StereoTriangulation(std::vector<DispImageType> const& disparity_maps, std::vector<const vw::camera::CameraModel*> const& camera_ptrs, std::vector<vw::TransformPtr> const& transforms, vw::cartography::Datum const& datum, vw::stereo::StereoModel const& stereo_model, vw::BathyStereoModel const& bathy_model, bool is_map_projected, bool bathy_correct, OUTPUT_CLOUD_TYPE cloud_type, ImageViewRef<PixelMask<float>> left_aligned_bathy_mask, ImageViewRef<PixelMask<float>> right_aligned_bathy_mask): m_disparity_maps(disparity_maps), m_camera_ptrs(camera_ptrs), m_transforms(transforms), m_datum(datum), m_stereo_model(stereo_model), m_bathy_model(bathy_model), m_is_map_projected(is_map_projected), m_bathy_correct(bathy_correct), m_cloud_type(cloud_type), m_left_aligned_bathy_mask(left_aligned_bathy_mask), m_right_aligned_bathy_mask(right_aligned_bathy_mask) { // Sanity check for (int p = 1; p < (int)m_disparity_maps.size(); p++) { if (m_disparity_maps[0].cols() != m_disparity_maps[p].cols() || m_disparity_maps[0].rows() != m_disparity_maps[p].rows()) vw_throw(ArgumentErr() << "In multi-view triangulation, all disparities " << "must have the same dimensions.\n"); } } inline int32 cols () const { return m_disparity_maps[0].cols(); } inline int32 rows () const { return m_disparity_maps[0].rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this); } /// Compute the 3D coordinate corresponding to a pixel location. /// - p is not actually used here, it should always be zero! inline result_type operator()(size_t i, size_t j, size_t p = 0) const { // For each input image, de-warp the pixel in to the native camera coordinates int num_disp = m_disparity_maps.size(); std::vector<Vector2> pixVec(num_disp + 1); pixVec[0] = m_transforms[0]->reverse(Vector2(i,j)); // De-warp "left" pixel for (int c = 0; c < num_disp; c++) { Vector2 pix; DPixelT disp = m_disparity_maps[c](i,j,p); // Disparity value at this pixel if (is_valid(disp)) // De-warp the "right" pixel pix = m_transforms[c+1]->reverse(Vector2(i,j) + stereo::DispHelper(disp)); else // Insert flag values pix = Vector2(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()); pixVec[c+1] = pix; } // Compute the location of the 3D point observed by each input pixel // when no bathymetry correction is needed. Vector3 errorVec; pixel_type result; if (!m_bathy_correct) { try { subvector(result, 0, 3) = m_stereo_model(pixVec, errorVec); double errLen = norm_2(errorVec); if (!stereo_settings().propagate_errors) { subvector(result, 3, 3) = errorVec; } else { // Store intersection error norm in band 3, horizontal // stddev in band 4, and vertical stddev in band 5 (if band // index starts from 0). result[3] = errLen; auto const& v = asp::stereo_settings().horizontal_stddev; // alias subvector(result, 4, 2) = asp::propagateCovariance(subvector(result, 0, 3), m_datum, v[0], v[1], m_camera_ptrs[0], m_camera_ptrs[1], pixVec[0], pixVec[1]); } // Filter by triangulation error, if desired if (stereo_settings().max_valid_triangulation_error > 0.0 && errLen > stereo_settings().max_valid_triangulation_error) { result = pixel_type(); errorVec = Vector3(); } } catch(...) { return pixel_type(); // The zero vector, it means that there is no valid data } return result; // Contains location and error vector } // Continue with bathymetry correction. Note how we assume no // multi-view stereo happens. Vector2 lpix(i, j); DPixelT disp = m_disparity_maps[0](i, j, p); if (!is_valid(disp)) { subvector(result, 0, 3) = Vector3(0, 0, 0); subvector(result, 3, 3) = Vector3(0, 0, 0); return result; } // See if both the left and right aligned matching pixels are in the aligned // bathymetry masks which means bathymetry correction should happen. // Note that pixVec has the unwarped left and right pixels. Vector2 rpix = lpix + stereo::DispHelper(disp); // Do bathy only when the mask is invalid (under water) bool do_bathy = vw::areMasked(m_left_aligned_bathy_mask, m_right_aligned_bathy_mask, lpix, rpix); if (m_cloud_type == TOPO_CLOUD) { if (!do_bathy) { // We are on dry land. Triangulate as before. In this mode // the bathy plane may not even exist. subvector(result, 0, 3) = m_stereo_model(pixVec, errorVec); subvector(result, 3, 3) = errorVec; return result; } else { // We are under water, but we are not interested in the bathy // point cloud. Return no-data. subvector(result, 0, 3) = Vector3(0, 0, 0); subvector(result, 3, 3) = Vector3(0, 0, 0); return result; } } if ((m_cloud_type == BATHY_CLOUD && !do_bathy)) { // There is no point in continuing, as we won't get what is asked subvector(result, 0, 3) = Vector3(0, 0, 0); subvector(result, 3, 3) = Vector3(0, 0, 0); return result; } // Do the triangulation. The did_bathy variable may change. bool did_bathy = false; subvector(result, 0, 3) = m_bathy_model(pixVec, errorVec, do_bathy, did_bathy); subvector(result, 3, 3) = errorVec; // If we wanted to do bathy correction and it did not happen, or the opposite, // don't return the computed answer if ((m_cloud_type == BATHY_CLOUD && !did_bathy) || (m_cloud_type == TOPO_CLOUD && did_bathy)) { subvector(result, 0, 3) = Vector3(0, 0, 0); subvector(result, 3, 3) = Vector3(0, 0, 0); return result; } // Filter by triangulation error, if desired if (stereo_settings().max_valid_triangulation_error > 0.0 && norm_2(errorVec) > stereo_settings().max_valid_triangulation_error) { result = pixel_type(); errorVec = Vector3(); } return result; // Contains location and error vector } typedef StereoTriangulation prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { return PreRasterHelper(bbox, m_transforms); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i const& bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } private: // Find the region associated with the right image that we need to bring in memory // based on the disparity BBox2i calc_right_bbox(BBox2i const& left_bbox, ImageView<DPixelT> const& disparity) const { BBox2i disparity_range = stereo::get_disparity_range(disparity); disparity_range.max() += Vector2i(1,1); BBox2i right_bbox = left_bbox + disparity_range.min(); right_bbox.max() += disparity_range.size(); return right_bbox; } /// RPC Map Transform needs to be explicitly copied and told to cache for performance. template <class T> prerasterize_type PreRasterHelper(BBox2i const& bbox, std::vector<T> const& transforms) const { ImageViewRef<PixelMask<float>> in_memory_left_aligned_bathy_mask; ImageViewRef<PixelMask<float>> in_memory_right_aligned_bathy_mask; // Code for NON-MAP-PROJECTED session types. if (m_is_map_projected == false) { // We explicitly bring in-memory the disparities for the current box // to speed up processing later, and then we pretend this is the entire // image by virtually enlarging it using a CropView. std::vector<ImageViewRef<DPixelT>> disparity_cropviews; for (int p = 0; p < (int)m_disparity_maps.size(); p++) { ImageView<DPixelT> clip = crop(m_disparity_maps[p], bbox); ImageViewRef<DPixelT> cropview_clip = crop(clip, -bbox.min().x(), -bbox.min().y(), cols(), rows()); disparity_cropviews.push_back(cropview_clip); if (m_bathy_correct) { // Bring the needed parts of the bathy masks in memory as well. // We assume no multiview for stereo with bathy correction. BBox2i right_bbox = calc_right_bbox(bbox, clip); // Bring the needed parts of the bathy masks in memory as well BBox2i cropped_right_bbox = right_bbox; cropped_right_bbox.expand(1); // will be needed later during triangulation cropped_right_bbox.crop(bounding_box(m_right_aligned_bathy_mask)); ImageView<PixelMask<float>> l_mask_clip = crop(m_left_aligned_bathy_mask, bbox); ImageView<PixelMask<float>> r_mask_clip = crop(m_right_aligned_bathy_mask, cropped_right_bbox); in_memory_left_aligned_bathy_mask = crop(l_mask_clip, -bbox.min().x(), -bbox.min().y(), cols(), rows()); in_memory_right_aligned_bathy_mask = crop(r_mask_clip, -cropped_right_bbox.min().x(), -cropped_right_bbox.min().y(), cols(), rows()); } } return prerasterize_type(disparity_cropviews, m_camera_ptrs, transforms, m_datum, m_stereo_model, m_bathy_model, m_is_map_projected, m_bathy_correct, m_cloud_type, in_memory_left_aligned_bathy_mask, in_memory_right_aligned_bathy_mask); } // Code for MAP-PROJECTED session types. // This is to help any transforms (right now just Map2CamTrans) // that must cache their side data. Normally this would happen if // we were using a TransformView. Copies are made of the // transforms so we are not having a race condition with setting // the cache in both transforms while the other threads want to do the same. // Without some sort of duplication function in the transform base class we need // to manually copy the Map2CamTrans type which is pretty hacky. std::vector<T> transforms_copy(transforms.size()); for (size_t i = 0; i < transforms.size(); ++i) transforms_copy[i] = vw::cartography::mapproj_trans_copy(transforms[i]); // As a side effect, this call makes transforms_copy create a local cache we // want later. Caching is fast for dense rasterizing purposes, but slow for // sparse pixels. transforms_copy[0]->reverse_bbox(bbox); if (transforms_copy.size() != m_disparity_maps.size() + 1) { vw_throw(ArgumentErr() << "In multi-view triangulation, " << "the number of disparities must be one less " << "than the number of images."); } std::vector<ImageViewRef<DPixelT>> disparity_cropviews; for (int p = 0; p < (int)m_disparity_maps.size(); p++) { // We explicitly bring in-memory the disparities for the current // box to speed up processing later, and then we pretend this is // the entire image by virtually enlarging it using a CropView. ImageView<DPixelT> clip(crop(m_disparity_maps[p], bbox)); ImageViewRef<DPixelT> cropview_clip = crop(clip, -bbox.min().x(), -bbox.min().y(), cols(), rows()); disparity_cropviews.push_back(cropview_clip); // Calculate the bbox necessary to bring things into memory BBox2i right_bbox = calc_right_bbox(bbox, clip); if (m_bathy_correct) { // Bring the needed parts of the bathy masks in memory as well BBox2i cropped_right_bbox = right_bbox; cropped_right_bbox.expand(1); // will be needed later during triangulation cropped_right_bbox.crop(bounding_box(m_right_aligned_bathy_mask)); ImageView<PixelMask<float>> l_mask_clip = crop(m_left_aligned_bathy_mask, bbox); ImageView<PixelMask<float>> r_mask_clip = crop(m_right_aligned_bathy_mask, cropped_right_bbox); in_memory_left_aligned_bathy_mask = crop(l_mask_clip, -bbox.min().x(), -bbox.min().y(), cols(), rows()); in_memory_right_aligned_bathy_mask = crop(r_mask_clip, -cropped_right_bbox.min().x(), -cropped_right_bbox.min().y(), cols(), rows()); } // Also cache the data for subsequent transforms // As a side effect this call makes transforms_copy create a local cache we want later transforms_copy[p+1]->reverse_bbox(right_bbox); } return prerasterize_type(disparity_cropviews, m_camera_ptrs, transforms_copy, m_datum, m_stereo_model, m_bathy_model, m_is_map_projected, m_bathy_correct, m_cloud_type, in_memory_left_aligned_bathy_mask, in_memory_right_aligned_bathy_mask); } // End function PreRasterHelper() mapprojected version }; // End class StereoTriangulation /// A wrapper function for StereoTriangulation view construction StereoTriangulation stereo_triangulation(std::vector<DispImageType> const& disparities, std::vector<const vw::camera::CameraModel*> const& camera_ptrs, std::vector<vw::TransformPtr> const& transforms, vw::cartography::Datum const& datum, vw::stereo::StereoModel const& stereo_model, vw::BathyStereoModel const& bathy_model, bool is_map_projected, bool bathy_correct, OUTPUT_CLOUD_TYPE cloud_type, ImageViewRef<PixelMask<float>> left_aligned_bathy_mask, ImageViewRef<PixelMask<float>> right_aligned_bathy_mask) { typedef StereoTriangulation result_type; return result_type(disparities, camera_ptrs, transforms, datum, stereo_model, bathy_model, is_map_projected, bathy_correct, cloud_type, left_aligned_bathy_mask, right_aligned_bathy_mask); } // TODO(oalexan1): Move some of these functions to a class or something! // ImageView operator that takes the last three elements of a vector // (the error part) and replaces them with the norm of that 3-vector. struct PointAndErrorNorm : public ReturnFixedType<Vector4> { Vector4 operator() (Vector6 const& pt) const { Vector4 result; subvector(result,0,3) = subvector(pt,0,3); result[3] = norm_2(subvector(pt,3,3)); return result; } }; template <class ImageT> UnaryPerPixelView<ImageT, PointAndErrorNorm> inline point_and_error_norm(ImageViewBase<ImageT> const& image) { return UnaryPerPixelView<ImageT, PointAndErrorNorm>(image.impl(), PointAndErrorNorm()); } template <class ImageT> void save_point_cloud(Vector3 const& shift, ImageT const& point_cloud, std::string const& point_cloud_file, vw::cartography::GeoReference const& georef, ASPGlobalOptions const& opt) { vw_out() << "Writing point cloud: " << point_cloud_file << "\n"; bool has_georef = true; bool has_nodata = false; double nodata = -std::numeric_limits<float>::max(); // smallest float std::map<std::string, std::string> keywords; // will go to the geoheader if (stereo_settings().propagate_errors) { keywords["BAND1"] = "ECEF_X"; keywords["BAND2"] = "ECEF_Y"; keywords["BAND3"] = "ECEF_Z"; keywords["BAND4"] = "IntersectionErr"; keywords["BAND5"] = "HorizontalStdDev"; keywords["BAND6"] = "VerticalStdDev"; } if (opt.session->supports_multi_threading()) { asp::block_write_approx_gdal_image (point_cloud_file, shift, stereo_settings().point_cloud_rounding_error, point_cloud, has_georef, georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Triangulating: "), keywords); } else { // ISIS does not support multi-threading asp::write_approx_gdal_image (point_cloud_file, shift, stereo_settings().point_cloud_rounding_error, point_cloud, has_georef, georef, has_nodata, nodata, opt, TerminalProgressCallback("asp", "\t--> Triangulating: "), keywords); } } // TODO(oalexan1): Move this to some low-level utils file Vector3 find_approx_points_median(std::vector<Vector3> const& points) { // Find the median of the x coordinates of points, then of y, then of // z. Perturb the median a bit to ensure it is never exactly on top // of a real point, as in such a case after subtraction of that // point from median we'd get the zero vector which by convention // is invalid. if (points.empty()) return Vector3(); Vector3 median; std::vector<double> V(points.size()); for (int i = 0; i < (int)median.size(); i++) { for (int p = 0; p < (int)points.size(); p++) V[p] = points[p][i]; sort(V.begin(), V.end()); median[i] = V[points.size()/2]; median[i] += median[i]*1e-10*rand()/double(RAND_MAX); } return median; } // Find the point cloud center // TODO(oalexan1): Move this to some low-level point cloud utils file Vector3 find_point_cloud_center(Vector2i const& tile_size, ImageViewRef<Vector6> const& point_cloud) { // Estimate the cloud center with coarse sampling std::vector<Vector3> points; for (int attempt = 1; attempt <= 4; attempt++) { double numSamples = 25 * attempt; int dcol = round(point_cloud.cols()/numSamples); int drow = round(point_cloud.rows()/numSamples); if (dcol < 1) dcol = 1; if (drow < 1) drow = 1; // Iterate over the cloud with this sampling rate for (int col = 0; col < point_cloud.cols(); col += dcol) { for (int row = 0; row < point_cloud.rows(); row += drow) { Vector3 xyz = subvector(point_cloud(col, row), 0, 3); if (xyz == Vector3()) continue; // skip invalid points points.push_back(xyz); } } if (points.size() > 1) return find_approx_points_median(points); vw::vw_out() << "Failed to estimate the point cloud center in attempt: " << attempt << ". Will try again with denser sampling.\n"; } // If sampling fails, do a more thorough algorithm. This can be very slow // if the point cloud has a big hole in the middle. // Compute the point cloud in a tile around the center of the // cloud. Find the median of all the points in that cloud. That // will be the cloud center. If the tile is too small, spiral away // from the center adding other tiles. Keep the tiles aligned to a // multiple of tile_size, for consistency with how the point cloud // is written to disk later on. // The logic is done on tiles of pixels, rather than per individual // pixel, as that's the only way we can access the point cloud structure. int numx = (int)ceil(point_cloud.cols()/double(tile_size[0])); int numy = (int)ceil(point_cloud.rows()/double(tile_size[1])); // Trace an ever growing square "ring" for (int r = 0; r <= std::max(numx/2, numy/2); r++) { // We are now on the boundary of the square of size 2*r with // center at (numx/2, numy/2). Iterate over that boundary. for (int x = numx/2-r; x <= numx/2+r; x++) { for (int y = numy/2-r; y <= numy/2+r; y++) { if (x != numx/2-r && x != numx/2+r && y != numy/2-r && y != numy/2+r) continue; // Skip inner points; we must keep on the "ring" for given r. if (x < 0 || y < 0 || x >= numx || y >= numy) continue; // out of bounds BBox2i tile(x*tile_size[0], y*tile_size[1], tile_size[0], tile_size[1]); tile.crop(bounding_box(point_cloud)); // Crop to the cloud area actually having points tile.crop(stereo_settings().trans_crop_win); // Triangulate in the existing tile. That will trigger // many complicated calculations and the result will be // in memory in cropped_cloud. ImageView<Vector6> cropped_cloud = crop(point_cloud, tile); for (int px = 0; px < cropped_cloud.cols(); px++) { for (int py = 0; py < cropped_cloud.rows(); py++) { Vector3 xyz = subvector(cropped_cloud(px, py), 0, 3); if (xyz == Vector3()) continue; points.push_back(xyz); } } // Stop if we have enough points to do a reliable mean estimation if (points.size() > 100) return find_approx_points_median(points); }// end y loop }// end x loop }// end r loop // Have to use what we've got return find_approx_points_median(points); } // TODO(oalexan1): Move this to some low-level new util file bool read_point(std::string const& file, Vector3 & point) { point = Vector3(); std::ifstream fh(file.c_str()); if (!fh.good()) return false; for (int c = 0; c < (int)point.size(); c++) if (! (fh >> point[c])) return false; return true; } void write_point(std::string const& file, Vector3 const& point) { std::ofstream fh(file.c_str()); fh.precision(18); // precision(16) is not enough for (int c = 0; c < (int)point.size(); c++) fh << point[c] << " "; fh << "\n"; } // This is some logic unrelated to triangulation, but there seems to be no // good place to put it. Unalign the disparity, and/or create match points // from disparity, and/or solve for jitter. void disp_or_matches_work(std::string const& output_prefix, std::vector<ASPGlobalOptions> const& opt_vec, std::vector<vw::TransformPtr> const& transforms, std::vector<DispImageType> const& disparity_maps, std::vector<std::string> const& image_files, std::vector<std::string> const& camera_files, // Cameras can change std::vector<boost::shared_ptr<camera::CameraModel>> & cameras) { // Sanity check for some of the operations below VW_ASSERT(disparity_maps.size() == 1 && transforms.size() == 2, vw::ArgumentErr() << "Expecting two images and one disparity.\n"); ASPGlobalOptions opt = opt_vec[0]; bool is_map_projected = opt.session->isMapProjected(); // Transforms to compensate for alignment vw::TransformPtr left_trans = transforms[0]; vw::TransformPtr right_trans = transforms[1]; // Create a disparity map with between the original unaligned images if (stereo_settings().unalign_disparity) { bool matches_as_txt = stereo_settings().matches_as_txt; std::string unaligned_disp_file = asp::unwarped_disp_file(output_prefix, opt.in_file1, opt.in_file2, matches_as_txt); unalign_disparity(is_map_projected, disparity_maps[0], left_trans, right_trans, opt, unaligned_disp_file); } // If the images are mapprojected and we know the original image names, // use those for the match file. That because the matches are between // the original images, not the map-projected ones. // Read the raw image names from the mapprojection metadata. std::string left_raw_image = opt.in_file1, right_raw_image = opt.in_file2; { std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key; std::string adj, img, cam_type, cam_file, dem; asp::read_mapproj_header(opt.in_file1, adj_key, img_key, cam_type_key, cam_file_key, dem_key, adj, img, cam_type, cam_file, dem); if (!img.empty()) left_raw_image = img; } { std::string adj_key, img_key, cam_type_key, cam_file_key, dem_key; std::string adj, img, cam_type, cam_file, dem; asp::read_mapproj_header(opt.in_file2, adj_key, img_key, cam_type_key, cam_file_key, dem_key, adj, img, cam_type, cam_file, dem); if (!img.empty()) right_raw_image = img; } bool matches_as_txt = stereo_settings().matches_as_txt; std::string match_file = ip::match_filename(output_prefix + "-disp", left_raw_image, right_raw_image, matches_as_txt); // Pull matches from disparity. if (stereo_settings().num_matches_from_disparity > 0 && stereo_settings().num_matches_from_disp_triplets > 0) { vw_throw(ArgumentErr() << "Cannot have both --num-matches-from-disparity and " << "--num-matches-from-disp-triplets.\n"); } if (stereo_settings().num_matches_from_disparity > 0) { bool gen_triplets = false; matchesFromDisp(opt, disparity_maps[0], left_raw_image, right_raw_image, left_trans, right_trans, match_file, stereo_settings().num_matches_from_disparity, gen_triplets, is_map_projected, stereo_settings().matches_as_txt); } if (stereo_settings().num_matches_from_disp_triplets > 0) { bool gen_triplets = true; matchesFromDisp(opt, disparity_maps[0], left_raw_image, right_raw_image, left_trans, right_trans, match_file, stereo_settings().num_matches_from_disp_triplets, gen_triplets, is_map_projected, stereo_settings().matches_as_txt); } return; } /// Main triangulation function void stereo_triangulation(std::string const& output_prefix, std::vector<ASPGlobalOptions> const& opt_vec) { try { // Outer try/catch bool is_map_projected = opt_vec[0].session->isMapProjected(); // Collect the images, cameras, and transforms. The left image is // the same in all n-1 stereo pairs forming the n images multiview // system. Same for cameras and transforms. std::vector<std::string> image_files, camera_files; std::vector<boost::shared_ptr<camera::CameraModel>> cameras; std::vector<vw::TransformPtr> transforms; for (int p = 0; p < (int)opt_vec.size(); p++) { boost::shared_ptr<camera::CameraModel> camera_model1, camera_model2; opt_vec[p].session->camera_models(camera_model1, camera_model2); boost::shared_ptr<StereoSession> sPtr = opt_vec[p].session; if (p == 0) { // The first image is the "left" image for all pairs. image_files.push_back(opt_vec[p].in_file1); camera_files.push_back(opt_vec[p].cam_file1); cameras.push_back(camera_model1); transforms.push_back(sPtr->tx_left()); } image_files.push_back(opt_vec[p].in_file2); camera_files.push_back(opt_vec[p].cam_file2); cameras.push_back(camera_model2); transforms.push_back(sPtr->tx_right()); } // If the distance from the left camera center to a point is greater than // the universe radius, we remove that pixel and replace it with a zero // vector, which is the missing pixel value in the point_image. // // We apply the universe radius here and then write the result directly to a // file on disk. stereo::UniverseRadiusFunc universe_radius_func(Vector3(), 0, 0); try{ if (stereo_settings().universe_center == "camera") { if (opt_vec[0].session->name() == "rpc") { vw_throw(InputErr() << "Stereo with RPC cameras cannot " << "have the camera as the universe center.\n"); } universe_radius_func = stereo::UniverseRadiusFunc(cameras[0]->camera_center(Vector2()), stereo_settings().near_universe_radius, stereo_settings().far_universe_radius); } else if (stereo_settings().universe_center == "zero") { universe_radius_func = stereo::UniverseRadiusFunc(Vector3(), stereo_settings().near_universe_radius, stereo_settings().far_universe_radius); } } catch (std::exception &e) { vw_out() << e.what() << "\n"; vw_out(WarningMessage) << "Could not find the camera center. " << "Will not be able to filter triangulated points by radius.\n"; } // End try/catch std::vector<DispImageType> disparity_maps; for (int p = 0; p < (int)opt_vec.size(); p++) disparity_maps.push_back (opt_vec[p].session->pre_pointcloud_hook(opt_vec[p].out_prefix+"-F.tif")); bool do_disp_or_matches_work = (stereo_settings().unalign_disparity || stereo_settings().num_matches_from_disparity > 0 || stereo_settings().num_matches_from_disp_triplets > 0); if (do_disp_or_matches_work) { disp_or_matches_work(output_prefix, opt_vec, transforms, disparity_maps, image_files, camera_files, // Cameras can change cameras); } // In correlator mode, can go no further if (asp::stereo_settings().correlator_mode) { vw_out() << "\t--> Skipping triangulation in correlator mode.\n"; return; } if (is_map_projected) vw_out() << "\t--> Inputs are map projected." << "\n"; // Strip the smart pointers and form the stereo model std::vector<const vw::camera::CameraModel*> camera_ptrs; int num_cams = cameras.size(); for (int c = 0; c < num_cams; c++) camera_ptrs.push_back(cameras[c].get()); // Convert the angle tol to be in terms of dot product and pass it // to the stereo model. double angle_tol = vw::stereo::StereoModel::robust_1_minus_cos (stereo_settings().min_triangulation_angle*M_PI/180); // For bathymetry, apply alignment to masks, if it was not done already in preprocessing. // This situation occurs when parallel_stereo is called with --prev-run-prefix, // and the previous run was not a bathy run. Note that we do not do this // when we skip the point cloud center computation. In that mode we are processing // individual parallel_stereo tiles, and the stereo_tri call which aligns the bathy // masks and computes the cloud center just finished. This is fragile logic. bool bathy_correct = asp::doBathy(asp::stereo_settings()); if (bathy_correct && !stereo_settings().skip_point_cloud_center_comp) opt_vec[0].session->align_bathy_masks(opt_vec[0]); // Create both a regular stereo model and a bathy stereo // model. Will use the latter only if we do bathymetry. This way // the regular stereo model and bathy stereo model can have // different interfaces and the former need not know about the // latter. Templates are avoided too. vw::stereo::StereoModel stereo_model(camera_ptrs, angle_tol); vw::BathyStereoModel bathy_stereo_model(camera_ptrs, angle_tol); // See if to return all triangulated points, the ones where bathy correction took // place, or the ones were it did not take place. Switch to an enum // as that is faster to check for later than a string. OUTPUT_CLOUD_TYPE cloud_type; if (stereo_settings().output_cloud_type == "all") cloud_type = FULL_CLOUD; else if (stereo_settings().output_cloud_type == "bathy") cloud_type = BATHY_CLOUD; else if (stereo_settings().output_cloud_type == "topo") cloud_type = TOPO_CLOUD; else vw_throw(ArgumentErr() << "Unknown value for --output-cloud-type.\n"); // Load the bathy plane and masks std::vector<vw::BathyPlane> bathy_plane_vec; ImageViewRef<PixelMask<float>> left_aligned_bathy_mask, right_aligned_bathy_mask; if (bathy_correct) { if (disparity_maps.size() != 1) vw_throw(ArgumentErr() << "Bathymetry correction does not work with multiview stereo.\n"); opt_vec[0].session->read_aligned_bathy_masks(left_aligned_bathy_mask, right_aligned_bathy_mask); if (left_aligned_bathy_mask.cols() != disparity_maps[0].cols() || left_aligned_bathy_mask.rows() != disparity_maps[0].rows()) vw_throw(ArgumentErr() << "The dimensions of disparity and left " << "aligned bathymetry mask must agree.\n"); // The bathy plane is needed only for the underwater component if (asp::stereo_settings().output_cloud_type != "topo") { int num_images = 2; std::string planes_to_load = asp::readBathyPlanesStrOrList(stereo_settings().bathy_plane, stereo_settings().bathy_plane_list); vw::readBathyPlanes(planes_to_load, num_images, bathy_plane_vec); bathy_stereo_model.set_bathy(stereo_settings().refraction_index, bathy_plane_vec); } } // Used to find the datum for the given planet vw::cartography::GeoReference georef = opt_vec[0].session->get_georef(); // Apply radius function and stereo model in one go vw_out() << "\t--> Generating a 3D point cloud." << "\n"; ImageViewRef<Vector6> point_cloud = per_pixel_filter (stereo_triangulation(disparity_maps, camera_ptrs, transforms, georef.datum(), stereo_model, bathy_stereo_model, is_map_projected, bathy_correct, cloud_type, left_aligned_bathy_mask, right_aligned_bathy_mask), universe_radius_func); // In correlator mode, can go no further if (asp::stereo_settings().correlator_mode) return; // If we crop the left and right images, at each run we must // recompute the cloud center, as the cropping windows may have changed. bool crop_left = (stereo_settings().left_image_crop_win != BBox2i(0, 0, 0, 0)); bool crop_right = (stereo_settings().right_image_crop_win != BBox2i(0, 0, 0, 0)); // Compute the point cloud center, unless done by now Vector3 cloud_center = Vector3(); if (!stereo_settings().save_double_precision_point_cloud) { std::string cloud_center_file = output_prefix + "-PC-center.txt"; if (!read_point(cloud_center_file, cloud_center) || crop_left || crop_right) { if (!stereo_settings().skip_point_cloud_center_comp) { vw::Stopwatch sw; sw.start(); cloud_center = find_point_cloud_center(opt_vec[0].raster_tile_size, point_cloud); vw_out() << "Writing point cloud center: " << cloud_center_file << "\n"; write_point(cloud_center_file, cloud_center); sw.stop(); vw::vw_out() << "Elapsed time in point cloud center estimation: " << sw.elapsed_seconds() << " seconds.\n"; } } else { vw_out() << "Reading existing point cloud center: " << cloud_center_file << "\n"; } } if (stereo_settings().compute_point_cloud_center_only) { vw_out() << "Computed the point cloud center.\n"; return; } // We are supposed to do the triangulation in trans_crop_win only // so force rasterization in that box only using crop(). // The cloud has 4 bands unless computing the error vector or stddev, // when it has 6. BBox2i cbox = stereo_settings().trans_crop_win; std::string point_cloud_file = output_prefix + "-PC.tif"; if (stereo_settings().compute_error_vector || stereo_settings().propagate_errors) { // The case num_cams > 2 && stereo_settings().propagate_errors // will throw an exception, so we won't get here. if (num_cams > 2 && stereo_settings().compute_error_vector) vw_out(WarningMessage) << "For more than two cameras, the error " << "vector between rays is not meaningful. " << "Setting it to (err_len, 0, 0)." << "\n"; ImageViewRef<Vector6> crop_pc = crop(point_cloud, cbox); save_point_cloud(cloud_center, crop_pc, point_cloud_file, georef, opt_vec[0]); } else { ImageViewRef<Vector4> crop_pc = crop(point_and_error_norm(point_cloud), cbox); save_point_cloud(cloud_center, crop_pc, point_cloud_file, georef, opt_vec[0]); } // End if/else // Must print this at the end, as it contains statistics on the number of rejected points. vw_out() << "\t--> " << universe_radius_func; } catch (IOErr const& e) { vw_throw(ArgumentErr() << "\nUnable to start at the triangulation stage. " << "Could not read input files.\n" << e.what() << "\n"); } // End outer try/catch } // End function stereo_triangulation() } // End namespace asp int main(int argc, char* argv[]) { if (asp::stereo_settings().correlator_mode && asp::stereo_settings().num_matches_from_disparity <= 0 && asp::stereo_settings().num_matches_from_disp_triplets <= 0) { vw_out() << "The triangulation step is skipped with --correlator-mode.\n"; return 0; } try { xercesc::XMLPlatformUtils::Initialize(); vw_out() << "\n[ " << asp::current_posix_time_string() << " ]: Stage 5 --> TRIANGULATION\n"; asp::stereo_register_sessions(); // Unlike other stereo executables, triangulation can handle multiple images and cameras. bool verbose = false; std::vector<asp::ASPGlobalOptions> opt_vec; std::string output_prefix; asp::parseStereoArgs(argc, argv, asp::TriangulationDescription(), verbose, output_prefix, opt_vec); if (opt_vec.size() > 1) { // For multiview, turn on logging to file in the run directory // in output_prefix, not just in individual subdirectories. asp::log_to_file(argc, argv, opt_vec[0].stereo_default_filename, output_prefix); } // Keep only those stereo pairs for which filtered disparity exists std::vector<asp::ASPGlobalOptions> opt_vec_new; for (int p = 0; p < (int)opt_vec.size(); p++) { if (fs::exists(opt_vec[p].out_prefix+"-F.tif")) opt_vec_new.push_back(opt_vec[p]); } opt_vec = opt_vec_new; if (opt_vec.empty()) vw_throw(ArgumentErr() << "No valid F.tif files found.\n"); // Triangulation uses small tiles. //--------------------------------------------------------- int ts = asp::ASPGlobalOptions::tri_tile_size(); for (int s = 0; s < (int)opt_vec.size(); s++) opt_vec[s].raster_tile_size = Vector2i(ts, ts); // This is good info to have at triangulation. Also prints a warning regarding // small triangulation angle and potentially an empty point cloud. if (opt_vec.size() == 1 && !asp::stereo_settings().stereo_dist_mode) asp::estimate_convergence_angle(opt_vec[0]); asp::stereo_triangulation(output_prefix, opt_vec); vw_out() << "\n[ " << asp::current_posix_time_string() << " ]: TRIANGULATION FINISHED\n"; xercesc::XMLPlatformUtils::Terminate(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/texrecon ================================================ #!/usr/bin/env python # Copyright (c) 2021, United States Government, as represented by the # Administrator of the National Aeronautics and Space Administration. # # All rights reserved. # # The "ISAAC - Integrated System for Autonomous and Adaptive Caretaking # platform" software is licensed under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. """ A wrapper around the tools that when run together produce a textured mesh. """ import argparse, os, re, shutil, subprocess, sys, glob import numpy as np # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_rig_utils, asp_system_utils def process_args(args): """ Set up the parser and parse the args. """ parser = argparse.ArgumentParser(description = "Parameters for texrecon.") parser.add_argument("--rig_config", dest="rig_config", default="", help = "Rig configuration file.") parser.add_argument("--rig_sensor", dest="rig_sensor", default="", help="Which rig sensor images to texture. Must be among the " + \ "sensors specified via --rig_config. To use images from " + "several sensors, pass in a quoted list of them, " + \ "separated by a space.") parser.add_argument("--camera_poses", dest="camera_poses", default="", help= "Read images and camera poses from this list.") parser.add_argument("--subset", dest="subset", default="", help= "Use only the subset of images from this list.") parser.add_argument("--mesh", dest="mesh", default="", help="The mesh to use for texturing, in .ply format.") parser.add_argument("--max_texture_size", dest="max_texture_size", default="2048", help="The maximum size (in pixels) of each texture file " + \ "created for the produced textured mesh.") parser.add_argument("--texture_alg", dest="texture_alg", 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).") parser.add_argument('--skip_local_seam_leveling', dest = "skip_local_seam_leveling", action='store_true') parser.add_argument("--out_dir", dest="out_dir", default="", help="The directory where to write the textured mesh " + \ "and other data.") # Note how the percent sign below is escaped, by writing: %% parser.add_argument("--undistorted_crop_win", dest="undistorted_crop_win", default = "", help = "The dimensions of the central image region to keep after " + \ "undistorting an image and before using it in texturing. Normally " + \ "85%% - 90%% of distorted (actual) image dimensions would do. " + \ "Suggested the Astrobee images: " + \ "sci_cam: '1250 1000' nav_cam: '1100 776'. haz_cam: '250 200'.") args = parser.parse_args() return args def sanity_checks(args): if args.camera_poses == "": raise Exception("The path to the list having input images and poses was not specified.") if args.mesh == "": raise Exception("The mesh to use for texturing was not specified.") if args.rig_config == "": raise Exception("The path to the rig configuration was not specified.") if args.rig_sensor == "": raise Exception("The rig sensor to use for texturing was not specified.") if args.out_dir == "": raise Exception("The path to the output directory was not specified.") if args.undistorted_crop_win == "": raise Exception("The undistorted crop win was not specified.") def convert_intrinsics_to_texrecon(undist_intrinsics_file): (widx, widy, f, cx, cy) = asp_rig_utils.read_intrinsics(undist_intrinsics_file) max_wid = widx if widy > max_wid: max_wid = widy # normalize nf = f / max_wid ncx = cx / widx ncy = cy / widy d0 = 0.0 d1 = 0.0 paspect = 1.0 return (nf, d0, d1, paspect, ncx, ncy) def create_texrecon_cameras(undistorted_images, world_to_cam, nf, d0, d1, paspect, ncx, ncy): if len(undistorted_images) != len(world_to_cam): raise Exception("Expecting as many images as cameras.") cams = [] for it in range(len(undistorted_images)): path, ext = os.path.splitext(undistorted_images[it]) cam = path + ".cam" cams.append(cam) print("Writing: " + cam) with open(cam, "w") as g: M = world_to_cam[it] # write translation g.write("%0.17g %0.17g %0.17g " % (M[0][3], M[1][3], M[2][3])) # write rotation g.write( "%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n" % (M[0][0], M[0][1], M[0][2], M[1][0], M[1][1], M[1][2], M[2][0], M[2][1], M[2][2])) # normalized inrinsics g.write("%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n" % (nf, d0, d1, paspect, ncx, ncy)) return cams def run_texrecon(tools_base_dir, undistorted_images, cams, mesh, skip_local_seam_leveling, texture_dir): # That is one long path texrecon_path = tools_base_dir + "/bin/texrecon_bin" if not os.path.exists(texrecon_path): # Handle the case when the dev version of ASP is used print("Warning: Cannot find texrecon at: " + texrecon_path) texrecon_path = asp_system_utils.which('texrecon_bin') if texrecon_path is not None and os.path.exists(texrecon_path): print("Will use: " + texrecon_path) else: raise Exception("Cannot find: " + texrecon_path) asp_rig_utils.mkdir_p(texture_dir) # Form the list of images to pass in index = texture_dir + "/index.txt" if len(undistorted_images) != len(cams): print("Must have as many images as cameras.") sys.exit(1) print("Writing: " + index) with open(index, "w") as fh: for it in range(len(undistorted_images)): # texrecon likes the cameras first fh.write(cams[it] + "\n") fh.write(undistorted_images[it] + "\n") cmd = [texrecon_path, index, mesh, texture_dir, "-o", "gauss_clamping", "-d", args.texture_alg, "--keep_unseen_faces", # TODO(oalexan1): Need to understand why texrecon insists on an equal sign # for the option below while it does not need that for other options. "--max_texture_size=" + str(args.max_texture_size)] if skip_local_seam_leveling: cmd += ['--skip_local_seam_leveling'] log_file = os.path.join(texture_dir, "texrecon_log.txt") print("Running texrecon.\n") asp_rig_utils.run_cmd(cmd) textured_mesh = texture_dir + ".obj" print("\nWrote: " + textured_mesh) return textured_mesh if __name__ == "__main__": args = process_args(sys.argv) tools_base_dir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))) sanity_checks(args) asp_rig_utils.mkdir_p(args.out_dir) all_undistorted_images = [] all_cams = [] # Can handle multiple sensors sensors = args.rig_sensor.split() for sensor in sensors: (images, world_to_cam) \ = asp_rig_utils.parse_cameras(args.camera_poses, args.subset, sensor) extension = '.jpg' # extension of undistorted images, as preferred by texrecon extra_opts = ["--save_bgr"] # create color images suff = "_texrecon" (undist_intrinsics_file, undistorted_images, undist_dir) \ = asp_rig_utils.undistort_images(args, sensor, images, tools_base_dir, extension, extra_opts, suff) (nf, d0, d1, paspect, ncx, ncy) = convert_intrinsics_to_texrecon(undist_intrinsics_file) cams = create_texrecon_cameras(undistorted_images, world_to_cam, nf, d0, d1, paspect, ncx, ncy) all_undistorted_images += undistorted_images all_cams += cams texture_dir = args.out_dir + "/" + "_".join(sensors) + "/texture" run_texrecon(tools_base_dir, all_undistorted_images, all_cams, args.mesh, args.skip_local_seam_leveling, texture_dir) ================================================ FILE: src/asp/Tools/theia_sfm ================================================ #!/usr/bin/env python # Copyright (c) 2017, United States Government, as represented by the # Administrator of the National Aeronautics and Space Administration. # # All rights reserved. # # The Astrobee platform is licensed under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. """ A wrapper around TheiaSfm. """ import argparse, glob, os, re, shutil, subprocess, sys, platform # Set up the path to Python modules about to load basepath = os.path.abspath(sys.path[0]) pythonpath = os.path.abspath(basepath + '/../Python') # for dev ASP libexecpath = os.path.abspath(basepath + '/../libexec') # for packaged ASP sys.path.insert(0, basepath) # prepend to Python path sys.path.insert(0, pythonpath) sys.path.insert(0, libexecpath) import asp_rig_utils, asp_system_utils def sanityChecks(args): if args.rig_config == "": raise Exception("The path to the rig configuration file was not specified.") if args.theia_flags == "": raise Exception("The path to the Theia flags was not specified.") if not os.path.exists(args.theia_flags): raise Exception("Cannot find the Theia flags file: " + args.theia_flags) if args.out_dir == "": raise Exception("The path to the output directory was not specified.") def processArgs(args, base_dir): """ Set up the parser and parse the args. """ # Number of arguments before starting to parse them num_input_args = len(sys.argv) parser = argparse.ArgumentParser(description="") parser.add_argument("--rig-config", dest="rig_config", default="", help = "Rig configuration file.") parser.add_argument("--images", dest="images", default="", help = "Images, as individual wildcards. Example: " + \ "'dir/cam1/*tif dir/cam2/*tif.") parser.add_argument("--image-list", dest="image_list", default="", help = "Use the images from this list, instead of setting " + \ "--images. Images must be separated by a newline.") parser.add_argument("--image-sensor-list", dest="image_sensor_list", default="", help = "An alternative way of listing the input images, " + \ "when the sensor name is specified separately in the same " + \ "file. See the naming convention in the documentation.") parser.add_argument("--theia-flags", dest="theia_flags", default="", help="The flags to pass to Theia. By default, " + \ "the file ``share/theia_flags.txt`` in the software " + \ "distribution is used. On Linux and Mac, the option " + \ "--random_seed=1 is passed to Theia by default, to " + \ "ensure reproducible results.") parser.add_argument("--out-dir", dest="out_dir", default="", help="The output directory (only the 'cameras.nvm' " + \ "file in it is needed afterwards).") args, other = parser.parse_known_args() # Set the Theia path if missing if args.theia_flags == "": args.theia_flags = base_dir + "/share/theia_flags.txt" # Print the help message if called with no arguments if num_input_args <= 1: parser.print_help() sys.exit(1) # Remove continuation lines in the string (those are convenient # for readability in docs) args.images = args.images.replace('\\', '') args.images = args.images.replace('\n', ' ') if int(args.images != "") + int(args.image_list != "") + int(len(other) > 0) + \ int(args.image_sensor_list != "") != 1: raise Exception("Must set the input images using --images " + \ "--image_list, --image_sensor_list, or individual images, " + \ "but using just one approach.") # The inputs can be given as wildcards, file having an image list, # or individually specified images image_array = [] for image_wildcard in args.images.split(): # Expand all wildcards image_array += glob.glob(image_wildcard) # Use the image list, if provided if args.image_list != "": image_array = asp_rig_utils.read_list(args.image_list) # Use images specified on the command line with no quotes if len(other) > 0: image_array = other[:] # Error checking asp_rig_utils.check_for_sub_images(image_array) sanityChecks(args) return (args, image_array) def genTheiaInputs(rig_config, args, image_array): ''' Create the inputs as Theia wants them. ''' # Find the sensor name for each image (image_array, img_sensor_dict) \ = asp_rig_utils.findSensorNames(image_array, rig_config, args.image_sensor_list) # Initialize the data structure images_by_sensor = {} extensions = set() # Parse the images for all cameras image_set = set() image_array = sorted(image_array) for image in image_array: image_set.add(image) if image in img_sensor_dict: sensor_name = img_sensor_dict[image] else: raise Exception("Could not find sensor name for image: " + image) if sensor_name not in images_by_sensor: images_by_sensor[sensor_name] = [] images_by_sensor[sensor_name].append(image) ext = asp_rig_utils.imageExtension(images_by_sensor[sensor_name]) extensions.add(ext) if len(image_set) != len(image_array): raise Exception("Found duplicate input images.") if len(extensions) > 1: raise Exception("Input images have a mix of filename extensions. Use just one. " + \ "Found: ", extensions) if len(extensions) == 0: raise Exception("The input image set is invalid.") extension = list(extensions)[0] print("Output directory: " + args.out_dir) asp_rig_utils.mkdir_p(args.out_dir) # Remove old images in sym_image_dir sym_image_dir = args.out_dir + "/sym_images" old_images = glob.glob(sym_image_dir + "/*") if len(old_images) > 0: print("Removing old images from " + sym_image_dir) for image in old_images: os.remove(image) # Theia likes all images in the same dir, so do it with sym links print("Creating sym links to the input images in: " + sym_image_dir) asp_rig_utils.mkdir_p(sym_image_dir) sym_images = {} nonempty_rig = [] for sensor_id in range(len(rig_config)): sensor_name = rig_config[sensor_id]['sensor_name'] sym_images[sensor_name] = [] if sensor_name not in images_by_sensor: print("Found a sensor name with no images: " + sensor_name) continue nonempty_rig.append(rig_config[sensor_id]) num_images = len(images_by_sensor[sensor_name]) for it in range(num_images): image = images_by_sensor[sensor_name][it] # Sanity check. Each image file name must be /path/to/<timestamp>.extension. # Also check if the timestamp is unique. src_file = os.path.relpath(image, sym_image_dir) base_file = os.path.basename(image) if image in img_sensor_dict: sensor_name = img_sensor_dict[image] else: raise Exception("Could not find sensor name for image: " + image) # If the sensor name is not part of the image name, add it, to ensure # uniqueness. dst_file = os.path.basename(image) if sensor_name not in dst_file: dst_file = sensor_name + "_" + dst_file dst_file = sym_image_dir + "/" + dst_file sym_images[sensor_name].append(dst_file) os.symlink(src_file, dst_file) # Must use this later on, otherwise the syntax of the file created # later is incorrect. rig_config = nonempty_rig[:] calib_file = asp_rig_utils.genCalibrationFile(args, rig_config, sym_images) return (calib_file, sym_image_dir, images_by_sensor, sym_images, extension) def write_with_full_path(nvm_file, final_nvm_file, offset_file, final_offset_file, images, sym_images): """ Theia saves images without full path. Go back to original image names in the nvm and offset files. """ # Make a dict for quick lookup image_dict = {} for key in images: for i in range(len(images[key])): image_dict[os.path.basename(sym_images[key][i])] = images[key][i] in_files = [nvm_file, offset_file] out_files = [final_nvm_file, final_offset_file] for file_it in range(2): lines = [] with open(in_files[file_it], 'r') as fh: lines = fh.readlines() for line_it in range(len(lines)): vals = lines[line_it].split() if len(vals) > 0 and vals[0] in image_dict: vals[0] = image_dict[vals[0]] lines[line_it] = " ".join(vals) + "\n" print("Writing file with original image names: " + out_files[file_it]) with open(out_files[file_it], 'w') as fh: fh.writelines(lines) if __name__ == "__main__": base_dir = asp_system_utils.findTheiaInstallDir() # TODO(oalexan1): Setting the dynamic library path this way is fragile, but # I can't think of any better solution, and otherwise it fails to find the lib. if 'Darwin' in platform.system(): key = 'DYLD_LIBRARY_PATH' if key not in os.environ: os.environ[key] = base_dir + '/lib' else: os.environ[key] = base_dir + '/lib' + ':' + os.environ[key] (args, image_array) = processArgs(sys.argv, base_dir) rig_config = asp_rig_utils.parseRigConfig(args.rig_config) (calib_file, sym_image_dir, images, sym_images, image_extension) \ = genTheiaInputs(rig_config, args, image_array) reconstruction_file = args.out_dir + "/reconstruction" matching_dir = args.out_dir + "/matches" # Wipe old data for old_reconstruction in glob.glob(reconstruction_file + "*"): print("Deleting old reconstruction: " + old_reconstruction) os.remove(old_reconstruction) count = 0 for old_matches in glob.glob(matching_dir + "/*"): if count == 0: print("Wiping old matches in: " + matching_dir) count += 1 os.remove(old_matches) cmd = [base_dir + "/bin/build_reconstruction", "--flagfile", args.theia_flags, "--images", sym_image_dir + "/*" + image_extension, "--calibration_file", calib_file, "--output_reconstruction", reconstruction_file, "--matching_working_directory", matching_dir, "--intrinsics_to_optimize", "NONE", "-v", "2"] if sys.platform == 'linux' or sys.platform == 'darwin': cmd += ["--random_seed", "1"] asp_rig_utils.run_cmd(cmd) nvm_file = reconstruction_file + ".nvm" cmd = [base_dir + "/bin/export_to_nvm_file", "-input_reconstruction_file", reconstruction_file + "-0", "-output_nvm_file", nvm_file] asp_rig_utils.run_cmd(cmd) final_nvm_file = args.out_dir + "/cameras.nvm" offset_file = reconstruction_file + "_offsets.txt"; final_offset_file = args.out_dir + "/cameras_offsets.txt"; write_with_full_path(nvm_file, final_nvm_file, offset_file, final_offset_file, images, sym_images) # Wipe the reconstruction.nvm file and its offsets, as it has relative paths. # TODO(oalexan1): May need to write cameras.nvm to start with, then overwrite it # in-place. if os.path.exists(nvm_file): #print("Removing: " + nvm_file) os.remove(nvm_file) # Also wipe the offset file if os.path.exists(offset_file): #print("Removing: " + offset_file) os.remove(offset_file) ================================================ FILE: src/asp/Tools/tif_mosaic.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file tif_mosaic.cc /// #include <asp/Core/AspProgramOptions.h> #include <asp/Core/Macros.h> #include <asp/Core/InterestPointMatching.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/ImageChannelRead.h> #include <vw/Image/RoundAndClamp.h> #include <vw/Image/Interpolation.h> #include <vw/Image/Filter.h> using namespace vw; namespace po = boost::program_options; #include <limits> /// Simple class to store image info and compute the associated transform. struct ImageData{ std::string src_file; int band; ImageViewRef<float> src_img; BBox2 src_box, dst_box; double nodata_value; AffineTransform transform; // Transform from src_box to dst_box. ImageData(std::string const& src_file_in, int band_in, BBox2 const& src_box_in, BBox2 const& dst_box_in, bool has_input_nodata_value, double input_nodata_value ): src_file(src_file_in), band(band_in), src_box(src_box_in), dst_box(dst_box_in), nodata_value(0.0), // Compute the transform from the input bbox to the output bbox transform(AffineTransform(Matrix2x2(dst_box.width()/src_box.width(),0, 0,dst_box.height()/src_box.height()), dst_box.min() - src_box.min())) { // Extract the desired band int num_bands = get_num_channels(src_file); if (num_bands == 1){ src_img = DiskImageView<float>(src_file); }else{ // Multi-band image. Pick the desired band. In principle, this // block can handle the above case as well. We do it this way // because reading multi-band images is a fragile process in // ASP, so if we know for sure that just one band is present, // don't come here. int channel = band - 1; // In VW, bands start from 0, not 1. src_img = vw::read_float_channel(src_file, channel); } // Read nodata-value from disk, if available. Overwrite with // user-provided nodata-value if given. DiskImageResourceGDAL in_rsrc(src_file); if ( in_rsrc.has_nodata_read() ) nodata_value = in_rsrc.nodata_read(); if ( has_input_nodata_value ) nodata_value = input_nodata_value; } }; // End class ImageData /// Fix seams by finding interest point matches and adjusting the /// transforms so that they map points from one image on top of /// matches from another image. We count on the fact /// that each image overlaps with the next one. /// - Uses a translation+scale transform. void fix_seams_using_ip(std::vector<ImageData> & img_data){ for (int img_index = 0; img_index < int(img_data.size())-1; img_index++) { // The intersection of the image regions in the common // destination domain. BBox2 intersection_box = img_data[img_index].dst_box; intersection_box.crop(img_data[img_index+1].dst_box); // Pull into first image's pixel domain BBox2 box0 = img_data[img_index].transform.reverse_bbox(intersection_box); DiskImageView<vw::PixelGray<float>> img0(img_data[img_index].src_file); box0.crop(bounding_box(img0)); ImageView<vw::PixelGray<float>> crop0 = crop(img0, box0); // Pull into second image's pixel domain BBox2 box1 = img_data[img_index+1].transform.reverse_bbox(intersection_box); DiskImageView<vw::PixelGray<float>> img1(img_data[img_index+1].src_file); box1.crop(bounding_box(img1)); ImageView<vw::PixelGray<float>> crop1 = crop(img1, box1); // The transform from cropped image0 to cropped image1 int ip_per_tile = 0; // auto-determination Matrix3x3 T = asp::translation_ip_matching(crop0, crop1, ip_per_tile, "", "", // TODO: Use IP files? img_data[img_index].nodata_value, img_data[img_index+1].nodata_value); T = inverse(T); // originally it was going from image1 to image0 // The transform from image0 to cropped image0 Matrix3x3 T0; T0.set_identity(); T0(0, 2) = -box0.min().x(); T0(1, 2) = -box0.min().y(); // The transform from cropped image1 to image1 Matrix3x3 T1; T1.set_identity(); T1(0, 2) = box1.min().x(); T1(1, 2) = box1.min().y(); // The transform from image0 to image 1 T = T1*T*T0; // The transform from image1 to image 0 Matrix3x3 TI = inverse(T); Matrix3x3 N = affine2mat(img_data[img_index].transform)*TI; Matrix3x3 N0 = affine2mat(img_data[img_index+1].transform); vw_out() << "Old transform for image " << img_index+1 << ": " << N0 << std::endl; vw_out() << "New transform for image " << img_index+1 << ": " << N << std::endl; // Update the transform img_data[img_index+1].transform = mat2affine(N); // Update the dst box. // TODO: forward_bbox() always give results as an int box. Must revisit this using // a float box! img_data[img_index+1].dst_box = img_data[img_index+1].transform.forward_bbox(img_data[img_index+1].src_box); } } // End function fix_seams_using_ip /// Extract the tif files to mosaic, their dimensions, and for each /// of them the location to mosaic to in the output image. The input /// is comma-separated. void parseImgData(std::string data, int band, bool has_input_nodata_value, double input_nodata_value, bool fix_seams, int& dst_cols, int& dst_rows, std::vector<ImageData> & img_data){ dst_cols = 0; dst_rows = 0; img_data.clear(); // Replace commas with spaces. std::string oldStr = ",", newStr = " "; size_t pos = 0; while((pos = data.find(oldStr, pos)) != std::string::npos){ data.replace(pos, oldStr.length(), newStr); pos += newStr.length(); } std::istringstream is(data); is >> dst_cols >> dst_rows; std::string src_file; double src_lenx, src_leny, dst_minx, dst_miny, dst_lenx, dst_leny; BBox2 src_box, dst_box; bool warned_about_bands = false; while( is >> src_file >> src_lenx >> src_leny >> dst_minx >> dst_miny >> dst_lenx >> dst_leny){ src_box = BBox2(0, 0, src_lenx, src_leny); dst_box = BBox2(dst_minx, dst_miny, dst_lenx, dst_leny); // If the user did not specify the band to use (band == 0), and there is // more than one band, use the first band but warn the user about it. if (!warned_about_bands){ int num_bands = get_num_channels(src_file); if (num_bands > 1 && band <= 0) vw_out(vw::WarningMessage) << "Input images have " << num_bands << " bands. Will use the first band only.\n"; band = std::max(band, 1); warned_about_bands = true; } img_data.push_back(ImageData(src_file, band, src_box, dst_box, has_input_nodata_value, input_nodata_value)); } // Option to adjust position info using image data. if (fix_seams) fix_seams_using_ip(img_data); // Later images will be on top of earlier images. For that // reason, reduce each image to the part it does not overlap with later images. for (int k = (int)img_data.size()-1; k >= 0; k--){ // Go down from last image to first for (int l = k - 1; l >= 0; l--){ // Go down all images before (below) this one img_data[l].dst_box.max().y() = std::min( img_data[l].dst_box.max().y(), img_data[k].dst_box.min().y() ); // Make sure min of box is <= max of box after the above adjustment. img_data[l].dst_box.min().y() = std::min( img_data[l].dst_box.min().y(), img_data[l].dst_box.max().y() ); } // Adjust the source box as well. Expand the box slightly before // reversing as reverse_bbox casts its input to BBox2i which // is a problem if the box has floating point corners. // The ultimate references are always the destination box // and the affine transform. BBox2 box = img_data[k].dst_box; box.expand(1); img_data[k].src_box = img_data[k].transform.reverse_bbox(box); } #if 0 for (int k = 0; k < (int)img_data.size(); k++){ std::cout << "boxes: " << img_data[k].src_file << " " << img_data[k].src_box << ' ' << img_data[k].transform.reverse_bbox(img_data[k].dst_box) << ' ' << img_data[k].dst_box << std::endl; } #endif } // End function parseImgData /// A class to mosaic and rescale images using bilinear interpolation. class TifMosaicView: public ImageViewBase<TifMosaicView>{ private: int m_dst_cols, m_dst_rows; std::vector<ImageData> m_img_data; double m_scale; double m_output_nodata_value; public: TifMosaicView(int dst_cols, int dst_rows, std::vector<ImageData> & img_data, double scale, double output_nodata_value): m_dst_cols((int)(scale*dst_cols)), m_dst_rows((int)(scale*dst_rows)), m_img_data(img_data), m_scale(scale), m_output_nodata_value(output_nodata_value){} typedef float pixel_type; typedef pixel_type result_type; typedef PixelMask<float> masked_pixel_type; typedef ProceduralPixelAccessor<TifMosaicView> pixel_accessor; inline int32 cols () const { return m_dst_cols; } inline int32 rows () const { return m_dst_rows; } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); } inline pixel_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const { vw_throw(NoImplErr() << "TifMosaicView::operator()(...) is not implemented"); return pixel_type(); } typedef CropView<ImageView<pixel_type> > prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { // Scaled box Vector2i b = floor(bbox.min()/m_scale); Vector2i e = ceil(elem_diff(bbox.max(),1)/m_scale) + Vector2i(1, 1); BBox2i scaled_box(b[0], b[1], e[0] - b[0], e[1] - b[1]); // The scaled box can potentially intersect several of the images // to be mosaicked. So prepare to interpolate into all of them. // Note 1: the cropped sub-images we get below are non-overlapping // and no bigger than they need to be. // Note 2: We mask each image using its individual nodata-value. // The output mosaic uses the global m_output_nodata_value. typedef ImageView<masked_pixel_type> ImageT; typedef InterpolationView<ImageT, BilinearInterpolation> InterpT; std::vector<BBox2i> src_vec(m_img_data.size()); // Effective area of image tile std::vector<InterpT> crop_vec(m_img_data.size(), InterpT(ImageT())); // Image data but expanded a bit for interpolation's sake int extra = BilinearInterpolation::pixel_buffer; // Loop through the input images for (int k = 0; k < (int)m_img_data.size(); k++){ BBox2 box = m_img_data[k].dst_box; box.crop(scaled_box); if (box.empty()) continue; box.expand(1); // since reverse_bbox will truncate input box to BBox2i box = m_img_data[k].transform.reverse_bbox(box); box = grow_bbox_to_int(box); box.crop(bounding_box(m_img_data[k].src_img)); if (box.empty()) continue; src_vec[k] = ( box ); // Recording active area of the tile box.expand( extra ); // Expanding to help interpolation crop_vec[k] = InterpT(create_mask_less_or_equal (crop(edge_extend(m_img_data[k].src_img, ConstantEdgeExtension()), box), m_img_data[k].nodata_value)); } ImageView<pixel_type> tile(bbox.width(), bbox.height()); fill( tile, m_output_nodata_value ); // TODO: Replace this code with the resample_aa function?? // TODO: This could possibly be performed entirely with a // TransformView and apply_mask. // -- or -- // Since we have no rotations, we can assume whole lines will come // from a single image // Loop through the output image tile for (int row = 0; row < bbox.height(); row++){ for (int col = 0; col < bbox.width(); col++){ Vector2 dst_pix = Vector2(col + bbox.min().x(), row + bbox.min().y())/m_scale; // See which src image we end up in. Start from the later // images, as those are on top. Stop when we find an image // with a valid pixel at given location. for (int k = (int)m_img_data.size()-1; k >= 0; k--){ Vector2 src_pix = m_img_data[k].transform.reverse(dst_pix); if (!src_vec[k].contains(src_pix)) continue; // Go to the coordinate system of image crop_vec[k]. Note that // we add back the 'extra' number used in expanding the image earlier. src_pix += elem_diff(extra, src_vec[k].min()); masked_pixel_type r = crop_vec[k](src_pix[0], src_pix[1] ); if (is_valid(r)){ tile(col, row) = r.child(); break; } } // image stack iteration } // col iteration } // row iteration return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows() ); } // End function prerasterize template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; // End class TifMosaicView struct Options : vw::GdalWriteOptions { std::string img_data, output_image, output_type; int band; bool has_input_nodata_value, has_output_nodata_value, fix_seams; double percent, input_nodata_value, output_nodata_value; Options(): band(0), has_input_nodata_value(false), has_output_nodata_value(false), input_nodata_value (std::numeric_limits<double>::quiet_NaN()), output_nodata_value(std::numeric_limits<double>::quiet_NaN()){} }; void handle_arguments( int argc, char *argv[], Options& opt ) { po::options_description general_options(""); general_options.add( vw::GdalWriteOptionsDescription(opt) ); general_options.add_options() ("image-data", po::value(&opt.img_data)->default_value(""), "Information on the images to mosaic.") ("output-image,o", po::value(&opt.output_image)->default_value(""), "Specify the output image.") ("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.") ("band", po::value(&opt.band), "Which band to use (for multi-spectral images).") ("input-nodata-value", po::value(&opt.input_nodata_value), "Nodata value to use on input; input pixel values less than or equal to this are considered invalid.") ("output-nodata-value", po::value(&opt.output_nodata_value), "Nodata value to use on output.") ("reduce-percent", po::value(&opt.percent)->default_value(100.0), "Reduce resolution using this percentage.") ("fix-seams", po::bool_switch(&opt.fix_seams)->default_value(false), "Fix seams in the output mosaic due to inconsistencies between image and camera data using interest point matching."); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage(""); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line( argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered ); opt.has_input_nodata_value = vm.count("input-nodata-value" ); opt.has_output_nodata_value = vm.count("output-nodata-value"); if ( opt.img_data.empty() ) vw_throw( ArgumentErr() << "No images to mosaic.\n" << usage << general_options ); if ( opt.output_image.empty() ) vw_throw( ArgumentErr() << "Missing output image name.\n" << usage << general_options ); if ( opt.percent > 100.0 || opt.percent <= 0.0 ) vw_throw( ArgumentErr() << "The percent amount must be between 0% and 100%.\n" << usage << general_options ); } int main( int argc, char *argv[] ) { Options opt; try { // Find command line options handle_arguments( argc, argv, opt ); double scale = opt.percent/100.0; // Parse the information passed on the command line. int dst_cols, dst_rows; std::vector<ImageData> img_data; parseImgData(opt.img_data, opt.band, opt.has_input_nodata_value, opt.input_nodata_value, opt.fix_seams, dst_cols, dst_rows, img_data); if ( dst_cols <= 0 || dst_rows <= 0 || img_data.empty() ) vw_throw( ArgumentErr() << "Invalid input data.\n"); // We can handle individual images having different nodata // values. Pick the one of the first image as the output nodata // value. Override with user's nodata value if provided. double output_nodata_value = img_data[0].nodata_value; if (opt.has_output_nodata_value) output_nodata_value = opt.output_nodata_value; // Set up our output image object vw_out() << "Writing: " << opt.output_image << std::endl; TerminalProgressCallback tpc("asp", "\t Mosaic:"); ImageViewRef<float> out_img = TifMosaicView(dst_cols, dst_rows, img_data, scale, output_nodata_value); // Write to disk using the specified output data type. if (opt.output_type == "Float32") vw::cartography::block_write_gdal_image(opt.output_image, out_img, output_nodata_value, opt, tpc); else if (opt.output_type == "Byte") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(out_img, RoundAndClamp<uint8, float>()), vw::round_and_clamp<uint8>(output_nodata_value), opt, tpc); else if (opt.output_type == "UInt16") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(out_img, RoundAndClamp<uint16, float>()), vw::round_and_clamp<uint16>(output_nodata_value), opt, tpc); else if (opt.output_type == "Int16") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(out_img, RoundAndClamp<int16, float>()), vw::round_and_clamp<int16>(output_nodata_value), opt, tpc); else if (opt.output_type == "UInt32") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(out_img, RoundAndClamp<uint32, float>()), vw::round_and_clamp<uint32>(output_nodata_value), opt, tpc); else if (opt.output_type == "Int32") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(out_img, RoundAndClamp<int32, float>()), vw::round_and_clamp<int32>(output_nodata_value), opt, tpc); else vw_throw( NoImplErr() << "Unsupported output type: " << opt.output_type << ".\n" ); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/time_trials ================================================ #!/usr/bin/env python # __BEGIN_LICENSE__ # Copyright (c) 2009-2013, United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. All # rights reserved. # # The NGT platform is licensed under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # __END_LICENSE__ from __future__ import print_function import os, sys, optparse, string, subprocess, math from asp_system_utils import get_asp_version import asp_system_utils asp_system_utils.verify_python_version_is_supported() def convert_to_seconds( time ): time = time.strip() return float(time[:time.find("m")]) * 60.0 + float(time[time.find("m")+1:-1]) def main(): try: usage = "usage: time_trials [options] command\n " + get_asp_version() parser = optparse.OptionParser(usage=usage) parser.set_defaults(trials=5) parser.add_option("--trials", dest="trials", help="Number of trials to run.", type="int") (options, args) = parser.parse_args() if not args: raise Exception('No input command') except optparse.OptionError as msg: print(msg, file=sys.stderr) return 2 print("Running command: [%s]" % args[0]) real_mean = 0.0 real_stddev = 0.0 user_mean = 0.0 user_stddev = 0.0 sys_mean = 0.0 sys_stddev = 0.0 for i in range(0,options.trials): print(" -> trial %i / %i " % (i+1,options.trials)) p = subprocess.Popen("( time %s ) 2>&1 | tail -n3 "%args[0] , shell=True, stdout=subprocess.PIPE, universal_newlines=True) output = p.stdout.read().strip().split() real_time = convert_to_seconds( output[1] ) user_time = convert_to_seconds( output[3] ) sys_time = convert_to_seconds( output[5] ) print("r%.1f, u%.1f, s%.1f" % (real_time, user_time, sys_time)) # Accumulate values real_mean += real_time / float(options.trials) real_stddev += real_time * real_time / float(options.trials) user_mean += user_time / float(options.trials) user_stddev += user_time * user_time / float(options.trials) sys_mean += sys_time / float(options.trials) sys_stddev += sys_time * sys_time / float(options.trials) real_stddev = real_stddev - real_mean*real_mean real_stddev = math.sqrt(real_stddev) user_stddev = user_stddev - user_mean*user_mean user_stddev = math.sqrt(user_stddev) sys_stddev = sys_stddev - sys_mean*sys_mean sys_stddev = math.sqrt(sys_stddev) print("Real: %.3f +- %.3f" % (real_mean, real_stddev)) print("User: %.3f +- %.3f" % (user_mean, user_stddev)) print("Sys: %.3f +- %.3f" % (sys_mean, sys_stddev )) if __name__ == "__main__": sys.exit(main()) ================================================ FILE: src/asp/Tools/undistort_image_texrecon.cc ================================================ /* Copyright (c) 2017, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * * All rights reserved. * * The Astrobee platform is licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include <asp/Rig/RigUtils.h> #include <asp/Rig/RigConfig.h> #include <asp/Rig/SystemUtils.h> #include <asp/Rig/RigParseUtils.h> #include <gflags/gflags.h> #include <glog/logging.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/types.hpp> #include <boost/filesystem.hpp> #include <string> #include <iostream> #include <fstream> namespace fs = boost::filesystem; /* Undistort camera images. Taken from the Astrobee repo. Used to prepare images for texrecon. Provide distorted images, and lists of distorted and to-be-produced undistorted images. Usage: undistort_image_texrecon \ --image_list texrecon_out/sci_cam/distorted_index.txt \ --output_list texrecon_out/sci_cam/undistorted_index.txt \ --rig_config rig_input/rig_config.txt \ --undistorted_crop_win '1250 1000' \ --rig_sensor sci_cam */ DEFINE_string(image_list, "", "A file having the list of images to undistort, one per line. " "If not specified, it is assumed they are passed in directly on the command line."); DEFINE_string(output_list, "", "Save the undistorted images with names given in this list, " "instead of using the output directory."); DEFINE_string(undistorted_intrinsics, "", "Save to this file the undistorted camera intrinsics."); DEFINE_double(scale, 1.0, "Undistort images at different resolution, with their width " "being a multiple of this scale compared to the camera model."); DEFINE_string(undistorted_crop_win, "", "After undistorting, apply a crop window of these dimensions " "centered at the undistorted image center. The adjusted " "dimensions and optical center will be printed on screen. " "Specify as: 'crop_x crop_y'."); DEFINE_bool(save_bgr, false, "Save the undistorted images as BGR instead of grayscale. (Some tools expect BGR.)"); DEFINE_bool(histogram_equalization, false, "If true, do histogram equalization."); DEFINE_string(rig_config, "", "Read the rig configuration from this file."); DEFINE_string(rig_sensor, "", "Which rig sensor to use to undistort the images. Must be among the " "sensors specified via --rig_config."); int main(int argc, char ** argv) { google::InitGoogleLogging(argv[0]); google::ParseCommandLineFlags(&argc, &argv, true); if (FLAGS_rig_config == "") LOG(FATAL) << "The rig configuration was not specified.\n"; if (FLAGS_rig_sensor == "") LOG(FATAL) << "The rig sensor to use for undistortion was not specified.\n"; // Load the correct camera model rig::CameraParameters *cam_ptr = NULL; // use a pointer as there is no constructor rig::RigSet R; bool use_initial_rig_transforms = false; if (FLAGS_rig_config != "") // Read a plain text config file for n sensors rig::readRigConfig(FLAGS_rig_config, use_initial_rig_transforms, R); bool success = false; for (size_t it = 0; it < R.cam_params.size(); it++) { if (R.cam_names[it] == FLAGS_rig_sensor) { std::cout << "Using camera: " << R.cam_names[it] << std::endl; cam_ptr = &R.cam_params[it]; // note that R.cam_params still owns the resource success = true; break; } } if (!success) LOG(FATAL) << "Could not find desired sensor in the rig configuration.\n"; // The images can either be in a list or passed in std::vector<std::string> images; { std::ifstream ifs(FLAGS_image_list); std::string image; while (ifs >> image) images.push_back(image); if (images.empty()) LOG(FATAL) << "Expecting at least one input image."; } std::vector<std::string> undist_images; { std::ifstream ifs(FLAGS_output_list); std::string image; while (ifs >> image) undist_images.push_back(image); } if (undist_images.size() != images.size()) LOG(FATAL) << "There must be as many output undistorted " << "images as input distorted images.\n"; // Useful for over-riding any config files when debugging // rig::CameraParameters cam_params(Eigen::Vector2i(776, 517), // Eigen::Vector2d::Constant(610.502), // Eigen::Vector2d(776/2.0, 517/2.0)); // Create the undistortion map cv::Mat floating_remap, fixed_map, interp_map; cam_ptr->GenerateRemapMaps(&floating_remap, FLAGS_scale); // Make adjustments to floating_remap. // TODO(oalexan1): This must be a function. // We have to conform to the OpenCV API, which says: // undist_image(x, y) = dist_image(floating_remap(x, y)). // If floating_remap(x, y) is out of dist_image bounds, the above // should return a black pixel, yet a straightforward application of // this formula will result in a segfault. // The solution is to grow dist_image by padding it with black pixels // so that the above API succeeds. // This can have the following problem though. floating_remap(x, y) // can be huge for unreasonable distortion. So tame it. We only // want to know that if this falls outside the image bounds, a black // pixel is assigned to undist_image(x, y), so if it falls too // much outside the image just assign it to a closer pixel outside // the image. float max_extra = 100.0f; // the furthest floating_remap(x, y) can deviate // The image dimensions Eigen::Vector2i dims(round(FLAGS_scale*cam_ptr->GetDistortedSize()[0]), round(FLAGS_scale*cam_ptr->GetDistortedSize()[1])); int img_cols = dims[0], img_rows = dims[1]; cv::Vec2f start = floating_remap.at<cv::Vec2f>(0, 0); double min_x = 0.0, max_x = 0.0, min_y = 0.0, max_y = 0.0; // will change very soon for (int col = 0; col < floating_remap.cols; col++) { for (int row = 0; row < floating_remap.rows; row++) { cv::Vec2f pix = floating_remap.at<cv::Vec2f>(row, col); // Tame floating_remap pix[0] = std::max(pix[0], -max_extra); pix[0] = std::min(pix[0], img_cols + max_extra); pix[1] = std::max(pix[1], -max_extra); pix[1] = std::min(pix[1], img_rows + max_extra); floating_remap.at<cv::Vec2f>(row, col) = pix; if (col == 0 && row == 0) { // initialize with the potentially adjusted value of pix. min_x = pix[0]; max_x = pix[0]; min_y = pix[1]; max_y = pix[1]; } // Find the expanded (but tamed) image bounds if (pix[0] < min_x) min_x = pix[0]; if (pix[0] > max_x) max_x = pix[0]; if (pix[1] < min_y) min_y = pix[1]; if (pix[1] > max_y) max_y = pix[1]; } } // Convert the bounds to int min_x = floor(min_x); max_x = ceil(max_x); min_y = floor(min_y); max_y = ceil(max_y); // Ensure that the expanded image is not smaller than the old one, // to make the logic simpler if (min_x > 0) min_x = 0; if (max_x < img_cols) max_x = img_cols; if (min_y > 0) min_y = 0; if (max_y < img_rows) max_y = img_rows; // Convert the bounds to what cv::copyMakeBorder() will expect int border_top = -min_y, border_bottom = max_y - img_rows; int border_left = -min_x, border_right = max_x - img_cols; // Adjust the remapping function to the expanded image. // Now all its values will be within bounds of that image. for (int col = 0; col < floating_remap.cols; col++) { for (int row = 0; row < floating_remap.rows; row++) { cv::Vec2f pix = floating_remap.at<cv::Vec2f>(row, col); pix[0] += border_left; pix[1] += border_top; floating_remap.at<cv::Vec2f>(row, col) = pix; } } // Convert the map for speed cv::convertMaps(floating_remap, cv::Mat(), fixed_map, interp_map, CV_16SC2); Eigen::Vector2i dist_size(round(FLAGS_scale*cam_ptr->GetDistortedSize()[0]), round(FLAGS_scale*cam_ptr->GetDistortedSize()[1])); Eigen::Vector2i undist_size(round(FLAGS_scale*cam_ptr->GetUndistortedSize()[0]), round(FLAGS_scale*cam_ptr->GetUndistortedSize()[1])); double focal_length = FLAGS_scale*cam_ptr->GetFocalLength(); Eigen::Vector2d optical_center = FLAGS_scale*cam_ptr->GetUndistortedHalfSize(); // Handle the cropping cv::Rect cropROI; if (!FLAGS_undistorted_crop_win.empty()) { std::vector<double> vals; rig::strToVec(FLAGS_undistorted_crop_win, vals); if (vals.size() != 2) LOG(FATAL) << "Could not parse --undistorted_crop_win."; int widx = vals[0]; int widy = vals[1]; // A couple of sanity checks if (widx % 2 != 0 || widy % 2 != 0) LOG(FATAL) << "The cropped undistorted image dimensions must be even."; if (undist_size[0] % 2 != 0 || undist_size[1] % 2 != 0) LOG(FATAL) << "The undistorted image dimensions must be even."; // Ensure that the crop window is within the image bounds int startx = std::max((undist_size[0] - widx)/2, 0); int starty = std::max((undist_size[1] - widy)/2, 0); widx = std::min(widx, undist_size[0] - startx); widy = std::min(widy, undist_size[1] - starty); // Update these quantities undist_size[0] = widx; undist_size[1] = widy; optical_center[0] -= startx; optical_center[1] -= starty; cropROI = cv::Rect(startx, starty, widx, widy); if (cropROI.width == 0 || cropROI.height == 0) LOG(FATAL) << "Empty crop region."; std::cout << "Undistorted crop region: " << cropROI << std::endl; } for (size_t i = 0; i < images.size(); i++) { std::string filename(images[i]); cv::Mat image = cv::imread(filename, cv::IMREAD_UNCHANGED); if (FLAGS_histogram_equalization) { cv::Mat tmp_image; cv::equalizeHist(image, tmp_image); image = tmp_image; } // Ensure that image dimensions are as expected if (image.rows != img_rows || image.cols != img_cols) LOG(FATAL) << "The input image " << filename << " has wrong dimensions."; // Expand the image before interpolating into it cv::Scalar paddingColor = 0; cv::Mat expanded_image; cv::copyMakeBorder(image, expanded_image, border_top, border_bottom, border_left, border_right, cv::BORDER_CONSTANT, paddingColor); // Undistort it cv::Mat undist_image; cv::remap(expanded_image, undist_image, fixed_map, interp_map, cv::INTER_LINEAR); // Crop, if desired if (cropROI.width > 0 && cropROI.height > 0) { cv::Mat cropped_image; undist_image(cropROI).copyTo(cropped_image); // without copyTo it is a shallow copy undist_image = cropped_image; // this makes a shallow copy } // The output file name std::string undist_file = undist_images[i]; // Save to disk the undistorted image std::cout << "Writing: " << undist_file << std::endl; cv::Mat bgr_image; if (FLAGS_save_bgr && undist_image.channels() == 1) { // Convert from grayscale to color if needed #if (CV_VERSION_MAJOR >= 4) cvtColor(undist_image, bgr_image, cv::COLOR_GRAY2BGR); #else cvtColor(undist_image, bgr_image, CV_GRAY2BGR); #endif undist_image = bgr_image; } cv::Mat gray_image; if (!FLAGS_save_bgr && undist_image.channels() > 1) { #if (CV_VERSION_MAJOR >= 4) cvtColor(undist_image, gray_image, cv::COLOR_BGR2GRAY); #else cvtColor(undist_image, gray_image, CV_BGR2GRAY); #endif undist_image = gray_image; } cv::imwrite(undist_file, undist_image); } // end iterating over images // Write some very useful info std::cout << "Distorted image size: " << dist_size.transpose() << "\n"; std::cout << "Undistorted image size: " << undist_size.transpose() << "\n"; std::cout << "Focal length: " << focal_length << "\n"; std::cout << "Undistorted optical center: " << optical_center.transpose() << "\n"; std::string intrinsics_file = FLAGS_undistorted_intrinsics; if (!intrinsics_file.empty()) { std::cout << "Writing: " << intrinsics_file << std::endl; rig::createDir(fs::path(intrinsics_file).parent_path().string()); // ensure the dir exists std::ofstream ofs(intrinsics_file.c_str()); ofs.precision(17); ofs << "# Unidistored width and height, focal length, undistorted optical center\n"; ofs << undist_size.transpose() << " " << focal_length << " " << optical_center.transpose() << "\n"; ofs.close(); } return 0; } ================================================ FILE: src/asp/Tools/wv_correct.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file wv_correct.cc /// // Correct CCD artifacts in WorldView 1 and 2 images with given TDI. // The problem: A WV image is obtained by mosaicking from left to // right image blocks which are as tall is the entire image (each // block comes from an individual CCD image sensor). Blocks are // slightly misplaced in respect to each other by some unknown // subpixel offsets. We use tabulated values for the offsets and their // locations to undo them. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <asp/Core/FileUtils.h> #include <asp/Camera/RPC_XML.h> #include <asp/Camera/RPCModel.h> #include <vw/Image/RoundAndClamp.h> #include <vw/Image/Interpolation.h> #include <vw/Image/Filter.h> #include <vw/FileIO/DiskImageUtils.h> #include <vw/FileIO/FileUtils.h> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/sax/HandlerBase.hpp> #include <xercesc/util/PlatformUtils.hpp> #include <boost/dll.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw; using namespace asp; using namespace vw::cartography; using namespace xercesc; struct Options: vw::GdalWriteOptions { int band; std::string image_file, camera_file, output_image, output_type, dx, dy; bool print_per_column_corrections; }; // See which table has the corrections for given MS data, // find the right row in that table, and read the values void parse_ms_correction_table(std::string const& sat_id, int band, int tdi, std::string const& scan_dir, std::vector<double> & corr_x, std::vector<double> & corr_y) { // Clear the outputs corr_x.clear(); corr_y.clear(); std::string data_path = boost::dll::program_location().parent_path().parent_path().string() + "/share/wv_correct"; std::string lookup_path = data_path + "/ms_correction_lookup.txt"; std::ifstream handle; handle.open(lookup_path.c_str()); if (handle.fail()) vw_throw(vw::IOErr() << "Unable to open file \"" << lookup_path << "\""); std::string line; while (std::getline(handle, line, '\n')){ if (line.size() == 0 || line[0] == '#') continue; // skip comment and empty line std::string l_sat_id, l_band, l_tdi, l_scan_dir, table_path, row_str; std::istringstream is(line); if (!(is >> l_sat_id >> l_band >> l_tdi >> l_scan_dir >> table_path >> row_str)) continue; if (sat_id != l_sat_id || atoi(l_band.c_str()) != band || atoi(l_tdi.c_str()) != tdi || scan_dir != l_scan_dir) { continue; } table_path = data_path + "/" + table_path; DiskImageView<float> lookup_table(table_path); int row = atoi(row_str.c_str()); if (lookup_table.rows() <= row) vw_throw(ArgumentErr() << "Could not find at least " << row + 1 << " rows in " << table_path << "\n"); int num_vals = lookup_table.cols() / 2; if (2*num_vals != lookup_table.cols()) vw_throw(ArgumentErr() << "Expecting an even number of columns in table " << table_path << "\n"); corr_x.resize(num_vals); corr_y.resize(num_vals); for (int it = 0; it < num_vals; it++) { corr_x[it] = lookup_table(it, row); corr_y[it] = lookup_table(it + num_vals, row); } break; } } void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("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.") ("band", po::value<int>(&opt.band)->default_value(0), "For multi-spectral images, specify the band to correct. Required unless --dx and --dy are set.") ("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.") ("dy", po::value(&opt.dy)->default_value(""), "As above, but for the y direction.") ("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)."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("camera-image", po::value(&opt.image_file)) ("camera-model", po::value(&opt.camera_file)) ("output-image", po::value(&opt.output_image)); po::positional_options_description positional_desc; positional_desc.add("camera-image",1); positional_desc.add("camera-model",1); positional_desc.add("output-image",1); std::string usage("[options] <camera-image> <camera-model> <output-image>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (!vm.count("camera-image") || !vm.count("camera-model") || !vm.count("output-image") ) vw_throw(ArgumentErr() << "Requires <camera-image>, <camera-model> " << "and <output-image> in order to proceed.\n\n" << usage << general_options); vw::create_out_dir(opt.output_image); } void arr_to_vec(double arr[], int len, std::vector<double> & vec){ vec.clear(); for (int i = 0; i < len; i++) vec.push_back(arr[i]); } void get_offsets(int tdi, bool is_wv01, bool is_forward, std::vector<double> & posx, std::vector<double> & ccdx, std::vector<double> & posy, std::vector<double> & ccdy){ posx.clear(); ccdx.clear(); posy.clear(); ccdy.clear(); // Here we tabulate all ccds offsets and their column pixel positions. if (!is_wv01){ // Do WV02 if (is_forward){ // Forward scan direction if (tdi == 8){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); } else if (tdi == 16){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 32){ // WV02, TDI 32, forward scan direction 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 48){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 64){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); } }else{ // Reverse scan direction for WV02 if (tdi == 8){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 16){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 32){ // WV02, TDI 32, reverse scan direction 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 48){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 64){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); } } // end reverse scan }else{ // Do WV01 if (is_forward){ // Forward scan if (tdi == 8){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 16){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 32){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 48){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 56){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 64){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); } }else{ // Reverse scan for WV01 if (tdi == 8){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); } else if (tdi == 16){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 32){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 48){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 56){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); 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}; arr_to_vec(ccdy_arr, sizeof(ccdy_arr)/sizeof(double), ccdy); }else if (tdi == 64){ 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}; arr_to_vec(posx_arr, sizeof(posx_arr)/sizeof(double), posx); 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}; arr_to_vec(ccdx_arr, sizeof(ccdx_arr)/sizeof(double), ccdx); 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}; arr_to_vec(posy_arr, sizeof(posy_arr)/sizeof(double), posy); // There was not enough good data to reliably estimate ccdy // offsets. Some faint CCD artifacts are still visible after // correction. Need to revisit this case when more data is // available. ccdy = std::vector<double>(posy.size(), 0); } } } std::string wv = "WV01"; if (!is_wv01) wv = "WV02"; if (posx.empty()){ vw_out(WarningMessage) << "wv_correct: Corrections not implemented for camera model " << wv << " for TDI " << tdi << ". A copy of the input image will be created." << std::endl; } } // Apply WorldView corrections to each vertical block as high as the image // corresponding to one CCD sensor. template <class ImageT> class WVPerBlockCorrectView: public ImageViewBase<WVPerBlockCorrectView<ImageT>>{ ImageT m_img; int m_tdi; bool m_is_wv01, m_is_forward, m_no_correction; double m_pitch_ratio; std::vector<double> m_posx, m_ccdx, m_posy, m_ccdy; typedef typename ImageT::pixel_type PixelT; public: WVPerBlockCorrectView(ImageT const& img, int tdi, bool is_wv01, bool is_forward, bool no_correction, double pitch_ratio): m_img(img), m_tdi(tdi), m_is_wv01(is_wv01), m_is_forward(is_forward), m_no_correction(no_correction), m_pitch_ratio(pitch_ratio) { // Ensure these variables are clean m_posx.clear(); m_ccdx.clear(); m_posy.clear(); m_ccdy.clear(); if (!m_no_correction) get_offsets(m_tdi, m_is_wv01, m_is_forward, m_posx, m_ccdx, m_posy, m_ccdy); // Compensate for the variable pitch ratio for (int i = 0; i < (int)m_posx.size(); i++) m_posx[i] *= m_pitch_ratio; for (int i = 0; i < (int)m_posy.size(); i++) m_posy[i] *= m_pitch_ratio; VW_ASSERT(m_posx.size() == m_ccdx.size() && m_posy.size() == m_ccdy.size(), ArgumentErr() << "wv_correct: Expecting the arrays of positions " << "and offsets to have the same sizes."); } typedef PixelT pixel_type; typedef PixelT result_type; typedef ProceduralPixelAccessor<WVPerBlockCorrectView> pixel_accessor; inline int32 cols() const { return m_img.cols(); } inline int32 rows() const { return m_img.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor(*this, 0, 0); } inline pixel_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const { vw_throw(NoImplErr() << "WVPerBlockCorrectView::operator()(...) is not implemented"); return pixel_type(); } typedef CropView<ImageView<pixel_type> > prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { // Need to see a bit more of the input image for the purpose // of interpolation. int max_offset = 5; // CCD offsets are always under 1 pix int bias = BilinearInterpolation::pixel_buffer + max_offset; BBox2i biased_box = bbox; biased_box.expand(bias); biased_box.crop(bounding_box(m_img)); ImageView<result_type> cropped_img = crop(m_img, biased_box); InterpolationView<EdgeExtensionView< ImageView<result_type>, ConstantEdgeExtension >, BilinearInterpolation> interp_img = interpolate(cropped_img, BilinearInterpolation(), ConstantEdgeExtension()); ImageView<result_type> tile(bbox.width(), bbox.height()); for (int col = bbox.min().x(); col < bbox.max().x(); col++){ // Accumulate the corrections up to the current column double valx = 0, valy = 0; if (m_ccdx.size() > 0){ valx = 0.0; for (std::size_t t = 0; t < m_ccdx.size(); t++){ if (m_posx[t] < col){ valx -= m_ccdx[t]; } } valy = 0.0; for (std::size_t t = 0; t < m_ccdy.size(); t++){ if (m_posy[t] < col){ valy -= m_ccdy[t]; } } } for (int row = bbox.min().y(); row < bbox.max().y(); row++){ tile(col - bbox.min().x(), row - bbox.min().y() ) = interp_img(col - biased_box.min().x() + valx, row - biased_box.min().y() + valy); } } return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows() ); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; template <class ImageT> WVPerBlockCorrectView<ImageT> wv_correct(ImageT const& img, int tdi, bool is_wv01, bool is_forward, bool no_correction, double pitch_ratio){ return WVPerBlockCorrectView<ImageT>(img, tdi, is_wv01, is_forward, no_correction, pitch_ratio); } // Apply WorldView corrections to each column individually. This is more precise // but works only for some select World View-3 multispectral images. template <class ImageT> class WVPerColumnCorrectView: public ImageViewBase< WVPerColumnCorrectView<ImageT> >{ ImageT m_img; std::vector<double> m_dx, m_dy; typedef typename ImageT::pixel_type PixelT; public: WVPerColumnCorrectView(ImageT const& img, std::vector<double> const& dx, std::vector<double> const& dy): m_img(img), m_dx(dx), m_dy(dy){ if (m_dx.size() != m_dy.size()) { vw_throw( ArgumentErr() << "The x and y corrections must have the same dimensions.\n" ); } // Add more zeros if the corrections are too short. // This is needed because different WV images can have // different widths. // TODO(oalexan1): This is not safe long-term. while (m_dx.size() < m_img.cols()) m_dx.push_back(0); while (m_dy.size() < m_img.cols()) m_dy.push_back(0); if (m_img.cols() != m_dx.size() || m_img.cols() != m_dy.size()) { // vw_throw( ArgumentErr() << "Expecting as many corrections as columns.\n" ); } } typedef PixelT pixel_type; typedef PixelT result_type; typedef ProceduralPixelAccessor<WVPerColumnCorrectView> pixel_accessor; inline int32 cols() const { return m_img.cols(); } inline int32 rows() const { return m_img.rows(); } inline int32 planes() const { return 1; } inline pixel_accessor origin() const { return pixel_accessor( *this, 0, 0 ); } inline pixel_type operator()( double/*i*/, double/*j*/, int32/*p*/ = 0 ) const { vw_throw(NoImplErr() << "WVPerColumnCorrectView::operator()(...) is not implemented"); return pixel_type(); } typedef CropView<ImageView<pixel_type> > prerasterize_type; inline prerasterize_type prerasterize(BBox2i const& bbox) const { // Need to see a bit more of the input image for the purpose // of interpolation. int max_offset = 5; // CCD offsets are always under 1 pix int bias = BilinearInterpolation::pixel_buffer + max_offset; BBox2i biased_box = bbox; biased_box.expand(bias); biased_box.crop(bounding_box(m_img)); ImageView<result_type> cropped_img = crop(m_img, biased_box); InterpolationView<EdgeExtensionView< ImageView<result_type>, ConstantEdgeExtension >, BilinearInterpolation> interp_img = interpolate(cropped_img, BilinearInterpolation(), ConstantEdgeExtension()); ImageView<result_type> tile(bbox.width(), bbox.height()); for (int col = bbox.min().x(); col < bbox.max().x(); col++) { for (int row = bbox.min().y(); row < bbox.max().y(); row++) { // Note that the same correction is used for an entire column tile(col - bbox.min().x(), row - bbox.min().y() ) = interp_img(col - biased_box.min().x() - m_dx[col], row - biased_box.min().y() - m_dy[col]); } } return prerasterize_type(tile, -bbox.min().x(), -bbox.min().y(), cols(), rows() ); } template <class DestT> inline void rasterize(DestT const& dest, BBox2i bbox) const { vw::rasterize(prerasterize(bbox), dest, bbox); } }; template <class ImageT> WVPerColumnCorrectView<ImageT> wv_correct(ImageT const& img, std::vector<double> const& dx, std::vector<double> const& dy){ return WVPerColumnCorrectView<ImageT>(img, dx, dy); } int main(int argc, char *argv[]) { Options opt; try { handle_arguments(argc, argv, opt); GeometricXML geo; AttitudeXML att; EphemerisXML eph; ImageXML img; RPCXML rpc; std::string scan_dir, sat_id, band_id; double det_pitch = 0.0; int tdi = 0; // Use per-column corrections (most recent) or per block of columns // corrections, which is coarser-grained (the older approach). bool per_column_correction = false; // If true, do not apply any corrections bool no_correction = false; try{ XMLPlatformUtils::Initialize(); read_xml(opt.camera_file, geo, att, eph, img, rpc); scan_dir = boost::to_lower_copy(img.scan_direction); if (scan_dir != "forward" && scan_dir != "reverse") vw_throw( ArgumentErr() << "XML file \"" << opt.camera_file << "\" is lacking a valid image scan direction.\n" ); // Read XML parameters and sanity checks sat_id = img.sat_id; band_id = img.band_id; if (band_id == "P") { tdi = img.tdi; if (opt.dx != "" || opt.dy != "") per_column_correction = true; } else if (band_id == "Multi") { per_column_correction = true; if (img.tdi_multi.size() != 8) vw_throw( ArgumentErr() << "Expecting 8 TDI values, one per multispectral band.\n" ); } // For WV2 data generated on May 26, 2022 or later a new calibration scheme // is used, which makes wv_correct unnecessary. if (sat_id == "WV02" && img.generation_time >= "2022-05-26") { vw_out() << "WARNING: wv_correct is not needed for WV02 data with generation time of " << "2022-05-26 or later. The vendor processing method changed starting with that " << "date, so applying the corrections will make the results worse. Will write " << "a copy of the original uncorrected image.\n"; no_correction = true; per_column_correction = false; } det_pitch = geo.detector_pixel_pitch; if (det_pitch <= 0.0) vw_throw( ArgumentErr() << "XML file \"" << opt.camera_file << "\" has a non-positive pixel pitch.\n" ); } catch ( const std::exception& e ) { vw_throw( ArgumentErr() << e.what() ); } if (sat_id != "WV01" && sat_id != "WV02" && sat_id != "WV03") vw_throw(ArgumentErr() << "Only WV01, WV02, and WV03 satellites are supported.\n"); if ( (opt.dx != "" && opt.dy == "") || (opt.dx == "" && opt.dy != "") ) vw_throw( ArgumentErr() << "Only one of --dx and --dy was specified." ); bool is_wv01 = (sat_id == "WV01"); bool is_forward = (scan_dir == "forward"); // Adjust for detector pitch double pitch_ratio = 8.0e-3/det_pitch; int num_bands = vw::get_num_channels(opt.image_file); if (num_bands != 1) vw_throw( ArgumentErr() << "Unsupported image with " << num_bands << " bands. Use gdal_translate to pick the desired band.\n\n"); DiskImageView<float> input_img(opt.image_file); if (input_img.planes() != 1) vw_throw( ArgumentErr() << "Only single-band images are supported. " << "For multispectral data, please extract first the desired " << "band using gdal_translate per the documentation.\n"); bool has_nodata = false; double nodata = std::numeric_limits<double>::quiet_NaN(); boost::shared_ptr<DiskImageResource> img_rsrc ( new DiskImageResourceGDAL(opt.image_file) ); if (img_rsrc->has_nodata_read()){ has_nodata = true; nodata = img_rsrc->nodata_read(); } vw::cartography::GeoReference georef; bool has_georef = false; ImageViewRef<float> corr_img; std::vector<double> dx, dy; if ((!per_column_correction) || no_correction) { // Per block correction or no correction if (has_nodata) corr_img = apply_mask(wv_correct(create_mask(input_img, nodata), tdi, is_wv01, is_forward, no_correction, pitch_ratio), nodata); else corr_img = wv_correct(input_img, tdi, is_wv01, is_forward, no_correction, pitch_ratio); } else { // Per column correction if (band_id != "Multi" && (opt.dx == "" || opt.dy == "")) vw_throw( ArgumentErr() << "Per column corrections were not specified.\n" ); if (band_id == "Multi" && (opt.dx == "" || opt.dy == "")) { if (opt.band <= 0 || opt.band > 8) vw_throw( ArgumentErr() << "For multispectral images, the band must " << "be between 1 and 8.\n" ); tdi = img.tdi_multi[opt.band - 1]; parse_ms_correction_table(sat_id, opt.band, tdi, scan_dir, // outputs dx, dy); if (dx.size() == 0 || dy.size() == 0) vw_out(WarningMessage) << "wv_correct: Corrections not implemented for satellite " << sat_id << " for TDI " << tdi << ", band " << opt.band << ", " << "and scan direction " << scan_dir << "." << " A copy of the input image will be created." << std::endl; } else { vw_out() << "Reading per column corrections from: " << opt.dx << ' ' << opt.dy << std::endl; asp::read_vec(opt.dx, dx); asp::read_vec(opt.dy, dy); } if (opt.print_per_column_corrections) { vw_out() << "Printing the x and y corrections as two columns." << std::endl; vw_out().precision(17); for (std::size_t it = 0; it < dx.size(); it++) { vw_out() << dx[it] << ' ' << dy[it] << std::endl; } } if (has_nodata) corr_img = apply_mask(wv_correct(create_mask(input_img, nodata), dx, dy), nodata); else corr_img = wv_correct(input_img, dx, dy); } vw_out() << "Writing: " << opt.output_image << std::endl; TerminalProgressCallback tpc("asp", "\t--> "); if (opt.output_type == "Float32") vw::cartography::block_write_gdal_image(opt.output_image, corr_img, has_georef, georef, has_nodata, nodata, opt, tpc); else if (opt.output_type == "Byte") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(corr_img, RoundAndClamp<uint8, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<uint8>(nodata), opt, tpc); else if (opt.output_type == "UInt16") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(corr_img, RoundAndClamp<uint16, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<uint16>(nodata), opt, tpc); else if (opt.output_type == "Int16") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(corr_img, RoundAndClamp<int16, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<int16>(nodata), opt, tpc); else if (opt.output_type == "UInt32") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(corr_img, RoundAndClamp<uint32, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<uint32>(nodata), opt, tpc); else if (opt.output_type == "Int32") vw::cartography::block_write_gdal_image(opt.output_image, per_pixel_filter(corr_img, RoundAndClamp<int32, float>()), has_georef, georef, has_nodata, vw::round_and_clamp<int32>(nodata), opt, tpc); else vw_throw( NoImplErr() << "Unsupported output type: " << opt.output_type << ".\n" ); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/Tools/xyzi2csv.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ /// \file xyzi2csv.cc /// // Convert a binary file in xyzi format to csv as lon,lat, // height_above_datum_meters. Input data format: binary double // precision floating point table with 4 columns: X, Y, Z, RDRid where // X,Y,Z are the polar stereographic coordinates (in km) and RDRid is // the LOLA RDR ID for each point with the format: YYDOYHHMM. #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <vw/FileIO/FileUtils.h> namespace po = boost::program_options; namespace fs = boost::filesystem; using namespace vw; struct Options : public vw::GdalWriteOptions { std::string xyzi, dem, csv; }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("xyzi", po::value(&opt.xyzi), "Input xyzi file.") ("dem", po::value(&opt.dem), "DEM from which to read the projection used for xyzi.") ("csv", po::value(&opt.csv), "Output csv file.") ; general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); po::positional_options_description positional_desc; std::string usage("[options]"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if (opt.xyzi == "") vw_throw(ArgumentErr() << "Must specify the input xyzi file.\n"); if (opt.dem == "") vw_throw(ArgumentErr() << "Must specify the input DEM file.\n"); if (opt.csv == "") vw_throw(ArgumentErr() << "Must specify the output csv file.\n"); // Create the output directory vw::create_out_dir(opt.csv); return; } void run_xyzi2csv(int argc, char* argv[]) { // Parse arguments and perform validation Options opt; handle_arguments(argc, argv, opt); vw::cartography::GeoReference georef; bool has_georef = vw::cartography::read_georeference(georef, opt.dem); if (!has_georef) vw_throw(ArgumentErr() << "There is no georeference information in: " << opt.dem << ".\n"); std::cout.precision(17); // Read the binary file std::ifstream ifs(opt.xyzi, std::ios::binary); vw_out() << "Writing: " << opt.csv << "\n"; std::ofstream ofs(opt.csv); ofs.precision(17); double v[4]; while (1) { ifs.read(reinterpret_cast<char*>(&v[0]), 4 * sizeof(double)); if (!ifs) break; Vector2 lonlat = georef.point_to_lonlat(Vector2(v[0] * 1000.0, v[1] * 1000.0)); ofs << lonlat[0] << ", " << lonlat[1] << ", " << 1000.0 * v[2] << "\n"; } } int main(int argc, char* argv[]) { try { run_xyzi2csv(argc, argv); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/WVCorrect/CMakeLists.txt ================================================ add_executable(disp_avg disp_avg.cc) target_link_libraries(disp_avg AspCore AspSessions) install(TARGETS disp_avg DESTINATION bin) ================================================ FILE: src/asp/WVCorrect/README_MULTISPECTRAL ================================================ # Overview This document describes how to tabulate subpixel corrections to apply to Digital Globe multispectral images to reduce the CCD artifacts in these images. See README_PAN for the case of PAN images, and see the manual page of wv_correct which shows how these corrections are applied. So far, corrections have been tabulated only for a very small number of possible scenarios. Digital Globe has several satellites, for example WorldView-1 to 4. Each satellite collected multispectral data either in the forward or reverse scan direction. For each of these, data is accumulated with a certain TDI (time-delay integration), and has 8 bands. A separate correction is needed for each satellite, scan direction, TDI, and band, which results in a lot of cases to consider. It is suggested to have several datasets for each case, process them individually, compare them, and average them. This tool does not correct jitter or other high-frequency artifacts. # Preliminaries Checkout the ASP source code. Below we will assume it is in $HOME/StereoPipeline Get a binary version of ASP and prepended the path to its ``bin`` directory to PATH. Create a conda environment having numpy, gdal, and matplotlib. Ensure that when running python the version provided by this environment is invoked. # Computing the corrections Given a PAN image and camera, p.tif and p.xml, and an 8-band multispectral image and camera, ms.tif and ms.xml, the first step is to apply the CCD artifact correction to the PAN image, which can go as follows: gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER \ p.tif p_block.tif wv_correct p_block.tif p.xml p_corr.tif Here, the first step rewrites the image to store it in small blocks (tiles) to speed up wv_correct. Next, the corrected PAN image is used as reference, the disparity from the PAN image rescaled by a factor of 4 to a given band of the multispectral image, every column of this disparity is averaged, producing two arrays of corrections of whose length is the image width (one array for the x component of the disparity and one for the y component). This is accomplished as follows: band=3 crop_win="0 0 100000 100000" ASP_PATH=$HOME/StereoPipeline $ASP_PATH/src/asp/WVCorrect/ms_ccd_solve.sh \ p_corr.tif m.tif p.xml m.xml $band run/run "$crop_win" Here we desire to tabulate band 3 (Green), the crop window was chosen big enough to contain the whole image (smaller windows may be useful for testing), and we invoked a script from ASP's source directory, which will in turn call some other scripts from that directory as well as ASP binaries. The result of this script will be the averaged disparities: run/run-avg-dx.txt run/run-avg-dy.txt and the corrections computed based on these disparities: run/run-corr-dx.txt run/run-corr-dy.txt The latter can be plotted as follows: python $ASP_PATH/src/asp/WVCorrect/ccd_process.py --plot-only \ run/run-corr-dx.txt (The dy.txt correction need not be specified, it will be loaded automatically.) The script will also produced colorized disparities (in x and y) from the PAN image to the MS image, in which the CCD artifacts will be very obvious. They can be visualized as: stereo_gui run/run-RD_b1_CMAP.tif run/run-RD_b2_CMAP.tif # Averaging the corrections If there exist several datasets for the same satellite, scan direction, TDI, and band, run the tool for each one, with a separate output directory for each, called say run1, run2, etc. The obtained corrections can be visualized together as: python $ASP_PATH/src/asp/WVCorrect/ccd_process.py --plot-only \ run*/run-corr-dx.txt To compute a combined correction, by averaging, start with the earlier averaged disparity. Run: python $ASP_PATH/src/asp/WVCorrect/ccd_process.py \ run*/run-avg-dx.txt --output-prefix combined One has to be careful to not combine results from different TDI, scan directions, etc. # Verifying the corrections To verify how the obtained corrections improve the results, do band=3 crop_win="0 0 100000 100000" ASP_PATH=$HOME/StereoPipeline $ASP_PATH/src/asp/WVCorrect/ms_ccd_verify.sh \ p_corr.tif m.tif p.xml m.xml $band run_verif/run "$crop_win" \ combined-dx.txt Notice how this tool is called exactly as the earlier shell script, but with a different output directory and the last argument having the obtained correction in x (the one in y will be read automatically). It is very instructive to compare the colormaps obtained earlier from the ones after this step. # Shipping the corrections To reduce the storage space and improve the organization, the obtained corrections can be combined into a single TIF image which then should be shipped with ASP. This is accomplished as follows. Assume for the sake of argument that two corrections were found each for a certain combination of satellite, TDI, etc., and they are named corr1-dx.txt and corr2-dx.txt (with corresponding dy corrections as well). The TIF image is obtained as follows: python $ASP_PATH/src/asp/WVCorrect/form_corrections_image.py \ corr1-dx.txt corr2-dx.txt \ --output-image $ASP_PATH/src/asp/WVCorrect/WVxx_CCD_CORR.tif Then, edit the file $ASP_PATH/src/asp/WVCorrect/ms_correction_lookup.txt and carefully add more lines to correspond to the corrections just added. As it can be seen in that file, multiple TIF files can be present having corrections, and given that a TIF file contains multiple corrections, one has to ensure to specify on which row of which TIF file the correction has to be found. Any time any changes are made, the file CMakeLists.txt in the StereoPipeline directory must be edited and the new TIF image must be added. Even if no new such image is added, but any changes at all happened, it is very important to have the time of this CMakeLists.txt file be updated with the touch command, then cmake, make, and make install must be re-run. This will ensure the modified files are re-installed. All the changes must be committed to the Git repository. After this, wv_correct (from the recently updated installation directory) can be run with the new corrections. Since the above process is error-prone, it is suggested to run wv_correct in two ways, first by explicitly providing the corrections, such as: wv_correct --dx dx.txt --dy dy.txt --print-per-column-corrections\ image.tif image.xml image_corr1.tif and second time by having them read from the TIF image: wv_correct --band 3 --print-per-column-corrections \ image.tif image.xml image_corr2.tif The flag --print-per-column-corrections will print the corrections about to apply. They must be the same in both case up to float precision. (Specify the correct band in the second call.) ================================================ FILE: src/asp/WVCorrect/README_PAN ================================================ This document describes how corrections for CCD artifacts in PAN Digital Globe WorldView imagery (WV-1 and WV-2) are are tabulated. See README_MULTISPECTRAL for how the corrections to multispectral images are computed. These documents can be used if desired to compute new corrections. The existing corrections are already incorporated in the wv_correct program. Basic idea ---------- For each TDI and scan direction perform several runs. For each run, average all rows of the disparity (ignore invalid disparities). Average these over multiple runs. We get n Vector2 values (since each valid disparity pixel is a Vector2), where n is the image width. From these, we will extract the locations of CCD jumps and their values in x and in y. Those will be hard-coded in asp/Tools/wv_correct.cc. This text is applicable to WV01 and WV02. For WV03 see the text on top of ccd_solve.cc. Detailed instructions --------------------- 1. Choose a satellite (WV1 or WV2; this approach does not work for WV3 which seems fine as it is), a TDI (values are various multiples of 8 from 8 to 64), and a scan direction (forward or reverse). (All this information can be found in the XML files.) 2. Create a work directory. Have there at least 5-10 image sets for the desired satellite/TDI/scan direction combination, with reasonably flat terrain, little or no clouds, and reasonable amount of detail. 3. Build ASP in dev mode. Ensure that the Tools and WVCorrect directories are in your path. 4. For a given stereo pair, inspect the left and right images in stereo_gui. Select with the mouse a region wider than the image in the left image, and of height say 5000 or more pixels. Its bounds will be printed on screen. Select a region from the right image as well, encompassing with a generous margin all terrain already seen in the left image (say of heieght 12000 pixels). Make the region again wider than the image, to not leave any image part out either on left or on right sides. Run the script run_lr_wrap.sh (see its source for usage). Repeat this excercise for other portions of the left image. Repeat this again several times when opening the images in reverse order. This is important in order to get good disparity coverage. Before doing all this, in each directory have a dem.tif file pointing to a pre-existing DEM of the area covered by the images. This is optional, but it is queried to find the projection to use in point2dem during the execution of run_lr_wrap.sh. 5. Repeat this excercise a few more times for other stereo pairs. 7. Inspect the obtained F.tif disparities. Crop away some top and bottom rows if they are incomplete or have noise. You will have to redo the step "disp_avg" from run_lr.sh. The result will be "dx.txt" and "dy.txt" files having averaged disparities. 8. Start Matlab. Add your WVCorrect directory to the path, for example use addpath(genpath('/home/USER/projects/StereoPipeline/src/asp/WVCorrect')) 9. In Matlab, create an entry for each run you made, for example, as dirs={'pair1/run_lr1', 'pair1/run_rl2', 'pair2/run_lr1', 'pair2/run_rl2'}; The following one-liner can be used to generate the above dirs value: ls -d pair*/run_lr* | perl -pi -e "s#^(.*?)\n#'\$1\', #g" | perl -pi -e "s#^(.*?),\s*\$#dirs=\{\$1\}\n#g" Initialize the pitches as: pitches=zeros(length(dirs), 1) + 8.0e-3; It is important to verify that the pitches in each XML file are indeed 8.0e-03 (search for <DETPITCH>). Otherwise fill in the correct values in the 'pitches' array. The script gen_scandir.pl can be helpful in parsing XML files to extract information on pitches, etc. 10. Run do_find = 1; fig_no = 1; find_ccds(do_find, dirs, pitches, fig_no); This will save the CCD corrections to files, from there they can be hard-coded in wv_correct.cc. 11. It is quite likely the previous step will result in very noisy curves. Those need to be eliminated, by excluding the noisy runs altogether, or by cropping F.tif even further and redoing "disp_avg". Be prepared for a lot of manual iterative work over many days. 12. The script fix_ccds.m can be used to tweak the CCD jumps from the GUI. 13. Recompile wv_correct.cc. Run it to get corrected images. Redo stereo and point2dem. Examine if the IntersectionError.tif file looks better than before. This can be done, for example, by again running run_lr_wrap.sh but this time setting the "corr" flag to 1. An "improved" intersection error file will have less noticeable vertical bands corresponding to ccd artifacts, and its mean, and especially standard deviation, should be lower than with the original uncorrecteed images. Some residual CCD artifacts should be noticeable, and there should be clear jitter present, which we do not correct for with wv_correct. wv_correct will only ever be run once per image. The Matlab find_ccds tool will also only be run once per TDI; it can be re-run to get a better set of fixes, but corrected data should never fed back in to the find_ccds tool. To improve the correction as seen in IntersectionError.tif, the following steps can be taken: - Use more input data to find_ccds. This may involve tweaking the ROIs or stereo commands so that more image pairs successfully generate dx/dy files. - Tune the ROIs more carefully so that mountains or poorly matching regions do not get included into the dx/dy averages. - Compare plots of the newly obtained correction amounts with the corrections from other TDIs to get an idea of what shift patterns can be expected. - Hand-tune individual correction amounts by looking at the curves in Matlab. The jump should be equal in height to the peak-to-peak jump seen in the plot. - Keep in mind that WV1 is not as well behaved as WV2. The final errors for WV1 will be worse. After correcting the images, you can re-run the process on the corrected images and obtain dx/dy curves for them as well. When plotted, you should see the lack of sharp jumps in the CCD border areas. Most likely you will still see jumps, but they will be corrected by an opposite jump nearby. This is the effect of our applied correction, and the spacing between the jumps indicates that our correction is misplaced by some number of pixels. A difference in the height of the jumps indicates that our correction amount is also off by some amount. Other Observations --------------------- At least some WV images show a consistent 0.25 pixel oscillation in the X-direction disparity results. This oscillation is independent of the CCD border correction and about half the magnitude. It is not noticably affected by the subpixel mode used and it is visible on the intersection error image. Seen in WV1 and WV2, multiple directions and TDIs. ================================================ FILE: src/asp/WVCorrect/ccd_process.py ================================================ #!/usr/bin/python # Process the average disparity to correct for ccd artifacts. Use as # inputs the outputs of disp_avg. It is very important to note that # the output of disp_avg will have two extra elements at the # beginning, which are metadata, so the total number of values in that # array is two more than the number of image columns. During # processing this metadata will be removed. # This expects numpy and matplotlib to be installed. import sys, os, re, argparse import numpy as np usage = "python ccd_process.py <options> <inputs>-dx.txt" parser = argparse.ArgumentParser(usage = usage, formatter_class = argparse.RawTextHelpFormatter) parser.add_argument("--exclude", dest = "exclude", type = int, default = 40, help = "The number of (presumably inaccuate) values to exclude at " + \ "the endpoints (they will be replaced with the value at the immedate " + \ "non-excluded value).") parser.add_argument("--output-prefix", dest = "output_prefix", default = None, help = "Save the processed results with this output prefix.") parser.add_argument("--no-plot", action = "store_true", default = False, dest = "no_plot", help = "Do not plot the computed corrections.") parser.add_argument("--plot-only", action = "store_true", default = False, dest = "plot_only", help = "Do not compute the CCD corrections, only " + \ "plot any corrections that were computed before.") (options, files) = parser.parse_known_args(sys.argv) def load_and_process(f, options): # Load the text file x = np.loadtxt(f) if options.plot_only: return x x_len = len(x) # Replace the values at the end points as there correlation # does not do too well. for i in range(options.exclude): x[i] = x[options.exclude] x[x_len - i - 1] = x[x_len - options.exclude - 1] return x def ccd_process(files, options): do_plot = (not options.no_plot) if do_plot: import matplotlib.pyplot as plt colors = ['b', 'r', 'g', 'c', 'm', 'y', 'k'] num_colors = len(colors) if do_plot: try: plt.figure(1, figsize=(16, 5)) # inches plt.subplot(211) except Exception as e: print("Could not launch a plot. Consider using this script with '--no-plot'.\n") print("Error was: " + str(e)) sys.exit(1) # Process x print("\nProcessing the x average disparity") mean_x = [] num_vals = 0 start = True for i in range(len(files)): f = files[i] print("Loading: " + f) x = load_and_process(f, options) num_vals = num_vals + 1 if not options.plot_only: # Subtract the mean to overall not disturb the pixels too much, # with the correction, hence let the mean correction be zero. x = x - np.mean(x) # Compensate for the fact that the PAN images have exra 50 # columns on the sides compared to the MS images at the PAN # resolution, which is 12.5, so 1/4, at the MS resolution # Don't do this given that we subtract the mean. # (x = x - 12.5) # Flip, since we will apply to the MS images to match PAN # rather as in reverse as computed. x = -x if start: # Initialize the mean mean_x = x[:] start = False else: mean_x = mean_x + x if do_plot: plt.plot(x, colors[i % num_colors]) if do_plot: # Label the x plot #plt.ylim(-2, 2) plt.title('dx') if do_plot: # Set up the y plot plt.subplot(212) # Process y print("\nProcessing the y average disparity") mean_y = [] start = True for i in range(len(files)): f = files[i] # switch to the y average disparity f = f.replace('x.txt', 'y.txt') print("Loading: " + f) y = load_and_process(f, options) if not options.plot_only: # Subtract the mean as before y = y - np.mean(y) # flip as before y = -y if start: # Initialize the mean mean_y = y[:] start = False else: mean_y = mean_y + y if do_plot: plt.plot(y, colors[i % num_colors]) if do_plot: # Label the y plot #plt.ylim(-2, 2) plt.title('dy') if not options.plot_only: print("\nWill average " + str(num_vals) + " dataset(s).") mean_x = mean_x / num_vals mean_y = mean_y / num_vals fx = options.output_prefix + '-dx.txt' print("Saving the processed x data at: " + fx) np.savetxt(fx, mean_x) fy = options.output_prefix + '-dy.txt' print("Saving the processed y data at: " + fy) np.savetxt(fy, mean_y) if do_plot: plt.show() # Main if len(files) <= 1: parser.print_help() sys.exit(1) if (not options.plot_only) and (options.output_prefix is None): print("Must specify an output prefix") parser.print_help() sys.exit(1) ccd_process(files[1:], options) ================================================ FILE: src/asp/WVCorrect/disp_avg.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2006-2012, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NASA Vision Workbench is licensed under the Apache License, // Version 2.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifdef _MSC_VER #pragma warning(disable:4244) #pragma warning(disable:4267) #pragma warning(disable:4996) #endif #include <asp/Core/Macros.h> #include <asp/Core/AspProgramOptions.h> #include <vw/FileIO/DiskImageView.h> #include <vw/Stereo/DisparityMap.h> #include <vw/FileIO/FileUtils.h> #include <vw/Image/Statistics.h> using namespace vw; namespace po = boost::program_options; // Average the rows in a given disparity image. Save them to disk as // two text files (x and y values), with as many entries as there // were columns in the disparity. struct Options : vw::GdalWriteOptions { std::string disparity, dx, dy; int beg_row, end_row; Vector2 remove_outliers_params; bool save_no_metadata; }; void handle_arguments(int argc, char *argv[], Options& opt) { po::options_description general_options(""); general_options.add_options() ("remove-outliers-params", po::value(&opt.remove_outliers_params)->default_value(Vector2(95.0, 3.0), "pct factor")) ("beg-row", po::value(&opt.beg_row)->default_value(-1), "Start averaging the disparity from this row.") ("end-row", po::value(&opt.end_row)->default_value(-1), "Stop the disparity before this row.") ("save-no-metadata", po::bool_switch(&opt.save_no_metadata)->default_value(false), "Do not save in the output correction file the start and end image columns (not saving this makes processing easier)."); general_options.add(vw::GdalWriteOptionsDescription(opt)); po::options_description positional(""); positional.add_options() ("disparity", po::value(&opt.disparity)) ("dx", po::value(&opt.dx)) ("dy", po::value(&opt.dy)); po::positional_options_description positional_desc; positional_desc.add("disparity", 1); positional_desc.add("dx", 1); positional_desc.add("dy", 1); std::string usage("[options] <disparity> <dx.txt> <dy.txt>"); bool allow_unregistered = false; std::vector<std::string> unregistered; po::variables_map vm = asp::check_command_line(argc, argv, opt, general_options, general_options, positional, positional_desc, usage, allow_unregistered, unregistered); if ( !vm.count("disparity") || !vm.count("dx") || !vm.count("dy") ) vw::vw_throw( vw::ArgumentErr() << "Not all inputs were specified.\n\n" << usage << general_options ); // Create the directory in which the output image will be written. vw::create_out_dir(opt.dx); } int main( int argc, char *argv[] ){ Options opt; try { handle_arguments(argc, argv, opt); DiskImageView < PixelMask<Vector2f> > D(opt.disparity); int cols = D.cols(), rows = D.rows(); // Handle optional row ROI arguments. // - No col ROI since we want the entire column range. int beg_row = 0; int end_row = rows; int col_start = 0; int col_stop = cols; if (opt.beg_row >= 0 && opt.end_row > opt.beg_row) { beg_row = std::min(opt.beg_row, rows); end_row = std::min(opt.end_row, rows); } TerminalProgressCallback disp_progress("asp", "\tAveraging: "); double disp_progress_mult = 1.0/double(std::max(col_stop - col_start, 1)); std::vector<double> Dx(cols, 0), Dy(cols, 0); for (int col = col_start; col < col_stop; col++){ disp_progress.report_progress((col - col_start) * disp_progress_mult); std::vector<double> px, py; for (int row = beg_row; row < end_row; row++){ PixelMask<Vector2f> p = D(col, row); if (!is_valid(p)) continue; px.push_back(p.child()[0]); py.push_back(p.child()[1]); } std::sort(px.begin(), px.end()); std::sort(py.begin(), py.end()); // Being too strict with outlier removal can cause trouble double pct_factor = opt.remove_outliers_params[0]/100.0; double outlier_factor = opt.remove_outliers_params[1]; double bx = 0, ex = 0, by = 0, ey = 0; if (!vw::math::find_outlier_brackets(px, pct_factor, outlier_factor, bx, ex)) continue; if (!vw::math::find_outlier_brackets(py, pct_factor, outlier_factor, by, ey)) continue; int len = px.size(); int num_valid = 0; Dx[col] = 0; Dy[col] = 0; for (int k = 0; k < len; k++){ if (px[k] < bx || px[k] > ex || py[k] < by || py[k] > ey) continue; num_valid++; Dx[col] += px[k]; Dy[col] += py[k]; } if (num_valid > 0){ Dx[col] /= num_valid; Dy[col] /= num_valid; } } disp_progress.report_finished(); // Write dx file std::ofstream dx(opt.dx.c_str()); dx.precision(16); std::cout << "Writing: " << opt.dx << std::endl; if (!opt.save_no_metadata) { dx << col_start << std::endl; dx << col_stop << std::endl; } for (int col = 0; col < cols; col++) dx << Dx[col] << std::endl; dx.close(); // Write dy file std::ofstream dy(opt.dy.c_str()); dy.precision(16); std::cout << "Writing: " << opt.dy << std::endl; if (!opt.save_no_metadata) { dy << col_start << std::endl; dy << col_stop << std::endl; } for (int col = 0; col < cols; col++) dy << Dy[col] << std::endl; dy.close(); } ASP_STANDARD_CATCHES; return 0; } ================================================ FILE: src/asp/WVCorrect/find_ccds.m ================================================ function main(do_find, dirs, pitches, plotid) % if do_find is 1, we actually find and save the CCDs, % otherwise we just examine the current averaged disparties. if nargin < 4 % Did the user pass in the pitch list? error('Missing arguments!') end if length(pitches) ~= length(dirs) error('Must have one pitch per directory') end %if length(col_starts) ~= length(dirs) % error('Must have col start per directory') %end % Generate list of dx and dy file paths dx_file_paths={}; dy_file_paths={}; for i=1:length(dirs) dir = dirs{i}; dx_path=[dir '/dx.txt']; dy_path=[dir '/dy.txt']; dx_file_paths = [dx_file_paths, dx_path]; dy_file_paths = [dy_file_paths, dy_path]; end % Separately handle dx then dy do_plot(do_find, dx_file_paths, pitches, plotid); title('x'); do_plot(do_find, dy_file_paths, pitches, 1+plotid); title('y'); end %-------------------------------------------------------- function disparity_data = scale_by_pitch(disparity_data, pitch) % Compensate for the fact that ccd artifacts are spaced closer for larger pitch % - Do this by interpolating a new vector at the default pitch size. % - The larger pitch size effectively represents a downsampled input image. BASE_PITCH = 8.0000000000e-03; % The default pitch value I = (BASE_PITCH/pitch)*(1:(10*length(disparity_data))); % Get normal pitch pixel locations to a large distance J=find(I > length(disparity_data)); % Find all those locations that fall out of bounds I = I( 1:(J(1)-1)-1 ); % Crop to only in-bounds locations disparity_data = interp1(1:length(disparity_data), disparity_data', I, 'linear')'; end % The main working function! function do_plot(do_find, disparity_file_paths, pitches, fig) PRINT_EACH_FILE = true; % TODO: Should input values outside +1/-1 be replaced with NaN? % TODO: How to deal with files of different sizes? %--> Very unlikely that the pixels actually line up with eachother! %--> Would like to be able to crop out the borders of some images and still have them line up. %--> To do this need a column offset for each input file. % Loop through each of the input disparity files and load the data into X. X = []; for i=1:length(disparity_file_paths) disparity_path=disparity_file_paths{i}; if exist(disparity_path, 'file') == 2 % If the file exists... %disp(sprintf('Loading %s', disparity_path)); else error(sprintf('Missing file: %s', disparity_path)); end % Load the data and extract the crop amount disparity_data = load(disparity_path); col_start = disparity_data(1); % Data outside this range is junk, existing zero handling should col_stop = disparity_data(2); % take care of it. %disparity_data = disparity_data(3:end); % Scale the data by the pitch % - This adjusts all input vectors to the same size pixels, resizing the arrays. disparity_data = scale_by_pitch(disparity_data, pitches(i)); disp(['Disparity length = ', num2str(length(disparity_data))]) [existing_data_length, n_files_stored] = size(X); % Deal with size mis-matches by either growing X or disparity_data. % TODO: Our code does not handle this case at all! if existing_data_length > 0 % If this is not the first file loaded new_data_length = length(disparity_data); %if new_data_length ~= existing_data_length % error(sprintf('Input data lengths %d and %d do not match!', new_data_length, existing_data_length)); %end % Try not to use this old code! if new_data_length < existing_data_length % Pad out the new data disparity_data = [disparity_data' zeros(1, existing_data_length - new_data_length)]'; elseif existing_data_length < new_data_length % Pad out the existing data Y = zeros(new_data_length, n_files_stored); Y(1:existing_data_length, 1:n_files_stored) = X; X = Y; [data_length, n_files_stored] = size(X); % Update these values end end % End case handling existing data % Now that the sizes are equalized, append the new data. X = [X disparity_data]; end % End loop through disparity files % Transpose the data so that the first dimension is smaller X = X'; [n_files_stored, data_length] = size(X); %disp(sprintf('size of X is %d %d', n_files_stored, existing_data_length)); % Set to NaN all values within a buffer of a zero value near the ends of % each loaded data set. edge_search_dist = round(data_length/3); for r=1:n_files_stored % Stay away from boundary. %BDVAL = 300; % Must tweak this!!! BDVAL = 100; % Smaller for working with cropped regions % Search through the data to find the last? zero value col_start = 1; for c=1:edge_search_dist % Loop through first third of data if X(r, c) == 0 col_start = max(col_start, c); end end % Do the same thing but coming in from the back col_end = data_length; for c=(data_length-edge_search_dist):data_length if X(r, c) == 0 col_end = min(col_end, c); end end % Move in even farther col_start = col_start + BDVAL; col_end = col_end - BDVAL; % Clear all the values outside the boundaries for c=1:col_start X(r, c) = NaN; end for c=col_end:data_length X(r, c) = NaN; end end % End loop through stored files wid = 35; % These colors are rotated through as files are plotted colors = {'b', 'r', 'g', 'c', 'k'}; brushes = {'-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-'}; % brushes = {'-', '--', '-.', ':', '-', '--', '-.', ':', '-', '--', '-.', ':', '-', '--', '-.', ':'}; figure(fig); clf; hold on; sep_size=0.0; if do_find sep_size = 0.25; % vertical gap between individual curves, for visibility end % Remove really bad files goodFile = ones(n_files_stored, 1); for r=1:n_files_stored if r <= length(disparity_file_paths) disp(sprintf('doing %s', disparity_file_paths{r})); end % Subtract out a smoothed version of this file's data Y = X(r, :) - find_moving_avg(X(r, :)); X(r, :) = Y; goodIndices = find(isnan(Y) ~= 1); maxVal = max(abs(Y(goodIndices))); if maxVal > 1 disp(sprintf('Skipping file with maximum value %g', maxVal)); goodFile(r) = 0; continue end if (PRINT_EACH_FILE) % Plot the data set, vertically shifted % Select a color for this file and plot the shifted data color_index = rem(r-1, length(colors))+1; brush_index = floor((r-1) / length(colors))+1; line_color = [brushes{brush_index}, colors{color_index}]; vertical_offset = sep_size*(r+1); % Visually separate the plots plot(Y + vertical_offset, line_color); end end % End loop through stored files % Take the mean of all of the input data mean_X = zeros(1, data_length); for c=1:data_length sum = 0; num = 0; for r=1:n_files_stored if ~isnan(X(r, c)) & goodFile(r) == 1 sum = sum + X(r, c); num = num + 1; end end if num > 0 mean_X(1, c) = sum/num; end end % End loop through data mean_line_width = 1; if PRINT_EACH_FILE mean_line_width = 3; end plot(mean_X, 'm', 'LineWidth', mean_line_width); %ylim([-1, 1]) % Set the plot so that the axes have the right numbers when moving h1 = zoom; h2 = pan; set(gca,'XTickLabelMode','auto') set(gca,'XTickLabel',num2str(get(gca,'XTick').')) set(h1,'ActionPostCallback',@mypostcallbackX); set(h2,'ActionPostCallback',@mypostcallbackX); if do_find ~= 0 find_ccds_aux(mean_X, fig) end end % Callback function to keep axes updated when zooming function mypostcallbackX(obj,evd) set(gca,'XTickLabelMode','auto') set(gca,'XTickLabel',num2str(get(gca,'XTick').')) end % Split up a string based on spaces function b = split(a) b = strread(a,'%s','delimiter',' ') end ================================================ FILE: src/asp/WVCorrect/find_ccds_aux.m ================================================ function find_ccds_aux(mean_disparity, fig) % vector_length = length(mean_disparity); % Access the existing figure figure(fig); hold on; % Call function to detect jumps in the disparity vector detected_jumps=find_ccds_aux2(mean_disparity); [m, num_jumps] = size(detected_jumps); if (num_jumps == 0) disp('No CCD jumps detected!') return % Don't need to write output if we did not find anything. end %I0=1:(vector_length); jump_indices = detected_jumps(1, :); jump_magnitudes = detected_jumps(2, :); % Limit the detected jumps to only one jump per N regions in the disparity vector. % - Each region is +/- width in size, centered around: n*PERIOD + SHIFT % - Why do we do this? PERIOD = 705; SHIFT = -35; WIDTH = 80; [jump_indices, jump_magnitudes] = sparse_ccds(WIDTH, PERIOD, SHIFT, vector_length, jump_indices, jump_magnitudes, fig); plot(jump_indices, mean_disparity(jump_indices), 'b*', 'MarkerSize',12); % Draw blue *'s plot(jump_indices, jump_magnitudes, 'b'); % Draw blue lines? %[period, shift] = find_true_period(jump_indices, jump_magnitudes); % if fig == 1 % figure(fig+10); % clf; hold on; % plot(diff(jump_indices), 'b'); % plot(1000*jump_magnitudes, 'r'); % end format long g; T = [jump_indices' jump_magnitudes']'; if fig == 1 file='ccdx.txt'; file2='avgx.txt'; else file='ccdy.txt'; file2='avgy.txt'; end mean_disparity = mean_disparity'; % Write the output files disp(sprintf('saving %s', file)); disp(sprintf('saving %s', file2)); dlmwrite(file, T, 'delimiter', ',', 'precision', 9); dlmwrite(file2, mean_disparity, 'delimiter', ',', 'precision', 9); function [period, shift] = find_true_period(jump_indices, jump_magnitudes) % The true period is associated with the hugest hump vector_length = length(jump_indices); Q = zeros(vector_length-1, 1); for i=1:(vector_length-1) Q(i) = abs(jump_magnitudes(i)) + abs(jump_magnitudes(i+1)); end I = find(Q == max(Q)); i = I(1); period = jump_indices(i+1) - jump_indices(i); shift = jump_indices(i) - i*period; while shift > 0 shift = shift - period; end plot(jump_indices(i), jump_magnitudes(i), 'g*'); disp(sprintf('--period and shift %g %g', period, shift)); % TODO: Update this function [locationsx, locationsy] = get_wv_correct_positions(WV_SAT_NUM) %if WV_SAT_NUM == 2 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]; %else %end locationsx = locations; locationsy = locations; function [jump_indices, jump_magnitudes] = sparse_ccds(wid, period, shift, ... vector_length, jump_indices, jump_magnitudes, fig) % The known jumps should fall inside the search regions PLOT_SEARCH_REGIONS = false; % This is kind of slow PLOT_KNOWN_JUMPS = false; WV_SAT_NUM = 2; CROP_START_COL = 0; % Crop amount for the "left" image, fixes locations for a single cropped input jump_indices = jump_indices; if PLOT_KNOWN_JUMPS % CCD correction locations which were determined manually % - The position of the corrections does not change much, so look near these points. [est_jumps_x, est_jumps_y] = get_wv_correct_positions(WV_SAT_NUM); % Filter points outside the cropped region est_jumps_x = est_jumps_x - CROP_START_COL; est_jumps_y = est_jumps_y - CROP_START_COL; est_jumps_x = est_jumps_x(find( (est_jumps_x>0) & (est_jumps_x<vector_length))); est_jumps_y = est_jumps_y(find( (est_jumps_y>0) & (est_jumps_y<vector_length))); plot(est_jumps_x, zeros(1, length(est_jumps_x)), 'g*'); plot(est_jumps_y, zeros(1, length(est_jumps_y)), 'y*'); end % Keep one CCD per period P = period*(1:vector_length) + shift - CROP_START_COL; I = find( (P > 0) & (P <= vector_length)); P = P(I); % P now contains only multiples of period (+ shift) I=[]; for i=1:length(P) % For each period multiple region_start = P(i)-wid; region_end = P(i)+wid; if PLOT_SEARCH_REGIONS % Shade this search region with a low-opacity box. figure(fig); y = [5 5]; x = [region_start region_end]; basevalue = -1; h = area(x, y, basevalue, 'LineStyle',':'); child=get(h,'Children'); set(child,'FaceAlpha',0.15) end % Grab jumps that fall within a range from the period position J = find( (jump_indices >= region_start) & (jump_indices <= region_end)); if length(J) == 0 continue end % Restrict to only the largest jumps (if ties, the first will get kept) K = find( abs(jump_magnitudes(J)) == max(abs(jump_magnitudes(J))) ); I = [I, J(K(1))]; % Record the jump index end jump_indices = jump_indices(I); jump_magnitudes = jump_magnitudes(I); function U = find_ccds_aux2(mean_disparity) % Detect local maxima of a diff function in the input vector % - Returns indices and values in a matrix % Hard coded debug figure do_plot = 0; figno=0; SHIFT=0; if do_plot figure(figno); clf; hold on; end %mean_disparity = find_avg(A, col); %Bt=mean_disparity'; %save('Bm.txt', '-ascii', '-double', 'Bt'); %return %mean_disparity0 = find_avg(A0, col); WIDTH = 35; % Compute some sort of diff measure Q = mean_disparity*0 + NaN; % Generate a NaN vector matching the disparity vector for i=1:length(mean_disparity) %if i-WIDTH >= 1 & i+WIDTH<= length(S) if (i-WIDTH >= 1) & (i+2*WIDTH <= length(mean_disparity)) % 3*WIDTH region 1/3 centered on i % Document this!!! % To do: Improve the accuracy by doing slopes with least squares Q(i) = 1.5*(mean_disparity(i+ WIDTH) - mean_disparity(i )) ... - 0.5*(mean_disparity(i+2*WIDTH) - mean_disparity(i-WIDTH)); %Q(i) = WIDTH*(2*S(i) - S(i-WIDTH) - S(i + WIDTH))/2; end end % To do: Use some other criterion cutoff = 0.01; % temporary!!! % CCD artifacts must be less than this max_cutoff = 1.5; % no ccd artifacts more than that are expected wid2 = ceil(1.5*WIDTH); % leave only largest maxium in length wid2 on each side q_indices = []; q_maxima = []; for i=1:length(Q) if isnan(Q(i)) continue end % Only process regions in a certain range if abs(Q(i)) < cutoff | abs(Q(i)) > max_cutoff continue end % Skip locations near the boundary if i-wid2 < 1 | i + wid2 > length(Q) continue end % Look at the nearby Q values; if any are greater than the current location % don't retain this location. This is to only keep local maxima? % To do: This needs more thinking, can result in a chain % reaction eliminating too many artifacts. is_good = 1; for l = (i-wid2):(i+wid2) if abs(Q(i)) < abs(Q(l)) is_good = 0; end end if is_good % Record the point index and Q value q_indices = [q_indices, i]; q_maxima = [q_maxima, Q(i)]; end end w2 = floor(WIDTH/2); %G = G + w2; % to be at center of CCD defect region format long g %[G'+w2 V']' % Pack centered indices and the value into the output vector U = [q_indices'+w2+SHIFT q_maxima']'; %return % %% %%plot(detected_jumps(1, K0), 0*mean_disparity(detected_jumps(1, K0)), 'b*') %%plot(sx1(1, K1)+s, 0*dx1(sx1(1, K1)), 'r*') % %%return % % % %%J1=find(I1+s > bx & I1+s < ex); %%K1=find(sx1(1, :) + s > bx & sx1(1, :) + s < ex); %% %%plot(I1(J1)+s, -dx1(J1)', 'r'); %%plot(sx1(1, K1)+s, -dx1(sx1(1, K1)), 'r*') %% %%plot(detected_jumps(1, K0), 0*mean_disparity(detected_jumps(1, K0)), 'b*') %%plot(sx1(1, K1)+s, 0*dx1(sx1(1, K1)), 'r*') % %jump_indices = detected_jumps(1, :); %P1 = sx1(1, :); %Z = zeros(length(jump_indices), length(P1)); %for l=1:length(jump_indices) % %disp(sprintf('l=%d', l)); % for t = 1:length(P1) % P1_shift = P1 - P1(t)+jump_indices(l); % for v = 1:length(jump_indices) % T = find(P1_shift >= jump_indices(v) - d & P1_shift <= jump_indices(v) + d); % Z(l, t) = Z(l, t) + length(T); % % if v == l % % disp(sprintf('%d %d %d', t, l, T)); % % end % end % end %end % %%figure(4); clf; hold on; %%imagesc(Z); colorbar; %%disp(sprintf('min is %g, %g', min(min(Z)), max(max(Z)))); % %S=[]; %for l=1:length(jump_indices) % for t = 1:length(P1) % if Z(l, t) == max(max(Z)) % S = [S, - P1(t)+jump_indices(l)]; % end % end %end %figure(5); clf; hold on; %plot(S, 'r*'); % %% Find which shift occurs most often with +/-d variation. %Q=0*S; %for i=1:length(S) % Q(i) = length(find( S >= S(i)-d & S<= S(i)+ d)); %end %% Out of all very similar shifts, choose the one occuring most often %T=S(find(Q==max(Q))); %R=0*T; %for i=1:length(T) % R(i) = length(find( T(i) == T)); %end %T1 = T(find(R==max(R))); %SHIFT=T1(1); %disp(sprintf('Shift is %d %d', d, SHIFT)); % %P1_shift = P1 + SHIFT; % %figure(2); clf; hold on; %plot(I0, mean_disparity', 'b'); %plot(I1+SHIFT, -dx1, 'r'); %plot(jump_indices, mean_disparity(jump_indices), 'b*'); %plot(P1_shift, -dx1(P1), 'r*'); % %Tall=[]; %V = []; %for v = 1:length(jump_indices) % T = find(P1_shift >= jump_indices(v) - d & P1_shift <= jump_indices(v) + d); % if length(T) > 0 % V = [V, v]; % Tall=[Tall, T]; % end %end % %plot(jump_indices(V), mean_disparity(jump_indices(V))+0.1, 'g*') %plot(P1_shift(Tall), -dx1(P1(Tall))+0.1, 'g*'); % ================================================ FILE: src/asp/WVCorrect/find_moving_avg.m ================================================ function b = find_moving_avg(a) % WINDOW_SIZE = 700; wid2 = floor(WINDOW_SIZE/2); len = length(a); b = a + NaN; ss = 1; % first nonnan for i=1:len if ~isnan(a(i)) ss = i; break; end end ee = len; % last nonnan for i=len:-1:1 if ~isnan(a(i)) ee = i; break; end end for i=1:len % average using a window of size WINDOW_SIZE s0 = max(i-wid2, ss); e0 = min(i+wid2, ee); if s0 < i & e0 > i s0 = max(s0, i - (e0-i)); e0 = min(e0, i + (i-s0)); b(i) = mean(a(s0:e0)); else b(i) = a(i); end % p = i-k; % q = i+k; % % if (p >= 1) & (~isnan(a(p))) % sum = sum + a(p); % num = num + 1; % end % % if num >= WINDOW_SIZE % break; % end % % if (q ~= p) & (q <= len) & (~isnan(a(q))) % sum = sum + a(q); % num = num + 1; % end % % if num >= WINDOW_SIZE % break; % end % % end % % if num >= 1 % b(i) = sum/num; % end end ================================================ FILE: src/asp/WVCorrect/fix_ccd.m ================================================ % Given a plotted polygonal line, move its vertices by clicking % on the old location and the new location. function A = fix_ccd(A, fig) % Acces the passed-in figure and wait for the user to click figure(fig); [x, y] = ginput(1); % Find the point closest to where the user clicked in X B = abs(A(1, :) - x); I = find(B == min(B)); i = I(1); % Move the point to where the user clicked A(1, i) = x; A(2, i) = y; % Plot the shifted position figure(fig); hold on; plot(A(1, :), A(2, :), 'g') plot(x, y, 'r*') disp(sprintf('value is %g', y)); ================================================ FILE: src/asp/WVCorrect/form_corrections_image.py ================================================ #!/usr/bin/python # Given several pairs of one-column files with each pair corresponding # to the x and y components of CCD artifact correction for a certain # TDI and scan direction, concatenate the two files in each pair and # write them as a row in the output TIF image. Use only 4 digits of # precision. import sys, os, re, argparse import numpy as np from osgeo import gdal, osr usage = "python form_corrections.py <input1-dx.txt input1-dy.txt ...> --output-image image.tif" parser = argparse.ArgumentParser(usage = usage, formatter_class = argparse.RawTextHelpFormatter) parser.add_argument("--output-image", dest = "output_image", default = None, help = "Save data in this .tif image.") (options, other) = parser.parse_known_args(sys.argv) if len(other) <= 1: print("No input correction files were provided.") sys.exit(1) if options.output_image is None: print("The output image file was not specified.") sys.exit(1) files = other[1:] print("Input files: " + " ".join(files)) print("Output image: " + options.output_image) num_files = len(files) # Read all the files in pairs data_rows = [] num_cols = 0 for i in range(int(num_files)): x_file = files[i] y_file = x_file.replace('x.txt', 'y.txt') if len(x_file) < 5 or x_file[-5:] != "x.txt" or len(y_file) < 5 or y_file[-5:] != "y.txt": print("Expecting the input files to end with x.txt.") x = np.loadtxt(x_file) y = np.loadtxt(y_file) vals = np.concatenate((x, y)) data_rows.append(vals) if num_cols > 0 and num_cols != len(vals): print("All input files must have the same number of values.") sys.exit(1) num_cols = len(vals) num_rows = len(data_rows) # GDAL really does not like to reuse the driver. Pasting the code # below repeatedly in a python shell does not work well. driver = gdal.GetDriverByName('GTiff') dst_filename = options.output_image dst_ds = driver.Create(dst_filename, num_cols, num_rows, 1, gdal.GDT_Float32) raster = np.ones( (num_rows, num_cols) ) + 9 for row in range(num_rows): raster[row, :] = data_rows[row] dst_ds.GetRasterBand(1).WriteArray( raster ) dst_ds.FlushCache() ================================================ FILE: src/asp/WVCorrect/gen_scandir.pl ================================================ #!/usr/bin/perl use strict; # insist that all variables be declared use diagnostics; # expand the cryptic warnings use File::Basename; use Cwd; use File::Spec; MAIN:{ # For each of the run directories starting with given prefix, find # if the left and right images are forward or reverse scan. if (scalar(@ARGV) < 1){ print "Usage: $0 prefix\n"; exit(0); } my $currDir = cwd; my $execDir = File::Spec->rel2abs(dirname(__FILE__)); my $prefix = $ARGV[0]; print "Prefix is $prefix\n"; my @lines; foreach my $dir (<$prefix*>){ chdir $currDir; next unless ($dir =~ /^$prefix/); next unless (-d $dir); chdir $dir; print "Now in $dir\n"; my $ans = qx($execDir/print_files.pl); print "answer is $ans\n"; $ans =~ s/\s*$//g; my @files = split(/\s+/, $ans); my $line = $dir; foreach my $file (@files){ print "---line is $file\n"; $file = $file . ".xml"; next unless (-f $file); open(NFILE, "<$file"); my $text = join("", <NFILE>); close(NFILE); my $scandir = 1; if ($text =~ /\<SCANDIRECTION\>Reverse\<\/SCANDIRECTION\>/is){ $scandir = 0; } my $pitch = 0.0; if ($text =~ /\<DETPITCH\>(.*?)\<\/DETPITCH\>/is){ $pitch = $1; } $line = "$line $scandir $pitch"; } $line =~ s/^.*?_//g;# matlab does not like letters push(@lines, $line); print "$line\n"; } chdir $currDir; my $file = "scandir_" . $prefix . ".txt"; print "Writing: $file\n"; open(FILE, ">$file"); foreach my $line (@lines){ print FILE "$line\n"; } close(FILE); } ================================================ FILE: src/asp/WVCorrect/ms_ccd_solve.sh ================================================ #!/bin/bash # A script to solve for CCD corrections for multi-spectral images. Must # have the desired MS image, corresponding PAN image, their cameras. # Put the ASP bin directory in the path. # Specify the full path to this tool, as it will look for a python script # in the same directory. # This will average the disparity in each column, and save them to # outputPrefix/run-avg-dx.txt and outputPrefix/run-avg-dy.txt # Then it will compute the CCD corrections based on these # using the script ccd_process.py # and save them in # outputPrefix/run-corr-dx.txt and outputPrefix/run-corr-dy.txt # # If desired to compute these corrections by averaging multiple such # average disparities, that python script can be invoked directly as: # # python ccd_process.py */run-avg-dx.txt --output-prefix combined-corr # cropWin "0 0 8820 5000" if [ "$#" -ne 7 ]; then echo Usage: $0 panImage.tif msImage.tif panCamera.xml msCamera.xml msBandNum outputPrefix/run cropWin; exit; fi panImage=$1 msImage=$2 panCamera=$3 msCamera=$4 msBand=$5 outputPrefix=$6 cropWin=$7 function run_cmd () { cmd=$1 out=$2 echo "" echo $cmd if [ "$out" != "" ]; then echo Writing the output to $out eval $cmd > $out 2>&1 ans=$? else eval $cmd ans=$? fi if [ "$ans" -ne 0 ]; then echo Command failed exit 1 fi echo "" } function gen_dummy_cam { name=$1 echo \ "fu = 1 fv = 1 cu = 1 cv = 1 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0 0 0 R = 1 0 0 0 1 0 0 0 1 NULL " \ > $name } if [ "$msBand" -le 1 ] || [ "$msBand" -ge 8 ]; then echo "The MS band must be between 1 and 8." fi suffix=$(basename $outputPrefix) outDir=$(dirname $outputPrefix) if [ "$suffix" = "" ] || [ "$outDir" = "." ]; then echo Please specify the output prefix as outputDir/run exit 1 fi cmd="mkdir -p $outDir" run_cmd "$cmd" echo Reducing the PAN image resolution to make it comparable to the multispecral image resolution panImageSub4=$(echo $panImage | perl -p -e "s#\.(TIF|NTF)#_sub4.tif#ig") panImageSub4=${outputPrefix}-${panImageSub4} cmd="mkdir -p $(dirname $panImageSub4)" run_cmd "$cmd" cmd="gdal_translate -r average -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -outsize 25% 25% $panImage $panImageSub4" #echo $cmd run_cmd "$cmd" echo Separating the desired multispecral band msImageCurrBand=$(echo $msImage | perl -p -e "s#\.(TIF|NTF)#_b${msBand}.tif#ig") msImageCurrBand=${outputPrefix}-${msImageCurrBand} cmd="mkdir -p $(dirname $msImageCurrBand)" run_cmd "$cmd" cmd="gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $msBand $msImage $msImageCurrBand" #echo $cmd run_cmd "$cmd" leftTsaiCam="$outDir/dummy1.tsai" rightTsaiCam="$outDir/dummy2.tsai" echo Creating fake cameras: $leftTsaiCam $rightTsaiCam gen_dummy_cam $leftTsaiCam gen_dummy_cam $rightTsaiCam # Since we do PAN to MS stereo, the correlation and subpixel kernels can be small, # and in fact, having them small helps in not blurring the disparity average # too much. echo Running stereo to find the disparity cmd="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" out=${outputPrefix}-stereo-output.txt #echo $cmd run_cmd "$cmd" $out echo Averaging the disparity cmd="disp_avg --remove-outliers-params 100 3 --save-no-metadata ${outputPrefix}-RD.tif ${outputPrefix}-avg-dx.txt ${outputPrefix}-avg-dy.txt" #echo $cmd run_cmd "$cmd" echo Process the averaged disparities ccd_process_path=$(dirname $0) cmd="$(which python) $ccd_process_path/ccd_process.py ${outputPrefix}-avg-dx.txt --output-prefix ${outputPrefix}-corr --no-plot" #echo $cmd run_cmd "$cmd" echo Separating the channels of the disparity and colorizing them b=1 cmd="gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefix}-RD.tif ${outputPrefix}-RD_b${b}.tif" #echo $cmd run_cmd "$cmd" isForward=$(grep -i scan $msCamera | grep -i forward) if [ "$isForward" != "" ]; then cmd="colormap --min 10.5 --max 11.5 ${outputPrefix}-RD_b${b}.tif" else cmd="colormap --min 11.0 --max 12.0 ${outputPrefix}-RD_b${b}.tif" fi run_cmd "$cmd" b=2 cmd="gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefix}-RD.tif ${outputPrefix}-RD_b${b}.tif" run_cmd "$cmd" if [ "$isForward" != "" ]; then cmd="colormap --min -0.5 --max 0.5 ${outputPrefix}-RD_b${b}.tif" else cmd="colormap --min -1.0 --max 0.0 ${outputPrefix}-RD_b${b}.tif" fi run_cmd "$cmd" echo "" echo Corrections in x and y: echo ${outputPrefix}-corr-dx.txt echo ${outputPrefix}-corr-dy.txt echo "" echo Colormaps before the correction: echo ${outputPrefix}-RD_b1_CMAP.tif echo ${outputPrefix}-RD_b2_CMAP.tif ================================================ FILE: src/asp/WVCorrect/ms_ccd_verify.sh ================================================ #!/bin/bash # A script to solve for CCD corrections for multi-spectral images. Must # have the desired MS image, corresponding PAN image, their cameras. # Put the ASP bin directory in the path. # Specify the full path to this tool, as it will look for a python script # in the same directory. # This will average the disparity in each column, and save them to # outputPrefix/run-avg-dx.txt and outputPrefix/run-avg-dy.txt # Then it will compute the CCD corrections based on these # using the script ccd_process.py # and save them in # outputPrefix/run-corr-dx.txt and outputPrefix/run-corr-dy.txt # # If desired to compute these corrections by averaging multiple such # average disparities, that python script can be invoked directly as: # # python ccd_process.py */run-corr-dx.txt --output-prefix combined-corr # cropWin "0 0 8820 5000" if [ "$#" -ne 8 ]; then echo Usage: $0 panImage.tif msImage.tif panCamera.xml msCamera.xml msBandNum outputPrefix/run cropWin correction-dx.txt; exit; fi panImage=$1 msImage=$2 panCamera=$3 msCamera=$4 msBand=$5 outputPrefix=$6 cropWin=$7 correction_dx=$8 function run_cmd () { cmd=$1 out=$2 echo "" echo $cmd if [ "$out" != "" ]; then echo Writing the output to $out eval $cmd > $out 2>&1 ans=$? else eval $cmd ans=$? fi if [ "$ans" -ne 0 ]; then echo Command failed exit 1 fi echo "" } function gen_dummy_cam { name=$1 echo \ "fu = 1 fv = 1 cu = 1 cv = 1 u_direction = 1 0 0 v_direction = 0 1 0 w_direction = 0 0 1 C = 0 0 0 R = 1 0 0 0 1 0 0 0 1 NULL " \ > $name } if [ "$msBand" -le 1 ] || [ "$msBand" -ge 8 ]; then echo "The MS band must be between 1 and 8." fi suffix=$(basename $outputPrefix) outDir=$(dirname $outputPrefix) if [ "$suffix" = "" ] || [ "$outDir" = "." ]; then echo Please specify the output prefix as outputDir/run exit 1 fi cmd="mkdir -p $outDir" run_cmd "$cmd" echo Reducing the PAN image resolution to make it comparable to the multispecral image resolution panImageSub4=$(echo $panImage | perl -p -e "s#\.(TIF|NTF)#_sub4.tif#ig") panImageSub4=${outputPrefix}-${panImageSub4} cmd="mkdir -p $(dirname $panImageSub4)" run_cmd "$cmd" cmd="gdal_translate -r average -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -outsize 25% 25% $panImage $panImageSub4" #echo $cmd run_cmd "$cmd" echo Separating the desired multispecral band msImageCurrBand=$(echo $msImage | perl -p -e "s#\.(TIF|NTF)#_b${msBand}.tif#ig") msImageCurrBand=${outputPrefix}-${msImageCurrBand} cmd="mkdir -p $(dirname $msImageCurrBand)" run_cmd "$cmd" cmd="gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $msBand $msImage $msImageCurrBand" #echo $cmd run_cmd "$cmd" leftTsaiCam="$outDir/dummy1.tsai" rightTsaiCam="$outDir/dummy2.tsai" echo Creating fake cameras: $leftTsaiCam $rightTsaiCam gen_dummy_cam $leftTsaiCam gen_dummy_cam $rightTsaiCam corrMsImage=${msImageCurrBand/.tif/_corr.tif} corrMsImage=${outputPrefix}-${corrMsImage} # Ensure the output directory exists cmd="mkdir -p $(dirname $corrMsImage)" run_cmd "$cmd" correction_dy=${correction_dx/dx.txt/dy.txt} echo Applying the corrections ${correction_dx} ${correction_dy} cmd="wv_correct $msImageCurrBand $msCamera $corrMsImage --dx ${correction_dx} --dy ${correction_dy}" echo $cmd run_cmd "$cmd" # Since we do PAN to MS stereo, the correlation and subpixel kernels can be small, # and in fact, having them small helps in not blurring the disparity average # too much. echo Running stereo with the correction applied outputPrefixCorr=${outputPrefix}-corr out=${outputPrefixCorr}-stereo-output.txt cmd="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" out=${outputPrefix}-stereo-output.txt echo $cmd run_cmd "$cmd" $out echo Computing the dispartity colormaps after correction b=1 cmd="gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefixCorr}-RD.tif ${outputPrefixCorr}-RD_b${b}.tif" run_cmd "$cmd" isForward=$(grep -i scan $msCamera | grep -i forward) if [ "$isForward" != "" ]; then cmd="colormap --min 10.5 --max 11.5 ${outputPrefixCorr}-RD_b${b}.tif" else cmd="colormap --min 11.0 --max 12.0 ${outputPrefixCorr}-RD_b${b}.tif" fi run_cmd "$cmd" b=2 cmd="gdal_translate -co TILED=YES -co COMPRESS=LZW -co BIGTIFF=IF_SAFER -b $b ${outputPrefixCorr}-RD.tif ${outputPrefixCorr}-RD_b${b}.tif" run_cmd "$cmd" if [ "$isForward" != "" ]; then cmd="colormap --min -0.5 --max 0.5 ${outputPrefixCorr}-RD_b${b}.tif" else cmd="colormap --min -1.0 --max 0.0 ${outputPrefixCorr}-RD_b${b}.tif" fi run_cmd "$cmd" echo "" echo Wrote corrected image to: $corrMsImage echo "" echo Colormaps after the correction: ${outputPrefixCorr}-RD_b1_CMAP.tif ${outputPrefixCorr}-RD_b2_CMAP.tif ================================================ FILE: src/asp/WVCorrect/ms_correction_lookup.txt ================================================ # ASP implements CCD artifacts correction only for a handful of bands # for a few TDI and scan directions for certain Digital Globe # satellite multispectral images. The corrections are stored as rows # in a set of .TIF images. This lookup table shows for each TDI and # scan direction which row of which TIF correction image has the # corrections. # Multiple such images are allowed, though only one exists so far. # This lookup table is read at run-time by wv_correct and is # distributed with ASP, together with the correction image. # SATID BAND TDI SCANDIR CORRECTION_IMAGE ROW WV02 3 10 reverse WV02_BAND3_CCD_CORR.tif 0 WV02 3 14 reverse WV02_BAND3_CCD_CORR.tif 1 WV02 3 24 reverse WV02_BAND3_CCD_CORR.tif 2 WV02 3 10 forward WV02_BAND3_CCD_CORR.tif 3 WV02 3 14 forward WV02_BAND3_CCD_CORR.tif 4 WV02 3 18 forward WV02_BAND3_CCD_CORR.tif 5 WV02 3 24 forward WV02_BAND3_CCD_CORR.tif 6 ================================================ FILE: src/asp/WVCorrect/plot_ccds.m ================================================ function plot_ccds(do_find, is_forward, prefix, I) % Plot ccds with given scan direction with given prefix. % I are their indices in 'scandir.txt'. % If is_forward=0, that means reverse. % The 'scandir.txt' file is obtained by running % gen_scandir.pl. % The 'good' file, if it exists, must be written by hand, % each line has a good run directory, that is, it has % nice dx.txt and dy.txt. file = sprintf('scandir_%s.txt', prefix); disp(sprintf('Loading %s', file)); suff = 'fwd'; if ~ is_forward suff = 'bwd'; end goodfile = sprintf('good_%s_%s.txt', suff, prefix); good_exists = 0; if exist(goodfile, 'file') == 2 good_exists = 1; disp(sprintf('Getting good dirs from %s', goodfile)); good = textread(goodfile, '%s'); else disp(sprintf('File %s does not exist', goodfile)); good = {}; end A=load(file); [m, n] = size(A); dirs={}; pitches = []; if length(I) == 0 I = 1:m; % do all runs end for i = I if i > m if length(I) > 1 disp(sprintf('Out of bounds, %d', i)); end continue; end d=A(i, 1); a=A(i, 2); pa = A(i, 3); % pitch b=A(i, 4); pb = A(i, 5); % pitch pitch0 = 8.000000000000000e-03; if a == is_forward % & pa == pitch0 dir=sprintf('%s_%d/runv%s_%d_flip%d', prefix, d, prefix, d, 0); [U, V] = ind2sub(size(good),find(cellfun(@(x)strcmp(x,dir),good))); if length(U) > 0 | ~good_exists dirs=[dirs, dir]; pitches = [pitches, pa]; end end if b == is_forward % & pb == pitch0 dir=sprintf('%s_%d/runv%s_%d_flip%d', prefix, d, prefix, d, 1); [U, V] = ind2sub(size(good),find(cellfun(@(x)strcmp(x,dir),good))); if length(U) > 0 | ~good_exists dirs=[dirs, dir]; pitches = [pitches, pb]; end end end if length(dirs) > 0 find_ccds(do_find, dirs, pitches); end pause(1) commandwindow % move the focus back to the command window ================================================ FILE: src/asp/WVCorrect/run_lr.sh ================================================ #!/bin/bash if [ "$#" -lt 4 ]; then echo Usage: $0 left_crop_win right_crop_win left_image right_image left_cam right_cam tag corr exit; fi #execDir=/home/smcmich1/repo/StereoPipeline/src/asp/WVCorrect execDir=/home6/oalexan1/projects/StereoPipeline/src/asp/WVCorrect echo execDir is $execDir # Need to first find disp_avg, then stereo, from the dev build, then our own parallel_stereo # from the packaged build. export PATH=$execDir:$execDir/../Tools:/u/oalexan1/projects/BinaryBuilder/latest/libexec:$PATH left_crop_win=$1 right_crop_win=$2 left_image=$3 left_cam=$4 right_image=$5 right_cam=$6 tag=$7 # A string to append to the output directory, to distinguish several runs corr=$8 # Is 1 if to run the flow with wv_correct-ed images for verification. Normally should be 0. if [ "$corr" = "1" ]; then left_corr=${left_image/.ntf/.tif}; left_corr=${left_corr/.tif/_corr_tag${tag}.tif} right_corr=${right_image/.ntf/.tif}; right_corr=${right_corr/.tif/_corr_tag${tag}.tif} wv_correct $left_image $left_cam $left_corr wv_correct $right_image $right_cam $right_corr fi #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 #bundle_adjust $left_image $right_image $left_cam $right_cam -o run_ba/run base_cmd="parallel_stereo --corr-seed-mode 1 --subpixel-kernel 13 13 --part-of-multiview-run --alignment-method homography --subpixel-mode 1 --corr-max-levels 2 --disable-fill-holes --corr-timeout 600 " # sometimes may want to use many ip: --ip-per-tile 1000" # --bundle-adjust-prefix run_ba/run" projwin=$(gdalinfo -proj4 dem.tif 2>/dev/null |grep -i "proj=" | perl -p -e "s#\'##g") if [ "$projwin" != "" ]; then projwin=$projwin # Wipe quotes echo "Found projwin from dem: $projwin" else # Ths is good enough for areas close to the North Pole 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 " echo "Using default projwin $projwin" fi dir=run_lr_${tag} if [ "$corr" = "1" ]; then dir_orig=$dir dir=${dir}_corr fi leftc="--left-image-crop-win $left_crop_win" rightc="--right-image-crop-win $right_crop_win" rm -rf ./$dir mkdir -p $dir if [ "$corr" = "1" ]; then # Steal the old ip file, to not spend time re-creating it echo cp -fv $(ls $dir_orig/*match) $dir cp -fv $dir_orig/*match $dir cmd="$base_cmd $leftc $rightc $left_corr $right_corr $left_cam $right_cam $dir/run" else cmd="$base_cmd $leftc $rightc $left_image $right_image $left_cam $right_cam $dir/run" fi echo $cmd $cmd # Create the DEM point2dem $dir/run-PC.tif --errorimage --tr 2 --t_srs "$projwin" # Wipe extra stuff rm -fv ./$dir/run-PC.tif ./$dir/run-D.tif ./$dir/run-RD.tif disparitydebug $dir/run-F.tif stereo_gui --create-image-pyramids-only $dir/run-F-H.tif $dir/run-F-V.tif if [ "$corr" != "1" ]; then # This needs to be manually run for each data set using good bounds! $execDir/disp_avg $dir/run-F.tif $dir/dx.txt $dir/dy.txt fi exit # To do: Force that all runs be redone below! # PATH to the ASP build compiled for merope. source ~/.bashenv export 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 # Path for merope v=$(stereo_fltr 2>&1 |grep -i "bin/sed" | perl -p -e "s#\s##g") if [ "$v" != "" ]; then export PATH=$HOME/projects/StereoPipeline2/src/asp/Tools:$PATH fi dir=$1 if [ "$dir" != "" ]; then cd $dir; fi name=$2 opts=$3 tag="" # p=$5 # s=$6 runDir="fixed"$tag"$name" # "_"$p"_"$s outFile=output_"$runDir".txt echo runDir=$runDir echo Will write to $(pwd)/$outFile exec &> $outFile 2>&1 ans=$($execDir/print_files.pl) l=$(echo $ans | awk '{print $1}') r=$(echo $ans | awk '{print $2}') turnon0=1 #a=$(grep -i scandir $l.xml | grep -i reverse) #if [ "$a" != "" ]; then turnon0=1; echo will do left-right; fi turnon1=1 #a=$(grep -i scandir $r.xml | grep -i reverse) #if [ "$a" != "" ]; then turnon1=1; echo will do right-left; fi # Turn on the correction of artifacts turnon=0 if [[ ! $opts =~ left-image-crop-win ]]; then echo "Must specify crop-win as input" exit 1; fi win=$(echo $opts | perl -p -e 's#^.*?left-image-crop-win\s+(\d+\s+\d+\s+\d+\s+\d+).*?$#$1#g') win2="0 0 50600 21504" #rm -fv *crop* *proj_crop* if [ ! -f $l"_crop.tif" ]; then gdal_translate.pl -srcwin $win2 $l.ntf $l"_crop.tif" fi if [ ! -f $r"_crop.tif" ]; then gdal_translate.pl -srcwin $win2 $r.ntf $r"_crop.tif" fi #rm -f *ntf if [ "$turnon" -eq 1 ]; then runDir=run_fixed"$tag""$name"_flip1 hill=$runDir/run-crop-hill.tif rm -rfv $runDir mkdir -p $runDir wv_correct "$l"_crop.tif "$l".xml $runDir/"$l"_crop_shift.tif wv_correct "$r"_crop.tif "$r".xml $runDir/"$r"_crop_shift.tif runDir=run_fixed"$tag""$name"_flip0 hill=$runDir/run-crop-hill.tif rm -rfv $runDir mkdir -p $runDir wv_correct "$l"_crop.tif "$l".xml $runDir/"$l"_crop_shift.tif wv_correct "$r"_crop.tif "$r".xml $runDir/"$r"_crop_shift.tif time_run.sh stereo $runDir/"$l"_crop_shift.tif $runDir/"$r"_crop_shift.tif "$l".xml "$r".xml $runDir/run $opts gdal_translate.pl -srcwin $win $runDir/run-F.tif $runDir/run-crop-F.tif $execDir/find_avg_disp $runDir/run-crop-F.tif $runDir/dx.txt $runDir/dy.txt gdal_translate.pl -srcwin $win $runDir/run-PC.tif $runDir/run-crop-PC.tif point2dem -r Earth $runDir/run-crop-PC.tif --errorimage gdaldem hillshade $runDir/run-crop-DEM.tif $hill gdal_translate.pl -outsize 50% 50% $hill $runDir/run-crop-hill_sub2.tif image2qtree.pl $runDir/run-crop-hill_sub2.tif gdal_translate.pl -outsize 20% 20% $runDir/run-crop-IntersectionErr.tif $runDir/run-crop-IntersectionErr_20pct.tif colormap.pl $runDir/run-crop-IntersectionErr_20pct.tif rm -fv $(ls $runDir/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill) runDir=run_fixed"$tag""$name"_flip1 hill=$runDir/run-crop-hill.tif time_run.sh stereo $runDir/"$r"_crop_shift.tif $runDir/"$l"_crop_shift.tif "$r".xml "$l".xml $runDir/run $opts gdal_translate.pl -srcwin $win $runDir/run-F.tif $runDir/run-crop-F.tif $execDir/find_avg_disp $runDir/run-crop-F.tif $runDir/dx.txt $runDir/dy.txt gdal_translate.pl -srcwin $win $runDir/run-PC.tif $runDir/run-crop-PC.tif point2dem -r Earth $runDir/run-crop-PC.tif --errorimage gdaldem hillshade $runDir/run-crop-DEM.tif $hill gdal_translate.pl -outsize 50% 50% $hill $runDir/run-crop-hill_sub2.tif image2qtree.pl $runDir/run-crop-hill_sub2.tif gdal_translate.pl -outsize 20% 20% $runDir/run-crop-IntersectionErr.tif $runDir/run-crop-IntersectionErr_20pct.tif colormap.pl $runDir/run-crop-IntersectionErr_20pct.tif rm -fv $(ls $runDir/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill) fi runDir0=runv"$tag""$name"_flip0 if [ "$turnon0" -eq 1 ]; then hill=$runDir0/run-crop-hill.tif dx=$runDir0/dx.txt dy=$runDir0/dy.txt rm -rfv $runDir0 if [ -f "$dx" ] && [ -f "$dy" ]; then echo Will skip $runDir0 as files exist else time_run.sh stereo "$l"_crop.tif "$r"_crop.tif "$l".xml "$r".xml $runDir0/run $opts gdal_translate.pl -srcwin $win $runDir0/run-F.tif $runDir0/run-crop-F.tif $execDir/find_avg_disp $runDir0/run-crop-F.tif $dx $dy gdal_translate.pl -srcwin $win $runDir0/run-PC.tif $runDir0/run-crop-PC.tif point2dem -r Earth $runDir0/run-crop-PC.tif --errorimage gdaldem hillshade $runDir0/run-crop-DEM.tif $hill gdal_translate.pl -outsize 50% 50% $hill $runDir0/run-crop-hill_sub2.tif image2qtree.pl $runDir0/run-crop-hill_sub2.tif gdal_translate.pl -outsize 20% 20% $runDir0/run-crop-IntersectionErr.tif $runDir0/run-crop-IntersectionErr_20pct.tif colormap.pl $runDir0/run-crop-IntersectionErr_20pct.tif rm -fv $(ls $runDir0/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill) fi fi runDir1=runv"$tag""$name"_flip1 if [ "$turnon1" -eq 1 ]; then hill=$runDir1/run-crop-hill.tif dx=$runDir1/dx.txt dy=$runDir1/dy.txt rm -rfv $runDir1 if [ -f "$dx" ] && [ -f "$dy" ]; then echo Will skip $runDir1 as files exist else time_run.sh stereo "$r"_crop.tif "$l"_crop.tif "$r".xml "$l".xml $runDir1/run $opts gdal_translate.pl -srcwin $win $runDir1/run-F.tif $runDir1/run-crop-F.tif $execDir/find_avg_disp $runDir1/run-crop-F.tif $dx $dy gdal_translate.pl -srcwin $win $runDir1/run-PC.tif $runDir1/run-crop-PC.tif point2dem -r Earth $runDir1/run-crop-PC.tif --errorimage gdaldem hillshade $runDir1/run-crop-DEM.tif $hill gdal_translate.pl -outsize 50% 50% $hill $runDir1/run-crop-hill_sub2.tif image2qtree.pl $runDir1/run-crop-hill_sub2.tif gdal_translate.pl -outsize 20% 20% $runDir1/run-crop-IntersectionErr.tif $runDir1/run-crop-IntersectionErr_20pct.tif colormap.pl $runDir1/run-crop-IntersectionErr_20pct.tif rm -fv $(ls $runDir1/*.tif | grep -v crop-F.tif | grep -v Intersect | grep -v hill) fi fi ================================================ FILE: src/asp/WVCorrect/run_lr_wrap.sh ================================================ #!/bin/bash # A wrapper around run_lr.sh, to make it easier to invoke it right with what stereo_gui dumps out # when selecting a region. This wrapper will take as inputs the following ugly arguments: # $(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 # and will launch run_lr.sh while looking up the camera models. # Here, 'tag' is just a string label, and 'corr' is 0 when we we are working on making # corrections, and is 1, when corrections are already in wv_correct and we want # to verify how well they work. execDir=$(dirname $0) runDir=$1 shift cd $runDir tag=$1 shift corr=$1 shift shift; shift; shift; shift; # pass on the text: Crop src win for left_img=$(echo $1 | perl -p -e "s#:##g") left_xml=${left_img/.ntf/.xml} shift a=$1; shift b=$1; shift c=$1; shift d=$1; shift shift; shift; shift; shift; # pass on the text: Crop src win for right_img=$(echo $1 | perl -p -e "s#:##g") right_xml=${right_img/.ntf/.xml} shift e=$1; shift f=$1; shift g=$1; shift h=$1; shift echo $left_img $left_xml $right_img $right_xml $a $b $c $d $e $f $g $h $tag echo Working in $runDir out=output_${tag}_corr${corr}.txt echo Writing output to $out $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 ================================================ FILE: src/asp/asp_config.h.in ================================================ /* src/asp/asp_config.h.in. Used by CMake to generate asp_config.h. */ /* The version of Boost with which the software built. */ #define ASP_BOOST_VERSION "@Boost_VERSION@" /* does the compiler support function __attribute__((deprecated))? */ #cmakedefine COMPILER_HAS_ATTRIBUTE_DEPRECATED /* does the compiler support function __attribute__((noreturn))? */ #cmakedefine COMPILER_HAS_ATTRIBUTE_NORETURN /* enable the C++ exception mechanism */ #cmakedefine ENABLE_EXCEPTIONS 1 /* Define to 1 if you have the <dlfcn.h> header file. */ #cmakedefine HAVE_DLFCN_H 1 /* Define to 1 if you have the `getpid' function. */ #cmakedefine HAVE_GETPID 1 /* Define to 1 if you have the `getpwuid' function. */ #cmakedefine HAVE_GETPWUID 1 /* Define to 1 if you have the <inttypes.h> header file. */ #cmakedefine HAVE_INTTYPES_H 1 /* Define to 1 if you have the <memory.h> header file. */ #cmakedefine HAVE_MEMORY_H 1 /* Define to 1 if the ADD_SPOT_RPC app is available. */ //#cmakedefine ASP_HAVE_PKG_ADD_SPOT_RPC /* Define to 1 if the AMD package is available. */ #cmakedefine ASP_HAVE_PKG_AMD 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_APPLE_GL 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_APPLE_LAPACK 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_APPLE_QMAKE_QT 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_APPLE_QWT 1 /* Define to 1 if the ARBITRARY_QT package is available. */ #cmakedefine ASP_HAVE_PKG_ARBITRARY_QT 1 /* Define to 1 if the ASTER2ASP app is available. */ //#cmakedefine ASP_HAVE_PKG_ASTER2ASP /* Define to 1 if the BOOST package is available. */ #cmakedefine ASP_HAVE_PKG_BOOST 1 /* Define to 1 if the BOOST_DATETIME package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_DATETIME /* Define to 1 if the BOOST_FILESYSTEM package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_FILESYSTEM /* Define to 1 if the BOOST_GRAPH package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_GRAPH /* Define to 1 if the BOOST_IOSTREAMS package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_IOSTREAMS /* Define to 1 if the pkg package is available */ //#cmakedefine ASP_HAVE_PKG_BOOST_MOST /* Define to 1 if the BOOST_MPI package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_MPI /* Define to 1 if the BOOST_PROGRAM_OPTIONS package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_PROGRAM_OPTIONS /* Define to 1 if the BOOST_REGEX package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_REGEX /* Define to 1 if the BOOST_SERIALIZATION package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_SERIALIZATION /* Define to 1 if the BOOST_SYSTEM package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_SYSTEM /* Define to 1 if the BOOST_THREAD package is available. */ //#cmakedefine ASP_HAVE_PKG_BOOST_THREAD /* Define to 1 if the BUNDLE_ADJUST app is available. */ //#cmakedefine ASP_HAVE_PKG_BUNDLE_ADJUST /* Define to 1 if the CAM2RPC app is available. */ //#cmakedefine ASP_HAVE_PKG_CAM2RPC /* Define to 1 if the CAMERA module is available. */ //#cmakedefine ASP_HAVE_PKG_CAMERA /* Define to 1 if the CAMERA_FOOTPRINT app is available. */ //#cmakedefine ASP_HAVE_PKG_CAMERA_FOOTPRINT /* Define to 1 if the CERES package is available. */ #cmakedefine ASP_HAVE_PKG_CERES /* Define to 1 if the CHOLMOD package is available. */ #cmakedefine ASP_HAVE_PKG_CHOLMOD 1 /* Define to 1 if the CLAPACK package is available. */ #cmakedefine ASP_HAVE_PKG_CLAPACK 1 /* Define to 1 if the COLAMD package is available. */ #cmakedefine ASP_HAVE_PKG_COLAMD 1 /* Define to 1 if the CORE module is available. */ //#cmakedefine ASP_HAVE_PKG_CORE /* Define to 1 if the CSV_FILTER app is available. */ //#cmakedefine ASP_HAVE_PKG_CSV_FILTER /* Define to 1 if the CURL package is available. */ #cmakedefine ASP_HAVE_PKG_CURL 1 /* Define to 1 if the DEMPROFILE app is available. */ //#cmakedefine ASP_HAVE_PKG_DEMPROFILE /* Define to 1 if the DEM_GEOID app is available. */ //#cmakedefine ASP_HAVE_PKG_DEM_GEOID /* Define to 1 if the DEM_MOSAIC app is available. */ //#cmakedefine ASP_HAVE_PKG_DEM_MOSAIC /* Define to 1 if the DISPARITYDEBUG app is available. */ //#cmakedefine ASP_HAVE_PKG_DISPARITYDEBUG /* Define to 1 if the DISP_AVG app is available. */ //#cmakedefine ASP_HAVE_PKG_DISP_AVG /* Define to 1 if the EIGEN package is available. */ #cmakedefine ASP_HAVE_PKG_EIGEN 1 /* Define to 1 if the FLANN package is available. */ #cmakedefine ASP_HAVE_PKG_FLANN 1 /* Define to 1 if the FLAPACK package is available. */ #cmakedefine ASP_HAVE_PKG_FLAPACK 1 /* Define to 1 if the GDAL package is available. */ #cmakedefine ASP_HAVE_PKG_GDAL 1 /* Define to 1 if the GEODIFF app is available. */ //#cmakedefine ASP_HAVE_PKG_GEODIFF /* Define to 1 if the GEOID package is available. */ #cmakedefine ASP_HAVE_PKG_GEOID 1 /* Define to 1 if the GEOS package is available. */ #cmakedefine ASP_HAVE_PKG_GEOS 1 /* Define to 1 if the GEOTIFF package is available. */ #cmakedefine ASP_HAVE_PKG_GEOTIFF 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_GL 1 /* Define to 1 if the GLOG package is available. */ #cmakedefine ASP_HAVE_PKG_GLOG 1 /* Define to 1 if the GOOGLE_PROFILER package is available. */ ////]]#cmakedefine ASP_HAVE_PKG_GOOGLE_PROFILER /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_GSL 1 /* Define to 1 if the GSL_HASBLAS package is available. */ #cmakedefine ASP_HAVE_PKG_GSL_HASBLAS 1 /* Define to 1 if the GSL_NEEDBLAS package is available. */ #cmakedefine ASP_HAVE_PKG_GSL_NEEDBLAS 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_GUESS_QT 1 /* Define to 1 if the GUI module is available. */ #cmakedefine ASP_HAVE_PKG_GUI 1 /* Define to 1 if the HDF5 package is available. */ #cmakedefine ASP_HAVE_PKG_HDF5 1 /* Define to 1 if the HSVMERGE app is available. */ //#cmakedefine ASP_HAVE_PKG_HSVMERGE /* Define to 1 if the ICEBRIDGE app is available. */ //#cmakedefine ASP_HAVE_PKG_ICEBRIDGE /* Define to 1 if the ILMBASE package is available. */ #cmakedefine ASP_HAVE_PKG_ILMBASE 1 /* Define to 1 if the IMAGE_CALC app is available. */ //#cmakedefine ASP_HAVE_PKG_IMAGE_CALC /* Define to 1 if the INTEL_LAPACK package is available. */ #cmakedefine ASP_HAVE_PKG_INTEL_LAPACK 1 /* Define to 1 if the ISIS package is available. */ #cmakedefine ASP_HAVE_PKG_ISIS 1 /* Define to 1 if the JP2 package is available. */ #cmakedefine ASP_HAVE_PKG_JP2 1 /* Define to 1 if the JPEG package is available. */ #cmakedefine ASP_HAVE_PKG_JPEG 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_KAKADU 1 /* Define to 1 if the KAKADU_63_JOIN package is available. */ //#cmakedefine ASP_HAVE_PKG_KAKADU_63_JOIN 1 /* Define to 1 if the KAKADU_SPLIT package is available. */ //#cmakedefine ASP_HAVE_PKG_KAKADU_SPLIT 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_LAPACK 1 /* Define to 1 if the LASZIP package is available. */ #cmakedefine ASP_HAVE_PKG_LASZIP 1 /* Define to 1 if the LIBNABO package is available. */ #cmakedefine ASP_HAVE_PKG_LIBNABO 1 /* Define to 1 if the LIBPOINTMATCHER package is available. */ #cmakedefine ASP_HAVE_PKG_LIBPOINTMATCHER 1 /* Define to 1 if the LINUX_GL package is available. */ #cmakedefine ASP_HAVE_PKG_LINUX_GL 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_LINUX_QMAKE_QT 1 /* Define to 1 if the LRONACJITREG app is available. */ //#cmakedefine ASP_HAVE_PKG_LRONACJITREG /* Define to 1 if the M package is available. */ #cmakedefine ASP_HAVE_PKG_M 1 /* Define to 1 if the MAPPROJECT app is available. */ //#cmakedefine ASP_HAVE_PKG_MAPPROJECT /* Define to 1 if the MER2CAMERA app is available. */ //#cmakedefine ASP_HAVE_PKG_MER2CAMERA /* Define to 1 if the OPENCV package is available. */ #cmakedefine ASP_HAVE_PKG_OPENCV 1 /* Define to 1 if the OPEN_MPI package is available. */ #cmakedefine ASP_HAVE_PKG_OPEN_MPI 1 /* Define to 1 if the ORBITVIZ app is available. */ //#cmakedefine ASP_HAVE_PKG_ORBITVIZ /* Define to 1 if the ORTHO2PINHOLE app is available. */ //#cmakedefine ASP_HAVE_PKG_ORTHO2PINHOLE /* Define to 1 if the ORTHOPROJECT app is available. */ //#cmakedefine ASP_HAVE_PKG_ORTHOPROJECT /* Define to 1 if the PANSHARP app is available. */ //#cmakedefine ASP_HAVE_PKG_PANSHARP /* Define to 1 if the PCL package is available. */ #cmakedefine ASP_HAVE_PKG_PCL 1 /* Define to 1 if the PC_ALIGN app is available. */ //#cmakedefine ASP_HAVE_PKG_PC_ALIGN /* Define to 1 if the PC_MERGE app is available. */ //#cmakedefine ASP_HAVE_PKG_PC_MERGE /* Define to 1 if the PLAIN_QWT package is available. */ #cmakedefine ASP_HAVE_PKG_PLAIN_QWT 1 /* Define to 1 if the PNG package is available. */ #cmakedefine ASP_HAVE_PKG_PNG 1 /* Define to 1 if the POINT2DEM app is available. */ //#cmakedefine ASP_HAVE_PKG_POINT2DEM /* Define to 1 if the POINT2LAS app is available. */ //#cmakedefine ASP_HAVE_PKG_POINT2LAS /* Define to 1 if the POINT2MESH app is available. */ //#cmakedefine ASP_HAVE_PKG_POINT2MESH /* Define to 1 if the PROJ4 package is available. */ #cmakedefine ASP_HAVE_PKG_PROJ 1 /* Define to 1 if the PROTOBUF package is available. */ #cmakedefine ASP_HAVE_PKG_PROTOBUF 1 /* Define to 1 if the PTHREADS package is available. */ #cmakedefine ASP_HAVE_PKG_PTHREADS 1 /* Define to 1 if the PYTHON module is available. */ #cmakedefine ASP_HAVE_PKG_PYTHON 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_QT 1 /* Define to 1 if the QT_GUESS_BASE package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_GUESS_BASE 1 /* Define to 1 if the QT_GUESS_CORE package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_GUESS_CORE 1 /* Define to 1 if the QT_GUESS_GUI package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_GUESS_GUI /* Define to 1 if the QT_GUESS_NETWORK package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_GUESS_NETWORK /* Define to 1 if the QT_GUESS_OPENGL package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_GUESS_OPENGL /* Define to 1 if the QT_GUESS_SQL package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_GUESS_SQL /* Define to 1 if the QT_QMAKE package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_QMAKE /* Define to 1 if the QT_QMAKE_GUI package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_QMAKE_GUI /* Define to 1 if the QT_QMAKE_NETWORK package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_QMAKE_NETWORK /* Define to 1 if the QT_QMAKE_OPENGL package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_QMAKE_OPENGL /* Define to 1 if the QT_QMAKE_SQL package is available. */ //#cmakedefine ASP_HAVE_PKG_QT_QMAKE_SQL /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_QWT 1 /* Define to 1 if the RPC_GEN app is available. */ //#cmakedefine ASP_HAVE_PKG_RPC_GEN /* Define to 1 if the S2P_FLTR app is available. */ //#cmakedefine ASP_HAVE_PKG_S2P_FLTR /* Define to 1 if the S2P_PPRC app is available. */ //#cmakedefine ASP_HAVE_PKG_S2P_PPRC /* Define to 1 if the SESSIONS module is available. */ //#cmakedefine ASP_HAVE_PKG_SESSIONS /* Define to 1 if the SFS app is available. */ //#cmakedefine ASP_HAVE_PKG_SFS /* Define to 1 if the SLAPACK package is available. */ #cmakedefine ASP_HAVE_PKG_SLAPACK 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_SPICE 1 /* Define to 1 if the SPICE_SUBDIR package is available. */ #cmakedefine ASP_HAVE_PKG_SPICE_SUBDIR 1 /* Define to 1 if the SPICE_TOP package is available. */ #cmakedefine ASP_HAVE_PKG_SPICE_TOP 1 /* Define to 1 if the STANDALONE_BLAS package is available. */ #cmakedefine ASP_HAVE_PKG_STANDALONE_BLAS 1 /* Define to 1 if the STANDALONE_F2C package is available. */ #cmakedefine ASP_HAVE_PKG_STANDALONE_F2C 1 /* Define to 1 if the STANDALONE_FBLAS package is available. */ #cmakedefine ASP_HAVE_PKG_STANDALONE_FBLAS 1 /* Define to 1 if the STANDALONE_FLAPACK package is available. */ #cmakedefine ASP_HAVE_PKG_STANDALONE_FLAPACK 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_STANDALONE_FLAPACK_FBLAS 1 /* Define to 1 if the STANDALONE_LAPACK package is available. */ #cmakedefine ASP_HAVE_PKG_STANDALONE_LAPACK 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_STANDALONE_LAPACK_AND_BLAS 1 /* Define to 1 if the STEREO app is available. */ //#cmakedefine ASP_HAVE_PKG_STEREO /* Define to 1 if the STEREO_GUI app is available. */ //#cmakedefine ASP_HAVE_PKG_STEREO_GUI /* Define to 1 if the STEREO_TRI app is available. */ //#cmakedefine ASP_HAVE_PKG_STEREO_TRI /* Define to 1 if the SUFFX_QWT package is available. */ #cmakedefine ASP_HAVE_PKG_SUFFX_QWT 1 /* Define to 1 if the SUITESPARSE package is available. */ #cmakedefine ASP_HAVE_PKG_SUITESPARSE 1 /* Define to 1 if the pkg package is available */ #cmakedefine ASP_HAVE_PKG_SUPERLU 1 /* Define to 1 if the SUPERLU_PLAIN package is available. */ #cmakedefine ASP_HAVE_PKG_SUPERLU_PLAIN 1 /* Define to 1 if the SUPERLU_STATIC package is available. */ #cmakedefine ASP_HAVE_PKG_SUPERLU_STATIC 1 /* Define to 1 if the SUPERLU_VER_30 package is available. */ #cmakedefine ASP_HAVE_PKG_SUPERLU_VER_30 1 /* Define to 1 if the TCMALLOC package is available. */ #cmakedefine ASP_HAVE_PKG_TCMALLOC 1 /* Define to 1 if the THREADS package is available. */ #cmakedefine ASP_HAVE_PKG_THREADS 1 /* Define to 1 if the TIFF package is available. */ #cmakedefine ASP_HAVE_PKG_TIFF 1 /* Define to 1 if the TIF_MOSAIC app is available. */ //#cmakedefine ASP_HAVE_PKG_TIF_MOSAIC /* Define to 1 if the VW package is available. */ //#cmakedefine ASP_HAVE_PKG_VW /* Define to 1 if the pkg package is available */ //#cmakedefine ASP_HAVE_PKG_VW_ALL /* Define to 1 if the VW_BUNDLEADJUSTMENT package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_BUNDLEADJUSTMENT /* Define to 1 if the VW_CAMERA package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_CAMERA /* Define to 1 if the VW_CARTOGRAPHY package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_CARTOGRAPHY /* Define to 1 if the VW_CORE package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_CORE /* Define to 1 if the VW_FILEIO package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_FILEIO /* Define to 1 if the VW_GEOMETRY package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_GEOMETRY /* Define to 1 if the VW_IMAGE package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_IMAGE /* Define to 1 if the VW_INTEREST_POINT package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_INTEREST_POINT /* Define to 1 if the VW_MATH package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_MATH /* Define to 1 if the VW_MOSAIC package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_MOSAIC /* Define to 1 if the VW_STEREO package is available. */ //#cmakedefine ASP_HAVE_PKG_VW_STEREO /* Define to 1 if the WV_CORRECT app is available. */ //#cmakedefine ASP_HAVE_PKG_WV_CORRECT /* Define to 1 if the X11 package is available. */ #cmakedefine ASP_HAVE_PKG_X11 1 /* Define to 1 if the XERCESC package is available. */ #cmakedefine ASP_HAVE_PKG_XERCESC 1 /* Define to 1 if the Z package is available. */ #cmakedefine ASP_HAVE_PKG_Z 1 /* Define to 1 if you have the <pwd.h> header file. */ #cmakedefine HAVE_PWD_H 1 /* Define to 1 if you have the <stdint.h> header file. */ #cmakedefine HAVE_STDINT_H 1 /* Define to 1 if you have the <stdlib.h> header file. */ #cmakedefine HAVE_STDLIB_H 1 /* Define to 1 if you have the <strings.h> header file. */ #cmakedefine HAVE_STRINGS_H 1 /* Define to 1 if you have the <string.h> header file. */ #cmakedefine HAVE_STRING_H 1 /* Define to 1 if you have the <sys/stat.h> header file. */ #cmakedefine HAVE_SYS_STAT_H 1 /* Define to 1 if you have the <sys/types.h> header file. */ #cmakedefine HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the <unistd.h> header file. */ #cmakedefine HAVE_UNISTD_H 1 /* The version of ISIS that this software was built against. */ #define ASP_ISIS_VERSION "@ISIS_VERSION@" /* Define to the sub-directory in which libtool stores uninstalled libraries. */ //#cmakedefine LT_OBJDIR /* set the default number of processing threads for multi-threaded operations */ #cmakedefine NUM_THREADS /* Building on OSX? */ #cmakedefine ASP_OSX_BUILD 1 /* Name of the package */ #define ASP_PACKAGE StereoPipeline /* Define the address where bug reports for this package should be sent. */ #define ASP_PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" /* Define the full name of this package. */ #define ASP_PACKAGE_NAME "@PACKAGE_NAME@" /* Define the full name and version of this package. */ #define ASP_PACKAGE_STRING "@PACKAGE_STRING@" /* Define the one symbol short name of this package. */ #define ASP_PACKAGE_TARNAME StereoPipeline /* Define the version of this package. */ #define ASP_PACKAGE_VERSION "@PACKAGE_VERSION@" /* Set to 1 if you have the ANSI C header files. */ #cmakedefine STDC_HEADERS 1 /* The path to the ASP dependencies (useful in dev mode). */ #define ASP_DEPS_DIR "@ASP_DEPS_DIR@" /* Version number of package */ #define ASP_VERSION "@PACKAGE_VERSION@" // Check to make sure the user is using the same version of Boost // headers that the software was built with. //#include <boost/version.hpp> //#if BOOST_VERSION != ASP_BOOST_VERSION //#error You are using a different version of Boost than you used to build _! //#endif ================================================ FILE: src/asp/asp_date_config.h.in ================================================ /* File src/asp/asp_date_config.h.in. Used by CMake to generate asp_date_config.h. This is kept separate from asp_config.h since the build date and commit id changes often when the software is built locally, which results in massive recompilation. This way only Common.cc will get recompiled. */ #define ASP_BUILD_DATE "@ASP_BUILD_DATE@" #define ASP_COMMIT_ID "@ASP_COMMIT_ID@" ================================================ FILE: src/test/Helpers.h ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #ifndef __VW_TESTS_CONFIG_TEST_H__ #define __VW_TESTS_CONFIG_TEST_H__ #include <vw/vw_config.h> #include <vw/Core/Log.h> #include <vw/Math/Vector.h> #include <vw/Math/Matrix.h> #include <vw/Image/PixelTypeInfo.h> #include <vw/Image/PixelMath.h> // Turn off warnings about things we can't control #define BOOST_ALLOW_DEPRECATED_HEADERS #define BOOST_BIND_GLOBAL_PLACEHOLDERS #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic ignored "-Wunknown-pragmas" #include <boost/function.hpp> #include <boost/range/iterator_range_core.hpp> #pragma GCC diagnostic pop #include <gtest/gtest_ASP.h> #include <cmath> #include <complex> #include <string> #include <queue> #include <cstdlib> #if defined(VW_ENABLE_EXCEPTIONS) && (VW_ENABLE_EXCEPTIONS==1) #define HAS_EXCEPTIONS(x) x #else #define HAS_EXCEPTIONS(x) DISABLED_ ## x #endif #if defined(VW_ENABLE_CONFIG_FILE) && (VW_ENABLE_CONFIG_FILE==1) #define HAS_CONFIG_FILE(x) x #else #define HAS_CONFIG_FILE(x) DISABLED_ ## x #endif namespace gi = ::testing::internal; namespace vw { namespace test { }} namespace t = vw::test; namespace vw { namespace test { using namespace ::testing; #ifndef TEST_OBJDIR #error TEST_OBJDIR is not defined! Define it before including this header. #endif // Create a temporary filename that is unlinked when constructed and destructed class UnlinkName : public std::string { public: UnlinkName() {} UnlinkName(const std::string& base, const std::string& directory=TEST_OBJDIR); UnlinkName(const char *base, const std::string& directory=TEST_OBJDIR); ~UnlinkName(); }; // A getenv with a default value std::string getenv2(const char *key, const std::string& Default); // Fetch the seed we used. You should only need to do this if you're // initializing a different random number generator (i.e. boost::rand48). Do // NOT use this to reseed a global random number generator. uint32 get_random_seed(); // reduce the damage from using gtest internal bits, and make sure uint8 is // seen as numeric. template <typename T> ::std::string format(const T& x) { return PrintToString(_numeric(x)); } // Value diffs template <typename ElemT, typename Elem2T> double value_diff(const vw::PixelMathBase<ElemT>& a, const vw::PixelMathBase<Elem2T>& b) { BOOST_STATIC_ASSERT((boost::is_same<ElemT, Elem2T>::value)); typedef typename CompoundChannelType<ElemT>::type channel_type; double acc = 0.0; for( size_t c=0; c < PixelNumChannels<ElemT>::value; ++c ) { channel_type const& a_x = compound_select_channel<channel_type const&>(a.impl(),c); channel_type const& b_x = compound_select_channel<channel_type const&>(b.impl(),c); double diff = double(a_x) - double(b_x); acc += diff*diff; } return ::sqrt(acc); } template <typename T1, typename T2> double value_diff(const std::complex<T1>& a, const std::complex<T2>& b) { return std::abs(std::complex<double>(a) - std::complex<double>(b)); } template <typename T1, typename T2> struct both_are_arithmetic : boost::mpl::and_<boost::is_arithmetic<T1>, boost::is_arithmetic<T2> > {}; template <typename T1, typename T2> typename boost::enable_if<both_are_arithmetic<T1,T2>, double>::type value_diff(const T1& a, const T2& b) { BOOST_STATIC_ASSERT(boost::is_arithmetic<T1>::value); BOOST_STATIC_ASSERT(boost::is_arithmetic<T2>::value); return ::fabs(double(a) - double(b)); } // A version of std::mismatch that returns the set of differences rather than // just the first template <class InputIterator1, class InputIterator2, class Pred> void mismatch_queue(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, std::queue<std::pair<InputIterator1, InputIterator2> >& answer, const Pred& p) { while ( first1!=last1 ) { if (!p(*first1, *first2)) answer.push(std::make_pair(first1, first2)); ++first1; ++first2; } } template <typename ImplT> class CmpWorker { public: inline ImplT& impl() { return static_cast<ImplT&>(*this); } inline ImplT const& impl() const { return static_cast<ImplT const&>(*this); } template <typename T1, typename T2> bool operator()(const T1& e, const T2& a) const {return impl()(e, a);} template <typename T1, typename T2> Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const { return impl().what(ename, aname, e, a); } }; class CmpEqual : public CmpWorker<CmpEqual> { public: template <typename T1, typename T2> bool operator()(const T1& a, const T2& b) const { return a == b; } template <typename T1, typename T2> Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const { return Message() << gi::EqFailure(ename.c_str(), aname.c_str(), t::format(e), t::format(a), false).message(); } }; class CmpTypeEqual : public CmpWorker<CmpTypeEqual> { public: template <typename T1, typename T2> bool operator()(const T1& a, const T2& b) const { return boost::is_same<T1,T2>::value && a == b; } template <typename T1, typename T2> Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const { if (!boost::is_same<T1,T2>::value) return Message() << ename << " and " << aname << " are not the same type"; return Message() << gi::EqFailure(ename.c_str(), aname.c_str(), t::format(e), t::format(a), false).message(); } }; class CmpNear : public CmpWorker<CmpNear> { const char *dexpr; const double& delta; public: CmpNear(const char* dexpr, const double& delta) : dexpr(dexpr), delta(delta) {} template <typename T1, typename T2> bool operator()(const T1& a, const T2& b) const { return value_diff(a, b) <= delta; } template <typename T1, typename T2> Message what(const std::string& ename, const std::string& aname, const T1& e, const T2& a) const { Message msg; msg << "The difference between " << ename << " and " << aname << " is " << t::format(value_diff(e, a)) << ", which exceeds " << dexpr << ", where\n" << ename << " evaluates to " << t::format(e) << ",\n" << aname << " evaluates to " << t::format(a) << ", and\n" << dexpr << " evaluates to " << t::format(delta) << "."; return msg; } }; #if 0 template <typename ExpectT> struct CmpULP : public CmpWorker<CmpULP<ExpectT> > { BOOST_STATIC_ASSERT(boost::is_floating_point<ExpectT>::value); public: template <typename ActualT> bool operator()(const ExpectT& a, const ActualT& b) const { const gi::FloatingPoint<ExpectT> lhs(a), rhs(b); return lhs.AlmostEquals(rhs); } template <typename ActualT> Message what(const std::string& ename, const std::string& aname, const ExpectT& e, const ActualT& a) const { std::ostringstream es, as; es << std::setprecision(std::numeric_limits<ExpectT>::digits10 + 2) << e; as << std::setprecision(std::numeric_limits<ExpectT>::digits10 + 2) << a; return Message() << gi::EqFailure(ename.c_str(), aname.c_str(), es.str(), as.str(), false); } }; #endif template <typename CmpT> class _CheckOne { const CmpT& cmp; public: _CheckOne() : cmp(CmpT()) {} _CheckOne(const CmpT& cmp) : cmp(cmp) {} template <typename ExpectT, typename ActualT> AssertionResult operator()(const char* ename, const char* aname, const ExpectT& e, const ActualT& a) const { if (cmp(e, a)) return AssertionSuccess(); return AssertionFailure() << cmp.what(ename, aname, e, a); } }; template <typename CmpT> _CheckOne<CmpT> check_one(const CmpT& cmp) { return _CheckOne<CmpT>(cmp); } template <typename CmpT> class _CheckRange { const CmpT& cmp; public: _CheckRange() : cmp(CmpT()) {} _CheckRange(const CmpT& cmp) : cmp(cmp) {} template <typename Range1T, typename Range2T> AssertionResult operator()(const char* ename, const char* aname, const Range1T& e, const Range2T& a) const { if (a.size() != e.size()) return AssertionFailure() << "Iterator ranges (" << ename << ") and (" << aname << ") represent different-sized ranges."; typedef std::pair<typename Range1T::const_iterator, typename Range2T::const_iterator> pair_t; std::queue<pair_t> ret; mismatch_queue(e.begin(), e.end(), a.begin(), ret, cmp); if (ret.empty()) return AssertionSuccess(); Message msg; bool need_newline = false; while (!ret.empty()) { const pair_t& r = ret.front(); const std::string idx = "[" + stringify(std::distance(e.begin(), r.first)) + "]"; if (need_newline) msg << std::endl; msg << cmp.what(ename + idx, aname + idx, *(r.first), *(r.second)); need_newline = true; ret.pop(); } return AssertionFailure(msg); } template <typename Iter1T, typename Iter2T> AssertionResult operator()(const char* e0name, const char* /*e1name*/, const char* a0name, const char* /*a1name*/, const Iter1T& e0, const Iter1T& e1, const Iter2T& a0, const Iter2T& a1) const { return this->operator()(e0name, a0name, boost::make_iterator_range(e0, e1), boost::make_iterator_range(a0, a1)); } }; template <typename CmpT> _CheckRange<CmpT> check_range(const CmpT& cmp) { return _CheckRange<CmpT>(cmp); } template <typename CmpT> class _CheckNDRange { const CmpT& cmp; typedef Vector<size_t, 0> SVec; template <typename T> SVec size_helper(const MatrixBase<T>& m) {return Vector<size_t, 2>(m.impl().rows(), m.impl().cols());} template <typename T> SVec size_helper(const ImageViewBase<T>& m) {return Vector<size_t, 3>(m.impl().planes(), m.impl().rows(), m.impl().cols());} template <typename T> SVec size_helper(const VectorBase<T>& m) {return m.size();} SVec stride_from_size(const SVec& size) { SVec stride(size.size()); stride(size.size()-1) = 1; for (ssize_t i = stride.size()-2; i >= 0; --i) stride[i] = size[i+1] * stride[i+1]; return stride; } template <typename IterT1> std::string to_idx(const SVec& stride, const IterT1& begin, const IterT1& wrong) { std::ostringstream ss; ss << "["; bool comma = false; ssize_t d = std::distance(begin, wrong); for (size_t i = 0; i < stride.size(); ++i) { if (comma) ss << ','; ss << size_t(d / stride[i]); d = d % stride[i]; comma = true; } ss << "]"; return ss.str(); } public: _CheckNDRange() : cmp(CmpT()) {} _CheckNDRange(const CmpT& cmp) : cmp(cmp) {} template <typename T1, typename T2> AssertionResult operator()(const char* ename, const char* aname, const T1& e, const T2& a) { SVec esize = size_helper(e), asize = size_helper(a); if ( esize != asize ) return AssertionFailure() << "Cannot compare " << ename << " and " << aname << ": Different size: " << esize << " != " << asize; typedef std::pair<typename T1::const_iterator, typename T2::const_iterator> pair_t; std::queue<pair_t> ret; mismatch_queue(e.begin(), e.end(), a.begin(), ret, cmp); if (ret.empty()) return AssertionSuccess(); SVec stride = stride_from_size(esize); Message msg; bool need_newline = false; while (!ret.empty()) { const pair_t& r = ret.front(); const std::string idx = to_idx(stride, e.begin(), r.first); if (need_newline) msg << std::endl; msg << cmp.what(ename + idx, aname + idx, *(r.first), *(r.second)); need_newline = true; ret.pop(); } return AssertionFailure(msg); } }; template <typename CmpT> _CheckNDRange<CmpT> check_nd_range(const CmpT& cmp) { return _CheckNDRange<CmpT>(cmp); } #define EXPECT_RANGE_EQ(expect0, expect1, actual0, actual1) \ EXPECT_PRED_FORMAT4(t::check_range(t::CmpEqual()), expect0, expect1, actual0, actual1) #define ASSERT_RANGE_EQ(expect0, expect1, actual0, actual1) \ ASSERT_PRED_FORMAT4(t::check_range(t::CmpEqual()), expect0, expect1, actual0, actual1) #define EXPECT_RANGE_NEAR(expect0, expect1, actual0, actual1, delta) \ EXPECT_PRED_FORMAT4(t::check_range(t::CmpNear(#delta, delta)), expect0, expect1, actual0, actual1) #define ASSERT_RANGE_NEAR(expect0, expect1, actual0, actual1, delta) \ ASSERT_PRED_FORMAT4(t::check_range(t::CmpNear(#delta, delta)), expect0, expect1, actual0, actual1) #define EXPECT_SEQ_EQ(expect, actual)\ EXPECT_PRED_FORMAT2(t::check_nd_range(t::CmpEqual()), expect, actual) #define ASSERT_SEQ_EQ(expect, actual)\ ASSERT_PRED_FORMAT2(t::check_nd_range(t::CmpEqual()), expect, actual) #define EXPECT_SEQ_NEAR(expect, actual, delta)\ EXPECT_PRED_FORMAT2(t::check_nd_range(t::CmpNear(#delta, delta)), expect, actual) #define ASSERT_SEQ_NEAR(expect, actual, delta)\ ASSERT_PRED_FORMAT2(t::check_nd_range(t::CmpNear(#delta, delta)), expect, actual) #define EXPECT_VECTOR_EQ(expect, actual)\ EXPECT_PRED_FORMAT2(t::check_range(t::CmpEqual()), expect, actual) #define ASSERT_VECTOR_EQ(expect, actual)\ ASSERT_PRED_FORMAT2(t::check_range(t::CmpEqual()), expect, actual) #define EXPECT_VECTOR_NEAR(expect, actual, delta)\ EXPECT_PRED_FORMAT2(t::check_range(t::CmpNear(#delta, delta)), expect, actual) #define ASSERT_VECTOR_NEAR(expect, actual, delta)\ ASSERT_PRED_FORMAT2(t::check_range(t::CmpNear(#delta, delta)), expect, actual) #define EXPECT_TYPE_EQ( expect, actual )\ EXPECT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual ) #define ASSERT_TYPE_EQ( expect, actual )\ ASSERT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual ) #define EXPECT_PIXEL_NEAR(expect, actual, delta)\ EXPECT_PRED_FORMAT2(t::check_one(t::CmpNear(#delta, delta)), expect, actual) #define ASSERT_PIXEL_NEAR(expect, actual, delta)\ ASSERT_PRED_FORMAT2(t::check_one(t::CmpNear(#delta, delta)), expect, actual) #define EXPECT_VW_EQ(expect, actual)\ EXPECT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual) #define ASSERT_VW_EQ(expect, actual)\ ASSERT_PRED_FORMAT2(t::check_one(t::CmpTypeEqual()), expect, actual) #define VW_TEST_THROW_(statement, expected_exception, expected_substr, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::ConstCharPtr gtest_msg = "") { \ bool gtest_caught_expected = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (expected_exception const& e) { \ gtest_caught_expected = true; \ GTEST_PRED_FORMAT2_(t::IsSubstring, expected_substr, e.what(), fail);\ } \ catch (...) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws a different type."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ if (!gtest_caught_expected) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws nothing."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ fail(gtest_msg.value) // these are unlikely to work right in death tests or other weird circumstances. #define EXPECT_THROW_MSG(statement, expected_exception, expected_substr) \ VW_TEST_THROW_(statement, expected_exception, expected_substr, GTEST_NONFATAL_FAILURE_) #define ASSERT_THROW_MSG(statement, expected_exception, expected_substr) \ VW_TEST_THROW_(statement, expected_exception, expected_substr, GTEST_FATAL_FAILURE_) // DEPRECATED #define EXPECT_MATRIX_FLOAT_EQ(e, a) EXPECT_MATRIX_NEAR(e, a, 1e20) #define EXPECT_MATRIX_DOUBLE_EQ(e, a) EXPECT_MATRIX_NEAR(e, a, 1e45) #define EXPECT_COMPLEX_MATRIX_NEAR(e, a, d) EXPECT_MATRIX_NEAR(e, a, d) #define EXPECT_VECTOR_FLOAT_EQ(e, a) EXPECT_VECTOR_NEAR(e, a, 1e20) #define EXPECT_VECTOR_DOUBLE_EQ(e, a) EXPECT_VECTOR_NEAR(e, a, 1e45) #define EXPECT_PIXEL_EQ(e, a) EXPECT_TYPE_EQ(e,a) #define ASSERT_PIXEL_EQ(e, a) ASSERT_TYPE_EQ(e,a) #define EXPECT_MATRIX_EQ(e, a) EXPECT_SEQ_EQ(e,a) #define ASSERT_MATRIX_EQ(e, a) ASSERT_SEQ_EQ(e,a) #define EXPECT_MATRIX_NEAR(e, a, delta) EXPECT_SEQ_NEAR(e,a,delta) #define ASSERT_MATRIX_NEAR(e, a, delta) ASSERT_SEQ_NEAR(e,a,delta) }} // namespace t #endif ================================================ FILE: src/test/test_main.cc ================================================ // __BEGIN_LICENSE__ // Copyright (c) 2009-2013, United States Government as represented by the // Administrator of the National Aeronautics and Space Administration. All // rights reserved. // // The NGT platform is licensed under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance with the // License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // __END_LICENSE__ #include <gtest/gtest_ASP.h> #include <test/Helpers.h> #include <vw/Core/Settings.h> #include <boost/filesystem/operations.hpp> namespace fs = boost::filesystem; namespace { vw::uint32 SEED; } int main(int argc, char **argv) { // Disable the user's config file vw::vw_settings().set_rc_filename(""); ::testing::InitGoogleTest(&argc, argv); // Default to the "threadsafe" style because we can't delete our singletons // yet; this style of test launches a new process, so the singletons are // fresh. ::testing::FLAGS_gtest_death_test_style = "threadsafe"; if (getenv("VW_DEBUG")) { vw::vw_log().console_log().rule_set().add_rule(vw::VerboseDebugMessage, "*"); } // TODO: Make it so the seed is settable so we can reproduce failures in // probabilistic algorithms. This uses clock() instead of time() because // clock() (being measured in "processor ticks" instead of seconds) is likely // to exhibit more variation when tests are run many times in a short time // span. SEED = boost::numeric_cast<unsigned int>(clock()); std::srand(SEED); fs::path start_dir(TEST_SRCDIR); fs::current_path(start_dir); VW_ASSERT(fs::equivalent(fs::current_path(), start_dir), vw::LogicErr() << "Could not change the working directory to " << start_dir); int ret = RUN_ALL_TESTS(); fs::path end_dir = fs::current_path(); VW_ASSERT( fs::equivalent(start_dir, end_dir), vw::LogicErr() << "Something changed the working directory"); return ret; } namespace vw { namespace test { UnlinkName::UnlinkName(const std::string& base, const std::string& directory) : std::string(directory + "/" + base) { VW_ASSERT(!directory.empty(), ArgumentErr() << "An empty directory path is dangerous"); fs::remove_all(this->c_str()); } UnlinkName::UnlinkName(const char *base, const std::string& directory) : std::string(directory + "/" + base) { VW_ASSERT(!directory.empty(), ArgumentErr() << "An empty directory path is dangerous"); fs::remove_all(this->c_str()); } UnlinkName::~UnlinkName() { if (!this->empty()) fs::remove_all(this->c_str()); } std::string getenv2(const char *key, const std::string& Default) { const char *val = getenv(key); return val ? val : Default; } vw::uint32 get_random_seed() { return SEED; } }} // namespace vw::test ================================================ FILE: stereo.default.example ================================================ # -*- mode: sh -*- # Pre-Processing / stereo_pprc ################################################################ # Pre-alignment options # # Available choices are (however not all are supported by all sessions): # NONE (Recommended for anything map projected) # EPIPOLAR (Recommended for Pinhole Sessions) # HOMOGRAPHY (Recommended for ISIS wide-angle shots) # AFFINEEPIPOLAR (Recommended for ISIS narrow-angle and DG sessions) # LOCAL_EPIPOLAR (When affineepipolar is not aligning accurately enough, # and for external stereo algorithms) alignment-method affineepipolar # Intensity Normalization force-use-entire-range # Use entire input range # Select a preprocessing filter: # # 0 - None # 1 - Subtracted Mean # 2 - Laplacian of Gaussian (recommended) prefilter-mode 2 # Kernel size (1-sigma) for pre-processing # # Recommend 1.4 px for Laplacian of Gaussian # Recommend 25 px for Subtracted Mean prefilter-kernel-width 1.4 # Integer Correlation / stereo_corr ################################################################ # Select a stereo algorithm. See the documentation describing # stereo.default for more details. Options are: # # asp_bm (or use '0') - the ASP implementation of Block Matching. # asp_sgm (or use '1') - the ASP implementation of SGM. # asp_mgm (or use '2') - the ASP implementation of MGM. # asp_final_mgm (or use '3') - ASP MGM at the the finest level. # mgm - the originally published MGM implementation. stereo-algorithm asp_bm # Select a cost function to use for initialization: # # 0 - absolute difference (fast) # 1 - squared difference (faster .. but usually bad) # 2 - normalized cross correlation (recommended) cost-mode 2 # Initialization step: correlation kernel size corr-kernel 21 21 # Initialization step: correlation window size # corr-search -80 -2 20 2 # Subpixel Refinement / stereo_rfne ################################################################ # Subpixel step: subpixel modes # # 0 - disable subpixel correlation (fastest) # 1 - parabola fitting (draft mode - not as accurate) # 2 - affine adaptive window, bayes EM weighting (slower, but much more accurate) # 3 - affine window, (intermediate speed, results similar to bayes EM) subpixel-mode 1 # Subpixel step: correlation kernel size subpixel-kernel 21 21 # Post Filtering / stereo_fltr ################################################################ # Automatic "erode" low confidence pixels filter-mode 1 rm-half-kernel 5 5 max-mean-diff 3 rm-min-matches 60 rm-threshold 3 rm-cleanup-passes 1 # Triangulation / stereo_tri ################################################################ # Size max of the universe in meters and altitude off the ground. # Setting both values to zero turns this post-processing step off. near-universe-radius 0.0 far-universe-radius 0.0 ================================================ FILE: thirdparty/autotroll.mak ================================================ # __BEGIN_LICENSE__ # Copyright (C) 2006-2011 United States Government as represented by # the Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # __END_LICENSE__ # Makerules. # This file is part of AutoTroll. # Copyright (C) 2006 Benoit Sigoure. # # AutoTroll is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # ------------- # # DOCUMENTATION # # ------------- # # See autotroll.m4 :) SUFFIXES += .moc.cpp .moc.cc .moc.cxx .moc.C .h .hh .ui .ui.h .ui.hh \ .qrc .qrc.cpp .qrc.cc .qrc.cxx .qrc.C # --- # # MOC # # --- # .hh.moc.cpp: $(MOC) $(QT_CPPFLAGS) $< -o $@ .h.moc.cpp: $(MOC) $(QT_CPPFLAGS) $< -o $@ .hh.moc.cc: $(MOC) $(QT_CPPFLAGS) $< -o $@ .h.moc.cc: $(MOC) $(QT_CPPFLAGS) $< -o $@ .hh.moc.cxx: $(MOC) $(QT_CPPFLAGS) $< -o $@ .h.moc.cxx: $(MOC) $(QT_CPPFLAGS) $< -o $@ .hh.moc.C: $(MOC) $(QT_CPPFLAGS) $< -o $@ .h.moc.C: $(MOC) $(QT_CPPFLAGS) $< -o $@ # --- # # UIC # # --- # .ui.ui.hh: $(UIC) $< -o $@ .ui.ui.h: $(UIC) $< -o $@ # --- # # RCC # # --- # .qrc.qrc.cpp: $(RCC) -name `echo "$<" | sed 's|^.*/\(.*\)\.qrc$$|\1|'` $< -o $@ .qrc.qrc.cc: $(RCC) -name `echo "$<" | sed 's|^.*/\(.*\)\.qrc$$|\1|'` $< -o $@ .qrc.qrc.cxx: $(RCC) -name `echo "$<" | sed 's|^.*/\(.*\)\.qrc$$|\1|'` $< -o $@ .qrc.qrc.C: $(RCC) -name `echo "$<" | sed 's|^.*/\(.*\)\.qrc$$|\1|'` $< -o $@ DISTCLEANFILES = $(BUILT_SOURCES) ================================================ FILE: thirdparty/gtest/CHANGES ================================================ Changes for 1.6.0: * New feature: ADD_FAILURE_AT() for reporting a test failure at the given source location -- useful for writing testing utilities. * New feature: the universal value printer is moved from Google Mock to Google Test. * New feature: type parameters and value parameters are reported in the XML report now. * A gtest_disable_pthreads CMake option. * Colored output works in GNU Screen sessions now. * Parameters of value-parameterized tests are now printed in the textual output. * Failures from ad hoc test assertions run before RUN_ALL_TESTS() are now correctly reported. * Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to ostream. * More complete handling of exceptions. * GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter name is already used by another library. * --gtest_catch_exceptions is now true by default, allowing a test program to continue after an exception is thrown. * Value-parameterized test fixtures can now derive from Test and WithParamInterface<T> separately, easing conversion of legacy tests. * Death test messages are clearly marked to make them more distinguishable from other messages. * Compatibility fixes for Android, Google Native Client, MinGW, HP UX, PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear), IBM XL C++ (Visual Age C++), and C++0x. * Bug fixes and implementation clean-ups. * Potentially incompatible changes: disables the harmful 'make install' command in autotools. Changes for 1.5.0: * New feature: assertions can be safely called in multiple threads where the pthreads library is available. * New feature: predicates used inside EXPECT_TRUE() and friends can now generate custom failure messages. * New feature: Google Test can now be compiled as a DLL. * New feature: fused source files are included. * New feature: prints help when encountering unrecognized Google Test flags. * Experimental feature: CMake build script (requires CMake 2.6.4+). * Experimental feature: the Pump script for meta programming. * double values streamed to an assertion are printed with enough precision to differentiate any two different values. * Google Test now works on Solaris and AIX. * Build and test script improvements. * Bug fixes and implementation clean-ups. Potentially breaking changes: * Stopped supporting VC++ 7.1 with exceptions disabled. * Dropped support for 'make install'. Changes for 1.4.0: * New feature: the event listener API * New feature: test shuffling * New feature: the XML report format is closer to junitreport and can be parsed by Hudson now. * New feature: when a test runs under Visual Studio, its failures are integrated in the IDE. * New feature: /MD(d) versions of VC++ projects. * New feature: elapsed time for the tests is printed by default. * New feature: comes with a TR1 tuple implementation such that Boost is no longer needed for Combine(). * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends. * New feature: the Xcode project can now produce static gtest libraries in addition to a framework. * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile, Symbian, gcc, and C++Builder. * Bug fixes and implementation clean-ups. Changes for 1.3.0: * New feature: death tests on Windows, Cygwin, and Mac. * New feature: ability to use Google Test assertions in other testing frameworks. * New feature: ability to run disabled test via --gtest_also_run_disabled_tests. * New feature: the --help flag for printing the usage. * New feature: access to Google Test flag values in user code. * New feature: a script that packs Google Test into one .h and one .cc file for easy deployment. * New feature: support for distributing test functions to multiple machines (requires support from the test runner). * Bug fixes and implementation clean-ups. Changes for 1.2.1: * Compatibility fixes for Linux IA-64 and IBM z/OS. * Added support for using Boost and other TR1 implementations. * Changes to the build scripts to support upcoming release of Google C++ Mocking Framework. * Added Makefile to the distribution package. * Improved build instructions in README. Changes for 1.2.0: * New feature: value-parameterized tests. * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS) macros. * Changed the XML report format to match JUnit/Ant's. * Added tests to the Xcode project. * Added scons/SConscript for building with SCons. * Added src/gtest-all.cc for building Google Test from a single file. * Fixed compatibility with Solaris and z/OS. * Enabled running Python tests on systems with python 2.3 installed, e.g. Mac OS X 10.4. * Bug fixes. Changes for 1.1.0: * New feature: type-parameterized tests. * New feature: exception assertions. * New feature: printing elapsed time of tests. * Improved the robustness of death tests. * Added an Xcode project and samples. * Adjusted the output format on Windows to be understandable by Visual Studio. * Minor bug fixes. Changes for 1.0.1: * Added project files for Visual Studio 7.1. * Fixed issues with compiling on Mac OS X. * Fixed issues with compiling on Cygwin. Changes for 1.0.0: * Initial Open Source release of Google Test ================================================ FILE: thirdparty/gtest/CONTRIBUTORS ================================================ # This file contains a list of people who've made non-trivial # contribution to the Google C++ Testing Framework project. People # who commit code to the project are encouraged to add their names # here. Please keep the list sorted by first names. Ajay Joshi <jaj@google.com> Balázs Dán <balazs.dan@gmail.com> Bharat Mediratta <bharat@menalto.com> Chandler Carruth <chandlerc@google.com> Chris Prince <cprince@google.com> Chris Taylor <taylorc@google.com> Dan Egnor <egnor@google.com> Eric Roman <eroman@chromium.org> Hady Zalek <hady.zalek@gmail.com> Jeffrey Yasskin <jyasskin@google.com> Jói Sigurðsson <joi@google.com> Keir Mierle <mierle@gmail.com> Keith Ray <keith.ray@gmail.com> Kenton Varda <kenton@google.com> Manuel Klimek <klimek@google.com> Markus Heule <markus.heule@gmail.com> Mika Raento <mikie@iki.fi> Miklós Fazekas <mfazekas@szemafor.com> Pasi Valminen <pasi.valminen@gmail.com> Patrick Hanna <phanna@google.com> Patrick Riley <pfr@google.com> Peter Kaminski <piotrk@google.com> Preston Jackson <preston.a.jackson@gmail.com> Rainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com> Russ Cox <rsc@google.com> Russ Rufer <russ@pentad.com> Sean Mcafee <eefacm@gmail.com> Sigurður Ásgeirsson <siggi@google.com> Tracy Bialik <tracy@pentad.com> Vadim Berman <vadimb@google.com> Vlad Losev <vladl@google.com> Zhanyong Wan <wan@google.com> ================================================ FILE: thirdparty/gtest/COPYING ================================================ Copyright 2008, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: thirdparty/gtest/README ================================================ Google C++ Testing Framework ============================ http://code.google.com/p/googletest/ Overview -------- Google's framework for writing C++ tests on a variety of platforms (Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Based on the xUnit architecture. Supports automatic test discovery, a rich set of assertions, user-defined assertions, death tests, fatal and non-fatal failures, various options for running the tests, and XML test report generation. Please see the project page above for more information as well as the mailing list for questions, discussions, and development. There is also an IRC channel on OFTC (irc.oftc.net) #gtest available. Please join us! Requirements for End Users -------------------------- Google Test is designed to have fairly minimal requirements to build and use with your projects, but there are some. Currently, we support Linux, Windows, Mac OS X, and Cygwin. We will also make our best effort to support other platforms (e.g. Solaris, AIX, and z/OS). However, since core members of the Google Test project have no access to these platforms, Google Test may have outstanding issues there. If you notice any problems on your platform, please notify googletestframework@googlegroups.com. Patches for fixing them are even more welcome! ### Linux Requirements ### These are the base requirements to build and use Google Test from a source package (as described below): * GNU-compatible Make or gmake * POSIX-standard shell * POSIX(-2) Regular Expressions (regex.h) * A C++98-standard-compliant compiler ### Windows Requirements ### * Microsoft Visual C++ 7.1 or newer ### Cygwin Requirements ### * Cygwin 1.5.25-14 or newer ### Mac OS X Requirements ### * Mac OS X 10.4 Tiger or newer * Developer Tools Installed Also, you'll need CMake 2.6.4 or higher if you want to build the samples using the provided CMake script, regardless of the platform. Requirements for Contributors ----------------------------- We welcome patches. If you plan to contribute a patch, you need to build Google Test and its own tests from an SVN checkout (described below), which has further requirements: * Python version 2.3 or newer (for running some of the tests and re-generating certain source files from templates) * CMake 2.6.4 or newer Getting the Source ------------------ There are two primary ways of getting Google Test's source code: you can download a stable source release in your preferred archive format, or directly check out the source from our Subversion (SVN) repositary. The SVN checkout requires a few extra steps and some extra software packages on your system, but lets you track the latest development and make patches much more easily, so we highly encourage it. ### Source Package ### Google Test is released in versioned source packages which can be downloaded from the download page [1]. Several different archive formats are provided, but the only difference is the tools used to manipulate them, and the size of the resulting file. Download whichever you are most comfortable with. [1] http://code.google.com/p/googletest/downloads/list Once the package is downloaded, expand it using whichever tools you prefer for that type. This will result in a new directory with the name "gtest-X.Y.Z" which contains all of the source code. Here are some examples on Linux: tar -xvzf gtest-X.Y.Z.tar.gz tar -xvjf gtest-X.Y.Z.tar.bz2 unzip gtest-X.Y.Z.zip ### SVN Checkout ### To check out the main branch (also known as the "trunk") of Google Test, run the following Subversion command: svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn Setting up the Build -------------------- To build Google Test and your tests that use it, you need to tell your build system where to find its headers and source files. The exact way to do it depends on which build system you use, and is usually straightforward. ### Generic Build Instructions ### Suppose you put Google Test in directory ${GTEST_DIR}. To build it, create a library build target (or a project as called by Visual Studio and Xcode) to compile ${GTEST_DIR}/src/gtest-all.cc with ${GTEST_DIR}/include and ${GTEST_DIR} in the header search path. Assuming a Linux-like system and gcc, something like the following will do: g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc ar -rv libgtest.a gtest-all.o Next, you should compile your test source file with ${GTEST_DIR}/include in the header search path, and link it with gtest and any other necessary libraries: g++ -I${GTEST_DIR}/include path/to/your_test.cc libgtest.a -o your_test As an example, the make/ directory contains a Makefile that you can use to build Google Test on systems where GNU make is available (e.g. Linux, Mac OS X, and Cygwin). It doesn't try to build Google Test's own tests. Instead, it just builds the Google Test library and a sample test. You can use it as a starting point for your own build script. If the default settings are correct for your environment, the following commands should succeed: cd ${GTEST_DIR}/make make ./sample1_unittest If you see errors, try to tweak the contents of make/Makefile to make them go away. There are instructions in make/Makefile on how to do it. ### Using CMake ### Google Test comes with a CMake build script (CMakeLists.txt) that can be used on a wide range of platforms ("C" stands for cross-platofrm.). If you don't have CMake installed already, you can download it for free from http://www.cmake.org/. CMake works by generating native makefiles or build projects that can be used in the compiler environment of your choice. The typical workflow starts with: mkdir mybuild # Create a directory to hold the build output. cd mybuild cmake ${GTEST_DIR} # Generate native build scripts. If you want to build Google Test's samples, you should replace the last command with cmake -Dgtest_build_samples=ON ${GTEST_DIR} If you are on a *nix system, you should now see a Makefile in the current directory. Just type 'make' to build gtest. If you use Windows and have Vistual Studio installed, a gtest.sln file and several .vcproj files will be created. You can then build them using Visual Studio. On Mac OS X with Xcode installed, a .xcodeproj file will be generated. ### Legacy Build Scripts ### Before settling on CMake, we have been providing hand-maintained build projects/scripts for Visual Studio, Xcode, and Autotools. While we continue to provide them for convenience, they are not actively maintained any more. We highly recommend that you follow the instructions in the previous two sections to integrate Google Test with your existing build system. If you still need to use the legacy build scripts, here's how: The msvc\ folder contains two solutions with Visual C++ projects. Open the gtest.sln or gtest-md.sln file using Visual Studio, and you are ready to build Google Test the same way you build any Visual Studio project. Files that have names ending with -md use DLL versions of Microsoft runtime libraries (the /MD or the /MDd compiler option). Files without that suffix use static versions of the runtime libraries (the /MT or the /MTd option). Please note that one must use the same option to compile both gtest and the test code. If you use Visual Studio 2005 or above, we recommend the -md version as /MD is the default for new projects in these versions of Visual Studio. On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using Xcode. Build the "gtest" target. The universal binary framework will end up in your selected build directory (selected in the Xcode "Preferences..." -> "Building" pane and defaults to xcode/build). Alternatively, at the command line, enter: xcodebuild This will build the "Release" configuration of gtest.framework in your default build location. See the "xcodebuild" man page for more information about building different configurations and building in different locations. Tweaking Google Test -------------------- Google Test can be used in diverse environments. The default configuration may not work (or may not work well) out of the box in some environments. However, you can easily tweak Google Test by defining control macros on the compiler command line. Generally, these macros are named like GTEST_XYZ and you define them to either 1 or 0 to enable or disable a certain feature. We list the most frequently used macros below. For a complete list, see file include/gtest/internal/gtest-port.h. ### Choosing a TR1 Tuple Library ### Some Google Test features require the C++ Technical Report 1 (TR1) tuple library, which is not yet available with all compilers. The good news is that Google Test implements a subset of TR1 tuple that's enough for its own need, and will automatically use this when the compiler doesn't provide TR1 tuple. Usually you don't need to care about which tuple library Google Test uses. However, if your project already uses TR1 tuple, you need to tell Google Test to use the same TR1 tuple library the rest of your project uses, or the two tuple implementations will clash. To do that, add -DGTEST_USE_OWN_TR1_TUPLE=0 to the compiler flags while compiling Google Test and your tests. If you want to force Google Test to use its own tuple library, just add -DGTEST_USE_OWN_TR1_TUPLE=1 to the compiler flags instead. If you don't want Google Test to use tuple at all, add -DGTEST_HAS_TR1_TUPLE=0 and all features using tuple will be disabled. ### Multi-threaded Tests ### Google Test is thread-safe where the pthread library is available. After #include "gtest/gtest.h", you can check the GTEST_IS_THREADSAFE macro to see whether this is the case (yes if the macro is #defined to 1, no if it's undefined.). If Google Test doesn't correctly detect whether pthread is available in your environment, you can force it with -DGTEST_HAS_PTHREAD=1 or -DGTEST_HAS_PTHREAD=0 When Google Test uses pthread, you may need to add flags to your compiler and/or linker to select the pthread library, or you'll get link errors. If you use the CMake script or the deprecated Autotools script, this is taken care of for you. If you use your own build script, you'll need to read your compiler and linker's manual to figure out what flags to add. ### As a Shared Library (DLL) ### Google Test is compact, so most users can build and link it as a static library for the simplicity. You can choose to use Google Test as a shared library (known as a DLL on Windows) if you prefer. To compile *gtest* as a shared library, add -DGTEST_CREATE_SHARED_LIBRARY=1 to the compiler flags. You'll also need to tell the linker to produce a shared library instead - consult your linker's manual for how to do it. To compile your *tests* that use the gtest shared library, add -DGTEST_LINKED_AS_SHARED_LIBRARY=1 to the compiler flags. Note: while the above steps aren't technically necessary today when using some compilers (e.g. GCC), they may become necessary in the future, if we decide to improve the speed of loading the library (see http://gcc.gnu.org/wiki/Visibility for details). Therefore you are recommended to always add the above flags when using Google Test as a shared library. Otherwise a future release of Google Test may break your build script. ### Avoiding Macro Name Clashes ### In C++, macros don't obey namespaces. Therefore two libraries that both define a macro of the same name will clash if you #include both definitions. In case a Google Test macro clashes with another library, you can force Google Test to rename its macro to avoid the conflict. Specifically, if both Google Test and some other code define macro FOO, you can add -DGTEST_DONT_DEFINE_FOO=1 to the compiler flags to tell Google Test to change the macro's name from FOO to GTEST_FOO. Currently FOO can be FAIL, SUCCEED, or TEST. For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write GTEST_TEST(SomeTest, DoesThis) { ... } instead of TEST(SomeTest, DoesThis) { ... } in order to define a test. Upgrating from an Earlier Version --------------------------------- We strive to keep Google Test releases backward compatible. Sometimes, though, we have to make some breaking changes for the users' long-term benefits. This section describes what you'll need to do if you are upgrading from an earlier version of Google Test. ### Upgrading from 1.3.0 or Earlier ### You may need to explicitly enable or disable Google Test's own TR1 tuple library. See the instructions in section "Choosing a TR1 Tuple Library". ### Upgrading from 1.4.0 or Earlier ### The Autotools build script (configure + make) is no longer officially supportted. You are encouraged to migrate to your own build system or use CMake. If you still need to use Autotools, you can find instructions in the README file from Google Test 1.4.0. On platforms where the pthread library is available, Google Test uses it in order to be thread-safe. See the "Multi-threaded Tests" section for what this means to your build script. If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google Test will no longer compile. This should affect very few people, as a large portion of STL (including <string>) doesn't compile in this mode anyway. We decided to stop supporting it in order to greatly simplify Google Test's implementation. Developing Google Test ---------------------- This section discusses how to make your own changes to Google Test. ### Testing Google Test Itself ### To make sure your changes work as intended and don't break existing functionality, you'll want to compile and run Google Test's own tests. For that you can use CMake: mkdir mybuild cd mybuild cmake -Dgtest_build_tests=ON ${GTEST_DIR} Make sure you have Python installed, as some of Google Test's tests are written in Python. If the cmake command complains about not being able to find Python ("Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)"), try telling it explicitly where your Python executable can be found: cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR} Next, you can build Google Test and all of its own tests. On *nix, this is usually done by 'make'. To run the tests, do make test All tests should pass. ### Regenerating Source Files ### Some of Google Test's source files are generated from templates (not in the C++ sense) using a script. A template file is named FOO.pump, where FOO is the name of the file it will generate. For example, the file include/gtest/internal/gtest-type-util.h.pump is used to generate gtest-type-util.h in the same directory. Normally you don't need to worry about regenerating the source files, unless you need to modify them. In that case, you should modify the corresponding .pump files instead and run the pump.py Python script to regenerate them. You can find pump.py in the scripts/ directory. Read the Pump manual [2] for how to use it. [2] http://code.google.com/p/googletest/wiki/PumpManual ### Contributing a Patch ### We welcome patches. Please read the Google Test developer's guide [3] for how you can contribute. In particular, make sure you have signed the Contributor License Agreement, or we won't be able to accept the patch. [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide Happy testing! ================================================ FILE: thirdparty/gtest/include/gtest/gtest_ASP.h ================================================ // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the public API for Google Test. It should be // included by any test program that uses Google Test. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! // // Acknowledgment: Google Test borrowed the idea of automatic test // registration from Barthelemy Dagenais' (barthelemy@prologique.com) // easyUnit framework. #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_H_ #include <limits> #include <vector> // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file declares functions and macros used internally by // Google Test. They are subject to change without notice. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan) // // Low-level types and utilities for porting Google Test to various // platforms. They are subject to change without notice. DO NOT USE // THEM IN USER CODE. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ // The user can define the following macros in the build script to // control Google Test's behavior. If the user doesn't define a macro // in this list, Google Test will define it. // // GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) // is/isn't available. // GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions // are enabled. // GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string // is/isn't available (some systems define // ::string, which is different to std::string). // GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string // is/isn't available (some systems define // ::wstring, which is different to std::wstring). // GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular // expressions are/aren't available. // GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h> // is/isn't available. // GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't // enabled. // GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that // std::wstring does/doesn't work (Google Test can // be used where std::wstring is unavailable). // GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple // is/isn't available. // GTEST_HAS_SEH - Define it to 1/0 to indicate whether the // compiler supports Microsoft's "Structured // Exception Handling". // GTEST_HAS_STREAM_REDIRECTION // - Define it to 1/0 to indicate whether the // platform supports I/O stream redirection using // dup() and dup2(). // GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google // Test's own tr1 tuple implementation should be // used. Unused when the user sets // GTEST_HAS_TR1_TUPLE to 0. // GTEST_LINKED_AS_SHARED_LIBRARY // - Define to 1 when compiling tests that use // Google Test as a shared library (known as // DLL on Windows). // GTEST_CREATE_SHARED_LIBRARY // - Define to 1 when compiling Google Test itself // as a shared library. // This header defines the following utilities: // // Macros indicating the current platform (defined to 1 if compiled on // the given platform; otherwise undefined): // GTEST_OS_AIX - IBM AIX // GTEST_OS_CYGWIN - Cygwin // GTEST_OS_HPUX - HP-UX // GTEST_OS_LINUX - Linux // GTEST_OS_LINUX_ANDROID - Google Android // GTEST_OS_MAC - Mac OS X // GTEST_OS_NACL - Google Native Client (NaCl) // GTEST_OS_SOLARIS - Sun Solaris // GTEST_OS_SYMBIAN - Symbian // GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) // GTEST_OS_WINDOWS_DESKTOP - Windows Desktop // GTEST_OS_WINDOWS_MINGW - MinGW // GTEST_OS_WINDOWS_MOBILE - Windows Mobile // GTEST_OS_ZOS - z/OS // // Among the platforms, Cygwin, Linux, Max OS X, and Windows have the // most stable support. Since core members of the Google Test project // don't have access to other platforms, support for them may be less // stable. If you notice any problems on your platform, please notify // googletestframework@googlegroups.com (patches for fixing them are // even more welcome!). // // Note that it is possible that none of the GTEST_OS_* macros are defined. // // Macros indicating available Google Test features (defined to 1 if // the corresponding feature is supported; otherwise undefined): // GTEST_HAS_COMBINE - the Combine() function (for value-parameterized // tests) // GTEST_HAS_DEATH_TEST - death tests // GTEST_HAS_PARAM_TEST - value-parameterized tests // GTEST_HAS_TYPED_TEST - typed tests // GTEST_HAS_TYPED_TEST_P - type-parameterized tests // GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with // GTEST_HAS_POSIX_RE (see above) which users can // define themselves. // GTEST_USES_SIMPLE_RE - our own simple regex is used; // the above two are mutually exclusive. // GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ(). // // Macros for basic C++ coding: // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a // variable don't have to be used. // GTEST_DISALLOW_ASSIGN_ - disables operator=. // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. // // Synchronization: // Mutex, MutexLock, ThreadLocal, GetThreadCount() // - synchronization primitives. // GTEST_IS_THREADSAFE - defined to 1 to indicate that the above // synchronization primitives have real implementations // and Google Test is thread-safe; or 0 otherwise. // // Template meta programming: // is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. // IteratorTraits - partial implementation of std::iterator_traits, which // is not available in libCstd when compiled with Sun C++. // // Smart pointers: // scoped_ptr - as in TR2. // // Regular expressions: // RE - a simple regular expression class using the POSIX // Extended Regular Expression syntax on UNIX-like // platforms, or a reduced regular exception syntax on // other platforms, including Windows. // // Logging: // GTEST_LOG_() - logs messages at the specified severity level. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. // // Stdout and stderr capturing: // CaptureStdout() - starts capturing stdout. // GetCapturedStdout() - stops capturing stdout and returns the captured // string. // CaptureStderr() - starts capturing stderr. // GetCapturedStderr() - stops capturing stderr and returns the captured // string. // // Integer types: // TypeWithSize - maps an integer to a int type. // Int32, UInt32, Int64, UInt64, TimeInMillis // - integers of known sizes. // BiggestInt - the biggest signed integer type. // // Command-line utilities: // GTEST_FLAG() - references a flag. // GTEST_DECLARE_*() - declares a flag. // GTEST_DEFINE_*() - defines a flag. // GetArgvs() - returns the command line as a vector of strings. // // Environment variable utilities: // GetEnv() - gets the value of an environment variable. // BoolFromGTestEnv() - parses a bool environment variable. // Int32FromGTestEnv() - parses an Int32 environment variable. // StringFromGTestEnv() - parses a string environment variable. #include <ctype.h> // for isspace, etc #include <stddef.h> // for ptrdiff_t #include <stdlib.h> #include <stdio.h> #include <string.h> #ifndef _WIN32_WCE # include <sys/types.h> # include <sys/stat.h> #endif // !_WIN32_WCE #include <iostream> // NOLINT #include <sstream> // NOLINT #include <string> // NOLINT #define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" #define GTEST_FLAG_PREFIX_ "gtest_" #define GTEST_FLAG_PREFIX_DASH_ "gtest-" #define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" #define GTEST_NAME_ "Google Test" #define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" // Determines the version of gcc that is used to compile this. #ifdef __GNUC__ // 40302 means version 4.3.2. # define GTEST_GCC_VER_ \ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) #endif // __GNUC__ // Determines the platform on which Google Test is compiled. #ifdef __CYGWIN__ # define GTEST_OS_CYGWIN 1 #elif defined __SYMBIAN32__ # define GTEST_OS_SYMBIAN 1 #elif defined _WIN32 # define GTEST_OS_WINDOWS 1 # ifdef _WIN32_WCE # define GTEST_OS_WINDOWS_MOBILE 1 # elif defined(__MINGW__) || defined(__MINGW32__) # define GTEST_OS_WINDOWS_MINGW 1 # else # define GTEST_OS_WINDOWS_DESKTOP 1 # endif // _WIN32_WCE #elif defined __APPLE__ # define GTEST_OS_MAC 1 #elif defined __linux__ # define GTEST_OS_LINUX 1 # ifdef ANDROID # define GTEST_OS_LINUX_ANDROID 1 # endif // ANDROID #elif defined __MVS__ # define GTEST_OS_ZOS 1 #elif defined(__sun) && defined(__SVR4) # define GTEST_OS_SOLARIS 1 #elif defined(_AIX) # define GTEST_OS_AIX 1 #elif defined(__hpux) # define GTEST_OS_HPUX 1 #elif defined __native_client__ # define GTEST_OS_NACL 1 #endif // __CYGWIN__ // Brings in definitions for functions used in the testing::internal::posix // namespace (read, write, close, chdir, isatty, stat). We do not currently // use them on Windows Mobile. #if !GTEST_OS_WINDOWS // This assumes that non-Windows OSes provide unistd.h. For OSes where this // is not the case, we need to include headers that provide the functions // mentioned above. # include <unistd.h> # if !GTEST_OS_NACL // TODO(vladl@google.com): Remove this condition when Native Client SDK adds // strings.h (tracked in // http://code.google.com/p/nativeclient/issues/detail?id=1175). # include <strings.h> // Native Client doesn't provide strings.h. # endif #elif !GTEST_OS_WINDOWS_MOBILE # include <direct.h> # include <io.h> #endif // Defines this to true iff Google Test can use POSIX regular expressions. #ifndef GTEST_HAS_POSIX_RE # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) #endif #if GTEST_HAS_POSIX_RE // On some platforms, <regex.h> needs someone to define size_t, and // won't compile otherwise. We can #include it here as we already // included <stdlib.h>, which is guaranteed to define size_t through // <stddef.h>. # include <regex.h> // NOLINT # define GTEST_USES_POSIX_RE 1 #elif GTEST_OS_WINDOWS // <regex.h> is not available on Windows. Use our own simple regex // implementation instead. # define GTEST_USES_SIMPLE_RE 1 #else // <regex.h> may not be available on this platform. Use our own // simple regex implementation instead. # define GTEST_USES_SIMPLE_RE 1 #endif // GTEST_HAS_POSIX_RE #ifndef GTEST_HAS_EXCEPTIONS // The user didn't tell us whether exceptions are enabled, so we need // to figure it out. # if defined(_MSC_VER) || defined(__BORLANDC__) // MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS // macro to enable exceptions, so we'll do the same. // Assumes that exceptions are enabled by default. # ifndef _HAS_EXCEPTIONS # define _HAS_EXCEPTIONS 1 # endif // _HAS_EXCEPTIONS # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS # elif defined(__GNUC__) && __EXCEPTIONS // gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__SUNPRO_CC) // Sun Pro CC supports exceptions. However, there is no compile-time way of // detecting whether they are enabled or not. Therefore, we assume that // they are enabled unless the user tells us otherwise. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__IBMCPP__) && __EXCEPTIONS // xlC defines __EXCEPTIONS to 1 iff exceptions are enabled. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__HP_aCC) // Exception handling is in effect by default in HP aCC compiler. It has to // be turned of by +noeh compiler option if desired. # define GTEST_HAS_EXCEPTIONS 1 # else // For other compilers, we assume exceptions are disabled to be // conservative. # define GTEST_HAS_EXCEPTIONS 0 # endif // defined(_MSC_VER) || defined(__BORLANDC__) #endif // GTEST_HAS_EXCEPTIONS #if !defined(GTEST_HAS_STD_STRING) // Even though we don't use this macro any longer, we keep it in case // some clients still depend on it. # define GTEST_HAS_STD_STRING 1 #elif !GTEST_HAS_STD_STRING // The user told us that ::std::string isn't available. # error "Google Test cannot be used where ::std::string isn't available." #endif // !defined(GTEST_HAS_STD_STRING) #ifndef GTEST_HAS_GLOBAL_STRING // The user didn't tell us whether ::string is available, so we need // to figure it out. # define GTEST_HAS_GLOBAL_STRING 0 #endif // GTEST_HAS_GLOBAL_STRING #ifndef GTEST_HAS_STD_WSTRING // The user didn't tell us whether ::std::wstring is available, so we need // to figure it out. // TODO(wan@google.com): uses autoconf to detect whether ::std::wstring // is available. // Cygwin 1.7 and below doesn't support ::std::wstring. // Solaris' libc++ doesn't support it either. Android has // no support for it at least as recent as Froyo (2.2). # define GTEST_HAS_STD_WSTRING \ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) #endif // GTEST_HAS_STD_WSTRING #ifndef GTEST_HAS_GLOBAL_WSTRING // The user didn't tell us whether ::wstring is available, so we need // to figure it out. # define GTEST_HAS_GLOBAL_WSTRING \ (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) #endif // GTEST_HAS_GLOBAL_WSTRING // Determines whether RTTI is available. #ifndef GTEST_HAS_RTTI // The user didn't tell us whether RTTI is enabled, so we need to // figure it out. # ifdef _MSC_VER # ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. # define GTEST_HAS_RTTI 1 # else # define GTEST_HAS_RTTI 0 # endif // Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled. # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302) # ifdef __GXX_RTTI # define GTEST_HAS_RTTI 1 # else # define GTEST_HAS_RTTI 0 # endif // __GXX_RTTI // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if // both the typeid and dynamic_cast features are present. # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) # ifdef __RTTI_ALL__ # define GTEST_HAS_RTTI 1 # else # define GTEST_HAS_RTTI 0 # endif # else // For all other compilers, we assume RTTI is enabled. # define GTEST_HAS_RTTI 1 # endif // _MSC_VER #endif // GTEST_HAS_RTTI // It's this header's responsibility to #include <typeinfo> when RTTI // is enabled. #if GTEST_HAS_RTTI # include <typeinfo> #endif // Determines whether Google Test can use the pthreads library. #ifndef GTEST_HAS_PTHREAD // The user didn't tell us explicitly, so we assume pthreads support is // available on Linux and Mac. // // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 // to your compiler flags. # define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX) #endif // GTEST_HAS_PTHREAD #if GTEST_HAS_PTHREAD // gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is // true. # include <pthread.h> // NOLINT // For timespec and nanosleep, used below. # include <time.h> // NOLINT #endif // Determines whether Google Test can use tr1/tuple. You can define // this macro to 0 to prevent Google Test from using tuple (any // feature depending on tuple with be disabled in this mode). #ifndef GTEST_HAS_TR1_TUPLE // The user didn't tell us not to do it, so we assume it's OK. # define GTEST_HAS_TR1_TUPLE 1 #endif // GTEST_HAS_TR1_TUPLE // Determines whether Google Test's own tr1 tuple implementation // should be used. #ifndef GTEST_USE_OWN_TR1_TUPLE // The user didn't tell us, so we need to figure it out. // We use our own TR1 tuple if we aren't sure the user has an // implementation of it already. At this time, GCC 4.0.0+ and MSVC // 2010 are the only mainstream compilers that come with a TR1 tuple // implementation. NVIDIA's CUDA NVCC compiler pretends to be GCC by // defining __GNUC__ and friends, but cannot compile GCC's tuple // implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB // Feature Pack download, which we cannot assume the user has. # if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \ || _MSC_VER >= 1600 # define GTEST_USE_OWN_TR1_TUPLE 0 # else # define GTEST_USE_OWN_TR1_TUPLE 1 # endif #endif // GTEST_USE_OWN_TR1_TUPLE // To avoid conditional compilation everywhere, we make it // gtest-port.h's responsibility to #include the header implementing // tr1/tuple. #if GTEST_HAS_TR1_TUPLE # if GTEST_USE_OWN_TR1_TUPLE // This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2009 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Implements a subset of TR1 tuple needed by Google Test and Google Mock. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #include <utility> // For ::std::pair. // The compiler used in Symbian has a bug that prevents us from declaring the // tuple template as a friend (it complains that tuple is redefined). This // hack bypasses the bug by declaring the members that should otherwise be // private as public. // Sun Studio versions < 12 also have the above bug. #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: #else # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ template <GTEST_10_TYPENAMES_(U)> friend class tuple; \ private: #endif // GTEST_n_TUPLE_(T) is the type of an n-tuple. #define GTEST_0_TUPLE_(T) tuple<> #define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \ void, void, void> #define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \ void, void, void> #define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \ void, void, void> #define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \ void, void, void> #define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \ void, void, void> #define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \ void, void, void> #define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ void, void, void> #define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ T##7, void, void> #define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ T##7, T##8, void> #define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ T##7, T##8, T##9> // GTEST_n_TYPENAMES_(T) declares a list of n typenames. #define GTEST_0_TYPENAMES_(T) #define GTEST_1_TYPENAMES_(T) typename T##0 #define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1 #define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2 #define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3 #define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4 #define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5 #define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6 #define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, typename T##7 #define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8 #define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8, typename T##9 // In theory, defining stuff in the ::std namespace is undefined // behavior. We can do this as we are playing the role of a standard // library vendor. namespace std { namespace tr1 { template <typename T0 = void, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void> class tuple; // Anything in namespace gtest_internal is Google Test's INTERNAL // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. namespace gtest_internal { // ByRef<T>::type is T if T is a reference; otherwise it's const T&. template <typename T> struct ByRef { typedef const T& type; }; // NOLINT template <typename T> struct ByRef<T&> { typedef T& type; }; // NOLINT // A handy wrapper for ByRef. #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type // AddRef<T>::type is T if T is a reference; otherwise it's T&. This // is the same as tr1::add_reference<T>::type. template <typename T> struct AddRef { typedef T& type; }; // NOLINT template <typename T> struct AddRef<T&> { typedef T& type; }; // NOLINT // A handy wrapper for AddRef. #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type // A helper for implementing get<k>(). template <int k> class Get; // A helper for implementing tuple_element<k, T>. kIndexValid is true // iff k < the number of fields in tuple type T. template <bool kIndexValid, int kIndex, class Tuple> struct TupleElement; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; }; template <GTEST_10_TYPENAMES_(T)> struct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; }; } // namespace gtest_internal template <> class tuple<> { public: tuple() {} tuple(const tuple& /* t */) {} tuple& operator=(const tuple& /* t */) { return *this; } }; template <GTEST_1_TYPENAMES_(T)> class GTEST_1_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_() {} explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {} tuple(const tuple& t) : f0_(t.f0_) {} template <GTEST_1_TYPENAMES_(U)> tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_1_TYPENAMES_(U)> tuple& operator=(const GTEST_1_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_1_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) { f0_ = t.f0_; return *this; } T0 f0_; }; template <GTEST_2_TYPENAMES_(T)> class GTEST_2_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0), f1_(f1) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {} template <GTEST_2_TYPENAMES_(U)> tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {} template <typename U0, typename U1> tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_2_TYPENAMES_(U)> tuple& operator=(const GTEST_2_TUPLE_(U)& t) { return CopyFrom(t); } template <typename U0, typename U1> tuple& operator=(const ::std::pair<U0, U1>& p) { f0_ = p.first; f1_ = p.second; return *this; } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_2_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; return *this; } T0 f0_; T1 f1_; }; template <GTEST_3_TYPENAMES_(T)> class GTEST_3_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} template <GTEST_3_TYPENAMES_(U)> tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_3_TYPENAMES_(U)> tuple& operator=(const GTEST_3_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_3_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; return *this; } T0 f0_; T1 f1_; T2 f2_; }; template <GTEST_4_TYPENAMES_(T)> class GTEST_4_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2), f3_(f3) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} template <GTEST_4_TYPENAMES_(U)> tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_4_TYPENAMES_(U)> tuple& operator=(const GTEST_4_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_4_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; }; template <GTEST_5_TYPENAMES_(T)> class GTEST_5_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} template <GTEST_5_TYPENAMES_(U)> tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_5_TYPENAMES_(U)> tuple& operator=(const GTEST_5_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_5_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; }; template <GTEST_6_TYPENAMES_(T)> class GTEST_6_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} template <GTEST_6_TYPENAMES_(U)> tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_6_TYPENAMES_(U)> tuple& operator=(const GTEST_6_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_6_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; }; template <GTEST_7_TYPENAMES_(T)> class GTEST_7_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} template <GTEST_7_TYPENAMES_(U)> tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_7_TYPENAMES_(U)> tuple& operator=(const GTEST_7_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_7_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; }; template <GTEST_8_TYPENAMES_(T)> class GTEST_8_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} template <GTEST_8_TYPENAMES_(U)> tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_8_TYPENAMES_(U)> tuple& operator=(const GTEST_8_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_8_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; }; template <GTEST_9_TYPENAMES_(T)> class GTEST_9_TUPLE_(T) { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} template <GTEST_9_TYPENAMES_(U)> tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_9_TYPENAMES_(U)> tuple& operator=(const GTEST_9_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_9_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; }; template <GTEST_10_TYPENAMES_(T)> class tuple { public: template <int k> friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(), f9_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} template <GTEST_10_TYPENAMES_(U)> tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template <GTEST_10_TYPENAMES_(U)> tuple& operator=(const GTEST_10_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template <GTEST_10_TYPENAMES_(U)> tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; f9_ = t.f9_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; T9 f9_; }; // 6.1.3.2 Tuple creation functions. // Known limitations: we don't support passing an // std::tr1::reference_wrapper<T> to make_tuple(). And we don't // implement tie(). inline tuple<> make_tuple() { return tuple<>(); } template <GTEST_1_TYPENAMES_(T)> inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) { return GTEST_1_TUPLE_(T)(f0); } template <GTEST_2_TYPENAMES_(T)> inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) { return GTEST_2_TUPLE_(T)(f0, f1); } template <GTEST_3_TYPENAMES_(T)> inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) { return GTEST_3_TUPLE_(T)(f0, f1, f2); } template <GTEST_4_TYPENAMES_(T)> inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3) { return GTEST_4_TUPLE_(T)(f0, f1, f2, f3); } template <GTEST_5_TYPENAMES_(T)> inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4) { return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4); } template <GTEST_6_TYPENAMES_(T)> inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5) { return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5); } template <GTEST_7_TYPENAMES_(T)> inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6) { return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6); } template <GTEST_8_TYPENAMES_(T)> inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) { return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7); } template <GTEST_9_TYPENAMES_(T)> inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8) { return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8); } template <GTEST_10_TYPENAMES_(T)> inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8, const T9& f9) { return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); } // 6.1.3.3 Tuple helper classes. template <typename Tuple> struct tuple_size; template <GTEST_0_TYPENAMES_(T)> struct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; }; template <GTEST_1_TYPENAMES_(T)> struct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; }; template <GTEST_2_TYPENAMES_(T)> struct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; }; template <GTEST_3_TYPENAMES_(T)> struct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; }; template <GTEST_4_TYPENAMES_(T)> struct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; }; template <GTEST_5_TYPENAMES_(T)> struct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; }; template <GTEST_6_TYPENAMES_(T)> struct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; }; template <GTEST_7_TYPENAMES_(T)> struct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; }; template <GTEST_8_TYPENAMES_(T)> struct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; }; template <GTEST_9_TYPENAMES_(T)> struct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; }; template <GTEST_10_TYPENAMES_(T)> struct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; }; template <int k, class Tuple> struct tuple_element { typedef typename gtest_internal::TupleElement< k < (tuple_size<Tuple>::value), k, Tuple>::type type; }; #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type // 6.1.3.4 Element access. namespace gtest_internal { template <> class Get<0> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) Field(Tuple& t) { return t.f0_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) ConstField(const Tuple& t) { return t.f0_; } }; template <> class Get<1> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) Field(Tuple& t) { return t.f1_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) ConstField(const Tuple& t) { return t.f1_; } }; template <> class Get<2> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) Field(Tuple& t) { return t.f2_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) ConstField(const Tuple& t) { return t.f2_; } }; template <> class Get<3> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) Field(Tuple& t) { return t.f3_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) ConstField(const Tuple& t) { return t.f3_; } }; template <> class Get<4> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) Field(Tuple& t) { return t.f4_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) ConstField(const Tuple& t) { return t.f4_; } }; template <> class Get<5> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) Field(Tuple& t) { return t.f5_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) ConstField(const Tuple& t) { return t.f5_; } }; template <> class Get<6> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) Field(Tuple& t) { return t.f6_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) ConstField(const Tuple& t) { return t.f6_; } }; template <> class Get<7> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) Field(Tuple& t) { return t.f7_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) ConstField(const Tuple& t) { return t.f7_; } }; template <> class Get<8> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) Field(Tuple& t) { return t.f8_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) ConstField(const Tuple& t) { return t.f8_; } }; template <> class Get<9> { public: template <class Tuple> static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) Field(Tuple& t) { return t.f9_; } // NOLINT template <class Tuple> static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) ConstField(const Tuple& t) { return t.f9_; } }; } // namespace gtest_internal template <int k, GTEST_10_TYPENAMES_(T)> GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get<k>::Field(t); } template <int k, GTEST_10_TYPENAMES_(T)> GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(const GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get<k>::ConstField(t); } // 6.1.3.5 Relational operators // We only implement == and !=, as we don't have a need for the rest yet. namespace gtest_internal { // SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the // first k fields of t1 equals the first k fields of t2. // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if // k1 != k2. template <int kSize1, int kSize2> struct SameSizeTuplePrefixComparator; template <> struct SameSizeTuplePrefixComparator<0, 0> { template <class Tuple1, class Tuple2> static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { return true; } }; template <int k> struct SameSizeTuplePrefixComparator<k, k> { template <class Tuple1, class Tuple2> static bool Eq(const Tuple1& t1, const Tuple2& t2) { return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) && ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2); } }; } // namespace gtest_internal template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)> inline bool operator==(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return gtest_internal::SameSizeTuplePrefixComparator< tuple_size<GTEST_10_TUPLE_(T)>::value, tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u); } template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)> inline bool operator!=(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return !(t == u); } // 6.1.4 Pairs. // Unimplemented. } // namespace tr1 } // namespace std #undef GTEST_0_TUPLE_ #undef GTEST_1_TUPLE_ #undef GTEST_2_TUPLE_ #undef GTEST_3_TUPLE_ #undef GTEST_4_TUPLE_ #undef GTEST_5_TUPLE_ #undef GTEST_6_TUPLE_ #undef GTEST_7_TUPLE_ #undef GTEST_8_TUPLE_ #undef GTEST_9_TUPLE_ #undef GTEST_10_TUPLE_ #undef GTEST_0_TYPENAMES_ #undef GTEST_1_TYPENAMES_ #undef GTEST_2_TYPENAMES_ #undef GTEST_3_TYPENAMES_ #undef GTEST_4_TYPENAMES_ #undef GTEST_5_TYPENAMES_ #undef GTEST_6_TYPENAMES_ #undef GTEST_7_TYPENAMES_ #undef GTEST_8_TYPENAMES_ #undef GTEST_9_TYPENAMES_ #undef GTEST_10_TYPENAMES_ #undef GTEST_DECLARE_TUPLE_AS_FRIEND_ #undef GTEST_BY_REF_ #undef GTEST_ADD_REF_ #undef GTEST_TUPLE_ELEMENT_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ # elif GTEST_OS_SYMBIAN // On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to // use STLport's tuple implementation, which unfortunately doesn't // work as the copy of STLport distributed with Symbian is incomplete. // By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to // use its own tuple implementation. # ifdef BOOST_HAS_TR1_TUPLE # undef BOOST_HAS_TR1_TUPLE # endif // BOOST_HAS_TR1_TUPLE // This prevents <boost/tr1/detail/config.hpp>, which defines // BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>. # define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED # include <tuple> # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) // GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does // not conform to the TR1 spec, which requires the header to be <tuple>. # if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 // Until version 4.3.2, gcc has a bug that causes <tr1/functional>, // which is #included by <tr1/tuple>, to not compile when RTTI is // disabled. _TR1_FUNCTIONAL is the header guard for // <tr1/functional>. Hence the following #define is a hack to prevent // <tr1/functional> from being included. # define _TR1_FUNCTIONAL 1 # include <tr1/tuple> # undef _TR1_FUNCTIONAL // Allows the user to #include // <tr1/functional> if he chooses to. # else # include <tr1/tuple> // NOLINT # endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 # else // If the compiler is not GCC 4.0+, we assume the user is using a // spec-conforming TR1 implementation. # include <tuple> // NOLINT # endif // GTEST_USE_OWN_TR1_TUPLE #endif // GTEST_HAS_TR1_TUPLE // Determines whether clone(2) is supported. // Usually it will only be available on Linux, excluding // Linux on the Itanium architecture. // Also see http://linux.die.net/man/2/clone. #ifndef GTEST_HAS_CLONE // The user didn't tell us, so we need to figure it out. # if GTEST_OS_LINUX && !defined(__ia64__) # define GTEST_HAS_CLONE 1 # else # define GTEST_HAS_CLONE 0 # endif // GTEST_OS_LINUX && !defined(__ia64__) #endif // GTEST_HAS_CLONE // Determines whether to support stream redirection. This is used to test // output correctness and to implement death tests. #ifndef GTEST_HAS_STREAM_REDIRECTION // By default, we assume that stream redirection is supported on all // platforms except known mobile ones. # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN # define GTEST_HAS_STREAM_REDIRECTION 0 # else # define GTEST_HAS_STREAM_REDIRECTION 1 # endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN #endif // GTEST_HAS_STREAM_REDIRECTION // Determines whether to support death tests. // Google Test does not support death tests for VC 7.1 and earlier as // abort() in a VC 7.1 application compiled as GUI in debug config // pops up a dialog window that cannot be suppressed programmatically. #if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \ GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX) # define GTEST_HAS_DEATH_TEST 1 # include <vector> // NOLINT #endif // We don't support MSVC 7.1 with exceptions disabled now. Therefore // all the compilers we care about are adequate for supporting // value-parameterized tests. #define GTEST_HAS_PARAM_TEST 1 // Determines whether to support type-driven tests. // Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0, // Sun Pro CC, IBM Visual Age, and HP aCC support. #if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \ defined(__IBMCPP__) || defined(__HP_aCC) # define GTEST_HAS_TYPED_TEST 1 # define GTEST_HAS_TYPED_TEST_P 1 #endif // Determines whether to support Combine(). This only makes sense when // value-parameterized tests are enabled. The implementation doesn't // work on Sun Studio since it doesn't understand templated conversion // operators. #if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC) # define GTEST_HAS_COMBINE 1 #endif // Determines whether the system compiler uses UTF-16 for encoding wide strings. #define GTEST_WIDE_STRING_USES_UTF16_ \ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX) // Determines whether test results can be streamed to a socket. #if GTEST_OS_LINUX # define GTEST_CAN_STREAM_RESULTS_ 1 #endif // Defines some utility macros. // The GNU compiler emits a warning if nested "if" statements are followed by // an "else" statement and braces are not used to explicitly disambiguate the // "else" binding. This leads to problems with code like: // // if (gate) // ASSERT_*(condition) << "Some message"; // // The "switch (0) case 0:" idiom is used to suppress this. #ifdef __INTEL_COMPILER # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ #else # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT #endif // Use this annotation at the end of a struct/class definition to // prevent the compiler from optimizing away instances that are never // used. This is useful when all interesting logic happens inside the // c'tor and / or d'tor. Example: // // struct Foo { // Foo() { ... } // } GTEST_ATTRIBUTE_UNUSED_; // // Also use it after a variable or parameter declaration to tell the // compiler the variable/parameter does not have to be used. #if defined(__GNUC__) && !defined(COMPILER_ICC) # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) #else # define GTEST_ATTRIBUTE_UNUSED_ #endif // A macro to disallow operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_ASSIGN_(type)\ void operator=(type const &) // A macro to disallow copy constructor and operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ type(type const &);\ GTEST_DISALLOW_ASSIGN_(type) // Tell the compiler to warn about unused return values for functions declared // with this macro. The macro should be used on function declarations // following the argument list: // // Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; #if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) #else # define GTEST_MUST_USE_RESULT_ #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC // Determine whether the compiler supports Microsoft's Structured Exception // Handling. This is supported by several Windows compilers but generally // does not exist on any other system. #ifndef GTEST_HAS_SEH // The user didn't tell us, so we need to figure it out. # if defined(_MSC_VER) || defined(__BORLANDC__) // These two compilers are known to support SEH. # define GTEST_HAS_SEH 1 # else // Assume no SEH. # define GTEST_HAS_SEH 0 # endif #endif // GTEST_HAS_SEH #ifdef _MSC_VER # if GTEST_LINKED_AS_SHARED_LIBRARY # define GTEST_API_ __declspec(dllimport) # elif GTEST_CREATE_SHARED_LIBRARY # define GTEST_API_ __declspec(dllexport) # endif #endif // _MSC_VER #ifndef GTEST_API_ # define GTEST_API_ #endif #ifdef __GNUC__ // Ask the compiler to never inline a given function. # define GTEST_NO_INLINE_ __attribute__((noinline)) #else # define GTEST_NO_INLINE_ #endif namespace testing { class Message; namespace internal { class String; // The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time // expression is true. For example, you could use it to verify the // size of a static array: // // GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, // content_type_names_incorrect_size); // // or to make sure a struct is smaller than a certain size: // // GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large); // // The second argument to the macro is the name of the variable. If // the expression is false, most compilers will issue a warning/error // containing the name of the variable. template <bool> struct CompileAssert { }; #define GTEST_COMPILE_ASSERT_(expr, msg) \ typedef ::testing::internal::CompileAssert<(bool(expr))> \ msg[bool(expr) ? 1 : -1] // Implementation details of GTEST_COMPILE_ASSERT_: // // - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1 // elements (and thus is invalid) when the expression is false. // // - The simpler definition // // #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1] // // does not work, as gcc supports variable-length arrays whose sizes // are determined at run-time (this is gcc's extension and not part // of the C++ standard). As a result, gcc fails to reject the // following code with the simple definition: // // int foo; // GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is // // not a compile-time constant. // // - By using the type CompileAssert<(bool(expr))>, we ensures that // expr is a compile-time constant. (Template arguments must be // determined at compile-time.) // // - The outter parentheses in CompileAssert<(bool(expr))> are necessary // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written // // CompileAssert<bool(expr)> // // instead, these compilers will refuse to compile // // GTEST_COMPILE_ASSERT_(5 > 0, some_message); // // (They seem to think the ">" in "5 > 0" marks the end of the // template argument list.) // // - The array size is (bool(expr) ? 1 : -1), instead of simply // // ((expr) ? 1 : -1). // // This is to avoid running into a bug in MS VC 7.1, which // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. // StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h. // // This template is declared, but intentionally undefined. template <typename T1, typename T2> struct StaticAssertTypeEqHelper; template <typename T> struct StaticAssertTypeEqHelper<T, T> {}; #if GTEST_HAS_GLOBAL_STRING typedef ::string string; #else typedef ::std::string string; #endif // GTEST_HAS_GLOBAL_STRING #if GTEST_HAS_GLOBAL_WSTRING typedef ::wstring wstring; #elif GTEST_HAS_STD_WSTRING typedef ::std::wstring wstring; #endif // GTEST_HAS_GLOBAL_WSTRING // A helper for suppressing warnings on constant condition. It just // returns 'condition'. GTEST_API_ bool IsTrue(bool condition); // Defines scoped_ptr. // This implementation of scoped_ptr is PARTIAL - it only contains // enough stuff to satisfy Google Test's need. template <typename T> class scoped_ptr { public: typedef T element_type; explicit scoped_ptr(T* p = NULL) : ptr_(p) {} ~scoped_ptr() { reset(); } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } T* get() const { return ptr_; } T* release() { T* const ptr = ptr_; ptr_ = NULL; return ptr; } void reset(T* p = NULL) { if (p != ptr_) { if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type. delete ptr_; } ptr_ = p; } } private: T* ptr_; GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr); }; // Defines RE. // A simple C++ wrapper for <regex.h>. It uses the POSIX Extended // Regular Expression syntax. class GTEST_API_ RE { public: // A copy constructor is required by the Standard to initialize object // references from r-values. RE(const RE& other) { Init(other.pattern()); } // Constructs an RE from a string. RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT #if GTEST_HAS_GLOBAL_STRING RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT #endif // GTEST_HAS_GLOBAL_STRING RE(const char* regex) { Init(regex); } // NOLINT ~RE(); // Returns the string representation of the regex. const char* pattern() const { return pattern_; } // FullMatch(str, re) returns true iff regular expression re matches // the entire str. // PartialMatch(str, re) returns true iff regular expression re // matches a substring of str (including str itself). // // TODO(wan@google.com): make FullMatch() and PartialMatch() work // when str contains NUL characters. static bool FullMatch(const ::std::string& str, const RE& re) { return FullMatch(str.c_str(), re); } static bool PartialMatch(const ::std::string& str, const RE& re) { return PartialMatch(str.c_str(), re); } #if GTEST_HAS_GLOBAL_STRING static bool FullMatch(const ::string& str, const RE& re) { return FullMatch(str.c_str(), re); } static bool PartialMatch(const ::string& str, const RE& re) { return PartialMatch(str.c_str(), re); } #endif // GTEST_HAS_GLOBAL_STRING static bool FullMatch(const char* str, const RE& re); static bool PartialMatch(const char* str, const RE& re); private: void Init(const char* regex); // We use a const char* instead of a string, as Google Test may be used // where string is not available. We also do not use Google Test's own // String type here, in order to simplify dependencies between the // files. const char* pattern_; bool is_valid_; #if GTEST_USES_POSIX_RE regex_t full_regex_; // For FullMatch(). regex_t partial_regex_; // For PartialMatch(). #else // GTEST_USES_SIMPLE_RE const char* full_pattern_; // For FullMatch(); #endif GTEST_DISALLOW_ASSIGN_(RE); }; // Formats a source file path and a line number as they would appear // in an error message from the compiler used to compile this code. GTEST_API_ ::std::string FormatFileLocation(const char* file, int line); // Formats a file location for compiler-independent XML output. // Although this function is not platform dependent, we put it next to // FormatFileLocation in order to contrast the two functions. GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file, int line); // Defines logging utilities: // GTEST_LOG_(severity) - logs messages at the specified severity level. The // message itself is streamed into the macro. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. enum GTestLogSeverity { GTEST_INFO, GTEST_WARNING, GTEST_ERROR, GTEST_FATAL }; // Formats log entry severity, provides a stream object for streaming the // log message, and terminates the message with a newline when going out of // scope. class GTEST_API_ GTestLog { public: GTestLog(GTestLogSeverity severity, const char* file, int line); // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. ~GTestLog(); ::std::ostream& GetStream() { return ::std::cerr; } private: const GTestLogSeverity severity_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); }; #define GTEST_LOG_(severity) \ ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ __FILE__, __LINE__).GetStream() inline void LogToStderr() {} inline void FlushInfoLog() { fflush(NULL); } // INTERNAL IMPLEMENTATION - DO NOT USE. // // GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition // is not satisfied. // Synopsys: // GTEST_CHECK_(boolean_condition); // or // GTEST_CHECK_(boolean_condition) << "Additional message"; // // This checks the condition and if the condition is not satisfied // it prints message about the condition violation, including the // condition itself, plus additional message streamed into it, if any, // and then it aborts the program. It aborts the program irrespective of // whether it is built in the debug mode or not. #define GTEST_CHECK_(condition) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::IsTrue(condition)) \ ; \ else \ GTEST_LOG_(FATAL) << "Condition " #condition " failed. " // An all-mode assert to verify that the given POSIX-style function // call returns 0 (indicating success). Known limitation: this // doesn't expand to a balanced 'if' statement, so enclose the macro // in {} if you need to use it as the only statement in an 'if' // branch. #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ if (const int gtest_error = (posix_call)) \ GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ << gtest_error // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Use ImplicitCast_ as a safe version of static_cast for upcasting in // the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a // const Foo*). When you use ImplicitCast_, the compiler checks that // the cast is safe. Such explicit ImplicitCast_s are necessary in // surprisingly many situations where C++ demands an exact type match // instead of an argument type convertable to a target type. // // The syntax for using ImplicitCast_ is the same as for static_cast: // // ImplicitCast_<ToType>(expr) // // ImplicitCast_ would have been part of the C++ standard library, // but the proposal was submitted too late. It will probably make // its way into the language in the future. // // This relatively ugly name is intentional. It prevents clashes with // similar functions users may have (e.g., implicit_cast). The internal // namespace alone is not enough because the function can be found by ADL. template<typename To> inline To ImplicitCast_(To x) { return x; } // When you upcast (that is, cast a pointer from type Foo to type // SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts // always succeed. When you downcast (that is, cast a pointer from // type Foo to type SubclassOfFoo), static_cast<> isn't safe, because // how do you know the pointer is really of type SubclassOfFoo? It // could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, // when you downcast, you should use this macro. In debug mode, we // use dynamic_cast<> to double-check the downcast is legal (we die // if it's not). In normal mode, we do the efficient static_cast<> // instead. Thus, it's important to test in debug mode to make sure // the cast is legal! // This is the only place in the code we should use dynamic_cast<>. // In particular, you SHOULDN'T be using dynamic_cast<> in order to // do RTTI (eg code like this: // if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo); // if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo); // You should design the code some other way not to need this. // // This relatively ugly name is intentional. It prevents clashes with // similar functions users may have (e.g., down_cast). The internal // namespace alone is not enough because the function can be found by ADL. template<typename To, typename From> // use like this: DownCast_<T*>(foo); inline To DownCast_(From* f) { // so we only accept pointers // Ensures that To is a sub-type of From *. This test is here only // for compile-time type checking, and has no overhead in an // optimized build at run-time, as it will be optimized away // completely. if (false) { const To to = NULL; ::testing::internal::ImplicitCast_<From*>(to); } #if GTEST_HAS_RTTI // RTTI: debug mode only! GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL); #endif return static_cast<To>(f); } // Downcasts the pointer of type Base to Derived. // Derived must be a subclass of Base. The parameter MUST // point to a class of type Derived, not any subclass of it. // When RTTI is available, the function performs a runtime // check to enforce this. template <class Derived, class Base> Derived* CheckedDowncastToActualType(Base* base) { #if GTEST_HAS_RTTI GTEST_CHECK_(typeid(*base) == typeid(Derived)); return dynamic_cast<Derived*>(base); // NOLINT #else return static_cast<Derived*>(base); // Poor man's downcast. #endif } #if GTEST_HAS_STREAM_REDIRECTION // Defines the stderr capturer: // CaptureStdout - starts capturing stdout. // GetCapturedStdout - stops capturing stdout and returns the captured string. // CaptureStderr - starts capturing stderr. // GetCapturedStderr - stops capturing stderr and returns the captured string. // GTEST_API_ void CaptureStdout(); GTEST_API_ String GetCapturedStdout(); GTEST_API_ void CaptureStderr(); GTEST_API_ String GetCapturedStderr(); #endif // GTEST_HAS_STREAM_REDIRECTION #if GTEST_HAS_DEATH_TEST // A copy of all command line arguments. Set by InitGoogleTest(). extern ::std::vector<String> g_argvs; // GTEST_HAS_DEATH_TEST implies we have ::std::string. const ::std::vector<String>& GetArgvs(); #endif // GTEST_HAS_DEATH_TEST // Defines synchronization primitives. #if GTEST_HAS_PTHREAD // Sleeps for (roughly) n milli-seconds. This function is only for // testing Google Test's own constructs. Don't use it in user tests, // either directly or indirectly. inline void SleepMilliseconds(int n) { const timespec time = { 0, // 0 seconds. n * 1000L * 1000L, // And n ms. }; nanosleep(&time, NULL); } // Allows a controller thread to pause execution of newly created // threads until notified. Instances of this class must be created // and destroyed in the controller thread. // // This class is only for testing Google Test's own constructs. Do not // use it in user tests, either directly or indirectly. class Notification { public: Notification() : notified_(false) {} // Notifies all threads created with this notification to start. Must // be called from the controller thread. void Notify() { notified_ = true; } // Blocks until the controller thread notifies. Must be called from a test // thread. void WaitForNotification() { while(!notified_) { SleepMilliseconds(10); } } private: volatile bool notified_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); }; // As a C-function, ThreadFuncWithCLinkage cannot be templated itself. // Consequently, it cannot select a correct instantiation of ThreadWithParam // in order to call its Run(). Introducing ThreadWithParamBase as a // non-templated base class for ThreadWithParam allows us to bypass this // problem. class ThreadWithParamBase { public: virtual ~ThreadWithParamBase() {} virtual void Run() = 0; }; // pthread_create() accepts a pointer to a function type with the C linkage. // According to the Standard (7.5/1), function types with different linkages // are different even if they are otherwise identical. Some compilers (for // example, SunStudio) treat them as different types. Since class methods // cannot be defined with C-linkage we need to define a free C-function to // pass into pthread_create(). extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { static_cast<ThreadWithParamBase*>(thread)->Run(); return NULL; } // Helper class for testing Google Test's multi-threading constructs. // To use it, write: // // void ThreadFunc(int param) { /* Do things with param */ } // Notification thread_can_start; // ... // // The thread_can_start parameter is optional; you can supply NULL. // ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start); // thread_can_start.Notify(); // // These classes are only for testing Google Test's own constructs. Do // not use them in user tests, either directly or indirectly. template <typename T> class ThreadWithParam : public ThreadWithParamBase { public: typedef void (*UserThreadFunc)(T); ThreadWithParam( UserThreadFunc func, T param, Notification* thread_can_start) : func_(func), param_(param), thread_can_start_(thread_can_start), finished_(false) { ThreadWithParamBase* const base = this; // The thread can be created only after all fields except thread_ // have been initialized. GTEST_CHECK_POSIX_SUCCESS_( pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base)); } ~ThreadWithParam() { Join(); } void Join() { if (!finished_) { GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0)); finished_ = true; } } virtual void Run() { if (thread_can_start_ != NULL) thread_can_start_->WaitForNotification(); func_(param_); } private: const UserThreadFunc func_; // User-supplied thread function. const T param_; // User-supplied parameter to the thread function. // When non-NULL, used to block execution until the controller thread // notifies. Notification* const thread_can_start_; bool finished_; // true iff we know that the thread function has finished. pthread_t thread_; // The native thread object. GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); }; // MutexBase and Mutex implement mutex on pthreads-based platforms. They // are used in conjunction with class MutexLock: // // Mutex mutex; // ... // MutexLock lock(&mutex); // Acquires the mutex and releases it at the end // // of the current scope. // // MutexBase implements behavior for both statically and dynamically // allocated mutexes. Do not use MutexBase directly. Instead, write // the following to define a static mutex: // // GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); // // You can forward declare a static mutex like this: // // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); // // To create a dynamic mutex, just define an object of type Mutex. class MutexBase { public: // Acquires this mutex. void Lock() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); owner_ = pthread_self(); } // Releases this mutex. void Unlock() { // We don't protect writing to owner_ here, as it's the caller's // responsibility to ensure that the current thread holds the // mutex when this is called. owner_ = 0; GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); } // Does nothing if the current thread holds the mutex. Otherwise, crashes // with high probability. void AssertHeld() const { GTEST_CHECK_(owner_ == pthread_self()) << "The current thread is not holding the mutex @" << this; } // A static mutex may be used before main() is entered. It may even // be used before the dynamic initialization stage. Therefore we // must be able to initialize a static mutex object at link time. // This means MutexBase has to be a POD and its member variables // have to be public. public: pthread_mutex_t mutex_; // The underlying pthread mutex. pthread_t owner_; // The thread holding the mutex; 0 means no one holds it. }; // Forward-declares a static mutex. # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::MutexBase mutex // Defines and statically (i.e. at link time) initializes a static mutex. # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 } // The Mutex class can only be used for mutexes created at runtime. It // shares its API with MutexBase otherwise. class Mutex : public MutexBase { public: Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); owner_ = 0; } ~Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); }; // We cannot name this class MutexLock as the ctor declaration would // conflict with a macro named MutexLock, which is defined on some // platforms. Hence the typedef trick below. class GTestMutexLock { public: explicit GTestMutexLock(MutexBase* mutex) : mutex_(mutex) { mutex_->Lock(); } ~GTestMutexLock() { mutex_->Unlock(); } private: MutexBase* const mutex_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); }; typedef GTestMutexLock MutexLock; // Helpers for ThreadLocal. // pthread_key_create() requires DeleteThreadLocalValue() to have // C-linkage. Therefore it cannot be templatized to access // ThreadLocal<T>. Hence the need for class // ThreadLocalValueHolderBase. class ThreadLocalValueHolderBase { public: virtual ~ThreadLocalValueHolderBase() {} }; // Called by pthread to delete thread-local data stored by // pthread_setspecific(). extern "C" inline void DeleteThreadLocalValue(void* value_holder) { delete static_cast<ThreadLocalValueHolderBase*>(value_holder); } // Implements thread-local storage on pthreads-based systems. // // // Thread 1 // ThreadLocal<int> tl(100); // 100 is the default value for each thread. // // // Thread 2 // tl.set(150); // Changes the value for thread 2 only. // EXPECT_EQ(150, tl.get()); // // // Thread 1 // EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. // tl.set(200); // EXPECT_EQ(200, tl.get()); // // The template type argument T must have a public copy constructor. // In addition, the default ThreadLocal constructor requires T to have // a public default constructor. // // An object managed for a thread by a ThreadLocal instance is deleted // when the thread exits. Or, if the ThreadLocal instance dies in // that thread, when the ThreadLocal dies. It's the user's // responsibility to ensure that all other threads using a ThreadLocal // have exited when it dies, or the per-thread objects for those // threads will not be deleted. // // Google Test only uses global ThreadLocal objects. That means they // will die after main() has returned. Therefore, no per-thread // object managed by Google Test will be leaked as long as all threads // using Google Test have exited when main() returns. template <typename T> class ThreadLocal { public: ThreadLocal() : key_(CreateKey()), default_() {} explicit ThreadLocal(const T& value) : key_(CreateKey()), default_(value) {} ~ThreadLocal() { // Destroys the managed object for the current thread, if any. DeleteThreadLocalValue(pthread_getspecific(key_)); // Releases resources associated with the key. This will *not* // delete managed objects for other threads. GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); } T* pointer() { return GetOrCreateValue(); } const T* pointer() const { return GetOrCreateValue(); } const T& get() const { return *pointer(); } void set(const T& value) { *pointer() = value; } private: // Holds a value of type T. class ValueHolder : public ThreadLocalValueHolderBase { public: explicit ValueHolder(const T& value) : value_(value) {} T* pointer() { return &value_; } private: T value_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); }; static pthread_key_t CreateKey() { pthread_key_t key; // When a thread exits, DeleteThreadLocalValue() will be called on // the object managed for that thread. GTEST_CHECK_POSIX_SUCCESS_( pthread_key_create(&key, &DeleteThreadLocalValue)); return key; } T* GetOrCreateValue() const { ThreadLocalValueHolderBase* const holder = static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_)); if (holder != NULL) { return CheckedDowncastToActualType<ValueHolder>(holder)->pointer(); } ValueHolder* const new_holder = new ValueHolder(default_); ThreadLocalValueHolderBase* const holder_base = new_holder; GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); return new_holder->pointer(); } // A key pthreads uses for looking up per-thread values. const pthread_key_t key_; const T default_; // The default value for each thread. GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); }; # define GTEST_IS_THREADSAFE 1 #else // GTEST_HAS_PTHREAD // A dummy implementation of synchronization primitives (mutex, lock, // and thread-local variable). Necessary for compiling Google Test where // mutex is not supported - using Google Test in multiple threads is not // supported on such platforms. class Mutex { public: Mutex() {} void AssertHeld() const {} }; # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::Mutex mutex # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex class GTestMutexLock { public: explicit GTestMutexLock(Mutex*) {} // NOLINT }; typedef GTestMutexLock MutexLock; template <typename T> class ThreadLocal { public: ThreadLocal() : value_() {} explicit ThreadLocal(const T& value) : value_(value) {} T* pointer() { return &value_; } const T* pointer() const { return &value_; } const T& get() const { return value_; } void set(const T& value) { value_ = value; } private: T value_; }; // The above synchronization primitives have dummy implementations. // Therefore Google Test is not thread-safe. # define GTEST_IS_THREADSAFE 0 #endif // GTEST_HAS_PTHREAD // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. GTEST_API_ size_t GetThreadCount(); // Passing non-POD classes through ellipsis (...) crashes the ARM // compiler and generates a warning in Sun Studio. The Nokia Symbian // and the IBM XL C/C++ compiler try to instantiate a copy constructor // for objects passed through ellipsis (...), failing for uncopyable // objects. We define this to ensure that only POD is passed through // ellipsis on these systems. #if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC) // We lose support for NULL detection where the compiler doesn't like // passing non-POD classes through ellipsis (...). # define GTEST_ELLIPSIS_NEEDS_POD_ 1 #else # define GTEST_CAN_COMPARE_NULL 1 #endif // The Nokia Symbian and IBM XL C/C++ compilers cannot decide between // const T& and const T* in a function template. These compilers // _can_ decide between class template specializations for T and T*, // so a tr1::type_traits-like is_pointer works. #if defined(__SYMBIAN32__) || defined(__IBMCPP__) # define GTEST_NEEDS_IS_POINTER_ 1 #endif template <bool bool_value> struct bool_constant { typedef bool_constant<bool_value> type; static const bool value = bool_value; }; template <bool bool_value> const bool bool_constant<bool_value>::value; typedef bool_constant<false> false_type; typedef bool_constant<true> true_type; template <typename T> struct is_pointer : public false_type {}; template <typename T> struct is_pointer<T*> : public true_type {}; template <typename Iterator> struct IteratorTraits { typedef typename Iterator::value_type value_type; }; template <typename T> struct IteratorTraits<T*> { typedef T value_type; }; template <typename T> struct IteratorTraits<const T*> { typedef T value_type; }; #if GTEST_OS_WINDOWS # define GTEST_PATH_SEP_ "\\" # define GTEST_HAS_ALT_PATH_SEP_ 1 // The biggest signed integer type the compiler supports. typedef __int64 BiggestInt; #else # define GTEST_PATH_SEP_ "/" # define GTEST_HAS_ALT_PATH_SEP_ 0 typedef long long BiggestInt; // NOLINT #endif // GTEST_OS_WINDOWS // Utilities for char. // isspace(int ch) and friends accept an unsigned char or EOF. char // may be signed, depending on the compiler (or compiler flags). // Therefore we need to cast a char to unsigned char before calling // isspace(), etc. inline bool IsAlpha(char ch) { return isalpha(static_cast<unsigned char>(ch)) != 0; } inline bool IsAlNum(char ch) { return isalnum(static_cast<unsigned char>(ch)) != 0; } inline bool IsDigit(char ch) { return isdigit(static_cast<unsigned char>(ch)) != 0; } inline bool IsLower(char ch) { return islower(static_cast<unsigned char>(ch)) != 0; } inline bool IsSpace(char ch) { return isspace(static_cast<unsigned char>(ch)) != 0; } inline bool IsUpper(char ch) { return isupper(static_cast<unsigned char>(ch)) != 0; } inline bool IsXDigit(char ch) { return isxdigit(static_cast<unsigned char>(ch)) != 0; } inline char ToLower(char ch) { return static_cast<char>(tolower(static_cast<unsigned char>(ch))); } inline char ToUpper(char ch) { return static_cast<char>(toupper(static_cast<unsigned char>(ch))); } // The testing::internal::posix namespace holds wrappers for common // POSIX functions. These wrappers hide the differences between // Windows/MSVC and POSIX systems. Since some compilers define these // standard functions as macros, the wrapper cannot have the same name // as the wrapped function. namespace posix { // Functions with a different name on Windows. #if GTEST_OS_WINDOWS typedef struct _stat StatStruct; # ifdef __BORLANDC__ inline int IsATTY(int fd) { return isatty(fd); } inline int StrCaseCmp(const char* s1, const char* s2) { return stricmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } # else // !__BORLANDC__ # if GTEST_OS_WINDOWS_MOBILE inline int IsATTY(int /* fd */) { return 0; } # else inline int IsATTY(int fd) { return _isatty(fd); } # endif // GTEST_OS_WINDOWS_MOBILE inline int StrCaseCmp(const char* s1, const char* s2) { return _stricmp(s1, s2); } inline char* StrDup(const char* src) { return _strdup(src); } # endif // __BORLANDC__ # if GTEST_OS_WINDOWS_MOBILE inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); } // Stat(), RmDir(), and IsDir() are not needed on Windows CE at this // time and thus not defined there. # else inline int FileNo(FILE* file) { return _fileno(file); } inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } inline int RmDir(const char* dir) { return _rmdir(dir); } inline bool IsDir(const StatStruct& st) { return (_S_IFDIR & st.st_mode) != 0; } # endif // GTEST_OS_WINDOWS_MOBILE #else typedef struct stat StatStruct; inline int FileNo(FILE* file) { return fileno(file); } inline int IsATTY(int fd) { return isatty(fd); } inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } inline int StrCaseCmp(const char* s1, const char* s2) { return strcasecmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } inline int RmDir(const char* dir) { return rmdir(dir); } inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } #endif // GTEST_OS_WINDOWS // Functions deprecated by MSVC 8.0. #ifdef _MSC_VER // Temporarily disable warning 4996 (deprecated function). # pragma warning(push) # pragma warning(disable:4996) #endif inline const char* StrNCpy(char* dest, const char* src, size_t n) { return strncpy(dest, src, n); } // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and // StrError() aren't needed on Windows CE at this time and thus not // defined there. #if !GTEST_OS_WINDOWS_MOBILE inline int ChDir(const char* dir) { return chdir(dir); } #endif inline FILE* FOpen(const char* path, const char* mode) { return fopen(path, mode); } #if !GTEST_OS_WINDOWS_MOBILE inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { return freopen(path, mode, stream); } inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } #endif inline int FClose(FILE* fp) { return fclose(fp); } #if !GTEST_OS_WINDOWS_MOBILE inline int Read(int fd, void* buf, unsigned int count) { return static_cast<int>(read(fd, buf, count)); } inline int Write(int fd, const void* buf, unsigned int count) { return static_cast<int>(write(fd, buf, count)); } inline int Close(int fd) { return close(fd); } inline const char* StrError(int errnum) { return strerror(errnum); } #endif inline const char* GetEnv(const char* name) { #if GTEST_OS_WINDOWS_MOBILE // We are on Windows CE, which has no environment variables. return NULL; #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) // Environment variables which we programmatically clear will be set to the // empty string rather than unset (NULL). Handle that case. const char* const env = getenv(name); return (env != NULL && env[0] != '\0') ? env : NULL; #else return getenv(name); #endif } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif #if GTEST_OS_WINDOWS_MOBILE // Windows CE has no C library. The abort() function is used in // several places in Google Test. This implementation provides a reasonable // imitation of standard behaviour. void Abort(); #else inline void Abort() { abort(); } #endif // GTEST_OS_WINDOWS_MOBILE } // namespace posix // The maximum number a BiggestInt can represent. This definition // works no matter BiggestInt is represented in one's complement or // two's complement. // // We cannot rely on numeric_limits in STL, as __int64 and long long // are not part of standard C++ and numeric_limits doesn't need to be // defined for them. const BiggestInt kMaxBiggestInt = ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1)); // This template class serves as a compile-time function from size to // type. It maps a size in bytes to a primitive type with that // size. e.g. // // TypeWithSize<4>::UInt // // is typedef-ed to be unsigned int (unsigned integer made up of 4 // bytes). // // Such functionality should belong to STL, but I cannot find it // there. // // Google Test uses this class in the implementation of floating-point // comparison. // // For now it only handles UInt (unsigned int) as that's all Google Test // needs. Other types can be easily added in the future if need // arises. template <size_t size> class TypeWithSize { public: // This prevents the user from using TypeWithSize<N> with incorrect // values of N. typedef void UInt; }; // The specialization for size 4. template <> class TypeWithSize<4> { public: // unsigned int has size 4 in both gcc and MSVC. // // As base/basictypes.h doesn't compile on Windows, we cannot use // uint32, uint64, and etc here. typedef int Int; typedef unsigned int UInt; }; // The specialization for size 8. template <> class TypeWithSize<8> { public: #if GTEST_OS_WINDOWS typedef __int64 Int; typedef unsigned __int64 UInt; #else typedef long long Int; // NOLINT typedef unsigned long long UInt; // NOLINT #endif // GTEST_OS_WINDOWS }; // Integer types of known sizes. typedef TypeWithSize<4>::Int Int32; typedef TypeWithSize<4>::UInt UInt32; typedef TypeWithSize<8>::Int Int64; typedef TypeWithSize<8>::UInt UInt64; typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. // Utilities for command line flags and environment variables. // Macro for referencing flags. #define GTEST_FLAG(name) FLAGS_gtest_##name // Macros for declaring flags. #define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) #define GTEST_DECLARE_int32_(name) \ GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) #define GTEST_DECLARE_string_(name) \ GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name) // Macros for defining flags. #define GTEST_DEFINE_bool_(name, default_val, doc) \ GTEST_API_ bool GTEST_FLAG(name) = (default_val) #define GTEST_DEFINE_int32_(name, default_val, doc) \ GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) #define GTEST_DEFINE_string_(name, default_val, doc) \ GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val) // Parses 'str' for a 32-bit signed integer. If successful, writes the result // to *value and returns true; otherwise leaves *value unchanged and returns // false. // TODO(chandlerc): Find a better way to refactor flag and environment parsing // out of both gtest-port.cc and gtest.cc to avoid exporting this utility // function. bool ParseInt32(const Message& src_text, const char* str, Int32* value); // Parses a bool/Int32/string from the environment variable // corresponding to the given Google Test flag. bool BoolFromGTestEnv(const char* flag, bool default_val); GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); const char* StringFromGTestEnv(const char* flag, const char* default_val); } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ #if GTEST_OS_LINUX # include <stdlib.h> # include <sys/types.h> # include <sys/wait.h> # include <unistd.h> #endif // GTEST_OS_LINUX #include <ctype.h> #include <string.h> #include <iomanip> #include <limits> #include <set> // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file declares the String class and functions used internally by // Google Test. They are subject to change without notice. They should not used // by code external to Google Test. // // This header file is #included by <gtest/internal/gtest-internal.h>. // It should not be #included by other files. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #ifdef __BORLANDC__ // string.h is not guaranteed to provide strcpy on C++ Builder. # include <mem.h> #endif #include <string.h> #include <string> namespace testing { namespace internal { // String - a UTF-8 string class. // // For historic reasons, we don't use std::string. // // TODO(wan@google.com): replace this class with std::string or // implement it in terms of the latter. // // Note that String can represent both NULL and the empty string, // while std::string cannot represent NULL. // // NULL and the empty string are considered different. NULL is less // than anything (including the empty string) except itself. // // This class only provides minimum functionality necessary for // implementing Google Test. We do not intend to implement a full-fledged // string class here. // // Since the purpose of this class is to provide a substitute for // std::string on platforms where it cannot be used, we define a copy // constructor and assignment operators such that we don't need // conditional compilation in a lot of places. // // In order to make the representation efficient, the d'tor of String // is not virtual. Therefore DO NOT INHERIT FROM String. class GTEST_API_ String { public: // Static utility methods // Returns the input enclosed in double quotes if it's not NULL; // otherwise returns "(null)". For example, "\"Hello\"" is returned // for input "Hello". // // This is useful for printing a C string in the syntax of a literal. // // Known issue: escape sequences are not handled yet. static String ShowCStringQuoted(const char* c_str); // Clones a 0-terminated C string, allocating memory using new. The // caller is responsible for deleting the return value using // delete[]. Returns the cloned string, or NULL if the input is // NULL. // // This is different from strdup() in string.h, which allocates // memory using malloc(). static const char* CloneCString(const char* c_str); #if GTEST_OS_WINDOWS_MOBILE // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be // able to pass strings to Win32 APIs on CE we need to convert them // to 'Unicode', UTF-16. // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. // // The wide string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static LPCWSTR AnsiToUtf16(const char* c_str); // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. // // The returned string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static const char* Utf16ToAnsi(LPCWSTR utf16_str); #endif // Compares two C strings. Returns true iff they have the same content. // // Unlike strcmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CStringEquals(const char* lhs, const char* rhs); // Converts a wide C string to a String using the UTF-8 encoding. // NULL will be converted to "(null)". If an error occurred during // the conversion, "(failed to convert from wide string)" is // returned. static String ShowWideCString(const wchar_t* wide_c_str); // Similar to ShowWideCString(), except that this function encloses // the converted string in double quotes. static String ShowWideCStringQuoted(const wchar_t* wide_c_str); // Compares two wide C strings. Returns true iff they have the same // content. // // Unlike wcscmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Compares two C strings, ignoring case. Returns true iff they // have the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs); // Compares two wide C strings, ignoring case. Returns true iff they // have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Formats a list of arguments to a String, using the same format // spec string as for printf. // // We do not use the StringPrintf class as it is not universally // available. // // The result is limited to 4096 characters (including the tailing // 0). If 4096 characters are not enough to format the input, // "<buffer exceeded>" is returned. static String Format(const char* format, ...); // C'tors // The default c'tor constructs a NULL string. String() : c_str_(NULL), length_(0) {} // Constructs a String by cloning a 0-terminated C string. String(const char* a_c_str) { // NOLINT if (a_c_str == NULL) { c_str_ = NULL; length_ = 0; } else { ConstructNonNull(a_c_str, strlen(a_c_str)); } } // Constructs a String by copying a given number of chars from a // buffer. E.g. String("hello", 3) creates the string "hel", // String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "", // and String(NULL, 1) results in access violation. String(const char* buffer, size_t a_length) { ConstructNonNull(buffer, a_length); } // The copy c'tor creates a new copy of the string. The two // String objects do not share content. String(const String& str) : c_str_(NULL), length_(0) { *this = str; } // D'tor. String is intended to be a final class, so the d'tor // doesn't need to be virtual. ~String() { delete[] c_str_; } // Allows a String to be implicitly converted to an ::std::string or // ::string, and vice versa. Converting a String containing a NULL // pointer to ::std::string or ::string is undefined behavior. // Converting a ::std::string or ::string containing an embedded NUL // character to a String will result in the prefix up to the first // NUL character. String(const ::std::string& str) { ConstructNonNull(str.c_str(), str.length()); } operator ::std::string() const { return ::std::string(c_str(), length()); } #if GTEST_HAS_GLOBAL_STRING String(const ::string& str) { ConstructNonNull(str.c_str(), str.length()); } operator ::string() const { return ::string(c_str(), length()); } #endif // GTEST_HAS_GLOBAL_STRING // Returns true iff this is an empty string (i.e. ""). bool empty() const { return (c_str() != NULL) && (length() == 0); } // Compares this with another String. // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 // if this is greater than rhs. int Compare(const String& rhs) const; // Returns true iff this String equals the given C string. A NULL // string and a non-NULL string are considered not equal. bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; } // Returns true iff this String is less than the given String. A // NULL string is considered less than "". bool operator<(const String& rhs) const { return Compare(rhs) < 0; } // Returns true iff this String doesn't equal the given C string. A NULL // string and a non-NULL string are considered not equal. bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); } // Returns true iff this String ends with the given suffix. *Any* // String is considered to end with a NULL or empty suffix. bool EndsWith(const char* suffix) const; // Returns true iff this String ends with the given suffix, not considering // case. Any String is considered to end with a NULL or empty suffix. bool EndsWithCaseInsensitive(const char* suffix) const; // Returns the length of the encapsulated string, or 0 if the // string is NULL. size_t length() const { return length_; } // Gets the 0-terminated C string this String object represents. // The String object still owns the string. Therefore the caller // should NOT delete the return value. const char* c_str() const { return c_str_; } // Assigns a C string to this object. Self-assignment works. const String& operator=(const char* a_c_str) { return *this = String(a_c_str); } // Assigns a String object to this object. Self-assignment works. const String& operator=(const String& rhs) { if (this != &rhs) { delete[] c_str_; if (rhs.c_str() == NULL) { c_str_ = NULL; length_ = 0; } else { ConstructNonNull(rhs.c_str(), rhs.length()); } } return *this; } private: // Constructs a non-NULL String from the given content. This // function can only be called when c_str_ has not been allocated. // ConstructNonNull(NULL, 0) results in an empty string (""). // ConstructNonNull(NULL, non_zero) is undefined behavior. void ConstructNonNull(const char* buffer, size_t a_length) { char* const str = new char[a_length + 1]; memcpy(str, buffer, a_length); str[a_length] = '\0'; c_str_ = str; length_ = a_length; } const char* c_str_; size_t length_; }; // class String // Streams a String to an ostream. Each '\0' character in the String // is replaced with "\\0". inline ::std::ostream& operator<<(::std::ostream& os, const String& str) { if (str.c_str() == NULL) { os << "(null)"; } else { const char* const c_str = str.c_str(); for (size_t i = 0; i != str.length(); i++) { if (c_str[i] == '\0') { os << "\\0"; } else { os << c_str[i]; } } } return os; } // Gets the content of the stringstream's buffer as a String. Each '\0' // character in the buffer is replaced with "\\0". GTEST_API_ String StringStreamToString(::std::stringstream* stream); // Converts a streamable value to a String. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". // Declared here but defined in gtest.h, so that it has access // to the definition of the Message class, required by the ARM // compiler. template <typename T> String StreamableToString(const T& streamable); } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: keith.ray@gmail.com (Keith Ray) // // Google Test filepath utilities // // This header file declares classes and functions used internally by // Google Test. They are subject to change without notice. // // This file is #included in <gtest/internal/gtest-internal.h>. // Do not include this header file separately! #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ namespace testing { namespace internal { // FilePath - a class for file and directory pathname manipulation which // handles platform-specific conventions (like the pathname separator). // Used for helper functions for naming files in a directory for xml output. // Except for Set methods, all methods are const or static, which provides an // "immutable value object" -- useful for peace of mind. // A FilePath with a value ending in a path separator ("like/this/") represents // a directory, otherwise it is assumed to represent a file. In either case, // it may or may not represent an actual file or directory in the file system. // Names are NOT checked for syntax correctness -- no checking for illegal // characters, malformed paths, etc. class GTEST_API_ FilePath { public: FilePath() : pathname_("") { } FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } explicit FilePath(const char* pathname) : pathname_(pathname) { Normalize(); } explicit FilePath(const String& pathname) : pathname_(pathname) { Normalize(); } FilePath& operator=(const FilePath& rhs) { Set(rhs); return *this; } void Set(const FilePath& rhs) { pathname_ = rhs.pathname_; } String ToString() const { return pathname_; } const char* c_str() const { return pathname_.c_str(); } // Returns the current working directory, or "" if unsuccessful. static FilePath GetCurrentDir(); // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. static FilePath MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension); // Given directory = "dir", relative_path = "test.xml", // returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. static FilePath ConcatPaths(const FilePath& directory, const FilePath& relative_path); // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_<number>.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. static FilePath GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension); // Returns true iff the path is NULL or "". bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; } // If input name has a trailing separator character, removes it and returns // the name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath RemoveTrailingPathSeparator() const; // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveDirectoryName() const; // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveFileName() const; // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath RemoveExtension(const char* extension) const; // Creates directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create // directories for any reason. Will also return false if the FilePath does // not represent a directory (that is, it doesn't end with a path separator). bool CreateDirectoriesRecursively() const; // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool CreateFolder() const; // Returns true if FilePath describes something in the file-system, // either a file, directory, or whatever, and that something exists. bool FileOrDirectoryExists() const; // Returns true if pathname describes a directory in the file-system // that exists. bool DirectoryExists() const; // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool IsDirectory() const; // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool IsRootDirectory() const; // Returns true if pathname describes an absolute path. bool IsAbsolutePath() const; private: // Replaces multiple consecutive separators with a single separator. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". // // A pathname with multiple consecutive separators may occur either through // user error or as a result of some scripts or APIs that generate a pathname // with a trailing separator. On other platforms the same API or script // may NOT generate a pathname with a trailing "/". Then elsewhere that // pathname may have another "/" and pathname components added to it, // without checking for the separator already being there. // The script language and operating system may allow paths like "foo//bar" // but some of the functions in FilePath will not handle that correctly. In // particular, RemoveTrailingPathSeparator() only removes one separator, and // it is called in CreateDirectoriesRecursively() assuming that it will change // a pathname from directory syntax (trailing separator) to filename syntax. // // On Windows this method also replaces the alternate path separator '/' with // the primary path separator '\\', so that for example "bar\\/\\foo" becomes // "bar\\foo". void Normalize(); // Returns a pointer to the last occurence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FindLastPathSeparator() const; String pathname_; }; // class FilePath } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ // This file was GENERATED by command: // pump.py gtest-type-util.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Type utilities needed for implementing typed and type-parameterized // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently we support at most 50 types in a list, and at most 50 // type-parameterized tests in one type-parameterized test case. // Please contact googletestframework@googlegroups.com if you need // more. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ // #ifdef __GNUC__ is too general here. It is possible to use gcc without using // libstdc++ (which is where cxxabi.h comes from). # ifdef __GLIBCXX__ # include <cxxabi.h> # elif defined(__HP_aCC) # include <acxx_demangle.h> # endif // __GLIBCXX__ namespace testing { namespace internal { // GetTypeName<T>() returns a human-readable name of type T. // NB: This function is also used in Google Mock, so don't move it inside of // the typed-test-only section below. template <typename T> String GetTypeName() { # if GTEST_HAS_RTTI const char* const name = typeid(T).name(); # if defined(__GLIBCXX__) || defined(__HP_aCC) int status = 0; // gcc's implementation of typeid(T).name() mangles the type name, // so we have to demangle it. # ifdef __GLIBCXX__ using abi::__cxa_demangle; # endif // __GLIBCXX__ char* const readable_name = __cxa_demangle(name, 0, 0, &status); const String name_str(status == 0 ? readable_name : name); free(readable_name); return name_str; # else return name; # endif // __GLIBCXX__ || __HP_aCC # else return "<type>"; # endif // GTEST_HAS_RTTI } #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same // type. This can be used as a compile-time assertion to ensure that // two types are equal. template <typename T1, typename T2> struct AssertTypeEq; template <typename T> struct AssertTypeEq<T, T> { typedef bool type; }; // A unique type used as the default value for the arguments of class // template Types. This allows us to simulate variadic templates // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't // support directly. struct None {}; // The following family of struct and struct templates are used to // represent type lists. In particular, TypesN<T1, T2, ..., TN> // represents a type list with N types (T1, T2, ..., and TN) in it. // Except for Types0, every struct in the family has two member types: // Head for the first type in the list, and Tail for the rest of the // list. // The empty type list. struct Types0 {}; // Type lists of length 1, 2, 3, and so on. template <typename T1> struct Types1 { typedef T1 Head; typedef Types0 Tail; }; template <typename T1, typename T2> struct Types2 { typedef T1 Head; typedef Types1<T2> Tail; }; template <typename T1, typename T2, typename T3> struct Types3 { typedef T1 Head; typedef Types2<T2, T3> Tail; }; template <typename T1, typename T2, typename T3, typename T4> struct Types4 { typedef T1 Head; typedef Types3<T2, T3, T4> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5> struct Types5 { typedef T1 Head; typedef Types4<T2, T3, T4, T5> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> struct Types6 { typedef T1 Head; typedef Types5<T2, T3, T4, T5, T6> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> struct Types7 { typedef T1 Head; typedef Types6<T2, T3, T4, T5, T6, T7> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> struct Types8 { typedef T1 Head; typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> struct Types9 { typedef T1 Head; typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> struct Types10 { typedef T1 Head; typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> struct Types11 { typedef T1 Head; typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> struct Types12 { typedef T1 Head; typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13> struct Types13 { typedef T1 Head; typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14> struct Types14 { typedef T1 Head; typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15> struct Types15 { typedef T1 Head; typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16> struct Types16 { typedef T1 Head; typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17> struct Types17 { typedef T1 Head; typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18> struct Types18 { typedef T1 Head; typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19> struct Types19 { typedef T1 Head; typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20> struct Types20 { typedef T1 Head; typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21> struct Types21 { typedef T1 Head; typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22> struct Types22 { typedef T1 Head; typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23> struct Types23 { typedef T1 Head; typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24> struct Types24 { typedef T1 Head; typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25> struct Types25 { typedef T1 Head; typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26> struct Types26 { typedef T1 Head; typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27> struct Types27 { typedef T1 Head; typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28> struct Types28 { typedef T1 Head; typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29> struct Types29 { typedef T1 Head; typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30> struct Types30 { typedef T1 Head; typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31> struct Types31 { typedef T1 Head; typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32> struct Types32 { typedef T1 Head; typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33> struct Types33 { typedef T1 Head; typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34> struct Types34 { typedef T1 Head; typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35> struct Types35 { typedef T1 Head; typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36> struct Types36 { typedef T1 Head; typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37> struct Types37 { typedef T1 Head; typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38> struct Types38 { typedef T1 Head; typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39> struct Types39 { typedef T1 Head; typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40> struct Types40 { typedef T1 Head; typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41> struct Types41 { typedef T1 Head; typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42> struct Types42 { typedef T1 Head; typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43> struct Types43 { typedef T1 Head; typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44> struct Types44 { typedef T1 Head; typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45> struct Types45 { typedef T1 Head; typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46> struct Types46 { typedef T1 Head; typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47> struct Types47 { typedef T1 Head; typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48> struct Types48 { typedef T1 Head; typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49> struct Types49 { typedef T1 Head; typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49> Tail; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50> struct Types50 { typedef T1 Head; typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> Tail; }; } // namespace internal // We don't want to require the users to write TypesN<...> directly, // as that would require them to count the length. Types<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Types<int> // will appear as Types<int, None, None, ..., None> in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Types<T1, ..., TN>, and Google Test will translate // that to TypesN<T1, ..., TN> internally to make error messages // readable. The translation is done by the 'type' member of the // Types template. template <typename T1 = internal::None, typename T2 = internal::None, typename T3 = internal::None, typename T4 = internal::None, typename T5 = internal::None, typename T6 = internal::None, typename T7 = internal::None, typename T8 = internal::None, typename T9 = internal::None, typename T10 = internal::None, typename T11 = internal::None, typename T12 = internal::None, typename T13 = internal::None, typename T14 = internal::None, typename T15 = internal::None, typename T16 = internal::None, typename T17 = internal::None, typename T18 = internal::None, typename T19 = internal::None, typename T20 = internal::None, typename T21 = internal::None, typename T22 = internal::None, typename T23 = internal::None, typename T24 = internal::None, typename T25 = internal::None, typename T26 = internal::None, typename T27 = internal::None, typename T28 = internal::None, typename T29 = internal::None, typename T30 = internal::None, typename T31 = internal::None, typename T32 = internal::None, typename T33 = internal::None, typename T34 = internal::None, typename T35 = internal::None, typename T36 = internal::None, typename T37 = internal::None, typename T38 = internal::None, typename T39 = internal::None, typename T40 = internal::None, typename T41 = internal::None, typename T42 = internal::None, typename T43 = internal::None, typename T44 = internal::None, typename T45 = internal::None, typename T46 = internal::None, typename T47 = internal::None, typename T48 = internal::None, typename T49 = internal::None, typename T50 = internal::None> struct Types { typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type; }; template <> struct Types<internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types0 type; }; template <typename T1> struct Types<T1, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types1<T1> type; }; template <typename T1, typename T2> struct Types<T1, T2, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types2<T1, T2> type; }; template <typename T1, typename T2, typename T3> struct Types<T1, T2, T3, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types3<T1, T2, T3> type; }; template <typename T1, typename T2, typename T3, typename T4> struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types4<T1, T2, T3, T4> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5> struct Types<T1, T2, T3, T4, T5, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types5<T1, T2, T3, T4, T5> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types6<T1, T2, T3, T4, T5, T6> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, internal::None, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, internal::None, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, internal::None, internal::None, internal::None, internal::None> { typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, internal::None, internal::None, internal::None> { typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, internal::None, internal::None> { typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49> struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, internal::None> { typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49> type; }; namespace internal { # define GTEST_TEMPLATE_ template <typename T> class // The template "selector" struct TemplateSel<Tmpl> is used to // represent Tmpl, which must be a class template with one type // parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined // as the type Tmpl<T>. This allows us to actually instantiate the // template "selected" by TemplateSel<Tmpl>. // // This trick is necessary for simulating typedef for class templates, // which C++ doesn't support directly. template <GTEST_TEMPLATE_ Tmpl> struct TemplateSel { template <typename T> struct Bind { typedef Tmpl<T> type; }; }; # define GTEST_BIND_(TmplSel, T) \ TmplSel::template Bind<T>::type // A unique struct template used as the default value for the // arguments of class template Templates. This allows us to simulate // variadic templates (e.g. Templates<int>, Templates<int, double>, // and etc), which C++ doesn't support directly. template <typename T> struct NoneT {}; // The following family of struct and struct templates are used to // represent template lists. In particular, TemplatesN<T1, T2, ..., // TN> represents a list of N templates (T1, T2, ..., and TN). Except // for Templates0, every struct in the family has two member types: // Head for the selector of the first template in the list, and Tail // for the rest of the list. // The empty template list. struct Templates0 {}; // Template lists of length 1, 2, 3, and so on. template <GTEST_TEMPLATE_ T1> struct Templates1 { typedef TemplateSel<T1> Head; typedef Templates0 Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2> struct Templates2 { typedef TemplateSel<T1> Head; typedef Templates1<T2> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3> struct Templates3 { typedef TemplateSel<T1> Head; typedef Templates2<T2, T3> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4> struct Templates4 { typedef TemplateSel<T1> Head; typedef Templates3<T2, T3, T4> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5> struct Templates5 { typedef TemplateSel<T1> Head; typedef Templates4<T2, T3, T4, T5> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6> struct Templates6 { typedef TemplateSel<T1> Head; typedef Templates5<T2, T3, T4, T5, T6> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7> struct Templates7 { typedef TemplateSel<T1> Head; typedef Templates6<T2, T3, T4, T5, T6, T7> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8> struct Templates8 { typedef TemplateSel<T1> Head; typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9> struct Templates9 { typedef TemplateSel<T1> Head; typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10> struct Templates10 { typedef TemplateSel<T1> Head; typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11> struct Templates11 { typedef TemplateSel<T1> Head; typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12> struct Templates12 { typedef TemplateSel<T1> Head; typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13> struct Templates13 { typedef TemplateSel<T1> Head; typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14> struct Templates14 { typedef TemplateSel<T1> Head; typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15> struct Templates15 { typedef TemplateSel<T1> Head; typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16> struct Templates16 { typedef TemplateSel<T1> Head; typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17> struct Templates17 { typedef TemplateSel<T1> Head; typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18> struct Templates18 { typedef TemplateSel<T1> Head; typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19> struct Templates19 { typedef TemplateSel<T1> Head; typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20> struct Templates20 { typedef TemplateSel<T1> Head; typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21> struct Templates21 { typedef TemplateSel<T1> Head; typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22> struct Templates22 { typedef TemplateSel<T1> Head; typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23> struct Templates23 { typedef TemplateSel<T1> Head; typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24> struct Templates24 { typedef TemplateSel<T1> Head; typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25> struct Templates25 { typedef TemplateSel<T1> Head; typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26> struct Templates26 { typedef TemplateSel<T1> Head; typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27> struct Templates27 { typedef TemplateSel<T1> Head; typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28> struct Templates28 { typedef TemplateSel<T1> Head; typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29> struct Templates29 { typedef TemplateSel<T1> Head; typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30> struct Templates30 { typedef TemplateSel<T1> Head; typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31> struct Templates31 { typedef TemplateSel<T1> Head; typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32> struct Templates32 { typedef TemplateSel<T1> Head; typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33> struct Templates33 { typedef TemplateSel<T1> Head; typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34> struct Templates34 { typedef TemplateSel<T1> Head; typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35> struct Templates35 { typedef TemplateSel<T1> Head; typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36> struct Templates36 { typedef TemplateSel<T1> Head; typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37> struct Templates37 { typedef TemplateSel<T1> Head; typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38> struct Templates38 { typedef TemplateSel<T1> Head; typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39> struct Templates39 { typedef TemplateSel<T1> Head; typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40> struct Templates40 { typedef TemplateSel<T1> Head; typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41> struct Templates41 { typedef TemplateSel<T1> Head; typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42> struct Templates42 { typedef TemplateSel<T1> Head; typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43> struct Templates43 { typedef TemplateSel<T1> Head; typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44> struct Templates44 { typedef TemplateSel<T1> Head; typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45> struct Templates45 { typedef TemplateSel<T1> Head; typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46> struct Templates46 { typedef TemplateSel<T1> Head; typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47> struct Templates47 { typedef TemplateSel<T1> Head; typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48> struct Templates48 { typedef TemplateSel<T1> Head; typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48, GTEST_TEMPLATE_ T49> struct Templates49 { typedef TemplateSel<T1> Head; typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49> Tail; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48, GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50> struct Templates50 { typedef TemplateSel<T1> Head; typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> Tail; }; // We don't want to require the users to write TemplatesN<...> directly, // as that would require them to count the length. Templates<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Templates<list> // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Templates<T1, ..., TN>, and Google Test will translate // that to TemplatesN<T1, ..., TN> internally to make error messages // readable. The translation is done by the 'type' member of the // Templates template. template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT, GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT, GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT, GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT, GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT, GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT, GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT, GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT, GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT, GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT, GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT, GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT, GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT, GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT, GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT, GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT, GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT, GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT, GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT, GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT, GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT, GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT, GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT, GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT, GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT> struct Templates { typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type; }; template <> struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates0 type; }; template <GTEST_TEMPLATE_ T1> struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates1<T1> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2> struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates2<T1, T2> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3> struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates3<T1, T2, T3> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4> struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates4<T1, T2, T3, T4> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5> struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates5<T1, T2, T3, T4, T5> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6> struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates6<T1, T2, T3, T4, T5, T6> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7> struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, NoneT, NoneT, NoneT, NoneT, NoneT> { typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, NoneT, NoneT, NoneT, NoneT> { typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, NoneT, NoneT, NoneT> { typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, NoneT, NoneT> { typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48> type; }; template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48, GTEST_TEMPLATE_ T49> struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, NoneT> { typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49> type; }; // The TypeList template makes it possible to use either a single type // or a Types<...> list in TYPED_TEST_CASE() and // INSTANTIATE_TYPED_TEST_CASE_P(). template <typename T> struct TypeList { typedef Types1<T> type; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50> struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> > { typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type; }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ // Due to C++ preprocessor weirdness, we need double indirection to // concatenate two tokens when one of them is __LINE__. Writing // // foo ## __LINE__ // // will result in the token foo__LINE__, instead of foo followed by // the current line number. For more details, see // http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar // Google Test defines the testing::Message class to allow construction of // test messages via the << operator. The idea is that anything // streamable to std::ostream can be streamed to a testing::Message. // This allows a user to use his own types in Google Test assertions by // overloading the << operator. // // util/gtl/stl_logging-inl.h overloads << for STL containers. These // overloads cannot be defined in the std namespace, as that will be // undefined behavior. Therefore, they are defined in the global // namespace instead. // // C++'s symbol lookup rule (i.e. Koenig lookup) says that these // overloads are visible in either the std namespace or the global // namespace, but not other namespaces, including the testing // namespace which Google Test's Message class is in. // // To allow STL containers (and other types that has a << operator // defined in the global namespace) to be used in Google Test assertions, // testing::Message must access the custom << operator from the global // namespace. Hence this helper function. // // Note: Jeffrey Yasskin suggested an alternative fix by "using // ::operator<<;" in the definition of Message's operator<<. That fix // doesn't require a helper function, but unfortunately doesn't // compile with MSVC. template <typename T> inline void GTestStreamToHelper(std::ostream* os, const T& val) { *os << val; } class ProtocolMessage; namespace proto2 { class Message; } namespace testing { // Forward declarations. class AssertionResult; // Result of an assertion. class Message; // Represents a failure message. class Test; // Represents a test. class TestInfo; // Information about a test. class TestPartResult; // Result of a test part. class UnitTest; // A collection of test cases. template <typename T> ::std::string PrintToString(const T& value); namespace internal { struct TraceInfo; // Information about a trace point. class ScopedTrace; // Implements scoped trace. class TestInfoImpl; // Opaque implementation of TestInfo class UnitTestImpl; // Opaque implementation of UnitTest // How many times InitGoogleTest() has been called. extern int g_init_gtest_count; // The text used in failure messages to indicate the start of the // stack trace. GTEST_API_ extern const char kStackTraceMarker[]; // A secret type that Google Test users don't know about. It has no // definition on purpose. Therefore it's impossible to create a // Secret object, which is what we want. class Secret; // Two overloaded helpers for checking at compile time whether an // expression is a null pointer literal (i.e. NULL or any 0-valued // compile-time integral constant). Their return values have // different sizes, so we can use sizeof() to test which version is // picked by the compiler. These helpers have no implementations, as // we only need their signatures. // // Given IsNullLiteralHelper(x), the compiler will pick the first // version if x can be implicitly converted to Secret*, and pick the // second version otherwise. Since Secret is a secret and incomplete // type, the only expression a user can write that has type Secret* is // a null pointer literal. Therefore, we know that x is a null // pointer literal if and only if the first version is picked by the // compiler. char IsNullLiteralHelper(Secret* p); char (&IsNullLiteralHelper(...))[2]; // NOLINT // A compile-time bool constant that is true if and only if x is a // null pointer literal (i.e. NULL or any 0-valued compile-time // integral constant). #ifdef GTEST_ELLIPSIS_NEEDS_POD_ // We lose support for NULL detection where the compiler doesn't like // passing non-POD classes through ellipsis (...). # define GTEST_IS_NULL_LITERAL_(x) false #else # define GTEST_IS_NULL_LITERAL_(x) \ (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) #endif // GTEST_ELLIPSIS_NEEDS_POD_ // Appends the user-supplied message to the Google-Test-generated message. GTEST_API_ String AppendUserMessage(const String& gtest_msg, const Message& user_msg); // A helper class for creating scoped traces in user programs. class GTEST_API_ ScopedTrace { public: // The c'tor pushes the given source file location and message onto // a trace stack maintained by Google Test. ScopedTrace(const char* file, int line, const Message& message); // The d'tor pops the info pushed by the c'tor. // // Note that the d'tor is not virtual in order to be efficient. // Don't inherit from ScopedTrace! ~ScopedTrace(); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); } GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its // c'tor and d'tor. Therefore it doesn't // need to be used otherwise. // Converts a streamable value to a String. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". // Declared here but defined in gtest.h, so that it has access // to the definition of the Message class, required by the ARM // compiler. template <typename T> String StreamableToString(const T& streamable); // The Symbian compiler has a bug that prevents it from selecting the // correct overload of FormatForComparisonFailureMessage (see below) // unless we pass the first argument by reference. If we do that, // however, Visual Age C++ 10.1 generates a compiler error. Therefore // we only apply the work-around for Symbian. #if defined(__SYMBIAN32__) # define GTEST_CREF_WORKAROUND_ const& #else # define GTEST_CREF_WORKAROUND_ #endif // When this operand is a const char* or char*, if the other operand // is a ::std::string or ::string, we print this operand as a C string // rather than a pointer (we do the same for wide strings); otherwise // we print it as a pointer to be safe. // This internal macro is used to avoid duplicated code. #define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\ inline String FormatForComparisonFailureMessage(\ operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \ const operand2_type& /*operand2*/) {\ return operand1_printer(str);\ }\ inline String FormatForComparisonFailureMessage(\ const operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \ const operand2_type& /*operand2*/) {\ return operand1_printer(str);\ } GTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted) #if GTEST_HAS_STD_WSTRING GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted) #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_STRING GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted) #endif // GTEST_HAS_GLOBAL_STRING #if GTEST_HAS_GLOBAL_WSTRING GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted) #endif // GTEST_HAS_GLOBAL_WSTRING #undef GTEST_FORMAT_IMPL_ // The next four overloads handle the case where the operand being // printed is a char/wchar_t pointer and the other operand is not a // string/wstring object. In such cases, we just print the operand as // a pointer to be safe. #define GTEST_FORMAT_CHAR_PTR_IMPL_(CharType) \ template <typename T> \ String FormatForComparisonFailureMessage(CharType* GTEST_CREF_WORKAROUND_ p, \ const T&) { \ return PrintToString(static_cast<const void*>(p)); \ } GTEST_FORMAT_CHAR_PTR_IMPL_(char) GTEST_FORMAT_CHAR_PTR_IMPL_(const char) GTEST_FORMAT_CHAR_PTR_IMPL_(wchar_t) GTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t) #undef GTEST_FORMAT_CHAR_PTR_IMPL_ // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // expected_expression: "foo" // actual_expression: "bar" // expected_value: "5" // actual_value: "6" // // The ignoring_case parameter is true iff the assertion is a // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will // be inserted into the message. GTEST_API_ AssertionResult EqFailure(const char* expected_expression, const char* actual_expression, const String& expected_value, const String& actual_value, bool ignoring_case); // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. GTEST_API_ String GetBoolAssertionFailureMessage( const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value); // This template class represents an IEEE floating-point number // (either single-precision or double-precision, depending on the // template parameters). // // The purpose of this class is to do more sophisticated number // comparison. (Due to round-off error, etc, it's very unlikely that // two floating-points will be equal exactly. Hence a naive // comparison by the == operation often doesn't work.) // // Format of IEEE floating-point: // // The most-significant bit being the leftmost, an IEEE // floating-point looks like // // sign_bit exponent_bits fraction_bits // // Here, sign_bit is a single bit that designates the sign of the // number. // // For float, there are 8 exponent bits and 23 fraction bits. // // For double, there are 11 exponent bits and 52 fraction bits. // // More details can be found at // http://en.wikipedia.org/wiki/IEEE_floating-point_standard. // // Template parameter: // // RawType: the raw floating-point type (either float or double) template <typename RawType> class FloatingPoint { public: // Defines the unsigned integer type that has the same size as the // floating point number. typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits; // Constants. // # of bits in a number. static const size_t kBitCount = 8*sizeof(RawType); // # of fraction bits in a number. static const size_t kFractionBitCount = std::numeric_limits<RawType>::digits - 1; // # of exponent bits in a number. static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; // The mask for the sign bit. static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1); // The mask for the fraction bits. static const Bits kFractionBitMask = ~static_cast<Bits>(0) >> (kExponentBitCount + 1); // The mask for the exponent bits. static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); // How many ULP's (Units in the Last Place) we want to tolerate when // comparing two numbers. The larger the value, the more error we // allow. A 0 value means that two numbers must be exactly the same // to be considered equal. // // The maximum error of a single floating-point operation is 0.5 // units in the last place. On Intel CPU's, all floating-point // calculations are done with 80-bit precision, while double has 64 // bits. Therefore, 4 should be enough for ordinary use. // // See the following article for more details on ULP: // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm. static const size_t kMaxUlps = 4; // Constructs a FloatingPoint from a raw floating-point number. // // On an Intel CPU, passing a non-normalized NAN (Not a Number) // around may change its bits, although the new value is guaranteed // to be also a NAN. Therefore, don't expect this constructor to // preserve the bits in x when x is a NAN. explicit FloatingPoint(const RawType& x) { u_.value_ = x; } // Static methods // Reinterprets a bit pattern as a floating-point number. // // This function is needed to test the AlmostEquals() method. static RawType ReinterpretBits(const Bits bits) { FloatingPoint fp(0); fp.u_.bits_ = bits; return fp.u_.value_; } // Returns the floating-point number that represent positive infinity. static RawType Infinity() { return ReinterpretBits(kExponentBitMask); } // Non-static methods // Returns the bits that represents this number. const Bits &bits() const { return u_.bits_; } // Returns the exponent bits of this number. Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } // Returns the fraction bits of this number. Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } // Returns the sign bit of this number. Bits sign_bit() const { return kSignBitMask & u_.bits_; } // Returns true iff this is NAN (not a number). bool is_nan() const { // It's a NAN if the exponent bits are all ones and the fraction // bits are not entirely zeros. return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); } // Returns true iff this number is at most kMaxUlps ULP's away from // rhs. In particular, this function: // // - returns false if either number is (or both are) NAN. // - treats really large numbers as almost equal to infinity. // - thinks +0.0 and -0.0 are 0 DLP's apart. bool AlmostEquals(const FloatingPoint& rhs) const { // The IEEE standard says that any comparison operation involving // a NAN must return false. if (is_nan() || rhs.is_nan()) return false; return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) <= kMaxUlps; } private: // The data type used to store the actual floating-point number. union FloatingPointUnion { RawType value_; // The raw floating-point number. Bits bits_; // The bits that represent the number. }; // Converts an integer from the sign-and-magnitude representation to // the biased representation. More precisely, let N be 2 to the // power of (kBitCount - 1), an integer x is represented by the // unsigned number x + N. // // For instance, // // -N + 1 (the most negative number representable using // sign-and-magnitude) is represented by 1; // 0 is represented by N; and // N - 1 (the biggest number representable using // sign-and-magnitude) is represented by 2N - 1. // // Read http://en.wikipedia.org/wiki/Signed_number_representations // for more details on signed number representations. static Bits SignAndMagnitudeToBiased(const Bits &sam) { if (kSignBitMask & sam) { // sam represents a negative number. return ~sam + 1; } else { // sam represents a positive number. return kSignBitMask | sam; } } // Given two numbers in the sign-and-magnitude representation, // returns the distance between them as an unsigned number. static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, const Bits &sam2) { const Bits biased1 = SignAndMagnitudeToBiased(sam1); const Bits biased2 = SignAndMagnitudeToBiased(sam2); return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); } FloatingPointUnion u_; }; // Typedefs the instances of the FloatingPoint template class that we // care to use. typedef FloatingPoint<float> Float; typedef FloatingPoint<double> Double; // In order to catch the mistake of putting tests that use different // test fixture classes in the same test case, we need to assign // unique IDs to fixture classes and compare them. The TypeId type is // used to hold such IDs. The user should treat TypeId as an opaque // type: the only operation allowed on TypeId values is to compare // them for equality using the == operator. typedef const void* TypeId; template <typename T> class TypeIdHelper { public: // dummy_ must not have a const type. Otherwise an overly eager // compiler (e.g. MSVC 7.1 & 8.0) may try to merge // TypeIdHelper<T>::dummy_ for different Ts as an "optimization". static bool dummy_; }; template <typename T> bool TypeIdHelper<T>::dummy_ = false; // GetTypeId<T>() returns the ID of type T. Different values will be // returned for different types. Calling the function twice with the // same type argument is guaranteed to return the same ID. template <typename T> TypeId GetTypeId() { // The compiler is required to allocate a different // TypeIdHelper<T>::dummy_ variable for each T used to instantiate // the template. Therefore, the address of dummy_ is guaranteed to // be unique. return &(TypeIdHelper<T>::dummy_); } // Returns the type ID of ::testing::Test. Always call this instead // of GetTypeId< ::testing::Test>() to get the type ID of // ::testing::Test, as the latter may give the wrong result due to a // suspected linker bug when compiling Google Test as a Mac OS X // framework. GTEST_API_ TypeId GetTestTypeId(); // Defines the abstract factory interface that creates instances // of a Test object. class TestFactoryBase { public: virtual ~TestFactoryBase() {} // Creates a test instance to run. The instance is both created and destroyed // within TestInfoImpl::Run() virtual Test* CreateTest() = 0; protected: TestFactoryBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); }; // This class provides implementation of TeastFactoryBase interface. // It is used in TEST and TEST_F macros. template <class TestClass> class TestFactoryImpl : public TestFactoryBase { public: virtual Test* CreateTest() { return new TestClass; } }; #if GTEST_OS_WINDOWS // Predicate-formatters for implementing the HRESULT checking macros // {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} // We pass a long instead of HRESULT to avoid causing an // include dependency for the HRESULT type. GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, long hr); // NOLINT GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, long hr); // NOLINT #endif // GTEST_OS_WINDOWS // Types of SetUpTestCase() and TearDownTestCase() functions. typedef void (*SetUpTestCaseFunc)(); typedef void (*TearDownTestCaseFunc)(); // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_case_name: name of the test case // name: name of the test // type_param the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // value_param text representation of the test's value parameter, // or NULL if this is not a type-parameterized test. // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. GTEST_API_ TestInfo* MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* type_param, const char* value_param, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase* factory); // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // State of the definition of a type-parameterized test case. class GTEST_API_ TypedTestCasePState { public: TypedTestCasePState() : registered_(false) {} // Adds the given test name to defined_test_names_ and return true // if the test case hasn't been registered; otherwise aborts the // program. bool AddTestName(const char* file, int line, const char* case_name, const char* test_name) { if (registered_) { fprintf(stderr, "%s Test %s must be defined before " "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n", FormatFileLocation(file, line).c_str(), test_name, case_name); fflush(stderr); posix::Abort(); } defined_test_names_.insert(test_name); return true; } // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. const char* VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests); private: bool registered_; ::std::set<const char*> defined_test_names_; }; // Skips to the first non-space char after the first comma in 'str'; // returns NULL if no comma is found in 'str'. inline const char* SkipComma(const char* str) { const char* comma = strchr(str, ','); if (comma == NULL) { return NULL; } while (IsSpace(*(++comma))) {} return comma; } // Returns the prefix of 'str' before the first comma in it; returns // the entire string if it contains no comma. inline String GetPrefixUntilComma(const char* str) { const char* comma = strchr(str, ','); return comma == NULL ? String(str) : String(str, comma - str); } // TypeParameterizedTest<Fixture, TestSel, Types>::Register() // registers a list of type-parameterized tests with Google Test. The // return value is insignificant - we just need to return something // such that we can call this function in a namespace scope. // // Implementation note: The GTEST_TEMPLATE_ macro declares a template // template parameter. It's defined in gtest-type-util.h. template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types> class TypeParameterizedTest { public: // 'index' is the index of the test in the type list 'Types' // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase, // Types). Valid values for 'index' are [0, N - 1] where N is the // length of Types. static bool Register(const char* prefix, const char* case_name, const char* test_names, int index) { typedef typename Types::Head Type; typedef Fixture<Type> FixtureClass; typedef typename GTEST_BIND_(TestSel, Type) TestClass; // First, registers the first type-parameterized test in the type // list. MakeAndRegisterTestInfo( String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/", case_name, index).c_str(), GetPrefixUntilComma(test_names).c_str(), GetTypeName<Type>().c_str(), NULL, // No value parameter. GetTypeId<FixtureClass>(), TestClass::SetUpTestCase, TestClass::TearDownTestCase, new TestFactoryImpl<TestClass>); // Next, recurses (at compile time) with the tail of the type list. return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail> ::Register(prefix, case_name, test_names, index + 1); } }; // The base case for the compile time recursion. template <GTEST_TEMPLATE_ Fixture, class TestSel> class TypeParameterizedTest<Fixture, TestSel, Types0> { public: static bool Register(const char* /*prefix*/, const char* /*case_name*/, const char* /*test_names*/, int /*index*/) { return true; } }; // TypeParameterizedTestCase<Fixture, Tests, Types>::Register() // registers *all combinations* of 'Tests' and 'Types' with Google // Test. The return value is insignificant - we just need to return // something such that we can call this function in a namespace scope. template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types> class TypeParameterizedTestCase { public: static bool Register(const char* prefix, const char* case_name, const char* test_names) { typedef typename Tests::Head Head; // First, register the first test in 'Test' for each type in 'Types'. TypeParameterizedTest<Fixture, Head, Types>::Register( prefix, case_name, test_names, 0); // Next, recurses (at compile time) with the tail of the test list. return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types> ::Register(prefix, case_name, SkipComma(test_names)); } }; // The base case for the compile time recursion. template <GTEST_TEMPLATE_ Fixture, typename Types> class TypeParameterizedTestCase<Fixture, Templates0, Types> { public: static bool Register(const char* /*prefix*/, const char* /*case_name*/, const char* /*test_names*/) { return true; } }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. GTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test, int skip_count); // Helpers for suppressing warnings on unreachable code or constant // condition. // Always returns true. GTEST_API_ bool AlwaysTrue(); // Always returns false. inline bool AlwaysFalse() { return !AlwaysTrue(); } // Helper for suppressing false warning from Clang on a const char* // variable declared in a conditional expression always being NULL in // the else branch. struct GTEST_API_ ConstCharPtr { ConstCharPtr(const char* str) : value(str) {} operator bool() const { return true; } const char* value; }; // A simple Linear Congruential Generator for generating random // numbers with a uniform distribution. Unlike rand() and srand(), it // doesn't use global state (and therefore can't interfere with user // code). Unlike rand_r(), it's portable. An LCG isn't very random, // but it's good enough for our purposes. class GTEST_API_ Random { public: static const UInt32 kMaxRange = 1u << 31; explicit Random(UInt32 seed) : state_(seed) {} void Reseed(UInt32 seed) { state_ = seed; } // Generates a random number from [0, range). Crashes if 'range' is // 0 or greater than kMaxRange. UInt32 Generate(UInt32 range); private: UInt32 state_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); }; // Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a // compiler error iff T1 and T2 are different types. template <typename T1, typename T2> struct CompileAssertTypesEqual; template <typename T> struct CompileAssertTypesEqual<T, T> { }; // Removes the reference from a type if it is a reference type, // otherwise leaves it unchanged. This is the same as // tr1::remove_reference, which is not widely available yet. template <typename T> struct RemoveReference { typedef T type; }; // NOLINT template <typename T> struct RemoveReference<T&> { typedef T type; }; // NOLINT // A handy wrapper around RemoveReference that works when the argument // T depends on template parameters. #define GTEST_REMOVE_REFERENCE_(T) \ typename ::testing::internal::RemoveReference<T>::type // Removes const from a type if it is a const type, otherwise leaves // it unchanged. This is the same as tr1::remove_const, which is not // widely available yet. template <typename T> struct RemoveConst { typedef T type; }; // NOLINT template <typename T> struct RemoveConst<const T> { typedef T type; }; // NOLINT // MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above // definition to fail to remove the const in 'const int[3]' and 'const // char[3][4]'. The following specialization works around the bug. // However, it causes trouble with GCC and thus needs to be // conditionally compiled. #if defined(_MSC_VER) || defined(__SUNPRO_CC) || defined(__IBMCPP__) template <typename T, size_t N> struct RemoveConst<const T[N]> { typedef typename RemoveConst<T>::type type[N]; }; #endif // A handy wrapper around RemoveConst that works when the argument // T depends on template parameters. #define GTEST_REMOVE_CONST_(T) \ typename ::testing::internal::RemoveConst<T>::type // Turns const U&, U&, const U, and U all into U. #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) // Adds reference to a type if it is not a reference type, // otherwise leaves it unchanged. This is the same as // tr1::add_reference, which is not widely available yet. template <typename T> struct AddReference { typedef T& type; }; // NOLINT template <typename T> struct AddReference<T&> { typedef T& type; }; // NOLINT // A handy wrapper around AddReference that works when the argument T // depends on template parameters. #define GTEST_ADD_REFERENCE_(T) \ typename ::testing::internal::AddReference<T>::type // Adds a reference to const on top of T as necessary. For example, // it transforms // // char ==> const char& // const char ==> const char& // char& ==> const char& // const char& ==> const char& // // The argument T must depend on some template parameters. #define GTEST_REFERENCE_TO_CONST_(T) \ GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T)) // ImplicitlyConvertible<From, To>::value is a compile-time bool // constant that's true iff type From can be implicitly converted to // type To. template <typename From, typename To> class ImplicitlyConvertible { private: // We need the following helper functions only for their types. // They have no implementations. // MakeFrom() is an expression whose type is From. We cannot simply // use From(), as the type From may not have a public default // constructor. static From MakeFrom(); // These two functions are overloaded. Given an expression // Helper(x), the compiler will pick the first version if x can be // implicitly converted to type To; otherwise it will pick the // second version. // // The first version returns a value of size 1, and the second // version returns a value of size 2. Therefore, by checking the // size of Helper(x), which can be done at compile time, we can tell // which version of Helper() is used, and hence whether x can be // implicitly converted to type To. static char Helper(To); static char (&Helper(...))[2]; // NOLINT // We have to put the 'public' section after the 'private' section, // or MSVC refuses to compile the code. public: // MSVC warns about implicitly converting from double to int for // possible loss of data, so we need to temporarily disable the // warning. #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4244) // Temporarily disables warning 4244. static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; # pragma warning(pop) // Restores the warning state. #elif defined(__BORLANDC__) // C++Builder cannot use member overload resolution during template // instantiation. The simplest workaround is to use its C++0x type traits // functions (C++Builder 2009 and above only). static const bool value = __is_convertible(From, To); #else static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; #endif // _MSV_VER }; template <typename From, typename To> const bool ImplicitlyConvertible<From, To>::value; // IsAProtocolMessage<T>::value is a compile-time bool constant that's // true iff T is type ProtocolMessage, proto2::Message, or a subclass // of those. template <typename T> struct IsAProtocolMessage : public bool_constant< ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value || ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> { }; // When the compiler sees expression IsContainerTest<C>(0), if C is an // STL-style container class, the first overload of IsContainerTest // will be viable (since both C::iterator* and C::const_iterator* are // valid types and NULL can be implicitly converted to them). It will // be picked over the second overload as 'int' is a perfect match for // the type of argument 0. If C::iterator or C::const_iterator is not // a valid type, the first overload is not viable, and the second // overload will be picked. Therefore, we can determine whether C is // a container class by checking the type of IsContainerTest<C>(0). // The value of the expression is insignificant. // // Note that we look for both C::iterator and C::const_iterator. The // reason is that C++ injects the name of a class as a member of the // class itself (e.g. you can refer to class iterator as either // 'iterator' or 'iterator::iterator'). If we look for C::iterator // only, for example, we would mistakenly think that a class named // iterator is an STL container. // // Also note that the simpler approach of overloading // IsContainerTest(typename C::const_iterator*) and // IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. typedef int IsContainer; template <class C> IsContainer IsContainerTest(int /* dummy */, typename C::iterator* /* it */ = NULL, typename C::const_iterator* /* const_it */ = NULL) { return 0; } typedef char IsNotContainer; template <class C> IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } // EnableIf<condition>::type is void when 'Cond' is true, and // undefined when 'Cond' is false. To use SFINAE to make a function // overload only apply when a particular expression is true, add // "typename EnableIf<expression>::type* = 0" as the last parameter. template<bool> struct EnableIf; template<> struct EnableIf<true> { typedef void type; }; // NOLINT // Utilities for native arrays. // ArrayEq() compares two k-dimensional native arrays using the // elements' operator==, where k can be any integer >= 0. When k is // 0, ArrayEq() degenerates into comparing a single pair of values. template <typename T, typename U> bool ArrayEq(const T* lhs, size_t size, const U* rhs); // This generic version is used when k is 0. template <typename T, typename U> inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } // This overload is used when k >= 1. template <typename T, typename U, size_t N> inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { return internal::ArrayEq(lhs, N, rhs); } // This helper reduces code bloat. If we instead put its logic inside // the previous ArrayEq() function, arrays with different sizes would // lead to different copies of the template code. template <typename T, typename U> bool ArrayEq(const T* lhs, size_t size, const U* rhs) { for (size_t i = 0; i != size; i++) { if (!internal::ArrayEq(lhs[i], rhs[i])) return false; } return true; } // Finds the first element in the iterator range [begin, end) that // equals elem. Element may be a native array type itself. template <typename Iter, typename Element> Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { for (Iter it = begin; it != end; ++it) { if (internal::ArrayEq(*it, elem)) return it; } return end; } // CopyArray() copies a k-dimensional native array using the elements' // operator=, where k can be any integer >= 0. When k is 0, // CopyArray() degenerates into copying a single value. template <typename T, typename U> void CopyArray(const T* from, size_t size, U* to); // This generic version is used when k is 0. template <typename T, typename U> inline void CopyArray(const T& from, U* to) { *to = from; } // This overload is used when k >= 1. template <typename T, typename U, size_t N> inline void CopyArray(const T(&from)[N], U(*to)[N]) { internal::CopyArray(from, N, *to); } // This helper reduces code bloat. If we instead put its logic inside // the previous CopyArray() function, arrays with different sizes // would lead to different copies of the template code. template <typename T, typename U> void CopyArray(const T* from, size_t size, U* to) { for (size_t i = 0; i != size; i++) { internal::CopyArray(from[i], to + i); } } // The relation between an NativeArray object (see below) and the // native array it represents. enum RelationToSource { kReference, // The NativeArray references the native array. kCopy // The NativeArray makes a copy of the native array and // owns the copy. }; // Adapts a native array to a read-only STL-style container. Instead // of the complete STL container concept, this adaptor only implements // members useful for Google Mock's container matchers. New members // should be added as needed. To simplify the implementation, we only // support Element being a raw type (i.e. having no top-level const or // reference modifier). It's the client's responsibility to satisfy // this requirement. Element can be an array type itself (hence // multi-dimensional arrays are supported). template <typename Element> class NativeArray { public: // STL-style container typedefs. typedef Element value_type; typedef Element* iterator; typedef const Element* const_iterator; // Constructs from a native array. NativeArray(const Element* array, size_t count, RelationToSource relation) { Init(array, count, relation); } // Copy constructor. NativeArray(const NativeArray& rhs) { Init(rhs.array_, rhs.size_, rhs.relation_to_source_); } ~NativeArray() { // Ensures that the user doesn't instantiate NativeArray with a // const or reference type. static_cast<void>(StaticAssertTypeEqHelper<Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>()); if (relation_to_source_ == kCopy) delete[] array_; } // STL-style container methods. size_t size() const { return size_; } const_iterator begin() const { return array_; } const_iterator end() const { return array_ + size_; } bool operator==(const NativeArray& rhs) const { return size() == rhs.size() && ArrayEq(begin(), size(), rhs.begin()); } private: // Initializes this object; makes a copy of the input array if // 'relation' is kCopy. void Init(const Element* array, size_t a_size, RelationToSource relation) { if (relation == kReference) { array_ = array; } else { Element* const copy = new Element[a_size]; CopyArray(array, a_size, copy); array_ = copy; } size_ = a_size; relation_to_source_ = relation; } const Element* array_; size_t size_; RelationToSource relation_to_source_; GTEST_DISALLOW_ASSIGN_(NativeArray); }; } // namespace internal } // namespace testing #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ ::testing::internal::AssertHelper(result_type, file, line, message) \ = ::testing::Message() #define GTEST_MESSAGE_(message, result_type) \ GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) #define GTEST_FATAL_FAILURE_(message) \ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) #define GTEST_NONFATAL_FAILURE_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) #define GTEST_SUCCESS_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) // Suppresses MSVC warnings 4072 (unreachable code) for the code following // statement if it returns or throws (or doesn't return or throw in some // situations). #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ if (::testing::internal::AlwaysTrue()) { statement; } #define GTEST_TEST_THROW_(statement, expected_exception, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::ConstCharPtr gtest_msg = "") { \ bool gtest_caught_expected = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (expected_exception const&) { \ gtest_caught_expected = true; \ } \ catch (...) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws a different type."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ if (!gtest_caught_expected) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws nothing."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ fail(gtest_msg.value) #define GTEST_TEST_NO_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ fail("Expected: " #statement " doesn't throw an exception.\n" \ " Actual: it throws.") #define GTEST_TEST_ANY_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ bool gtest_caught_any = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ gtest_caught_any = true; \ } \ if (!gtest_caught_any) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ fail("Expected: " #statement " throws an exception.\n" \ " Actual: it doesn't.") // Implements Boolean test assertions such as EXPECT_TRUE. expression can be // either a boolean expression or an AssertionResult. text is a textual // represenation of expression as it was passed into the EXPECT_TRUE. #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar_ = \ ::testing::AssertionResult(expression)) \ ; \ else \ fail(::testing::internal::GetBoolAssertionFailureMessage(\ gtest_ar_, text, #actual, #expected).c_str()) #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ fail("Expected: " #statement " doesn't generate new fatal " \ "failures in the current thread.\n" \ " Actual: it does.") // Expands to the name of the class that implements the given test. #define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ test_case_name##_##test_name##_Test // Helper macro for defining tests. #define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ public:\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ private:\ virtual void TestBody();\ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ };\ \ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ ::test_info_ =\ ::testing::internal::MakeAndRegisterTestInfo(\ #test_case_name, #test_name, NULL, NULL, \ (parent_id), \ parent_class::SetUpTestCase, \ parent_class::TearDownTestCase, \ new ::testing::internal::TestFactoryImpl<\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the public API for death tests. It is // #included by gtest.h so a user doesn't need to include this // directly. #ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file defines internal utilities needed for implementing // death tests. They are subject to change without notice. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #include <stdio.h> namespace testing { namespace internal { GTEST_DECLARE_string_(internal_run_death_test); // Names of the flags (needed for parsing Google Test flags). const char kDeathTestStyleFlag[] = "death_test_style"; const char kDeathTestUseFork[] = "death_test_use_fork"; const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; #if GTEST_HAS_DEATH_TEST // DeathTest is a class that hides much of the complexity of the // GTEST_DEATH_TEST_ macro. It is abstract; its static Create method // returns a concrete class that depends on the prevailing death test // style, as defined by the --gtest_death_test_style and/or // --gtest_internal_run_death_test flags. // In describing the results of death tests, these terms are used with // the corresponding definitions: // // exit status: The integer exit information in the format specified // by wait(2) // exit code: The integer code passed to exit(3), _exit(2), or // returned from main() class GTEST_API_ DeathTest { public: // Create returns false if there was an error determining the // appropriate action to take for the current death test; for example, // if the gtest_death_test_style flag is set to an invalid value. // The LastMessage method will return a more detailed message in that // case. Otherwise, the DeathTest pointer pointed to by the "test" // argument is set. If the death test should be skipped, the pointer // is set to NULL; otherwise, it is set to the address of a new concrete // DeathTest object that controls the execution of the current test. static bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test); DeathTest(); virtual ~DeathTest() { } // A helper class that aborts a death test when it's deleted. class ReturnSentinel { public: explicit ReturnSentinel(DeathTest* test) : test_(test) { } ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } private: DeathTest* const test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); } GTEST_ATTRIBUTE_UNUSED_; // An enumeration of possible roles that may be taken when a death // test is encountered. EXECUTE means that the death test logic should // be executed immediately. OVERSEE means that the program should prepare // the appropriate environment for a child process to execute the death // test, then wait for it to complete. enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; // An enumeration of the three reasons that a test might be aborted. enum AbortReason { TEST_ENCOUNTERED_RETURN_STATEMENT, TEST_THREW_EXCEPTION, TEST_DID_NOT_DIE }; // Assumes one of the above roles. virtual TestRole AssumeRole() = 0; // Waits for the death test to finish and returns its status. virtual int Wait() = 0; // Returns true if the death test passed; that is, the test process // exited during the test, its exit status matches a user-supplied // predicate, and its stderr output matches a user-supplied regular // expression. // The user-supplied predicate may be a macro expression rather // than a function pointer or functor, or else Wait and Passed could // be combined. virtual bool Passed(bool exit_status_ok) = 0; // Signals that the death test did not die as expected. virtual void Abort(AbortReason reason) = 0; // Returns a human-readable outcome message regarding the outcome of // the last death test. static const char* LastMessage(); static void set_last_death_test_message(const String& message); private: // A string containing a description of the outcome of the last death test. static String last_death_test_message_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); }; // Factory interface for death tests. May be mocked out for testing. class DeathTestFactory { public: virtual ~DeathTestFactory() { } virtual bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) = 0; }; // A concrete DeathTestFactory implementation for normal use. class DefaultDeathTestFactory : public DeathTestFactory { public: virtual bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test); }; // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. GTEST_API_ bool ExitedUnsuccessfully(int exit_status); // Traps C++ exceptions escaping statement and reports them as test // failures. Note that trapping SEH exceptions is not implemented here. # if GTEST_HAS_EXCEPTIONS # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } catch (const ::std::exception& gtest_exception) { \ fprintf(\ stderr, \ "\n%s: Caught std::exception-derived exception escaping the " \ "death test statement. Exception message: %s\n", \ ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ gtest_exception.what()); \ fflush(stderr); \ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ } catch (...) { \ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ } # else # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) # endif // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, // ASSERT_EXIT*, and EXPECT_EXIT*. # define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ const ::testing::internal::RE& gtest_regex = (regex); \ ::testing::internal::DeathTest* gtest_dt; \ if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ __FILE__, __LINE__, >est_dt)) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ if (gtest_dt != NULL) { \ ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ gtest_dt_ptr(gtest_dt); \ switch (gtest_dt->AssumeRole()) { \ case ::testing::internal::DeathTest::OVERSEE_TEST: \ if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ break; \ case ::testing::internal::DeathTest::EXECUTE_TEST: { \ ::testing::internal::DeathTest::ReturnSentinel \ gtest_sentinel(gtest_dt); \ GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ break; \ } \ default: \ break; \ } \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ fail(::testing::internal::DeathTest::LastMessage()) // The symbol "fail" here expands to something into which a message // can be streamed. // A class representing the parsed contents of the // --gtest_internal_run_death_test flag, as it existed when // RUN_ALL_TESTS was called. class InternalRunDeathTestFlag { public: InternalRunDeathTestFlag(const String& a_file, int a_line, int an_index, int a_write_fd) : file_(a_file), line_(a_line), index_(an_index), write_fd_(a_write_fd) {} ~InternalRunDeathTestFlag() { if (write_fd_ >= 0) posix::Close(write_fd_); } String file() const { return file_; } int line() const { return line_; } int index() const { return index_; } int write_fd() const { return write_fd_; } private: String file_; int line_; int index_; int write_fd_; GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); }; // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); #else // GTEST_HAS_DEATH_TEST // This macro is used for implementing macros such as // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where // death tests are not supported. Those macros must compile on such systems // iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on // systems that support death tests. This allows one to write such a macro // on a system that does not support death tests and be sure that it will // compile on a death-test supporting system. // // Parameters: // statement - A statement that a macro such as EXPECT_DEATH would test // for program termination. This macro has to make sure this // statement is compiled but not executed, to ensure that // EXPECT_DEATH_IF_SUPPORTED compiles with a certain // parameter iff EXPECT_DEATH compiles with it. // regex - A regex that a macro such as EXPECT_DEATH would use to test // the output of statement. This parameter has to be // compiled but not evaluated by this macro, to ensure that // this macro only accepts expressions that a macro such as // EXPECT_DEATH would accept. // terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED // and a return statement for ASSERT_DEATH_IF_SUPPORTED. // This ensures that ASSERT_DEATH_IF_SUPPORTED will not // compile inside functions where ASSERT_DEATH doesn't // compile. // // The branch that has an always false condition is used to ensure that // statement and regex are compiled (and thus syntactically correct) but // never executed. The unreachable code macro protects the terminator // statement from generating an 'unreachable code' warning in case // statement unconditionally returns or throws. The Message constructor at // the end allows the syntax of streaming additional messages into the // macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. # define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ GTEST_LOG_(WARNING) \ << "Death tests are not supported on this platform.\n" \ << "Statement '" #statement "' cannot be verified."; \ } else if (::testing::internal::AlwaysFalse()) { \ ::testing::internal::RE::PartialMatch(".*", (regex)); \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ terminator; \ } else \ ::testing::Message() #endif // GTEST_HAS_DEATH_TEST } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ namespace testing { // This flag controls the style of death tests. Valid values are "threadsafe", // meaning that the death test child process will re-execute the test binary // from the start, running only a single death test, or "fast", // meaning that the child process will execute the test logic immediately // after forking. GTEST_DECLARE_string_(death_test_style); #if GTEST_HAS_DEATH_TEST // The following macros are useful for writing death tests. // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is // executed: // // 1. It generates a warning if there is more than one active // thread. This is because it's safe to fork() or clone() only // when there is a single thread. // // 2. The parent process clone()s a sub-process and runs the death // test in it; the sub-process exits with code 0 at the end of the // death test, if it hasn't exited already. // // 3. The parent process waits for the sub-process to terminate. // // 4. The parent process checks the exit code and error message of // the sub-process. // // Examples: // // ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); // for (int i = 0; i < 5; i++) { // EXPECT_DEATH(server.ProcessRequest(i), // "Invalid request .* in ProcessRequest()") // << "Failed to die on request " << i); // } // // ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); // // bool KilledBySIGHUP(int exit_code) { // return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; // } // // ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); // // On the regular expressions used in death tests: // // On POSIX-compliant systems (*nix), we use the <regex.h> library, // which uses the POSIX extended regex syntax. // // On other platforms (e.g. Windows), we only support a simple regex // syntax implemented as part of Google Test. This limited // implementation should be enough most of the time when writing // death tests; though it lacks many features you can find in PCRE // or POSIX extended regex syntax. For example, we don't support // union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and // repetition count ("x{5,7}"), among others. // // Below is the syntax that we do support. We chose it to be a // subset of both PCRE and POSIX extended regex, so it's easy to // learn wherever you come from. In the following: 'A' denotes a // literal character, period (.), or a single \\ escape sequence; // 'x' and 'y' denote regular expressions; 'm' and 'n' are for // natural numbers. // // c matches any literal character c // \\d matches any decimal digit // \\D matches any character that's not a decimal digit // \\f matches \f // \\n matches \n // \\r matches \r // \\s matches any ASCII whitespace, including \n // \\S matches any character that's not a whitespace // \\t matches \t // \\v matches \v // \\w matches any letter, _, or decimal digit // \\W matches any character that \\w doesn't match // \\c matches any literal character c, which must be a punctuation // . matches any single character except \n // A? matches 0 or 1 occurrences of A // A* matches 0 or many occurrences of A // A+ matches 1 or many occurrences of A // ^ matches the beginning of a string (not that of each line) // $ matches the end of a string (not that of each line) // xy matches x followed by y // // If you accidentally use PCRE or POSIX extended regex features // not implemented by us, you will get a run-time failure. In that // case, please try to rewrite your regular expression within the // above syntax. // // This implementation is *not* meant to be as highly tuned or robust // as a compiled regex library, but should perform well enough for a // death test, which already incurs significant overhead by launching // a child process. // // Known caveats: // // A "threadsafe" style death test obtains the path to the test // program from argv[0] and re-executes it in the sub-process. For // simplicity, the current implementation doesn't search the PATH // when launching the sub-process. This means that the user must // invoke the test program via a path that contains at least one // path separator (e.g. path/to/foo_test and // /absolute/path/to/bar_test are fine, but foo_test is not). This // is rarely a problem as people usually don't put the test binary // directory in PATH. // // TODO(wan@google.com): make thread-safe death tests search the PATH. // Asserts that a given statement causes the program to exit, with an // integer exit status that satisfies predicate, and emitting error output // that matches regex. # define ASSERT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) // Like ASSERT_EXIT, but continues on to successive tests in the // test case, if any: # define EXPECT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) // Asserts that a given statement causes the program to exit, either by // explicitly exiting with a nonzero exit code or being killed by a // signal, and emitting error output that matches regex. # define ASSERT_DEATH(statement, regex) \ ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Like ASSERT_DEATH, but continues on to successive tests in the // test case, if any: # define EXPECT_DEATH(statement, regex) \ EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: // Tests that an exit code describes a normal exit with a given exit code. class GTEST_API_ ExitedWithCode { public: explicit ExitedWithCode(int exit_code); bool operator()(int exit_status) const; private: // No implementation - assignment is unsupported. void operator=(const ExitedWithCode& other); const int exit_code_; }; # if !GTEST_OS_WINDOWS // Tests that an exit code describes an exit due to termination by a // given signal. class GTEST_API_ KilledBySignal { public: explicit KilledBySignal(int signum); bool operator()(int exit_status) const; private: const int signum_; }; # endif // !GTEST_OS_WINDOWS // EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. // The death testing framework causes this to have interesting semantics, // since the sideeffects of the call are only visible in opt mode, and not // in debug mode. // // In practice, this can be used to test functions that utilize the // LOG(DFATAL) macro using the following style: // // int DieInDebugOr12(int* sideeffect) { // if (sideeffect) { // *sideeffect = 12; // } // LOG(DFATAL) << "death"; // return 12; // } // // TEST(TestCase, TestDieOr12WorksInDgbAndOpt) { // int sideeffect = 0; // // Only asserts in dbg. // EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); // // #ifdef NDEBUG // // opt-mode has sideeffect visible. // EXPECT_EQ(12, sideeffect); // #else // // dbg-mode no visible sideeffect. // EXPECT_EQ(0, sideeffect); // #endif // } // // This will assert that DieInDebugReturn12InOpt() crashes in debug // mode, usually due to a DCHECK or LOG(DFATAL), but returns the // appropriate fallback value (12 in this case) in opt mode. If you // need to test that a function has appropriate side-effects in opt // mode, include assertions against the side-effects. A general // pattern for this is: // // EXPECT_DEBUG_DEATH({ // // Side-effects here will have an effect after this statement in // // opt mode, but none in debug mode. // EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); // }, "death"); // # ifdef NDEBUG # define EXPECT_DEBUG_DEATH(statement, regex) \ do { statement; } while (::testing::internal::AlwaysFalse()) # define ASSERT_DEBUG_DEATH(statement, regex) \ do { statement; } while (::testing::internal::AlwaysFalse()) # else # define EXPECT_DEBUG_DEATH(statement, regex) \ EXPECT_DEATH(statement, regex) # define ASSERT_DEBUG_DEATH(statement, regex) \ ASSERT_DEATH(statement, regex) # endif // NDEBUG for EXPECT_DEBUG_DEATH #endif // GTEST_HAS_DEATH_TEST // EXPECT_DEATH_IF_SUPPORTED(statement, regex) and // ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if // death tests are supported; otherwise they just issue a warning. This is // useful when you are combining death test assertions with normal test // assertions in one test. #if GTEST_HAS_DEATH_TEST # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ EXPECT_DEATH(statement, regex) # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ ASSERT_DEATH(statement, regex) #else # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, ) # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return) #endif } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the Message class. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! #ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #include <limits> namespace testing { // The Message class works like an ostream repeater. // // Typical usage: // // 1. You stream a bunch of values to a Message object. // It will remember the text in a stringstream. // 2. Then you stream the Message object to an ostream. // This causes the text in the Message to be streamed // to the ostream. // // For example; // // testing::Message foo; // foo << 1 << " != " << 2; // std::cout << foo; // // will print "1 != 2". // // Message is not intended to be inherited from. In particular, its // destructor is not virtual. // // Note that stringstream behaves differently in gcc and in MSVC. You // can stream a NULL char pointer to it in the former, but not in the // latter (it causes an access violation if you do). The Message // class hides this difference by treating a NULL char pointer as // "(null)". class GTEST_API_ Message { private: // The type of basic IO manipulators (endl, ends, and flush) for // narrow streams. typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); public: // Constructs an empty Message. // We allocate the stringstream separately because otherwise each use of // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's // stack frame leading to huge stack frames in some cases; gcc does not reuse // the stack space. Message() : ss_(new ::std::stringstream) { // By default, we want there to be enough precision when printing // a double to a Message. *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2); } // Copy constructor. Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT *ss_ << msg.GetString(); } // Constructs a Message from a C-string. explicit Message(const char* str) : ss_(new ::std::stringstream) { *ss_ << str; } #if GTEST_OS_SYMBIAN // Streams a value (either a pointer or not) to this object. template <typename T> inline Message& operator <<(const T& value) { StreamHelper(typename internal::is_pointer<T>::type(), value); return *this; } #else // Streams a non-pointer value to this object. template <typename T> inline Message& operator <<(const T& val) { ::GTestStreamToHelper(ss_.get(), val); return *this; } // Streams a pointer value to this object. // // This function is an overload of the previous one. When you // stream a pointer to a Message, this definition will be used as it // is more specialized. (The C++ Standard, section // [temp.func.order].) If you stream a non-pointer, then the // previous definition will be used. // // The reason for this overload is that streaming a NULL pointer to // ostream is undefined behavior. Depending on the compiler, you // may get "0", "(nil)", "(null)", or an access violation. To // ensure consistent result across compilers, we always treat NULL // as "(null)". template <typename T> inline Message& operator <<(T* const& pointer) { // NOLINT if (pointer == NULL) { *ss_ << "(null)"; } else { ::GTestStreamToHelper(ss_.get(), pointer); } return *this; } #endif // GTEST_OS_SYMBIAN // Since the basic IO manipulators are overloaded for both narrow // and wide streams, we have to provide this specialized definition // of operator <<, even though its body is the same as the // templatized version above. Without this definition, streaming // endl or other basic IO manipulators to Message will confuse the // compiler. Message& operator <<(BasicNarrowIoManip val) { *ss_ << val; return *this; } // Instead of 1/0, we want to see true/false for bool values. Message& operator <<(bool b) { return *this << (b ? "true" : "false"); } // These two overloads allow streaming a wide C string to a Message // using the UTF-8 encoding. Message& operator <<(const wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } Message& operator <<(wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& operator <<(const ::std::wstring& wstr); #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& operator <<(const ::wstring& wstr); #endif // GTEST_HAS_GLOBAL_WSTRING // Gets the text streamed to this object so far as a String. // Each '\0' character in the buffer is replaced with "\\0". // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. internal::String GetString() const { return internal::StringStreamToString(ss_.get()); } private: #if GTEST_OS_SYMBIAN // These are needed as the Nokia Symbian Compiler cannot decide between // const T& and const T* in a function template. The Nokia compiler _can_ // decide between class template specializations for T and T*, so a // tr1::type_traits-like is_pointer works, and we can overload on that. template <typename T> inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) { if (pointer == NULL) { *ss_ << "(null)"; } else { ::GTestStreamToHelper(ss_.get(), pointer); } } template <typename T> inline void StreamHelper(internal::false_type /*dummy*/, const T& value) { ::GTestStreamToHelper(ss_.get(), value); } #endif // GTEST_OS_SYMBIAN // We'll hold the text streamed to this object here. const internal::scoped_ptr< ::std::stringstream> ss_; // We declare (but don't implement) this to prevent the compiler // from implementing the assignment operator. void operator=(const Message&); }; // Streams a Message to an ostream. inline std::ostream& operator <<(std::ostream& os, const Message& sb) { return os << sb.GetString(); } } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ // This file was GENERATED by command: // pump.py gtest-param-test.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: vladl@google.com (Vlad Losev) // // Macros and functions for implementing parameterized tests // in Google C++ Testing Framework (Google Test) // // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Value-parameterized tests allow you to test your code with different // parameters without writing multiple copies of the same test. // // Here is how you use value-parameterized tests: #if 0 // To write value-parameterized tests, first you should define a fixture // class. It is usually derived from testing::TestWithParam<T> (see below for // another inheritance scheme that's sometimes useful in more complicated // class hierarchies), where the type of your parameter values. // TestWithParam<T> is itself derived from testing::Test. T can be any // copyable type. If it's a raw pointer, you are responsible for managing the // lifespan of the pointed values. class FooTest : public ::testing::TestWithParam<const char*> { // You can implement all the usual class fixture members here. }; // Then, use the TEST_P macro to define as many parameterized tests // for this fixture as you want. The _P suffix is for "parameterized" // or "pattern", whichever you prefer to think. TEST_P(FooTest, DoesBlah) { // Inside a test, access the test parameter with the GetParam() method // of the TestWithParam<T> class: EXPECT_TRUE(foo.Blah(GetParam())); ... } TEST_P(FooTest, HasBlahBlah) { ... } // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test // case with any set of parameters you want. Google Test defines a number // of functions for generating test parameters. They return what we call // (surprise!) parameter generators. Here is a summary of them, which // are all in the testing namespace: // // // Range(begin, end [, step]) - Yields values {begin, begin+step, // begin+step+step, ...}. The values do not // include end. step defaults to 1. // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. // ValuesIn(container) - Yields values from a C-style array, an STL // ValuesIn(begin,end) container, or an iterator range [begin, end). // Bool() - Yields sequence {false, true}. // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product // for the math savvy) of the values generated // by the N generators. // // For more details, see comments at the definitions of these functions below // in this file. // // The following statement will instantiate tests from the FooTest test case // each with parameter values "meeny", "miny", and "moe". INSTANTIATE_TEST_CASE_P(InstantiationName, FooTest, Values("meeny", "miny", "moe")); // To distinguish different instances of the pattern, (yes, you // can instantiate it more then once) the first argument to the // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the // actual test case name. Remember to pick unique prefixes for different // instantiations. The tests from the instantiation above will have // these names: // // * InstantiationName/FooTest.DoesBlah/0 for "meeny" // * InstantiationName/FooTest.DoesBlah/1 for "miny" // * InstantiationName/FooTest.DoesBlah/2 for "moe" // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" // * InstantiationName/FooTest.HasBlahBlah/1 for "miny" // * InstantiationName/FooTest.HasBlahBlah/2 for "moe" // // You can use these names in --gtest_filter. // // This statement will instantiate all tests from FooTest again, each // with parameter values "cat" and "dog": const char* pets[] = {"cat", "dog"}; INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); // The tests from the instantiation above will have these names: // // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" // // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests // in the given test case, whether their definitions come before or // AFTER the INSTANTIATE_TEST_CASE_P statement. // // Please also note that generator expressions (including parameters to the // generators) are evaluated in InitGoogleTest(), after main() has started. // This allows the user on one hand, to adjust generator parameters in order // to dynamically determine a set of tests to run and on the other hand, // give the user a chance to inspect the generated tests with Google Test // reflection API before RUN_ALL_TESTS() is executed. // // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc // for more examples. // // In the future, we plan to publish the API for defining new parameter // generators. But for now this interface remains part of the internal // implementation and is subject to change. // // // A parameterized test fixture must be derived from testing::Test and from // testing::WithParamInterface<T>, where T is the type of the parameter // values. Inheriting from TestWithParam<T> satisfies that requirement because // TestWithParam<T> inherits from both Test and WithParamInterface. In more // complicated hierarchies, however, it is occasionally useful to inherit // separately from Test and WithParamInterface. For example: class BaseTest : public ::testing::Test { // You can inherit all the usual members for a non-parameterized test // fixture here. }; class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> { // The usual test fixture members go here too. }; TEST_F(BaseTest, HasFoo) { // This is an ordinary non-parameterized test. } TEST_P(DerivedTest, DoesBlah) { // GetParam works just the same here as if you inherit from TestWithParam. EXPECT_TRUE(foo.Blah(GetParam())); } #endif // 0 #if !GTEST_OS_SYMBIAN # include <utility> #endif // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #include <iterator> #include <utility> #include <vector> // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. // Copyright 2003 Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: Dan Egnor (egnor@google.com) // // A "smart" pointer type with reference tracking. Every pointer to a // particular object is kept on a circular linked list. When the last pointer // to an object is destroyed or reassigned, the object is deleted. // // Used properly, this deletes the object when the last reference goes away. // There are several caveats: // - Like all reference counting schemes, cycles lead to leaks. // - Each smart pointer is actually two pointers (8 bytes instead of 4). // - Every time a pointer is assigned, the entire list of pointers to that // object is traversed. This class is therefore NOT SUITABLE when there // will often be more than two or three pointers to a particular object. // - References are only tracked as long as linked_ptr<> objects are copied. // If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS // will happen (double deletion). // // A good use of this class is storing object references in STL containers. // You can safely put linked_ptr<> in a vector<>. // Other uses may not be as good. // // Note: If you use an incomplete type with linked_ptr<>, the class // *containing* linked_ptr<> must have a constructor and destructor (even // if they do nothing!). // // Bill Gibbons suggested we use something like this. // // Thread Safety: // Unlike other linked_ptr implementations, in this implementation // a linked_ptr object is thread-safe in the sense that: // - it's safe to copy linked_ptr objects concurrently, // - it's safe to copy *from* a linked_ptr and read its underlying // raw pointer (e.g. via get()) concurrently, and // - it's safe to write to two linked_ptrs that point to the same // shared object concurrently. // TODO(wan@google.com): rename this to safe_linked_ptr to avoid // confusion with normal linked_ptr. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #include <stdlib.h> #include <assert.h> namespace testing { namespace internal { // Protects copying of all linked_ptr objects. GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); // This is used internally by all instances of linked_ptr<>. It needs to be // a non-template class because different types of linked_ptr<> can refer to // the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)). // So, it needs to be possible for different types of linked_ptr to participate // in the same circular linked list, so we need a single class type here. // // DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>. class linked_ptr_internal { public: // Create a new circle that includes only this instance. void join_new() { next_ = this; } // Many linked_ptr operations may change p.link_ for some linked_ptr // variable p in the same circle as this object. Therefore we need // to prevent two such operations from occurring concurrently. // // Note that different types of linked_ptr objects can coexist in a // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and // linked_ptr<Derived2>). Therefore we must use a single mutex to // protect all linked_ptr objects. This can create serious // contention in production code, but is acceptable in a testing // framework. // Join an existing circle. // L < g_linked_ptr_mutex void join(linked_ptr_internal const* ptr) { MutexLock lock(&g_linked_ptr_mutex); linked_ptr_internal const* p = ptr; while (p->next_ != ptr) p = p->next_; p->next_ = this; next_ = ptr; } // Leave whatever circle we're part of. Returns true if we were the // last member of the circle. Once this is done, you can join() another. // L < g_linked_ptr_mutex bool depart() { MutexLock lock(&g_linked_ptr_mutex); if (next_ == this) return true; linked_ptr_internal const* p = next_; while (p->next_ != this) p = p->next_; p->next_ = next_; return false; } private: mutable linked_ptr_internal const* next_; }; template <typename T> class linked_ptr { public: typedef T element_type; // Take over ownership of a raw pointer. This should happen as soon as // possible after the object is created. explicit linked_ptr(T* ptr = NULL) { capture(ptr); } ~linked_ptr() { depart(); } // Copy an existing linked_ptr<>, adding ourselves to the list of references. template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); } linked_ptr(linked_ptr const& ptr) { // NOLINT assert(&ptr != this); copy(&ptr); } // Assignment releases the old value and acquires the new. template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) { depart(); copy(&ptr); return *this; } linked_ptr& operator=(linked_ptr const& ptr) { if (&ptr != this) { depart(); copy(&ptr); } return *this; } // Smart pointer members. void reset(T* ptr = NULL) { depart(); capture(ptr); } T* get() const { return value_; } T* operator->() const { return value_; } T& operator*() const { return *value_; } bool operator==(T* p) const { return value_ == p; } bool operator!=(T* p) const { return value_ != p; } template <typename U> bool operator==(linked_ptr<U> const& ptr) const { return value_ == ptr.get(); } template <typename U> bool operator!=(linked_ptr<U> const& ptr) const { return value_ != ptr.get(); } private: template <typename U> friend class linked_ptr; T* value_; linked_ptr_internal link_; void depart() { if (link_.depart()) delete value_; } void capture(T* ptr) { value_ = ptr; link_.join_new(); } template <typename U> void copy(linked_ptr<U> const* ptr) { value_ = ptr->get(); if (value_) link_.join(&ptr->link_); else link_.join_new(); } }; template<typename T> inline bool operator==(T* ptr, const linked_ptr<T>& x) { return ptr == x.get(); } template<typename T> inline bool operator!=(T* ptr, const linked_ptr<T>& x) { return ptr != x.get(); } // A function to convert T* into linked_ptr<T> // Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation // for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg)) template <typename T> linked_ptr<T> make_linked_ptr(T* ptr) { return linked_ptr<T>(ptr); } } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Test - The Google C++ Testing Framework // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr); // // A user can teach this function how to print a class type T by // defining either operator<<() or PrintTo() in the namespace that // defines T. More specifically, the FIRST defined function in the // following list will be used (assuming T is defined in namespace // foo): // // 1. foo::PrintTo(const T&, ostream*) // 2. operator<<(ostream&, const T&) defined in either foo or the // global namespace. // // If none of the above is defined, it will print the debug string of // the value if it is a protocol buffer, or print the raw bytes in the // value otherwise. // // To aid debugging: when T is a reference type, the address of the // value is also printed; when T is a (const) char pointer, both the // pointer value and the NUL-terminated string it points to are // printed. // // We also provide some convenient wrappers: // // // Prints a value to a string. For a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // std::string ::testing::PrintToString(const T& value); // // // Prints a value tersely: for a reference type, the referenced // // value (but not the address) is printed; for a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // void ::testing::internal::UniversalTersePrint(const T& value, ostream*); // // // Prints value using the type inferred by the compiler. The difference // // from UniversalTersePrint() is that this function prints both the // // pointer and the NUL-terminated string for a (const or not) char pointer. // void ::testing::internal::UniversalPrint(const T& value, ostream*); // // // Prints the fields of a tuple tersely to a string vector, one // // element for each field. Tuple support must be enabled in // // gtest-port.h. // std::vector<string> UniversalTersePrintTupleFieldsToStrings( // const Tuple& value); // // Known limitation: // // The print primitives print the elements of an STL-style container // using the compiler-inferred type of *iter where iter is a // const_iterator of the container. When const_iterator is an input // iterator but not a forward iterator, this inferred type may not // match value_type, and the print output may be incorrect. In // practice, this is rarely a problem as for most containers // const_iterator is a forward iterator. We'll fix this if there's an // actual need for it. Note that this fix cannot rely on value_type // being defined as many user-defined container types don't have // value_type. #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #include <ostream> // NOLINT #include <sstream> #include <string> #include <utility> #include <vector> namespace testing { // Definitions in the 'internal' and 'internal2' name spaces are // subject to change without notice. DO NOT USE THEM IN USER CODE! namespace internal2 { // Prints the given number of bytes in the given object to the given // ostream. GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ::std::ostream* os); // For selecting which printer to use when a given type has neither << // nor PrintTo(). enum TypeKind { kProtobuf, // a protobuf type kConvertibleToInteger, // a type implicitly convertible to BiggestInt // (e.g. a named or unnamed enum type) kOtherType // anything else }; // TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called // by the universal printer to print a value of type T when neither // operator<< nor PrintTo() is defined for T, where kTypeKind is the // "kind" of T as defined by enum TypeKind. template <typename T, TypeKind kTypeKind> class TypeWithoutFormatter { public: // This default version is called when kTypeKind is kOtherType. static void PrintValue(const T& value, ::std::ostream* os) { PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value), sizeof(value), os); } }; // We print a protobuf using its ShortDebugString() when the string // doesn't exceed this many characters; otherwise we print it using // DebugString() for better readability. const size_t kProtobufOneLinerMaxLength = 50; template <typename T> class TypeWithoutFormatter<T, kProtobuf> { public: static void PrintValue(const T& value, ::std::ostream* os) { const ::testing::internal::string short_str = value.ShortDebugString(); const ::testing::internal::string pretty_str = short_str.length() <= kProtobufOneLinerMaxLength ? short_str : ("\n" + value.DebugString()); *os << ("<" + pretty_str + ">"); } }; template <typename T> class TypeWithoutFormatter<T, kConvertibleToInteger> { public: // Since T has no << operator or PrintTo() but can be implicitly // converted to BiggestInt, we print it as a BiggestInt. // // Most likely T is an enum type (either named or unnamed), in which // case printing it as an integer is the desired behavior. In case // T is not an enum, printing it as an integer is the best we can do // given that it has no user-defined printer. static void PrintValue(const T& value, ::std::ostream* os) { const internal::BiggestInt kBigInt = value; *os << kBigInt; } }; // Prints the given value to the given ostream. If the value is a // protocol message, its debug string is printed; if it's an enum or // of a type implicitly convertible to BiggestInt, it's printed as an // integer; otherwise the bytes in the value are printed. This is // what UniversalPrinter<T>::Print() does when it knows nothing about // type T and T has neither << operator nor PrintTo(). // // A user can override this behavior for a class type Foo by defining // a << operator in the namespace where Foo is defined. // // We put this operator in namespace 'internal2' instead of 'internal' // to simplify the implementation, as much code in 'internal' needs to // use << in STL, which would conflict with our own << were it defined // in 'internal'. // // Note that this operator<< takes a generic std::basic_ostream<Char, // CharTraits> type instead of the more restricted std::ostream. If // we define it to take an std::ostream instead, we'll get an // "ambiguous overloads" compiler error when trying to print a type // Foo that supports streaming to std::basic_ostream<Char, // CharTraits>, as the compiler cannot tell whether // operator<<(std::ostream&, const T&) or // operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more // specific. template <typename Char, typename CharTraits, typename T> ::std::basic_ostream<Char, CharTraits>& operator<<( ::std::basic_ostream<Char, CharTraits>& os, const T& x) { TypeWithoutFormatter<T, (internal::IsAProtocolMessage<T>::value ? kProtobuf : internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ? kConvertibleToInteger : kOtherType)>::PrintValue(x, &os); return os; } } // namespace internal2 } // namespace testing // This namespace MUST NOT BE NESTED IN ::testing, or the name look-up // magic needed for implementing UniversalPrinter won't work. namespace testing_internal { // Used to print a value that is not an STL-style container when the // user doesn't define PrintTo() for it. template <typename T> void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { // With the following statement, during unqualified name lookup, // testing::internal2::operator<< appears as if it was declared in // the nearest enclosing namespace that contains both // ::testing_internal and ::testing::internal2, i.e. the global // namespace. For more details, refer to the C++ Standard section // 7.3.4-1 [namespace.udir]. This allows us to fall back onto // testing::internal2::operator<< in case T doesn't come with a << // operator. // // We cannot write 'using ::testing::internal2::operator<<;', which // gcc 3.3 fails to compile due to a compiler bug. using namespace ::testing::internal2; // NOLINT // Assuming T is defined in namespace foo, in the next statement, // the compiler will consider all of: // // 1. foo::operator<< (thanks to Koenig look-up), // 2. ::operator<< (as the current namespace is enclosed in ::), // 3. testing::internal2::operator<< (thanks to the using statement above). // // The operator<< whose type matches T best will be picked. // // We deliberately allow #2 to be a candidate, as sometimes it's // impossible to define #1 (e.g. when foo is ::std, defining // anything in it is undefined behavior unless you are a compiler // vendor.). *os << value; } } // namespace testing_internal namespace testing { namespace internal { // UniversalPrinter<T>::Print(value, ostream_ptr) prints the given // value to the given ostream. The caller must ensure that // 'ostream_ptr' is not NULL, or the behavior is undefined. // // We define UniversalPrinter as a class template (as opposed to a // function template), as we need to partially specialize it for // reference types, which cannot be done with function templates. template <typename T> class UniversalPrinter; template <typename T> void UniversalPrint(const T& value, ::std::ostream* os); // Used to print an STL-style container when the user doesn't define // a PrintTo() for it. template <typename C> void DefaultPrintTo(IsContainer /* dummy */, false_type /* is not a pointer */, const C& container, ::std::ostream* os) { const size_t kMaxCount = 32; // The maximum number of elements to print. *os << '{'; size_t count = 0; for (typename C::const_iterator it = container.begin(); it != container.end(); ++it, ++count) { if (count > 0) { *os << ','; if (count == kMaxCount) { // Enough has been printed. *os << " ..."; break; } } *os << ' '; // We cannot call PrintTo(*it, os) here as PrintTo() doesn't // handle *it being a native array. internal::UniversalPrint(*it, os); } if (count > 0) { *os << ' '; } *os << '}'; } // Used to print a pointer that is neither a char pointer nor a member // pointer, when the user doesn't define PrintTo() for it. (A member // variable pointer or member function pointer doesn't really point to // a location in the address space. Their representation is // implementation-defined. Therefore they will be printed as raw // bytes.) template <typename T> void DefaultPrintTo(IsNotContainer /* dummy */, true_type /* is a pointer */, T* p, ::std::ostream* os) { if (p == NULL) { *os << "NULL"; } else { // C++ doesn't allow casting from a function pointer to any object // pointer. // // IsTrue() silences warnings: "Condition is always true", // "unreachable code". if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) { // T is not a function type. We just call << to print p, // relying on ADL to pick up user-defined << for their pointer // types, if any. *os << p; } else { // T is a function type, so '*os << p' doesn't do what we want // (it just prints p as bool). We want to print p as a const // void*. However, we cannot cast it to const void* directly, // even using reinterpret_cast, as earlier versions of gcc // (e.g. 3.4.5) cannot compile the cast when p is a function // pointer. Casting to UInt64 first solves the problem. *os << reinterpret_cast<const void*>( reinterpret_cast<internal::UInt64>(p)); } } } // Used to print a non-container, non-pointer value when the user // doesn't define PrintTo() for it. template <typename T> void DefaultPrintTo(IsNotContainer /* dummy */, false_type /* is not a pointer */, const T& value, ::std::ostream* os) { ::testing_internal::DefaultPrintNonContainerTo(value, os); } // Prints the given value using the << operator if it has one; // otherwise prints the bytes in it. This is what // UniversalPrinter<T>::Print() does when PrintTo() is not specialized // or overloaded for type T. // // A user can override this behavior for a class type Foo by defining // an overload of PrintTo() in the namespace where Foo is defined. We // give the user this option as sometimes defining a << operator for // Foo is not desirable (e.g. the coding style may prevent doing it, // or there is already a << operator but it doesn't do what the user // wants). template <typename T> void PrintTo(const T& value, ::std::ostream* os) { // DefaultPrintTo() is overloaded. The type of its first two // arguments determine which version will be picked. If T is an // STL-style container, the version for container will be called; if // T is a pointer, the pointer version will be called; otherwise the // generic version will be called. // // Note that we check for container types here, prior to we check // for protocol message types in our operator<<. The rationale is: // // For protocol messages, we want to give people a chance to // override Google Mock's format by defining a PrintTo() or // operator<<. For STL containers, other formats can be // incompatible with Google Mock's format for the container // elements; therefore we check for container types here to ensure // that our format is used. // // The second argument of DefaultPrintTo() is needed to bypass a bug // in Symbian's C++ compiler that prevents it from picking the right // overload between: // // PrintTo(const T& x, ...); // PrintTo(T* x, ...); DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os); } // The following list of PrintTo() overloads tells // UniversalPrinter<T>::Print() how to print standard types (built-in // types, strings, plain arrays, and pointers). // Overloads for various char types. GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os); GTEST_API_ void PrintTo(signed char c, ::std::ostream* os); inline void PrintTo(char c, ::std::ostream* os) { // When printing a plain char, we always treat it as unsigned. This // way, the output won't be affected by whether the compiler thinks // char is signed or not. PrintTo(static_cast<unsigned char>(c), os); } // Overloads for other simple built-in types. inline void PrintTo(bool x, ::std::ostream* os) { *os << (x ? "true" : "false"); } // Overload for wchar_t type. // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its decimal code (except for L'\0'). // The L'\0' char is printed as "L'\\0'". The decimal code is printed // as signed integer when wchar_t is implemented by the compiler // as a signed type and is printed as an unsigned integer when wchar_t // is implemented as an unsigned type. GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); // Overloads for C strings. GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); inline void PrintTo(char* s, ::std::ostream* os) { PrintTo(ImplicitCast_<const char*>(s), os); } // signed/unsigned char is often used for representing binary data, so // we print pointers to it as void* to be safe. inline void PrintTo(const signed char* s, ::std::ostream* os) { PrintTo(ImplicitCast_<const void*>(s), os); } inline void PrintTo(signed char* s, ::std::ostream* os) { PrintTo(ImplicitCast_<const void*>(s), os); } inline void PrintTo(const unsigned char* s, ::std::ostream* os) { PrintTo(ImplicitCast_<const void*>(s), os); } inline void PrintTo(unsigned char* s, ::std::ostream* os) { PrintTo(ImplicitCast_<const void*>(s), os); } // MSVC can be configured to define wchar_t as a typedef of unsigned // short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native // type. When wchar_t is a typedef, defining an overload for const // wchar_t* would cause unsigned short* be printed as a wide string, // possibly causing invalid memory accesses. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Overloads for wide C strings GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os); inline void PrintTo(wchar_t* s, ::std::ostream* os) { PrintTo(ImplicitCast_<const wchar_t*>(s), os); } #endif // Overload for C arrays. Multi-dimensional arrays are printed // properly. // Prints the given number of elements in an array, without printing // the curly braces. template <typename T> void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { UniversalPrint(a[0], os); for (size_t i = 1; i != count; i++) { *os << ", "; UniversalPrint(a[i], os); } } // Overloads for ::string and ::std::string. #if GTEST_HAS_GLOBAL_STRING GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os); inline void PrintTo(const ::string& s, ::std::ostream* os) { PrintStringTo(s, os); } #endif // GTEST_HAS_GLOBAL_STRING GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os); inline void PrintTo(const ::std::string& s, ::std::ostream* os) { PrintStringTo(s, os); } // Overloads for ::wstring and ::std::wstring. #if GTEST_HAS_GLOBAL_WSTRING GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os); inline void PrintTo(const ::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } #endif // GTEST_HAS_GLOBAL_WSTRING #if GTEST_HAS_STD_WSTRING GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_TR1_TUPLE // Overload for ::std::tr1::tuple. Needed for printing function arguments, // which are packed as tuples. // Helper function for printing a tuple. T must be instantiated with // a tuple type. template <typename T> void PrintTupleTo(const T& t, ::std::ostream* os); // Overloaded PrintTo() for tuples of various arities. We support // tuples of up-to 10 fields. The following implementation works // regardless of whether tr1::tuple is implemented using the // non-standard variadic template feature or not. inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1> void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2> void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3> void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3, typename T4> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3, typename T4, typename T5> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> void PrintTo( const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t, ::std::ostream* os) { PrintTupleTo(t, os); } #endif // GTEST_HAS_TR1_TUPLE // Overload for std::pair. template <typename T1, typename T2> void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) { *os << '('; // We cannot use UniversalPrint(value.first, os) here, as T1 may be // a reference type. The same for printing value.second. UniversalPrinter<T1>::Print(value.first, os); *os << ", "; UniversalPrinter<T2>::Print(value.second, os); *os << ')'; } // Implements printing a non-reference type T by letting the compiler // pick the right overload of PrintTo() for T. template <typename T> class UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4180) // Temporarily disables warning 4180. #endif // _MSC_VER // Note: we deliberately don't call this PrintTo(), as that name // conflicts with ::testing::internal::PrintTo in the body of the // function. static void Print(const T& value, ::std::ostream* os) { // By default, ::testing::internal::PrintTo() is used for printing // the value. // // Thanks to Koenig look-up, if T is a class and has its own // PrintTo() function defined in its namespace, that function will // be visible here. Since it is more specific than the generic ones // in ::testing::internal, it will be picked by the compiler in the // following statement - exactly what we want. PrintTo(value, os); } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif // _MSC_VER }; // UniversalPrintArray(begin, len, os) prints an array of 'len' // elements, starting at address 'begin'. template <typename T> void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { if (len == 0) { *os << "{}"; } else { *os << "{ "; const size_t kThreshold = 18; const size_t kChunkSize = 8; // If the array has more than kThreshold elements, we'll have to // omit some details by printing only the first and the last // kChunkSize elements. // TODO(wan@google.com): let the user control the threshold using a flag. if (len <= kThreshold) { PrintRawArrayTo(begin, len, os); } else { PrintRawArrayTo(begin, kChunkSize, os); *os << ", ..., "; PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os); } *os << " }"; } } // This overload prints a (const) char array compactly. GTEST_API_ void UniversalPrintArray(const char* begin, size_t len, ::std::ostream* os); // Implements printing an array type T[N]. template <typename T, size_t N> class UniversalPrinter<T[N]> { public: // Prints the given array, omitting some elements when there are too // many. static void Print(const T (&a)[N], ::std::ostream* os) { UniversalPrintArray(a, N, os); } }; // Implements printing a reference type T&. template <typename T> class UniversalPrinter<T&> { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4180) // Temporarily disables warning 4180. #endif // _MSC_VER static void Print(const T& value, ::std::ostream* os) { // Prints the address of the value. We use reinterpret_cast here // as static_cast doesn't compile when T is a function type. *os << "@" << reinterpret_cast<const void*>(&value) << " "; // Then prints the value itself. UniversalPrint(value, os); } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif // _MSC_VER }; // Prints a value tersely: for a reference type, the referenced value // (but not the address) is printed; for a (const) char pointer, the // NUL-terminated string (but not the pointer) is printed. template <typename T> void UniversalTersePrint(const T& value, ::std::ostream* os) { UniversalPrint(value, os); } inline void UniversalTersePrint(const char* str, ::std::ostream* os) { if (str == NULL) { *os << "NULL"; } else { UniversalPrint(string(str), os); } } inline void UniversalTersePrint(char* str, ::std::ostream* os) { UniversalTersePrint(static_cast<const char*>(str), os); } // Prints a value using the type inferred by the compiler. The // difference between this and UniversalTersePrint() is that for a // (const) char pointer, this prints both the pointer and the // NUL-terminated string. template <typename T> void UniversalPrint(const T& value, ::std::ostream* os) { UniversalPrinter<T>::Print(value, os); } #if GTEST_HAS_TR1_TUPLE typedef ::std::vector<string> Strings; // This helper template allows PrintTo() for tuples and // UniversalTersePrintTupleFieldsToStrings() to be defined by // induction on the number of tuple fields. The idea is that // TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N // fields in tuple t, and can be defined in terms of // TuplePrefixPrinter<N - 1>. // The inductive case. template <size_t N> struct TuplePrefixPrinter { // Prints the first N fields of a tuple. template <typename Tuple> static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os); *os << ", "; UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type> ::Print(::std::tr1::get<N - 1>(t), os); } // Tersely prints the first N fields of a tuple to a string vector, // one element for each field. template <typename Tuple> static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings); ::std::stringstream ss; UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss); strings->push_back(ss.str()); } }; // Base cases. template <> struct TuplePrefixPrinter<0> { template <typename Tuple> static void PrintPrefixTo(const Tuple&, ::std::ostream*) {} template <typename Tuple> static void TersePrintPrefixToStrings(const Tuple&, Strings*) {} }; // We have to specialize the entire TuplePrefixPrinter<> class // template here, even though the definition of // TersePrintPrefixToStrings() is the same as the generic version, as // Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't // support specializing a method template of a class template. template <> struct TuplePrefixPrinter<1> { template <typename Tuple> static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>:: Print(::std::tr1::get<0>(t), os); } template <typename Tuple> static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { ::std::stringstream ss; UniversalTersePrint(::std::tr1::get<0>(t), &ss); strings->push_back(ss.str()); } }; // Helper function for printing a tuple. T must be instantiated with // a tuple type. template <typename T> void PrintTupleTo(const T& t, ::std::ostream* os) { *os << "("; TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>:: PrintPrefixTo(t, os); *os << ")"; } // Prints the fields of a tuple tersely to a string vector, one // element for each field. See the comment before // UniversalTersePrint() for how we define "tersely". template <typename Tuple> Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { Strings result; TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>:: TersePrintPrefixToStrings(value, &result); return result; } #endif // GTEST_HAS_TR1_TUPLE } // namespace internal template <typename T> ::std::string PrintToString(const T& value) { ::std::stringstream ss; internal::UniversalTersePrint(value, &ss); return ss.str(); } } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #if GTEST_HAS_PARAM_TEST namespace testing { namespace internal { // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Outputs a message explaining invalid registration of different // fixture class for the same test case. This may happen when // TEST_P macro is used to define two tests with the same name // but in different namespaces. GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name, const char* file, int line); template <typename> class ParamGeneratorInterface; template <typename> class ParamGenerator; // Interface for iterating over elements provided by an implementation // of ParamGeneratorInterface<T>. template <typename T> class ParamIteratorInterface { public: virtual ~ParamIteratorInterface() {} // A pointer to the base generator instance. // Used only for the purposes of iterator comparison // to make sure that two iterators belong to the same generator. virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0; // Advances iterator to point to the next element // provided by the generator. The caller is responsible // for not calling Advance() on an iterator equal to // BaseGenerator()->End(). virtual void Advance() = 0; // Clones the iterator object. Used for implementing copy semantics // of ParamIterator<T>. virtual ParamIteratorInterface* Clone() const = 0; // Dereferences the current iterator and provides (read-only) access // to the pointed value. It is the caller's responsibility not to call // Current() on an iterator equal to BaseGenerator()->End(). // Used for implementing ParamGenerator<T>::operator*(). virtual const T* Current() const = 0; // Determines whether the given iterator and other point to the same // element in the sequence generated by the generator. // Used for implementing ParamGenerator<T>::operator==(). virtual bool Equals(const ParamIteratorInterface& other) const = 0; }; // Class iterating over elements provided by an implementation of // ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T> // and implements the const forward iterator concept. template <typename T> class ParamIterator { public: typedef T value_type; typedef const T& reference; typedef ptrdiff_t difference_type; // ParamIterator assumes ownership of the impl_ pointer. ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} ParamIterator& operator=(const ParamIterator& other) { if (this != &other) impl_.reset(other.impl_->Clone()); return *this; } const T& operator*() const { return *impl_->Current(); } const T* operator->() const { return impl_->Current(); } // Prefix version of operator++. ParamIterator& operator++() { impl_->Advance(); return *this; } // Postfix version of operator++. ParamIterator operator++(int /*unused*/) { ParamIteratorInterface<T>* clone = impl_->Clone(); impl_->Advance(); return ParamIterator(clone); } bool operator==(const ParamIterator& other) const { return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); } bool operator!=(const ParamIterator& other) const { return !(*this == other); } private: friend class ParamGenerator<T>; explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {} scoped_ptr<ParamIteratorInterface<T> > impl_; }; // ParamGeneratorInterface<T> is the binary interface to access generators // defined in other translation units. template <typename T> class ParamGeneratorInterface { public: typedef T ParamType; virtual ~ParamGeneratorInterface() {} // Generator interface definition virtual ParamIteratorInterface<T>* Begin() const = 0; virtual ParamIteratorInterface<T>* End() const = 0; }; // Wraps ParamGeneratorInterface<T> and provides general generator syntax // compatible with the STL Container concept. // This class implements copy initialization semantics and the contained // ParamGeneratorInterface<T> instance is shared among all copies // of the original object. This is possible because that instance is immutable. template<typename T> class ParamGenerator { public: typedef ParamIterator<T> iterator; explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {} ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} ParamGenerator& operator=(const ParamGenerator& other) { impl_ = other.impl_; return *this; } iterator begin() const { return iterator(impl_->Begin()); } iterator end() const { return iterator(impl_->End()); } private: linked_ptr<const ParamGeneratorInterface<T> > impl_; }; // Generates values from a range of two comparable values. Can be used to // generate sequences of user-defined types that implement operator+() and // operator<(). // This class is used in the Range() function. template <typename T, typename IncrementT> class RangeGenerator : public ParamGeneratorInterface<T> { public: RangeGenerator(T begin, T end, IncrementT step) : begin_(begin), end_(end), step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} virtual ~RangeGenerator() {} virtual ParamIteratorInterface<T>* Begin() const { return new Iterator(this, begin_, 0, step_); } virtual ParamIteratorInterface<T>* End() const { return new Iterator(this, end_, end_index_, step_); } private: class Iterator : public ParamIteratorInterface<T> { public: Iterator(const ParamGeneratorInterface<T>* base, T value, int index, IncrementT step) : base_(base), value_(value), index_(index), step_(step) {} virtual ~Iterator() {} virtual const ParamGeneratorInterface<T>* BaseGenerator() const { return base_; } virtual void Advance() { value_ = value_ + step_; index_++; } virtual ParamIteratorInterface<T>* Clone() const { return new Iterator(*this); } virtual const T* Current() const { return &value_; } virtual bool Equals(const ParamIteratorInterface<T>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const int other_index = CheckedDowncastToActualType<const Iterator>(&other)->index_; return index_ == other_index; } private: Iterator(const Iterator& other) : ParamIteratorInterface<T>(), base_(other.base_), value_(other.value_), index_(other.index_), step_(other.step_) {} // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<T>* const base_; T value_; int index_; const IncrementT step_; }; // class RangeGenerator::Iterator static int CalculateEndIndex(const T& begin, const T& end, const IncrementT& step) { int end_index = 0; for (T i = begin; i < end; i = i + step) end_index++; return end_index; } // No implementation - assignment is unsupported. void operator=(const RangeGenerator& other); const T begin_; const T end_; const IncrementT step_; // The index for the end() iterator. All the elements in the generated // sequence are indexed (0-based) to aid iterator comparison. const int end_index_; }; // class RangeGenerator // Generates values from a pair of STL-style iterators. Used in the // ValuesIn() function. The elements are copied from the source range // since the source can be located on the stack, and the generator // is likely to persist beyond that stack frame. template <typename T> class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> { public: template <typename ForwardIterator> ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) : container_(begin, end) {} virtual ~ValuesInIteratorRangeGenerator() {} virtual ParamIteratorInterface<T>* Begin() const { return new Iterator(this, container_.begin()); } virtual ParamIteratorInterface<T>* End() const { return new Iterator(this, container_.end()); } private: typedef typename ::std::vector<T> ContainerType; class Iterator : public ParamIteratorInterface<T> { public: Iterator(const ParamGeneratorInterface<T>* base, typename ContainerType::const_iterator iterator) : base_(base), iterator_(iterator) {} virtual ~Iterator() {} virtual const ParamGeneratorInterface<T>* BaseGenerator() const { return base_; } virtual void Advance() { ++iterator_; value_.reset(); } virtual ParamIteratorInterface<T>* Clone() const { return new Iterator(*this); } // We need to use cached value referenced by iterator_ because *iterator_ // can return a temporary object (and of type other then T), so just // having "return &*iterator_;" doesn't work. // value_ is updated here and not in Advance() because Advance() // can advance iterator_ beyond the end of the range, and we cannot // detect that fact. The client code, on the other hand, is // responsible for not calling Current() on an out-of-range iterator. virtual const T* Current() const { if (value_.get() == NULL) value_.reset(new T(*iterator_)); return value_.get(); } virtual bool Equals(const ParamIteratorInterface<T>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; return iterator_ == CheckedDowncastToActualType<const Iterator>(&other)->iterator_; } private: Iterator(const Iterator& other) // The explicit constructor call suppresses a false warning // emitted by gcc when supplied with the -Wextra option. : ParamIteratorInterface<T>(), base_(other.base_), iterator_(other.iterator_) {} const ParamGeneratorInterface<T>* const base_; typename ContainerType::const_iterator iterator_; // A cached value of *iterator_. We keep it here to allow access by // pointer in the wrapping iterator's operator->(). // value_ needs to be mutable to be accessed in Current(). // Use of scoped_ptr helps manage cached value's lifetime, // which is bound by the lifespan of the iterator itself. mutable scoped_ptr<const T> value_; }; // class ValuesInIteratorRangeGenerator::Iterator // No implementation - assignment is unsupported. void operator=(const ValuesInIteratorRangeGenerator& other); const ContainerType container_; }; // class ValuesInIteratorRangeGenerator // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Stores a parameter value and later creates tests parameterized with that // value. template <class TestClass> class ParameterizedTestFactory : public TestFactoryBase { public: typedef typename TestClass::ParamType ParamType; explicit ParameterizedTestFactory(ParamType parameter) : parameter_(parameter) {} virtual Test* CreateTest() { TestClass::SetParam(¶meter_); return new TestClass(); } private: const ParamType parameter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactoryBase is a base class for meta-factories that create // test factories for passing into MakeAndRegisterTestInfo function. template <class ParamType> class TestMetaFactoryBase { public: virtual ~TestMetaFactoryBase() {} virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactory creates test factories for passing into // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives // ownership of test factory pointer, same factory object cannot be passed // into that method twice. But ParameterizedTestCaseInfo is going to call // it for each Test/Parameter value combination. Thus it needs meta factory // creator class. template <class TestCase> class TestMetaFactory : public TestMetaFactoryBase<typename TestCase::ParamType> { public: typedef typename TestCase::ParamType ParamType; TestMetaFactory() {} virtual TestFactoryBase* CreateTestFactory(ParamType parameter) { return new ParameterizedTestFactory<TestCase>(parameter); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseInfoBase is a generic interface // to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase // accumulates test information provided by TEST_P macro invocations // and generators provided by INSTANTIATE_TEST_CASE_P macro invocations // and uses that information to register all resulting test instances // in RegisterTests method. The ParameterizeTestCaseRegistry class holds // a collection of pointers to the ParameterizedTestCaseInfo objects // and calls RegisterTests() on each of them when asked. class ParameterizedTestCaseInfoBase { public: virtual ~ParameterizedTestCaseInfoBase() {} // Base part of test case name for display purposes. virtual const string& GetTestCaseName() const = 0; // Test case id to verify identity. virtual TypeId GetTestCaseTypeId() const = 0; // UnitTest class invokes this method to register tests in this // test case right before running them in RUN_ALL_TESTS macro. // This method should not be called more then once on any single // instance of a ParameterizedTestCaseInfoBase derived class. virtual void RegisterTests() = 0; protected: ParameterizedTestCaseInfoBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseInfo accumulates tests obtained from TEST_P // macro invocations for a particular test case and generators // obtained from INSTANTIATE_TEST_CASE_P macro invocations for that // test case. It registers tests with all values generated by all // generators when asked. template <class TestCase> class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase { public: // ParamType and GeneratorCreationFunc are private types but are required // for declarations of public methods AddTestPattern() and // AddTestCaseInstantiation(). typedef typename TestCase::ParamType ParamType; // A function that returns an instance of appropriate generator type. typedef ParamGenerator<ParamType>(GeneratorCreationFunc)(); explicit ParameterizedTestCaseInfo(const char* name) : test_case_name_(name) {} // Test case base name for display purposes. virtual const string& GetTestCaseName() const { return test_case_name_; } // Test case id to verify identity. virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); } // TEST_P macro uses AddTestPattern() to record information // about a single test in a LocalTestInfo structure. // test_case_name is the base name of the test case (without invocation // prefix). test_base_name is the name of an individual test without // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is // test case base name and DoBar is test base name. void AddTestPattern(const char* test_case_name, const char* test_base_name, TestMetaFactoryBase<ParamType>* meta_factory) { tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name, test_base_name, meta_factory))); } // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information // about a generator. int AddTestCaseInstantiation(const string& instantiation_name, GeneratorCreationFunc* func, const char* /* file */, int /* line */) { instantiations_.push_back(::std::make_pair(instantiation_name, func)); return 0; // Return value used only to run this method in namespace scope. } // UnitTest class invokes this method to register tests in this test case // test cases right before running tests in RUN_ALL_TESTS macro. // This method should not be called more then once on any single // instance of a ParameterizedTestCaseInfoBase derived class. // UnitTest has a guard to prevent from calling this method more then once. virtual void RegisterTests() { for (typename TestInfoContainer::iterator test_it = tests_.begin(); test_it != tests_.end(); ++test_it) { linked_ptr<TestInfo> test_info = *test_it; for (typename InstantiationContainer::iterator gen_it = instantiations_.begin(); gen_it != instantiations_.end(); ++gen_it) { const string& instantiation_name = gen_it->first; ParamGenerator<ParamType> generator((*gen_it->second)()); Message test_case_name_stream; if ( !instantiation_name.empty() ) test_case_name_stream << instantiation_name << "/"; test_case_name_stream << test_info->test_case_base_name; int i = 0; for (typename ParamGenerator<ParamType>::iterator param_it = generator.begin(); param_it != generator.end(); ++param_it, ++i) { Message test_name_stream; test_name_stream << test_info->test_base_name << "/" << i; MakeAndRegisterTestInfo( test_case_name_stream.GetString().c_str(), test_name_stream.GetString().c_str(), NULL, // No type parameter. PrintToString(*param_it).c_str(), GetTestCaseTypeId(), TestCase::SetUpTestCase, TestCase::TearDownTestCase, test_info->test_meta_factory->CreateTestFactory(*param_it)); } // for param_it } // for gen_it } // for test_it } // RegisterTests private: // LocalTestInfo structure keeps information about a single test registered // with TEST_P macro. struct TestInfo { TestInfo(const char* a_test_case_base_name, const char* a_test_base_name, TestMetaFactoryBase<ParamType>* a_test_meta_factory) : test_case_base_name(a_test_case_base_name), test_base_name(a_test_base_name), test_meta_factory(a_test_meta_factory) {} const string test_case_base_name; const string test_base_name; const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory; }; typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer; // Keeps pairs of <Instantiation name, Sequence generator creation function> // received from INSTANTIATE_TEST_CASE_P macros. typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> > InstantiationContainer; const string test_case_name_; TestInfoContainer tests_; InstantiationContainer instantiations_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo); }; // class ParameterizedTestCaseInfo // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase // classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P // macros use it to locate their corresponding ParameterizedTestCaseInfo // descriptors. class ParameterizedTestCaseRegistry { public: ParameterizedTestCaseRegistry() {} ~ParameterizedTestCaseRegistry() { for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { delete *it; } } // Looks up or creates and returns a structure containing information about // tests and instantiations of a particular test case. template <class TestCase> ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder( const char* test_case_name, const char* file, int line) { ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL; for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { if ((*it)->GetTestCaseName() == test_case_name) { if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) { // Complain about incorrect usage of Google Test facilities // and terminate the program since we cannot guaranty correct // test case setup and tear-down in this case. ReportInvalidTestCaseType(test_case_name, file, line); posix::Abort(); } else { // At this point we are sure that the object we found is of the same // type we are looking for, so we downcast it to that type // without further checks. typed_test_info = CheckedDowncastToActualType< ParameterizedTestCaseInfo<TestCase> >(*it); } break; } } if (typed_test_info == NULL) { typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name); test_case_infos_.push_back(typed_test_info); } return typed_test_info; } void RegisterTests() { for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { (*it)->RegisterTests(); } } private: typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer; TestCaseInfoContainer test_case_infos_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry); }; } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ // This file was GENERATED by command: // pump.py gtest-param-util-generated.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently Google Test supports at most 50 arguments in Values, // and at most 10 arguments in Combine. Please contact // googletestframework@googlegroups.com if you need more. // Please note that the number of arguments to Combine is limited // by the maximum arity of the implementation of tr1::tuple which is // currently set at 10. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #if GTEST_HAS_PARAM_TEST namespace testing { // Forward declarations of ValuesIn(), which is implemented in // include/gtest/gtest-param-test.h. template <typename ForwardIterator> internal::ParamGenerator< typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end); template <typename T, size_t N> internal::ParamGenerator<T> ValuesIn(const T (&array)[N]); template <class Container> internal::ParamGenerator<typename Container::value_type> ValuesIn( const Container& container); namespace internal { // Used in the Values() function to provide polymorphic capabilities. template <typename T1> class ValueArray1 { public: explicit ValueArray1(T1 v1) : v1_(v1) {} template <typename T> operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray1& other); const T1 v1_; }; template <typename T1, typename T2> class ValueArray2 { public: ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray2& other); const T1 v1_; const T2 v2_; }; template <typename T1, typename T2, typename T3> class ValueArray3 { public: ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray3& other); const T1 v1_; const T2 v2_; const T3 v3_; }; template <typename T1, typename T2, typename T3, typename T4> class ValueArray4 { public: ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3), v4_(v4) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray4& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5> class ValueArray5 { public: ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray5& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> class ValueArray6 { public: ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray6& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> class ValueArray7 { public: ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray7& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> class ValueArray8 { public: ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray8& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> class ValueArray9 { public: ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray9& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> class ValueArray10 { public: ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray10& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> class ValueArray11 { public: ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray11& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> class ValueArray12 { public: ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray12& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13> class ValueArray13 { public: ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray13& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14> class ValueArray14 { public: ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray14& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15> class ValueArray15 { public: ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray15& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16> class ValueArray16 { public: ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray16& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17> class ValueArray17 { public: ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray17& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18> class ValueArray18 { public: ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray18& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19> class ValueArray19 { public: ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray19& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20> class ValueArray20 { public: ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray20& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21> class ValueArray21 { public: ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray21& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22> class ValueArray22 { public: ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray22& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23> class ValueArray23 { public: ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray23& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24> class ValueArray24 { public: ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray24& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25> class ValueArray25 { public: ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray25& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26> class ValueArray26 { public: ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray26& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27> class ValueArray27 { public: ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray27& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28> class ValueArray28 { public: ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray28& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29> class ValueArray29 { public: ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray29& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30> class ValueArray30 { public: ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray30& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31> class ValueArray31 { public: ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray31& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32> class ValueArray32 { public: ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray32& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33> class ValueArray33 { public: ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray33& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34> class ValueArray34 { public: ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray34& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35> class ValueArray35 { public: ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray35& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36> class ValueArray36 { public: ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray36& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37> class ValueArray37 { public: ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray37& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38> class ValueArray38 { public: ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray38& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39> class ValueArray39 { public: ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray39& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40> class ValueArray40 { public: ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray40& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41> class ValueArray41 { public: ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray41& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42> class ValueArray42 { public: ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray42& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43> class ValueArray43 { public: ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray43& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44> class ValueArray44 { public: ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray44& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45> class ValueArray45 { public: ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray45& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46> class ValueArray46 { public: ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray46& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47> class ValueArray47 { public: ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray47& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48> class ValueArray48 { public: ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, v48_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray48& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49> class ValueArray49 { public: ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, v48_, v49_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray49& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; }; template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50> class ValueArray50 { public: ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {} template <typename T> operator ParamGenerator<T>() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, v48_, v49_, v50_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray50& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; const T50 v50_; }; # if GTEST_HAS_COMBINE // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Generates values from the Cartesian product of values produced // by the argument generators. // template <typename T1, typename T2> class CartesianProductGenerator2 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > { public: typedef ::std::tr1::tuple<T1, T2> ParamType; CartesianProductGenerator2(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2) : g1_(g1), g2_(g2) {} virtual ~CartesianProductGenerator2() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current2_; if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; ParamType current_value_; }; // class CartesianProductGenerator2::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator2& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; }; // class CartesianProductGenerator2 template <typename T1, typename T2, typename T3> class CartesianProductGenerator3 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > { public: typedef ::std::tr1::tuple<T1, T2, T3> ParamType; CartesianProductGenerator3(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3) : g1_(g1), g2_(g2), g3_(g3) {} virtual ~CartesianProductGenerator3() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current3_; if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; ParamType current_value_; }; // class CartesianProductGenerator3::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator3& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; }; // class CartesianProductGenerator3 template <typename T1, typename T2, typename T3, typename T4> class CartesianProductGenerator4 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > { public: typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType; CartesianProductGenerator4(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, const ParamGenerator<T4>& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} virtual ~CartesianProductGenerator4() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3, const ParamGenerator<T4>& g4, const typename ParamGenerator<T4>::iterator& current4) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current4_; if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; const typename ParamGenerator<T4>::iterator begin4_; const typename ParamGenerator<T4>::iterator end4_; typename ParamGenerator<T4>::iterator current4_; ParamType current_value_; }; // class CartesianProductGenerator4::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator4& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; const ParamGenerator<T4> g4_; }; // class CartesianProductGenerator4 template <typename T1, typename T2, typename T3, typename T4, typename T5> class CartesianProductGenerator5 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > { public: typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType; CartesianProductGenerator5(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} virtual ~CartesianProductGenerator5() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3, const ParamGenerator<T4>& g4, const typename ParamGenerator<T4>::iterator& current4, const ParamGenerator<T5>& g5, const typename ParamGenerator<T5>::iterator& current5) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current5_; if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; const typename ParamGenerator<T4>::iterator begin4_; const typename ParamGenerator<T4>::iterator end4_; typename ParamGenerator<T4>::iterator current4_; const typename ParamGenerator<T5>::iterator begin5_; const typename ParamGenerator<T5>::iterator end5_; typename ParamGenerator<T5>::iterator current5_; ParamType current_value_; }; // class CartesianProductGenerator5::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator5& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; const ParamGenerator<T4> g4_; const ParamGenerator<T5> g5_; }; // class CartesianProductGenerator5 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> class CartesianProductGenerator6 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> > { public: typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType; CartesianProductGenerator6(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, const ParamGenerator<T6>& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} virtual ~CartesianProductGenerator6() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3, const ParamGenerator<T4>& g4, const typename ParamGenerator<T4>::iterator& current4, const ParamGenerator<T5>& g5, const typename ParamGenerator<T5>::iterator& current5, const ParamGenerator<T6>& g6, const typename ParamGenerator<T6>::iterator& current6) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current6_; if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; const typename ParamGenerator<T4>::iterator begin4_; const typename ParamGenerator<T4>::iterator end4_; typename ParamGenerator<T4>::iterator current4_; const typename ParamGenerator<T5>::iterator begin5_; const typename ParamGenerator<T5>::iterator end5_; typename ParamGenerator<T5>::iterator current5_; const typename ParamGenerator<T6>::iterator begin6_; const typename ParamGenerator<T6>::iterator end6_; typename ParamGenerator<T6>::iterator current6_; ParamType current_value_; }; // class CartesianProductGenerator6::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator6& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; const ParamGenerator<T4> g4_; const ParamGenerator<T5> g5_; const ParamGenerator<T6> g6_; }; // class CartesianProductGenerator6 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> class CartesianProductGenerator7 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> > { public: typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType; CartesianProductGenerator7(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} virtual ~CartesianProductGenerator7() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3, const ParamGenerator<T4>& g4, const typename ParamGenerator<T4>::iterator& current4, const ParamGenerator<T5>& g5, const typename ParamGenerator<T5>::iterator& current5, const ParamGenerator<T6>& g6, const typename ParamGenerator<T6>::iterator& current6, const ParamGenerator<T7>& g7, const typename ParamGenerator<T7>::iterator& current7) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current7_; if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; const typename ParamGenerator<T4>::iterator begin4_; const typename ParamGenerator<T4>::iterator end4_; typename ParamGenerator<T4>::iterator current4_; const typename ParamGenerator<T5>::iterator begin5_; const typename ParamGenerator<T5>::iterator end5_; typename ParamGenerator<T5>::iterator current5_; const typename ParamGenerator<T6>::iterator begin6_; const typename ParamGenerator<T6>::iterator end6_; typename ParamGenerator<T6>::iterator current6_; const typename ParamGenerator<T7>::iterator begin7_; const typename ParamGenerator<T7>::iterator end7_; typename ParamGenerator<T7>::iterator current7_; ParamType current_value_; }; // class CartesianProductGenerator7::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator7& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; const ParamGenerator<T4> g4_; const ParamGenerator<T5> g5_; const ParamGenerator<T6> g6_; const ParamGenerator<T7> g7_; }; // class CartesianProductGenerator7 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> class CartesianProductGenerator8 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> > { public: typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType; CartesianProductGenerator8(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7, const ParamGenerator<T8>& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} virtual ~CartesianProductGenerator8() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3, const ParamGenerator<T4>& g4, const typename ParamGenerator<T4>::iterator& current4, const ParamGenerator<T5>& g5, const typename ParamGenerator<T5>::iterator& current5, const ParamGenerator<T6>& g6, const typename ParamGenerator<T6>::iterator& current6, const ParamGenerator<T7>& g7, const typename ParamGenerator<T7>::iterator& current7, const ParamGenerator<T8>& g8, const typename ParamGenerator<T8>::iterator& current8) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current8_; if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; const typename ParamGenerator<T4>::iterator begin4_; const typename ParamGenerator<T4>::iterator end4_; typename ParamGenerator<T4>::iterator current4_; const typename ParamGenerator<T5>::iterator begin5_; const typename ParamGenerator<T5>::iterator end5_; typename ParamGenerator<T5>::iterator current5_; const typename ParamGenerator<T6>::iterator begin6_; const typename ParamGenerator<T6>::iterator end6_; typename ParamGenerator<T6>::iterator current6_; const typename ParamGenerator<T7>::iterator begin7_; const typename ParamGenerator<T7>::iterator end7_; typename ParamGenerator<T7>::iterator current7_; const typename ParamGenerator<T8>::iterator begin8_; const typename ParamGenerator<T8>::iterator end8_; typename ParamGenerator<T8>::iterator current8_; ParamType current_value_; }; // class CartesianProductGenerator8::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator8& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; const ParamGenerator<T4> g4_; const ParamGenerator<T5> g5_; const ParamGenerator<T6> g6_; const ParamGenerator<T7> g7_; const ParamGenerator<T8> g8_; }; // class CartesianProductGenerator8 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> class CartesianProductGenerator9 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> > { public: typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType; CartesianProductGenerator9(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7, const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} virtual ~CartesianProductGenerator9() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3, const ParamGenerator<T4>& g4, const typename ParamGenerator<T4>::iterator& current4, const ParamGenerator<T5>& g5, const typename ParamGenerator<T5>::iterator& current5, const ParamGenerator<T6>& g6, const typename ParamGenerator<T6>::iterator& current6, const ParamGenerator<T7>& g7, const typename ParamGenerator<T7>::iterator& current7, const ParamGenerator<T8>& g8, const typename ParamGenerator<T8>::iterator& current8, const ParamGenerator<T9>& g9, const typename ParamGenerator<T9>::iterator& current9) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current9_; if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; const typename ParamGenerator<T4>::iterator begin4_; const typename ParamGenerator<T4>::iterator end4_; typename ParamGenerator<T4>::iterator current4_; const typename ParamGenerator<T5>::iterator begin5_; const typename ParamGenerator<T5>::iterator end5_; typename ParamGenerator<T5>::iterator current5_; const typename ParamGenerator<T6>::iterator begin6_; const typename ParamGenerator<T6>::iterator end6_; typename ParamGenerator<T6>::iterator current6_; const typename ParamGenerator<T7>::iterator begin7_; const typename ParamGenerator<T7>::iterator end7_; typename ParamGenerator<T7>::iterator current7_; const typename ParamGenerator<T8>::iterator begin8_; const typename ParamGenerator<T8>::iterator end8_; typename ParamGenerator<T8>::iterator current8_; const typename ParamGenerator<T9>::iterator begin9_; const typename ParamGenerator<T9>::iterator end9_; typename ParamGenerator<T9>::iterator current9_; ParamType current_value_; }; // class CartesianProductGenerator9::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator9& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; const ParamGenerator<T4> g4_; const ParamGenerator<T5> g5_; const ParamGenerator<T6> g6_; const ParamGenerator<T7> g7_; const ParamGenerator<T8> g8_; const ParamGenerator<T9> g9_; }; // class CartesianProductGenerator9 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> class CartesianProductGenerator10 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> > { public: typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType; CartesianProductGenerator10(const ParamGenerator<T1>& g1, const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7, const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9, const ParamGenerator<T10>& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} virtual ~CartesianProductGenerator10() {} virtual ParamIteratorInterface<ParamType>* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin()); } virtual ParamIteratorInterface<ParamType>* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end(), g10_, g10_.end()); } private: class Iterator : public ParamIteratorInterface<ParamType> { public: Iterator(const ParamGeneratorInterface<ParamType>* base, const ParamGenerator<T1>& g1, const typename ParamGenerator<T1>::iterator& current1, const ParamGenerator<T2>& g2, const typename ParamGenerator<T2>::iterator& current2, const ParamGenerator<T3>& g3, const typename ParamGenerator<T3>::iterator& current3, const ParamGenerator<T4>& g4, const typename ParamGenerator<T4>::iterator& current4, const ParamGenerator<T5>& g5, const typename ParamGenerator<T5>::iterator& current5, const ParamGenerator<T6>& g6, const typename ParamGenerator<T6>::iterator& current6, const ParamGenerator<T7>& g7, const typename ParamGenerator<T7>::iterator& current7, const ParamGenerator<T8>& g8, const typename ParamGenerator<T8>::iterator& current8, const ParamGenerator<T9>& g9, const typename ParamGenerator<T9>::iterator& current9, const ParamGenerator<T10>& g10, const typename ParamGenerator<T10>::iterator& current10) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9), begin10_(g10.begin()), end10_(g10.end()), current10_(current10) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current10_; if (current10_ == end10_) { current10_ = begin10_; ++current9_; } if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface<ParamType>* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType<const Iterator>(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_ && current10_ == typed_other->current10_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_), begin10_(other.begin10_), end10_(other.end10_), current10_(other.current10_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_, *current10_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_ || current10_ == end10_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface<ParamType>* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator<T1>::iterator begin1_; const typename ParamGenerator<T1>::iterator end1_; typename ParamGenerator<T1>::iterator current1_; const typename ParamGenerator<T2>::iterator begin2_; const typename ParamGenerator<T2>::iterator end2_; typename ParamGenerator<T2>::iterator current2_; const typename ParamGenerator<T3>::iterator begin3_; const typename ParamGenerator<T3>::iterator end3_; typename ParamGenerator<T3>::iterator current3_; const typename ParamGenerator<T4>::iterator begin4_; const typename ParamGenerator<T4>::iterator end4_; typename ParamGenerator<T4>::iterator current4_; const typename ParamGenerator<T5>::iterator begin5_; const typename ParamGenerator<T5>::iterator end5_; typename ParamGenerator<T5>::iterator current5_; const typename ParamGenerator<T6>::iterator begin6_; const typename ParamGenerator<T6>::iterator end6_; typename ParamGenerator<T6>::iterator current6_; const typename ParamGenerator<T7>::iterator begin7_; const typename ParamGenerator<T7>::iterator end7_; typename ParamGenerator<T7>::iterator current7_; const typename ParamGenerator<T8>::iterator begin8_; const typename ParamGenerator<T8>::iterator end8_; typename ParamGenerator<T8>::iterator current8_; const typename ParamGenerator<T9>::iterator begin9_; const typename ParamGenerator<T9>::iterator end9_; typename ParamGenerator<T9>::iterator current9_; const typename ParamGenerator<T10>::iterator begin10_; const typename ParamGenerator<T10>::iterator end10_; typename ParamGenerator<T10>::iterator current10_; ParamType current_value_; }; // class CartesianProductGenerator10::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator10& other); const ParamGenerator<T1> g1_; const ParamGenerator<T2> g2_; const ParamGenerator<T3> g3_; const ParamGenerator<T4> g4_; const ParamGenerator<T5> g5_; const ParamGenerator<T6> g6_; const ParamGenerator<T7> g7_; const ParamGenerator<T8> g8_; const ParamGenerator<T9> g9_; const ParamGenerator<T10> g10_; }; // class CartesianProductGenerator10 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Helper classes providing Combine() with polymorphic features. They allow // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is // convertible to U. // template <class Generator1, class Generator2> class CartesianProductHolder2 { public: CartesianProductHolder2(const Generator1& g1, const Generator2& g2) : g1_(g1), g2_(g2) {} template <typename T1, typename T2> operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2> >( new CartesianProductGenerator2<T1, T2>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder2& other); const Generator1 g1_; const Generator2 g2_; }; // class CartesianProductHolder2 template <class Generator1, class Generator2, class Generator3> class CartesianProductHolder3 { public: CartesianProductHolder3(const Generator1& g1, const Generator2& g2, const Generator3& g3) : g1_(g1), g2_(g2), g3_(g3) {} template <typename T1, typename T2, typename T3> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >( new CartesianProductGenerator3<T1, T2, T3>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder3& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; }; // class CartesianProductHolder3 template <class Generator1, class Generator2, class Generator3, class Generator4> class CartesianProductHolder4 { public: CartesianProductHolder4(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} template <typename T1, typename T2, typename T3, typename T4> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >( new CartesianProductGenerator4<T1, T2, T3, T4>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_), static_cast<ParamGenerator<T4> >(g4_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder4& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; }; // class CartesianProductHolder4 template <class Generator1, class Generator2, class Generator3, class Generator4, class Generator5> class CartesianProductHolder5 { public: CartesianProductHolder5(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} template <typename T1, typename T2, typename T3, typename T4, typename T5> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >( new CartesianProductGenerator5<T1, T2, T3, T4, T5>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_), static_cast<ParamGenerator<T4> >(g4_), static_cast<ParamGenerator<T5> >(g5_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder5& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; }; // class CartesianProductHolder5 template <class Generator1, class Generator2, class Generator3, class Generator4, class Generator5, class Generator6> class CartesianProductHolder6 { public: CartesianProductHolder6(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >( new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_), static_cast<ParamGenerator<T4> >(g4_), static_cast<ParamGenerator<T5> >(g5_), static_cast<ParamGenerator<T6> >(g6_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder6& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; }; // class CartesianProductHolder6 template <class Generator1, class Generator2, class Generator3, class Generator4, class Generator5, class Generator6, class Generator7> class CartesianProductHolder7 { public: CartesianProductHolder7(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >( new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_), static_cast<ParamGenerator<T4> >(g4_), static_cast<ParamGenerator<T5> >(g5_), static_cast<ParamGenerator<T6> >(g6_), static_cast<ParamGenerator<T7> >(g7_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder7& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; }; // class CartesianProductHolder7 template <class Generator1, class Generator2, class Generator3, class Generator4, class Generator5, class Generator6, class Generator7, class Generator8> class CartesianProductHolder8 { public: CartesianProductHolder8(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >( new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_), static_cast<ParamGenerator<T4> >(g4_), static_cast<ParamGenerator<T5> >(g5_), static_cast<ParamGenerator<T6> >(g6_), static_cast<ParamGenerator<T7> >(g7_), static_cast<ParamGenerator<T8> >(g8_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder8& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; }; // class CartesianProductHolder8 template <class Generator1, class Generator2, class Generator3, class Generator4, class Generator5, class Generator6, class Generator7, class Generator8, class Generator9> class CartesianProductHolder9 { public: CartesianProductHolder9(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> >( new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_), static_cast<ParamGenerator<T4> >(g4_), static_cast<ParamGenerator<T5> >(g5_), static_cast<ParamGenerator<T6> >(g6_), static_cast<ParamGenerator<T7> >(g7_), static_cast<ParamGenerator<T8> >(g8_), static_cast<ParamGenerator<T9> >(g9_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder9& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; }; // class CartesianProductHolder9 template <class Generator1, class Generator2, class Generator3, class Generator4, class Generator5, class Generator6, class Generator7, class Generator8, class Generator9, class Generator10> class CartesianProductHolder10 { public: CartesianProductHolder10(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9, const Generator10& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> >() const { return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> >( new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>( static_cast<ParamGenerator<T1> >(g1_), static_cast<ParamGenerator<T2> >(g2_), static_cast<ParamGenerator<T3> >(g3_), static_cast<ParamGenerator<T4> >(g4_), static_cast<ParamGenerator<T5> >(g5_), static_cast<ParamGenerator<T6> >(g6_), static_cast<ParamGenerator<T7> >(g7_), static_cast<ParamGenerator<T8> >(g8_), static_cast<ParamGenerator<T9> >(g9_), static_cast<ParamGenerator<T10> >(g10_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder10& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; const Generator10 g10_; }; // class CartesianProductHolder10 # endif // GTEST_HAS_COMBINE } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #if GTEST_HAS_PARAM_TEST namespace testing { // Functions producing parameter generators. // // Google Test uses these generators to produce parameters for value- // parameterized tests. When a parameterized test case is instantiated // with a particular generator, Google Test creates and runs tests // for each element in the sequence produced by the generator. // // In the following sample, tests from test case FooTest are instantiated // each three times with parameter values 3, 5, and 8: // // class FooTest : public TestWithParam<int> { ... }; // // TEST_P(FooTest, TestThis) { // } // TEST_P(FooTest, TestThat) { // } // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); // // Range() returns generators providing sequences of values in a range. // // Synopsis: // Range(start, end) // - returns a generator producing a sequence of values {start, start+1, // start+2, ..., }. // Range(start, end, step) // - returns a generator producing a sequence of values {start, start+step, // start+step+step, ..., }. // Notes: // * The generated sequences never include end. For example, Range(1, 5) // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) // returns a generator producing {1, 3, 5, 7}. // * start and end must have the same type. That type may be any integral or // floating-point type or a user defined type satisfying these conditions: // * It must be assignable (have operator=() defined). // * It must have operator+() (operator+(int-compatible type) for // two-operand version). // * It must have operator<() defined. // Elements in the resulting sequences will also have that type. // * Condition start < end must be satisfied in order for resulting sequences // to contain any elements. // template <typename T, typename IncrementT> internal::ParamGenerator<T> Range(T start, T end, IncrementT step) { return internal::ParamGenerator<T>( new internal::RangeGenerator<T, IncrementT>(start, end, step)); } template <typename T> internal::ParamGenerator<T> Range(T start, T end) { return Range(start, end, 1); } // ValuesIn() function allows generation of tests with parameters coming from // a container. // // Synopsis: // ValuesIn(const T (&array)[N]) // - returns a generator producing sequences with elements from // a C-style array. // ValuesIn(const Container& container) // - returns a generator producing sequences with elements from // an STL-style container. // ValuesIn(Iterator begin, Iterator end) // - returns a generator producing sequences with elements from // a range [begin, end) defined by a pair of STL-style iterators. These // iterators can also be plain C pointers. // // Please note that ValuesIn copies the values from the containers // passed in and keeps them to generate tests in RUN_ALL_TESTS(). // // Examples: // // This instantiates tests from test case StringTest // each with C-string values of "foo", "bar", and "baz": // // const char* strings[] = {"foo", "bar", "baz"}; // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); // // This instantiates tests from test case StlStringTest // each with STL strings with values "a" and "b": // // ::std::vector< ::std::string> GetParameterStrings() { // ::std::vector< ::std::string> v; // v.push_back("a"); // v.push_back("b"); // return v; // } // // INSTANTIATE_TEST_CASE_P(CharSequence, // StlStringTest, // ValuesIn(GetParameterStrings())); // // // This will also instantiate tests from CharTest // each with parameter values 'a' and 'b': // // ::std::list<char> GetParameterChars() { // ::std::list<char> list; // list.push_back('a'); // list.push_back('b'); // return list; // } // ::std::list<char> l = GetParameterChars(); // INSTANTIATE_TEST_CASE_P(CharSequence2, // CharTest, // ValuesIn(l.begin(), l.end())); // template <typename ForwardIterator> internal::ParamGenerator< typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end) { typedef typename ::testing::internal::IteratorTraits<ForwardIterator> ::value_type ParamType; return internal::ParamGenerator<ParamType>( new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end)); } template <typename T, size_t N> internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) { return ValuesIn(array, array + N); } template <class Container> internal::ParamGenerator<typename Container::value_type> ValuesIn( const Container& container) { return ValuesIn(container.begin(), container.end()); } // Values() allows generating tests from explicitly specified list of // parameters. // // Synopsis: // Values(T v1, T v2, ..., T vN) // - returns a generator producing sequences with elements v1, v2, ..., vN. // // For example, this instantiates tests from test case BarTest each // with values "one", "two", and "three": // // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); // // This instantiates tests from test case BazTest each with values 1, 2, 3.5. // The exact type of values will depend on the type of parameter in BazTest. // // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); // // Currently, Values() supports from 1 to 50 parameters. // template <typename T1> internal::ValueArray1<T1> Values(T1 v1) { return internal::ValueArray1<T1>(v1); } template <typename T1, typename T2> internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) { return internal::ValueArray2<T1, T2>(v1, v2); } template <typename T1, typename T2, typename T3> internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) { return internal::ValueArray3<T1, T2, T3>(v1, v2, v3); } template <typename T1, typename T2, typename T3, typename T4> internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) { return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4); } template <typename T1, typename T2, typename T3, typename T4, typename T5> internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) { return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) { return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) { return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5, v6, v7); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) { return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4, v5, v6, v7, v8); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) { return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3, v4, v5, v6, v7, v8, v9); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) { return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11) { return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12) { return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13> internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13) { return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14> internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) { return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15> internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) { return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16> internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) { return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17> internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17) { return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18> internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18) { return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19> internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) { return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20> internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) { return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21> internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) { return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22> internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) { return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23> internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) { return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24> internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) { return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25> internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) { return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26> internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26) { return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27> internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27) { return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28> internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28) { return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29> internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29) { return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30> internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) { return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31> internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) { return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32> internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) { return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33> internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33) { return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34> internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34) { return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35> internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) { return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36> internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) { return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37> internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37) { return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38> internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) { return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39> internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) { return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40> internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) { return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41> internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) { return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42> internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42) { return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43> internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43) { return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44> internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44) { return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45> internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) { return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46> internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) { return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47> internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) { return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48> internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) { return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49> internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49) { return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49); } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50> internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) { return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50); } // Bool() allows generating tests with parameters in a set of (false, true). // // Synopsis: // Bool() // - returns a generator producing sequences with elements {false, true}. // // It is useful when testing code that depends on Boolean flags. Combinations // of multiple flags can be tested when several Bool()'s are combined using // Combine() function. // // In the following example all tests in the test case FlagDependentTest // will be instantiated twice with parameters false and true. // // class FlagDependentTest : public testing::TestWithParam<bool> { // virtual void SetUp() { // external_flag = GetParam(); // } // } // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); // inline internal::ParamGenerator<bool> Bool() { return Values(false, true); } # if GTEST_HAS_COMBINE // Combine() allows the user to combine two or more sequences to produce // values of a Cartesian product of those sequences' elements. // // Synopsis: // Combine(gen1, gen2, ..., genN) // - returns a generator producing sequences with elements coming from // the Cartesian product of elements from the sequences generated by // gen1, gen2, ..., genN. The sequence elements will have a type of // tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types // of elements from sequences produces by gen1, gen2, ..., genN. // // Combine can have up to 10 arguments. This number is currently limited // by the maximum number of elements in the tuple implementation used by Google // Test. // // Example: // // This will instantiate tests in test case AnimalTest each one with // the parameter values tuple("cat", BLACK), tuple("cat", WHITE), // tuple("dog", BLACK), and tuple("dog", WHITE): // // enum Color { BLACK, GRAY, WHITE }; // class AnimalTest // : public testing::TestWithParam<tuple<const char*, Color> > {...}; // // TEST_P(AnimalTest, AnimalLooksNice) {...} // // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, // Combine(Values("cat", "dog"), // Values(BLACK, WHITE))); // // This will instantiate tests in FlagDependentTest with all variations of two // Boolean flags: // // class FlagDependentTest // : public testing::TestWithParam<tuple(bool, bool)> > { // virtual void SetUp() { // // Assigns external_flag_1 and external_flag_2 values from the tuple. // tie(external_flag_1, external_flag_2) = GetParam(); // } // }; // // TEST_P(FlagDependentTest, TestFeature1) { // // Test your code using external_flag_1 and external_flag_2 here. // } // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, // Combine(Bool(), Bool())); // template <typename Generator1, typename Generator2> internal::CartesianProductHolder2<Generator1, Generator2> Combine( const Generator1& g1, const Generator2& g2) { return internal::CartesianProductHolder2<Generator1, Generator2>( g1, g2); } template <typename Generator1, typename Generator2, typename Generator3> internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3) { return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>( g1, g2, g3); } template <typename Generator1, typename Generator2, typename Generator3, typename Generator4> internal::CartesianProductHolder4<Generator1, Generator2, Generator3, Generator4> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4) { return internal::CartesianProductHolder4<Generator1, Generator2, Generator3, Generator4>( g1, g2, g3, g4); } template <typename Generator1, typename Generator2, typename Generator3, typename Generator4, typename Generator5> internal::CartesianProductHolder5<Generator1, Generator2, Generator3, Generator4, Generator5> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5) { return internal::CartesianProductHolder5<Generator1, Generator2, Generator3, Generator4, Generator5>( g1, g2, g3, g4, g5); } template <typename Generator1, typename Generator2, typename Generator3, typename Generator4, typename Generator5, typename Generator6> internal::CartesianProductHolder6<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6) { return internal::CartesianProductHolder6<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6>( g1, g2, g3, g4, g5, g6); } template <typename Generator1, typename Generator2, typename Generator3, typename Generator4, typename Generator5, typename Generator6, typename Generator7> internal::CartesianProductHolder7<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7) { return internal::CartesianProductHolder7<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7>( g1, g2, g3, g4, g5, g6, g7); } template <typename Generator1, typename Generator2, typename Generator3, typename Generator4, typename Generator5, typename Generator6, typename Generator7, typename Generator8> internal::CartesianProductHolder8<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7, Generator8> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8) { return internal::CartesianProductHolder8<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7, Generator8>( g1, g2, g3, g4, g5, g6, g7, g8); } template <typename Generator1, typename Generator2, typename Generator3, typename Generator4, typename Generator5, typename Generator6, typename Generator7, typename Generator8, typename Generator9> internal::CartesianProductHolder9<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7, Generator8, Generator9> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9) { return internal::CartesianProductHolder9<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>( g1, g2, g3, g4, g5, g6, g7, g8, g9); } template <typename Generator1, typename Generator2, typename Generator3, typename Generator4, typename Generator5, typename Generator6, typename Generator7, typename Generator8, typename Generator9, typename Generator10> internal::CartesianProductHolder10<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7, Generator8, Generator9, Generator10> Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9, const Generator10& g10) { return internal::CartesianProductHolder10<Generator1, Generator2, Generator3, Generator4, Generator5, Generator6, Generator7, Generator8, Generator9, Generator10>( g1, g2, g3, g4, g5, g6, g7, g8, g9, g10); } # endif // GTEST_HAS_COMBINE # define TEST_P(test_case_name, test_name) \ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ : public test_case_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ virtual void TestBody(); \ private: \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder<test_case_name>(\ #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ #test_case_name, \ #test_name, \ new ::testing::internal::TestMetaFactory< \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ return 0; \ } \ static int gtest_registering_dummy_; \ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ }; \ int GTEST_TEST_CLASS_NAME_(test_case_name, \ test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ ::testing::internal::ParamGenerator<test_case_name::ParamType> \ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ int gtest_##prefix##test_case_name##_dummy_ = \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder<test_case_name>(\ #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ #prefix, \ >est_##prefix##test_case_name##_EvalGenerator_, \ __FILE__, __LINE__) } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // Google C++ Testing Framework definitions useful in production code. #ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ #define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ // When you need to test the private or protected members of a class, // use the FRIEND_TEST macro to declare your tests as friends of the // class. For example: // // class MyClass { // private: // void MyMethod(); // FRIEND_TEST(MyClassTest, MyMethod); // }; // // class MyClassTest : public testing::Test { // // ... // }; // // TEST_F(MyClassTest, MyMethod) { // // Can call MyClass::MyMethod() here. // } #define FRIEND_TEST(test_case_name, test_name)\ friend class test_case_name##_##test_name##_Test #endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // #ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #include <iosfwd> #include <vector> namespace testing { // A copyable object representing the result of a test part (i.e. an // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). // // Don't inherit from TestPartResult as its destructor is not virtual. class GTEST_API_ TestPartResult { public: // The possible outcomes of a test part (i.e. an assertion or an // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). enum Type { kSuccess, // Succeeded. kNonFatalFailure, // Failed but the test can continue. kFatalFailure // Failed and the test should be terminated. }; // C'tor. TestPartResult does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestPartResult object. TestPartResult(Type a_type, const char* a_file_name, int a_line_number, const char* a_message) : type_(a_type), file_name_(a_file_name), line_number_(a_line_number), summary_(ExtractSummary(a_message)), message_(a_message) { } // Gets the outcome of the test part. Type type() const { return type_; } // Gets the name of the source file where the test part took place, or // NULL if it's unknown. const char* file_name() const { return file_name_.c_str(); } // Gets the line in the source file where the test part took place, // or -1 if it's unknown. int line_number() const { return line_number_; } // Gets the summary of the failure message. const char* summary() const { return summary_.c_str(); } // Gets the message associated with the test part. const char* message() const { return message_.c_str(); } // Returns true iff the test part passed. bool passed() const { return type_ == kSuccess; } // Returns true iff the test part failed. bool failed() const { return type_ != kSuccess; } // Returns true iff the test part non-fatally failed. bool nonfatally_failed() const { return type_ == kNonFatalFailure; } // Returns true iff the test part fatally failed. bool fatally_failed() const { return type_ == kFatalFailure; } private: Type type_; // Gets the summary of the failure message by omitting the stack // trace in it. static internal::String ExtractSummary(const char* message); // The name of the source file where the test part took place, or // NULL if the source file is unknown. internal::String file_name_; // The line in the source file where the test part took place, or -1 // if the line number is unknown. int line_number_; internal::String summary_; // The test failure summary. internal::String message_; // The test failure message. }; // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result); // An array of TestPartResult objects. // // Don't inherit from TestPartResultArray as its destructor is not // virtual. class GTEST_API_ TestPartResultArray { public: TestPartResultArray() {} // Appends the given TestPartResult to the array. void Append(const TestPartResult& result); // Returns the TestPartResult at the given index (0-based). const TestPartResult& GetTestPartResult(int index) const; // Returns the number of TestPartResult objects in the array. int size() const; private: std::vector<TestPartResult> array_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); }; // This interface knows how to report a test part result. class TestPartResultReporterInterface { public: virtual ~TestPartResultReporterInterface() {} virtual void ReportTestPartResult(const TestPartResult& result) = 0; }; namespace internal { // This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a // statement generates new fatal failures. To do so it registers itself as the // current test part result reporter. Besides checking if fatal failures were // reported, it only delegates the reporting to the former result reporter. // The original result reporter is restored in the destructor. // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. class GTEST_API_ HasNewFatalFailureHelper : public TestPartResultReporterInterface { public: HasNewFatalFailureHelper(); virtual ~HasNewFatalFailureHelper(); virtual void ReportTestPartResult(const TestPartResult& result); bool has_new_fatal_failure() const { return has_new_fatal_failure_; } private: bool has_new_fatal_failure_; TestPartResultReporterInterface* original_reporter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); }; } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ // This header implements typed tests and type-parameterized tests. // Typed (aka type-driven) tests repeat the same test for types in a // list. You must know which types you want to test with when writing // typed tests. Here's how you do it: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template <typename T> class FooTest : public testing::Test { public: ... typedef std::list<T> List; static T shared_; T value_; }; // Next, associate a list of types with the test case, which will be // repeated for each type in the list. The typedef is necessary for // the macro to parse correctly. typedef testing::Types<char, int, unsigned int> MyTypes; TYPED_TEST_CASE(FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // TYPED_TEST_CASE(FooTest, int); // Then, use TYPED_TEST() instead of TEST_F() to define as many typed // tests for this test case as you want. TYPED_TEST(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. // Since we are inside a derived class template, C++ requires use to // visit the members of FooTest via 'this'. TypeParam n = this->value_; // To visit static members of the fixture, add the TestFixture:: // prefix. n += TestFixture::shared_; // To refer to typedefs in the fixture, add the "typename // TestFixture::" prefix. typename TestFixture::List values; values.push_back(n); ... } TYPED_TEST(FooTest, HasPropertyA) { ... } #endif // 0 // Type-parameterized tests are abstract test patterns parameterized // by a type. Compared with typed tests, type-parameterized tests // allow you to define the test pattern without knowing what the type // parameters are. The defined pattern can be instantiated with // different types any number of times, in any number of translation // units. // // If you are designing an interface or concept, you can define a // suite of type-parameterized tests to verify properties that any // valid implementation of the interface/concept should have. Then, // each implementation can easily instantiate the test suite to verify // that it conforms to the requirements, without having to write // similar tests repeatedly. Here's an example: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template <typename T> class FooTest : public testing::Test { ... }; // Next, declare that you will define a type-parameterized test case // (the _P suffix is for "parameterized" or "pattern", whichever you // prefer): TYPED_TEST_CASE_P(FooTest); // Then, use TYPED_TEST_P() to define as many type-parameterized tests // for this type-parameterized test case as you want. TYPED_TEST_P(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. TypeParam n = 0; ... } TYPED_TEST_P(FooTest, HasPropertyA) { ... } // Now the tricky part: you need to register all test patterns before // you can instantiate them. The first argument of the macro is the // test case name; the rest are the names of the tests in this test // case. REGISTER_TYPED_TEST_CASE_P(FooTest, DoesBlah, HasPropertyA); // Finally, you are free to instantiate the pattern with the types you // want. If you put the above code in a header file, you can #include // it in multiple C++ source files and instantiate it multiple times. // // To distinguish different instances of the pattern, the first // argument to the INSTANTIATE_* macro is a prefix that will be added // to the actual test case name. Remember to pick unique prefixes for // different instances. typedef testing::Types<char, int, unsigned int> MyTypes; INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int); #endif // 0 // Implements typed tests. #if GTEST_HAS_TYPED_TEST // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the typedef for the type parameters of the // given test case. # define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_ // The 'Types' template argument below must have spaces around it // since some compilers may choke on '>>' when passing a template // instance (e.g. Types<int>) # define TYPED_TEST_CASE(CaseName, Types) \ typedef ::testing::internal::TypeList< Types >::type \ GTEST_TYPE_PARAMS_(CaseName) # define TYPED_TEST(CaseName, TestName) \ template <typename gtest_TypeParam_> \ class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ : public CaseName<gtest_TypeParam_> { \ private: \ typedef CaseName<gtest_TypeParam_> TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::internal::TypeParameterizedTest< \ CaseName, \ ::testing::internal::TemplateSel< \ GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \ GTEST_TYPE_PARAMS_(CaseName)>::Register(\ "", #CaseName, #TestName, 0); \ template <typename gtest_TypeParam_> \ void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody() #endif // GTEST_HAS_TYPED_TEST // Implements type-parameterized tests. #if GTEST_HAS_TYPED_TEST_P // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the namespace name that the type-parameterized tests for // the given type-parameterized test case are defined in. The exact // name of the namespace is subject to change without notice. # define GTEST_CASE_NAMESPACE_(TestCaseName) \ gtest_case_##TestCaseName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the variable used to remember the names of // the defined tests in the given test case. # define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \ gtest_typed_test_case_p_state_##TestCaseName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY. // // Expands to the name of the variable used to remember the names of // the registered tests in the given test case. # define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \ gtest_registered_test_names_##TestCaseName##_ // The variables defined in the type-parameterized test macros are // static as typically these macros are used in a .h file that can be // #included in multiple translation units linked together. # define TYPED_TEST_CASE_P(CaseName) \ static ::testing::internal::TypedTestCasePState \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName) # define TYPED_TEST_P(CaseName, TestName) \ namespace GTEST_CASE_NAMESPACE_(CaseName) { \ template <typename gtest_TypeParam_> \ class TestName : public CaseName<gtest_TypeParam_> { \ private: \ typedef CaseName<gtest_TypeParam_> TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\ __FILE__, __LINE__, #CaseName, #TestName); \ } \ template <typename gtest_TypeParam_> \ void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody() # define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \ namespace GTEST_CASE_NAMESPACE_(CaseName) { \ typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ } \ static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\ __FILE__, __LINE__, #__VA_ARGS__) // The 'Types' template argument below must have spaces around it // since some compilers may choke on '>>' when passing a template // instance (e.g. Types<int>) # define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \ bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::internal::TypeParameterizedTestCase<CaseName, \ GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \ ::testing::internal::TypeList< Types >::type>::Register(\ #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName)) #endif // GTEST_HAS_TYPED_TEST_P #endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ // Depending on the platform, different string classes are available. // On Linux, in addition to ::std::string, Google also makes use of // class ::string, which has the same interface as ::std::string, but // has a different implementation. // // The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that // ::string is available AND is a distinct type to ::std::string, or // define it to 0 to indicate otherwise. // // If the user's ::std::string and ::string are the same class due to // aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0. // // If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined // heuristically. namespace testing { // Declares the flags. // This flag temporary enables the disabled tests. GTEST_DECLARE_bool_(also_run_disabled_tests); // This flag brings the debugger on an assertion failure. GTEST_DECLARE_bool_(break_on_failure); // This flag controls whether Google Test catches all test-thrown exceptions // and logs them as failures. GTEST_DECLARE_bool_(catch_exceptions); // This flag enables using colors in terminal output. Available values are // "yes" to enable colors, "no" (disable colors), or "auto" (the default) // to let Google Test decide. GTEST_DECLARE_string_(color); // This flag sets up the filter to select by name using a glob pattern // the tests to run. If the filter is not given all tests are executed. GTEST_DECLARE_string_(filter); // This flag causes the Google Test to list tests. None of the tests listed // are actually run if the flag is provided. GTEST_DECLARE_bool_(list_tests); // This flag controls whether Google Test emits a detailed XML report to a file // in addition to its normal textual output. GTEST_DECLARE_string_(output); // This flags control whether Google Test prints the elapsed time for each // test. GTEST_DECLARE_bool_(print_time); // This flag specifies the random number seed. GTEST_DECLARE_int32_(random_seed); // This flag sets how many times the tests are repeated. The default value // is 1. If the value is -1 the tests are repeating forever. GTEST_DECLARE_int32_(repeat); // This flag controls whether Google Test includes Google Test internal // stack frames in failure stack traces. GTEST_DECLARE_bool_(show_internal_stack_frames); // When this flag is specified, tests' order is randomized on every iteration. GTEST_DECLARE_bool_(shuffle); // This flag specifies the maximum number of stack frames to be // printed in a failure message. GTEST_DECLARE_int32_(stack_trace_depth); // When this flag is specified, a failed assertion will throw an // exception if exceptions are enabled, or exit the program with a // non-zero code otherwise. GTEST_DECLARE_bool_(throw_on_failure); // When this flag is set with a "host:port" string, on supported // platforms test results are streamed to the specified port on // the specified host machine. GTEST_DECLARE_string_(stream_result_to); // The upper limit for valid stack trace depths. const int kMaxStackTraceDepth = 100; namespace internal { class AssertHelper; class DefaultGlobalTestPartResultReporter; class ExecDeathTest; class NoExecDeathTest; class FinalSuccessChecker; class GTestFlagSaver; class TestResultAccessor; class TestEventListenersAccessor; class TestEventRepeater; class WindowsDeathTest; class UnitTestImpl* GetUnitTestImpl(); void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const String& message); // Converts a streamable value to a String. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". // Declared in gtest-internal.h but defined here, so that it has access // to the definition of the Message class, required by the ARM // compiler. template <typename T> String StreamableToString(const T& streamable) { return (Message() << streamable).GetString(); } } // namespace internal // The friend relationship of some of these classes is cyclic. // If we don't forward declare them the compiler might confuse the classes // in friendship clauses with same named classes on the scope. class Test; class TestCase; class TestInfo; class UnitTest; // A class for indicating whether an assertion was successful. When // the assertion wasn't successful, the AssertionResult object // remembers a non-empty message that describes how it failed. // // To create an instance of this class, use one of the factory functions // (AssertionSuccess() and AssertionFailure()). // // This class is useful for two purposes: // 1. Defining predicate functions to be used with Boolean test assertions // EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts // 2. Defining predicate-format functions to be // used with predicate assertions (ASSERT_PRED_FORMAT*, etc). // // For example, if you define IsEven predicate: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then the failed expectation EXPECT_TRUE(IsEven(Fib(5))) // will print the message // // Value of: IsEven(Fib(5)) // Actual: false (5 is odd) // Expected: true // // instead of a more opaque // // Value of: IsEven(Fib(5)) // Actual: false // Expected: true // // in case IsEven is a simple Boolean predicate. // // If you expect your predicate to be reused and want to support informative // messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up // about half as often as positive ones in our tests), supply messages for // both success and failure cases: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess() << n << " is even"; // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print // // Value of: IsEven(Fib(6)) // Actual: true (8 is even) // Expected: false // // NB: Predicates that support negative Boolean assertions have reduced // performance in positive ones so be careful not to use them in tests // that have lots (tens of thousands) of positive Boolean assertions. // // To use this class with EXPECT_PRED_FORMAT assertions such as: // // // Verifies that Foo() returns an even number. // EXPECT_PRED_FORMAT1(IsEven, Foo()); // // you need to define: // // testing::AssertionResult IsEven(const char* expr, int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() // << "Expected: " << expr << " is even\n Actual: it's " << n; // } // // If Foo() returns 5, you will see the following message: // // Expected: Foo() is even // Actual: it's 5 // class GTEST_API_ AssertionResult { public: // Copy constructor. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult(const AssertionResult& other); // Used in the EXPECT_TRUE/FALSE(bool_expression). explicit AssertionResult(bool success) : success_(success) {} // Returns true iff the assertion succeeded. operator bool() const { return success_; } // NOLINT // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult operator!() const; // Returns the text streamed into this AssertionResult. Test assertions // use it when they fail (i.e., the predicate's outcome doesn't match the // assertion's expectation). When nothing has been streamed into the // object, returns an empty string. const char* message() const { return message_.get() != NULL ? message_->c_str() : ""; } // TODO(vladl@google.com): Remove this after making sure no clients use it. // Deprecated; use message() instead. const char* failure_message() const { return message(); } // Streams a custom failure message into this object. template <typename T> AssertionResult& operator<<(const T& value) { AppendMessage(Message() << value); return *this; } // Allows streaming basic output manipulators such as endl or flush into // this object. AssertionResult& operator<<( ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) { AppendMessage(Message() << basic_manipulator); return *this; } private: // Appends the contents of message to message_. void AppendMessage(const Message& a_message) { if (message_.get() == NULL) message_.reset(new ::std::string); message_->append(a_message.GetString().c_str()); } // Stores result of the assertion predicate. bool success_; // Stores the message describing the condition in case the expectation // construct is not satisfied with the predicate's outcome. // Referenced via a pointer to avoid taking too much stack frame space // with test assertions. internal::scoped_ptr< ::std::string> message_; GTEST_DISALLOW_ASSIGN_(AssertionResult); }; // Makes a successful assertion result. GTEST_API_ AssertionResult AssertionSuccess(); // Makes a failed assertion result. GTEST_API_ AssertionResult AssertionFailure(); // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << msg. GTEST_API_ AssertionResult AssertionFailure(const Message& msg); // The abstract class that all tests inherit from. // // In Google Test, a unit test program contains one or many TestCases, and // each TestCase contains one or many Tests. // // When you define a test using the TEST macro, you don't need to // explicitly derive from Test - the TEST macro automatically does // this for you. // // The only time you derive from Test is when defining a test fixture // to be used a TEST_F. For example: // // class FooTest : public testing::Test { // protected: // virtual void SetUp() { ... } // virtual void TearDown() { ... } // ... // }; // // TEST_F(FooTest, Bar) { ... } // TEST_F(FooTest, Baz) { ... } // // Test is not copyable. class GTEST_API_ Test { public: friend class TestInfo; // Defines types for pointers to functions that set up and tear down // a test case. typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc; typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc; // The d'tor is virtual as we intend to inherit from Test. virtual ~Test(); // Sets up the stuff shared by all tests in this test case. // // Google Test will call Foo::SetUpTestCase() before running the first // test in test case Foo. Hence a sub-class can define its own // SetUpTestCase() method to shadow the one defined in the super // class. static void SetUpTestCase() {} // Tears down the stuff shared by all tests in this test case. // // Google Test will call Foo::TearDownTestCase() after running the last // test in test case Foo. Hence a sub-class can define its own // TearDownTestCase() method to shadow the one defined in the super // class. static void TearDownTestCase() {} // Returns true iff the current test has a fatal failure. static bool HasFatalFailure(); // Returns true iff the current test has a non-fatal failure. static bool HasNonfatalFailure(); // Returns true iff the current test has a (either fatal or // non-fatal) failure. static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); } // Logs a property for the current test. Only the last value for a given // key is remembered. // These are public static so they can be called from utility functions // that are not members of the test fixture. // The arguments are const char* instead strings, as Google Test is used // on platforms where string doesn't compile. // // Note that a driving consideration for these RecordProperty methods // was to produce xml output suited to the Greenspan charting utility, // which at present will only chart values that fit in a 32-bit int. It // is the user's responsibility to restrict their values to 32-bit ints // if they intend them to be used with Greenspan. static void RecordProperty(const char* key, const char* value); static void RecordProperty(const char* key, int value); protected: // Creates a Test object. Test(); // Sets up the test fixture. virtual void SetUp(); // Tears down the test fixture. virtual void TearDown(); private: // Returns true iff the current test has the same fixture class as // the first test in the current test case. static bool HasSameFixtureClass(); // Runs the test after the test fixture has been set up. // // A sub-class must implement this to define the test logic. // // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM. // Instead, use the TEST or TEST_F macro. virtual void TestBody() = 0; // Sets up, executes, and tears down the test. void Run(); // Deletes self. We deliberately pick an unusual name for this // internal method to avoid clashing with names used in user TESTs. void DeleteSelf_() { delete this; } // Uses a GTestFlagSaver to save and restore all Google Test flags. const internal::GTestFlagSaver* const gtest_flag_saver_; // Often a user mis-spells SetUp() as Setup() and spends a long time // wondering why it is never called by Google Test. The declaration of // the following method is solely for catching such an error at // compile time: // // - The return type is deliberately chosen to be not void, so it // will be a conflict if a user declares void Setup() in his test // fixture. // // - This method is private, so it will be another compiler error // if a user calls it from his test fixture. // // DO NOT OVERRIDE THIS FUNCTION. // // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } // We disallow copying Tests. GTEST_DISALLOW_COPY_AND_ASSIGN_(Test); }; typedef internal::TimeInMillis TimeInMillis; // A copyable object representing a user specified test property which can be // output as a key/value string pair. // // Don't inherit from TestProperty as its destructor is not virtual. class TestProperty { public: // C'tor. TestProperty does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestProperty object. TestProperty(const char* a_key, const char* a_value) : key_(a_key), value_(a_value) { } // Gets the user supplied key. const char* key() const { return key_.c_str(); } // Gets the user supplied value. const char* value() const { return value_.c_str(); } // Sets a new value, overriding the one supplied in the constructor. void SetValue(const char* new_value) { value_ = new_value; } private: // The key supplied by the user. internal::String key_; // The value supplied by the user. internal::String value_; }; // The result of a single Test. This includes a list of // TestPartResults, a list of TestProperties, a count of how many // death tests there are in the Test, and how much time it took to run // the Test. // // TestResult is not copyable. class GTEST_API_ TestResult { public: // Creates an empty TestResult. TestResult(); // D'tor. Do not inherit from TestResult. ~TestResult(); // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int total_part_count() const; // Returns the number of the test properties. int test_property_count() const; // Returns true iff the test passed (i.e. no test part failed). bool Passed() const { return !Failed(); } // Returns true iff the test failed. bool Failed() const; // Returns true iff the test fatally failed. bool HasFatalFailure() const; // Returns true iff the test has a non-fatal failure. bool HasNonfatalFailure() const; // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns the i-th test part result among all the results. i can range // from 0 to test_property_count() - 1. If i is not in that range, aborts // the program. const TestPartResult& GetTestPartResult(int i) const; // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& GetTestProperty(int i) const; private: friend class TestInfo; friend class UnitTest; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::ExecDeathTest; friend class internal::TestResultAccessor; friend class internal::UnitTestImpl; friend class internal::WindowsDeathTest; // Gets the vector of TestPartResults. const std::vector<TestPartResult>& test_part_results() const { return test_part_results_; } // Gets the vector of TestProperties. const std::vector<TestProperty>& test_properties() const { return test_properties_; } // Sets the elapsed time. void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } // Adds a test property to the list. The property is validated and may add // a non-fatal failure if invalid (e.g., if it conflicts with reserved // key names). If a property is already recorded for the same key, the // value will be updated, rather than storing multiple values for the same // key. void RecordProperty(const TestProperty& test_property); // Adds a failure if the key is a reserved attribute of Google Test // testcase tags. Returns true if the property is valid. // TODO(russr): Validate attribute names are legal and human readable. static bool ValidateTestProperty(const TestProperty& test_property); // Adds a test part result to the list. void AddTestPartResult(const TestPartResult& test_part_result); // Returns the death test count. int death_test_count() const { return death_test_count_; } // Increments the death test count, returning the new count. int increment_death_test_count() { return ++death_test_count_; } // Clears the test part results. void ClearTestPartResults(); // Clears the object. void Clear(); // Protects mutable state of the property vector and of owned // properties, whose values may be updated. internal::Mutex test_properites_mutex_; // The vector of TestPartResults std::vector<TestPartResult> test_part_results_; // The vector of TestProperties std::vector<TestProperty> test_properties_; // Running count of death tests. int death_test_count_; // The elapsed time, in milliseconds. TimeInMillis elapsed_time_; // We disallow copying TestResult. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult); }; // class TestResult // A TestInfo object stores the following information about a test: // // Test case name // Test name // Whether the test should be run // A function pointer that creates the test object when invoked // Test result // // The constructor of TestInfo registers itself with the UnitTest // singleton such that the RUN_ALL_TESTS() macro knows which tests to // run. class GTEST_API_ TestInfo { public: // Destructs a TestInfo object. This function is not virtual, so // don't inherit from TestInfo. ~TestInfo(); // Returns the test case name. const char* test_case_name() const { return test_case_name_.c_str(); } // Returns the test name. const char* name() const { return name_.c_str(); } // Returns the name of the parameter type, or NULL if this is not a typed // or a type-parameterized test. const char* type_param() const { if (type_param_.get() != NULL) return type_param_->c_str(); return NULL; } // Returns the text representation of the value parameter, or NULL if this // is not a value-parameterized test. const char* value_param() const { if (value_param_.get() != NULL) return value_param_->c_str(); return NULL; } // Returns true if this test should run, that is if the test is not disabled // (or it is disabled but the also_run_disabled_tests flag has been specified) // and its full name matches the user-specified filter. // // Google Test allows the user to filter the tests by their full names. // The full name of a test Bar in test case Foo is defined as // "Foo.Bar". Only the tests that match the filter will run. // // A filter is a colon-separated list of glob (not regex) patterns, // optionally followed by a '-' and a colon-separated list of // negative patterns (tests to exclude). A test is run if it // matches one of the positive patterns and does not match any of // the negative patterns. // // For example, *A*:Foo.* is a filter that matches any string that // contains the character 'A' or starts with "Foo.". bool should_run() const { return should_run_; } // Returns the result of the test. const TestResult* result() const { return &result_; } private: #if GTEST_HAS_DEATH_TEST friend class internal::DefaultDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST friend class Test; friend class TestCase; friend class internal::UnitTestImpl; friend TestInfo* internal::MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* type_param, const char* value_param, internal::TypeId fixture_class_id, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc, internal::TestFactoryBase* factory); // Constructs a TestInfo object. The newly constructed instance assumes // ownership of the factory object. TestInfo(const char* test_case_name, const char* name, const char* a_type_param, const char* a_value_param, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory); // Increments the number of death tests encountered in this test so // far. int increment_death_test_count() { return result_.increment_death_test_count(); } // Creates the test object, runs it, records its result, and then // deletes it. void Run(); static void ClearTestResult(TestInfo* test_info) { test_info->result_.Clear(); } // These fields are immutable properties of the test. const std::string test_case_name_; // Test case name const std::string name_; // Test name // Name of the parameter type, or NULL if this is not a typed or a // type-parameterized test. const internal::scoped_ptr<const ::std::string> type_param_; // Text representation of the value parameter, or NULL if this is not a // value-parameterized test. const internal::scoped_ptr<const ::std::string> value_param_; const internal::TypeId fixture_class_id_; // ID of the test fixture class bool should_run_; // True iff this test should run bool is_disabled_; // True iff this test is disabled bool matches_filter_; // True if this test matches the // user-specified filter. internal::TestFactoryBase* const factory_; // The factory that creates // the test object // This field is mutable and needs to be reset before running the // test for the second time. TestResult result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo); }; // A test case, which consists of a vector of TestInfos. // // TestCase is not copyable. class GTEST_API_ TestCase { public: // Creates a TestCase with the given name. // // TestCase does NOT have a default constructor. Always use this // constructor to create a TestCase object. // // Arguments: // // name: name of the test case // a_type_param: the name of the test's type parameter, or NULL if // this is not a type-parameterized test. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase(const char* name, const char* a_type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc); // Destructor of TestCase. virtual ~TestCase(); // Gets the name of the TestCase. const char* name() const { return name_.c_str(); } // Returns the name of the parameter type, or NULL if this is not a // type-parameterized test case. const char* type_param() const { if (type_param_.get() != NULL) return type_param_->c_str(); return NULL; } // Returns true if any test in this test case should run. bool should_run() const { return should_run_; } // Gets the number of successful tests in this test case. int successful_test_count() const; // Gets the number of failed tests in this test case. int failed_test_count() const; // Gets the number of disabled tests in this test case. int disabled_test_count() const; // Get the number of tests in this test case that should run. int test_to_run_count() const; // Gets the number of all tests in this test case. int total_test_count() const; // Returns true iff the test case passed. bool Passed() const { return !Failed(); } // Returns true iff the test case failed. bool Failed() const { return failed_test_count() > 0; } // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* GetTestInfo(int i) const; private: friend class Test; friend class internal::UnitTestImpl; // Gets the (mutable) vector of TestInfos in this TestCase. std::vector<TestInfo*>& test_info_list() { return test_info_list_; } // Gets the (immutable) vector of TestInfos in this TestCase. const std::vector<TestInfo*>& test_info_list() const { return test_info_list_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* GetMutableTestInfo(int i); // Sets the should_run member. void set_should_run(bool should) { should_run_ = should; } // Adds a TestInfo to this test case. Will delete the TestInfo upon // destruction of the TestCase object. void AddTestInfo(TestInfo * test_info); // Clears the results of all tests in this test case. void ClearResult(); // Clears the results of all tests in the given test case. static void ClearTestCaseResult(TestCase* test_case) { test_case->ClearResult(); } // Runs every test in this TestCase. void Run(); // Runs SetUpTestCase() for this TestCase. This wrapper is needed // for catching exceptions thrown from SetUpTestCase(). void RunSetUpTestCase() { (*set_up_tc_)(); } // Runs TearDownTestCase() for this TestCase. This wrapper is // needed for catching exceptions thrown from TearDownTestCase(). void RunTearDownTestCase() { (*tear_down_tc_)(); } // Returns true iff test passed. static bool TestPassed(const TestInfo* test_info) { return test_info->should_run() && test_info->result()->Passed(); } // Returns true iff test failed. static bool TestFailed(const TestInfo* test_info) { return test_info->should_run() && test_info->result()->Failed(); } // Returns true iff test is disabled. static bool TestDisabled(const TestInfo* test_info) { return test_info->is_disabled_; } // Returns true if the given test should run. static bool ShouldRunTest(const TestInfo* test_info) { return test_info->should_run(); } // Shuffles the tests in this test case. void ShuffleTests(internal::Random* random); // Restores the test order to before the first shuffle. void UnshuffleTests(); // Name of the test case. internal::String name_; // Name of the parameter type, or NULL if this is not a typed or a // type-parameterized test. const internal::scoped_ptr<const ::std::string> type_param_; // The vector of TestInfos in their original order. It owns the // elements in the vector. std::vector<TestInfo*> test_info_list_; // Provides a level of indirection for the test list to allow easy // shuffling and restoring the test order. The i-th element in this // vector is the index of the i-th test in the shuffled test list. std::vector<int> test_indices_; // Pointer to the function that sets up the test case. Test::SetUpTestCaseFunc set_up_tc_; // Pointer to the function that tears down the test case. Test::TearDownTestCaseFunc tear_down_tc_; // True iff any test in this test case should run. bool should_run_; // Elapsed time, in milliseconds. TimeInMillis elapsed_time_; // We disallow copying TestCases. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase); }; // An Environment object is capable of setting up and tearing down an // environment. The user should subclass this to define his own // environment(s). // // An Environment object does the set-up and tear-down in virtual // methods SetUp() and TearDown() instead of the constructor and the // destructor, as: // // 1. You cannot safely throw from a destructor. This is a problem // as in some cases Google Test is used where exceptions are enabled, and // we may want to implement ASSERT_* using exceptions where they are // available. // 2. You cannot use ASSERT_* directly in a constructor or // destructor. class Environment { public: // The d'tor is virtual as we need to subclass Environment. virtual ~Environment() {} // Override this to define how to set up the environment. virtual void SetUp() {} // Override this to define how to tear down the environment. virtual void TearDown() {} private: // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } }; // The interface for tracing execution of tests. The methods are organized in // the order the corresponding events are fired. class TestEventListener { public: virtual ~TestEventListener() {} // Fired before any test activity starts. virtual void OnTestProgramStart(const UnitTest& unit_test) = 0; // Fired before each iteration of tests starts. There may be more than // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration // index, starting from 0. virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration) = 0; // Fired before environment set-up for each iteration of tests starts. virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0; // Fired after environment set-up for each iteration of tests ends. virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0; // Fired before the test case starts. virtual void OnTestCaseStart(const TestCase& test_case) = 0; // Fired before the test starts. virtual void OnTestStart(const TestInfo& test_info) = 0; // Fired after a failed assertion or a SUCCEED() invocation. virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0; // Fired after the test ends. virtual void OnTestEnd(const TestInfo& test_info) = 0; // Fired after the test case ends. virtual void OnTestCaseEnd(const TestCase& test_case) = 0; // Fired before environment tear-down for each iteration of tests starts. virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0; // Fired after environment tear-down for each iteration of tests ends. virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0; // Fired after each iteration of tests finishes. virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration) = 0; // Fired after all test activities have ended. virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0; }; // The convenience class for users who need to override just one or two // methods and are not concerned that a possible change to a signature of // the methods they override will not be caught during the build. For // comments about each method please see the definition of TestEventListener // above. class EmptyTestEventListener : public TestEventListener { public: virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} virtual void OnTestStart(const TestInfo& /*test_info*/) {} virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {} virtual void OnTestEnd(const TestInfo& /*test_info*/) {} virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} }; // TestEventListeners lets users add listeners to track events in Google Test. class GTEST_API_ TestEventListeners { public: TestEventListeners(); ~TestEventListeners(); // Appends an event listener to the end of the list. Google Test assumes // the ownership of the listener (i.e. it will delete the listener when // the test program finishes). void Append(TestEventListener* listener); // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* Release(TestEventListener* listener); // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the caller and makes this // function return NULL the next time. TestEventListener* default_result_printer() const { return default_result_printer_; } // Returns the standard listener responsible for the default XML output // controlled by the --gtest_output=xml flag. Can be removed from the // listeners list by users who want to shut down the default XML output // controlled by this flag and substitute it with custom one. Note that // removing this object from the listener list with Release transfers its // ownership to the caller and makes this function return NULL the next // time. TestEventListener* default_xml_generator() const { return default_xml_generator_; } private: friend class TestCase; friend class TestInfo; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::NoExecDeathTest; friend class internal::TestEventListenersAccessor; friend class internal::UnitTestImpl; // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* repeater(); // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultResultPrinter(TestEventListener* listener); // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultXmlGenerator(TestEventListener* listener); // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool EventForwardingEnabled() const; void SuppressEventForwarding(); // The actual list of listeners. internal::TestEventRepeater* repeater_; // Listener responsible for the standard result output. TestEventListener* default_result_printer_; // Listener responsible for the creation of the XML output file. TestEventListener* default_xml_generator_; // We disallow copying TestEventListeners. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners); }; // A UnitTest consists of a vector of TestCases. // // This is a singleton class. The only instance of UnitTest is // created when UnitTest::GetInstance() is first called. This // instance is never deleted. // // UnitTest is not copyable. // // This class is thread-safe as long as the methods are called // according to their specification. class GTEST_API_ UnitTest { public: // Gets the singleton UnitTest object. The first time this method // is called, a UnitTest object is constructed and returned. // Consecutive calls will return the same object. static UnitTest* GetInstance(); // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // This method can only be called from the main thread. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. int Run() GTEST_MUST_USE_RESULT_; // Returns the working directory when the first TEST() or TEST_F() // was executed. The UnitTest object owns the string. const char* original_working_dir() const; // Returns the TestCase object for the test that's currently running, // or NULL if no test is running. const TestCase* current_test_case() const; // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. const TestInfo* current_test_info() const; // Returns the random seed used at the start of the current test run. int random_seed() const; #if GTEST_HAS_PARAM_TEST // Returns the ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. internal::ParameterizedTestCaseRegistry& parameterized_test_registry(); #endif // GTEST_HAS_PARAM_TEST // Gets the number of successful test cases. int successful_test_case_count() const; // Gets the number of failed test cases. int failed_test_case_count() const; // Gets the number of all test cases. int total_test_case_count() const; // Gets the number of all test cases that contain at least one test // that should run. int test_case_to_run_count() const; // Gets the number of successful tests. int successful_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const; // Returns true iff the unit test passed (i.e. all test cases passed). bool Passed() const; // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool Failed() const; // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* GetTestCase(int i) const; // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& listeners(); private: // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in // the order they were registered. After all tests in the program // have finished, all global test environments will be torn-down in // the *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // This method can only be called from the main thread. Environment* AddEnvironment(Environment* env); // Adds a TestPartResult to the current TestResult object. All // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) // eventually call this to report their results. The user code // should use the assertion macros instead of calling this directly. void AddTestPartResult(TestPartResult::Type result_type, const char* file_name, int line_number, const internal::String& message, const internal::String& os_stack_trace); // Adds a TestProperty to the current TestResult object. If the result already // contains a property with the same key, the value will be updated. void RecordPropertyForCurrentTest(const char* key, const char* value); // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* GetMutableTestCase(int i); // Accessors for the implementation object. internal::UnitTestImpl* impl() { return impl_; } const internal::UnitTestImpl* impl() const { return impl_; } // These classes and funcions are friends as they need to access private // members of UnitTest. friend class Test; friend class internal::AssertHelper; friend class internal::ScopedTrace; friend Environment* AddGlobalTestEnvironment(Environment* env); friend internal::UnitTestImpl* internal::GetUnitTestImpl(); friend void internal::ReportFailureInUnknownLocation( TestPartResult::Type result_type, const internal::String& message); // Creates an empty UnitTest. UnitTest(); // D'tor virtual ~UnitTest(); // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. void PushGTestTrace(const internal::TraceInfo& trace); // Pops a trace from the per-thread Google Test trace stack. void PopGTestTrace(); // Protects mutable state in *impl_. This is mutable as some const // methods need to lock it too. mutable internal::Mutex mutex_; // Opaque implementation object. This field is never changed once // the object is constructed. We don't mark it as const here, as // doing so will cause a warning in the constructor of UnitTest. // Mutable state in *impl_ is protected by mutex_. internal::UnitTestImpl* impl_; // We disallow copying UnitTest. GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest); }; // A convenient wrapper for adding an environment for the test // program. // // You should call this before RUN_ALL_TESTS() is called, probably in // main(). If you use gtest_main, you need to call this before main() // starts for it to take effect. For example, you can define a global // variable like this: // // testing::Environment* const foo_env = // testing::AddGlobalTestEnvironment(new FooEnvironment); // // However, we strongly recommend you to write your own main() and // call AddGlobalTestEnvironment() there, as relying on initialization // of global variables makes the code harder to read and may cause // problems when you register multiple environments from different // translation units and the environments have dependencies among them // (remember that the compiler doesn't guarantee the order in which // global variables from different translation units are initialized). inline Environment* AddGlobalTestEnvironment(Environment* env) { return UnitTest::GetInstance()->AddEnvironment(env); } // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. GTEST_API_ void InitGoogleTest(int* argc, char** argv); // This overloaded version can be used in Windows programs compiled in // UNICODE mode. GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv); namespace internal { // Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc) // operand to be used in a failure message. The type (but not value) // of the other operand may affect the format. This allows us to // print a char* as a raw pointer when it is compared against another // char*, and print it as a C string when it is compared against an // std::string object, for example. // // The default implementation ignores the type of the other operand. // Some specialized versions are used to handle formatting wide or // narrow C strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template <typename T1, typename T2> String FormatForComparisonFailureMessage(const T1& value, const T2& /* other_operand */) { // C++Builder compiles this incorrectly if the namespace isn't explicitly // given. return ::testing::PrintToString(value); } // The helper function for {ASSERT|EXPECT}_EQ. template <typename T1, typename T2> AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual) { #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4389) // Temporarily disables warning on // signed/unsigned mismatch. #endif if (expected == actual) { return AssertionSuccess(); } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif return EqFailure(expected_expression, actual_expression, FormatForComparisonFailureMessage(expected, actual), FormatForComparisonFailureMessage(actual, expected), false); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums // can be implicitly cast to BiggestInt. GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual); // The helper class for {ASSERT|EXPECT}_EQ. The template argument // lhs_is_null_literal is true iff the first argument to ASSERT_EQ() // is a null pointer literal. The following default implementation is // for lhs_is_null_literal being false. template <bool lhs_is_null_literal> class EqHelper { public: // This templatized version is for the general case. template <typename T1, typename T2> static AssertionResult Compare(const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous // enums can be implicitly cast to BiggestInt. // // Even though its body looks the same as the above version, we // cannot merge the two, as it will make anonymous enums unhappy. static AssertionResult Compare(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } }; // This specialization is used when the first argument to ASSERT_EQ() // is a null pointer literal, like NULL, false, or 0. template <> class EqHelper<true> { public: // We define two overloaded versions of Compare(). The first // version will be picked when the second argument to ASSERT_EQ() is // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or // EXPECT_EQ(false, a_bool). template <typename T1, typename T2> static AssertionResult Compare( const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual, // The following line prevents this overload from being considered if T2 // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr) // expands to Compare("", "", NULL, my_ptr), which requires a conversion // to match the Secret* in the other overload, which would otherwise make // this template match better. typename EnableIf<!is_pointer<T2>::value>::type* = 0) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } // This version will be picked when the second argument to ASSERT_EQ() is a // pointer, e.g. ASSERT_EQ(NULL, a_pointer). template <typename T> static AssertionResult Compare( const char* expected_expression, const char* actual_expression, // We used to have a second template parameter instead of Secret*. That // template parameter would deduce to 'long', making this a better match // than the first overload even without the first overload's EnableIf. // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to // non-pointer argument" (even a deduced integral argument), so the old // implementation caused warnings in user code. Secret* /* expected (NULL) */, T* actual) { // We already know that 'expected' is a null pointer. return CmpHelperEQ(expected_expression, actual_expression, static_cast<T*>(NULL), actual); } }; // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste // of similar code. // // For each templatized helper function, we also define an overloaded // version for BiggestInt in order to reduce code bloat and allow // anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled // with gcc 4. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ template <typename T1, typename T2>\ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ const T1& val1, const T2& val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ return AssertionFailure() \ << "Expected: (" << expr1 << ") " #op " (" << expr2\ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ << " vs " << FormatForComparisonFailureMessage(val2, val1);\ }\ }\ GTEST_API_ AssertionResult CmpHelper##op_name(\ const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2) // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // Implements the helper function for {ASSERT|EXPECT}_NE GTEST_IMPL_CMP_HELPER_(NE, !=); // Implements the helper function for {ASSERT|EXPECT}_LE GTEST_IMPL_CMP_HELPER_(LE, <=); // Implements the helper function for {ASSERT|EXPECT}_LT GTEST_IMPL_CMP_HELPER_(LT, < ); // Implements the helper function for {ASSERT|EXPECT}_GE GTEST_IMPL_CMP_HELPER_(GE, >=); // Implements the helper function for {ASSERT|EXPECT}_GT GTEST_IMPL_CMP_HELPER_(GT, > ); #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual); // The helper function for {ASSERT|EXPECT}_STRCASEEQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual); // The helper function for {ASSERT|EXPECT}_STRNE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // The helper function for {ASSERT|EXPECT}_STRCASENE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // Helper function for *_STREQ on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const wchar_t* expected, const wchar_t* actual); // Helper function for *_STRNE on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2); } // namespace internal // IsSubstring() and IsNotSubstring() are intended to be used as the // first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by // themselves. They check whether needle is a substring of haystack // (NULL is considered a substring of itself only), and return an // appropriate error message when they fail. // // The {needle,haystack}_expr arguments are the stringified // expressions that generated the two real arguments. GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); #if GTEST_HAS_STD_WSTRING GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); #endif // GTEST_HAS_STD_WSTRING namespace internal { // Helper template function for comparing floating-points. // // Template parameter: // // RawType: the raw floating-point type (either float or double) // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template <typename RawType> AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression, const char* actual_expression, RawType expected, RawType actual) { const FloatingPoint<RawType> lhs(expected), rhs(actual); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } ::std::stringstream expected_ss; expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) << expected; ::std::stringstream actual_ss; actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) << actual; return EqFailure(expected_expression, actual_expression, StringStreamToString(&expected_ss), StringStreamToString(&actual_ss), false); } // Helper function for implementing ASSERT_NEAR. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error); // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // A class that enables one to stream messages to assertion macros class GTEST_API_ AssertHelper { public: // Constructor. AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message); ~AssertHelper(); // Message assignment is a semantic trick to enable assertion // streaming; see the GTEST_MESSAGE_ macro below. void operator=(const Message& message) const; private: // We put our data in a struct so that the size of the AssertHelper class can // be as small as possible. This is important because gcc is incapable of // re-using stack space even for temporary variables, so every EXPECT_EQ // reserves stack space for another AssertHelper. struct AssertHelperData { AssertHelperData(TestPartResult::Type t, const char* srcfile, int line_num, const char* msg) : type(t), file(srcfile), line(line_num), message(msg) { } TestPartResult::Type const type; const char* const file; int const line; String const message; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData); }; AssertHelperData* const data_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); }; } // namespace internal #if GTEST_HAS_PARAM_TEST // The pure interface class that all value-parameterized tests inherit from. // A value-parameterized class must inherit from both ::testing::Test and // ::testing::WithParamInterface. In most cases that just means inheriting // from ::testing::TestWithParam, but more complicated test hierarchies // may need to inherit from Test and WithParamInterface at different levels. // // This interface has support for accessing the test parameter value via // the GetParam() method. // // Use it with one of the parameter generator defining functions, like Range(), // Values(), ValuesIn(), Bool(), and Combine(). // // class FooTest : public ::testing::TestWithParam<int> { // protected: // FooTest() { // // Can use GetParam() here. // } // virtual ~FooTest() { // // Can use GetParam() here. // } // virtual void SetUp() { // // Can use GetParam() here. // } // virtual void TearDown { // // Can use GetParam() here. // } // }; // TEST_P(FooTest, DoesBar) { // // Can use GetParam() method here. // Foo foo; // ASSERT_TRUE(foo.DoesBar(GetParam())); // } // INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); template <typename T> class WithParamInterface { public: typedef T ParamType; virtual ~WithParamInterface() {} // The current parameter value. Is also available in the test fixture's // constructor. This member function is non-static, even though it only // references static data, to reduce the opportunity for incorrect uses // like writing 'WithParamInterface<bool>::GetParam()' for a test that // uses a fixture whose parameter type is int. const ParamType& GetParam() const { return *parameter_; } private: // Sets parameter value. The caller is responsible for making sure the value // remains alive and unchanged throughout the current test. static void SetParam(const ParamType* parameter) { parameter_ = parameter; } // Static value used for accessing parameter during a test lifetime. static const ParamType* parameter_; // TestClass must be a subclass of WithParamInterface<T> and Test. template <class TestClass> friend class internal::ParameterizedTestFactory; }; template <typename T> const T* WithParamInterface<T>::parameter_ = NULL; // Most value-parameterized classes can ignore the existence of // WithParamInterface, and can just inherit from ::testing::TestWithParam. template <typename T> class TestWithParam : public Test, public WithParamInterface<T> { }; #endif // GTEST_HAS_PARAM_TEST // Macros for indicating success/failure in test code. // ADD_FAILURE unconditionally adds a failure to the current test. // SUCCEED generates a success - it doesn't automatically make the // current test successful, as a test is only successful when it has // no failure. // // EXPECT_* verifies that a certain condition is satisfied. If not, // it behaves like ADD_FAILURE. In particular: // // EXPECT_TRUE verifies that a Boolean condition is true. // EXPECT_FALSE verifies that a Boolean condition is false. // // FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except // that they will also abort the current function on failure. People // usually want the fail-fast behavior of FAIL and ASSERT_*, but those // writing data-driven tests often find themselves using ADD_FAILURE // and EXPECT_* more. // // Examples: // // EXPECT_TRUE(server.StatusIsOK()); // ASSERT_FALSE(server.HasPendingRequest(port)) // << "There are still pending requests " << "on port " << port; // Generates a nonfatal failure with a generic message. #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") // Generates a nonfatal failure at the given source file location with // a generic message. #define ADD_FAILURE_AT(file, line) \ GTEST_MESSAGE_AT_(file, line, "Failed", \ ::testing::TestPartResult::kNonFatalFailure) // Generates a fatal failure with a generic message. #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") // Define this macro to 1 to omit the definition of FAIL(), which is a // generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_FAIL # define FAIL() GTEST_FAIL() #endif // Generates a success with a generic message. #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") // Define this macro to 1 to omit the definition of SUCCEED(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_SUCCEED # define SUCCEED() GTEST_SUCCEED() #endif // Macros for testing exceptions. // // * {ASSERT|EXPECT}_THROW(statement, expected_exception): // Tests that the statement throws the expected exception. // * {ASSERT|EXPECT}_NO_THROW(statement): // Tests that the statement doesn't throw any exception. // * {ASSERT|EXPECT}_ANY_THROW(statement): // Tests that the statement throws an exception. #define EXPECT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) #define EXPECT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define EXPECT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define ASSERT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) #define ASSERT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) #define ASSERT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) // Boolean assertions. Condition can be either a Boolean expression or an // AssertionResult. For more information on how to use AssertionResult with // these macros see comments on that class. #define EXPECT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_NONFATAL_FAILURE_) #define EXPECT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_NONFATAL_FAILURE_) #define ASSERT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_FATAL_FAILURE_) #define ASSERT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_FATAL_FAILURE_) // Includes the auto-generated header that implements a family of // generic predicate assertion macros. // Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // This file is AUTOMATICALLY GENERATED on 09/24/2010 by command // 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! // // Implements a family of generic predicate assertion macros. #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ // Makes sure this header is not included before gtest.h. #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ # error Do not include gtest_pred_impl.h directly. Include gtest.h instead. #endif // GTEST_INCLUDE_GTEST_GTEST_H_ // This header implements a family of generic predicate assertion // macros: // // ASSERT_PRED_FORMAT1(pred_format, v1) // ASSERT_PRED_FORMAT2(pred_format, v1, v2) // ... // // where pred_format is a function or functor that takes n (in the // case of ASSERT_PRED_FORMATn) values and their source expression // text, and returns a testing::AssertionResult. See the definition // of ASSERT_EQ in gtest.h for an example. // // If you don't care about formatting, you can use the more // restrictive version: // // ASSERT_PRED1(pred, v1) // ASSERT_PRED2(pred, v1, v2) // ... // // where pred is an n-ary function or functor that returns bool, // and the values v1, v2, ..., must support the << operator for // streaming to std::ostream. // // We also define the EXPECT_* variations. // // For now we only support predicates whose arity is at most 5. // Please email googletestframework@googlegroups.com if you need // support for higher arities. // GTEST_ASSERT_ is the basic statement to which all of the assertions // in this file reduce. Don't use this in your code. #define GTEST_ASSERT_(expression, on_failure) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar = (expression)) \ ; \ else \ on_failure(gtest_ar.failure_message()) // Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. template <typename Pred, typename T1> AssertionResult AssertPred1Helper(const char* pred_text, const char* e1, Pred pred, const T1& v1) { if (pred(v1)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. // Don't use this in your code. #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ GTEST_ASSERT_(pred_format(#v1, v1),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. #define GTEST_PRED1_(pred, v1, on_failure)\ GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ #v1, \ pred, \ v1), on_failure) // Unary predicate assertion macros. #define EXPECT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) #define ASSERT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. template <typename Pred, typename T1, typename T2> AssertionResult AssertPred2Helper(const char* pred_text, const char* e1, const char* e2, Pred pred, const T1& v1, const T2& v2) { if (pred(v1, v2)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. // Don't use this in your code. #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. #define GTEST_PRED2_(pred, v1, v2, on_failure)\ GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ #v1, \ #v2, \ pred, \ v1, \ v2), on_failure) // Binary predicate assertion macros. #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) #define ASSERT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. template <typename Pred, typename T1, typename T2, typename T3> AssertionResult AssertPred3Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, Pred pred, const T1& v1, const T2& v2, const T3& v3) { if (pred(v1, v2, v3)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. // Don't use this in your code. #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ #v1, \ #v2, \ #v3, \ pred, \ v1, \ v2, \ v3), on_failure) // Ternary predicate assertion macros. #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) #define ASSERT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. template <typename Pred, typename T1, typename T2, typename T3, typename T4> AssertionResult AssertPred4Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4) { if (pred(v1, v2, v3, v4)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3 << "\n" << e4 << " evaluates to " << v4; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. // Don't use this in your code. #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ pred, \ v1, \ v2, \ v3, \ v4), on_failure) // 4-ary predicate assertion macros. #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) #define ASSERT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. template <typename Pred, typename T1, typename T2, typename T3, typename T4, typename T5> AssertionResult AssertPred5Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, const char* e5, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5) { if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ", " << e5 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3 << "\n" << e4 << " evaluates to " << v4 << "\n" << e5 << " evaluates to " << v5; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. // Don't use this in your code. #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ #v5, \ pred, \ v1, \ v2, \ v3, \ v4, \ v5), on_failure) // 5-ary predicate assertion macros. #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) #endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ // Macros for testing equalities and inequalities. // // * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual // * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 // * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2 // * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2 // * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2 // * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2 // // When they are not, Google Test prints both the tested expressions and // their actual values. The values must be compatible built-in types, // or you will get a compiler error. By "compatible" we mean that the // values can be compared by the respective operator. // // Note: // // 1. It is possible to make a user-defined type work with // {ASSERT|EXPECT}_??(), but that requires overloading the // comparison operators and is thus discouraged by the Google C++ // Usage Guide. Therefore, you are advised to use the // {ASSERT|EXPECT}_TRUE() macro to assert that two objects are // equal. // // 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on // pointers (in particular, C strings). Therefore, if you use it // with two C strings, you are testing how their locations in memory // are related, not how their content is related. To compare two C // strings by content, use {ASSERT|EXPECT}_STR*(). // // 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to // {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you // what the actual value is when it fails, and similarly for the // other comparisons. // // 4. Do not depend on the order in which {ASSERT|EXPECT}_??() // evaluate their arguments, which is undefined. // // 5. These macros evaluate their arguments exactly once. // // Examples: // // EXPECT_NE(5, Foo()); // EXPECT_EQ(NULL, a_pointer); // ASSERT_LT(i, array_size); // ASSERT_GT(records.size(), 0) << "There is no record left."; #define EXPECT_EQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal:: \ EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \ expected, actual) #define EXPECT_NE(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual) #define EXPECT_LE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define EXPECT_LT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define EXPECT_GE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define EXPECT_GT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) #define GTEST_ASSERT_EQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal:: \ EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \ expected, actual) #define GTEST_ASSERT_NE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) #define GTEST_ASSERT_LE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define GTEST_ASSERT_LT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define GTEST_ASSERT_GE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define GTEST_ASSERT_GT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) // Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of // ASSERT_XY(), which clashes with some users' own code. #if !GTEST_DONT_DEFINE_ASSERT_EQ # define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_NE # define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_LE # define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_LT # define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_GE # define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_GT # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2) #endif // C String Comparisons. All tests treat NULL and any non-NULL string // as different. Two NULLs are equal. // // * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2 // * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2 // * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case // * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case // // For wide or narrow string objects, you can use the // {ASSERT|EXPECT}_??() macros. // // Don't depend on the order in which the arguments are evaluated, // which is undefined. // // These macros evaluate their arguments exactly once. #define EXPECT_STREQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) #define EXPECT_STRNE(s1, s2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define EXPECT_STRCASEEQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) #define EXPECT_STRCASENE(s1, s2)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) #define ASSERT_STREQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) #define ASSERT_STRNE(s1, s2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define ASSERT_STRCASEEQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) #define ASSERT_STRCASENE(s1, s2)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) // Macros for comparing floating-point numbers. // // * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual): // Tests that two float values are almost equal. // * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual): // Tests that two double values are almost equal. // * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error): // Tests that v1 and v2 are within the given distance to each other. // // Google Test uses ULP-based comparison to automatically pick a default // error bound that is appropriate for the operands. See the // FloatingPoint template class in gtest-internal.h if you are // interested in the implementation details. #define EXPECT_FLOAT_EQ(expected, actual)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \ expected, actual) #define EXPECT_DOUBLE_EQ(expected, actual)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \ expected, actual) #define ASSERT_FLOAT_EQ(expected, actual)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \ expected, actual) #define ASSERT_DOUBLE_EQ(expected, actual)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \ expected, actual) #define EXPECT_NEAR(val1, val2, abs_error)\ EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) #define ASSERT_NEAR(val1, val2, abs_error)\ ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) // These predicate format functions work on floating-point values, and // can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g. // // EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0); // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2); GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2); #if GTEST_OS_WINDOWS // Macros that test for HRESULT failure and success, these are only useful // on Windows, and rely on Windows SDK macros and APIs to compile. // // * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr) // // When expr unexpectedly fails or succeeds, Google Test prints the // expected result and the actual result with both a human-readable // string representation of the error, if available, as well as the // hex result code. # define EXPECT_HRESULT_SUCCEEDED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) # define ASSERT_HRESULT_SUCCEEDED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) # define EXPECT_HRESULT_FAILED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) # define ASSERT_HRESULT_FAILED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) #endif // GTEST_OS_WINDOWS // Macros that execute statement and check that it doesn't generate new fatal // failures in the current thread. // // * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement); // // Examples: // // EXPECT_NO_FATAL_FAILURE(Process()); // ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed"; // #define ASSERT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) #define EXPECT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) // Causes a trace (including the source file path, the current line // number, and the given message) to be included in every test failure // message generated by code in the current scope. The effect is // undone when the control leaves the current scope. // // The message argument can be anything streamable to std::ostream. // // In the implementation, we include the current line number as part // of the dummy variable name, thus allowing multiple SCOPED_TRACE()s // to appear in the same block - as long as they are on different // lines. #define SCOPED_TRACE(message) \ ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ __FILE__, __LINE__, ::testing::Message() << (message)) // Compile-time assertion for type equality. // StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are // the same type. The value it returns is not interesting. // // Instead of making StaticAssertTypeEq a class template, we make it a // function template that invokes a helper class template. This // prevents a user from misusing StaticAssertTypeEq<T1, T2> by // defining objects of that type. // // CAVEAT: // // When used inside a method of a class template, // StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is // instantiated. For example, given: // // template <typename T> class Foo { // public: // void Bar() { testing::StaticAssertTypeEq<int, T>(); } // }; // // the code: // // void Test1() { Foo<bool> foo; } // // will NOT generate a compiler error, as Foo<bool>::Bar() is never // actually instantiated. Instead, you need: // // void Test2() { Foo<bool> foo; foo.Bar(); } // // to cause a compiler error. template <typename T1, typename T2> bool StaticAssertTypeEq() { (void)internal::StaticAssertTypeEqHelper<T1, T2>(); return true; } // Defines a test. // // The first parameter is the name of the test case, and the second // parameter is the name of the test within the test case. // // The convention is to end the test case name with "Test". For // example, a test case for the Foo class can be named FooTest. // // The user should put his test code between braces after using this // macro. Example: // // TEST(FooTest, InitializesCorrectly) { // Foo foo; // EXPECT_TRUE(foo.StatusIsOK()); // } // Note that we call GetTestTypeId() instead of GetTypeId< // ::testing::Test>() here to get the type ID of testing::Test. This // is to work around a suspected linker bug when using Google Test as // a framework on Mac OS X. The bug causes GetTypeId< // ::testing::Test>() to return different values depending on whether // the call is from the Google Test framework itself or from user test // code. GetTestTypeId() is guaranteed to always return the same // value, as it always calls GetTypeId<>() from the Google Test // framework. #define GTEST_TEST(test_case_name, test_name)\ GTEST_TEST_(test_case_name, test_name, \ ::testing::Test, ::testing::internal::GetTestTypeId()) // Define this macro to 1 to omit the definition of TEST(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_TEST # define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name) #endif // Defines a test that uses a test fixture. // // The first parameter is the name of the test fixture class, which // also doubles as the test case name. The second parameter is the // name of the test within the test case. // // A test fixture class must be declared earlier. The user should put // his test code between braces after using this macro. Example: // // class FooTest : public testing::Test { // protected: // virtual void SetUp() { b_.AddElement(3); } // // Foo a_; // Foo b_; // }; // // TEST_F(FooTest, InitializesCorrectly) { // EXPECT_TRUE(a_.StatusIsOK()); // } // // TEST_F(FooTest, ReturnsElementCountCorrectly) { // EXPECT_EQ(0, a_.size()); // EXPECT_EQ(1, b_.size()); // } #define TEST_F(test_fixture, test_name)\ GTEST_TEST_(test_fixture, test_name, test_fixture, \ ::testing::internal::GetTypeId<test_fixture>()) // Use this macro in main() to run all tests. It returns 0 if all // tests are successful, or 1 otherwise. // // RUN_ALL_TESTS() should be invoked after the command line has been // parsed by InitGoogleTest(). #define RUN_ALL_TESTS()\ (::testing::UnitTest::GetInstance()->Run()) } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_H_ ================================================ FILE: thirdparty/gtest/src/gtest-all.cc ================================================ // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // // Google C++ Testing Framework (Google Test) // // Sometimes it's desirable to build Google Test by compiling a single file. // This file serves this purpose. // This line ensures that gtest.h can be compiled on its own, even // when it's fused. #include "gtest/gtest_ASP.h" // The following lines pull in the real gtest *.cc files. // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // Utilities for testing Google Test itself and code that uses Google Test // (e.g. frameworks built on top of Google Test). #ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ namespace testing { // This helper class can be used to mock out Google Test failure reporting // so that we can test Google Test or code that builds on Google Test. // // An object of this class appends a TestPartResult object to the // TestPartResultArray object given in the constructor whenever a Google Test // failure is reported. It can either intercept only failures that are // generated in the same thread that created this object or it can intercept // all generated failures. The scope of this mock object can be controlled with // the second argument to the two arguments constructor. class GTEST_API_ ScopedFakeTestPartResultReporter : public TestPartResultReporterInterface { public: // The two possible mocking modes of this object. enum InterceptMode { INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. INTERCEPT_ALL_THREADS // Intercepts all failures. }; // The c'tor sets this object as the test part result reporter used // by Google Test. The 'result' parameter specifies where to report the // results. This reporter will only catch failures generated in the current // thread. DEPRECATED explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); // Same as above, but you can choose the interception scope of this object. ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, TestPartResultArray* result); // The d'tor restores the previous test part result reporter. virtual ~ScopedFakeTestPartResultReporter(); // Appends the TestPartResult object to the TestPartResultArray // received in the constructor. // // This method is from the TestPartResultReporterInterface // interface. virtual void ReportTestPartResult(const TestPartResult& result); private: void Init(); const InterceptMode intercept_mode_; TestPartResultReporterInterface* old_reporter_; TestPartResultArray* const result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); }; namespace internal { // A helper class for implementing EXPECT_FATAL_FAILURE() and // EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. class GTEST_API_ SingleFailureChecker { public: // The constructor remembers the arguments. SingleFailureChecker(const TestPartResultArray* results, TestPartResult::Type type, const string& substr); ~SingleFailureChecker(); private: const TestPartResultArray* const results_; const TestPartResult::Type type_; const string substr_; GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); }; } // namespace internal } // namespace testing // A set of macros for testing Google Test assertions or code that's expected // to generate Google Test fatal failures. It verifies that the given // statement will cause exactly one fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_FATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - 'statement' cannot reference local non-static variables or // non-static members of the current object. // - 'statement' cannot return a value. // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. The AcceptsMacroThatExpandsToUnprotectedComma test in // gtest_unittest.cc will fail to compile if we do that. #define EXPECT_FATAL_FAILURE(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ALL_THREADS, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) // A macro for testing Google Test assertions or code that's expected to // generate Google Test non-fatal failures. It asserts that the given // statement will cause exactly one non-fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // 'statement' is allowed to reference local variables and members of // the current object. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. If we do that, the code won't compile when the user gives // EXPECT_NONFATAL_FAILURE() a statement that contains a macro that // expands to code containing an unprotected comma. The // AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc // catches that. // // For the same reason, we have to write // if (::testing::internal::AlwaysTrue()) { statement; } // instead of // GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) // to avoid an MSVC warning on unreachable code. #define EXPECT_NONFATAL_FAILURE(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\ >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #include <ctype.h> #include <math.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <wctype.h> #include <algorithm> #include <ostream> // NOLINT #include <sstream> #include <vector> #if GTEST_OS_LINUX // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). # define GTEST_HAS_GETTIMEOFDAY_ 1 # include <fcntl.h> // NOLINT # include <limits.h> // NOLINT # include <sched.h> // NOLINT // Declares vsnprintf(). This header is not available on Windows. # include <strings.h> // NOLINT # include <sys/mman.h> // NOLINT # include <sys/time.h> // NOLINT # include <unistd.h> // NOLINT # include <string> #elif GTEST_OS_SYMBIAN # define GTEST_HAS_GETTIMEOFDAY_ 1 # include <sys/time.h> // NOLINT #elif GTEST_OS_ZOS # define GTEST_HAS_GETTIMEOFDAY_ 1 # include <sys/time.h> // NOLINT // On z/OS we additionally need strings.h for strcasecmp. # include <strings.h> // NOLINT #elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. # include <windows.h> // NOLINT #elif GTEST_OS_WINDOWS // We are on Windows proper. # include <io.h> // NOLINT # include <sys/timeb.h> // NOLINT # include <sys/types.h> // NOLINT # include <sys/stat.h> // NOLINT # if GTEST_OS_WINDOWS_MINGW // MinGW has gettimeofday() but not _ftime64(). // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). // TODO(kenton@google.com): There are other ways to get the time on // Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW // supports these. consider using them instead. # define GTEST_HAS_GETTIMEOFDAY_ 1 # include <sys/time.h> // NOLINT # endif // GTEST_OS_WINDOWS_MINGW // cpplint thinks that the header is already included, so we want to // silence it. # include <windows.h> // NOLINT #else // Assume other platforms have gettimeofday(). // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). # define GTEST_HAS_GETTIMEOFDAY_ 1 // cpplint thinks that the header is already included, so we want to // silence it. # include <sys/time.h> // NOLINT # include <unistd.h> // NOLINT #endif // GTEST_OS_LINUX #if GTEST_HAS_EXCEPTIONS # include <stdexcept> #endif #if GTEST_CAN_STREAM_RESULTS_ # include <arpa/inet.h> // NOLINT # include <netdb.h> // NOLINT #endif // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Utility functions and classes used by the Google C++ testing framework. // // Author: wan@google.com (Zhanyong Wan) // // This file contains purely Google Test's internal implementation. Please // DO NOT #INCLUDE IT IN A USER PROGRAM. #ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ #define GTEST_SRC_GTEST_INTERNAL_INL_H_ // GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is // part of Google Test's implementation; otherwise it's undefined. #if !GTEST_IMPLEMENTATION_ // A user is trying to include this from his code - just say no. # error "gtest-internal-inl.h is part of Google Test's internal implementation." # error "It must not be included except by Google Test itself." #endif // GTEST_IMPLEMENTATION_ #ifndef _WIN32_WCE # include <errno.h> #endif // !_WIN32_WCE #include <stddef.h> #include <stdlib.h> // For strtoll/_strtoul64/malloc/free. #include <string.h> // For memmove. #include <algorithm> #include <string> #include <vector> #if GTEST_OS_WINDOWS # include <windows.h> // NOLINT #endif // GTEST_OS_WINDOWS namespace testing { // Declares the flags. // // We don't want the users to modify this flag in the code, but want // Google Test's own unit tests to be able to access it. Therefore we // declare it here as opposed to in gtest.h. GTEST_DECLARE_bool_(death_test_use_fork); namespace internal { // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; // Names of the flags (needed for parsing Google Test flags). const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; const char kBreakOnFailureFlag[] = "break_on_failure"; const char kCatchExceptionsFlag[] = "catch_exceptions"; const char kColorFlag[] = "color"; const char kFilterFlag[] = "filter"; const char kListTestsFlag[] = "list_tests"; const char kOutputFlag[] = "output"; const char kPrintTimeFlag[] = "print_time"; const char kRandomSeedFlag[] = "random_seed"; const char kRepeatFlag[] = "repeat"; const char kShuffleFlag[] = "shuffle"; const char kStackTraceDepthFlag[] = "stack_trace_depth"; const char kStreamResultToFlag[] = "stream_result_to"; const char kThrowOnFailureFlag[] = "throw_on_failure"; // A valid random seed must be in [1, kMaxRandomSeed]. const int kMaxRandomSeed = 99999; // g_help_flag is true iff the --help flag or an equivalent form is // specified on the command line. GTEST_API_ extern bool g_help_flag; // Returns the current time in milliseconds. GTEST_API_ TimeInMillis GetTimeInMillis(); // Returns true iff Google Test should use colors in the output. GTEST_API_ bool ShouldUseColor(bool stdout_is_tty); // Formats the given time in milliseconds as seconds. GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); // Parses a string for an Int32 flag, in the form of "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. GTEST_API_ bool ParseInt32Flag( const char* str, const char* flag, Int32* value); // Returns a random seed in range [1, kMaxRandomSeed] based on the // given --gtest_random_seed flag value. inline int GetRandomSeedFromFlag(Int32 random_seed_flag) { const unsigned int raw_seed = (random_seed_flag == 0) ? static_cast<unsigned int>(GetTimeInMillis()) : static_cast<unsigned int>(random_seed_flag); // Normalizes the actual seed to range [1, kMaxRandomSeed] such that // it's easy to type. const int normalized_seed = static_cast<int>((raw_seed - 1U) % static_cast<unsigned int>(kMaxRandomSeed)) + 1; return normalized_seed; } // Returns the first valid random seed after 'seed'. The behavior is // undefined if 'seed' is invalid. The seed after kMaxRandomSeed is // considered to be 1. inline int GetNextRandomSeed(int seed) { GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) << "Invalid random seed " << seed << " - must be in [1, " << kMaxRandomSeed << "]."; const int next_seed = seed + 1; return (next_seed > kMaxRandomSeed) ? 1 : next_seed; } // This class saves the values of all Google Test flags in its c'tor, and // restores them in its d'tor. class GTestFlagSaver { public: // The c'tor. GTestFlagSaver() { also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); break_on_failure_ = GTEST_FLAG(break_on_failure); catch_exceptions_ = GTEST_FLAG(catch_exceptions); color_ = GTEST_FLAG(color); death_test_style_ = GTEST_FLAG(death_test_style); death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); filter_ = GTEST_FLAG(filter); internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); list_tests_ = GTEST_FLAG(list_tests); output_ = GTEST_FLAG(output); print_time_ = GTEST_FLAG(print_time); random_seed_ = GTEST_FLAG(random_seed); repeat_ = GTEST_FLAG(repeat); shuffle_ = GTEST_FLAG(shuffle); stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); stream_result_to_ = GTEST_FLAG(stream_result_to); throw_on_failure_ = GTEST_FLAG(throw_on_failure); } // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. ~GTestFlagSaver() { GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; GTEST_FLAG(break_on_failure) = break_on_failure_; GTEST_FLAG(catch_exceptions) = catch_exceptions_; GTEST_FLAG(color) = color_; GTEST_FLAG(death_test_style) = death_test_style_; GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; GTEST_FLAG(filter) = filter_; GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; GTEST_FLAG(list_tests) = list_tests_; GTEST_FLAG(output) = output_; GTEST_FLAG(print_time) = print_time_; GTEST_FLAG(random_seed) = random_seed_; GTEST_FLAG(repeat) = repeat_; GTEST_FLAG(shuffle) = shuffle_; GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; GTEST_FLAG(stream_result_to) = stream_result_to_; GTEST_FLAG(throw_on_failure) = throw_on_failure_; } private: // Fields for saving the original values of flags. bool also_run_disabled_tests_; bool break_on_failure_; bool catch_exceptions_; String color_; String death_test_style_; bool death_test_use_fork_; String filter_; String internal_run_death_test_; bool list_tests_; String output_; bool print_time_; bool pretty_; internal::Int32 random_seed_; internal::Int32 repeat_; bool shuffle_; internal::Int32 stack_trace_depth_; String stream_result_to_; bool throw_on_failure_; } GTEST_ATTRIBUTE_UNUSED_; // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // The output buffer str must containt at least 32 characters. // The function returns the address of the output buffer. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output // as '(Invalid Unicode 0xXXXXXXXX)'. GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str); // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. GTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars); // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded(); // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (e.g., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. GTEST_API_ bool ShouldShard(const char* total_shards_str, const char* shard_index_str, bool in_subprocess_for_death_test); // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error and // and aborts. GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); // Given the total number of shards, the shard index, and the test id, // returns true iff the test should be run on this shard. The test id is // some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. GTEST_API_ bool ShouldRunTestOnShard( int total_shards, int shard_index, int test_id); // STL container utilities. // Returns the number of elements in the given container that satisfy // the given predicate. template <class Container, typename Predicate> inline int CountIf(const Container& c, Predicate predicate) { // Implemented as an explicit loop since std::count_if() in libCstd on // Solaris has a non-standard signature. int count = 0; for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) { if (predicate(*it)) ++count; } return count; } // Applies a function/functor to each element in the container. template <class Container, typename Functor> void ForEach(const Container& c, Functor functor) { std::for_each(c.begin(), c.end(), functor); } // Returns the i-th element of the vector, or default_value if i is not // in range [0, v.size()). template <typename E> inline E GetElementOr(const std::vector<E>& v, int i, E default_value) { return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i]; } // Performs an in-place shuffle of a range of the vector's elements. // 'begin' and 'end' are element indices as an STL-style range; // i.e. [begin, end) are shuffled, where 'end' == size() means to // shuffle to the end of the vector. template <typename E> void ShuffleRange(internal::Random* random, int begin, int end, std::vector<E>* v) { const int size = static_cast<int>(v->size()); GTEST_CHECK_(0 <= begin && begin <= size) << "Invalid shuffle range start " << begin << ": must be in range [0, " << size << "]."; GTEST_CHECK_(begin <= end && end <= size) << "Invalid shuffle range finish " << end << ": must be in range [" << begin << ", " << size << "]."; // Fisher-Yates shuffle, from // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle for (int range_width = end - begin; range_width >= 2; range_width--) { const int last_in_range = begin + range_width - 1; const int selected = begin + random->Generate(range_width); std::swap((*v)[selected], (*v)[last_in_range]); } } // Performs an in-place shuffle of the vector's elements. template <typename E> inline void Shuffle(internal::Random* random, std::vector<E>* v) { ShuffleRange(random, 0, static_cast<int>(v->size()), v); } // A function for deleting an object. Handy for being used as a // functor. template <typename T> static void Delete(T* x) { delete x; } // A predicate that checks the key of a TestProperty against a known key. // // TestPropertyKeyIs is copyable. class TestPropertyKeyIs { public: // Constructor. // // TestPropertyKeyIs has NO default constructor. explicit TestPropertyKeyIs(const char* key) : key_(key) {} // Returns true iff the test name of test property matches on key_. bool operator()(const TestProperty& test_property) const { return String(test_property.key()).Compare(key_) == 0; } private: String key_; }; // Class UnitTestOptions. // // This class contains functions for processing options the user // specifies when running the tests. It has only static members. // // In most cases, the user can specify an option using either an // environment variable or a command line flag. E.g. you can set the // test filter using either GTEST_FILTER or --gtest_filter. If both // the variable and the flag are present, the latter overrides the // former. class GTEST_API_ UnitTestOptions { public: // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. static String GetOutputFormat(); // Returns the absolute path of the requested output file, or the // default (test_detail.xml in the original working directory) if // none was explicitly specified. static String GetAbsolutePathToOutputFile(); // Functions for processing the gtest_filter flag. // Returns true iff the wildcard pattern matches the string. The // first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. static bool PatternMatchesString(const char *pattern, const char *str); // Returns true iff the user-specified filter matches the test case // name and the test name. static bool FilterMatchesTest(const String &test_case_name, const String &test_name); #if GTEST_OS_WINDOWS // Function for supporting the gtest_catch_exception flag. // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. static int GTestShouldProcessSEH(DWORD exception_code); #endif // GTEST_OS_WINDOWS // Returns true if "name" matches the ':' separated list of glob-style // filters in "filter". static bool MatchesFilter(const String& name, const char* filter); }; // Returns the current application's name, removing directory path if that // is present. Used by UnitTestOptions::GetOutputFile. GTEST_API_ FilePath GetCurrentExecutableName(); // The role interface for getting the OS stack trace as a string. class OsStackTraceGetterInterface { public: OsStackTraceGetterInterface() {} virtual ~OsStackTraceGetterInterface() {} // Returns the current OS stack trace as a String. Parameters: // // max_depth - the maximum number of stack frames to be included // in the trace. // skip_count - the number of top frames to be skipped; doesn't count // against max_depth. virtual String CurrentStackTrace(int max_depth, int skip_count) = 0; // UponLeavingGTest() should be called immediately before Google Test calls // user code. It saves some information about the current stack that // CurrentStackTrace() will use to find and hide Google Test stack frames. virtual void UponLeavingGTest() = 0; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); }; // A working implementation of the OsStackTraceGetterInterface interface. class OsStackTraceGetter : public OsStackTraceGetterInterface { public: OsStackTraceGetter() : caller_frame_(NULL) {} virtual String CurrentStackTrace(int max_depth, int skip_count); virtual void UponLeavingGTest(); // This string is inserted in place of stack frames that are part of // Google Test's implementation. static const char* const kElidedFramesMarker; private: Mutex mutex_; // protects all internal state // We save the stack frame below the frame that calls user code. // We do this because the address of the frame immediately below // the user code changes between the call to UponLeavingGTest() // and any calls to CurrentStackTrace() from within the user code. void* caller_frame_; GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); }; // Information about a Google Test trace point. struct TraceInfo { const char* file; int line; String message; }; // This is the default global test part result reporter used in UnitTestImpl. // This class should only be used by UnitTestImpl. class DefaultGlobalTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. Reports the test part // result in the current test. virtual void ReportTestPartResult(const TestPartResult& result); private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); }; // This is the default per thread test part result reporter used in // UnitTestImpl. This class should only be used by UnitTestImpl. class DefaultPerThreadTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. The implementation just // delegates to the current global test part result reporter of *unit_test_. virtual void ReportTestPartResult(const TestPartResult& result); private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); }; // The private implementation of the UnitTest class. We don't protect // the methods under a mutex, as this class is not accessible by a // user and the UnitTest class that delegates work to this class does // proper locking. class GTEST_API_ UnitTestImpl { public: explicit UnitTestImpl(UnitTest* parent); virtual ~UnitTestImpl(); // There are two different ways to register your own TestPartResultReporter. // You can register your own repoter to listen either only for test results // from the current thread or for results from all threads. // By default, each per-thread test result repoter just passes a new // TestPartResult to the global test result reporter, which registers the // test part result for the currently running test. // Returns the global test part result reporter. TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); // Sets the global test part result reporter. void SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter); // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); // Sets the test part result reporter for the current thread. void SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter); // Gets the number of successful test cases. int successful_test_case_count() const; // Gets the number of failed test cases. int failed_test_case_count() const; // Gets the number of all test cases. int total_test_case_count() const; // Gets the number of all test cases that contain at least one test // that should run. int test_case_to_run_count() const; // Gets the number of successful tests. int successful_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns true iff the unit test passed (i.e. all test cases passed). bool Passed() const { return !Failed(); } // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool Failed() const { return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed(); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* GetTestCase(int i) const { const int index = GetElementOr(test_case_indices_, i, -1); return index < 0 ? NULL : test_cases_[i]; } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* GetMutableTestCase(int i) { const int index = GetElementOr(test_case_indices_, i, -1); return index < 0 ? NULL : test_cases_[index]; } // Provides access to the event listener list. TestEventListeners* listeners() { return &listeners_; } // Returns the TestResult for the test that's currently running, or // the TestResult for the ad hoc test if no test is running. TestResult* current_test_result(); // Returns the TestResult for the ad hoc test. const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter // are the same; otherwise, deletes the old getter and makes the // input the current getter. void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* os_stack_trace_getter(); // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. String CurrentOsStackTraceExceptTop(int skip_count); // Finds and returns a TestCase with the given name. If one doesn't // exist, creates one and returns it. // // Arguments: // // test_case_name: name of the test case // type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase* GetTestCase(const char* test_case_name, const char* type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc); // Adds a TestInfo to the unit test. // // Arguments: // // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // test_info: the TestInfo object void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc, TestInfo* test_info) { // In order to support thread-safe death tests, we need to // remember the original working directory when the test program // was first invoked. We cannot do this in RUN_ALL_TESTS(), as // the user may have changed the current directory before calling // RUN_ALL_TESTS(). Therefore we capture the current directory in // AddTestInfo(), which is called to register a TEST or TEST_F // before main() is reached. if (original_working_dir_.IsEmpty()) { original_working_dir_.Set(FilePath::GetCurrentDir()); GTEST_CHECK_(!original_working_dir_.IsEmpty()) << "Failed to get the current working directory."; } GetTestCase(test_info->test_case_name(), test_info->type_param(), set_up_tc, tear_down_tc)->AddTestInfo(test_info); } #if GTEST_HAS_PARAM_TEST // Returns ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. internal::ParameterizedTestCaseRegistry& parameterized_test_registry() { return parameterized_test_registry_; } #endif // GTEST_HAS_PARAM_TEST // Sets the TestCase object for the test that's currently running. void set_current_test_case(TestCase* a_current_test_case) { current_test_case_ = a_current_test_case; } // Sets the TestInfo object for the test that's currently running. If // current_test_info is NULL, the assertion results will be stored in // ad_hoc_test_result_. void set_current_test_info(TestInfo* a_current_test_info) { current_test_info_ = a_current_test_info; } // Registers all parameterized tests defined using TEST_P and // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter // combination. This method can be called more then once; it has guards // protecting from registering the tests more then once. If // value-parameterized tests are disabled, RegisterParameterizedTests is // present but does nothing. void RegisterParameterizedTests(); // Runs all tests in this UnitTest object, prints the result, and // returns true if all tests are successful. If any exception is // thrown during a test, this test is considered to be failed, but // the rest of the tests will still be run. bool RunAllTests(); // Clears the results of all tests, except the ad hoc tests. void ClearNonAdHocTestResult() { ForEach(test_cases_, TestCase::ClearTestCaseResult); } // Clears the results of ad-hoc test assertions. void ClearAdHocTestResult() { ad_hoc_test_result_.Clear(); } enum ReactionToSharding { HONOR_SHARDING_PROTOCOL, IGNORE_SHARDING_PROTOCOL }; // Matches the full name of each test against the user-specified // filter to decide whether the test should run, then records the // result in each TestCase and TestInfo object. // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests // based on sharding variables in the environment. // Returns the number of tests that should run. int FilterTests(ReactionToSharding shard_tests); // Prints the names of the tests matching the user-specified filter flag. void ListTestsMatchingFilter(); const TestCase* current_test_case() const { return current_test_case_; } TestInfo* current_test_info() { return current_test_info_; } const TestInfo* current_test_info() const { return current_test_info_; } // Returns the vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector<Environment*>& environments() { return environments_; } // Getters for the per-thread Google Test trace stack. std::vector<TraceInfo>& gtest_trace_stack() { return *(gtest_trace_stack_.pointer()); } const std::vector<TraceInfo>& gtest_trace_stack() const { return gtest_trace_stack_.get(); } #if GTEST_HAS_DEATH_TEST void InitDeathTestSubprocessControlInfo() { internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); } // Returns a pointer to the parsed --gtest_internal_run_death_test // flag, or NULL if that flag was not specified. // This information is useful only in a death test child process. // Must not be called before a call to InitGoogleTest. const InternalRunDeathTestFlag* internal_run_death_test_flag() const { return internal_run_death_test_flag_.get(); } // Returns a pointer to the current death test factory. internal::DeathTestFactory* death_test_factory() { return death_test_factory_.get(); } void SuppressTestEventsIfInSubprocess(); friend class ReplaceDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST // Initializes the event listener performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void ConfigureXmlOutput(); #if GTEST_CAN_STREAM_RESULTS_ // Initializes the event listener for streaming test results to a socket. // Must not be called before InitGoogleTest. void ConfigureStreamingOutput(); #endif // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void PostFlagParsingInit(); // Gets the random seed used at the start of the current test iteration. int random_seed() const { return random_seed_; } // Gets the random number generator. internal::Random* random() { return &random_; } // Shuffles all test cases, and the tests within each test case, // making sure that death tests are still run first. void ShuffleTests(); // Restores the test cases and tests to their order before the first shuffle. void UnshuffleTests(); // Returns the value of GTEST_FLAG(catch_exceptions) at the moment // UnitTest::Run() starts. bool catch_exceptions() const { return catch_exceptions_; } private: friend class ::testing::UnitTest; // Used by UnitTest::Run() to capture the state of // GTEST_FLAG(catch_exceptions) at the moment it starts. void set_catch_exceptions(bool value) { catch_exceptions_ = value; } // The UnitTest object that owns this implementation object. UnitTest* const parent_; // The working directory when the first TEST() or TEST_F() was // executed. internal::FilePath original_working_dir_; // The default test part result reporters. DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; DefaultPerThreadTestPartResultReporter default_per_thread_test_part_result_reporter_; // Points to (but doesn't own) the global test part result reporter. TestPartResultReporterInterface* global_test_part_result_repoter_; // Protects read and write access to global_test_part_result_reporter_. internal::Mutex global_test_part_result_reporter_mutex_; // Points to (but doesn't own) the per-thread test part result reporter. internal::ThreadLocal<TestPartResultReporterInterface*> per_thread_test_part_result_reporter_; // The vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector<Environment*> environments_; // The vector of TestCases in their original order. It owns the // elements in the vector. std::vector<TestCase*> test_cases_; // Provides a level of indirection for the test case list to allow // easy shuffling and restoring the test case order. The i-th // element of this vector is the index of the i-th test case in the // shuffled order. std::vector<int> test_case_indices_; #if GTEST_HAS_PARAM_TEST // ParameterizedTestRegistry object used to register value-parameterized // tests. internal::ParameterizedTestCaseRegistry parameterized_test_registry_; // Indicates whether RegisterParameterizedTests() has been called already. bool parameterized_tests_registered_; #endif // GTEST_HAS_PARAM_TEST // Index of the last death test case registered. Initially -1. int last_death_test_case_; // This points to the TestCase for the currently running test. It // changes as Google Test goes through one test case after another. // When no test is running, this is set to NULL and Google Test // stores assertion results in ad_hoc_test_result_. Initially NULL. TestCase* current_test_case_; // This points to the TestInfo for the currently running test. It // changes as Google Test goes through one test after another. When // no test is running, this is set to NULL and Google Test stores // assertion results in ad_hoc_test_result_. Initially NULL. TestInfo* current_test_info_; // Normally, a user only writes assertions inside a TEST or TEST_F, // or inside a function called by a TEST or TEST_F. Since Google // Test keeps track of which test is current running, it can // associate such an assertion with the test it belongs to. // // If an assertion is encountered when no TEST or TEST_F is running, // Google Test attributes the assertion result to an imaginary "ad hoc" // test, and records the result in ad_hoc_test_result_. TestResult ad_hoc_test_result_; // The list of event listeners that can be used to track events inside // Google Test. TestEventListeners listeners_; // The OS stack trace getter. Will be deleted when the UnitTest // object is destructed. By default, an OsStackTraceGetter is used, // but the user can set this field to use a custom getter if that is // desired. OsStackTraceGetterInterface* os_stack_trace_getter_; // True iff PostFlagParsingInit() has been called. bool post_flag_parse_init_performed_; // The random number seed used at the beginning of the test run. int random_seed_; // Our random number generator. internal::Random random_; // How long the test took to run, in milliseconds. TimeInMillis elapsed_time_; #if GTEST_HAS_DEATH_TEST // The decomposed components of the gtest_internal_run_death_test flag, // parsed when RUN_ALL_TESTS is called. internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_; internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_; #endif // GTEST_HAS_DEATH_TEST // A per-thread stack of traces created by the SCOPED_TRACE() macro. internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_; // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests() // starts. bool catch_exceptions_; GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); }; // class UnitTestImpl // Convenience function for accessing the global UnitTest // implementation object. inline UnitTestImpl* GetUnitTestImpl() { return UnitTest::GetInstance()->impl(); } #if GTEST_USES_SIMPLE_RE // Internal helper functions for implementing the simple regular // expression matcher. GTEST_API_ bool IsInSet(char ch, const char* str); GTEST_API_ bool IsAsciiDigit(char ch); GTEST_API_ bool IsAsciiPunct(char ch); GTEST_API_ bool IsRepeat(char ch); GTEST_API_ bool IsAsciiWhiteSpace(char ch); GTEST_API_ bool IsAsciiWordChar(char ch); GTEST_API_ bool IsValidEscape(char ch); GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); GTEST_API_ bool ValidateRegex(const char* regex); GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); GTEST_API_ bool MatchRepetitionAndRegexAtHead( bool escaped, char ch, char repeat, const char* regex, const char* str); GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); #endif // GTEST_USES_SIMPLE_RE // Parses the command line for Google Test flags, without initializing // other parts of Google Test. GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); #if GTEST_HAS_DEATH_TEST // Returns the message describing the last system error, regardless of the // platform. GTEST_API_ String GetLastErrnoDescription(); # if GTEST_OS_WINDOWS // Provides leak-safe Windows kernel handle ownership. class AutoHandle { public: AutoHandle() : handle_(INVALID_HANDLE_VALUE) {} explicit AutoHandle(HANDLE handle) : handle_(handle) {} ~AutoHandle() { Reset(); } HANDLE Get() const { return handle_; } void Reset() { Reset(INVALID_HANDLE_VALUE); } void Reset(HANDLE handle) { if (handle != handle_) { if (handle_ != INVALID_HANDLE_VALUE) ::CloseHandle(handle_); handle_ = handle; } } private: HANDLE handle_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); }; # endif // GTEST_OS_WINDOWS // Attempts to parse a string into a positive integer pointed to by the // number parameter. Returns true if that is possible. // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use // it here. template <typename Integer> bool ParseNaturalNumber(const ::std::string& str, Integer* number) { // Fail fast if the given string does not begin with a digit; // this bypasses strtoXXX's "optional leading whitespace and plus // or minus sign" semantics, which are undesirable here. if (str.empty() || !IsDigit(str[0])) { return false; } errno = 0; char* end; // BiggestConvertible is the largest integer type that system-provided // string-to-number conversion routines can return. # if GTEST_OS_WINDOWS && !defined(__GNUC__) // MSVC and C++ Builder define __int64 instead of the standard long long. typedef unsigned __int64 BiggestConvertible; const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); # else typedef unsigned long long BiggestConvertible; // NOLINT const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); # endif // GTEST_OS_WINDOWS && !defined(__GNUC__) const bool parse_success = *end == '\0' && errno == 0; // TODO(vladl@google.com): Convert this to compile time assertion when it is // available. GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); const Integer result = static_cast<Integer>(parsed); if (parse_success && static_cast<BiggestConvertible>(result) == parsed) { *number = result; return true; } return false; } #endif // GTEST_HAS_DEATH_TEST // TestResult contains some private methods that should be hidden from // Google Test user but are required for testing. This class allow our tests // to access them. // // This class is supplied only for the purpose of testing Google Test's own // constructs. Do not use it in user tests, either directly or indirectly. class TestResultAccessor { public: static void RecordProperty(TestResult* test_result, const TestProperty& property) { test_result->RecordProperty(property); } static void ClearTestPartResults(TestResult* test_result) { test_result->ClearTestPartResults(); } static const std::vector<testing::TestPartResult>& test_part_results( const TestResult& test_result) { return test_result.test_part_results(); } }; } // namespace internal } // namespace testing #endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ #undef GTEST_IMPLEMENTATION_ #if GTEST_OS_WINDOWS # define vsnprintf _vsnprintf #endif // GTEST_OS_WINDOWS namespace testing { using internal::CountIf; using internal::ForEach; using internal::GetElementOr; using internal::Shuffle; // Constants. // A test whose test case name or test name matches this filter is // disabled and not run. static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; // A test case whose name matches this filter is considered a death // test case and will be run before test cases whose name doesn't // match this filter. static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*"; // A test filter that matches everything. static const char kUniversalFilter[] = "*"; // The default output file for XML output. static const char kDefaultOutputFile[] = "test_detail.xml"; // The environment variable name for the test shard index. static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; // The environment variable name for the total number of test shards. static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; // The environment variable name for the test shard status file. static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; namespace internal { // The text used in failure messages to indicate the start of the // stack trace. const char kStackTraceMarker[] = "\nStack trace:\n"; // g_help_flag is true iff the --help flag or an equivalent form is // specified on the command line. bool g_help_flag = false; } // namespace internal GTEST_DEFINE_bool_( also_run_disabled_tests, internal::BoolFromGTestEnv("also_run_disabled_tests", false), "Run disabled tests too, in addition to the tests normally being run."); GTEST_DEFINE_bool_( break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false), "True iff a failed assertion should be a debugger break-point."); GTEST_DEFINE_bool_( catch_exceptions, internal::BoolFromGTestEnv("catch_exceptions", true), "True iff " GTEST_NAME_ " should catch exceptions and treat them as test failures."); GTEST_DEFINE_string_( color, internal::StringFromGTestEnv("color", "auto"), "Whether to use colors in the output. Valid values: yes, no, " "and auto. 'auto' means to use colors if the output is " "being sent to a terminal and the TERM environment variable " "is set to xterm, xterm-color, xterm-256color, linux or cygwin."); GTEST_DEFINE_string_( filter, internal::StringFromGTestEnv("filter", kUniversalFilter), "A colon-separated list of glob (not regex) patterns " "for filtering the tests to run, optionally followed by a " "'-' and a : separated list of negative patterns (tests to " "exclude). A test is run if it matches one of the positive " "patterns and does not match any of the negative patterns."); GTEST_DEFINE_bool_(list_tests, false, "List all tests without running them."); GTEST_DEFINE_string_( output, internal::StringFromGTestEnv("output", ""), "A format (currently must be \"xml\"), optionally followed " "by a colon and an output file name or directory. A directory " "is indicated by a trailing pathname separator. " "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " "If a directory is specified, output files will be created " "within that directory, with file-names based on the test " "executable's name and, if necessary, made unique by adding " "digits."); GTEST_DEFINE_bool_( print_time, internal::BoolFromGTestEnv("print_time", true), "True iff " GTEST_NAME_ " should display elapsed time in text output."); GTEST_DEFINE_int32_( random_seed, internal::Int32FromGTestEnv("random_seed", 0), "Random number seed to use when shuffling test orders. Must be in range " "[1, 99999], or 0 to use a seed based on the current time."); GTEST_DEFINE_int32_( repeat, internal::Int32FromGTestEnv("repeat", 1), "How many times to repeat each test. Specify a negative number " "for repeating forever. Useful for shaking out flaky tests."); GTEST_DEFINE_bool_( show_internal_stack_frames, false, "True iff " GTEST_NAME_ " should include internal stack frames when " "printing test failure stack traces."); GTEST_DEFINE_bool_( shuffle, internal::BoolFromGTestEnv("shuffle", false), "True iff " GTEST_NAME_ " should randomize tests' order on every run."); GTEST_DEFINE_int32_( stack_trace_depth, internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), "The maximum number of stack frames to print when an " "assertion fails. The valid range is 0 through 100, inclusive."); GTEST_DEFINE_string_( stream_result_to, internal::StringFromGTestEnv("stream_result_to", ""), "This flag specifies the host name and the port number on which to stream " "test results. Example: \"localhost:555\". The flag is effective only on " "Linux."); GTEST_DEFINE_bool_( throw_on_failure, internal::BoolFromGTestEnv("throw_on_failure", false), "When this flag is specified, a failed assertion will throw an exception " "if exceptions are enabled or exit the program with a non-zero code " "otherwise."); namespace internal { // Generates a random number from [0, range), using a Linear // Congruential Generator (LCG). Crashes if 'range' is 0 or greater // than kMaxRange. UInt32 Random::Generate(UInt32 range) { // These constants are the same as are used in glibc's rand(3). state_ = (1103515245U*state_ + 12345U) % kMaxRange; GTEST_CHECK_(range > 0) << "Cannot generate a number in the range [0, 0)."; GTEST_CHECK_(range <= kMaxRange) << "Generation of a number in [0, " << range << ") was requested, " << "but this can only generate numbers in [0, " << kMaxRange << ")."; // Converting via modulus introduces a bit of downward bias, but // it's simple, and a linear congruential generator isn't too good // to begin with. return state_ % range; } // GTestIsInitialized() returns true iff the user has initialized // Google Test. Useful for catching the user mistake of not initializing // Google Test before calling RUN_ALL_TESTS(). // // A user must call testing::InitGoogleTest() to initialize Google // Test. g_init_gtest_count is set to the number of times // InitGoogleTest() has been called. We don't protect this variable // under a mutex as it is only accessed in the main thread. int g_init_gtest_count = 0; static bool GTestIsInitialized() { return g_init_gtest_count != 0; } // Iterates over a vector of TestCases, keeping a running sum of the // results of calling a given int-returning method on each. // Returns the sum. static int SumOverTestCaseList(const std::vector<TestCase*>& case_list, int (TestCase::*method)() const) { int sum = 0; for (size_t i = 0; i < case_list.size(); i++) { sum += (case_list[i]->*method)(); } return sum; } // Returns true iff the test case passed. static bool TestCasePassed(const TestCase* test_case) { return test_case->should_run() && test_case->Passed(); } // Returns true iff the test case failed. static bool TestCaseFailed(const TestCase* test_case) { return test_case->should_run() && test_case->Failed(); } // Returns true iff test_case contains at least one test that should // run. static bool ShouldRunTestCase(const TestCase* test_case) { return test_case->should_run(); } // AssertHelper constructor. AssertHelper::AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message) : data_(new AssertHelperData(type, file, line, message)) { } AssertHelper::~AssertHelper() { delete data_; } // Message assignment, for assertion streaming support. void AssertHelper::operator=(const Message& message) const { UnitTest::GetInstance()-> AddTestPartResult(data_->type, data_->file, data_->line, AppendUserMessage(data_->message, message), UnitTest::GetInstance()->impl() ->CurrentOsStackTraceExceptTop(1) // Skips the stack frame for this function itself. ); // NOLINT } // Mutex for linked pointers. GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex); // Application pathname gotten in InitGoogleTest. String g_executable_path; // Returns the current application's name, removing directory path if that // is present. FilePath GetCurrentExecutableName() { FilePath result; #if GTEST_OS_WINDOWS result.Set(FilePath(g_executable_path).RemoveExtension("exe")); #else result.Set(FilePath(g_executable_path)); #endif // GTEST_OS_WINDOWS return result.RemoveDirectoryName(); } // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. String UnitTestOptions::GetOutputFormat() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); if (gtest_output_flag == NULL) return String(""); const char* const colon = strchr(gtest_output_flag, ':'); return (colon == NULL) ? String(gtest_output_flag) : String(gtest_output_flag, colon - gtest_output_flag); } // Returns the name of the requested output file, or the default if none // was explicitly specified. String UnitTestOptions::GetAbsolutePathToOutputFile() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); if (gtest_output_flag == NULL) return String(""); const char* const colon = strchr(gtest_output_flag, ':'); if (colon == NULL) return String(internal::FilePath::ConcatPaths( internal::FilePath( UnitTest::GetInstance()->original_working_dir()), internal::FilePath(kDefaultOutputFile)).ToString() ); internal::FilePath output_name(colon + 1); if (!output_name.IsAbsolutePath()) // TODO(wan@google.com): on Windows \some\path is not an absolute // path (as its meaning depends on the current drive), yet the // following logic for turning it into an absolute path is wrong. // Fix it. output_name = internal::FilePath::ConcatPaths( internal::FilePath(UnitTest::GetInstance()->original_working_dir()), internal::FilePath(colon + 1)); if (!output_name.IsDirectory()) return output_name.ToString(); internal::FilePath result(internal::FilePath::GenerateUniqueFileName( output_name, internal::GetCurrentExecutableName(), GetOutputFormat().c_str())); return result.ToString(); } // Returns true iff the wildcard pattern matches the string. The // first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. bool UnitTestOptions::PatternMatchesString(const char *pattern, const char *str) { switch (*pattern) { case '\0': case ':': // Either ':' or '\0' marks the end of the pattern. return *str == '\0'; case '?': // Matches any single character. return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); case '*': // Matches any string (possibly empty) of characters. return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || PatternMatchesString(pattern + 1, str); default: // Non-special character. Matches itself. return *pattern == *str && PatternMatchesString(pattern + 1, str + 1); } } bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) { const char *cur_pattern = filter; for (;;) { if (PatternMatchesString(cur_pattern, name.c_str())) { return true; } // Finds the next pattern in the filter. cur_pattern = strchr(cur_pattern, ':'); // Returns if no more pattern can be found. if (cur_pattern == NULL) { return false; } // Skips the pattern separater (the ':' character). cur_pattern++; } } // TODO(keithray): move String function implementations to gtest-string.cc. // Returns true iff the user-specified filter matches the test case // name and the test name. bool UnitTestOptions::FilterMatchesTest(const String &test_case_name, const String &test_name) { const String& full_name = String::Format("%s.%s", test_case_name.c_str(), test_name.c_str()); // Split --gtest_filter at '-', if there is one, to separate into // positive filter and negative filter portions const char* const p = GTEST_FLAG(filter).c_str(); const char* const dash = strchr(p, '-'); String positive; String negative; if (dash == NULL) { positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter negative = String(""); } else { positive = String(p, dash - p); // Everything up to the dash negative = String(dash+1); // Everything after the dash if (positive.empty()) { // Treat '-test1' as the same as '*-test1' positive = kUniversalFilter; } } // A filter is a colon-separated list of patterns. It matches a // test if any pattern in it matches the test. return (MatchesFilter(full_name, positive.c_str()) && !MatchesFilter(full_name, negative.c_str())); } #if GTEST_HAS_SEH // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { // Google Test should handle a SEH exception if: // 1. the user wants it to, AND // 2. this is not a breakpoint exception, AND // 3. this is not a C++ exception (VC++ implements them via SEH, // apparently). // // SEH exception code for C++ exceptions. // (see http://support.microsoft.com/kb/185294 for more information). const DWORD kCxxExceptionCode = 0xe06d7363; bool should_handle = true; if (!GTEST_FLAG(catch_exceptions)) should_handle = false; else if (exception_code == EXCEPTION_BREAKPOINT) should_handle = false; else if (exception_code == kCxxExceptionCode) should_handle = false; return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; } #endif // GTEST_HAS_SEH } // namespace internal // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. Intercepts only failures from the current thread. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( TestPartResultArray* result) : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), result_(result) { Init(); } // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( InterceptMode intercept_mode, TestPartResultArray* result) : intercept_mode_(intercept_mode), result_(result) { Init(); } void ScopedFakeTestPartResultReporter::Init() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { old_reporter_ = impl->GetGlobalTestPartResultReporter(); impl->SetGlobalTestPartResultReporter(this); } else { old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); impl->SetTestPartResultReporterForCurrentThread(this); } } // The d'tor restores the test part result reporter used by Google Test // before. ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { impl->SetGlobalTestPartResultReporter(old_reporter_); } else { impl->SetTestPartResultReporterForCurrentThread(old_reporter_); } } // Increments the test part result count and remembers the result. // This method is from the TestPartResultReporterInterface interface. void ScopedFakeTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { result_->Append(result); } namespace internal { // Returns the type ID of ::testing::Test. We should always call this // instead of GetTypeId< ::testing::Test>() to get the type ID of // testing::Test. This is to work around a suspected linker bug when // using Google Test as a framework on Mac OS X. The bug causes // GetTypeId< ::testing::Test>() to return different values depending // on whether the call is from the Google Test framework itself or // from user test code. GetTestTypeId() is guaranteed to always // return the same value, as it always calls GetTypeId<>() from the // gtest.cc, which is within the Google Test framework. TypeId GetTestTypeId() { return GetTypeId<Test>(); } // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); // This predicate-formatter checks that 'results' contains a test part // failure of the given type and that the failure message contains the // given substring. AssertionResult HasOneFailure(const char* /* results_expr */, const char* /* type_expr */, const char* /* substr_expr */, const TestPartResultArray& results, TestPartResult::Type type, const string& substr) { const String expected(type == TestPartResult::kFatalFailure ? "1 fatal failure" : "1 non-fatal failure"); Message msg; if (results.size() != 1) { msg << "Expected: " << expected << "\n" << " Actual: " << results.size() << " failures"; for (int i = 0; i < results.size(); i++) { msg << "\n" << results.GetTestPartResult(i); } return AssertionFailure() << msg; } const TestPartResult& r = results.GetTestPartResult(0); if (r.type() != type) { return AssertionFailure() << "Expected: " << expected << "\n" << " Actual:\n" << r; } if (strstr(r.message(), substr.c_str()) == NULL) { return AssertionFailure() << "Expected: " << expected << " containing \"" << substr << "\"\n" << " Actual:\n" << r; } return AssertionSuccess(); } // The constructor of SingleFailureChecker remembers where to look up // test part results, what type of failure we expect, and what // substring the failure message should contain. SingleFailureChecker:: SingleFailureChecker( const TestPartResultArray* results, TestPartResult::Type type, const string& substr) : results_(results), type_(type), substr_(substr) {} // The destructor of SingleFailureChecker verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. SingleFailureChecker::~SingleFailureChecker() { EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_); } DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultGlobalTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->current_test_result()->AddTestPartResult(result); unit_test_->listeners()->repeater()->OnTestPartResult(result); } DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultPerThreadTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); } // Returns the global test part result reporter. TestPartResultReporterInterface* UnitTestImpl::GetGlobalTestPartResultReporter() { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); return global_test_part_result_repoter_; } // Sets the global test part result reporter. void UnitTestImpl::SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter) { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); global_test_part_result_repoter_ = reporter; } // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* UnitTestImpl::GetTestPartResultReporterForCurrentThread() { return per_thread_test_part_result_reporter_.get(); } // Sets the test part result reporter for the current thread. void UnitTestImpl::SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter) { per_thread_test_part_result_reporter_.set(reporter); } // Gets the number of successful test cases. int UnitTestImpl::successful_test_case_count() const { return CountIf(test_cases_, TestCasePassed); } // Gets the number of failed test cases. int UnitTestImpl::failed_test_case_count() const { return CountIf(test_cases_, TestCaseFailed); } // Gets the number of all test cases. int UnitTestImpl::total_test_case_count() const { return static_cast<int>(test_cases_.size()); } // Gets the number of all test cases that contain at least one test // that should run. int UnitTestImpl::test_case_to_run_count() const { return CountIf(test_cases_, ShouldRunTestCase); } // Gets the number of successful tests. int UnitTestImpl::successful_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count); } // Gets the number of failed tests. int UnitTestImpl::failed_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count); } // Gets the number of disabled tests. int UnitTestImpl::disabled_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count); } // Gets the number of all tests. int UnitTestImpl::total_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::total_test_count); } // Gets the number of tests that should run. int UnitTestImpl::test_to_run_count() const { return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count); } // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { (void)skip_count; return String(""); } // Returns the current time in milliseconds. TimeInMillis GetTimeInMillis() { #if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) // Difference between 1970-01-01 and 1601-01-01 in milliseconds. // http://analogous.blogspot.com/2005/04/epoch.html const TimeInMillis kJavaEpochToWinFileTimeDelta = static_cast<TimeInMillis>(116444736UL) * 100000UL; const DWORD kTenthMicrosInMilliSecond = 10000; SYSTEMTIME now_systime; FILETIME now_filetime; ULARGE_INTEGER now_int64; // TODO(kenton@google.com): Shouldn't this just use // GetSystemTimeAsFileTime()? GetSystemTime(&now_systime); if (SystemTimeToFileTime(&now_systime, &now_filetime)) { now_int64.LowPart = now_filetime.dwLowDateTime; now_int64.HighPart = now_filetime.dwHighDateTime; now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - kJavaEpochToWinFileTimeDelta; return now_int64.QuadPart; } return 0; #elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ __timeb64 now; # ifdef _MSC_VER // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 // (deprecated function) there. // TODO(kenton@google.com): Use GetTickCount()? Or use // SystemTimeToFileTime() # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4996) // Temporarily disables warning 4996. _ftime64(&now); # pragma warning(pop) // Restores the warning state. # else _ftime64(&now); # endif // _MSC_VER return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm; #elif GTEST_HAS_GETTIMEOFDAY_ struct timeval now; gettimeofday(&now, NULL); return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000; #else # error "Don't know how to get the current time on your system." #endif } // Utilities // class String // Returns the input enclosed in double quotes if it's not NULL; // otherwise returns "(null)". For example, "\"Hello\"" is returned // for input "Hello". // // This is useful for printing a C string in the syntax of a literal. // // Known issue: escape sequences are not handled yet. String String::ShowCStringQuoted(const char* c_str) { return c_str ? String::Format("\"%s\"", c_str) : String("(null)"); } // Copies at most length characters from str into a newly-allocated // piece of memory of size length+1. The memory is allocated with new[]. // A terminating null byte is written to the memory, and a pointer to it // is returned. If str is NULL, NULL is returned. static char* CloneString(const char* str, size_t length) { if (str == NULL) { return NULL; } else { char* const clone = new char[length + 1]; posix::StrNCpy(clone, str, length); clone[length] = '\0'; return clone; } } // Clones a 0-terminated C string, allocating memory using new. The // caller is responsible for deleting[] the return value. Returns the // cloned string, or NULL if the input is NULL. const char * String::CloneCString(const char* c_str) { return (c_str == NULL) ? NULL : CloneString(c_str, strlen(c_str)); } #if GTEST_OS_WINDOWS_MOBILE // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. LPCWSTR String::AnsiToUtf16(const char* ansi) { if (!ansi) return NULL; const int length = strlen(ansi); const int unicode_length = MultiByteToWideChar(CP_ACP, 0, ansi, length, NULL, 0); WCHAR* unicode = new WCHAR[unicode_length + 1]; MultiByteToWideChar(CP_ACP, 0, ansi, length, unicode, unicode_length); unicode[unicode_length] = 0; return unicode; } // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. const char* String::Utf16ToAnsi(LPCWSTR utf16_str) { if (!utf16_str) return NULL; const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, NULL, 0, NULL, NULL); char* ansi = new char[ansi_length + 1]; WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, NULL, NULL); ansi[ansi_length] = 0; return ansi; } #endif // GTEST_OS_WINDOWS_MOBILE // Compares two C strings. Returns true iff they have the same content. // // Unlike strcmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::CStringEquals(const char * lhs, const char * rhs) { if ( lhs == NULL ) return rhs == NULL; if ( rhs == NULL ) return false; return strcmp(lhs, rhs) == 0; } #if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING // Converts an array of wide chars to a narrow string using the UTF-8 // encoding, and streams the result to the given Message object. static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, Message* msg) { // TODO(wan): consider allowing a testing::String object to // contain '\0'. This will make it behave more like std::string, // and will allow ToUtf8String() to return the correct encoding // for '\0' s.t. we can get rid of the conditional here (and in // several other places). for (size_t i = 0; i != length; ) { // NOLINT if (wstr[i] != L'\0') { *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i)); while (i != length && wstr[i] != L'\0') i++; } else { *msg << '\0'; i++; } } } #endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING } // namespace internal #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& Message::operator <<(const ::std::wstring& wstr) { internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); return *this; } #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& Message::operator <<(const ::wstring& wstr) { internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); return *this; } #endif // GTEST_HAS_GLOBAL_WSTRING // AssertionResult constructors. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult::AssertionResult(const AssertionResult& other) : success_(other.success_), message_(other.message_.get() != NULL ? new ::std::string(*other.message_) : static_cast< ::std::string*>(NULL)) { } // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult AssertionResult::operator!() const { AssertionResult negation(!success_); if (message_.get() != NULL) negation << *message_; return negation; } // Makes a successful assertion result. AssertionResult AssertionSuccess() { return AssertionResult(true); } // Makes a failed assertion result. AssertionResult AssertionFailure() { return AssertionResult(false); } // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << message. AssertionResult AssertionFailure(const Message& message) { return AssertionFailure() << message; } namespace internal { // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // expected_expression: "foo" // actual_expression: "bar" // expected_value: "5" // actual_value: "6" // // The ignoring_case parameter is true iff the assertion is a // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will // be inserted into the message. AssertionResult EqFailure(const char* expected_expression, const char* actual_expression, const String& expected_value, const String& actual_value, bool ignoring_case) { Message msg; msg << "Value of: " << actual_expression; if (actual_value != actual_expression) { msg << "\n Actual: " << actual_value; } msg << "\nExpected: " << expected_expression; if (ignoring_case) { msg << " (ignoring case)"; } if (expected_value != expected_expression) { msg << "\nWhich is: " << expected_value; } return AssertionFailure() << msg; } // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. String GetBoolAssertionFailureMessage(const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value) { const char* actual_message = assertion_result.message(); Message msg; msg << "Value of: " << expression_text << "\n Actual: " << actual_predicate_value; if (actual_message[0] != '\0') msg << " (" << actual_message << ")"; msg << "\nExpected: " << expected_predicate_value; return msg.GetString(); } // Helper function for implementing ASSERT_NEAR. AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error) { const double diff = fabs(val1 - val2); if (diff <= abs_error) return AssertionSuccess(); // TODO(wan): do not print the value of an expression if it's // already a literal. return AssertionFailure() << "The difference between " << expr1 << " and " << expr2 << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" << expr1 << " evaluates to " << val1 << ",\n" << expr2 << " evaluates to " << val2 << ", and\n" << abs_error_expr << " evaluates to " << abs_error << "."; } // Helper template for implementing FloatLE() and DoubleLE(). template <typename RawType> AssertionResult FloatingPointLE(const char* expr1, const char* expr2, RawType val1, RawType val2) { // Returns success if val1 is less than val2, if (val1 < val2) { return AssertionSuccess(); } // or if val1 is almost equal to val2. const FloatingPoint<RawType> lhs(val1), rhs(val2); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } // Note that the above two checks will both fail if either val1 or // val2 is NaN, as the IEEE floating-point standard requires that // any predicate involving a NaN must return false. ::std::stringstream val1_ss; val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) << val1; ::std::stringstream val2_ss; val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) << val2; return AssertionFailure() << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" << " Actual: " << StringStreamToString(&val1_ss) << " vs " << StringStreamToString(&val2_ss); } } // namespace internal // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2) { return internal::FloatingPointLE<float>(expr1, expr2, val1, val2); } // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2) { return internal::FloatingPointLE<double>(expr1, expr2, val1, val2); } namespace internal { // The helper function for {ASSERT|EXPECT}_EQ with int or enum // arguments. AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual) { if (expected == actual) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, FormatForComparisonFailureMessage(expected, actual), FormatForComparisonFailureMessage(actual, expected), false); } // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here // just to avoid copy-and-paste of similar code. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ BiggestInt val1, BiggestInt val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ return AssertionFailure() \ << "Expected: (" << expr1 << ") " #op " (" << expr2\ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ << " vs " << FormatForComparisonFailureMessage(val2, val1);\ }\ } // Implements the helper function for {ASSERT|EXPECT}_NE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(NE, !=) // Implements the helper function for {ASSERT|EXPECT}_LE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LE, <=) // Implements the helper function for {ASSERT|EXPECT}_LT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LT, < ) // Implements the helper function for {ASSERT|EXPECT}_GE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GE, >=) // Implements the helper function for {ASSERT|EXPECT}_GT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GT, > ) #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual) { if (String::CStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, String::ShowCStringQuoted(expected), String::ShowCStringQuoted(actual), false); } // The helper function for {ASSERT|EXPECT}_STRCASEEQ. AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual) { if (String::CaseInsensitiveCStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, String::ShowCStringQuoted(expected), String::ShowCStringQuoted(actual), true); } // The helper function for {ASSERT|EXPECT}_STRNE. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CStringEquals(s1, s2)) { return AssertionSuccess(); } else { return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: \"" << s1 << "\" vs \"" << s2 << "\""; } } // The helper function for {ASSERT|EXPECT}_STRCASENE. AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CaseInsensitiveCStringEquals(s1, s2)) { return AssertionSuccess(); } else { return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << ") (ignoring case), actual: \"" << s1 << "\" vs \"" << s2 << "\""; } } } // namespace internal namespace { // Helper functions for implementing IsSubString() and IsNotSubstring(). // This group of overloaded functions return true iff needle is a // substring of haystack. NULL is considered a substring of itself // only. bool IsSubstringPred(const char* needle, const char* haystack) { if (needle == NULL || haystack == NULL) return needle == haystack; return strstr(haystack, needle) != NULL; } bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { if (needle == NULL || haystack == NULL) return needle == haystack; return wcsstr(haystack, needle) != NULL; } // StringType here can be either ::std::string or ::std::wstring. template <typename StringType> bool IsSubstringPred(const StringType& needle, const StringType& haystack) { return haystack.find(needle) != StringType::npos; } // This function implements either IsSubstring() or IsNotSubstring(), // depending on the value of the expected_to_be_substring parameter. // StringType here can be const char*, const wchar_t*, ::std::string, // or ::std::wstring. template <typename StringType> AssertionResult IsSubstringImpl( bool expected_to_be_substring, const char* needle_expr, const char* haystack_expr, const StringType& needle, const StringType& haystack) { if (IsSubstringPred(needle, haystack) == expected_to_be_substring) return AssertionSuccess(); const bool is_wide_string = sizeof(needle[0]) > 1; const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; return AssertionFailure() << "Value of: " << needle_expr << "\n" << " Actual: " << begin_string_quote << needle << "\"\n" << "Expected: " << (expected_to_be_substring ? "" : "not ") << "a substring of " << haystack_expr << "\n" << "Which is: " << begin_string_quote << haystack << "\""; } } // namespace // IsSubstring() and IsNotSubstring() check whether needle is a // substring of haystack (NULL is considered a substring of itself // only), and return an appropriate error message when they fail. AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #if GTEST_HAS_STD_WSTRING AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #endif // GTEST_HAS_STD_WSTRING namespace internal { #if GTEST_OS_WINDOWS namespace { // Helper function for IsHRESULT{SuccessFailure} predicates AssertionResult HRESULTFailureHelper(const char* expr, const char* expected, long hr) { // NOLINT # if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't support FormatMessage. const char error_text[] = ""; # else // Looks up the human-readable system message for the HRESULT code // and since we're not passing any params to FormatMessage, we don't // want inserts expanded. const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; const DWORD kBufSize = 4096; // String::Format can't exceed this length. // Gets the system's human readable message string for this HRESULT. char error_text[kBufSize] = { '\0' }; DWORD message_length = ::FormatMessageA(kFlags, 0, // no source, we're asking system hr, // the error 0, // no line width restrictions error_text, // output buffer kBufSize, // buf size NULL); // no arguments for inserts // Trims tailing white space (FormatMessage leaves a trailing cr-lf) for (; message_length && IsSpace(error_text[message_length - 1]); --message_length) { error_text[message_length - 1] = '\0'; } # endif // GTEST_OS_WINDOWS_MOBILE const String error_hex(String::Format("0x%08X ", hr)); return ::testing::AssertionFailure() << "Expected: " << expr << " " << expected << ".\n" << " Actual: " << error_hex << error_text << "\n"; } } // namespace AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT if (SUCCEEDED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "succeeds", hr); } AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT if (FAILED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "fails", hr); } #endif // GTEST_OS_WINDOWS // Utility functions for encoding Unicode text (wide strings) in // UTF-8. // A Unicode code-point can have upto 21 bits, and is encoded in UTF-8 // like this: // // Code-point length Encoding // 0 - 7 bits 0xxxxxxx // 8 - 11 bits 110xxxxx 10xxxxxx // 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx // 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx // The maximum code-point a one-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1; // The maximum code-point a two-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1; // The maximum code-point a three-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1; // The maximum code-point a four-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1; // Chops off the n lowest bits from a bit pattern. Returns the n // lowest bits. As a side effect, the original bit pattern will be // shifted to the right by n bits. inline UInt32 ChopLowBits(UInt32* bits, int n) { const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1); *bits >>= n; return low_bits; } // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // The output buffer str must containt at least 32 characters. // The function returns the address of the output buffer. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output // as '(Invalid Unicode 0xXXXXXXXX)'. char* CodePointToUtf8(UInt32 code_point, char* str) { if (code_point <= kMaxCodePoint1) { str[1] = '\0'; str[0] = static_cast<char>(code_point); // 0xxxxxxx } else if (code_point <= kMaxCodePoint2) { str[2] = '\0'; str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx } else if (code_point <= kMaxCodePoint3) { str[3] = '\0'; str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx } else if (code_point <= kMaxCodePoint4) { str[4] = '\0'; str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx } else { // The longest string String::Format can produce when invoked // with these parameters is 28 character long (not including // the terminating nul character). We are asking for 32 character // buffer just in case. This is also enough for strncpy to // null-terminate the destination string. posix::StrNCpy( str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32); str[31] = '\0'; // Makes sure no change in the format to strncpy leaves // the result unterminated. } return str; } // The following two functions only make sense if the the system // uses UTF-16 for wide string encoding. All supported systems // with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16. // Determines if the arguments constitute UTF-16 surrogate pair // and thus should be combined into a single Unicode code point // using CreateCodePointFromUtf16SurrogatePair. inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { return sizeof(wchar_t) == 2 && (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; } // Creates a Unicode code point from UTF16 surrogate pair. inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, wchar_t second) { const UInt32 mask = (1 << 10) - 1; return (sizeof(wchar_t) == 2) ? (((first & mask) << 10) | (second & mask)) + 0x10000 : // This function should not be called when the condition is // false, but we provide a sensible default in case it is. static_cast<UInt32>(first); } // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. String WideStringToUtf8(const wchar_t* str, int num_chars) { if (num_chars == -1) num_chars = static_cast<int>(wcslen(str)); ::std::stringstream stream; for (int i = 0; i < num_chars; ++i) { UInt32 unicode_code_point; if (str[i] == L'\0') { break; } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], str[i + 1]); i++; } else { unicode_code_point = static_cast<UInt32>(str[i]); } char buffer[32]; // CodePointToUtf8 requires a buffer this big. stream << CodePointToUtf8(unicode_code_point, buffer); } return StringStreamToString(&stream); } // Converts a wide C string to a String using the UTF-8 encoding. // NULL will be converted to "(null)". String String::ShowWideCString(const wchar_t * wide_c_str) { if (wide_c_str == NULL) return String("(null)"); return String(internal::WideStringToUtf8(wide_c_str, -1).c_str()); } // Similar to ShowWideCString(), except that this function encloses // the converted string in double quotes. String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) { if (wide_c_str == NULL) return String("(null)"); return String::Format("L\"%s\"", String::ShowWideCString(wide_c_str).c_str()); } // Compares two wide C strings. Returns true iff they have the same // content. // // Unlike wcscmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; return wcscmp(lhs, rhs) == 0; } // Helper function for *_STREQ on wide strings. AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const wchar_t* expected, const wchar_t* actual) { if (String::WideCStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, String::ShowWideCStringQuoted(expected), String::ShowWideCStringQuoted(actual), false); } // Helper function for *_STRNE on wide strings. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2) { if (!String::WideCStringEquals(s1, s2)) { return AssertionSuccess(); } return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: " << String::ShowWideCStringQuoted(s1) << " vs " << String::ShowWideCStringQuoted(s2); } // Compares two C strings, ignoring case. Returns true iff they have // the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; return posix::StrCaseCmp(lhs, rhs) == 0; } // Compares two wide C strings, ignoring case. Returns true iff they // have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; #if GTEST_OS_WINDOWS return _wcsicmp(lhs, rhs) == 0; #elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID return wcscasecmp(lhs, rhs) == 0; #else // Android, Mac OS X and Cygwin don't define wcscasecmp. // Other unknown OSes may not define it either. wint_t left, right; do { left = towlower(*lhs++); right = towlower(*rhs++); } while (left && left == right); return left == right; #endif // OS selector } // Compares this with another String. // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 // if this is greater than rhs. int String::Compare(const String & rhs) const { const char* const lhs_c_str = c_str(); const char* const rhs_c_str = rhs.c_str(); if (lhs_c_str == NULL) { return rhs_c_str == NULL ? 0 : -1; // NULL < anything except NULL } else if (rhs_c_str == NULL) { return 1; } const size_t shorter_str_len = length() <= rhs.length() ? length() : rhs.length(); for (size_t i = 0; i != shorter_str_len; i++) { if (lhs_c_str[i] < rhs_c_str[i]) { return -1; } else if (lhs_c_str[i] > rhs_c_str[i]) { return 1; } } return (length() < rhs.length()) ? -1 : (length() > rhs.length()) ? 1 : 0; } // Returns true iff this String ends with the given suffix. *Any* // String is considered to end with a NULL or empty suffix. bool String::EndsWith(const char* suffix) const { if (suffix == NULL || CStringEquals(suffix, "")) return true; if (c_str() == NULL) return false; const size_t this_len = strlen(c_str()); const size_t suffix_len = strlen(suffix); return (this_len >= suffix_len) && CStringEquals(c_str() + this_len - suffix_len, suffix); } // Returns true iff this String ends with the given suffix, ignoring case. // Any String is considered to end with a NULL or empty suffix. bool String::EndsWithCaseInsensitive(const char* suffix) const { if (suffix == NULL || CStringEquals(suffix, "")) return true; if (c_str() == NULL) return false; const size_t this_len = strlen(c_str()); const size_t suffix_len = strlen(suffix); return (this_len >= suffix_len) && CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix); } // Formats a list of arguments to a String, using the same format // spec string as for printf. // // We do not use the StringPrintf class as it is not universally // available. // // The result is limited to 4096 characters (including the tailing 0). // If 4096 characters are not enough to format the input, or if // there's an error, "<formatting error or buffer exceeded>" is // returned. String String::Format(const char * format, ...) { va_list args; va_start(args, format); char buffer[4096]; const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]); // MSVC 8 deprecates vsnprintf(), so we want to suppress warning // 4996 (deprecated function) there. #ifdef _MSC_VER // We are using MSVC. # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4996) // Temporarily disables warning 4996. const int size = vsnprintf(buffer, kBufferSize, format, args); # pragma warning(pop) // Restores the warning state. #else // We are not using MSVC. const int size = vsnprintf(buffer, kBufferSize, format, args); #endif // _MSC_VER va_end(args); // vsnprintf()'s behavior is not portable. When the buffer is not // big enough, it returns a negative value in MSVC, and returns the // needed buffer size on Linux. When there is an output error, it // always returns a negative value. For simplicity, we lump the two // error cases together. if (size < 0 || size >= kBufferSize) { return String("<formatting error or buffer exceeded>"); } else { return String(buffer, size); } } // Converts the buffer in a stringstream to a String, converting NUL // bytes to "\\0" along the way. String StringStreamToString(::std::stringstream* ss) { const ::std::string& str = ss->str(); const char* const start = str.c_str(); const char* const end = start + str.length(); // We need to use a helper stringstream to do this transformation // because String doesn't support push_back(). ::std::stringstream helper; for (const char* ch = start; ch != end; ++ch) { if (*ch == '\0') { helper << "\\0"; // Replaces NUL with "\\0"; } else { helper.put(*ch); } } return String(helper.str().c_str()); } // Appends the user-supplied message to the Google-Test-generated message. String AppendUserMessage(const String& gtest_msg, const Message& user_msg) { // Appends the user message if it's non-empty. const String user_msg_string = user_msg.GetString(); if (user_msg_string.empty()) { return gtest_msg; } Message msg; msg << gtest_msg << "\n" << user_msg_string; return msg.GetString(); } } // namespace internal // class TestResult // Creates an empty TestResult. TestResult::TestResult() : death_test_count_(0), elapsed_time_(0) { } // D'tor. TestResult::~TestResult() { } // Returns the i-th test part result among all the results. i can // range from 0 to total_part_count() - 1. If i is not in that range, // aborts the program. const TestPartResult& TestResult::GetTestPartResult(int i) const { if (i < 0 || i >= total_part_count()) internal::posix::Abort(); return test_part_results_.at(i); } // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& TestResult::GetTestProperty(int i) const { if (i < 0 || i >= test_property_count()) internal::posix::Abort(); return test_properties_.at(i); } // Clears the test part results. void TestResult::ClearTestPartResults() { test_part_results_.clear(); } // Adds a test part result to the list. void TestResult::AddTestPartResult(const TestPartResult& test_part_result) { test_part_results_.push_back(test_part_result); } // Adds a test property to the list. If a property with the same key as the // supplied property is already represented, the value of this test_property // replaces the old value for that key. void TestResult::RecordProperty(const TestProperty& test_property) { if (!ValidateTestProperty(test_property)) { return; } internal::MutexLock lock(&test_properites_mutex_); const std::vector<TestProperty>::iterator property_with_matching_key = std::find_if(test_properties_.begin(), test_properties_.end(), internal::TestPropertyKeyIs(test_property.key())); if (property_with_matching_key == test_properties_.end()) { test_properties_.push_back(test_property); return; } property_with_matching_key->SetValue(test_property.value()); } // Adds a failure if the key is a reserved attribute of Google Test // testcase tags. Returns true if the property is valid. bool TestResult::ValidateTestProperty(const TestProperty& test_property) { internal::String key(test_property.key()); if (key == "name" || key == "status" || key == "time" || key == "classname") { ADD_FAILURE() << "Reserved key used in RecordProperty(): " << key << " ('name', 'status', 'time', and 'classname' are reserved by " << GTEST_NAME_ << ")"; return false; } return true; } // Clears the object. void TestResult::Clear() { test_part_results_.clear(); test_properties_.clear(); death_test_count_ = 0; elapsed_time_ = 0; } // Returns true iff the test failed. bool TestResult::Failed() const { for (int i = 0; i < total_part_count(); ++i) { if (GetTestPartResult(i).failed()) return true; } return false; } // Returns true iff the test part fatally failed. static bool TestPartFatallyFailed(const TestPartResult& result) { return result.fatally_failed(); } // Returns true iff the test fatally failed. bool TestResult::HasFatalFailure() const { return CountIf(test_part_results_, TestPartFatallyFailed) > 0; } // Returns true iff the test part non-fatally failed. static bool TestPartNonfatallyFailed(const TestPartResult& result) { return result.nonfatally_failed(); } // Returns true iff the test has a non-fatal failure. bool TestResult::HasNonfatalFailure() const { return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; } // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int TestResult::total_part_count() const { return static_cast<int>(test_part_results_.size()); } // Returns the number of the test properties. int TestResult::test_property_count() const { return static_cast<int>(test_properties_.size()); } // class Test // Creates a Test object. // The c'tor saves the values of all Google Test flags. Test::Test() : gtest_flag_saver_(new internal::GTestFlagSaver) { } // The d'tor restores the values of all Google Test flags. Test::~Test() { delete gtest_flag_saver_; } // Sets up the test fixture. // // A sub-class may override this. void Test::SetUp() { } // Tears down the test fixture. // // A sub-class may override this. void Test::TearDown() { } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const char* key, const char* value) { UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value); } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const char* key, int value) { Message value_message; value_message << value; RecordProperty(key, value_message.GetString().c_str()); } namespace internal { void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const String& message) { // This function is a friend of UnitTest and as such has access to // AddTestPartResult. UnitTest::GetInstance()->AddTestPartResult( result_type, NULL, // No info about the source file where the exception occurred. -1, // We have no info on which line caused the exception. message, String()); // No stack trace, either. } } // namespace internal // Google Test requires all tests in the same test case to use the same test // fixture class. This function checks if the current test has the // same fixture class as the first test in the current test case. If // yes, it returns true; otherwise it generates a Google Test failure and // returns false. bool Test::HasSameFixtureClass() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); const TestCase* const test_case = impl->current_test_case(); // Info about the first test in the current test case. const TestInfo* const first_test_info = test_case->test_info_list()[0]; const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_; const char* const first_test_name = first_test_info->name(); // Info about the current test. const TestInfo* const this_test_info = impl->current_test_info(); const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_; const char* const this_test_name = this_test_info->name(); if (this_fixture_id != first_fixture_id) { // Is the first test defined using TEST? const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); // Is this test defined using TEST? const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); if (first_is_TEST || this_is_TEST) { // The user mixed TEST and TEST_F in this test case - we'll tell // him/her how to fix it. // Gets the name of the TEST and the name of the TEST_F. Note // that first_is_TEST and this_is_TEST cannot both be true, as // the fixture IDs are different for the two tests. const char* const TEST_name = first_is_TEST ? first_test_name : this_test_name; const char* const TEST_F_name = first_is_TEST ? this_test_name : first_test_name; ADD_FAILURE() << "All tests in the same test case must use the same test fixture\n" << "class, so mixing TEST_F and TEST in the same test case is\n" << "illegal. In test case " << this_test_info->test_case_name() << ",\n" << "test " << TEST_F_name << " is defined using TEST_F but\n" << "test " << TEST_name << " is defined using TEST. You probably\n" << "want to change the TEST to TEST_F or move it to another test\n" << "case."; } else { // The user defined two fixture classes with the same name in // two namespaces - we'll tell him/her how to fix it. ADD_FAILURE() << "All tests in the same test case must use the same test fixture\n" << "class. However, in test case " << this_test_info->test_case_name() << ",\n" << "you defined test " << first_test_name << " and test " << this_test_name << "\n" << "using two different test fixture classes. This can happen if\n" << "the two classes are from different namespaces or translation\n" << "units and have the same name. You should probably rename one\n" << "of the classes to put the tests into different test cases."; } return false; } return true; } #if GTEST_HAS_SEH // Adds an "exception thrown" fatal failure to the current test. This // function returns its result via an output parameter pointer because VC++ // prohibits creation of objects with destructors on stack in functions // using __try (see error C2712). static internal::String* FormatSehExceptionMessage(DWORD exception_code, const char* location) { Message message; message << "SEH exception with code 0x" << std::setbase(16) << exception_code << std::setbase(10) << " thrown in " << location << "."; return new internal::String(message.GetString()); } #endif // GTEST_HAS_SEH #if GTEST_HAS_EXCEPTIONS // Adds an "exception thrown" fatal failure to the current test. static internal::String FormatCxxExceptionMessage(const char* description, const char* location) { Message message; if (description != NULL) { message << "C++ exception with description \"" << description << "\""; } else { message << "Unknown C++ exception"; } message << " thrown in " << location << "."; return message.GetString(); } static internal::String PrintTestPartResultToString( const TestPartResult& test_part_result); // A failed Google Test assertion will throw an exception of this type when // GTEST_FLAG(throw_on_failure) is true (if exceptions are enabled). We // derive it from std::runtime_error, which is for errors presumably // detectable only at run time. Since std::runtime_error inherits from // std::exception, many testing frameworks know how to extract and print the // message inside it. class GoogleTestFailureException : public ::std::runtime_error { public: explicit GoogleTestFailureException(const TestPartResult& failure) : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} }; #endif // GTEST_HAS_EXCEPTIONS namespace internal { // We put these helper functions in the internal namespace as IBM's xlC // compiler rejects the code if they were declared static. // Runs the given method and handles SEH exceptions it throws, when // SEH is supported; returns the 0-value for type Result in case of an // SEH exception. (Microsoft compilers cannot handle SEH and C++ // exceptions in the same function. Therefore, we provide a separate // wrapper function for handling SEH exceptions.) template <class T, typename Result> Result HandleSehExceptionsInMethodIfSupported( T* object, Result (T::*method)(), const char* location) { #if GTEST_HAS_SEH __try { return (object->*method)(); } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT GetExceptionCode())) { // We create the exception message on the heap because VC++ prohibits // creation of objects with destructors on stack in functions using __try // (see error C2712). internal::String* exception_message = FormatSehExceptionMessage( GetExceptionCode(), location); internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, *exception_message); delete exception_message; return static_cast<Result>(0); } #else (void)location; return (object->*method)(); #endif // GTEST_HAS_SEH } // Runs the given method and catches and reports C++ and/or SEH-style // exceptions, if they are supported; returns the 0-value for type // Result in case of an SEH exception. template <class T, typename Result> Result HandleExceptionsInMethodIfSupported( T* object, Result (T::*method)(), const char* location) { // NOTE: The user code can affect the way in which Google Test handles // exceptions by setting GTEST_FLAG(catch_exceptions), but only before // RUN_ALL_TESTS() starts. It is technically possible to check the flag // after the exception is caught and either report or re-throw the // exception based on the flag's value: // // try { // // Perform the test method. // } catch (...) { // if (GTEST_FLAG(catch_exceptions)) // // Report the exception as failure. // else // throw; // Re-throws the original exception. // } // // However, the purpose of this flag is to allow the program to drop into // the debugger when the exception is thrown. On most platforms, once the // control enters the catch block, the exception origin information is // lost and the debugger will stop the program at the point of the // re-throw in this function -- instead of at the point of the original // throw statement in the code under test. For this reason, we perform // the check early, sacrificing the ability to affect Google Test's // exception handling in the method where the exception is thrown. if (internal::GetUnitTestImpl()->catch_exceptions()) { #if GTEST_HAS_EXCEPTIONS try { return HandleSehExceptionsInMethodIfSupported(object, method, location); } catch (const GoogleTestFailureException&) { // NOLINT // This exception doesn't originate in code under test. It makes no // sense to report it as a test failure. throw; } catch (const std::exception& e) { // NOLINT internal::ReportFailureInUnknownLocation( TestPartResult::kFatalFailure, FormatCxxExceptionMessage(e.what(), location)); } catch (...) { // NOLINT internal::ReportFailureInUnknownLocation( TestPartResult::kFatalFailure, FormatCxxExceptionMessage(NULL, location)); } return static_cast<Result>(0); #else return HandleSehExceptionsInMethodIfSupported(object, method, location); #endif // GTEST_HAS_EXCEPTIONS } else { return (object->*method)(); } } } // namespace internal // Runs the test and updates the test result. void Test::Run() { if (!HasSameFixtureClass()) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()"); // We will run the test only if SetUp() was successful. if (!HasFatalFailure()) { impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &Test::TestBody, "the test body"); } // However, we want to clean up as much as possible. Hence we will // always call TearDown(), even if SetUp() or the test body has // failed. impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &Test::TearDown, "TearDown()"); } // Returns true iff the current test has a fatal failure. bool Test::HasFatalFailure() { return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); } // Returns true iff the current test has a non-fatal failure. bool Test::HasNonfatalFailure() { return internal::GetUnitTestImpl()->current_test_result()-> HasNonfatalFailure(); } // class TestInfo // Constructs a TestInfo object. It assumes ownership of the test factory // object. // TODO(vladl@google.com): Make a_test_case_name and a_name const string&'s // to signify they cannot be NULLs. TestInfo::TestInfo(const char* a_test_case_name, const char* a_name, const char* a_type_param, const char* a_value_param, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory) : test_case_name_(a_test_case_name), name_(a_name), type_param_(a_type_param ? new std::string(a_type_param) : NULL), value_param_(a_value_param ? new std::string(a_value_param) : NULL), fixture_class_id_(fixture_class_id), should_run_(false), is_disabled_(false), matches_filter_(false), factory_(factory), result_() {} // Destructs a TestInfo object. TestInfo::~TestInfo() { delete factory_; } namespace internal { // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_case_name: name of the test case // name: name of the test // type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // value_param: text representation of the test's value parameter, // or NULL if this is not a value-parameterized test. // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. TestInfo* MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* type_param, const char* value_param, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase* factory) { TestInfo* const test_info = new TestInfo(test_case_name, name, type_param, value_param, fixture_class_id, factory); GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); return test_info; } #if GTEST_HAS_PARAM_TEST void ReportInvalidTestCaseType(const char* test_case_name, const char* file, int line) { Message errors; errors << "Attempted redefinition of test case " << test_case_name << ".\n" << "All tests in the same test case must use the same test fixture\n" << "class. However, in test case " << test_case_name << ", you tried\n" << "to define a test using a fixture class different from the one\n" << "used earlier. This can happen if the two fixture classes are\n" << "from different namespaces and have the same name. You should\n" << "probably rename one of the classes to put the tests into different\n" << "test cases."; fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), errors.GetString().c_str()); } #endif // GTEST_HAS_PARAM_TEST } // namespace internal namespace { // A predicate that checks the test name of a TestInfo against a known // value. // // This is used for implementation of the TestCase class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestNameIs is copyable. class TestNameIs { public: // Constructor. // // TestNameIs has NO default constructor. explicit TestNameIs(const char* name) : name_(name) {} // Returns true iff the test name of test_info matches name_. bool operator()(const TestInfo * test_info) const { return test_info && internal::String(test_info->name()).Compare(name_) == 0; } private: internal::String name_; }; } // namespace namespace internal { // This method expands all parameterized tests registered with macros TEST_P // and INSTANTIATE_TEST_CASE_P into regular tests and registers those. // This will be done just once during the program runtime. void UnitTestImpl::RegisterParameterizedTests() { #if GTEST_HAS_PARAM_TEST if (!parameterized_tests_registered_) { parameterized_test_registry_.RegisterTests(); parameterized_tests_registered_ = true; } #endif } } // namespace internal // Creates the test object, runs it, records its result, and then // deletes it. void TestInfo::Run() { if (!should_run_) return; // Tells UnitTest where to store test result. internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_info(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); // Notifies the unit test event listeners that a test is about to start. repeater->OnTestStart(*this); const TimeInMillis start = internal::GetTimeInMillis(); impl->os_stack_trace_getter()->UponLeavingGTest(); // Creates the test object. Test* const test = internal::HandleExceptionsInMethodIfSupported( factory_, &internal::TestFactoryBase::CreateTest, "the test fixture's constructor"); // Runs the test only if the test object was created and its // constructor didn't generate a fatal failure. if ((test != NULL) && !Test::HasFatalFailure()) { // This doesn't throw as all user code that can throw are wrapped into // exception handling code. test->Run(); } // Deletes the test object. impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( test, &Test::DeleteSelf_, "the test fixture's destructor"); result_.set_elapsed_time(internal::GetTimeInMillis() - start); // Notifies the unit test event listener that a test has just finished. repeater->OnTestEnd(*this); // Tells UnitTest to stop associating assertion results to this // test. impl->set_current_test_info(NULL); } // class TestCase // Gets the number of successful tests in this test case. int TestCase::successful_test_count() const { return CountIf(test_info_list_, TestPassed); } // Gets the number of failed tests in this test case. int TestCase::failed_test_count() const { return CountIf(test_info_list_, TestFailed); } int TestCase::disabled_test_count() const { return CountIf(test_info_list_, TestDisabled); } // Get the number of tests in this test case that should run. int TestCase::test_to_run_count() const { return CountIf(test_info_list_, ShouldRunTest); } // Gets the number of all tests. int TestCase::total_test_count() const { return static_cast<int>(test_info_list_.size()); } // Creates a TestCase with the given name. // // Arguments: // // name: name of the test case // a_type_param: the name of the test case's type parameter, or NULL if // this is not a typed or a type-parameterized test case. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase::TestCase(const char* a_name, const char* a_type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc) : name_(a_name), type_param_(a_type_param ? new std::string(a_type_param) : NULL), set_up_tc_(set_up_tc), tear_down_tc_(tear_down_tc), should_run_(false), elapsed_time_(0) { } // Destructor of TestCase. TestCase::~TestCase() { // Deletes every Test in the collection. ForEach(test_info_list_, internal::Delete<TestInfo>); } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* TestCase::GetTestInfo(int i) const { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? NULL : test_info_list_[index]; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* TestCase::GetMutableTestInfo(int i) { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? NULL : test_info_list_[index]; } // Adds a test to this test case. Will delete the test upon // destruction of the TestCase object. void TestCase::AddTestInfo(TestInfo * test_info) { test_info_list_.push_back(test_info); test_indices_.push_back(static_cast<int>(test_indices_.size())); } // Runs every test in this TestCase. void TestCase::Run() { if (!should_run_) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_case(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); repeater->OnTestCaseStart(*this); impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestCase::RunSetUpTestCase, "SetUpTestCase()"); const internal::TimeInMillis start = internal::GetTimeInMillis(); for (int i = 0; i < total_test_count(); i++) { GetMutableTestInfo(i)->Run(); } elapsed_time_ = internal::GetTimeInMillis() - start; impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestCase::RunTearDownTestCase, "TearDownTestCase()"); repeater->OnTestCaseEnd(*this); impl->set_current_test_case(NULL); } // Clears the results of all tests in this test case. void TestCase::ClearResult() { ForEach(test_info_list_, TestInfo::ClearTestResult); } // Shuffles the tests in this test case. void TestCase::ShuffleTests(internal::Random* random) { Shuffle(random, &test_indices_); } // Restores the test order to before the first shuffle. void TestCase::UnshuffleTests() { for (size_t i = 0; i < test_indices_.size(); i++) { test_indices_[i] = static_cast<int>(i); } } // Formats a countable noun. Depending on its quantity, either the // singular form or the plural form is used. e.g. // // FormatCountableNoun(1, "formula", "formuli") returns "1 formula". // FormatCountableNoun(5, "book", "books") returns "5 books". static internal::String FormatCountableNoun(int count, const char * singular_form, const char * plural_form) { return internal::String::Format("%d %s", count, count == 1 ? singular_form : plural_form); } // Formats the count of tests. static internal::String FormatTestCount(int test_count) { return FormatCountableNoun(test_count, "test", "tests"); } // Formats the count of test cases. static internal::String FormatTestCaseCount(int test_case_count) { return FormatCountableNoun(test_case_count, "test case", "test cases"); } // Converts a TestPartResult::Type enum to human-friendly string // representation. Both kNonFatalFailure and kFatalFailure are translated // to "Failure", as the user usually doesn't care about the difference // between the two when viewing the test result. static const char * TestPartResultTypeToString(TestPartResult::Type type) { switch (type) { case TestPartResult::kSuccess: return "Success"; case TestPartResult::kNonFatalFailure: case TestPartResult::kFatalFailure: #ifdef _MSC_VER return "error: "; #else return "Failure\n"; #endif default: return "Unknown result type"; } } // Prints a TestPartResult to a String. static internal::String PrintTestPartResultToString( const TestPartResult& test_part_result) { return (Message() << internal::FormatFileLocation(test_part_result.file_name(), test_part_result.line_number()) << " " << TestPartResultTypeToString(test_part_result.type()) << test_part_result.message()).GetString(); } // Prints a TestPartResult. static void PrintTestPartResult(const TestPartResult& test_part_result) { const internal::String& result = PrintTestPartResultToString(test_part_result); printf("%s\n", result.c_str()); fflush(stdout); // If the test program runs in Visual Studio or a debugger, the // following statements add the test part result message to the Output // window such that the user can double-click on it to jump to the // corresponding source code location; otherwise they do nothing. #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // We don't call OutputDebugString*() on Windows Mobile, as printing // to stdout is done by OutputDebugString() there already - we don't // want the same message printed twice. ::OutputDebugStringA(result.c_str()); ::OutputDebugStringA("\n"); #endif } // class PrettyUnitTestResultPrinter namespace internal { enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW }; #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // Returns the character attribute for the given color. WORD GetColorAttribute(GTestColor color) { switch (color) { case COLOR_RED: return FOREGROUND_RED; case COLOR_GREEN: return FOREGROUND_GREEN; case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; default: return 0; } } #else // Returns the ANSI color code for the given color. COLOR_DEFAULT is // an invalid input. const char* GetAnsiColorCode(GTestColor color) { switch (color) { case COLOR_RED: return "1"; case COLOR_GREEN: return "2"; case COLOR_YELLOW: return "3"; default: return NULL; }; } #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // Returns true iff Google Test should use colors in the output. bool ShouldUseColor(bool stdout_is_tty) { const char* const gtest_color = GTEST_FLAG(color).c_str(); if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { #if GTEST_OS_WINDOWS // On Windows the TERM variable is usually not set, but the // console there does support colors. return stdout_is_tty; #else // On non-Windows platforms, we rely on the TERM variable. const char* const term = posix::GetEnv("TERM"); const bool term_supports_color = String::CStringEquals(term, "xterm") || String::CStringEquals(term, "xterm-color") || String::CStringEquals(term, "xterm-256color") || String::CStringEquals(term, "screen") || String::CStringEquals(term, "linux") || String::CStringEquals(term, "cygwin"); return stdout_is_tty && term_supports_color; #endif // GTEST_OS_WINDOWS } return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || String::CaseInsensitiveCStringEquals(gtest_color, "true") || String::CaseInsensitiveCStringEquals(gtest_color, "t") || String::CStringEquals(gtest_color, "1"); // We take "yes", "true", "t", and "1" as meaning "yes". If the // value is neither one of these nor "auto", we treat it as "no" to // be conservative. } // Helpers for printing colored strings to stdout. Note that on Windows, we // cannot simply emit special characters and have the terminal change colors. // This routine must actually emit the characters rather than return a string // that would be colored when printed, as can be done on Linux. void ColoredPrintf(GTestColor color, const char* fmt, ...) { va_list args; va_start(args, fmt); #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS const bool use_color = false; #else static const bool in_color_mode = ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); const bool use_color = in_color_mode && (color != COLOR_DEFAULT); #endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS // The '!= 0' comparison is necessary to satisfy MSVC 7.1. if (!use_color) { vprintf(fmt, args); va_end(args); return; } #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); // Gets the current text color. CONSOLE_SCREEN_BUFFER_INFO buffer_info; GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); const WORD old_color_attrs = buffer_info.wAttributes; // We need to flush the stream buffers into the console before each // SetConsoleTextAttribute call lest it affect the text that is already // printed but has not yet reached the console. fflush(stdout); SetConsoleTextAttribute(stdout_handle, GetColorAttribute(color) | FOREGROUND_INTENSITY); vprintf(fmt, args); fflush(stdout); // Restores the text color. SetConsoleTextAttribute(stdout_handle, old_color_attrs); #else printf("\033[0;3%sm", GetAnsiColorCode(color)); vprintf(fmt, args); printf("\033[m"); // Resets the terminal to default. #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE va_end(args); } void PrintFullTestCommentIfPresent(const TestInfo& test_info) { const char* const type_param = test_info.type_param(); const char* const value_param = test_info.value_param(); if (type_param != NULL || value_param != NULL) { printf(", where "); if (type_param != NULL) { printf("TypeParam = %s", type_param); if (value_param != NULL) printf(" and "); } if (value_param != NULL) { printf("GetParam() = %s", value_param); } } } // This class implements the TestEventListener interface. // // Class PrettyUnitTestResultPrinter is copyable. class PrettyUnitTestResultPrinter : public TestEventListener { public: PrettyUnitTestResultPrinter() {} static void PrintTestName(const char * test_case, const char * test) { printf("%s.%s", test_case, test); } // The following methods override what's in the TestEventListener class. virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestCaseStart(const TestCase& test_case); virtual void OnTestStart(const TestInfo& test_info); virtual void OnTestPartResult(const TestPartResult& result); virtual void OnTestEnd(const TestInfo& test_info); virtual void OnTestCaseEnd(const TestCase& test_case); virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} private: static void PrintFailedTests(const UnitTest& unit_test); internal::String test_case_name_; }; // Fired before each iteration of tests starts. void PrettyUnitTestResultPrinter::OnTestIterationStart( const UnitTest& unit_test, int iteration) { if (GTEST_FLAG(repeat) != 1) printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); const char* const filter = GTEST_FLAG(filter).c_str(); // Prints the filter if it's not *. This reminds the user that some // tests may be skipped. if (!internal::String::CStringEquals(filter, kUniversalFilter)) { ColoredPrintf(COLOR_YELLOW, "Note: %s filter = %s\n", GTEST_NAME_, filter); } if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); ColoredPrintf(COLOR_YELLOW, "Note: This is test shard %d of %s.\n", static_cast<int>(shard_index) + 1, internal::posix::GetEnv(kTestTotalShards)); } if (GTEST_FLAG(shuffle)) { ColoredPrintf(COLOR_YELLOW, "Note: Randomizing tests' orders with a seed of %d .\n", unit_test.random_seed()); } ColoredPrintf(COLOR_GREEN, "[==========] "); printf("Running %s from %s.\n", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); fflush(stdout); } void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment set-up.\n"); fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { test_case_name_ = test_case.name(); const internal::String counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s", counts.c_str(), test_case_name_.c_str()); if (test_case.type_param() == NULL) { printf("\n"); } else { printf(", where TypeParam = %s\n", test_case.type_param()); } fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { ColoredPrintf(COLOR_GREEN, "[ RUN ] "); PrintTestName(test_case_name_.c_str(), test_info.name()); printf("\n"); fflush(stdout); } // Called after an assertion failure. void PrettyUnitTestResultPrinter::OnTestPartResult( const TestPartResult& result) { // If the test part succeeded, we don't need to do anything. if (result.type() == TestPartResult::kSuccess) return; // Print failure message from the assertion (e.g. expected this and got that). PrintTestPartResult(result); fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { if (test_info.result()->Passed()) { ColoredPrintf(COLOR_GREEN, "[ OK ] "); } else { ColoredPrintf(COLOR_RED, "[ FAILED ] "); } PrintTestName(test_case_name_.c_str(), test_info.name()); if (test_info.result()->Failed()) PrintFullTestCommentIfPresent(test_info); if (GTEST_FLAG(print_time)) { printf(" (%s ms)\n", internal::StreamableToString( test_info.result()->elapsed_time()).c_str()); } else { printf("\n"); } fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { if (!GTEST_FLAG(print_time)) return; test_case_name_ = test_case.name(); const internal::String counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_case_name_.c_str(), internal::StreamableToString(test_case.elapsed_time()).c_str()); fflush(stdout); } void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment tear-down\n"); fflush(stdout); } // Internal helper for printing the list of failed tests. void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { const int failed_test_count = unit_test.failed_test_count(); if (failed_test_count == 0) { return; } for (int i = 0; i < unit_test.total_test_case_count(); ++i) { const TestCase& test_case = *unit_test.GetTestCase(i); if (!test_case.should_run() || (test_case.failed_test_count() == 0)) { continue; } for (int j = 0; j < test_case.total_test_count(); ++j) { const TestInfo& test_info = *test_case.GetTestInfo(j); if (!test_info.should_run() || test_info.result()->Passed()) { continue; } ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s.%s", test_case.name(), test_info.name()); PrintFullTestCommentIfPresent(test_info); printf("\n"); } } } void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { ColoredPrintf(COLOR_GREEN, "[==========] "); printf("%s from %s ran.", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); if (GTEST_FLAG(print_time)) { printf(" (%s ms total)", internal::StreamableToString(unit_test.elapsed_time()).c_str()); } printf("\n"); ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); int num_failures = unit_test.failed_test_count(); if (!unit_test.Passed()) { const int failed_test_count = unit_test.failed_test_count(); ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); PrintFailedTests(unit_test); printf("\n%2d FAILED %s\n", num_failures, num_failures == 1 ? "TEST" : "TESTS"); } int num_disabled = unit_test.disabled_test_count(); if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { if (!num_failures) { printf("\n"); // Add a spacer if no FAILURE banner is displayed. } ColoredPrintf(COLOR_YELLOW, " YOU HAVE %d DISABLED %s\n\n", num_disabled, num_disabled == 1 ? "TEST" : "TESTS"); } // Ensure that Google Test output is printed before, e.g., heapchecker output. fflush(stdout); } // End PrettyUnitTestResultPrinter // class TestEventRepeater // // This class forwards events to other event listeners. class TestEventRepeater : public TestEventListener { public: TestEventRepeater() : forwarding_enabled_(true) {} virtual ~TestEventRepeater(); void Append(TestEventListener *listener); TestEventListener* Release(TestEventListener* listener); // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled() const { return forwarding_enabled_; } void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } virtual void OnTestProgramStart(const UnitTest& unit_test); virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test); virtual void OnTestCaseStart(const TestCase& test_case); virtual void OnTestStart(const TestInfo& test_info); virtual void OnTestPartResult(const TestPartResult& result); virtual void OnTestEnd(const TestInfo& test_info); virtual void OnTestCaseEnd(const TestCase& test_case); virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test); virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); virtual void OnTestProgramEnd(const UnitTest& unit_test); private: // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled_; // The list of listeners that receive events. std::vector<TestEventListener*> listeners_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); }; TestEventRepeater::~TestEventRepeater() { ForEach(listeners_, Delete<TestEventListener>); } void TestEventRepeater::Append(TestEventListener *listener) { listeners_.push_back(listener); } // TODO(vladl@google.com): Factor the search functionality into Vector::Find. TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { for (size_t i = 0; i < listeners_.size(); ++i) { if (listeners_[i] == listener) { listeners_.erase(listeners_.begin() + i); return listener; } } return NULL; } // Since most methods are very similar, use macros to reduce boilerplate. // This defines a member that forwards the call to all listeners. #define GTEST_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (size_t i = 0; i < listeners_.size(); i++) { \ listeners_[i]->Name(parameter); \ } \ } \ } // This defines a member that forwards the call to all listeners in reverse // order. #define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \ listeners_[i]->Name(parameter); \ } \ } \ } GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase) GTEST_REPEATER_METHOD_(OnTestStart, TestInfo) GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase) GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) #undef GTEST_REPEATER_METHOD_ #undef GTEST_REVERSE_REPEATER_METHOD_ void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (size_t i = 0; i < listeners_.size(); i++) { listeners_[i]->OnTestIterationStart(unit_test, iteration); } } } void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { listeners_[i]->OnTestIterationEnd(unit_test, iteration); } } } // End TestEventRepeater // This class generates an XML output file. class XmlUnitTestResultPrinter : public EmptyTestEventListener { public: explicit XmlUnitTestResultPrinter(const char* output_file); virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); private: // Is c a whitespace character that is normalized to a space character // when it appears in an XML attribute value? static bool IsNormalizableWhitespace(char c) { return c == 0x9 || c == 0xA || c == 0xD; } // May c appear in a well-formed XML document? static bool IsValidXmlCharacter(char c) { return IsNormalizableWhitespace(c) || c >= 0x20; } // Returns an XML-escaped copy of the input string str. If // is_attribute is true, the text is meant to appear as an attribute // value, and normalizable whitespace is preserved by replacing it // with character references. static String EscapeXml(const char* str, bool is_attribute); // Returns the given string with all characters invalid in XML removed. static string RemoveInvalidXmlCharacters(const string& str); // Convenience wrapper around EscapeXml when str is an attribute value. static String EscapeXmlAttribute(const char* str) { return EscapeXml(str, true); } // Convenience wrapper around EscapeXml when str is not an attribute value. static String EscapeXmlText(const char* str) { return EscapeXml(str, false); } // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. static void OutputXmlCDataSection(::std::ostream* stream, const char* data); // Streams an XML representation of a TestInfo object. static void OutputXmlTestInfo(::std::ostream* stream, const char* test_case_name, const TestInfo& test_info); // Prints an XML representation of a TestCase object static void PrintXmlTestCase(FILE* out, const TestCase& test_case); // Prints an XML summary of unit_test to output stream out. static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test); // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. // When the String is not empty, it includes a space at the beginning, // to delimit this attribute from prior attributes. static String TestPropertiesAsXmlAttributes(const TestResult& result); // The output file. const String output_file_; GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); }; // Creates a new XmlUnitTestResultPrinter. XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) : output_file_(output_file) { if (output_file_.c_str() == NULL || output_file_.empty()) { fprintf(stderr, "XML output file may not be null\n"); fflush(stderr); exit(EXIT_FAILURE); } } // Called after the unit test ends. void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { FILE* xmlout = NULL; FilePath output_file(output_file_); FilePath output_dir(output_file.RemoveFileName()); if (output_dir.CreateDirectoriesRecursively()) { xmlout = posix::FOpen(output_file_.c_str(), "w"); } if (xmlout == NULL) { // TODO(wan): report the reason of the failure. // // We don't do it for now as: // // 1. There is no urgent need for it. // 2. It's a bit involved to make the errno variable thread-safe on // all three operating systems (Linux, Windows, and Mac OS). // 3. To interpret the meaning of errno in a thread-safe way, // we need the strerror_r() function, which is not available on // Windows. fprintf(stderr, "Unable to open file \"%s\"\n", output_file_.c_str()); fflush(stderr); exit(EXIT_FAILURE); } PrintXmlUnitTest(xmlout, unit_test); fclose(xmlout); } // Returns an XML-escaped copy of the input string str. If is_attribute // is true, the text is meant to appear as an attribute value, and // normalizable whitespace is preserved by replacing it with character // references. // // Invalid XML characters in str, if any, are stripped from the output. // It is expected that most, if not all, of the text processed by this // module will consist of ordinary English text. // If this module is ever modified to produce version 1.1 XML output, // most invalid characters can be retained using character references. // TODO(wan): It might be nice to have a minimally invasive, human-readable // escaping scheme for invalid characters, rather than dropping them. String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) { Message m; if (str != NULL) { for (const char* src = str; *src; ++src) { switch (*src) { case '<': m << "<"; break; case '>': m << ">"; break; case '&': m << "&"; break; case '\'': if (is_attribute) m << "'"; else m << '\''; break; case '"': if (is_attribute) m << """; else m << '"'; break; default: if (IsValidXmlCharacter(*src)) { if (is_attribute && IsNormalizableWhitespace(*src)) m << String::Format("&#x%02X;", unsigned(*src)); else m << *src; } break; } } } return m.GetString(); } // Returns the given string with all characters invalid in XML removed. // Currently invalid characters are dropped from the string. An // alternative is to replace them with certain characters such as . or ?. string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) { string output; output.reserve(str.size()); for (string::const_iterator it = str.begin(); it != str.end(); ++it) if (IsValidXmlCharacter(*it)) output.push_back(*it); return output; } // The following routines generate an XML representation of a UnitTest // object. // // This is how Google Test concepts map to the DTD: // // <testsuites name="AllTests"> <-- corresponds to a UnitTest object // <testsuite name="testcase-name"> <-- corresponds to a TestCase object // <testcase name="test-name"> <-- corresponds to a TestInfo object // <failure message="...">...</failure> // <failure message="...">...</failure> // <failure message="...">...</failure> // <-- individual assertion failures // </testcase> // </testsuite> // </testsuites> // Formats the given time in milliseconds as seconds. std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { ::std::stringstream ss; ss << ms/1000.0; return ss.str(); } // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, const char* data) { const char* segment = data; *stream << "<![CDATA["; for (;;) { const char* const next_segment = strstr(segment, "]]>"); if (next_segment != NULL) { stream->write( segment, static_cast<std::streamsize>(next_segment - segment)); *stream << "]]>]]><![CDATA["; segment = next_segment + strlen("]]>"); } else { *stream << segment; break; } } *stream << "]]>"; } // Prints an XML representation of a TestInfo object. // TODO(wan): There is also value in printing properties with the plain printer. void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, const char* test_case_name, const TestInfo& test_info) { const TestResult& result = *test_info.result(); *stream << " <testcase name=\"" << EscapeXmlAttribute(test_info.name()).c_str() << "\""; if (test_info.value_param() != NULL) { *stream << " value_param=\"" << EscapeXmlAttribute(test_info.value_param()) << "\""; } if (test_info.type_param() != NULL) { *stream << " type_param=\"" << EscapeXmlAttribute(test_info.type_param()) << "\""; } *stream << " status=\"" << (test_info.should_run() ? "run" : "notrun") << "\" time=\"" << FormatTimeInMillisAsSeconds(result.elapsed_time()) << "\" classname=\"" << EscapeXmlAttribute(test_case_name).c_str() << "\"" << TestPropertiesAsXmlAttributes(result).c_str(); int failures = 0; for (int i = 0; i < result.total_part_count(); ++i) { const TestPartResult& part = result.GetTestPartResult(i); if (part.failed()) { if (++failures == 1) *stream << ">\n"; *stream << " <failure message=\"" << EscapeXmlAttribute(part.summary()).c_str() << "\" type=\"\">"; const string location = internal::FormatCompilerIndependentFileLocation( part.file_name(), part.line_number()); const string message = location + "\n" + part.message(); OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(message).c_str()); *stream << "</failure>\n"; } } if (failures == 0) *stream << " />\n"; else *stream << " </testcase>\n"; } // Prints an XML representation of a TestCase object void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out, const TestCase& test_case) { fprintf(out, " <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" " "disabled=\"%d\" ", EscapeXmlAttribute(test_case.name()).c_str(), test_case.total_test_count(), test_case.failed_test_count(), test_case.disabled_test_count()); fprintf(out, "errors=\"0\" time=\"%s\">\n", FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str()); for (int i = 0; i < test_case.total_test_count(); ++i) { ::std::stringstream stream; OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i)); fprintf(out, "%s", StringStreamToString(&stream).c_str()); } fprintf(out, " </testsuite>\n"); } // Prints an XML summary of unit_test to output stream out. void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out, const UnitTest& unit_test) { fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); fprintf(out, "<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" " "errors=\"0\" time=\"%s\" ", unit_test.total_test_count(), unit_test.failed_test_count(), unit_test.disabled_test_count(), FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str()); if (GTEST_FLAG(shuffle)) { fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed()); } fprintf(out, "name=\"AllTests\">\n"); for (int i = 0; i < unit_test.total_test_case_count(); ++i) PrintXmlTestCase(out, *unit_test.GetTestCase(i)); fprintf(out, "</testsuites>\n"); } // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( const TestResult& result) { Message attributes; for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); attributes << " " << property.key() << "=" << "\"" << EscapeXmlAttribute(property.value()) << "\""; } return attributes.GetString(); } // End XmlUnitTestResultPrinter #if GTEST_CAN_STREAM_RESULTS_ // Streams test results to the given port on the given host machine. class StreamingListener : public EmptyTestEventListener { public: // Escapes '=', '&', '%', and '\n' characters in str as "%xx". static string UrlEncode(const char* str); StreamingListener(const string& host, const string& port) : sockfd_(-1), host_name_(host), port_num_(port) { MakeConnection(); Send("gtest_streaming_protocol_version=1.0\n"); } virtual ~StreamingListener() { if (sockfd_ != -1) CloseConnection(); } void OnTestProgramStart(const UnitTest& /* unit_test */) { Send("event=TestProgramStart\n"); } void OnTestProgramEnd(const UnitTest& unit_test) { // Note that Google Test current only report elapsed time for each // test iteration, not for the entire test program. Send(String::Format("event=TestProgramEnd&passed=%d\n", unit_test.Passed())); // Notify the streaming server to stop. CloseConnection(); } void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) { Send(String::Format("event=TestIterationStart&iteration=%d\n", iteration)); } void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) { Send(String::Format("event=TestIterationEnd&passed=%d&elapsed_time=%sms\n", unit_test.Passed(), StreamableToString(unit_test.elapsed_time()).c_str())); } void OnTestCaseStart(const TestCase& test_case) { Send(String::Format("event=TestCaseStart&name=%s\n", test_case.name())); } void OnTestCaseEnd(const TestCase& test_case) { Send(String::Format("event=TestCaseEnd&passed=%d&elapsed_time=%sms\n", test_case.Passed(), StreamableToString(test_case.elapsed_time()).c_str())); } void OnTestStart(const TestInfo& test_info) { Send(String::Format("event=TestStart&name=%s\n", test_info.name())); } void OnTestEnd(const TestInfo& test_info) { Send(String::Format( "event=TestEnd&passed=%d&elapsed_time=%sms\n", (test_info.result())->Passed(), StreamableToString((test_info.result())->elapsed_time()).c_str())); } void OnTestPartResult(const TestPartResult& test_part_result) { const char* file_name = test_part_result.file_name(); if (file_name == NULL) file_name = ""; Send(String::Format("event=TestPartResult&file=%s&line=%d&message=", UrlEncode(file_name).c_str(), test_part_result.line_number())); Send(UrlEncode(test_part_result.message()) + "\n"); } private: // Creates a client socket and connects to the server. void MakeConnection(); // Closes the socket. void CloseConnection() { GTEST_CHECK_(sockfd_ != -1) << "CloseConnection() can be called only when there is a connection."; close(sockfd_); sockfd_ = -1; } // Sends a string to the socket. void Send(const string& message) { GTEST_CHECK_(sockfd_ != -1) << "Send() can be called only when there is a connection."; const int len = static_cast<int>(message.length()); if (write(sockfd_, message.c_str(), len) != len) { GTEST_LOG_(WARNING) << "stream_result_to: failed to stream to " << host_name_ << ":" << port_num_; } } int sockfd_; // socket file descriptor const string host_name_; const string port_num_; GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener); }; // class StreamingListener // Checks if str contains '=', '&', '%' or '\n' characters. If yes, // replaces them by "%xx" where xx is their hexadecimal value. For // example, replaces "=" with "%3D". This algorithm is O(strlen(str)) // in both time and space -- important as the input str may contain an // arbitrarily long test failure message and stack trace. string StreamingListener::UrlEncode(const char* str) { string result; result.reserve(strlen(str) + 1); for (char ch = *str; ch != '\0'; ch = *++str) { switch (ch) { case '%': case '=': case '&': case '\n': result.append(String::Format("%%%02x", static_cast<unsigned char>(ch))); break; default: result.push_back(ch); break; } } return result; } void StreamingListener::MakeConnection() { GTEST_CHECK_(sockfd_ == -1) << "MakeConnection() can't be called when there is already a connection."; addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses. hints.ai_socktype = SOCK_STREAM; addrinfo* servinfo = NULL; // Use the getaddrinfo() to get a linked list of IP addresses for // the given host name. const int error_num = getaddrinfo( host_name_.c_str(), port_num_.c_str(), &hints, &servinfo); if (error_num != 0) { GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: " << gai_strerror(error_num); } // Loop through all the results and connect to the first we can. for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL; cur_addr = cur_addr->ai_next) { sockfd_ = socket( cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol); if (sockfd_ != -1) { // Connect the client socket to the server socket. if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) { close(sockfd_); sockfd_ = -1; } } } freeaddrinfo(servinfo); // all done with this structure if (sockfd_ == -1) { GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to " << host_name_ << ":" << port_num_; } } // End of class Streaming Listener #endif // GTEST_CAN_STREAM_RESULTS__ // Class ScopedTrace // Pushes the given source file location and message onto a per-thread // trace stack maintained by Google Test. // L < UnitTest::mutex_ ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) { TraceInfo trace; trace.file = file; trace.line = line; trace.message = message.GetString(); UnitTest::GetInstance()->PushGTestTrace(trace); } // Pops the info pushed by the c'tor. // L < UnitTest::mutex_ ScopedTrace::~ScopedTrace() { UnitTest::GetInstance()->PopGTestTrace(); } // class OsStackTraceGetter // Returns the current OS stack trace as a String. Parameters: // // max_depth - the maximum number of stack frames to be included // in the trace. // skip_count - the number of top frames to be skipped; doesn't count // against max_depth. // // L < mutex_ // We use "L < mutex_" to denote that the function may acquire mutex_. String OsStackTraceGetter::CurrentStackTrace(int, int) { return String(""); } // L < mutex_ void OsStackTraceGetter::UponLeavingGTest() { } const char* const OsStackTraceGetter::kElidedFramesMarker = "... " GTEST_NAME_ " internal frames ..."; } // namespace internal // class TestEventListeners TestEventListeners::TestEventListeners() : repeater_(new internal::TestEventRepeater()), default_result_printer_(NULL), default_xml_generator_(NULL) { } TestEventListeners::~TestEventListeners() { delete repeater_; } // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the user. void TestEventListeners::Append(TestEventListener* listener) { repeater_->Append(listener); } // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* TestEventListeners::Release(TestEventListener* listener) { if (listener == default_result_printer_) default_result_printer_ = NULL; else if (listener == default_xml_generator_) default_xml_generator_ = NULL; return repeater_->Release(listener); } // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* TestEventListeners::repeater() { return repeater_; } // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { if (default_result_printer_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_result_printer_); default_result_printer_ = listener; if (listener != NULL) Append(listener); } } // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { if (default_xml_generator_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_xml_generator_); default_xml_generator_ = listener; if (listener != NULL) Append(listener); } } // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool TestEventListeners::EventForwardingEnabled() const { return repeater_->forwarding_enabled(); } void TestEventListeners::SuppressEventForwarding() { repeater_->set_forwarding_enabled(false); } // class UnitTest // Gets the singleton UnitTest object. The first time this method is // called, a UnitTest object is constructed and returned. Consecutive // calls will return the same object. // // We don't protect this under mutex_ as a user is not supposed to // call this before main() starts, from which point on the return // value will never change. UnitTest * UnitTest::GetInstance() { // When compiled with MSVC 7.1 in optimized mode, destroying the // UnitTest object upon exiting the program messes up the exit code, // causing successful tests to appear failed. We have to use a // different implementation in this case to bypass the compiler bug. // This implementation makes the compiler happy, at the cost of // leaking the UnitTest object. // CodeGear C++Builder insists on a public destructor for the // default implementation. Use this implementation to keep good OO // design with private destructor. #if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) static UnitTest* const instance = new UnitTest; return instance; #else static UnitTest instance; return &instance; #endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) } // Gets the number of successful test cases. int UnitTest::successful_test_case_count() const { return impl()->successful_test_case_count(); } // Gets the number of failed test cases. int UnitTest::failed_test_case_count() const { return impl()->failed_test_case_count(); } // Gets the number of all test cases. int UnitTest::total_test_case_count() const { return impl()->total_test_case_count(); } // Gets the number of all test cases that contain at least one test // that should run. int UnitTest::test_case_to_run_count() const { return impl()->test_case_to_run_count(); } // Gets the number of successful tests. int UnitTest::successful_test_count() const { return impl()->successful_test_count(); } // Gets the number of failed tests. int UnitTest::failed_test_count() const { return impl()->failed_test_count(); } // Gets the number of disabled tests. int UnitTest::disabled_test_count() const { return impl()->disabled_test_count(); } // Gets the number of all tests. int UnitTest::total_test_count() const { return impl()->total_test_count(); } // Gets the number of tests that should run. int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } // Gets the elapsed time, in milliseconds. internal::TimeInMillis UnitTest::elapsed_time() const { return impl()->elapsed_time(); } // Returns true iff the unit test passed (i.e. all test cases passed). bool UnitTest::Passed() const { return impl()->Passed(); } // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool UnitTest::Failed() const { return impl()->Failed(); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* UnitTest::GetTestCase(int i) const { return impl()->GetTestCase(i); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* UnitTest::GetMutableTestCase(int i) { return impl()->GetMutableTestCase(i); } // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& UnitTest::listeners() { return *impl()->listeners(); } // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in the // order they were registered. After all tests in the program have // finished, all global test environments will be torn-down in the // *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // We don't protect this under mutex_, as we only support calling it // from the main thread. Environment* UnitTest::AddEnvironment(Environment* env) { if (env == NULL) { return NULL; } impl_->environments().push_back(env); return env; } // Adds a TestPartResult to the current TestResult object. All Google Test // assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call // this to report their results. The user code should use the // assertion macros instead of calling this directly. // L < mutex_ void UnitTest::AddTestPartResult(TestPartResult::Type result_type, const char* file_name, int line_number, const internal::String& message, const internal::String& os_stack_trace) { Message msg; msg << message; internal::MutexLock lock(&mutex_); if (impl_->gtest_trace_stack().size() > 0) { msg << "\n" << GTEST_NAME_ << " trace:"; for (int i = static_cast<int>(impl_->gtest_trace_stack().size()); i > 0; --i) { const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) << " " << trace.message; } } if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) { msg << internal::kStackTraceMarker << os_stack_trace; } const TestPartResult result = TestPartResult(result_type, file_name, line_number, msg.GetString().c_str()); impl_->GetTestPartResultReporterForCurrentThread()-> ReportTestPartResult(result); if (result_type != TestPartResult::kSuccess) { // gtest_break_on_failure takes precedence over // gtest_throw_on_failure. This allows a user to set the latter // in the code (perhaps in order to use Google Test assertions // with another testing framework) and specify the former on the // command line for debugging. if (GTEST_FLAG(break_on_failure)) { #if GTEST_OS_WINDOWS // Using DebugBreak on Windows allows gtest to still break into a debugger // when a failure happens and both the --gtest_break_on_failure and // the --gtest_catch_exceptions flags are specified. DebugBreak(); #else // Dereference NULL through a volatile pointer to prevent the compiler // from removing. We use this rather than abort() or __builtin_trap() for // portability: Symbian doesn't implement abort() well, and some debuggers // don't correctly trap abort(). *static_cast<volatile int*>(NULL) = 1; #endif // GTEST_OS_WINDOWS } else if (GTEST_FLAG(throw_on_failure)) { #if GTEST_HAS_EXCEPTIONS throw GoogleTestFailureException(result); #else // We cannot call abort() as it generates a pop-up in debug mode // that cannot be suppressed in VC 7.1 or below. exit(1); #endif } } } // Creates and adds a property to the current TestResult. If a property matching // the supplied value already exists, updates its value instead. void UnitTest::RecordPropertyForCurrentTest(const char* key, const char* value) { const TestProperty test_property(key, value); impl_->current_test_result()->RecordProperty(test_property); } // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // We don't protect this under mutex_, as we only support calling it // from the main thread. int UnitTest::Run() { // Captures the value of GTEST_FLAG(catch_exceptions). This value will be // used for the duration of the program. impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions)); #if GTEST_HAS_SEH const bool in_death_test_child_process = internal::GTEST_FLAG(internal_run_death_test).length() > 0; // Either the user wants Google Test to catch exceptions thrown by the // tests or this is executing in the context of death test child // process. In either case the user does not want to see pop-up dialogs // about crashes - they are expected. if (impl()->catch_exceptions() || in_death_test_child_process) { # if !GTEST_OS_WINDOWS_MOBILE // SetErrorMode doesn't exist on CE. SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); # endif // !GTEST_OS_WINDOWS_MOBILE # if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE // Death test children can be terminated with _abort(). On Windows, // _abort() can show a dialog with a warning message. This forces the // abort message to go to stderr instead. _set_error_mode(_OUT_TO_STDERR); # endif # if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE // In the debug version, Visual Studio pops up a separate dialog // offering a choice to debug the aborted program. We need to suppress // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement // executed. Google Test will notify the user of any unexpected // failure via stderr. // // VC++ doesn't define _set_abort_behavior() prior to the version 8.0. // Users of prior VC versions shall suffer the agony and pain of // clicking through the countless debug dialogs. // TODO(vladl@google.com): find a way to suppress the abort dialog() in the // debug mode when compiled with VC 7.1 or lower. if (!GTEST_FLAG(break_on_failure)) _set_abort_behavior( 0x0, // Clear the following flags: _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. # endif } #endif // GTEST_HAS_SEH return internal::HandleExceptionsInMethodIfSupported( impl(), &internal::UnitTestImpl::RunAllTests, "auxiliary test code (environments or event listeners)") ? 0 : 1; } // Returns the working directory when the first TEST() or TEST_F() was // executed. const char* UnitTest::original_working_dir() const { return impl_->original_working_dir_.c_str(); } // Returns the TestCase object for the test that's currently running, // or NULL if no test is running. // L < mutex_ const TestCase* UnitTest::current_test_case() const { internal::MutexLock lock(&mutex_); return impl_->current_test_case(); } // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. // L < mutex_ const TestInfo* UnitTest::current_test_info() const { internal::MutexLock lock(&mutex_); return impl_->current_test_info(); } // Returns the random seed used at the start of the current test run. int UnitTest::random_seed() const { return impl_->random_seed(); } #if GTEST_HAS_PARAM_TEST // Returns ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. // L < mutex_ internal::ParameterizedTestCaseRegistry& UnitTest::parameterized_test_registry() { return impl_->parameterized_test_registry(); } #endif // GTEST_HAS_PARAM_TEST // Creates an empty UnitTest. UnitTest::UnitTest() { impl_ = new internal::UnitTestImpl(this); } // Destructor of UnitTest. UnitTest::~UnitTest() { delete impl_; } // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. // L < mutex_ void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().push_back(trace); } // Pops a trace from the per-thread Google Test trace stack. // L < mutex_ void UnitTest::PopGTestTrace() { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().pop_back(); } namespace internal { UnitTestImpl::UnitTestImpl(UnitTest* parent) : parent_(parent), #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4355) // Temporarily disables warning 4355 // (using this in initializer). default_global_test_part_result_reporter_(this), default_per_thread_test_part_result_reporter_(this), # pragma warning(pop) // Restores the warning state again. #else default_global_test_part_result_reporter_(this), default_per_thread_test_part_result_reporter_(this), #endif // _MSC_VER global_test_part_result_repoter_( &default_global_test_part_result_reporter_), per_thread_test_part_result_reporter_( &default_per_thread_test_part_result_reporter_), #if GTEST_HAS_PARAM_TEST parameterized_test_registry_(), parameterized_tests_registered_(false), #endif // GTEST_HAS_PARAM_TEST last_death_test_case_(-1), current_test_case_(NULL), current_test_info_(NULL), ad_hoc_test_result_(), os_stack_trace_getter_(NULL), post_flag_parse_init_performed_(false), random_seed_(0), // Will be overridden by the flag before first use. random_(0), // Will be reseeded before first use. elapsed_time_(0), #if GTEST_HAS_DEATH_TEST internal_run_death_test_flag_(NULL), death_test_factory_(new DefaultDeathTestFactory), #endif // Will be overridden by the flag before first use. catch_exceptions_(false) { listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); } UnitTestImpl::~UnitTestImpl() { // Deletes every TestCase. ForEach(test_cases_, internal::Delete<TestCase>); // Deletes every Environment. ForEach(environments_, internal::Delete<Environment>); delete os_stack_trace_getter_; } #if GTEST_HAS_DEATH_TEST // Disables event forwarding if the control is currently in a death test // subprocess. Must not be called before InitGoogleTest. void UnitTestImpl::SuppressTestEventsIfInSubprocess() { if (internal_run_death_test_flag_.get() != NULL) listeners()->SuppressEventForwarding(); } #endif // GTEST_HAS_DEATH_TEST // Initializes event listeners performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void UnitTestImpl::ConfigureXmlOutput() { const String& output_format = UnitTestOptions::GetOutputFormat(); if (output_format == "xml") { listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); } else if (output_format != "") { printf("WARNING: unrecognized output format \"%s\" ignored.\n", output_format.c_str()); fflush(stdout); } } #if GTEST_CAN_STREAM_RESULTS_ // Initializes event listeners for streaming test results in String form. // Must not be called before InitGoogleTest. void UnitTestImpl::ConfigureStreamingOutput() { const string& target = GTEST_FLAG(stream_result_to); if (!target.empty()) { const size_t pos = target.find(':'); if (pos != string::npos) { listeners()->Append(new StreamingListener(target.substr(0, pos), target.substr(pos+1))); } else { printf("WARNING: unrecognized streaming target \"%s\" ignored.\n", target.c_str()); fflush(stdout); } } } #endif // GTEST_CAN_STREAM_RESULTS_ // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void UnitTestImpl::PostFlagParsingInit() { // Ensures that this function does not execute more than once. if (!post_flag_parse_init_performed_) { post_flag_parse_init_performed_ = true; #if GTEST_HAS_DEATH_TEST InitDeathTestSubprocessControlInfo(); SuppressTestEventsIfInSubprocess(); #endif // GTEST_HAS_DEATH_TEST // Registers parameterized tests. This makes parameterized tests // available to the UnitTest reflection API without running // RUN_ALL_TESTS. RegisterParameterizedTests(); // Configures listeners for XML output. This makes it possible for users // to shut down the default XML output before invoking RUN_ALL_TESTS. ConfigureXmlOutput(); #if GTEST_CAN_STREAM_RESULTS_ // Configures listeners for streaming test results to the specified server. ConfigureStreamingOutput(); #endif // GTEST_CAN_STREAM_RESULTS_ } } // A predicate that checks the name of a TestCase against a known // value. // // This is used for implementation of the UnitTest class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestCaseNameIs is copyable. class TestCaseNameIs { public: // Constructor. explicit TestCaseNameIs(const String& name) : name_(name) {} // Returns true iff the name of test_case matches name_. bool operator()(const TestCase* test_case) const { return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0; } private: String name_; }; // Finds and returns a TestCase with the given name. If one doesn't // exist, creates one and returns it. It's the CALLER'S // RESPONSIBILITY to ensure that this function is only called WHEN THE // TESTS ARE NOT SHUFFLED. // // Arguments: // // test_case_name: name of the test case // type_param: the name of the test case's type parameter, or NULL if // this is not a typed or a type-parameterized test case. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase* UnitTestImpl::GetTestCase(const char* test_case_name, const char* type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc) { // Can we find a TestCase with the given name? const std::vector<TestCase*>::const_iterator test_case = std::find_if(test_cases_.begin(), test_cases_.end(), TestCaseNameIs(test_case_name)); if (test_case != test_cases_.end()) return *test_case; // No. Let's create one. TestCase* const new_test_case = new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc); // Is this a death test case? if (internal::UnitTestOptions::MatchesFilter(String(test_case_name), kDeathTestCaseFilter)) { // Yes. Inserts the test case after the last death test case // defined so far. This only works when the test cases haven't // been shuffled. Otherwise we may end up running a death test // after a non-death test. ++last_death_test_case_; test_cases_.insert(test_cases_.begin() + last_death_test_case_, new_test_case); } else { // No. Appends to the end of the list. test_cases_.push_back(new_test_case); } test_case_indices_.push_back(static_cast<int>(test_case_indices_.size())); return new_test_case; } // Helpers for setting up / tearing down the given environment. They // are for use in the ForEach() function. static void SetUpEnvironment(Environment* env) { env->SetUp(); } static void TearDownEnvironment(Environment* env) { env->TearDown(); } // Runs all tests in this UnitTest object, prints the result, and // returns true if all tests are successful. If any exception is // thrown during a test, the test is considered to be failed, but the // rest of the tests will still be run. // // When parameterized tests are enabled, it expands and registers // parameterized tests first in RegisterParameterizedTests(). // All other functions called from RunAllTests() may safely assume that // parameterized tests are ready to be counted and run. bool UnitTestImpl::RunAllTests() { // Makes sure InitGoogleTest() was called. if (!GTestIsInitialized()) { printf("%s", "\nThis test program did NOT call ::testing::InitGoogleTest " "before calling RUN_ALL_TESTS(). Please fix it.\n"); return false; } // Do not run any test if the --help flag was specified. if (g_help_flag) return true; // Repeats the call to the post-flag parsing initialization in case the // user didn't call InitGoogleTest. PostFlagParsingInit(); // Even if sharding is not on, test runners may want to use the // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding // protocol. internal::WriteToShardStatusFileIfNeeded(); // True iff we are in a subprocess for running a thread-safe-style // death test. bool in_subprocess_for_death_test = false; #if GTEST_HAS_DEATH_TEST in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL); #endif // GTEST_HAS_DEATH_TEST const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, in_subprocess_for_death_test); // Compares the full test names with the filter to decide which // tests to run. const bool has_tests_to_run = FilterTests(should_shard ? HONOR_SHARDING_PROTOCOL : IGNORE_SHARDING_PROTOCOL) > 0; // Lists the tests and exits if the --gtest_list_tests flag was specified. if (GTEST_FLAG(list_tests)) { // This must be called *after* FilterTests() has been called. ListTestsMatchingFilter(); return true; } random_seed_ = GTEST_FLAG(shuffle) ? GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; // True iff at least one test has failed. bool failed = false; TestEventListener* repeater = listeners()->repeater(); repeater->OnTestProgramStart(*parent_); // How many times to repeat the tests? We don't want to repeat them // when we are inside the subprocess of a death test. const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); // Repeats forever if the repeat count is negative. const bool forever = repeat < 0; for (int i = 0; forever || i != repeat; i++) { // We want to preserve failures generated by ad-hoc test // assertions executed before RUN_ALL_TESTS(). ClearNonAdHocTestResult(); const TimeInMillis start = GetTimeInMillis(); // Shuffles test cases and tests if requested. if (has_tests_to_run && GTEST_FLAG(shuffle)) { random()->Reseed(random_seed_); // This should be done before calling OnTestIterationStart(), // such that a test event listener can see the actual test order // in the event. ShuffleTests(); } // Tells the unit test event listeners that the tests are about to start. repeater->OnTestIterationStart(*parent_, i); // Runs each test case if there is at least one test to run. if (has_tests_to_run) { // Sets up all environments beforehand. repeater->OnEnvironmentsSetUpStart(*parent_); ForEach(environments_, SetUpEnvironment); repeater->OnEnvironmentsSetUpEnd(*parent_); // Runs the tests only if there was no fatal failure during global // set-up. if (!Test::HasFatalFailure()) { for (int test_index = 0; test_index < total_test_case_count(); test_index++) { GetMutableTestCase(test_index)->Run(); } } // Tears down all environments in reverse order afterwards. repeater->OnEnvironmentsTearDownStart(*parent_); std::for_each(environments_.rbegin(), environments_.rend(), TearDownEnvironment); repeater->OnEnvironmentsTearDownEnd(*parent_); } elapsed_time_ = GetTimeInMillis() - start; // Tells the unit test event listener that the tests have just finished. repeater->OnTestIterationEnd(*parent_, i); // Gets the result and clears it. if (!Passed()) { failed = true; } // Restores the original test order after the iteration. This // allows the user to quickly repro a failure that happens in the // N-th iteration without repeating the first (N - 1) iterations. // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in // case the user somehow changes the value of the flag somewhere // (it's always safe to unshuffle the tests). UnshuffleTests(); if (GTEST_FLAG(shuffle)) { // Picks a new random seed for each iteration. random_seed_ = GetNextRandomSeed(random_seed_); } } repeater->OnTestProgramEnd(*parent_); return !failed; } // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded() { const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); if (test_shard_file != NULL) { FILE* const file = posix::FOpen(test_shard_file, "w"); if (file == NULL) { ColoredPrintf(COLOR_RED, "Could not write to the test shard status file \"%s\" " "specified by the %s environment variable.\n", test_shard_file, kTestShardStatusFile); fflush(stdout); exit(EXIT_FAILURE); } fclose(file); } } // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (i.e., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. bool ShouldShard(const char* total_shards_env, const char* shard_index_env, bool in_subprocess_for_death_test) { if (in_subprocess_for_death_test) { return false; } const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); if (total_shards == -1 && shard_index == -1) { return false; } else if (total_shards == -1 && shard_index != -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestShardIndex << " = " << shard_index << ", but have left " << kTestTotalShards << " unset.\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (total_shards != -1 && shard_index == -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestTotalShards << " = " << total_shards << ", but have left " << kTestShardIndex << " unset.\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (shard_index < 0 || shard_index >= total_shards) { const Message msg = Message() << "Invalid environment variables: we require 0 <= " << kTestShardIndex << " < " << kTestTotalShards << ", but you have " << kTestShardIndex << "=" << shard_index << ", " << kTestTotalShards << "=" << total_shards << ".\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } return total_shards > 1; } // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error // and aborts. Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) { const char* str_val = posix::GetEnv(var); if (str_val == NULL) { return default_val; } Int32 result; if (!ParseInt32(Message() << "The value of environment variable " << var, str_val, &result)) { exit(EXIT_FAILURE); } return result; } // Given the total number of shards, the shard index, and the test id, // returns true iff the test should be run on this shard. The test id is // some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { return (test_id % total_shards) == shard_index; } // Compares the name of each test with the user-specified filter to // decide whether the test should be run, then records the result in // each TestCase and TestInfo object. // If shard_tests == true, further filters tests based on sharding // variables in the environment - see // http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide. // Returns the number of tests that should run. int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestTotalShards, -1) : -1; const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestShardIndex, -1) : -1; // num_runnable_tests are the number of tests that will // run across all shards (i.e., match filter and are not disabled). // num_selected_tests are the number of tests to be run on // this shard. int num_runnable_tests = 0; int num_selected_tests = 0; for (size_t i = 0; i < test_cases_.size(); i++) { TestCase* const test_case = test_cases_[i]; const String &test_case_name = test_case->name(); test_case->set_should_run(false); for (size_t j = 0; j < test_case->test_info_list().size(); j++) { TestInfo* const test_info = test_case->test_info_list()[j]; const String test_name(test_info->name()); // A test is disabled if test case name or test name matches // kDisableTestFilter. const bool is_disabled = internal::UnitTestOptions::MatchesFilter(test_case_name, kDisableTestFilter) || internal::UnitTestOptions::MatchesFilter(test_name, kDisableTestFilter); test_info->is_disabled_ = is_disabled; const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest(test_case_name, test_name); test_info->matches_filter_ = matches_filter; const bool is_runnable = (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && matches_filter; const bool is_selected = is_runnable && (shard_tests == IGNORE_SHARDING_PROTOCOL || ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests)); num_runnable_tests += is_runnable; num_selected_tests += is_selected; test_info->should_run_ = is_selected; test_case->set_should_run(test_case->should_run() || is_selected); } } return num_selected_tests; } // Prints the names of the tests matching the user-specified filter flag. void UnitTestImpl::ListTestsMatchingFilter() { for (size_t i = 0; i < test_cases_.size(); i++) { const TestCase* const test_case = test_cases_[i]; bool printed_test_case_name = false; for (size_t j = 0; j < test_case->test_info_list().size(); j++) { const TestInfo* const test_info = test_case->test_info_list()[j]; if (test_info->matches_filter_) { if (!printed_test_case_name) { printed_test_case_name = true; printf("%s.\n", test_case->name()); } printf(" %s\n", test_info->name()); } } } fflush(stdout); } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter are // the same; otherwise, deletes the old getter and makes the input the // current getter. void UnitTestImpl::set_os_stack_trace_getter( OsStackTraceGetterInterface* getter) { if (os_stack_trace_getter_ != getter) { delete os_stack_trace_getter_; os_stack_trace_getter_ = getter; } } // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { if (os_stack_trace_getter_ == NULL) { os_stack_trace_getter_ = new OsStackTraceGetter; } return os_stack_trace_getter_; } // Returns the TestResult for the test that's currently running, or // the TestResult for the ad hoc test if no test is running. TestResult* UnitTestImpl::current_test_result() { return current_test_info_ ? &(current_test_info_->result_) : &ad_hoc_test_result_; } // Shuffles all test cases, and the tests within each test case, // making sure that death tests are still run first. void UnitTestImpl::ShuffleTests() { // Shuffles the death test cases. ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_); // Shuffles the non-death test cases. ShuffleRange(random(), last_death_test_case_ + 1, static_cast<int>(test_cases_.size()), &test_case_indices_); // Shuffles the tests inside each test case. for (size_t i = 0; i < test_cases_.size(); i++) { test_cases_[i]->ShuffleTests(random()); } } // Restores the test cases and tests to their order before the first shuffle. void UnitTestImpl::UnshuffleTests() { for (size_t i = 0; i < test_cases_.size(); i++) { // Unshuffles the tests in each test case. test_cases_[i]->UnshuffleTests(); // Resets the index of each test case. test_case_indices_[i] = static_cast<int>(i); } } // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. String GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, int skip_count) { // We pass skip_count + 1 to skip this wrapper function in addition // to what the user really wants to skip. return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); } // Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to // suppress unreachable code warnings. namespace { class ClassUniqueToAlwaysTrue {}; } bool IsTrue(bool condition) { return condition; } bool AlwaysTrue() { #if GTEST_HAS_EXCEPTIONS // This condition is always false so AlwaysTrue() never actually throws, // but it makes the compiler think that it may throw. if (IsTrue(false)) throw ClassUniqueToAlwaysTrue(); #endif // GTEST_HAS_EXCEPTIONS return true; } // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. bool SkipPrefix(const char* prefix, const char** pstr) { const size_t prefix_len = strlen(prefix); if (strncmp(*pstr, prefix, prefix_len) == 0) { *pstr += prefix_len; return true; } return false; } // Parses a string as a command line flag. The string should have // the format "--flag=value". When def_optional is true, the "=value" // part can be omitted. // // Returns the value of the flag, or NULL if the parsing failed. const char* ParseFlagValue(const char* str, const char* flag, bool def_optional) { // str and flag must not be NULL. if (str == NULL || flag == NULL) return NULL; // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag); const size_t flag_len = flag_str.length(); if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; // Skips the flag name. const char* flag_end = str + flag_len; // When def_optional is true, it's OK to not have a "=value" part. if (def_optional && (flag_end[0] == '\0')) { return flag_end; } // If def_optional is true and there are more characters after the // flag name, or if def_optional is false, there must be a '=' after // the flag name. if (flag_end[0] != '=') return NULL; // Returns the string after "=". return flag_end + 1; } // Parses a string for a bool flag, in the form of either // "--flag=value" or "--flag". // // In the former case, the value is taken as true as long as it does // not start with '0', 'f', or 'F'. // // In the latter case, the value is taken as true. // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseBoolFlag(const char* str, const char* flag, bool* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, true); // Aborts if the parsing failed. if (value_str == NULL) return false; // Converts the string value to a bool. *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); return true; } // Parses a string for an Int32 flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == NULL) return false; // Sets *value to the value of the flag. return ParseInt32(Message() << "The value of flag --" << flag, value_str, value); } // Parses a string for a string flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseStringFlag(const char* str, const char* flag, String* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == NULL) return false; // Sets *value to the value of the flag. *value = value_str; return true; } // Determines whether a string has a prefix that Google Test uses for its // flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. // If Google Test detects that a command line flag has its prefix but is not // recognized, it will print its help message. Flags starting with // GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test // internal flags and do not trigger the help message. static bool HasGoogleTestFlagPrefix(const char* str) { return (SkipPrefix("--", &str) || SkipPrefix("-", &str) || SkipPrefix("/", &str)) && !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); } // Prints a string containing code-encoded text. The following escape // sequences can be used in the string to control the text color: // // @@ prints a single '@' character. // @R changes the color to red. // @G changes the color to green. // @Y changes the color to yellow. // @D changes to the default terminal text color. // // TODO(wan@google.com): Write tests for this once we add stdout // capturing to Google Test. static void PrintColorEncoded(const char* str) { GTestColor color = COLOR_DEFAULT; // The current color. // Conceptually, we split the string into segments divided by escape // sequences. Then we print one segment at a time. At the end of // each iteration, the str pointer advances to the beginning of the // next segment. for (;;) { const char* p = strchr(str, '@'); if (p == NULL) { ColoredPrintf(color, "%s", str); return; } ColoredPrintf(color, "%s", String(str, p - str).c_str()); const char ch = p[1]; str = p + 2; if (ch == '@') { ColoredPrintf(color, "@"); } else if (ch == 'D') { color = COLOR_DEFAULT; } else if (ch == 'R') { color = COLOR_RED; } else if (ch == 'G') { color = COLOR_GREEN; } else if (ch == 'Y') { color = COLOR_YELLOW; } else { --str; } } } static const char kColorEncodedHelpMessage[] = "This program contains tests written using " GTEST_NAME_ ". You can use the\n" "following command line flags to control its behavior:\n" "\n" "Test Selection:\n" " @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" " List the names of all tests instead of running them. The name of\n" " TEST(Foo, Bar) is \"Foo.Bar\".\n" " @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" "[@G-@YNEGATIVE_PATTERNS]@D\n" " Run only the tests whose name matches one of the positive patterns but\n" " none of the negative patterns. '?' matches any single character; '*'\n" " matches any substring; ':' separates two patterns.\n" " @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" " Run all disabled tests too.\n" "\n" "Test Execution:\n" " @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" " Run the tests repeatedly; use a negative count to repeat forever.\n" " @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" " Randomize tests' orders on every iteration.\n" " @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" " Random number seed to use for shuffling test orders (between 1 and\n" " 99999, or 0 to use a seed based on the current time).\n" "\n" "Test Output:\n" " @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" " Enable/disable colored output. The default is @Gauto@D.\n" " -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" " Don't print the elapsed time of each test.\n" " @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G" GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" " Generate an XML report in the given directory or with the given file\n" " name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n" #if GTEST_CAN_STREAM_RESULTS_ " @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n" " Stream test results to the given server.\n" #endif // GTEST_CAN_STREAM_RESULTS_ "\n" "Assertion Behavior:\n" #if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" " Set the default death test style.\n" #endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" " Turn assertion failures into debugger break-points.\n" " @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" " Turn assertion failures into C++ exceptions.\n" " @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n" " Do not report exceptions as test failures. Instead, allow them\n" " to crash the program or throw a pop-up (on Windows).\n" "\n" "Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " "the corresponding\n" "environment variable of a flag (all letters in upper-case). For example, to\n" "disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ "color=no@D or set\n" "the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" "\n" "For more information, please read the " GTEST_NAME_ " documentation at\n" "@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" "(not one in your own code or tests), please report it to\n" "@G<" GTEST_DEV_EMAIL_ ">@D.\n"; // Parses the command line for Google Test flags, without initializing // other parts of Google Test. The type parameter CharType can be // instantiated to either char or wchar_t. template <typename CharType> void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { for (int i = 1; i < *argc; i++) { const String arg_string = StreamableToString(argv[i]); const char* const arg = arg_string.c_str(); using internal::ParseBoolFlag; using internal::ParseInt32Flag; using internal::ParseStringFlag; // Do we see a Google Test flag? if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, >EST_FLAG(also_run_disabled_tests)) || ParseBoolFlag(arg, kBreakOnFailureFlag, >EST_FLAG(break_on_failure)) || ParseBoolFlag(arg, kCatchExceptionsFlag, >EST_FLAG(catch_exceptions)) || ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || ParseStringFlag(arg, kDeathTestStyleFlag, >EST_FLAG(death_test_style)) || ParseBoolFlag(arg, kDeathTestUseFork, >EST_FLAG(death_test_use_fork)) || ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || ParseStringFlag(arg, kInternalRunDeathTestFlag, >EST_FLAG(internal_run_death_test)) || ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || ParseInt32Flag(arg, kStackTraceDepthFlag, >EST_FLAG(stack_trace_depth)) || ParseStringFlag(arg, kStreamResultToFlag, >EST_FLAG(stream_result_to)) || ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure)) ) { // Yes. Shift the remainder of the argv list left by one. Note // that argv has (*argc + 1) elements, the last one always being // NULL. The following loop moves the trailing NULL element as // well. for (int j = i; j != *argc; j++) { argv[j] = argv[j + 1]; } // Decrements the argument count. (*argc)--; // We also need to decrement the iterator as we just removed // an element. i--; } else if (arg_string == "--help" || arg_string == "-h" || arg_string == "-?" || arg_string == "/?" || HasGoogleTestFlagPrefix(arg)) { // Both help flag and unrecognized Google Test flags (excluding // internal ones) trigger help display. g_help_flag = true; } } if (g_help_flag) { // We print the help here instead of in RUN_ALL_TESTS(), as the // latter may not be called at all if the user is using Google // Test with another testing framework. PrintColorEncoded(kColorEncodedHelpMessage); } } // Parses the command line for Google Test flags, without initializing // other parts of Google Test. void ParseGoogleTestFlagsOnly(int* argc, char** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); } void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); } // The internal implementation of InitGoogleTest(). // // The type parameter CharType can be instantiated to either char or // wchar_t. template <typename CharType> void InitGoogleTestImpl(int* argc, CharType** argv) { g_init_gtest_count++; // We don't want to run the initialization code twice. if (g_init_gtest_count != 1) return; if (*argc <= 0) return; internal::g_executable_path = internal::StreamableToString(argv[0]); #if GTEST_HAS_DEATH_TEST g_argvs.clear(); for (int i = 0; i != *argc; i++) { g_argvs.push_back(StreamableToString(argv[i])); } #endif // GTEST_HAS_DEATH_TEST ParseGoogleTestFlagsOnly(argc, argv); GetUnitTestImpl()->PostFlagParsingInit(); } } // namespace internal // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. void InitGoogleTest(int* argc, char** argv) { internal::InitGoogleTestImpl(argc, argv); } // This overloaded version can be used in Windows programs compiled in // UNICODE mode. void InitGoogleTest(int* argc, wchar_t** argv) { internal::InitGoogleTestImpl(argc, argv); } } // namespace testing // Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev) // // This file implements death tests. #if GTEST_HAS_DEATH_TEST # if GTEST_OS_MAC # include <crt_externs.h> # endif // GTEST_OS_MAC # include <errno.h> # include <fcntl.h> # include <limits.h> # include <stdarg.h> # if GTEST_OS_WINDOWS # include <windows.h> # else # include <sys/mman.h> # include <sys/wait.h> # endif // GTEST_OS_WINDOWS #endif // GTEST_HAS_DEATH_TEST // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #undef GTEST_IMPLEMENTATION_ namespace testing { // Constants. // The default death test style. static const char kDefaultDeathTestStyle[] = "fast"; GTEST_DEFINE_string_( death_test_style, internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle), "Indicates how to run a death test in a forked child process: " "\"threadsafe\" (child process re-executes the test binary " "from the beginning, running only the specific death test) or " "\"fast\" (child process runs the death test immediately " "after forking)."); GTEST_DEFINE_bool_( death_test_use_fork, internal::BoolFromGTestEnv("death_test_use_fork", false), "Instructs to use fork()/_exit() instead of clone() in death tests. " "Ignored and always uses fork() on POSIX systems where clone() is not " "implemented. Useful when running under valgrind or similar tools if " "those do not support clone(). Valgrind 3.3.1 will just fail if " "it sees an unsupported combination of clone() flags. " "It is not recommended to use this flag w/o valgrind though it will " "work in 99% of the cases. Once valgrind is fixed, this flag will " "most likely be removed."); namespace internal { GTEST_DEFINE_string_( internal_run_death_test, "", "Indicates the file, line number, temporal index of " "the single death test to run, and a file descriptor to " "which a success code may be sent, all separated by " "colons. This flag is specified if and only if the current " "process is a sub-process launched for running a thread-safe " "death test. FOR INTERNAL USE ONLY."); } // namespace internal #if GTEST_HAS_DEATH_TEST // ExitedWithCode constructor. ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { } // ExitedWithCode function-call operator. bool ExitedWithCode::operator()(int exit_status) const { # if GTEST_OS_WINDOWS return exit_status == exit_code_; # else return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; # endif // GTEST_OS_WINDOWS } # if !GTEST_OS_WINDOWS // KilledBySignal constructor. KilledBySignal::KilledBySignal(int signum) : signum_(signum) { } // KilledBySignal function-call operator. bool KilledBySignal::operator()(int exit_status) const { return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_; } # endif // !GTEST_OS_WINDOWS namespace internal { // Utilities needed for death tests. // Generates a textual description of a given exit code, in the format // specified by wait(2). static String ExitSummary(int exit_code) { Message m; # if GTEST_OS_WINDOWS m << "Exited with exit status " << exit_code; # else if (WIFEXITED(exit_code)) { m << "Exited with exit status " << WEXITSTATUS(exit_code); } else if (WIFSIGNALED(exit_code)) { m << "Terminated by signal " << WTERMSIG(exit_code); } # ifdef WCOREDUMP if (WCOREDUMP(exit_code)) { m << " (core dumped)"; } # endif # endif // GTEST_OS_WINDOWS return m.GetString(); } // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. bool ExitedUnsuccessfully(int exit_status) { return !ExitedWithCode(0)(exit_status); } # if !GTEST_OS_WINDOWS // Generates a textual failure message when a death test finds more than // one thread running, or cannot determine the number of threads, prior // to executing the given statement. It is the responsibility of the // caller not to pass a thread_count of 1. static String DeathTestThreadWarning(size_t thread_count) { Message msg; msg << "Death tests use fork(), which is unsafe particularly" << " in a threaded context. For this test, " << GTEST_NAME_ << " "; if (thread_count == 0) msg << "couldn't detect the number of threads."; else msg << "detected " << thread_count << " threads."; return msg.GetString(); } # endif // !GTEST_OS_WINDOWS // Flag characters for reporting a death test that did not die. static const char kDeathTestLived = 'L'; static const char kDeathTestReturned = 'R'; static const char kDeathTestThrew = 'T'; static const char kDeathTestInternalError = 'I'; // An enumeration describing all of the possible ways that a death test can // conclude. DIED means that the process died while executing the test // code; LIVED means that process lived beyond the end of the test code; // RETURNED means that the test statement attempted to execute a return // statement, which is not allowed; THREW means that the test statement // returned control by throwing an exception. IN_PROGRESS means the test // has not yet concluded. // TODO(vladl@google.com): Unify names and possibly values for // AbortReason, DeathTestOutcome, and flag characters above. enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }; // Routine for aborting the program which is safe to call from an // exec-style death test child process, in which case the error // message is propagated back to the parent process. Otherwise, the // message is simply printed to stderr. In either case, the program // then exits with status 1. void DeathTestAbort(const String& message) { // On a POSIX system, this function may be called from a threadsafe-style // death test child process, which operates on a very small stack. Use // the heap for any additional non-minuscule memory requirements. const InternalRunDeathTestFlag* const flag = GetUnitTestImpl()->internal_run_death_test_flag(); if (flag != NULL) { FILE* parent = posix::FDOpen(flag->write_fd(), "w"); fputc(kDeathTestInternalError, parent); fprintf(parent, "%s", message.c_str()); fflush(parent); _exit(1); } else { fprintf(stderr, "%s", message.c_str()); fflush(stderr); posix::Abort(); } } // A replacement for CHECK that calls DeathTestAbort if the assertion // fails. # define GTEST_DEATH_TEST_CHECK_(expression) \ do { \ if (!::testing::internal::IsTrue(expression)) { \ DeathTestAbort(::testing::internal::String::Format( \ "CHECK failed: File %s, line %d: %s", \ __FILE__, __LINE__, #expression)); \ } \ } while (::testing::internal::AlwaysFalse()) // This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for // evaluating any system call that fulfills two conditions: it must return // -1 on failure, and set errno to EINTR when it is interrupted and // should be tried again. The macro expands to a loop that repeatedly // evaluates the expression as long as it evaluates to -1 and sets // errno to EINTR. If the expression evaluates to -1 but errno is // something other than EINTR, DeathTestAbort is called. # define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \ do { \ int gtest_retval; \ do { \ gtest_retval = (expression); \ } while (gtest_retval == -1 && errno == EINTR); \ if (gtest_retval == -1) { \ DeathTestAbort(::testing::internal::String::Format( \ "CHECK failed: File %s, line %d: %s != -1", \ __FILE__, __LINE__, #expression)); \ } \ } while (::testing::internal::AlwaysFalse()) // Returns the message describing the last system error in errno. String GetLastErrnoDescription() { return String(errno == 0 ? "" : posix::StrError(errno)); } // This is called from a death test parent process to read a failure // message from the death test child process and log it with the FATAL // severity. On Windows, the message is read from a pipe handle. On other // platforms, it is read from a file descriptor. static void FailFromInternalError(int fd) { Message error; char buffer[256]; int num_read; do { while ((num_read = posix::Read(fd, buffer, 255)) > 0) { buffer[num_read] = '\0'; error << buffer; } } while (num_read == -1 && errno == EINTR); if (num_read == 0) { GTEST_LOG_(FATAL) << error.GetString(); } else { const int last_error = errno; GTEST_LOG_(FATAL) << "Error while reading death test internal: " << GetLastErrnoDescription() << " [" << last_error << "]"; } } // Death test constructor. Increments the running death test count // for the current test. DeathTest::DeathTest() { TestInfo* const info = GetUnitTestImpl()->current_test_info(); if (info == NULL) { DeathTestAbort("Cannot run a death test outside of a TEST or " "TEST_F construct"); } } // Creates and returns a death test by dispatching to the current // death test factory. bool DeathTest::Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) { return GetUnitTestImpl()->death_test_factory()->Create( statement, regex, file, line, test); } const char* DeathTest::LastMessage() { return last_death_test_message_.c_str(); } void DeathTest::set_last_death_test_message(const String& message) { last_death_test_message_ = message; } String DeathTest::last_death_test_message_; // Provides cross platform implementation for some death functionality. class DeathTestImpl : public DeathTest { protected: DeathTestImpl(const char* a_statement, const RE* a_regex) : statement_(a_statement), regex_(a_regex), spawned_(false), status_(-1), outcome_(IN_PROGRESS), read_fd_(-1), write_fd_(-1) {} // read_fd_ is expected to be closed and cleared by a derived class. ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); } void Abort(AbortReason reason); virtual bool Passed(bool status_ok); const char* statement() const { return statement_; } const RE* regex() const { return regex_; } bool spawned() const { return spawned_; } void set_spawned(bool is_spawned) { spawned_ = is_spawned; } int status() const { return status_; } void set_status(int a_status) { status_ = a_status; } DeathTestOutcome outcome() const { return outcome_; } void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; } int read_fd() const { return read_fd_; } void set_read_fd(int fd) { read_fd_ = fd; } int write_fd() const { return write_fd_; } void set_write_fd(int fd) { write_fd_ = fd; } // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void ReadAndInterpretStatusByte(); private: // The textual content of the code this object is testing. This class // doesn't own this string and should not attempt to delete it. const char* const statement_; // The regular expression which test output must match. DeathTestImpl // doesn't own this object and should not attempt to delete it. const RE* const regex_; // True if the death test child process has been successfully spawned. bool spawned_; // The exit status of the child process. int status_; // How the death test concluded. DeathTestOutcome outcome_; // Descriptor to the read end of the pipe to the child process. It is // always -1 in the child process. The child keeps its write end of the // pipe in write_fd_. int read_fd_; // Descriptor to the child's write end of the pipe to the parent process. // It is always -1 in the parent process. The parent keeps its end of the // pipe in read_fd_. int write_fd_; }; // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void DeathTestImpl::ReadAndInterpretStatusByte() { char flag; int bytes_read; // The read() here blocks until data is available (signifying the // failure of the death test) or until the pipe is closed (signifying // its success), so it's okay to call this in the parent before // the child process has exited. do { bytes_read = posix::Read(read_fd(), &flag, 1); } while (bytes_read == -1 && errno == EINTR); if (bytes_read == 0) { set_outcome(DIED); } else if (bytes_read == 1) { switch (flag) { case kDeathTestReturned: set_outcome(RETURNED); break; case kDeathTestThrew: set_outcome(THREW); break; case kDeathTestLived: set_outcome(LIVED); break; case kDeathTestInternalError: FailFromInternalError(read_fd()); // Does not return. break; default: GTEST_LOG_(FATAL) << "Death test child process reported " << "unexpected status byte (" << static_cast<unsigned int>(flag) << ")"; } } else { GTEST_LOG_(FATAL) << "Read from death test child process failed: " << GetLastErrnoDescription(); } GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd())); set_read_fd(-1); } // Signals that the death test code which should have exited, didn't. // Should be called only in a death test child process. // Writes a status byte to the child's status file descriptor, then // calls _exit(1). void DeathTestImpl::Abort(AbortReason reason) { // The parent process considers the death test to be a failure if // it finds any data in our pipe. So, here we write a single flag byte // to the pipe, then exit. const char status_ch = reason == TEST_DID_NOT_DIE ? kDeathTestLived : reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned; GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); // We are leaking the descriptor here because on some platforms (i.e., // when built as Windows DLL), destructors of global objects will still // run after calling _exit(). On such systems, write_fd_ will be // indirectly closed from the destructor of UnitTestImpl, causing double // close if it is also closed here. On debug configurations, double close // may assert. As there are no in-process buffers to flush here, we are // relying on the OS to close the descriptor after the process terminates // when the destructors are not run. _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) } // Returns an indented copy of stderr output for a death test. // This makes distinguishing death test output lines from regular log lines // much easier. static ::std::string FormatDeathTestOutput(const ::std::string& output) { ::std::string ret; for (size_t at = 0; ; ) { const size_t line_end = output.find('\n', at); ret += "[ DEATH ] "; if (line_end == ::std::string::npos) { ret += output.substr(at); break; } ret += output.substr(at, line_end + 1 - at); at = line_end + 1; } return ret; } // Assesses the success or failure of a death test, using both private // members which have previously been set, and one argument: // // Private data members: // outcome: An enumeration describing how the death test // concluded: DIED, LIVED, THREW, or RETURNED. The death test // fails in the latter three cases. // status: The exit status of the child process. On *nix, it is in the // in the format specified by wait(2). On Windows, this is the // value supplied to the ExitProcess() API or a numeric code // of the exception that terminated the program. // regex: A regular expression object to be applied to // the test's captured standard error output; the death test // fails if it does not match. // // Argument: // status_ok: true if exit_status is acceptable in the context of // this particular death test, which fails if it is false // // Returns true iff all of the above conditions are met. Otherwise, the // first failing condition, in the order given above, is the one that is // reported. Also sets the last death test message string. bool DeathTestImpl::Passed(bool status_ok) { if (!spawned()) return false; const String error_message = GetCapturedStderr(); bool success = false; Message buffer; buffer << "Death test: " << statement() << "\n"; switch (outcome()) { case LIVED: buffer << " Result: failed to die.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case THREW: buffer << " Result: threw an exception.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case RETURNED: buffer << " Result: illegal return in test statement.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case DIED: if (status_ok) { const bool matched = RE::PartialMatch(error_message.c_str(), *regex()); if (matched) { success = true; } else { buffer << " Result: died but not with expected error.\n" << " Expected: " << regex()->pattern() << "\n" << "Actual msg:\n" << FormatDeathTestOutput(error_message); } } else { buffer << " Result: died but not with expected exit code:\n" << " " << ExitSummary(status()) << "\n" << "Actual msg:\n" << FormatDeathTestOutput(error_message); } break; case IN_PROGRESS: default: GTEST_LOG_(FATAL) << "DeathTest::Passed somehow called before conclusion of test"; } DeathTest::set_last_death_test_message(buffer.GetString()); return success; } # if GTEST_OS_WINDOWS // WindowsDeathTest implements death tests on Windows. Due to the // specifics of starting new processes on Windows, death tests there are // always threadsafe, and Google Test considers the // --gtest_death_test_style=fast setting to be equivalent to // --gtest_death_test_style=threadsafe there. // // A few implementation notes: Like the Linux version, the Windows // implementation uses pipes for child-to-parent communication. But due to // the specifics of pipes on Windows, some extra steps are required: // // 1. The parent creates a communication pipe and stores handles to both // ends of it. // 2. The parent starts the child and provides it with the information // necessary to acquire the handle to the write end of the pipe. // 3. The child acquires the write end of the pipe and signals the parent // using a Windows event. // 4. Now the parent can release the write end of the pipe on its side. If // this is done before step 3, the object's reference count goes down to // 0 and it is destroyed, preventing the child from acquiring it. The // parent now has to release it, or read operations on the read end of // the pipe will not return when the child terminates. // 5. The parent reads child's output through the pipe (outcome code and // any possible error messages) from the pipe, and its stderr and then // determines whether to fail the test. // // Note: to distinguish Win32 API calls from the local method and function // calls, the former are explicitly resolved in the global namespace. // class WindowsDeathTest : public DeathTestImpl { public: WindowsDeathTest(const char* a_statement, const RE* a_regex, const char* file, int line) : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {} // All of these virtual functions are inherited from DeathTest. virtual int Wait(); virtual TestRole AssumeRole(); private: // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; // Handle to the write end of the pipe to the child process. AutoHandle write_handle_; // Child process handle. AutoHandle child_handle_; // Event the child process uses to signal the parent that it has // acquired the handle to the write end of the pipe. After seeing this // event the parent can release its own handles to make sure its // ReadFile() calls return when the child terminates. AutoHandle event_handle_; }; // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int WindowsDeathTest::Wait() { if (!spawned()) return 0; // Wait until the child either signals that it has acquired the write end // of the pipe or it dies. const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() }; switch (::WaitForMultipleObjects(2, wait_handles, FALSE, // Waits for any of the handles. INFINITE)) { case WAIT_OBJECT_0: case WAIT_OBJECT_0 + 1: break; default: GTEST_DEATH_TEST_CHECK_(false); // Should not get here. } // The child has acquired the write end of the pipe or exited. // We release the handle on our side and continue. write_handle_.Reset(); event_handle_.Reset(); ReadAndInterpretStatusByte(); // Waits for the child process to exit if it haven't already. This // returns immediately if the child has already exited, regardless of // whether previous calls to WaitForMultipleObjects synchronized on this // handle or not. GTEST_DEATH_TEST_CHECK_( WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(), INFINITE)); DWORD status_code; GTEST_DEATH_TEST_CHECK_( ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE); child_handle_.Reset(); set_status(static_cast<int>(status_code)); return status(); } // The AssumeRole process for a Windows death test. It creates a child // process with the same executable as the current process to run the // death test. The child process is given the --gtest_filter and // --gtest_internal_run_death_test flags such that it knows to run the // current death test only. DeathTest::TestRole WindowsDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != NULL) { // ParseInternalRunDeathTestFlag() has performed all the necessary // processing. set_write_fd(flag->write_fd()); return EXECUTE_TEST; } // WindowsDeathTest uses an anonymous pipe to communicate results of // a death test. SECURITY_ATTRIBUTES handles_are_inheritable = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; HANDLE read_handle, write_handle; GTEST_DEATH_TEST_CHECK_( ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable, 0) // Default buffer size. != FALSE); set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle), O_RDONLY)); write_handle_.Reset(write_handle); event_handle_.Reset(::CreateEvent( &handles_are_inheritable, TRUE, // The event will automatically reset to non-signaled state. FALSE, // The initial state is non-signalled. NULL)); // The even is unnamed. GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL); const String filter_flag = String::Format("--%s%s=%s.%s", GTEST_FLAG_PREFIX_, kFilterFlag, info->test_case_name(), info->name()); const String internal_flag = String::Format( "--%s%s=%s|%d|%d|%u|%Iu|%Iu", GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag, file_, line_, death_test_index, static_cast<unsigned int>(::GetCurrentProcessId()), // size_t has the same with as pointers on both 32-bit and 64-bit // Windows platforms. // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx. reinterpret_cast<size_t>(write_handle), reinterpret_cast<size_t>(event_handle_.Get())); char executable_path[_MAX_PATH + 1]; // NOLINT GTEST_DEATH_TEST_CHECK_( _MAX_PATH + 1 != ::GetModuleFileNameA(NULL, executable_path, _MAX_PATH)); String command_line = String::Format("%s %s \"%s\"", ::GetCommandLineA(), filter_flag.c_str(), internal_flag.c_str()); DeathTest::set_last_death_test_message(""); CaptureStderr(); // Flush the log buffers since the log streams are shared with the child. FlushInfoLog(); // The child process will share the standard handles with the parent. STARTUPINFOA startup_info; memset(&startup_info, 0, sizeof(STARTUPINFO)); startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE); startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE); PROCESS_INFORMATION process_info; GTEST_DEATH_TEST_CHECK_(::CreateProcessA( executable_path, const_cast<char*>(command_line.c_str()), NULL, // Retuned process handle is not inheritable. NULL, // Retuned thread handle is not inheritable. TRUE, // Child inherits all inheritable handles (for write_handle_). 0x0, // Default creation flags. NULL, // Inherit the parent's environment. UnitTest::GetInstance()->original_working_dir(), &startup_info, &process_info) != FALSE); child_handle_.Reset(process_info.hProcess); ::CloseHandle(process_info.hThread); set_spawned(true); return OVERSEE_TEST; } # else // We are not on Windows. // ForkingDeathTest provides implementations for most of the abstract // methods of the DeathTest interface. Only the AssumeRole method is // left undefined. class ForkingDeathTest : public DeathTestImpl { public: ForkingDeathTest(const char* statement, const RE* regex); // All of these virtual functions are inherited from DeathTest. virtual int Wait(); protected: void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; } private: // PID of child process during death test; 0 in the child process itself. pid_t child_pid_; }; // Constructs a ForkingDeathTest. ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex) : DeathTestImpl(a_statement, a_regex), child_pid_(-1) {} // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int ForkingDeathTest::Wait() { if (!spawned()) return 0; ReadAndInterpretStatusByte(); int status_value; GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0)); set_status(status_value); return status_value; } // A concrete death test class that forks, then immediately runs the test // in the child process. class NoExecDeathTest : public ForkingDeathTest { public: NoExecDeathTest(const char* a_statement, const RE* a_regex) : ForkingDeathTest(a_statement, a_regex) { } virtual TestRole AssumeRole(); }; // The AssumeRole process for a fork-and-run death test. It implements a // straightforward fork, with a simple pipe to transmit the status byte. DeathTest::TestRole NoExecDeathTest::AssumeRole() { const size_t thread_count = GetThreadCount(); if (thread_count != 1) { GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count); } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); DeathTest::set_last_death_test_message(""); CaptureStderr(); // When we fork the process below, the log file buffers are copied, but the // file descriptors are shared. We flush all log files here so that closing // the file descriptors in the child process doesn't throw off the // synchronization between descriptors and buffers in the parent process. // This is as close to the fork as possible to avoid a race condition in case // there are multiple threads running before the death test, and another // thread writes to the log file. FlushInfoLog(); const pid_t child_pid = fork(); GTEST_DEATH_TEST_CHECK_(child_pid != -1); set_child_pid(child_pid); if (child_pid == 0) { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0])); set_write_fd(pipe_fd[1]); // Redirects all logging to stderr in the child process to prevent // concurrent writes to the log files. We capture stderr in the parent // process and append the child process' output to a log. LogToStderr(); // Event forwarding to the listeners of event listener API mush be shut // down in death test subprocesses. GetUnitTestImpl()->listeners()->SuppressEventForwarding(); return EXECUTE_TEST; } else { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } } // A concrete death test class that forks and re-executes the main // program from the beginning, with command-line flags set that cause // only this specific death test to be run. class ExecDeathTest : public ForkingDeathTest { public: ExecDeathTest(const char* a_statement, const RE* a_regex, const char* file, int line) : ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { } virtual TestRole AssumeRole(); private: // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; }; // Utility class for accumulating command-line arguments. class Arguments { public: Arguments() { args_.push_back(NULL); } ~Arguments() { for (std::vector<char*>::iterator i = args_.begin(); i != args_.end(); ++i) { free(*i); } } void AddArgument(const char* argument) { args_.insert(args_.end() - 1, posix::StrDup(argument)); } template <typename Str> void AddArguments(const ::std::vector<Str>& arguments) { for (typename ::std::vector<Str>::const_iterator i = arguments.begin(); i != arguments.end(); ++i) { args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); } } char* const* Argv() { return &args_[0]; } private: std::vector<char*> args_; }; // A struct that encompasses the arguments to the child process of a // threadsafe-style death test process. struct ExecDeathTestArgs { char* const* argv; // Command-line arguments for the child's call to exec int close_fd; // File descriptor to close; the read end of a pipe }; # if GTEST_OS_MAC inline char** GetEnviron() { // When Google Test is built as a framework on MacOS X, the environ variable // is unavailable. Apple's documentation (man environ) recommends using // _NSGetEnviron() instead. return *_NSGetEnviron(); } # else // Some POSIX platforms expect you to declare environ. extern "C" makes // it reside in the global namespace. extern "C" char** environ; inline char** GetEnviron() { return environ; } # endif // GTEST_OS_MAC // The main function for a threadsafe-style death test child process. // This function is called in a clone()-ed process and thus must avoid // any potentially unsafe operations like malloc or libc functions. static int ExecDeathTestChildMain(void* child_arg) { ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd)); // We need to execute the test program in the same environment where // it was originally invoked. Therefore we change to the original // working directory first. const char* const original_dir = UnitTest::GetInstance()->original_working_dir(); // We can safely call chdir() as it's a direct system call. if (chdir(original_dir) != 0) { DeathTestAbort(String::Format("chdir(\"%s\") failed: %s", original_dir, GetLastErrnoDescription().c_str())); return EXIT_FAILURE; } // We can safely call execve() as it's a direct system call. We // cannot use execvp() as it's a libc function and thus potentially // unsafe. Since execve() doesn't search the PATH, the user must // invoke the test program via a valid path that contains at least // one path separator. execve(args->argv[0], args->argv, GetEnviron()); DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s", args->argv[0], original_dir, GetLastErrnoDescription().c_str())); return EXIT_FAILURE; } // Two utility routines that together determine the direction the stack // grows. // This could be accomplished more elegantly by a single recursive // function, but we want to guard against the unlikely possibility of // a smart compiler optimizing the recursion away. // // GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining // StackLowerThanAddress into StackGrowsDown, which then doesn't give // correct answer. bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_; bool StackLowerThanAddress(const void* ptr) { int dummy; return &dummy < ptr; } bool StackGrowsDown() { int dummy; return StackLowerThanAddress(&dummy); } // A threadsafe implementation of fork(2) for threadsafe-style death tests // that uses clone(2). It dies with an error message if anything goes // wrong. static pid_t ExecDeathTestFork(char* const* argv, int close_fd) { ExecDeathTestArgs args = { argv, close_fd }; pid_t child_pid = -1; # if GTEST_HAS_CLONE const bool use_fork = GTEST_FLAG(death_test_use_fork); if (!use_fork) { static const bool stack_grows_down = StackGrowsDown(); const size_t stack_size = getpagesize(); // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED); void* const stack_top = static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0); child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1); } # else const bool use_fork = true; # endif // GTEST_HAS_CLONE if (use_fork && (child_pid = fork()) == 0) { ExecDeathTestChildMain(&args); _exit(0); } GTEST_DEATH_TEST_CHECK_(child_pid != -1); return child_pid; } // The AssumeRole process for a fork-and-exec death test. It re-executes the // main program from the beginning, setting the --gtest_filter // and --gtest_internal_run_death_test flags to cause only the current // death test to be re-run. DeathTest::TestRole ExecDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != NULL) { set_write_fd(flag->write_fd()); return EXECUTE_TEST; } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); // Clear the close-on-exec flag on the write end of the pipe, lest // it be closed when the child process does an exec: GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1); const String filter_flag = String::Format("--%s%s=%s.%s", GTEST_FLAG_PREFIX_, kFilterFlag, info->test_case_name(), info->name()); const String internal_flag = String::Format("--%s%s=%s|%d|%d|%d", GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag, file_, line_, death_test_index, pipe_fd[1]); Arguments args; args.AddArguments(GetArgvs()); args.AddArgument(filter_flag.c_str()); args.AddArgument(internal_flag.c_str()); DeathTest::set_last_death_test_message(""); CaptureStderr(); // See the comment in NoExecDeathTest::AssumeRole for why the next line // is necessary. FlushInfoLog(); const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_child_pid(child_pid); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } # endif // !GTEST_OS_WINDOWS // Creates a concrete DeathTest-derived class that depends on the // --gtest_death_test_style flag, and sets the pointer pointed to // by the "test" argument to its address. If the test should be // skipped, sets that pointer to NULL. Returns true, unless the // flag is set to an invalid value. bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) { UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const int death_test_index = impl->current_test_info() ->increment_death_test_count(); if (flag != NULL) { if (death_test_index > flag->index()) { DeathTest::set_last_death_test_message(String::Format( "Death test count (%d) somehow exceeded expected maximum (%d)", death_test_index, flag->index())); return false; } if (!(flag->file() == file && flag->line() == line && flag->index() == death_test_index)) { *test = NULL; return true; } } # if GTEST_OS_WINDOWS if (GTEST_FLAG(death_test_style) == "threadsafe" || GTEST_FLAG(death_test_style) == "fast") { *test = new WindowsDeathTest(statement, regex, file, line); } # else if (GTEST_FLAG(death_test_style) == "threadsafe") { *test = new ExecDeathTest(statement, regex, file, line); } else if (GTEST_FLAG(death_test_style) == "fast") { *test = new NoExecDeathTest(statement, regex); } # endif // GTEST_OS_WINDOWS else { // NOLINT - this is more readable than unbalanced brackets inside #if. DeathTest::set_last_death_test_message(String::Format( "Unknown death test style \"%s\" encountered", GTEST_FLAG(death_test_style).c_str())); return false; } return true; } // Splits a given string on a given delimiter, populating a given // vector with the fields. GTEST_HAS_DEATH_TEST implies that we have // ::std::string, so we can use it here. static void SplitString(const ::std::string& str, char delimiter, ::std::vector< ::std::string>* dest) { ::std::vector< ::std::string> parsed; ::std::string::size_type pos = 0; while (::testing::internal::AlwaysTrue()) { const ::std::string::size_type colon = str.find(delimiter, pos); if (colon == ::std::string::npos) { parsed.push_back(str.substr(pos)); break; } else { parsed.push_back(str.substr(pos, colon - pos)); pos = colon + 1; } } dest->swap(parsed); } # if GTEST_OS_WINDOWS // Recreates the pipe and event handles from the provided parameters, // signals the event, and returns a file descriptor wrapped around the pipe // handle. This function is called in the child process only. int GetStatusFileDescriptor(unsigned int parent_process_id, size_t write_handle_as_size_t, size_t event_handle_as_size_t) { AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE, FALSE, // Non-inheritable. parent_process_id)); if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) { DeathTestAbort(String::Format("Unable to open parent process %u", parent_process_id)); } // TODO(vladl@google.com): Replace the following check with a // compile-time assertion when available. GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); const HANDLE write_handle = reinterpret_cast<HANDLE>(write_handle_as_size_t); HANDLE dup_write_handle; // The newly initialized handle is accessible only in in the parent // process. To obtain one accessible within the child, we need to use // DuplicateHandle. if (!::DuplicateHandle(parent_process_handle.Get(), write_handle, ::GetCurrentProcess(), &dup_write_handle, 0x0, // Requested privileges ignored since // DUPLICATE_SAME_ACCESS is used. FALSE, // Request non-inheritable handler. DUPLICATE_SAME_ACCESS)) { DeathTestAbort(String::Format( "Unable to duplicate the pipe handle %Iu from the parent process %u", write_handle_as_size_t, parent_process_id)); } const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t); HANDLE dup_event_handle; if (!::DuplicateHandle(parent_process_handle.Get(), event_handle, ::GetCurrentProcess(), &dup_event_handle, 0x0, FALSE, DUPLICATE_SAME_ACCESS)) { DeathTestAbort(String::Format( "Unable to duplicate the event handle %Iu from the parent process %u", event_handle_as_size_t, parent_process_id)); } const int write_fd = ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND); if (write_fd == -1) { DeathTestAbort(String::Format( "Unable to convert pipe handle %Iu to a file descriptor", write_handle_as_size_t)); } // Signals the parent that the write end of the pipe has been acquired // so the parent can release its own write end. ::SetEvent(dup_event_handle); return write_fd; } # endif // GTEST_OS_WINDOWS // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { if (GTEST_FLAG(internal_run_death_test) == "") return NULL; // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we // can use it here. int line = -1; int index = -1; ::std::vector< ::std::string> fields; SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields); int write_fd = -1; # if GTEST_OS_WINDOWS unsigned int parent_process_id = 0; size_t write_handle_as_size_t = 0; size_t event_handle_as_size_t = 0; if (fields.size() != 6 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &parent_process_id) || !ParseNaturalNumber(fields[4], &write_handle_as_size_t) || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) { DeathTestAbort(String::Format( "Bad --gtest_internal_run_death_test flag: %s", GTEST_FLAG(internal_run_death_test).c_str())); } write_fd = GetStatusFileDescriptor(parent_process_id, write_handle_as_size_t, event_handle_as_size_t); # else if (fields.size() != 4 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &write_fd)) { DeathTestAbort(String::Format( "Bad --gtest_internal_run_death_test flag: %s", GTEST_FLAG(internal_run_death_test).c_str())); } # endif // GTEST_OS_WINDOWS return new InternalRunDeathTestFlag(fields[0], line, index, write_fd); } } // namespace internal #endif // GTEST_HAS_DEATH_TEST } // namespace testing // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: keith.ray@gmail.com (Keith Ray) #include <stdlib.h> #if GTEST_OS_WINDOWS_MOBILE # include <windows.h> #elif GTEST_OS_WINDOWS # include <direct.h> # include <io.h> #elif GTEST_OS_SYMBIAN || GTEST_OS_NACL // Symbian OpenC and NaCl have PATH_MAX in sys/syslimits.h # include <sys/syslimits.h> #else # include <limits.h> # include <climits> // Some Linux distributions define PATH_MAX here. #endif // GTEST_OS_WINDOWS_MOBILE #if GTEST_OS_WINDOWS # define GTEST_PATH_MAX_ _MAX_PATH #elif defined(PATH_MAX) # define GTEST_PATH_MAX_ PATH_MAX #elif defined(_XOPEN_PATH_MAX) # define GTEST_PATH_MAX_ _XOPEN_PATH_MAX #else # define GTEST_PATH_MAX_ _POSIX_PATH_MAX #endif // GTEST_OS_WINDOWS namespace testing { namespace internal { #if GTEST_OS_WINDOWS // On Windows, '\\' is the standard path separator, but many tools and the // Windows API also accept '/' as an alternate path separator. Unless otherwise // noted, a file path can contain either kind of path separators, or a mixture // of them. const char kPathSeparator = '\\'; const char kAlternatePathSeparator = '/'; const char kPathSeparatorString[] = "\\"; const char kAlternatePathSeparatorString[] = "/"; # if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory. You should not use // the current directory in tests on Windows CE, but this at least // provides a reasonable fallback. const char kCurrentDirectoryString[] = "\\"; // Windows CE doesn't define INVALID_FILE_ATTRIBUTES const DWORD kInvalidFileAttributes = 0xffffffff; # else const char kCurrentDirectoryString[] = ".\\"; # endif // GTEST_OS_WINDOWS_MOBILE #else const char kPathSeparator = '/'; const char kPathSeparatorString[] = "/"; const char kCurrentDirectoryString[] = "./"; #endif // GTEST_OS_WINDOWS // Returns whether the given character is a valid path separator. static bool IsPathSeparator(char c) { #if GTEST_HAS_ALT_PATH_SEP_ return (c == kPathSeparator) || (c == kAlternatePathSeparator); #else return c == kPathSeparator; #endif } // Returns the current working directory, or "" if unsuccessful. FilePath FilePath::GetCurrentDir() { #if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory, so we just return // something reasonable. return FilePath(kCurrentDirectoryString); #elif GTEST_OS_WINDOWS char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #else char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #endif // GTEST_OS_WINDOWS_MOBILE } // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath FilePath::RemoveExtension(const char* extension) const { String dot_extension(String::Format(".%s", extension)); if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) { return FilePath(String(pathname_.c_str(), pathname_.length() - 4)); } return *this; } // Returns a pointer to the last occurence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FilePath::FindLastPathSeparator() const { const char* const last_sep = strrchr(c_str(), kPathSeparator); #if GTEST_HAS_ALT_PATH_SEP_ const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); // Comparing two pointers of which only one is NULL is undefined. if (last_alt_sep != NULL && (last_sep == NULL || last_alt_sep > last_sep)) { return last_alt_sep; } #endif return last_sep; } // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveDirectoryName() const { const char* const last_sep = FindLastPathSeparator(); return last_sep ? FilePath(String(last_sep + 1)) : *this; } // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveFileName() const { const char* const last_sep = FindLastPathSeparator(); String dir; if (last_sep) { dir = String(c_str(), last_sep + 1 - c_str()); } else { dir = kCurrentDirectoryString; } return FilePath(dir); } // Helper functions for naming files in a directory for xml output. // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. FilePath FilePath::MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension) { String file; if (number == 0) { file = String::Format("%s.%s", base_name.c_str(), extension); } else { file = String::Format("%s_%d.%s", base_name.c_str(), number, extension); } return ConcatPaths(directory, FilePath(file)); } // Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. FilePath FilePath::ConcatPaths(const FilePath& directory, const FilePath& relative_path) { if (directory.IsEmpty()) return relative_path; const FilePath dir(directory.RemoveTrailingPathSeparator()); return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator, relative_path.c_str())); } // Returns true if pathname describes something findable in the file-system, // either a file, directory, or whatever. bool FilePath::FileOrDirectoryExists() const { #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; return attributes != kInvalidFileAttributes; #else posix::StatStruct file_stat; return posix::Stat(pathname_.c_str(), &file_stat) == 0; #endif // GTEST_OS_WINDOWS_MOBILE } // Returns true if pathname describes a directory in the file-system // that exists. bool FilePath::DirectoryExists() const { bool result = false; #if GTEST_OS_WINDOWS // Don't strip off trailing separator if path is a root directory on // Windows (like "C:\\"). const FilePath& path(IsRootDirectory() ? *this : RemoveTrailingPathSeparator()); #else const FilePath& path(*this); #endif #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; if ((attributes != kInvalidFileAttributes) && (attributes & FILE_ATTRIBUTE_DIRECTORY)) { result = true; } #else posix::StatStruct file_stat; result = posix::Stat(path.c_str(), &file_stat) == 0 && posix::IsDir(file_stat); #endif // GTEST_OS_WINDOWS_MOBILE return result; } // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool FilePath::IsRootDirectory() const { #if GTEST_OS_WINDOWS // TODO(wan@google.com): on Windows a network share like // \\server\share can be a root directory, although it cannot be the // current directory. Handle this properly. return pathname_.length() == 3 && IsAbsolutePath(); #else return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); #endif } // Returns true if pathname describes an absolute path. bool FilePath::IsAbsolutePath() const { const char* const name = pathname_.c_str(); #if GTEST_OS_WINDOWS return pathname_.length() >= 3 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z')) && name[1] == ':' && IsPathSeparator(name[2]); #else return IsPathSeparator(name[0]); #endif } // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_<number>.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. FilePath FilePath::GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension) { FilePath full_pathname; int number = 0; do { full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); } while (full_pathname.FileOrDirectoryExists()); return full_pathname; } // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool FilePath::IsDirectory() const { return !pathname_.empty() && IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); } // Create directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create directories // for any reason. bool FilePath::CreateDirectoriesRecursively() const { if (!this->IsDirectory()) { return false; } if (pathname_.length() == 0 || this->DirectoryExists()) { return true; } const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); return parent.CreateDirectoriesRecursively() && this->CreateFolder(); } // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool FilePath::CreateFolder() const { #if GTEST_OS_WINDOWS_MOBILE FilePath removed_sep(this->RemoveTrailingPathSeparator()); LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); int result = CreateDirectory(unicode, NULL) ? 0 : -1; delete [] unicode; #elif GTEST_OS_WINDOWS int result = _mkdir(pathname_.c_str()); #else int result = mkdir(pathname_.c_str(), 0777); #endif // GTEST_OS_WINDOWS_MOBILE if (result == -1) { return this->DirectoryExists(); // An error is OK if the directory exists. } return true; // No error. } // If input name has a trailing separator character, remove it and return the // name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath FilePath::RemoveTrailingPathSeparator() const { return IsDirectory() ? FilePath(String(pathname_.c_str(), pathname_.length() - 1)) : *this; } // Removes any redundant separators that might be in the pathname. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". // TODO(wan@google.com): handle Windows network shares (e.g. \\server\share). void FilePath::Normalize() { if (pathname_.c_str() == NULL) { pathname_ = ""; return; } const char* src = pathname_.c_str(); char* const dest = new char[pathname_.length() + 1]; char* dest_ptr = dest; memset(dest_ptr, 0, pathname_.length() + 1); while (*src != '\0') { *dest_ptr = *src; if (!IsPathSeparator(*src)) { src++; } else { #if GTEST_HAS_ALT_PATH_SEP_ if (*dest_ptr == kAlternatePathSeparator) { *dest_ptr = kPathSeparator; } #endif while (IsPathSeparator(*src)) src++; } dest_ptr++; } *dest_ptr = '\0'; pathname_ = dest; delete[] dest; } } // namespace internal } // namespace testing // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #include <limits.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #if GTEST_OS_WINDOWS_MOBILE # include <windows.h> // For TerminateProcess() #elif GTEST_OS_WINDOWS # include <io.h> # include <sys/stat.h> #else # include <unistd.h> #endif // GTEST_OS_WINDOWS_MOBILE #if GTEST_OS_MAC # include <mach/mach_init.h> # include <mach/task.h> # include <mach/vm_map.h> #endif // GTEST_OS_MAC // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #undef GTEST_IMPLEMENTATION_ namespace testing { namespace internal { #if defined(_MSC_VER) || defined(__BORLANDC__) // MSVC and C++Builder do not provide a definition of STDERR_FILENO. const int kStdOutFileno = 1; const int kStdErrFileno = 2; #else const int kStdOutFileno = STDOUT_FILENO; const int kStdErrFileno = STDERR_FILENO; #endif // _MSC_VER #if GTEST_OS_MAC // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. size_t GetThreadCount() { const task_t task = mach_task_self(); mach_msg_type_number_t thread_count; thread_act_array_t thread_list; const kern_return_t status = task_threads(task, &thread_list, &thread_count); if (status == KERN_SUCCESS) { // task_threads allocates resources in thread_list and we need to free them // to avoid leaks. vm_deallocate(task, reinterpret_cast<vm_address_t>(thread_list), sizeof(thread_t) * thread_count); return static_cast<size_t>(thread_count); } else { return 0; } } #else size_t GetThreadCount() { // There's no portable way to detect the number of threads, so we just // return 0 to indicate that we cannot detect it. return 0; } #endif // GTEST_OS_MAC #if GTEST_USES_POSIX_RE // Implements RE. Currently only needed for death tests. RE::~RE() { if (is_valid_) { // regfree'ing an invalid regex might crash because the content // of the regex is undefined. Since the regex's are essentially // the same, one cannot be valid (or invalid) without the other // being so too. regfree(&partial_regex_); regfree(&full_regex_); } free(const_cast<char*>(pattern_)); } // Returns true iff regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.full_regex_, str, 1, &match, 0) == 0; } // Returns true iff regular expression re matches a substring of str // (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = posix::StrDup(regex); // Reserves enough bytes to hold the regular expression used for a // full match. const size_t full_regex_len = strlen(regex) + 10; char* const full_pattern = new char[full_regex_len]; snprintf(full_pattern, full_regex_len, "^(%s)$", regex); is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; // We want to call regcomp(&partial_regex_, ...) even if the // previous expression returns false. Otherwise partial_regex_ may // not be properly initialized can may cause trouble when it's // freed. // // Some implementation of POSIX regex (e.g. on at least some // versions of Cygwin) doesn't accept the empty string as a valid // regex. We change it to an equivalent form "()" to be safe. if (is_valid_) { const char* const partial_regex = (*regex == '\0') ? "()" : regex; is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; } EXPECT_TRUE(is_valid_) << "Regular expression \"" << regex << "\" is not a valid POSIX Extended regular expression."; delete[] full_pattern; } #elif GTEST_USES_SIMPLE_RE // Returns true iff ch appears anywhere in str (excluding the // terminating '\0' character). bool IsInSet(char ch, const char* str) { return ch != '\0' && strchr(str, ch) != NULL; } // Returns true iff ch belongs to the given classification. Unlike // similar functions in <ctype.h>, these aren't affected by the // current locale. bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; } bool IsAsciiPunct(char ch) { return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); } bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } bool IsAsciiWordChar(char ch) { return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9') || ch == '_'; } // Returns true iff "\\c" is a supported escape sequence. bool IsValidEscape(char c) { return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW")); } // Returns true iff the given atom (specified by escaped and pattern) // matches ch. The result is undefined if the atom is invalid. bool AtomMatchesChar(bool escaped, char pattern_char, char ch) { if (escaped) { // "\\p" where p is pattern_char. switch (pattern_char) { case 'd': return IsAsciiDigit(ch); case 'D': return !IsAsciiDigit(ch); case 'f': return ch == '\f'; case 'n': return ch == '\n'; case 'r': return ch == '\r'; case 's': return IsAsciiWhiteSpace(ch); case 'S': return !IsAsciiWhiteSpace(ch); case 't': return ch == '\t'; case 'v': return ch == '\v'; case 'w': return IsAsciiWordChar(ch); case 'W': return !IsAsciiWordChar(ch); } return IsAsciiPunct(pattern_char) && pattern_char == ch; } return (pattern_char == '.' && ch != '\n') || pattern_char == ch; } // Helper function used by ValidateRegex() to format error messages. String FormatRegexSyntaxError(const char* regex, int index) { return (Message() << "Syntax error at index " << index << " in simple regular expression \"" << regex << "\": ").GetString(); } // Generates non-fatal failures and returns false if regex is invalid; // otherwise returns true. bool ValidateRegex(const char* regex) { if (regex == NULL) { // TODO(wan@google.com): fix the source file location in the // assertion failures to match where the regex is used in user // code. ADD_FAILURE() << "NULL is not a valid simple regular expression."; return false; } bool is_valid = true; // True iff ?, *, or + can follow the previous atom. bool prev_repeatable = false; for (int i = 0; regex[i]; i++) { if (regex[i] == '\\') { // An escape sequence i++; if (regex[i] == '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "'\\' cannot appear at the end."; return false; } if (!IsValidEscape(regex[i])) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "invalid escape sequence \"\\" << regex[i] << "\"."; is_valid = false; } prev_repeatable = true; } else { // Not an escape sequence. const char ch = regex[i]; if (ch == '^' && i > 0) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'^' can only appear at the beginning."; is_valid = false; } else if (ch == '$' && regex[i + 1] != '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'$' can only appear at the end."; is_valid = false; } else if (IsInSet(ch, "()[]{}|")) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' is unsupported."; is_valid = false; } else if (IsRepeat(ch) && !prev_repeatable) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' can only follow a repeatable token."; is_valid = false; } prev_repeatable = !IsInSet(ch, "^$?*+"); } } return is_valid; } // Matches a repeated regex atom followed by a valid simple regular // expression. The regex atom is defined as c if escaped is false, // or \c otherwise. repeat is the repetition meta character (?, *, // or +). The behavior is undefined if str contains too many // characters to be indexable by size_t, in which case the test will // probably time out anyway. We are fine with this limitation as // std::string has it too. bool MatchRepetitionAndRegexAtHead( bool escaped, char c, char repeat, const char* regex, const char* str) { const size_t min_count = (repeat == '+') ? 1 : 0; const size_t max_count = (repeat == '?') ? 1 : static_cast<size_t>(-1) - 1; // We cannot call numeric_limits::max() as it conflicts with the // max() macro on Windows. for (size_t i = 0; i <= max_count; ++i) { // We know that the atom matches each of the first i characters in str. if (i >= min_count && MatchRegexAtHead(regex, str + i)) { // We have enough matches at the head, and the tail matches too. // Since we only care about *whether* the pattern matches str // (as opposed to *how* it matches), there is no need to find a // greedy match. return true; } if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) return false; } return false; } // Returns true iff regex matches a prefix of str. regex must be a // valid simple regular expression and not start with "^", or the // result is undefined. bool MatchRegexAtHead(const char* regex, const char* str) { if (*regex == '\0') // An empty regex matches a prefix of anything. return true; // "$" only matches the end of a string. Note that regex being // valid guarantees that there's nothing after "$" in it. if (*regex == '$') return *str == '\0'; // Is the first thing in regex an escape sequence? const bool escaped = *regex == '\\'; if (escaped) ++regex; if (IsRepeat(regex[1])) { // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so // here's an indirect recursion. It terminates as the regex gets // shorter in each recursion. return MatchRepetitionAndRegexAtHead( escaped, regex[0], regex[1], regex + 2, str); } else { // regex isn't empty, isn't "$", and doesn't start with a // repetition. We match the first atom of regex with the first // character of str and recurse. return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && MatchRegexAtHead(regex + 1, str + 1); } } // Returns true iff regex matches any substring of str. regex must be // a valid simple regular expression, or the result is undefined. // // The algorithm is recursive, but the recursion depth doesn't exceed // the regex length, so we won't need to worry about running out of // stack space normally. In rare cases the time complexity can be // exponential with respect to the regex length + the string length, // but usually it's must faster (often close to linear). bool MatchRegexAnywhere(const char* regex, const char* str) { if (regex == NULL || str == NULL) return false; if (*regex == '^') return MatchRegexAtHead(regex + 1, str); // A successful match can be anywhere in str. do { if (MatchRegexAtHead(regex, str)) return true; } while (*str++ != '\0'); return false; } // Implements the RE class. RE::~RE() { free(const_cast<char*>(pattern_)); free(const_cast<char*>(full_pattern_)); } // Returns true iff regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); } // Returns true iff regular expression re matches a substring of str // (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = full_pattern_ = NULL; if (regex != NULL) { pattern_ = posix::StrDup(regex); } is_valid_ = ValidateRegex(regex); if (!is_valid_) { // No need to calculate the full pattern when the regex is invalid. return; } const size_t len = strlen(regex); // Reserves enough bytes to hold the regular expression used for a // full match: we need space to prepend a '^', append a '$', and // terminate the string with '\0'. char* buffer = static_cast<char*>(malloc(len + 3)); full_pattern_ = buffer; if (*regex != '^') *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'. // We don't use snprintf or strncpy, as they trigger a warning when // compiled with VC++ 8.0. memcpy(buffer, regex, len); buffer += len; if (len == 0 || regex[len - 1] != '$') *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'. *buffer = '\0'; } #endif // GTEST_USES_POSIX_RE const char kUnknownFile[] = "unknown file"; // Formats a source file path and a line number as they would appear // in an error message from the compiler used to compile this code. GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) { const char* const file_name = file == NULL ? kUnknownFile : file; if (line < 0) { return String::Format("%s:", file_name).c_str(); } #ifdef _MSC_VER return String::Format("%s(%d):", file_name, line).c_str(); #else return String::Format("%s:%d:", file_name, line).c_str(); #endif // _MSC_VER } // Formats a file location for compiler-independent XML output. // Although this function is not platform dependent, we put it next to // FormatFileLocation in order to contrast the two functions. // Note that FormatCompilerIndependentFileLocation() does NOT append colon // to the file location it produces, unlike FormatFileLocation(). GTEST_API_ ::std::string FormatCompilerIndependentFileLocation( const char* file, int line) { const char* const file_name = file == NULL ? kUnknownFile : file; if (line < 0) return file_name; else return String::Format("%s:%d", file_name, line).c_str(); } GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) : severity_(severity) { const char* const marker = severity == GTEST_INFO ? "[ INFO ]" : severity == GTEST_WARNING ? "[WARNING]" : severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; GetStream() << ::std::endl << marker << " " << FormatFileLocation(file, line).c_str() << ": "; } // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. GTestLog::~GTestLog() { GetStream() << ::std::endl; if (severity_ == GTEST_FATAL) { fflush(stderr); posix::Abort(); } } // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable: 4996) #endif // _MSC_VER #if GTEST_HAS_STREAM_REDIRECTION // Object that captures an output stream (stdout/stderr). class CapturedStream { public: // The ctor redirects the stream to a temporary file. CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { # if GTEST_OS_WINDOWS char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); const UINT success = ::GetTempFileNameA(temp_dir_path, "gtest_redir", 0, // Generate unique file name. temp_file_path); GTEST_CHECK_(success != 0) << "Unable to create a temporary file in " << temp_dir_path; const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " << temp_file_path; filename_ = temp_file_path; # else // There's no guarantee that a test has write access to the // current directory, so we create the temporary file in the /tmp // directory instead. char name_template[] = "/tmp/captured_stream.XXXXXX"; const int captured_fd = mkstemp(name_template); filename_ = name_template; # endif // GTEST_OS_WINDOWS fflush(NULL); dup2(captured_fd, fd_); close(captured_fd); } ~CapturedStream() { remove(filename_.c_str()); } String GetCapturedString() { if (uncaptured_fd_ != -1) { // Restores the original stream. fflush(NULL); dup2(uncaptured_fd_, fd_); close(uncaptured_fd_); uncaptured_fd_ = -1; } FILE* const file = posix::FOpen(filename_.c_str(), "r"); const String content = ReadEntireFile(file); posix::FClose(file); return content; } private: // Reads the entire content of a file as a String. static String ReadEntireFile(FILE* file); // Returns the size (in bytes) of a file. static size_t GetFileSize(FILE* file); const int fd_; // A stream to capture. int uncaptured_fd_; // Name of the temporary file holding the stderr output. ::std::string filename_; GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); }; // Returns the size (in bytes) of a file. size_t CapturedStream::GetFileSize(FILE* file) { fseek(file, 0, SEEK_END); return static_cast<size_t>(ftell(file)); } // Reads the entire content of a file as a string. String CapturedStream::ReadEntireFile(FILE* file) { const size_t file_size = GetFileSize(file); char* const buffer = new char[file_size]; size_t bytes_last_read = 0; // # of bytes read in the last fread() size_t bytes_read = 0; // # of bytes read so far fseek(file, 0, SEEK_SET); // Keeps reading the file until we cannot read further or the // pre-determined file size is reached. do { bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); bytes_read += bytes_last_read; } while (bytes_last_read > 0 && bytes_read < file_size); const String content(buffer, bytes_read); delete[] buffer; return content; } # ifdef _MSC_VER # pragma warning(pop) # endif // _MSC_VER static CapturedStream* g_captured_stderr = NULL; static CapturedStream* g_captured_stdout = NULL; // Starts capturing an output stream (stdout/stderr). void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) { if (*stream != NULL) { GTEST_LOG_(FATAL) << "Only one " << stream_name << " capturer can exist at a time."; } *stream = new CapturedStream(fd); } // Stops capturing the output stream and returns the captured string. String GetCapturedStream(CapturedStream** captured_stream) { const String content = (*captured_stream)->GetCapturedString(); delete *captured_stream; *captured_stream = NULL; return content; } // Starts capturing stdout. void CaptureStdout() { CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); } // Starts capturing stderr. void CaptureStderr() { CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); } // Stops capturing stdout and returns the captured string. String GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); } // Stops capturing stderr and returns the captured string. String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); } #endif // GTEST_HAS_STREAM_REDIRECTION #if GTEST_HAS_DEATH_TEST // A copy of all command line arguments. Set by InitGoogleTest(). ::std::vector<String> g_argvs; // Returns the command line as a vector of strings. const ::std::vector<String>& GetArgvs() { return g_argvs; } #endif // GTEST_HAS_DEATH_TEST #if GTEST_OS_WINDOWS_MOBILE namespace posix { void Abort() { DebugBreak(); TerminateProcess(GetCurrentProcess(), 1); } } // namespace posix #endif // GTEST_OS_WINDOWS_MOBILE // Returns the name of the environment variable corresponding to the // given flag. For example, FlagToEnvVar("foo") will return // "GTEST_FOO" in the open-source version. static String FlagToEnvVar(const char* flag) { const String full_flag = (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); Message env_var; for (size_t i = 0; i != full_flag.length(); i++) { env_var << ToUpper(full_flag.c_str()[i]); } return env_var.GetString(); } // Parses 'str' for a 32-bit signed integer. If successful, writes // the result to *value and returns true; otherwise leaves *value // unchanged and returns false. bool ParseInt32(const Message& src_text, const char* str, Int32* value) { // Parses the environment variable as a decimal integer. char* end = NULL; const long long_value = strtol(str, &end, 10); // NOLINT // Has strtol() consumed all characters in the string? if (*end != '\0') { // No - an invalid character was encountered. Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value \"" << str << "\".\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } // Is the parsed value in the range of an Int32? const Int32 result = static_cast<Int32>(long_value); if (long_value == LONG_MAX || long_value == LONG_MIN || // The parsed value overflows as a long. (strtol() returns // LONG_MAX or LONG_MIN when the input overflows.) result != long_value // The parsed value overflows as an Int32. ) { Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value " << str << ", which overflows.\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } *value = result; return true; } // Reads and returns the Boolean environment variable corresponding to // the given flag; if it's not set, returns default_value. // // The value is considered true iff it's not "0". bool BoolFromGTestEnv(const char* flag, bool default_value) { const String env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); return string_value == NULL ? default_value : strcmp(string_value, "0") != 0; } // Reads and returns a 32-bit integer stored in the environment // variable corresponding to the given flag; if it isn't set or // doesn't represent a valid 32-bit integer, returns default_value. Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { const String env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); if (string_value == NULL) { // The environment variable is not set. return default_value; } Int32 result = default_value; if (!ParseInt32(Message() << "Environment variable " << env_var, string_value, &result)) { printf("The default value %s is used.\n", (Message() << default_value).GetString().c_str()); fflush(stdout); return default_value; } return result; } // Reads and returns the string environment variable corresponding to // the given flag; if it's not set, returns default_value. const char* StringFromGTestEnv(const char* flag, const char* default_value) { const String env_var = FlagToEnvVar(flag); const char* const value = posix::GetEnv(env_var.c_str()); return value == NULL ? default_value : value; } } // namespace internal } // namespace testing // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Test - The Google C++ Testing Framework // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr); // // It uses the << operator when possible, and prints the bytes in the // object otherwise. A user can override its behavior for a class // type Foo by defining either operator<<(::std::ostream&, const Foo&) // or void PrintTo(const Foo&, ::std::ostream*) in the namespace that // defines Foo. #include <ctype.h> #include <stdio.h> #include <ostream> // NOLINT #include <string> namespace testing { namespace { using ::std::ostream; #if GTEST_OS_WINDOWS_MOBILE // Windows CE does not define _snprintf_s. # define snprintf _snprintf #elif _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf. # define snprintf _snprintf_s #elif _MSC_VER # define snprintf _snprintf #endif // GTEST_OS_WINDOWS_MOBILE // Prints a segment of bytes in the given object. void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, size_t count, ostream* os) { char text[5] = ""; for (size_t i = 0; i != count; i++) { const size_t j = start + i; if (i != 0) { // Organizes the bytes into groups of 2 for easy parsing by // human. if ((j % 2) == 0) *os << ' '; else *os << '-'; } snprintf(text, sizeof(text), "%02X", obj_bytes[j]); *os << text; } } // Prints the bytes in the given value to the given ostream. void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, ostream* os) { // Tells the user how big the object is. *os << count << "-byte object <"; const size_t kThreshold = 132; const size_t kChunkSize = 64; // If the object size is bigger than kThreshold, we'll have to omit // some details by printing only the first and the last kChunkSize // bytes. // TODO(wan): let the user control the threshold using a flag. if (count < kThreshold) { PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); } else { PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os); *os << " ... "; // Rounds up to 2-byte boundary. const size_t resume_pos = (count - kChunkSize + 1)/2*2; PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os); } *os << ">"; } } // namespace namespace internal2 { // Delegates to PrintBytesInObjectToImpl() to print the bytes in the // given object. The delegation simplifies the implementation, which // uses the << operator and thus is easier done outside of the // ::testing::internal namespace, which contains a << operator that // sometimes conflicts with the one in STL. void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ostream* os) { PrintBytesInObjectToImpl(obj_bytes, count, os); } } // namespace internal2 namespace internal { // Depending on the value of a char (or wchar_t), we print it in one // of three formats: // - as is if it's a printable ASCII (e.g. 'a', '2', ' '), // - as a hexidecimal escape sequence (e.g. '\x7F'), or // - as a special escape sequence (e.g. '\r', '\n'). enum CharFormat { kAsIs, kHexEscape, kSpecialEscape }; // Returns true if c is a printable ASCII character. We test the // value of c directly instead of calling isprint(), which is buggy on // Windows Mobile. inline bool IsPrintableAscii(wchar_t c) { return 0x20 <= c && c <= 0x7E; } // Prints a wide or narrow char c as a character literal without the // quotes, escaping it when necessary; returns how c was formatted. // The template argument UnsignedChar is the unsigned version of Char, // which is the type of c. template <typename UnsignedChar, typename Char> static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { switch (static_cast<wchar_t>(c)) { case L'\0': *os << "\\0"; break; case L'\'': *os << "\\'"; break; case L'\\': *os << "\\\\"; break; case L'\a': *os << "\\a"; break; case L'\b': *os << "\\b"; break; case L'\f': *os << "\\f"; break; case L'\n': *os << "\\n"; break; case L'\r': *os << "\\r"; break; case L'\t': *os << "\\t"; break; case L'\v': *os << "\\v"; break; default: if (IsPrintableAscii(c)) { *os << static_cast<char>(c); return kAsIs; } else { *os << String::Format("\\x%X", static_cast<UnsignedChar>(c)); return kHexEscape; } } return kSpecialEscape; } // Prints a char c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) { switch (c) { case L'\'': *os << "'"; return kAsIs; case L'"': *os << "\\\""; return kSpecialEscape; default: return PrintAsCharLiteralTo<wchar_t>(c, os); } } // Prints a char c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. static CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) { return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os); } // Prints a wide or narrow character c and its code. '\0' is printed // as "'\\0'", other unprintable characters are also properly escaped // using the standard C++ escape sequence. The template argument // UnsignedChar is the unsigned version of Char, which is the type of c. template <typename UnsignedChar, typename Char> void PrintCharAndCodeTo(Char c, ostream* os) { // First, print c as a literal in the most readable form we can find. *os << ((sizeof(c) > 1) ? "L'" : "'"); const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os); *os << "'"; // To aid user debugging, we also print c's code in decimal, unless // it's 0 (in which case c was printed as '\\0', making the code // obvious). if (c == 0) return; *os << " (" << String::Format("%d", c).c_str(); // For more convenience, we print c's code again in hexidecimal, // unless c was already printed in the form '\x##' or the code is in // [1, 9]. if (format == kHexEscape || (1 <= c && c <= 9)) { // Do nothing. } else { *os << String::Format(", 0x%X", static_cast<UnsignedChar>(c)).c_str(); } *os << ")"; } void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCodeTo<unsigned char>(c, os); } void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo<unsigned char>(c, os); } // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its code. L'\0' is printed as "L'\\0'". void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo<wchar_t>(wc, os); } // Prints the given array of characters to the ostream. // The array starts at *begin, the length is len, it may include '\0' characters // and may not be null-terminated. static void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) { *os << "\""; bool is_previous_hex = false; for (size_t index = 0; index < len; ++index) { const char cur = begin[index]; if (is_previous_hex && IsXDigit(cur)) { // Previous character is of '\x..' form and this character can be // interpreted as another hexadecimal digit in its number. Break string to // disambiguate. *os << "\" \""; } is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape; } *os << "\""; } // Prints a (const) char array of 'len' elements, starting at address 'begin'. void UniversalPrintArray(const char* begin, size_t len, ostream* os) { PrintCharsAsStringTo(begin, len, os); } // Prints the given array of wide characters to the ostream. // The array starts at *begin, the length is len, it may include L'\0' // characters and may not be null-terminated. static void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len, ostream* os) { *os << "L\""; bool is_previous_hex = false; for (size_t index = 0; index < len; ++index) { const wchar_t cur = begin[index]; if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) { // Previous character is of '\x..' form and this character can be // interpreted as another hexadecimal digit in its number. Break string to // disambiguate. *os << "\" L\""; } is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape; } *os << "\""; } // Prints the given C string to the ostream. void PrintTo(const char* s, ostream* os) { if (s == NULL) { *os << "NULL"; } else { *os << ImplicitCast_<const void*>(s) << " pointing to "; PrintCharsAsStringTo(s, strlen(s), os); } } // MSVC compiler can be configured to define whar_t as a typedef // of unsigned short. Defining an overload for const wchar_t* in that case // would cause pointers to unsigned shorts be printed as wide strings, // possibly accessing more memory than intended and causing invalid // memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when // wchar_t is implemented as a native type. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Prints the given wide C string to the ostream. void PrintTo(const wchar_t* s, ostream* os) { if (s == NULL) { *os << "NULL"; } else { *os << ImplicitCast_<const void*>(s) << " pointing to "; PrintWideCharsAsStringTo(s, wcslen(s), os); } } #endif // wchar_t is native // Prints a ::string object. #if GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::string& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::std::string& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } // Prints a ::wstring object. #if GTEST_HAS_GLOBAL_WSTRING void PrintWideStringTo(const ::wstring& s, ostream* os) { PrintWideCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_GLOBAL_WSTRING #if GTEST_HAS_STD_WSTRING void PrintWideStringTo(const ::std::wstring& s, ostream* os) { PrintWideCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_STD_WSTRING } // namespace internal } // namespace testing // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // // The Google C++ Testing Framework (Google Test) // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #undef GTEST_IMPLEMENTATION_ namespace testing { using internal::GetUnitTestImpl; // Gets the summary of the failure message by omitting the stack trace // in it. internal::String TestPartResult::ExtractSummary(const char* message) { const char* const stack_trace = strstr(message, internal::kStackTraceMarker); return stack_trace == NULL ? internal::String(message) : internal::String(message, stack_trace - message); } // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { return os << result.file_name() << ":" << result.line_number() << ": " << (result.type() == TestPartResult::kSuccess ? "Success" : result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : "Non-fatal failure") << ":\n" << result.message() << std::endl; } // Appends a TestPartResult to the array. void TestPartResultArray::Append(const TestPartResult& result) { array_.push_back(result); } // Returns the TestPartResult at the given index (0-based). const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { if (index < 0 || index >= size()) { printf("\nInvalid index (%d) into TestPartResultArray.\n", index); internal::posix::Abort(); } return array_[index]; } // Returns the number of TestPartResult objects in the array. int TestPartResultArray::size() const { return static_cast<int>(array_.size()); } namespace internal { HasNewFatalFailureHelper::HasNewFatalFailureHelper() : has_new_fatal_failure_(false), original_reporter_(GetUnitTestImpl()-> GetTestPartResultReporterForCurrentThread()) { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); } HasNewFatalFailureHelper::~HasNewFatalFailureHelper() { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( original_reporter_); } void HasNewFatalFailureHelper::ReportTestPartResult( const TestPartResult& result) { if (result.fatally_failed()) has_new_fatal_failure_ = true; original_reporter_->ReportTestPartResult(result); } } // namespace internal } // namespace testing // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) namespace testing { namespace internal { #if GTEST_HAS_TYPED_TEST_P // Skips to the first non-space char in str. Returns an empty string if str // contains only whitespace characters. static const char* SkipSpaces(const char* str) { while (IsSpace(*str)) str++; return str; } // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. const char* TypedTestCasePState::VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests) { typedef ::std::set<const char*>::const_iterator DefinedTestIter; registered_ = true; // Skip initial whitespace in registered_tests since some // preprocessors prefix stringizied literals with whitespace. registered_tests = SkipSpaces(registered_tests); Message errors; ::std::set<String> tests; for (const char* names = registered_tests; names != NULL; names = SkipComma(names)) { const String name = GetPrefixUntilComma(names); if (tests.count(name) != 0) { errors << "Test " << name << " is listed more than once.\n"; continue; } bool found = false; for (DefinedTestIter it = defined_test_names_.begin(); it != defined_test_names_.end(); ++it) { if (name == *it) { found = true; break; } } if (found) { tests.insert(name); } else { errors << "No test named " << name << " can be found in this test case.\n"; } } for (DefinedTestIter it = defined_test_names_.begin(); it != defined_test_names_.end(); ++it) { if (tests.count(*it) == 0) { errors << "You forgot to list test " << *it << ".\n"; } } const String& errors_str = errors.GetString(); if (errors_str != "") { fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), errors_str.c_str()); fflush(stderr); posix::Abort(); } return registered_tests; } #endif // GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing ================================================ FILE: thirdparty/gtest/src/gtest_main.cc ================================================ // Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <iostream> #include "gtest/gtest_ASP.h" GTEST_API_ int main(int argc, char **argv) { std::cout << "Running main() from gtest_main.cc\n"; testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ================================================ FILE: thirdparty/m4/autotroll.m4 ================================================ dnl __BEGIN_LICENSE__ dnl Copyright (C) 2006-2011 United States Government as represented by dnl the Administrator of the National Aeronautics and Space Administration. dnl All Rights Reserved. dnl __END_LICENSE__ # Build Qt apps with the autotools (Autoconf/Automake). # M4 macros. # This file is part of AutoTroll. # Copyright (C) 2006 Benoit Sigoure <benoit.sigoure@lrde.epita.fr> # # AutoTroll is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # In addition, as a special exception, the copyright holders of AutoTroll # give you unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the macros of # AutoTroll. You need not follow the terms of the GNU General Public License # when using or distributing such scripts, even though portions of the text of # AutoTroll appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes AutoTroll. # # This special exception to the GPL applies to versions of AutoTroll # released by the copyright holders of AutoTroll. Note that people who make # modified versions of AutoTroll are not obligated to grant this special # exception for their modified versions; it is their choice whether to do so. # The GNU General Public License gives permission to release a modified version # without this exception; this exception also makes it possible to release a # modified version which carries forward this exception. # ------------- # # DOCUMENTATION # # ------------- # # Disclaimer: Never tested with anything else than Qt 4.2! Feedback welcome. # Simply invoke AT_WITH_QT in your configure.ac. AT_WITH_QT can take # arguments which are documented in depth below. The default arguments are # equivalent to the default .pro file generated by qmake. # # Invoking AT_WITH_QT will do the following: # - Add a --with-qt option to your configure # - Find qmake, moc and uic and save them in the make variables $(QMAKE), # $(MOC), $(UIC). # - Save the path to Qt in $(QT_PATH) # - Find the flags to use Qt, that is: # * $(QT_DEFINES): -D's defined by qmake. # * $(QT_CFLAGS): CFLAGS as defined by qmake (C?!) # * $(QT_CXXFLAGS): CXXFLAGS as defined by qmake. # * $(QT_INCPATH): -I's defined by qmake. # * $(QT_CPPFLAGS): Same as $(QT_DEFINES) + $(QT_INCPATH) # * $(QT_LFLAGS): LFLAGS defined by qmake. # * $(QT_LDFLAGS): Same thing as $(QT_LFLAGS). # * $(QT_LIBS): LIBS defined by qmake. # # You *MUST* invoke $(MOC) and/or $(UIC) where necessary. AutoTroll provides # you with Makerules to ease this, here is a sample Makefile.am to use with # AutoTroll which builds the code given in the chapter 7 of the Qt Tutorial: # http://doc.trolltech.com/4.2/tutorial-t7.html # # ------------------------------------------------------------------------- # include $(top_srcdir)/build-aux/autotroll.mk # # ACLOCAL_AMFLAGS = -I build-aux # # bin_PROGRAMS = lcdrange # lcdrange_SOURCES = $(BUILT_SOURCES) lcdrange.cpp lcdrange.h main.cpp # lcdrange_CXXFLAGS = $(QT_CXXFLAGS) $(AM_CXXFLAGS) # lcdrange_CPPFLAGS = $(QT_CPPFLAGS) $(AM_CPPFLAGS) # lcdrange_LDFLAGS = $(QT_LDFLAGS) $(LDFLAGS) # lcdrange_LDADD = $(QT_LIBS) $(LDADD) # # BUILT_SOURCES = lcdrange.moc.cpp # ------------------------------------------------------------------------- # # Note that your MOC, UIC and QRC files *MUST* be listed manually in # BUILT_SOURCES. If you name them properly (eg: .moc.cc, .qrc.cc, .ui.cc -- of # course you can use .cpp or .cxx or .C rather than .cc) AutoTroll will build # them automagically for you (using implicit rules defined in autotroll.mk). m4_define([_AUTOTROLL_SERIAL], [m4_translit([ # serial 4 ], [# ], [])]) m4_ifdef([AX_INSTEAD_IF], [], [AC_DEFUN([AX_INSTEAD_IF], [m4_ifval([$1], [AC_MSG_WARN([$2]); [$1]], [AC_MSG_ERROR([$2])])])]) m4_pattern_forbid([^AT_])dnl m4_pattern_forbid([^_AT_])dnl # These are backports from autoconf 2.60. # They can be removed when 2.60 is everywhere. # _AS_VERSION_COMPARE_PREPARE # --------------------------- # Output variables for comparing version numbers. m4_ifdef([_AS_VERSION_COMPARE_PREPARE], [], [ AC_DEFUN([_AS_VERSION_COMPARE_PREPARE], [[as_awk_strverscmp=' # Use only awk features that work with 7th edition Unix awk (1978). # My, what an old awk you have, Mr. Solaris! END { while (length(v1) || length(v2)) { # Set d1 to be the next thing to compare from v1, and likewise for d2. # Normally this is a single character, but if v1 and v2 contain digits, # compare them as integers and fractions as strverscmp does. if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) { # Split v1 and v2 into their leading digit string components d1 and d2, # and advance v1 and v2 past the leading digit strings. for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1) d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1) if (d1 ~ /^0/) { if (d2 ~ /^0/) { # Compare two fractions. while (d1 ~ /^0/ && d2 ~ /^0/) { d1 = substr(d1, 2); len1-- d2 = substr(d2, 2); len2-- } if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) { # The two components differ in length, and the common prefix # contains only leading zeros. Consider the longer to be less. d1 = -len1 d2 = -len2 } else { # Otherwise, compare as strings. d1 = "x" d1 d2 = "x" d2 } } else { # A fraction is less than an integer. exit 1 } } else { if (d2 ~ /^0/) { # An integer is greater than a fraction. exit 2 } else { # Compare two integers. d1 += 0 d2 += 0 } } } else { # The normal case, without worrying about digits. if (v1 == "") d1 = v1; else { d1 = substr(v1, 1, 1); v1 = substr(v1,2) } if (v2 == "") d2 = v2; else { d2 = substr(v2, 1, 1); v2 = substr(v2,2) } } if (d1 < d2) exit 1 if (d1 > d2) exit 2 } } ']])]) m4_ifdef([AS_VERSION_COMPARE], [], [ AC_DEFUN([AS_VERSION_COMPARE], [AS_REQUIRE([_$0_PREPARE])dnl as_arg_v1=$1 as_arg_v2=$2 dnl This usage is portable even to ancient awk, dnl so don't worry about finding a "nice" awk version. awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null case $? in 1) $3;; 0) $4;; 2) $5;; esac[]dnl ])]) # AT_WITH_QT([QT_modules], [QT_config], [QT_misc], [RUN-IF-FAILED], [RUN-IF-OK]) # ------------------------------------------------------------------------------ # Enable Qt support and add an option --with-qt to the configure script. # # The QT_modules argument is optional and defines extra modules to enable or # disable (it's equivalent to the QT variable in .pro files). Modules can be # specified as follows: # # AT_WITH_QT => No argument -> No QT value. # Qmake sets it to "core gui" by default. # AT_WITH_QT([xml]) => QT += xml # AT_WITH_QT([+xml]) => QT += xml # AT_WITH_QT([-gui]) => QT -= gui # AT_WITH_QT([xml -gui +sql svg]) => QT += xml sql svg # QT -= gui # # The QT_config argument is also optional and follows the same convention as # QT_modules. Instead of changing the QT variable, it changes the CONFIG # variable, which is used to tweak configuration and compiler options. # # The last argument, QT_misc (also optional) will be copied as-is the .pro # file used to guess how to compile Qt apps. You may use it to further tweak # the build process of Qt apps if tweaking the QT or CONFIG variables isn't # enough for you. # # RUN-IF-FAILED is arbitrary code to execute if Qt cannot be found or if any # problem happens. If this argument is omitted, then AC_MSG_ERROR will be # called. RUN-IF-OK is arbitrary code to execute if Qt was successfully found. AC_DEFUN([AT_WITH_QT], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CXX])dnl echo "$as_me: this is autotroll.m4[]_AUTOTROLL_SERIAL" >&AS_MESSAGE_LOG_FD test x"$TROLL" != x && echo 'ViM rox emacs.' dnl Memo: AC_ARG_WITH(package, help-string, [if-given], [if-not-given]) AC_ARG_WITH([qt], [AS_HELP_STRING([--with-qt], [Path to Qt @<:@Look in PATH and /usr/local/Trolltech@:>@])], [QT_PATH=$withval]) # this is a hack to get decent flow control with 'break' for _qt_ignored in once; do # Find Qt. AC_ARG_VAR([QT_PATH], [Path to the Qt installation]) if test -d /usr/local/Trolltech; then # Try to find the latest version. tmp_qt_paths=`echo /usr/local/Trolltech/*/bin | tr ' ' '\n' | sort -nr \ | xargs | sed 's/ */:/g'` fi # Path to which recent MacPorts (~v1.7) install Qt4. test -d /opt/local/libexec/qt4-mac/bin \ && tmp_qt_paths="$tmp_qt_paths:/opt/local/libexec/qt4-mac/bin" # Find qmake. AC_ARG_VAR([QMAKE], [Qt Makefile generator command]) AC_PATH_PROGS([QMAKE], [qmake qmake-qt4 qmake-qt3], [missing], [$QT_DIR:$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$QMAKE" = xmissing; then AX_INSTEAD_IF([$4], [Cannot find qmake in your PATH. Try using --with-qt.]) break fi # Find moc (Meta Object Compiler). AC_ARG_VAR([MOC], [Qt Meta Object Compiler command]) AC_PATH_PROGS([MOC], [moc moc-qt4 moc-qt3], [missing], [$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$MOC" = xmissing; then AX_INSTEAD_IF([$4], [Cannot find moc (Meta Object Compiler) in your PATH. Try using --with-qt.]) break fi # Find uic (User Interface Compiler). AC_ARG_VAR([UIC], [Qt User Interface Compiler command]) AC_PATH_PROGS([UIC], [uic uic-qt4 uic-qt3 uic3], [missing], [$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$UIC" = xmissing; then AX_INSTEAD_IF([$4], [Cannot find uic (User Interface Compiler) in your PATH. Try using --with-qt.]) break fi # Find rcc (Qt Resource Compiler). AC_ARG_VAR([RCC], [Qt Resource Compiler command]) AC_PATH_PROGS([RCC], [rcc], [false], [$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$UIC" = xfalse; then AC_MSG_WARN([Cannot find rcc (Qt Resource Compiler) in your PATH.\ Try using --with-qt.]) fi AC_MSG_CHECKING([whether host operating system is Darwin]) at_darwin="no" case $host_os in darwin*) at_darwin="yes" QMAKE_ARGS="-spec macx-g++" ;; esac AC_MSG_RESULT([$at_darwin]) # If we don't know the path to Qt, guess it from the path to qmake. if test x"$QT_PATH" = x; then QT_PATH=`dirname "$QMAKE"` fi if test x"$QT_PATH" = x; then AX_INSTEAD_IF([$4], [Cannot find the path to your Qt install. Use --with-qt.]) break fi AC_SUBST([QT_PATH]) # Get ready to build a test-app with Qt. # Look for a writable temporary directory. AC_ARG_VAR([TMPDIR], [A temporary directory with write access @<:@/tmp@:>@]) if test x"$TMPDIR" = x || test ! -d "$TMPDIR" || test ! -w "$TMPDIR"; then echo "$as_me:$LINENO: no TMPDIR or bad TMPDIR ($TMPDIR)" \ >&AS_MESSAGE_LOG_FD for i in /tmp /var/tmp; do if test -d "$i" && test -w "$i"; then TMPDIR=$i export TMPDIR echo "$as_me:$LINENO: setting TMPDIR=$TMPDIR" >&AS_MESSAGE_LOG_FD break fi done fi # Kludge!! QMake has a very strange behavior. For instance, if you # install Qt under your $HOME and run QMake somewhere else under your # $HOME, it will try to be clever and produce Makefiles with relative # include paths. In order to avoid this, we will test QMake from a # temporary directory (usually /tmp). Note that this problem was only # observed with Qt 4. my_configure_pwd=`pwd` my_tmpdir="$TMPDIR/conftest$$.dir" test -d "$my_tmpdir" || mkdir "$my_tmpdir" if test -w "$my_tmpdir" && cd "$my_tmpdir" then : else AX_INSTEAD_IF([$4], [Cannot cd to or write in $my_tmpdir]) break fi cat >conftest.h <<_ASEOF #include <QObject> class Foo: public QObject { Q_OBJECT; public: Foo(); ~Foo() {} public slots: void setValue(int value); signals: void valueChanged(int newValue); private: int value_; }; _ASEOF cat >conftest.cpp <<_ASEOF #include "conftest.h" Foo::Foo() : value_ (42) { connect(this, SIGNAL(valueChanged(int)), this, SLOT(setValue(int))); } void Foo::setValue(int value) { value_ = value; } int main() { Foo f; } _ASEOF if $QMAKE -project; then :; else AX_INSTEAD_IF([$4], [Calling $QMAKE -project failed.]) break fi # Find the .pro file generated by qmake. pro_file='conftest.dir.pro' test -f $pro_file || pro_file=`echo *.pro` if test -f "$pro_file"; then :; else AX_INSTEAD_IF([$4], [Can't find the .pro file generated by Qmake.]) break fi dnl Tweak the value of QT in the .pro if have been the 1st arg. m4_ifval([$1], [_AT_TWEAK_PRO_FILE([QT], [$1])]) dnl Tweak the value of CONFIG in the .pro if have been given a 2nd arg. m4_ifval([$2], [_AT_TWEAK_PRO_FILE([CONFIG], [$2])]) m4_ifval([$3], [ # Add the extra-settings the user wants to set in the .pro echo "$3" >>"$pro_file" ]) echo "$as_me:$LINENO: Invoking $QMAKE on $pro_file" >&AS_MESSAGE_LOG_FD sed 's/^/| /' "$pro_file" >&AS_MESSAGE_LOG_FD if $QMAKE $QMAKE_ARGS; then :; else AX_INSTEAD_IF([$4], [Calling $QMAKE $QMAKE_ARGS failed.]) break fi # Qmake from Qt-4.3.2 generates Makefile with slashes instead of backslashes # on mingw and this lead to an error (see #96). The followind sed call is a # work around this issue. case $host_os in *mingw*|*cygwin*) sed -i 's|\([^ ]\)/|\1\\|g' Makefile ;; esac # Try to compile a simple Qt app. AC_CACHE_CHECK([whether we can build a simple Qt app], [at_cv_qt_build], [at_cv_qt_build=ko : ${MAKE=make} if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 4' else echo "$as_me:$LINENO: Build failed, trying to #include <qobject.h> \ instead" >&AS_MESSAGE_LOG_FD sed 's/<QObject>/<qobject.h>/' conftest.h > tmp.h && mv tmp.h conftest.h if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 3' else # Sometimes (such as on Debian) build will fail because Qt hasn't been # installed in debug mode and qmake tries (by default) to build apps in # debug mode => Try again in release mode. echo "$as_me:$LINENO: Build failed, trying to enforce release mode" \ >&AS_MESSAGE_LOG_FD _AT_TWEAK_PRO_FILE([CONFIG], [+release]) sed 's/<qobject.h>/<QObject>/' conftest.h > tmp.h && mv tmp.h conftest.h if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 4, release mode forced' else echo "$as_me:$LINENO: Build failed, trying to #include <qobject.h> \ instead" >&AS_MESSAGE_LOG_FD sed 's/<QObject>/<qobject.h>/' conftest.h >tmp.h && mv tmp.h conftest.h if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 3, release mode forced' else at_cv_qt_build=ko echo "$as_me:$LINENO: failed program was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.h >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: failed program was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.cpp >&AS_MESSAGE_LOG_FD fi # if make with Qt3-style #include and release mode forced. fi # if make with Qt4-style #include and release mode forced. fi # if make with Qt3-style #include. fi # if make with Qt4-style #include. ])dnl end: AC_CACHE_CHECK(at_cv_qt_build) if test x"$at_cv_qt_build" = xko; then AX_INSTEAD_IF([$4], [Cannot build a test Qt program]) break fi QT_VERSION_MAJOR=`echo "$at_cv_qt_build" | sed 's/[[^0-9]]*//g'` AC_SUBST([QT_VERSION_MAJOR]) # This sed filter is applied after an expression of the form: /^FOO.*=/!d; # It starts by removing the beginning of the line, removing references to # SUBLIBS, removing unnecessary whitespaces at the beginning, and prefixes # all variable uses by QT_. qt_sed_filter='s///; s/$(SUBLIBS)//g; s/^ *//; s/\$(\(@<:@A-Z_@:>@@<:@A-Z_@:>@*\))/$(QT_\1)/g' # Find the Makefile (qmake happens to generate a fake Makefile which invokes # a Makefile.Debug or Makefile.Release). We we have both, we'll pick the # Makefile.Release. The reason is that the main difference is that release # uses -Os and debug -g. We can override -Os by passing another -O but we # usually don't override -g. if test -f Makefile.Release; then at_mfile='Makefile.Release' else at_mfile='Makefile' fi if test -f $at_mfile; then :; else AX_INSTEAD_IF([$4], [Cannot find the Makefile generated by qmake.]) break fi # Find the DEFINES of Qt (should have been named CPPFLAGS). AC_CACHE_CHECK([for the DEFINES to use with Qt], [at_cv_env_QT_DEFINES], [at_cv_env_QT_DEFINES=`sed "/^DEFINES@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_DEFINES], [$at_cv_env_QT_DEFINES]) # Find the CFLAGS of Qt (We can use Qt in C?!) AC_CACHE_CHECK([for the CFLAGS to use with Qt], [at_cv_env_QT_CFLAGS], [at_cv_env_QT_CFLAGS=`sed "/^CFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_CFLAGS], [$at_cv_env_QT_CFLAGS]) # Find the CXXFLAGS of Qt. AC_CACHE_CHECK([for the CXXFLAGS to use with Qt], [at_cv_env_QT_CXXFLAGS], [at_cv_env_QT_CXXFLAGS=`sed "/^CXXFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_CXXFLAGS], [$at_cv_env_QT_CXXFLAGS]) # Find the INCPATH of Qt. AC_CACHE_CHECK([for the INCPATH to use with Qt], [at_cv_env_QT_INCPATH], [at_cv_env_QT_INCPATH=`sed "/^INCPATH@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_INCPATH], [$at_cv_env_QT_INCPATH]) AC_SUBST([QT_CPPFLAGS], ["$at_cv_env_QT_DEFINES $at_cv_env_QT_INCPATH"]) # Find the LFLAGS of Qt (Should have been named LDFLAGS) AC_CACHE_CHECK([for the LDFLAGS to use with Qt], [at_cv_env_QT_LDFLAGS], [at_cv_env_QT_LDFLAGS=`sed "/^LFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_LFLAGS], [$at_cv_env_QT_LDFLAGS]) AC_SUBST([QT_LDFLAGS], [$at_cv_env_QT_LDFLAGS]) # Find the LIBS of Qt. AC_CACHE_CHECK([for the LIBS to use with Qt], [at_cv_env_QT_LIBS], [at_cv_env_QT_LIBS=`sed "/^LIBS@<:@^A-Z@:>@*=/!d;$qt_sed_filter" $at_mfile` if test x$at_darwin = xyes; then # Fix QT_LIBS: as of today Libtool (GNU Libtool 1.5.23a) doesn't handle # -F properly. The "bug" has been fixed on 22 October 2006 # by Peter O'Gorman but we provide backward compatibility here. at_cv_env_QT_LIBS=`echo "$at_cv_env_QT_LIBS" \ | sed 's/^-F/-Wl,-F/;s/ -F/ -Wl,-F/g'` fi ]) AC_SUBST([QT_LIBS], [$at_cv_env_QT_LIBS]) # Run the user code $5 done # end hack (useless for to be able to use break) # clean up, and make sure we don't change cwd if test -n "$my_configure_pwd"; then cd "$my_configure_pwd" fi if test -n "$my_tmpdir"; then rm -rf "$my_tmpdir" fi ]) # AT_REQUIRE_QT_VERSION(QT_version, RUN-IF-FAILED, RUN-IF-OK) # ----------------------------------------------------------- # Check (using qmake) that Qt's version "matches" QT_version. # Must be run AFTER AT_WITH_QT. Requires autoconf 2.60. # # RUN-IF-FAILED is arbitrary code to execute if Qt cannot be found or if any # problem happens. If this argument is omitted, then AC_MSG_ERROR will be # called. RUN-IF-OK is arbitrary code to execute if Qt was successfully found. AC_DEFUN([AT_REQUIRE_QT_VERSION], [ # this is a hack to get decent flow control with 'break' for _qt_ignored in once; do if test x"$QMAKE" = x; then AX_INSTEAD_IF([$2], [\$QMAKE is empty.\ Did you invoke AT@&t@_WITH_QT before AT@&t@_REQUIRE_QT_VERSION?]) break fi AC_CACHE_CHECK([for Qt's version], [at_cv_QT_VERSION], [echo "$as_me:$LINENO: Running $QMAKE --version:" >&AS_MESSAGE_LOG_FD $QMAKE --version >&AS_MESSAGE_LOG_FD 2>&1 qmake_version_sed=['/^.*\([0-9]\.[0-9]\.[0-9]\).*$/!d;s//\1/'] at_cv_QT_VERSION=`$QMAKE --version 2>&1 | sed "$qmake_version_sed"`]) if test x"$at_cv_QT_VERSION" = x; then AX_INSTEAD_IF([$2], [Cannot detect Qt's version.]) break fi AC_SUBST([QT_VERSION], [$at_cv_QT_VERSION]) AS_VERSION_COMPARE([$QT_VERSION], [$1], [AX_INSTEAD_IF([$2; break;], [This package requires Qt $1 or above.])]) # Run the user code $3 done # end hack (useless for to be able to use break) ]) # _AT_TWEAK_PRO_FILE(QT_VAR, VALUE) # --------------------------- # @internal. Tweak the variable QT_VAR in the .pro. # VALUE is an IFS-separated list of value and each value is rewritten # as follows: # +value => QT_VAR += value # -value => QT_VAR -= value # value => QT_VAR += value AC_DEFUN([_AT_TWEAK_PRO_FILE], [ # Tweak the value of $1 in the .pro file for $2. qt_conf='' for at_mod in $2; do at_mod=`echo "$at_mod" | sed 's/^-//; tough s/^+//; beef :ough s/^/$1 -= /;n :eef s/^/$1 += /'` qt_conf="$qt_conf $at_mod" done echo "$qt_conf" | sed 1d >>"$pro_file" ]) ================================================ FILE: thirdparty/protobuf.mak ================================================ # __BEGIN_LICENSE__ # Copyright (C) 2006-2011 United States Government as represented by # the Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # __END_LICENSE__ ######################################################################## # rules for compiling Google Protocol Buffers (using protoc) ######################################################################## SUFFIXES += .proto .pb.cc PROTOC = protoc PROTOC_ARGS = -I. --cpp_out=. .proto.pb.cc : $(AM_V_GEN)$(PROTOC) $(PROTOC_ARGS) $<